VirtualBox

Changeset 102977 in vbox


Ignore:
Timestamp:
Jan 19, 2024 11:11:30 PM (12 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implemented generic fallback for misaligned x86 locking that is not compatible with the host. Using the existing split-lock solution with VINF_EM_EMULATE_SPLIT_LOCK from bugref:10052. We keep ignoring the 'lock' prefix in the recompiler for single CPU VMs (now also on amd64 hosts). bugref:10547

Location:
trunk
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/err.h

    r102733 r102977  
    273273/** Trick for resuming EMHistoryExec after a VMCPU_FF_IOM is handled. */
    274274#define VINF_EM_RESUME_R3_HISTORY_EXEC       1161
    275 /** Emulate split-lock access on SMP. */
     275/** Emulate split-lock access on SMP.
     276 * This is also used for dealing with locked alignment conflicts with the host
     277 * in general from IEM. */
    276278#define VINF_EM_EMULATE_SPLIT_LOCK           1162
    277279/** @} */
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r102876 r102977  
    62196219 * @param   GCPtrMem    The address of the guest memory.
    62206220 * @param   fAccess     How the memory is being accessed.  The
    6221  *                      IEM_ACCESS_TYPE_XXX bit is used to figure out how to map
    6222  *                      the memory, while the IEM_ACCESS_WHAT_XXX bit is used
    6223  *                      when raising exceptions.
     6221 *                      IEM_ACCESS_TYPE_XXX part is used to figure out how to
     6222 *                      map the memory, while the IEM_ACCESS_WHAT_XXX part is
     6223 *                      used when raising exceptions.  The IEM_ACCESS_ATOMIC and
     6224 *                      IEM_ACCESS_PARTIAL_WRITE bits are also allowed to be
     6225 *                      set.
    62246226 * @param   uAlignCtl   Alignment control:
    62256227 *                          - Bits 15:0 is the alignment mask.
     
    62386240    Assert(   cbMem <= 64 || cbMem == 512 || cbMem == 256 || cbMem == 108 || cbMem == 104 || cbMem == 102 || cbMem == 94
    62396241           || (iSegReg == UINT8_MAX && uAlignCtl == 0 && fAccess == IEM_ACCESS_DATA_R /* for the CPUID logging interface */) );
    6240     Assert(~(fAccess & ~(IEM_ACCESS_TYPE_MASK | IEM_ACCESS_WHAT_MASK)));
     6242    Assert(!(fAccess & ~(IEM_ACCESS_TYPE_MASK | IEM_ACCESS_WHAT_MASK | IEM_ACCESS_ATOMIC | IEM_ACCESS_PARTIAL_WRITE)));
    62416243    Assert(pVCpu->iem.s.cActiveMappings < RT_ELEMENTS(pVCpu->iem.s.aMemMappings));
    62426244
     
    62976299                return iemRaiseGeneralProtectionFault0(pVCpu);
    62986300        }
     6301
     6302#if (defined(RT_ARCH_AMD64) && defined(RT_OS_LINUX)) || defined(RT_ARCH_ARM64)
     6303        /* If the access is atomic there are host platform alignmnet restrictions
     6304           we need to conform with. */
     6305        if (   !(fAccess & IEM_ACCESS_ATOMIC)
     6306# if defined(RT_ARCH_AMD64)
     6307            || (64U - (GCPtrMem & 63U) >= cbMem) /* split-lock detection. ASSUMES 64 byte cache line. */
     6308# elif defined(RT_ARCH_ARM64)
     6309            || (16U - (GCPtrMem & 15U) >= cbMem) /* LSE2 allows atomics anywhere within a 16 byte sized & aligned block. */
     6310# else
     6311#  error port me
     6312# endif
     6313           )
     6314        { /* okay */ }
     6315        else
     6316        {
     6317            LogEx(LOG_GROUP_IEM, ("iemMemMap: GCPtrMem=%RGv LB %u - misaligned atomic fallback.\n", GCPtrMem, cbMem));
     6318            pVCpu->iem.s.cMisalignedAtomics += 1;
     6319            return VINF_EM_EMULATE_SPLIT_LOCK;
     6320        }
     6321#endif
    62996322    }
    63006323
     
    65866609 *                      is required (for IDT, GDT and LDT accesses).
    65876610 * @param   GCPtrMem    The address of the guest memory.
    6588  * @param   fAccess     How the memory is being accessed.  The
    6589  *                      IEM_ACCESS_TYPE_XXX bit is used to figure out
    6590  *                      how to map the memory, while the
    6591  *                      IEM_ACCESS_WHAT_XXX bit is used when raising
    6592  *                      exceptions.
     6611 * @param   fAccess     How the memory is being accessed. The
     6612 *                      IEM_ACCESS_TYPE_XXX part is used to figure out how to
     6613 *                      map the memory, while the IEM_ACCESS_WHAT_XXX part is
     6614 *                      used when raising exceptions. The IEM_ACCESS_ATOMIC and
     6615 *                      IEM_ACCESS_PARTIAL_WRITE bits are also allowed to be
     6616 *                      set.
    65936617 * @param   uAlignCtl   Alignment control:
    65946618 *                          - Bits 15:0 is the alignment mask.
     
    66066630     */
    66076631    Assert(cbMem <= 64 || cbMem == 512 || cbMem == 108 || cbMem == 104 || cbMem == 94); /* 512 is the max! */
    6608     Assert(~(fAccess & ~(IEM_ACCESS_TYPE_MASK | IEM_ACCESS_WHAT_MASK)));
     6632    Assert(!(fAccess & ~(IEM_ACCESS_TYPE_MASK | IEM_ACCESS_WHAT_MASK | IEM_ACCESS_ATOMIC | IEM_ACCESS_PARTIAL_WRITE)));
    66096633    Assert(pVCpu->iem.s.cActiveMappings < RT_ELEMENTS(pVCpu->iem.s.aMemMappings));
    66106634
     
    66426666                iemRaiseGeneralProtectionFault0Jmp(pVCpu);
    66436667        }
     6668
     6669#if (defined(RT_ARCH_AMD64) && defined(RT_OS_LINUX)) || defined(RT_ARCH_ARM64)
     6670        /* If the access is atomic there are host platform alignmnet restrictions
     6671           we need to conform with. */
     6672        if (   !(fAccess & IEM_ACCESS_ATOMIC)
     6673# if defined(RT_ARCH_AMD64)
     6674            || (64U - (GCPtrMem & 63U) >= cbMem) /* split-lock detection. ASSUMES 64 byte cache line. */
     6675# elif defined(RT_ARCH_ARM64)
     6676            || (16U - (GCPtrMem & 15U) >= cbMem) /* LSE2 allows atomics anywhere within a 16 byte sized & aligned block. */
     6677# else
     6678#  error port me
     6679# endif
     6680           )
     6681        { /* okay */ }
     6682        else
     6683        {
     6684            LogEx(LOG_GROUP_IEM, ("iemMemMap: GCPtrMem=%RGv LB %u - misaligned atomic fallback.\n", GCPtrMem, cbMem));
     6685            pVCpu->iem.s.cMisalignedAtomics += 1;
     6686            IEM_DO_LONGJMP(pVCpu, VINF_EM_EMULATE_SPLIT_LOCK);
     6687        }
     6688#endif
    66446689    }
    66456690
     
    69246969/** Fallback for iemMemCommitAndUnmapRwJmp.  */
    69256970void iemMemCommitAndUnmapRwSafeJmp(PVMCPUCC pVCpu, uint8_t bUnmapInfo) IEM_NOEXCEPT_MAY_LONGJMP
     6971{
     6972    Assert(((bUnmapInfo >> 4) & IEM_ACCESS_TYPE_MASK) == (IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE));
     6973    iemMemCommitAndUnmapJmp(pVCpu, bUnmapInfo);
     6974}
     6975
     6976
     6977/** Fallback for iemMemCommitAndUnmapAtJmp.  */
     6978void iemMemCommitAndUnmapAtSafeJmp(PVMCPUCC pVCpu, uint8_t bUnmapInfo) IEM_NOEXCEPT_MAY_LONGJMP
    69266979{
    69276980    Assert(((bUnmapInfo >> 4) & IEM_ACCESS_TYPE_MASK) == (IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE));
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl-arm64.S

    r102549 r102977  
    3838        ret
    3939
     40/* Some sketches.
     41
     42// IEM_DECL_IMPL_DEF(void, iemAImpl_xchg_u8_locked, (uint8_t  *pu8Mem,  uint8_t  *pu8Reg));
     43        .p2align        2
     44        .private_extern NAME(iemAImpl_xchg_u8_locked)
     45        .globl          NAME(iemAImpl_xchg_u8_locked)
     46NAME(iemAImpl_xchg_u8_locked):
     47        ldrb    w2, [x1]
     48        swpalb  w2, w2, [x0]
     49        strb    w2, [x1]
     50        ret
     51
     52// IEM_DECL_IMPL_DEF(void, iemAImpl_xchg_u16_locked,(uint16_t *pu16Mem, uint16_t *pu16Reg));
     53        .p2align        2
     54        .private_extern NAME(iemAImpl_xchg_u16_locked)
     55        .globl          NAME(iemAImpl_xchg_u16_locked)
     56NAME(iemAImpl_xchg_u16_locked):
     57        ldrh    w2, [x1]
     58        swpalh  w2, w2, [x0]
     59        strh    w2, [x1]
     60        ret
     61
     62// IEM_DECL_IMPL_DEF(void, iemAImpl_xchg_u32_locked,(uint32_t *pu32Mem, uint32_t *pu32Reg));
     63// IEM_DECL_IMPL_DEF(void, iemAImpl_xchg_u64_locked,(uint64_t *pu64Mem, uint64_t *pu64Reg));
     64
     65*/
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstOneByte.cpp.h

    r102876 r102977  
    6060 * Body for instructions like ADD, AND, OR, TEST, CMP, ++ with a byte
    6161 * memory/register as the destination.
    62  *
    63  * Used with IEMOP_BODY_BINARY_rm_r8_NO_LOCK or IEMOP_BODY_BINARY_rm_r8_LOCKED.
    64  */
    65 #define IEMOP_BODY_BINARY_rm_r8_RW(a_fnNormalU8) \
     62 */
     63#define IEMOP_BODY_BINARY_rm_r8_RW(a_fnNormalU8, a_fnLockedU8) \
    6664    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \
    6765    \
     
    115113        else \
    116114        { \
    117             (void)0
     115            IEM_MC_BEGIN(3, 3, 0, 0); \
     116            IEM_MC_ARG(uint8_t *,  pu8Dst,           0); \
     117            IEM_MC_ARG(uint8_t,    u8Src,            1); \
     118            IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
     119            IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
     120            IEM_MC_LOCAL(uint8_t, bMapInfoDst); \
     121            \
     122            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
     123            IEMOP_HLP_DONE_DECODING(); \
     124            IEM_MC_MEM_MAP_U8_ATOMIC(pu8Dst, bMapInfoDst, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     125            IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     126            IEM_MC_FETCH_EFLAGS(EFlags); \
     127            IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU8, pu8Dst, u8Src, pEFlags); \
     128            \
     129            IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bMapInfoDst); \
     130            IEM_MC_COMMIT_EFLAGS(EFlags); \
     131            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     132            IEM_MC_END(); \
     133        } \
     134    } \
     135    (void)0
    118136
    119137/**
    120138 * Body for instructions like TEST & CMP, ++ with a byte memory/registers as
    121139 * operands.
    122  *
    123  * Used with IEMOP_BODY_BINARY_rm_r8_NO_LOCK or IEMOP_BODY_BINARY_rm_r8_LOCKED.
    124140 */
    125141#define IEMOP_BODY_BINARY_rm_r8_RO(a_fnNormalU8) \
     
    152168         *       after the memory. \
    153169         */ \
    154         if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) || (pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK)) \
     170        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK)) \
    155171        { \
    156172            IEM_MC_BEGIN(3, 3, 0, 0); \
     
    175191        else \
    176192        { \
    177             (void)0
    178 
    179 #define IEMOP_BODY_BINARY_rm_r8_NO_LOCK() \
    180193            IEMOP_HLP_DONE_DECODING(); \
    181194            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
    182         } \
    183     } \
    184     (void)0
    185 
    186 #define IEMOP_BODY_BINARY_rm_r8_LOCKED(a_fnLockedU8) \
    187             IEM_MC_BEGIN(3, 3, 0, 0); \
    188             IEM_MC_ARG(uint8_t *,  pu8Dst,           0); \
    189             IEM_MC_ARG(uint8_t,    u8Src,            1); \
    190             IEM_MC_ARG_LOCAL_EFLAGS(pEFlags, EFlags, 2); \
    191             IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    192             IEM_MC_LOCAL(uint8_t, bMapInfoDst); \
    193             \
    194             IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    195             IEMOP_HLP_DONE_DECODING(); \
    196             IEM_MC_MEM_MAP_U8_RW(pu8Dst, bMapInfoDst, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    197             IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    198             IEM_MC_FETCH_EFLAGS(EFlags); \
    199             IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU8, pu8Dst, u8Src, pEFlags); \
    200             \
    201             IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bMapInfoDst); \
    202             IEM_MC_COMMIT_EFLAGS(EFlags); \
    203             IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    204             IEM_MC_END(); \
    205195        } \
    206196    } \
     
    417407                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    418408                    IEMOP_HLP_DONE_DECODING(); \
    419                     IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     409                    IEM_MC_MEM_MAP_U16_ATOMIC(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    420410                    IEM_MC_FETCH_GREG_U16(u16Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    421411                    IEM_MC_FETCH_EFLAGS(EFlags); \
    422412                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU16, pu16Dst, u16Src, pEFlags); \
    423413                    \
    424                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     414                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    425415                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    426416                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    438428                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    439429                    IEMOP_HLP_DONE_DECODING(); \
    440                     IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     430                    IEM_MC_MEM_MAP_U32_ATOMIC(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    441431                    IEM_MC_FETCH_GREG_U32(u32Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    442432                    IEM_MC_FETCH_EFLAGS(EFlags); \
    443433                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU32, pu32Dst, u32Src, pEFlags); \
    444434                    \
    445                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo /* CMP,TEST */); \
     435                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo /* CMP,TEST */); \
    446436                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    447437                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    459449                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    460450                    IEMOP_HLP_DONE_DECODING(); \
    461                     IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     451                    IEM_MC_MEM_MAP_U64_ATOMIC(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    462452                    IEM_MC_FETCH_GREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    463453                    IEM_MC_FETCH_EFLAGS(EFlags); \
    464454                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU64, pu64Dst, u64Src, pEFlags); \
    465455                    \
    466                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     456                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    467457                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    468458                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    737727{
    738728    IEMOP_MNEMONIC2(MR, ADD, add, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    739     IEMOP_BODY_BINARY_rm_r8_RW(    iemAImpl_add_u8);
    740     IEMOP_BODY_BINARY_rm_r8_LOCKED(iemAImpl_add_u8_locked);
     729    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_add_u8, iemAImpl_add_u8_locked);
    741730}
    742731
     
    860849    IEMOP_MNEMONIC2(MR, OR, or, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    861850    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    862     IEMOP_BODY_BINARY_rm_r8_RW(    iemAImpl_or_u8);
    863     IEMOP_BODY_BINARY_rm_r8_LOCKED(iemAImpl_or_u8_locked);
     851    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_or_u8, iemAImpl_or_u8_locked);
    864852}
    865853
     
    10291017{
    10301018    IEMOP_MNEMONIC2(MR, ADC, adc, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    1031     IEMOP_BODY_BINARY_rm_r8_RW(    iemAImpl_adc_u8);
    1032     IEMOP_BODY_BINARY_rm_r8_LOCKED(iemAImpl_adc_u8_locked);
     1019    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_adc_u8, iemAImpl_adc_u8_locked);
    10331020}
    10341021
     
    11501137{
    11511138    IEMOP_MNEMONIC2(MR, SBB, sbb, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    1152     IEMOP_BODY_BINARY_rm_r8_RW(    iemAImpl_sbb_u8);
    1153     IEMOP_BODY_BINARY_rm_r8_LOCKED(iemAImpl_sbb_u8_locked);
     1139    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_sbb_u8, iemAImpl_sbb_u8_locked);
    11541140}
    11551141
     
    12631249    IEMOP_MNEMONIC2(MR, AND, and, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    12641250    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    1265     IEMOP_BODY_BINARY_rm_r8_RW(    iemAImpl_and_u8);
    1266     IEMOP_BODY_BINARY_rm_r8_LOCKED(iemAImpl_and_u8_locked);
     1251    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_and_u8, iemAImpl_and_u8_locked);
    12671252}
    12681253
     
    13881373{
    13891374    IEMOP_MNEMONIC2(MR, SUB, sub, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    1390     IEMOP_BODY_BINARY_rm_r8_RW(    iemAImpl_sub_u8);
    1391     IEMOP_BODY_BINARY_rm_r8_LOCKED(iemAImpl_sub_u8_locked);
     1375    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_sub_u8, iemAImpl_sub_u8_locked);
    13921376}
    13931377
     
    15011485    IEMOP_MNEMONIC2(MR, XOR, xor, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    15021486    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    1503     IEMOP_BODY_BINARY_rm_r8_RW(    iemAImpl_xor_u8);
    1504     IEMOP_BODY_BINARY_rm_r8_LOCKED(iemAImpl_xor_u8_locked);
     1487    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_xor_u8, iemAImpl_xor_u8_locked);
    15051488}
    15061489
     
    16581641    IEMOP_MNEMONIC(cmp_Eb_Gb, "cmp Eb,Gb");
    16591642    IEMOP_BODY_BINARY_rm_r8_RO(iemAImpl_cmp_u8);
    1660     IEMOP_BODY_BINARY_rm_r8_NO_LOCK();
    16611643}
    16621644
     
    39573939            IEMOP_HLP_DONE_DECODING(); \
    39583940            \
    3959             IEM_MC_MEM_MAP_U8_RW(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     3941            IEM_MC_MEM_MAP_U8_ATOMIC(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    39603942            IEM_MC_FETCH_EFLAGS(EFlags); \
    39613943            IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU8, pu8Dst, u8Src, pEFlags); \
    39623944            \
    3963             IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     3945            IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    39643946            IEM_MC_COMMIT_EFLAGS(EFlags); \
    39653947            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    43134295                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    43144296                    IEM_MC_ARG(uint16_t *,      pu16Dst,                0); \
    4315                     IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     4297                    IEM_MC_MEM_MAP_U16_ATOMIC(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    43164298                    \
    43174299                    IEM_MC_ARG_CONST(uint16_t,  u16Src,  u16Imm,        1); \
     
    43204302                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU16, pu16Dst, u16Src, pEFlags); \
    43214303                    \
    4322                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     4304                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    43234305                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    43244306                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    43384320                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    43394321                    IEM_MC_ARG(uint32_t *,      pu32Dst,                0); \
    4340                     IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     4322                    IEM_MC_MEM_MAP_U32_ATOMIC(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    43414323                    \
    43424324                    IEM_MC_ARG_CONST(uint32_t,  u32Src,  u32Imm,        1); \
     
    43454327                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU32, pu32Dst, u32Src, pEFlags); \
    43464328                    \
    4347                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     4329                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    43484330                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    43494331                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    43634345                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    43644346                    IEM_MC_ARG(uint64_t *,      pu64Dst,                0); \
    4365                     IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     4347                    IEM_MC_MEM_MAP_U64_ATOMIC(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    43664348                    \
    43674349                    IEM_MC_ARG_CONST(uint64_t,  u64Src,  u64Imm,        1); \
     
    43704352                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU64, pu64Dst, u64Src, pEFlags); \
    43714353                    \
    4372                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     4354                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    43734355                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    43744356                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    48294811                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    48304812                    IEM_MC_ARG(uint16_t *,      pu16Dst,                            0); \
    4831                     IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     4813                    IEM_MC_MEM_MAP_U16_ATOMIC(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    48324814                    \
    48334815                    IEM_MC_ARG_CONST(uint16_t,  u16Src,  (int16_t)(int8_t)u8Imm,    1); \
     
    48364818                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU16, pu16Dst, u16Src, pEFlags); \
    48374819                    \
    4838                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     4820                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    48394821                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    48404822                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    48524834                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    48534835                    IEM_MC_ARG(uint32_t *,      pu32Dst,                    0); \
    4854                     IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     4836                    IEM_MC_MEM_MAP_U32_ATOMIC(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    48554837                    \
    48564838                    IEM_MC_ARG_CONST(uint32_t,  u32Src,  (int32_t)(int8_t)u8Imm,    1); \
     
    48594841                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU32, pu32Dst, u32Src, pEFlags); \
    48604842                    \
    4861                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     4843                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    48624844                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    48634845                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    48754857                    IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
    48764858                    IEM_MC_ARG(uint64_t *,      pu64Dst,                            0); \
    4877                     IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     4859                    IEM_MC_MEM_MAP_U64_ATOMIC(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    48784860                    \
    48794861                    IEM_MC_ARG_CONST(uint64_t,  u64Src, (int64_t)(int8_t)u8Imm,     1); \
     
    48824864                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU64, pu64Dst, u64Src, pEFlags); \
    48834865                    \
    4884                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     4866                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    48854867                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    48864868                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    51685150    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    51695151    IEMOP_BODY_BINARY_rm_r8_RO(iemAImpl_test_u8);
    5170     IEMOP_BODY_BINARY_rm_r8_NO_LOCK();
    51715152}
    51725153
     
    52145195         * We're accessing memory.
    52155196         */
    5216 #define IEMOP_XCHG_BYTE(a_fnWorker) \
     5197#define IEMOP_XCHG_BYTE(a_fnWorker, a_Style) \
    52175198            IEM_MC_BEGIN(2, 4, 0, 0); \
    52185199            IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
     
    52245205            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    52255206            IEMOP_HLP_DONE_DECODING(); /** @todo testcase: lock xchg */ \
    5226             IEM_MC_MEM_MAP_U8_RW(pu8Mem, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     5207            IEM_MC_MEM_MAP_U8_##a_Style(pu8Mem, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    52275208            IEM_MC_FETCH_GREG_U8(uTmpReg, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    52285209            IEM_MC_CALL_VOID_AIMPL_2(a_fnWorker, pu8Mem, pu8Reg); \
    5229             IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     5210            IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Style(bUnmapInfo); \
    52305211            IEM_MC_STORE_GREG_U8(IEM_GET_MODRM_REG(pVCpu, bRm), uTmpReg); \
    52315212            \
     
    52355216        if (!(pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK))
    52365217        {
    5237             IEMOP_XCHG_BYTE(iemAImpl_xchg_u8_locked);
     5218            IEMOP_XCHG_BYTE(iemAImpl_xchg_u8_locked,ATOMIC);
    52385219        }
    52395220        else
    52405221        {
    5241             IEMOP_XCHG_BYTE(iemAImpl_xchg_u8_unlocked);
     5222            IEMOP_XCHG_BYTE(iemAImpl_xchg_u8_unlocked,RW);
    52425223        }
    52435224    }
     
    53135294         * We're accessing memory.
    53145295         */
    5315 #define IEMOP_XCHG_EV_GV(a_fnWorker16, a_fnWorker32, a_fnWorker64) \
     5296#define IEMOP_XCHG_EV_GV(a_fnWorker16, a_fnWorker32, a_fnWorker64, a_Type) \
    53165297            do { \
    53175298                switch (pVCpu->iem.s.enmEffOpSize) \
     
    53275308                        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    53285309                        IEMOP_HLP_DONE_DECODING(); /** @todo testcase: lock xchg */ \
    5329                         IEM_MC_MEM_MAP_U16_RW(pu16Mem, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     5310                        IEM_MC_MEM_MAP_U16_##a_Type(pu16Mem, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    53305311                        IEM_MC_FETCH_GREG_U16(uTmpReg, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    53315312                        IEM_MC_CALL_VOID_AIMPL_2(a_fnWorker16, pu16Mem, pu16Reg); \
    5332                         IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     5313                        IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Type(bUnmapInfo); \
    53335314                        IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), uTmpReg); \
    53345315                        \
     
    53475328                        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    53485329                        IEMOP_HLP_DONE_DECODING(); \
    5349                         IEM_MC_MEM_MAP_U32_RW(pu32Mem, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     5330                        IEM_MC_MEM_MAP_U32_##a_Type(pu32Mem, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    53505331                        IEM_MC_FETCH_GREG_U32(uTmpReg, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    53515332                        IEM_MC_CALL_VOID_AIMPL_2(a_fnWorker32, pu32Mem, pu32Reg); \
    5352                         IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     5333                        IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Type(bUnmapInfo); \
    53535334                        IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), uTmpReg); \
    53545335                        \
     
    53675348                        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    53685349                        IEMOP_HLP_DONE_DECODING(); \
    5369                         IEM_MC_MEM_MAP_U64_RW(pu64Mem, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     5350                        IEM_MC_MEM_MAP_U64_##a_Type(pu64Mem, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    53705351                        IEM_MC_FETCH_GREG_U64(uTmpReg, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    53715352                        IEM_MC_CALL_VOID_AIMPL_2(a_fnWorker64, pu64Mem, pu64Reg); \
    5372                         IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     5353                        IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Type(bUnmapInfo); \
    53735354                        IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), uTmpReg); \
    53745355                        \
     
    53825363        if (!(pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK))
    53835364        {
    5384             IEMOP_XCHG_EV_GV(iemAImpl_xchg_u16_locked, iemAImpl_xchg_u32_locked, iemAImpl_xchg_u64_locked);
     5365            IEMOP_XCHG_EV_GV(iemAImpl_xchg_u16_locked, iemAImpl_xchg_u32_locked, iemAImpl_xchg_u64_locked,ATOMIC);
    53855366        }
    53865367        else
    53875368        {
    5388             IEMOP_XCHG_EV_GV(iemAImpl_xchg_u16_unlocked, iemAImpl_xchg_u32_unlocked, iemAImpl_xchg_u64_unlocked);
     5369            IEMOP_XCHG_EV_GV(iemAImpl_xchg_u16_unlocked, iemAImpl_xchg_u32_unlocked, iemAImpl_xchg_u64_unlocked,RW);
    53895370        }
    53905371    }
     
    1302113002            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    1302213003            IEMOP_HLP_DONE_DECODING(); \
    13023             IEM_MC_MEM_MAP_U8_RW(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     13004            IEM_MC_MEM_MAP_U8_ATOMIC(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1302413005            IEM_MC_FETCH_EFLAGS(EFlags); \
    1302513006            IEM_MC_CALL_VOID_AIMPL_2(a_fnLockedU8, pu8Dst, pEFlags); \
    1302613007            \
    13027             IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     13008            IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    1302813009            IEM_MC_COMMIT_EFLAGS(EFlags); \
    1302913010            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1317013151                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    1317113152                    IEMOP_HLP_DONE_DECODING(); \
    13172                     IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     13153                    IEM_MC_MEM_MAP_U16_ATOMIC(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1317313154                    IEM_MC_FETCH_EFLAGS(EFlags); \
    1317413155                    IEM_MC_CALL_VOID_AIMPL_2(a_fnLockedU16, pu16Dst, pEFlags); \
    1317513156                    \
    13176                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     13157                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    1317713158                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    1317813159                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1318913170                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    1319013171                    IEMOP_HLP_DONE_DECODING(); \
    13191                     IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     13172                    IEM_MC_MEM_MAP_U32_ATOMIC(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1319213173                    IEM_MC_FETCH_EFLAGS(EFlags); \
    1319313174                    IEM_MC_CALL_VOID_AIMPL_2(a_fnLockedU32, pu32Dst, pEFlags); \
    1319413175                    \
    13195                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     13176                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    1319613177                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    1319713178                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1320813189                    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    1320913190                    IEMOP_HLP_DONE_DECODING(); \
    13210                     IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     13191                    IEM_MC_MEM_MAP_U64_ATOMIC(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1321113192                    IEM_MC_FETCH_EFLAGS(EFlags); \
    1321213193                    IEM_MC_CALL_VOID_AIMPL_2(a_fnLockedU64, pu64Dst, pEFlags); \
    1321313194                    \
    13214                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     13195                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    1321513196                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    1321613197                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py

    r102876 r102977  
    30263026    'IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT':                       (McBlock.parseMcGeneric,           True,  True,  False, ),
    30273027    'IEM_MC_MAYBE_RAISE_WAIT_DEVICE_NOT_AVAILABLE':              (McBlock.parseMcGeneric,           True,  True,  False, ),
     3028    'IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC':                        (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30283029    'IEM_MC_MEM_COMMIT_AND_UNMAP_RW':                            (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30293030    'IEM_MC_MEM_COMMIT_AND_UNMAP_RO':                            (McBlock.parseMcGeneric,           True,  True,  True,  ),
     
    30373038    'IEM_MC_MEM_MAP_R64_WO':                                     (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30383039    'IEM_MC_MEM_MAP_R80_WO':                                     (McBlock.parseMcGeneric,           True,  True,  True,  ),
     3040    'IEM_MC_MEM_MAP_U8_ATOMIC':                                  (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30393041    'IEM_MC_MEM_MAP_U8_RW':                                      (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30403042    'IEM_MC_MEM_MAP_U8_RO':                                      (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30413043    'IEM_MC_MEM_MAP_U8_WO':                                      (McBlock.parseMcGeneric,           True,  True,  True,  ),
     3044    'IEM_MC_MEM_MAP_U16_ATOMIC':                                 (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30423045    'IEM_MC_MEM_MAP_U16_RW':                                     (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30433046    'IEM_MC_MEM_MAP_U16_RO':                                     (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30443047    'IEM_MC_MEM_MAP_U16_WO':                                     (McBlock.parseMcGeneric,           True,  True,  True,  ),
     3048    'IEM_MC_MEM_MAP_U32_ATOMIC':                                 (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30453049    'IEM_MC_MEM_MAP_U32_RW':                                     (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30463050    'IEM_MC_MEM_MAP_U32_RO':                                     (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30473051    'IEM_MC_MEM_MAP_U32_WO':                                     (McBlock.parseMcGeneric,           True,  True,  True,  ),
     3052    'IEM_MC_MEM_MAP_U64_ATOMIC':                                 (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30483053    'IEM_MC_MEM_MAP_U64_RW':                                     (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30493054    'IEM_MC_MEM_MAP_U64_RO':                                     (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30503055    'IEM_MC_MEM_MAP_U64_WO':                                     (McBlock.parseMcGeneric,           True,  True,  True,  ),
     3056    'IEM_MC_MEM_MAP_U128_ATOMIC':                                (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30513057    'IEM_MC_MEM_MAP_U128_RW':                                    (McBlock.parseMcGeneric,           True,  True,  True,  ),
    30523058    'IEM_MC_MEM_MAP_U128_RO':                                    (McBlock.parseMcGeneric,           True,  True,  True,  ),
     
    34883494        self.cTotalMcBlocks = 0;
    34893495
    3490         self.oReMacroName   = re.compile('^[A-Za-z_][A-Za-z0-9_]*$');
    3491         self.oReMnemonic    = re.compile('^[A-Za-z_][A-Za-z0-9_]*$');
    3492         self.oReStatsName   = re.compile('^[A-Za-z_][A-Za-z0-9_]*$');
    3493         self.oReFunctionName= re.compile('^iemOp_[A-Za-z_][A-Za-z0-9_]*$');
    3494         self.oReGroupName   = re.compile('^og_[a-z0-9]+(|_[a-z0-9]+|_[a-z0-9]+_[a-z0-9]+)$');
    3495         self.oReDisEnum     = re.compile('^OP_[A-Z0-9_]+$');
    3496         self.oReFunTable    = re.compile('^(IEM_STATIC|static) +const +PFNIEMOP +g_apfn[A-Za-z0-9_]+ *\[ *\d* *\] *= *$');
    3497         self.oReComment     = re.compile('//.*?$|/\*.*?\*/'); ## Full comments.
    3498         self.oReHashDefine2 = re.compile('(?s)\A\s*([A-Za-z_][A-Za-z0-9_]*)\(([^)]*)\)\s*(.*)\Z'); ##< With arguments.
    3499         self.oReHashDefine3 = re.compile('(?s)\A\s*([A-Za-z_][A-Za-z0-9_]*)[^(]\s*(.*)\Z');        ##< Simple, no arguments.
     3496        self.oReMacroName   = re.compile(r'^[A-Za-z_][A-Za-z0-9_]*$');
     3497        self.oReMnemonic    = re.compile(r'^[A-Za-z_][A-Za-z0-9_]*$');
     3498        self.oReStatsName   = re.compile(r'^[A-Za-z_][A-Za-z0-9_]*$');
     3499        self.oReFunctionName= re.compile(r'^iemOp_[A-Za-z_][A-Za-z0-9_]*$');
     3500        self.oReGroupName   = re.compile(r'^og_[a-z0-9]+(|_[a-z0-9]+|_[a-z0-9]+_[a-z0-9]+)$');
     3501        self.oReDisEnum     = re.compile(r'^OP_[A-Z0-9_]+$');
     3502        self.oReFunTable    = re.compile(r'^(IEM_STATIC|static) +const +PFNIEMOP +g_apfn[A-Za-z0-9_]+ *\[ *\d* *\] *= *$');
     3503        self.oReComment     = re.compile(r'//.*?$|/\*.*?\*/'); ## Full comments.
     3504        self.oReHashDefine2 = re.compile(r'(?s)\A\s*([A-Za-z_][A-Za-z0-9_]*)\(([^)]*)\)\s*(.*)\Z'); ##< With arguments.
     3505        self.oReHashDefine3 = re.compile(r'(?s)\A\s*([A-Za-z_][A-Za-z0-9_]*)[^(]\s*(.*)\Z');        ##< Simple, no arguments.
    35003506        self.oReMcBeginEnd  = re.compile(r'\bIEM_MC_(BEGIN|END|DEFER_TO_CIMPL_[1-5]_RET)\s*\('); ##> Not DEFER_TO_CIMPL_0_RET!
    35013507        self.fDebug         = True;
     
    36193625        # Extract the table name.
    36203626        #
    3621         sName = re.search(' *([a-zA-Z_0-9]+) *\[', sLine).group(1);
     3627        sName = re.search(r' *([a-zA-Z_0-9]+) *\[', sLine).group(1);
    36223628        oMap  = g_dInstructionMapsByIemName.get(sName);
    36233629        if not oMap:
     
    36353641        asPrefixes        = ('none', '0x66', '0xf3', '0xf2');
    36363642
    3637         oEntriesMatch = re.search('\[ *(256|32) *\]', sLine);
     3643        oEntriesMatch = re.search(r'\[ *(256|32) *\]', sLine);
    36383644        if oEntriesMatch:
    36393645            cEntriesPerByte   = 1;
     
    39543960    def parseTagOpBrief(self, sTag, aasSections, iTagLine, iEndLine):
    39553961        """
    3956         Tag:    \@opbrief
     3962        Tag:    @opbrief
    39573963        Value:  Text description, multiple sections, appended.
    39583964
     
    39843990    def parseTagOpDesc(self, sTag, aasSections, iTagLine, iEndLine):
    39853991        """
    3986         Tag:    \@opdesc
     3992        Tag:    @opdesc
    39873993        Value:  Text description, multiple sections, appended.
    39883994
     
    40224028    def parseTagOpOperandN(self, sTag, aasSections, iTagLine, iEndLine):
    40234029        """
    4024         Tags:  \@op1, \@op2, \@op3, \@op4
     4030        Tags:  @op1, @op2, @op3, @op4
    40254031        Value: [where:]type
    40264032
     
    40724078    def parseTagOpMaps(self, sTag, aasSections, iTagLine, iEndLine):
    40734079        """
    4074         Tag:    \@opmaps
     4080        Tag:    @opmaps
    40754081        Value:  map[,map2]
    40764082
     
    41074113    def parseTagOpPfx(self, sTag, aasSections, iTagLine, iEndLine):
    41084114        """
    4109         Tag:        \@oppfx
     4115        Tag:        @oppfx
    41104116        Value:      n/a|none|0x66|0xf3|0xf2
    41114117
     
    41454151    def parseTagOpcode(self, sTag, aasSections, iTagLine, iEndLine):
    41464152        """
    4147         Tag:        \@opcode
     4153        Tag:        @opcode
    41484154        Value:      0x?? | /reg (TODO: | mr/reg | 11 /reg | !11 /reg | 11 mr/reg | !11 mr/reg)
    41494155
     
    41754181    def parseTagOpcodeSub(self, sTag, aasSections, iTagLine, iEndLine):
    41764182        """
    4177         Tag:        \@opcodesub
     4183        Tag:        @opcodesub
    41784184        Value:      none | 11 mr/reg | !11 mr/reg | rex.w=0 | rex.w=1 | vex.l=0 | vex.l=1
    41794185                    | 11 mr/reg vex.l=0 | 11 mr/reg vex.l=1 | !11 mr/reg vex.l=0 | !11 mr/reg vex.l=1
     
    42024208    def parseTagOpEnc(self, sTag, aasSections, iTagLine, iEndLine):
    42034209        """
    4204         Tag:        \@openc
     4210        Tag:        @openc
    42054211        Value:      ModR/M|fixed|prefix|<map name>
    42064212
     
    42384244    def parseTagOpEFlags(self, sTag, aasSections, iTagLine, iEndLine):
    42394245        """
    4240         Tags:   \@opfltest, \@opflmodify, \@opflundef, \@opflset, \@opflclear
     4246        Tags:   @opfltest, @opflmodify, @opflundef, @opflset, @opflclear
    42414247        Value:  <eflags specifier>
    42424248
     
    42704276    def parseTagOpHints(self, sTag, aasSections, iTagLine, iEndLine):
    42714277        """
    4272         Tag:        \@ophints
     4278        Tag:        @ophints
    42734279        Value:      Comma or space separated list of flags and hints.
    42744280
     
    43044310    def parseTagOpDisEnum(self, sTag, aasSections, iTagLine, iEndLine):
    43054311        """
    4306         Tag:        \@opdisenum
     4312        Tag:        @opdisenum
    43074313        Value:      OP_XXXX
    43084314
     
    43334339    def parseTagOpMinCpu(self, sTag, aasSections, iTagLine, iEndLine):
    43344340        """
    4335         Tag:        \@opmincpu
     4341        Tag:        @opmincpu
    43364342        Value:      <simple CPU name>
    43374343
     
    43634369    def parseTagOpCpuId(self, sTag, aasSections, iTagLine, iEndLine):
    43644370        """
    4365         Tag:        \@opcpuid
     4371        Tag:        @opcpuid
    43664372        Value:      none | <CPUID flag specifier>
    43674373
     
    43974403    def parseTagOpGroup(self, sTag, aasSections, iTagLine, iEndLine):
    43984404        """
    4399         Tag:        \@opgroup
     4405        Tag:        @opgroup
    44004406        Value:      op_grp1[_subgrp2[_subsubgrp3]]
    44014407
     
    44234429    def parseTagOpUnusedInvalid(self, sTag, aasSections, iTagLine, iEndLine):
    44244430        """
    4425         Tag:    \@opunused, \@opinvalid, \@opinvlstyle
     4431        Tag:    @opunused, @opinvalid, @opinvlstyle
    44264432        Value:  <invalid opcode behaviour style>
    44274433
    4428         The \@opunused indicates the specification is for a currently unused
     4434        The @opunused indicates the specification is for a currently unused
    44294435        instruction encoding.
    44304436
    4431         The \@opinvalid indicates the specification is for an invalid currently
     4437        The @opinvalid indicates the specification is for an invalid currently
    44324438        instruction encoding (like UD2).
    44334439
    4434         The \@opinvlstyle just indicates how CPUs decode the instruction when
    4435         not supported (\@opcpuid, \@opmincpu) or disabled.
     4440        The @opinvlstyle just indicates how CPUs decode the instruction when
     4441        not supported (@opcpuid, @opmincpu) or disabled.
    44364442        """
    44374443        oInstr = self.ensureInstructionForOpTag(iTagLine);
     
    44614467    def parseTagOpTest(self, sTag, aasSections, iTagLine, iEndLine): # pylint: disable=too-many-locals
    44624468        """
    4463         Tag:        \@optest
     4469        Tag:        @optest
    44644470        Value:      [<selectors>[ ]?] <inputs> -> <outputs>
    44654471        Example:    mode==64bit / in1=0xfffffffe:dw in2=1:dw -> out1=0xffffffff:dw outfl=a?,p?
     
    46064612    def parseTagOpTestNum(self, sTag, aasSections, iTagLine, iEndLine):
    46074613        """
    4608         Numbered \@optest tag.  Either \@optest42 or \@optest[42].
     4614        Numbered @optest tag.  Either @optest42 or @optest[42].
    46094615        """
    46104616        oInstr = self.ensureInstructionForOpTag(iTagLine);
     
    46224628    def parseTagOpTestIgnore(self, sTag, aasSections, iTagLine, iEndLine):
    46234629        """
    4624         Tag:        \@optestign | \@optestignore
     4630        Tag:        @optestign | @optestignore
    46254631        Value:      <value is ignored>
    46264632
    46274633        This is a simple trick to ignore a test while debugging another.
    46284634
    4629         See also \@oponlytest.
     4635        See also @oponlytest.
    46304636        """
    46314637        _ = sTag; _ = aasSections; _ = iTagLine; _ = iEndLine;
     
    46344640    def parseTagOpCopyTests(self, sTag, aasSections, iTagLine, iEndLine):
    46354641        """
    4636         Tag:        \@opcopytests
     4642        Tag:        @opcopytests
    46374643        Value:      <opstat | function> [..]
    4638         Example:    \@opcopytests add_Eb_Gb
     4644        Example:    @opcopytests add_Eb_Gb
    46394645
    46404646        Trick to avoid duplicating tests for different encodings of the same
     
    46634669    def parseTagOpOnlyTest(self, sTag, aasSections, iTagLine, iEndLine):
    46644670        """
    4665         Tag:        \@oponlytest | \@oponly
     4671        Tag:        @oponlytest | @oponly
    46664672        Value:      none
    46674673
     
    46694675        for singling out one or two new instructions or tests.
    46704676
    4671         See also \@optestignore.
     4677        See also @optestignore.
    46724678        """
    46734679        oInstr = self.ensureInstructionForOpTag(iTagLine);
     
    46864692    def parseTagOpXcptType(self, sTag, aasSections, iTagLine, iEndLine):
    46874693        """
    4688         Tag:        \@opxcpttype
     4694        Tag:        @opxcpttype
    46894695        Value:      [none|1|2|3|4|4UA|5|6|7|8|11|12|E1|E1NF|E2|E3|E3NF|E4|E4NF|E5|E5NF|E6|E6NF|E7NF|E9|E9NF|E10|E11|E12|E12NF]
    46904696
     
    47134719    def parseTagOpFunction(self, sTag, aasSections, iTagLine, iEndLine):
    47144720        """
    4715         Tag:        \@opfunction
     4721        Tag:        @opfunction
    47164722        Value:      <VMM function name>
    47174723
     
    47414747    def parseTagOpStats(self, sTag, aasSections, iTagLine, iEndLine):
    47424748        """
    4743         Tag:        \@opstats
     4749        Tag:        @opstats
    47444750        Value:      <VMM statistics base name>
    47454751
     
    47694775    def parseTagOpDone(self, sTag, aasSections, iTagLine, iEndLine):
    47704776        """
    4771         Tag:    \@opdone
     4777        Tag:    @opdone
    47724778        Value:  none
    47734779
     
    54875493            for sName, oMacro in self.dMacros.items():
    54885494                if sRegex:
    5489                     sRegex += '|' + sName;
     5495                    sRegex += r'|' + sName;
    54905496                else:
    5491                     sRegex  = '\\b(' + sName;
     5497                    sRegex  = r'\b(' + sName;
    54925498                if oMacro.asArgs is not None:
    5493                     sRegex += '\s*\(';
     5499                    sRegex += r'\s*\(';
    54945500                else:
    5495                     sRegex += '\\b';
     5501                    sRegex += r'\b';
    54965502            sRegex += ')';
    54975503            self.oReMacros = re.compile(sRegex);
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstTwoByte0f.cpp.h

    r102891 r102977  
    91579157                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    91589158                    IEM_MC_ARG(uint16_t *,              pu16Dst,                0); \
    9159                     IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     9159                    IEM_MC_MEM_MAP_U16_ATOMIC(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    91609160                    \
    91619161                    IEM_MC_ARG_LOCAL_EFLAGS(            pEFlags, EFlags,        2); \
     
    91639163                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU16, pu16Dst, u16Src, pEFlags); \
    91649164                    \
    9165                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     9165                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    91669166                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    91679167                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    91859185                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    91869186                    IEM_MC_ARG(uint32_t *,              pu32Dst,                0); \
    9187                     IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     9187                    IEM_MC_MEM_MAP_U32_ATOMIC(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    91889188                    \
    91899189                    IEM_MC_ARG_LOCAL_EFLAGS(            pEFlags, EFlags,        2); \
     
    91919191                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU32, pu32Dst, u32Src, pEFlags); \
    91929192                    \
    9193                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     9193                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    91949194                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    91959195                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    92139213                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    92149214                    IEM_MC_ARG(uint64_t *,              pu64Dst,                0); \
    9215                     IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     9215                    IEM_MC_MEM_MAP_U64_ATOMIC(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    92169216                    \
    92179217                    IEM_MC_ARG_LOCAL_EFLAGS(            pEFlags, EFlags,        2); \
     
    92199219                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU64, pu64Dst, u64Src, pEFlags); \
    92209220                    \
    9221                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     9221                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    92229222                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    92239223                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    92999299        /* memory destination. */ \
    93009300        /** @todo test negative bit offsets! */ \
    9301         if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) || (pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK)) \
     9301        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK)) \
    93029302        { \
    93039303            switch (pVCpu->iem.s.enmEffOpSize) \
     
    1027410274    else
    1027510275    {
    10276 #define IEMOP_BODY_CMPXCHG_BYTE(a_fnWorker) \
     10276#define IEMOP_BODY_CMPXCHG_BYTE(a_fnWorker, a_Type) \
    1027710277            IEM_MC_BEGIN(4, 4, IEM_MC_F_MIN_486, 0); \
    1027810278            IEM_MC_LOCAL(RTGCPTR,       GCPtrEffDst); \
     
    1028210282            IEM_MC_LOCAL(uint8_t,           bUnmapInfo); \
    1028310283            IEM_MC_ARG(uint8_t *,           pu8Dst,                 0); \
    10284             IEM_MC_MEM_MAP_U8_RW(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     10284            IEM_MC_MEM_MAP_U8_##a_Type(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1028510285            \
    1028610286            IEM_MC_ARG(uint8_t,             u8Src,                  2); \
     
    1029510295            IEM_MC_CALL_VOID_AIMPL_4(a_fnWorker, pu8Dst, pu8Al, u8Src, pEFlags); \
    1029610296            \
    10297             IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     10297            IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Type(bUnmapInfo); \
    1029810298            IEM_MC_COMMIT_EFLAGS(EFlags); \
    1029910299            IEM_MC_STORE_GREG_U8(X86_GREG_xAX, u8Al); \
     
    1030310303        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) || (pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK))
    1030410304        {
    10305             IEMOP_BODY_CMPXCHG_BYTE(iemAImpl_cmpxchg_u8);
     10305            IEMOP_BODY_CMPXCHG_BYTE(iemAImpl_cmpxchg_u8,RW);
    1030610306        }
    1030710307        else
    1030810308        {
    10309             IEMOP_BODY_CMPXCHG_BYTE(iemAImpl_cmpxchg_u8_locked);
     10309            IEMOP_BODY_CMPXCHG_BYTE(iemAImpl_cmpxchg_u8_locked,ATOMIC);
    1031010310        }
    1031110311    }
     
    1038810388    else
    1038910389    {
    10390 #define IEMOP_BODY_CMPXCHG_EV_GV(a_fnWorker16, a_fnWorker32, a_fnWorker64) \
     10390#define IEMOP_BODY_CMPXCHG_EV_GV(a_fnWorker16, a_fnWorker32, a_fnWorker64,a_Type) \
    1039110391        do { \
    1039210392            switch (pVCpu->iem.s.enmEffOpSize) \
     
    1040110401                    \
    1040210402                    IEM_MC_ARG(uint16_t *,              pu16Dst,                0); \
    10403                     IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     10403                    IEM_MC_MEM_MAP_U16_##a_Type(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1040410404                    \
    1040510405                    IEM_MC_ARG(uint16_t,                u16Src,                 2); \
     
    1041410414                    IEM_MC_CALL_VOID_AIMPL_4(a_fnWorker16, pu16Dst, pu16Ax, u16Src, pEFlags); \
    1041510415                    \
    10416                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     10416                    IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Type(bUnmapInfo); \
    1041710417                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    1041810418                    IEM_MC_STORE_GREG_U16(X86_GREG_xAX, u16Ax); \
     
    1042910429                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    1043010430                    IEM_MC_ARG(uint32_t *,              pu32Dst,                0); \
    10431                     IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     10431                    IEM_MC_MEM_MAP_U32_##a_Type(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1043210432                    \
    1043310433                    IEM_MC_ARG(uint32_t,                u32Src,                 2); \
     
    1044210442                    IEM_MC_CALL_VOID_AIMPL_4(a_fnWorker32, pu32Dst, pu32Eax, u32Src, pEFlags); \
    1044310443                    \
    10444                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     10444                    IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Type(bUnmapInfo); \
    1044510445                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    1044610446                    \
     
    1046110461                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    1046210462                    IEM_MC_ARG(uint64_t *,              pu64Dst,                0); \
    10463                     IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     10463                    IEM_MC_MEM_MAP_U64_##a_Type(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1046410464                    \
    1046510465                    IEM_MC_ARG(uint64_t,                u64Src,                 2); \
     
    1047510475                    IEM_MC_CALL_VOID_AIMPL_4(a_fnWorker64, pu64Dst, pu64Rax, u64Src, pEFlags); \
    1047610476                    \
    10477                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     10477                    IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Type(bUnmapInfo); \
    1047810478                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    1047910479                    IEM_MC_STORE_GREG_U64(X86_GREG_xAX, u64Rax); \
     
    1048810488        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) || (pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK))
    1048910489        {
    10490             IEMOP_BODY_CMPXCHG_EV_GV(iemAImpl_cmpxchg_u16, iemAImpl_cmpxchg_u32, iemAImpl_cmpxchg_u64);
     10490            IEMOP_BODY_CMPXCHG_EV_GV(iemAImpl_cmpxchg_u16, iemAImpl_cmpxchg_u32, iemAImpl_cmpxchg_u64,RW);
    1049110491        }
    1049210492        else
    1049310493        {
    10494             IEMOP_BODY_CMPXCHG_EV_GV(iemAImpl_cmpxchg_u16_locked, iemAImpl_cmpxchg_u32_locked, iemAImpl_cmpxchg_u64_locked);
     10494            IEMOP_BODY_CMPXCHG_EV_GV(iemAImpl_cmpxchg_u16_locked, iemAImpl_cmpxchg_u32_locked, iemAImpl_cmpxchg_u64_locked,ATOMIC);
    1049510495        }
    1049610496    }
     
    1091410914                    IEM_MC_ARG(uint16_t *,              pu16Dst,                    0); \
    1091510915                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    10916                     IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     10916                    IEM_MC_MEM_MAP_U16_ATOMIC(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1091710917                    \
    1091810918                    IEM_MC_ARG_CONST(uint16_t,          u16Src, /*=*/ bImm & 0x0f,  1); \
     
    1092110921                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU16, pu16Dst, u16Src, pEFlags); \
    1092210922                    \
    10923                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     10923                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    1092410924                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    1092510925                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1093710937                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    1093810938                    IEM_MC_ARG(uint32_t *,              pu32Dst,                    0); \
    10939                     IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     10939                    IEM_MC_MEM_MAP_U32_ATOMIC(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1094010940                    \
    1094110941                    IEM_MC_ARG_CONST(uint32_t,          u32Src, /*=*/ bImm & 0x1f,  1); \
     
    1094410944                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU32, pu32Dst, u32Src, pEFlags); \
    1094510945                    \
    10946                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     10946                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    1094710947                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    1094810948                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1096010960                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    1096110961                    IEM_MC_ARG(uint64_t *,              pu64Dst,                    0); \
    10962                     IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     10962                    IEM_MC_MEM_MAP_U64_ATOMIC(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1096310963                    \
    1096410964                    IEM_MC_ARG_CONST(uint64_t,          u64Src, /*=*/ bImm & 0x3f,  1); \
     
    1096710967                    IEM_MC_CALL_VOID_AIMPL_3(a_fnLockedU64, pu64Dst, u64Src, pEFlags); \
    1096810968                    \
    10969                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     10969                    IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(bUnmapInfo); \
    1097010970                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    1097110971                    IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     
    1104211042        /* memory destination. */ \
    1104311043        /** @todo test negative bit offsets! */ \
    11044         if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) || (pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK)) \
     11044        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK)) \
    1104511045        { \
    1104611046            switch (pVCpu->iem.s.enmEffOpSize) \
     
    1160911609         * We're accessing memory.
    1161011610         */
    11611 #define IEMOP_BODY_XADD_BYTE(a_fnWorker) \
     11611#define IEMOP_BODY_XADD_BYTE(a_fnWorker, a_Type) \
    1161211612            IEM_MC_BEGIN(3, 4, IEM_MC_F_MIN_486, 0); \
    1161311613            IEM_MC_LOCAL(RTGCPTR,           GCPtrEffDst); \
     
    1161711617            IEM_MC_LOCAL(uint8_t,           bUnmapInfo); \
    1161811618            IEM_MC_ARG(uint8_t *,           pu8Dst,                 0); \
    11619             IEM_MC_MEM_MAP_U8_RW(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     11619            IEM_MC_MEM_MAP_U8_##a_Type(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1162011620            \
    1162111621            IEM_MC_LOCAL(uint8_t,           u8RegCopy); \
     
    1162711627            IEM_MC_CALL_VOID_AIMPL_3(a_fnWorker, pu8Dst, pu8Reg, pEFlags); \
    1162811628            \
    11629             IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     11629            IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Type(bUnmapInfo); \
    1163011630            IEM_MC_COMMIT_EFLAGS(EFlags); \
    1163111631            IEM_MC_STORE_GREG_U8(IEM_GET_MODRM_REG(pVCpu, bRm), u8RegCopy); \
     
    1163411634        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) || (pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK))
    1163511635        {
    11636             IEMOP_BODY_XADD_BYTE(iemAImpl_xadd_u8);
     11636            IEMOP_BODY_XADD_BYTE(iemAImpl_xadd_u8,RW);
    1163711637        }
    1163811638        else
    1163911639        {
    11640             IEMOP_BODY_XADD_BYTE(iemAImpl_xadd_u8_locked);
     11640            IEMOP_BODY_XADD_BYTE(iemAImpl_xadd_u8_locked,ATOMIC);
    1164111641        }
    1164211642    }
     
    1171611716         * We're accessing memory.
    1171711717         */
    11718 #define IEMOP_BODY_XADD_EV_GV(a_fnWorker16, a_fnWorker32, a_fnWorker64) \
     11718#define IEMOP_BODY_XADD_EV_GV(a_fnWorker16, a_fnWorker32, a_fnWorker64, a_Type) \
    1171911719        do { \
    1172011720            switch (pVCpu->iem.s.enmEffOpSize) \
     
    1172811728                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    1172911729                    IEM_MC_ARG(uint16_t *,              pu16Dst,                0); \
    11730                     IEM_MC_MEM_MAP_U16_RW(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     11730                    IEM_MC_MEM_MAP_U16_##a_Type(pu16Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1173111731                    \
    1173211732                    IEM_MC_LOCAL(uint16_t,              u16RegCopy); \
     
    1173811738                    IEM_MC_CALL_VOID_AIMPL_3(a_fnWorker16, pu16Dst, pu16Reg, pEFlags); \
    1173911739                    \
    11740                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     11740                    IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Type(bUnmapInfo); \
    1174111741                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    1174211742                    IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16RegCopy); \
     
    1175311753                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    1175411754                    IEM_MC_ARG(uint32_t *,              pu32Dst,                0); \
    11755                     IEM_MC_MEM_MAP_U32_RW(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     11755                    IEM_MC_MEM_MAP_U32_##a_Type(pu32Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1175611756                    \
    1175711757                    IEM_MC_LOCAL(uint32_t,              u32RegCopy); \
     
    1176311763                    IEM_MC_CALL_VOID_AIMPL_3(a_fnWorker32, pu32Dst, pu32Reg, pEFlags); \
    1176411764                    \
    11765                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     11765                    IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Type(bUnmapInfo); \
    1176611766                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    1176711767                    IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u32RegCopy); \
     
    1177811778                    IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    1177911779                    IEM_MC_ARG(uint64_t *,              pu64Dst,                0); \
    11780                     IEM_MC_MEM_MAP_U64_RW(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     11780                    IEM_MC_MEM_MAP_U64_##a_Type(pu64Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1178111781                    \
    1178211782                    IEM_MC_LOCAL(uint64_t,              u64RegCopy); \
     
    1178811788                    IEM_MC_CALL_VOID_AIMPL_3(a_fnWorker64, pu64Dst, pu64Reg, pEFlags); \
    1178911789                    \
    11790                     IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     11790                    IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Type(bUnmapInfo); \
    1179111791                    IEM_MC_COMMIT_EFLAGS(EFlags); \
    1179211792                    IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64RegCopy); \
     
    1180111801        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) || (pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK))
    1180211802        {
    11803             IEMOP_BODY_XADD_EV_GV(iemAImpl_xadd_u16, iemAImpl_xadd_u32, iemAImpl_xadd_u64);
     11803            IEMOP_BODY_XADD_EV_GV(iemAImpl_xadd_u16, iemAImpl_xadd_u32, iemAImpl_xadd_u64,RW);
    1180411804        }
    1180511805        else
    1180611806        {
    11807             IEMOP_BODY_XADD_EV_GV(iemAImpl_xadd_u16_locked, iemAImpl_xadd_u32_locked, iemAImpl_xadd_u64_locked);
     11807            IEMOP_BODY_XADD_EV_GV(iemAImpl_xadd_u16_locked, iemAImpl_xadd_u32_locked, iemAImpl_xadd_u64_locked,ATOMIC);
    1180811808        }
    1180911809    }
     
    1243312433{
    1243412434    IEMOP_MNEMONIC(cmpxchg8b, "cmpxchg8b Mq");
    12435 #define IEMOP_BODY_CMPXCHG8B(a_fnWorker) \
     12435#define IEMOP_BODY_CMPXCHG8B(a_fnWorker, a_Type) \
    1243612436        IEM_MC_BEGIN(4, 5, IEM_MC_F_NOT_286_OR_OLDER, 0); \
    1243712437        IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst); \
     
    1244112441        IEM_MC_LOCAL(uint8_t,               bUnmapInfo); \
    1244212442        IEM_MC_ARG(uint64_t *,              pu64MemDst,             0); \
    12443         IEM_MC_MEM_MAP_U64_RW(pu64MemDst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     12443        IEM_MC_MEM_MAP_U64_##a_Type(pu64MemDst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1244412444        \
    1244512445        IEM_MC_LOCAL(RTUINT64U,             u64EaxEdx); \
     
    1245512455        IEM_MC_CALL_VOID_AIMPL_4(a_fnWorker, pu64MemDst, pu64EaxEdx, pu64EbxEcx, pEFlags); \
    1245612456        \
    12457         IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     12457        IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Type(bUnmapInfo); \
    1245812458        IEM_MC_COMMIT_EFLAGS(EFlags); \
    1245912459        IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_ZF) { \
     
    1246512465    if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) || (pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK))
    1246612466    {
    12467         IEMOP_BODY_CMPXCHG8B(iemAImpl_cmpxchg8b);
    12468     }
    12469     else
    12470     {
    12471         IEMOP_BODY_CMPXCHG8B(iemAImpl_cmpxchg8b_locked);
     12467        IEMOP_BODY_CMPXCHG8B(iemAImpl_cmpxchg8b,RW);
     12468    }
     12469    else
     12470    {
     12471        IEMOP_BODY_CMPXCHG8B(iemAImpl_cmpxchg8b_locked,ATOMIC);
    1247212472    }
    1247312473}
     
    1248512485         * the patterns IEMAllThrdPython.py requires for the code morphing.
    1248612486         */
    12487 #define BODY_CMPXCHG16B_HEAD(bUnmapInfoStmt) \
     12487#define BODY_CMPXCHG16B_HEAD(bUnmapInfoStmt, a_Type) \
    1248812488            IEM_MC_BEGIN(5, 4, IEM_MC_F_64BIT, 0); \
    1248912489            IEM_MC_LOCAL(RTGCPTR,               GCPtrEffDst); \
     
    1249412494            bUnmapInfoStmt; \
    1249512495            IEM_MC_ARG(PRTUINT128U,             pu128MemDst,                0); \
    12496             IEM_MC_MEM_MAP_U128_RW(pu128MemDst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     12496            IEM_MC_MEM_MAP_U128_##a_Type(pu128MemDst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    1249712497            \
    1249812498            IEM_MC_LOCAL(RTUINT128U, u128RaxRdx); \
     
    1250712507            IEM_MC_FETCH_EFLAGS(EFlags)
    1250812508
    12509 #define BODY_CMPXCHG16B_TAIL \
    12510             IEM_MC_MEM_COMMIT_AND_UNMAP_RW(bUnmapInfo); \
     12509#define BODY_CMPXCHG16B_TAIL(a_Type) \
     12510            IEM_MC_MEM_COMMIT_AND_UNMAP_##a_Type(bUnmapInfo); \
    1251112511            IEM_MC_COMMIT_EFLAGS(EFlags); \
    1251212512            IEM_MC_IF_EFL_BIT_NOT_SET(X86_EFL_ZF) { \
     
    1252112521            if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) || (pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK))
    1252212522            {
    12523                 BODY_CMPXCHG16B_HEAD(IEM_MC_LOCAL(uint8_t, bUnmapInfo));
    12524                 IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg16b, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags);
    12525                 BODY_CMPXCHG16B_TAIL;
     12523                BODY_CMPXCHG16B_HEAD(IEM_MC_LOCAL(uint8_t, bUnmapInfo),RW);
     12524                IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg16b, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags,RW);
     12525                BODY_CMPXCHG16B_TAIL(RW);
    1252612526            }
    1252712527            else
    1252812528            {
    12529                 BODY_CMPXCHG16B_HEAD(IEM_MC_LOCAL(uint8_t, bUnmapInfo));
    12530                 IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg16b_locked, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags);
    12531                 BODY_CMPXCHG16B_TAIL;
     12529                BODY_CMPXCHG16B_HEAD(IEM_MC_LOCAL(uint8_t, bUnmapInfo),ATOMIC);
     12530                IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg16b_locked, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags,ATOMIC);
     12531                BODY_CMPXCHG16B_TAIL(ATOMIC);
    1253212532            }
    1253312533        }
     
    1253612536            if (pVCpu->CTX_SUFF(pVM)->cCpus == 1)
    1253712537            {
    12538                 BODY_CMPXCHG16B_HEAD(IEM_MC_LOCAL(uint8_t, bUnmapInfo));
    12539                 IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg16b_fallback, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags);
    12540                 BODY_CMPXCHG16B_TAIL;
     12538                BODY_CMPXCHG16B_HEAD(IEM_MC_LOCAL(uint8_t, bUnmapInfo),RW);
     12539                IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg16b_fallback, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags,RW);
     12540                BODY_CMPXCHG16B_TAIL(RW);
    1254112541            }
    1254212542            else
    1254312543            {
    12544                 BODY_CMPXCHG16B_HEAD(IEM_MC_ARG(uint8_t, bUnmapInfo, 4));
     12544                BODY_CMPXCHG16B_HEAD(IEM_MC_ARG(uint8_t, bUnmapInfo, 4),RW);
    1254512545                IEM_MC_CALL_CIMPL_5(IEM_CIMPL_F_STATUS_FLAGS,
    1254612546                                      RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
     
    1255612556        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) || (pVCpu->iem.s.fExec & IEM_F_X86_DISREGARD_LOCK))
    1255712557        {
    12558             BODY_CMPXCHG16B_HEAD(IEM_MC_LOCAL(uint8_t, bUnmapInfo));
     12558            BODY_CMPXCHG16B_HEAD(IEM_MC_LOCAL(uint8_t, bUnmapInfo),RW);
    1255912559            IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg16b, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags);
    12560             BODY_CMPXCHG16B_TAIL;
     12560            BODY_CMPXCHG16B_TAIL(RW);
    1256112561        }
    1256212562        else
    1256312563        {
    12564             BODY_CMPXCHG16B_HEAD(IEM_MC_LOCAL(uint8_t, bUnmapInfo));
     12564            BODY_CMPXCHG16B_HEAD(IEM_MC_LOCAL(uint8_t, bUnmapInfo),ATOMIC);
    1256512565            IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg16b_locked, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags);
    12566             BODY_CMPXCHG16B_TAIL;
     12566            BODY_CMPXCHG16B_TAIL(ATOMIC);
    1256712567        }
    1256812568
     
    1257412574        if (pVCpu->CTX_SUFF(pVM)->cCpus == 1)
    1257512575        {
    12576             BODY_CMPXCHG16B_HEAD(IEM_MC_LOCAL(uint8_t, bUnmapInfo));
     12576            BODY_CMPXCHG16B_HEAD(IEM_MC_LOCAL(uint8_t, bUnmapInfo),RW);
    1257712577            IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg16b_fallback, pu128MemDst, pu128RaxRdx, pu128RbxRcx, pEFlags);
    12578             BODY_CMPXCHG16B_TAIL;
     12578            BODY_CMPXCHG16B_TAIL(RW);
    1257912579        }
    1258012580        else
    1258112581        {
    12582             BODY_CMPXCHG16B_HEAD(IEM_MC_ARG(uint8_t, bUnmapInfo, 4));
     12582            BODY_CMPXCHG16B_HEAD(IEM_MC_ARG(uint8_t, bUnmapInfo, 4),RW);
    1258312583            IEM_MC_CALL_CIMPL_4(IEM_CIMPL_F_STATUS_FLAGS,
    1258412584                                  RT_BIT_64(kIemNativeGstReg_GprFirst + X86_GREG_xAX)
  • trunk/src/VBox/VMM/VMMAll/IEMAllMemRWTmpl.cpp.h

    r102790 r102977  
    182182
    183183#ifdef IEM_WITH_SETJMP
     184
     185/**
     186 * Maps a data buffer for atomic read+write direct access (or via a bounce
     187 * buffer), longjmp on error.
     188 *
     189 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     190 * @param   pbUnmapInfo         Pointer to unmap info variable.
     191 * @param   iSegReg             The index of the segment register to use for
     192 *                              this access.  The base and limits are checked.
     193 * @param   GCPtrMem            The address of the guest memory.
     194 */
     195TMPL_MEM_TYPE *
     196RT_CONCAT3(iemMemMapData,TMPL_MEM_FN_SUFF,AtSafeJmp)(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo,
     197                                                     uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP
     198{
     199# if defined(IEM_WITH_DATA_TLB) && defined(IN_RING3)
     200    pVCpu->iem.s.DataTlb.cTlbSafeWritePath++;
     201# endif
     202    Log8(("IEM AT/map " TMPL_MEM_FMT_DESC " %d|%RGv\n", iSegReg, GCPtrMem));
     203    *pbUnmapInfo = 1 | ((IEM_ACCESS_TYPE_READ  | IEM_ACCESS_TYPE_WRITE) << 4); /* zero is for the TLB hit */
     204    return (TMPL_MEM_TYPE *)iemMemMapJmp(pVCpu, pbUnmapInfo, sizeof(TMPL_MEM_TYPE), iSegReg, GCPtrMem,
     205                                         IEM_ACCESS_DATA_ATOMIC, TMPL_MEM_TYPE_ALIGN);
     206}
     207
    184208
    185209/**
  • trunk/src/VBox/VMM/VMMAll/IEMAllMemRWTmplInline.cpp.h

    r102790 r102977  
    382382/**
    383383 * Inlined read-write memory mapping function that longjumps on error.
     384 *
     385 * Almost identical to RT_CONCAT3(iemMemMapData,TMPL_MEM_FN_SUFF,AtJmp).
    384386 */
    385387DECL_INLINE_THROW(TMPL_MEM_TYPE *)
     
    438440/**
    439441 * Inlined flat read-write memory mapping function that longjumps on error.
     442 *
     443 * Almost identical to RT_CONCAT3(iemMemFlatMapData,TMPL_MEM_FN_SUFF,AtJmp).
    440444 */
    441445DECL_INLINE_THROW(TMPL_MEM_TYPE *)
     
    490494}
    491495
     496#  ifdef TMPL_MEM_WITH_ATOMIC_MAPPING
     497
     498/**
     499 * Inlined atomic read-write memory mapping function that longjumps on error.
     500 *
     501 * Almost identical to RT_CONCAT3(iemMemMapData,TMPL_MEM_FN_SUFF,RwJmp).
     502 */
     503DECL_INLINE_THROW(TMPL_MEM_TYPE *)
     504RT_CONCAT3(iemMemMapData,TMPL_MEM_FN_SUFF,AtJmp)(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo,
     505                                                 uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP
     506{
     507#  if defined(IEM_WITH_DATA_TLB) && defined(IN_RING3) && !defined(TMPL_MEM_NO_INLINE)
     508    /*
     509     * Convert from segmented to flat address and check that it doesn't cross a page boundrary.
     510     */
     511    RTGCPTR const GCPtrEff = iemMemApplySegmentToWriteJmp(pVCpu, iSegReg, sizeof(TMPL_MEM_TYPE), GCPtrMem);
     512#  if TMPL_MEM_TYPE_SIZE > 1
     513    if (RT_LIKELY(!(GCPtrEff & TMPL_MEM_TYPE_ALIGN))) /* strictly aligned, otherwise do fall back which knows th details. */
     514#  endif
     515    {
     516        /*
     517         * TLB lookup.
     518         */
     519        uint64_t const uTag  = IEMTLB_CALC_TAG(    &pVCpu->iem.s.DataTlb, GCPtrEff);
     520        PIEMTLBENTRY   pTlbe = IEMTLB_TAG_TO_ENTRY(&pVCpu->iem.s.DataTlb, uTag);
     521        if (RT_LIKELY(pTlbe->uTag == uTag))
     522        {
     523            /*
     524             * Check TLB page table level access flags.
     525             */
     526            AssertCompile(IEMTLBE_F_PT_NO_USER == 4);
     527            uint64_t const fNoUser = (IEM_GET_CPL(pVCpu) + 1) & IEMTLBE_F_PT_NO_USER;
     528            if (RT_LIKELY(   (pTlbe->fFlagsAndPhysRev & (  IEMTLBE_F_PHYS_REV       | IEMTLBE_F_NO_MAPPINGR3
     529                                                         | IEMTLBE_F_PG_UNASSIGNED  | IEMTLBE_F_PG_NO_WRITE   | IEMTLBE_F_PG_NO_READ
     530                                                         | IEMTLBE_F_PT_NO_ACCESSED | IEMTLBE_F_PT_NO_DIRTY   | IEMTLBE_F_PT_NO_WRITE
     531                                                         | fNoUser))
     532                          == pVCpu->iem.s.DataTlb.uTlbPhysRev))
     533            {
     534                /*
     535                 * Return the address.
     536                 */
     537                STAM_STATS({pVCpu->iem.s.DataTlb.cTlbHits++;});
     538                Assert(pTlbe->pbMappingR3); /* (Only ever cleared by the owning EMT.) */
     539                Assert(!((uintptr_t)pTlbe->pbMappingR3 & GUEST_PAGE_OFFSET_MASK));
     540                *pbUnmapInfo = 0;
     541                Log7Ex(LOG_GROUP_IEM_MEM,("IEM AT/map " TMPL_MEM_FMT_DESC " %d|%RGv=%RGv: %p\n",
     542                                          iSegReg, GCPtrMem, GCPtrEff, &pTlbe->pbMappingR3[GCPtrEff & GUEST_PAGE_OFFSET_MASK]));
     543                return (TMPL_MEM_TYPE *)&pTlbe->pbMappingR3[GCPtrEff & GUEST_PAGE_OFFSET_MASK];
     544            }
     545        }
     546    }
     547
     548    /* Fall back on the slow careful approach in case of TLB miss, MMIO, exception
     549       outdated page pointer, or other troubles.  (This will do a TLB load.) */
     550    Log8Ex(LOG_GROUP_IEM_MEM,(LOG_FN_FMT ": %u:%RGv falling back\n", LOG_FN_NAME, iSegReg, GCPtrMem));
     551#  endif
     552    return RT_CONCAT3(iemMemMapData,TMPL_MEM_FN_SUFF,AtSafeJmp)(pVCpu, pbUnmapInfo, iSegReg, GCPtrMem);
     553}
     554
     555
     556/**
     557 * Inlined flat read-write memory mapping function that longjumps on error.
     558 *
     559 * Almost identical to RT_CONCAT3(iemMemFlatMapData,TMPL_MEM_FN_SUFF,RwJmp).
     560 */
     561DECL_INLINE_THROW(TMPL_MEM_TYPE *)
     562RT_CONCAT3(iemMemFlatMapData,TMPL_MEM_FN_SUFF,AtJmp)(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo,
     563                                                     RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP
     564{
     565#  if defined(IEM_WITH_DATA_TLB) && defined(IN_RING3) && !defined(TMPL_MEM_NO_INLINE)
     566    /*
     567     * Check that the address doesn't cross a page boundrary.
     568     */
     569#  if TMPL_MEM_TYPE_SIZE > 1
     570    if (RT_LIKELY(!(GCPtrMem & TMPL_MEM_TYPE_ALIGN))) /* strictly aligned, otherwise do fall back which knows th details. */
     571#  endif
     572    {
     573        /*
     574         * TLB lookup.
     575         */
     576        uint64_t const uTag  = IEMTLB_CALC_TAG(    &pVCpu->iem.s.DataTlb, GCPtrMem);
     577        PIEMTLBENTRY   pTlbe = IEMTLB_TAG_TO_ENTRY(&pVCpu->iem.s.DataTlb, uTag);
     578        if (RT_LIKELY(pTlbe->uTag == uTag))
     579        {
     580            /*
     581             * Check TLB page table level access flags.
     582             */
     583            AssertCompile(IEMTLBE_F_PT_NO_USER == 4);
     584            uint64_t const fNoUser = (IEM_GET_CPL(pVCpu) + 1) & IEMTLBE_F_PT_NO_USER;
     585            if (RT_LIKELY(   (pTlbe->fFlagsAndPhysRev & (  IEMTLBE_F_PHYS_REV       | IEMTLBE_F_NO_MAPPINGR3
     586                                                         | IEMTLBE_F_PG_UNASSIGNED  | IEMTLBE_F_PG_NO_WRITE   | IEMTLBE_F_PG_NO_READ
     587                                                         | IEMTLBE_F_PT_NO_ACCESSED | IEMTLBE_F_PT_NO_DIRTY   | IEMTLBE_F_PT_NO_WRITE
     588                                                         | fNoUser))
     589                          == pVCpu->iem.s.DataTlb.uTlbPhysRev))
     590            {
     591                /*
     592                 * Return the address.
     593                 */
     594                STAM_STATS({pVCpu->iem.s.DataTlb.cTlbHits++;});
     595                Assert(pTlbe->pbMappingR3); /* (Only ever cleared by the owning EMT.) */
     596                Assert(!((uintptr_t)pTlbe->pbMappingR3 & GUEST_PAGE_OFFSET_MASK));
     597                *pbUnmapInfo = 0;
     598                Log7Ex(LOG_GROUP_IEM_MEM,("IEM AT/map " TMPL_MEM_FMT_DESC " %RGv: %p\n",
     599                                          GCPtrMem, &pTlbe->pbMappingR3[GCPtrMem & GUEST_PAGE_OFFSET_MASK]));
     600                return (TMPL_MEM_TYPE *)&pTlbe->pbMappingR3[GCPtrMem & GUEST_PAGE_OFFSET_MASK];
     601            }
     602        }
     603    }
     604
     605    /* Fall back on the slow careful approach in case of TLB miss, MMIO, exception
     606       outdated page pointer, or other troubles.  (This will do a TLB load.) */
     607    Log8Ex(LOG_GROUP_IEM_MEM,(LOG_FN_FMT ": %RGv falling back\n", LOG_FN_NAME, GCPtrMem));
     608#  endif
     609    return RT_CONCAT3(iemMemMapData,TMPL_MEM_FN_SUFF,AtSafeJmp)(pVCpu, pbUnmapInfo, UINT8_MAX, GCPtrMem);
     610}
     611
     612#  endif /* TMPL_MEM_WITH_ATOMIC_MAPPING */
    492613
    493614/**
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8vePython.py

    r102876 r102977  
    169169    'IEM_MC_MEM_FLAT_MAP_R64_WO':                                        (None, True,  True,  True,  ),
    170170    'IEM_MC_MEM_FLAT_MAP_R80_WO':                                        (None, True,  True,  True,  ),
     171    'IEM_MC_MEM_FLAT_MAP_U8_ATOMIC':                                     (None, True,  True,  True,  ),
    171172    'IEM_MC_MEM_FLAT_MAP_U8_RO':                                         (None, True,  True,  True,  ),
    172173    'IEM_MC_MEM_FLAT_MAP_U8_RW':                                         (None, True,  True,  True,  ),
     174    'IEM_MC_MEM_FLAT_MAP_U16_ATOMIC':                                    (None, True,  True,  True,  ),
    173175    'IEM_MC_MEM_FLAT_MAP_U16_RO':                                        (None, True,  True,  True,  ),
    174176    'IEM_MC_MEM_FLAT_MAP_U16_RW':                                        (None, True,  True,  True,  ),
     177    'IEM_MC_MEM_FLAT_MAP_U32_ATOMIC':                                    (None, True,  True,  True,  ),
    175178    'IEM_MC_MEM_FLAT_MAP_U32_RO':                                        (None, True,  True,  True,  ),
    176179    'IEM_MC_MEM_FLAT_MAP_U32_RW':                                        (None, True,  True,  True,  ),
     180    'IEM_MC_MEM_FLAT_MAP_U64_ATOMIC':                                    (None, True,  True,  True,  ),
    177181    'IEM_MC_MEM_FLAT_MAP_U64_RO':                                        (None, True,  True,  True,  ),
    178182    'IEM_MC_MEM_FLAT_MAP_U64_RW':                                        (None, True,  True,  True,  ),
     183    'IEM_MC_MEM_FLAT_MAP_U128_ATOMIC':                                   (None, True,  True,  True,  ),
    179184    'IEM_MC_MEM_FLAT_MAP_U128_RW':                                       (None, True,  True,  True,  ),
    180185    'IEM_MC_STORE_MEM_FLAT_U128_ALIGN_SSE':                              (None, True,  True,  False, ),
     
    398403                elif oStmt.sName in ('IEM_MC_MEM_COMMIT_AND_UNMAP_RW', 'IEM_MC_MEM_COMMIT_AND_UNMAP_RO',
    399404                                     'IEM_MC_MEM_COMMIT_AND_UNMAP_WO', 'IEM_MC_MEM_ROLLBACK_AND_UNMAP_WO',
     405                                     'IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC',
    400406                                     'IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE_WO'):
    401407                    #
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp

    r102904 r102977  
    22282228
    22292229/**
     2230 * Used by TB code to map unsigned 8-bit data for atomic read-write w/
     2231 * segmentation.
     2232 */
     2233IEM_DECL_NATIVE_HLP_DEF(uint8_t *, iemNativeHlpMemMapDataU8Atomic,(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo,
     2234                                                                   RTGCPTR GCPtrMem, uint8_t iSegReg))
     2235{
     2236#ifdef IEMNATIVE_WITH_TLB_LOOKUP_MAPPED
     2237    return iemMemMapDataU8AtSafeJmp(pVCpu, pbUnmapInfo, iSegReg, GCPtrMem);
     2238#else
     2239    return iemMemMapDataU8AtJmp(pVCpu, pbUnmapInfo, iSegReg, GCPtrMem);
     2240#endif
     2241}
     2242
     2243
     2244/**
    22302245 * Used by TB code to map unsigned 8-bit data read-write w/ segmentation.
    22312246 */
     
    22702285
    22712286/**
     2287 * Used by TB code to map unsigned 16-bit data for atomic read-write w/
     2288 * segmentation.
     2289 */
     2290IEM_DECL_NATIVE_HLP_DEF(uint16_t *, iemNativeHlpMemMapDataU16Atomic,(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo,
     2291                                                                     RTGCPTR GCPtrMem, uint8_t iSegReg))
     2292{
     2293#ifdef IEMNATIVE_WITH_TLB_LOOKUP_MAPPED
     2294    return iemMemMapDataU16AtSafeJmp(pVCpu, pbUnmapInfo, iSegReg, GCPtrMem);
     2295#else
     2296    return iemMemMapDataU16AtJmp(pVCpu, pbUnmapInfo, iSegReg, GCPtrMem);
     2297#endif
     2298}
     2299
     2300
     2301/**
    22722302 * Used by TB code to map unsigned 16-bit data read-write w/ segmentation.
    22732303 */
     
    23122342
    23132343/**
     2344 * Used by TB code to map unsigned 32-bit data for atomic read-write w/
     2345 * segmentation.
     2346 */
     2347IEM_DECL_NATIVE_HLP_DEF(uint32_t *, iemNativeHlpMemMapDataU32Atomic,(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo,
     2348                                                                     RTGCPTR GCPtrMem, uint8_t iSegReg))
     2349{
     2350#ifdef IEMNATIVE_WITH_TLB_LOOKUP_MAPPED
     2351    return iemMemMapDataU32AtSafeJmp(pVCpu, pbUnmapInfo, iSegReg, GCPtrMem);
     2352#else
     2353    return iemMemMapDataU32AtJmp(pVCpu, pbUnmapInfo, iSegReg, GCPtrMem);
     2354#endif
     2355}
     2356
     2357
     2358/**
    23142359 * Used by TB code to map unsigned 32-bit data read-write w/ segmentation.
    23152360 */
     
    23542399
    23552400/**
     2401 * Used by TB code to map unsigned 64-bit data for atomic read-write w/
     2402 * segmentation.
     2403 */
     2404IEM_DECL_NATIVE_HLP_DEF(uint64_t *, iemNativeHlpMemMapDataU64Atomic,(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo,
     2405                                                                     RTGCPTR GCPtrMem, uint8_t iSegReg))
     2406{
     2407#ifdef IEMNATIVE_WITH_TLB_LOOKUP_MAPPED
     2408    return iemMemMapDataU64AtSafeJmp(pVCpu, pbUnmapInfo, iSegReg, GCPtrMem);
     2409#else
     2410    return iemMemMapDataU64AtJmp(pVCpu, pbUnmapInfo, iSegReg, GCPtrMem);
     2411#endif
     2412}
     2413
     2414
     2415/**
    23562416 * Used by TB code to map unsigned 64-bit data read-write w/ segmentation.
    23572417 */
     
    24192479#else
    24202480    return iemMemMapDataD80WoJmp(pVCpu, pbUnmapInfo, iSegReg, GCPtrMem);
     2481#endif
     2482}
     2483
     2484
     2485/**
     2486 * Used by TB code to map unsigned 128-bit data for atomic read-write w/
     2487 * segmentation.
     2488 */
     2489IEM_DECL_NATIVE_HLP_DEF(RTUINT128U *, iemNativeHlpMemMapDataU128Atomic,(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo,
     2490                                                                        RTGCPTR GCPtrMem, uint8_t iSegReg))
     2491{
     2492#ifdef IEMNATIVE_WITH_TLB_LOOKUP_MAPPED
     2493    return iemMemMapDataU128AtSafeJmp(pVCpu, pbUnmapInfo, iSegReg, GCPtrMem);
     2494#else
     2495    return iemMemMapDataU128AtJmp(pVCpu, pbUnmapInfo, iSegReg, GCPtrMem);
    24212496#endif
    24222497}
     
    24702545
    24712546/**
     2547 * Used by TB code to map unsigned 8-bit data for atomic read-write w/ flat
     2548 * address.
     2549 */
     2550IEM_DECL_NATIVE_HLP_DEF(uint8_t *, iemNativeHlpMemFlatMapDataU8Atomic,(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, RTGCPTR GCPtrMem))
     2551{
     2552#ifdef IEMNATIVE_WITH_TLB_LOOKUP_MAPPED
     2553    return iemMemMapDataU8AtSafeJmp(pVCpu, pbUnmapInfo, UINT8_MAX, GCPtrMem);
     2554#else
     2555    return iemMemFlatMapDataU8AtJmp(pVCpu, pbUnmapInfo, GCPtrMem);
     2556#endif
     2557}
     2558
     2559
     2560/**
    24722561 * Used by TB code to map unsigned 8-bit data read-write w/ flat address.
    24732562 */
     
    25092598
    25102599/**
     2600 * Used by TB code to map unsigned 16-bit data for atomic read-write w/ flat
     2601 * address.
     2602 */
     2603IEM_DECL_NATIVE_HLP_DEF(uint16_t *, iemNativeHlpMemFlatMapDataU16Atomic,(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, RTGCPTR GCPtrMem))
     2604{
     2605#ifdef IEMNATIVE_WITH_TLB_LOOKUP_MAPPED
     2606    return iemMemMapDataU16AtSafeJmp(pVCpu, pbUnmapInfo, UINT8_MAX, GCPtrMem);
     2607#else
     2608    return iemMemFlatMapDataU16AtJmp(pVCpu, pbUnmapInfo, GCPtrMem);
     2609#endif
     2610}
     2611
     2612
     2613/**
    25112614 * Used by TB code to map unsigned 16-bit data read-write w/ flat address.
    25122615 */
     
    25482651
    25492652/**
     2653 * Used by TB code to map unsigned 32-bit data for atomic read-write w/ flat
     2654 * address.
     2655 */
     2656IEM_DECL_NATIVE_HLP_DEF(uint32_t *, iemNativeHlpMemFlatMapDataU32Atomic,(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, RTGCPTR GCPtrMem))
     2657{
     2658#ifdef IEMNATIVE_WITH_TLB_LOOKUP_MAPPED
     2659    return iemMemMapDataU32AtSafeJmp(pVCpu, pbUnmapInfo, UINT8_MAX, GCPtrMem);
     2660#else
     2661    return iemMemFlatMapDataU32AtJmp(pVCpu, pbUnmapInfo, GCPtrMem);
     2662#endif
     2663}
     2664
     2665
     2666/**
    25502667 * Used by TB code to map unsigned 32-bit data read-write w/ flat address.
    25512668 */
     
    25872704
    25882705/**
     2706 * Used by TB code to map unsigned 64-bit data for atomic read-write w/ flat
     2707 * address.
     2708 */
     2709IEM_DECL_NATIVE_HLP_DEF(uint64_t *, iemNativeHlpMemFlatMapDataU64Atomic,(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, RTGCPTR GCPtrMem))
     2710{
     2711#ifdef IEMNATIVE_WITH_TLB_LOOKUP_MAPPED
     2712    return iemMemMapDataU64AtSafeJmp(pVCpu, pbUnmapInfo, UINT8_MAX, GCPtrMem);
     2713#else
     2714    return iemMemFlatMapDataU64AtJmp(pVCpu, pbUnmapInfo, GCPtrMem);
     2715#endif
     2716}
     2717
     2718
     2719/**
    25892720 * Used by TB code to map unsigned 64-bit data read-write w/ flat address.
    25902721 */
     
    26472778#else
    26482779    return iemMemFlatMapDataD80WoJmp(pVCpu, pbUnmapInfo, GCPtrMem);
     2780#endif
     2781}
     2782
     2783
     2784/**
     2785 * Used by TB code to map unsigned 128-bit data for atomic read-write w/ flat
     2786 * address.
     2787 */
     2788IEM_DECL_NATIVE_HLP_DEF(RTUINT128U *, iemNativeHlpMemFlatMapDataU128Atomic,(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, RTGCPTR GCPtrMem))
     2789{
     2790#ifdef IEMNATIVE_WITH_TLB_LOOKUP_MAPPED
     2791    return iemMemMapDataU128AtSafeJmp(pVCpu, pbUnmapInfo, UINT8_MAX, GCPtrMem);
     2792#else
     2793    return iemMemFlatMapDataU128AtJmp(pVCpu, pbUnmapInfo, GCPtrMem);
    26492794#endif
    26502795}
     
    26932838*   Helpers: Commit, rollback & unmap                                                                                            *
    26942839*********************************************************************************************************************************/
     2840
     2841/**
     2842 * Used by TB code to commit and unmap a read-write memory mapping.
     2843 */
     2844IEM_DECL_NATIVE_HLP_DEF(void, iemNativeHlpMemCommitAndUnmapAtomic,(PVMCPUCC pVCpu, uint8_t bUnmapInfo))
     2845{
     2846    return iemMemCommitAndUnmapAtSafeJmp(pVCpu, bUnmapInfo);
     2847}
     2848
    26952849
    26962850/**
     
    1190312057*********************************************************************************************************************************/
    1190412058
     12059#define IEM_MC_MEM_MAP_U8_ATOMIC(a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     12060    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint8_t), \
     12061                                    IEM_ACCESS_DATA_ATOMIC,  0 /*fAlignMask*/, \
     12062                                    (uintptr_t)iemNativeHlpMemMapDataU8Atomic, pCallEntry->idxInstr)
     12063
    1190512064#define IEM_MC_MEM_MAP_U8_RW(a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1190612065    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint8_t), \
    11907                                     IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE,  0 /*fAlignMask*/, \
     12066                                    IEM_ACCESS_DATA_RW,  0 /*fAlignMask*/, \
    1190812067                                    (uintptr_t)iemNativeHlpMemMapDataU8Rw, pCallEntry->idxInstr)
    1190912068
    1191012069#define IEM_MC_MEM_MAP_U8_WO(a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1191112070    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint8_t), \
    11912                                     IEM_ACCESS_TYPE_WRITE,  0 /*fAlignMask*/, \
     12071                                    IEM_ACCESS_DATA_W,  0 /*fAlignMask*/, \
    1191312072                                    (uintptr_t)iemNativeHlpMemMapDataU8Wo, pCallEntry->idxInstr) \
    1191412073
    1191512074#define IEM_MC_MEM_MAP_U8_RO(a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1191612075    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint8_t), \
    11917                                     IEM_ACCESS_TYPE_READ,  0 /*fAlignMask*/, \
     12076                                    IEM_ACCESS_DATA_R,  0 /*fAlignMask*/, \
    1191812077                                    (uintptr_t)iemNativeHlpMemMapDataU8Ro, pCallEntry->idxInstr)
    1191912078
     12079
     12080#define IEM_MC_MEM_MAP_U16_ATOMIC(a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     12081    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint16_t), \
     12082                                    IEM_ACCESS_DATA_ATOMIC,  sizeof(uint16_t) - 1 /*fAlignMask*/, \
     12083                                    (uintptr_t)iemNativeHlpMemMapDataU16Atomic, pCallEntry->idxInstr)
    1192012084
    1192112085#define IEM_MC_MEM_MAP_U16_RW(a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1192212086    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint16_t), \
    11923                                     IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE,  sizeof(uint16_t) - 1 /*fAlignMask*/, \
     12087                                    IEM_ACCESS_DATA_RW,  sizeof(uint16_t) - 1 /*fAlignMask*/, \
    1192412088                                    (uintptr_t)iemNativeHlpMemMapDataU16Rw, pCallEntry->idxInstr)
    1192512089
    1192612090#define IEM_MC_MEM_MAP_U16_WO(a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1192712091    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint16_t), \
    11928                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint16_t) - 1 /*fAlignMask*/, \
     12092                                    IEM_ACCESS_DATA_W, sizeof(uint16_t) - 1 /*fAlignMask*/, \
    1192912093                                    (uintptr_t)iemNativeHlpMemMapDataU16Wo, pCallEntry->idxInstr) \
    1193012094
    1193112095#define IEM_MC_MEM_MAP_U16_RO(a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1193212096    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint16_t), \
    11933                                     IEM_ACCESS_TYPE_READ,  sizeof(uint16_t) - 1 /*fAlignMask*/, \
     12097                                    IEM_ACCESS_DATA_R,  sizeof(uint16_t) - 1 /*fAlignMask*/, \
    1193412098                                    (uintptr_t)iemNativeHlpMemMapDataU16Ro, pCallEntry->idxInstr)
    1193512099
    1193612100#define IEM_MC_MEM_MAP_I16_WO(a_pi16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1193712101    off = iemNativeEmitMemMapCommon(pReNative, off, a_pi16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(int16_t), \
    11938                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint16_t) - 1 /*fAlignMask*/, \
     12102                                    IEM_ACCESS_DATA_W, sizeof(uint16_t) - 1 /*fAlignMask*/, \
    1193912103                                    (uintptr_t)iemNativeHlpMemMapDataU16Wo, pCallEntry->idxInstr) \
    1194012104
     12105
     12106#define IEM_MC_MEM_MAP_U32_ATOMIC(a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     12107    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint32_t), \
     12108                                    IEM_ACCESS_DATA_ATOMIC, sizeof(uint32_t) - 1 /*fAlignMask*/, \
     12109                                    (uintptr_t)iemNativeHlpMemMapDataU32Atomic, pCallEntry->idxInstr)
    1194112110
    1194212111#define IEM_MC_MEM_MAP_U32_RW(a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1194312112    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint32_t), \
    11944                                     IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE, sizeof(uint32_t) - 1 /*fAlignMask*/, \
     12113                                    IEM_ACCESS_DATA_RW, sizeof(uint32_t) - 1 /*fAlignMask*/, \
    1194512114                                    (uintptr_t)iemNativeHlpMemMapDataU32Rw, pCallEntry->idxInstr)
    1194612115
    1194712116#define IEM_MC_MEM_MAP_U32_WO(a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1194812117    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint32_t), \
    11949                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint32_t) - 1 /*fAlignMask*/, \
     12118                                    IEM_ACCESS_DATA_W, sizeof(uint32_t) - 1 /*fAlignMask*/, \
    1195012119                                    (uintptr_t)iemNativeHlpMemMapDataU32Wo, pCallEntry->idxInstr) \
    1195112120
    1195212121#define IEM_MC_MEM_MAP_U32_RO(a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1195312122    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint32_t), \
    11954                                     IEM_ACCESS_TYPE_READ,  sizeof(uint32_t) - 1 /*fAlignMask*/, \
     12123                                    IEM_ACCESS_DATA_R,  sizeof(uint32_t) - 1 /*fAlignMask*/, \
    1195512124                                    (uintptr_t)iemNativeHlpMemMapDataU32Ro, pCallEntry->idxInstr)
    1195612125
    1195712126#define IEM_MC_MEM_MAP_I32_WO(a_pi32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1195812127    off = iemNativeEmitMemMapCommon(pReNative, off, a_pi32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(int32_t), \
    11959                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint32_t) - 1 /*fAlignMask*/, \
     12128                                    IEM_ACCESS_DATA_W, sizeof(uint32_t) - 1 /*fAlignMask*/, \
    1196012129                                    (uintptr_t)iemNativeHlpMemMapDataU32Wo, pCallEntry->idxInstr) \
    1196112130
     12131
     12132#define IEM_MC_MEM_MAP_U64_ATOMIC(a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     12133    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint64_t), \
     12134                                    IEM_ACCESS_DATA_ATOMIC, sizeof(uint64_t) - 1 /*fAlignMask*/, \
     12135                                    (uintptr_t)iemNativeHlpMemMapDataU64Atomic, pCallEntry->idxInstr)
    1196212136
    1196312137#define IEM_MC_MEM_MAP_U64_RW(a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1196412138    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint64_t), \
    11965                                     IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE, sizeof(uint64_t) - 1 /*fAlignMask*/, \
     12139                                    IEM_ACCESS_DATA_RW, sizeof(uint64_t) - 1 /*fAlignMask*/, \
    1196612140                                    (uintptr_t)iemNativeHlpMemMapDataU64Rw, pCallEntry->idxInstr)
    11967 
    1196812141#define IEM_MC_MEM_MAP_U64_WO(a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1196912142    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint64_t), \
    11970                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint64_t) - 1 /*fAlignMask*/, \
     12143                                    IEM_ACCESS_DATA_W, sizeof(uint64_t) - 1 /*fAlignMask*/, \
    1197112144                                    (uintptr_t)iemNativeHlpMemMapDataU64Wo, pCallEntry->idxInstr) \
    1197212145
    1197312146#define IEM_MC_MEM_MAP_U64_RO(a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1197412147    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(uint64_t), \
    11975                                     IEM_ACCESS_TYPE_READ,  sizeof(uint64_t) - 1 /*fAlignMask*/, \
     12148                                    IEM_ACCESS_DATA_R,  sizeof(uint64_t) - 1 /*fAlignMask*/, \
    1197612149                                    (uintptr_t)iemNativeHlpMemMapDataU64Ro, pCallEntry->idxInstr)
    1197712150
    1197812151#define IEM_MC_MEM_MAP_I64_WO(a_pi64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1197912152    off = iemNativeEmitMemMapCommon(pReNative, off, a_pi64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(int64_t), \
    11980                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint64_t) - 1 /*fAlignMask*/, \
     12153                                    IEM_ACCESS_DATA_W, sizeof(uint64_t) - 1 /*fAlignMask*/, \
    1198112154                                    (uintptr_t)iemNativeHlpMemMapDataU64Wo, pCallEntry->idxInstr) \
    1198212155
     
    1198412157#define IEM_MC_MEM_MAP_R80_WO(a_pr80Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1198512158    off = iemNativeEmitMemMapCommon(pReNative, off, a_pr80Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(RTFLOAT80U), \
    11986                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint64_t) - 1 /*fAlignMask*/, \
     12159                                    IEM_ACCESS_DATA_W, sizeof(uint64_t) - 1 /*fAlignMask*/, \
    1198712160                                    (uintptr_t)iemNativeHlpMemMapDataR80Wo, pCallEntry->idxInstr) \
    1198812161
    1198912162#define IEM_MC_MEM_MAP_D80_WO(a_pd80Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1199012163    off = iemNativeEmitMemMapCommon(pReNative, off, a_pd80Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(RTFLOAT80U), \
    11991                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint64_t) - 1 /*fAlignMask*/, /** @todo check BCD align */ \
     12164                                    IEM_ACCESS_DATA_W, sizeof(uint64_t) - 1 /*fAlignMask*/, /** @todo check BCD align */ \
    1199212165                                    (uintptr_t)iemNativeHlpMemMapDataD80Wo, pCallEntry->idxInstr) \
    1199312166
     12167
     12168#define IEM_MC_MEM_MAP_U128_ATOMIC(a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     12169    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(RTUINT128U), \
     12170                                    IEM_ACCESS_DATA_ATOMIC, sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
     12171                                    (uintptr_t)iemNativeHlpMemMapDataU128Atomic, pCallEntry->idxInstr)
    1199412172
    1199512173#define IEM_MC_MEM_MAP_U128_RW(a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1199612174    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(RTUINT128U), \
    11997                                     IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE, sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
     12175                                    IEM_ACCESS_DATA_RW, sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
    1199812176                                    (uintptr_t)iemNativeHlpMemMapDataU128Rw, pCallEntry->idxInstr)
    1199912177
    1200012178#define IEM_MC_MEM_MAP_U128_WO(a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1200112179    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(RTUINT128U), \
    12002                                     IEM_ACCESS_TYPE_WRITE, sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
     12180                                    IEM_ACCESS_DATA_W, sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
    1200312181                                    (uintptr_t)iemNativeHlpMemMapDataU128Wo, pCallEntry->idxInstr) \
    1200412182
    1200512183#define IEM_MC_MEM_MAP_U128_RO(a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
    1200612184    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem, sizeof(RTUINT128U), \
    12007                                     IEM_ACCESS_TYPE_READ,  sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
     12185                                    IEM_ACCESS_DATA_R,  sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
    1200812186                                    (uintptr_t)iemNativeHlpMemMapDataU128Ro, pCallEntry->idxInstr)
    1200912187
    1201012188
     12189
     12190#define IEM_MC_MEM_FLAT_MAP_U8_ATOMIC(a_pu8Mem, a_bUnmapInfo, a_GCPtrMem) \
     12191    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu8Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint8_t), \
     12192                                    IEM_ACCESS_DATA_ATOMIC,  0 /*fAlignMask*/, \
     12193                                    (uintptr_t)iemNativeHlpMemFlatMapDataU8Atomic, pCallEntry->idxInstr)
    1201112194
    1201212195#define IEM_MC_MEM_FLAT_MAP_U8_RW(a_pu8Mem, a_bUnmapInfo, a_GCPtrMem) \
    1201312196    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu8Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint8_t), \
    12014                                     IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE,  0 /*fAlignMask*/, \
     12197                                    IEM_ACCESS_DATA_RW,  0 /*fAlignMask*/, \
    1201512198                                    (uintptr_t)iemNativeHlpMemFlatMapDataU8Rw, pCallEntry->idxInstr)
    1201612199
    1201712200#define IEM_MC_MEM_FLAT_MAP_U8_WO(a_pu8Mem, a_bUnmapInfo, a_GCPtrMem) \
    1201812201    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu8Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint8_t), \
    12019                                     IEM_ACCESS_TYPE_WRITE,  0 /*fAlignMask*/, \
     12202                                    IEM_ACCESS_DATA_W,  0 /*fAlignMask*/, \
    1202012203                                    (uintptr_t)iemNativeHlpMemFlatMapDataU8Wo, pCallEntry->idxInstr) \
    1202112204
    1202212205#define IEM_MC_MEM_FLAT_MAP_U8_RO(a_pu8Mem, a_bUnmapInfo, a_GCPtrMem) \
    1202312206    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu8Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint8_t), \
    12024                                     IEM_ACCESS_TYPE_READ,  0 /*fAlignMask*/, \
     12207                                    IEM_ACCESS_DATA_R,  0 /*fAlignMask*/, \
    1202512208                                    (uintptr_t)iemNativeHlpMemFlatMapDataU8Ro, pCallEntry->idxInstr)
    1202612209
     12210
     12211#define IEM_MC_MEM_FLAT_MAP_U16_ATOMIC(a_pu16Mem, a_bUnmapInfo, a_GCPtrMem) \
     12212    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu16Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint16_t), \
     12213                                    IEM_ACCESS_DATA_ATOMIC,  sizeof(uint16_t) - 1 /*fAlignMask*/, \
     12214                                    (uintptr_t)iemNativeHlpMemFlatMapDataU16Atomic, pCallEntry->idxInstr)
    1202712215
    1202812216#define IEM_MC_MEM_FLAT_MAP_U16_RW(a_pu16Mem, a_bUnmapInfo, a_GCPtrMem) \
    1202912217    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu16Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint16_t), \
    12030                                     IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE,  sizeof(uint16_t) - 1 /*fAlignMask*/, \
     12218                                    IEM_ACCESS_DATA_RW,  sizeof(uint16_t) - 1 /*fAlignMask*/, \
    1203112219                                    (uintptr_t)iemNativeHlpMemFlatMapDataU16Rw, pCallEntry->idxInstr)
    1203212220
    1203312221#define IEM_MC_MEM_FLAT_MAP_U16_WO(a_pu16Mem, a_bUnmapInfo, a_GCPtrMem) \
    1203412222    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu16Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint16_t), \
    12035                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint16_t) - 1 /*fAlignMask*/, \
     12223                                    IEM_ACCESS_DATA_W, sizeof(uint16_t) - 1 /*fAlignMask*/, \
    1203612224                                    (uintptr_t)iemNativeHlpMemFlatMapDataU16Wo, pCallEntry->idxInstr) \
    1203712225
    1203812226#define IEM_MC_MEM_FLAT_MAP_U16_RO(a_pu16Mem, a_bUnmapInfo, a_GCPtrMem) \
    1203912227    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu16Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint16_t), \
    12040                                     IEM_ACCESS_TYPE_READ,  sizeof(uint16_t) - 1 /*fAlignMask*/, \
     12228                                    IEM_ACCESS_DATA_R,  sizeof(uint16_t) - 1 /*fAlignMask*/, \
    1204112229                                    (uintptr_t)iemNativeHlpMemFlatMapDataU16Ro, pCallEntry->idxInstr)
    1204212230
    1204312231#define IEM_MC_MEM_FLAT_MAP_I16_WO(a_pi16Mem, a_bUnmapInfo, a_GCPtrMem) \
    1204412232    off = iemNativeEmitMemMapCommon(pReNative, off, a_pi16Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(int16_t), \
    12045                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint16_t) - 1 /*fAlignMask*/, \
     12233                                    IEM_ACCESS_DATA_W, sizeof(uint16_t) - 1 /*fAlignMask*/, \
    1204612234                                    (uintptr_t)iemNativeHlpMemFlatMapDataU16Wo, pCallEntry->idxInstr) \
    1204712235
     12236
     12237#define IEM_MC_MEM_FLAT_MAP_U32_ATOMIC(a_pu32Mem, a_bUnmapInfo, a_GCPtrMem) \
     12238    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu32Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint32_t), \
     12239                                    IEM_ACCESS_DATA_ATOMIC, sizeof(uint32_t) - 1 /*fAlignMask*/, \
     12240                                    (uintptr_t)iemNativeHlpMemFlatMapDataU32Atomic, pCallEntry->idxInstr)
    1204812241
    1204912242#define IEM_MC_MEM_FLAT_MAP_U32_RW(a_pu32Mem, a_bUnmapInfo, a_GCPtrMem) \
    1205012243    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu32Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint32_t), \
    12051                                     IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE, sizeof(uint32_t) - 1 /*fAlignMask*/, \
     12244                                    IEM_ACCESS_DATA_RW, sizeof(uint32_t) - 1 /*fAlignMask*/, \
    1205212245                                    (uintptr_t)iemNativeHlpMemFlatMapDataU32Rw, pCallEntry->idxInstr)
    1205312246
    1205412247#define IEM_MC_MEM_FLAT_MAP_U32_WO(a_pu32Mem, a_bUnmapInfo, a_GCPtrMem) \
    1205512248    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu32Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint32_t), \
    12056                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint32_t) - 1 /*fAlignMask*/, \
     12249                                    IEM_ACCESS_DATA_W, sizeof(uint32_t) - 1 /*fAlignMask*/, \
    1205712250                                    (uintptr_t)iemNativeHlpMemFlatMapDataU32Wo, pCallEntry->idxInstr) \
    1205812251
    1205912252#define IEM_MC_MEM_FLAT_MAP_U32_RO(a_pu32Mem, a_bUnmapInfo, a_GCPtrMem) \
    1206012253    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu32Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint32_t), \
    12061                                     IEM_ACCESS_TYPE_READ,  sizeof(uint32_t) - 1 /*fAlignMask*/, \
     12254                                    IEM_ACCESS_DATA_R,  sizeof(uint32_t) - 1 /*fAlignMask*/, \
    1206212255                                    (uintptr_t)iemNativeHlpMemFlatMapDataU32Ro, pCallEntry->idxInstr)
    1206312256
    1206412257#define IEM_MC_MEM_FLAT_MAP_I32_WO(a_pi32Mem, a_bUnmapInfo, a_GCPtrMem) \
    1206512258    off = iemNativeEmitMemMapCommon(pReNative, off, a_pi32Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(int32_t), \
    12066                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint32_t) - 1 /*fAlignMask*/, \
     12259                                    IEM_ACCESS_DATA_W, sizeof(uint32_t) - 1 /*fAlignMask*/, \
    1206712260                                    (uintptr_t)iemNativeHlpMemFlatMapDataU32Wo, pCallEntry->idxInstr) \
    1206812261
     12262
     12263#define IEM_MC_MEM_FLAT_MAP_U64_ATOMIC(a_pu64Mem, a_bUnmapInfo, a_GCPtrMem) \
     12264    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu64Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint64_t), \
     12265                                    IEM_ACCESS_DATA_ATOMIC, sizeof(uint64_t) - 1 /*fAlignMask*/, \
     12266                                    (uintptr_t)iemNativeHlpMemFlatMapDataU64Atomic, pCallEntry->idxInstr)
    1206912267
    1207012268#define IEM_MC_MEM_FLAT_MAP_U64_RW(a_pu64Mem, a_bUnmapInfo, a_GCPtrMem) \
    1207112269    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu64Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint64_t), \
    12072                                     IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE, sizeof(uint64_t) - 1 /*fAlignMask*/, \
     12270                                    IEM_ACCESS_DATA_RW, sizeof(uint64_t) - 1 /*fAlignMask*/, \
    1207312271                                    (uintptr_t)iemNativeHlpMemFlatMapDataU64Rw, pCallEntry->idxInstr)
    1207412272
    1207512273#define IEM_MC_MEM_FLAT_MAP_U64_WO(a_pu64Mem, a_bUnmapInfo, a_GCPtrMem) \
    1207612274    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu64Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint64_t), \
    12077                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint64_t) - 1 /*fAlignMask*/, \
     12275                                    IEM_ACCESS_DATA_W, sizeof(uint64_t) - 1 /*fAlignMask*/, \
    1207812276                                    (uintptr_t)iemNativeHlpMemFlatMapDataU64Wo, pCallEntry->idxInstr) \
    1207912277
    1208012278#define IEM_MC_MEM_FLAT_MAP_U64_RO(a_pu64Mem, a_bUnmapInfo, a_GCPtrMem) \
    1208112279    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu64Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(uint64_t), \
    12082                                     IEM_ACCESS_TYPE_READ,  sizeof(uint64_t) - 1 /*fAlignMask*/, \
     12280                                    IEM_ACCESS_DATA_R,  sizeof(uint64_t) - 1 /*fAlignMask*/, \
    1208312281                                    (uintptr_t)iemNativeHlpMemFlatMapDataU64Ro, pCallEntry->idxInstr)
    1208412282
    1208512283#define IEM_MC_MEM_FLAT_MAP_I64_WO(a_pi64Mem, a_bUnmapInfo, a_GCPtrMem) \
    1208612284    off = iemNativeEmitMemMapCommon(pReNative, off, a_pi64Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(int64_t), \
    12087                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint64_t) - 1 /*fAlignMask*/, \
     12285                                    IEM_ACCESS_DATA_W, sizeof(uint64_t) - 1 /*fAlignMask*/, \
    1208812286                                    (uintptr_t)iemNativeHlpMemFlatMapDataU64Wo, pCallEntry->idxInstr) \
    1208912287
     
    1209112289#define IEM_MC_MEM_FLAT_MAP_R80_WO(a_pr80Mem, a_bUnmapInfo, a_GCPtrMem) \
    1209212290    off = iemNativeEmitMemMapCommon(pReNative, off, a_pr80Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(RTFLOAT80U), \
    12093                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint64_t) - 1 /*fAlignMask*/, \
     12291                                    IEM_ACCESS_DATA_W, sizeof(uint64_t) - 1 /*fAlignMask*/, \
    1209412292                                    (uintptr_t)iemNativeHlpMemFlatMapDataR80Wo, pCallEntry->idxInstr) \
    1209512293
    1209612294#define IEM_MC_MEM_FLAT_MAP_D80_WO(a_pd80Mem, a_bUnmapInfo, a_GCPtrMem) \
    1209712295    off = iemNativeEmitMemMapCommon(pReNative, off, a_pd80Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(RTFLOAT80U), \
    12098                                     IEM_ACCESS_TYPE_WRITE, sizeof(uint64_t) - 1 /*fAlignMask*/, /** @todo check BCD align */ \
     12296                                    IEM_ACCESS_DATA_W, sizeof(uint64_t) - 1 /*fAlignMask*/, /** @todo check BCD align */ \
    1209912297                                    (uintptr_t)iemNativeHlpMemFlatMapDataD80Wo, pCallEntry->idxInstr) \
    1210012298
     12299
     12300#define IEM_MC_MEM_FLAT_MAP_U128_ATOMIC(a_pu128Mem, a_bUnmapInfo, a_GCPtrMem) \
     12301    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu128Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(RTUINT128U), \
     12302                                    IEM_ACCESS_DATA_ATOMIC, sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
     12303                                    (uintptr_t)iemNativeHlpMemFlatMapDataU128Atomic, pCallEntry->idxInstr)
    1210112304
    1210212305#define IEM_MC_MEM_FLAT_MAP_U128_RW(a_pu128Mem, a_bUnmapInfo, a_GCPtrMem) \
    1210312306    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu128Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(RTUINT128U), \
    12104                                     IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE, sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
     12307                                    IEM_ACCESS_DATA_RW, sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
    1210512308                                    (uintptr_t)iemNativeHlpMemFlatMapDataU128Rw, pCallEntry->idxInstr)
    1210612309
    1210712310#define IEM_MC_MEM_FLAT_MAP_U128_WO(a_pu128Mem, a_bUnmapInfo, a_GCPtrMem) \
    1210812311    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu128Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(RTUINT128U), \
    12109                                     IEM_ACCESS_TYPE_WRITE, sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
     12312                                    IEM_ACCESS_DATA_W, sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
    1211012313                                    (uintptr_t)iemNativeHlpMemFlatMapDataU128Wo, pCallEntry->idxInstr) \
    1211112314
    1211212315#define IEM_MC_MEM_FLAT_MAP_U128_RO(a_pu128Mem, a_bUnmapInfo, a_GCPtrMem) \
    1211312316    off = iemNativeEmitMemMapCommon(pReNative, off, a_pu128Mem, a_bUnmapInfo, UINT8_MAX, a_GCPtrMem, sizeof(RTUINT128U), \
    12114                                     IEM_ACCESS_TYPE_READ,  sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
     12317                                    IEM_ACCESS_DATA_R,  sizeof(RTUINT128U) - 1 /*fAlignMask*/, \
    1211512318                                    (uintptr_t)iemNativeHlpMemFlatMapDataU128Ro, pCallEntry->idxInstr)
    1211612319
     
    1214412347
    1214512348#ifdef VBOX_STRICT
     12349# define IEM_MAP_HLP_FN_NO_AT(a_fAccess, a_fnBase) \
     12350        (  ((a_fAccess) & (IEM_ACCESS_TYPE_MASK | IEM_ACCESS_ATOMIC)) == (IEM_ACCESS_TYPE_WRITE | IEM_ACCESS_TYPE_READ) \
     12351         ? (uintptr_t)RT_CONCAT(a_fnBase,Rw) \
     12352         : ((a_fAccess) & (IEM_ACCESS_TYPE_MASK | IEM_ACCESS_ATOMIC)) == IEM_ACCESS_TYPE_READ \
     12353         ? (uintptr_t)RT_CONCAT(a_fnBase,Ro) : (uintptr_t)RT_CONCAT(a_fnBase,Wo) )
    1214612354# define IEM_MAP_HLP_FN(a_fAccess, a_fnBase) \
    12147         (  ((a_fAccess) & IEM_ACCESS_TYPE_MASK) == (IEM_ACCESS_TYPE_WRITE | IEM_ACCESS_TYPE_READ) \
    12148          ? (uintptr_t)RT_CONCAT(a_fnBase,Rw) \
    12149          : ((a_fAccess) & IEM_ACCESS_TYPE_MASK) == IEM_ACCESS_TYPE_READ \
    12150          ? (uintptr_t)RT_CONCAT(a_fnBase,Ro) : (uintptr_t)RT_CONCAT(a_fnBase,Wo) )
     12355        (  ((a_fAccess) & (IEM_ACCESS_TYPE_MASK | IEM_ACCESS_ATOMIC)) == (IEM_ACCESS_TYPE_WRITE | IEM_ACCESS_TYPE_READ | IEM_ACCESS_ATOMIC) \
     12356         ? (uintptr_t)RT_CONCAT(a_fnBase,Atomic) \
     12357         : IEM_MAP_HLP_FN_NO_AT(a_fAccess, a_fnBase) )
    1215112358
    1215212359    if (iSegReg == UINT8_MAX)
     
    1216812375            case 16: Assert(pfnFunction == IEM_MAP_HLP_FN(fAccess, iemNativeHlpMemFlatMapDataU128)); break;
    1216912376# if 0
    12170             case 32: Assert(pfnFunction == IEM_MAP_HLP_FN(fAccess, iemNativeHlpMemFlatMapDataU256)); break;
    12171             case 64: Assert(pfnFunction == IEM_MAP_HLP_FN(fAccess, iemNativeHlpMemFlatMapDataU512)); break;
     12377            case 32: Assert(pfnFunction == IEM_MAP_HLP_FN_NO_AT(fAccess, iemNativeHlpMemFlatMapDataU256)); break;
     12378            case 64: Assert(pfnFunction == IEM_MAP_HLP_FN_NO_AT(fAccess, iemNativeHlpMemFlatMapDataU512)); break;
    1217212379# endif
    1217312380            default: AssertFailed(); break;
     
    1219012397            case 16: Assert(pfnFunction == IEM_MAP_HLP_FN(fAccess, iemNativeHlpMemMapDataU128)); break;
    1219112398# if 0
    12192             case 32: Assert(pfnFunction == IEM_MAP_HLP_FN(fAccess, iemNativeHlpMemMapDataU256)); break;
    12193             case 64: Assert(pfnFunction == IEM_MAP_HLP_FN(fAccess, iemNativeHlpMemMapDataU512)); break;
     12399            case 32: Assert(pfnFunction == IEM_MAP_HLP_FN_NO_AT(fAccess, iemNativeHlpMemMapDataU256)); break;
     12400            case 64: Assert(pfnFunction == IEM_MAP_HLP_FN_NO_AT(fAccess, iemNativeHlpMemMapDataU512)); break;
    1219412401# endif
    1219512402            default: AssertFailed(); break;
     
    1219712404    }
    1219812405# undef IEM_MAP_HLP_FN
     12406# undef IEM_MAP_HLP_FN_NO_AT
    1219912407#endif
    1220012408
     
    1235312561
    1235412562
     12563#define IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(a_bMapInfo) \
     12564    off = iemNativeEmitMemCommitAndUnmap(pReNative, off, (a_bMapInfo), IEM_ACCESS_DATA_ATOMIC, \
     12565                                         (uintptr_t)iemNativeHlpMemCommitAndUnmapAtomic, pCallEntry->idxInstr)
     12566
    1235512567#define IEM_MC_MEM_COMMIT_AND_UNMAP_RW(a_bMapInfo) \
    12356     off = iemNativeEmitMemCommitAndUnmap(pReNative, off, (a_bMapInfo), IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE, \
     12568    off = iemNativeEmitMemCommitAndUnmap(pReNative, off, (a_bMapInfo), IEM_ACCESS_DATA_RW, \
    1235712569                                         (uintptr_t)iemNativeHlpMemCommitAndUnmapRw, pCallEntry->idxInstr)
    1235812570
    1235912571#define IEM_MC_MEM_COMMIT_AND_UNMAP_WO(a_bMapInfo) \
    12360     off = iemNativeEmitMemCommitAndUnmap(pReNative, off, (a_bMapInfo), IEM_ACCESS_TYPE_WRITE, \
     12572    off = iemNativeEmitMemCommitAndUnmap(pReNative, off, (a_bMapInfo), IEM_ACCESS_DATA_W, \
    1236112573                                         (uintptr_t)iemNativeHlpMemCommitAndUnmapWo, pCallEntry->idxInstr)
    1236212574
    1236312575#define IEM_MC_MEM_COMMIT_AND_UNMAP_RO(a_bMapInfo) \
    12364     off = iemNativeEmitMemCommitAndUnmap(pReNative, off, (a_bMapInfo), IEM_ACCESS_TYPE_READ, \
     12576    off = iemNativeEmitMemCommitAndUnmap(pReNative, off, (a_bMapInfo), IEM_ACCESS_DATA_R, \
    1236512577                                         (uintptr_t)iemNativeHlpMemCommitAndUnmapRo, pCallEntry->idxInstr)
    1236612578
     
    1237712589           || pReNative->Core.aVars[idxVarUnmapInfo].idxStackSlot < IEMNATIVE_FRAME_VAR_SLOTS); /* must be initialized */
    1237812590#ifdef VBOX_STRICT
    12379     switch (fAccess & IEM_ACCESS_TYPE_MASK)
    12380     {
    12381         case IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE: Assert(pfnFunction == (uintptr_t)iemNativeHlpMemCommitAndUnmapRw); break;
    12382         case IEM_ACCESS_TYPE_WRITE:                        Assert(pfnFunction == (uintptr_t)iemNativeHlpMemCommitAndUnmapWo); break;
    12383         case IEM_ACCESS_TYPE_READ:                         Assert(pfnFunction == (uintptr_t)iemNativeHlpMemCommitAndUnmapRo); break;
     12591    switch (fAccess & (IEM_ACCESS_TYPE_MASK | IEM_ACCESS_ATOMIC))
     12592    {
     12593        case IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE | IEM_ACCESS_ATOMIC:
     12594            Assert(pfnFunction == (uintptr_t)iemNativeHlpMemCommitAndUnmapAtomic); break;
     12595        case IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE:
     12596            Assert(pfnFunction == (uintptr_t)iemNativeHlpMemCommitAndUnmapRw); break;
     12597        case IEM_ACCESS_TYPE_WRITE:
     12598            Assert(pfnFunction == (uintptr_t)iemNativeHlpMemCommitAndUnmapWo); break;
     12599        case IEM_ACCESS_TYPE_READ:
     12600            Assert(pfnFunction == (uintptr_t)iemNativeHlpMemCommitAndUnmapRo); break;
    1238412601        default: AssertFailed();
    1238512602    }
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdPython.py

    r102883 r102977  
    882882        'IEM_MC_MEM_MAP_R64_WO':                  (  2, 'IEM_MC_MEM_FLAT_MAP_R64_WO' ),
    883883        'IEM_MC_MEM_MAP_R80_WO':                  (  2, 'IEM_MC_MEM_FLAT_MAP_R80_WO' ),
     884        'IEM_MC_MEM_MAP_U8_ATOMIC':               (  2, 'IEM_MC_MEM_FLAT_MAP_U8_ATOMIC' ),
    884885        'IEM_MC_MEM_MAP_U8_RW':                   (  2, 'IEM_MC_MEM_FLAT_MAP_U8_RW' ),
    885886        'IEM_MC_MEM_MAP_U8_RO':                   (  2, 'IEM_MC_MEM_FLAT_MAP_U8_RO' ),
    886887        'IEM_MC_MEM_MAP_U8_WO':                   (  2, 'IEM_MC_MEM_FLAT_MAP_U8_WO' ),
     888        'IEM_MC_MEM_MAP_U16_ATOMIC':              (  2, 'IEM_MC_MEM_FLAT_MAP_U16_ATOMIC' ),
    887889        'IEM_MC_MEM_MAP_U16_RW':                  (  2, 'IEM_MC_MEM_FLAT_MAP_U16_RW' ),
    888890        'IEM_MC_MEM_MAP_U16_RO':                  (  2, 'IEM_MC_MEM_FLAT_MAP_U16_RO' ),
    889891        'IEM_MC_MEM_MAP_U16_WO':                  (  2, 'IEM_MC_MEM_FLAT_MAP_U16_WO' ),
     892        'IEM_MC_MEM_MAP_U32_ATOMIC':              (  2, 'IEM_MC_MEM_FLAT_MAP_U32_ATOMIC' ),
    890893        'IEM_MC_MEM_MAP_U32_RW':                  (  2, 'IEM_MC_MEM_FLAT_MAP_U32_RW' ),
    891894        'IEM_MC_MEM_MAP_U32_RO':                  (  2, 'IEM_MC_MEM_FLAT_MAP_U32_RO' ),
    892895        'IEM_MC_MEM_MAP_U32_WO':                  (  2, 'IEM_MC_MEM_FLAT_MAP_U32_WO' ),
     896        'IEM_MC_MEM_MAP_U64_ATOMIC':              (  2, 'IEM_MC_MEM_FLAT_MAP_U64_ATOMIC' ),
    893897        'IEM_MC_MEM_MAP_U64_RW':                  (  2, 'IEM_MC_MEM_FLAT_MAP_U64_RW' ),
    894898        'IEM_MC_MEM_MAP_U64_RO':                  (  2, 'IEM_MC_MEM_FLAT_MAP_U64_RO' ),
    895899        'IEM_MC_MEM_MAP_U64_WO':                  (  2, 'IEM_MC_MEM_FLAT_MAP_U64_WO' ),
     900        'IEM_MC_MEM_MAP_U128_ATOMIC':             (  2, 'IEM_MC_MEM_FLAT_MAP_U128_ATOMIC' ),
    896901        'IEM_MC_MEM_MAP_U128_RW':                 (  2, 'IEM_MC_MEM_FLAT_MAP_U128_RW' ),
    897902        'IEM_MC_MEM_MAP_U128_RO':                 (  2, 'IEM_MC_MEM_FLAT_MAP_U128_RO' ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdRecompiler.cpp

    r102876 r102977  
    26652665     * Init the execution environment.
    26662666     */
    2667 #ifdef RT_ARCH_ARM64 /** @todo ARM64: fix unaligned locked instructions properly. @bugref{10547} */
     2667#if 1 /** @todo this seems like a good idea, however if we ever share memory
     2668       * directly with other threads on the host, it isn't necessarily... */
    26682669    if (pVM->cCpus == 1)
    26692670        iemInitExec(pVCpu, IEM_F_X86_DISREGARD_LOCK /*fExecOpts*/);
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r102949 r102977  
    706706#endif /* LOG_ENABLED || VBOX_STRICT */
    707707
    708 
    709708#if !defined(VBOX_VMM_TARGET_ARMV8)
     709
    710710/**
    711711 * Handle pending ring-3 I/O port write.
     
    851851    return VMMR3EmtRendezvous(pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_ALL_AT_ONCE, emR3ExecuteSplitLockInstructionRendezvous, pVCpu);
    852852}
     853
    853854#endif /* VBOX_VMM_TARGET_ARMV8 */
    854 
    855855
    856856/**
     
    893893                        rc = VINF_EM_DBG_STEPPED;
    894894                }
     895#ifndef VBOX_VMM_TARGET_ARMV8
     896                if (rc != VINF_EM_EMULATE_SPLIT_LOCK)
     897                { /* likely */ }
     898                else
     899                {
     900                    rc = emR3ExecuteSplitLockInstruction(pVM, pVCpu);
     901                    if (rc == VINF_SUCCESS || rc == VINF_EM_RESCHEDULE)
     902                        rc = VINF_EM_DBG_STEPPED;
     903                }
     904#endif
    895905                break;
    896906
     
    11161126        if (rcStrict != VINF_SUCCESS)
    11171127        {
     1128#ifndef VBOX_VMM_TARGET_ARMV8
     1129            if (rcStrict == VINF_EM_EMULATE_SPLIT_LOCK)
     1130                rcStrict = emR3ExecuteSplitLockInstruction(pVM, pVCpu);
     1131#endif
     1132            if (rcStrict != VINF_SUCCESS)
     1133            {
    11181134#if 0
    1119             if (RT_LIKELY(rcStrict >= VINF_EM_FIRST && rcStrict <= VINF_EM_LAST))
     1135                if (RT_LIKELY(rcStrict >= VINF_EM_FIRST && rcStrict <= VINF_EM_LAST))
     1136                    break;
     1137                /* Fatal error: */
     1138#endif
    11201139                break;
    1121             /* Fatal error: */
    1122 #endif
    1123             break;
     1140            }
    11241141        }
    11251142
     
    25562573                    else if (rc == VINF_SUCCESS)
    25572574                        rc = VINF_EM_RESCHEDULE; /* Need to check whether we can run in HM or NEM again. */
     2575#ifndef VBOX_VMM_TARGET_ARMV8
     2576                    if (rc != VINF_EM_EMULATE_SPLIT_LOCK)
     2577                    { /* likely */ }
     2578                    else
     2579                        rc = VBOXSTRICTRC_TODO(emR3ExecuteSplitLockInstruction(pVM, pVCpu));
     2580#endif
    25582581                    fFFDone = false;
    25592582                    break;
  • trunk/src/VBox/VMM/VMMR3/IEMR3.cpp

    r102850 r102977  
    291291        STAMR3RegisterF(pVM, &pVCpu->iem.s.cPendingCommit,              STAMTYPE_U32,       STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES,
    292292                        "Times RC/R0 had to postpone instruction committing to ring-3", "/IEM/CPU%u/cPendingCommit", idCpu);
     293        STAMR3RegisterF(pVM, &pVCpu->iem.s.cMisalignedAtomics,          STAMTYPE_U32_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES,
     294                        "Number of misaligned (for the host) atomic instructions", "/IEM/CPU%u/cMisalignedAtomics", idCpu);
    293295
    294296        STAMR3RegisterF(pVM, &pVCpu->iem.s.CodeTlb.cTlbMisses,          STAMTYPE_U32_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
  • trunk/src/VBox/VMM/include/IEMInline.h

    r102876 r102977  
    5656            )
    5757        {
    58             if (pVCpu->iem.s.rcPassUp == VINF_SUCCESS)
    59                 rcStrict = VINF_SUCCESS;
     58            rcStrict = pVCpu->iem.s.rcPassUp;
     59            if (RT_LIKELY(rcStrict == VINF_SUCCESS))
     60            { /* likely */ }
    6061            else
    61             {
    6262                pVCpu->iem.s.cRetPassUpStatus++;
    63                 rcStrict = pVCpu->iem.s.rcPassUp;
    64             }
    6563        }
    6664        else if (RT_SUCCESS(rcStrict))
     
    7977                      || rcStrict == VINF_EM_RAW_TO_R3
    8078                      || rcStrict == VINF_EM_TRIPLE_FAULT
     79                      || rcStrict == VINF_EM_EMULATE_SPLIT_LOCK
    8180                      || rcStrict == VINF_GIM_R3_HYPERCALL
    8281                      /* raw-mode / virt handlers only: */
     
    117116            pVCpu->iem.s.cRetErrStatuses++;
    118117    }
    119     else if (pVCpu->iem.s.rcPassUp != VINF_SUCCESS)
    120     {
    121         pVCpu->iem.s.cRetPassUpStatus++;
     118    else
     119    {
    122120        rcStrict = pVCpu->iem.s.rcPassUp;
     121        if (rcStrict != VINF_SUCCESS)
     122            pVCpu->iem.s.cRetPassUpStatus++;
    123123    }
    124124
     
    39363936
    39373937
     3938DECL_INLINE_THROW(void) iemMemCommitAndUnmapAtJmp(PVMCPUCC pVCpu, uint8_t bMapInfo) IEM_NOEXCEPT_MAY_LONGJMP
     3939{
     3940# if defined(IEM_WITH_DATA_TLB) && defined(IN_RING3)
     3941    if (RT_LIKELY(bMapInfo == 0))
     3942        return;
     3943# endif
     3944    iemMemCommitAndUnmapAtSafeJmp(pVCpu, bMapInfo);
     3945}
     3946
     3947
    39383948DECL_INLINE_THROW(void) iemMemCommitAndUnmapWoJmp(PVMCPUCC pVCpu, uint8_t bMapInfo) IEM_NOEXCEPT_MAY_LONGJMP
    39393949{
     
    39914001#endif
    39924002
     4003#define TMPL_MEM_WITH_ATOMIC_MAPPING
     4004
    39934005#define TMPL_MEM_TYPE       uint8_t
    39944006#define TMPL_MEM_TYPE_ALIGN 0
     
    40284040
    40294041#undef TMPL_MEM_WITH_STACK
     4042#undef TMPL_MEM_WITH_ATOMIC_MAPPING
    40304043
    40314044#define TMPL_MEM_NO_STORE
     
    40584071#include "../VMMAll/IEMAllMemRWTmplInline.cpp.h"
    40594072
     4073#define TMPL_MEM_WITH_ATOMIC_MAPPING
    40604074#define TMPL_MEM_TYPE       RTUINT128U
    40614075#define TMPL_MEM_TYPE_ALIGN 15
     
    40654079#define TMPL_MEM_FMT_DESC   "dqword"
    40664080#include "../VMMAll/IEMAllMemRWTmplInline.cpp.h"
     4081#undef  TMPL_MEM_WITH_ATOMIC_MAPPING
    40674082
    40684083#undef TMPL_MEM_CHECK_UNALIGNED_WITHIN_PAGE_OK
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r102896 r102977  
    16041604    /** Number of times RZ left with instruction commit pending for ring-3. */
    16051605    uint32_t                cPendingCommit;
     1606    /** Number of misaligned (host sense) atomic instruction accesses. */
     1607    uint32_t                cMisalignedAtomics;
    16061608    /** Number of long jumps. */
    16071609    uint32_t                cLongJumps;
     
    16411643    uint8_t                 cLogRelWrMsr;
    16421644    /** Alignment padding. */
    1643     uint8_t                 abAlignment9[46];
     1645    uint8_t                 abAlignment9[42];
    16441646
    16451647    /** @name Recompilation
     
    19891991/** Not locked, accessed via the TLB. */
    19901992#define IEM_ACCESS_NOT_LOCKED           UINT32_C(0x00001000)
     1993/** Atomic access.
     1994 * This enables special alignment checks and the VINF_EM_EMULATE_SPLIT_LOCK
     1995 * fallback for misaligned stuff. See @bugref{10547}. */
     1996#define IEM_ACCESS_ATOMIC               UINT32_C(0x00002000)
    19911997/** Valid bit mask. */
    1992 #define IEM_ACCESS_VALID_MASK           UINT32_C(0x00001fff)
     1998#define IEM_ACCESS_VALID_MASK           UINT32_C(0x00003fff)
    19931999/** Shift count for the TLB flags (upper word). */
    19942000#define IEM_ACCESS_SHIFT_TLB_FLAGS      16
    19952001
     2002/** Atomic read+write data alias. */
     2003#define IEM_ACCESS_DATA_ATOMIC          (IEM_ACCESS_TYPE_READ  | IEM_ACCESS_TYPE_WRITE | IEM_ACCESS_WHAT_DATA | IEM_ACCESS_ATOMIC)
    19962004/** Read+write data alias. */
    19972005#define IEM_ACCESS_DATA_RW              (IEM_ACCESS_TYPE_READ  | IEM_ACCESS_TYPE_WRITE | IEM_ACCESS_WHAT_DATA)
     
    52015209#ifdef IEM_WITH_SETJMP
    52025210uint8_t        *iemMemMapDataU8RwSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
     5211uint8_t        *iemMemMapDataU8AtSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52035212uint8_t        *iemMemMapDataU8WoSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52045213uint8_t const  *iemMemMapDataU8RoSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52055214uint16_t       *iemMemMapDataU16RwSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
     5215uint16_t       *iemMemMapDataU16AtSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52065216uint16_t       *iemMemMapDataU16WoSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52075217uint16_t const *iemMemMapDataU16RoSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52085218uint32_t       *iemMemMapDataU32RwSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
     5219uint32_t       *iemMemMapDataU32AtSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52095220uint32_t       *iemMemMapDataU32WoSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52105221uint32_t const *iemMemMapDataU32RoSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52115222uint64_t       *iemMemMapDataU64RwSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
     5223uint64_t       *iemMemMapDataU64AtSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52125224uint64_t       *iemMemMapDataU64WoSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52135225uint64_t const *iemMemMapDataU64RoSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
     
    52195231PCRTPBCD80U     iemMemMapDataD80RoSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52205232PRTUINT128U     iemMemMapDataU128RwSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
     5233PRTUINT128U     iemMemMapDataU128AtSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52215234PRTUINT128U     iemMemMapDataU128WoSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
    52225235PCRTUINT128U    iemMemMapDataU128RoSafeJmp(PVMCPUCC pVCpu, uint8_t *pbUnmapInfo, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;
     
    52245237void            iemMemCommitAndUnmapJmp(PVMCPUCC pVCpu, uint8_t bUnmapInfo) IEM_NOEXCEPT_MAY_LONGJMP;
    52255238void            iemMemCommitAndUnmapRwSafeJmp(PVMCPUCC pVCpu, uint8_t bUnmapInfo) IEM_NOEXCEPT_MAY_LONGJMP;
     5239void            iemMemCommitAndUnmapAtSafeJmp(PVMCPUCC pVCpu, uint8_t bUnmapInfo) IEM_NOEXCEPT_MAY_LONGJMP;
    52265240void            iemMemCommitAndUnmapWoSafeJmp(PVMCPUCC pVCpu, uint8_t bUnmapInfo) IEM_NOEXCEPT_MAY_LONGJMP;
    52275241void            iemMemCommitAndUnmapRoSafeJmp(PVMCPUCC pVCpu, uint8_t bUnmapInfo) IEM_NOEXCEPT_MAY_LONGJMP;
  • trunk/src/VBox/VMM/include/IEMMc.h

    r102876 r102977  
    15081508
    15091509/**
     1510 * Maps guest memory for byte atomic read+write direct (or bounce) buffer
     1511 * acccess, for atomic operations.
     1512 *
     1513 * @param[out] a_pu8Mem     Where to return the pointer to the mapping.
     1514 * @param[out] a_bUnmapInfo Where to return umapping instructions. uint8_t.
     1515 * @param[in]  a_iSeg       The segment register to access via. No UINT8_MAX!
     1516 * @param[in]  a_GCPtrMem   The memory address.
     1517 * @remarks Will return/long jump on errors.
     1518 * @see     IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC
     1519 */
     1520#ifndef IEM_WITH_SETJMP
     1521# define IEM_MC_MEM_MAP_U8_ATOMIC(a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     1522    IEM_MC_RETURN_ON_FAILURE(iemMemMap(pVCpu, (void **)&(a_pu8Mem), &(a_bUnmapInfo), sizeof(uint8_t), (a_iSeg), \
     1523                                       (a_GCPtrMem), IEM_ACCESS_DATA_ATOMIC, 0))
     1524#else
     1525# define IEM_MC_MEM_MAP_U8_ATOMIC(a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     1526    (a_pu8Mem) = iemMemMapDataU8AtJmp(pVCpu, &(a_bUnmapInfo), (a_iSeg), (a_GCPtrMem))
     1527#endif
     1528
     1529/**
    15101530 * Maps guest memory for byte read+write direct (or bounce) buffer acccess.
    15111531 *
     
    15651585
    15661586/**
     1587 * Maps guest memory for byte atomic read+write direct (or bounce) buffer
     1588 * acccess, flat address variant.
     1589 *
     1590 * @param[out] a_pu8Mem     Where to return the pointer to the mapping.
     1591 * @param[out] a_bUnmapInfo Where to return umapping instructions. uint8_t.
     1592 * @param[in]  a_GCPtrMem   The memory address.
     1593 * @remarks Will return/long jump on errors.
     1594 * @see     IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC
     1595 */
     1596#ifndef IEM_WITH_SETJMP
     1597# define IEM_MC_MEM_FLAT_MAP_U8_ATOMIC(a_pu8Mem, a_bUnmapInfo, a_GCPtrMem) \
     1598    IEM_MC_RETURN_ON_FAILURE(iemMemMap(pVCpu, (void **)&(a_pu8Mem), &(a_bUnmapInfo), sizeof(uint8_t), UINT8_MAX, \
     1599                                       (a_GCPtrMem), IEM_ACCESS_DATA_ATOMIC, 0))
     1600#else
     1601# define IEM_MC_MEM_FLAT_MAP_U8_ATOMIC(a_pu8Mem, a_bUnmapInfo, a_GCPtrMem) \
     1602    (a_pu8Mem) = iemMemFlatMapDataU8AtJmp(pVCpu, &(a_bUnmapInfo), (a_GCPtrMem))
     1603#endif
     1604
     1605/**
    15671606 * Maps guest memory for byte read+write direct (or bounce) buffer acccess, flat
    15681607 * address variant.
     
    16251664
    16261665/**
     1666 * Maps guest memory for word atomic read+write direct (or bounce) buffer acccess.
     1667 *
     1668 * @param[out] a_pu16Mem    Where to return the pointer to the mapping.
     1669 * @param[out] a_bUnmapInfo Where to return umapping instructions. uint8_t.
     1670 * @param[in]  a_iSeg       The segment register to access via. No UINT8_MAX!
     1671 * @param[in]  a_GCPtrMem   The memory address.
     1672 * @remarks Will return/long jump on errors.
     1673 * @see     IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC
     1674 */
     1675#ifndef IEM_WITH_SETJMP
     1676# define IEM_MC_MEM_MAP_U16_ATOMIC(a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     1677    IEM_MC_RETURN_ON_FAILURE(iemMemMap(pVCpu, (void **)&(a_pu16Mem), &(a_bUnmapInfo), sizeof(uint16_t), (a_iSeg), \
     1678                                       (a_GCPtrMem), IEM_ACCESS_DATA_ATOMIC, sizeof(uint16_t) - 1))
     1679#else
     1680# define IEM_MC_MEM_MAP_U16_ATOMIC(a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     1681    (a_pu16Mem) = iemMemMapDataU16AtJmp(pVCpu, &(a_bUnmapInfo), (a_iSeg), (a_GCPtrMem))
     1682#endif
     1683
     1684/**
    16271685 * Maps guest memory for word read+write direct (or bounce) buffer acccess.
    16281686 *
     
    16821740
    16831741/**
     1742 * Maps guest memory for word atomic read+write direct (or bounce) buffer
     1743 * acccess, flat address variant.
     1744 *
     1745 * @param[out] a_pu16Mem    Where to return the pointer to the mapping.
     1746 * @param[out] a_bUnmapInfo Where to return umapping instructions. uint8_t.
     1747 * @param[in]  a_GCPtrMem   The memory address.
     1748 * @remarks Will return/long jump on errors.
     1749 * @see     IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC
     1750 */
     1751#ifndef IEM_WITH_SETJMP
     1752# define IEM_MC_MEM_FLAT_MAP_U16_ATOMIC(a_pu16Mem, a_bUnmapInfo, a_GCPtrMem) \
     1753    IEM_MC_RETURN_ON_FAILURE(iemMemMap(pVCpu, (void **)&(a_pu16Mem), &(a_bUnmapInfo), sizeof(uint16_t), UINT8_MAX, \
     1754                                       (a_GCPtrMem), IEM_ACCESS_DATA_ATOMIC, sizeof(uint16_t) - 1))
     1755#else
     1756# define IEM_MC_MEM_FLAT_MAP_U16_ATOMIC(a_pu16Mem, a_bUnmapInfo, a_GCPtrMem) \
     1757    (a_pu16Mem) = iemMemFlatMapDataU16AtJmp(pVCpu, &(a_bUnmapInfo), (a_GCPtrMem))
     1758#endif
     1759
     1760/**
    16841761 * Maps guest memory for word read+write direct (or bounce) buffer acccess, flat
    16851762 * address variant.
     
    17601837
    17611838/**
     1839 * Maps guest memory for dword atomic read+write direct (or bounce) buffer acccess.
     1840 *
     1841 * @param[out] a_pu32Mem    Where to return the pointer to the mapping.
     1842 * @param[out] a_bUnmapInfo Where to return umapping instructions. uint8_t.
     1843 * @param[in]  a_iSeg       The segment register to access via. No UINT8_MAX!
     1844 * @param[in]  a_GCPtrMem   The memory address.
     1845 * @remarks Will return/long jump on errors.
     1846 * @see     IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC
     1847 */
     1848#ifndef IEM_WITH_SETJMP
     1849# define IEM_MC_MEM_MAP_U32_ATOMIC(a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     1850    IEM_MC_RETURN_ON_FAILURE(iemMemMap(pVCpu, (void **)&(a_pu32Mem), &(a_bUnmapInfo), sizeof(uint32_t), (a_iSeg), \
     1851                                       (a_GCPtrMem), IEM_ACCESS_DATA_ATOMIC, sizeof(uint32_t) - 1))
     1852#else
     1853# define IEM_MC_MEM_MAP_U32_ATOMIC(a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     1854    (a_pu32Mem) = iemMemMapDataU32AtJmp(pVCpu, &(a_bUnmapInfo), (a_iSeg), (a_GCPtrMem))
     1855#endif
     1856
     1857/**
    17621858 * Maps guest memory for dword read+write direct (or bounce) buffer acccess.
    17631859 *
     
    18171913
    18181914/**
     1915 * Maps guest memory for dword atomic read+write direct (or bounce) buffer
     1916 * acccess, flat address variant.
     1917 *
     1918 * @param[out] a_pu32Mem    Where to return the pointer to the mapping.
     1919 * @param[out] a_bUnmapInfo Where to return umapping instructions. uint8_t.
     1920 * @param[in]  a_GCPtrMem   The memory address.
     1921 * @remarks Will return/long jump on errors.
     1922 * @see     IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC
     1923 */
     1924#ifndef IEM_WITH_SETJMP
     1925# define IEM_MC_MEM_FLAT_MAP_U32_ATOMIC(a_pu32Mem, a_bUnmapInfo, a_GCPtrMem) \
     1926    IEM_MC_RETURN_ON_FAILURE(iemMemMap(pVCpu, (void **)&(a_pu32Mem), &(a_bUnmapInfo), sizeof(uint32_t), UINT8_MAX, \
     1927                                       (a_GCPtrMem), IEM_ACCESS_DATA_ATOMIC, sizeof(uint32_t) - 1))
     1928#else
     1929# define IEM_MC_MEM_FLAT_MAP_U32_ATOMIC(a_pu32Mem, a_bUnmapInfo, a_GCPtrMem) \
     1930    (a_pu32Mem) = iemMemFlatMapDataU32AtJmp(pVCpu, &(a_bUnmapInfo), (a_GCPtrMem))
     1931#endif
     1932
     1933/**
    18191934 * Maps guest memory for dword read+write direct (or bounce) buffer acccess,
    18201935 * flat address variant.
     
    19132028
    19142029/**
     2030 * Maps guest memory for qword atomic read+write direct (or bounce) buffer acccess.
     2031 *
     2032 * @param[out] a_pu64Mem    Where to return the pointer to the mapping.
     2033 * @param[out] a_bUnmapInfo Where to return umapping instructions. uint8_t.
     2034 * @param[in]  a_iSeg       The segment register to access via. No UINT8_MAX!
     2035 * @param[in]  a_GCPtrMem   The memory address.
     2036 * @remarks Will return/long jump on errors.
     2037 * @see     IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC
     2038 */
     2039#ifndef IEM_WITH_SETJMP
     2040# define IEM_MC_MEM_MAP_U64_ATOMIC(a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     2041    IEM_MC_RETURN_ON_FAILURE(iemMemMap(pVCpu, (void **)&(a_pu64Mem), &(a_bUnmapInfo), sizeof(uint64_t), (a_iSeg), \
     2042                                       (a_GCPtrMem), IEM_ACCESS_DATA_ATOMIC, sizeof(uint64_t) - 1))
     2043#else
     2044# define IEM_MC_MEM_MAP_U64_ATOMIC(a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     2045    (a_pu64Mem) = iemMemMapDataU64AtJmp(pVCpu, &(a_bUnmapInfo), (a_iSeg), (a_GCPtrMem))
     2046#endif
     2047
     2048/**
    19152049 * Maps guest memory for qword read+write direct (or bounce) buffer acccess.
    19162050 *
     
    19702104
    19712105/**
     2106 * Maps guest memory for qword atomic read+write direct (or bounce) buffer
     2107 * acccess, flat address variant.
     2108 *
     2109 * @param[out] a_pu64Mem    Where to return the pointer to the mapping.
     2110 * @param[out] a_bUnmapInfo Where to return umapping instructions. uint8_t.
     2111 * @param[in]  a_GCPtrMem   The memory address.
     2112 * @remarks Will return/long jump on errors.
     2113 * @see     IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC
     2114 */
     2115#ifndef IEM_WITH_SETJMP
     2116# define IEM_MC_MEM_FLAT_MAP_U64_ATOMIC(a_pu64Mem, a_bUnmapInfo, a_GCPtrMem) \
     2117    IEM_MC_RETURN_ON_FAILURE(iemMemMap(pVCpu, (void **)&(a_pu64Mem), &(a_bUnmapInfo), sizeof(uint64_t), UINT8_MAX, \
     2118                                       (a_GCPtrMem), IEM_ACCESS_DATA_ATOMIC, sizeof(uint64_t) - 1))
     2119#else
     2120# define IEM_MC_MEM_FLAT_MAP_U64_ATOMIC(a_pu64Mem, a_bUnmapInfo, a_GCPtrMem) \
     2121    (a_pu64Mem) = iemMemFlatMapDataU64AtJmp(pVCpu, &(a_bUnmapInfo), (a_GCPtrMem))
     2122#endif
     2123
     2124/**
    19722125 * Maps guest memory for qword read+write direct (or bounce) buffer acccess,
    19732126 * flat address variant.
     
    20662219
    20672220/**
     2221 * Maps guest memory for dqword atomic read+write direct (or bounce) buffer acccess.
     2222 *
     2223 * @param[out] a_pu128Mem   Where to return the pointer to the mapping.
     2224 * @param[out] a_bUnmapInfo Where to return umapping instructions. uint8_t.
     2225 * @param[in]  a_iSeg       The segment register to access via. No UINT8_MAX!
     2226 * @param[in]  a_GCPtrMem   The memory address.
     2227 * @remarks Will return/long jump on errors.
     2228 * @see     IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC
     2229 */
     2230#ifndef IEM_WITH_SETJMP
     2231# define IEM_MC_MEM_MAP_U128_ATOMIC(a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     2232    IEM_MC_RETURN_ON_FAILURE(iemMemMap(pVCpu, (void **)&(a_pu128Mem), &(a_bUnmapInfo), sizeof(RTUINT128U), (a_iSeg), \
     2233                                       (a_GCPtrMem), IEM_ACCESS_DATA_ATOMIC, sizeof(RTUINT128U) - 1))
     2234#else
     2235# define IEM_MC_MEM_MAP_U128_ATOMIC(a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) \
     2236    (a_pu128Mem) = iemMemMapDataU128AtJmp(pVCpu, &(a_bUnmapInfo), (a_iSeg), (a_GCPtrMem))
     2237#endif
     2238
     2239/**
    20682240 * Maps guest memory for dqword read+write direct (or bounce) buffer acccess.
    20692241 *
     
    21232295
    21242296/**
     2297 * Maps guest memory for dqword atomic read+write direct (or bounce) buffer
     2298 * access, flat address variant.
     2299 *
     2300 * @param[out] a_pu128Mem   Where to return the pointer to the mapping.
     2301 * @param[out] a_bUnmapInfo Where to return umapping instructions. uint8_t.
     2302 * @param[in]  a_GCPtrMem   The memory address.
     2303 * @remarks Will return/long jump on errors.
     2304 * @see     IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC
     2305 */
     2306#ifndef IEM_WITH_SETJMP
     2307# define IEM_MC_MEM_FLAT_MAP_U128_ATOMIC(a_pu128Mem, a_bUnmapInfo, a_GCPtrMem) \
     2308    IEM_MC_RETURN_ON_FAILURE(iemMemMap(pVCpu, (void **)&(a_pu128Mem), &(a_bUnmapInfo), sizeof(RTUINT128), UINT8_MAX, \
     2309                                       (a_GCPtrMem), IEM_ACCESS_DATA_ATOMIC, sizeof(RTUINT128) - 1))
     2310#else
     2311# define IEM_MC_MEM_FLAT_MAP_U128_ATOMIC(a_pu128Mem, a_bUnmapInfo, a_GCPtrMem) \
     2312    (a_pu128Mem) = iemMemFlatMapDataU128AtJmp(pVCpu, &(a_bUnmapInfo), (a_GCPtrMem))
     2313#endif
     2314
     2315/**
    21252316 * Maps guest memory for dqword read+write direct (or bounce) buffer acccess,
    21262317 * flat address variant.
     
    22692460#else
    22702461# define IEM_MC_MEM_COMMIT_AND_UNMAP_RW(a_bMapInfo)         iemMemCommitAndUnmapRwJmp(pVCpu, (a_bMapInfo))
     2462#endif
     2463
     2464/** Commits the memory and unmaps guest memory previously mapped ATOMIC.
     2465 * @remarks     May return.
     2466 * @note        Implictly frees the a_bMapInfo variable.
     2467 */
     2468#ifndef IEM_WITH_SETJMP
     2469# define IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(a_bMapInfo)     IEM_MC_RETURN_ON_FAILURE(iemMemCommitAndUnmap(pVCpu, a_bMapInfo))
     2470#else
     2471# define IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(a_bMapInfo)     iemMemCommitAndUnmapRwJmp(pVCpu, (a_bMapInfo))
    22712472#endif
    22722473
  • trunk/src/VBox/VMM/include/IEMN8veRecompiler.h

    r102847 r102977  
    4444#endif
    4545
     46#ifdef VBOX_WITH_STATISTICS
    4647/** Always count instructions for now. */
    47 #define IEMNATIVE_WITH_INSTRUCTION_COUNTING
     48# define IEMNATIVE_WITH_INSTRUCTION_COUNTING
     49#endif
    4850
    4951
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r102876 r102977  
    931931#define IEM_MC_POP_GREG_U64(a_iGReg)                                    do { CHK_GREG_IDX(a_iGReg); (void)fMcBegin; } while (0)
    932932
    933 #define IEM_MC_MEM_MAP_D80_WO(a_pd80Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pd80Mem); (a_pd80Mem) = NULL; CHK_PTYPE(RTPBCD80U *,      a_pd80Mem); 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)
    934 #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)
    935 #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)
    936 #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)
    937 #define IEM_MC_MEM_MAP_R32_WO(a_pr32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pr32Mem); (a_pr32Mem) = NULL; CHK_PTYPE(RTFLOAT32U *,     a_pr32Mem); 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)
    938 #define IEM_MC_MEM_MAP_R64_WO(a_pr64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pr64Mem); (a_pr64Mem) = NULL; CHK_PTYPE(RTFLOAT64U *,     a_pr64Mem); 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)
    939 #define IEM_MC_MEM_MAP_R80_WO(a_pr80Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pr80Mem); (a_pr80Mem) = NULL; CHK_PTYPE(RTFLOAT80U *,     a_pr80Mem); 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)
    940 #define IEM_MC_MEM_MAP_U8_RW(a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)   do { CHK_VAR(a_pu8Mem);  (a_pu8Mem)  = NULL; CHK_PTYPE(uint8_t *,        a_pu8Mem);  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)
    941 #define IEM_MC_MEM_MAP_U8_RO(a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)   do { CHK_VAR(a_pu8Mem);  (a_pu8Mem)  = NULL; CHK_PTYPE(uint8_t const *,  a_pu8Mem);  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)
    942 #define IEM_MC_MEM_MAP_U8_WO(a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)   do { CHK_VAR(a_pu8Mem);  (a_pu8Mem)  = NULL; CHK_PTYPE(uint8_t *,        a_pu8Mem);  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)
    943 #define IEM_MC_MEM_MAP_U16_RW(a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pu16Mem); (a_pu16Mem) = NULL; CHK_PTYPE(uint16_t *,       a_pu16Mem); 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)
    944 #define IEM_MC_MEM_MAP_U16_RO(a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pu16Mem); (a_pu16Mem) = NULL; CHK_PTYPE(uint16_t const *, a_pu16Mem); 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)
    945 #define IEM_MC_MEM_MAP_U16_WO(a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pu16Mem); (a_pu16Mem) = NULL; CHK_PTYPE(uint16_t *,       a_pu16Mem); 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)
    946 #define IEM_MC_MEM_MAP_U32_RW(a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pu32Mem); (a_pu32Mem) = NULL; CHK_PTYPE(uint32_t *,       a_pu32Mem); 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)
    947 #define IEM_MC_MEM_MAP_U32_RO(a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pu32Mem); (a_pu32Mem) = NULL; CHK_PTYPE(uint32_t const *, a_pu32Mem); 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)
    948 #define IEM_MC_MEM_MAP_U32_WO(a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pu32Mem); (a_pu32Mem) = NULL; CHK_PTYPE(uint32_t *,       a_pu32Mem); 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)
    949 #define IEM_MC_MEM_MAP_U64_RW(a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pu64Mem); (a_pu64Mem) = NULL; CHK_PTYPE(uint64_t *,       a_pu64Mem); 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)
    950 #define IEM_MC_MEM_MAP_U64_RO(a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pu64Mem); (a_pu64Mem) = NULL; CHK_PTYPE(uint64_t const *, a_pu64Mem); 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)
    951 #define IEM_MC_MEM_MAP_U64_WO(a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pu64Mem); (a_pu64Mem) = NULL; CHK_PTYPE(uint64_t *,       a_pu64Mem); 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)
    952 #define IEM_MC_MEM_MAP_U128_RW(a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pu128Mem); (a_pu128Mem) = NULL; CHK_PTYPE(RTUINT128U *,       a_pu128Mem); 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)
    953 #define IEM_MC_MEM_MAP_U128_RO(a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pu128Mem); (a_pu128Mem) = NULL; CHK_PTYPE(RTUINT128U const *, a_pu128Mem); 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)
    954 #define IEM_MC_MEM_MAP_U128_WO(a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do { CHK_VAR(a_pu128Mem); (a_pu128Mem) = NULL; CHK_PTYPE(RTUINT128U *,       a_pu128Mem); 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)
    955 
     933#define IEM_MC_MEM_MAP_D80_WO(a_pd80Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)      do { CHK_VAR(a_pd80Mem); (a_pd80Mem) = NULL; CHK_PTYPE(RTPBCD80U *,      a_pd80Mem); 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)
     934#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)
     935#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)
     936#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)
     937#define IEM_MC_MEM_MAP_R32_WO(a_pr32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)      do { CHK_VAR(a_pr32Mem); (a_pr32Mem) = NULL; CHK_PTYPE(RTFLOAT32U *,     a_pr32Mem); 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)
     938#define IEM_MC_MEM_MAP_R64_WO(a_pr64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)      do { CHK_VAR(a_pr64Mem); (a_pr64Mem) = NULL; CHK_PTYPE(RTFLOAT64U *,     a_pr64Mem); 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)
     939#define IEM_MC_MEM_MAP_R80_WO(a_pr80Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)      do { CHK_VAR(a_pr80Mem); (a_pr80Mem) = NULL; CHK_PTYPE(RTFLOAT80U *,     a_pr80Mem); 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)
     940#define IEM_MC_MEM_MAP_U8_ATOMIC(a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)    do { CHK_VAR(a_pu8Mem);  (a_pu8Mem)  = NULL; CHK_PTYPE(uint8_t *,        a_pu8Mem);  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)
     941#define IEM_MC_MEM_MAP_U8_RW(a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)        do { CHK_VAR(a_pu8Mem);  (a_pu8Mem)  = NULL; CHK_PTYPE(uint8_t *,        a_pu8Mem);  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)
     942#define IEM_MC_MEM_MAP_U8_RO(a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)        do { CHK_VAR(a_pu8Mem);  (a_pu8Mem)  = NULL; CHK_PTYPE(uint8_t const *,  a_pu8Mem);  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)
     943#define IEM_MC_MEM_MAP_U8_WO(a_pu8Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)        do { CHK_VAR(a_pu8Mem);  (a_pu8Mem)  = NULL; CHK_PTYPE(uint8_t *,        a_pu8Mem);  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)
     944#define IEM_MC_MEM_MAP_U16_ATOMIC(a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)  do { CHK_VAR(a_pu16Mem); (a_pu16Mem) = NULL; CHK_PTYPE(uint16_t *,       a_pu16Mem); 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)
     945#define IEM_MC_MEM_MAP_U16_RW(a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)      do { CHK_VAR(a_pu16Mem); (a_pu16Mem) = NULL; CHK_PTYPE(uint16_t *,       a_pu16Mem); 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)
     946#define IEM_MC_MEM_MAP_U16_RO(a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)      do { CHK_VAR(a_pu16Mem); (a_pu16Mem) = NULL; CHK_PTYPE(uint16_t const *, a_pu16Mem); 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)
     947#define IEM_MC_MEM_MAP_U16_WO(a_pu16Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)      do { CHK_VAR(a_pu16Mem); (a_pu16Mem) = NULL; CHK_PTYPE(uint16_t *,       a_pu16Mem); 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)
     948#define IEM_MC_MEM_MAP_U32_ATOMIC(a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)  do { CHK_VAR(a_pu32Mem); (a_pu32Mem) = NULL; CHK_PTYPE(uint32_t *,       a_pu32Mem); 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)
     949#define IEM_MC_MEM_MAP_U32_RW(a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)      do { CHK_VAR(a_pu32Mem); (a_pu32Mem) = NULL; CHK_PTYPE(uint32_t *,       a_pu32Mem); 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)
     950#define IEM_MC_MEM_MAP_U32_RO(a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)      do { CHK_VAR(a_pu32Mem); (a_pu32Mem) = NULL; CHK_PTYPE(uint32_t const *, a_pu32Mem); 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)
     951#define IEM_MC_MEM_MAP_U32_WO(a_pu32Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)      do { CHK_VAR(a_pu32Mem); (a_pu32Mem) = NULL; CHK_PTYPE(uint32_t *,       a_pu32Mem); 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)
     952#define IEM_MC_MEM_MAP_U64_ATOMIC(a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)  do { CHK_VAR(a_pu64Mem); (a_pu64Mem) = NULL; CHK_PTYPE(uint64_t *,       a_pu64Mem); 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)
     953#define IEM_MC_MEM_MAP_U64_RW(a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)      do { CHK_VAR(a_pu64Mem); (a_pu64Mem) = NULL; CHK_PTYPE(uint64_t *,       a_pu64Mem); 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)
     954#define IEM_MC_MEM_MAP_U64_RO(a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)      do { CHK_VAR(a_pu64Mem); (a_pu64Mem) = NULL; CHK_PTYPE(uint64_t const *, a_pu64Mem); 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)
     955#define IEM_MC_MEM_MAP_U64_WO(a_pu64Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)      do { CHK_VAR(a_pu64Mem); (a_pu64Mem) = NULL; CHK_PTYPE(uint64_t *,       a_pu64Mem); 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)
     956#define IEM_MC_MEM_MAP_U128_ATOMIC(a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem) do{ CHK_VAR(a_pu128Mem); (a_pu128Mem) = NULL; CHK_PTYPE(RTUINT128U *,       a_pu128Mem); 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)
     957#define IEM_MC_MEM_MAP_U128_RW(a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)    do { CHK_VAR(a_pu128Mem); (a_pu128Mem) = NULL; CHK_PTYPE(RTUINT128U *,       a_pu128Mem); 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)
     958#define IEM_MC_MEM_MAP_U128_RO(a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)    do { CHK_VAR(a_pu128Mem); (a_pu128Mem) = NULL; CHK_PTYPE(RTUINT128U const *, a_pu128Mem); 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)
     959#define IEM_MC_MEM_MAP_U128_WO(a_pu128Mem, a_bUnmapInfo, a_iSeg, a_GCPtrMem)    do { CHK_VAR(a_pu128Mem); (a_pu128Mem) = NULL; CHK_PTYPE(RTUINT128U *,       a_pu128Mem); 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)
     960
     961#define IEM_MC_MEM_COMMIT_AND_UNMAP_ATOMIC(a_bMapInfo)                      do { CHK_VAR(a_bMapInfo); CHK_TYPE(uint8_t, a_bMapInfo); (void)fMcBegin; } while (0)
    956962#define IEM_MC_MEM_COMMIT_AND_UNMAP_RW(a_bMapInfo)                          do { CHK_VAR(a_bMapInfo); CHK_TYPE(uint8_t, a_bMapInfo); (void)fMcBegin; } while (0)
    957963#define IEM_MC_MEM_COMMIT_AND_UNMAP_RO(a_bMapInfo)                          do { CHK_VAR(a_bMapInfo); CHK_TYPE(uint8_t, a_bMapInfo); (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