VirtualBox

Changeset 100834 in vbox for trunk


Ignore:
Timestamp:
Aug 9, 2023 2:49:39 PM (19 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158734
Message:

VMM/IEM: More conversion from IEM_MC_MEM_MAP to IEM_MC_MEM_MAP_XXX, fixing xchg todo regarding commit register changes after the memory change. bugref:10369

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstOneByte.cpp.h

    r100833 r100834  
    52725272        switch (pVCpu->iem.s.enmEffOpSize)
    52735273        {
    5274 /** @todo the register must be committed separately! */
    52755274            case IEMMODE_16BIT:
    5276                 IEM_MC_BEGIN(2, 2);
    5277                 IEM_MC_ARG(uint16_t *,  pu16Mem, 0);
    5278                 IEM_MC_ARG(uint16_t *,  pu16Reg, 1);
    5279                 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
     5275                IEM_MC_BEGIN(2, 4);
     5276                IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst);
     5277                IEM_MC_LOCAL(uint8_t,  bUnmapInfo);
     5278                IEM_MC_LOCAL(uint16_t, uTmpReg);
     5279                IEM_MC_ARG(uint16_t *,           pu16Mem,          0);
     5280                IEM_MC_ARG_LOCAL_REF(uint16_t *, pu16Reg, uTmpReg, 1);
    52805281
    52815282                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    52825283                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5283                 IEM_MC_MEM_MAP(pu16Mem, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    5284                 IEM_MC_REF_GREG_U16(pu16Reg, IEM_GET_MODRM_REG(pVCpu, bRm));
     5284                IEM_MC_MEM_MAP_U16_RW(pu16Mem, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     5285                IEM_MC_FETCH_GREG_U16(uTmpReg, IEM_GET_MODRM_REG(pVCpu, bRm));
    52855286                if (!(pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK))
    52865287                    IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u16_locked, pu16Mem, pu16Reg);
    52875288                else
    52885289                    IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u16_unlocked, pu16Mem, pu16Reg);
    5289                 IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Mem, IEM_ACCESS_DATA_RW);
     5290                IEM_MC_MEM_COMMIT_AND_UNMAP_RW(pu16Mem, bUnmapInfo);
     5291                IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), uTmpReg);
    52905292
    52915293                IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    52945296
    52955297            case IEMMODE_32BIT:
    5296                 IEM_MC_BEGIN(2, 2);
    5297                 IEM_MC_ARG(uint32_t *,  pu32Mem, 0);
    5298                 IEM_MC_ARG(uint32_t *,  pu32Reg, 1);
    5299                 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
     5298                IEM_MC_BEGIN(2, 4);
     5299                IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst);
     5300                IEM_MC_LOCAL(uint8_t,  bUnmapInfo);
     5301                IEM_MC_LOCAL(uint32_t, uTmpReg);
     5302                IEM_MC_ARG(uint32_t *,           pu32Mem,          0);
     5303                IEM_MC_ARG_LOCAL_REF(uint32_t *, pu32Reg, uTmpReg, 1);
    53005304
    53015305                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    53025306                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5303                 IEM_MC_MEM_MAP(pu32Mem, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    5304                 IEM_MC_REF_GREG_U32(pu32Reg, IEM_GET_MODRM_REG(pVCpu, bRm));
     5307                IEM_MC_MEM_MAP_U32_RW(pu32Mem, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     5308                IEM_MC_FETCH_GREG_U32(uTmpReg, IEM_GET_MODRM_REG(pVCpu, bRm));
    53055309                if (!(pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK))
    53065310                    IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u32_locked, pu32Mem, pu32Reg);
    53075311                else
    53085312                    IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u32_unlocked, pu32Mem, pu32Reg);
    5309                 IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Mem, IEM_ACCESS_DATA_RW);
     5313                IEM_MC_MEM_COMMIT_AND_UNMAP_RW(pu32Mem, bUnmapInfo);
     5314                IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), uTmpReg);
    53105315
    53115316                IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(pu32Reg);
     
    53155320
    53165321            case IEMMODE_64BIT:
    5317                 IEM_MC_BEGIN(2, 2);
    5318                 IEM_MC_ARG(uint64_t *,  pu64Mem, 0);
    5319                 IEM_MC_ARG(uint64_t *,  pu64Reg, 1);
    5320                 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
     5322                IEM_MC_BEGIN(2, 4);
     5323                IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst);
     5324                IEM_MC_LOCAL(uint8_t,  bUnmapInfo);
     5325                IEM_MC_LOCAL(uint64_t, uTmpReg);
     5326                IEM_MC_ARG(uint64_t *,           pu64Mem,          0);
     5327                IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Reg, uTmpReg, 1);
    53215328
    53225329                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    53235330                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5324                 IEM_MC_MEM_MAP(pu64Mem, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    5325                 IEM_MC_REF_GREG_U64(pu64Reg, IEM_GET_MODRM_REG(pVCpu, bRm));
     5331                IEM_MC_MEM_MAP_U64_RW(pu64Mem, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     5332                IEM_MC_FETCH_GREG_U64(uTmpReg, IEM_GET_MODRM_REG(pVCpu, bRm));
    53265333                if (!(pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK))
    53275334                    IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u64_locked, pu64Mem, pu64Reg);
    53285335                else
    53295336                    IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u64_unlocked, pu64Mem, pu64Reg);
    5330                 IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Mem, IEM_ACCESS_DATA_RW);
     5337                IEM_MC_MEM_COMMIT_AND_UNMAP_RW(pu64Mem, bUnmapInfo);
     5338                IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), uTmpReg);
    53315339
    53325340                IEM_MC_ADVANCE_RIP_AND_FINISH();
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette