VirtualBox

Changeset 100840 in vbox for trunk


Ignore:
Timestamp:
Aug 9, 2023 5:52:37 PM (19 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158741
Message:

VMM/IEM: More conversion from IEM_MC_MEM_MAP to IEM_MC_MEM_MAP_XXX. Correct 32-bit size BT instruction to not clear high bits. bugref:10369

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

Legend:

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

    r100831 r100840  
    11471147 */
    11481148
    1149 IEM_DECL_IMPL_DEF(void, iemAImpl_bt_u64,(uint64_t *puDst, uint64_t uSrc, uint32_t *pfEFlags))
     1149IEM_DECL_IMPL_DEF(void, iemAImpl_bt_u64,(uint64_t const *puDst, uint64_t uSrc, uint32_t *pfEFlags))
    11501150{
    11511151    /* Note! "undefined" flags: OF, SF, ZF, AF, PF.  However, it seems they're
     
    11611161# if !defined(RT_ARCH_X86) || defined(IEM_WITHOUT_ASSEMBLY)
    11621162
    1163 IEM_DECL_IMPL_DEF(void, iemAImpl_bt_u32,(uint32_t *puDst, uint32_t uSrc, uint32_t *pfEFlags))
     1163IEM_DECL_IMPL_DEF(void, iemAImpl_bt_u32,(uint32_t const *puDst, uint32_t uSrc, uint32_t *pfEFlags))
    11641164{
    11651165    /* Note! "undefined" flags: OF, SF, ZF, AF, PF.  However, it seems they're
     
    11731173}
    11741174
    1175 IEM_DECL_IMPL_DEF(void, iemAImpl_bt_u16,(uint16_t *puDst, uint16_t uSrc, uint32_t *pfEFlags))
     1175IEM_DECL_IMPL_DEF(void, iemAImpl_bt_u16,(uint16_t const *puDst, uint16_t uSrc, uint32_t *pfEFlags))
    11761176{
    11771177    /* Note! "undefined" flags: OF, SF, ZF, AF, PF.  However, it seems they're
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py

    r100826 r100840  
    28592859    'IEM_MC_REF_GREG_I64_CONST':                                 (McBlock.parseMcGeneric,           False),
    28602860    'IEM_MC_REF_GREG_U16':                                       (McBlock.parseMcGeneric,           False),
     2861    'IEM_MC_REF_GREG_U16_CONST':                                 (McBlock.parseMcGeneric,           False),
    28612862    'IEM_MC_REF_GREG_U32':                                       (McBlock.parseMcGeneric,           False),
     2863    'IEM_MC_REF_GREG_U32_CONST':                                 (McBlock.parseMcGeneric,           False),
    28622864    'IEM_MC_REF_GREG_U64':                                       (McBlock.parseMcGeneric,           False),
     2865    'IEM_MC_REF_GREG_U64_CONST':                                 (McBlock.parseMcGeneric,           False),
    28632866    'IEM_MC_REF_GREG_U8':                                        (McBlock.parseMcGeneric,           False),
     2867    'IEM_MC_REF_GREG_U8_CONST':                                  (McBlock.parseMcGeneric,           False),
    28642868    'IEM_MC_REF_LOCAL':                                          (McBlock.parseMcGeneric,           False),
    28652869    'IEM_MC_REF_MREG_U32_CONST':                                 (McBlock.parseMcGeneric,           False),
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstTwoByte0f.cpp.h

    r100769 r100840  
    89278927 * iemOp_bts_Ev_Gv.
    89288928 */
    8929 #define IEMOP_BODY_BIT_Ev_Gv(a_fnNormalU16, a_fnNormalU32, a_fnNormalU64, a_fRW) \
     8929
     8930#define IEMOP_BODY_BIT_Ev_Gv_RW(a_fnNormalU16, a_fnNormalU32, a_fnNormalU64) \
    89308931    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \
    89318932    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF); \
     
    90009001            { \
    90019002                case IEMMODE_16BIT: \
    9002                     IEM_MC_BEGIN(3, 2); \
     9003                    IEM_MC_BEGIN(3, 4); \
    90039004                    IEM_MC_ARG(uint16_t *,              pu16Dst,                0); \
    90049005                    IEM_MC_ARG(uint16_t,                u16Src,                 1); \
     
    90069007                    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst); \
    90079008                    IEM_MC_LOCAL(int16_t,               i16AddrAdj); \
     9009                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    90089010                    \
    90099011                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     
    90179019                    IEM_MC_FETCH_EFLAGS(EFlags); \
    90189020                    \
    9019                     IEM_MC_MEM_MAP(pu16Dst, a_fRW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0); \
     9021                    IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    90209022                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \
    9021                     IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, a_fRW); \
     9023                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(pu16Dst, bUnmapInfo); \
    90229024                    \
    90239025                    IEM_MC_COMMIT_EFLAGS(EFlags); \
     
    90279029                \
    90289030                case IEMMODE_32BIT: \
    9029                     IEM_MC_BEGIN(3, 2); \
     9031                    IEM_MC_BEGIN(3, 4); \
    90309032                    IEM_MC_ARG(uint32_t *,              pu32Dst,                0); \
    90319033                    IEM_MC_ARG(uint32_t,                u32Src,                 1); \
     
    90339035                    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst); \
    90349036                    IEM_MC_LOCAL(int32_t,               i32AddrAdj); \
     9037                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    90359038                    \
    90369039                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     
    90449047                    IEM_MC_FETCH_EFLAGS(EFlags); \
    90459048                    \
    9046                     IEM_MC_MEM_MAP(pu32Dst, a_fRW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0); \
     9049                    IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    90479050                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \
    9048                     IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, a_fRW); \
     9051                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(pu32Dst, bUnmapInfo); \
    90499052                    \
    90509053                    IEM_MC_COMMIT_EFLAGS(EFlags); \
     
    90549057                \
    90559058                case IEMMODE_64BIT: \
    9056                     IEM_MC_BEGIN(3, 2); \
     9059                    IEM_MC_BEGIN(3, 5); \
    90579060                    IEM_MC_ARG(uint64_t *,              pu64Dst,                0); \
    90589061                    IEM_MC_ARG(uint64_t,                u64Src,                 1); \
     
    90609063                    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst); \
    90619064                    IEM_MC_LOCAL(int64_t,               i64AddrAdj); \
     9065                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    90629066                    \
    90639067                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     
    90719075                    IEM_MC_FETCH_EFLAGS(EFlags); \
    90729076                    \
    9073                     IEM_MC_MEM_MAP(pu64Dst, a_fRW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0); \
     9077                    IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    90749078                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \
    9075                     IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, a_fRW); \
     9079                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(pu64Dst, bUnmapInfo); \
    90769080                    \
    90779081                    IEM_MC_COMMIT_EFLAGS(EFlags); \
     
    90869090        { \
    90879091            (void)0
    9088 
    9089 #define IEMOP_BODY_BIT_Ev_Gv_NO_LOCK() \
    9090             IEMOP_HLP_DONE_DECODING(); \
    9091             IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    9092         } \
    9093     } \
    9094     (void)0
    9095 
     9092/* Separate macro to work around parsing issue in IEMAllInstPython.py */
    90969093#define IEMOP_BODY_BIT_Ev_Gv_LOCKED(a_fnLockedU16, a_fnLockedU32, a_fnLockedU64) \
    90979094            switch (pVCpu->iem.s.enmEffOpSize) \
    90989095            { \
    90999096                case IEMMODE_16BIT: \
    9100                     IEM_MC_BEGIN(3, 2); \
     9097                    IEM_MC_BEGIN(3, 4); \
    91019098                    IEM_MC_ARG(uint16_t *,              pu16Dst,                0); \
    91029099                    IEM_MC_ARG(uint16_t,                u16Src,                 1); \
     
    91049101                    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst); \
    91059102                    IEM_MC_LOCAL(int16_t,               i16AddrAdj); \
     9103                    IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    91069104                    \
    91079105                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     
    91159113                    IEM_MC_FETCH_EFLAGS(EFlags); \
    91169114                    \
    9117                     IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0); \
     9115                    IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    91189116                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU16, pu16Dst, u16Src, pEFlags); \
    9119                     IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW); \
     9117                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(pu16Dst, bUnmapInfo); \
    91209118                    \
    91219119                    IEM_MC_COMMIT_EFLAGS(EFlags); \
     
    91259123                \
    91269124                case IEMMODE_32BIT: \
    9127                     IEM_MC_BEGIN(3, 2); \
     9125                    IEM_MC_BEGIN(3, 4); \
    91289126                    IEM_MC_ARG(uint32_t *,              pu32Dst,                0); \
    91299127                    IEM_MC_ARG(uint32_t,                u32Src,                 1); \
     
    91319129                    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst); \
    91329130                    IEM_MC_LOCAL(int32_t,               i32AddrAdj); \
     9131                    IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    91339132                    \
    91349133                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     
    91429141                    IEM_MC_FETCH_EFLAGS(EFlags); \
    91439142                    \
    9144                     IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0); \
     9143                    IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    91459144                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU32, pu32Dst, u32Src, pEFlags); \
    9146                     IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_RW); \
     9145                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(pu32Dst, bUnmapInfo); \
    91479146                    \
    91489147                    IEM_MC_COMMIT_EFLAGS(EFlags); \
     
    91529151                \
    91539152                case IEMMODE_64BIT: \
    9154                     IEM_MC_BEGIN(3, 2); \
     9153                    IEM_MC_BEGIN(3, 4); \
    91559154                    IEM_MC_ARG(uint64_t *,              pu64Dst,                0); \
    91569155                    IEM_MC_ARG(uint64_t,                u64Src,                 1); \
     
    91589157                    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst); \
    91599158                    IEM_MC_LOCAL(int64_t,               i64AddrAdj); \
     9159                    IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    91609160                    \
    91619161                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     
    91699169                    IEM_MC_FETCH_EFLAGS(EFlags); \
    91709170                    \
    9171                     IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0); \
     9171                    IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    91729172                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU64, pu64Dst, u64Src, pEFlags); \
    9173                     IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_RW); \
     9173                    IEM_MC_MEM_COMMIT_AND_UNMAP_RW(pu64Dst, bUnmapInfo); \
    91749174                    \
    91759175                    IEM_MC_COMMIT_EFLAGS(EFlags); \
     
    91849184    (void)0
    91859185
     9186/* Read-only version (bt). */
     9187#define IEMOP_BODY_BIT_Ev_Gv_RO(a_fnNormalU16, a_fnNormalU32, a_fnNormalU64) \
     9188    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \
     9189    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF); \
     9190    \
     9191    if (IEM_IS_MODRM_REG_MODE(bRm)) \
     9192    { \
     9193        /* register destination. */ \
     9194        switch (pVCpu->iem.s.enmEffOpSize) \
     9195        { \
     9196            case IEMMODE_16BIT: \
     9197                IEM_MC_BEGIN(3, 0); \
     9198                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     9199                IEM_MC_ARG(uint16_t const *, pu16Dst,               0); \
     9200                IEM_MC_ARG(uint16_t,         u16Src,                1); \
     9201                IEM_MC_ARG(uint32_t *,       pEFlags,               2); \
     9202                \
     9203                IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     9204                IEM_MC_AND_LOCAL_U16(u16Src, 0xf); \
     9205                IEM_MC_REF_GREG_U16_CONST(pu16Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     9206                IEM_MC_REF_EFLAGS(pEFlags); \
     9207                IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \
     9208                \
     9209                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     9210                IEM_MC_END(); \
     9211                break; \
     9212            \
     9213            case IEMMODE_32BIT: \
     9214                IEM_MC_BEGIN(3, 0); \
     9215                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     9216                IEM_MC_ARG(uint32_t const *, pu32Dst,               0); \
     9217                IEM_MC_ARG(uint32_t,         u32Src,                1); \
     9218                IEM_MC_ARG(uint32_t *,       pEFlags,               2); \
     9219                \
     9220                IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     9221                IEM_MC_AND_LOCAL_U32(u32Src, 0x1f); \
     9222                IEM_MC_REF_GREG_U32_CONST(pu32Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     9223                IEM_MC_REF_EFLAGS(pEFlags); \
     9224                IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \
     9225                \
     9226                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     9227                IEM_MC_END(); \
     9228                break; \
     9229            \
     9230            case IEMMODE_64BIT: \
     9231                IEM_MC_BEGIN(3, 0); \
     9232                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     9233                IEM_MC_ARG(uint64_t const *, pu64Dst,               0); \
     9234                IEM_MC_ARG(uint64_t,         u64Src,                1); \
     9235                IEM_MC_ARG(uint32_t *,       pEFlags,               2); \
     9236                \
     9237                IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     9238                IEM_MC_AND_LOCAL_U64(u64Src, 0x3f); \
     9239                IEM_MC_REF_GREG_U64_CONST(pu64Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     9240                IEM_MC_REF_EFLAGS(pEFlags); \
     9241                IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \
     9242                \
     9243                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     9244                IEM_MC_END(); \
     9245                break; \
     9246            \
     9247            IEM_NOT_REACHED_DEFAULT_CASE_RET(); \
     9248        } \
     9249    } \
     9250    else \
     9251    { \
     9252        /* memory destination. */ \
     9253        /** @todo test negative bit offsets! */ \
     9254        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK)) \
     9255        { \
     9256            switch (pVCpu->iem.s.enmEffOpSize) \
     9257            { \
     9258                case IEMMODE_16BIT: \
     9259                    IEM_MC_BEGIN(3, 4); \
     9260                    IEM_MC_ARG(uint16_t const *,        pu16Dst,                0); \
     9261                    IEM_MC_ARG(uint16_t,                u16Src,                 1); \
     9262                    IEM_MC_ARG_LOCAL_EFLAGS(            pEFlags, EFlags,        2); \
     9263                    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst); \
     9264                    IEM_MC_LOCAL(int16_t,               i16AddrAdj); \
     9265                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
     9266                    \
     9267                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     9268                    IEMOP_HLP_DONE_DECODING(); \
     9269                    IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     9270                    IEM_MC_ASSIGN(i16AddrAdj, u16Src); \
     9271                    IEM_MC_AND_ARG_U16(u16Src, 0x0f); \
     9272                    IEM_MC_SAR_LOCAL_S16(i16AddrAdj, 4); \
     9273                    IEM_MC_SHL_LOCAL_S16(i16AddrAdj, 1); \
     9274                    IEM_MC_ADD_LOCAL_S16_TO_EFF_ADDR(GCPtrEffDst, i16AddrAdj); \
     9275                    IEM_MC_FETCH_EFLAGS(EFlags); \
     9276                    \
     9277                    IEM_MC_MEM_MAP_U16_RO(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     9278                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \
     9279                    IEM_MC_MEM_COMMIT_AND_UNMAP_RO(pu16Dst, bUnmapInfo); \
     9280                    \
     9281                    IEM_MC_COMMIT_EFLAGS(EFlags); \
     9282                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     9283                    IEM_MC_END(); \
     9284                    break; \
     9285                \
     9286                case IEMMODE_32BIT: \
     9287                    IEM_MC_BEGIN(3, 4); \
     9288                    IEM_MC_ARG(uint32_t const *,        pu32Dst,                0); \
     9289                    IEM_MC_ARG(uint32_t,                u32Src,                 1); \
     9290                    IEM_MC_ARG_LOCAL_EFLAGS(            pEFlags, EFlags,        2); \
     9291                    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst); \
     9292                    IEM_MC_LOCAL(int32_t,               i32AddrAdj); \
     9293                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
     9294                    \
     9295                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     9296                    IEMOP_HLP_DONE_DECODING(); \
     9297                    IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     9298                    IEM_MC_ASSIGN(i32AddrAdj, u32Src); \
     9299                    IEM_MC_AND_ARG_U32(u32Src, 0x1f); \
     9300                    IEM_MC_SAR_LOCAL_S32(i32AddrAdj, 5); \
     9301                    IEM_MC_SHL_LOCAL_S32(i32AddrAdj, 2); \
     9302                    IEM_MC_ADD_LOCAL_S32_TO_EFF_ADDR(GCPtrEffDst, i32AddrAdj); \
     9303                    IEM_MC_FETCH_EFLAGS(EFlags); \
     9304                    \
     9305                    IEM_MC_MEM_MAP_U32_RO(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     9306                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \
     9307                    IEM_MC_MEM_COMMIT_AND_UNMAP_RO(pu32Dst, bUnmapInfo); \
     9308                    \
     9309                    IEM_MC_COMMIT_EFLAGS(EFlags); \
     9310                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     9311                    IEM_MC_END(); \
     9312                    break; \
     9313                \
     9314                case IEMMODE_64BIT: \
     9315                    IEM_MC_BEGIN(3, 4); \
     9316                    IEM_MC_ARG(uint64_t const *,        pu64Dst,                0); \
     9317                    IEM_MC_ARG(uint64_t,                u64Src,                 1); \
     9318                    IEM_MC_ARG_LOCAL_EFLAGS(            pEFlags, EFlags,        2); \
     9319                    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst); \
     9320                    IEM_MC_LOCAL(int64_t,               i64AddrAdj); \
     9321                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
     9322                    \
     9323                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     9324                    IEMOP_HLP_DONE_DECODING(); \
     9325                    IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     9326                    IEM_MC_ASSIGN(i64AddrAdj, u64Src); \
     9327                    IEM_MC_AND_ARG_U64(u64Src, 0x3f); \
     9328                    IEM_MC_SAR_LOCAL_S64(i64AddrAdj, 6); \
     9329                    IEM_MC_SHL_LOCAL_S64(i64AddrAdj, 3); \
     9330                    IEM_MC_ADD_LOCAL_S64_TO_EFF_ADDR(GCPtrEffDst, i64AddrAdj); \
     9331                    IEM_MC_FETCH_EFLAGS(EFlags); \
     9332                    \
     9333                    IEM_MC_MEM_MAP_U64_RO(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     9334                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \
     9335                    IEM_MC_MEM_COMMIT_AND_UNMAP_RO(pu64Dst, bUnmapInfo); \
     9336                    \
     9337                    IEM_MC_COMMIT_EFLAGS(EFlags); \
     9338                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     9339                    IEM_MC_END(); \
     9340                    break; \
     9341                \
     9342                IEM_NOT_REACHED_DEFAULT_CASE_RET(); \
     9343            } \
     9344        } \
     9345        else \
     9346        { \
     9347            IEMOP_HLP_DONE_DECODING(); \
     9348            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
     9349        } \
     9350    } \
     9351    (void)0
     9352
    91869353
    91879354/** Opcode 0x0f 0xa3. */
     
    91909357    IEMOP_MNEMONIC(bt_Ev_Gv, "bt  Ev,Gv");
    91919358    IEMOP_HLP_MIN_386();
    9192     IEMOP_BODY_BIT_Ev_Gv(iemAImpl_bt_u16, iemAImpl_bt_u32, iemAImpl_bt_u64, IEM_ACCESS_DATA_R);
    9193     IEMOP_BODY_BIT_Ev_Gv_NO_LOCK();
     9359    IEMOP_BODY_BIT_Ev_Gv_RO(iemAImpl_bt_u16, iemAImpl_bt_u32, iemAImpl_bt_u64);
    91949360}
    91959361
     
    95469712    IEMOP_MNEMONIC(bts_Ev_Gv, "bts Ev,Gv");
    95479713    IEMOP_HLP_MIN_386();
    9548     IEMOP_BODY_BIT_Ev_Gv(       iemAImpl_bts_u16,        iemAImpl_bts_u32,        iemAImpl_bts_u64, IEM_ACCESS_DATA_RW);
     9714    IEMOP_BODY_BIT_Ev_Gv_RW(    iemAImpl_bts_u16,        iemAImpl_bts_u32,        iemAImpl_bts_u64);
    95499715    IEMOP_BODY_BIT_Ev_Gv_LOCKED(iemAImpl_bts_u16_locked, iemAImpl_bts_u32_locked, iemAImpl_bts_u64_locked);
    95509716}
     
    1030510471    IEMOP_MNEMONIC(btr_Ev_Gv, "btr Ev,Gv");
    1030610472    IEMOP_HLP_MIN_386();
    10307     IEMOP_BODY_BIT_Ev_Gv(       iemAImpl_btr_u16,        iemAImpl_btr_u32,        iemAImpl_btr_u64, IEM_ACCESS_DATA_RW);
     10473    IEMOP_BODY_BIT_Ev_Gv_RW(    iemAImpl_btr_u16,        iemAImpl_btr_u32,        iemAImpl_btr_u64);
    1030810474    IEMOP_BODY_BIT_Ev_Gv_LOCKED(iemAImpl_btr_u16_locked, iemAImpl_btr_u32_locked, iemAImpl_btr_u64_locked);
    1030910475}
     
    1082310989    IEMOP_MNEMONIC(btc_Ev_Gv, "btc Ev,Gv");
    1082410990    IEMOP_HLP_MIN_386();
    10825     IEMOP_BODY_BIT_Ev_Gv(       iemAImpl_btc_u16,        iemAImpl_btc_u32,        iemAImpl_btc_u64, IEM_ACCESS_DATA_RW);
     10991    IEMOP_BODY_BIT_Ev_Gv_RW(    iemAImpl_btc_u16,        iemAImpl_btc_u32,        iemAImpl_btc_u64);
    1082610992    IEMOP_BODY_BIT_Ev_Gv_LOCKED(iemAImpl_btc_u16_locked, iemAImpl_btc_u32_locked, iemAImpl_btc_u64_locked);
    1082710993}
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r100831 r100840  
    18361836/** @name Bit operations operations (thrown in with the binary ops).
    18371837 * @{ */
    1838 FNIEMAIMPLBINU16 iemAImpl_bt_u16;
    1839 FNIEMAIMPLBINU32 iemAImpl_bt_u32;
    1840 FNIEMAIMPLBINU64 iemAImpl_bt_u64;
     1838FNIEMAIMPLBINROU16 iemAImpl_bt_u16;
     1839FNIEMAIMPLBINROU32 iemAImpl_bt_u32;
     1840FNIEMAIMPLBINROU64 iemAImpl_bt_u64;
    18411841FNIEMAIMPLBINU16 iemAImpl_btc_u16, iemAImpl_btc_u16_locked;
    18421842FNIEMAIMPLBINU32 iemAImpl_btc_u32, iemAImpl_btc_u32_locked;
  • trunk/src/VBox/VMM/include/IEMMc.h

    r100831 r100840  
    271271
    272272#define IEM_MC_REF_GREG_U8(a_pu8Dst, a_iGReg)           (a_pu8Dst)  = iemGRegRefU8( pVCpu, (a_iGReg))
     273#define IEM_MC_REF_GREG_U8_CONST(a_pu8Dst, a_iGReg)     (a_pu8Dst)  = (uint8_t  const *)iemGRegRefU8( pVCpu, (a_iGReg))
    273274#define IEM_MC_REF_GREG_U16(a_pu16Dst, a_iGReg)         (a_pu16Dst) = iemGRegRefU16(pVCpu, (a_iGReg))
     275#define IEM_MC_REF_GREG_U16_CONST(a_pu16Dst, a_iGReg)   (a_pu16Dst) = (uint16_t const *)iemGRegRefU16(pVCpu, (a_iGReg))
    274276/** @todo User of IEM_MC_REF_GREG_U32 needs to clear the high bits on commit.
    275277 *        Use IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF! */
    276278#define IEM_MC_REF_GREG_U32(a_pu32Dst, a_iGReg)         (a_pu32Dst) = iemGRegRefU32(pVCpu, (a_iGReg))
    277 #define IEM_MC_REF_GREG_I32(a_pi32Dst, a_iGReg)         (a_pi32Dst) = (int32_t *)iemGRegRefU32(pVCpu, (a_iGReg))
    278 #define IEM_MC_REF_GREG_I32_CONST(a_pi32Dst, a_iGReg)   (a_pi32Dst) = (int32_t const *)iemGRegRefU32(pVCpu, (a_iGReg))
     279#define IEM_MC_REF_GREG_U32_CONST(a_pu32Dst, a_iGReg)   (a_pu32Dst) = (uint32_t const *)iemGRegRefU32(pVCpu, (a_iGReg))
     280#define IEM_MC_REF_GREG_I32(a_pi32Dst, a_iGReg)         (a_pi32Dst) = (int32_t        *)iemGRegRefU32(pVCpu, (a_iGReg))
     281#define IEM_MC_REF_GREG_I32_CONST(a_pi32Dst, a_iGReg)   (a_pi32Dst) = (int32_t  const *)iemGRegRefU32(pVCpu, (a_iGReg))
    279282#define IEM_MC_REF_GREG_U64(a_pu64Dst, a_iGReg)         (a_pu64Dst) = iemGRegRefU64(pVCpu, (a_iGReg))
    280 #define IEM_MC_REF_GREG_I64(a_pi64Dst, a_iGReg)         (a_pi64Dst) = (int64_t *)iemGRegRefU64(pVCpu, (a_iGReg))
    281 #define IEM_MC_REF_GREG_I64_CONST(a_pi64Dst, a_iGReg)   (a_pi64Dst) = (int64_t const *)iemGRegRefU64(pVCpu, (a_iGReg))
     283#define IEM_MC_REF_GREG_U64_CONST(a_pu64Dst, a_iGReg)   (a_pu64Dst) = (uint64_t const *)iemGRegRefU64(pVCpu, (a_iGReg))
     284#define IEM_MC_REF_GREG_I64(a_pi64Dst, a_iGReg)         (a_pi64Dst) = (int64_t        *)iemGRegRefU64(pVCpu, (a_iGReg))
     285#define IEM_MC_REF_GREG_I64_CONST(a_pi64Dst, a_iGReg)   (a_pi64Dst) = (int64_t  const *)iemGRegRefU64(pVCpu, (a_iGReg))
    282286/** @note Not for IOPL or IF testing or modification.
    283287 * @note Must preserve any undefined bits, see CPUMX86EFLAGS! */
  • trunk/src/VBox/VMM/testcase/tstIEMAImpl.cpp

    r100831 r100840  
    14401440    ENTRY(and_u16),
    14411441    ENTRY(and_u16_locked),
    1442     ENTRY_PFN_CAST(cmp_u16,  PFNIEMAIMPLBINU16),
    1443     ENTRY_PFN_CAST(test_u16, PFNIEMAIMPLBINU16),
    1444     ENTRY_EX(bt_u16, 1),
     1442    ENTRY_PFN_CAST(cmp_u16,   PFNIEMAIMPLBINU16),
     1443    ENTRY_PFN_CAST(test_u16,  PFNIEMAIMPLBINU16),
     1444    ENTRY_PFN_CAST_EX(bt_u16, PFNIEMAIMPLBINU16, 1),
    14451445    ENTRY_EX(btc_u16, 1),
    14461446    ENTRY_EX(btc_u16_locked, 1),
     
    14791479    ENTRY(and_u32),
    14801480    ENTRY(and_u32_locked),
    1481     ENTRY_PFN_CAST(cmp_u32,  PFNIEMAIMPLBINU32),
    1482     ENTRY_PFN_CAST(test_u32, PFNIEMAIMPLBINU32),
    1483     ENTRY_EX(bt_u32, 1),
     1481    ENTRY_PFN_CAST(cmp_u32,   PFNIEMAIMPLBINU32),
     1482    ENTRY_PFN_CAST(test_u32,  PFNIEMAIMPLBINU32),
     1483    ENTRY_PFN_CAST_EX(bt_u32, PFNIEMAIMPLBINU32, 1),
    14841484    ENTRY_EX(btc_u32, 1),
    14851485    ENTRY_EX(btc_u32_locked, 1),
     
    15171517    ENTRY(and_u64),
    15181518    ENTRY(and_u64_locked),
    1519     ENTRY_PFN_CAST(cmp_u64,  PFNIEMAIMPLBINU64),
    1520     ENTRY_PFN_CAST(test_u64, PFNIEMAIMPLBINU64),
    1521     ENTRY_EX(bt_u64, 1),
     1519    ENTRY_PFN_CAST(cmp_u64,   PFNIEMAIMPLBINU64),
     1520    ENTRY_PFN_CAST(test_u64,  PFNIEMAIMPLBINU64),
     1521    ENTRY_PFN_CAST_EX(bt_u64, PFNIEMAIMPLBINU64, 1),
    15221522    ENTRY_EX(btc_u64, 1),
    15231523    ENTRY_EX(btc_u64_locked, 1),
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r100826 r100840  
    675675#define IEM_MC_REF_GREG_U16(a_pu16Dst, a_iGReg)         do { CHK_GREG_IDX(a_iGReg); (a_pu16Dst) = (uint16_t *)((uintptr_t)0); CHK_PTYPE(uint16_t *, a_pu16Dst); (void)fMcBegin; } while (0)
    676676#define IEM_MC_REF_GREG_U32(a_pu32Dst, a_iGReg)         do { CHK_GREG_IDX(a_iGReg); (a_pu32Dst) = (uint32_t *)((uintptr_t)0); CHK_PTYPE(uint32_t *, a_pu32Dst); (void)fMcBegin; } while (0)
     677#define IEM_MC_REF_GREG_U64(a_pu64Dst, a_iGReg)         do { CHK_GREG_IDX(a_iGReg); (a_pu64Dst) = (uint64_t *)((uintptr_t)0); CHK_PTYPE(uint64_t *, a_pu64Dst); (void)fMcBegin; } while (0)
     678#define IEM_MC_REF_GREG_U8_CONST(a_pu8Dst, a_iGReg)     do { CHK_GREG_IDX(a_iGReg); (a_pu8Dst)  = (uint8_t  const *)((uintptr_t)0); CHK_PTYPE(uint8_t  const *, a_pu8Dst);  (void)fMcBegin; } while (0)
     679#define IEM_MC_REF_GREG_U16_CONST(a_pu16Dst, a_iGReg)   do { CHK_GREG_IDX(a_iGReg); (a_pu16Dst) = (uint16_t const *)((uintptr_t)0); CHK_PTYPE(uint16_t const *, a_pu16Dst); (void)fMcBegin; } while (0)
     680#define IEM_MC_REF_GREG_U32_CONST(a_pu32Dst, a_iGReg)   do { CHK_GREG_IDX(a_iGReg); (a_pu32Dst) = (uint32_t const *)((uintptr_t)0); CHK_PTYPE(uint32_t const *, a_pu32Dst); (void)fMcBegin; } while (0)
     681#define IEM_MC_REF_GREG_U64_CONST(a_pu64Dst, a_iGReg)   do { CHK_GREG_IDX(a_iGReg); (a_pu64Dst) = (uint64_t const *)((uintptr_t)0); CHK_PTYPE(uint64_t const *, a_pu64Dst); (void)fMcBegin; } while (0)
    677682#define IEM_MC_REF_GREG_I32(a_pi32Dst, a_iGReg)         do { CHK_GREG_IDX(a_iGReg); (a_pi32Dst) = (int32_t *)((uintptr_t)0); CHK_PTYPE(int32_t *, a_pi32Dst); (void)fMcBegin; } while (0)
     683#define IEM_MC_REF_GREG_I64(a_pi64Dst, a_iGReg)         do { CHK_GREG_IDX(a_iGReg); (a_pi64Dst) = (int64_t *)((uintptr_t)0); CHK_PTYPE(int64_t *, a_pi64Dst); (void)fMcBegin; } while (0)
    678684#define IEM_MC_REF_GREG_I32_CONST(a_pi32Dst, a_iGReg)   do { CHK_GREG_IDX(a_iGReg); (a_pi32Dst) = (int32_t const *)((uintptr_t)0); CHK_PTYPE(int32_t const *, a_pi32Dst); (void)fMcBegin; } while (0)
    679 #define IEM_MC_REF_GREG_U64(a_pu64Dst, a_iGReg)         do { CHK_GREG_IDX(a_iGReg); (a_pu64Dst) = (uint64_t *)((uintptr_t)0); CHK_PTYPE(uint64_t *, a_pu64Dst); (void)fMcBegin; } while (0)
    680 #define IEM_MC_REF_GREG_I64(a_pi64Dst, a_iGReg)         do { CHK_GREG_IDX(a_iGReg); (a_pi64Dst) = (int64_t *)((uintptr_t)0); CHK_PTYPE(int64_t *, a_pi64Dst); (void)fMcBegin; } while (0)
    681685#define IEM_MC_REF_GREG_I64_CONST(a_pi64Dst, a_iGReg)   do { CHK_GREG_IDX(a_iGReg); (a_pi64Dst) = (int64_t const *)((uintptr_t)0); CHK_PTYPE(int64_t const *, a_pi64Dst); (void)fMcBegin; } while (0)
    682686#define IEM_MC_REF_EFLAGS(a_pEFlags)                    do { (a_pEFlags) = (uint32_t *)((uintptr_t)0); CHK_PTYPE(uint32_t *, a_pEFlags); (void)fMcBegin; } while (0)
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