VirtualBox

Changeset 102426 in vbox


Ignore:
Timestamp:
Dec 1, 2023 11:09:09 PM (17 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
160569
Message:

VMM/IEM: Continue refactoring IEM_MC_MEM_MAP into type specific MCs using bUnmapInfo. bugref:10371

Location:
trunk/src/VBox/VMM
Files:
6 edited

Legend:

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

    r102425 r102426  
    1215012150{
    1215112151    IEMOP_MNEMONIC(fisttp_m16i, "fisttp m16i");
    12152     IEM_MC_BEGIN(3, 2, 0, 0);
     12152    IEM_MC_BEGIN(3, 3, 0, 0);
    1215312153    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
    12154     IEM_MC_LOCAL(uint16_t,              u16Fsw);
    12155     IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Fsw,    u16Fsw, 0);
    12156     IEM_MC_ARG(int16_t *,               pi16Dst,            1);
    12157     IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    12158 
    1215912154    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
     12155
    1216012156    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1216112157    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1216212158    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    12163 
    12164     IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1216512159    IEM_MC_PREPARE_FPU_USAGE();
     12160
     12161    IEM_MC_LOCAL(uint8_t,               bUnmapInfo);
     12162    IEM_MC_ARG(int16_t *,               pi16Dst,            1);
     12163    IEM_MC_MEM_MAP_I16_WO(pi16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     12164
     12165    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    1216612166    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
     12167        IEM_MC_LOCAL(uint16_t,          u16Fsw);
     12168        IEM_MC_ARG_LOCAL_REF(uint16_t *,pu16Fsw,    u16Fsw, 0);
    1216712169        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i16, pu16Fsw, pi16Dst, pr80Value);
    12168         IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw);
     12170        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE_WO(pi16Dst, bUnmapInfo, u16Fsw);
    1216912171        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1217012172    } IEM_MC_ELSE() {
    1217112173        IEM_MC_IF_FCW_IM() {
    1217212174            IEM_MC_STORE_MEM_I16_CONST_BY_REF(pi16Dst, INT16_MIN /* (integer indefinite) */);
    12173             IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W);
     12175            IEM_MC_MEM_COMMIT_AND_UNMAP_WO(pi16Dst, bUnmapInfo);
     12176        } IEM_MC_ELSE() {
     12177            IEM_MC_MEM_ROLLBACK_AND_UNMAP_WO(pi16Dst, bUnmapInfo);
    1217412178        } IEM_MC_ENDIF();
    1217512179        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
     
    1218512189{
    1218612190    IEMOP_MNEMONIC(fist_m16i, "fist m16i");
    12187     IEM_MC_BEGIN(3, 2, 0, 0);
     12191    IEM_MC_BEGIN(3, 3, 0, 0);
    1218812192    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
    12189     IEM_MC_LOCAL(uint16_t,              u16Fsw);
    12190     IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Fsw,    u16Fsw, 0);
    12191     IEM_MC_ARG(int16_t *,               pi16Dst,            1);
    12192     IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    12193 
    1219412193    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
     12194
    1219512195    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1219612196    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1219712197    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    12198 
    12199     IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1220012198    IEM_MC_PREPARE_FPU_USAGE();
     12199
     12200    IEM_MC_LOCAL(uint8_t,               bUnmapInfo);
     12201    IEM_MC_ARG(int16_t *,               pi16Dst,            1);
     12202    IEM_MC_MEM_MAP_I16_WO(pi16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     12203
     12204    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    1220112205    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
     12206        IEM_MC_LOCAL(uint16_t,          u16Fsw);
     12207        IEM_MC_ARG_LOCAL_REF(uint16_t *,pu16Fsw,    u16Fsw, 0);
    1220212208        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i16, pu16Fsw, pi16Dst, pr80Value);
    12203         IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw);
     12209        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE_WO(pi16Dst, bUnmapInfo, u16Fsw);
    1220412210        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1220512211    } IEM_MC_ELSE() {
    1220612212        IEM_MC_IF_FCW_IM() {
    1220712213            IEM_MC_STORE_MEM_I16_CONST_BY_REF(pi16Dst, INT16_MIN /* (integer indefinite) */);
    12208             IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W);
     12214            IEM_MC_MEM_COMMIT_AND_UNMAP_WO(pi16Dst, bUnmapInfo);
     12215        } IEM_MC_ELSE() {
     12216            IEM_MC_MEM_ROLLBACK_AND_UNMAP_WO(pi16Dst, bUnmapInfo);
    1220912217        } IEM_MC_ENDIF();
    1221012218        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
     
    1222012228{
    1222112229    IEMOP_MNEMONIC(fistp_m16i, "fistp m16i");
    12222     IEM_MC_BEGIN(3, 2, 0, 0);
     12230    IEM_MC_BEGIN(3, 3, 0, 0);
    1222312231    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
    12224     IEM_MC_LOCAL(uint16_t,              u16Fsw);
    12225     IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Fsw,    u16Fsw, 0);
    12226     IEM_MC_ARG(int16_t *,               pi16Dst,            1);
    12227     IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    12228 
    1222912232    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
     12233
    1223012234    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1223112235    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1223212236    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    12233 
    12234     IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1223512237    IEM_MC_PREPARE_FPU_USAGE();
     12238
     12239    IEM_MC_LOCAL(uint8_t,               bUnmapInfo);
     12240    IEM_MC_ARG(int16_t *,               pi16Dst,            1);
     12241    IEM_MC_MEM_MAP_I16_WO(pi16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     12242
     12243    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    1223612244    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
     12245        IEM_MC_LOCAL(uint16_t,          u16Fsw);
     12246        IEM_MC_ARG_LOCAL_REF(uint16_t *,pu16Fsw,    u16Fsw, 0);
    1223712247        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i16, pu16Fsw, pi16Dst, pr80Value);
    12238         IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw);
     12248        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE_WO(pi16Dst, bUnmapInfo, u16Fsw);
    1223912249        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1224012250    } IEM_MC_ELSE() {
    1224112251        IEM_MC_IF_FCW_IM() {
    1224212252            IEM_MC_STORE_MEM_I16_CONST_BY_REF(pi16Dst, INT16_MIN /* (integer indefinite) */);
    12243             IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W);
     12253            IEM_MC_MEM_COMMIT_AND_UNMAP_WO(pi16Dst, bUnmapInfo);
     12254        } IEM_MC_ELSE() {
     12255            IEM_MC_MEM_ROLLBACK_AND_UNMAP_WO(pi16Dst, bUnmapInfo);
    1224412256        } IEM_MC_ENDIF();
    1224512257        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
     
    1235412366{
    1235512367    IEMOP_MNEMONIC(fistp_m64i, "fistp m64i");
    12356     IEM_MC_BEGIN(3, 2, 0, 0);
     12368    IEM_MC_BEGIN(3, 3, 0, 0);
    1235712369    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst);
    12358     IEM_MC_LOCAL(uint16_t,              u16Fsw);
    12359     IEM_MC_ARG_LOCAL_REF(uint16_t *,    pu16Fsw,    u16Fsw, 0);
    12360     IEM_MC_ARG(int64_t *,               pi64Dst,            1);
    12361     IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    12362 
    1236312370    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
     12371
    1236412372    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1236512373    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1236612374    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    12367 
    12368     IEM_MC_MEM_MAP(pi64Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1236912375    IEM_MC_PREPARE_FPU_USAGE();
     12376
     12377    IEM_MC_LOCAL(uint8_t,               bUnmapInfo);
     12378    IEM_MC_ARG(int64_t *,               pi64Dst,            1);
     12379    IEM_MC_MEM_MAP_I64_WO(pi64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     12380
     12381    IEM_MC_ARG(PCRTFLOAT80U,            pr80Value,          2);
    1237012382    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0) {
     12383        IEM_MC_LOCAL(uint16_t,          u16Fsw);
     12384        IEM_MC_ARG_LOCAL_REF(uint16_t *,pu16Fsw,    u16Fsw, 0);
    1237112385        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i64, pu16Fsw, pi64Dst, pr80Value);
    12372         IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi64Dst, IEM_ACCESS_DATA_W, u16Fsw);
     12386        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE_WO(pi64Dst, bUnmapInfo, u16Fsw);
    1237312387        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
    1237412388    } IEM_MC_ELSE() {
    1237512389        IEM_MC_IF_FCW_IM() {
    1237612390            IEM_MC_STORE_MEM_I64_CONST_BY_REF(pi64Dst, INT64_MIN /* (integer indefinite) */);
    12377             IEM_MC_MEM_COMMIT_AND_UNMAP(pi64Dst, IEM_ACCESS_DATA_W);
     12391            IEM_MC_MEM_COMMIT_AND_UNMAP_WO(pi64Dst, bUnmapInfo);
     12392        } IEM_MC_ELSE() {
     12393            IEM_MC_MEM_ROLLBACK_AND_UNMAP_WO(pi64Dst, bUnmapInfo);
    1237812394        } IEM_MC_ENDIF();
    1237912395        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst, pVCpu->iem.s.uFpuOpcode);
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py

    r102425 r102426  
    30283028    'IEM_MC_MEM_MAP':                                            (McBlock.parseMcGeneric,           True,  False, ),
    30293029    'IEM_MC_MEM_MAP_EX':                                         (McBlock.parseMcGeneric,           True,  False, ),
     3030    'IEM_MC_MEM_MAP_I16_WO':                                     (McBlock.parseMcGeneric,           True,  False, ),
    30303031    'IEM_MC_MEM_MAP_I32_WO':                                     (McBlock.parseMcGeneric,           True,  False, ),
    30313032    'IEM_MC_MEM_MAP_I64_WO':                                     (McBlock.parseMcGeneric,           True,  False, ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8vePython.py

    r102425 r102426  
    146146    'IEM_MC_MEM_FLAT_MAP_EX':                                    (None, True,  False, ),
    147147    'IEM_MC_MEM_FLAT_MAP':                                       (None, True,  False, ),
     148    'IEM_MC_MEM_FLAT_MAP_I16_WO':                                (None, True,  False, ),
    148149    'IEM_MC_MEM_FLAT_MAP_I32_WO':                                (None, True,  False, ),
    149150    'IEM_MC_MEM_FLAT_MAP_I64_WO':                                (None, True,  False, ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdPython.py

    r102425 r102426  
    705705        'IEM_MC_STORE_MEM_U256_ALIGN_AVX':        (  0, 'IEM_MC_STORE_MEM_FLAT_U256_ALIGN_AVX' ),
    706706        'IEM_MC_MEM_MAP':                         (  2, 'IEM_MC_MEM_FLAT_MAP' ),
     707        'IEM_MC_MEM_MAP_I16_WO':                  (  2, 'IEM_MC_MEM_FLAT_MAP_I16_WO' ),
    707708        'IEM_MC_MEM_MAP_I32_WO':                  (  2, 'IEM_MC_MEM_FLAT_MAP_I32_WO' ),
    708709        'IEM_MC_MEM_MAP_I64_WO':                  (  2, 'IEM_MC_MEM_FLAT_MAP_I64_WO' ),
  • trunk/src/VBox/VMM/include/IEMMc.h

    r102425 r102426  
    18011801# define IEM_MC_MEM_FLAT_MAP_U16_RO(a_pu16Mem, a_bUnmapInfo, a_GCPtrMem) \
    18021802    (a_pu16Mem) = iemMemFlatMapDataU16RoJmp(pVCpu, &(a_bUnmapInfo), (a_GCPtrMem))
     1803#endif
     1804
     1805/** int16_t alias. */
     1806#ifndef IEM_WITH_SETJMP
     1807# define IEM_MC_MEM_MAP_I16_WO(a_pi16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     1808         IEM_MC_MEM_MAP_U16_WO(a_pi16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)
     1809#else
     1810# define IEM_MC_MEM_MAP_I16_WO(a_pi16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     1811    (a_pi16Mem) = (int16_t *)iemMemMapDataU16WoJmp(pVCpu, &(a_bUnmapInfo), (a_iSeg), (a_GCPtrMem))
     1812#endif
     1813
     1814/** Flat int16_t alias. */
     1815#ifndef IEM_WITH_SETJMP
     1816# define IEM_MC_MEM_FLAT_MAP_I16_WO(a_pi16Mem, a_bUnmapInfo, a_GCPtrMem) \
     1817         IEM_MC_MEM_FLAT_MAP_U16_WO(a_pi16Mem, a_bUnmapInfo, a_GCPtrMem)
     1818#else
     1819# define IEM_MC_MEM_FLAT_MAP_I16_WO(a_pi16Mem, a_bUnmapInfo, a_GCPtrMem) \
     1820    (a_pi16Mem) = (int16_t *)iemMemFlatMapDataU16WoJmp(pVCpu, &(a_bUnmapInfo), (a_GCPtrMem))
    18031821#endif
    18041822
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r102425 r102426  
    930930#define IEM_MC_POP_U64(a_pu64Value)                                     do { CHK_VAR(a_pu64Value); (void)fMcBegin; } while (0)
    931931
     932#define IEM_MC_MEM_MAP_I16_WO(a_pi16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pi16Mem); (a_pi16Mem) = NULL; CHK_PTYPE(int16_t *,        a_pi16Mem); CHK_VAR(a_bUnmapInfo); CHK_TYPE(uint8_t, a_bUnmapInfo); a_bUnmapInfo = 1; CHK_GCPTR(a_GCPtrMem); CHK_VAR(a_GCPtrMem); CHK_SEG_IDX(a_iSeg); (void)fMcBegin; } while (0)
    932933#define IEM_MC_MEM_MAP_I32_WO(a_pi32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pi32Mem); (a_pi32Mem) = NULL; CHK_PTYPE(int32_t *,        a_pi32Mem); CHK_VAR(a_bUnmapInfo); CHK_TYPE(uint8_t, a_bUnmapInfo); a_bUnmapInfo = 1; CHK_GCPTR(a_GCPtrMem); CHK_VAR(a_GCPtrMem); CHK_SEG_IDX(a_iSeg); (void)fMcBegin; } while (0)
    933934#define IEM_MC_MEM_MAP_I64_WO(a_pi64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pi64Mem); (a_pi64Mem) = NULL; CHK_PTYPE(int64_t *,        a_pi64Mem); CHK_VAR(a_bUnmapInfo); CHK_TYPE(uint8_t, a_bUnmapInfo); a_bUnmapInfo = 1; CHK_GCPTR(a_GCPtrMem); CHK_VAR(a_GCPtrMem); CHK_SEG_IDX(a_iSeg); (void)fMcBegin; } while (0)
Note: See TracChangeset for help on using the changeset viewer.

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