VirtualBox

Changeset 62015 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Jul 4, 2016 7:58:28 PM (9 years ago)
Author:
vboxsync
Message:

IEM: Switched from using IEMCPU directly to using with via VMCPU. This saves 4-5 KB in 64-bit mode (~1.2%), but the 32-bit code is larger (suspecting because we lost a few some 8-bit displacements).

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

Legend:

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

    r62010 r62015  
    150150
    151151#if defined(__GNUC__) && defined(RT_ARCH_X86)
    152 typedef VBOXSTRICTRC (__attribute__((__fastcall__)) * PFNIEMOP)(PIEMCPU pIemCpu);
    153 typedef VBOXSTRICTRC (__attribute__((__fastcall__)) * PFNIEMOPRM)(PIEMCPU pIemCpu, uint8_t bRm);
     152typedef VBOXSTRICTRC (__attribute__((__fastcall__)) * PFNIEMOP)(PVMCPU pVCpu);
     153typedef VBOXSTRICTRC (__attribute__((__fastcall__)) * PFNIEMOPRM)(PVMCPU pVCpu, uint8_t bRm);
    154154# define FNIEMOP_DEF(a_Name) \
    155     IEM_STATIC VBOXSTRICTRC __attribute__((__fastcall__, __nothrow__)) a_Name(PIEMCPU pIemCpu)
     155    IEM_STATIC VBOXSTRICTRC __attribute__((__fastcall__, __nothrow__)) a_Name(PVMCPU pVCpu)
    156156# define FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) \
    157     IEM_STATIC VBOXSTRICTRC __attribute__((__fastcall__, __nothrow__)) a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0)
     157    IEM_STATIC VBOXSTRICTRC __attribute__((__fastcall__, __nothrow__)) a_Name(PVMCPU pVCpu, a_Type0 a_Name0)
    158158# define FNIEMOP_DEF_2(a_Name, a_Type0, a_Name0, a_Type1, a_Name1) \
    159     IEM_STATIC VBOXSTRICTRC __attribute__((__fastcall__, __nothrow__)) a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0, a_Type1 a_Name1)
     159    IEM_STATIC VBOXSTRICTRC __attribute__((__fastcall__, __nothrow__)) a_Name(PVMCPU pVCpu, a_Type0 a_Name0, a_Type1 a_Name1)
    160160
    161161#elif defined(_MSC_VER) && defined(RT_ARCH_X86)
    162 typedef VBOXSTRICTRC (__fastcall * PFNIEMOP)(PIEMCPU pIemCpu);
    163 typedef VBOXSTRICTRC (__fastcall * PFNIEMOPRM)(PIEMCPU pIemCpu, uint8_t bRm);
     162typedef VBOXSTRICTRC (__fastcall * PFNIEMOP)(PVMCPU pVCpu);
     163typedef VBOXSTRICTRC (__fastcall * PFNIEMOPRM)(PVMCPU pVCpu, uint8_t bRm);
    164164# define FNIEMOP_DEF(a_Name) \
    165     IEM_STATIC /*__declspec(naked)*/ VBOXSTRICTRC __fastcall a_Name(PIEMCPU pIemCpu) RT_NO_THROW_DEF
     165    IEM_STATIC /*__declspec(naked)*/ VBOXSTRICTRC __fastcall a_Name(PVMCPU pVCpu) RT_NO_THROW_DEF
    166166# define FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) \
    167     IEM_STATIC /*__declspec(naked)*/ VBOXSTRICTRC __fastcall a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0) RT_NO_THROW_DEF
     167    IEM_STATIC /*__declspec(naked)*/ VBOXSTRICTRC __fastcall a_Name(PVMCPU pVCpu, a_Type0 a_Name0) RT_NO_THROW_DEF
    168168# define FNIEMOP_DEF_2(a_Name, a_Type0, a_Name0, a_Type1, a_Name1) \
    169     IEM_STATIC /*__declspec(naked)*/ VBOXSTRICTRC __fastcall a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0, a_Type1 a_Name1) RT_NO_THROW_DEF
     169    IEM_STATIC /*__declspec(naked)*/ VBOXSTRICTRC __fastcall a_Name(PVMCPU pVCpu, a_Type0 a_Name0, a_Type1 a_Name1) RT_NO_THROW_DEF
    170170
    171171#elif defined(__GNUC__)
    172 typedef VBOXSTRICTRC (* PFNIEMOP)(PIEMCPU pIemCpu);
    173 typedef VBOXSTRICTRC (* PFNIEMOPRM)(PIEMCPU pIemCpu, uint8_t bRm);
     172typedef VBOXSTRICTRC (* PFNIEMOP)(PVMCPU pVCpu);
     173typedef VBOXSTRICTRC (* PFNIEMOPRM)(PVMCPU pVCpu, uint8_t bRm);
    174174# define FNIEMOP_DEF(a_Name) \
    175     IEM_STATIC VBOXSTRICTRC __attribute__((__nothrow__)) a_Name(PIEMCPU pIemCpu)
     175    IEM_STATIC VBOXSTRICTRC __attribute__((__nothrow__)) a_Name(PVMCPU pVCpu)
    176176# define FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) \
    177     IEM_STATIC VBOXSTRICTRC __attribute__((__nothrow__)) a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0)
     177    IEM_STATIC VBOXSTRICTRC __attribute__((__nothrow__)) a_Name(PVMCPU pVCpu, a_Type0 a_Name0)
    178178# define FNIEMOP_DEF_2(a_Name, a_Type0, a_Name0, a_Type1, a_Name1) \
    179     IEM_STATIC VBOXSTRICTRC __attribute__((__nothrow__)) a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0, a_Type1 a_Name1)
     179    IEM_STATIC VBOXSTRICTRC __attribute__((__nothrow__)) a_Name(PVMCPU pVCpu, a_Type0 a_Name0, a_Type1 a_Name1)
    180180
    181181#else
    182 typedef VBOXSTRICTRC (* PFNIEMOP)(PIEMCPU pIemCpu);
    183 typedef VBOXSTRICTRC (* PFNIEMOPRM)(PIEMCPU pIemCpu, uint8_t bRm);
     182typedef VBOXSTRICTRC (* PFNIEMOP)(PVMCPU pVCpu);
     183typedef VBOXSTRICTRC (* PFNIEMOPRM)(PVMCPU pVCpu, uint8_t bRm);
    184184# define FNIEMOP_DEF(a_Name) \
    185     IEM_STATIC VBOXSTRICTRC a_Name(PIEMCPU pIemCpu) RT_NO_THROW_DEF
     185    IEM_STATIC VBOXSTRICTRC a_Name(PVMCPU pVCpu) RT_NO_THROW_DEF
    186186# define FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) \
    187     IEM_STATIC VBOXSTRICTRC a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0) RT_NO_THROW_DEF
     187    IEM_STATIC VBOXSTRICTRC a_Name(PVMCPU pVCpu, a_Type0 a_Name0) RT_NO_THROW_DEF
    188188# define FNIEMOP_DEF_2(a_Name, a_Type0, a_Name0, a_Type1, a_Name1) \
    189     IEM_STATIC VBOXSTRICTRC a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0, a_Type1 a_Name1) RT_NO_THROW_DEF
     189    IEM_STATIC VBOXSTRICTRC a_Name(PVMCPU pVCpu, a_Type0 a_Name0, a_Type1 a_Name1) RT_NO_THROW_DEF
    190190
    191191#endif
     
    268268 * done as we please.  See FNIEMOP_DEF.
    269269 */
    270 #define FNIEMOP_CALL(a_pfn) (a_pfn)(pIemCpu)
     270#define FNIEMOP_CALL(a_pfn) (a_pfn)(pVCpu)
    271271
    272272/**
     
    276276 * done as we please.  See FNIEMOP_DEF_1.
    277277 */
    278 #define FNIEMOP_CALL_1(a_pfn, a0)           (a_pfn)(pIemCpu, a0)
     278#define FNIEMOP_CALL_1(a_pfn, a0)           (a_pfn)(pVCpu, a0)
    279279
    280280/**
     
    284284 * done as we please.  See FNIEMOP_DEF_1.
    285285 */
    286 #define FNIEMOP_CALL_2(a_pfn, a0, a1)       (a_pfn)(pIemCpu, a0, a1)
     286#define FNIEMOP_CALL_2(a_pfn, a0, a1)       (a_pfn)(pVCpu, a0, a1)
    287287
    288288/**
     
    290290 *
    291291 * @returns @c true if it is, @c false if not.
    292  * @param   a_pIemCpu       The IEM state of the current CPU.
    293  */
    294 #define IEM_IS_REAL_OR_V86_MODE(a_pIemCpu)  (CPUMIsGuestInRealOrV86ModeEx((a_pIemCpu)->CTX_SUFF(pCtx)))
     292 * @param   a_pVCpu         The IEM state of the current CPU.
     293 */
     294#define IEM_IS_REAL_OR_V86_MODE(a_pVCpu)    (CPUMIsGuestInRealOrV86ModeEx((a_pVCpu)->iem.s.CTX_SUFF(pCtx)))
    295295
    296296/**
     
    298298 *
    299299 * @returns @c true if it is, @c false if not.
    300  * @param   a_pIemCpu       The IEM state of the current CPU.
    301  */
    302 #define IEM_IS_V86_MODE(a_pIemCpu)          (CPUMIsGuestInV86ModeEx((a_pIemCpu)->CTX_SUFF(pCtx)))
     300 * @param   a_pVCpu         The IEM state of the current CPU.
     301 */
     302#define IEM_IS_V86_MODE(a_pVCpu)            (CPUMIsGuestInV86ModeEx((a_pVCpu)->iem.s.CTX_SUFF(pCtx)))
    303303
    304304/**
     
    306306 *
    307307 * @returns @c true if it is, @c false if not.
    308  * @param   a_pIemCpu       The IEM state of the current CPU.
    309  */
    310 #define IEM_IS_LONG_MODE(a_pIemCpu)         (CPUMIsGuestInLongModeEx((a_pIemCpu)->CTX_SUFF(pCtx)))
     308 * @param   a_pVCpu         The IEM state of the current CPU.
     309 */
     310#define IEM_IS_LONG_MODE(a_pVCpu)           (CPUMIsGuestInLongModeEx((a_pVCpu)->iem.s.CTX_SUFF(pCtx)))
    311311
    312312/**
     
    314314 *
    315315 * @returns @c true if it is, @c false if not.
    316  * @param   a_pIemCpu       The IEM state of the current CPU.
    317  */
    318 #define IEM_IS_REAL_MODE(a_pIemCpu)         (CPUMIsGuestInRealModeEx((a_pIemCpu)->CTX_SUFF(pCtx)))
     316 * @param   a_pVCpu         The IEM state of the current CPU.
     317 */
     318#define IEM_IS_REAL_MODE(a_pVCpu)           (CPUMIsGuestInRealModeEx((a_pVCpu)->iem.s.CTX_SUFF(pCtx)))
    319319
    320320/**
    321321 * Returns a (const) pointer to the CPUMFEATURES for the guest CPU.
    322322 * @returns PCCPUMFEATURES
    323  * @param   a_pIemCpu       The IEM state of the current CPU.
    324  */
    325 #define IEM_GET_GUEST_CPU_FEATURES(a_pIemCpu) (&(IEMCPU_TO_VM(a_pIemCpu)->cpum.ro.GuestFeatures))
     323 * @param   a_pVCpu         The IEM state of the current CPU.
     324 */
     325#define IEM_GET_GUEST_CPU_FEATURES(a_pVCpu) (&((a_pVCpu)->CTX_SUFF(pVM)->cpum.ro.GuestFeatures))
    326326
    327327/**
    328328 * Returns a (const) pointer to the CPUMFEATURES for the host CPU.
    329329 * @returns PCCPUMFEATURES
    330  * @param   a_pIemCpu       The IEM state of the current CPU.
    331  */
    332 #define IEM_GET_HOST_CPU_FEATURES(a_pIemCpu)  (&(IEMCPU_TO_VM(a_pIemCpu)->cpum.ro.HostFeatures))
     330 * @param   a_pVCpu         The IEM state of the current CPU.
     331 */
     332#define IEM_GET_HOST_CPU_FEATURES(a_pVCpu)  (&((a_pVCpu)->CTX_SUFF(pVM)->cpum.ro.HostFeatures))
    333333
    334334/**
    335335 * Evaluates to true if we're presenting an Intel CPU to the guest.
    336336 */
    337 #define IEM_IS_GUEST_CPU_INTEL(a_pIemCpu)   ( (a_pIemCpu)->enmCpuVendor == CPUMCPUVENDOR_INTEL )
     337#define IEM_IS_GUEST_CPU_INTEL(a_pVCpu)     ( (a_pVCpu)->iem.s.enmCpuVendor == CPUMCPUVENDOR_INTEL )
    338338
    339339/**
    340340 * Evaluates to true if we're presenting an AMD CPU to the guest.
    341341 */
    342 #define IEM_IS_GUEST_CPU_AMD(a_pIemCpu)     ( (a_pIemCpu)->enmCpuVendor == CPUMCPUVENDOR_AMD )
     342#define IEM_IS_GUEST_CPU_AMD(a_pVCpu)       ( (a_pVCpu)->iem.s.enmCpuVendor == CPUMCPUVENDOR_AMD )
    343343
    344344/**
     
    708708*   Internal Functions                                                                                                           *
    709709*********************************************************************************************************************************/
    710 IEM_STATIC VBOXSTRICTRC     iemRaiseTaskSwitchFaultWithErr(PIEMCPU pIemCpu, uint16_t uErr);
    711 IEM_STATIC VBOXSTRICTRC     iemRaiseTaskSwitchFaultCurrentTSS(PIEMCPU pIemCpu);
    712 IEM_STATIC VBOXSTRICTRC     iemRaiseTaskSwitchFault0(PIEMCPU pIemCpu);
    713 IEM_STATIC VBOXSTRICTRC     iemRaiseTaskSwitchFaultBySelector(PIEMCPU pIemCpu, uint16_t uSel);
    714 /*IEM_STATIC VBOXSTRICTRC     iemRaiseSelectorNotPresent(PIEMCPU pIemCpu, uint32_t iSegReg, uint32_t fAccess);*/
    715 IEM_STATIC VBOXSTRICTRC     iemRaiseSelectorNotPresentBySelector(PIEMCPU pIemCpu, uint16_t uSel);
    716 IEM_STATIC VBOXSTRICTRC     iemRaiseSelectorNotPresentWithErr(PIEMCPU pIemCpu, uint16_t uErr);
    717 IEM_STATIC VBOXSTRICTRC     iemRaiseStackSelectorNotPresentBySelector(PIEMCPU pIemCpu, uint16_t uSel);
    718 IEM_STATIC VBOXSTRICTRC     iemRaiseStackSelectorNotPresentWithErr(PIEMCPU pIemCpu, uint16_t uErr);
    719 IEM_STATIC VBOXSTRICTRC     iemRaiseGeneralProtectionFault(PIEMCPU pIemCpu, uint16_t uErr);
    720 IEM_STATIC VBOXSTRICTRC     iemRaiseGeneralProtectionFault0(PIEMCPU pIemCpu);
    721 IEM_STATIC VBOXSTRICTRC     iemRaiseGeneralProtectionFaultBySelector(PIEMCPU pIemCpu, RTSEL uSel);
    722 IEM_STATIC VBOXSTRICTRC     iemRaiseSelectorBounds(PIEMCPU pIemCpu, uint32_t iSegReg, uint32_t fAccess);
    723 IEM_STATIC VBOXSTRICTRC     iemRaiseSelectorBoundsBySelector(PIEMCPU pIemCpu, RTSEL Sel);
    724 IEM_STATIC VBOXSTRICTRC     iemRaiseSelectorInvalidAccess(PIEMCPU pIemCpu, uint32_t iSegReg, uint32_t fAccess);
    725 IEM_STATIC VBOXSTRICTRC     iemRaisePageFault(PIEMCPU pIemCpu, RTGCPTR GCPtrWhere, uint32_t fAccess, int rc);
    726 IEM_STATIC VBOXSTRICTRC     iemRaiseAlignmentCheckException(PIEMCPU pIemCpu);
    727 IEM_STATIC VBOXSTRICTRC     iemMemMap(PIEMCPU pIemCpu, void **ppvMem, size_t cbMem, uint8_t iSegReg, RTGCPTR GCPtrMem, uint32_t fAccess);
    728 IEM_STATIC VBOXSTRICTRC     iemMemCommitAndUnmap(PIEMCPU pIemCpu, void *pvMem, uint32_t fAccess);
    729 IEM_STATIC VBOXSTRICTRC     iemMemFetchDataU32(PIEMCPU pIemCpu, uint32_t *pu32Dst, uint8_t iSegReg, RTGCPTR GCPtrMem);
    730 IEM_STATIC VBOXSTRICTRC     iemMemFetchDataU64(PIEMCPU pIemCpu, uint64_t *pu64Dst, uint8_t iSegReg, RTGCPTR GCPtrMem);
    731 IEM_STATIC VBOXSTRICTRC     iemMemFetchSysU8(PIEMCPU pIemCpu, uint32_t *pu32Dst, uint8_t iSegReg, RTGCPTR GCPtrMem);
    732 IEM_STATIC VBOXSTRICTRC     iemMemFetchSysU16(PIEMCPU pIemCpu, uint32_t *pu32Dst, uint8_t iSegReg, RTGCPTR GCPtrMem);
    733 IEM_STATIC VBOXSTRICTRC     iemMemFetchSysU32(PIEMCPU pIemCpu, uint32_t *pu32Dst, uint8_t iSegReg, RTGCPTR GCPtrMem);
    734 IEM_STATIC VBOXSTRICTRC     iemMemFetchSysU64(PIEMCPU pIemCpu, uint64_t *pu64Dst, uint8_t iSegReg, RTGCPTR GCPtrMem);
    735 IEM_STATIC VBOXSTRICTRC     iemMemFetchSelDescWithErr(PIEMCPU pIemCpu, PIEMSELDESC pDesc, uint16_t uSel, uint8_t uXcpt, uint16_t uErrorCode);
    736 IEM_STATIC VBOXSTRICTRC     iemMemFetchSelDesc(PIEMCPU pIemCpu, PIEMSELDESC pDesc, uint16_t uSel, uint8_t uXcpt);
    737 IEM_STATIC VBOXSTRICTRC     iemMemStackPushCommitSpecial(PIEMCPU pIemCpu, void *pvMem, uint64_t uNewRsp);
    738 IEM_STATIC VBOXSTRICTRC     iemMemStackPushBeginSpecial(PIEMCPU pIemCpu, size_t cbMem, void **ppvMem, uint64_t *puNewRsp);
    739 IEM_STATIC VBOXSTRICTRC     iemMemStackPushU32(PIEMCPU pIemCpu, uint32_t u32Value);
    740 IEM_STATIC VBOXSTRICTRC     iemMemStackPushU16(PIEMCPU pIemCpu, uint16_t u16Value);
    741 IEM_STATIC VBOXSTRICTRC     iemMemMarkSelDescAccessed(PIEMCPU pIemCpu, uint16_t uSel);
    742 IEM_STATIC uint16_t         iemSRegFetchU16(PIEMCPU pIemCpu, uint8_t iSegReg);
     710IEM_STATIC VBOXSTRICTRC     iemRaiseTaskSwitchFaultWithErr(PVMCPU pVCpu, uint16_t uErr);
     711IEM_STATIC VBOXSTRICTRC     iemRaiseTaskSwitchFaultCurrentTSS(PVMCPU pVCpu);
     712IEM_STATIC VBOXSTRICTRC     iemRaiseTaskSwitchFault0(PVMCPU pVCpu);
     713IEM_STATIC VBOXSTRICTRC     iemRaiseTaskSwitchFaultBySelector(PVMCPU pVCpu, uint16_t uSel);
     714/*IEM_STATIC VBOXSTRICTRC     iemRaiseSelectorNotPresent(PVMCPU pVCpu, uint32_t iSegReg, uint32_t fAccess);*/
     715IEM_STATIC VBOXSTRICTRC     iemRaiseSelectorNotPresentBySelector(PVMCPU pVCpu, uint16_t uSel);
     716IEM_STATIC VBOXSTRICTRC     iemRaiseSelectorNotPresentWithErr(PVMCPU pVCpu, uint16_t uErr);
     717IEM_STATIC VBOXSTRICTRC     iemRaiseStackSelectorNotPresentBySelector(PVMCPU pVCpu, uint16_t uSel);
     718IEM_STATIC VBOXSTRICTRC     iemRaiseStackSelectorNotPresentWithErr(PVMCPU pVCpu, uint16_t uErr);
     719IEM_STATIC VBOXSTRICTRC     iemRaiseGeneralProtectionFault(PVMCPU pVCpu, uint16_t uErr);
     720IEM_STATIC VBOXSTRICTRC     iemRaiseGeneralProtectionFault0(PVMCPU pVCpu);
     721IEM_STATIC VBOXSTRICTRC     iemRaiseGeneralProtectionFaultBySelector(PVMCPU pVCpu, RTSEL uSel);
     722IEM_STATIC VBOXSTRICTRC     iemRaiseSelectorBounds(PVMCPU pVCpu, uint32_t iSegReg, uint32_t fAccess);
     723IEM_STATIC VBOXSTRICTRC     iemRaiseSelectorBoundsBySelector(PVMCPU pVCpu, RTSEL Sel);
     724IEM_STATIC VBOXSTRICTRC     iemRaiseSelectorInvalidAccess(PVMCPU pVCpu, uint32_t iSegReg, uint32_t fAccess);
     725IEM_STATIC VBOXSTRICTRC     iemRaisePageFault(PVMCPU pVCpu, RTGCPTR GCPtrWhere, uint32_t fAccess, int rc);
     726IEM_STATIC VBOXSTRICTRC     iemRaiseAlignmentCheckException(PVMCPU pVCpu);
     727IEM_STATIC VBOXSTRICTRC     iemMemMap(PVMCPU pVCpu, void **ppvMem, size_t cbMem, uint8_t iSegReg, RTGCPTR GCPtrMem, uint32_t fAccess);
     728IEM_STATIC VBOXSTRICTRC     iemMemCommitAndUnmap(PVMCPU pVCpu, void *pvMem, uint32_t fAccess);
     729IEM_STATIC VBOXSTRICTRC     iemMemFetchDataU32(PVMCPU pVCpu, uint32_t *pu32Dst, uint8_t iSegReg, RTGCPTR GCPtrMem);
     730IEM_STATIC VBOXSTRICTRC     iemMemFetchDataU64(PVMCPU pVCpu, uint64_t *pu64Dst, uint8_t iSegReg, RTGCPTR GCPtrMem);
     731IEM_STATIC VBOXSTRICTRC     iemMemFetchSysU8(PVMCPU pVCpu, uint32_t *pu32Dst, uint8_t iSegReg, RTGCPTR GCPtrMem);
     732IEM_STATIC VBOXSTRICTRC     iemMemFetchSysU16(PVMCPU pVCpu, uint32_t *pu32Dst, uint8_t iSegReg, RTGCPTR GCPtrMem);
     733IEM_STATIC VBOXSTRICTRC     iemMemFetchSysU32(PVMCPU pVCpu, uint32_t *pu32Dst, uint8_t iSegReg, RTGCPTR GCPtrMem);
     734IEM_STATIC VBOXSTRICTRC     iemMemFetchSysU64(PVMCPU pVCpu, uint64_t *pu64Dst, uint8_t iSegReg, RTGCPTR GCPtrMem);
     735IEM_STATIC VBOXSTRICTRC     iemMemFetchSelDescWithErr(PVMCPU pVCpu, PIEMSELDESC pDesc, uint16_t uSel, uint8_t uXcpt, uint16_t uErrorCode);
     736IEM_STATIC VBOXSTRICTRC     iemMemFetchSelDesc(PVMCPU pVCpu, PIEMSELDESC pDesc, uint16_t uSel, uint8_t uXcpt);
     737IEM_STATIC VBOXSTRICTRC     iemMemStackPushCommitSpecial(PVMCPU pVCpu, void *pvMem, uint64_t uNewRsp);
     738IEM_STATIC VBOXSTRICTRC     iemMemStackPushBeginSpecial(PVMCPU pVCpu, size_t cbMem, void **ppvMem, uint64_t *puNewRsp);
     739IEM_STATIC VBOXSTRICTRC     iemMemStackPushU32(PVMCPU pVCpu, uint32_t u32Value);
     740IEM_STATIC VBOXSTRICTRC     iemMemStackPushU16(PVMCPU pVCpu, uint16_t u16Value);
     741IEM_STATIC VBOXSTRICTRC     iemMemMarkSelDescAccessed(PVMCPU pVCpu, uint16_t uSel);
     742IEM_STATIC uint16_t         iemSRegFetchU16(PVMCPU pVCpu, uint8_t iSegReg);
    743743
    744744#if defined(IEM_VERIFICATION_MODE_FULL) && !defined(IEM_VERIFICATION_MODE_MINIMAL)
    745 IEM_STATIC PIEMVERIFYEVTREC iemVerifyAllocRecord(PIEMCPU pIemCpu);
    746 #endif
    747 IEM_STATIC VBOXSTRICTRC     iemVerifyFakeIOPortRead(PIEMCPU pIemCpu, RTIOPORT Port, uint32_t *pu32Value, size_t cbValue);
    748 IEM_STATIC VBOXSTRICTRC     iemVerifyFakeIOPortWrite(PIEMCPU pIemCpu, RTIOPORT Port, uint32_t u32Value, size_t cbValue);
     745IEM_STATIC PIEMVERIFYEVTREC iemVerifyAllocRecord(PVMCPU pVCpu);
     746#endif
     747IEM_STATIC VBOXSTRICTRC     iemVerifyFakeIOPortRead(PVMCPU pVCpu, RTIOPORT Port, uint32_t *pu32Value, size_t cbValue);
     748IEM_STATIC VBOXSTRICTRC     iemVerifyFakeIOPortWrite(PVMCPU pVCpu, RTIOPORT Port, uint32_t u32Value, size_t cbValue);
    749749
    750750
     
    754754 *
    755755 * @returns VINF_SUCCESS.
    756  * @param   pIemCpu             The per CPU IEM state of the calling thread.
     756 * @param   pVCpu               The cross context virtual CPU structure of the
     757 *                              calling thread.
    757758 * @param   rcPassUp            The pass up status.  Must be informational.
    758759 *                              VINF_SUCCESS is not allowed.
    759760 */
    760 IEM_STATIC int iemSetPassUpStatus(PIEMCPU pIemCpu, VBOXSTRICTRC rcPassUp)
     761IEM_STATIC int iemSetPassUpStatus(PVMCPU pVCpu, VBOXSTRICTRC rcPassUp)
    761762{
    762763    AssertRC(VBOXSTRICTRC_VAL(rcPassUp)); Assert(rcPassUp != VINF_SUCCESS);
    763764
    764     int32_t const rcOldPassUp = pIemCpu->rcPassUp;
     765    int32_t const rcOldPassUp = pVCpu->iem.s.rcPassUp;
    765766    if (rcOldPassUp == VINF_SUCCESS)
    766         pIemCpu->rcPassUp = VBOXSTRICTRC_VAL(rcPassUp);
     767        pVCpu->iem.s.rcPassUp = VBOXSTRICTRC_VAL(rcPassUp);
    767768    /* If both are EM scheduling codes, use EM priority rules. */
    768769    else if (   rcOldPassUp >= VINF_EM_FIRST && rcOldPassUp <= VINF_EM_LAST
     
    772773        {
    773774            Log(("IEM: rcPassUp=%Rrc! rcOldPassUp=%Rrc\n", VBOXSTRICTRC_VAL(rcPassUp), rcOldPassUp));
    774             pIemCpu->rcPassUp = VBOXSTRICTRC_VAL(rcPassUp);
     775            pVCpu->iem.s.rcPassUp = VBOXSTRICTRC_VAL(rcPassUp);
    775776        }
    776777        else
     
    781782    {
    782783        Log(("IEM: rcPassUp=%Rrc! rcOldPassUp=%Rrc\n", VBOXSTRICTRC_VAL(rcPassUp), rcOldPassUp));
    783         pIemCpu->rcPassUp = VBOXSTRICTRC_VAL(rcPassUp);
     784        pVCpu->iem.s.rcPassUp = VBOXSTRICTRC_VAL(rcPassUp);
    784785    }
    785786    /* Don't override specific status code, first come first served. */
     
    811812 * Initializes the execution state.
    812813 *
    813  * @param   pIemCpu             The per CPU IEM state.
     814 * @param   pVCpu               The cross context virtual CPU structure of the
     815 *                              calling thread.
    814816 * @param   fBypassHandlers     Whether to bypass access handlers.
    815817 *
     
    817819 *          side-effects in strict builds.
    818820 */
    819 DECLINLINE(void) iemInitExec(PIEMCPU pIemCpu, bool fBypassHandlers)
    820 {
    821     PCPUMCTX pCtx  = pIemCpu->CTX_SUFF(pCtx);
    822     PVMCPU   pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
     821DECLINLINE(void) iemInitExec(PVMCPU pVCpu, bool fBypassHandlers)
     822{
     823    PCPUMCTX pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
    823824
    824825    Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_IEM));
     
    838839    CPUMGuestLazyLoadHiddenCsAndSs(pVCpu);
    839840#endif
    840     pIemCpu->uCpl               = CPUMGetGuestCPL(pVCpu);
    841     pIemCpu->enmCpuMode         = iemCalcCpuMode(pCtx);
     841    pVCpu->iem.s.uCpl               = CPUMGetGuestCPL(pVCpu);
     842    pVCpu->iem.s.enmCpuMode         = iemCalcCpuMode(pCtx);
    842843#ifdef VBOX_STRICT
    843     pIemCpu->enmDefAddrMode     = (IEMMODE)0xc0fe;
    844     pIemCpu->enmEffAddrMode     = (IEMMODE)0xc0fe;
    845     pIemCpu->enmDefOpSize       = (IEMMODE)0xc0fe;
    846     pIemCpu->enmEffOpSize       = (IEMMODE)0xc0fe;
    847     pIemCpu->fPrefixes          = (IEMMODE)0xfeedbeef;
    848     pIemCpu->uRexReg            = 127;
    849     pIemCpu->uRexB              = 127;
    850     pIemCpu->uRexIndex          = 127;
    851     pIemCpu->iEffSeg            = 127;
    852     pIemCpu->offOpcode          = 127;
    853     pIemCpu->cbOpcode           = 127;
    854 #endif
    855 
    856     pIemCpu->cActiveMappings    = 0;
    857     pIemCpu->iNextMapping       = 0;
    858     pIemCpu->rcPassUp           = VINF_SUCCESS;
    859     pIemCpu->fBypassHandlers    = fBypassHandlers;
     844    pVCpu->iem.s.enmDefAddrMode     = (IEMMODE)0xc0fe;
     845    pVCpu->iem.s.enmEffAddrMode     = (IEMMODE)0xc0fe;
     846    pVCpu->iem.s.enmDefOpSize       = (IEMMODE)0xc0fe;
     847    pVCpu->iem.s.enmEffOpSize       = (IEMMODE)0xc0fe;
     848    pVCpu->iem.s.fPrefixes          = (IEMMODE)0xfeedbeef;
     849    pVCpu->iem.s.uRexReg            = 127;
     850    pVCpu->iem.s.uRexB              = 127;
     851    pVCpu->iem.s.uRexIndex          = 127;
     852    pVCpu->iem.s.iEffSeg            = 127;
     853    pVCpu->iem.s.offOpcode          = 127;
     854    pVCpu->iem.s.cbOpcode           = 127;
     855#endif
     856
     857    pVCpu->iem.s.cActiveMappings    = 0;
     858    pVCpu->iem.s.iNextMapping       = 0;
     859    pVCpu->iem.s.rcPassUp           = VINF_SUCCESS;
     860    pVCpu->iem.s.fBypassHandlers    = fBypassHandlers;
    860861#ifdef VBOX_WITH_RAW_MODE_NOT_R0
    861     pIemCpu->fInPatchCode       = pIemCpu->uCpl == 0
     862    pVCpu->iem.s.fInPatchCode       = pVCpu->iem.s.uCpl == 0
    862863                               && pCtx->cs.u64Base == 0
    863864                               && pCtx->cs.u32Limit == UINT32_MAX
    864                                && PATMIsPatchGCAddr(IEMCPU_TO_VM(pIemCpu), pCtx->eip);
    865     if (!pIemCpu->fInPatchCode)
     865                               && PATMIsPatchGCAddr(pVCpu->CTX_SUFF(pVM), pCtx->eip);
     866    if (!pVCpu->iem.s.fInPatchCode)
    866867        CPUMRawLeave(pVCpu, VINF_SUCCESS);
    867868#endif
    868869
    869870#ifdef IEM_VERIFICATION_MODE_FULL
    870     pIemCpu->fNoRemSavedByExec = pIemCpu->fNoRem;
    871     pIemCpu->fNoRem = true;
     871    pVCpu->iem.s.fNoRemSavedByExec = pVCpu->iem.s.fNoRem;
     872    pVCpu->iem.s.fNoRem = true;
    872873#endif
    873874}
     
    877878 * Counterpart to #iemInitExec that undoes evil strict-build stuff.
    878879 *
    879  * @param   pIemCpu             The per CPU IEM state.
    880  */
    881 DECLINLINE(void) iemUninitExec(PIEMCPU pIemCpu)
     880 * @param   pVCpu               The cross context virtual CPU structure of the
     881 *                              calling thread.
     882 */
     883DECLINLINE(void) iemUninitExec(PVMCPU pVCpu)
    882884{
    883885    /* Note! do not touch fInPatchCode here! (see iemUninitExecAndFiddleStatusAndMaybeReenter) */
    884886#ifdef IEM_VERIFICATION_MODE_FULL
    885     pIemCpu->fNoRem = pIemCpu->fNoRemSavedByExec;
     887    pVCpu->iem.s.fNoRem = pVCpu->iem.s.fNoRemSavedByExec;
    886888#endif
    887889#ifdef VBOX_STRICT
    888     pIemCpu->cbOpcode = 0;
     890    pVCpu->iem.s.cbOpcode = 0;
    889891#else
    890     NOREF(pIemCpu);
     892    NOREF(pVCpu);
    891893#endif
    892894}
     
    898900 * iemReInitDecoder is mostly a copy of this function.
    899901 *
    900  * @param   pIemCpu             The per CPU IEM state.
     902 * @param   pVCpu               The cross context virtual CPU structure of the
     903 *                              calling thread.
    901904 * @param   fBypassHandlers     Whether to bypass access handlers.
    902905 */
    903 DECLINLINE(void) iemInitDecoder(PIEMCPU pIemCpu, bool fBypassHandlers)
    904 {
    905     PCPUMCTX pCtx  = pIemCpu->CTX_SUFF(pCtx);
    906     PVMCPU   pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
     906DECLINLINE(void) iemInitDecoder(PVMCPU pVCpu, bool fBypassHandlers)
     907{
     908    PCPUMCTX pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
    907909
    908910    Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_IEM));
     
    922924    CPUMGuestLazyLoadHiddenCsAndSs(pVCpu);
    923925#endif
    924     pIemCpu->uCpl               = CPUMGetGuestCPL(pVCpu);
     926    pVCpu->iem.s.uCpl               = CPUMGetGuestCPL(pVCpu);
    925927#ifdef IEM_VERIFICATION_MODE_FULL
    926     if (pIemCpu->uInjectCpl != UINT8_MAX)
    927         pIemCpu->uCpl           = pIemCpu->uInjectCpl;
     928    if (pVCpu->iem.s.uInjectCpl != UINT8_MAX)
     929        pVCpu->iem.s.uCpl           = pVCpu->iem.s.uInjectCpl;
    928930#endif
    929931    IEMMODE enmMode = iemCalcCpuMode(pCtx);
    930     pIemCpu->enmCpuMode         = enmMode;
    931     pIemCpu->enmDefAddrMode     = enmMode;  /** @todo check if this is correct... */
    932     pIemCpu->enmEffAddrMode     = enmMode;
     932    pVCpu->iem.s.enmCpuMode         = enmMode;
     933    pVCpu->iem.s.enmDefAddrMode     = enmMode;  /** @todo check if this is correct... */
     934    pVCpu->iem.s.enmEffAddrMode     = enmMode;
    933935    if (enmMode != IEMMODE_64BIT)
    934936    {
    935         pIemCpu->enmDefOpSize   = enmMode;  /** @todo check if this is correct... */
    936         pIemCpu->enmEffOpSize   = enmMode;
     937        pVCpu->iem.s.enmDefOpSize   = enmMode;  /** @todo check if this is correct... */
     938        pVCpu->iem.s.enmEffOpSize   = enmMode;
    937939    }
    938940    else
    939941    {
    940         pIemCpu->enmDefOpSize   = IEMMODE_32BIT;
    941         pIemCpu->enmEffOpSize   = IEMMODE_32BIT;
    942     }
    943     pIemCpu->fPrefixes          = 0;
    944     pIemCpu->uRexReg            = 0;
    945     pIemCpu->uRexB              = 0;
    946     pIemCpu->uRexIndex          = 0;
    947     pIemCpu->iEffSeg            = X86_SREG_DS;
    948     pIemCpu->offOpcode          = 0;
    949     pIemCpu->cbOpcode           = 0;
    950     pIemCpu->cActiveMappings    = 0;
    951     pIemCpu->iNextMapping       = 0;
    952     pIemCpu->rcPassUp           = VINF_SUCCESS;
    953     pIemCpu->fBypassHandlers    = fBypassHandlers;
     942        pVCpu->iem.s.enmDefOpSize   = IEMMODE_32BIT;
     943        pVCpu->iem.s.enmEffOpSize   = IEMMODE_32BIT;
     944    }
     945    pVCpu->iem.s.fPrefixes          = 0;
     946    pVCpu->iem.s.uRexReg            = 0;
     947    pVCpu->iem.s.uRexB              = 0;
     948    pVCpu->iem.s.uRexIndex          = 0;
     949    pVCpu->iem.s.iEffSeg            = X86_SREG_DS;
     950    pVCpu->iem.s.offOpcode          = 0;
     951    pVCpu->iem.s.cbOpcode           = 0;
     952    pVCpu->iem.s.cActiveMappings    = 0;
     953    pVCpu->iem.s.iNextMapping       = 0;
     954    pVCpu->iem.s.rcPassUp           = VINF_SUCCESS;
     955    pVCpu->iem.s.fBypassHandlers    = fBypassHandlers;
    954956#ifdef VBOX_WITH_RAW_MODE_NOT_R0
    955     pIemCpu->fInPatchCode       = pIemCpu->uCpl == 0
     957    pVCpu->iem.s.fInPatchCode       = pVCpu->iem.s.uCpl == 0
    956958                               && pCtx->cs.u64Base == 0
    957959                               && pCtx->cs.u32Limit == UINT32_MAX
    958                                && PATMIsPatchGCAddr(IEMCPU_TO_VM(pIemCpu), pCtx->eip);
    959     if (!pIemCpu->fInPatchCode)
     960                               && PATMIsPatchGCAddr(pVCpu->CTX_SUFF(pVM), pCtx->eip);
     961    if (!pVCpu->iem.s.fInPatchCode)
    960962        CPUMRawLeave(pVCpu, VINF_SUCCESS);
    961963#endif
     
    965967    {
    966968        case IEMMODE_64BIT:
    967             RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I64/%u %08llx", pIemCpu->uCpl, pCtx->rip);
     969            RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I64/%u %08llx", pVCpu->iem.s.uCpl, pCtx->rip);
    968970            break;
    969971        case IEMMODE_32BIT:
    970             RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I32/%u %04x:%08x", pIemCpu->uCpl, pCtx->cs.Sel, pCtx->eip);
     972            RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I32/%u %04x:%08x", pVCpu->iem.s.uCpl, pCtx->cs.Sel, pCtx->eip);
    971973            break;
    972974        case IEMMODE_16BIT:
    973             RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I16/%u %04x:%04x", pIemCpu->uCpl, pCtx->cs.Sel, pCtx->eip);
     975            RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I16/%u %04x:%04x", pVCpu->iem.s.uCpl, pCtx->cs.Sel, pCtx->eip);
    974976            break;
    975977    }
     
    984986 *
    985987 * @param   pVCpu               The cross context virtual CPU structure of the calling EMT.
    986  * @param   pIemCpu             The per CPU IEM state.
    987  */
    988 DECLINLINE(void) iemReInitDecoder(PVMCPU pVCpu, PIEMCPU pIemCpu)
    989 {
    990     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     988 */
     989DECLINLINE(void) iemReInitDecoder(PVMCPU pVCpu)
     990{
     991    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    991992
    992993    Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_IEM));
     
    10031004#endif
    10041005
    1005     pIemCpu->uCpl               = CPUMGetGuestCPL(pVCpu);   /** @todo this should be updated during execution! */
     1006    pVCpu->iem.s.uCpl               = CPUMGetGuestCPL(pVCpu);   /** @todo this should be updated during execution! */
    10061007#ifdef IEM_VERIFICATION_MODE_FULL
    1007     if (pIemCpu->uInjectCpl != UINT8_MAX)
    1008         pIemCpu->uCpl           = pIemCpu->uInjectCpl;
     1008    if (pVCpu->iem.s.uInjectCpl != UINT8_MAX)
     1009        pVCpu->iem.s.uCpl           = pVCpu->iem.s.uInjectCpl;
    10091010#endif
    10101011    IEMMODE enmMode = iemCalcCpuMode(pCtx);
    1011     pIemCpu->enmCpuMode         = enmMode;                  /** @todo this should be updated during execution! */
    1012     pIemCpu->enmDefAddrMode     = enmMode;  /** @todo check if this is correct... */
    1013     pIemCpu->enmEffAddrMode     = enmMode;
     1012    pVCpu->iem.s.enmCpuMode         = enmMode;                  /** @todo this should be updated during execution! */
     1013    pVCpu->iem.s.enmDefAddrMode     = enmMode;  /** @todo check if this is correct... */
     1014    pVCpu->iem.s.enmEffAddrMode     = enmMode;
    10141015    if (enmMode != IEMMODE_64BIT)
    10151016    {
    1016         pIemCpu->enmDefOpSize   = enmMode;  /** @todo check if this is correct... */
    1017         pIemCpu->enmEffOpSize   = enmMode;
     1017        pVCpu->iem.s.enmDefOpSize   = enmMode;  /** @todo check if this is correct... */
     1018        pVCpu->iem.s.enmEffOpSize   = enmMode;
    10181019    }
    10191020    else
    10201021    {
    1021         pIemCpu->enmDefOpSize   = IEMMODE_32BIT;
    1022         pIemCpu->enmEffOpSize   = IEMMODE_32BIT;
    1023     }
    1024     pIemCpu->fPrefixes          = 0;
    1025     pIemCpu->uRexReg            = 0;
    1026     pIemCpu->uRexB              = 0;
    1027     pIemCpu->uRexIndex          = 0;
    1028     pIemCpu->iEffSeg            = X86_SREG_DS;
    1029     if (pIemCpu->cbOpcode > pIemCpu->offOpcode) /* No need to check RIP here because branch instructions will update cbOpcode.  */
    1030     {
    1031         pIemCpu->cbOpcode      -= pIemCpu->offOpcode;
    1032         memmove(&pIemCpu->abOpcode[0], &pIemCpu->abOpcode[pIemCpu->offOpcode], pIemCpu->cbOpcode);
     1022        pVCpu->iem.s.enmDefOpSize   = IEMMODE_32BIT;
     1023        pVCpu->iem.s.enmEffOpSize   = IEMMODE_32BIT;
     1024    }
     1025    pVCpu->iem.s.fPrefixes          = 0;
     1026    pVCpu->iem.s.uRexReg            = 0;
     1027    pVCpu->iem.s.uRexB              = 0;
     1028    pVCpu->iem.s.uRexIndex          = 0;
     1029    pVCpu->iem.s.iEffSeg            = X86_SREG_DS;
     1030    if (pVCpu->iem.s.cbOpcode > pVCpu->iem.s.offOpcode) /* No need to check RIP here because branch instructions will update cbOpcode.  */
     1031    {
     1032        pVCpu->iem.s.cbOpcode      -= pVCpu->iem.s.offOpcode;
     1033        memmove(&pVCpu->iem.s.abOpcode[0], &pVCpu->iem.s.abOpcode[pVCpu->iem.s.offOpcode], pVCpu->iem.s.cbOpcode);
    10331034    }
    10341035    else
    1035         pIemCpu->cbOpcode       = 0;
    1036     pIemCpu->offOpcode          = 0;
    1037     Assert(pIemCpu->cActiveMappings == 0);
    1038     pIemCpu->iNextMapping       = 0;
    1039     Assert(pIemCpu->rcPassUp   == VINF_SUCCESS);
    1040     Assert(pIemCpu->fBypassHandlers == false);
     1036        pVCpu->iem.s.cbOpcode       = 0;
     1037    pVCpu->iem.s.offOpcode          = 0;
     1038    Assert(pVCpu->iem.s.cActiveMappings == 0);
     1039    pVCpu->iem.s.iNextMapping       = 0;
     1040    Assert(pVCpu->iem.s.rcPassUp   == VINF_SUCCESS);
     1041    Assert(pVCpu->iem.s.fBypassHandlers == false);
    10411042#ifdef VBOX_WITH_RAW_MODE_NOT_R0
    1042     if (!pIemCpu->fInPatchCode)
     1043    if (!pVCpu->iem.s.fInPatchCode)
    10431044    { /* likely */ }
    10441045    else
    10451046    {
    1046         pIemCpu->fInPatchCode   = pIemCpu->uCpl == 0
     1047        pVCpu->iem.s.fInPatchCode   = pVCpu->iem.s.uCpl == 0
    10471048                               && pCtx->cs.u64Base == 0
    10481049                               && pCtx->cs.u32Limit == UINT32_MAX
    1049                                && PATMIsPatchGCAddr(IEMCPU_TO_VM(pIemCpu), pCtx->eip);
    1050         if (!pIemCpu->fInPatchCode)
     1050                               && PATMIsPatchGCAddr(pVCpu->CTX_SUFF(pVM), pCtx->eip);
     1051        if (!pVCpu->iem.s.fInPatchCode)
    10511052            CPUMRawLeave(pVCpu, VINF_SUCCESS);
    10521053    }
     
    10571058    {
    10581059        case IEMMODE_64BIT:
    1059             RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I64/%u %08llx", pIemCpu->uCpl, pCtx->rip);
     1060            RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I64/%u %08llx", pVCpu->iem.s.uCpl, pCtx->rip);
    10601061            break;
    10611062        case IEMMODE_32BIT:
    1062             RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I32/%u %04x:%08x", pIemCpu->uCpl, pCtx->cs.Sel, pCtx->eip);
     1063            RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I32/%u %04x:%08x", pVCpu->iem.s.uCpl, pCtx->cs.Sel, pCtx->eip);
    10631064            break;
    10641065        case IEMMODE_16BIT:
    1065             RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I16/%u %04x:%04x", pIemCpu->uCpl, pCtx->cs.Sel, pCtx->eip);
     1066            RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "I16/%u %04x:%04x", pVCpu->iem.s.uCpl, pCtx->cs.Sel, pCtx->eip);
    10661067            break;
    10671068    }
     
    10751076 *
    10761077 * @returns Strict VBox status code.
    1077  * @param   pIemCpu             The IEM state.
     1078 * @param   pVCpu               The cross context virtual CPU structure of the
     1079 *                              calling thread.
    10781080 * @param   fBypassHandlers     Whether to bypass access handlers.
    10791081 */
    1080 IEM_STATIC VBOXSTRICTRC iemInitDecoderAndPrefetchOpcodes(PIEMCPU pIemCpu, bool fBypassHandlers)
     1082IEM_STATIC VBOXSTRICTRC iemInitDecoderAndPrefetchOpcodes(PVMCPU pVCpu, bool fBypassHandlers)
    10811083{
    10821084#ifdef IEM_VERIFICATION_MODE_FULL
    1083     uint8_t const cbOldOpcodes = pIemCpu->cbOpcode;
    1084 #endif
    1085     iemInitDecoder(pIemCpu, fBypassHandlers);
     1085    uint8_t const cbOldOpcodes = pVCpu->iem.s.cbOpcode;
     1086#endif
     1087    iemInitDecoder(pVCpu, fBypassHandlers);
    10861088
    10871089    /*
     
    10901092     * First translate CS:rIP to a physical address.
    10911093     */
    1092     PCPUMCTX    pCtx = pIemCpu->CTX_SUFF(pCtx);
     1094    PCPUMCTX    pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    10931095    uint32_t    cbToTryRead;
    10941096    RTGCPTR     GCPtrPC;
    1095     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     1097    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    10961098    {
    10971099        cbToTryRead = PAGE_SIZE;
    10981100        GCPtrPC     = pCtx->rip;
    10991101        if (!IEM_IS_CANONICAL(GCPtrPC))
    1100             return iemRaiseGeneralProtectionFault0(pIemCpu);
     1102            return iemRaiseGeneralProtectionFault0(pVCpu);
    11011103        cbToTryRead = PAGE_SIZE - (GCPtrPC & PAGE_OFFSET_MASK);
    11021104    }
     
    11041106    {
    11051107        uint32_t GCPtrPC32 = pCtx->eip;
    1106         AssertMsg(!(GCPtrPC32 & ~(uint32_t)UINT16_MAX) || pIemCpu->enmCpuMode == IEMMODE_32BIT, ("%04x:%RX64\n", pCtx->cs.Sel, pCtx->rip));
     1108        AssertMsg(!(GCPtrPC32 & ~(uint32_t)UINT16_MAX) || pVCpu->iem.s.enmCpuMode == IEMMODE_32BIT, ("%04x:%RX64\n", pCtx->cs.Sel, pCtx->rip));
    11071109        if (GCPtrPC32 > pCtx->cs.u32Limit)
    1108             return iemRaiseSelectorBounds(pIemCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
     1110            return iemRaiseSelectorBounds(pVCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
    11091111        cbToTryRead = pCtx->cs.u32Limit - GCPtrPC32 + 1;
    11101112        if (!cbToTryRead) /* overflowed */
     
    11201122    /* Allow interpretation of patch manager code blocks since they can for
    11211123       instance throw #PFs for perfectly good reasons. */
    1122     if (pIemCpu->fInPatchCode)
     1124    if (pVCpu->iem.s.fInPatchCode)
    11231125    {
    11241126        size_t cbRead = 0;
    1125         int rc = PATMReadPatchCode(IEMCPU_TO_VM(pIemCpu), GCPtrPC, pIemCpu->abOpcode, sizeof(pIemCpu->abOpcode), &cbRead);
     1127        int rc = PATMReadPatchCode(pVCpu->CTX_SUFF(pVM), GCPtrPC, pVCpu->iem.s.abOpcode, sizeof(pVCpu->iem.s.abOpcode), &cbRead);
    11261128        AssertRCReturn(rc, rc);
    1127         pIemCpu->cbOpcode = (uint8_t)cbRead; Assert(pIemCpu->cbOpcode == cbRead); Assert(cbRead > 0);
     1129        pVCpu->iem.s.cbOpcode = (uint8_t)cbRead; Assert(pVCpu->iem.s.cbOpcode == cbRead); Assert(cbRead > 0);
    11281130        return VINF_SUCCESS;
    11291131    }
     
    11321134    RTGCPHYS    GCPhys;
    11331135    uint64_t    fFlags;
    1134     int rc = PGMGstGetPage(IEMCPU_TO_VMCPU(pIemCpu), GCPtrPC, &fFlags, &GCPhys);
     1136    int rc = PGMGstGetPage(pVCpu, GCPtrPC, &fFlags, &GCPhys);
    11351137    if (RT_FAILURE(rc))
    11361138    {
    11371139        Log(("iemInitDecoderAndPrefetchOpcodes: %RGv - rc=%Rrc\n", GCPtrPC, rc));
    1138         return iemRaisePageFault(pIemCpu, GCPtrPC, IEM_ACCESS_INSTRUCTION, rc);
    1139     }
    1140     if (!(fFlags & X86_PTE_US) && pIemCpu->uCpl == 3)
     1140        return iemRaisePageFault(pVCpu, GCPtrPC, IEM_ACCESS_INSTRUCTION, rc);
     1141    }
     1142    if (!(fFlags & X86_PTE_US) && pVCpu->iem.s.uCpl == 3)
    11411143    {
    11421144        Log(("iemInitDecoderAndPrefetchOpcodes: %RGv - supervisor page\n", GCPtrPC));
    1143         return iemRaisePageFault(pIemCpu, GCPtrPC, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
     1145        return iemRaisePageFault(pVCpu, GCPtrPC, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
    11441146    }
    11451147    if ((fFlags & X86_PTE_PAE_NX) && (pCtx->msrEFER & MSR_K6_EFER_NXE))
    11461148    {
    11471149        Log(("iemInitDecoderAndPrefetchOpcodes: %RGv - NX\n", GCPtrPC));
    1148         return iemRaisePageFault(pIemCpu, GCPtrPC, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
     1150        return iemRaisePageFault(pVCpu, GCPtrPC, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
    11491151    }
    11501152    GCPhys |= GCPtrPC & PAGE_OFFSET_MASK;
     
    11591161     */
    11601162    /** @todo optimize this differently by not using PGMPhysRead. */
    1161     RTGCPHYS const offPrevOpcodes = GCPhys - pIemCpu->GCPhysOpcodes;
    1162     pIemCpu->GCPhysOpcodes = GCPhys;
     1163    RTGCPHYS const offPrevOpcodes = GCPhys - pVCpu->iem.s.GCPhysOpcodes;
     1164    pVCpu->iem.s.GCPhysOpcodes = GCPhys;
    11631165    if (   offPrevOpcodes < cbOldOpcodes
    1164         && PAGE_SIZE - (GCPhys & PAGE_OFFSET_MASK) > sizeof(pIemCpu->abOpcode))
     1166        && PAGE_SIZE - (GCPhys & PAGE_OFFSET_MASK) > sizeof(pVCpu->iem.s.abOpcode))
    11651167    {
    11661168        uint8_t cbNew = cbOldOpcodes - (uint8_t)offPrevOpcodes;
    1167         Assert(cbNew <= RT_ELEMENTS(pIemCpu->abOpcode));
    1168         memmove(&pIemCpu->abOpcode[0], &pIemCpu->abOpcode[offPrevOpcodes], cbNew);
    1169         pIemCpu->cbOpcode = cbNew;
     1169        Assert(cbNew <= RT_ELEMENTS(pVCpu->iem.s.abOpcode));
     1170        memmove(&pVCpu->iem.s.abOpcode[0], &pVCpu->iem.s.abOpcode[offPrevOpcodes], cbNew);
     1171        pVCpu->iem.s.cbOpcode = cbNew;
    11701172        return VINF_SUCCESS;
    11711173    }
     
    11751177     * Read the bytes at this address.
    11761178     */
    1177     PVM pVM = IEMCPU_TO_VM(pIemCpu);
     1179    PVM pVM = pVCpu->CTX_SUFF(pVM);
    11781180#if defined(IN_RING3) && defined(VBOX_WITH_RAW_MODE_NOT_R0)
    11791181    size_t cbActual;
    11801182    if (   PATMIsEnabled(pVM)
    1181         && RT_SUCCESS(PATMR3ReadOrgInstr(pVM, GCPtrPC, pIemCpu->abOpcode, sizeof(pIemCpu->abOpcode), &cbActual)))
     1183        && RT_SUCCESS(PATMR3ReadOrgInstr(pVM, GCPtrPC, pVCpu->iem.s.abOpcode, sizeof(pVCpu->iem.s.abOpcode), &cbActual)))
    11821184    {
    11831185        Log4(("decode - Read %u unpatched bytes at %RGv\n", cbActual, GCPtrPC));
    11841186        Assert(cbActual > 0);
    1185         pIemCpu->cbOpcode = (uint8_t)cbActual;
     1187        pVCpu->iem.s.cbOpcode = (uint8_t)cbActual;
    11861188    }
    11871189    else
     
    11911193        if (cbToTryRead > cbLeftOnPage)
    11921194            cbToTryRead = cbLeftOnPage;
    1193         if (cbToTryRead > sizeof(pIemCpu->abOpcode))
    1194             cbToTryRead = sizeof(pIemCpu->abOpcode);
    1195 
    1196         if (!pIemCpu->fBypassHandlers)
     1195        if (cbToTryRead > sizeof(pVCpu->iem.s.abOpcode))
     1196            cbToTryRead = sizeof(pVCpu->iem.s.abOpcode);
     1197
     1198        if (!pVCpu->iem.s.fBypassHandlers)
    11971199        {
    1198             VBOXSTRICTRC rcStrict = PGMPhysRead(pVM, GCPhys, pIemCpu->abOpcode, cbToTryRead, PGMACCESSORIGIN_IEM);
     1200            VBOXSTRICTRC rcStrict = PGMPhysRead(pVM, GCPhys, pVCpu->iem.s.abOpcode, cbToTryRead, PGMACCESSORIGIN_IEM);
    11991201            if (RT_LIKELY(rcStrict == VINF_SUCCESS))
    12001202            { /* likely */ }
     
    12031205                Log(("iemInitDecoderAndPrefetchOpcodes: %RGv/%RGp LB %#x - read status -  rcStrict=%Rrc\n",
    12041206                     GCPtrPC, GCPhys, VBOXSTRICTRC_VAL(rcStrict), cbToTryRead));
    1205                 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     1207                rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    12061208            }
    12071209            else
     
    12161218        else
    12171219        {
    1218             rc = PGMPhysSimpleReadGCPhys(pVM, pIemCpu->abOpcode, GCPhys, cbToTryRead);
     1220            rc = PGMPhysSimpleReadGCPhys(pVM, pVCpu->iem.s.abOpcode, GCPhys, cbToTryRead);
    12191221            if (RT_SUCCESS(rc))
    12201222            { /* likely */ }
     
    12261228            }
    12271229        }
    1228         pIemCpu->cbOpcode = cbToTryRead;
     1230        pVCpu->iem.s.cbOpcode = cbToTryRead;
    12291231    }
    12301232
     
    12381240 *
    12391241 * @returns Strict VBox status code.
    1240  * @param   pIemCpu             The IEM state.
     1242 * @param   pVCpu               The cross context virtual CPU structure of the
     1243 *                              calling thread.
    12411244 * @param   cbMin               The minimum number of bytes relative offOpcode
    12421245 *                              that must be read.
    12431246 */
    1244 IEM_STATIC VBOXSTRICTRC iemOpcodeFetchMoreBytes(PIEMCPU pIemCpu, size_t cbMin)
     1247IEM_STATIC VBOXSTRICTRC iemOpcodeFetchMoreBytes(PVMCPU pVCpu, size_t cbMin)
    12451248{
    12461249    /*
     
    12491252     * First translate CS:rIP to a physical address.
    12501253     */
    1251     PCPUMCTX    pCtx = pIemCpu->CTX_SUFF(pCtx);
    1252     uint8_t     cbLeft = pIemCpu->cbOpcode - pIemCpu->offOpcode; Assert(cbLeft < cbMin);
     1254    PCPUMCTX    pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
     1255    uint8_t     cbLeft = pVCpu->iem.s.cbOpcode - pVCpu->iem.s.offOpcode; Assert(cbLeft < cbMin);
    12531256    uint32_t    cbToTryRead;
    12541257    RTGCPTR     GCPtrNext;
    1255     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     1258    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    12561259    {
    12571260        cbToTryRead = PAGE_SIZE;
    1258         GCPtrNext   = pCtx->rip + pIemCpu->cbOpcode;
     1261        GCPtrNext   = pCtx->rip + pVCpu->iem.s.cbOpcode;
    12591262        if (!IEM_IS_CANONICAL(GCPtrNext))
    1260             return iemRaiseGeneralProtectionFault0(pIemCpu);
     1263            return iemRaiseGeneralProtectionFault0(pVCpu);
    12611264    }
    12621265    else
    12631266    {
    12641267        uint32_t GCPtrNext32 = pCtx->eip;
    1265         Assert(!(GCPtrNext32 & ~(uint32_t)UINT16_MAX) || pIemCpu->enmCpuMode == IEMMODE_32BIT);
    1266         GCPtrNext32 += pIemCpu->cbOpcode;
     1268        Assert(!(GCPtrNext32 & ~(uint32_t)UINT16_MAX) || pVCpu->iem.s.enmCpuMode == IEMMODE_32BIT);
     1269        GCPtrNext32 += pVCpu->iem.s.cbOpcode;
    12671270        if (GCPtrNext32 > pCtx->cs.u32Limit)
    1268             return iemRaiseSelectorBounds(pIemCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
     1271            return iemRaiseSelectorBounds(pVCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
    12691272        cbToTryRead = pCtx->cs.u32Limit - GCPtrNext32 + 1;
    12701273        if (!cbToTryRead) /* overflowed */
     
    12751278        }
    12761279        if (cbToTryRead < cbMin - cbLeft)
    1277             return iemRaiseSelectorBounds(pIemCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
     1280            return iemRaiseSelectorBounds(pVCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
    12781281        GCPtrNext = (uint32_t)pCtx->cs.u64Base + GCPtrNext32;
    12791282    }
     
    12841287    if (cbToTryRead > cbLeftOnPage)
    12851288        cbToTryRead = cbLeftOnPage;
    1286     if (cbToTryRead > sizeof(pIemCpu->abOpcode) - pIemCpu->cbOpcode)
    1287         cbToTryRead = sizeof(pIemCpu->abOpcode) - pIemCpu->cbOpcode;
     1289    if (cbToTryRead > sizeof(pVCpu->iem.s.abOpcode) - pVCpu->iem.s.cbOpcode)
     1290        cbToTryRead = sizeof(pVCpu->iem.s.abOpcode) - pVCpu->iem.s.cbOpcode;
    12881291/** @todo r=bird: Convert assertion into undefined opcode exception? */
    12891292    Assert(cbToTryRead >= cbMin - cbLeft); /* ASSUMPTION based on iemInitDecoderAndPrefetchOpcodes. */
     
    12921295    /* Allow interpretation of patch manager code blocks since they can for
    12931296       instance throw #PFs for perfectly good reasons. */
    1294     if (pIemCpu->fInPatchCode)
     1297    if (pVCpu->iem.s.fInPatchCode)
    12951298    {
    12961299        size_t cbRead = 0;
    1297         int rc = PATMReadPatchCode(IEMCPU_TO_VM(pIemCpu), GCPtrNext, pIemCpu->abOpcode, cbToTryRead, &cbRead);
     1300        int rc = PATMReadPatchCode(pVCpu->CTX_SUFF(pVM), GCPtrNext, pVCpu->iem.s.abOpcode, cbToTryRead, &cbRead);
    12981301        AssertRCReturn(rc, rc);
    1299         pIemCpu->cbOpcode = (uint8_t)cbRead; Assert(pIemCpu->cbOpcode == cbRead); Assert(cbRead > 0);
     1302        pVCpu->iem.s.cbOpcode = (uint8_t)cbRead; Assert(pVCpu->iem.s.cbOpcode == cbRead); Assert(cbRead > 0);
    13001303        return VINF_SUCCESS;
    13011304    }
     
    13041307    RTGCPHYS    GCPhys;
    13051308    uint64_t    fFlags;
    1306     int rc = PGMGstGetPage(IEMCPU_TO_VMCPU(pIemCpu), GCPtrNext, &fFlags, &GCPhys);
     1309    int rc = PGMGstGetPage(pVCpu, GCPtrNext, &fFlags, &GCPhys);
    13071310    if (RT_FAILURE(rc))
    13081311    {
    13091312        Log(("iemOpcodeFetchMoreBytes: %RGv - rc=%Rrc\n", GCPtrNext, rc));
    1310         return iemRaisePageFault(pIemCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, rc);
    1311     }
    1312     if (!(fFlags & X86_PTE_US) && pIemCpu->uCpl == 3)
     1313        return iemRaisePageFault(pVCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, rc);
     1314    }
     1315    if (!(fFlags & X86_PTE_US) && pVCpu->iem.s.uCpl == 3)
    13131316    {
    13141317        Log(("iemOpcodeFetchMoreBytes: %RGv - supervisor page\n", GCPtrNext));
    1315         return iemRaisePageFault(pIemCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
     1318        return iemRaisePageFault(pVCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
    13161319    }
    13171320    if ((fFlags & X86_PTE_PAE_NX) && (pCtx->msrEFER & MSR_K6_EFER_NXE))
    13181321    {
    13191322        Log(("iemOpcodeFetchMoreBytes: %RGv - NX\n", GCPtrNext));
    1320         return iemRaisePageFault(pIemCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
     1323        return iemRaisePageFault(pVCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
    13211324    }
    13221325    GCPhys |= GCPtrNext & PAGE_OFFSET_MASK;
    1323     Log5(("GCPtrNext=%RGv GCPhys=%RGp cbOpcodes=%#x\n",  GCPtrNext,  GCPhys,  pIemCpu->cbOpcode));
     1326    Log5(("GCPtrNext=%RGv GCPhys=%RGp cbOpcodes=%#x\n",  GCPtrNext,  GCPhys,  pVCpu->iem.s.cbOpcode));
    13241327    /** @todo Check reserved bits and such stuff. PGM is better at doing
    13251328     *        that, so do it when implementing the guest virtual address
     
    13331336     * should be no need to check again here.
    13341337     */
    1335     if (!pIemCpu->fBypassHandlers)
    1336     {
    1337         VBOXSTRICTRC rcStrict = PGMPhysRead(IEMCPU_TO_VM(pIemCpu), GCPhys, &pIemCpu->abOpcode[pIemCpu->cbOpcode],
     1338    if (!pVCpu->iem.s.fBypassHandlers)
     1339    {
     1340        VBOXSTRICTRC rcStrict = PGMPhysRead(pVCpu->CTX_SUFF(pVM), GCPhys, &pVCpu->iem.s.abOpcode[pVCpu->iem.s.cbOpcode],
    13381341                                            cbToTryRead, PGMACCESSORIGIN_IEM);
    13391342        if (RT_LIKELY(rcStrict == VINF_SUCCESS))
     
    13431346            Log(("iemOpcodeFetchMoreBytes: %RGv/%RGp LB %#x - read status -  rcStrict=%Rrc\n",
    13441347                 GCPtrNext, GCPhys, VBOXSTRICTRC_VAL(rcStrict), cbToTryRead));
    1345             rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     1348            rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    13461349        }
    13471350        else
     
    13561359    else
    13571360    {
    1358         rc = PGMPhysSimpleReadGCPhys(IEMCPU_TO_VM(pIemCpu), &pIemCpu->abOpcode[pIemCpu->cbOpcode], GCPhys, cbToTryRead);
     1361        rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), &pVCpu->iem.s.abOpcode[pVCpu->iem.s.cbOpcode], GCPhys, cbToTryRead);
    13591362        if (RT_SUCCESS(rc))
    13601363        { /* likely */ }
     
    13651368        }
    13661369    }
    1367     pIemCpu->cbOpcode += cbToTryRead;
    1368     Log5(("%.*Rhxs\n", pIemCpu->cbOpcode, pIemCpu->abOpcode));
     1370    pVCpu->iem.s.cbOpcode += cbToTryRead;
     1371    Log5(("%.*Rhxs\n", pVCpu->iem.s.cbOpcode, pVCpu->iem.s.abOpcode));
    13691372
    13701373    return VINF_SUCCESS;
     
    13771380 *
    13781381 * @returns Strict VBox status code.
    1379  * @param   pIemCpu             The IEM state.
     1382 * @param   pVCpu               The cross context virtual CPU structure of the
     1383 *                              calling thread.
    13801384 * @param   pb                  Where to return the opcode byte.
    13811385 */
    1382 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU8Slow(PIEMCPU pIemCpu, uint8_t *pb)
    1383 {
    1384     VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pIemCpu, 1);
     1386DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU8Slow(PVMCPU pVCpu, uint8_t *pb)
     1387{
     1388    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 1);
    13851389    if (rcStrict == VINF_SUCCESS)
    13861390    {
    1387         uint8_t offOpcode = pIemCpu->offOpcode;
    1388         *pb = pIemCpu->abOpcode[offOpcode];
    1389         pIemCpu->offOpcode = offOpcode + 1;
     1391        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     1392        *pb = pVCpu->iem.s.abOpcode[offOpcode];
     1393        pVCpu->iem.s.offOpcode = offOpcode + 1;
    13901394    }
    13911395    else
     
    13991403 *
    14001404 * @returns Strict VBox status code.
    1401  * @param   pIemCpu             The IEM state.
     1405 * @param   pVCpu               The cross context virtual CPU structure of the
     1406 *                              calling thread.
    14021407 * @param   pu8                 Where to return the opcode byte.
    14031408 */
    1404 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU8(PIEMCPU pIemCpu, uint8_t *pu8)
    1405 {
    1406     uintptr_t const offOpcode = pIemCpu->offOpcode;
    1407     if (RT_LIKELY((uint8_t)offOpcode < pIemCpu->cbOpcode))
    1408     {
    1409         pIemCpu->offOpcode = (uint8_t)offOpcode + 1;
    1410         *pu8 = pIemCpu->abOpcode[offOpcode];
     1409DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU8(PVMCPU pVCpu, uint8_t *pu8)
     1410{
     1411    uintptr_t const offOpcode = pVCpu->iem.s.offOpcode;
     1412    if (RT_LIKELY((uint8_t)offOpcode < pVCpu->iem.s.cbOpcode))
     1413    {
     1414        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 1;
     1415        *pu8 = pVCpu->iem.s.abOpcode[offOpcode];
    14111416        return VINF_SUCCESS;
    14121417    }
    1413     return iemOpcodeGetNextU8Slow(pIemCpu, pu8);
     1418    return iemOpcodeGetNextU8Slow(pVCpu, pu8);
    14141419}
    14151420
     
    14201425 *
    14211426 * @returns The opcode byte.
    1422  * @param   pIemCpu             The IEM state.
    1423  */
    1424 DECL_NO_INLINE(IEM_STATIC, uint8_t) iemOpcodeGetNextU8SlowJmp(PIEMCPU pIemCpu)
    1425 {
    1426     VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pIemCpu, 1);
     1427 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     1428 */
     1429DECL_NO_INLINE(IEM_STATIC, uint8_t) iemOpcodeGetNextU8SlowJmp(PVMCPU pVCpu)
     1430{
     1431    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 1);
    14271432    if (rcStrict == VINF_SUCCESS)
    1428         return pIemCpu->abOpcode[pIemCpu->offOpcode++];
    1429     longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     1433        return pVCpu->iem.s.abOpcode[pVCpu->iem.s.offOpcode++];
     1434    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    14301435}
    14311436
     
    14351440 *
    14361441 * @returns The opcode byte.
    1437  * @param   pIemCpu             The IEM state.
    1438  */
    1439 DECLINLINE(uint8_t) iemOpcodeGetNextU8Jmp(PIEMCPU pIemCpu)
    1440 {
    1441     uintptr_t offOpcode = pIemCpu->offOpcode;
    1442     if (RT_LIKELY((uint8_t)offOpcode < pIemCpu->cbOpcode))
    1443     {
    1444         pIemCpu->offOpcode = (uint8_t)offOpcode + 1;
    1445         return pIemCpu->abOpcode[offOpcode];
    1446     }
    1447     return iemOpcodeGetNextU8SlowJmp(pIemCpu);
     1442 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     1443 */
     1444DECLINLINE(uint8_t) iemOpcodeGetNextU8Jmp(PVMCPU pVCpu)
     1445{
     1446    uintptr_t offOpcode = pVCpu->iem.s.offOpcode;
     1447    if (RT_LIKELY((uint8_t)offOpcode < pVCpu->iem.s.cbOpcode))
     1448    {
     1449        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 1;
     1450        return pVCpu->iem.s.abOpcode[offOpcode];
     1451    }
     1452    return iemOpcodeGetNextU8SlowJmp(pVCpu);
    14481453}
    14491454
     
    14541459 *
    14551460 * @param   a_pu8               Where to return the opcode byte.
    1456  * @remark Implicitly references pIemCpu.
     1461 * @remark Implicitly references pVCpu.
    14571462 */
    14581463#ifndef IEM_WITH_SETJMP
     
    14601465    do \
    14611466    { \
    1462         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU8(pIemCpu, (a_pu8)); \
     1467        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU8(pVCpu, (a_pu8)); \
    14631468        if (rcStrict2 == VINF_SUCCESS) \
    14641469        { /* likely */ } \
     
    14671472    } while (0)
    14681473#else
    1469 # define IEM_OPCODE_GET_NEXT_U8(a_pu8) (*(a_pu8) = iemOpcodeGetNextU8Jmp(pIemCpu))
     1474# define IEM_OPCODE_GET_NEXT_U8(a_pu8) (*(a_pu8) = iemOpcodeGetNextU8Jmp(pVCpu))
    14701475#endif /* IEM_WITH_SETJMP */
    14711476
     
    14761481 *
    14771482 * @returns Strict VBox status code.
    1478  * @param   pIemCpu             The IEM state.
     1483 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    14791484 * @param   pi8                 Where to return the signed byte.
    14801485 */
    1481 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS8(PIEMCPU pIemCpu, int8_t *pi8)
    1482 {
    1483     return iemOpcodeGetNextU8(pIemCpu, (uint8_t *)pi8);
     1486DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS8(PVMCPU pVCpu, int8_t *pi8)
     1487{
     1488    return iemOpcodeGetNextU8(pVCpu, (uint8_t *)pi8);
    14841489}
    14851490#endif /* !IEM_WITH_SETJMP */
     
    14911496 *
    14921497 * @param   a_pi8               Where to return the signed byte.
    1493  * @remark Implicitly references pIemCpu.
     1498 * @remark Implicitly references pVCpu.
    14941499 */
    14951500#ifndef IEM_WITH_SETJMP
     
    14971502    do \
    14981503    { \
    1499         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS8(pIemCpu, (a_pi8)); \
     1504        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS8(pVCpu, (a_pi8)); \
    15001505        if (rcStrict2 != VINF_SUCCESS) \
    15011506            return rcStrict2; \
    15021507    } while (0)
    15031508#else /* IEM_WITH_SETJMP */
    1504 # define IEM_OPCODE_GET_NEXT_S8(a_pi8) (*(a_pi8) = (int8_t)iemOpcodeGetNextU8Jmp(pIemCpu))
     1509# define IEM_OPCODE_GET_NEXT_S8(a_pi8) (*(a_pi8) = (int8_t)iemOpcodeGetNextU8Jmp(pVCpu))
    15051510
    15061511#endif /* IEM_WITH_SETJMP */
     
    15121517 *
    15131518 * @returns Strict VBox status code.
    1514  * @param   pIemCpu             The IEM state.
     1519 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    15151520 * @param   pu16                Where to return the opcode dword.
    15161521 */
    1517 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextS8SxU16Slow(PIEMCPU pIemCpu, uint16_t *pu16)
     1522DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextS8SxU16Slow(PVMCPU pVCpu, uint16_t *pu16)
    15181523{
    15191524    uint8_t      u8;
    1520     VBOXSTRICTRC rcStrict = iemOpcodeGetNextU8Slow(pIemCpu, &u8);
     1525    VBOXSTRICTRC rcStrict = iemOpcodeGetNextU8Slow(pVCpu, &u8);
    15211526    if (rcStrict == VINF_SUCCESS)
    15221527        *pu16 = (int8_t)u8;
     
    15301535 *
    15311536 * @returns Strict VBox status code.
    1532  * @param   pIemCpu             The IEM state.
     1537 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    15331538 * @param   pu16                Where to return the unsigned word.
    15341539 */
    1535 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS8SxU16(PIEMCPU pIemCpu, uint16_t *pu16)
    1536 {
    1537     uint8_t const offOpcode = pIemCpu->offOpcode;
    1538     if (RT_UNLIKELY(offOpcode >= pIemCpu->cbOpcode))
    1539         return iemOpcodeGetNextS8SxU16Slow(pIemCpu, pu16);
    1540 
    1541     *pu16 = (int8_t)pIemCpu->abOpcode[offOpcode];
    1542     pIemCpu->offOpcode = offOpcode + 1;
     1540DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS8SxU16(PVMCPU pVCpu, uint16_t *pu16)
     1541{
     1542    uint8_t const offOpcode = pVCpu->iem.s.offOpcode;
     1543    if (RT_UNLIKELY(offOpcode >= pVCpu->iem.s.cbOpcode))
     1544        return iemOpcodeGetNextS8SxU16Slow(pVCpu, pu16);
     1545
     1546    *pu16 = (int8_t)pVCpu->iem.s.abOpcode[offOpcode];
     1547    pVCpu->iem.s.offOpcode = offOpcode + 1;
    15431548    return VINF_SUCCESS;
    15441549}
     
    15511556 *
    15521557 * @param   a_pu16              Where to return the word.
    1553  * @remark Implicitly references pIemCpu.
     1558 * @remark Implicitly references pVCpu.
    15541559 */
    15551560#ifndef IEM_WITH_SETJMP
     
    15571562    do \
    15581563    { \
    1559         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS8SxU16(pIemCpu, (a_pu16)); \
     1564        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS8SxU16(pVCpu, (a_pu16)); \
    15601565        if (rcStrict2 != VINF_SUCCESS) \
    15611566            return rcStrict2; \
    15621567    } while (0)
    15631568#else
    1564 # define IEM_OPCODE_GET_NEXT_S8_SX_U16(a_pu16) (*(a_pu16) = (int8_t)iemOpcodeGetNextU8Jmp(pIemCpu))
     1569# define IEM_OPCODE_GET_NEXT_S8_SX_U16(a_pu16) (*(a_pu16) = (int8_t)iemOpcodeGetNextU8Jmp(pVCpu))
    15651570#endif
    15661571
     
    15711576 *
    15721577 * @returns Strict VBox status code.
    1573  * @param   pIemCpu             The IEM state.
     1578 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    15741579 * @param   pu32                Where to return the opcode dword.
    15751580 */
    1576 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextS8SxU32Slow(PIEMCPU pIemCpu, uint32_t *pu32)
     1581DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextS8SxU32Slow(PVMCPU pVCpu, uint32_t *pu32)
    15771582{
    15781583    uint8_t      u8;
    1579     VBOXSTRICTRC rcStrict = iemOpcodeGetNextU8Slow(pIemCpu, &u8);
     1584    VBOXSTRICTRC rcStrict = iemOpcodeGetNextU8Slow(pVCpu, &u8);
    15801585    if (rcStrict == VINF_SUCCESS)
    15811586        *pu32 = (int8_t)u8;
     
    15891594 *
    15901595 * @returns Strict VBox status code.
    1591  * @param   pIemCpu             The IEM state.
     1596 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    15921597 * @param   pu32                Where to return the unsigned dword.
    15931598 */
    1594 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS8SxU32(PIEMCPU pIemCpu, uint32_t *pu32)
    1595 {
    1596     uint8_t const offOpcode = pIemCpu->offOpcode;
    1597     if (RT_UNLIKELY(offOpcode >= pIemCpu->cbOpcode))
    1598         return iemOpcodeGetNextS8SxU32Slow(pIemCpu, pu32);
    1599 
    1600     *pu32 = (int8_t)pIemCpu->abOpcode[offOpcode];
    1601     pIemCpu->offOpcode = offOpcode + 1;
     1599DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS8SxU32(PVMCPU pVCpu, uint32_t *pu32)
     1600{
     1601    uint8_t const offOpcode = pVCpu->iem.s.offOpcode;
     1602    if (RT_UNLIKELY(offOpcode >= pVCpu->iem.s.cbOpcode))
     1603        return iemOpcodeGetNextS8SxU32Slow(pVCpu, pu32);
     1604
     1605    *pu32 = (int8_t)pVCpu->iem.s.abOpcode[offOpcode];
     1606    pVCpu->iem.s.offOpcode = offOpcode + 1;
    16021607    return VINF_SUCCESS;
    16031608}
     
    16101615 *
    16111616 * @param   a_pu32              Where to return the word.
    1612  * @remark Implicitly references pIemCpu.
     1617 * @remark Implicitly references pVCpu.
    16131618 */
    16141619#ifndef IEM_WITH_SETJMP
     
    16161621    do \
    16171622    { \
    1618         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS8SxU32(pIemCpu, (a_pu32)); \
     1623        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS8SxU32(pVCpu, (a_pu32)); \
    16191624        if (rcStrict2 != VINF_SUCCESS) \
    16201625            return rcStrict2; \
    16211626    } while (0)
    16221627#else
    1623 # define IEM_OPCODE_GET_NEXT_S8_SX_U32(a_pu32) (*(a_pu32) = (int8_t)iemOpcodeGetNextU8Jmp(pIemCpu))
     1628# define IEM_OPCODE_GET_NEXT_S8_SX_U32(a_pu32) (*(a_pu32) = (int8_t)iemOpcodeGetNextU8Jmp(pVCpu))
    16241629#endif
    16251630
     
    16301635 *
    16311636 * @returns Strict VBox status code.
    1632  * @param   pIemCpu             The IEM state.
     1637 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    16331638 * @param   pu64                Where to return the opcode qword.
    16341639 */
    1635 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextS8SxU64Slow(PIEMCPU pIemCpu, uint64_t *pu64)
     1640DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextS8SxU64Slow(PVMCPU pVCpu, uint64_t *pu64)
    16361641{
    16371642    uint8_t      u8;
    1638     VBOXSTRICTRC rcStrict = iemOpcodeGetNextU8Slow(pIemCpu, &u8);
     1643    VBOXSTRICTRC rcStrict = iemOpcodeGetNextU8Slow(pVCpu, &u8);
    16391644    if (rcStrict == VINF_SUCCESS)
    16401645        *pu64 = (int8_t)u8;
     
    16481653 *
    16491654 * @returns Strict VBox status code.
    1650  * @param   pIemCpu             The IEM state.
     1655 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    16511656 * @param   pu64                Where to return the unsigned qword.
    16521657 */
    1653 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS8SxU64(PIEMCPU pIemCpu, uint64_t *pu64)
    1654 {
    1655     uint8_t const offOpcode = pIemCpu->offOpcode;
    1656     if (RT_UNLIKELY(offOpcode >= pIemCpu->cbOpcode))
    1657         return iemOpcodeGetNextS8SxU64Slow(pIemCpu, pu64);
    1658 
    1659     *pu64 = (int8_t)pIemCpu->abOpcode[offOpcode];
    1660     pIemCpu->offOpcode = offOpcode + 1;
     1658DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS8SxU64(PVMCPU pVCpu, uint64_t *pu64)
     1659{
     1660    uint8_t const offOpcode = pVCpu->iem.s.offOpcode;
     1661    if (RT_UNLIKELY(offOpcode >= pVCpu->iem.s.cbOpcode))
     1662        return iemOpcodeGetNextS8SxU64Slow(pVCpu, pu64);
     1663
     1664    *pu64 = (int8_t)pVCpu->iem.s.abOpcode[offOpcode];
     1665    pVCpu->iem.s.offOpcode = offOpcode + 1;
    16611666    return VINF_SUCCESS;
    16621667}
     
    16701675 *
    16711676 * @param   a_pu64              Where to return the word.
    1672  * @remark Implicitly references pIemCpu.
     1677 * @remark Implicitly references pVCpu.
    16731678 */
    16741679#ifndef IEM_WITH_SETJMP
     
    16761681    do \
    16771682    { \
    1678         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS8SxU64(pIemCpu, (a_pu64)); \
     1683        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS8SxU64(pVCpu, (a_pu64)); \
    16791684        if (rcStrict2 != VINF_SUCCESS) \
    16801685            return rcStrict2; \
    16811686    } while (0)
    16821687#else
    1683 # define IEM_OPCODE_GET_NEXT_S8_SX_U64(a_pu64) (*(a_pu64) = (int8_t)iemOpcodeGetNextU8Jmp(pIemCpu))
     1688# define IEM_OPCODE_GET_NEXT_S8_SX_U64(a_pu64) (*(a_pu64) = (int8_t)iemOpcodeGetNextU8Jmp(pVCpu))
    16841689#endif
    16851690
     
    16911696 *
    16921697 * @returns Strict VBox status code.
    1693  * @param   pIemCpu             The IEM state.
     1698 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    16941699 * @param   pu16                Where to return the opcode word.
    16951700 */
    1696 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU16Slow(PIEMCPU pIemCpu, uint16_t *pu16)
    1697 {
    1698     VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pIemCpu, 2);
     1701DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU16Slow(PVMCPU pVCpu, uint16_t *pu16)
     1702{
     1703    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 2);
    16991704    if (rcStrict == VINF_SUCCESS)
    17001705    {
    1701         uint8_t offOpcode = pIemCpu->offOpcode;
    1702         *pu16 = RT_MAKE_U16(pIemCpu->abOpcode[offOpcode], pIemCpu->abOpcode[offOpcode + 1]);
    1703         pIemCpu->offOpcode = offOpcode + 2;
     1706        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     1707        *pu16 = RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
     1708        pVCpu->iem.s.offOpcode = offOpcode + 2;
    17041709    }
    17051710    else
     
    17131718 *
    17141719 * @returns Strict VBox status code.
    1715  * @param   pIemCpu             The IEM state.
     1720 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    17161721 * @param   pu16                Where to return the opcode word.
    17171722 */
    1718 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU16(PIEMCPU pIemCpu, uint16_t *pu16)
    1719 {
    1720     uintptr_t const offOpcode = pIemCpu->offOpcode;
    1721     if (RT_LIKELY((uint8_t)offOpcode + 2 <= pIemCpu->cbOpcode))
    1722     {
    1723         pIemCpu->offOpcode = (uint8_t)offOpcode + 2;
    1724         *pu16 = RT_MAKE_U16(pIemCpu->abOpcode[offOpcode], pIemCpu->abOpcode[offOpcode + 1]);
     1723DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU16(PVMCPU pVCpu, uint16_t *pu16)
     1724{
     1725    uintptr_t const offOpcode = pVCpu->iem.s.offOpcode;
     1726    if (RT_LIKELY((uint8_t)offOpcode + 2 <= pVCpu->iem.s.cbOpcode))
     1727    {
     1728        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 2;
     1729        *pu16 = RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
    17251730        return VINF_SUCCESS;
    17261731    }
    1727     return iemOpcodeGetNextU16Slow(pIemCpu, pu16);
     1732    return iemOpcodeGetNextU16Slow(pVCpu, pu16);
    17281733}
    17291734
     
    17341739 *
    17351740 * @returns The opcode word.
    1736  * @param   pIemCpu             The IEM state.
    1737  */
    1738 DECL_NO_INLINE(IEM_STATIC, uint16_t) iemOpcodeGetNextU16SlowJmp(PIEMCPU pIemCpu)
    1739 {
    1740     VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pIemCpu, 2);
     1741 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     1742 */
     1743DECL_NO_INLINE(IEM_STATIC, uint16_t) iemOpcodeGetNextU16SlowJmp(PVMCPU pVCpu)
     1744{
     1745    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 2);
    17411746    if (rcStrict == VINF_SUCCESS)
    17421747    {
    1743         uint8_t offOpcode = pIemCpu->offOpcode;
    1744         pIemCpu->offOpcode += 2;
    1745         return RT_MAKE_U16(pIemCpu->abOpcode[offOpcode], pIemCpu->abOpcode[offOpcode + 1]);
    1746     }
    1747     longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     1748        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     1749        pVCpu->iem.s.offOpcode += 2;
     1750        return RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
     1751    }
     1752    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    17481753}
    17491754
     
    17531758 *
    17541759 * @returns The opcode word.
    1755  * @param   pIemCpu             The IEM state.
    1756  */
    1757 DECLINLINE(uint16_t) iemOpcodeGetNextU16Jmp(PIEMCPU pIemCpu)
    1758 {
    1759     uintptr_t const offOpcode = pIemCpu->offOpcode;
    1760     if (RT_LIKELY((uint8_t)offOpcode + 2 <= pIemCpu->cbOpcode))
    1761     {
    1762         pIemCpu->offOpcode = (uint8_t)offOpcode + 2;
    1763         return RT_MAKE_U16(pIemCpu->abOpcode[offOpcode], pIemCpu->abOpcode[offOpcode + 1]);
    1764     }
    1765     return iemOpcodeGetNextU16SlowJmp(pIemCpu);
     1760 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     1761 */
     1762DECLINLINE(uint16_t) iemOpcodeGetNextU16Jmp(PVMCPU pVCpu)
     1763{
     1764    uintptr_t const offOpcode = pVCpu->iem.s.offOpcode;
     1765    if (RT_LIKELY((uint8_t)offOpcode + 2 <= pVCpu->iem.s.cbOpcode))
     1766    {
     1767        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 2;
     1768        return RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
     1769    }
     1770    return iemOpcodeGetNextU16SlowJmp(pVCpu);
    17661771}
    17671772
     
    17731778 *
    17741779 * @param   a_pu16              Where to return the opcode word.
    1775  * @remark Implicitly references pIemCpu.
     1780 * @remark Implicitly references pVCpu.
    17761781 */
    17771782#ifndef IEM_WITH_SETJMP
     
    17791784    do \
    17801785    { \
    1781         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU16(pIemCpu, (a_pu16)); \
     1786        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU16(pVCpu, (a_pu16)); \
    17821787        if (rcStrict2 != VINF_SUCCESS) \
    17831788            return rcStrict2; \
    17841789    } while (0)
    17851790#else
    1786 # define IEM_OPCODE_GET_NEXT_U16(a_pu16) (*(a_pu16) = iemOpcodeGetNextU16Jmp(pIemCpu))
     1791# define IEM_OPCODE_GET_NEXT_U16(a_pu16) (*(a_pu16) = iemOpcodeGetNextU16Jmp(pVCpu))
    17871792#endif
    17881793
     
    17931798 *
    17941799 * @returns Strict VBox status code.
    1795  * @param   pIemCpu             The IEM state.
     1800 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    17961801 * @param   pu32                Where to return the opcode double word.
    17971802 */
    1798 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU16ZxU32Slow(PIEMCPU pIemCpu, uint32_t *pu32)
    1799 {
    1800     VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pIemCpu, 2);
     1803DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU16ZxU32Slow(PVMCPU pVCpu, uint32_t *pu32)
     1804{
     1805    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 2);
    18011806    if (rcStrict == VINF_SUCCESS)
    18021807    {
    1803         uint8_t offOpcode = pIemCpu->offOpcode;
    1804         *pu32 = RT_MAKE_U16(pIemCpu->abOpcode[offOpcode], pIemCpu->abOpcode[offOpcode + 1]);
    1805         pIemCpu->offOpcode = offOpcode + 2;
     1808        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     1809        *pu32 = RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
     1810        pVCpu->iem.s.offOpcode = offOpcode + 2;
    18061811    }
    18071812    else
     
    18151820 *
    18161821 * @returns Strict VBox status code.
    1817  * @param   pIemCpu             The IEM state.
     1822 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    18181823 * @param   pu32                Where to return the opcode double word.
    18191824 */
    1820 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU16ZxU32(PIEMCPU pIemCpu, uint32_t *pu32)
    1821 {
    1822     uint8_t const offOpcode = pIemCpu->offOpcode;
    1823     if (RT_UNLIKELY(offOpcode + 2 > pIemCpu->cbOpcode))
    1824         return iemOpcodeGetNextU16ZxU32Slow(pIemCpu, pu32);
    1825 
    1826     *pu32 = RT_MAKE_U16(pIemCpu->abOpcode[offOpcode], pIemCpu->abOpcode[offOpcode + 1]);
    1827     pIemCpu->offOpcode = offOpcode + 2;
     1825DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU16ZxU32(PVMCPU pVCpu, uint32_t *pu32)
     1826{
     1827    uint8_t const offOpcode = pVCpu->iem.s.offOpcode;
     1828    if (RT_UNLIKELY(offOpcode + 2 > pVCpu->iem.s.cbOpcode))
     1829        return iemOpcodeGetNextU16ZxU32Slow(pVCpu, pu32);
     1830
     1831    *pu32 = RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
     1832    pVCpu->iem.s.offOpcode = offOpcode + 2;
    18281833    return VINF_SUCCESS;
    18291834}
     
    18371842 *
    18381843 * @param   a_pu32              Where to return the opcode double word.
    1839  * @remark Implicitly references pIemCpu.
     1844 * @remark Implicitly references pVCpu.
    18401845 */
    18411846#ifndef IEM_WITH_SETJMP
     
    18431848    do \
    18441849    { \
    1845         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU16ZxU32(pIemCpu, (a_pu32)); \
     1850        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU16ZxU32(pVCpu, (a_pu32)); \
    18461851        if (rcStrict2 != VINF_SUCCESS) \
    18471852            return rcStrict2; \
    18481853    } while (0)
    18491854#else
    1850 # define IEM_OPCODE_GET_NEXT_U16_ZX_U32(a_pu32) (*(a_pu32) = iemOpcodeGetNextU16Jmp(pIemCpu))
     1855# define IEM_OPCODE_GET_NEXT_U16_ZX_U32(a_pu32) (*(a_pu32) = iemOpcodeGetNextU16Jmp(pVCpu))
    18511856#endif
    18521857
     
    18571862 *
    18581863 * @returns Strict VBox status code.
    1859  * @param   pIemCpu             The IEM state.
     1864 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    18601865 * @param   pu64                Where to return the opcode quad word.
    18611866 */
    1862 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU16ZxU64Slow(PIEMCPU pIemCpu, uint64_t *pu64)
    1863 {
    1864     VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pIemCpu, 2);
     1867DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU16ZxU64Slow(PVMCPU pVCpu, uint64_t *pu64)
     1868{
     1869    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 2);
    18651870    if (rcStrict == VINF_SUCCESS)
    18661871    {
    1867         uint8_t offOpcode = pIemCpu->offOpcode;
    1868         *pu64 = RT_MAKE_U16(pIemCpu->abOpcode[offOpcode], pIemCpu->abOpcode[offOpcode + 1]);
    1869         pIemCpu->offOpcode = offOpcode + 2;
     1872        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     1873        *pu64 = RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
     1874        pVCpu->iem.s.offOpcode = offOpcode + 2;
    18701875    }
    18711876    else
     
    18791884 *
    18801885 * @returns Strict VBox status code.
    1881  * @param   pIemCpu             The IEM state.
     1886 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    18821887 * @param   pu64                Where to return the opcode quad word.
    18831888 */
    1884 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU16ZxU64(PIEMCPU pIemCpu, uint64_t *pu64)
    1885 {
    1886     uint8_t const offOpcode = pIemCpu->offOpcode;
    1887     if (RT_UNLIKELY(offOpcode + 2 > pIemCpu->cbOpcode))
    1888         return iemOpcodeGetNextU16ZxU64Slow(pIemCpu, pu64);
    1889 
    1890     *pu64 = RT_MAKE_U16(pIemCpu->abOpcode[offOpcode], pIemCpu->abOpcode[offOpcode + 1]);
    1891     pIemCpu->offOpcode = offOpcode + 2;
     1889DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU16ZxU64(PVMCPU pVCpu, uint64_t *pu64)
     1890{
     1891    uint8_t const offOpcode = pVCpu->iem.s.offOpcode;
     1892    if (RT_UNLIKELY(offOpcode + 2 > pVCpu->iem.s.cbOpcode))
     1893        return iemOpcodeGetNextU16ZxU64Slow(pVCpu, pu64);
     1894
     1895    *pu64 = RT_MAKE_U16(pVCpu->iem.s.abOpcode[offOpcode], pVCpu->iem.s.abOpcode[offOpcode + 1]);
     1896    pVCpu->iem.s.offOpcode = offOpcode + 2;
    18921897    return VINF_SUCCESS;
    18931898}
     
    19001905 *
    19011906 * @param   a_pu64              Where to return the opcode quad word.
    1902  * @remark Implicitly references pIemCpu.
     1907 * @remark Implicitly references pVCpu.
    19031908 */
    19041909#ifndef IEM_WITH_SETJMP
     
    19061911    do \
    19071912    { \
    1908         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU16ZxU64(pIemCpu, (a_pu64)); \
     1913        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU16ZxU64(pVCpu, (a_pu64)); \
    19091914        if (rcStrict2 != VINF_SUCCESS) \
    19101915            return rcStrict2; \
    19111916    } while (0)
    19121917#else
    1913 # define IEM_OPCODE_GET_NEXT_U16_ZX_U64(a_pu64)  (*(a_pu64) = iemOpcodeGetNextU16Jmp(pIemCpu))
     1918# define IEM_OPCODE_GET_NEXT_U16_ZX_U64(a_pu64)  (*(a_pu64) = iemOpcodeGetNextU16Jmp(pVCpu))
    19141919#endif
    19151920
     
    19201925 *
    19211926 * @returns Strict VBox status code.
    1922  * @param   pIemCpu             The IEM state.
     1927 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    19231928 * @param   pi16                Where to return the signed word.
    19241929 */
    1925 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS16(PIEMCPU pIemCpu, int16_t *pi16)
    1926 {
    1927     return iemOpcodeGetNextU16(pIemCpu, (uint16_t *)pi16);
     1930DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS16(PVMCPU pVCpu, int16_t *pi16)
     1931{
     1932    return iemOpcodeGetNextU16(pVCpu, (uint16_t *)pi16);
    19281933}
    19291934#endif /* !IEM_WITH_SETJMP */
     
    19351940 *
    19361941 * @param   a_pi16              Where to return the signed word.
    1937  * @remark Implicitly references pIemCpu.
     1942 * @remark Implicitly references pVCpu.
    19381943 */
    19391944#ifndef IEM_WITH_SETJMP
     
    19411946    do \
    19421947    { \
    1943         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS16(pIemCpu, (a_pi16)); \
     1948        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS16(pVCpu, (a_pi16)); \
    19441949        if (rcStrict2 != VINF_SUCCESS) \
    19451950            return rcStrict2; \
    19461951    } while (0)
    19471952#else
    1948 # define IEM_OPCODE_GET_NEXT_S16(a_pi16) (*(a_pi16) = (int16_t)iemOpcodeGetNextU16Jmp(pIemCpu))
     1953# define IEM_OPCODE_GET_NEXT_S16(a_pi16) (*(a_pi16) = (int16_t)iemOpcodeGetNextU16Jmp(pVCpu))
    19491954#endif
    19501955
     
    19551960 *
    19561961 * @returns Strict VBox status code.
    1957  * @param   pIemCpu             The IEM state.
     1962 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    19581963 * @param   pu32                Where to return the opcode dword.
    19591964 */
    1960 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU32Slow(PIEMCPU pIemCpu, uint32_t *pu32)
    1961 {
    1962     VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pIemCpu, 4);
     1965DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU32Slow(PVMCPU pVCpu, uint32_t *pu32)
     1966{
     1967    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 4);
    19631968    if (rcStrict == VINF_SUCCESS)
    19641969    {
    1965         uint8_t offOpcode = pIemCpu->offOpcode;
    1966         *pu32 = RT_MAKE_U32_FROM_U8(pIemCpu->abOpcode[offOpcode],
    1967                                     pIemCpu->abOpcode[offOpcode + 1],
    1968                                     pIemCpu->abOpcode[offOpcode + 2],
    1969                                     pIemCpu->abOpcode[offOpcode + 3]);
    1970         pIemCpu->offOpcode = offOpcode + 4;
     1970        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     1971        *pu32 = RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
     1972                                    pVCpu->iem.s.abOpcode[offOpcode + 1],
     1973                                    pVCpu->iem.s.abOpcode[offOpcode + 2],
     1974                                    pVCpu->iem.s.abOpcode[offOpcode + 3]);
     1975        pVCpu->iem.s.offOpcode = offOpcode + 4;
    19711976    }
    19721977    else
     
    19801985 *
    19811986 * @returns Strict VBox status code.
    1982  * @param   pIemCpu             The IEM state.
     1987 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    19831988 * @param   pu32                Where to return the opcode double word.
    19841989 */
    1985 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU32(PIEMCPU pIemCpu, uint32_t *pu32)
    1986 {
    1987     uintptr_t const offOpcode = pIemCpu->offOpcode;
    1988     if (RT_LIKELY((uint8_t)offOpcode + 4 <= pIemCpu->cbOpcode))
    1989     {
    1990         pIemCpu->offOpcode = (uint8_t)offOpcode + 4;
    1991         *pu32 = RT_MAKE_U32_FROM_U8(pIemCpu->abOpcode[offOpcode],
    1992                                     pIemCpu->abOpcode[offOpcode + 1],
    1993                                     pIemCpu->abOpcode[offOpcode + 2],
    1994                                     pIemCpu->abOpcode[offOpcode + 3]);
     1990DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU32(PVMCPU pVCpu, uint32_t *pu32)
     1991{
     1992    uintptr_t const offOpcode = pVCpu->iem.s.offOpcode;
     1993    if (RT_LIKELY((uint8_t)offOpcode + 4 <= pVCpu->iem.s.cbOpcode))
     1994    {
     1995        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 4;
     1996        *pu32 = RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
     1997                                    pVCpu->iem.s.abOpcode[offOpcode + 1],
     1998                                    pVCpu->iem.s.abOpcode[offOpcode + 2],
     1999                                    pVCpu->iem.s.abOpcode[offOpcode + 3]);
    19952000        return VINF_SUCCESS;
    19962001    }
    1997     return iemOpcodeGetNextU32Slow(pIemCpu, pu32);
     2002    return iemOpcodeGetNextU32Slow(pVCpu, pu32);
    19982003}
    19992004
     
    20042009 *
    20052010 * @returns The opcode dword.
    2006  * @param   pIemCpu             The IEM state.
    2007  */
    2008 DECL_NO_INLINE(IEM_STATIC, uint32_t) iemOpcodeGetNextU32SlowJmp(PIEMCPU pIemCpu)
    2009 {
    2010     VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pIemCpu, 4);
     2011 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     2012 */
     2013DECL_NO_INLINE(IEM_STATIC, uint32_t) iemOpcodeGetNextU32SlowJmp(PVMCPU pVCpu)
     2014{
     2015    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 4);
    20112016    if (rcStrict == VINF_SUCCESS)
    20122017    {
    2013         uint8_t offOpcode = pIemCpu->offOpcode;
    2014         pIemCpu->offOpcode = offOpcode + 4;
    2015         return RT_MAKE_U32_FROM_U8(pIemCpu->abOpcode[offOpcode],
    2016                                    pIemCpu->abOpcode[offOpcode + 1],
    2017                                    pIemCpu->abOpcode[offOpcode + 2],
    2018                                    pIemCpu->abOpcode[offOpcode + 3]);
    2019     }
    2020     longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     2018        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     2019        pVCpu->iem.s.offOpcode = offOpcode + 4;
     2020        return RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
     2021                                   pVCpu->iem.s.abOpcode[offOpcode + 1],
     2022                                   pVCpu->iem.s.abOpcode[offOpcode + 2],
     2023                                   pVCpu->iem.s.abOpcode[offOpcode + 3]);
     2024    }
     2025    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    20212026}
    20222027
     
    20262031 *
    20272032 * @returns The opcode dword.
    2028  * @param   pIemCpu             The IEM state.
    2029  */
    2030 DECLINLINE(uint32_t) iemOpcodeGetNextU32Jmp(PIEMCPU pIemCpu)
    2031 {
    2032     uintptr_t const offOpcode = pIemCpu->offOpcode;
    2033     if (RT_LIKELY((uint8_t)offOpcode + 4 <= pIemCpu->cbOpcode))
    2034     {
    2035         pIemCpu->offOpcode = (uint8_t)offOpcode + 4;
    2036         return RT_MAKE_U32_FROM_U8(pIemCpu->abOpcode[offOpcode],
    2037                                    pIemCpu->abOpcode[offOpcode + 1],
    2038                                    pIemCpu->abOpcode[offOpcode + 2],
    2039                                    pIemCpu->abOpcode[offOpcode + 3]);
    2040     }
    2041     return iemOpcodeGetNextU32SlowJmp(pIemCpu);
     2033 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     2034 */
     2035DECLINLINE(uint32_t) iemOpcodeGetNextU32Jmp(PVMCPU pVCpu)
     2036{
     2037    uintptr_t const offOpcode = pVCpu->iem.s.offOpcode;
     2038    if (RT_LIKELY((uint8_t)offOpcode + 4 <= pVCpu->iem.s.cbOpcode))
     2039    {
     2040        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 4;
     2041        return RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
     2042                                   pVCpu->iem.s.abOpcode[offOpcode + 1],
     2043                                   pVCpu->iem.s.abOpcode[offOpcode + 2],
     2044                                   pVCpu->iem.s.abOpcode[offOpcode + 3]);
     2045    }
     2046    return iemOpcodeGetNextU32SlowJmp(pVCpu);
    20422047}
    20432048
     
    20492054 *
    20502055 * @param   a_pu32              Where to return the opcode dword.
    2051  * @remark Implicitly references pIemCpu.
     2056 * @remark Implicitly references pVCpu.
    20522057 */
    20532058#ifndef IEM_WITH_SETJMP
     
    20552060    do \
    20562061    { \
    2057         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU32(pIemCpu, (a_pu32)); \
     2062        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU32(pVCpu, (a_pu32)); \
    20582063        if (rcStrict2 != VINF_SUCCESS) \
    20592064            return rcStrict2; \
    20602065    } while (0)
    20612066#else
    2062 # define IEM_OPCODE_GET_NEXT_U32(a_pu32) (*(a_pu32) = iemOpcodeGetNextU32Jmp(pIemCpu))
     2067# define IEM_OPCODE_GET_NEXT_U32(a_pu32) (*(a_pu32) = iemOpcodeGetNextU32Jmp(pVCpu))
    20632068#endif
    20642069
     
    20692074 *
    20702075 * @returns Strict VBox status code.
    2071  * @param   pIemCpu             The IEM state.
     2076 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    20722077 * @param   pu64                Where to return the opcode dword.
    20732078 */
    2074 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU32ZxU64Slow(PIEMCPU pIemCpu, uint64_t *pu64)
    2075 {
    2076     VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pIemCpu, 4);
     2079DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU32ZxU64Slow(PVMCPU pVCpu, uint64_t *pu64)
     2080{
     2081    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 4);
    20772082    if (rcStrict == VINF_SUCCESS)
    20782083    {
    2079         uint8_t offOpcode = pIemCpu->offOpcode;
    2080         *pu64 = RT_MAKE_U32_FROM_U8(pIemCpu->abOpcode[offOpcode],
    2081                                     pIemCpu->abOpcode[offOpcode + 1],
    2082                                     pIemCpu->abOpcode[offOpcode + 2],
    2083                                     pIemCpu->abOpcode[offOpcode + 3]);
    2084         pIemCpu->offOpcode = offOpcode + 4;
     2084        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     2085        *pu64 = RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
     2086                                    pVCpu->iem.s.abOpcode[offOpcode + 1],
     2087                                    pVCpu->iem.s.abOpcode[offOpcode + 2],
     2088                                    pVCpu->iem.s.abOpcode[offOpcode + 3]);
     2089        pVCpu->iem.s.offOpcode = offOpcode + 4;
    20852090    }
    20862091    else
     
    20942099 *
    20952100 * @returns Strict VBox status code.
    2096  * @param   pIemCpu             The IEM state.
     2101 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    20972102 * @param   pu64                Where to return the opcode quad word.
    20982103 */
    2099 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU32ZxU64(PIEMCPU pIemCpu, uint64_t *pu64)
    2100 {
    2101     uint8_t const offOpcode = pIemCpu->offOpcode;
    2102     if (RT_UNLIKELY(offOpcode + 4 > pIemCpu->cbOpcode))
    2103         return iemOpcodeGetNextU32ZxU64Slow(pIemCpu, pu64);
    2104 
    2105     *pu64 = RT_MAKE_U32_FROM_U8(pIemCpu->abOpcode[offOpcode],
    2106                                 pIemCpu->abOpcode[offOpcode + 1],
    2107                                 pIemCpu->abOpcode[offOpcode + 2],
    2108                                 pIemCpu->abOpcode[offOpcode + 3]);
    2109     pIemCpu->offOpcode = offOpcode + 4;
     2104DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU32ZxU64(PVMCPU pVCpu, uint64_t *pu64)
     2105{
     2106    uint8_t const offOpcode = pVCpu->iem.s.offOpcode;
     2107    if (RT_UNLIKELY(offOpcode + 4 > pVCpu->iem.s.cbOpcode))
     2108        return iemOpcodeGetNextU32ZxU64Slow(pVCpu, pu64);
     2109
     2110    *pu64 = RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
     2111                                pVCpu->iem.s.abOpcode[offOpcode + 1],
     2112                                pVCpu->iem.s.abOpcode[offOpcode + 2],
     2113                                pVCpu->iem.s.abOpcode[offOpcode + 3]);
     2114    pVCpu->iem.s.offOpcode = offOpcode + 4;
    21102115    return VINF_SUCCESS;
    21112116}
     
    21192124 *
    21202125 * @param   a_pu64              Where to return the opcode quad word.
    2121  * @remark Implicitly references pIemCpu.
     2126 * @remark Implicitly references pVCpu.
    21222127 */
    21232128#ifndef IEM_WITH_SETJMP
     
    21252130    do \
    21262131    { \
    2127         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU32ZxU64(pIemCpu, (a_pu64)); \
     2132        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU32ZxU64(pVCpu, (a_pu64)); \
    21282133        if (rcStrict2 != VINF_SUCCESS) \
    21292134            return rcStrict2; \
    21302135    } while (0)
    21312136#else
    2132 # define IEM_OPCODE_GET_NEXT_U32_ZX_U64(a_pu64) (*(a_pu64) = iemOpcodeGetNextU32Jmp(pIemCpu))
     2137# define IEM_OPCODE_GET_NEXT_U32_ZX_U64(a_pu64) (*(a_pu64) = iemOpcodeGetNextU32Jmp(pVCpu))
    21332138#endif
    21342139
     
    21392144 *
    21402145 * @returns Strict VBox status code.
    2141  * @param   pIemCpu             The IEM state.
     2146 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    21422147 * @param   pi32                Where to return the signed double word.
    21432148 */
    2144 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS32(PIEMCPU pIemCpu, int32_t *pi32)
    2145 {
    2146     return iemOpcodeGetNextU32(pIemCpu, (uint32_t *)pi32);
     2149DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS32(PVMCPU pVCpu, int32_t *pi32)
     2150{
     2151    return iemOpcodeGetNextU32(pVCpu, (uint32_t *)pi32);
    21472152}
    21482153#endif
     
    21532158 *
    21542159 * @param   a_pi32              Where to return the signed double word.
    2155  * @remark Implicitly references pIemCpu.
     2160 * @remark Implicitly references pVCpu.
    21562161 */
    21572162#ifndef IEM_WITH_SETJMP
     
    21592164    do \
    21602165    { \
    2161         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS32(pIemCpu, (a_pi32)); \
     2166        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS32(pVCpu, (a_pi32)); \
    21622167        if (rcStrict2 != VINF_SUCCESS) \
    21632168            return rcStrict2; \
    21642169    } while (0)
    21652170#else
    2166 # define IEM_OPCODE_GET_NEXT_S32(a_pi32)    (*(a_pi32) = (int32_t)iemOpcodeGetNextU32Jmp(pIemCpu))
     2171# define IEM_OPCODE_GET_NEXT_S32(a_pi32)    (*(a_pi32) = (int32_t)iemOpcodeGetNextU32Jmp(pVCpu))
    21672172#endif
    21682173
     
    21732178 *
    21742179 * @returns Strict VBox status code.
    2175  * @param   pIemCpu             The IEM state.
     2180 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    21762181 * @param   pu64                Where to return the opcode qword.
    21772182 */
    2178 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextS32SxU64Slow(PIEMCPU pIemCpu, uint64_t *pu64)
    2179 {
    2180     VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pIemCpu, 4);
     2183DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextS32SxU64Slow(PVMCPU pVCpu, uint64_t *pu64)
     2184{
     2185    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 4);
    21812186    if (rcStrict == VINF_SUCCESS)
    21822187    {
    2183         uint8_t offOpcode = pIemCpu->offOpcode;
    2184         *pu64 = (int32_t)RT_MAKE_U32_FROM_U8(pIemCpu->abOpcode[offOpcode],
    2185                                              pIemCpu->abOpcode[offOpcode + 1],
    2186                                              pIemCpu->abOpcode[offOpcode + 2],
    2187                                              pIemCpu->abOpcode[offOpcode + 3]);
    2188         pIemCpu->offOpcode = offOpcode + 4;
     2188        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     2189        *pu64 = (int32_t)RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
     2190                                             pVCpu->iem.s.abOpcode[offOpcode + 1],
     2191                                             pVCpu->iem.s.abOpcode[offOpcode + 2],
     2192                                             pVCpu->iem.s.abOpcode[offOpcode + 3]);
     2193        pVCpu->iem.s.offOpcode = offOpcode + 4;
    21892194    }
    21902195    else
     
    21982203 *
    21992204 * @returns Strict VBox status code.
    2200  * @param   pIemCpu             The IEM state.
     2205 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    22012206 * @param   pu64                Where to return the opcode quad word.
    22022207 */
    2203 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS32SxU64(PIEMCPU pIemCpu, uint64_t *pu64)
    2204 {
    2205     uint8_t const offOpcode = pIemCpu->offOpcode;
    2206     if (RT_UNLIKELY(offOpcode + 4 > pIemCpu->cbOpcode))
    2207         return iemOpcodeGetNextS32SxU64Slow(pIemCpu, pu64);
    2208 
    2209     int32_t i32 = RT_MAKE_U32_FROM_U8(pIemCpu->abOpcode[offOpcode],
    2210                                       pIemCpu->abOpcode[offOpcode + 1],
    2211                                       pIemCpu->abOpcode[offOpcode + 2],
    2212                                       pIemCpu->abOpcode[offOpcode + 3]);
     2208DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS32SxU64(PVMCPU pVCpu, uint64_t *pu64)
     2209{
     2210    uint8_t const offOpcode = pVCpu->iem.s.offOpcode;
     2211    if (RT_UNLIKELY(offOpcode + 4 > pVCpu->iem.s.cbOpcode))
     2212        return iemOpcodeGetNextS32SxU64Slow(pVCpu, pu64);
     2213
     2214    int32_t i32 = RT_MAKE_U32_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
     2215                                      pVCpu->iem.s.abOpcode[offOpcode + 1],
     2216                                      pVCpu->iem.s.abOpcode[offOpcode + 2],
     2217                                      pVCpu->iem.s.abOpcode[offOpcode + 3]);
    22132218    *pu64 = i32;
    2214     pIemCpu->offOpcode = offOpcode + 4;
     2219    pVCpu->iem.s.offOpcode = offOpcode + 4;
    22152220    return VINF_SUCCESS;
    22162221}
     
    22242229 *
    22252230 * @param   a_pu64              Where to return the opcode quad word.
    2226  * @remark Implicitly references pIemCpu.
     2231 * @remark Implicitly references pVCpu.
    22272232 */
    22282233#ifndef IEM_WITH_SETJMP
     
    22302235    do \
    22312236    { \
    2232         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS32SxU64(pIemCpu, (a_pu64)); \
     2237        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS32SxU64(pVCpu, (a_pu64)); \
    22332238        if (rcStrict2 != VINF_SUCCESS) \
    22342239            return rcStrict2; \
    22352240    } while (0)
    22362241#else
    2237 # define IEM_OPCODE_GET_NEXT_S32_SX_U64(a_pu64) (*(a_pu64) = (int32_t)iemOpcodeGetNextU32Jmp(pIemCpu))
     2242# define IEM_OPCODE_GET_NEXT_S32_SX_U64(a_pu64) (*(a_pu64) = (int32_t)iemOpcodeGetNextU32Jmp(pVCpu))
    22382243#endif
    22392244
     
    22442249 *
    22452250 * @returns Strict VBox status code.
    2246  * @param   pIemCpu             The IEM state.
     2251 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    22472252 * @param   pu64                Where to return the opcode qword.
    22482253 */
    2249 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU64Slow(PIEMCPU pIemCpu, uint64_t *pu64)
    2250 {
    2251     VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pIemCpu, 8);
     2254DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemOpcodeGetNextU64Slow(PVMCPU pVCpu, uint64_t *pu64)
     2255{
     2256    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 8);
    22522257    if (rcStrict == VINF_SUCCESS)
    22532258    {
    2254         uint8_t offOpcode = pIemCpu->offOpcode;
    2255         *pu64 = RT_MAKE_U64_FROM_U8(pIemCpu->abOpcode[offOpcode],
    2256                                     pIemCpu->abOpcode[offOpcode + 1],
    2257                                     pIemCpu->abOpcode[offOpcode + 2],
    2258                                     pIemCpu->abOpcode[offOpcode + 3],
    2259                                     pIemCpu->abOpcode[offOpcode + 4],
    2260                                     pIemCpu->abOpcode[offOpcode + 5],
    2261                                     pIemCpu->abOpcode[offOpcode + 6],
    2262                                     pIemCpu->abOpcode[offOpcode + 7]);
    2263         pIemCpu->offOpcode = offOpcode + 8;
     2259        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     2260        *pu64 = RT_MAKE_U64_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
     2261                                    pVCpu->iem.s.abOpcode[offOpcode + 1],
     2262                                    pVCpu->iem.s.abOpcode[offOpcode + 2],
     2263                                    pVCpu->iem.s.abOpcode[offOpcode + 3],
     2264                                    pVCpu->iem.s.abOpcode[offOpcode + 4],
     2265                                    pVCpu->iem.s.abOpcode[offOpcode + 5],
     2266                                    pVCpu->iem.s.abOpcode[offOpcode + 6],
     2267                                    pVCpu->iem.s.abOpcode[offOpcode + 7]);
     2268        pVCpu->iem.s.offOpcode = offOpcode + 8;
    22642269    }
    22652270    else
     
    22732278 *
    22742279 * @returns Strict VBox status code.
    2275  * @param   pIemCpu             The IEM state.
     2280 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    22762281 * @param   pu64                Where to return the opcode qword.
    22772282 */
    2278 DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU64(PIEMCPU pIemCpu, uint64_t *pu64)
    2279 {
    2280     uintptr_t const offOpcode = pIemCpu->offOpcode;
    2281     if (RT_LIKELY((uint8_t)offOpcode + 8 <= pIemCpu->cbOpcode))
    2282     {
    2283         *pu64 = RT_MAKE_U64_FROM_U8(pIemCpu->abOpcode[offOpcode],
    2284                                     pIemCpu->abOpcode[offOpcode + 1],
    2285                                     pIemCpu->abOpcode[offOpcode + 2],
    2286                                     pIemCpu->abOpcode[offOpcode + 3],
    2287                                     pIemCpu->abOpcode[offOpcode + 4],
    2288                                     pIemCpu->abOpcode[offOpcode + 5],
    2289                                     pIemCpu->abOpcode[offOpcode + 6],
    2290                                     pIemCpu->abOpcode[offOpcode + 7]);
    2291         pIemCpu->offOpcode = (uint8_t)offOpcode + 8;
     2283DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextU64(PVMCPU pVCpu, uint64_t *pu64)
     2284{
     2285    uintptr_t const offOpcode = pVCpu->iem.s.offOpcode;
     2286    if (RT_LIKELY((uint8_t)offOpcode + 8 <= pVCpu->iem.s.cbOpcode))
     2287    {
     2288        *pu64 = RT_MAKE_U64_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
     2289                                    pVCpu->iem.s.abOpcode[offOpcode + 1],
     2290                                    pVCpu->iem.s.abOpcode[offOpcode + 2],
     2291                                    pVCpu->iem.s.abOpcode[offOpcode + 3],
     2292                                    pVCpu->iem.s.abOpcode[offOpcode + 4],
     2293                                    pVCpu->iem.s.abOpcode[offOpcode + 5],
     2294                                    pVCpu->iem.s.abOpcode[offOpcode + 6],
     2295                                    pVCpu->iem.s.abOpcode[offOpcode + 7]);
     2296        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 8;
    22922297        return VINF_SUCCESS;
    22932298    }
    2294     return iemOpcodeGetNextU64Slow(pIemCpu, pu64);
     2299    return iemOpcodeGetNextU64Slow(pVCpu, pu64);
    22952300}
    22962301
     
    23012306 *
    23022307 * @returns The opcode qword.
    2303  * @param   pIemCpu             The IEM state.
    2304  */
    2305 DECL_NO_INLINE(IEM_STATIC, uint64_t) iemOpcodeGetNextU64SlowJmp(PIEMCPU pIemCpu)
    2306 {
    2307     VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pIemCpu, 8);
     2308 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     2309 */
     2310DECL_NO_INLINE(IEM_STATIC, uint64_t) iemOpcodeGetNextU64SlowJmp(PVMCPU pVCpu)
     2311{
     2312    VBOXSTRICTRC rcStrict = iemOpcodeFetchMoreBytes(pVCpu, 8);
    23082313    if (rcStrict == VINF_SUCCESS)
    23092314    {
    2310         uint8_t offOpcode = pIemCpu->offOpcode;
    2311         pIemCpu->offOpcode = offOpcode + 8;
    2312         return RT_MAKE_U64_FROM_U8(pIemCpu->abOpcode[offOpcode],
    2313                                    pIemCpu->abOpcode[offOpcode + 1],
    2314                                    pIemCpu->abOpcode[offOpcode + 2],
    2315                                    pIemCpu->abOpcode[offOpcode + 3],
    2316                                    pIemCpu->abOpcode[offOpcode + 4],
    2317                                    pIemCpu->abOpcode[offOpcode + 5],
    2318                                    pIemCpu->abOpcode[offOpcode + 6],
    2319                                    pIemCpu->abOpcode[offOpcode + 7]);
    2320     }
    2321     longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     2315        uint8_t offOpcode = pVCpu->iem.s.offOpcode;
     2316        pVCpu->iem.s.offOpcode = offOpcode + 8;
     2317        return RT_MAKE_U64_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
     2318                                   pVCpu->iem.s.abOpcode[offOpcode + 1],
     2319                                   pVCpu->iem.s.abOpcode[offOpcode + 2],
     2320                                   pVCpu->iem.s.abOpcode[offOpcode + 3],
     2321                                   pVCpu->iem.s.abOpcode[offOpcode + 4],
     2322                                   pVCpu->iem.s.abOpcode[offOpcode + 5],
     2323                                   pVCpu->iem.s.abOpcode[offOpcode + 6],
     2324                                   pVCpu->iem.s.abOpcode[offOpcode + 7]);
     2325    }
     2326    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    23222327}
    23232328
     
    23272332 *
    23282333 * @returns The opcode qword.
    2329  * @param   pIemCpu             The IEM state.
    2330  */
    2331 DECLINLINE(uint64_t) iemOpcodeGetNextU64Jmp(PIEMCPU pIemCpu)
    2332 {
    2333     uintptr_t const offOpcode = pIemCpu->offOpcode;
    2334     if (RT_LIKELY((uint8_t)offOpcode + 8 <= pIemCpu->cbOpcode))
    2335     {
    2336         pIemCpu->offOpcode = (uint8_t)offOpcode + 8;
    2337         return RT_MAKE_U64_FROM_U8(pIemCpu->abOpcode[offOpcode],
    2338                                    pIemCpu->abOpcode[offOpcode + 1],
    2339                                    pIemCpu->abOpcode[offOpcode + 2],
    2340                                    pIemCpu->abOpcode[offOpcode + 3],
    2341                                    pIemCpu->abOpcode[offOpcode + 4],
    2342                                    pIemCpu->abOpcode[offOpcode + 5],
    2343                                    pIemCpu->abOpcode[offOpcode + 6],
    2344                                    pIemCpu->abOpcode[offOpcode + 7]);
    2345     }
    2346     return iemOpcodeGetNextU64SlowJmp(pIemCpu);
     2334 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     2335 */
     2336DECLINLINE(uint64_t) iemOpcodeGetNextU64Jmp(PVMCPU pVCpu)
     2337{
     2338    uintptr_t const offOpcode = pVCpu->iem.s.offOpcode;
     2339    if (RT_LIKELY((uint8_t)offOpcode + 8 <= pVCpu->iem.s.cbOpcode))
     2340    {
     2341        pVCpu->iem.s.offOpcode = (uint8_t)offOpcode + 8;
     2342        return RT_MAKE_U64_FROM_U8(pVCpu->iem.s.abOpcode[offOpcode],
     2343                                   pVCpu->iem.s.abOpcode[offOpcode + 1],
     2344                                   pVCpu->iem.s.abOpcode[offOpcode + 2],
     2345                                   pVCpu->iem.s.abOpcode[offOpcode + 3],
     2346                                   pVCpu->iem.s.abOpcode[offOpcode + 4],
     2347                                   pVCpu->iem.s.abOpcode[offOpcode + 5],
     2348                                   pVCpu->iem.s.abOpcode[offOpcode + 6],
     2349                                   pVCpu->iem.s.abOpcode[offOpcode + 7]);
     2350    }
     2351    return iemOpcodeGetNextU64SlowJmp(pVCpu);
    23472352}
    23482353
     
    23532358 *
    23542359 * @param   a_pu64              Where to return the opcode quad word.
    2355  * @remark Implicitly references pIemCpu.
     2360 * @remark Implicitly references pVCpu.
    23562361 */
    23572362#ifndef IEM_WITH_SETJMP
     
    23592364    do \
    23602365    { \
    2361         VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU64(pIemCpu, (a_pu64)); \
     2366        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU64(pVCpu, (a_pu64)); \
    23622367        if (rcStrict2 != VINF_SUCCESS) \
    23632368            return rcStrict2; \
    23642369    } while (0)
    23652370#else
    2366 # define IEM_OPCODE_GET_NEXT_U64(a_pu64)    ( *(a_pu64) = iemOpcodeGetNextU64Jmp(pIemCpu) )
     2371# define IEM_OPCODE_GET_NEXT_U64(a_pu64)    ( *(a_pu64) = iemOpcodeGetNextU64Jmp(pVCpu) )
    23672372#endif
    23682373
     
    23772382 *
    23782383 * @returns VBox strict status code.
    2379  * @param   pIemCpu         The IEM per CPU instance data.
     2384 * @param   pVCpu           The cross context virtual CPU structure of the
     2385 *                          calling thread.
    23802386 * @param   pCtx            The CPU context.
    23812387 * @param   NewSS           The new SS selctor.
     
    23832389 * @param   pDesc           Where to return the descriptor.
    23842390 */
    2385 IEM_STATIC VBOXSTRICTRC iemMiscValidateNewSS(PIEMCPU pIemCpu, PCCPUMCTX pCtx, RTSEL NewSS, uint8_t uCpl, PIEMSELDESC pDesc)
     2391IEM_STATIC VBOXSTRICTRC iemMiscValidateNewSS(PVMCPU pVCpu, PCCPUMCTX pCtx, RTSEL NewSS, uint8_t uCpl, PIEMSELDESC pDesc)
    23862392{
    23872393    NOREF(pCtx);
     
    23922398    {
    23932399        Log(("iemMiscValidateNewSSandRsp: %#x - null selector -> #TS(0)\n", NewSS));
    2394         return iemRaiseTaskSwitchFault0(pIemCpu);
     2400        return iemRaiseTaskSwitchFault0(pVCpu);
    23952401    }
    23962402
     
    23992405    {
    24002406        Log(("iemMiscValidateNewSSandRsp: %#x - RPL and CPL (%d) differs -> #TS\n", NewSS, uCpl));
    2401         return iemRaiseTaskSwitchFaultBySelector(pIemCpu, NewSS);
     2407        return iemRaiseTaskSwitchFaultBySelector(pVCpu, NewSS);
    24022408    }
    24032409
     
    24052411     * Read the descriptor.
    24062412     */
    2407     VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, pDesc, NewSS, X86_XCPT_TS);
     2413    VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pVCpu, pDesc, NewSS, X86_XCPT_TS);
    24082414    if (rcStrict != VINF_SUCCESS)
    24092415        return rcStrict;
     
    24152421    {
    24162422        Log(("iemMiscValidateNewSSandRsp: %#x - system selector (%#x) -> #TS\n", NewSS, pDesc->Legacy.Gen.u4Type));
    2417         return iemRaiseTaskSwitchFaultBySelector(pIemCpu, NewSS);
     2423        return iemRaiseTaskSwitchFaultBySelector(pVCpu, NewSS);
    24182424    }
    24192425
     
    24222428    {
    24232429        Log(("iemMiscValidateNewSSandRsp: %#x - code or read only (%#x) -> #TS\n", NewSS, pDesc->Legacy.Gen.u4Type));
    2424         return iemRaiseTaskSwitchFaultBySelector(pIemCpu, NewSS);
     2430        return iemRaiseTaskSwitchFaultBySelector(pVCpu, NewSS);
    24252431    }
    24262432    if (pDesc->Legacy.Gen.u2Dpl != uCpl)
    24272433    {
    24282434        Log(("iemMiscValidateNewSSandRsp: %#x - DPL (%d) and CPL (%d) differs -> #TS\n", NewSS, pDesc->Legacy.Gen.u2Dpl, uCpl));
    2429         return iemRaiseTaskSwitchFaultBySelector(pIemCpu, NewSS);
     2435        return iemRaiseTaskSwitchFaultBySelector(pVCpu, NewSS);
    24302436    }
    24312437
     
    24352441    {
    24362442        Log(("iemMiscValidateNewSSandRsp: %#x - segment not present -> #NP\n", NewSS));
    2437         return iemRaiseSelectorNotPresentBySelector(pIemCpu, NewSS);
     2443        return iemRaiseSelectorNotPresentBySelector(pVCpu, NewSS);
    24382444    }
    24392445
     
    24462452 * not.
    24472453 *
    2448  * @param   a_pIemCpu           The IEM per CPU data.
    2449  * @param   a_pCtx              The CPU context.
     2454 * @param   a_pVCpu The cross context virtual CPU structure of the calling thread.
     2455 * @param   a_pCtx  The CPU context.
    24502456 */
    24512457#ifdef VBOX_WITH_RAW_MODE_NOT_R0
    2452 # define IEMMISC_GET_EFL(a_pIemCpu, a_pCtx) \
    2453     ( IEM_VERIFICATION_ENABLED(a_pIemCpu) \
     2458# define IEMMISC_GET_EFL(a_pVCpu, a_pCtx) \
     2459    ( IEM_VERIFICATION_ENABLED(a_pVCpu) \
    24542460      ? (a_pCtx)->eflags.u \
    2455       : CPUMRawGetEFlags(IEMCPU_TO_VMCPU(a_pIemCpu)) )
     2461      : CPUMRawGetEFlags(a_pVCpu) )
    24562462#else
    2457 # define IEMMISC_GET_EFL(a_pIemCpu, a_pCtx) \
     2463# define IEMMISC_GET_EFL(a_pVCpu, a_pCtx) \
    24582464    ( (a_pCtx)->eflags.u  )
    24592465#endif
     
    24622468 * Updates the EFLAGS in the correct manner wrt. PATM.
    24632469 *
    2464  * @param   a_pIemCpu           The IEM per CPU data.
    2465  * @param   a_pCtx              The CPU context.
    2466  * @param   a_fEfl              The new EFLAGS.
     2470 * @param   a_pVCpu The cross context virtual CPU structure of the calling thread.
     2471 * @param   a_pCtx  The CPU context.
     2472 * @param   a_fEfl  The new EFLAGS.
    24672473 */
    24682474#ifdef VBOX_WITH_RAW_MODE_NOT_R0
    2469 # define IEMMISC_SET_EFL(a_pIemCpu, a_pCtx, a_fEfl) \
     2475# define IEMMISC_SET_EFL(a_pVCpu, a_pCtx, a_fEfl) \
    24702476    do { \
    2471         if (IEM_VERIFICATION_ENABLED(a_pIemCpu)) \
     2477        if (IEM_VERIFICATION_ENABLED(a_pVCpu)) \
    24722478            (a_pCtx)->eflags.u = (a_fEfl); \
    24732479        else \
    2474             CPUMRawSetEFlags(IEMCPU_TO_VMCPU(a_pIemCpu), a_fEfl); \
     2480            CPUMRawSetEFlags((a_pVCpu), a_fEfl); \
    24752481    } while (0)
    24762482#else
    2477 # define IEMMISC_SET_EFL(a_pIemCpu, a_pCtx, a_fEfl) \
     2483# define IEMMISC_SET_EFL(a_pVCpu, a_pCtx, a_fEfl) \
    24782484    do { \
    24792485        (a_pCtx)->eflags.u = (a_fEfl); \
     
    25132519 *
    25142520 * @returns VBox strict status code.
    2515  * @param   pIemCpu         The IEM per CPU instance data.
     2521 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    25162522 * @param   pCtx            The CPU context.
    25172523 * @param   uCpl            The CPL to load the stack for.
     
    25192525 * @param   puEsp           Where to return the new stack pointer.
    25202526 */
    2521 IEM_STATIC VBOXSTRICTRC iemRaiseLoadStackFromTss32Or16(PIEMCPU pIemCpu, PCCPUMCTX pCtx, uint8_t uCpl,
     2527IEM_STATIC VBOXSTRICTRC iemRaiseLoadStackFromTss32Or16(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uCpl,
    25222528                                                       PRTSEL pSelSS, uint32_t *puEsp)
    25232529{
     
    25382544                /** @todo check actual access pattern here. */
    25392545                uint32_t u32Tmp = 0; /* gcc maybe... */
    2540                 rcStrict = iemMemFetchSysU32(pIemCpu, &u32Tmp, UINT8_MAX, pCtx->tr.u64Base + off);
     2546                rcStrict = iemMemFetchSysU32(pVCpu, &u32Tmp, UINT8_MAX, pCtx->tr.u64Base + off);
    25412547                if (rcStrict == VINF_SUCCESS)
    25422548                {
     
    25492555            {
    25502556                Log(("LoadStackFromTss32Or16: out of bounds! uCpl=%d, u32Limit=%#x TSS16\n", uCpl, pCtx->tr.u32Limit));
    2551                 rcStrict = iemRaiseTaskSwitchFaultCurrentTSS(pIemCpu);
     2557                rcStrict = iemRaiseTaskSwitchFaultCurrentTSS(pVCpu);
    25522558            }
    25532559            break;
     
    25652571/** @todo check actual access pattern here. */
    25662572                uint64_t u64Tmp;
    2567                 rcStrict = iemMemFetchSysU64(pIemCpu, &u64Tmp, UINT8_MAX, pCtx->tr.u64Base + off);
     2573                rcStrict = iemMemFetchSysU64(pVCpu, &u64Tmp, UINT8_MAX, pCtx->tr.u64Base + off);
    25682574                if (rcStrict == VINF_SUCCESS)
    25692575                {
     
    25762582            {
    25772583                Log(("LoadStackFromTss32Or16: out of bounds! uCpl=%d, u32Limit=%#x TSS16\n", uCpl, pCtx->tr.u32Limit));
    2578                 rcStrict = iemRaiseTaskSwitchFaultCurrentTSS(pIemCpu);
     2584                rcStrict = iemRaiseTaskSwitchFaultCurrentTSS(pVCpu);
    25792585            }
    25802586            break;
     
    25972603 *
    25982604 * @returns VBox strict status code.
    2599  * @param   pIemCpu         The IEM per CPU instance data.
     2605 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    26002606 * @param   pCtx            The CPU context.
    26012607 * @param   uCpl            The CPL to load the stack for.
     
    26032609 * @param   puRsp           Where to return the new stack pointer.
    26042610 */
    2605 IEM_STATIC VBOXSTRICTRC iemRaiseLoadStackFromTss64(PIEMCPU pIemCpu, PCCPUMCTX pCtx, uint8_t uCpl, uint8_t uIst, uint64_t *puRsp)
     2611IEM_STATIC VBOXSTRICTRC iemRaiseLoadStackFromTss64(PVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t uCpl, uint8_t uIst, uint64_t *puRsp)
    26062612{
    26072613    Assert(uCpl < 4);
     
    26192625    {
    26202626        Log(("iemRaiseLoadStackFromTss64: out of bounds! uCpl=%d uIst=%d, u32Limit=%#x\n", uCpl, uIst, pCtx->tr.u32Limit));
    2621         return iemRaiseTaskSwitchFaultCurrentTSS(pIemCpu);
    2622     }
    2623 
    2624     return iemMemFetchSysU64(pIemCpu, puRsp, UINT8_MAX, pCtx->tr.u64Base + off);
     2627        return iemRaiseTaskSwitchFaultCurrentTSS(pVCpu);
     2628    }
     2629
     2630    return iemMemFetchSysU64(pVCpu, puRsp, UINT8_MAX, pCtx->tr.u64Base + off);
    26252631}
    26262632
     
    26482654 *
    26492655 * @returns VBox strict status code.
    2650  * @param   pIemCpu         The IEM per CPU instance data.
     2656 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    26512657 * @param   pCtx            The CPU context.
    26522658 * @param   cbInstr         The number of bytes to offset rIP by in the return
     
    26582664 */
    26592665IEM_STATIC VBOXSTRICTRC
    2660 iemRaiseXcptOrIntInRealMode(PIEMCPU     pIemCpu,
     2666iemRaiseXcptOrIntInRealMode(PVMCPU      pVCpu,
    26612667                            PCPUMCTX    pCtx,
    26622668                            uint8_t     cbInstr,
     
    26662672                            uint64_t    uCr2)
    26672673{
    2668     AssertReturn(pIemCpu->enmCpuMode == IEMMODE_16BIT, VERR_IEM_IPE_6);
     2674    AssertReturn(pVCpu->iem.s.enmCpuMode == IEMMODE_16BIT, VERR_IEM_IPE_6);
    26692675    NOREF(uErr); NOREF(uCr2);
    26702676
     
    26752681    {
    26762682        Log(("RaiseXcptOrIntInRealMode: %#x is out of bounds (%#x)\n", u8Vector, pCtx->idtr.cbIdt));
    2677         return iemRaiseGeneralProtectionFault(pIemCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
     2683        return iemRaiseGeneralProtectionFault(pVCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
    26782684    }
    26792685    RTFAR16 Idte;
    2680     VBOXSTRICTRC rcStrict = iemMemFetchDataU32(pIemCpu, (uint32_t *)&Idte, UINT8_MAX,
    2681                                                pCtx->idtr.pIdt + UINT32_C(4) * u8Vector);
     2686    VBOXSTRICTRC rcStrict = iemMemFetchDataU32(pVCpu, (uint32_t *)&Idte, UINT8_MAX, pCtx->idtr.pIdt + UINT32_C(4) * u8Vector);
    26822687    if (RT_UNLIKELY(rcStrict != VINF_SUCCESS))
    26832688        return rcStrict;
     
    26882693    uint16_t *pu16Frame;
    26892694    uint64_t  uNewRsp;
    2690     rcStrict = iemMemStackPushBeginSpecial(pIemCpu, 6, (void **)&pu16Frame, &uNewRsp);
     2695    rcStrict = iemMemStackPushBeginSpecial(pVCpu, 6, (void **)&pu16Frame, &uNewRsp);
    26912696    if (rcStrict != VINF_SUCCESS)
    26922697        return rcStrict;
    26932698
    2694     uint32_t fEfl = IEMMISC_GET_EFL(pIemCpu, pCtx);
     2699    uint32_t fEfl = IEMMISC_GET_EFL(pVCpu, pCtx);
    26952700#if IEM_CFG_TARGET_CPU == IEMTARGETCPU_DYNAMIC
    26962701    AssertCompile(IEMTARGETCPU_8086 <= IEMTARGETCPU_186 && IEMTARGETCPU_V20 <= IEMTARGETCPU_186 && IEMTARGETCPU_286 > IEMTARGETCPU_186);
    2697     if (pIemCpu->uTargetCpu <= IEMTARGETCPU_186)
     2702    if (pVCpu->iem.s.uTargetCpu <= IEMTARGETCPU_186)
    26982703        fEfl |= UINT16_C(0xf000);
    26992704#endif
     
    27012706    pu16Frame[1] = (uint16_t)pCtx->cs.Sel;
    27022707    pu16Frame[0] = (fFlags & IEM_XCPT_FLAGS_T_SOFT_INT) ? pCtx->ip + cbInstr : pCtx->ip;
    2703     rcStrict = iemMemStackPushCommitSpecial(pIemCpu, pu16Frame, uNewRsp);
     2708    rcStrict = iemMemStackPushCommitSpecial(pVCpu, pu16Frame, uNewRsp);
    27042709    if (RT_UNLIKELY(rcStrict != VINF_SUCCESS))
    27052710        return rcStrict;
     
    27162721    pCtx->rip              = Idte.off;
    27172722    fEfl &= ~X86_EFL_IF;
    2718     IEMMISC_SET_EFL(pIemCpu, pCtx, fEfl);
     2723    IEMMISC_SET_EFL(pVCpu, pCtx, fEfl);
    27192724
    27202725    /** @todo do we actually do this in real mode? */
     
    27292734 * Loads a NULL data selector into when coming from V8086 mode.
    27302735 *
    2731  * @param   pIemCpu         The IEM per CPU instance data.
     2736 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    27322737 * @param   pSReg           Pointer to the segment register.
    27332738 */
    2734 IEM_STATIC void iemHlpLoadNullDataSelectorOnV86Xcpt(PIEMCPU pIemCpu, PCPUMSELREG pSReg)
     2739IEM_STATIC void iemHlpLoadNullDataSelectorOnV86Xcpt(PVMCPU pVCpu, PCPUMSELREG pSReg)
    27352740{
    27362741    pSReg->Sel      = 0;
    27372742    pSReg->ValidSel = 0;
    2738     if (IEM_IS_GUEST_CPU_INTEL(pIemCpu) && !IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu))
     2743    if (IEM_IS_GUEST_CPU_INTEL(pVCpu) && !IEM_FULL_VERIFICATION_REM_ENABLED(pVCpu))
    27392744    {
    27402745        /* VT-x (Intel 3960x) doesn't change the base and limit, clears and sets the following attributes */
     
    27552760 * Loads a segment selector during a task switch in V8086 mode.
    27562761 *
    2757  * @param   pIemCpu         The IEM per CPU instance data.
     2762 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    27582763 * @param   pSReg           Pointer to the segment register.
    27592764 * @param   uSel            The selector value to load.
    27602765 */
    2761 IEM_STATIC void iemHlpLoadSelectorInV86Mode(PIEMCPU pIemCpu, PCPUMSELREG pSReg, uint16_t uSel)
     2766IEM_STATIC void iemHlpLoadSelectorInV86Mode(PVMCPU pVCpu, PCPUMSELREG pSReg, uint16_t uSel)
    27622767{
    27632768    /* See Intel spec. 26.3.1.2 "Checks on Guest Segment Registers". */
     
    27752780 * visible parts, in protected mode.
    27762781 *
    2777  * @param   pIemCpu             The IEM state of the calling EMT.
     2782 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    27782783 * @param   pSReg               Pointer to the segment register.
    27792784 * @param   uRpl                The RPL.
    27802785 */
    2781 IEM_STATIC void iemHlpLoadNullDataSelectorProt(PIEMCPU pIemCpu, PCPUMSELREG pSReg, RTSEL uRpl)
     2786IEM_STATIC void iemHlpLoadNullDataSelectorProt(PVMCPU pVCpu, PCPUMSELREG pSReg, RTSEL uRpl)
    27822787{
    27832788    /** @todo Testcase: write a testcase checking what happends when loading a NULL
     
    27862791    pSReg->ValidSel = uRpl;
    27872792    pSReg->fFlags   = CPUMSELREG_FLAGS_VALID;
    2788     if (IEM_IS_GUEST_CPU_INTEL(pIemCpu) && !IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu))
     2793    if (IEM_IS_GUEST_CPU_INTEL(pVCpu) && !IEM_FULL_VERIFICATION_REM_ENABLED(pVCpu))
    27892794    {
    27902795        /* VT-x (Intel 3960x) observed doing something like this. */
    2791         pSReg->Attr.u   = X86DESCATTR_UNUSABLE | X86DESCATTR_G | X86DESCATTR_D | (pIemCpu->uCpl << X86DESCATTR_DPL_SHIFT);
     2796        pSReg->Attr.u   = X86DESCATTR_UNUSABLE | X86DESCATTR_G | X86DESCATTR_D | (pVCpu->iem.s.uCpl << X86DESCATTR_DPL_SHIFT);
    27922797        pSReg->u32Limit = UINT32_MAX;
    27932798        pSReg->u64Base  = 0;
     
    28092814 *
    28102815 * @returns VBox strict status code.
    2811  * @param   pIemCpu         The IEM per CPU instance data.
     2816 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    28122817 * @param   pSReg           Pointer to the segment register.
    28132818 * @param   uSel            The new selector value.
    28142819 *
    28152820 * @remarks This does _not_ handle CS or SS.
    2816  * @remarks This expects pIemCpu->uCpl to be up to date.
    2817  */
    2818 IEM_STATIC VBOXSTRICTRC iemHlpTaskSwitchLoadDataSelectorInProtMode(PIEMCPU pIemCpu, PCPUMSELREG pSReg, uint16_t uSel)
    2819 {
    2820     Assert(pIemCpu->enmCpuMode != IEMMODE_64BIT);
     2821 * @remarks This expects pVCpu->iem.s.uCpl to be up to date.
     2822 */
     2823IEM_STATIC VBOXSTRICTRC iemHlpTaskSwitchLoadDataSelectorInProtMode(PVMCPU pVCpu, PCPUMSELREG pSReg, uint16_t uSel)
     2824{
     2825    Assert(pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT);
    28212826
    28222827    /* Null data selector. */
    28232828    if (!(uSel & X86_SEL_MASK_OFF_RPL))
    28242829    {
    2825         iemHlpLoadNullDataSelectorProt(pIemCpu, pSReg, uSel);
    2826         Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg));
    2827         CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_HIDDEN_SEL_REGS);
     2830        iemHlpLoadNullDataSelectorProt(pVCpu, pSReg, uSel);
     2831        Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, pSReg));
     2832        CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_HIDDEN_SEL_REGS);
    28282833        return VINF_SUCCESS;
    28292834    }
     
    28312836    /* Fetch the descriptor. */
    28322837    IEMSELDESC Desc;
    2833     VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uSel, X86_XCPT_TS);
     2838    VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pVCpu, &Desc, uSel, X86_XCPT_TS);
    28342839    if (rcStrict != VINF_SUCCESS)
    28352840    {
     
    28452850        Log(("iemHlpTaskSwitchLoadDataSelectorInProtMode: invalid segment type. uSel=%u Desc.u4Type=%#x\n", uSel,
    28462851             Desc.Legacy.Gen.u4Type));
    2847         return iemRaiseTaskSwitchFaultWithErr(pIemCpu, uSel & X86_SEL_MASK_OFF_RPL);
     2852        return iemRaiseTaskSwitchFaultWithErr(pVCpu, uSel & X86_SEL_MASK_OFF_RPL);
    28482853    }
    28492854
     
    28542859        /* The RPL and the new CPL must be less than or equal to the DPL. */
    28552860        if (   (unsigned)(uSel & X86_SEL_RPL) > Desc.Legacy.Gen.u2Dpl
    2856             || (pIemCpu->uCpl > Desc.Legacy.Gen.u2Dpl))
     2861            || (pVCpu->iem.s.uCpl > Desc.Legacy.Gen.u2Dpl))
    28572862        {
    28582863            Log(("iemHlpTaskSwitchLoadDataSelectorInProtMode: Invalid priv. uSel=%u uSel.RPL=%u DPL=%u CPL=%u\n",
    2859                  uSel, (uSel & X86_SEL_RPL), Desc.Legacy.Gen.u2Dpl, pIemCpu->uCpl));
    2860             return iemRaiseTaskSwitchFaultWithErr(pIemCpu, uSel & X86_SEL_MASK_OFF_RPL);
     2864                 uSel, (uSel & X86_SEL_RPL), Desc.Legacy.Gen.u2Dpl, pVCpu->iem.s.uCpl));
     2865            return iemRaiseTaskSwitchFaultWithErr(pVCpu, uSel & X86_SEL_MASK_OFF_RPL);
    28612866        }
    28622867    }
     
    28662871    {
    28672872        Log(("iemHlpTaskSwitchLoadDataSelectorInProtMode: Segment not present. uSel=%u\n", uSel));
    2868         return iemRaiseSelectorNotPresentWithErr(pIemCpu, uSel & X86_SEL_MASK_OFF_RPL);
     2873        return iemRaiseSelectorNotPresentWithErr(pVCpu, uSel & X86_SEL_MASK_OFF_RPL);
    28692874    }
    28702875
     
    28792884    if (!(Desc.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    28802885    {
    2881         rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uSel);
     2886        rcStrict = iemMemMarkSelDescAccessed(pVCpu, uSel);
    28822887        if (rcStrict != VINF_SUCCESS)
    28832888            return rcStrict;
     
    28922897    pSReg->ValidSel = uSel;
    28932898    pSReg->fFlags   = CPUMSELREG_FLAGS_VALID;
    2894     if (IEM_IS_GUEST_CPU_INTEL(pIemCpu) && !IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu))
     2899    if (IEM_IS_GUEST_CPU_INTEL(pVCpu) && !IEM_FULL_VERIFICATION_REM_ENABLED(pVCpu))
    28952900        pSReg->Attr.u &= ~X86DESCATTR_UNUSABLE;
    28962901
    2897     Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg));
    2898     CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_HIDDEN_SEL_REGS);
     2902    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, pSReg));
     2903    CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_HIDDEN_SEL_REGS);
    28992904    return VINF_SUCCESS;
    29002905}
     
    29142919 *
    29152920 * @returns VBox strict status code.
    2916  * @param   pIemCpu         The IEM per CPU instance data.
     2921 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    29172922 * @param   pCtx            The CPU context.
    29182923 * @param   enmTaskSwitch   What caused this task switch.
     
    29252930 */
    29262931IEM_STATIC VBOXSTRICTRC
    2927 iemTaskSwitch(PIEMCPU         pIemCpu,
     2932iemTaskSwitch(PVMCPU          pVCpu,
    29282933              PCPUMCTX        pCtx,
    29292934              IEMTASKSWITCH   enmTaskSwitch,
     
    29352940              PIEMSELDESC     pNewDescTSS)
    29362941{
    2937     Assert(!IEM_IS_REAL_MODE(pIemCpu));
    2938     Assert(pIemCpu->enmCpuMode != IEMMODE_64BIT);
     2942    Assert(!IEM_IS_REAL_MODE(pVCpu));
     2943    Assert(pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT);
    29392944
    29402945    uint32_t const uNewTSSType = pNewDescTSS->Legacy.Gate.u4Type;
     
    29662971        Log(("iemTaskSwitch: Invalid new TSS limit. enmTaskSwitch=%u uNewTSSLimit=%#x uNewTSSLimitMin=%#x -> #TS\n",
    29672972             enmTaskSwitch, uNewTSSLimit, uNewTSSLimitMin));
    2968         return iemRaiseTaskSwitchFaultWithErr(pIemCpu, SelTSS & X86_SEL_MASK_OFF_RPL);
     2973        return iemRaiseTaskSwitchFaultWithErr(pVCpu, SelTSS & X86_SEL_MASK_OFF_RPL);
    29692974    }
    29702975
     
    29832988        Log(("iemTaskSwitch: Invalid current TSS limit. enmTaskSwitch=%u uCurTSSLimit=%#x uCurTSSLimitMin=%#x -> #TS\n",
    29842989             enmTaskSwitch, uCurTSSLimit, uCurTSSLimitMin));
    2985         return iemRaiseTaskSwitchFaultWithErr(pIemCpu, SelTSS & X86_SEL_MASK_OFF_RPL);
     2990        return iemRaiseTaskSwitchFaultWithErr(pVCpu, SelTSS & X86_SEL_MASK_OFF_RPL);
    29862991    }
    29872992
     
    29973002     *        not perform correct translation if this happens. See Intel spec. 7.2.1
    29983003     *        "Task-State Segment" */
    2999     VBOXSTRICTRC rcStrict = iemMemMap(pIemCpu, &pvNewTSS, cbNewTSS, UINT8_MAX, GCPtrNewTSS, IEM_ACCESS_SYS_RW);
     3004    VBOXSTRICTRC rcStrict = iemMemMap(pVCpu, &pvNewTSS, cbNewTSS, UINT8_MAX, GCPtrNewTSS, IEM_ACCESS_SYS_RW);
    30003005    if (rcStrict != VINF_SUCCESS)
    30013006    {
     
    30133018    {
    30143019        PX86DESC pDescCurTSS;
    3015         rcStrict = iemMemMap(pIemCpu, (void **)&pDescCurTSS, sizeof(*pDescCurTSS), UINT8_MAX,
     3020        rcStrict = iemMemMap(pVCpu, (void **)&pDescCurTSS, sizeof(*pDescCurTSS), UINT8_MAX,
    30163021                             pCtx->gdtr.pGdt + (pCtx->tr.Sel & X86_SEL_MASK), IEM_ACCESS_SYS_RW);
    30173022        if (rcStrict != VINF_SUCCESS)
     
    30233028
    30243029        pDescCurTSS->Gate.u4Type &= ~X86_SEL_TYPE_SYS_TSS_BUSY_MASK;
    3025         rcStrict = iemMemCommitAndUnmap(pIemCpu, pDescCurTSS, IEM_ACCESS_SYS_RW);
     3030        rcStrict = iemMemCommitAndUnmap(pVCpu, pDescCurTSS, IEM_ACCESS_SYS_RW);
    30263031        if (rcStrict != VINF_SUCCESS)
    30273032        {
     
    30603065        uint32_t cbCurTSS  = RT_OFFSETOF(X86TSS32, selLdt) - RT_OFFSETOF(X86TSS32, eip);
    30613066        AssertCompile(RTASSERT_OFFSET_OF(X86TSS32, selLdt) - RTASSERT_OFFSET_OF(X86TSS32, eip) == 64);
    3062         rcStrict = iemMemMap(pIemCpu, &pvCurTSS32, cbCurTSS, UINT8_MAX, GCPtrCurTSS + offCurTSS, IEM_ACCESS_SYS_RW);
     3067        rcStrict = iemMemMap(pVCpu, &pvCurTSS32, cbCurTSS, UINT8_MAX, GCPtrCurTSS + offCurTSS, IEM_ACCESS_SYS_RW);
    30633068        if (rcStrict != VINF_SUCCESS)
    30643069        {
     
    30873092        pCurTSS32->gs     = pCtx->gs.Sel;
    30883093
    3089         rcStrict = iemMemCommitAndUnmap(pIemCpu, pvCurTSS32, IEM_ACCESS_SYS_RW);
     3094        rcStrict = iemMemCommitAndUnmap(pVCpu, pvCurTSS32, IEM_ACCESS_SYS_RW);
    30903095        if (rcStrict != VINF_SUCCESS)
    30913096        {
     
    31043109        uint32_t cbCurTSS  = RT_OFFSETOF(X86TSS16, selLdt) - RT_OFFSETOF(X86TSS16, ip);
    31053110        AssertCompile(RTASSERT_OFFSET_OF(X86TSS16, selLdt) - RTASSERT_OFFSET_OF(X86TSS16, ip) == 28);
    3106         rcStrict = iemMemMap(pIemCpu, &pvCurTSS16, cbCurTSS, UINT8_MAX, GCPtrCurTSS + offCurTSS, IEM_ACCESS_SYS_RW);
     3111        rcStrict = iemMemMap(pVCpu, &pvCurTSS16, cbCurTSS, UINT8_MAX, GCPtrCurTSS + offCurTSS, IEM_ACCESS_SYS_RW);
    31073112        if (rcStrict != VINF_SUCCESS)
    31083113        {
     
    31293134        pCurTSS16->ds    = pCtx->ds.Sel;
    31303135
    3131         rcStrict = iemMemCommitAndUnmap(pIemCpu, pvCurTSS16, IEM_ACCESS_SYS_RW);
     3136        rcStrict = iemMemCommitAndUnmap(pVCpu, pvCurTSS16, IEM_ACCESS_SYS_RW);
    31323137        if (rcStrict != VINF_SUCCESS)
    31333138        {
     
    32103215     * We're done accessing the new TSS.
    32113216     */
    3212     rcStrict = iemMemCommitAndUnmap(pIemCpu, pvNewTSS, IEM_ACCESS_SYS_RW);
     3217    rcStrict = iemMemCommitAndUnmap(pVCpu, pvNewTSS, IEM_ACCESS_SYS_RW);
    32133218    if (rcStrict != VINF_SUCCESS)
    32143219    {
     
    32223227    if (enmTaskSwitch != IEMTASKSWITCH_IRET)
    32233228    {
    3224         rcStrict = iemMemMap(pIemCpu, (void **)&pNewDescTSS, sizeof(*pNewDescTSS), UINT8_MAX,
     3229        rcStrict = iemMemMap(pVCpu, (void **)&pNewDescTSS, sizeof(*pNewDescTSS), UINT8_MAX,
    32253230                             pCtx->gdtr.pGdt + (SelTSS & X86_SEL_MASK), IEM_ACCESS_SYS_RW);
    32263231        if (rcStrict != VINF_SUCCESS)
     
    32373242
    32383243        pNewDescTSS->Legacy.Gate.u4Type |= X86_SEL_TYPE_SYS_TSS_BUSY_MASK;
    3239         rcStrict = iemMemCommitAndUnmap(pIemCpu, pNewDescTSS, IEM_ACCESS_SYS_RW);
     3244        rcStrict = iemMemCommitAndUnmap(pVCpu, pNewDescTSS, IEM_ACCESS_SYS_RW);
    32403245        if (rcStrict != VINF_SUCCESS)
    32413246        {
     
    32563261    pCtx->tr.u32Limit = X86DESC_LIMIT_G(&pNewDescTSS->Legacy);
    32573262    pCtx->tr.u64Base  = X86DESC_BASE(&pNewDescTSS->Legacy);
    3258     CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_TR);
     3263    CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_TR);
    32593264
    32603265    /* Set the busy bit in TR. */
     
    32693274    pCtx->dr[7] &= ~X86_DR7_LE_ALL;     /** @todo Should we clear DR7.LE bit too? */
    32703275    pCtx->cr0   |= X86_CR0_TS;
    3271     CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_CR0);
     3276    CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_CR0);
    32723277
    32733278    pCtx->eip    = uNewEip;
     
    32833288    uNewEflags &= X86_EFL_LIVE_MASK;
    32843289    uNewEflags |= X86_EFL_RA1_MASK;
    3285     IEMMISC_SET_EFL(pIemCpu, pCtx, uNewEflags);
     3290    IEMMISC_SET_EFL(pVCpu, pCtx, uNewEflags);
    32863291
    32873292    /*
     
    33133318    pCtx->gs.fFlags    = CPUMSELREG_FLAGS_STALE;
    33143319    pCtx->gs.Attr.u   &= ~X86DESCATTR_P;
    3315     CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_HIDDEN_SEL_REGS);
     3320    CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_HIDDEN_SEL_REGS);
    33163321
    33173322    pCtx->ldtr.Sel     = uNewLdt;
    33183323    pCtx->ldtr.fFlags  = CPUMSELREG_FLAGS_STALE;
    33193324    pCtx->ldtr.Attr.u &= ~X86DESCATTR_P;
    3320     CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_LDTR);
    3321 
    3322     if (IEM_IS_GUEST_CPU_INTEL(pIemCpu) && !IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu))
     3325    CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_LDTR);
     3326
     3327    if (IEM_IS_GUEST_CPU_INTEL(pVCpu) && !IEM_FULL_VERIFICATION_REM_ENABLED(pVCpu))
    33233328    {
    33243329        pCtx->es.Attr.u   |= X86DESCATTR_UNUSABLE;
     
    33383343    {
    33393344        /** @todo Should we update and flush TLBs only if CR3 value actually changes? */
    3340         if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
     3345        if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
    33413346        {
    3342             int rc = CPUMSetGuestCR3(IEMCPU_TO_VMCPU(pIemCpu), uNewCr3);
     3347            int rc = CPUMSetGuestCR3(pVCpu, uNewCr3);
    33433348            AssertRCSuccessReturn(rc, rc);
    33443349        }
     
    33473352
    33483353        /* Inform PGM. */
    3349         if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
     3354        if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
    33503355        {
    3351             int rc = PGMFlushTLB(IEMCPU_TO_VMCPU(pIemCpu), pCtx->cr3, !(pCtx->cr4 & X86_CR4_PGE));
     3356            int rc = PGMFlushTLB(pVCpu, pCtx->cr3, !(pCtx->cr4 & X86_CR4_PGE));
    33523357            AssertRCReturn(rc, rc);
    33533358            /* ignore informational status codes */
    33543359        }
    3355         CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_CR3);
     3360        CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_CR3);
    33563361    }
    33573362
     
    33603365     */
    33613366    if (!(uNewLdt & X86_SEL_MASK_OFF_RPL))
    3362         iemHlpLoadNullDataSelectorProt(pIemCpu, &pCtx->ldtr, uNewLdt);
     3367        iemHlpLoadNullDataSelectorProt(pVCpu, &pCtx->ldtr, uNewLdt);
    33633368    else
    33643369    {
     
    33663371
    33673372        IEMSELDESC DescNewLdt;
    3368         rcStrict = iemMemFetchSelDesc(pIemCpu, &DescNewLdt, uNewLdt, X86_XCPT_TS);
     3373        rcStrict = iemMemFetchSelDesc(pVCpu, &DescNewLdt, uNewLdt, X86_XCPT_TS);
    33693374        if (rcStrict != VINF_SUCCESS)
    33703375        {
     
    33793384            Log(("iemTaskSwitch: Invalid LDT. enmTaskSwitch=%u uNewLdt=%u DescNewLdt.Legacy.u=%#RX64 -> #TS\n", enmTaskSwitch,
    33803385                 uNewLdt, DescNewLdt.Legacy.u));
    3381             return iemRaiseTaskSwitchFaultWithErr(pIemCpu, uNewLdt & X86_SEL_MASK_OFF_RPL);
     3386            return iemRaiseTaskSwitchFaultWithErr(pVCpu, uNewLdt & X86_SEL_MASK_OFF_RPL);
    33823387        }
    33833388
     
    33873392        pCtx->ldtr.u32Limit = X86DESC_LIMIT_G(&DescNewLdt.Legacy);
    33883393        pCtx->ldtr.Attr.u   = X86DESC_GET_HID_ATTR(&DescNewLdt.Legacy);
    3389         if (IEM_IS_GUEST_CPU_INTEL(pIemCpu) && !IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu))
     3394        if (IEM_IS_GUEST_CPU_INTEL(pVCpu) && !IEM_FULL_VERIFICATION_REM_ENABLED(pVCpu))
    33903395            pCtx->ldtr.Attr.u &= ~X86DESCATTR_UNUSABLE;
    3391         Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), &pCtx->ldtr));
     3396        Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->ldtr));
    33923397    }
    33933398
    33943399    IEMSELDESC DescSS;
    3395     if (IEM_IS_V86_MODE(pIemCpu))
    3396     {
    3397         pIemCpu->uCpl = 3;
    3398         iemHlpLoadSelectorInV86Mode(pIemCpu, &pCtx->es, uNewES);
    3399         iemHlpLoadSelectorInV86Mode(pIemCpu, &pCtx->cs, uNewCS);
    3400         iemHlpLoadSelectorInV86Mode(pIemCpu, &pCtx->ss, uNewSS);
    3401         iemHlpLoadSelectorInV86Mode(pIemCpu, &pCtx->ds, uNewDS);
    3402         iemHlpLoadSelectorInV86Mode(pIemCpu, &pCtx->fs, uNewFS);
    3403         iemHlpLoadSelectorInV86Mode(pIemCpu, &pCtx->gs, uNewGS);
     3400    if (IEM_IS_V86_MODE(pVCpu))
     3401    {
     3402        pVCpu->iem.s.uCpl = 3;
     3403        iemHlpLoadSelectorInV86Mode(pVCpu, &pCtx->es, uNewES);
     3404        iemHlpLoadSelectorInV86Mode(pVCpu, &pCtx->cs, uNewCS);
     3405        iemHlpLoadSelectorInV86Mode(pVCpu, &pCtx->ss, uNewSS);
     3406        iemHlpLoadSelectorInV86Mode(pVCpu, &pCtx->ds, uNewDS);
     3407        iemHlpLoadSelectorInV86Mode(pVCpu, &pCtx->fs, uNewFS);
     3408        iemHlpLoadSelectorInV86Mode(pVCpu, &pCtx->gs, uNewGS);
    34043409    }
    34053410    else
     
    34133418        {
    34143419            Log(("iemTaskSwitch: Null stack segment. enmTaskSwitch=%u uNewSS=%#x -> #TS\n", enmTaskSwitch, uNewSS));
    3415             return iemRaiseTaskSwitchFaultWithErr(pIemCpu, uNewSS & X86_SEL_MASK_OFF_RPL);
     3420            return iemRaiseTaskSwitchFaultWithErr(pVCpu, uNewSS & X86_SEL_MASK_OFF_RPL);
    34163421        }
    34173422
    34183423        /* Fetch the descriptor. */
    3419         rcStrict = iemMemFetchSelDesc(pIemCpu, &DescSS, uNewSS, X86_XCPT_TS);
     3424        rcStrict = iemMemFetchSelDesc(pVCpu, &DescSS, uNewSS, X86_XCPT_TS);
    34203425        if (rcStrict != VINF_SUCCESS)
    34213426        {
     
    34323437            Log(("iemTaskSwitch: SS invalid descriptor type. uNewSS=%#x u1DescType=%u u4Type=%#x\n",
    34333438                 uNewSS, DescSS.Legacy.Gen.u1DescType, DescSS.Legacy.Gen.u4Type));
    3434             return iemRaiseTaskSwitchFaultWithErr(pIemCpu, uNewSS & X86_SEL_MASK_OFF_RPL);
     3439            return iemRaiseTaskSwitchFaultWithErr(pVCpu, uNewSS & X86_SEL_MASK_OFF_RPL);
    34353440        }
    34363441
     
    34413446            Log(("iemTaskSwitch: Invalid priv. for SS. uNewSS=%#x SS.DPL=%u uNewCpl=%u -> #TS\n", uNewSS, DescSS.Legacy.Gen.u2Dpl,
    34423447                 uNewCpl));
    3443             return iemRaiseTaskSwitchFaultWithErr(pIemCpu, uNewSS & X86_SEL_MASK_OFF_RPL);
     3448            return iemRaiseTaskSwitchFaultWithErr(pVCpu, uNewSS & X86_SEL_MASK_OFF_RPL);
    34443449        }
    34453450
     
    34483453        {
    34493454            Log(("iemTaskSwitch: SS not present. uNewSS=%#x -> #NP\n", uNewSS));
    3450             return iemRaiseSelectorNotPresentWithErr(pIemCpu, uNewSS & X86_SEL_MASK_OFF_RPL);
     3455            return iemRaiseSelectorNotPresentWithErr(pVCpu, uNewSS & X86_SEL_MASK_OFF_RPL);
    34513456        }
    34523457
     
    34573462        if (!(DescSS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    34583463        {
    3459             rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewSS);
     3464            rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewSS);
    34603465            if (rcStrict != VINF_SUCCESS)
    34613466                return rcStrict;
     
    34703475        pCtx->ss.u64Base  = u64Base;
    34713476        pCtx->ss.fFlags   = CPUMSELREG_FLAGS_VALID;
    3472         Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), &pCtx->ss));
     3477        Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->ss));
    34733478
    34743479        /* CPL has changed, update IEM before loading rest of segments. */
    3475         pIemCpu->uCpl = uNewCpl;
     3480        pVCpu->iem.s.uCpl = uNewCpl;
    34763481
    34773482        /*
    34783483         * Load the data segments for the new task.
    34793484         */
    3480         rcStrict = iemHlpTaskSwitchLoadDataSelectorInProtMode(pIemCpu, &pCtx->es, uNewES);
     3485        rcStrict = iemHlpTaskSwitchLoadDataSelectorInProtMode(pVCpu, &pCtx->es, uNewES);
    34813486        if (rcStrict != VINF_SUCCESS)
    34823487            return rcStrict;
    3483         rcStrict = iemHlpTaskSwitchLoadDataSelectorInProtMode(pIemCpu, &pCtx->ds, uNewDS);
     3488        rcStrict = iemHlpTaskSwitchLoadDataSelectorInProtMode(pVCpu, &pCtx->ds, uNewDS);
    34843489        if (rcStrict != VINF_SUCCESS)
    34853490            return rcStrict;
    3486         rcStrict = iemHlpTaskSwitchLoadDataSelectorInProtMode(pIemCpu, &pCtx->fs, uNewFS);
     3491        rcStrict = iemHlpTaskSwitchLoadDataSelectorInProtMode(pVCpu, &pCtx->fs, uNewFS);
    34873492        if (rcStrict != VINF_SUCCESS)
    34883493            return rcStrict;
    3489         rcStrict = iemHlpTaskSwitchLoadDataSelectorInProtMode(pIemCpu, &pCtx->gs, uNewGS);
     3494        rcStrict = iemHlpTaskSwitchLoadDataSelectorInProtMode(pVCpu, &pCtx->gs, uNewGS);
    34903495        if (rcStrict != VINF_SUCCESS)
    34913496            return rcStrict;
     
    34973502        {
    34983503            Log(("iemTaskSwitch #TS: Null code segment. enmTaskSwitch=%u uNewCS=%#x\n", enmTaskSwitch, uNewCS));
    3499             return iemRaiseTaskSwitchFaultWithErr(pIemCpu, uNewCS & X86_SEL_MASK_OFF_RPL);
     3504            return iemRaiseTaskSwitchFaultWithErr(pVCpu, uNewCS & X86_SEL_MASK_OFF_RPL);
    35003505        }
    35013506
    35023507        /* Fetch the descriptor. */
    35033508        IEMSELDESC DescCS;
    3504         rcStrict = iemMemFetchSelDesc(pIemCpu, &DescCS, uNewCS, X86_XCPT_TS);
     3509        rcStrict = iemMemFetchSelDesc(pVCpu, &DescCS, uNewCS, X86_XCPT_TS);
    35053510        if (rcStrict != VINF_SUCCESS)
    35063511        {
     
    35153520            Log(("iemTaskSwitch: CS invalid descriptor type. uNewCS=%#x u1DescType=%u u4Type=%#x -> #TS\n", uNewCS,
    35163521                 DescCS.Legacy.Gen.u1DescType, DescCS.Legacy.Gen.u4Type));
    3517             return iemRaiseTaskSwitchFaultWithErr(pIemCpu, uNewCS & X86_SEL_MASK_OFF_RPL);
     3522            return iemRaiseTaskSwitchFaultWithErr(pVCpu, uNewCS & X86_SEL_MASK_OFF_RPL);
    35183523        }
    35193524
     
    35243529            Log(("iemTaskSwitch: confirming CS DPL > RPL. uNewCS=%#x u4Type=%#x DPL=%u -> #TS\n", uNewCS, DescCS.Legacy.Gen.u4Type,
    35253530                 DescCS.Legacy.Gen.u2Dpl));
    3526             return iemRaiseTaskSwitchFaultWithErr(pIemCpu, uNewCS & X86_SEL_MASK_OFF_RPL);
     3531            return iemRaiseTaskSwitchFaultWithErr(pVCpu, uNewCS & X86_SEL_MASK_OFF_RPL);
    35273532        }
    35283533
     
    35333538            Log(("iemTaskSwitch: non-confirming CS DPL RPL mismatch. uNewCS=%#x u4Type=%#x DPL=%u -> #TS\n", uNewCS,
    35343539                 DescCS.Legacy.Gen.u4Type, DescCS.Legacy.Gen.u2Dpl));
    3535             return iemRaiseTaskSwitchFaultWithErr(pIemCpu, uNewCS & X86_SEL_MASK_OFF_RPL);
     3540            return iemRaiseTaskSwitchFaultWithErr(pVCpu, uNewCS & X86_SEL_MASK_OFF_RPL);
    35363541        }
    35373542
     
    35403545        {
    35413546            Log(("iemTaskSwitch: CS not present. uNewCS=%#x -> #NP\n", uNewCS));
    3542             return iemRaiseSelectorNotPresentWithErr(pIemCpu, uNewCS & X86_SEL_MASK_OFF_RPL);
     3547            return iemRaiseSelectorNotPresentWithErr(pVCpu, uNewCS & X86_SEL_MASK_OFF_RPL);
    35433548        }
    35443549
     
    35493554        if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    35503555        {
    3551             rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewCS);
     3556            rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewCS);
    35523557            if (rcStrict != VINF_SUCCESS)
    35533558                return rcStrict;
     
    35623567        pCtx->cs.u64Base  = u64Base;
    35633568        pCtx->cs.fFlags   = CPUMSELREG_FLAGS_VALID;
    3564         Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), &pCtx->cs));
     3569        Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->cs));
    35653570    }
    35663571
     
    36023607                Log(("iemTaskSwitch: SS=%#x ESP=%#x cbStackFrame=%#x is out of bounds -> #SS\n", pCtx->ss.Sel, pCtx->esp,
    36033608                     cbStackFrame));
    3604                 return iemRaiseStackSelectorNotPresentWithErr(pIemCpu, uExt);
     3609                return iemRaiseStackSelectorNotPresentWithErr(pVCpu, uExt);
    36053610            }
    36063611        }
     
    36123617                Log(("iemTaskSwitch: SS=%#x ESP=%#x cbStackFrame=%#x (expand down) is out of bounds -> #SS\n", pCtx->ss.Sel, pCtx->esp,
    36133618                     cbStackFrame));
    3614                 return iemRaiseStackSelectorNotPresentWithErr(pIemCpu, uExt);
     3619                return iemRaiseStackSelectorNotPresentWithErr(pVCpu, uExt);
    36153620            }
    36163621        }
     
    36183623
    36193624        if (fIsNewTSS386)
    3620             rcStrict = iemMemStackPushU32(pIemCpu, uErr);
     3625            rcStrict = iemMemStackPushU32(pVCpu, uErr);
    36213626        else
    3622             rcStrict = iemMemStackPushU16(pIemCpu, uErr);
     3627            rcStrict = iemMemStackPushU16(pVCpu, uErr);
    36233628        if (rcStrict != VINF_SUCCESS)
    36243629        {
     
    36353640             pCtx->eip, pCtx->cs.u32Limit));
    36363641        /** @todo Intel says \#GP(EXT) for INT/XCPT, I couldn't figure out AMD yet. */
    3637         return iemRaiseGeneralProtectionFault(pIemCpu, uExt);
     3642        return iemRaiseGeneralProtectionFault(pVCpu, uExt);
    36383643    }
    36393644
     
    36473652 *
    36483653 * @returns VBox strict status code.
    3649  * @param   pIemCpu         The IEM per CPU instance data.
     3654 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    36503655 * @param   pCtx            The CPU context.
    36513656 * @param   cbInstr         The number of bytes to offset rIP by in the return
     
    36573662 */
    36583663IEM_STATIC VBOXSTRICTRC
    3659 iemRaiseXcptOrIntInProtMode(PIEMCPU     pIemCpu,
     3664iemRaiseXcptOrIntInProtMode(PVMCPU      pVCpu,
    36603665                            PCPUMCTX    pCtx,
    36613666                            uint8_t     cbInstr,
     
    36713676    {
    36723677        Log(("RaiseXcptOrIntInProtMode: %#x is out of bounds (%#x)\n", u8Vector, pCtx->idtr.cbIdt));
    3673         return iemRaiseGeneralProtectionFault(pIemCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
     3678        return iemRaiseGeneralProtectionFault(pVCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
    36743679    }
    36753680    X86DESC Idte;
    3676     VBOXSTRICTRC rcStrict = iemMemFetchSysU64(pIemCpu, &Idte.u, UINT8_MAX,
     3681    VBOXSTRICTRC rcStrict = iemMemFetchSysU64(pVCpu, &Idte.u, UINT8_MAX,
    36773682                                              pCtx->idtr.pIdt + UINT32_C(8) * u8Vector);
    36783683    if (RT_UNLIKELY(rcStrict != VINF_SUCCESS))
     
    36893694    {
    36903695        Log(("RaiseXcptOrIntInProtMode %#x - not system selector (%#x) -> #GP\n", u8Vector, Idte.Gate.u4Type));
    3691         return iemRaiseGeneralProtectionFault(pIemCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
     3696        return iemRaiseGeneralProtectionFault(pVCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
    36923697    }
    36933698    bool     fTaskGate   = false;
     
    37113716             *        esp. call gates. */
    37123717            Log(("RaiseXcptOrIntInProtMode %#x - invalid type (%#x) -> #GP\n", u8Vector, Idte.Gate.u4Type));
    3713             return iemRaiseGeneralProtectionFault(pIemCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
     3718            return iemRaiseGeneralProtectionFault(pVCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
    37143719        }
    37153720
     
    37383743    if (fFlags & IEM_XCPT_FLAGS_T_SOFT_INT)
    37393744    {
    3740         if (pIemCpu->uCpl > Idte.Gate.u2Dpl)
     3745        if (pVCpu->iem.s.uCpl > Idte.Gate.u2Dpl)
    37413746        {
    3742             Log(("RaiseXcptOrIntInProtMode %#x - CPL (%d) > DPL (%d) -> #GP\n", u8Vector, pIemCpu->uCpl, Idte.Gate.u2Dpl));
    3743             return iemRaiseGeneralProtectionFault(pIemCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
     3747            Log(("RaiseXcptOrIntInProtMode %#x - CPL (%d) > DPL (%d) -> #GP\n", u8Vector, pVCpu->iem.s.uCpl, Idte.Gate.u2Dpl));
     3748            return iemRaiseGeneralProtectionFault(pVCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
    37443749        }
    37453750    }
     
    37493754    {
    37503755        Log(("RaiseXcptOrIntInProtMode %#x - not present -> #NP\n", u8Vector));
    3751         return iemRaiseSelectorNotPresentWithErr(pIemCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
     3756        return iemRaiseSelectorNotPresentWithErr(pVCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
    37523757    }
    37533758
     
    37673772         */
    37683773        IEMSELDESC DescTSS;
    3769         rcStrict = iemMemFetchSelDescWithErr(pIemCpu, &DescTSS, SelTSS, X86_XCPT_GP, (SelTSS & uSelMask) | uExt);
     3774        rcStrict = iemMemFetchSelDescWithErr(pVCpu, &DescTSS, SelTSS, X86_XCPT_GP, (SelTSS & uSelMask) | uExt);
    37703775        if (rcStrict != VINF_SUCCESS)
    37713776        {
     
    37823787            Log(("RaiseXcptOrIntInProtMode %#x - TSS selector %#x of task gate not a system descriptor or not available %#RX64\n",
    37833788                 u8Vector, SelTSS, DescTSS.Legacy.au64));
    3784             return iemRaiseGeneralProtectionFault(pIemCpu, (SelTSS & uSelMask) | uExt);
     3789            return iemRaiseGeneralProtectionFault(pVCpu, (SelTSS & uSelMask) | uExt);
    37853790        }
    37863791
     
    37893794        {
    37903795            Log(("RaiseXcptOrIntInProtMode %#x - TSS selector %#x not present %#RX64\n", u8Vector, SelTSS, DescTSS.Legacy.au64));
    3791             return iemRaiseSelectorNotPresentWithErr(pIemCpu, (SelTSS & uSelMask) | uExt);
     3796            return iemRaiseSelectorNotPresentWithErr(pVCpu, (SelTSS & uSelMask) | uExt);
    37923797        }
    37933798
    37943799        /* Do the actual task switch. */
    3795         return iemTaskSwitch(pIemCpu, pCtx, IEMTASKSWITCH_INT_XCPT, pCtx->eip, fFlags, uErr, uCr2, SelTSS, &DescTSS);
     3800        return iemTaskSwitch(pVCpu, pCtx, IEMTASKSWITCH_INT_XCPT, pCtx->eip, fFlags, uErr, uCr2, SelTSS, &DescTSS);
    37963801    }
    37973802
     
    38013806    {
    38023807        Log(("RaiseXcptOrIntInProtMode %#x - CS=%#x -> #GP\n", u8Vector, NewCS));
    3803         return iemRaiseGeneralProtectionFault0(pIemCpu);
     3808        return iemRaiseGeneralProtectionFault0(pVCpu);
    38043809    }
    38053810
    38063811    /* Fetch the descriptor for the new CS. */
    38073812    IEMSELDESC DescCS;
    3808     rcStrict = iemMemFetchSelDesc(pIemCpu, &DescCS, NewCS, X86_XCPT_GP); /** @todo correct exception? */
     3813    rcStrict = iemMemFetchSelDesc(pVCpu, &DescCS, NewCS, X86_XCPT_GP); /** @todo correct exception? */
    38093814    if (rcStrict != VINF_SUCCESS)
    38103815    {
     
    38173822    {
    38183823        Log(("RaiseXcptOrIntInProtMode %#x - CS=%#x - system selector (%#x) -> #GP\n", u8Vector, NewCS, DescCS.Legacy.Gen.u4Type));
    3819         return iemRaiseGeneralProtectionFault(pIemCpu, NewCS & X86_SEL_MASK_OFF_RPL);
     3824        return iemRaiseGeneralProtectionFault(pVCpu, NewCS & X86_SEL_MASK_OFF_RPL);
    38203825    }
    38213826    if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_CODE))
    38223827    {
    38233828        Log(("RaiseXcptOrIntInProtMode %#x - CS=%#x - data selector (%#x) -> #GP\n", u8Vector, NewCS, DescCS.Legacy.Gen.u4Type));
    3824         return iemRaiseGeneralProtectionFault(pIemCpu, NewCS & X86_SEL_MASK_OFF_RPL);
     3829        return iemRaiseGeneralProtectionFault(pVCpu, NewCS & X86_SEL_MASK_OFF_RPL);
    38253830    }
    38263831
     
    38303835     *        same-privilege stack behavior further down.  A testcase would
    38313836     *        be nice. */
    3832     if (DescCS.Legacy.Gen.u2Dpl > pIemCpu->uCpl)
     3837    if (DescCS.Legacy.Gen.u2Dpl > pVCpu->iem.s.uCpl)
    38333838    {
    38343839        Log(("RaiseXcptOrIntInProtMode %#x - CS=%#x - DPL (%d) > CPL (%d) -> #GP\n",
    3835              u8Vector, NewCS, DescCS.Legacy.Gen.u2Dpl, pIemCpu->uCpl));
    3836         return iemRaiseGeneralProtectionFault(pIemCpu, NewCS & X86_SEL_MASK_OFF_RPL);
     3840             u8Vector, NewCS, DescCS.Legacy.Gen.u2Dpl, pVCpu->iem.s.uCpl));
     3841        return iemRaiseGeneralProtectionFault(pVCpu, NewCS & X86_SEL_MASK_OFF_RPL);
    38373842    }
    38383843
     
    38413846    {
    38423847        Log(("RaiseXcptOrIntInProtMode %#x - CS=%#x - segment not present -> #NP\n", u8Vector, NewCS));
    3843         return iemRaiseSelectorNotPresentBySelector(pIemCpu, NewCS);
     3848        return iemRaiseSelectorNotPresentBySelector(pVCpu, NewCS);
    38443849    }
    38453850
     
    38543859        Log(("RaiseXcptOrIntInProtMode %#x - EIP=%#x > cbLimitCS=%#x (CS=%#x) -> #GP(0)\n",
    38553860             u8Vector, uNewEip, cbLimitCS, NewCS));
    3856         return iemRaiseGeneralProtectionFault(pIemCpu, 0);
     3861        return iemRaiseGeneralProtectionFault(pVCpu, 0);
    38573862    }
    38583863
    38593864    /* Calc the flag image to push. */
    3860     uint32_t        fEfl    = IEMMISC_GET_EFL(pIemCpu, pCtx);
     3865    uint32_t        fEfl    = IEMMISC_GET_EFL(pVCpu, pCtx);
    38613866    if (fFlags & (IEM_XCPT_FLAGS_DRx_INSTR_BP | IEM_XCPT_FLAGS_T_SOFT_INT))
    38623867        fEfl &= ~X86_EFL_RF;
    3863     else if (!IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu))
     3868    else if (!IEM_FULL_VERIFICATION_REM_ENABLED(pVCpu))
    38643869        fEfl |= X86_EFL_RF; /* Vagueness is all I've found on this so far... */ /** @todo Automatically pushing EFLAGS.RF. */
    38653870
    38663871    /* From V8086 mode only go to CPL 0. */
    38673872    uint8_t const   uNewCpl = DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_CONF
    3868                             ? pIemCpu->uCpl : DescCS.Legacy.Gen.u2Dpl;
     3873                            ? pVCpu->iem.s.uCpl : DescCS.Legacy.Gen.u2Dpl;
    38693874    if ((fEfl & X86_EFL_VM) && uNewCpl != 0) /** @todo When exactly is this raised? */
    38703875    {
    38713876        Log(("RaiseXcptOrIntInProtMode %#x - CS=%#x - New CPL (%d) != 0 w/ VM=1 -> #GP\n", u8Vector, NewCS, uNewCpl));
    3872         return iemRaiseGeneralProtectionFault(pIemCpu, 0);
     3877        return iemRaiseGeneralProtectionFault(pVCpu, 0);
    38733878    }
    38743879
     
    38773882     * This in turns means validating the new SS and ESP...
    38783883     */
    3879     if (uNewCpl != pIemCpu->uCpl)
     3884    if (uNewCpl != pVCpu->iem.s.uCpl)
    38803885    {
    38813886        RTSEL    NewSS;
    38823887        uint32_t uNewEsp;
    3883         rcStrict = iemRaiseLoadStackFromTss32Or16(pIemCpu, pCtx, uNewCpl, &NewSS, &uNewEsp);
     3888        rcStrict = iemRaiseLoadStackFromTss32Or16(pVCpu, pCtx, uNewCpl, &NewSS, &uNewEsp);
    38843889        if (rcStrict != VINF_SUCCESS)
    38853890            return rcStrict;
    38863891
    38873892        IEMSELDESC DescSS;
    3888         rcStrict = iemMiscValidateNewSS(pIemCpu, pCtx, NewSS, uNewCpl, &DescSS);
     3893        rcStrict = iemMiscValidateNewSS(pVCpu, pCtx, NewSS, uNewCpl, &DescSS);
    38893894        if (rcStrict != VINF_SUCCESS)
    38903895            return rcStrict;
     
    39033908                Log(("RaiseXcptOrIntInProtMode: %#x - SS=%#x ESP=%#x cbStackFrame=%#x is out of bounds -> #GP\n",
    39043909                     u8Vector, NewSS, uNewEsp, cbStackFrame));
    3905                 return iemRaiseSelectorBoundsBySelector(pIemCpu, NewSS);
     3910                return iemRaiseSelectorBoundsBySelector(pVCpu, NewSS);
    39063911            }
    39073912        }
     
    39133918                Log(("RaiseXcptOrIntInProtMode: %#x - SS=%#x ESP=%#x cbStackFrame=%#x (expand down) is out of bounds -> #GP\n",
    39143919                     u8Vector, NewSS, uNewEsp, cbStackFrame));
    3915                 return iemRaiseSelectorBoundsBySelector(pIemCpu, NewSS);
     3920                return iemRaiseSelectorBoundsBySelector(pVCpu, NewSS);
    39163921            }
    39173922        }
     
    39223927
    39233928        /* Set the new CPL so that stack accesses use it. */
    3924         uint8_t const uOldCpl = pIemCpu->uCpl;
    3925         pIemCpu->uCpl = uNewCpl;
     3929        uint8_t const uOldCpl = pVCpu->iem.s.uCpl;
     3930        pVCpu->iem.s.uCpl = uNewCpl;
    39263931
    39273932        /* Create the stack frame. */
    39283933        RTPTRUNION uStackFrame;
    3929         rcStrict = iemMemMap(pIemCpu, &uStackFrame.pv, cbStackFrame, UINT8_MAX,
     3934        rcStrict = iemMemMap(pVCpu, &uStackFrame.pv, cbStackFrame, UINT8_MAX,
    39303935                             uNewEsp - cbStackFrame + X86DESC_BASE(&DescSS.Legacy), IEM_ACCESS_STACK_W | IEM_ACCESS_WHAT_SYS); /* _SYS is a hack ... */
    39313936        if (rcStrict != VINF_SUCCESS)
     
    39683973            }
    39693974        }
    3970         rcStrict = iemMemCommitAndUnmap(pIemCpu, pvStackFrame, IEM_ACCESS_STACK_W | IEM_ACCESS_WHAT_SYS);
     3975        rcStrict = iemMemCommitAndUnmap(pVCpu, pvStackFrame, IEM_ACCESS_STACK_W | IEM_ACCESS_WHAT_SYS);
    39713976        if (rcStrict != VINF_SUCCESS)
    39723977            return rcStrict;
     
    39783983        if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    39793984        {
    3980             rcStrict = iemMemMarkSelDescAccessed(pIemCpu, NewCS);
     3985            rcStrict = iemMemMarkSelDescAccessed(pVCpu, NewCS);
    39813986            if (rcStrict != VINF_SUCCESS)
    39823987                return rcStrict;
     
    39863991        if (!(DescSS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    39873992        {
    3988             rcStrict = iemMemMarkSelDescAccessed(pIemCpu, NewSS);
     3993            rcStrict = iemMemMarkSelDescAccessed(pVCpu, NewSS);
    39893994            if (rcStrict != VINF_SUCCESS)
    39903995                return rcStrict;
     
    40144019        if (fEfl & X86_EFL_VM)
    40154020        {
    4016             iemHlpLoadNullDataSelectorOnV86Xcpt(pIemCpu, &pCtx->gs);
    4017             iemHlpLoadNullDataSelectorOnV86Xcpt(pIemCpu, &pCtx->fs);
    4018             iemHlpLoadNullDataSelectorOnV86Xcpt(pIemCpu, &pCtx->es);
    4019             iemHlpLoadNullDataSelectorOnV86Xcpt(pIemCpu, &pCtx->ds);
     4021            iemHlpLoadNullDataSelectorOnV86Xcpt(pVCpu, &pCtx->gs);
     4022            iemHlpLoadNullDataSelectorOnV86Xcpt(pVCpu, &pCtx->fs);
     4023            iemHlpLoadNullDataSelectorOnV86Xcpt(pVCpu, &pCtx->es);
     4024            iemHlpLoadNullDataSelectorOnV86Xcpt(pVCpu, &pCtx->ds);
    40204025        }
    40214026    }
     
    40284033        RTPTRUNION      uStackFrame;
    40294034        uint8_t const   cbStackFrame = (fFlags & IEM_XCPT_FLAGS_ERR ? 8 : 6) << f32BitGate;
    4030         rcStrict = iemMemStackPushBeginSpecial(pIemCpu, cbStackFrame, &uStackFrame.pv, &uNewRsp);
     4035        rcStrict = iemMemStackPushBeginSpecial(pVCpu, cbStackFrame, &uStackFrame.pv, &uNewRsp);
    40314036        if (rcStrict != VINF_SUCCESS)
    40324037            return rcStrict;
     
    40384043                *uStackFrame.pu32++ = uErr;
    40394044            uStackFrame.pu32[0] = fFlags & IEM_XCPT_FLAGS_T_SOFT_INT ? pCtx->eip + cbInstr : pCtx->eip;
    4040             uStackFrame.pu32[1] = (pCtx->cs.Sel & ~X86_SEL_RPL) | pIemCpu->uCpl;
     4045            uStackFrame.pu32[1] = (pCtx->cs.Sel & ~X86_SEL_RPL) | pVCpu->iem.s.uCpl;
    40414046            uStackFrame.pu32[2] = fEfl;
    40424047        }
     
    40464051                *uStackFrame.pu16++ = uErr;
    40474052            uStackFrame.pu16[0] = fFlags & IEM_XCPT_FLAGS_T_SOFT_INT ? pCtx->eip + cbInstr : pCtx->eip;
    4048             uStackFrame.pu16[1] = (pCtx->cs.Sel & ~X86_SEL_RPL) | pIemCpu->uCpl;
     4053            uStackFrame.pu16[1] = (pCtx->cs.Sel & ~X86_SEL_RPL) | pVCpu->iem.s.uCpl;
    40494054            uStackFrame.pu16[2] = fEfl;
    40504055        }
    4051         rcStrict = iemMemCommitAndUnmap(pIemCpu, pvStackFrame, IEM_ACCESS_STACK_W); /* don't use the commit here */
     4056        rcStrict = iemMemCommitAndUnmap(pVCpu, pvStackFrame, IEM_ACCESS_STACK_W); /* don't use the commit here */
    40524057        if (rcStrict != VINF_SUCCESS)
    40534058            return rcStrict;
     
    40564061        if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    40574062        {
    4058             rcStrict = iemMemMarkSelDescAccessed(pIemCpu, NewCS);
     4063            rcStrict = iemMemMarkSelDescAccessed(pVCpu, NewCS);
    40594064            if (rcStrict != VINF_SUCCESS)
    40604065                return rcStrict;
     
    40784083    pCtx->rip               = uNewEip;  /* (The entire register is modified, see pe16_32 bs3kit tests.) */
    40794084    fEfl &= ~fEflToClear;
    4080     IEMMISC_SET_EFL(pIemCpu, pCtx, fEfl);
     4085    IEMMISC_SET_EFL(pVCpu, pCtx, fEfl);
    40814086
    40824087    if (fFlags & IEM_XCPT_FLAGS_CR2)
     
    40944099 *
    40954100 * @returns VBox strict status code.
    4096  * @param   pIemCpu         The IEM per CPU instance data.
     4101 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    40974102 * @param   pCtx            The CPU context.
    40984103 * @param   cbInstr         The number of bytes to offset rIP by in the return
     
    41044109 */
    41054110IEM_STATIC VBOXSTRICTRC
    4106 iemRaiseXcptOrIntInLongMode(PIEMCPU     pIemCpu,
     4111iemRaiseXcptOrIntInLongMode(PVMCPU      pVCpu,
    41074112                            PCPUMCTX    pCtx,
    41084113                            uint8_t     cbInstr,
     
    41194124    {
    41204125        Log(("iemRaiseXcptOrIntInLongMode: %#x is out of bounds (%#x)\n", u8Vector, pCtx->idtr.cbIdt));
    4121         return iemRaiseGeneralProtectionFault(pIemCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
     4126        return iemRaiseGeneralProtectionFault(pVCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
    41224127    }
    41234128    X86DESC64 Idte;
    4124     VBOXSTRICTRC rcStrict = iemMemFetchSysU64(pIemCpu, &Idte.au64[0], UINT8_MAX, pCtx->idtr.pIdt + offIdt);
     4129    VBOXSTRICTRC rcStrict = iemMemFetchSysU64(pVCpu, &Idte.au64[0], UINT8_MAX, pCtx->idtr.pIdt + offIdt);
    41254130    if (RT_LIKELY(rcStrict == VINF_SUCCESS))
    4126         rcStrict = iemMemFetchSysU64(pIemCpu, &Idte.au64[1], UINT8_MAX, pCtx->idtr.pIdt + offIdt + 8);
     4131        rcStrict = iemMemFetchSysU64(pVCpu, &Idte.au64[1], UINT8_MAX, pCtx->idtr.pIdt + offIdt + 8);
    41274132    if (RT_UNLIKELY(rcStrict != VINF_SUCCESS))
    41284133        return rcStrict;
     
    41384143    {
    41394144        Log(("iemRaiseXcptOrIntInLongMode %#x - not system selector (%#x) -> #GP\n", u8Vector, Idte.Gate.u4Type));
    4140         return iemRaiseGeneralProtectionFault(pIemCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
     4145        return iemRaiseGeneralProtectionFault(pVCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
    41414146    }
    41424147    uint32_t fEflToClear = X86_EFL_TF | X86_EFL_NT | X86_EFL_RF | X86_EFL_VM;
     
    41514156        default:
    41524157            Log(("iemRaiseXcptOrIntInLongMode %#x - invalid type (%#x) -> #GP\n", u8Vector, Idte.Gate.u4Type));
    4153             return iemRaiseGeneralProtectionFault(pIemCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
     4158            return iemRaiseGeneralProtectionFault(pVCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
    41544159    }
    41554160
     
    41574162    if (fFlags & IEM_XCPT_FLAGS_T_SOFT_INT)
    41584163    {
    4159         if (pIemCpu->uCpl > Idte.Gate.u2Dpl)
     4164        if (pVCpu->iem.s.uCpl > Idte.Gate.u2Dpl)
    41604165        {
    4161             Log(("iemRaiseXcptOrIntInLongMode %#x - CPL (%d) > DPL (%d) -> #GP\n", u8Vector, pIemCpu->uCpl, Idte.Gate.u2Dpl));
    4162             return iemRaiseGeneralProtectionFault(pIemCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
     4166            Log(("iemRaiseXcptOrIntInLongMode %#x - CPL (%d) > DPL (%d) -> #GP\n", u8Vector, pVCpu->iem.s.uCpl, Idte.Gate.u2Dpl));
     4167            return iemRaiseGeneralProtectionFault(pVCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
    41634168        }
    41644169    }
     
    41684173    {
    41694174        Log(("iemRaiseXcptOrIntInLongMode %#x - not present -> #NP\n", u8Vector));
    4170         return iemRaiseSelectorNotPresentWithErr(pIemCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
     4175        return iemRaiseSelectorNotPresentWithErr(pVCpu, X86_TRAP_ERR_IDT | ((uint16_t)u8Vector << X86_TRAP_ERR_SEL_SHIFT));
    41714176    }
    41724177
     
    41764181    {
    41774182        Log(("iemRaiseXcptOrIntInLongMode %#x - CS=%#x -> #GP\n", u8Vector, NewCS));
    4178         return iemRaiseGeneralProtectionFault0(pIemCpu);
     4183        return iemRaiseGeneralProtectionFault0(pVCpu);
    41794184    }
    41804185
    41814186    /* Fetch the descriptor for the new CS. */
    41824187    IEMSELDESC DescCS;
    4183     rcStrict = iemMemFetchSelDesc(pIemCpu, &DescCS, NewCS, X86_XCPT_GP);
     4188    rcStrict = iemMemFetchSelDesc(pVCpu, &DescCS, NewCS, X86_XCPT_GP);
    41844189    if (rcStrict != VINF_SUCCESS)
    41854190    {
     
    41924197    {
    41934198        Log(("iemRaiseXcptOrIntInLongMode %#x - CS=%#x - system selector (%#x) -> #GP\n", u8Vector, NewCS, DescCS.Legacy.Gen.u4Type));
    4194         return iemRaiseGeneralProtectionFault(pIemCpu, NewCS & X86_SEL_MASK_OFF_RPL);
     4199        return iemRaiseGeneralProtectionFault(pVCpu, NewCS & X86_SEL_MASK_OFF_RPL);
    41954200    }
    41964201    if (   !DescCS.Long.Gen.u1Long
     
    42004205        Log(("iemRaiseXcptOrIntInLongMode %#x - CS=%#x - not 64-bit code selector (%#x, L=%u, D=%u) -> #GP\n",
    42014206             u8Vector, NewCS, DescCS.Legacy.Gen.u4Type, DescCS.Long.Gen.u1Long, DescCS.Long.Gen.u1DefBig));
    4202         return iemRaiseGeneralProtectionFault(pIemCpu, NewCS & X86_SEL_MASK_OFF_RPL);
     4207        return iemRaiseGeneralProtectionFault(pVCpu, NewCS & X86_SEL_MASK_OFF_RPL);
    42034208    }
    42044209
     
    42094214    /** @todo Testcase: Interrupt handler with CS.DPL=1, interrupt dispatched
    42104215     *        when CPU in Ring-0. Result \#GP?  */
    4211     if (DescCS.Legacy.Gen.u2Dpl > pIemCpu->uCpl)
     4216    if (DescCS.Legacy.Gen.u2Dpl > pVCpu->iem.s.uCpl)
    42124217    {
    42134218        Log(("iemRaiseXcptOrIntInLongMode %#x - CS=%#x - DPL (%d) > CPL (%d) -> #GP\n",
    4214              u8Vector, NewCS, DescCS.Legacy.Gen.u2Dpl, pIemCpu->uCpl));
    4215         return iemRaiseGeneralProtectionFault(pIemCpu, NewCS & X86_SEL_MASK_OFF_RPL);
     4219             u8Vector, NewCS, DescCS.Legacy.Gen.u2Dpl, pVCpu->iem.s.uCpl));
     4220        return iemRaiseGeneralProtectionFault(pVCpu, NewCS & X86_SEL_MASK_OFF_RPL);
    42164221    }
    42174222
     
    42214226    {
    42224227        Log(("iemRaiseXcptOrIntInLongMode %#x - CS=%#x - segment not present -> #NP\n", u8Vector, NewCS));
    4223         return iemRaiseSelectorNotPresentBySelector(pIemCpu, NewCS);
     4228        return iemRaiseSelectorNotPresentBySelector(pVCpu, NewCS);
    42244229    }
    42254230
     
    42314236    {
    42324237        Log(("iemRaiseXcptOrIntInLongMode %#x - RIP=%#RX64 - Not canonical -> #GP(0)\n", u8Vector, uNewRip));
    4233         return iemRaiseGeneralProtectionFault0(pIemCpu);
     4238        return iemRaiseGeneralProtectionFault0(pVCpu);
    42344239    }
    42354240
     
    42404245    uint64_t        uNewRsp;
    42414246    uint8_t const   uNewCpl = DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_CONF
    4242                             ? pIemCpu->uCpl : DescCS.Legacy.Gen.u2Dpl;
    4243     if (   uNewCpl != pIemCpu->uCpl
     4247                            ? pVCpu->iem.s.uCpl : DescCS.Legacy.Gen.u2Dpl;
     4248    if (   uNewCpl != pVCpu->iem.s.uCpl
    42444249        || Idte.Gate.u3IST != 0)
    42454250    {
    4246         rcStrict = iemRaiseLoadStackFromTss64(pIemCpu, pCtx, uNewCpl, Idte.Gate.u3IST, &uNewRsp);
     4251        rcStrict = iemRaiseLoadStackFromTss64(pVCpu, pCtx, uNewCpl, Idte.Gate.u3IST, &uNewRsp);
    42474252        if (rcStrict != VINF_SUCCESS)
    42484253            return rcStrict;
     
    42554260     * Calc the flag image to push.
    42564261     */
    4257     uint32_t        fEfl    = IEMMISC_GET_EFL(pIemCpu, pCtx);
     4262    uint32_t        fEfl    = IEMMISC_GET_EFL(pVCpu, pCtx);
    42584263    if (fFlags & (IEM_XCPT_FLAGS_DRx_INSTR_BP | IEM_XCPT_FLAGS_T_SOFT_INT))
    42594264        fEfl &= ~X86_EFL_RF;
    4260     else if (!IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu))
     4265    else if (!IEM_FULL_VERIFICATION_REM_ENABLED(pVCpu))
    42614266        fEfl |= X86_EFL_RF; /* Vagueness is all I've found on this so far... */ /** @todo Automatically pushing EFLAGS.RF. */
    42624267
     
    42654270     */
    42664271    /* Set the new CPL so that stack accesses use it. */
    4267     uint8_t const uOldCpl = pIemCpu->uCpl;
    4268     pIemCpu->uCpl = uNewCpl;
     4272    uint8_t const uOldCpl = pVCpu->iem.s.uCpl;
     4273    pVCpu->iem.s.uCpl = uNewCpl;
    42694274
    42704275    /* Create the stack frame. */
    42714276    uint32_t   cbStackFrame = sizeof(uint64_t) * (5 + !!(fFlags & IEM_XCPT_FLAGS_ERR));
    42724277    RTPTRUNION uStackFrame;
    4273     rcStrict = iemMemMap(pIemCpu, &uStackFrame.pv, cbStackFrame, UINT8_MAX,
     4278    rcStrict = iemMemMap(pVCpu, &uStackFrame.pv, cbStackFrame, UINT8_MAX,
    42744279                         uNewRsp - cbStackFrame, IEM_ACCESS_STACK_W | IEM_ACCESS_WHAT_SYS); /* _SYS is a hack ... */
    42754280    if (rcStrict != VINF_SUCCESS)
     
    42844289    uStackFrame.pu64[3] = pCtx->rsp;
    42854290    uStackFrame.pu64[4] = pCtx->ss.Sel;
    4286     rcStrict = iemMemCommitAndUnmap(pIemCpu, pvStackFrame, IEM_ACCESS_STACK_W | IEM_ACCESS_WHAT_SYS);
     4291    rcStrict = iemMemCommitAndUnmap(pVCpu, pvStackFrame, IEM_ACCESS_STACK_W | IEM_ACCESS_WHAT_SYS);
    42874292    if (rcStrict != VINF_SUCCESS)
    42884293        return rcStrict;
     
    42944299    if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    42954300    {
    4296         rcStrict = iemMemMarkSelDescAccessed(pIemCpu, NewCS);
     4301        rcStrict = iemMemMarkSelDescAccessed(pVCpu, NewCS);
    42974302        if (rcStrict != VINF_SUCCESS)
    42984303            return rcStrict;
     
    43244329
    43254330    fEfl &= ~fEflToClear;
    4326     IEMMISC_SET_EFL(pIemCpu, pCtx, fEfl);
     4331    IEMMISC_SET_EFL(pVCpu, pCtx, fEfl);
    43274332
    43284333    if (fFlags & IEM_XCPT_FLAGS_CR2)
     
    43424347 *
    43434348 * @returns VBox strict status code.
    4344  * @param   pIemCpu         The IEM per CPU instance data.
     4349 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    43454350 * @param   cbInstr         The number of bytes to offset rIP by in the return
    43464351 *                          address.
     
    43514356 */
    43524357DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC)
    4353 iemRaiseXcptOrInt(PIEMCPU     pIemCpu,
     4358iemRaiseXcptOrInt(PVMCPU      pVCpu,
    43544359                  uint8_t     cbInstr,
    43554360                  uint8_t     u8Vector,
     
    43584363                  uint64_t    uCr2)
    43594364{
    4360     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     4365    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    43614366#ifdef IN_RING0
    4362     int rc = HMR0EnsureCompleteBasicContext(IEMCPU_TO_VMCPU(pIemCpu), pCtx);
     4367    int rc = HMR0EnsureCompleteBasicContext(pVCpu, pCtx);
    43634368    AssertRCReturn(rc, rc);
    43644369#endif
     
    43674372     * Flush prefetch buffer
    43684373     */
    4369     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     4374    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    43704375
    43714376    /*
     
    43834388    }
    43844389#ifdef DBGFTRACE_ENABLED
    4385     RTTraceBufAddMsgF(IEMCPU_TO_VM(pIemCpu)->CTX_SUFF(hTraceBuf), "Xcpt/%u: %02x %u %x %x %llx %04x:%04llx %04x:%04llx",
    4386                       pIemCpu->cXcptRecursions, u8Vector, cbInstr, fFlags, uErr, uCr2,
     4390    RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "Xcpt/%u: %02x %u %x %x %llx %04x:%04llx %04x:%04llx",
     4391                      pVCpu->iem.s.cXcptRecursions, u8Vector, cbInstr, fFlags, uErr, uCr2,
    43874392                      pCtx->cs.Sel, pCtx->rip, pCtx->ss.Sel, pCtx->rsp);
    43884393#endif
     
    43914396     * Do recursion accounting.
    43924397     */
    4393     uint8_t const  uPrevXcpt = pIemCpu->uCurXcpt;
    4394     uint32_t const fPrevXcpt = pIemCpu->fCurXcpt;
    4395     if (pIemCpu->cXcptRecursions == 0)
     4398    uint8_t const  uPrevXcpt = pVCpu->iem.s.uCurXcpt;
     4399    uint32_t const fPrevXcpt = pVCpu->iem.s.fCurXcpt;
     4400    if (pVCpu->iem.s.cXcptRecursions == 0)
    43964401        Log(("iemRaiseXcptOrInt: %#x at %04x:%RGv cbInstr=%#x fFlags=%#x uErr=%#x uCr2=%llx\n",
    43974402             u8Vector, pCtx->cs.Sel, pCtx->rip, cbInstr, fFlags, uErr, uCr2));
     
    43994404    {
    44004405        Log(("iemRaiseXcptOrInt: %#x at %04x:%RGv cbInstr=%#x fFlags=%#x uErr=%#x uCr2=%llx; prev=%#x depth=%d flags=%#x\n",
    4401              u8Vector, pCtx->cs.Sel, pCtx->rip, cbInstr, fFlags, uErr, uCr2, pIemCpu->uCurXcpt, pIemCpu->cXcptRecursions + 1, fPrevXcpt));
     4406             u8Vector, pCtx->cs.Sel, pCtx->rip, cbInstr, fFlags, uErr, uCr2, pVCpu->iem.s.uCurXcpt, pVCpu->iem.s.cXcptRecursions + 1, fPrevXcpt));
    44024407
    44034408        /** @todo double and tripple faults. */
    4404         if (pIemCpu->cXcptRecursions >= 3)
     4409        if (pVCpu->iem.s.cXcptRecursions >= 3)
    44054410        {
    44064411#ifdef DEBUG_bird
     
    44164421        } */
    44174422    }
    4418     pIemCpu->cXcptRecursions++;
    4419     pIemCpu->uCurXcpt = u8Vector;
    4420     pIemCpu->fCurXcpt = fFlags;
     4423    pVCpu->iem.s.cXcptRecursions++;
     4424    pVCpu->iem.s.uCurXcpt = u8Vector;
     4425    pVCpu->iem.s.fCurXcpt = fFlags;
    44214426
    44224427    /*
     
    44264431    if (LogIs3Enabled())
    44274432    {
    4428         PVM     pVM   = IEMCPU_TO_VM(pIemCpu);
    4429         PVMCPU  pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
     4433        PVM     pVM = pVCpu->CTX_SUFF(pVM);
    44304434        char    szRegs[4096];
    44314435        DBGFR3RegPrintf(pVM->pUVM, pVCpu->idCpu, &szRegs[0], sizeof(szRegs),
     
    44694473    VBOXSTRICTRC    rcStrict;
    44704474    if (!(pCtx->cr0 & X86_CR0_PE))
    4471         rcStrict = iemRaiseXcptOrIntInRealMode( pIemCpu, pCtx, cbInstr, u8Vector, fFlags, uErr, uCr2);
     4475        rcStrict = iemRaiseXcptOrIntInRealMode(pVCpu, pCtx, cbInstr, u8Vector, fFlags, uErr, uCr2);
    44724476    else if (pCtx->msrEFER & MSR_K6_EFER_LMA)
    4473         rcStrict = iemRaiseXcptOrIntInLongMode( pIemCpu, pCtx, cbInstr, u8Vector, fFlags, uErr, uCr2);
     4477        rcStrict = iemRaiseXcptOrIntInLongMode(pVCpu, pCtx, cbInstr, u8Vector, fFlags, uErr, uCr2);
    44744478    else
    4475         rcStrict = iemRaiseXcptOrIntInProtMode( pIemCpu, pCtx, cbInstr, u8Vector, fFlags, uErr, uCr2);
     4479        rcStrict = iemRaiseXcptOrIntInProtMode(pVCpu, pCtx, cbInstr, u8Vector, fFlags, uErr, uCr2);
    44764480
    44774481    /* Flush the prefetch buffer. */
    4478     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     4482    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    44794483
    44804484    /*
    44814485     * Unwind.
    44824486     */
    4483     pIemCpu->cXcptRecursions--;
    4484     pIemCpu->uCurXcpt = uPrevXcpt;
    4485     pIemCpu->fCurXcpt = fPrevXcpt;
     4487    pVCpu->iem.s.cXcptRecursions--;
     4488    pVCpu->iem.s.uCurXcpt = uPrevXcpt;
     4489    pVCpu->iem.s.fCurXcpt = fPrevXcpt;
    44864490    Log(("iemRaiseXcptOrInt: returns %Rrc (vec=%#x); cs:rip=%04x:%RGv ss:rsp=%04x:%RGv cpl=%u\n",
    4487          VBOXSTRICTRC_VAL(rcStrict), u8Vector, pCtx->cs.Sel, pCtx->rip, pCtx->ss.Sel, pCtx->esp, pIemCpu->uCpl));
     4491         VBOXSTRICTRC_VAL(rcStrict), u8Vector, pCtx->cs.Sel, pCtx->rip, pCtx->ss.Sel, pCtx->esp, pVCpu->iem.s.uCpl));
    44884492    return rcStrict;
    44894493}
     
    44944498 */
    44954499IEM_STATIC DECL_NO_RETURN(void)
    4496 iemRaiseXcptOrIntJmp(PIEMCPU     pIemCpu,
     4500iemRaiseXcptOrIntJmp(PVMCPU      pVCpu,
    44974501                     uint8_t     cbInstr,
    44984502                     uint8_t     u8Vector,
     
    45014505                     uint64_t    uCr2)
    45024506{
    4503     VBOXSTRICTRC rcStrict = iemRaiseXcptOrInt(pIemCpu, cbInstr, u8Vector, fFlags, uErr, uCr2);
    4504     longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     4507    VBOXSTRICTRC rcStrict = iemRaiseXcptOrInt(pVCpu, cbInstr, u8Vector, fFlags, uErr, uCr2);
     4508    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    45054509}
    45064510#endif
     
    45084512
    45094513/** \#DE - 00.  */
    4510 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseDivideError(PIEMCPU pIemCpu)
    4511 {
    4512     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_DE, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
     4514DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseDivideError(PVMCPU pVCpu)
     4515{
     4516    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_DE, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
    45134517}
    45144518
     
    45164520/** \#DB - 01.
    45174521 * @note This automatically clear DR7.GD.  */
    4518 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseDebugException(PIEMCPU pIemCpu)
     4522DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseDebugException(PVMCPU pVCpu)
    45194523{
    45204524    /** @todo set/clear RF. */
    4521     pIemCpu->CTX_SUFF(pCtx)->dr[7] &= ~X86_DR7_GD;
    4522     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_DB, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
     4525    pVCpu->iem.s.CTX_SUFF(pCtx)->dr[7] &= ~X86_DR7_GD;
     4526    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_DB, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
    45234527}
    45244528
    45254529
    45264530/** \#UD - 06.  */
    4527 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseUndefinedOpcode(PIEMCPU pIemCpu)
    4528 {
    4529     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_UD, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
     4531DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseUndefinedOpcode(PVMCPU pVCpu)
     4532{
     4533    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_UD, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
    45304534}
    45314535
    45324536
    45334537/** \#NM - 07.  */
    4534 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseDeviceNotAvailable(PIEMCPU pIemCpu)
    4535 {
    4536     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_NM, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
     4538DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseDeviceNotAvailable(PVMCPU pVCpu)
     4539{
     4540    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_NM, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
    45374541}
    45384542
    45394543
    45404544/** \#TS(err) - 0a.  */
    4541 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseTaskSwitchFaultWithErr(PIEMCPU pIemCpu, uint16_t uErr)
    4542 {
    4543     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_TS, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, uErr, 0);
     4545DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseTaskSwitchFaultWithErr(PVMCPU pVCpu, uint16_t uErr)
     4546{
     4547    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_TS, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, uErr, 0);
    45444548}
    45454549
    45464550
    45474551/** \#TS(tr) - 0a.  */
    4548 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseTaskSwitchFaultCurrentTSS(PIEMCPU pIemCpu)
    4549 {
    4550     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_TS, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
    4551                              pIemCpu->CTX_SUFF(pCtx)->tr.Sel, 0);
     4552DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseTaskSwitchFaultCurrentTSS(PVMCPU pVCpu)
     4553{
     4554    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_TS, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
     4555                             pVCpu->iem.s.CTX_SUFF(pCtx)->tr.Sel, 0);
    45524556}
    45534557
    45544558
    45554559/** \#TS(0) - 0a.  */
    4556 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseTaskSwitchFault0(PIEMCPU pIemCpu)
    4557 {
    4558     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_TS, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
     4560DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseTaskSwitchFault0(PVMCPU pVCpu)
     4561{
     4562    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_TS, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
    45594563                             0, 0);
    45604564}
     
    45624566
    45634567/** \#TS(err) - 0a.  */
    4564 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseTaskSwitchFaultBySelector(PIEMCPU pIemCpu, uint16_t uSel)
    4565 {
    4566     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_TS, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
     4568DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseTaskSwitchFaultBySelector(PVMCPU pVCpu, uint16_t uSel)
     4569{
     4570    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_TS, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
    45674571                             uSel & X86_SEL_MASK_OFF_RPL, 0);
    45684572}
     
    45704574
    45714575/** \#NP(err) - 0b.  */
    4572 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseSelectorNotPresentWithErr(PIEMCPU pIemCpu, uint16_t uErr)
    4573 {
    4574     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_NP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, uErr, 0);
     4576DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseSelectorNotPresentWithErr(PVMCPU pVCpu, uint16_t uErr)
     4577{
     4578    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_NP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, uErr, 0);
    45754579}
    45764580
    45774581
    45784582/** \#NP(seg) - 0b.  */
    4579 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseSelectorNotPresentBySegReg(PIEMCPU pIemCpu, uint32_t iSegReg)
    4580 {
    4581     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_NP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
    4582                              iemSRegFetchU16(pIemCpu, iSegReg) & ~X86_SEL_RPL, 0);
     4583DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseSelectorNotPresentBySegReg(PVMCPU pVCpu, uint32_t iSegReg)
     4584{
     4585    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_NP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
     4586                             iemSRegFetchU16(pVCpu, iSegReg) & ~X86_SEL_RPL, 0);
    45834587}
    45844588
    45854589
    45864590/** \#NP(sel) - 0b.  */
    4587 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseSelectorNotPresentBySelector(PIEMCPU pIemCpu, uint16_t uSel)
    4588 {
    4589     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_NP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
     4591DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseSelectorNotPresentBySelector(PVMCPU pVCpu, uint16_t uSel)
     4592{
     4593    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_NP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
    45904594                             uSel & ~X86_SEL_RPL, 0);
    45914595}
     
    45934597
    45944598/** \#SS(seg) - 0c.  */
    4595 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseStackSelectorNotPresentBySelector(PIEMCPU pIemCpu, uint16_t uSel)
    4596 {
    4597     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_SS, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
     4599DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseStackSelectorNotPresentBySelector(PVMCPU pVCpu, uint16_t uSel)
     4600{
     4601    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_SS, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
    45984602                             uSel & ~X86_SEL_RPL, 0);
    45994603}
     
    46014605
    46024606/** \#SS(err) - 0c.  */
    4603 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseStackSelectorNotPresentWithErr(PIEMCPU pIemCpu, uint16_t uErr)
    4604 {
    4605     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_SS, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, uErr, 0);
     4607DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseStackSelectorNotPresentWithErr(PVMCPU pVCpu, uint16_t uErr)
     4608{
     4609    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_SS, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, uErr, 0);
    46064610}
    46074611
    46084612
    46094613/** \#GP(n) - 0d.  */
    4610 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseGeneralProtectionFault(PIEMCPU pIemCpu, uint16_t uErr)
    4611 {
    4612     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, uErr, 0);
     4614DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseGeneralProtectionFault(PVMCPU pVCpu, uint16_t uErr)
     4615{
     4616    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, uErr, 0);
    46134617}
    46144618
    46154619
    46164620/** \#GP(0) - 0d.  */
    4617 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseGeneralProtectionFault0(PIEMCPU pIemCpu)
    4618 {
    4619     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
     4621DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseGeneralProtectionFault0(PVMCPU pVCpu)
     4622{
     4623    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
    46204624}
    46214625
    46224626#ifdef IEM_WITH_SETJMP
    46234627/** \#GP(0) - 0d.  */
    4624 DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseGeneralProtectionFault0Jmp(PIEMCPU pIemCpu)
    4625 {
    4626     iemRaiseXcptOrIntJmp(pIemCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
     4628DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseGeneralProtectionFault0Jmp(PVMCPU pVCpu)
     4629{
     4630    iemRaiseXcptOrIntJmp(pVCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
    46274631}
    46284632#endif
     
    46304634
    46314635/** \#GP(sel) - 0d.  */
    4632 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseGeneralProtectionFaultBySelector(PIEMCPU pIemCpu, RTSEL Sel)
    4633 {
    4634     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
     4636DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseGeneralProtectionFaultBySelector(PVMCPU pVCpu, RTSEL Sel)
     4637{
     4638    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
    46354639                             Sel & ~X86_SEL_RPL, 0);
    46364640}
     
    46384642
    46394643/** \#GP(0) - 0d.  */
    4640 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseNotCanonical(PIEMCPU pIemCpu)
    4641 {
    4642     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
     4644DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseNotCanonical(PVMCPU pVCpu)
     4645{
     4646    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
    46434647}
    46444648
    46454649
    46464650/** \#GP(sel) - 0d.  */
    4647 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseSelectorBounds(PIEMCPU pIemCpu, uint32_t iSegReg, uint32_t fAccess)
     4651DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseSelectorBounds(PVMCPU pVCpu, uint32_t iSegReg, uint32_t fAccess)
    46484652{
    46494653    NOREF(iSegReg); NOREF(fAccess);
    4650     return iemRaiseXcptOrInt(pIemCpu, 0, iSegReg == X86_SREG_SS ? X86_XCPT_SS : X86_XCPT_GP,
     4654    return iemRaiseXcptOrInt(pVCpu, 0, iSegReg == X86_SREG_SS ? X86_XCPT_SS : X86_XCPT_GP,
    46514655                             IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
    46524656}
     
    46544658#ifdef IEM_WITH_SETJMP
    46554659/** \#GP(sel) - 0d, longjmp.  */
    4656 DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseSelectorBoundsJmp(PIEMCPU pIemCpu, uint32_t iSegReg, uint32_t fAccess)
     4660DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseSelectorBoundsJmp(PVMCPU pVCpu, uint32_t iSegReg, uint32_t fAccess)
    46574661{
    46584662    NOREF(iSegReg); NOREF(fAccess);
    4659     iemRaiseXcptOrIntJmp(pIemCpu, 0, iSegReg == X86_SREG_SS ? X86_XCPT_SS : X86_XCPT_GP,
     4663    iemRaiseXcptOrIntJmp(pVCpu, 0, iSegReg == X86_SREG_SS ? X86_XCPT_SS : X86_XCPT_GP,
    46604664                         IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
    46614665}
     
    46634667
    46644668/** \#GP(sel) - 0d.  */
    4665 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseSelectorBoundsBySelector(PIEMCPU pIemCpu, RTSEL Sel)
     4669DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseSelectorBoundsBySelector(PVMCPU pVCpu, RTSEL Sel)
    46664670{
    46674671    NOREF(Sel);
    4668     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
     4672    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
    46694673}
    46704674
    46714675#ifdef IEM_WITH_SETJMP
    46724676/** \#GP(sel) - 0d, longjmp.  */
    4673 DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseSelectorBoundsBySelectorJmp(PIEMCPU pIemCpu, RTSEL Sel)
     4677DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseSelectorBoundsBySelectorJmp(PVMCPU pVCpu, RTSEL Sel)
    46744678{
    46754679    NOREF(Sel);
    4676     iemRaiseXcptOrIntJmp(pIemCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
     4680    iemRaiseXcptOrIntJmp(pVCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
    46774681}
    46784682#endif
     
    46804684
    46814685/** \#GP(sel) - 0d.  */
    4682 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseSelectorInvalidAccess(PIEMCPU pIemCpu, uint32_t iSegReg, uint32_t fAccess)
     4686DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseSelectorInvalidAccess(PVMCPU pVCpu, uint32_t iSegReg, uint32_t fAccess)
    46834687{
    46844688    NOREF(iSegReg); NOREF(fAccess);
    4685     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
     4689    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
    46864690}
    46874691
    46884692#ifdef IEM_WITH_SETJMP
    46894693/** \#GP(sel) - 0d, longjmp.  */
    4690 DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseSelectorInvalidAccessJmp(PIEMCPU pIemCpu, uint32_t iSegReg,
     4694DECL_NO_INLINE(IEM_STATIC, DECL_NO_RETURN(void)) iemRaiseSelectorInvalidAccessJmp(PVMCPU pVCpu, uint32_t iSegReg,
    46914695                                                                                  uint32_t fAccess)
    46924696{
    46934697    NOREF(iSegReg); NOREF(fAccess);
    4694     iemRaiseXcptOrIntJmp(pIemCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
     4698    iemRaiseXcptOrIntJmp(pVCpu, 0, X86_XCPT_GP, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, 0, 0);
    46954699}
    46964700#endif
     
    46984702
    46994703/** \#PF(n) - 0e.  */
    4700 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaisePageFault(PIEMCPU pIemCpu, RTGCPTR GCPtrWhere, uint32_t fAccess, int rc)
     4704DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaisePageFault(PVMCPU pVCpu, RTGCPTR GCPtrWhere, uint32_t fAccess, int rc)
    47014705{
    47024706    uint16_t uErr;
     
    47194723    }
    47204724
    4721     if (pIemCpu->uCpl == 3)
     4725    if (pVCpu->iem.s.uCpl == 3)
    47224726        uErr |= X86_TRAP_PF_US;
    47234727
    47244728    if (   (fAccess & IEM_ACCESS_WHAT_MASK) == IEM_ACCESS_WHAT_CODE
    4725         && (   (pIemCpu->CTX_SUFF(pCtx)->cr4 & X86_CR4_PAE)
    4726             && (pIemCpu->CTX_SUFF(pCtx)->msrEFER & MSR_K6_EFER_NXE) ) )
     4729        && (   (pVCpu->iem.s.CTX_SUFF(pCtx)->cr4 & X86_CR4_PAE)
     4730            && (pVCpu->iem.s.CTX_SUFF(pCtx)->msrEFER & MSR_K6_EFER_NXE) ) )
    47274731        uErr |= X86_TRAP_PF_ID;
    47284732
     
    47364740    if (fAccess & IEM_ACCESS_TYPE_WRITE)
    47374741    {
    4738         if (!IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu) || !(fAccess & IEM_ACCESS_TYPE_READ))
     4742        if (!IEM_FULL_VERIFICATION_REM_ENABLED(pVCpu) || !(fAccess & IEM_ACCESS_TYPE_READ))
    47394743            uErr |= X86_TRAP_PF_RW;
    47404744    }
    47414745#endif
    47424746
    4743     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_PF, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR | IEM_XCPT_FLAGS_CR2,
     4747    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_PF, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR | IEM_XCPT_FLAGS_CR2,
    47444748                             uErr, GCPtrWhere);
    47454749}
     
    47474751
    47484752/** \#MF(0) - 10.  */
    4749 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseMathFault(PIEMCPU pIemCpu)
    4750 {
    4751     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_MF, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
     4753DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseMathFault(PVMCPU pVCpu)
     4754{
     4755    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_MF, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
    47524756}
    47534757
    47544758
    47554759/** \#AC(0) - 11.  */
    4756 DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseAlignmentCheckException(PIEMCPU pIemCpu)
    4757 {
    4758     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_AC, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
     4760DECL_NO_INLINE(IEM_STATIC, VBOXSTRICTRC) iemRaiseAlignmentCheckException(PVMCPU pVCpu)
     4761{
     4762    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_AC, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
    47594763}
    47604764
     
    47724776{
    47734777    NOREF(cbInstr);
    4774     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_DE, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
     4778    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_DE, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
    47754779}
    47764780
     
    47884792{
    47894793    NOREF(cbInstr);
    4790     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_UD, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
     4794    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_UD, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
    47914795}
    47924796
     
    48044808{
    48054809    NOREF(cbInstr);
    4806     return iemRaiseXcptOrInt(pIemCpu, 0, X86_XCPT_UD, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
     4810    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_UD, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
    48074811}
    48084812
     
    48224826 * Recalculates the effective operand size.
    48234827 *
    4824  * @param   pIemCpu             The IEM state.
    4825  */
    4826 IEM_STATIC void iemRecalEffOpSize(PIEMCPU pIemCpu)
    4827 {
    4828     switch (pIemCpu->enmCpuMode)
     4828 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     4829 */
     4830IEM_STATIC void iemRecalEffOpSize(PVMCPU pVCpu)
     4831{
     4832    switch (pVCpu->iem.s.enmCpuMode)
    48294833    {
    48304834        case IEMMODE_16BIT:
    4831             pIemCpu->enmEffOpSize = pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP ? IEMMODE_32BIT : IEMMODE_16BIT;
     4835            pVCpu->iem.s.enmEffOpSize = pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP ? IEMMODE_32BIT : IEMMODE_16BIT;
    48324836            break;
    48334837        case IEMMODE_32BIT:
    4834             pIemCpu->enmEffOpSize = pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP ? IEMMODE_16BIT : IEMMODE_32BIT;
     4838            pVCpu->iem.s.enmEffOpSize = pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP ? IEMMODE_16BIT : IEMMODE_32BIT;
    48354839            break;
    48364840        case IEMMODE_64BIT:
    4837             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_REX_W | IEM_OP_PRF_SIZE_OP))
     4841            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_REX_W | IEM_OP_PRF_SIZE_OP))
    48384842            {
    48394843                case 0:
    4840                     pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize;
     4844                    pVCpu->iem.s.enmEffOpSize = pVCpu->iem.s.enmDefOpSize;
    48414845                    break;
    48424846                case IEM_OP_PRF_SIZE_OP:
    4843                     pIemCpu->enmEffOpSize = IEMMODE_16BIT;
     4847                    pVCpu->iem.s.enmEffOpSize = IEMMODE_16BIT;
    48444848                    break;
    48454849                case IEM_OP_PRF_SIZE_REX_W:
    48464850                case IEM_OP_PRF_SIZE_REX_W | IEM_OP_PRF_SIZE_OP:
    4847                     pIemCpu->enmEffOpSize = IEMMODE_64BIT;
     4851                    pVCpu->iem.s.enmEffOpSize = IEMMODE_64BIT;
    48484852                    break;
    48494853            }
     
    48594863 * operand size.
    48604864 *
    4861  * @param   pIemCpu             The IEM state.
    4862  */
    4863 IEM_STATIC void iemRecalEffOpSize64Default(PIEMCPU pIemCpu)
    4864 {
    4865     Assert(pIemCpu->enmCpuMode == IEMMODE_64BIT);
    4866     pIemCpu->enmDefOpSize = IEMMODE_64BIT;
    4867     if ((pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_REX_W | IEM_OP_PRF_SIZE_OP)) != IEM_OP_PRF_SIZE_OP)
    4868         pIemCpu->enmEffOpSize = IEMMODE_64BIT;
     4865 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     4866 */
     4867IEM_STATIC void iemRecalEffOpSize64Default(PVMCPU pVCpu)
     4868{
     4869    Assert(pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT);
     4870    pVCpu->iem.s.enmDefOpSize = IEMMODE_64BIT;
     4871    if ((pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_REX_W | IEM_OP_PRF_SIZE_OP)) != IEM_OP_PRF_SIZE_OP)
     4872        pVCpu->iem.s.enmEffOpSize = IEMMODE_64BIT;
    48694873    else
    4870         pIemCpu->enmEffOpSize = IEMMODE_16BIT;
     4874        pVCpu->iem.s.enmEffOpSize = IEMMODE_16BIT;
    48714875}
    48724876
     
    48834887/**
    48844888 * Used to add extra details about a stub case.
    4885  * @param   pIemCpu     The IEM per CPU state.
    4886  */
    4887 IEM_STATIC void iemOpStubMsg2(PIEMCPU pIemCpu)
     4889 * @param   pVCpu       The cross context virtual CPU structure of the calling thread.
     4890 */
     4891IEM_STATIC void iemOpStubMsg2(PVMCPU pVCpu)
    48884892{
    48894893#if defined(LOG_ENABLED) && defined(IN_RING3)
    4890     PVM     pVM   = IEMCPU_TO_VM(pIemCpu);
    4891     PVMCPU  pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
     4894    PVM  pVM = pVCpu->CTX_SUFF(pVM);
    48924895    char szRegs[4096];
    48934896    DBGFR3RegPrintf(pVM->pUVM, pVCpu->idCpu, &szRegs[0], sizeof(szRegs),
     
    49254928    RTAssertMsg2Weak("%s%s\n", szRegs, szInstr);
    49264929#else
    4927     RTAssertMsg2Weak("cs:rip=%04x:%RX64\n", pIemCpu->CTX_SUFF(pCtx)->cs, pIemCpu->CTX_SUFF(pCtx)->rip);
     4930    RTAssertMsg2Weak("cs:rip=%04x:%RX64\n", pVCpu->iem.s.CTX_SUFF(pCtx)->cs, pVCpu->iem.s.CTX_SUFF(pCtx)->rip);
    49284931#endif
    49294932}
     
    49394942    do { \
    49404943        RTAssertMsg1(NULL, __LINE__, __FILE__, __FUNCTION__); \
    4941         iemOpStubMsg2(pIemCpu); \
     4944        iemOpStubMsg2(pVCpu); \
    49424945        RTAssertPanic(); \
    49434946    } while (0)
     
    49944997 *
    49954998 * @returns Hidden register reference.
    4996  * @param   pIemCpu             The per CPU data.
     4999 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    49975000 * @param   iSegReg             The segment register.
    49985001 */
    4999 IEM_STATIC PCPUMSELREG iemSRegGetHid(PIEMCPU pIemCpu, uint8_t iSegReg)
    5000 {
    5001     PCPUMCTX    pCtx = pIemCpu->CTX_SUFF(pCtx);
     5002IEM_STATIC PCPUMSELREG iemSRegGetHid(PVMCPU pVCpu, uint8_t iSegReg)
     5003{
     5004    PCPUMCTX    pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    50025005
    50035006    Assert(iSegReg < X86_SREG_COUNT);
     
    50105013
    50115014#ifdef VBOX_WITH_RAW_MODE_NOT_R0
    5012     if (RT_LIKELY(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg)))
     5015    if (RT_LIKELY(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, pSReg)))
    50135016    { /* likely */ }
    50145017    else
    5015         CPUMGuestLazyLoadHiddenSelectorReg(IEMCPU_TO_VMCPU(pIemCpu), pSReg);
     5018        CPUMGuestLazyLoadHiddenSelectorReg(pVCpu, pSReg);
    50165019#else
    5017     Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg));
     5020    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, pSReg));
    50185021#endif
    50195022    return pSReg;
     
    50255028 *
    50265029 * @returns Hidden register reference.
    5027  * @param   pIemCpu             The per CPU data.
     5030 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    50285031 * @param   pSReg               The segment register.
    50295032 */
    5030 IEM_STATIC PCPUMSELREG iemSRegUpdateHid(PIEMCPU pIemCpu, PCPUMSELREG pSReg)
     5033IEM_STATIC PCPUMSELREG iemSRegUpdateHid(PVMCPU pVCpu, PCPUMSELREG pSReg)
    50315034{
    50325035#ifdef VBOX_WITH_RAW_MODE_NOT_R0
    5033     if (!CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg))
    5034         CPUMGuestLazyLoadHiddenSelectorReg(IEMCPU_TO_VMCPU(pIemCpu), pSReg);
     5036    if (!CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, pSReg))
     5037        CPUMGuestLazyLoadHiddenSelectorReg(pVCpu, pSReg);
    50355038#else
    5036     Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg));
    5037     NOREF(pIemCpu);
     5039    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, pSReg));
     5040    NOREF(pVCpu);
    50385041#endif
    50395042    return pSReg;
     
    50465049 *
    50475050 * @returns Pointer to the selector variable.
    5048  * @param   pIemCpu             The per CPU data.
     5051 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    50495052 * @param   iSegReg             The segment register.
    50505053 */
    5051 IEM_STATIC uint16_t *iemSRegRef(PIEMCPU pIemCpu, uint8_t iSegReg)
    5052 {
    5053     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5054IEM_STATIC uint16_t *iemSRegRef(PVMCPU pVCpu, uint8_t iSegReg)
     5055{
     5056    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    50545057    switch (iSegReg)
    50555058    {
     
    50695072 *
    50705073 * @returns The selector value.
    5071  * @param   pIemCpu             The per CPU data.
     5074 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    50725075 * @param   iSegReg             The segment register.
    50735076 */
    5074 IEM_STATIC uint16_t iemSRegFetchU16(PIEMCPU pIemCpu, uint8_t iSegReg)
    5075 {
    5076     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5077IEM_STATIC uint16_t iemSRegFetchU16(PVMCPU pVCpu, uint8_t iSegReg)
     5078{
     5079    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    50775080    switch (iSegReg)
    50785081    {
     
    50925095 *
    50935096 * @returns Register reference.
    5094  * @param   pIemCpu             The per CPU data.
     5097 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    50955098 * @param   iReg                The general register.
    50965099 */
    5097 IEM_STATIC void *iemGRegRef(PIEMCPU pIemCpu, uint8_t iReg)
    5098 {
    5099     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5100IEM_STATIC void *iemGRegRef(PVMCPU pVCpu, uint8_t iReg)
     5101{
     5102    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    51005103    switch (iReg)
    51015104    {
     
    51275130 *
    51285131 * @returns Register reference.
    5129  * @param   pIemCpu             The per CPU data.
     5132 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    51305133 * @param   iReg                The register.
    51315134 */
    5132 IEM_STATIC uint8_t *iemGRegRefU8(PIEMCPU pIemCpu, uint8_t iReg)
    5133 {
    5134     if (pIemCpu->fPrefixes & IEM_OP_PRF_REX)
    5135         return (uint8_t *)iemGRegRef(pIemCpu, iReg);
    5136 
    5137     uint8_t *pu8Reg = (uint8_t *)iemGRegRef(pIemCpu, iReg & 3);
     5135IEM_STATIC uint8_t *iemGRegRefU8(PVMCPU pVCpu, uint8_t iReg)
     5136{
     5137    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REX)
     5138        return (uint8_t *)iemGRegRef(pVCpu, iReg);
     5139
     5140    uint8_t *pu8Reg = (uint8_t *)iemGRegRef(pVCpu, iReg & 3);
    51385141    if (iReg >= 4)
    51395142        pu8Reg++;
     
    51465149 *
    51475150 * @returns The register value.
    5148  * @param   pIemCpu             The per CPU data.
     5151 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    51495152 * @param   iReg                The register.
    51505153 */
    5151 IEM_STATIC uint8_t iemGRegFetchU8(PIEMCPU pIemCpu, uint8_t iReg)
    5152 {
    5153     uint8_t const *pbSrc = iemGRegRefU8(pIemCpu, iReg);
     5154IEM_STATIC uint8_t iemGRegFetchU8(PVMCPU pVCpu, uint8_t iReg)
     5155{
     5156    uint8_t const *pbSrc = iemGRegRefU8(pVCpu, iReg);
    51545157    return *pbSrc;
    51555158}
     
    51605163 *
    51615164 * @returns The register value.
    5162  * @param   pIemCpu             The per CPU data.
     5165 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    51635166 * @param   iReg                The register.
    51645167 */
    5165 IEM_STATIC uint16_t iemGRegFetchU16(PIEMCPU pIemCpu, uint8_t iReg)
    5166 {
    5167     return *(uint16_t *)iemGRegRef(pIemCpu, iReg);
     5168IEM_STATIC uint16_t iemGRegFetchU16(PVMCPU pVCpu, uint8_t iReg)
     5169{
     5170    return *(uint16_t *)iemGRegRef(pVCpu, iReg);
    51685171}
    51695172
     
    51735176 *
    51745177 * @returns The register value.
    5175  * @param   pIemCpu             The per CPU data.
     5178 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    51765179 * @param   iReg                The register.
    51775180 */
    5178 IEM_STATIC uint32_t iemGRegFetchU32(PIEMCPU pIemCpu, uint8_t iReg)
    5179 {
    5180     return *(uint32_t *)iemGRegRef(pIemCpu, iReg);
     5181IEM_STATIC uint32_t iemGRegFetchU32(PVMCPU pVCpu, uint8_t iReg)
     5182{
     5183    return *(uint32_t *)iemGRegRef(pVCpu, iReg);
    51815184}
    51825185
     
    51865189 *
    51875190 * @returns The register value.
    5188  * @param   pIemCpu             The per CPU data.
     5191 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    51895192 * @param   iReg                The register.
    51905193 */
    5191 IEM_STATIC uint64_t iemGRegFetchU64(PIEMCPU pIemCpu, uint8_t iReg)
    5192 {
    5193     return *(uint64_t *)iemGRegRef(pIemCpu, iReg);
     5194IEM_STATIC uint64_t iemGRegFetchU64(PVMCPU pVCpu, uint8_t iReg)
     5195{
     5196    return *(uint64_t *)iemGRegRef(pVCpu, iReg);
    51945197}
    51955198
     
    52015204 * segment limit.
    52025205 *
    5203  * @param   pIemCpu             The per CPU data.
     5206 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    52045207 * @param   offNextInstr        The offset of the next instruction.
    52055208 */
    5206 IEM_STATIC VBOXSTRICTRC iemRegRipRelativeJumpS8(PIEMCPU pIemCpu, int8_t offNextInstr)
    5207 {
    5208     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    5209     switch (pIemCpu->enmEffOpSize)
     5209IEM_STATIC VBOXSTRICTRC iemRegRipRelativeJumpS8(PVMCPU pVCpu, int8_t offNextInstr)
     5210{
     5211    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
     5212    switch (pVCpu->iem.s.enmEffOpSize)
    52105213    {
    52115214        case IEMMODE_16BIT:
    52125215        {
    5213             uint16_t uNewIp = pCtx->ip + offNextInstr + pIemCpu->offOpcode;
     5216            uint16_t uNewIp = pCtx->ip + offNextInstr + pVCpu->iem.s.offOpcode;
    52145217            if (   uNewIp > pCtx->cs.u32Limit
    5215                 && pIemCpu->enmCpuMode != IEMMODE_64BIT) /* no need to check for non-canonical. */
    5216                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5218                && pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT) /* no need to check for non-canonical. */
     5219                return iemRaiseGeneralProtectionFault0(pVCpu);
    52175220            pCtx->rip = uNewIp;
    52185221            break;
     
    52225225        {
    52235226            Assert(pCtx->rip <= UINT32_MAX);
    5224             Assert(pIemCpu->enmCpuMode != IEMMODE_64BIT);
    5225 
    5226             uint32_t uNewEip = pCtx->eip + offNextInstr + pIemCpu->offOpcode;
     5227            Assert(pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT);
     5228
     5229            uint32_t uNewEip = pCtx->eip + offNextInstr + pVCpu->iem.s.offOpcode;
    52275230            if (uNewEip > pCtx->cs.u32Limit)
    5228                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5231                return iemRaiseGeneralProtectionFault0(pVCpu);
    52295232            pCtx->rip = uNewEip;
    52305233            break;
     
    52335236        case IEMMODE_64BIT:
    52345237        {
    5235             Assert(pIemCpu->enmCpuMode == IEMMODE_64BIT);
    5236 
    5237             uint64_t uNewRip = pCtx->rip + offNextInstr + pIemCpu->offOpcode;
     5238            Assert(pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT);
     5239
     5240            uint64_t uNewRip = pCtx->rip + offNextInstr + pVCpu->iem.s.offOpcode;
    52385241            if (!IEM_IS_CANONICAL(uNewRip))
    5239                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5242                return iemRaiseGeneralProtectionFault0(pVCpu);
    52405243            pCtx->rip = uNewRip;
    52415244            break;
     
    52485251
    52495252    /* Flush the prefetch buffer. */
    5250     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     5253    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    52515254
    52525255    return VINF_SUCCESS;
     
    52615264 *
    52625265 * @returns Strict VBox status code.
    5263  * @param   pIemCpu             The per CPU data.
     5266 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    52645267 * @param   offNextInstr        The offset of the next instruction.
    52655268 */
    5266 IEM_STATIC VBOXSTRICTRC iemRegRipRelativeJumpS16(PIEMCPU pIemCpu, int16_t offNextInstr)
    5267 {
    5268     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    5269     Assert(pIemCpu->enmEffOpSize == IEMMODE_16BIT);
    5270 
    5271     uint16_t uNewIp = pCtx->ip + offNextInstr + pIemCpu->offOpcode;
     5269IEM_STATIC VBOXSTRICTRC iemRegRipRelativeJumpS16(PVMCPU pVCpu, int16_t offNextInstr)
     5270{
     5271    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
     5272    Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT);
     5273
     5274    uint16_t uNewIp = pCtx->ip + offNextInstr + pVCpu->iem.s.offOpcode;
    52725275    if (   uNewIp > pCtx->cs.u32Limit
    5273         && pIemCpu->enmCpuMode != IEMMODE_64BIT) /* no need to check for non-canonical. */
    5274         return iemRaiseGeneralProtectionFault0(pIemCpu);
     5276        && pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT) /* no need to check for non-canonical. */
     5277        return iemRaiseGeneralProtectionFault0(pVCpu);
    52755278    /** @todo Test 16-bit jump in 64-bit mode. possible?  */
    52765279    pCtx->rip = uNewIp;
     
    52785281
    52795282    /* Flush the prefetch buffer. */
    5280     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     5283    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    52815284
    52825285    return VINF_SUCCESS;
     
    52915294 *
    52925295 * @returns Strict VBox status code.
    5293  * @param   pIemCpu             The per CPU data.
     5296 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    52945297 * @param   offNextInstr        The offset of the next instruction.
    52955298 */
    5296 IEM_STATIC VBOXSTRICTRC iemRegRipRelativeJumpS32(PIEMCPU pIemCpu, int32_t offNextInstr)
    5297 {
    5298     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    5299     Assert(pIemCpu->enmEffOpSize != IEMMODE_16BIT);
    5300 
    5301     if (pIemCpu->enmEffOpSize == IEMMODE_32BIT)
    5302     {
    5303         Assert(pCtx->rip <= UINT32_MAX); Assert(pIemCpu->enmCpuMode != IEMMODE_64BIT);
    5304 
    5305         uint32_t uNewEip = pCtx->eip + offNextInstr + pIemCpu->offOpcode;
     5299IEM_STATIC VBOXSTRICTRC iemRegRipRelativeJumpS32(PVMCPU pVCpu, int32_t offNextInstr)
     5300{
     5301    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
     5302    Assert(pVCpu->iem.s.enmEffOpSize != IEMMODE_16BIT);
     5303
     5304    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_32BIT)
     5305    {
     5306        Assert(pCtx->rip <= UINT32_MAX); Assert(pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT);
     5307
     5308        uint32_t uNewEip = pCtx->eip + offNextInstr + pVCpu->iem.s.offOpcode;
    53065309        if (uNewEip > pCtx->cs.u32Limit)
    5307             return iemRaiseGeneralProtectionFault0(pIemCpu);
     5310            return iemRaiseGeneralProtectionFault0(pVCpu);
    53085311        pCtx->rip = uNewEip;
    53095312    }
    53105313    else
    53115314    {
    5312         Assert(pIemCpu->enmCpuMode == IEMMODE_64BIT);
    5313 
    5314         uint64_t uNewRip = pCtx->rip + offNextInstr + pIemCpu->offOpcode;
     5315        Assert(pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT);
     5316
     5317        uint64_t uNewRip = pCtx->rip + offNextInstr + pVCpu->iem.s.offOpcode;
    53155318        if (!IEM_IS_CANONICAL(uNewRip))
    5316             return iemRaiseGeneralProtectionFault0(pIemCpu);
     5319            return iemRaiseGeneralProtectionFault0(pVCpu);
    53175320        pCtx->rip = uNewRip;
    53185321    }
     
    53205323
    53215324    /* Flush the prefetch buffer. */
    5322     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     5325    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    53235326
    53245327    return VINF_SUCCESS;
     
    53325335 * segment limit.
    53335336 *
    5334  * @param   pIemCpu             The per CPU data.
     5337 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    53355338 * @param   uNewRip             The new RIP value.
    53365339 */
    5337 IEM_STATIC VBOXSTRICTRC iemRegRipJump(PIEMCPU pIemCpu, uint64_t uNewRip)
    5338 {
    5339     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    5340     switch (pIemCpu->enmEffOpSize)
     5340IEM_STATIC VBOXSTRICTRC iemRegRipJump(PVMCPU pVCpu, uint64_t uNewRip)
     5341{
     5342    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
     5343    switch (pVCpu->iem.s.enmEffOpSize)
    53415344    {
    53425345        case IEMMODE_16BIT:
     
    53445347            Assert(uNewRip <= UINT16_MAX);
    53455348            if (   uNewRip > pCtx->cs.u32Limit
    5346                 && pIemCpu->enmCpuMode != IEMMODE_64BIT) /* no need to check for non-canonical. */
    5347                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5349                && pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT) /* no need to check for non-canonical. */
     5350                return iemRaiseGeneralProtectionFault0(pVCpu);
    53485351            /** @todo Test 16-bit jump in 64-bit mode.  */
    53495352            pCtx->rip = uNewRip;
     
    53555358            Assert(uNewRip <= UINT32_MAX);
    53565359            Assert(pCtx->rip <= UINT32_MAX);
    5357             Assert(pIemCpu->enmCpuMode != IEMMODE_64BIT);
     5360            Assert(pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT);
    53585361
    53595362            if (uNewRip > pCtx->cs.u32Limit)
    5360                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5363                return iemRaiseGeneralProtectionFault0(pVCpu);
    53615364            pCtx->rip = uNewRip;
    53625365            break;
     
    53655368        case IEMMODE_64BIT:
    53665369        {
    5367             Assert(pIemCpu->enmCpuMode == IEMMODE_64BIT);
     5370            Assert(pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT);
    53685371
    53695372            if (!IEM_IS_CANONICAL(uNewRip))
    5370                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5373                return iemRaiseGeneralProtectionFault0(pVCpu);
    53715374            pCtx->rip = uNewRip;
    53725375            break;
     
    53795382
    53805383    /* Flush the prefetch buffer. */
    5381     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     5384    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    53825385
    53835386    return VINF_SUCCESS;
     
    53885391 * Get the address of the top of the stack.
    53895392 *
    5390  * @param   pIemCpu             The per CPU data.
     5393 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    53915394 * @param   pCtx                The CPU context which SP/ESP/RSP should be
    53925395 *                              read.
    53935396 */
    5394 DECLINLINE(RTGCPTR) iemRegGetEffRsp(PCIEMCPU pIemCpu, PCCPUMCTX pCtx)
    5395 {
    5396     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     5397DECLINLINE(RTGCPTR) iemRegGetEffRsp(PCVMCPU pVCpu, PCCPUMCTX pCtx)
     5398{
     5399    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    53975400        return pCtx->rsp;
    53985401    if (pCtx->ss.Attr.n.u1DefBig)
     
    54075410 * This function leaves the EFLAGS.RF flag alone.
    54085411 *
    5409  * @param   pIemCpu             The per CPU data.
     5412 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    54105413 * @param   cbInstr             The number of bytes to add.
    54115414 */
    5412 IEM_STATIC void iemRegAddToRipKeepRF(PIEMCPU pIemCpu, uint8_t cbInstr)
    5413 {
    5414     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    5415     switch (pIemCpu->enmCpuMode)
     5415IEM_STATIC void iemRegAddToRipKeepRF(PVMCPU pVCpu, uint8_t cbInstr)
     5416{
     5417    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
     5418    switch (pVCpu->iem.s.enmCpuMode)
    54165419    {
    54175420        case IEMMODE_16BIT:
     
    54385441 * Updates the RIP/EIP/IP to point to the next instruction.
    54395442 *
    5440  * @param   pIemCpu             The per CPU data.
    5441  */
    5442 IEM_STATIC void iemRegUpdateRipKeepRF(PIEMCPU pIemCpu)
    5443 {
    5444     return iemRegAddToRipKeepRF(pIemCpu, pIemCpu->offOpcode);
     5443 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     5444 */
     5445IEM_STATIC void iemRegUpdateRipKeepRF(PVMCPU pVCpu)
     5446{
     5447    return iemRegAddToRipKeepRF(pVCpu, pVCpu->iem.s.offOpcode);
    54455448}
    54465449#endif
     
    54515454 * Updates the RIP/EIP/IP to point to the next instruction and clears EFLAGS.RF.
    54525455 *
    5453  * @param   pIemCpu             The per CPU data.
     5456 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    54545457 * @param   cbInstr             The number of bytes to add.
    54555458 */
    5456 IEM_STATIC void iemRegAddToRipAndClearRF(PIEMCPU pIemCpu, uint8_t cbInstr)
    5457 {
    5458     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5459IEM_STATIC void iemRegAddToRipAndClearRF(PVMCPU pVCpu, uint8_t cbInstr)
     5460{
     5461    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    54595462
    54605463    pCtx->eflags.Bits.u1RF = 0;
     
    54635466#if ARCH_BITS >= 64
    54645467    static uint64_t const s_aRipMasks[] = { UINT64_C(0xffff), UINT64_C(0xffffffff), UINT64_MAX };
    5465     Assert(pCtx->rip <= s_aRipMasks[(unsigned)pIemCpu->enmCpuMode]);
    5466     pCtx->rip = (pCtx->rip + cbInstr) & s_aRipMasks[(unsigned)pIemCpu->enmCpuMode];
     5468    Assert(pCtx->rip <= s_aRipMasks[(unsigned)pVCpu->iem.s.enmCpuMode]);
     5469    pCtx->rip = (pCtx->rip + cbInstr) & s_aRipMasks[(unsigned)pVCpu->iem.s.enmCpuMode];
    54675470#else
    5468     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     5471    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    54695472        pCtx->rip += cbInstr;
    54705473    else
    54715474    {
    54725475        static uint32_t const s_aEipMasks[] = { UINT32_C(0xffff), UINT32_MAX };
    5473         pCtx->eip = (pCtx->eip + cbInstr) & s_aEipMasks[(unsigned)pIemCpu->enmCpuMode];
     5476        pCtx->eip = (pCtx->eip + cbInstr) & s_aEipMasks[(unsigned)pVCpu->iem.s.enmCpuMode];
    54745477    }
    54755478#endif
     
    54805483 * Updates the RIP/EIP/IP to point to the next instruction and clears EFLAGS.RF.
    54815484 *
    5482  * @param   pIemCpu             The per CPU data.
    5483  */
    5484 IEM_STATIC void iemRegUpdateRipAndClearRF(PIEMCPU pIemCpu)
    5485 {
    5486     return iemRegAddToRipAndClearRF(pIemCpu, pIemCpu->offOpcode);
     5485 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     5486 */
     5487IEM_STATIC void iemRegUpdateRipAndClearRF(PVMCPU pVCpu)
     5488{
     5489    return iemRegAddToRipAndClearRF(pVCpu, pVCpu->iem.s.offOpcode);
    54875490}
    54885491
     
    54915494 * Adds to the stack pointer.
    54925495 *
    5493  * @param   pIemCpu             The per CPU data.
     5496 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    54945497 * @param   pCtx                The CPU context which SP/ESP/RSP should be
    54955498 *                              updated.
    54965499 * @param   cbToAdd             The number of bytes to add (8-bit!).
    54975500 */
    5498 DECLINLINE(void) iemRegAddToRsp(PCIEMCPU pIemCpu, PCPUMCTX pCtx, uint8_t cbToAdd)
    5499 {
    5500     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     5501DECLINLINE(void) iemRegAddToRsp(PCVMCPU pVCpu, PCPUMCTX pCtx, uint8_t cbToAdd)
     5502{
     5503    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    55015504        pCtx->rsp += cbToAdd;
    55025505    else if (pCtx->ss.Attr.n.u1DefBig)
     
    55105513 * Subtracts from the stack pointer.
    55115514 *
    5512  * @param   pIemCpu             The per CPU data.
     5515 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    55135516 * @param   pCtx                The CPU context which SP/ESP/RSP should be
    55145517 *                              updated.
    55155518 * @param   cbToSub             The number of bytes to subtract (8-bit!).
    55165519 */
    5517 DECLINLINE(void) iemRegSubFromRsp(PCIEMCPU pIemCpu, PCPUMCTX pCtx, uint8_t cbToSub)
    5518 {
    5519     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     5520DECLINLINE(void) iemRegSubFromRsp(PCVMCPU pVCpu, PCPUMCTX pCtx, uint8_t cbToSub)
     5521{
     5522    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    55205523        pCtx->rsp -= cbToSub;
    55215524    else if (pCtx->ss.Attr.n.u1DefBig)
     
    55295532 * Adds to the temporary stack pointer.
    55305533 *
    5531  * @param   pIemCpu             The per CPU data.
     5534 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    55325535 * @param   pTmpRsp             The temporary SP/ESP/RSP to update.
    55335536 * @param   cbToAdd             The number of bytes to add (16-bit).
    55345537 * @param   pCtx                Where to get the current stack mode.
    55355538 */
    5536 DECLINLINE(void) iemRegAddToRspEx(PCIEMCPU pIemCpu, PCCPUMCTX pCtx, PRTUINT64U pTmpRsp, uint16_t cbToAdd)
    5537 {
    5538     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     5539DECLINLINE(void) iemRegAddToRspEx(PCVMCPU pVCpu, PCCPUMCTX pCtx, PRTUINT64U pTmpRsp, uint16_t cbToAdd)
     5540{
     5541    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    55395542        pTmpRsp->u           += cbToAdd;
    55405543    else if (pCtx->ss.Attr.n.u1DefBig)
     
    55485551 * Subtracts from the temporary stack pointer.
    55495552 *
    5550  * @param   pIemCpu             The per CPU data.
     5553 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    55515554 * @param   pTmpRsp             The temporary SP/ESP/RSP to update.
    55525555 * @param   cbToSub             The number of bytes to subtract.
     
    55555558 *          expecting that.
    55565559 */
    5557 DECLINLINE(void) iemRegSubFromRspEx(PCIEMCPU pIemCpu, PCCPUMCTX pCtx, PRTUINT64U pTmpRsp, uint16_t cbToSub)
    5558 {
    5559     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     5560DECLINLINE(void) iemRegSubFromRspEx(PCVMCPU pVCpu, PCCPUMCTX pCtx, PRTUINT64U pTmpRsp, uint16_t cbToSub)
     5561{
     5562    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    55605563        pTmpRsp->u          -= cbToSub;
    55615564    else if (pCtx->ss.Attr.n.u1DefBig)
     
    55715574 *
    55725575 * @returns Effective stack addressf for the push.
    5573  * @param   pIemCpu             The IEM per CPU data.
     5576 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    55745577 * @param   pCtx                Where to get the current stack mode.
    55755578 * @param   cbItem              The size of the stack item to pop.
    55765579 * @param   puNewRsp            Where to return the new RSP value.
    55775580 */
    5578 DECLINLINE(RTGCPTR) iemRegGetRspForPush(PCIEMCPU pIemCpu, PCCPUMCTX pCtx, uint8_t cbItem, uint64_t *puNewRsp)
     5581DECLINLINE(RTGCPTR) iemRegGetRspForPush(PCVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t cbItem, uint64_t *puNewRsp)
    55795582{
    55805583    RTUINT64U   uTmpRsp;
     
    55825585    uTmpRsp.u = pCtx->rsp;
    55835586
    5584     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     5587    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    55855588        GCPtrTop = uTmpRsp.u            -= cbItem;
    55865589    else if (pCtx->ss.Attr.n.u1DefBig)
     
    55985601 *
    55995602 * @returns Current stack pointer.
    5600  * @param   pIemCpu             The per CPU data.
     5603 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    56015604 * @param   pCtx                Where to get the current stack mode.
    56025605 * @param   cbItem              The size of the stack item to pop.
    56035606 * @param   puNewRsp            Where to return the new RSP value.
    56045607 */
    5605 DECLINLINE(RTGCPTR) iemRegGetRspForPop(PCIEMCPU pIemCpu, PCCPUMCTX pCtx, uint8_t cbItem, uint64_t *puNewRsp)
     5608DECLINLINE(RTGCPTR) iemRegGetRspForPop(PCVMCPU pVCpu, PCCPUMCTX pCtx, uint8_t cbItem, uint64_t *puNewRsp)
    56065609{
    56075610    RTUINT64U   uTmpRsp;
     
    56095612    uTmpRsp.u = pCtx->rsp;
    56105613
    5611     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     5614    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    56125615    {
    56135616        GCPtrTop = uTmpRsp.u;
     
    56345637 *
    56355638 * @returns Effective stack addressf for the push.
    5636  * @param   pIemCpu             The per CPU data.
     5639 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    56375640 * @param   pCtx                Where to get the current stack mode.
    56385641 * @param   pTmpRsp             The temporary stack pointer.  This is updated.
    56395642 * @param   cbItem              The size of the stack item to pop.
    56405643 */
    5641 DECLINLINE(RTGCPTR) iemRegGetRspForPushEx(PCIEMCPU pIemCpu, PCCPUMCTX pCtx, PRTUINT64U pTmpRsp, uint8_t cbItem)
     5644DECLINLINE(RTGCPTR) iemRegGetRspForPushEx(PCVMCPU pVCpu, PCCPUMCTX pCtx, PRTUINT64U pTmpRsp, uint8_t cbItem)
    56425645{
    56435646    RTGCPTR GCPtrTop;
    56445647
    5645     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     5648    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    56465649        GCPtrTop = pTmpRsp->u          -= cbItem;
    56475650    else if (pCtx->ss.Attr.n.u1DefBig)
     
    56585661 *
    56595662 * @returns Current stack pointer.
    5660  * @param   pIemCpu             The per CPU data.
     5663 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    56615664 * @param   pCtx                Where to get the current stack mode.
    56625665 * @param   pTmpRsp             The temporary stack pointer.  This is updated.
    56635666 * @param   cbItem              The size of the stack item to pop.
    56645667 */
    5665 DECLINLINE(RTGCPTR) iemRegGetRspForPopEx(PCIEMCPU pIemCpu, PCCPUMCTX pCtx, PRTUINT64U pTmpRsp, uint8_t cbItem)
     5668DECLINLINE(RTGCPTR) iemRegGetRspForPopEx(PCVMCPU pVCpu, PCCPUMCTX pCtx, PRTUINT64U pTmpRsp, uint8_t cbItem)
    56665669{
    56675670    RTGCPTR GCPtrTop;
    5668     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     5671    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    56695672    {
    56705673        GCPtrTop = pTmpRsp->u;
     
    56985701 * This is necessary in ring-0 and raw-mode context (nop in ring-3).
    56995702 *
    5700  * @param   pIemCpu             The IEM per CPU data.
    5701  */
    5702 DECLINLINE(void) iemFpuPrepareUsage(PIEMCPU pIemCpu)
     5703 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     5704 */
     5705DECLINLINE(void) iemFpuPrepareUsage(PVMCPU pVCpu)
    57035706{
    57045707#ifdef IN_RING3
    5705     CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_FPU_REM);
     5708    CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_FPU_REM);
    57065709#else
    5707     CPUMRZFpuStatePrepareHostCpuForUse(IEMCPU_TO_VMCPU(pIemCpu));
     5710    CPUMRZFpuStatePrepareHostCpuForUse(pVCpu);
    57085711#endif
    57095712}
     
    57155718 * This is necessary in ring-0 and raw-mode context (nop in ring-3).
    57165719 *
    5717  * @param   pIemCpu             The IEM per CPU data.
    5718  */
    5719 DECLINLINE(void) iemFpuPrepareUsageSse(PIEMCPU pIemCpu)
    5720 {
    5721     iemFpuPrepareUsage(pIemCpu);
     5720 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     5721 */
     5722DECLINLINE(void) iemFpuPrepareUsageSse(PVMCPU pVCpu)
     5723{
     5724    iemFpuPrepareUsage(pVCpu);
    57225725}
    57235726
     
    57285731 * This is necessary in ring-0 and raw-mode context (nop in ring-3).
    57295732 *
    5730  * @param   pIemCpu             The IEM per CPU data.
    5731  */
    5732 DECLINLINE(void) iemFpuActualizeStateForRead(PIEMCPU pIemCpu)
     5733 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     5734 */
     5735DECLINLINE(void) iemFpuActualizeStateForRead(PVMCPU pVCpu)
    57335736{
    57345737#ifdef IN_RING3
    5735     NOREF(pIemCpu);
     5738    NOREF(pVCpu);
    57365739#else
    5737     CPUMRZFpuStateActualizeForRead(IEMCPU_TO_VMCPU(pIemCpu));
     5740    CPUMRZFpuStateActualizeForRead(pVCpu);
    57385741#endif
    57395742}
     
    57455748 * This is necessary in ring-0 and raw-mode context (nop in ring-3).
    57465749 *
    5747  * @param   pIemCpu             The IEM per CPU data.
    5748  */
    5749 DECLINLINE(void) iemFpuActualizeStateForChange(PIEMCPU pIemCpu)
     5750 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     5751 */
     5752DECLINLINE(void) iemFpuActualizeStateForChange(PVMCPU pVCpu)
    57505753{
    57515754#ifdef IN_RING3
    5752     CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_FPU_REM);
     5755    CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_FPU_REM);
    57535756#else
    5754     CPUMRZFpuStateActualizeForChange(IEMCPU_TO_VMCPU(pIemCpu));
     5757    CPUMRZFpuStateActualizeForChange(pVCpu);
    57555758#endif
    57565759}
     
    57625765 * This is necessary in ring-0 and raw-mode context (nop in ring-3).
    57635766 *
    5764  * @param   pIemCpu             The IEM per CPU data.
    5765  */
    5766 DECLINLINE(void) iemFpuActualizeSseStateForRead(PIEMCPU pIemCpu)
     5767 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     5768 */
     5769DECLINLINE(void) iemFpuActualizeSseStateForRead(PVMCPU pVCpu)
    57675770{
    57685771#if defined(IN_RING3) || defined(VBOX_WITH_KERNEL_USING_XMM)
    5769     NOREF(pIemCpu);
     5772    NOREF(pVCpu);
    57705773#else
    5771     CPUMRZFpuStateActualizeSseForRead(IEMCPU_TO_VMCPU(pIemCpu));
     5774    CPUMRZFpuStateActualizeSseForRead(pVCpu);
    57725775#endif
    57735776}
     
    57795782 * This is necessary in ring-0 and raw-mode context (nop in ring-3).
    57805783 *
    5781  * @param   pIemCpu             The IEM per CPU data.
    5782  */
    5783 DECLINLINE(void) iemFpuActualizeSseStateForChange(PIEMCPU pIemCpu)
     5784 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     5785 */
     5786DECLINLINE(void) iemFpuActualizeSseStateForChange(PVMCPU pVCpu)
    57845787{
    57855788#if defined(IN_RING3) || defined(VBOX_WITH_KERNEL_USING_XMM)
    5786     CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_FPU_REM);
     5789    CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_FPU_REM);
    57875790#else
    5788     CPUMRZFpuStateActualizeForChange(IEMCPU_TO_VMCPU(pIemCpu));
     5791    CPUMRZFpuStateActualizeForChange(pVCpu);
    57895792#endif
    57905793}
     
    58075810 * Updates the FOP, FPU.CS and FPUIP registers.
    58085811 *
    5809  * @param   pIemCpu             The IEM per CPU data.
     5812 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    58105813 * @param   pCtx                The CPU context.
    58115814 * @param   pFpuCtx             The FPU context.
    58125815 */
    5813 DECLINLINE(void) iemFpuUpdateOpcodeAndIpWorker(PIEMCPU pIemCpu, PCPUMCTX pCtx, PX86FXSTATE pFpuCtx)
    5814 {
    5815     pFpuCtx->FOP       = pIemCpu->abOpcode[pIemCpu->offFpuOpcode]
    5816                        | ((uint16_t)(pIemCpu->abOpcode[pIemCpu->offFpuOpcode - 1] & 0x7) << 8);
     5816DECLINLINE(void) iemFpuUpdateOpcodeAndIpWorker(PVMCPU pVCpu, PCPUMCTX pCtx, PX86FXSTATE pFpuCtx)
     5817{
     5818    pFpuCtx->FOP       = pVCpu->iem.s.abOpcode[pVCpu->iem.s.offFpuOpcode]
     5819                       | ((uint16_t)(pVCpu->iem.s.abOpcode[pVCpu->iem.s.offFpuOpcode - 1] & 0x7) << 8);
    58175820    /** @todo x87.CS and FPUIP needs to be kept seperately. */
    5818     if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     5821    if (IEM_IS_REAL_OR_V86_MODE(pVCpu))
    58195822    {
    58205823        /** @todo Testcase: making assumptions about how FPUIP and FPUDP are handled
     
    58345837 * Updates the x87.DS and FPUDP registers.
    58355838 *
    5836  * @param   pIemCpu             The IEM per CPU data.
     5839 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    58375840 * @param   pCtx                The CPU context.
    58385841 * @param   pFpuCtx             The FPU context.
     
    58405843 * @param   GCPtrEff            The effective address relative to @a iEffSeg.
    58415844 */
    5842 DECLINLINE(void) iemFpuUpdateDP(PIEMCPU pIemCpu, PCPUMCTX pCtx, PX86FXSTATE pFpuCtx, uint8_t iEffSeg, RTGCPTR GCPtrEff)
     5845DECLINLINE(void) iemFpuUpdateDP(PVMCPU pVCpu, PCPUMCTX pCtx, PX86FXSTATE pFpuCtx, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    58435846{
    58445847    RTSEL sel;
     
    58565859    }
    58575860    /** @todo pFpuCtx->DS and FPUDP needs to be kept seperately. */
    5858     if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     5861    if (IEM_IS_REAL_OR_V86_MODE(pVCpu))
    58595862    {
    58605863        pFpuCtx->DS    = 0;
     
    59155918 * exception prevents it.
    59165919 *
    5917  * @param   pIemCpu             The IEM per CPU data.
     5920 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    59185921 * @param   pResult             The FPU operation result to push.
    59195922 * @param   pFpuCtx             The FPU context.
    59205923 */
    5921 IEM_STATIC void iemFpuMaybePushResult(PIEMCPU pIemCpu, PIEMFPURESULT pResult, PX86FXSTATE pFpuCtx)
     5924IEM_STATIC void iemFpuMaybePushResult(PVMCPU pVCpu, PIEMFPURESULT pResult, PX86FXSTATE pFpuCtx)
    59225925{
    59235926    /* Update FSW and bail if there are pending exceptions afterwards. */
     
    60236026 * Pushes a FPU result onto the FPU stack if no pending exception prevents it.
    60246027 *
    6025  * @param   pIemCpu             The IEM per CPU data.
     6028 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    60266029 * @param   pResult             The FPU operation result to push.
    60276030 */
    6028 IEM_STATIC void iemFpuPushResult(PIEMCPU pIemCpu, PIEMFPURESULT pResult)
    6029 {
    6030     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6031IEM_STATIC void iemFpuPushResult(PVMCPU pVCpu, PIEMFPURESULT pResult)
     6032{
     6033    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    60316034    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6032     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
    6033     iemFpuMaybePushResult(pIemCpu, pResult, pFpuCtx);
     6035    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
     6036    iemFpuMaybePushResult(pVCpu, pResult, pFpuCtx);
    60346037}
    60356038
     
    60396042 * and sets FPUDP and FPUDS.
    60406043 *
    6041  * @param   pIemCpu             The IEM per CPU data.
     6044 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    60426045 * @param   pResult             The FPU operation result to push.
    60436046 * @param   iEffSeg             The effective segment register.
    60446047 * @param   GCPtrEff            The effective address relative to @a iEffSeg.
    60456048 */
    6046 IEM_STATIC void iemFpuPushResultWithMemOp(PIEMCPU pIemCpu, PIEMFPURESULT pResult, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    6047 {
    6048     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6049IEM_STATIC void iemFpuPushResultWithMemOp(PVMCPU pVCpu, PIEMFPURESULT pResult, uint8_t iEffSeg, RTGCPTR GCPtrEff)
     6050{
     6051    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    60496052    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6050     iemFpuUpdateDP(pIemCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
    6051     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
    6052     iemFpuMaybePushResult(pIemCpu, pResult, pFpuCtx);
     6053    iemFpuUpdateDP(pVCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
     6054    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
     6055    iemFpuMaybePushResult(pVCpu, pResult, pFpuCtx);
    60536056}
    60546057
     
    60586061 * unless a pending exception prevents it.
    60596062 *
    6060  * @param   pIemCpu             The IEM per CPU data.
     6063 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    60616064 * @param   pResult             The FPU operation result to store and push.
    60626065 */
    6063 IEM_STATIC void iemFpuPushResultTwo(PIEMCPU pIemCpu, PIEMFPURESULTTWO pResult)
    6064 {
    6065     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6066IEM_STATIC void iemFpuPushResultTwo(PVMCPU pVCpu, PIEMFPURESULTTWO pResult)
     6067{
     6068    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    60666069    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6067     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6070    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    60686071
    60696072    /* Update FSW and bail if there are pending exceptions afterwards. */
     
    61126115 * FOP.
    61136116 *
    6114  * @param   pIemCpu             The IEM per CPU data.
     6117 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    61156118 * @param   pResult             The result to store.
    61166119 * @param   iStReg              Which FPU register to store it in.
    61176120 */
    6118 IEM_STATIC void iemFpuStoreResult(PIEMCPU pIemCpu, PIEMFPURESULT pResult, uint8_t iStReg)
    6119 {
    6120     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6121IEM_STATIC void iemFpuStoreResult(PVMCPU pVCpu, PIEMFPURESULT pResult, uint8_t iStReg)
     6122{
     6123    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    61216124    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6122     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6125    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    61236126    iemFpuStoreResultOnly(pFpuCtx, pResult, iStReg);
    61246127}
     
    61296132 * FOP, and then pops the stack.
    61306133 *
    6131  * @param   pIemCpu             The IEM per CPU data.
     6134 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    61326135 * @param   pResult             The result to store.
    61336136 * @param   iStReg              Which FPU register to store it in.
    61346137 */
    6135 IEM_STATIC void iemFpuStoreResultThenPop(PIEMCPU pIemCpu, PIEMFPURESULT pResult, uint8_t iStReg)
    6136 {
    6137     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6138IEM_STATIC void iemFpuStoreResultThenPop(PVMCPU pVCpu, PIEMFPURESULT pResult, uint8_t iStReg)
     6139{
     6140    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    61386141    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6139     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6142    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    61406143    iemFpuStoreResultOnly(pFpuCtx, pResult, iStReg);
    61416144    iemFpuMaybePopOne(pFpuCtx);
     
    61476150 * FPUDP, and FPUDS.
    61486151 *
    6149  * @param   pIemCpu             The IEM per CPU data.
     6152 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    61506153 * @param   pResult             The result to store.
    61516154 * @param   iStReg              Which FPU register to store it in.
     
    61536156 * @param   GCPtrEff            The effective memory operand offset.
    61546157 */
    6155 IEM_STATIC void iemFpuStoreResultWithMemOp(PIEMCPU pIemCpu, PIEMFPURESULT pResult, uint8_t iStReg,
     6158IEM_STATIC void iemFpuStoreResultWithMemOp(PVMCPU pVCpu, PIEMFPURESULT pResult, uint8_t iStReg,
    61566159                                           uint8_t iEffSeg, RTGCPTR GCPtrEff)
    61576160{
    6158     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6161    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    61596162    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6160     iemFpuUpdateDP(pIemCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
    6161     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6163    iemFpuUpdateDP(pVCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
     6164    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    61626165    iemFpuStoreResultOnly(pFpuCtx, pResult, iStReg);
    61636166}
     
    61686171 * FPUDP, and FPUDS, and then pops the stack.
    61696172 *
    6170  * @param   pIemCpu             The IEM per CPU data.
     6173 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    61716174 * @param   pResult             The result to store.
    61726175 * @param   iStReg              Which FPU register to store it in.
     
    61746177 * @param   GCPtrEff            The effective memory operand offset.
    61756178 */
    6176 IEM_STATIC void iemFpuStoreResultWithMemOpThenPop(PIEMCPU pIemCpu, PIEMFPURESULT pResult,
     6179IEM_STATIC void iemFpuStoreResultWithMemOpThenPop(PVMCPU pVCpu, PIEMFPURESULT pResult,
    61776180                                                  uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    61786181{
    6179     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6182    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    61806183    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6181     iemFpuUpdateDP(pIemCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
    6182     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6184    iemFpuUpdateDP(pVCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
     6185    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    61836186    iemFpuStoreResultOnly(pFpuCtx, pResult, iStReg);
    61846187    iemFpuMaybePopOne(pFpuCtx);
     
    61896192 * Updates the FOP, FPUIP, and FPUCS.  For FNOP.
    61906193 *
    6191  * @param   pIemCpu             The IEM per CPU data.
    6192  */
    6193 IEM_STATIC void iemFpuUpdateOpcodeAndIp(PIEMCPU pIemCpu)
    6194 {
    6195     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6194 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     6195 */
     6196IEM_STATIC void iemFpuUpdateOpcodeAndIp(PVMCPU pVCpu)
     6197{
     6198    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    61966199    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6197     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6200    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    61986201}
    61996202
     
    62026205 * Marks the specified stack register as free (for FFREE).
    62036206 *
    6204  * @param   pIemCpu             The IEM per CPU data.
     6207 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    62056208 * @param   iStReg              The register to free.
    62066209 */
    6207 IEM_STATIC void iemFpuStackFree(PIEMCPU pIemCpu, uint8_t iStReg)
     6210IEM_STATIC void iemFpuStackFree(PVMCPU pVCpu, uint8_t iStReg)
    62086211{
    62096212    Assert(iStReg < 8);
    6210     PX86FXSTATE pFpuCtx = &pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
     6213    PX86FXSTATE pFpuCtx = &pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
    62116214    uint8_t     iReg    = (X86_FSW_TOP_GET(pFpuCtx->FSW) + iStReg) & X86_FSW_TOP_SMASK;
    62126215    pFpuCtx->FTW &= ~RT_BIT(iReg);
     
    62176220 * Increments FSW.TOP, i.e. pops an item off the stack without freeing it.
    62186221 *
    6219  * @param   pIemCpu             The IEM per CPU data.
    6220  */
    6221 IEM_STATIC void iemFpuStackIncTop(PIEMCPU pIemCpu)
    6222 {
    6223     PX86FXSTATE pFpuCtx = &pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
     6222 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     6223 */
     6224IEM_STATIC void iemFpuStackIncTop(PVMCPU pVCpu)
     6225{
     6226    PX86FXSTATE pFpuCtx = &pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
    62246227    uint16_t    uFsw    = pFpuCtx->FSW;
    62256228    uint16_t    uTop    = uFsw & X86_FSW_TOP_MASK;
     
    62346237 * Decrements FSW.TOP, i.e. push an item off the stack without storing anything.
    62356238 *
    6236  * @param   pIemCpu             The IEM per CPU data.
    6237  */
    6238 IEM_STATIC void iemFpuStackDecTop(PIEMCPU pIemCpu)
    6239 {
    6240     PX86FXSTATE pFpuCtx = &pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
     6239 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     6240 */
     6241IEM_STATIC void iemFpuStackDecTop(PVMCPU pVCpu)
     6242{
     6243    PX86FXSTATE pFpuCtx = &pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
    62416244    uint16_t    uFsw    = pFpuCtx->FSW;
    62426245    uint16_t    uTop    = uFsw & X86_FSW_TOP_MASK;
     
    62516254 * Updates the FSW, FOP, FPUIP, and FPUCS.
    62526255 *
    6253  * @param   pIemCpu             The IEM per CPU data.
     6256 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    62546257 * @param   u16FSW              The FSW from the current instruction.
    62556258 */
    6256 IEM_STATIC void iemFpuUpdateFSW(PIEMCPU pIemCpu, uint16_t u16FSW)
    6257 {
    6258     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6259IEM_STATIC void iemFpuUpdateFSW(PVMCPU pVCpu, uint16_t u16FSW)
     6260{
     6261    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    62596262    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6260     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6263    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    62616264    iemFpuUpdateFSWOnly(pFpuCtx, u16FSW);
    62626265}
     
    62666269 * Updates the FSW, FOP, FPUIP, and FPUCS, then pops the stack.
    62676270 *
    6268  * @param   pIemCpu             The IEM per CPU data.
     6271 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    62696272 * @param   u16FSW              The FSW from the current instruction.
    62706273 */
    6271 IEM_STATIC void iemFpuUpdateFSWThenPop(PIEMCPU pIemCpu, uint16_t u16FSW)
    6272 {
    6273     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6274IEM_STATIC void iemFpuUpdateFSWThenPop(PVMCPU pVCpu, uint16_t u16FSW)
     6275{
     6276    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    62746277    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6275     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6278    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    62766279    iemFpuUpdateFSWOnly(pFpuCtx, u16FSW);
    62776280    iemFpuMaybePopOne(pFpuCtx);
     
    62826285 * Updates the FSW, FOP, FPUIP, FPUCS, FPUDP, and FPUDS.
    62836286 *
    6284  * @param   pIemCpu             The IEM per CPU data.
     6287 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    62856288 * @param   u16FSW              The FSW from the current instruction.
    62866289 * @param   iEffSeg             The effective memory operand selector register.
    62876290 * @param   GCPtrEff            The effective memory operand offset.
    62886291 */
    6289 IEM_STATIC void iemFpuUpdateFSWWithMemOp(PIEMCPU pIemCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    6290 {
    6291     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6292IEM_STATIC void iemFpuUpdateFSWWithMemOp(PVMCPU pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff)
     6293{
     6294    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    62926295    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6293     iemFpuUpdateDP(pIemCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
    6294     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6296    iemFpuUpdateDP(pVCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
     6297    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    62956298    iemFpuUpdateFSWOnly(pFpuCtx, u16FSW);
    62966299}
     
    63006303 * Updates the FSW, FOP, FPUIP, and FPUCS, then pops the stack twice.
    63016304 *
    6302  * @param   pIemCpu             The IEM per CPU data.
     6305 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    63036306 * @param   u16FSW              The FSW from the current instruction.
    63046307 */
    6305 IEM_STATIC void iemFpuUpdateFSWThenPopPop(PIEMCPU pIemCpu, uint16_t u16FSW)
    6306 {
    6307     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6308IEM_STATIC void iemFpuUpdateFSWThenPopPop(PVMCPU pVCpu, uint16_t u16FSW)
     6309{
     6310    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    63086311    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6309     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6312    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    63106313    iemFpuUpdateFSWOnly(pFpuCtx, u16FSW);
    63116314    iemFpuMaybePopOne(pFpuCtx);
     
    63176320 * Updates the FSW, FOP, FPUIP, FPUCS, FPUDP, and FPUDS, then pops the stack.
    63186321 *
    6319  * @param   pIemCpu             The IEM per CPU data.
     6322 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    63206323 * @param   u16FSW              The FSW from the current instruction.
    63216324 * @param   iEffSeg             The effective memory operand selector register.
    63226325 * @param   GCPtrEff            The effective memory operand offset.
    63236326 */
    6324 IEM_STATIC void iemFpuUpdateFSWWithMemOpThenPop(PIEMCPU pIemCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    6325 {
    6326     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6327IEM_STATIC void iemFpuUpdateFSWWithMemOpThenPop(PVMCPU pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff)
     6328{
     6329    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    63276330    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6328     iemFpuUpdateDP(pIemCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
    6329     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6331    iemFpuUpdateDP(pVCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
     6332    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    63306333    iemFpuUpdateFSWOnly(pFpuCtx, u16FSW);
    63316334    iemFpuMaybePopOne(pFpuCtx);
     
    63366339 * Worker routine for raising an FPU stack underflow exception.
    63376340 *
    6338  * @param   pIemCpu             The IEM per CPU data.
     6341 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    63396342 * @param   pFpuCtx             The FPU context.
    63406343 * @param   iStReg              The stack register being accessed.
    63416344 */
    6342 IEM_STATIC void iemFpuStackUnderflowOnly(PIEMCPU pIemCpu, PX86FXSTATE pFpuCtx, uint8_t iStReg)
     6345IEM_STATIC void iemFpuStackUnderflowOnly(PVMCPU pVCpu, PX86FXSTATE pFpuCtx, uint8_t iStReg)
    63436346{
    63446347    Assert(iStReg < 8 || iStReg == UINT8_MAX);
     
    63666369 * Raises a FPU stack underflow exception.
    63676370 *
    6368  * @param   pIemCpu             The IEM per CPU data.
     6371 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    63696372 * @param   iStReg              The destination register that should be loaded
    63706373 *                              with QNaN if \#IS is not masked. Specify
    63716374 *                              UINT8_MAX if none (like for fcom).
    63726375 */
    6373 DECL_NO_INLINE(IEM_STATIC, void) iemFpuStackUnderflow(PIEMCPU pIemCpu, uint8_t iStReg)
    6374 {
    6375     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6376DECL_NO_INLINE(IEM_STATIC, void) iemFpuStackUnderflow(PVMCPU pVCpu, uint8_t iStReg)
     6377{
     6378    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    63766379    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6377     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
    6378     iemFpuStackUnderflowOnly(pIemCpu, pFpuCtx, iStReg);
     6380    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
     6381    iemFpuStackUnderflowOnly(pVCpu, pFpuCtx, iStReg);
    63796382}
    63806383
    63816384
    63826385DECL_NO_INLINE(IEM_STATIC, void)
    6383 iemFpuStackUnderflowWithMemOp(PIEMCPU pIemCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    6384 {
    6385     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6386iemFpuStackUnderflowWithMemOp(PVMCPU pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff)
     6387{
     6388    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    63866389    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6387     iemFpuUpdateDP(pIemCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
    6388     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
    6389     iemFpuStackUnderflowOnly(pIemCpu, pFpuCtx, iStReg);
    6390 }
    6391 
    6392 
    6393 DECL_NO_INLINE(IEM_STATIC, void) iemFpuStackUnderflowThenPop(PIEMCPU pIemCpu, uint8_t iStReg)
    6394 {
    6395     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6390    iemFpuUpdateDP(pVCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
     6391    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
     6392    iemFpuStackUnderflowOnly(pVCpu, pFpuCtx, iStReg);
     6393}
     6394
     6395
     6396DECL_NO_INLINE(IEM_STATIC, void) iemFpuStackUnderflowThenPop(PVMCPU pVCpu, uint8_t iStReg)
     6397{
     6398    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    63966399    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6397     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
    6398     iemFpuStackUnderflowOnly(pIemCpu, pFpuCtx, iStReg);
     6400    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
     6401    iemFpuStackUnderflowOnly(pVCpu, pFpuCtx, iStReg);
    63996402    iemFpuMaybePopOne(pFpuCtx);
    64006403}
     
    64026405
    64036406DECL_NO_INLINE(IEM_STATIC, void)
    6404 iemFpuStackUnderflowWithMemOpThenPop(PIEMCPU pIemCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    6405 {
    6406     PCPUMCTX    pCtx      = pIemCpu->CTX_SUFF(pCtx);
     6407iemFpuStackUnderflowWithMemOpThenPop(PVMCPU pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff)
     6408{
     6409    PCPUMCTX    pCtx      = pVCpu->iem.s.CTX_SUFF(pCtx);
    64076410    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6408     iemFpuUpdateDP(pIemCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
    6409     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
    6410     iemFpuStackUnderflowOnly(pIemCpu, pFpuCtx, iStReg);
     6411    iemFpuUpdateDP(pVCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
     6412    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
     6413    iemFpuStackUnderflowOnly(pVCpu, pFpuCtx, iStReg);
    64116414    iemFpuMaybePopOne(pFpuCtx);
    64126415}
    64136416
    64146417
    6415 DECL_NO_INLINE(IEM_STATIC, void) iemFpuStackUnderflowThenPopPop(PIEMCPU pIemCpu)
    6416 {
    6417     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6418DECL_NO_INLINE(IEM_STATIC, void) iemFpuStackUnderflowThenPopPop(PVMCPU pVCpu)
     6419{
     6420    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    64186421    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6419     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
    6420     iemFpuStackUnderflowOnly(pIemCpu, pFpuCtx, UINT8_MAX);
     6422    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
     6423    iemFpuStackUnderflowOnly(pVCpu, pFpuCtx, UINT8_MAX);
    64216424    iemFpuMaybePopOne(pFpuCtx);
    64226425    iemFpuMaybePopOne(pFpuCtx);
     
    64256428
    64266429DECL_NO_INLINE(IEM_STATIC, void)
    6427 iemFpuStackPushUnderflow(PIEMCPU pIemCpu)
    6428 {
    6429     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6430iemFpuStackPushUnderflow(PVMCPU pVCpu)
     6431{
     6432    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    64306433    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6431     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6434    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    64326435
    64336436    if (pFpuCtx->FCW & X86_FCW_IM)
     
    64526455
    64536456DECL_NO_INLINE(IEM_STATIC, void)
    6454 iemFpuStackPushUnderflowTwo(PIEMCPU pIemCpu)
    6455 {
    6456     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6457iemFpuStackPushUnderflowTwo(PVMCPU pVCpu)
     6458{
     6459    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    64576460    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6458     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6461    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    64596462
    64606463    if (pFpuCtx->FCW & X86_FCW_IM)
     
    65096512 * Raises a FPU stack overflow exception on a push.
    65106513 *
    6511  * @param   pIemCpu             The IEM per CPU data.
    6512  */
    6513 DECL_NO_INLINE(IEM_STATIC, void) iemFpuStackPushOverflow(PIEMCPU pIemCpu)
    6514 {
    6515     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6514 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     6515 */
     6516DECL_NO_INLINE(IEM_STATIC, void) iemFpuStackPushOverflow(PVMCPU pVCpu)
     6517{
     6518    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    65166519    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6517     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6520    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    65186521    iemFpuStackPushOverflowOnly(pFpuCtx);
    65196522}
     
    65236526 * Raises a FPU stack overflow exception on a push with a memory operand.
    65246527 *
    6525  * @param   pIemCpu             The IEM per CPU data.
     6528 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    65266529 * @param   iEffSeg             The effective memory operand selector register.
    65276530 * @param   GCPtrEff            The effective memory operand offset.
    65286531 */
    65296532DECL_NO_INLINE(IEM_STATIC, void)
    6530 iemFpuStackPushOverflowWithMemOp(PIEMCPU pIemCpu, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    6531 {
    6532     PCPUMCTX    pCtx    = pIemCpu->CTX_SUFF(pCtx);
     6533iemFpuStackPushOverflowWithMemOp(PVMCPU pVCpu, uint8_t iEffSeg, RTGCPTR GCPtrEff)
     6534{
     6535    PCPUMCTX    pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    65336536    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6534     iemFpuUpdateDP(pIemCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
    6535     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
     6537    iemFpuUpdateDP(pVCpu, pCtx, pFpuCtx, iEffSeg, GCPtrEff);
     6538    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
    65366539    iemFpuStackPushOverflowOnly(pFpuCtx);
    65376540}
    65386541
    65396542
    6540 IEM_STATIC int iemFpuStRegNotEmpty(PIEMCPU pIemCpu, uint8_t iStReg)
    6541 {
    6542     PX86FXSTATE pFpuCtx = &pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
     6543IEM_STATIC int iemFpuStRegNotEmpty(PVMCPU pVCpu, uint8_t iStReg)
     6544{
     6545    PX86FXSTATE pFpuCtx = &pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
    65436546    uint16_t    iReg    = (X86_FSW_TOP_GET(pFpuCtx->FSW) + iStReg) & X86_FSW_TOP_SMASK;
    65446547    if (pFpuCtx->FTW & RT_BIT(iReg))
     
    65486551
    65496552
    6550 IEM_STATIC int iemFpuStRegNotEmptyRef(PIEMCPU pIemCpu, uint8_t iStReg, PCRTFLOAT80U *ppRef)
    6551 {
    6552     PX86FXSTATE pFpuCtx = &pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
     6553IEM_STATIC int iemFpuStRegNotEmptyRef(PVMCPU pVCpu, uint8_t iStReg, PCRTFLOAT80U *ppRef)
     6554{
     6555    PX86FXSTATE pFpuCtx = &pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
    65536556    uint16_t    iReg    = (X86_FSW_TOP_GET(pFpuCtx->FSW) + iStReg) & X86_FSW_TOP_SMASK;
    65546557    if (pFpuCtx->FTW & RT_BIT(iReg))
     
    65616564
    65626565
    6563 IEM_STATIC int iemFpu2StRegsNotEmptyRef(PIEMCPU pIemCpu, uint8_t iStReg0, PCRTFLOAT80U *ppRef0,
     6566IEM_STATIC int iemFpu2StRegsNotEmptyRef(PVMCPU pVCpu, uint8_t iStReg0, PCRTFLOAT80U *ppRef0,
    65646567                                        uint8_t iStReg1, PCRTFLOAT80U *ppRef1)
    65656568{
    6566     PX86FXSTATE pFpuCtx = &pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
     6569    PX86FXSTATE pFpuCtx = &pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
    65676570    uint16_t    iTop    = X86_FSW_TOP_GET(pFpuCtx->FSW);
    65686571    uint16_t    iReg0   = (iTop + iStReg0) & X86_FSW_TOP_SMASK;
     
    65786581
    65796582
    6580 IEM_STATIC int iemFpu2StRegsNotEmptyRefFirst(PIEMCPU pIemCpu, uint8_t iStReg0, PCRTFLOAT80U *ppRef0, uint8_t iStReg1)
    6581 {
    6582     PX86FXSTATE pFpuCtx = &pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
     6583IEM_STATIC int iemFpu2StRegsNotEmptyRefFirst(PVMCPU pVCpu, uint8_t iStReg0, PCRTFLOAT80U *ppRef0, uint8_t iStReg1)
     6584{
     6585    PX86FXSTATE pFpuCtx = &pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87;
    65836586    uint16_t    iTop    = X86_FSW_TOP_GET(pFpuCtx->FSW);
    65846587    uint16_t    iReg0   = (iTop + iStReg0) & X86_FSW_TOP_SMASK;
     
    66826685 * Updates the IEMCPU::cbWritten counter if applicable.
    66836686 *
    6684  * @param   pIemCpu             The IEM per CPU data.
     6687 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    66856688 * @param   fAccess             The access being accounted for.
    66866689 * @param   cbMem               The access size.
    66876690 */
    6688 DECL_FORCE_INLINE(void) iemMemUpdateWrittenCounter(PIEMCPU pIemCpu, uint32_t fAccess, size_t cbMem)
     6691DECL_FORCE_INLINE(void) iemMemUpdateWrittenCounter(PVMCPU pVCpu, uint32_t fAccess, size_t cbMem)
    66896692{
    66906693    if (   (fAccess & (IEM_ACCESS_WHAT_MASK | IEM_ACCESS_TYPE_WRITE)) == (IEM_ACCESS_WHAT_STACK | IEM_ACCESS_TYPE_WRITE)
    66916694        || (fAccess & (IEM_ACCESS_WHAT_MASK | IEM_ACCESS_TYPE_WRITE)) == (IEM_ACCESS_WHAT_DATA | IEM_ACCESS_TYPE_WRITE) )
    6692         pIemCpu->cbWritten += (uint32_t)cbMem;
     6695        pVCpu->iem.s.cbWritten += (uint32_t)cbMem;
    66936696}
    66946697
     
    67006703 * @returns VBox strict status code.
    67016704 *
    6702  * @param   pIemCpu             The IEM per CPU data.
     6705 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    67036706 * @param   pHid                Pointer to the hidden register.
    67046707 * @param   iSegReg             The register number.
     
    67086711 */
    67096712IEM_STATIC VBOXSTRICTRC
    6710 iemMemSegCheckWriteAccessEx(PIEMCPU pIemCpu, PCCPUMSELREGHID pHid, uint8_t iSegReg, uint64_t *pu64BaseAddr)
    6711 {
    6712     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     6713iemMemSegCheckWriteAccessEx(PVMCPU pVCpu, PCCPUMSELREGHID pHid, uint8_t iSegReg, uint64_t *pu64BaseAddr)
     6714{
     6715    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    67136716        *pu64BaseAddr = iSegReg < X86_SREG_FS ? 0 : pHid->u64Base;
    67146717    else
    67156718    {
    67166719        if (!pHid->Attr.n.u1Present)
    6717             return iemRaiseSelectorNotPresentBySegReg(pIemCpu, iSegReg);
     6720            return iemRaiseSelectorNotPresentBySegReg(pVCpu, iSegReg);
    67186721
    67196722        if (   (   (pHid->Attr.n.u4Type & X86_SEL_TYPE_CODE)
    67206723                || !(pHid->Attr.n.u4Type & X86_SEL_TYPE_WRITE) )
    6721             &&  pIemCpu->enmCpuMode != IEMMODE_64BIT )
    6722             return iemRaiseSelectorInvalidAccess(pIemCpu, iSegReg, IEM_ACCESS_DATA_W);
     6724            &&  pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT )
     6725            return iemRaiseSelectorInvalidAccess(pVCpu, iSegReg, IEM_ACCESS_DATA_W);
    67236726        *pu64BaseAddr = pHid->u64Base;
    67246727    }
     
    67336736 * @returns VBox strict status code.
    67346737 *
    6735  * @param   pIemCpu             The IEM per CPU data.
     6738 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    67366739 * @param   pHid                Pointer to the hidden register.
    67376740 * @param   iSegReg             The register number.
     
    67416744 */
    67426745IEM_STATIC VBOXSTRICTRC
    6743 iemMemSegCheckReadAccessEx(PIEMCPU pIemCpu, PCCPUMSELREGHID pHid, uint8_t iSegReg, uint64_t *pu64BaseAddr)
    6744 {
    6745     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     6746iemMemSegCheckReadAccessEx(PVMCPU pVCpu, PCCPUMSELREGHID pHid, uint8_t iSegReg, uint64_t *pu64BaseAddr)
     6747{
     6748    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    67466749        *pu64BaseAddr = iSegReg < X86_SREG_FS ? 0 : pHid->u64Base;
    67476750    else
    67486751    {
    67496752        if (!pHid->Attr.n.u1Present)
    6750             return iemRaiseSelectorNotPresentBySegReg(pIemCpu, iSegReg);
     6753            return iemRaiseSelectorNotPresentBySegReg(pVCpu, iSegReg);
    67516754
    67526755        if ((pHid->Attr.n.u4Type & (X86_SEL_TYPE_CODE | X86_SEL_TYPE_READ)) == X86_SEL_TYPE_CODE)
    6753             return iemRaiseSelectorInvalidAccess(pIemCpu, iSegReg, IEM_ACCESS_DATA_R);
     6756            return iemRaiseSelectorInvalidAccess(pVCpu, iSegReg, IEM_ACCESS_DATA_R);
    67546757        *pu64BaseAddr = pHid->u64Base;
    67556758    }
     
    67656768 * @returns VBox strict status code.
    67666769 *
    6767  * @param   pIemCpu             The IEM per CPU data.
     6770 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    67686771 * @param   fAccess             The kind of access which is being performed.
    67696772 * @param   iSegReg             The index of the segment register to apply.
     
    67756778 */
    67766779IEM_STATIC VBOXSTRICTRC
    6777 iemMemApplySegment(PIEMCPU pIemCpu, uint32_t fAccess, uint8_t iSegReg, size_t cbMem, PRTGCPTR pGCPtrMem)
     6780iemMemApplySegment(PVMCPU pVCpu, uint32_t fAccess, uint8_t iSegReg, size_t cbMem, PRTGCPTR pGCPtrMem)
    67786781{
    67796782    if (iSegReg == UINT8_MAX)
    67806783        return VINF_SUCCESS;
    67816784
    6782     PCPUMSELREGHID pSel = iemSRegGetHid(pIemCpu, iSegReg);
    6783     switch (pIemCpu->enmCpuMode)
     6785    PCPUMSELREGHID pSel = iemSRegGetHid(pVCpu, iSegReg);
     6786    switch (pVCpu->iem.s.enmCpuMode)
    67846787    {
    67856788        case IEMMODE_16BIT:
     
    67976800                    if (   (fAccess & IEM_ACCESS_TYPE_WRITE)
    67986801                        && !(pSel->Attr.n.u4Type & X86_SEL_TYPE_WRITE) )
    6799                         return iemRaiseSelectorInvalidAccess(pIemCpu, iSegReg, fAccess);
    6800 
    6801                     if (!IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     6802                        return iemRaiseSelectorInvalidAccess(pVCpu, iSegReg, fAccess);
     6803
     6804                    if (!IEM_IS_REAL_OR_V86_MODE(pVCpu))
    68026805                    {
    68036806                        /** @todo CPL check. */
     
    68116814                        if (   GCPtrFirst32 > pSel->u32Limit
    68126815                            || GCPtrLast32  > pSel->u32Limit) /* yes, in real mode too (since 80286). */
    6813                             return iemRaiseSelectorBounds(pIemCpu, iSegReg, fAccess);
     6816                            return iemRaiseSelectorBounds(pVCpu, iSegReg, fAccess);
    68146817                    }
    68156818                    else
     
    68206823                       if (   GCPtrFirst32 < pSel->u32Limit + UINT32_C(1)
    68216824                           || GCPtrLast32  > (pSel->Attr.n.u1DefBig ? UINT32_MAX : UINT32_C(0xffff)))
    6822                           return iemRaiseSelectorBounds(pIemCpu, iSegReg, fAccess);
     6825                          return iemRaiseSelectorBounds(pVCpu, iSegReg, fAccess);
    68236826                    }
    68246827                    *pGCPtrMem = GCPtrFirst32 += (uint32_t)pSel->u64Base;
     
    68346837                            || (   (fAccess & IEM_ACCESS_TYPE_READ)
    68356838                               && !(pSel->Attr.n.u4Type & X86_SEL_TYPE_READ)) )
    6836                         && !IEM_IS_REAL_OR_V86_MODE(pIemCpu) )
    6837                         return iemRaiseSelectorInvalidAccess(pIemCpu, iSegReg, fAccess);
     6839                        && !IEM_IS_REAL_OR_V86_MODE(pVCpu) )
     6840                        return iemRaiseSelectorInvalidAccess(pVCpu, iSegReg, fAccess);
    68386841
    68396842                    if (   GCPtrFirst32 > pSel->u32Limit
    68406843                        || GCPtrLast32  > pSel->u32Limit) /* yes, in real mode too (since 80286). */
    6841                         return iemRaiseSelectorBounds(pIemCpu, iSegReg, fAccess);
    6842 
    6843                     if (!IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     6844                        return iemRaiseSelectorBounds(pVCpu, iSegReg, fAccess);
     6845
     6846                    if (!IEM_IS_REAL_OR_V86_MODE(pVCpu))
    68446847                    {
    68456848                        /** @todo CPL check. */
     
    68506853            }
    68516854            else
    6852                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     6855                return iemRaiseGeneralProtectionFault0(pVCpu);
    68536856            return VINF_SUCCESS;
    68546857        }
     
    68636866            if (RT_LIKELY(X86_IS_CANONICAL(GCPtrMem) && X86_IS_CANONICAL(GCPtrMem + cbMem - 1)))
    68646867                return VINF_SUCCESS;
    6865             return iemRaiseGeneralProtectionFault0(pIemCpu);
     6868            return iemRaiseGeneralProtectionFault0(pVCpu);
    68666869        }
    68676870
     
    68766879 * can access the page as specified.
    68776880 *
    6878  * @param   pIemCpu             The IEM per CPU data.
     6881 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    68796882 * @param   GCPtrMem            The virtual address.
    68806883 * @param   fAccess             The intended access.
     
    68826885 */
    68836886IEM_STATIC VBOXSTRICTRC
    6884 iemMemPageTranslateAndCheckAccess(PIEMCPU pIemCpu, RTGCPTR GCPtrMem, uint32_t fAccess, PRTGCPHYS pGCPhysMem)
     6887iemMemPageTranslateAndCheckAccess(PVMCPU pVCpu, RTGCPTR GCPtrMem, uint32_t fAccess, PRTGCPHYS pGCPhysMem)
    68856888{
    68866889    /** @todo Need a different PGM interface here.  We're currently using
     
    68886891    RTGCPHYS    GCPhys;
    68896892    uint64_t    fFlags;
    6890     int rc = PGMGstGetPage(IEMCPU_TO_VMCPU(pIemCpu), GCPtrMem, &fFlags, &GCPhys);
     6893    int rc = PGMGstGetPage(pVCpu, GCPtrMem, &fFlags, &GCPhys);
    68916894    if (RT_FAILURE(rc))
    68926895    {
     
    68946897        /** @todo Reserved bits in page tables. Requires new PGM interface. */
    68956898        *pGCPhysMem = NIL_RTGCPHYS;
    6896         return iemRaisePageFault(pIemCpu, GCPtrMem, fAccess, rc);
     6899        return iemRaisePageFault(pVCpu, GCPtrMem, fAccess, rc);
    68976900    }
    68986901
     
    69046907        if (   (fAccess & IEM_ACCESS_TYPE_WRITE)
    69056908            && !(fFlags & X86_PTE_RW)
    6906             && (   pIemCpu->uCpl != 0
    6907                 || (pIemCpu->CTX_SUFF(pCtx)->cr0 & X86_CR0_WP)))
     6909            && (   pVCpu->iem.s.uCpl != 0
     6910                || (pVCpu->iem.s.CTX_SUFF(pCtx)->cr0 & X86_CR0_WP)))
    69086911        {
    69096912            Log(("iemMemPageTranslateAndCheckAccess: GCPtrMem=%RGv - read-only page -> #PF\n", GCPtrMem));
    69106913            *pGCPhysMem = NIL_RTGCPHYS;
    6911             return iemRaisePageFault(pIemCpu, GCPtrMem, fAccess & ~IEM_ACCESS_TYPE_READ, VERR_ACCESS_DENIED);
     6914            return iemRaisePageFault(pVCpu, GCPtrMem, fAccess & ~IEM_ACCESS_TYPE_READ, VERR_ACCESS_DENIED);
    69126915        }
    69136916
    69146917        /* Kernel memory accessed by userland? */
    69156918        if (   !(fFlags & X86_PTE_US)
    6916             && pIemCpu->uCpl == 3
     6919            && pVCpu->iem.s.uCpl == 3
    69176920            && !(fAccess & IEM_ACCESS_WHAT_SYS))
    69186921        {
    69196922            Log(("iemMemPageTranslateAndCheckAccess: GCPtrMem=%RGv - user access to kernel page -> #PF\n", GCPtrMem));
    69206923            *pGCPhysMem = NIL_RTGCPHYS;
    6921             return iemRaisePageFault(pIemCpu, GCPtrMem, fAccess, VERR_ACCESS_DENIED);
     6924            return iemRaisePageFault(pVCpu, GCPtrMem, fAccess, VERR_ACCESS_DENIED);
    69226925        }
    69236926
     
    69256928        if (   (fAccess & IEM_ACCESS_TYPE_EXEC)
    69266929            && (fFlags & X86_PTE_PAE_NX)
    6927             && (pIemCpu->CTX_SUFF(pCtx)->msrEFER & MSR_K6_EFER_NXE) )
     6930            && (pVCpu->iem.s.CTX_SUFF(pCtx)->msrEFER & MSR_K6_EFER_NXE) )
    69286931        {
    69296932            Log(("iemMemPageTranslateAndCheckAccess: GCPtrMem=%RGv - NX -> #PF\n", GCPtrMem));
    69306933            *pGCPhysMem = NIL_RTGCPHYS;
    6931             return iemRaisePageFault(pIemCpu, GCPtrMem, fAccess & ~(IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE),
     6934            return iemRaisePageFault(pVCpu, GCPtrMem, fAccess & ~(IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE),
    69326935                                     VERR_ACCESS_DENIED);
    69336936        }
     
    69426945    if ((fFlags & fAccessedDirty) != fAccessedDirty)
    69436946    {
    6944         int rc2 = PGMGstModifyPage(IEMCPU_TO_VMCPU(pIemCpu), GCPtrMem, 1, fAccessedDirty, ~(uint64_t)fAccessedDirty);
     6947        int rc2 = PGMGstModifyPage(pVCpu, GCPtrMem, 1, fAccessedDirty, ~(uint64_t)fAccessedDirty);
    69456948        AssertRC(rc2);
    69466949    }
     
    69576960 *
    69586961 * @returns VBox status code (see PGMR3PhysTlbGCPhys2Ptr).
    6959  * @param   pIemCpu             The IEM per CPU data.
     6962 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    69606963 * @param   GCPhysMem           The physical address.
    69616964 * @param   fAccess             The intended access.
     
    69636966 * @param   pLock               The PGM lock.
    69646967 */
    6965 IEM_STATIC int iemMemPageMap(PIEMCPU pIemCpu, RTGCPHYS GCPhysMem, uint32_t fAccess, void **ppvMem, PPGMPAGEMAPLOCK pLock)
     6968IEM_STATIC int iemMemPageMap(PVMCPU pVCpu, RTGCPHYS GCPhysMem, uint32_t fAccess, void **ppvMem, PPGMPAGEMAPLOCK pLock)
    69666969{
    69676970#ifdef IEM_VERIFICATION_MODE_FULL
    69686971    /* Force the alternative path so we can ignore writes. */
    6969     if ((fAccess & IEM_ACCESS_TYPE_WRITE) && !pIemCpu->fNoRem)
    6970     {
    6971         if (IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
     6972    if ((fAccess & IEM_ACCESS_TYPE_WRITE) && !pVCpu->iem.s.fNoRem)
     6973    {
     6974        if (IEM_FULL_VERIFICATION_ENABLED(pVCpu))
    69726975        {
    6973             int rc2 = PGMPhysIemQueryAccess(IEMCPU_TO_VM(pIemCpu), GCPhysMem,
    6974                                             RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE), pIemCpu->fBypassHandlers);
     6976            int rc2 = PGMPhysIemQueryAccess(pVCpu->CTX_SUFF(pVM), GCPhysMem,
     6977                                            RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE), pVCpu->iem.s.fBypassHandlers);
    69756978            if (RT_FAILURE(rc2))
    6976                 pIemCpu->fProblematicMemory = true;
     6979                pVCpu->iem.s.fProblematicMemory = true;
    69776980        }
    69786981        return VERR_PGM_PHYS_TLB_CATCH_ALL;
     
    69916994     *        living in PGM, but with publicly accessible inlined access methods
    69926995     *        could perhaps be an even better solution. */
    6993     int rc = PGMPhysIemGCPhys2Ptr(IEMCPU_TO_VM(pIemCpu), IEMCPU_TO_VMCPU(pIemCpu),
     6996    int rc = PGMPhysIemGCPhys2Ptr(pVCpu->CTX_SUFF(pVM), pVCpu,
    69946997                                  GCPhysMem,
    69956998                                  RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE),
    6996                                   pIemCpu->fBypassHandlers,
     6999                                  pVCpu->iem.s.fBypassHandlers,
    69977000                                  ppvMem,
    69987001                                  pLock);
     
    70017004
    70027005#ifdef IEM_VERIFICATION_MODE_FULL
    7003     if (RT_FAILURE(rc) && IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
    7004         pIemCpu->fProblematicMemory = true;
     7006    if (RT_FAILURE(rc) && IEM_FULL_VERIFICATION_ENABLED(pVCpu))
     7007        pVCpu->iem.s.fProblematicMemory = true;
    70057008#endif
    70067009    return rc;
     
    70117014 * Unmap a page previously mapped by iemMemPageMap.
    70127015 *
    7013  * @param   pIemCpu             The IEM per CPU data.
     7016 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    70147017 * @param   GCPhysMem           The physical address.
    70157018 * @param   fAccess             The intended access.
     
    70177020 * @param   pLock               The PGM lock.
    70187021 */
    7019 DECLINLINE(void) iemMemPageUnmap(PIEMCPU pIemCpu, RTGCPHYS GCPhysMem, uint32_t fAccess, const void *pvMem, PPGMPAGEMAPLOCK pLock)
    7020 {
    7021     NOREF(pIemCpu);
     7022DECLINLINE(void) iemMemPageUnmap(PVMCPU pVCpu, RTGCPHYS GCPhysMem, uint32_t fAccess, const void *pvMem, PPGMPAGEMAPLOCK pLock)
     7023{
     7024    NOREF(pVCpu);
    70227025    NOREF(GCPhysMem);
    70237026    NOREF(fAccess);
    70247027    NOREF(pvMem);
    7025     PGMPhysReleasePageMappingLock(IEMCPU_TO_VM(pIemCpu), pLock);
     7028    PGMPhysReleasePageMappingLock(pVCpu->CTX_SUFF(pVM), pLock);
    70267029}
    70277030
     
    70317034 *
    70327035 * @returns The mapping index (positive) or VERR_NOT_FOUND (negative).
    7033  * @param   pIemCpu         The IEM per CPU data.
     7036 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    70347037 * @param   pvMem           The memory address.
    70357038 * @param   fAccess         The access to.
    70367039 */
    7037 DECLINLINE(int) iemMapLookup(PIEMCPU pIemCpu, void *pvMem, uint32_t fAccess)
    7038 {
    7039     Assert(pIemCpu->cActiveMappings < RT_ELEMENTS(pIemCpu->aMemMappings));
     7040DECLINLINE(int) iemMapLookup(PVMCPU pVCpu, void *pvMem, uint32_t fAccess)
     7041{
     7042    Assert(pVCpu->iem.s.cActiveMappings < RT_ELEMENTS(pVCpu->iem.s.aMemMappings));
    70407043    fAccess &= IEM_ACCESS_WHAT_MASK | IEM_ACCESS_TYPE_MASK;
    7041     if (   pIemCpu->aMemMappings[0].pv == pvMem
    7042         && (pIemCpu->aMemMappings[0].fAccess & (IEM_ACCESS_WHAT_MASK | IEM_ACCESS_TYPE_MASK)) == fAccess)
     7044    if (   pVCpu->iem.s.aMemMappings[0].pv == pvMem
     7045        && (pVCpu->iem.s.aMemMappings[0].fAccess & (IEM_ACCESS_WHAT_MASK | IEM_ACCESS_TYPE_MASK)) == fAccess)
    70437046        return 0;
    7044     if (   pIemCpu->aMemMappings[1].pv == pvMem
    7045         && (pIemCpu->aMemMappings[1].fAccess & (IEM_ACCESS_WHAT_MASK | IEM_ACCESS_TYPE_MASK)) == fAccess)
     7047    if (   pVCpu->iem.s.aMemMappings[1].pv == pvMem
     7048        && (pVCpu->iem.s.aMemMappings[1].fAccess & (IEM_ACCESS_WHAT_MASK | IEM_ACCESS_TYPE_MASK)) == fAccess)
    70467049        return 1;
    7047     if (   pIemCpu->aMemMappings[2].pv == pvMem
    7048         && (pIemCpu->aMemMappings[2].fAccess & (IEM_ACCESS_WHAT_MASK | IEM_ACCESS_TYPE_MASK)) == fAccess)
     7050    if (   pVCpu->iem.s.aMemMappings[2].pv == pvMem
     7051        && (pVCpu->iem.s.aMemMappings[2].fAccess & (IEM_ACCESS_WHAT_MASK | IEM_ACCESS_TYPE_MASK)) == fAccess)
    70497052        return 2;
    70507053    return VERR_NOT_FOUND;
     
    70567059 *
    70577060 * @returns Memory mapping index, 1024 on failure.
    7058  * @param   pIemCpu             The IEM per CPU data.
    7059  */
    7060 IEM_STATIC unsigned iemMemMapFindFree(PIEMCPU pIemCpu)
     7061 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     7062 */
     7063IEM_STATIC unsigned iemMemMapFindFree(PVMCPU pVCpu)
    70617064{
    70627065    /*
    70637066     * The easy case.
    70647067     */
    7065     if (pIemCpu->cActiveMappings == 0)
    7066     {
    7067         pIemCpu->iNextMapping = 1;
     7068    if (pVCpu->iem.s.cActiveMappings == 0)
     7069    {
     7070        pVCpu->iem.s.iNextMapping = 1;
    70687071        return 0;
    70697072    }
    70707073
    70717074    /* There should be enough mappings for all instructions. */
    7072     AssertReturn(pIemCpu->cActiveMappings < RT_ELEMENTS(pIemCpu->aMemMappings), 1024);
    7073 
    7074     for (unsigned i = 0; i < RT_ELEMENTS(pIemCpu->aMemMappings); i++)
    7075         if (pIemCpu->aMemMappings[i].fAccess == IEM_ACCESS_INVALID)
     7075    AssertReturn(pVCpu->iem.s.cActiveMappings < RT_ELEMENTS(pVCpu->iem.s.aMemMappings), 1024);
     7076
     7077    for (unsigned i = 0; i < RT_ELEMENTS(pVCpu->iem.s.aMemMappings); i++)
     7078        if (pVCpu->iem.s.aMemMappings[i].fAccess == IEM_ACCESS_INVALID)
    70767079            return i;
    70777080
     
    70847087 *
    70857088 * @returns Strict VBox status code.
    7086  * @param   pIemCpu         The IEM per CPU data.
     7089 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    70877090 * @param   iMemMap         The index of the buffer to commit.
    70887091 * @param   fPostponeFail   Whether we can postpone writer failures to ring-3.
    70897092 *                          Always false in ring-3, obviously.
    70907093 */
    7091 IEM_STATIC VBOXSTRICTRC iemMemBounceBufferCommitAndUnmap(PIEMCPU pIemCpu, unsigned iMemMap, bool fPostponeFail)
    7092 {
    7093     Assert(pIemCpu->aMemMappings[iMemMap].fAccess & IEM_ACCESS_BOUNCE_BUFFERED);
    7094     Assert(pIemCpu->aMemMappings[iMemMap].fAccess & IEM_ACCESS_TYPE_WRITE);
     7094IEM_STATIC VBOXSTRICTRC iemMemBounceBufferCommitAndUnmap(PVMCPU pVCpu, unsigned iMemMap, bool fPostponeFail)
     7095{
     7096    Assert(pVCpu->iem.s.aMemMappings[iMemMap].fAccess & IEM_ACCESS_BOUNCE_BUFFERED);
     7097    Assert(pVCpu->iem.s.aMemMappings[iMemMap].fAccess & IEM_ACCESS_TYPE_WRITE);
    70957098#ifdef IN_RING3
    70967099    Assert(!fPostponeFail);
     
    71017104     */
    71027105#ifndef IEM_VERIFICATION_MODE_MINIMAL
    7103     PVM          pVM = IEMCPU_TO_VM(pIemCpu);
    7104     if (   !pIemCpu->aMemBbMappings[iMemMap].fUnassigned
    7105         && !IEM_VERIFICATION_ENABLED(pIemCpu))
    7106     {
    7107         uint16_t const  cbFirst  = pIemCpu->aMemBbMappings[iMemMap].cbFirst;
    7108         uint16_t const  cbSecond = pIemCpu->aMemBbMappings[iMemMap].cbSecond;
    7109         uint8_t const  *pbBuf    = &pIemCpu->aBounceBuffers[iMemMap].ab[0];
    7110         if (!pIemCpu->fBypassHandlers)
     7106    PVM          pVM = pVCpu->CTX_SUFF(pVM);
     7107    if (   !pVCpu->iem.s.aMemBbMappings[iMemMap].fUnassigned
     7108        && !IEM_VERIFICATION_ENABLED(pVCpu))
     7109    {
     7110        uint16_t const  cbFirst  = pVCpu->iem.s.aMemBbMappings[iMemMap].cbFirst;
     7111        uint16_t const  cbSecond = pVCpu->iem.s.aMemBbMappings[iMemMap].cbSecond;
     7112        uint8_t const  *pbBuf    = &pVCpu->iem.s.aBounceBuffers[iMemMap].ab[0];
     7113        if (!pVCpu->iem.s.fBypassHandlers)
    71117114        {
    71127115            /*
     
    71157118             */
    71167119            VBOXSTRICTRC rcStrict = PGMPhysWrite(pVM,
    7117                                                  pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst,
     7120                                                 pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst,
    71187121                                                 pbBuf,
    71197122                                                 cbFirst,
     
    71247127                {
    71257128                    rcStrict = PGMPhysWrite(pVM,
    7126                                             pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond,
     7129                                            pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond,
    71277130                                            pbBuf + cbFirst,
    71287131                                            cbSecond,
     
    71337136                    {
    71347137                        Log(("iemMemBounceBufferCommitAndUnmap: PGMPhysWrite GCPhysFirst=%RGp/%#x GCPhysSecond=%RGp/%#x %Rrc\n",
    7135                              pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
    7136                              pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict) ));
    7137                         rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     7138                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
     7139                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict) ));
     7140                        rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    71387141                    }
    71397142# ifndef IN_RING3
     
    71417144                    {
    71427145                        Log(("iemMemBounceBufferCommitAndUnmap: PGMPhysWrite GCPhysFirst=%RGp/%#x GCPhysSecond=%RGp/%#x %Rrc (postponed)\n",
    7143                              pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
    7144                              pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict) ));
    7145                         pIemCpu->aMemMappings[iMemMap].fAccess |= IEM_ACCESS_PENDING_R3_WRITE_2ND;
    7146                         VMCPU_FF_SET(IEMCPU_TO_VMCPU(pIemCpu), VMCPU_FF_IEM);
    7147                         return iemSetPassUpStatus(pIemCpu, rcStrict);
     7146                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
     7147                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict) ));
     7148                        pVCpu->iem.s.aMemMappings[iMemMap].fAccess |= IEM_ACCESS_PENDING_R3_WRITE_2ND;
     7149                        VMCPU_FF_SET(pVCpu, VMCPU_FF_IEM);
     7150                        return iemSetPassUpStatus(pVCpu, rcStrict);
    71487151                    }
    71497152# endif
     
    71517154                    {
    71527155                        Log(("iemMemBounceBufferCommitAndUnmap: PGMPhysWrite GCPhysFirst=%RGp/%#x GCPhysSecond=%RGp/%#x %Rrc (!!)\n",
    7153                              pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
    7154                              pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict) ));
     7156                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
     7157                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict) ));
    71557158                        return rcStrict;
    71567159                    }
     
    71627165                {
    71637166                    Log(("iemMemBounceBufferCommitAndUnmap: PGMPhysWrite GCPhysFirst=%RGp/%#x %Rrc\n",
    7164                          pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst, VBOXSTRICTRC_VAL(rcStrict) ));
    7165                     rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     7167                         pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, cbFirst, VBOXSTRICTRC_VAL(rcStrict) ));
     7168                    rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    71667169                }
    71677170                else
    71687171                {
    71697172                    VBOXSTRICTRC rcStrict2 = PGMPhysWrite(pVM,
    7170                                                           pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond,
     7173                                                          pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond,
    71717174                                                          pbBuf + cbFirst,
    71727175                                                          cbSecond,
     
    71757178                    {
    71767179                        Log(("iemMemBounceBufferCommitAndUnmap: PGMPhysWrite GCPhysFirst=%RGp/%#x %Rrc GCPhysSecond=%RGp/%#x\n",
    7177                              pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst, VBOXSTRICTRC_VAL(rcStrict),
    7178                              pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond));
    7179                         rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     7180                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, cbFirst, VBOXSTRICTRC_VAL(rcStrict),
     7181                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, cbSecond));
     7182                        rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    71807183                    }
    71817184                    else if (PGM_PHYS_RW_IS_SUCCESS(rcStrict2))
    71827185                    {
    71837186                        Log(("iemMemBounceBufferCommitAndUnmap: PGMPhysWrite GCPhysFirst=%RGp/%#x %Rrc GCPhysSecond=%RGp/%#x %Rrc\n",
    7184                              pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst, VBOXSTRICTRC_VAL(rcStrict),
    7185                              pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict2) ));
     7187                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, cbFirst, VBOXSTRICTRC_VAL(rcStrict),
     7188                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict2) ));
    71867189                        PGM_PHYS_RW_DO_UPDATE_STRICT_RC(rcStrict, rcStrict2);
    7187                         rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     7190                        rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    71887191                    }
    71897192# ifndef IN_RING3
     
    71917194                    {
    71927195                        Log(("iemMemBounceBufferCommitAndUnmap: PGMPhysWrite GCPhysFirst=%RGp/%#x GCPhysSecond=%RGp/%#x %Rrc (postponed)\n",
    7193                              pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
    7194                              pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict) ));
    7195                         pIemCpu->aMemMappings[iMemMap].fAccess |= IEM_ACCESS_PENDING_R3_WRITE_2ND;
    7196                         VMCPU_FF_SET(IEMCPU_TO_VMCPU(pIemCpu), VMCPU_FF_IEM);
    7197                         return iemSetPassUpStatus(pIemCpu, rcStrict);
     7196                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
     7197                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict) ));
     7198                        pVCpu->iem.s.aMemMappings[iMemMap].fAccess |= IEM_ACCESS_PENDING_R3_WRITE_2ND;
     7199                        VMCPU_FF_SET(pVCpu, VMCPU_FF_IEM);
     7200                        return iemSetPassUpStatus(pVCpu, rcStrict);
    71987201                    }
    71997202# endif
     
    72017204                    {
    72027205                        Log(("iemMemBounceBufferCommitAndUnmap: PGMPhysWrite GCPhysFirst=%RGp/%#x %Rrc GCPhysSecond=%RGp/%#x %Rrc (!!)\n",
    7203                              pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst, VBOXSTRICTRC_VAL(rcStrict),
    7204                              pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict2) ));
     7206                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, cbFirst, VBOXSTRICTRC_VAL(rcStrict),
     7207                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict2) ));
    72057208                        return rcStrict2;
    72067209                    }
     
    72117214            {
    72127215                Log(("iemMemBounceBufferCommitAndUnmap: PGMPhysWrite GCPhysFirst=%RGp/%#x GCPhysSecond=%RGp/%#x %Rrc (postponed)\n",
    7213                      pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
    7214                      pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict) ));
     7216                     pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
     7217                     pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, VBOXSTRICTRC_VAL(rcStrict) ));
    72157218                if (!cbSecond)
    7216                     pIemCpu->aMemMappings[iMemMap].fAccess |= IEM_ACCESS_PENDING_R3_WRITE_1ST;
     7219                    pVCpu->iem.s.aMemMappings[iMemMap].fAccess |= IEM_ACCESS_PENDING_R3_WRITE_1ST;
    72177220                else
    7218                     pIemCpu->aMemMappings[iMemMap].fAccess |= IEM_ACCESS_PENDING_R3_WRITE_1ST | IEM_ACCESS_PENDING_R3_WRITE_2ND;
    7219                 VMCPU_FF_SET(IEMCPU_TO_VMCPU(pIemCpu), VMCPU_FF_IEM);
    7220                 return iemSetPassUpStatus(pIemCpu, rcStrict);
     7221                    pVCpu->iem.s.aMemMappings[iMemMap].fAccess |= IEM_ACCESS_PENDING_R3_WRITE_1ST | IEM_ACCESS_PENDING_R3_WRITE_2ND;
     7222                VMCPU_FF_SET(pVCpu, VMCPU_FF_IEM);
     7223                return iemSetPassUpStatus(pVCpu, rcStrict);
    72217224            }
    72227225# endif
     
    72247227            {
    72257228                Log(("iemMemBounceBufferCommitAndUnmap: PGMPhysWrite GCPhysFirst=%RGp/%#x %Rrc [GCPhysSecond=%RGp/%#x] (!!)\n",
    7226                      pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst, VBOXSTRICTRC_VAL(rcStrict),
    7227                      pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond));
     7229                     pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, cbFirst, VBOXSTRICTRC_VAL(rcStrict),
     7230                     pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, cbSecond));
    72287231                return rcStrict;
    72297232            }
     
    72347237             * No access handlers, much simpler.
    72357238             */
    7236             int rc = PGMPhysSimpleWriteGCPhys(pVM, pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, pbBuf, cbFirst);
     7239            int rc = PGMPhysSimpleWriteGCPhys(pVM, pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, pbBuf, cbFirst);
    72377240            if (RT_SUCCESS(rc))
    72387241            {
    72397242                if (cbSecond)
    72407243                {
    7241                     rc = PGMPhysSimpleWriteGCPhys(pVM, pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, pbBuf + cbFirst, cbSecond);
     7244                    rc = PGMPhysSimpleWriteGCPhys(pVM, pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, pbBuf + cbFirst, cbSecond);
    72427245                    if (RT_SUCCESS(rc))
    72437246                    { /* likely */ }
     
    72457248                    {
    72467249                        Log(("iemMemBounceBufferCommitAndUnmap: PGMPhysSimpleWriteGCPhys GCPhysFirst=%RGp/%#x GCPhysSecond=%RGp/%#x %Rrc (!!)\n",
    7247                              pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
    7248                              pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, rc));
     7250                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
     7251                             pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, rc));
    72497252                        return rc;
    72507253                    }
     
    72547257            {
    72557258                Log(("iemMemBounceBufferCommitAndUnmap: PGMPhysSimpleWriteGCPhys GCPhysFirst=%RGp/%#x %Rrc [GCPhysSecond=%RGp/%#x] (!!)\n",
    7256                      pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst, rc,
    7257                      pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond));
     7259                     pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, cbFirst, rc,
     7260                     pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, cbSecond));
    72587261                return rc;
    72597262            }
     
    72667269     * Record the write(s).
    72677270     */
    7268     if (!pIemCpu->fNoRem)
    7269     {
    7270         PIEMVERIFYEVTREC pEvtRec = iemVerifyAllocRecord(pIemCpu);
     7271    if (!pVCpu->iem.s.fNoRem)
     7272    {
     7273        PIEMVERIFYEVTREC pEvtRec = iemVerifyAllocRecord(pVCpu);
    72717274        if (pEvtRec)
    72727275        {
    72737276            pEvtRec->enmEvent = IEMVERIFYEVENT_RAM_WRITE;
    7274             pEvtRec->u.RamWrite.GCPhys  = pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst;
    7275             pEvtRec->u.RamWrite.cb      = pIemCpu->aMemBbMappings[iMemMap].cbFirst;
    7276             memcpy(pEvtRec->u.RamWrite.ab, &pIemCpu->aBounceBuffers[iMemMap].ab[0], pIemCpu->aMemBbMappings[iMemMap].cbFirst);
    7277             AssertCompile(sizeof(pEvtRec->u.RamWrite.ab) == sizeof(pIemCpu->aBounceBuffers[0].ab));
    7278             pEvtRec->pNext = *pIemCpu->ppIemEvtRecNext;
    7279             *pIemCpu->ppIemEvtRecNext = pEvtRec;
     7277            pEvtRec->u.RamWrite.GCPhys  = pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst;
     7278            pEvtRec->u.RamWrite.cb      = pVCpu->iem.s.aMemBbMappings[iMemMap].cbFirst;
     7279            memcpy(pEvtRec->u.RamWrite.ab, &pVCpu->iem.s.aBounceBuffers[iMemMap].ab[0], pVCpu->iem.s.aMemBbMappings[iMemMap].cbFirst);
     7280            AssertCompile(sizeof(pEvtRec->u.RamWrite.ab) == sizeof(pVCpu->iem.s.aBounceBuffers[0].ab));
     7281            pEvtRec->pNext = *pVCpu->iem.s.ppIemEvtRecNext;
     7282            *pVCpu->iem.s.ppIemEvtRecNext = pEvtRec;
    72807283        }
    7281         if (pIemCpu->aMemBbMappings[iMemMap].cbSecond)
     7284        if (pVCpu->iem.s.aMemBbMappings[iMemMap].cbSecond)
    72827285        {
    7283             pEvtRec = iemVerifyAllocRecord(pIemCpu);
     7286            pEvtRec = iemVerifyAllocRecord(pVCpu);
    72847287            if (pEvtRec)
    72857288            {
    72867289                pEvtRec->enmEvent = IEMVERIFYEVENT_RAM_WRITE;
    7287                 pEvtRec->u.RamWrite.GCPhys  = pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond;
    7288                 pEvtRec->u.RamWrite.cb      = pIemCpu->aMemBbMappings[iMemMap].cbSecond;
     7290                pEvtRec->u.RamWrite.GCPhys  = pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond;
     7291                pEvtRec->u.RamWrite.cb      = pVCpu->iem.s.aMemBbMappings[iMemMap].cbSecond;
    72897292                memcpy(pEvtRec->u.RamWrite.ab,
    7290                        &pIemCpu->aBounceBuffers[iMemMap].ab[pIemCpu->aMemBbMappings[iMemMap].cbFirst],
    7291                        pIemCpu->aMemBbMappings[iMemMap].cbSecond);
    7292                 pEvtRec->pNext = *pIemCpu->ppIemEvtRecNext;
    7293                 *pIemCpu->ppIemEvtRecNext = pEvtRec;
     7293                       &pVCpu->iem.s.aBounceBuffers[iMemMap].ab[pVCpu->iem.s.aMemBbMappings[iMemMap].cbFirst],
     7294                       pVCpu->iem.s.aMemBbMappings[iMemMap].cbSecond);
     7295                pEvtRec->pNext = *pVCpu->iem.s.ppIemEvtRecNext;
     7296                *pVCpu->iem.s.ppIemEvtRecNext = pEvtRec;
    72947297            }
    72957298        }
     
    72977300#endif
    72987301#if defined(IEM_VERIFICATION_MODE_MINIMAL) || defined(IEM_LOG_MEMORY_WRITES)
    7299     Log(("IEM Wrote %RGp: %.*Rhxs\n", pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst,
    7300          RT_MAX(RT_MIN(pIemCpu->aMemBbMappings[iMemMap].cbFirst, 64), 1), &pIemCpu->aBounceBuffers[iMemMap].ab[0]));
    7301     if (pIemCpu->aMemBbMappings[iMemMap].cbSecond)
    7302         Log(("IEM Wrote %RGp: %.*Rhxs [2nd page]\n", pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond,
    7303              RT_MIN(pIemCpu->aMemBbMappings[iMemMap].cbSecond, 64),
    7304              &pIemCpu->aBounceBuffers[iMemMap].ab[pIemCpu->aMemBbMappings[iMemMap].cbFirst]));
    7305 
    7306     size_t cbWrote = pIemCpu->aMemBbMappings[iMemMap].cbFirst + pIemCpu->aMemBbMappings[iMemMap].cbSecond;
     7302    Log(("IEM Wrote %RGp: %.*Rhxs\n", pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst,
     7303         RT_MAX(RT_MIN(pVCpu->iem.s.aMemBbMappings[iMemMap].cbFirst, 64), 1), &pVCpu->iem.s.aBounceBuffers[iMemMap].ab[0]));
     7304    if (pVCpu->iem.s.aMemBbMappings[iMemMap].cbSecond)
     7305        Log(("IEM Wrote %RGp: %.*Rhxs [2nd page]\n", pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond,
     7306             RT_MIN(pVCpu->iem.s.aMemBbMappings[iMemMap].cbSecond, 64),
     7307             &pVCpu->iem.s.aBounceBuffers[iMemMap].ab[pVCpu->iem.s.aMemBbMappings[iMemMap].cbFirst]));
     7308
     7309    size_t cbWrote = pVCpu->iem.s.aMemBbMappings[iMemMap].cbFirst + pVCpu->iem.s.aMemBbMappings[iMemMap].cbSecond;
    73077310    g_cbIemWrote = cbWrote;
    7308     memcpy(g_abIemWrote, &pIemCpu->aBounceBuffers[iMemMap].ab[0], RT_MIN(cbWrote, sizeof(g_abIemWrote)));
     7311    memcpy(g_abIemWrote, &pVCpu->iem.s.aBounceBuffers[iMemMap].ab[0], RT_MIN(cbWrote, sizeof(g_abIemWrote)));
    73097312#endif
    73107313
     
    73127315     * Free the mapping entry.
    73137316     */
    7314     pIemCpu->aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
    7315     Assert(pIemCpu->cActiveMappings != 0);
    7316     pIemCpu->cActiveMappings--;
     7317    pVCpu->iem.s.aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
     7318    Assert(pVCpu->iem.s.cActiveMappings != 0);
     7319    pVCpu->iem.s.cActiveMappings--;
    73177320    return VINF_SUCCESS;
    73187321}
     
    73237326 */
    73247327IEM_STATIC VBOXSTRICTRC
    7325 iemMemBounceBufferMapCrossPage(PIEMCPU pIemCpu, int iMemMap, void **ppvMem, size_t cbMem, RTGCPTR GCPtrFirst, uint32_t fAccess)
     7328iemMemBounceBufferMapCrossPage(PVMCPU pVCpu, int iMemMap, void **ppvMem, size_t cbMem, RTGCPTR GCPtrFirst, uint32_t fAccess)
    73267329{
    73277330    /*
     
    73297332     */
    73307333    RTGCPHYS GCPhysFirst;
    7331     VBOXSTRICTRC rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, GCPtrFirst, fAccess, &GCPhysFirst);
     7334    VBOXSTRICTRC rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, GCPtrFirst, fAccess, &GCPhysFirst);
    73327335    if (rcStrict != VINF_SUCCESS)
    73337336        return rcStrict;
    73347337
    73357338    RTGCPHYS GCPhysSecond;
    7336     rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, (GCPtrFirst + (cbMem - 1)) & ~(RTGCPTR)PAGE_OFFSET_MASK,
     7339    rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, (GCPtrFirst + (cbMem - 1)) & ~(RTGCPTR)PAGE_OFFSET_MASK,
    73377340                                                 fAccess, &GCPhysSecond);
    73387341    if (rcStrict != VINF_SUCCESS)
     
    73407343    GCPhysSecond &= ~(RTGCPHYS)PAGE_OFFSET_MASK;
    73417344
    7342     PVM pVM = IEMCPU_TO_VM(pIemCpu);
     7345    PVM pVM = pVCpu->CTX_SUFF(pVM);
    73437346#ifdef IEM_VERIFICATION_MODE_FULL
    73447347    /*
     
    73467349     * the right execution engine. (TLB: Redo this.)
    73477350     */
    7348     if (IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
    7349     {
    7350         int rc2 = PGMPhysIemQueryAccess(pVM, GCPhysFirst,  RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE), pIemCpu->fBypassHandlers);
     7351    if (IEM_FULL_VERIFICATION_ENABLED(pVCpu))
     7352    {
     7353        int rc2 = PGMPhysIemQueryAccess(pVM, GCPhysFirst,  RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE), pVCpu->iem.s.fBypassHandlers);
    73517354        if (RT_SUCCESS(rc2))
    7352             rc2 = PGMPhysIemQueryAccess(pVM, GCPhysSecond, RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE), pIemCpu->fBypassHandlers);
     7355            rc2 = PGMPhysIemQueryAccess(pVM, GCPhysSecond, RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE), pVCpu->iem.s.fBypassHandlers);
    73537356        if (RT_FAILURE(rc2))
    7354             pIemCpu->fProblematicMemory = true;
     7357            pVCpu->iem.s.fProblematicMemory = true;
    73557358    }
    73567359#endif
     
    73617364     * write access.
    73627365     */
    7363     uint8_t        *pbBuf        = &pIemCpu->aBounceBuffers[iMemMap].ab[0];
     7366    uint8_t        *pbBuf        = &pVCpu->iem.s.aBounceBuffers[iMemMap].ab[0];
    73647367    uint32_t const  cbFirstPage  = PAGE_SIZE - (GCPhysFirst & PAGE_OFFSET_MASK);
    73657368    uint32_t const  cbSecondPage = (uint32_t)(cbMem - cbFirstPage);
     
    73677370    if (fAccess & (IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_EXEC | IEM_ACCESS_PARTIAL_WRITE))
    73687371    {
    7369         if (!pIemCpu->fBypassHandlers)
     7372        if (!pVCpu->iem.s.fBypassHandlers)
    73707373        {
    73717374            /*
     
    73807383                { /*likely */ }
    73817384                else if (PGM_PHYS_RW_IS_SUCCESS(rcStrict))
    7382                     rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     7385                    rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    73837386                else
    73847387                {
     
    73947397                {
    73957398                    PGM_PHYS_RW_DO_UPDATE_STRICT_RC(rcStrict, rcStrict2);
    7396                     rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     7399                    rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    73977400                }
    73987401                else
     
    74367439
    74377440#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
    7438         if (   !pIemCpu->fNoRem
     7441        if (   !pVCpu->iem.s.fNoRem
    74397442            && (fAccess & (IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_EXEC)) )
    74407443        {
     
    74427445             * Record the reads.
    74437446             */
    7444             PIEMVERIFYEVTREC pEvtRec = iemVerifyAllocRecord(pIemCpu);
     7447            PIEMVERIFYEVTREC pEvtRec = iemVerifyAllocRecord(pVCpu);
    74457448            if (pEvtRec)
    74467449            {
     
    74487451                pEvtRec->u.RamRead.GCPhys  = GCPhysFirst;
    74497452                pEvtRec->u.RamRead.cb      = cbFirstPage;
    7450                 pEvtRec->pNext = *pIemCpu->ppIemEvtRecNext;
    7451                 *pIemCpu->ppIemEvtRecNext = pEvtRec;
     7453                pEvtRec->pNext = *pVCpu->iem.s.ppIemEvtRecNext;
     7454                *pVCpu->iem.s.ppIemEvtRecNext = pEvtRec;
    74527455            }
    7453             pEvtRec = iemVerifyAllocRecord(pIemCpu);
     7456            pEvtRec = iemVerifyAllocRecord(pVCpu);
    74547457            if (pEvtRec)
    74557458            {
     
    74577460                pEvtRec->u.RamRead.GCPhys  = GCPhysSecond;
    74587461                pEvtRec->u.RamRead.cb      = cbSecondPage;
    7459                 pEvtRec->pNext = *pIemCpu->ppIemEvtRecNext;
    7460                 *pIemCpu->ppIemEvtRecNext = pEvtRec;
     7462                pEvtRec->pNext = *pVCpu->iem.s.ppIemEvtRecNext;
     7463                *pVCpu->iem.s.ppIemEvtRecNext = pEvtRec;
    74617464            }
    74627465        }
     
    74667469    else
    74677470        memset(pbBuf, 0xcc, cbMem);
    7468     if (cbMem < sizeof(pIemCpu->aBounceBuffers[iMemMap].ab))
    7469         memset(pbBuf + cbMem, 0xaa, sizeof(pIemCpu->aBounceBuffers[iMemMap].ab) - cbMem);
     7471    if (cbMem < sizeof(pVCpu->iem.s.aBounceBuffers[iMemMap].ab))
     7472        memset(pbBuf + cbMem, 0xaa, sizeof(pVCpu->iem.s.aBounceBuffers[iMemMap].ab) - cbMem);
    74707473#endif
    74717474
     
    74737476     * Commit the bounce buffer entry.
    74747477     */
    7475     pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst    = GCPhysFirst;
    7476     pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond   = GCPhysSecond;
    7477     pIemCpu->aMemBbMappings[iMemMap].cbFirst        = (uint16_t)cbFirstPage;
    7478     pIemCpu->aMemBbMappings[iMemMap].cbSecond       = (uint16_t)cbSecondPage;
    7479     pIemCpu->aMemBbMappings[iMemMap].fUnassigned    = false;
    7480     pIemCpu->aMemMappings[iMemMap].pv               = pbBuf;
    7481     pIemCpu->aMemMappings[iMemMap].fAccess          = fAccess | IEM_ACCESS_BOUNCE_BUFFERED;
    7482     pIemCpu->iNextMapping = iMemMap + 1;
    7483     pIemCpu->cActiveMappings++;
    7484 
    7485     iemMemUpdateWrittenCounter(pIemCpu, fAccess, cbMem);
     7478    pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst    = GCPhysFirst;
     7479    pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond   = GCPhysSecond;
     7480    pVCpu->iem.s.aMemBbMappings[iMemMap].cbFirst        = (uint16_t)cbFirstPage;
     7481    pVCpu->iem.s.aMemBbMappings[iMemMap].cbSecond       = (uint16_t)cbSecondPage;
     7482    pVCpu->iem.s.aMemBbMappings[iMemMap].fUnassigned    = false;
     7483    pVCpu->iem.s.aMemMappings[iMemMap].pv               = pbBuf;
     7484    pVCpu->iem.s.aMemMappings[iMemMap].fAccess          = fAccess | IEM_ACCESS_BOUNCE_BUFFERED;
     7485    pVCpu->iem.s.iNextMapping = iMemMap + 1;
     7486    pVCpu->iem.s.cActiveMappings++;
     7487
     7488    iemMemUpdateWrittenCounter(pVCpu, fAccess, cbMem);
    74867489    *ppvMem = pbBuf;
    74877490    return VINF_SUCCESS;
     
    74927495 * iemMemMap woker that deals with iemMemPageMap failures.
    74937496 */
    7494 IEM_STATIC VBOXSTRICTRC iemMemBounceBufferMapPhys(PIEMCPU pIemCpu, unsigned iMemMap, void **ppvMem, size_t cbMem,
     7497IEM_STATIC VBOXSTRICTRC iemMemBounceBufferMapPhys(PVMCPU pVCpu, unsigned iMemMap, void **ppvMem, size_t cbMem,
    74957498                                                  RTGCPHYS GCPhysFirst, uint32_t fAccess, VBOXSTRICTRC rcMap)
    74967499{
     
    75057508        return rcMap;
    75067509    }
    7507     pIemCpu->cPotentialExits++;
     7510    pVCpu->iem.s.cPotentialExits++;
    75087511
    75097512    /*
     
    75117514     * write access.
    75127515     */
    7513     uint8_t *pbBuf = &pIemCpu->aBounceBuffers[iMemMap].ab[0];
     7516    uint8_t *pbBuf = &pVCpu->iem.s.aBounceBuffers[iMemMap].ab[0];
    75147517    if (fAccess & (IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_EXEC | IEM_ACCESS_PARTIAL_WRITE))
    75157518    {
     
    75197522        {
    75207523            int rc;
    7521             if (!pIemCpu->fBypassHandlers)
     7524            if (!pVCpu->iem.s.fBypassHandlers)
    75227525            {
    7523                 VBOXSTRICTRC rcStrict = PGMPhysRead(IEMCPU_TO_VM(pIemCpu), GCPhysFirst, pbBuf, cbMem, PGMACCESSORIGIN_IEM);
     7526                VBOXSTRICTRC rcStrict = PGMPhysRead(pVCpu->CTX_SUFF(pVM), GCPhysFirst, pbBuf, cbMem, PGMACCESSORIGIN_IEM);
    75247527                if (rcStrict == VINF_SUCCESS)
    75257528                { /* nothing */ }
    75267529                else if (PGM_PHYS_RW_IS_SUCCESS(rcStrict))
    7527                     rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     7530                    rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    75287531                else
    75297532                {
     
    75357538            else
    75367539            {
    7537                 rc = PGMPhysSimpleReadGCPhys(IEMCPU_TO_VM(pIemCpu), pbBuf, GCPhysFirst, cbMem);
     7540                rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), pbBuf, GCPhysFirst, cbMem);
    75387541                if (RT_SUCCESS(rc))
    75397542                { /* likely */ }
     
    75487551
    75497552#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
    7550         if (   !pIemCpu->fNoRem
     7553        if (   !pVCpu->iem.s.fNoRem
    75517554            && (fAccess & (IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_EXEC)) )
    75527555        {
     
    75547557             * Record the read.
    75557558             */
    7556             PIEMVERIFYEVTREC pEvtRec = iemVerifyAllocRecord(pIemCpu);
     7559            PIEMVERIFYEVTREC pEvtRec = iemVerifyAllocRecord(pVCpu);
    75577560            if (pEvtRec)
    75587561            {
     
    75607563                pEvtRec->u.RamRead.GCPhys  = GCPhysFirst;
    75617564                pEvtRec->u.RamRead.cb      = (uint32_t)cbMem;
    7562                 pEvtRec->pNext = *pIemCpu->ppIemEvtRecNext;
    7563                 *pIemCpu->ppIemEvtRecNext = pEvtRec;
     7565                pEvtRec->pNext = *pVCpu->iem.s.ppIemEvtRecNext;
     7566                *pVCpu->iem.s.ppIemEvtRecNext = pEvtRec;
    75647567            }
    75657568        }
     
    75717574#endif
    75727575#ifdef VBOX_STRICT
    7573     if (cbMem < sizeof(pIemCpu->aBounceBuffers[iMemMap].ab))
    7574         memset(pbBuf + cbMem, 0xaa, sizeof(pIemCpu->aBounceBuffers[iMemMap].ab) - cbMem);
     7576    if (cbMem < sizeof(pVCpu->iem.s.aBounceBuffers[iMemMap].ab))
     7577        memset(pbBuf + cbMem, 0xaa, sizeof(pVCpu->iem.s.aBounceBuffers[iMemMap].ab) - cbMem);
    75757578#endif
    75767579
     
    75787581     * Commit the bounce buffer entry.
    75797582     */
    7580     pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst    = GCPhysFirst;
    7581     pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond   = NIL_RTGCPHYS;
    7582     pIemCpu->aMemBbMappings[iMemMap].cbFirst        = (uint16_t)cbMem;
    7583     pIemCpu->aMemBbMappings[iMemMap].cbSecond       = 0;
    7584     pIemCpu->aMemBbMappings[iMemMap].fUnassigned    = rcMap == VERR_PGM_PHYS_TLB_UNASSIGNED;
    7585     pIemCpu->aMemMappings[iMemMap].pv               = pbBuf;
    7586     pIemCpu->aMemMappings[iMemMap].fAccess          = fAccess | IEM_ACCESS_BOUNCE_BUFFERED;
    7587     pIemCpu->iNextMapping = iMemMap + 1;
    7588     pIemCpu->cActiveMappings++;
    7589 
    7590     iemMemUpdateWrittenCounter(pIemCpu, fAccess, cbMem);
     7583    pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst    = GCPhysFirst;
     7584    pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond   = NIL_RTGCPHYS;
     7585    pVCpu->iem.s.aMemBbMappings[iMemMap].cbFirst        = (uint16_t)cbMem;
     7586    pVCpu->iem.s.aMemBbMappings[iMemMap].cbSecond       = 0;
     7587    pVCpu->iem.s.aMemBbMappings[iMemMap].fUnassigned    = rcMap == VERR_PGM_PHYS_TLB_UNASSIGNED;
     7588    pVCpu->iem.s.aMemMappings[iMemMap].pv               = pbBuf;
     7589    pVCpu->iem.s.aMemMappings[iMemMap].fAccess          = fAccess | IEM_ACCESS_BOUNCE_BUFFERED;
     7590    pVCpu->iem.s.iNextMapping = iMemMap + 1;
     7591    pVCpu->iem.s.cActiveMappings++;
     7592
     7593    iemMemUpdateWrittenCounter(pVCpu, fAccess, cbMem);
    75917594    *ppvMem = pbBuf;
    75927595    return VINF_SUCCESS;
     
    76077610 * @returns VBox strict status code.
    76087611 *
    7609  * @param   pIemCpu             The IEM per CPU data.
     7612 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    76107613 * @param   ppvMem              Where to return the pointer to the mapped
    76117614 *                              memory.
     
    76257628 */
    76267629IEM_STATIC VBOXSTRICTRC
    7627 iemMemMap(PIEMCPU pIemCpu, void **ppvMem, size_t cbMem, uint8_t iSegReg, RTGCPTR GCPtrMem, uint32_t fAccess)
     7630iemMemMap(PVMCPU pVCpu, void **ppvMem, size_t cbMem, uint8_t iSegReg, RTGCPTR GCPtrMem, uint32_t fAccess)
    76287631{
    76297632    /*
     
    76327635    Assert(cbMem <= 64 || cbMem == 512 || cbMem == 108 || cbMem == 104 || cbMem == 94); /* 512 is the max! */
    76337636    Assert(~(fAccess & ~(IEM_ACCESS_TYPE_MASK | IEM_ACCESS_WHAT_MASK)));
    7634     Assert(pIemCpu->cActiveMappings < RT_ELEMENTS(pIemCpu->aMemMappings));
    7635 
    7636     unsigned iMemMap = pIemCpu->iNextMapping;
    7637     if (   iMemMap >= RT_ELEMENTS(pIemCpu->aMemMappings)
    7638         || pIemCpu->aMemMappings[iMemMap].fAccess != IEM_ACCESS_INVALID)
    7639     {
    7640         iMemMap = iemMemMapFindFree(pIemCpu);
    7641         AssertLogRelMsgReturn(iMemMap < RT_ELEMENTS(pIemCpu->aMemMappings),
    7642                               ("active=%d fAccess[0] = {%#x, %#x, %#x}\n", pIemCpu->cActiveMappings,
    7643                                pIemCpu->aMemMappings[0].fAccess, pIemCpu->aMemMappings[1].fAccess,
    7644                                pIemCpu->aMemMappings[2].fAccess),
     7637    Assert(pVCpu->iem.s.cActiveMappings < RT_ELEMENTS(pVCpu->iem.s.aMemMappings));
     7638
     7639    unsigned iMemMap = pVCpu->iem.s.iNextMapping;
     7640    if (   iMemMap >= RT_ELEMENTS(pVCpu->iem.s.aMemMappings)
     7641        || pVCpu->iem.s.aMemMappings[iMemMap].fAccess != IEM_ACCESS_INVALID)
     7642    {
     7643        iMemMap = iemMemMapFindFree(pVCpu);
     7644        AssertLogRelMsgReturn(iMemMap < RT_ELEMENTS(pVCpu->iem.s.aMemMappings),
     7645                              ("active=%d fAccess[0] = {%#x, %#x, %#x}\n", pVCpu->iem.s.cActiveMappings,
     7646                               pVCpu->iem.s.aMemMappings[0].fAccess, pVCpu->iem.s.aMemMappings[1].fAccess,
     7647                               pVCpu->iem.s.aMemMappings[2].fAccess),
    76457648                              VERR_IEM_IPE_9);
    76467649    }
     
    76507653     * slightly complicated happens, fall back on bounce buffering.
    76517654     */
    7652     VBOXSTRICTRC rcStrict = iemMemApplySegment(pIemCpu, fAccess, iSegReg, cbMem, &GCPtrMem);
     7655    VBOXSTRICTRC rcStrict = iemMemApplySegment(pVCpu, fAccess, iSegReg, cbMem, &GCPtrMem);
    76537656    if (rcStrict != VINF_SUCCESS)
    76547657        return rcStrict;
    76557658
    76567659    if ((GCPtrMem & PAGE_OFFSET_MASK) + cbMem > PAGE_SIZE) /* Crossing a page boundary? */
    7657         return iemMemBounceBufferMapCrossPage(pIemCpu, iMemMap, ppvMem, cbMem, GCPtrMem, fAccess);
     7660        return iemMemBounceBufferMapCrossPage(pVCpu, iMemMap, ppvMem, cbMem, GCPtrMem, fAccess);
    76587661
    76597662    RTGCPHYS GCPhysFirst;
    7660     rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, GCPtrMem, fAccess, &GCPhysFirst);
     7663    rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, GCPtrMem, fAccess, &GCPhysFirst);
    76617664    if (rcStrict != VINF_SUCCESS)
    76627665        return rcStrict;
     
    76687671
    76697672    void *pvMem;
    7670     rcStrict = iemMemPageMap(pIemCpu, GCPhysFirst, fAccess, &pvMem, &pIemCpu->aMemMappingLocks[iMemMap].Lock);
     7673    rcStrict = iemMemPageMap(pVCpu, GCPhysFirst, fAccess, &pvMem, &pVCpu->iem.s.aMemMappingLocks[iMemMap].Lock);
    76717674    if (rcStrict != VINF_SUCCESS)
    7672         return iemMemBounceBufferMapPhys(pIemCpu, iMemMap, ppvMem, cbMem, GCPhysFirst, fAccess, rcStrict);
     7675        return iemMemBounceBufferMapPhys(pVCpu, iMemMap, ppvMem, cbMem, GCPhysFirst, fAccess, rcStrict);
    76737676
    76747677    /*
    76757678     * Fill in the mapping table entry.
    76767679     */
    7677     pIemCpu->aMemMappings[iMemMap].pv      = pvMem;
    7678     pIemCpu->aMemMappings[iMemMap].fAccess = fAccess;
    7679     pIemCpu->iNextMapping = iMemMap + 1;
    7680     pIemCpu->cActiveMappings++;
    7681 
    7682     iemMemUpdateWrittenCounter(pIemCpu, fAccess, cbMem);
     7680    pVCpu->iem.s.aMemMappings[iMemMap].pv      = pvMem;
     7681    pVCpu->iem.s.aMemMappings[iMemMap].fAccess = fAccess;
     7682    pVCpu->iem.s.iNextMapping = iMemMap + 1;
     7683    pVCpu->iem.s.cActiveMappings++;
     7684
     7685    iemMemUpdateWrittenCounter(pVCpu, fAccess, cbMem);
    76837686    *ppvMem = pvMem;
    76847687    return VINF_SUCCESS;
     
    76907693 *
    76917694 * @returns Strict VBox status code.
    7692  * @param   pIemCpu             The IEM per CPU data.
     7695 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    76937696 * @param   pvMem               The mapping.
    76947697 * @param   fAccess             The kind of access.
    76957698 */
    7696 IEM_STATIC VBOXSTRICTRC iemMemCommitAndUnmap(PIEMCPU pIemCpu, void *pvMem, uint32_t fAccess)
    7697 {
    7698     int iMemMap = iemMapLookup(pIemCpu, pvMem, fAccess);
     7699IEM_STATIC VBOXSTRICTRC iemMemCommitAndUnmap(PVMCPU pVCpu, void *pvMem, uint32_t fAccess)
     7700{
     7701    int iMemMap = iemMapLookup(pVCpu, pvMem, fAccess);
    76997702    AssertReturn(iMemMap >= 0, iMemMap);
    77007703
    77017704    /* If it's bounce buffered, we may need to write back the buffer. */
    7702     if (pIemCpu->aMemMappings[iMemMap].fAccess & IEM_ACCESS_BOUNCE_BUFFERED)
    7703     {
    7704         if (pIemCpu->aMemMappings[iMemMap].fAccess & IEM_ACCESS_TYPE_WRITE)
    7705             return iemMemBounceBufferCommitAndUnmap(pIemCpu, iMemMap, false /*fPostponeFail*/);
     7705    if (pVCpu->iem.s.aMemMappings[iMemMap].fAccess & IEM_ACCESS_BOUNCE_BUFFERED)
     7706    {
     7707        if (pVCpu->iem.s.aMemMappings[iMemMap].fAccess & IEM_ACCESS_TYPE_WRITE)
     7708            return iemMemBounceBufferCommitAndUnmap(pVCpu, iMemMap, false /*fPostponeFail*/);
    77067709    }
    77077710    /* Otherwise unlock it. */
    77087711    else
    7709         PGMPhysReleasePageMappingLock(IEMCPU_TO_VM(pIemCpu), &pIemCpu->aMemMappingLocks[iMemMap].Lock);
     7712        PGMPhysReleasePageMappingLock(pVCpu->CTX_SUFF(pVM), &pVCpu->iem.s.aMemMappingLocks[iMemMap].Lock);
    77107713
    77117714    /* Free the entry. */
    7712     pIemCpu->aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
    7713     Assert(pIemCpu->cActiveMappings != 0);
    7714     pIemCpu->cActiveMappings--;
     7715    pVCpu->iem.s.aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
     7716    Assert(pVCpu->iem.s.cActiveMappings != 0);
     7717    pVCpu->iem.s.cActiveMappings--;
    77157718    return VINF_SUCCESS;
    77167719}
     
    77317734 * @returns Pointer to the mapped memory.
    77327735 *
    7733  * @param   pIemCpu             The IEM per CPU data.
     7736 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    77347737 * @param   cbMem               The number of bytes to map.  This is usually 1,
    77357738 *                              2, 4, 6, 8, 12, 16, 32 or 512.  When used by
     
    77467749 *                              exceptions.
    77477750 */
    7748 IEM_STATIC void *iemMemMapJmp(PIEMCPU pIemCpu, size_t cbMem, uint8_t iSegReg, RTGCPTR GCPtrMem, uint32_t fAccess)
     7751IEM_STATIC void *iemMemMapJmp(PVMCPU pVCpu, size_t cbMem, uint8_t iSegReg, RTGCPTR GCPtrMem, uint32_t fAccess)
    77497752{
    77507753    /*
     
    77537756    Assert(cbMem <= 64 || cbMem == 512 || cbMem == 108 || cbMem == 104 || cbMem == 94); /* 512 is the max! */
    77547757    Assert(~(fAccess & ~(IEM_ACCESS_TYPE_MASK | IEM_ACCESS_WHAT_MASK)));
    7755     Assert(pIemCpu->cActiveMappings < RT_ELEMENTS(pIemCpu->aMemMappings));
    7756 
    7757     unsigned iMemMap = pIemCpu->iNextMapping;
    7758     if (   iMemMap >= RT_ELEMENTS(pIemCpu->aMemMappings)
    7759         || pIemCpu->aMemMappings[iMemMap].fAccess != IEM_ACCESS_INVALID)
    7760     {
    7761         iMemMap = iemMemMapFindFree(pIemCpu);
    7762         AssertLogRelMsgStmt(iMemMap < RT_ELEMENTS(pIemCpu->aMemMappings),
    7763                             ("active=%d fAccess[0] = {%#x, %#x, %#x}\n", pIemCpu->cActiveMappings,
    7764                              pIemCpu->aMemMappings[0].fAccess, pIemCpu->aMemMappings[1].fAccess,
    7765                              pIemCpu->aMemMappings[2].fAccess),
    7766                             longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VERR_IEM_IPE_9));
     7758    Assert(pVCpu->iem.s.cActiveMappings < RT_ELEMENTS(pVCpu->iem.s.aMemMappings));
     7759
     7760    unsigned iMemMap = pVCpu->iem.s.iNextMapping;
     7761    if (   iMemMap >= RT_ELEMENTS(pVCpu->iem.s.aMemMappings)
     7762        || pVCpu->iem.s.aMemMappings[iMemMap].fAccess != IEM_ACCESS_INVALID)
     7763    {
     7764        iMemMap = iemMemMapFindFree(pVCpu);
     7765        AssertLogRelMsgStmt(iMemMap < RT_ELEMENTS(pVCpu->iem.s.aMemMappings),
     7766                            ("active=%d fAccess[0] = {%#x, %#x, %#x}\n", pVCpu->iem.s.cActiveMappings,
     7767                             pVCpu->iem.s.aMemMappings[0].fAccess, pVCpu->iem.s.aMemMappings[1].fAccess,
     7768                             pVCpu->iem.s.aMemMappings[2].fAccess),
     7769                            longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VERR_IEM_IPE_9));
    77677770    }
    77687771
     
    77717774     * slightly complicated happens, fall back on bounce buffering.
    77727775     */
    7773     VBOXSTRICTRC rcStrict = iemMemApplySegment(pIemCpu, fAccess, iSegReg, cbMem, &GCPtrMem);
     7776    VBOXSTRICTRC rcStrict = iemMemApplySegment(pVCpu, fAccess, iSegReg, cbMem, &GCPtrMem);
    77747777    if (rcStrict == VINF_SUCCESS) { /*likely*/ }
    7775     else longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     7778    else longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    77767779
    77777780    /* Crossing a page boundary? */
     
    77817784    {
    77827785        void *pvMem;
    7783         VBOXSTRICTRC rcStrict = iemMemBounceBufferMapCrossPage(pIemCpu, iMemMap, &pvMem, cbMem, GCPtrMem, fAccess);
     7786        VBOXSTRICTRC rcStrict = iemMemBounceBufferMapCrossPage(pVCpu, iMemMap, &pvMem, cbMem, GCPtrMem, fAccess);
    77847787        if (rcStrict == VINF_SUCCESS)
    77857788            return pvMem;
    7786         longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     7789        longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    77877790    }
    77887791
    77897792    RTGCPHYS GCPhysFirst;
    7790     rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, GCPtrMem, fAccess, &GCPhysFirst);
     7793    rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, GCPtrMem, fAccess, &GCPhysFirst);
    77917794    if (rcStrict == VINF_SUCCESS) { /*likely*/ }
    7792     else longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     7795    else longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    77937796
    77947797    if (fAccess & IEM_ACCESS_TYPE_WRITE)
     
    77987801
    77997802    void *pvMem;
    7800     rcStrict = iemMemPageMap(pIemCpu, GCPhysFirst, fAccess, &pvMem, &pIemCpu->aMemMappingLocks[iMemMap].Lock);
     7803    rcStrict = iemMemPageMap(pVCpu, GCPhysFirst, fAccess, &pvMem, &pVCpu->iem.s.aMemMappingLocks[iMemMap].Lock);
    78017804    if (rcStrict == VINF_SUCCESS)
    78027805    { /* likely */ }
     
    78047807    {
    78057808        void *pvMem;
    7806         rcStrict = iemMemBounceBufferMapPhys(pIemCpu, iMemMap, &pvMem, cbMem, GCPhysFirst, fAccess, rcStrict);
     7809        rcStrict = iemMemBounceBufferMapPhys(pVCpu, iMemMap, &pvMem, cbMem, GCPhysFirst, fAccess, rcStrict);
    78077810        if (rcStrict == VINF_SUCCESS)
    78087811            return pvMem;
    7809         longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     7812        longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    78107813    }
    78117814
     
    78137816     * Fill in the mapping table entry.
    78147817     */
    7815     pIemCpu->aMemMappings[iMemMap].pv      = pvMem;
    7816     pIemCpu->aMemMappings[iMemMap].fAccess = fAccess;
    7817     pIemCpu->iNextMapping = iMemMap + 1;
    7818     pIemCpu->cActiveMappings++;
    7819 
    7820     iemMemUpdateWrittenCounter(pIemCpu, fAccess, cbMem);
     7818    pVCpu->iem.s.aMemMappings[iMemMap].pv      = pvMem;
     7819    pVCpu->iem.s.aMemMappings[iMemMap].fAccess = fAccess;
     7820    pVCpu->iem.s.iNextMapping = iMemMap + 1;
     7821    pVCpu->iem.s.cActiveMappings++;
     7822
     7823    iemMemUpdateWrittenCounter(pVCpu, fAccess, cbMem);
    78217824    return pvMem;
    78227825}
     
    78267829 * Commits the guest memory if bounce buffered and unmaps it, longjmp on error.
    78277830 *
    7828  * @param   pIemCpu             The IEM per CPU data.
     7831 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    78297832 * @param   pvMem               The mapping.
    78307833 * @param   fAccess             The kind of access.
    78317834 */
    7832 IEM_STATIC void iemMemCommitAndUnmapJmp(PIEMCPU pIemCpu, void *pvMem, uint32_t fAccess)
    7833 {
    7834     int iMemMap = iemMapLookup(pIemCpu, pvMem, fAccess);
    7835     AssertStmt(iMemMap >= 0, longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), iMemMap));
     7835IEM_STATIC void iemMemCommitAndUnmapJmp(PVMCPU pVCpu, void *pvMem, uint32_t fAccess)
     7836{
     7837    int iMemMap = iemMapLookup(pVCpu, pvMem, fAccess);
     7838    AssertStmt(iMemMap >= 0, longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), iMemMap));
    78367839
    78377840    /* If it's bounce buffered, we may need to write back the buffer. */
    7838     if (pIemCpu->aMemMappings[iMemMap].fAccess & IEM_ACCESS_BOUNCE_BUFFERED)
    7839     {
    7840         if (pIemCpu->aMemMappings[iMemMap].fAccess & IEM_ACCESS_TYPE_WRITE)
     7841    if (pVCpu->iem.s.aMemMappings[iMemMap].fAccess & IEM_ACCESS_BOUNCE_BUFFERED)
     7842    {
     7843        if (pVCpu->iem.s.aMemMappings[iMemMap].fAccess & IEM_ACCESS_TYPE_WRITE)
    78417844        {
    7842             VBOXSTRICTRC rcStrict = iemMemBounceBufferCommitAndUnmap(pIemCpu, iMemMap, false /*fPostponeFail*/);
     7845            VBOXSTRICTRC rcStrict = iemMemBounceBufferCommitAndUnmap(pVCpu, iMemMap, false /*fPostponeFail*/);
    78437846            if (rcStrict == VINF_SUCCESS)
    78447847                return;
    7845             longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     7848            longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    78467849        }
    78477850    }
    78487851    /* Otherwise unlock it. */
    78497852    else
    7850         PGMPhysReleasePageMappingLock(IEMCPU_TO_VM(pIemCpu), &pIemCpu->aMemMappingLocks[iMemMap].Lock);
     7853        PGMPhysReleasePageMappingLock(pVCpu->CTX_SUFF(pVM), &pVCpu->iem.s.aMemMappingLocks[iMemMap].Lock);
    78517854
    78527855    /* Free the entry. */
    7853     pIemCpu->aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
    7854     Assert(pIemCpu->cActiveMappings != 0);
    7855     pIemCpu->cActiveMappings--;
     7856    pVCpu->iem.s.aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
     7857    Assert(pVCpu->iem.s.cActiveMappings != 0);
     7858    pVCpu->iem.s.cActiveMappings--;
    78567859}
    78577860
     
    78687871 * @returns VBox status code (no strict statuses).  Caller must check
    78697872 *          VMCPU_FF_IEM before repeating string instructions and similar stuff.
    7870  * @param   pIemCpu             The IEM per CPU data.
     7873 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    78717874 * @param   pvMem               The mapping.
    78727875 * @param   fAccess             The kind of access.
    78737876 */
    7874 IEM_STATIC VBOXSTRICTRC iemMemCommitAndUnmapPostponeTroubleToR3(PIEMCPU pIemCpu, void *pvMem, uint32_t fAccess)
    7875 {
    7876     int iMemMap = iemMapLookup(pIemCpu, pvMem, fAccess);
     7877IEM_STATIC VBOXSTRICTRC iemMemCommitAndUnmapPostponeTroubleToR3(PVMCPU pVCpu, void *pvMem, uint32_t fAccess)
     7878{
     7879    int iMemMap = iemMapLookup(pVCpu, pvMem, fAccess);
    78777880    AssertReturn(iMemMap >= 0, iMemMap);
    78787881
    78797882    /* If it's bounce buffered, we may need to write back the buffer. */
    7880     if (pIemCpu->aMemMappings[iMemMap].fAccess & IEM_ACCESS_BOUNCE_BUFFERED)
    7881     {
    7882         if (pIemCpu->aMemMappings[iMemMap].fAccess & IEM_ACCESS_TYPE_WRITE)
    7883             return iemMemBounceBufferCommitAndUnmap(pIemCpu, iMemMap, true /*fPostponeFail*/);
     7883    if (pVCpu->iem.s.aMemMappings[iMemMap].fAccess & IEM_ACCESS_BOUNCE_BUFFERED)
     7884    {
     7885        if (pVCpu->iem.s.aMemMappings[iMemMap].fAccess & IEM_ACCESS_TYPE_WRITE)
     7886            return iemMemBounceBufferCommitAndUnmap(pVCpu, iMemMap, true /*fPostponeFail*/);
    78847887    }
    78857888    /* Otherwise unlock it. */
    78867889    else
    7887         PGMPhysReleasePageMappingLock(IEMCPU_TO_VM(pIemCpu), &pIemCpu->aMemMappingLocks[iMemMap].Lock);
     7890        PGMPhysReleasePageMappingLock(pVCpu->CTX_SUFF(pVM), &pVCpu->iem.s.aMemMappingLocks[iMemMap].Lock);
    78887891
    78897892    /* Free the entry. */
    7890     pIemCpu->aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
    7891     Assert(pIemCpu->cActiveMappings != 0);
    7892     pIemCpu->cActiveMappings--;
     7893    pVCpu->iem.s.aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
     7894    Assert(pVCpu->iem.s.cActiveMappings != 0);
     7895    pVCpu->iem.s.cActiveMappings--;
    78937896    return VINF_SUCCESS;
    78947897}
     
    79027905 *
    79037906 * @returns Strict VBox status code to pass up.
    7904  * @param   pIemCpu     The IEM per CPU data.
    7905  */
    7906 IEM_STATIC void iemMemRollback(PIEMCPU pIemCpu)
    7907 {
    7908     Assert(pIemCpu->cActiveMappings > 0);
    7909 
    7910     uint32_t iMemMap = RT_ELEMENTS(pIemCpu->aMemMappings);
     7907 * @param   pVCpu       The cross context virtual CPU structure of the calling thread.
     7908 */
     7909IEM_STATIC void iemMemRollback(PVMCPU pVCpu)
     7910{
     7911    Assert(pVCpu->iem.s.cActiveMappings > 0);
     7912
     7913    uint32_t iMemMap = RT_ELEMENTS(pVCpu->iem.s.aMemMappings);
    79117914    while (iMemMap-- > 0)
    79127915    {
    7913         uint32_t fAccess = pIemCpu->aMemMappings[iMemMap].fAccess;
     7916        uint32_t fAccess = pVCpu->iem.s.aMemMappings[iMemMap].fAccess;
    79147917        if (fAccess != IEM_ACCESS_INVALID)
    79157918        {
    79167919            AssertMsg(!(fAccess & ~IEM_ACCESS_VALID_MASK) && fAccess != 0, ("%#x\n", fAccess));
    7917             pIemCpu->aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
     7920            pVCpu->iem.s.aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
    79187921            if (!(fAccess & IEM_ACCESS_BOUNCE_BUFFERED))
    7919                 PGMPhysReleasePageMappingLock(IEMCPU_TO_VM(pIemCpu), &pIemCpu->aMemMappingLocks[iMemMap].Lock);
    7920             Assert(pIemCpu->cActiveMappings > 0);
    7921             pIemCpu->cActiveMappings--;
     7922                PGMPhysReleasePageMappingLock(pVCpu->CTX_SUFF(pVM), &pVCpu->iem.s.aMemMappingLocks[iMemMap].Lock);
     7923            Assert(pVCpu->iem.s.cActiveMappings > 0);
     7924            pVCpu->iem.s.cActiveMappings--;
    79227925        }
    79237926    }
     
    79297932 *
    79307933 * @returns Strict VBox status code.
    7931  * @param   pIemCpu             The IEM per CPU data.
     7934 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    79327935 * @param   pu8Dst              Where to return the byte.
    79337936 * @param   iSegReg             The index of the segment register to use for
     
    79357938 * @param   GCPtrMem            The address of the guest memory.
    79367939 */
    7937 IEM_STATIC VBOXSTRICTRC iemMemFetchDataU8(PIEMCPU pIemCpu, uint8_t *pu8Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     7940IEM_STATIC VBOXSTRICTRC iemMemFetchDataU8(PVMCPU pVCpu, uint8_t *pu8Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    79387941{
    79397942    /* The lazy approach for now... */
    79407943    uint8_t const *pu8Src;
    7941     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu8Src, sizeof(*pu8Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     7944    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu8Src, sizeof(*pu8Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    79427945    if (rc == VINF_SUCCESS)
    79437946    {
    79447947        *pu8Dst = *pu8Src;
    7945         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu8Src, IEM_ACCESS_DATA_R);
     7948        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu8Src, IEM_ACCESS_DATA_R);
    79467949    }
    79477950    return rc;
     
    79547957 *
    79557958 * @returns The byte.
    7956  * @param   pIemCpu             The IEM per CPU data.
     7959 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    79577960 * @param   iSegReg             The index of the segment register to use for
    79587961 *                              this access.  The base and limits are checked.
    79597962 * @param   GCPtrMem            The address of the guest memory.
    79607963 */
    7961 DECL_NO_INLINE(IEM_STATIC, uint8_t) iemMemFetchDataU8Jmp(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem)
     7964DECL_NO_INLINE(IEM_STATIC, uint8_t) iemMemFetchDataU8Jmp(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem)
    79627965{
    79637966    /* The lazy approach for now... */
    7964     uint8_t const *pu8Src = (uint8_t const *)iemMemMapJmp(pIemCpu, sizeof(*pu8Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     7967    uint8_t const *pu8Src = (uint8_t const *)iemMemMapJmp(pVCpu, sizeof(*pu8Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    79657968    uint8_t const  bRet   = *pu8Src;
    7966     iemMemCommitAndUnmapJmp(pIemCpu, (void *)pu8Src, IEM_ACCESS_DATA_R);
     7969    iemMemCommitAndUnmapJmp(pVCpu, (void *)pu8Src, IEM_ACCESS_DATA_R);
    79677970    return bRet;
    79687971}
     
    79747977 *
    79757978 * @returns Strict VBox status code.
    7976  * @param   pIemCpu             The IEM per CPU data.
     7979 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    79777980 * @param   pu16Dst             Where to return the word.
    79787981 * @param   iSegReg             The index of the segment register to use for
     
    79807983 * @param   GCPtrMem            The address of the guest memory.
    79817984 */
    7982 IEM_STATIC VBOXSTRICTRC iemMemFetchDataU16(PIEMCPU pIemCpu, uint16_t *pu16Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     7985IEM_STATIC VBOXSTRICTRC iemMemFetchDataU16(PVMCPU pVCpu, uint16_t *pu16Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    79837986{
    79847987    /* The lazy approach for now... */
    79857988    uint16_t const *pu16Src;
    7986     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu16Src, sizeof(*pu16Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     7989    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu16Src, sizeof(*pu16Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    79877990    if (rc == VINF_SUCCESS)
    79887991    {
    79897992        *pu16Dst = *pu16Src;
    7990         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu16Src, IEM_ACCESS_DATA_R);
     7993        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu16Src, IEM_ACCESS_DATA_R);
    79917994    }
    79927995    return rc;
     
    79998002 *
    80008003 * @returns The word
    8001  * @param   pIemCpu             The IEM per CPU data.
     8004 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    80028005 * @param   iSegReg             The index of the segment register to use for
    80038006 *                              this access.  The base and limits are checked.
    80048007 * @param   GCPtrMem            The address of the guest memory.
    80058008 */
    8006 DECL_NO_INLINE(IEM_STATIC, uint16_t) iemMemFetchDataU16Jmp(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8009DECL_NO_INLINE(IEM_STATIC, uint16_t) iemMemFetchDataU16Jmp(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem)
    80078010{
    80088011    /* The lazy approach for now... */
    8009     uint16_t const *pu16Src = (uint16_t const *)iemMemMapJmp(pIemCpu, sizeof(*pu16Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8012    uint16_t const *pu16Src = (uint16_t const *)iemMemMapJmp(pVCpu, sizeof(*pu16Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    80108013    uint16_t const u16Ret = *pu16Src;
    8011     iemMemCommitAndUnmapJmp(pIemCpu, (void *)pu16Src, IEM_ACCESS_DATA_R);
     8014    iemMemCommitAndUnmapJmp(pVCpu, (void *)pu16Src, IEM_ACCESS_DATA_R);
    80128015    return u16Ret;
    80138016}
     
    80198022 *
    80208023 * @returns Strict VBox status code.
    8021  * @param   pIemCpu             The IEM per CPU data.
     8024 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    80228025 * @param   pu32Dst             Where to return the dword.
    80238026 * @param   iSegReg             The index of the segment register to use for
     
    80258028 * @param   GCPtrMem            The address of the guest memory.
    80268029 */
    8027 IEM_STATIC VBOXSTRICTRC iemMemFetchDataU32(PIEMCPU pIemCpu, uint32_t *pu32Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8030IEM_STATIC VBOXSTRICTRC iemMemFetchDataU32(PVMCPU pVCpu, uint32_t *pu32Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    80288031{
    80298032    /* The lazy approach for now... */
    80308033    uint32_t const *pu32Src;
    8031     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu32Src, sizeof(*pu32Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8034    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu32Src, sizeof(*pu32Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    80328035    if (rc == VINF_SUCCESS)
    80338036    {
    80348037        *pu32Dst = *pu32Src;
    8035         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu32Src, IEM_ACCESS_DATA_R);
     8038        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu32Src, IEM_ACCESS_DATA_R);
    80368039    }
    80378040    return rc;
     
    80418044#ifdef IEM_WITH_SETJMP
    80428045
    8043 IEM_STATIC RTGCPTR iemMemApplySegmentToReadJmp(PIEMCPU pIemCpu, uint8_t iSegReg, size_t cbMem, RTGCPTR GCPtrMem)
     8046IEM_STATIC RTGCPTR iemMemApplySegmentToReadJmp(PVMCPU pVCpu, uint8_t iSegReg, size_t cbMem, RTGCPTR GCPtrMem)
    80448047{
    80458048    Assert(cbMem >= 1);
     
    80498052     * 64-bit mode is simpler.
    80508053     */
    8051     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8054    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    80528055    {
    80538056        if (iSegReg >= X86_SREG_FS)
    80548057        {
    8055             PCPUMSELREGHID pSel = iemSRegGetHid(pIemCpu, iSegReg);
     8058            PCPUMSELREGHID pSel = iemSRegGetHid(pVCpu, iSegReg);
    80568059            GCPtrMem += pSel->u64Base;
    80578060        }
     
    80658068    else
    80668069    {
    8067         PCPUMSELREGHID pSel   = iemSRegGetHid(pIemCpu, iSegReg);
     8070        PCPUMSELREGHID pSel   = iemSRegGetHid(pVCpu, iSegReg);
    80688071        if (      (pSel->Attr.u & (X86DESCATTR_P | X86DESCATTR_UNUSABLE | X86_SEL_TYPE_CODE | X86_SEL_TYPE_DOWN))
    80698072               == X86DESCATTR_P /* data, expand up */
     
    80888091        }
    80898092        else
    8090             iemRaiseSelectorInvalidAccessJmp(pIemCpu, iSegReg, IEM_ACCESS_DATA_R);
    8091         iemRaiseSelectorBoundsJmp(pIemCpu, iSegReg, IEM_ACCESS_DATA_R);
    8092     }
    8093     iemRaiseGeneralProtectionFault0Jmp(pIemCpu);
     8093            iemRaiseSelectorInvalidAccessJmp(pVCpu, iSegReg, IEM_ACCESS_DATA_R);
     8094        iemRaiseSelectorBoundsJmp(pVCpu, iSegReg, IEM_ACCESS_DATA_R);
     8095    }
     8096    iemRaiseGeneralProtectionFault0Jmp(pVCpu);
    80948097}
    80958098
     
    80998102 *
    81008103 * @returns The dword
    8101  * @param   pIemCpu             The IEM per CPU data.
     8104 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    81028105 * @param   iSegReg             The index of the segment register to use for
    81038106 *                              this access.  The base and limits are checked.
    81048107 * @param   GCPtrMem            The address of the guest memory.
    81058108 */
    8106 IEM_STATIC uint32_t iemMemFetchDataU32SafeJmp(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem)
    8107 {
    8108     uint32_t const *pu32Src = (uint32_t const *)iemMemMapJmp(pIemCpu, sizeof(*pu32Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8109IEM_STATIC uint32_t iemMemFetchDataU32SafeJmp(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8110{
     8111    uint32_t const *pu32Src = (uint32_t const *)iemMemMapJmp(pVCpu, sizeof(*pu32Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    81098112    uint32_t const  u32Ret  = *pu32Src;
    8110     iemMemCommitAndUnmapJmp(pIemCpu, (void *)pu32Src, IEM_ACCESS_DATA_R);
     8113    iemMemCommitAndUnmapJmp(pVCpu, (void *)pu32Src, IEM_ACCESS_DATA_R);
    81118114    return u32Ret;
    81128115}
     
    81178120 *
    81188121 * @returns The dword
    8119  * @param   pIemCpu             The IEM per CPU data.
     8122 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    81208123 * @param   iSegReg             The index of the segment register to use for
    81218124 *                              this access.  The base and limits are checked.
    81228125 * @param   GCPtrMem            The address of the guest memory.
    81238126 */
    8124 DECL_NO_INLINE(IEM_STATIC, uint32_t) iemMemFetchDataU32Jmp(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8127DECL_NO_INLINE(IEM_STATIC, uint32_t) iemMemFetchDataU32Jmp(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem)
    81258128{
    81268129# ifdef IEM_WITH_DATA_TLB
    8127     RTGCPTR GCPtrEff = iemMemApplySegmentToReadJmp(pIemCpu, iSegReg, sizeof(uint32_t), GCPtrMem);
     8130    RTGCPTR GCPtrEff = iemMemApplySegmentToReadJmp(pVCpu, iSegReg, sizeof(uint32_t), GCPtrMem);
    81288131    if (RT_LIKELY((GCPtrEff & X86_PAGE_OFFSET_MASK) <= X86_PAGE_SIZE - sizeof(uint32_t)))
    81298132    {
     
    81318134    }
    81328135
    8133     return iemMemFetchDataU32SafeJmp(pIemCpu, iSegReg, GCPtrMem);
     8136    return iemMemFetchDataU32SafeJmp(pVCpu, iSegReg, GCPtrMem);
    81348137# else
    81358138    /* The lazy approach. */
    8136     uint32_t const *pu32Src = (uint32_t const *)iemMemMapJmp(pIemCpu, sizeof(*pu32Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8139    uint32_t const *pu32Src = (uint32_t const *)iemMemMapJmp(pVCpu, sizeof(*pu32Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    81378140    uint32_t const  u32Ret  = *pu32Src;
    8138     iemMemCommitAndUnmapJmp(pIemCpu, (void *)pu32Src, IEM_ACCESS_DATA_R);
     8141    iemMemCommitAndUnmapJmp(pVCpu, (void *)pu32Src, IEM_ACCESS_DATA_R);
    81398142    return u32Ret;
    81408143# endif
     
    81488151 *
    81498152 * @returns Strict VBox status code.
    8150  * @param   pIemCpu             The IEM per CPU data.
     8153 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    81518154 * @param   pu64Dst             Where to return the sign extended value.
    81528155 * @param   iSegReg             The index of the segment register to use for
     
    81548157 * @param   GCPtrMem            The address of the guest memory.
    81558158 */
    8156 IEM_STATIC VBOXSTRICTRC iemMemFetchDataS32SxU64(PIEMCPU pIemCpu, uint64_t *pu64Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8159IEM_STATIC VBOXSTRICTRC iemMemFetchDataS32SxU64(PVMCPU pVCpu, uint64_t *pu64Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    81578160{
    81588161    /* The lazy approach for now... */
    81598162    int32_t const *pi32Src;
    8160     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pi32Src, sizeof(*pi32Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8163    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pi32Src, sizeof(*pi32Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    81618164    if (rc == VINF_SUCCESS)
    81628165    {
    81638166        *pu64Dst = *pi32Src;
    8164         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pi32Src, IEM_ACCESS_DATA_R);
     8167        rc = iemMemCommitAndUnmap(pVCpu, (void *)pi32Src, IEM_ACCESS_DATA_R);
    81658168    }
    81668169#ifdef __GNUC__ /* warning: GCC may be a royal pain */
     
    81778180 *
    81788181 * @returns Strict VBox status code.
    8179  * @param   pIemCpu             The IEM per CPU data.
     8182 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    81808183 * @param   pu64Dst             Where to return the qword.
    81818184 * @param   iSegReg             The index of the segment register to use for
     
    81838186 * @param   GCPtrMem            The address of the guest memory.
    81848187 */
    8185 IEM_STATIC VBOXSTRICTRC iemMemFetchDataU64(PIEMCPU pIemCpu, uint64_t *pu64Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8188IEM_STATIC VBOXSTRICTRC iemMemFetchDataU64(PVMCPU pVCpu, uint64_t *pu64Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    81868189{
    81878190    /* The lazy approach for now... */
    81888191    uint64_t const *pu64Src;
    8189     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu64Src, sizeof(*pu64Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8192    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu64Src, sizeof(*pu64Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    81908193    if (rc == VINF_SUCCESS)
    81918194    {
    81928195        *pu64Dst = *pu64Src;
    8193         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu64Src, IEM_ACCESS_DATA_R);
     8196        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu64Src, IEM_ACCESS_DATA_R);
    81948197    }
    81958198    return rc;
     
    82028205 *
    82038206 * @returns The qword.
    8204  * @param   pIemCpu             The IEM per CPU data.
     8207 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    82058208 * @param   iSegReg             The index of the segment register to use for
    82068209 *                              this access.  The base and limits are checked.
    82078210 * @param   GCPtrMem            The address of the guest memory.
    82088211 */
    8209 DECL_NO_INLINE(IEM_STATIC, uint64_t) iemMemFetchDataU64Jmp(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8212DECL_NO_INLINE(IEM_STATIC, uint64_t) iemMemFetchDataU64Jmp(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem)
    82108213{
    82118214    /* The lazy approach for now... */
    8212     uint64_t const *pu64Src = (uint64_t const *)iemMemMapJmp(pIemCpu, sizeof(*pu64Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8215    uint64_t const *pu64Src = (uint64_t const *)iemMemMapJmp(pVCpu, sizeof(*pu64Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    82138216    uint64_t const u64Ret = *pu64Src;
    8214     iemMemCommitAndUnmapJmp(pIemCpu, (void *)pu64Src, IEM_ACCESS_DATA_R);
     8217    iemMemCommitAndUnmapJmp(pVCpu, (void *)pu64Src, IEM_ACCESS_DATA_R);
    82158218    return u64Ret;
    82168219}
     
    82228225 *
    82238226 * @returns Strict VBox status code.
    8224  * @param   pIemCpu             The IEM per CPU data.
     8227 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    82258228 * @param   pu64Dst             Where to return the qword.
    82268229 * @param   iSegReg             The index of the segment register to use for
     
    82288231 * @param   GCPtrMem            The address of the guest memory.
    82298232 */
    8230 IEM_STATIC VBOXSTRICTRC iemMemFetchDataU64AlignedU128(PIEMCPU pIemCpu, uint64_t *pu64Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8233IEM_STATIC VBOXSTRICTRC iemMemFetchDataU64AlignedU128(PVMCPU pVCpu, uint64_t *pu64Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    82318234{
    82328235    /* The lazy approach for now... */
    82338236    /** @todo testcase: Ordering of \#SS(0) vs \#GP() vs \#PF on SSE stuff. */
    82348237    if (RT_UNLIKELY(GCPtrMem & 15))
    8235         return iemRaiseGeneralProtectionFault0(pIemCpu);
     8238        return iemRaiseGeneralProtectionFault0(pVCpu);
    82368239
    82378240    uint64_t const *pu64Src;
    8238     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu64Src, sizeof(*pu64Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8241    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu64Src, sizeof(*pu64Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    82398242    if (rc == VINF_SUCCESS)
    82408243    {
    82418244        *pu64Dst = *pu64Src;
    8242         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu64Src, IEM_ACCESS_DATA_R);
     8245        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu64Src, IEM_ACCESS_DATA_R);
    82438246    }
    82448247    return rc;
     
    82518254 *
    82528255 * @returns The qword.
    8253  * @param   pIemCpu             The IEM per CPU data.
     8256 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    82548257 * @param   iSegReg             The index of the segment register to use for
    82558258 *                              this access.  The base and limits are checked.
    82568259 * @param   GCPtrMem            The address of the guest memory.
    82578260 */
    8258 DECL_NO_INLINE(IEM_STATIC, uint64_t) iemMemFetchDataU64AlignedU128Jmp(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8261DECL_NO_INLINE(IEM_STATIC, uint64_t) iemMemFetchDataU64AlignedU128Jmp(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem)
    82598262{
    82608263    /* The lazy approach for now... */
     
    82628265    if (RT_LIKELY(!(GCPtrMem & 15)))
    82638266    {
    8264         uint64_t const *pu64Src = (uint64_t const *)iemMemMapJmp(pIemCpu, sizeof(*pu64Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8267        uint64_t const *pu64Src = (uint64_t const *)iemMemMapJmp(pVCpu, sizeof(*pu64Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    82658268        uint64_t const u64Ret = *pu64Src;
    8266         iemMemCommitAndUnmapJmp(pIemCpu, (void *)pu64Src, IEM_ACCESS_DATA_R);
     8269        iemMemCommitAndUnmapJmp(pVCpu, (void *)pu64Src, IEM_ACCESS_DATA_R);
    82678270        return u64Ret;
    82688271    }
    82698272
    8270     VBOXSTRICTRC rc = iemRaiseGeneralProtectionFault0(pIemCpu);
    8271     longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rc));
     8273    VBOXSTRICTRC rc = iemRaiseGeneralProtectionFault0(pVCpu);
     8274    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rc));
    82728275}
    82738276#endif
     
    82788281 *
    82798282 * @returns Strict VBox status code.
    8280  * @param   pIemCpu             The IEM per CPU data.
     8283 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    82818284 * @param   pr80Dst             Where to return the tword.
    82828285 * @param   iSegReg             The index of the segment register to use for
     
    82848287 * @param   GCPtrMem            The address of the guest memory.
    82858288 */
    8286 IEM_STATIC VBOXSTRICTRC iemMemFetchDataR80(PIEMCPU pIemCpu, PRTFLOAT80U pr80Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8289IEM_STATIC VBOXSTRICTRC iemMemFetchDataR80(PVMCPU pVCpu, PRTFLOAT80U pr80Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    82878290{
    82888291    /* The lazy approach for now... */
    82898292    PCRTFLOAT80U pr80Src;
    8290     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pr80Src, sizeof(*pr80Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8293    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pr80Src, sizeof(*pr80Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    82918294    if (rc == VINF_SUCCESS)
    82928295    {
    82938296        *pr80Dst = *pr80Src;
    8294         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pr80Src, IEM_ACCESS_DATA_R);
     8297        rc = iemMemCommitAndUnmap(pVCpu, (void *)pr80Src, IEM_ACCESS_DATA_R);
    82958298    }
    82968299    return rc;
     
    83028305 * Fetches a data tword, longjmp on error.
    83038306 *
    8304  * @param   pIemCpu             The IEM per CPU data.
     8307 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    83058308 * @param   pr80Dst             Where to return the tword.
    83068309 * @param   iSegReg             The index of the segment register to use for
     
    83088311 * @param   GCPtrMem            The address of the guest memory.
    83098312 */
    8310 DECL_NO_INLINE(IEM_STATIC, void) iemMemFetchDataR80Jmp(PIEMCPU pIemCpu, PRTFLOAT80U pr80Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8313DECL_NO_INLINE(IEM_STATIC, void) iemMemFetchDataR80Jmp(PVMCPU pVCpu, PRTFLOAT80U pr80Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    83118314{
    83128315    /* The lazy approach for now... */
    8313     PCRTFLOAT80U pr80Src = (PCRTFLOAT80U)iemMemMapJmp(pIemCpu, sizeof(*pr80Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8316    PCRTFLOAT80U pr80Src = (PCRTFLOAT80U)iemMemMapJmp(pVCpu, sizeof(*pr80Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    83148317    *pr80Dst = *pr80Src;
    8315     iemMemCommitAndUnmapJmp(pIemCpu, (void *)pr80Src, IEM_ACCESS_DATA_R);
     8318    iemMemCommitAndUnmapJmp(pVCpu, (void *)pr80Src, IEM_ACCESS_DATA_R);
    83168319}
    83178320#endif
     
    83228325 *
    83238326 * @returns Strict VBox status code.
    8324  * @param   pIemCpu             The IEM per CPU data.
     8327 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    83258328 * @param   pu128Dst            Where to return the qword.
    83268329 * @param   iSegReg             The index of the segment register to use for
     
    83288331 * @param   GCPtrMem            The address of the guest memory.
    83298332 */
    8330 IEM_STATIC VBOXSTRICTRC iemMemFetchDataU128(PIEMCPU pIemCpu, uint128_t *pu128Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8333IEM_STATIC VBOXSTRICTRC iemMemFetchDataU128(PVMCPU pVCpu, uint128_t *pu128Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    83318334{
    83328335    /* The lazy approach for now... */
    83338336    uint128_t const *pu128Src;
    8334     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu128Src, sizeof(*pu128Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8337    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu128Src, sizeof(*pu128Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    83358338    if (rc == VINF_SUCCESS)
    83368339    {
    83378340        *pu128Dst = *pu128Src;
    8338         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu128Src, IEM_ACCESS_DATA_R);
     8341        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu128Src, IEM_ACCESS_DATA_R);
    83398342    }
    83408343    return rc;
     
    83468349 * Fetches a data dqword (double qword), generally SSE related.
    83478350 *
    8348  * @param   pIemCpu             The IEM per CPU data.
     8351 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    83498352 * @param   pu128Dst            Where to return the qword.
    83508353 * @param   iSegReg             The index of the segment register to use for
     
    83528355 * @param   GCPtrMem            The address of the guest memory.
    83538356 */
    8354 IEM_STATIC void iemMemFetchDataU128Jmp(PIEMCPU pIemCpu, uint128_t *pu128Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8357IEM_STATIC void iemMemFetchDataU128Jmp(PVMCPU pVCpu, uint128_t *pu128Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    83558358{
    83568359    /* The lazy approach for now... */
    8357     uint128_t const *pu128Src = (uint128_t const *)iemMemMapJmp(pIemCpu, sizeof(*pu128Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8360    uint128_t const *pu128Src = (uint128_t const *)iemMemMapJmp(pVCpu, sizeof(*pu128Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    83588361    *pu128Dst = *pu128Src;
    8359     iemMemCommitAndUnmapJmp(pIemCpu, (void *)pu128Src, IEM_ACCESS_DATA_R);
     8362    iemMemCommitAndUnmapJmp(pVCpu, (void *)pu128Src, IEM_ACCESS_DATA_R);
    83608363}
    83618364#endif
     
    83698372 *
    83708373 * @returns Strict VBox status code.
    8371  * @param   pIemCpu             The IEM per CPU data.
     8374 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    83728375 * @param   pu128Dst            Where to return the qword.
    83738376 * @param   iSegReg             The index of the segment register to use for
     
    83758378 * @param   GCPtrMem            The address of the guest memory.
    83768379 */
    8377 IEM_STATIC VBOXSTRICTRC iemMemFetchDataU128AlignedSse(PIEMCPU pIemCpu, uint128_t *pu128Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8380IEM_STATIC VBOXSTRICTRC iemMemFetchDataU128AlignedSse(PVMCPU pVCpu, uint128_t *pu128Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    83788381{
    83798382    /* The lazy approach for now... */
    83808383    /** @todo testcase: Ordering of \#SS(0) vs \#GP() vs \#PF on SSE stuff. */
    83818384    if (   (GCPtrMem & 15)
    8382         && !(pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    8383         return iemRaiseGeneralProtectionFault0(pIemCpu);
     8385        && !(pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     8386        return iemRaiseGeneralProtectionFault0(pVCpu);
    83848387
    83858388    uint128_t const *pu128Src;
    8386     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu128Src, sizeof(*pu128Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     8389    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu128Src, sizeof(*pu128Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
    83878390    if (rc == VINF_SUCCESS)
    83888391    {
    83898392        *pu128Dst = *pu128Src;
    8390         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu128Src, IEM_ACCESS_DATA_R);
     8393        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu128Src, IEM_ACCESS_DATA_R);
    83918394    }
    83928395    return rc;
     
    84018404 * Raises \#GP(0) if not aligned.
    84028405 *
    8403  * @param   pIemCpu             The IEM per CPU data.
     8406 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    84048407 * @param   pu128Dst            Where to return the qword.
    84058408 * @param   iSegReg             The index of the segment register to use for
     
    84078410 * @param   GCPtrMem            The address of the guest memory.
    84088411 */
    8409 DECL_NO_INLINE(IEM_STATIC, void) iemMemFetchDataU128AlignedSseJmp(PIEMCPU pIemCpu, uint128_t *pu128Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8412DECL_NO_INLINE(IEM_STATIC, void) iemMemFetchDataU128AlignedSseJmp(PVMCPU pVCpu, uint128_t *pu128Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    84108413{
    84118414    /* The lazy approach for now... */
    84128415    /** @todo testcase: Ordering of \#SS(0) vs \#GP() vs \#PF on SSE stuff. */
    84138416    if (   (GCPtrMem & 15) == 0
    8414         || (pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    8415     {
    8416         uint128_t const *pu128Src = (uint128_t const *)iemMemMapJmp(pIemCpu, sizeof(*pu128Src), iSegReg, GCPtrMem,
     8417        || (pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     8418    {
     8419        uint128_t const *pu128Src = (uint128_t const *)iemMemMapJmp(pVCpu, sizeof(*pu128Src), iSegReg, GCPtrMem,
    84178420                                                                    IEM_ACCESS_DATA_R);
    84188421        *pu128Dst = *pu128Src;
    8419         iemMemCommitAndUnmapJmp(pIemCpu, (void *)pu128Src, IEM_ACCESS_DATA_R);
     8422        iemMemCommitAndUnmapJmp(pVCpu, (void *)pu128Src, IEM_ACCESS_DATA_R);
    84208423        return;
    84218424    }
    84228425
    8423     VBOXSTRICTRC rcStrict = iemRaiseGeneralProtectionFault0(pIemCpu);
    8424     longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     8426    VBOXSTRICTRC rcStrict = iemRaiseGeneralProtectionFault0(pVCpu);
     8427    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    84258428}
    84268429#endif
     
    84328435 *
    84338436 * @returns Strict VBox status code.
    8434  * @param   pIemCpu             The IEM per CPU data.
     8437 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    84358438 * @param   pcbLimit            Where to return the limit.
    84368439 * @param   pGCPtrBase          Where to return the base.
     
    84408443 * @param   enmOpSize           The effective operand size.
    84418444 */
    8442 IEM_STATIC VBOXSTRICTRC iemMemFetchDataXdtr(PIEMCPU pIemCpu, uint16_t *pcbLimit, PRTGCPTR pGCPtrBase, uint8_t iSegReg,
     8445IEM_STATIC VBOXSTRICTRC iemMemFetchDataXdtr(PVMCPU pVCpu, uint16_t *pcbLimit, PRTGCPTR pGCPtrBase, uint8_t iSegReg,
    84438446                                            RTGCPTR GCPtrMem, IEMMODE enmOpSize)
    84448447{
     
    84558458     */
    84568459    VBOXSTRICTRC rcStrict;
    8457     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
    8458     {
    8459         rcStrict = iemMemFetchDataU16(pIemCpu, pcbLimit, iSegReg, GCPtrMem);
     8460    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
     8461    {
     8462        rcStrict = iemMemFetchDataU16(pVCpu, pcbLimit, iSegReg, GCPtrMem);
    84608463        if (rcStrict == VINF_SUCCESS)
    8461             rcStrict = iemMemFetchDataU64(pIemCpu, pGCPtrBase, iSegReg, GCPtrMem + 2);
     8464            rcStrict = iemMemFetchDataU64(pVCpu, pGCPtrBase, iSegReg, GCPtrMem + 2);
    84628465    }
    84638466    else
     
    84668469        if (enmOpSize == IEMMODE_32BIT)
    84678470        {
    8468             if (IEM_GET_TARGET_CPU(pIemCpu) != IEMTARGETCPU_486)
     8471            if (IEM_GET_TARGET_CPU(pVCpu) != IEMTARGETCPU_486)
    84698472            {
    8470                 rcStrict = iemMemFetchDataU16(pIemCpu, pcbLimit, iSegReg, GCPtrMem);
     8473                rcStrict = iemMemFetchDataU16(pVCpu, pcbLimit, iSegReg, GCPtrMem);
    84718474                if (rcStrict == VINF_SUCCESS)
    8472                     rcStrict = iemMemFetchDataU32(pIemCpu, &uTmp, iSegReg, GCPtrMem + 2);
     8475                    rcStrict = iemMemFetchDataU32(pVCpu, &uTmp, iSegReg, GCPtrMem + 2);
    84738476            }
    84748477            else
    84758478            {
    8476                 rcStrict = iemMemFetchDataU32(pIemCpu, &uTmp, iSegReg, GCPtrMem);
     8479                rcStrict = iemMemFetchDataU32(pVCpu, &uTmp, iSegReg, GCPtrMem);
    84778480                if (rcStrict == VINF_SUCCESS)
    84788481                {
    84798482                    *pcbLimit = (uint16_t)uTmp;
    8480                     rcStrict = iemMemFetchDataU32(pIemCpu, &uTmp, iSegReg, GCPtrMem + 2);
     8483                    rcStrict = iemMemFetchDataU32(pVCpu, &uTmp, iSegReg, GCPtrMem + 2);
    84818484                }
    84828485            }
     
    84868489        else
    84878490        {
    8488             rcStrict = iemMemFetchDataU16(pIemCpu, pcbLimit, iSegReg, GCPtrMem);
     8491            rcStrict = iemMemFetchDataU16(pVCpu, pcbLimit, iSegReg, GCPtrMem);
    84898492            if (rcStrict == VINF_SUCCESS)
    84908493            {
    8491                 rcStrict = iemMemFetchDataU32(pIemCpu, &uTmp, iSegReg, GCPtrMem + 2);
     8494                rcStrict = iemMemFetchDataU32(pVCpu, &uTmp, iSegReg, GCPtrMem + 2);
    84928495                if (rcStrict == VINF_SUCCESS)
    84938496                    *pGCPtrBase = uTmp & UINT32_C(0x00ffffff);
     
    85048507 *
    85058508 * @returns Strict VBox status code.
    8506  * @param   pIemCpu             The IEM per CPU data.
     8509 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    85078510 * @param   iSegReg             The index of the segment register to use for
    85088511 *                              this access.  The base and limits are checked.
     
    85108513 * @param   u8Value             The value to store.
    85118514 */
    8512 IEM_STATIC VBOXSTRICTRC iemMemStoreDataU8(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint8_t u8Value)
     8515IEM_STATIC VBOXSTRICTRC iemMemStoreDataU8(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint8_t u8Value)
    85138516{
    85148517    /* The lazy approach for now... */
    85158518    uint8_t *pu8Dst;
    8516     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu8Dst, sizeof(*pu8Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     8519    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu8Dst, sizeof(*pu8Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
    85178520    if (rc == VINF_SUCCESS)
    85188521    {
    85198522        *pu8Dst = u8Value;
    8520         rc = iemMemCommitAndUnmap(pIemCpu, pu8Dst, IEM_ACCESS_DATA_W);
     8523        rc = iemMemCommitAndUnmap(pVCpu, pu8Dst, IEM_ACCESS_DATA_W);
    85218524    }
    85228525    return rc;
     
    85288531 * Stores a data byte, longjmp on error.
    85298532 *
    8530  * @param   pIemCpu             The IEM per CPU data.
     8533 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    85318534 * @param   iSegReg             The index of the segment register to use for
    85328535 *                              this access.  The base and limits are checked.
     
    85348537 * @param   u8Value             The value to store.
    85358538 */
    8536 IEM_STATIC void iemMemStoreDataU8Jmp(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint8_t u8Value)
     8539IEM_STATIC void iemMemStoreDataU8Jmp(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint8_t u8Value)
    85378540{
    85388541    /* The lazy approach for now... */
    8539     uint8_t *pu8Dst = (uint8_t *)iemMemMapJmp(pIemCpu, sizeof(*pu8Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     8542    uint8_t *pu8Dst = (uint8_t *)iemMemMapJmp(pVCpu, sizeof(*pu8Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
    85408543    *pu8Dst = u8Value;
    8541     iemMemCommitAndUnmapJmp(pIemCpu, pu8Dst, IEM_ACCESS_DATA_W);
     8544    iemMemCommitAndUnmapJmp(pVCpu, pu8Dst, IEM_ACCESS_DATA_W);
    85428545}
    85438546#endif
     
    85488551 *
    85498552 * @returns Strict VBox status code.
    8550  * @param   pIemCpu             The IEM per CPU data.
     8553 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    85518554 * @param   iSegReg             The index of the segment register to use for
    85528555 *                              this access.  The base and limits are checked.
     
    85548557 * @param   u16Value            The value to store.
    85558558 */
    8556 IEM_STATIC VBOXSTRICTRC iemMemStoreDataU16(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint16_t u16Value)
     8559IEM_STATIC VBOXSTRICTRC iemMemStoreDataU16(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint16_t u16Value)
    85578560{
    85588561    /* The lazy approach for now... */
    85598562    uint16_t *pu16Dst;
    8560     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu16Dst, sizeof(*pu16Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     8563    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu16Dst, sizeof(*pu16Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
    85618564    if (rc == VINF_SUCCESS)
    85628565    {
    85638566        *pu16Dst = u16Value;
    8564         rc = iemMemCommitAndUnmap(pIemCpu, pu16Dst, IEM_ACCESS_DATA_W);
     8567        rc = iemMemCommitAndUnmap(pVCpu, pu16Dst, IEM_ACCESS_DATA_W);
    85658568    }
    85668569    return rc;
     
    85728575 * Stores a data word, longjmp on error.
    85738576 *
    8574  * @param   pIemCpu             The IEM per CPU data.
     8577 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    85758578 * @param   iSegReg             The index of the segment register to use for
    85768579 *                              this access.  The base and limits are checked.
     
    85788581 * @param   u16Value            The value to store.
    85798582 */
    8580 IEM_STATIC void iemMemStoreDataU16Jmp(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint16_t u16Value)
     8583IEM_STATIC void iemMemStoreDataU16Jmp(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint16_t u16Value)
    85818584{
    85828585    /* The lazy approach for now... */
    8583     uint16_t *pu16Dst = (uint16_t *)iemMemMapJmp(pIemCpu, sizeof(*pu16Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     8586    uint16_t *pu16Dst = (uint16_t *)iemMemMapJmp(pVCpu, sizeof(*pu16Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
    85848587    *pu16Dst = u16Value;
    8585     iemMemCommitAndUnmapJmp(pIemCpu, pu16Dst, IEM_ACCESS_DATA_W);
     8588    iemMemCommitAndUnmapJmp(pVCpu, pu16Dst, IEM_ACCESS_DATA_W);
    85868589}
    85878590#endif
     
    85928595 *
    85938596 * @returns Strict VBox status code.
    8594  * @param   pIemCpu             The IEM per CPU data.
     8597 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    85958598 * @param   iSegReg             The index of the segment register to use for
    85968599 *                              this access.  The base and limits are checked.
     
    85988601 * @param   u32Value            The value to store.
    85998602 */
    8600 IEM_STATIC VBOXSTRICTRC iemMemStoreDataU32(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint32_t u32Value)
     8603IEM_STATIC VBOXSTRICTRC iemMemStoreDataU32(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint32_t u32Value)
    86018604{
    86028605    /* The lazy approach for now... */
    86038606    uint32_t *pu32Dst;
    8604     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu32Dst, sizeof(*pu32Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     8607    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu32Dst, sizeof(*pu32Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
    86058608    if (rc == VINF_SUCCESS)
    86068609    {
    86078610        *pu32Dst = u32Value;
    8608         rc = iemMemCommitAndUnmap(pIemCpu, pu32Dst, IEM_ACCESS_DATA_W);
     8611        rc = iemMemCommitAndUnmap(pVCpu, pu32Dst, IEM_ACCESS_DATA_W);
    86098612    }
    86108613    return rc;
     
    86178620 *
    86188621 * @returns Strict VBox status code.
    8619  * @param   pIemCpu             The IEM per CPU data.
     8622 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    86208623 * @param   iSegReg             The index of the segment register to use for
    86218624 *                              this access.  The base and limits are checked.
     
    86238626 * @param   u32Value            The value to store.
    86248627 */
    8625 IEM_STATIC void iemMemStoreDataU32Jmp(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint32_t u32Value)
     8628IEM_STATIC void iemMemStoreDataU32Jmp(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint32_t u32Value)
    86268629{
    86278630    /* The lazy approach for now... */
    8628     uint32_t *pu32Dst = (uint32_t *)iemMemMapJmp(pIemCpu, sizeof(*pu32Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     8631    uint32_t *pu32Dst = (uint32_t *)iemMemMapJmp(pVCpu, sizeof(*pu32Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
    86298632    *pu32Dst = u32Value;
    8630     iemMemCommitAndUnmapJmp(pIemCpu, pu32Dst, IEM_ACCESS_DATA_W);
     8633    iemMemCommitAndUnmapJmp(pVCpu, pu32Dst, IEM_ACCESS_DATA_W);
    86318634}
    86328635#endif
     
    86378640 *
    86388641 * @returns Strict VBox status code.
    8639  * @param   pIemCpu             The IEM per CPU data.
     8642 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    86408643 * @param   iSegReg             The index of the segment register to use for
    86418644 *                              this access.  The base and limits are checked.
     
    86438646 * @param   u64Value            The value to store.
    86448647 */
    8645 IEM_STATIC VBOXSTRICTRC iemMemStoreDataU64(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint64_t u64Value)
     8648IEM_STATIC VBOXSTRICTRC iemMemStoreDataU64(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint64_t u64Value)
    86468649{
    86478650    /* The lazy approach for now... */
    86488651    uint64_t *pu64Dst;
    8649     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu64Dst, sizeof(*pu64Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     8652    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu64Dst, sizeof(*pu64Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
    86508653    if (rc == VINF_SUCCESS)
    86518654    {
    86528655        *pu64Dst = u64Value;
    8653         rc = iemMemCommitAndUnmap(pIemCpu, pu64Dst, IEM_ACCESS_DATA_W);
     8656        rc = iemMemCommitAndUnmap(pVCpu, pu64Dst, IEM_ACCESS_DATA_W);
    86548657    }
    86558658    return rc;
     
    86618664 * Stores a data qword, longjmp on error.
    86628665 *
    8663  * @param   pIemCpu             The IEM per CPU data.
     8666 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    86648667 * @param   iSegReg             The index of the segment register to use for
    86658668 *                              this access.  The base and limits are checked.
     
    86678670 * @param   u64Value            The value to store.
    86688671 */
    8669 IEM_STATIC void iemMemStoreDataU64Jmp(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint64_t u64Value)
     8672IEM_STATIC void iemMemStoreDataU64Jmp(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint64_t u64Value)
    86708673{
    86718674    /* The lazy approach for now... */
    8672     uint64_t *pu64Dst = (uint64_t *)iemMemMapJmp(pIemCpu, sizeof(*pu64Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     8675    uint64_t *pu64Dst = (uint64_t *)iemMemMapJmp(pVCpu, sizeof(*pu64Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
    86738676    *pu64Dst = u64Value;
    8674     iemMemCommitAndUnmapJmp(pIemCpu, pu64Dst, IEM_ACCESS_DATA_W);
     8677    iemMemCommitAndUnmapJmp(pVCpu, pu64Dst, IEM_ACCESS_DATA_W);
    86758678}
    86768679#endif
     
    86818684 *
    86828685 * @returns Strict VBox status code.
    8683  * @param   pIemCpu             The IEM per CPU data.
     8686 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    86848687 * @param   iSegReg             The index of the segment register to use for
    86858688 *                              this access.  The base and limits are checked.
     
    86878690 * @param   u128Value            The value to store.
    86888691 */
    8689 IEM_STATIC VBOXSTRICTRC iemMemStoreDataU128(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint128_t u128Value)
     8692IEM_STATIC VBOXSTRICTRC iemMemStoreDataU128(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint128_t u128Value)
    86908693{
    86918694    /* The lazy approach for now... */
    86928695    uint128_t *pu128Dst;
    8693     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu128Dst, sizeof(*pu128Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     8696    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu128Dst, sizeof(*pu128Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
    86948697    if (rc == VINF_SUCCESS)
    86958698    {
    86968699        *pu128Dst = u128Value;
    8697         rc = iemMemCommitAndUnmap(pIemCpu, pu128Dst, IEM_ACCESS_DATA_W);
     8700        rc = iemMemCommitAndUnmap(pVCpu, pu128Dst, IEM_ACCESS_DATA_W);
    86988701    }
    86998702    return rc;
     
    87058708 * Stores a data dqword, longjmp on error.
    87068709 *
    8707  * @param   pIemCpu             The IEM per CPU data.
     8710 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    87088711 * @param   iSegReg             The index of the segment register to use for
    87098712 *                              this access.  The base and limits are checked.
     
    87118714 * @param   u128Value            The value to store.
    87128715 */
    8713 IEM_STATIC void iemMemStoreDataU128Jmp(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint128_t u128Value)
     8716IEM_STATIC void iemMemStoreDataU128Jmp(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint128_t u128Value)
    87148717{
    87158718    /* The lazy approach for now... */
    8716     uint128_t *pu128Dst = (uint128_t *)iemMemMapJmp(pIemCpu, sizeof(*pu128Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     8719    uint128_t *pu128Dst = (uint128_t *)iemMemMapJmp(pVCpu, sizeof(*pu128Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
    87178720    *pu128Dst = u128Value;
    8718     iemMemCommitAndUnmapJmp(pIemCpu, pu128Dst, IEM_ACCESS_DATA_W);
     8721    iemMemCommitAndUnmapJmp(pVCpu, pu128Dst, IEM_ACCESS_DATA_W);
    87198722}
    87208723#endif
     
    87258728 *
    87268729 * @returns Strict VBox status code.
    8727  * @param   pIemCpu             The IEM per CPU data.
     8730 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    87288731 * @param   iSegReg             The index of the segment register to use for
    87298732 *                              this access.  The base and limits are checked.
     
    87318734 * @param   u128Value           The value to store.
    87328735 */
    8733 IEM_STATIC VBOXSTRICTRC iemMemStoreDataU128AlignedSse(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint128_t u128Value)
     8736IEM_STATIC VBOXSTRICTRC iemMemStoreDataU128AlignedSse(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint128_t u128Value)
    87348737{
    87358738    /* The lazy approach for now... */
    87368739    if (   (GCPtrMem & 15)
    8737         && !(pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    8738         return iemRaiseGeneralProtectionFault0(pIemCpu);
     8740        && !(pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     8741        return iemRaiseGeneralProtectionFault0(pVCpu);
    87398742
    87408743    uint128_t *pu128Dst;
    8741     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu128Dst, sizeof(*pu128Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     8744    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu128Dst, sizeof(*pu128Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
    87428745    if (rc == VINF_SUCCESS)
    87438746    {
    87448747        *pu128Dst = u128Value;
    8745         rc = iemMemCommitAndUnmap(pIemCpu, pu128Dst, IEM_ACCESS_DATA_W);
     8748        rc = iemMemCommitAndUnmap(pVCpu, pu128Dst, IEM_ACCESS_DATA_W);
    87468749    }
    87478750    return rc;
     
    87548757 *
    87558758 * @returns Strict VBox status code.
    8756  * @param   pIemCpu             The IEM per CPU data.
     8759 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    87578760 * @param   iSegReg             The index of the segment register to use for
    87588761 *                              this access.  The base and limits are checked.
     
    87618764 */
    87628765DECL_NO_INLINE(IEM_STATIC, void)
    8763 iemMemStoreDataU128AlignedSseJmp(PIEMCPU pIemCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint128_t u128Value)
     8766iemMemStoreDataU128AlignedSseJmp(PVMCPU pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, uint128_t u128Value)
    87648767{
    87658768    /* The lazy approach for now... */
    87668769    if (   (GCPtrMem & 15) == 0
    8767         || (pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    8768     {
    8769         uint128_t *pu128Dst = (uint128_t *)iemMemMapJmp(pIemCpu, sizeof(*pu128Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     8770        || (pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     8771    {
     8772        uint128_t *pu128Dst = (uint128_t *)iemMemMapJmp(pVCpu, sizeof(*pu128Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
    87708773        *pu128Dst = u128Value;
    8771         iemMemCommitAndUnmapJmp(pIemCpu, pu128Dst, IEM_ACCESS_DATA_W);
     8774        iemMemCommitAndUnmapJmp(pVCpu, pu128Dst, IEM_ACCESS_DATA_W);
    87728775        return;
    87738776    }
    87748777
    8775     VBOXSTRICTRC rcStrict = iemRaiseGeneralProtectionFault0(pIemCpu);
    8776     longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
     8778    VBOXSTRICTRC rcStrict = iemRaiseGeneralProtectionFault0(pVCpu);
     8779    longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VBOXSTRICTRC_VAL(rcStrict));
    87778780}
    87788781#endif
     
    87838786 *
    87848787 * @returns Strict VBox status code.
    8785  * @param   pIemCpu             The IEM per CPU data.
     8788 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    87868789 * @param   cbLimit             The limit.
    87878790 * @param   GCPtrBase           The base address.
     
    87918794 */
    87928795IEM_STATIC VBOXSTRICTRC
    8793 iemMemStoreDataXdtr(PIEMCPU pIemCpu, uint16_t cbLimit, RTGCPTR GCPtrBase, uint8_t iSegReg, RTGCPTR GCPtrMem)
     8796iemMemStoreDataXdtr(PVMCPU pVCpu, uint16_t cbLimit, RTGCPTR GCPtrBase, uint8_t iSegReg, RTGCPTR GCPtrMem)
    87948797{
    87958798    /*
     
    87978800     * independent writes.  The instructions does not respond to opsize prefixes.
    87988801     */
    8799     VBOXSTRICTRC rcStrict = iemMemStoreDataU16(pIemCpu, iSegReg, GCPtrMem, cbLimit);
     8802    VBOXSTRICTRC rcStrict = iemMemStoreDataU16(pVCpu, iSegReg, GCPtrMem, cbLimit);
    88008803    if (rcStrict == VINF_SUCCESS)
    88018804    {
    8802         if (pIemCpu->enmCpuMode == IEMMODE_16BIT)
    8803             rcStrict = iemMemStoreDataU32(pIemCpu, iSegReg, GCPtrMem + 2,
    8804                                           IEM_GET_TARGET_CPU(pIemCpu) <= IEMTARGETCPU_286
     8805        if (pVCpu->iem.s.enmCpuMode == IEMMODE_16BIT)
     8806            rcStrict = iemMemStoreDataU32(pVCpu, iSegReg, GCPtrMem + 2,
     8807                                          IEM_GET_TARGET_CPU(pVCpu) <= IEMTARGETCPU_286
    88058808                                          ? (uint32_t)GCPtrBase | UINT32_C(0xff000000) : (uint32_t)GCPtrBase);
    8806         else if (pIemCpu->enmCpuMode == IEMMODE_32BIT)
    8807             rcStrict = iemMemStoreDataU32(pIemCpu, iSegReg, GCPtrMem + 2, (uint32_t)GCPtrBase);
     8809        else if (pVCpu->iem.s.enmCpuMode == IEMMODE_32BIT)
     8810            rcStrict = iemMemStoreDataU32(pVCpu, iSegReg, GCPtrMem + 2, (uint32_t)GCPtrBase);
    88088811        else
    8809             rcStrict = iemMemStoreDataU64(pIemCpu, iSegReg, GCPtrMem + 2, GCPtrBase);
     8812            rcStrict = iemMemStoreDataU64(pVCpu, iSegReg, GCPtrMem + 2, GCPtrBase);
    88108813    }
    88118814    return rcStrict;
     
    88178820 *
    88188821 * @returns Strict VBox status code.
    8819  * @param   pIemCpu             The IEM per CPU data.
     8822 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    88208823 * @param   u16Value            The value to push.
    88218824 */
    8822 IEM_STATIC VBOXSTRICTRC iemMemStackPushU16(PIEMCPU pIemCpu, uint16_t u16Value)
     8825IEM_STATIC VBOXSTRICTRC iemMemStackPushU16(PVMCPU pVCpu, uint16_t u16Value)
    88238826{
    88248827    /* Increment the stack pointer. */
    88258828    uint64_t    uNewRsp;
    8826     PCPUMCTX    pCtx     = pIemCpu->CTX_SUFF(pCtx);
    8827     RTGCPTR     GCPtrTop = iemRegGetRspForPush(pIemCpu, pCtx, 2, &uNewRsp);
     8829    PCPUMCTX    pCtx     = pVCpu->iem.s.CTX_SUFF(pCtx);
     8830    RTGCPTR     GCPtrTop = iemRegGetRspForPush(pVCpu, pCtx, 2, &uNewRsp);
    88288831
    88298832    /* Write the word the lazy way. */
    88308833    uint16_t *pu16Dst;
    8831     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu16Dst, sizeof(*pu16Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
     8834    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu16Dst, sizeof(*pu16Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
    88328835    if (rc == VINF_SUCCESS)
    88338836    {
    88348837        *pu16Dst = u16Value;
    8835         rc = iemMemCommitAndUnmap(pIemCpu, pu16Dst, IEM_ACCESS_STACK_W);
     8838        rc = iemMemCommitAndUnmap(pVCpu, pu16Dst, IEM_ACCESS_STACK_W);
    88368839    }
    88378840
     
    88488851 *
    88498852 * @returns Strict VBox status code.
    8850  * @param   pIemCpu             The IEM per CPU data.
     8853 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    88518854 * @param   u32Value            The value to push.
    88528855 */
    8853 IEM_STATIC VBOXSTRICTRC iemMemStackPushU32(PIEMCPU pIemCpu, uint32_t u32Value)
     8856IEM_STATIC VBOXSTRICTRC iemMemStackPushU32(PVMCPU pVCpu, uint32_t u32Value)
    88548857{
    88558858    /* Increment the stack pointer. */
    88568859    uint64_t    uNewRsp;
    8857     PCPUMCTX    pCtx     = pIemCpu->CTX_SUFF(pCtx);
    8858     RTGCPTR     GCPtrTop = iemRegGetRspForPush(pIemCpu, pCtx, 4, &uNewRsp);
     8860    PCPUMCTX    pCtx     = pVCpu->iem.s.CTX_SUFF(pCtx);
     8861    RTGCPTR     GCPtrTop = iemRegGetRspForPush(pVCpu, pCtx, 4, &uNewRsp);
    88598862
    88608863    /* Write the dword the lazy way. */
    88618864    uint32_t *pu32Dst;
    8862     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu32Dst, sizeof(*pu32Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
     8865    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu32Dst, sizeof(*pu32Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
    88638866    if (rc == VINF_SUCCESS)
    88648867    {
    88658868        *pu32Dst = u32Value;
    8866         rc = iemMemCommitAndUnmap(pIemCpu, pu32Dst, IEM_ACCESS_STACK_W);
     8869        rc = iemMemCommitAndUnmap(pVCpu, pu32Dst, IEM_ACCESS_STACK_W);
    88678870    }
    88688871
     
    88798882 *
    88808883 * @returns Strict VBox status code.
    8881  * @param   pIemCpu             The IEM per CPU data.
     8884 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    88828885 * @param   u32Value            The value to push.
    88838886 */
    8884 IEM_STATIC VBOXSTRICTRC iemMemStackPushU32SReg(PIEMCPU pIemCpu, uint32_t u32Value)
     8887IEM_STATIC VBOXSTRICTRC iemMemStackPushU32SReg(PVMCPU pVCpu, uint32_t u32Value)
    88858888{
    88868889    /* Increment the stack pointer. */
    88878890    uint64_t    uNewRsp;
    8888     PCPUMCTX    pCtx     = pIemCpu->CTX_SUFF(pCtx);
    8889     RTGCPTR     GCPtrTop = iemRegGetRspForPush(pIemCpu, pCtx, 4, &uNewRsp);
     8891    PCPUMCTX    pCtx     = pVCpu->iem.s.CTX_SUFF(pCtx);
     8892    RTGCPTR     GCPtrTop = iemRegGetRspForPush(pVCpu, pCtx, 4, &uNewRsp);
    88908893
    88918894    VBOXSTRICTRC rc;
    8892     if (IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu))
     8895    if (IEM_FULL_VERIFICATION_REM_ENABLED(pVCpu))
    88938896    {
    88948897        /* The recompiler writes a full dword. */
    88958898        uint32_t *pu32Dst;
    8896         rc = iemMemMap(pIemCpu, (void **)&pu32Dst, sizeof(*pu32Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
     8899        rc = iemMemMap(pVCpu, (void **)&pu32Dst, sizeof(*pu32Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
    88978900        if (rc == VINF_SUCCESS)
    88988901        {
    88998902            *pu32Dst = u32Value;
    8900             rc = iemMemCommitAndUnmap(pIemCpu, pu32Dst, IEM_ACCESS_STACK_W);
     8903            rc = iemMemCommitAndUnmap(pVCpu, pu32Dst, IEM_ACCESS_STACK_W);
    89018904        }
    89028905    }
     
    89148917         * ancient hardware when it actually did change. */
    89158918        uint16_t *pu16Dst;
    8916         rc = iemMemMap(pIemCpu, (void **)&pu16Dst, sizeof(uint32_t), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_RW);
     8919        rc = iemMemMap(pVCpu, (void **)&pu16Dst, sizeof(uint32_t), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_RW);
    89178920        if (rc == VINF_SUCCESS)
    89188921        {
    89198922            *pu16Dst = (uint16_t)u32Value;
    8920             rc = iemMemCommitAndUnmap(pIemCpu, pu16Dst, IEM_ACCESS_STACK_RW);
     8923            rc = iemMemCommitAndUnmap(pVCpu, pu16Dst, IEM_ACCESS_STACK_RW);
    89218924        }
    89228925    }
     
    89348937 *
    89358938 * @returns Strict VBox status code.
    8936  * @param   pIemCpu             The IEM per CPU data.
     8939 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    89378940 * @param   u64Value            The value to push.
    89388941 */
    8939 IEM_STATIC VBOXSTRICTRC iemMemStackPushU64(PIEMCPU pIemCpu, uint64_t u64Value)
     8942IEM_STATIC VBOXSTRICTRC iemMemStackPushU64(PVMCPU pVCpu, uint64_t u64Value)
    89408943{
    89418944    /* Increment the stack pointer. */
    89428945    uint64_t    uNewRsp;
    8943     PCPUMCTX    pCtx     = pIemCpu->CTX_SUFF(pCtx);
    8944     RTGCPTR     GCPtrTop = iemRegGetRspForPush(pIemCpu, pCtx, 8, &uNewRsp);
     8946    PCPUMCTX    pCtx     = pVCpu->iem.s.CTX_SUFF(pCtx);
     8947    RTGCPTR     GCPtrTop = iemRegGetRspForPush(pVCpu, pCtx, 8, &uNewRsp);
    89458948
    89468949    /* Write the word the lazy way. */
    89478950    uint64_t *pu64Dst;
    8948     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu64Dst, sizeof(*pu64Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
     8951    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu64Dst, sizeof(*pu64Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
    89498952    if (rc == VINF_SUCCESS)
    89508953    {
    89518954        *pu64Dst = u64Value;
    8952         rc = iemMemCommitAndUnmap(pIemCpu, pu64Dst, IEM_ACCESS_STACK_W);
     8955        rc = iemMemCommitAndUnmap(pVCpu, pu64Dst, IEM_ACCESS_STACK_W);
    89538956    }
    89548957
     
    89658968 *
    89668969 * @returns Strict VBox status code.
    8967  * @param   pIemCpu             The IEM per CPU data.
     8970 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    89688971 * @param   pu16Value           Where to store the popped value.
    89698972 */
    8970 IEM_STATIC VBOXSTRICTRC iemMemStackPopU16(PIEMCPU pIemCpu, uint16_t *pu16Value)
     8973IEM_STATIC VBOXSTRICTRC iemMemStackPopU16(PVMCPU pVCpu, uint16_t *pu16Value)
    89718974{
    89728975    /* Increment the stack pointer. */
    89738976    uint64_t    uNewRsp;
    8974     PCPUMCTX    pCtx     = pIemCpu->CTX_SUFF(pCtx);
    8975     RTGCPTR     GCPtrTop = iemRegGetRspForPop(pIemCpu, pCtx, 2, &uNewRsp);
     8977    PCPUMCTX    pCtx     = pVCpu->iem.s.CTX_SUFF(pCtx);
     8978    RTGCPTR     GCPtrTop = iemRegGetRspForPop(pVCpu, pCtx, 2, &uNewRsp);
    89768979
    89778980    /* Write the word the lazy way. */
    89788981    uint16_t const *pu16Src;
    8979     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu16Src, sizeof(*pu16Src), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
     8982    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu16Src, sizeof(*pu16Src), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
    89808983    if (rc == VINF_SUCCESS)
    89818984    {
    89828985        *pu16Value = *pu16Src;
    8983         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu16Src, IEM_ACCESS_STACK_R);
     8986        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu16Src, IEM_ACCESS_STACK_R);
    89848987
    89858988        /* Commit the new RSP value. */
     
    89968999 *
    89979000 * @returns Strict VBox status code.
    8998  * @param   pIemCpu             The IEM per CPU data.
     9001 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    89999002 * @param   pu32Value           Where to store the popped value.
    90009003 */
    9001 IEM_STATIC VBOXSTRICTRC iemMemStackPopU32(PIEMCPU pIemCpu, uint32_t *pu32Value)
     9004IEM_STATIC VBOXSTRICTRC iemMemStackPopU32(PVMCPU pVCpu, uint32_t *pu32Value)
    90029005{
    90039006    /* Increment the stack pointer. */
    90049007    uint64_t    uNewRsp;
    9005     PCPUMCTX    pCtx     = pIemCpu->CTX_SUFF(pCtx);
    9006     RTGCPTR     GCPtrTop = iemRegGetRspForPop(pIemCpu, pCtx, 4, &uNewRsp);
     9008    PCPUMCTX    pCtx     = pVCpu->iem.s.CTX_SUFF(pCtx);
     9009    RTGCPTR     GCPtrTop = iemRegGetRspForPop(pVCpu, pCtx, 4, &uNewRsp);
    90079010
    90089011    /* Write the word the lazy way. */
    90099012    uint32_t const *pu32Src;
    9010     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu32Src, sizeof(*pu32Src), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
     9013    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu32Src, sizeof(*pu32Src), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
    90119014    if (rc == VINF_SUCCESS)
    90129015    {
    90139016        *pu32Value = *pu32Src;
    9014         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu32Src, IEM_ACCESS_STACK_R);
     9017        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu32Src, IEM_ACCESS_STACK_R);
    90159018
    90169019        /* Commit the new RSP value. */
     
    90279030 *
    90289031 * @returns Strict VBox status code.
    9029  * @param   pIemCpu             The IEM per CPU data.
     9032 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    90309033 * @param   pu64Value           Where to store the popped value.
    90319034 */
    9032 IEM_STATIC VBOXSTRICTRC iemMemStackPopU64(PIEMCPU pIemCpu, uint64_t *pu64Value)
     9035IEM_STATIC VBOXSTRICTRC iemMemStackPopU64(PVMCPU pVCpu, uint64_t *pu64Value)
    90339036{
    90349037    /* Increment the stack pointer. */
    90359038    uint64_t    uNewRsp;
    9036     PCPUMCTX    pCtx     = pIemCpu->CTX_SUFF(pCtx);
    9037     RTGCPTR     GCPtrTop = iemRegGetRspForPop(pIemCpu, pCtx, 8, &uNewRsp);
     9039    PCPUMCTX    pCtx     = pVCpu->iem.s.CTX_SUFF(pCtx);
     9040    RTGCPTR     GCPtrTop = iemRegGetRspForPop(pVCpu, pCtx, 8, &uNewRsp);
    90389041
    90399042    /* Write the word the lazy way. */
    90409043    uint64_t const *pu64Src;
    9041     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu64Src, sizeof(*pu64Src), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
     9044    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu64Src, sizeof(*pu64Src), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
    90429045    if (rc == VINF_SUCCESS)
    90439046    {
    90449047        *pu64Value = *pu64Src;
    9045         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu64Src, IEM_ACCESS_STACK_R);
     9048        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu64Src, IEM_ACCESS_STACK_R);
    90469049
    90479050        /* Commit the new RSP value. */
     
    90589061 *
    90599062 * @returns Strict VBox status code.
    9060  * @param   pIemCpu             The IEM per CPU data.
     9063 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    90619064 * @param   u16Value            The value to push.
    90629065 * @param   pTmpRsp             Pointer to the temporary stack pointer.
    90639066 */
    9064 IEM_STATIC VBOXSTRICTRC iemMemStackPushU16Ex(PIEMCPU pIemCpu, uint16_t u16Value, PRTUINT64U pTmpRsp)
     9067IEM_STATIC VBOXSTRICTRC iemMemStackPushU16Ex(PVMCPU pVCpu, uint16_t u16Value, PRTUINT64U pTmpRsp)
    90659068{
    90669069    /* Increment the stack pointer. */
    9067     PCPUMCTX    pCtx = pIemCpu->CTX_SUFF(pCtx);
     9070    PCPUMCTX    pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    90689071    RTUINT64U   NewRsp = *pTmpRsp;
    9069     RTGCPTR     GCPtrTop = iemRegGetRspForPushEx(pIemCpu, pCtx, &NewRsp, 2);
     9072    RTGCPTR     GCPtrTop = iemRegGetRspForPushEx(pVCpu, pCtx, &NewRsp, 2);
    90709073
    90719074    /* Write the word the lazy way. */
    90729075    uint16_t *pu16Dst;
    9073     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu16Dst, sizeof(*pu16Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
     9076    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu16Dst, sizeof(*pu16Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
    90749077    if (rc == VINF_SUCCESS)
    90759078    {
    90769079        *pu16Dst = u16Value;
    9077         rc = iemMemCommitAndUnmap(pIemCpu, pu16Dst, IEM_ACCESS_STACK_W);
     9080        rc = iemMemCommitAndUnmap(pVCpu, pu16Dst, IEM_ACCESS_STACK_W);
    90789081    }
    90799082
     
    90909093 *
    90919094 * @returns Strict VBox status code.
    9092  * @param   pIemCpu             The IEM per CPU data.
     9095 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    90939096 * @param   u32Value            The value to push.
    90949097 * @param   pTmpRsp             Pointer to the temporary stack pointer.
    90959098 */
    9096 IEM_STATIC VBOXSTRICTRC iemMemStackPushU32Ex(PIEMCPU pIemCpu, uint32_t u32Value, PRTUINT64U pTmpRsp)
     9099IEM_STATIC VBOXSTRICTRC iemMemStackPushU32Ex(PVMCPU pVCpu, uint32_t u32Value, PRTUINT64U pTmpRsp)
    90979100{
    90989101    /* Increment the stack pointer. */
    9099     PCPUMCTX    pCtx = pIemCpu->CTX_SUFF(pCtx);
     9102    PCPUMCTX    pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    91009103    RTUINT64U   NewRsp = *pTmpRsp;
    9101     RTGCPTR     GCPtrTop = iemRegGetRspForPushEx(pIemCpu, pCtx, &NewRsp, 4);
     9104    RTGCPTR     GCPtrTop = iemRegGetRspForPushEx(pVCpu, pCtx, &NewRsp, 4);
    91029105
    91039106    /* Write the word the lazy way. */
    91049107    uint32_t *pu32Dst;
    9105     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu32Dst, sizeof(*pu32Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
     9108    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu32Dst, sizeof(*pu32Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
    91069109    if (rc == VINF_SUCCESS)
    91079110    {
    91089111        *pu32Dst = u32Value;
    9109         rc = iemMemCommitAndUnmap(pIemCpu, pu32Dst, IEM_ACCESS_STACK_W);
     9112        rc = iemMemCommitAndUnmap(pVCpu, pu32Dst, IEM_ACCESS_STACK_W);
    91109113    }
    91119114
     
    91229125 *
    91239126 * @returns Strict VBox status code.
    9124  * @param   pIemCpu             The IEM per CPU data.
     9127 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    91259128 * @param   u64Value            The value to push.
    91269129 * @param   pTmpRsp             Pointer to the temporary stack pointer.
    91279130 */
    9128 IEM_STATIC VBOXSTRICTRC iemMemStackPushU64Ex(PIEMCPU pIemCpu, uint64_t u64Value, PRTUINT64U pTmpRsp)
     9131IEM_STATIC VBOXSTRICTRC iemMemStackPushU64Ex(PVMCPU pVCpu, uint64_t u64Value, PRTUINT64U pTmpRsp)
    91299132{
    91309133    /* Increment the stack pointer. */
    9131     PCPUMCTX    pCtx = pIemCpu->CTX_SUFF(pCtx);
     9134    PCPUMCTX    pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    91329135    RTUINT64U   NewRsp = *pTmpRsp;
    9133     RTGCPTR     GCPtrTop = iemRegGetRspForPushEx(pIemCpu, pCtx, &NewRsp, 8);
     9136    RTGCPTR     GCPtrTop = iemRegGetRspForPushEx(pVCpu, pCtx, &NewRsp, 8);
    91349137
    91359138    /* Write the word the lazy way. */
    91369139    uint64_t *pu64Dst;
    9137     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu64Dst, sizeof(*pu64Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
     9140    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu64Dst, sizeof(*pu64Dst), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
    91389141    if (rc == VINF_SUCCESS)
    91399142    {
    91409143        *pu64Dst = u64Value;
    9141         rc = iemMemCommitAndUnmap(pIemCpu, pu64Dst, IEM_ACCESS_STACK_W);
     9144        rc = iemMemCommitAndUnmap(pVCpu, pu64Dst, IEM_ACCESS_STACK_W);
    91429145    }
    91439146
     
    91549157 *
    91559158 * @returns Strict VBox status code.
    9156  * @param   pIemCpu             The IEM per CPU data.
     9159 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    91579160 * @param   pu16Value           Where to store the popped value.
    91589161 * @param   pTmpRsp             Pointer to the temporary stack pointer.
    91599162 */
    9160 IEM_STATIC VBOXSTRICTRC iemMemStackPopU16Ex(PIEMCPU pIemCpu, uint16_t *pu16Value, PRTUINT64U pTmpRsp)
     9163IEM_STATIC VBOXSTRICTRC iemMemStackPopU16Ex(PVMCPU pVCpu, uint16_t *pu16Value, PRTUINT64U pTmpRsp)
    91619164{
    91629165    /* Increment the stack pointer. */
    9163     PCPUMCTX    pCtx = pIemCpu->CTX_SUFF(pCtx);
     9166    PCPUMCTX    pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    91649167    RTUINT64U   NewRsp = *pTmpRsp;
    9165     RTGCPTR     GCPtrTop = iemRegGetRspForPopEx(pIemCpu, pCtx, &NewRsp, 2);
     9168    RTGCPTR     GCPtrTop = iemRegGetRspForPopEx(pVCpu, pCtx, &NewRsp, 2);
    91669169
    91679170    /* Write the word the lazy way. */
    91689171    uint16_t const *pu16Src;
    9169     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu16Src, sizeof(*pu16Src), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
     9172    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu16Src, sizeof(*pu16Src), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
    91709173    if (rc == VINF_SUCCESS)
    91719174    {
    91729175        *pu16Value = *pu16Src;
    9173         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu16Src, IEM_ACCESS_STACK_R);
     9176        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu16Src, IEM_ACCESS_STACK_R);
    91749177
    91759178        /* Commit the new RSP value. */
     
    91869189 *
    91879190 * @returns Strict VBox status code.
    9188  * @param   pIemCpu             The IEM per CPU data.
     9191 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    91899192 * @param   pu32Value           Where to store the popped value.
    91909193 * @param   pTmpRsp             Pointer to the temporary stack pointer.
    91919194 */
    9192 IEM_STATIC VBOXSTRICTRC iemMemStackPopU32Ex(PIEMCPU pIemCpu, uint32_t *pu32Value, PRTUINT64U pTmpRsp)
     9195IEM_STATIC VBOXSTRICTRC iemMemStackPopU32Ex(PVMCPU pVCpu, uint32_t *pu32Value, PRTUINT64U pTmpRsp)
    91939196{
    91949197    /* Increment the stack pointer. */
    9195     PCPUMCTX    pCtx = pIemCpu->CTX_SUFF(pCtx);
     9198    PCPUMCTX    pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    91969199    RTUINT64U   NewRsp = *pTmpRsp;
    9197     RTGCPTR     GCPtrTop = iemRegGetRspForPopEx(pIemCpu, pCtx, &NewRsp, 4);
     9200    RTGCPTR     GCPtrTop = iemRegGetRspForPopEx(pVCpu, pCtx, &NewRsp, 4);
    91989201
    91999202    /* Write the word the lazy way. */
    92009203    uint32_t const *pu32Src;
    9201     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu32Src, sizeof(*pu32Src), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
     9204    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu32Src, sizeof(*pu32Src), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
    92029205    if (rc == VINF_SUCCESS)
    92039206    {
    92049207        *pu32Value = *pu32Src;
    9205         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu32Src, IEM_ACCESS_STACK_R);
     9208        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu32Src, IEM_ACCESS_STACK_R);
    92069209
    92079210        /* Commit the new RSP value. */
     
    92189221 *
    92199222 * @returns Strict VBox status code.
    9220  * @param   pIemCpu             The IEM per CPU data.
     9223 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    92219224 * @param   pu64Value           Where to store the popped value.
    92229225 * @param   pTmpRsp             Pointer to the temporary stack pointer.
    92239226 */
    9224 IEM_STATIC VBOXSTRICTRC iemMemStackPopU64Ex(PIEMCPU pIemCpu, uint64_t *pu64Value, PRTUINT64U pTmpRsp)
     9227IEM_STATIC VBOXSTRICTRC iemMemStackPopU64Ex(PVMCPU pVCpu, uint64_t *pu64Value, PRTUINT64U pTmpRsp)
    92259228{
    92269229    /* Increment the stack pointer. */
    9227     PCPUMCTX    pCtx = pIemCpu->CTX_SUFF(pCtx);
     9230    PCPUMCTX    pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    92289231    RTUINT64U   NewRsp = *pTmpRsp;
    9229     RTGCPTR     GCPtrTop = iemRegGetRspForPopEx(pIemCpu, pCtx, &NewRsp, 8);
     9232    RTGCPTR     GCPtrTop = iemRegGetRspForPopEx(pVCpu, pCtx, &NewRsp, 8);
    92309233
    92319234    /* Write the word the lazy way. */
    92329235    uint64_t const *pu64Src;
    9233     VBOXSTRICTRC rcStrict = iemMemMap(pIemCpu, (void **)&pu64Src, sizeof(*pu64Src), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
     9236    VBOXSTRICTRC rcStrict = iemMemMap(pVCpu, (void **)&pu64Src, sizeof(*pu64Src), X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
    92349237    if (rcStrict == VINF_SUCCESS)
    92359238    {
    92369239        *pu64Value = *pu64Src;
    9237         rcStrict = iemMemCommitAndUnmap(pIemCpu, (void *)pu64Src, IEM_ACCESS_STACK_R);
     9240        rcStrict = iemMemCommitAndUnmap(pVCpu, (void *)pu64Src, IEM_ACCESS_STACK_R);
    92389241
    92399242        /* Commit the new RSP value. */
     
    92529255 *
    92539256 * @returns Strict VBox status code.
    9254  * @param   pIemCpu             The IEM per CPU data.
     9257 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    92559258 * @param   cbMem               The number of bytes to push onto the stack.
    92569259 * @param   ppvMem              Where to return the pointer to the stack memory.
     
    92639266 *                              iemMemStackPushCommitSpecial().
    92649267 */
    9265 IEM_STATIC VBOXSTRICTRC iemMemStackPushBeginSpecial(PIEMCPU pIemCpu, size_t cbMem, void **ppvMem, uint64_t *puNewRsp)
     9268IEM_STATIC VBOXSTRICTRC iemMemStackPushBeginSpecial(PVMCPU pVCpu, size_t cbMem, void **ppvMem, uint64_t *puNewRsp)
    92669269{
    92679270    Assert(cbMem < UINT8_MAX);
    9268     PCPUMCTX    pCtx     = pIemCpu->CTX_SUFF(pCtx);
    9269     RTGCPTR     GCPtrTop = iemRegGetRspForPush(pIemCpu, pCtx, (uint8_t)cbMem, puNewRsp);
    9270     return iemMemMap(pIemCpu, ppvMem, cbMem, X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
     9271    PCPUMCTX    pCtx     = pVCpu->iem.s.CTX_SUFF(pCtx);
     9272    RTGCPTR     GCPtrTop = iemRegGetRspForPush(pVCpu, pCtx, (uint8_t)cbMem, puNewRsp);
     9273    return iemMemMap(pVCpu, ppvMem, cbMem, X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_W);
    92719274}
    92729275
     
    92789281 *
    92799282 * @returns Strict VBox status code.
    9280  * @param   pIemCpu             The IEM per CPU data.
     9283 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    92819284 * @param   pvMem               The pointer returned by
    92829285 *                              iemMemStackPushBeginSpecial().
     
    92849287 *                              iemMemStackPushBeginSpecial().
    92859288 */
    9286 IEM_STATIC VBOXSTRICTRC iemMemStackPushCommitSpecial(PIEMCPU pIemCpu, void *pvMem, uint64_t uNewRsp)
    9287 {
    9288     VBOXSTRICTRC rcStrict = iemMemCommitAndUnmap(pIemCpu, pvMem, IEM_ACCESS_STACK_W);
     9289IEM_STATIC VBOXSTRICTRC iemMemStackPushCommitSpecial(PVMCPU pVCpu, void *pvMem, uint64_t uNewRsp)
     9290{
     9291    VBOXSTRICTRC rcStrict = iemMemCommitAndUnmap(pVCpu, pvMem, IEM_ACCESS_STACK_W);
    92899292    if (rcStrict == VINF_SUCCESS)
    9290         pIemCpu->CTX_SUFF(pCtx)->rsp = uNewRsp;
     9293        pVCpu->iem.s.CTX_SUFF(pCtx)->rsp = uNewRsp;
    92919294    return rcStrict;
    92929295}
     
    92999302 *
    93009303 * @returns Strict VBox status code.
    9301  * @param   pIemCpu             The IEM per CPU data.
     9304 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    93029305 * @param   cbMem               The number of bytes to push onto the stack.
    93039306 * @param   ppvMem              Where to return the pointer to the stack memory.
     
    93079310 *                              manually if iemMemStackPopDoneSpecial() is used.
    93089311 */
    9309 IEM_STATIC VBOXSTRICTRC iemMemStackPopBeginSpecial(PIEMCPU pIemCpu, size_t cbMem, void const **ppvMem, uint64_t *puNewRsp)
     9312IEM_STATIC VBOXSTRICTRC iemMemStackPopBeginSpecial(PVMCPU pVCpu, size_t cbMem, void const **ppvMem, uint64_t *puNewRsp)
    93109313{
    93119314    Assert(cbMem < UINT8_MAX);
    9312     PCPUMCTX    pCtx     = pIemCpu->CTX_SUFF(pCtx);
    9313     RTGCPTR     GCPtrTop = iemRegGetRspForPop(pIemCpu, pCtx, (uint8_t)cbMem, puNewRsp);
    9314     return iemMemMap(pIemCpu, (void **)ppvMem, cbMem, X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
     9315    PCPUMCTX    pCtx     = pVCpu->iem.s.CTX_SUFF(pCtx);
     9316    RTGCPTR     GCPtrTop = iemRegGetRspForPop(pVCpu, pCtx, (uint8_t)cbMem, puNewRsp);
     9317    return iemMemMap(pVCpu, (void **)ppvMem, cbMem, X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
    93159318}
    93169319
     
    93229325 *
    93239326 * @returns Strict VBox status code.
    9324  * @param   pIemCpu             The IEM per CPU data.
     9327 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    93259328 * @param   cbMem               The number of bytes to push onto the stack.
    93269329 * @param   ppvMem              Where to return the pointer to the stack memory.
     
    93309333 *                              manually if iemMemStackPopDoneSpecial() is used.
    93319334 */
    9332 IEM_STATIC VBOXSTRICTRC iemMemStackPopContinueSpecial(PIEMCPU pIemCpu, size_t cbMem, void const **ppvMem, uint64_t *puNewRsp)
     9335IEM_STATIC VBOXSTRICTRC iemMemStackPopContinueSpecial(PVMCPU pVCpu, size_t cbMem, void const **ppvMem, uint64_t *puNewRsp)
    93339336{
    93349337    Assert(cbMem < UINT8_MAX);
    9335     PCPUMCTX    pCtx     = pIemCpu->CTX_SUFF(pCtx);
     9338    PCPUMCTX    pCtx     = pVCpu->iem.s.CTX_SUFF(pCtx);
    93369339    RTUINT64U   NewRsp;
    93379340    NewRsp.u = *puNewRsp;
    9338     RTGCPTR     GCPtrTop = iemRegGetRspForPopEx(pIemCpu, pCtx, &NewRsp, 8);
     9341    RTGCPTR     GCPtrTop = iemRegGetRspForPopEx(pVCpu, pCtx, &NewRsp, 8);
    93399342    *puNewRsp = NewRsp.u;
    9340     return iemMemMap(pIemCpu, (void **)ppvMem, cbMem, X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
     9343    return iemMemMap(pVCpu, (void **)ppvMem, cbMem, X86_SREG_SS, GCPtrTop, IEM_ACCESS_STACK_R);
    93419344}
    93429345
     
    93489351 *
    93499352 * @returns Strict VBox status code.
    9350  * @param   pIemCpu             The IEM per CPU data.
     9353 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    93519354 * @param   pvMem               The pointer returned by
    93529355 *                              iemMemStackPopBeginSpecial().
     
    93549357 *                              iemMemStackPopBeginSpecial().
    93559358 */
    9356 IEM_STATIC VBOXSTRICTRC iemMemStackPopCommitSpecial(PIEMCPU pIemCpu, void const *pvMem, uint64_t uNewRsp)
    9357 {
    9358     VBOXSTRICTRC rcStrict = iemMemCommitAndUnmap(pIemCpu, (void *)pvMem, IEM_ACCESS_STACK_R);
     9359IEM_STATIC VBOXSTRICTRC iemMemStackPopCommitSpecial(PVMCPU pVCpu, void const *pvMem, uint64_t uNewRsp)
     9360{
     9361    VBOXSTRICTRC rcStrict = iemMemCommitAndUnmap(pVCpu, (void *)pvMem, IEM_ACCESS_STACK_R);
    93599362    if (rcStrict == VINF_SUCCESS)
    9360         pIemCpu->CTX_SUFF(pCtx)->rsp = uNewRsp;
     9363        pVCpu->iem.s.CTX_SUFF(pCtx)->rsp = uNewRsp;
    93619364    return rcStrict;
    93629365}
     
    93709373 *
    93719374 * @returns Strict VBox status code.
    9372  * @param   pIemCpu             The IEM per CPU data.
     9375 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    93739376 * @param   pvMem               The pointer returned by
    93749377 *                              iemMemStackPopBeginSpecial() or
    93759378 *                              iemMemStackPopContinueSpecial().
    93769379 */
    9377 IEM_STATIC VBOXSTRICTRC iemMemStackPopDoneSpecial(PIEMCPU pIemCpu, void const *pvMem)
    9378 {
    9379     return iemMemCommitAndUnmap(pIemCpu, (void *)pvMem, IEM_ACCESS_STACK_R);
     9380IEM_STATIC VBOXSTRICTRC iemMemStackPopDoneSpecial(PVMCPU pVCpu, void const *pvMem)
     9381{
     9382    return iemMemCommitAndUnmap(pVCpu, (void *)pvMem, IEM_ACCESS_STACK_R);
    93809383}
    93819384
     
    93859388 *
    93869389 * @returns Strict VBox status code.
    9387  * @param   pIemCpu             The IEM per CPU data.
     9390 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    93889391 * @param   pbDst               Where to return the byte.
    93899392 * @param   iSegReg             The index of the segment register to use for
     
    93919394 * @param   GCPtrMem            The address of the guest memory.
    93929395 */
    9393 IEM_STATIC VBOXSTRICTRC iemMemFetchSysU8(PIEMCPU pIemCpu, uint8_t *pbDst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     9396IEM_STATIC VBOXSTRICTRC iemMemFetchSysU8(PVMCPU pVCpu, uint8_t *pbDst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    93949397{
    93959398    /* The lazy approach for now... */
    93969399    uint8_t const *pbSrc;
    9397     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pbSrc, sizeof(*pbSrc), iSegReg, GCPtrMem, IEM_ACCESS_SYS_R);
     9400    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pbSrc, sizeof(*pbSrc), iSegReg, GCPtrMem, IEM_ACCESS_SYS_R);
    93989401    if (rc == VINF_SUCCESS)
    93999402    {
    94009403        *pbDst = *pbSrc;
    9401         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pbSrc, IEM_ACCESS_SYS_R);
     9404        rc = iemMemCommitAndUnmap(pVCpu, (void *)pbSrc, IEM_ACCESS_SYS_R);
    94029405    }
    94039406    return rc;
     
    94099412 *
    94109413 * @returns Strict VBox status code.
    9411  * @param   pIemCpu             The IEM per CPU data.
     9414 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    94129415 * @param   pu16Dst             Where to return the word.
    94139416 * @param   iSegReg             The index of the segment register to use for
     
    94159418 * @param   GCPtrMem            The address of the guest memory.
    94169419 */
    9417 IEM_STATIC VBOXSTRICTRC iemMemFetchSysU16(PIEMCPU pIemCpu, uint16_t *pu16Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     9420IEM_STATIC VBOXSTRICTRC iemMemFetchSysU16(PVMCPU pVCpu, uint16_t *pu16Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    94189421{
    94199422    /* The lazy approach for now... */
    94209423    uint16_t const *pu16Src;
    9421     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu16Src, sizeof(*pu16Src), iSegReg, GCPtrMem, IEM_ACCESS_SYS_R);
     9424    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu16Src, sizeof(*pu16Src), iSegReg, GCPtrMem, IEM_ACCESS_SYS_R);
    94229425    if (rc == VINF_SUCCESS)
    94239426    {
    94249427        *pu16Dst = *pu16Src;
    9425         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu16Src, IEM_ACCESS_SYS_R);
     9428        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu16Src, IEM_ACCESS_SYS_R);
    94269429    }
    94279430    return rc;
     
    94339436 *
    94349437 * @returns Strict VBox status code.
    9435  * @param   pIemCpu             The IEM per CPU data.
     9438 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    94369439 * @param   pu32Dst             Where to return the dword.
    94379440 * @param   iSegReg             The index of the segment register to use for
     
    94399442 * @param   GCPtrMem            The address of the guest memory.
    94409443 */
    9441 IEM_STATIC VBOXSTRICTRC iemMemFetchSysU32(PIEMCPU pIemCpu, uint32_t *pu32Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     9444IEM_STATIC VBOXSTRICTRC iemMemFetchSysU32(PVMCPU pVCpu, uint32_t *pu32Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    94429445{
    94439446    /* The lazy approach for now... */
    94449447    uint32_t const *pu32Src;
    9445     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu32Src, sizeof(*pu32Src), iSegReg, GCPtrMem, IEM_ACCESS_SYS_R);
     9448    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu32Src, sizeof(*pu32Src), iSegReg, GCPtrMem, IEM_ACCESS_SYS_R);
    94469449    if (rc == VINF_SUCCESS)
    94479450    {
    94489451        *pu32Dst = *pu32Src;
    9449         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu32Src, IEM_ACCESS_SYS_R);
     9452        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu32Src, IEM_ACCESS_SYS_R);
    94509453    }
    94519454    return rc;
     
    94579460 *
    94589461 * @returns Strict VBox status code.
    9459  * @param   pIemCpu             The IEM per CPU data.
     9462 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    94609463 * @param   pu64Dst             Where to return the qword.
    94619464 * @param   iSegReg             The index of the segment register to use for
     
    94639466 * @param   GCPtrMem            The address of the guest memory.
    94649467 */
    9465 IEM_STATIC VBOXSTRICTRC iemMemFetchSysU64(PIEMCPU pIemCpu, uint64_t *pu64Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
     9468IEM_STATIC VBOXSTRICTRC iemMemFetchSysU64(PVMCPU pVCpu, uint64_t *pu64Dst, uint8_t iSegReg, RTGCPTR GCPtrMem)
    94669469{
    94679470    /* The lazy approach for now... */
    94689471    uint64_t const *pu64Src;
    9469     VBOXSTRICTRC rc = iemMemMap(pIemCpu, (void **)&pu64Src, sizeof(*pu64Src), iSegReg, GCPtrMem, IEM_ACCESS_SYS_R);
     9472    VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu64Src, sizeof(*pu64Src), iSegReg, GCPtrMem, IEM_ACCESS_SYS_R);
    94709473    if (rc == VINF_SUCCESS)
    94719474    {
    94729475        *pu64Dst = *pu64Src;
    9473         rc = iemMemCommitAndUnmap(pIemCpu, (void *)pu64Src, IEM_ACCESS_SYS_R);
     9476        rc = iemMemCommitAndUnmap(pVCpu, (void *)pu64Src, IEM_ACCESS_SYS_R);
    94749477    }
    94759478    return rc;
     
    94819484 *
    94829485 * @returns Strict VBox status code.
    9483  * @param   pIemCpu             The IEM per CPU.
     9486 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    94849487 * @param   pDesc               Where to return the descriptor table entry.
    94859488 * @param   uSel                The selector which table entry to fetch.
     
    94889491 */
    94899492IEM_STATIC VBOXSTRICTRC
    9490 iemMemFetchSelDescWithErr(PIEMCPU pIemCpu, PIEMSELDESC pDesc, uint16_t uSel, uint8_t uXcpt, uint16_t uErrorCode)
     9493iemMemFetchSelDescWithErr(PVMCPU pVCpu, PIEMSELDESC pDesc, uint16_t uSel, uint8_t uXcpt, uint16_t uErrorCode)
    94919494{
    94929495    AssertPtr(pDesc);
    9493     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     9496    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    94949497
    94959498    /** @todo did the 286 require all 8 bytes to be accessible? */
     
    95059508            Log(("iemMemFetchSelDesc: LDT selector %#x is out of bounds (%3x) or ldtr is NP (%#x)\n",
    95069509                 uSel, pCtx->ldtr.u32Limit, pCtx->ldtr.Sel));
    9507             return iemRaiseXcptOrInt(pIemCpu, 0, uXcpt, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
     9510            return iemRaiseXcptOrInt(pVCpu, 0, uXcpt, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
    95089511                                     uErrorCode, 0);
    95099512        }
     
    95179520        {
    95189521            Log(("iemMemFetchSelDesc: GDT selector %#x is out of bounds (%3x)\n", uSel, pCtx->gdtr.cbGdt));
    9519             return iemRaiseXcptOrInt(pIemCpu, 0, uXcpt, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
     9522            return iemRaiseXcptOrInt(pVCpu, 0, uXcpt, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
    95209523                                     uErrorCode, 0);
    95219524        }
     
    95279530     * required.
    95289531     */
    9529     VBOXSTRICTRC rcStrict = iemMemFetchSysU64(pIemCpu, &pDesc->Legacy.u, UINT8_MAX, GCPtrBase + (uSel & X86_SEL_MASK));
     9532    VBOXSTRICTRC rcStrict = iemMemFetchSysU64(pVCpu, &pDesc->Legacy.u, UINT8_MAX, GCPtrBase + (uSel & X86_SEL_MASK));
    95309533    if (rcStrict == VINF_SUCCESS)
    95319534    {
    9532         if (   !IEM_IS_LONG_MODE(pIemCpu)
     9535        if (   !IEM_IS_LONG_MODE(pVCpu)
    95339536            || pDesc->Legacy.Gen.u1DescType)
    95349537            pDesc->Long.au64[1] = 0;
    95359538        else if ((uint32_t)(uSel | X86_SEL_RPL_LDT) + 8 <= (uSel & X86_SEL_LDT ? pCtx->ldtr.u32Limit : pCtx->gdtr.cbGdt))
    9536             rcStrict = iemMemFetchSysU64(pIemCpu, &pDesc->Long.au64[1], UINT8_MAX, GCPtrBase + (uSel | X86_SEL_RPL_LDT) + 1);
     9539            rcStrict = iemMemFetchSysU64(pVCpu, &pDesc->Long.au64[1], UINT8_MAX, GCPtrBase + (uSel | X86_SEL_RPL_LDT) + 1);
    95379540        else
    95389541        {
    95399542            Log(("iemMemFetchSelDesc: system selector %#x is out of bounds\n", uSel));
    95409543            /** @todo is this the right exception? */
    9541             return iemRaiseXcptOrInt(pIemCpu, 0, uXcpt, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, uErrorCode, 0);
     9544            return iemRaiseXcptOrInt(pVCpu, 0, uXcpt, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR, uErrorCode, 0);
    95429545        }
    95439546    }
     
    95509553 *
    95519554 * @returns Strict VBox status code.
    9552  * @param   pIemCpu             The IEM per CPU.
     9555 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    95539556 * @param   pDesc               Where to return the descriptor table entry.
    95549557 * @param   uSel                The selector which table entry to fetch.
    95559558 * @param   uXcpt               The exception to raise on table lookup error.
    95569559 */
    9557 IEM_STATIC VBOXSTRICTRC iemMemFetchSelDesc(PIEMCPU pIemCpu, PIEMSELDESC pDesc, uint16_t uSel, uint8_t uXcpt)
    9558 {
    9559     return iemMemFetchSelDescWithErr(pIemCpu, pDesc, uSel, uXcpt, uSel & X86_SEL_MASK_OFF_RPL);
     9560IEM_STATIC VBOXSTRICTRC iemMemFetchSelDesc(PVMCPU pVCpu, PIEMSELDESC pDesc, uint16_t uSel, uint8_t uXcpt)
     9561{
     9562    return iemMemFetchSelDescWithErr(pVCpu, pDesc, uSel, uXcpt, uSel & X86_SEL_MASK_OFF_RPL);
    95609563}
    95619564
     
    95869589 *
    95879590 * @returns Strict VBox status code.
    9588  * @param   pIemCpu             The IEM per CPU.
     9591 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    95899592 * @param   uSel                The selector.
    95909593 */
    9591 IEM_STATIC VBOXSTRICTRC iemMemMarkSelDescAccessed(PIEMCPU pIemCpu, uint16_t uSel)
    9592 {
    9593     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     9594IEM_STATIC VBOXSTRICTRC iemMemMarkSelDescAccessed(PVMCPU pVCpu, uint16_t uSel)
     9595{
     9596    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    95949597
    95959598    /*
     
    96129615        /* The normal case, map the 32-bit bits around the accessed bit (40). */
    96139616        GCPtr += 2 + 2;
    9614         rcStrict = iemMemMap(pIemCpu, (void **)&pu32, 4, UINT8_MAX, GCPtr, IEM_ACCESS_SYS_RW);
     9617        rcStrict = iemMemMap(pVCpu, (void **)&pu32, 4, UINT8_MAX, GCPtr, IEM_ACCESS_SYS_RW);
    96159618        if (rcStrict != VINF_SUCCESS)
    96169619            return rcStrict;
     
    96209623    {
    96219624        /* The misaligned GDT/LDT case, map the whole thing. */
    9622         rcStrict = iemMemMap(pIemCpu, (void **)&pu32, 8, UINT8_MAX, GCPtr, IEM_ACCESS_SYS_RW);
     9625        rcStrict = iemMemMap(pVCpu, (void **)&pu32, 8, UINT8_MAX, GCPtr, IEM_ACCESS_SYS_RW);
    96239626        if (rcStrict != VINF_SUCCESS)
    96249627            return rcStrict;
     
    96329635    }
    96339636
    9634     return iemMemCommitAndUnmap(pIemCpu, (void *)pu32, IEM_ACCESS_SYS_RW);
     9637    return iemMemCommitAndUnmap(pVCpu, (void *)pu32, IEM_ACCESS_SYS_RW);
    96359638}
    96369639
     
    96679670
    96689671
    9669 #define IEM_MC_ADVANCE_RIP()                            iemRegUpdateRipAndClearRF(pIemCpu)
    9670 #define IEM_MC_REL_JMP_S8(a_i8)                         IEM_MC_RETURN_ON_FAILURE(iemRegRipRelativeJumpS8(pIemCpu, a_i8))
    9671 #define IEM_MC_REL_JMP_S16(a_i16)                       IEM_MC_RETURN_ON_FAILURE(iemRegRipRelativeJumpS16(pIemCpu, a_i16))
    9672 #define IEM_MC_REL_JMP_S32(a_i32)                       IEM_MC_RETURN_ON_FAILURE(iemRegRipRelativeJumpS32(pIemCpu, a_i32))
    9673 #define IEM_MC_SET_RIP_U16(a_u16NewIP)                  IEM_MC_RETURN_ON_FAILURE(iemRegRipJump((pIemCpu), (a_u16NewIP)))
    9674 #define IEM_MC_SET_RIP_U32(a_u32NewIP)                  IEM_MC_RETURN_ON_FAILURE(iemRegRipJump((pIemCpu), (a_u32NewIP)))
    9675 #define IEM_MC_SET_RIP_U64(a_u64NewIP)                  IEM_MC_RETURN_ON_FAILURE(iemRegRipJump((pIemCpu), (a_u64NewIP)))
    9676 #define IEM_MC_RAISE_DIVIDE_ERROR()                     return iemRaiseDivideError(pIemCpu)
     9672#define IEM_MC_ADVANCE_RIP()                            iemRegUpdateRipAndClearRF(pVCpu)
     9673#define IEM_MC_REL_JMP_S8(a_i8)                         IEM_MC_RETURN_ON_FAILURE(iemRegRipRelativeJumpS8(pVCpu, a_i8))
     9674#define IEM_MC_REL_JMP_S16(a_i16)                       IEM_MC_RETURN_ON_FAILURE(iemRegRipRelativeJumpS16(pVCpu, a_i16))
     9675#define IEM_MC_REL_JMP_S32(a_i32)                       IEM_MC_RETURN_ON_FAILURE(iemRegRipRelativeJumpS32(pVCpu, a_i32))
     9676#define IEM_MC_SET_RIP_U16(a_u16NewIP)                  IEM_MC_RETURN_ON_FAILURE(iemRegRipJump((pVCpu), (a_u16NewIP)))
     9677#define IEM_MC_SET_RIP_U32(a_u32NewIP)                  IEM_MC_RETURN_ON_FAILURE(iemRegRipJump((pVCpu), (a_u32NewIP)))
     9678#define IEM_MC_SET_RIP_U64(a_u64NewIP)                  IEM_MC_RETURN_ON_FAILURE(iemRegRipJump((pVCpu), (a_u64NewIP)))
     9679#define IEM_MC_RAISE_DIVIDE_ERROR()                     return iemRaiseDivideError(pVCpu)
    96779680#define IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE()       \
    96789681    do { \
    9679         if ((pIemCpu)->CTX_SUFF(pCtx)->cr0 & (X86_CR0_EM | X86_CR0_TS)) \
    9680             return iemRaiseDeviceNotAvailable(pIemCpu); \
     9682        if ((pVCpu)->iem.s.CTX_SUFF(pCtx)->cr0 & (X86_CR0_EM | X86_CR0_TS)) \
     9683            return iemRaiseDeviceNotAvailable(pVCpu); \
    96819684    } while (0)
    96829685#define IEM_MC_MAYBE_RAISE_FPU_XCPT() \
    96839686    do { \
    9684         if ((pIemCpu)->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.FSW & X86_FSW_ES) \
    9685             return iemRaiseMathFault(pIemCpu); \
     9687        if ((pVCpu)->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.FSW & X86_FSW_ES) \
     9688            return iemRaiseMathFault(pVCpu); \
    96869689    } while (0)
    96879690#define IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT() \
    96889691    do { \
    9689         if (   (pIemCpu->CTX_SUFF(pCtx)->cr0 & X86_CR0_EM) \
    9690             || !(pIemCpu->CTX_SUFF(pCtx)->cr4 & X86_CR4_OSFXSR) \
    9691             || !IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse2) \
    9692             return iemRaiseUndefinedOpcode(pIemCpu); \
    9693         if (pIemCpu->CTX_SUFF(pCtx)->cr0 & X86_CR0_TS) \
    9694             return iemRaiseDeviceNotAvailable(pIemCpu); \
     9692        if (   (pVCpu->iem.s.CTX_SUFF(pCtx)->cr0 & X86_CR0_EM) \
     9693            || !(pVCpu->iem.s.CTX_SUFF(pCtx)->cr4 & X86_CR4_OSFXSR) \
     9694            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse2) \
     9695            return iemRaiseUndefinedOpcode(pVCpu); \
     9696        if (pVCpu->iem.s.CTX_SUFF(pCtx)->cr0 & X86_CR0_TS) \
     9697            return iemRaiseDeviceNotAvailable(pVCpu); \
    96959698    } while (0)
    96969699#define IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT() \
    96979700    do { \
    9698         if (   (pIemCpu->CTX_SUFF(pCtx)->cr0 & X86_CR0_EM) \
    9699             || !(pIemCpu->CTX_SUFF(pCtx)->cr4 & X86_CR4_OSFXSR) \
    9700             || !IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse) \
    9701             return iemRaiseUndefinedOpcode(pIemCpu); \
    9702         if (pIemCpu->CTX_SUFF(pCtx)->cr0 & X86_CR0_TS) \
    9703             return iemRaiseDeviceNotAvailable(pIemCpu); \
     9701        if (   (pVCpu->iem.s.CTX_SUFF(pCtx)->cr0 & X86_CR0_EM) \
     9702            || !(pVCpu->iem.s.CTX_SUFF(pCtx)->cr4 & X86_CR4_OSFXSR) \
     9703            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse) \
     9704            return iemRaiseUndefinedOpcode(pVCpu); \
     9705        if (pVCpu->iem.s.CTX_SUFF(pCtx)->cr0 & X86_CR0_TS) \
     9706            return iemRaiseDeviceNotAvailable(pVCpu); \
    97049707    } while (0)
    97059708#define IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT() \
    97069709    do { \
    9707         if (   ((pIemCpu)->CTX_SUFF(pCtx)->cr0 & X86_CR0_EM) \
    9708             || !IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fMmx) \
    9709             return iemRaiseUndefinedOpcode(pIemCpu); \
    9710         if (pIemCpu->CTX_SUFF(pCtx)->cr0 & X86_CR0_TS) \
    9711             return iemRaiseDeviceNotAvailable(pIemCpu); \
     9710        if (   ((pVCpu)->iem.s.CTX_SUFF(pCtx)->cr0 & X86_CR0_EM) \
     9711            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fMmx) \
     9712            return iemRaiseUndefinedOpcode(pVCpu); \
     9713        if (pVCpu->iem.s.CTX_SUFF(pCtx)->cr0 & X86_CR0_TS) \
     9714            return iemRaiseDeviceNotAvailable(pVCpu); \
    97129715    } while (0)
    97139716#define IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT() \
    97149717    do { \
    9715         if (   ((pIemCpu)->CTX_SUFF(pCtx)->cr0 & X86_CR0_EM) \
    9716             || (   !IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse \
    9717                 && !IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fAmdMmxExts) ) \
    9718             return iemRaiseUndefinedOpcode(pIemCpu); \
    9719         if (pIemCpu->CTX_SUFF(pCtx)->cr0 & X86_CR0_TS) \
    9720             return iemRaiseDeviceNotAvailable(pIemCpu); \
     9718        if (   ((pVCpu)->iem.s.CTX_SUFF(pCtx)->cr0 & X86_CR0_EM) \
     9719            || (   !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse \
     9720                && !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAmdMmxExts) ) \
     9721            return iemRaiseUndefinedOpcode(pVCpu); \
     9722        if (pVCpu->iem.s.CTX_SUFF(pCtx)->cr0 & X86_CR0_TS) \
     9723            return iemRaiseDeviceNotAvailable(pVCpu); \
    97219724    } while (0)
    97229725#define IEM_MC_RAISE_GP0_IF_CPL_NOT_ZERO() \
    97239726    do { \
    9724         if (pIemCpu->uCpl != 0) \
    9725             return iemRaiseGeneralProtectionFault0(pIemCpu); \
     9727        if (pVCpu->iem.s.uCpl != 0) \
     9728            return iemRaiseGeneralProtectionFault0(pVCpu); \
    97269729    } while (0)
    97279730
     
    97379740    uint32_t *a_pName = &a_Name
    97389741#define IEM_MC_COMMIT_EFLAGS(a_EFlags) \
    9739    do { (pIemCpu)->CTX_SUFF(pCtx)->eflags.u = (a_EFlags); Assert((pIemCpu)->CTX_SUFF(pCtx)->eflags.u & X86_EFL_1); } while (0)
     9742   do { (pVCpu)->iem.s.CTX_SUFF(pCtx)->eflags.u = (a_EFlags); Assert((pVCpu)->iem.s.CTX_SUFF(pCtx)->eflags.u & X86_EFL_1); } while (0)
    97409743
    97419744#define IEM_MC_ASSIGN(a_VarOrArg, a_CVariableOrConst)   (a_VarOrArg) = (a_CVariableOrConst)
    97429745#define IEM_MC_ASSIGN_TO_SMALLER                        IEM_MC_ASSIGN
    97439746
    9744 #define IEM_MC_FETCH_GREG_U8(a_u8Dst, a_iGReg)          (a_u8Dst)  = iemGRegFetchU8(pIemCpu, (a_iGReg))
    9745 #define IEM_MC_FETCH_GREG_U8_ZX_U16(a_u16Dst, a_iGReg)  (a_u16Dst) = iemGRegFetchU8(pIemCpu, (a_iGReg))
    9746 #define IEM_MC_FETCH_GREG_U8_ZX_U32(a_u32Dst, a_iGReg)  (a_u32Dst) = iemGRegFetchU8(pIemCpu, (a_iGReg))
    9747 #define IEM_MC_FETCH_GREG_U8_ZX_U64(a_u64Dst, a_iGReg)  (a_u64Dst) = iemGRegFetchU8(pIemCpu, (a_iGReg))
    9748 #define IEM_MC_FETCH_GREG_U8_SX_U16(a_u16Dst, a_iGReg)  (a_u16Dst) = (int8_t)iemGRegFetchU8(pIemCpu, (a_iGReg))
    9749 #define IEM_MC_FETCH_GREG_U8_SX_U32(a_u32Dst, a_iGReg)  (a_u32Dst) = (int8_t)iemGRegFetchU8(pIemCpu, (a_iGReg))
    9750 #define IEM_MC_FETCH_GREG_U8_SX_U64(a_u64Dst, a_iGReg)  (a_u64Dst) = (int8_t)iemGRegFetchU8(pIemCpu, (a_iGReg))
    9751 #define IEM_MC_FETCH_GREG_U16(a_u16Dst, a_iGReg)        (a_u16Dst) = iemGRegFetchU16(pIemCpu, (a_iGReg))
    9752 #define IEM_MC_FETCH_GREG_U16_ZX_U32(a_u32Dst, a_iGReg) (a_u32Dst) = iemGRegFetchU16(pIemCpu, (a_iGReg))
    9753 #define IEM_MC_FETCH_GREG_U16_ZX_U64(a_u64Dst, a_iGReg) (a_u64Dst) = iemGRegFetchU16(pIemCpu, (a_iGReg))
    9754 #define IEM_MC_FETCH_GREG_U16_SX_U32(a_u32Dst, a_iGReg) (a_u32Dst) = (int16_t)iemGRegFetchU16(pIemCpu, (a_iGReg))
    9755 #define IEM_MC_FETCH_GREG_U16_SX_U64(a_u64Dst, a_iGReg) (a_u64Dst) = (int16_t)iemGRegFetchU16(pIemCpu, (a_iGReg))
    9756 #define IEM_MC_FETCH_GREG_U32(a_u32Dst, a_iGReg)        (a_u32Dst) = iemGRegFetchU32(pIemCpu, (a_iGReg))
    9757 #define IEM_MC_FETCH_GREG_U32_ZX_U64(a_u64Dst, a_iGReg) (a_u64Dst) = iemGRegFetchU32(pIemCpu, (a_iGReg))
    9758 #define IEM_MC_FETCH_GREG_U32_SX_U64(a_u64Dst, a_iGReg) (a_u64Dst) = (int32_t)iemGRegFetchU32(pIemCpu, (a_iGReg))
    9759 #define IEM_MC_FETCH_GREG_U64(a_u64Dst, a_iGReg)        (a_u64Dst) = iemGRegFetchU64(pIemCpu, (a_iGReg))
     9747#define IEM_MC_FETCH_GREG_U8(a_u8Dst, a_iGReg)          (a_u8Dst)  = iemGRegFetchU8(pVCpu, (a_iGReg))
     9748#define IEM_MC_FETCH_GREG_U8_ZX_U16(a_u16Dst, a_iGReg)  (a_u16Dst) = iemGRegFetchU8(pVCpu, (a_iGReg))
     9749#define IEM_MC_FETCH_GREG_U8_ZX_U32(a_u32Dst, a_iGReg)  (a_u32Dst) = iemGRegFetchU8(pVCpu, (a_iGReg))
     9750#define IEM_MC_FETCH_GREG_U8_ZX_U64(a_u64Dst, a_iGReg)  (a_u64Dst) = iemGRegFetchU8(pVCpu, (a_iGReg))
     9751#define IEM_MC_FETCH_GREG_U8_SX_U16(a_u16Dst, a_iGReg)  (a_u16Dst) = (int8_t)iemGRegFetchU8(pVCpu, (a_iGReg))
     9752#define IEM_MC_FETCH_GREG_U8_SX_U32(a_u32Dst, a_iGReg)  (a_u32Dst) = (int8_t)iemGRegFetchU8(pVCpu, (a_iGReg))
     9753#define IEM_MC_FETCH_GREG_U8_SX_U64(a_u64Dst, a_iGReg)  (a_u64Dst) = (int8_t)iemGRegFetchU8(pVCpu, (a_iGReg))
     9754#define IEM_MC_FETCH_GREG_U16(a_u16Dst, a_iGReg)        (a_u16Dst) = iemGRegFetchU16(pVCpu, (a_iGReg))
     9755#define IEM_MC_FETCH_GREG_U16_ZX_U32(a_u32Dst, a_iGReg) (a_u32Dst) = iemGRegFetchU16(pVCpu, (a_iGReg))
     9756#define IEM_MC_FETCH_GREG_U16_ZX_U64(a_u64Dst, a_iGReg) (a_u64Dst) = iemGRegFetchU16(pVCpu, (a_iGReg))
     9757#define IEM_MC_FETCH_GREG_U16_SX_U32(a_u32Dst, a_iGReg) (a_u32Dst) = (int16_t)iemGRegFetchU16(pVCpu, (a_iGReg))
     9758#define IEM_MC_FETCH_GREG_U16_SX_U64(a_u64Dst, a_iGReg) (a_u64Dst) = (int16_t)iemGRegFetchU16(pVCpu, (a_iGReg))
     9759#define IEM_MC_FETCH_GREG_U32(a_u32Dst, a_iGReg)        (a_u32Dst) = iemGRegFetchU32(pVCpu, (a_iGReg))
     9760#define IEM_MC_FETCH_GREG_U32_ZX_U64(a_u64Dst, a_iGReg) (a_u64Dst) = iemGRegFetchU32(pVCpu, (a_iGReg))
     9761#define IEM_MC_FETCH_GREG_U32_SX_U64(a_u64Dst, a_iGReg) (a_u64Dst) = (int32_t)iemGRegFetchU32(pVCpu, (a_iGReg))
     9762#define IEM_MC_FETCH_GREG_U64(a_u64Dst, a_iGReg)        (a_u64Dst) = iemGRegFetchU64(pVCpu, (a_iGReg))
    97609763#define IEM_MC_FETCH_GREG_U64_ZX_U64                    IEM_MC_FETCH_GREG_U64
    9761 #define IEM_MC_FETCH_SREG_U16(a_u16Dst, a_iSReg)        (a_u16Dst) = iemSRegFetchU16(pIemCpu, (a_iSReg))
    9762 #define IEM_MC_FETCH_SREG_ZX_U32(a_u32Dst, a_iSReg)     (a_u32Dst) = iemSRegFetchU16(pIemCpu, (a_iSReg))
    9763 #define IEM_MC_FETCH_SREG_ZX_U64(a_u64Dst, a_iSReg)     (a_u64Dst) = iemSRegFetchU16(pIemCpu, (a_iSReg))
    9764 #define IEM_MC_FETCH_CR0_U16(a_u16Dst)                  (a_u16Dst) = (uint16_t)(pIemCpu)->CTX_SUFF(pCtx)->cr0
    9765 #define IEM_MC_FETCH_CR0_U32(a_u32Dst)                  (a_u32Dst) = (uint32_t)(pIemCpu)->CTX_SUFF(pCtx)->cr0
    9766 #define IEM_MC_FETCH_CR0_U64(a_u64Dst)                  (a_u64Dst) = (pIemCpu)->CTX_SUFF(pCtx)->cr0
    9767 #define IEM_MC_FETCH_LDTR_U16(a_u16Dst)                 (a_u16Dst) = (pIemCpu)->CTX_SUFF(pCtx)->ldtr.Sel
    9768 #define IEM_MC_FETCH_LDTR_U32(a_u32Dst)                 (a_u32Dst) = (pIemCpu)->CTX_SUFF(pCtx)->ldtr.Sel
    9769 #define IEM_MC_FETCH_LDTR_U64(a_u64Dst)                 (a_u64Dst) = (pIemCpu)->CTX_SUFF(pCtx)->ldtr.Sel
    9770 #define IEM_MC_FETCH_TR_U16(a_u16Dst)                   (a_u16Dst) = (pIemCpu)->CTX_SUFF(pCtx)->tr.Sel
    9771 #define IEM_MC_FETCH_TR_U32(a_u32Dst)                   (a_u32Dst) = (pIemCpu)->CTX_SUFF(pCtx)->tr.Sel
    9772 #define IEM_MC_FETCH_TR_U64(a_u64Dst)                   (a_u64Dst) = (pIemCpu)->CTX_SUFF(pCtx)->tr.Sel
     9764#define IEM_MC_FETCH_SREG_U16(a_u16Dst, a_iSReg)        (a_u16Dst) = iemSRegFetchU16(pVCpu, (a_iSReg))
     9765#define IEM_MC_FETCH_SREG_ZX_U32(a_u32Dst, a_iSReg)     (a_u32Dst) = iemSRegFetchU16(pVCpu, (a_iSReg))
     9766#define IEM_MC_FETCH_SREG_ZX_U64(a_u64Dst, a_iSReg)     (a_u64Dst) = iemSRegFetchU16(pVCpu, (a_iSReg))
     9767#define IEM_MC_FETCH_CR0_U16(a_u16Dst)                  (a_u16Dst) = (uint16_t)(pVCpu)->iem.s.CTX_SUFF(pCtx)->cr0
     9768#define IEM_MC_FETCH_CR0_U32(a_u32Dst)                  (a_u32Dst) = (uint32_t)(pVCpu)->iem.s.CTX_SUFF(pCtx)->cr0
     9769#define IEM_MC_FETCH_CR0_U64(a_u64Dst)                  (a_u64Dst) = (pVCpu)->iem.s.CTX_SUFF(pCtx)->cr0
     9770#define IEM_MC_FETCH_LDTR_U16(a_u16Dst)                 (a_u16Dst) = (pVCpu)->iem.s.CTX_SUFF(pCtx)->ldtr.Sel
     9771#define IEM_MC_FETCH_LDTR_U32(a_u32Dst)                 (a_u32Dst) = (pVCpu)->iem.s.CTX_SUFF(pCtx)->ldtr.Sel
     9772#define IEM_MC_FETCH_LDTR_U64(a_u64Dst)                 (a_u64Dst) = (pVCpu)->iem.s.CTX_SUFF(pCtx)->ldtr.Sel
     9773#define IEM_MC_FETCH_TR_U16(a_u16Dst)                   (a_u16Dst) = (pVCpu)->iem.s.CTX_SUFF(pCtx)->tr.Sel
     9774#define IEM_MC_FETCH_TR_U32(a_u32Dst)                   (a_u32Dst) = (pVCpu)->iem.s.CTX_SUFF(pCtx)->tr.Sel
     9775#define IEM_MC_FETCH_TR_U64(a_u64Dst)                   (a_u64Dst) = (pVCpu)->iem.s.CTX_SUFF(pCtx)->tr.Sel
    97739776/** @note Not for IOPL or IF testing or modification. */
    9774 #define IEM_MC_FETCH_EFLAGS(a_EFlags)                   (a_EFlags) = (pIemCpu)->CTX_SUFF(pCtx)->eflags.u
    9775 #define IEM_MC_FETCH_EFLAGS_U8(a_EFlags)                (a_EFlags) = (uint8_t)(pIemCpu)->CTX_SUFF(pCtx)->eflags.u
    9776 #define IEM_MC_FETCH_FSW(a_u16Fsw)                      (a_u16Fsw) = pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.FSW
    9777 #define IEM_MC_FETCH_FCW(a_u16Fcw)                      (a_u16Fcw) = pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.FCW
    9778 
    9779 #define IEM_MC_STORE_GREG_U8(a_iGReg, a_u8Value)        *iemGRegRefU8(pIemCpu, (a_iGReg)) = (a_u8Value)
    9780 #define IEM_MC_STORE_GREG_U16(a_iGReg, a_u16Value)      *(uint16_t *)iemGRegRef(pIemCpu, (a_iGReg)) = (a_u16Value)
    9781 #define IEM_MC_STORE_GREG_U32(a_iGReg, a_u32Value)      *(uint64_t *)iemGRegRef(pIemCpu, (a_iGReg)) = (uint32_t)(a_u32Value) /* clear high bits. */
    9782 #define IEM_MC_STORE_GREG_U64(a_iGReg, a_u64Value)      *(uint64_t *)iemGRegRef(pIemCpu, (a_iGReg)) = (a_u64Value)
     9777#define IEM_MC_FETCH_EFLAGS(a_EFlags)                   (a_EFlags) = (pVCpu)->iem.s.CTX_SUFF(pCtx)->eflags.u
     9778#define IEM_MC_FETCH_EFLAGS_U8(a_EFlags)                (a_EFlags) = (uint8_t)(pVCpu)->iem.s.CTX_SUFF(pCtx)->eflags.u
     9779#define IEM_MC_FETCH_FSW(a_u16Fsw)                      (a_u16Fsw) = pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.FSW
     9780#define IEM_MC_FETCH_FCW(a_u16Fcw)                      (a_u16Fcw) = pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.FCW
     9781
     9782#define IEM_MC_STORE_GREG_U8(a_iGReg, a_u8Value)        *iemGRegRefU8(pVCpu, (a_iGReg)) = (a_u8Value)
     9783#define IEM_MC_STORE_GREG_U16(a_iGReg, a_u16Value)      *(uint16_t *)iemGRegRef(pVCpu, (a_iGReg)) = (a_u16Value)
     9784#define IEM_MC_STORE_GREG_U32(a_iGReg, a_u32Value)      *(uint64_t *)iemGRegRef(pVCpu, (a_iGReg)) = (uint32_t)(a_u32Value) /* clear high bits. */
     9785#define IEM_MC_STORE_GREG_U64(a_iGReg, a_u64Value)      *(uint64_t *)iemGRegRef(pVCpu, (a_iGReg)) = (a_u64Value)
    97839786#define IEM_MC_STORE_GREG_U8_CONST                      IEM_MC_STORE_GREG_U8
    97849787#define IEM_MC_STORE_GREG_U16_CONST                     IEM_MC_STORE_GREG_U16
    97859788#define IEM_MC_STORE_GREG_U32_CONST                     IEM_MC_STORE_GREG_U32
    97869789#define IEM_MC_STORE_GREG_U64_CONST                     IEM_MC_STORE_GREG_U64
    9787 #define IEM_MC_CLEAR_HIGH_GREG_U64(a_iGReg)             *(uint64_t *)iemGRegRef(pIemCpu, (a_iGReg)) &= UINT32_MAX
     9790#define IEM_MC_CLEAR_HIGH_GREG_U64(a_iGReg)             *(uint64_t *)iemGRegRef(pVCpu, (a_iGReg)) &= UINT32_MAX
    97889791#define IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(a_pu32Dst)    do { (a_pu32Dst)[1] = 0; } while (0)
    97899792#define IEM_MC_STORE_FPUREG_R80_SRC_REF(a_iSt, a_pr80Src) \
    9790     do { pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[a_iSt].r80 = *(a_pr80Src); } while (0)
    9791 
    9792 #define IEM_MC_REF_GREG_U8(a_pu8Dst, a_iGReg)           (a_pu8Dst) = iemGRegRefU8(pIemCpu, (a_iGReg))
    9793 #define IEM_MC_REF_GREG_U16(a_pu16Dst, a_iGReg)         (a_pu16Dst) = (uint16_t *)iemGRegRef(pIemCpu, (a_iGReg))
     9793    do { pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[a_iSt].r80 = *(a_pr80Src); } while (0)
     9794
     9795#define IEM_MC_REF_GREG_U8(a_pu8Dst, a_iGReg)           (a_pu8Dst) = iemGRegRefU8(pVCpu, (a_iGReg))
     9796#define IEM_MC_REF_GREG_U16(a_pu16Dst, a_iGReg)         (a_pu16Dst) = (uint16_t *)iemGRegRef(pVCpu, (a_iGReg))
    97949797/** @todo User of IEM_MC_REF_GREG_U32 needs to clear the high bits on commit.
    97959798 *        Use IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF! */
    9796 #define IEM_MC_REF_GREG_U32(a_pu32Dst, a_iGReg)         (a_pu32Dst) = (uint32_t *)iemGRegRef(pIemCpu, (a_iGReg))
    9797 #define IEM_MC_REF_GREG_U64(a_pu64Dst, a_iGReg)         (a_pu64Dst) = (uint64_t *)iemGRegRef(pIemCpu, (a_iGReg))
     9799#define IEM_MC_REF_GREG_U32(a_pu32Dst, a_iGReg)         (a_pu32Dst) = (uint32_t *)iemGRegRef(pVCpu, (a_iGReg))
     9800#define IEM_MC_REF_GREG_U64(a_pu64Dst, a_iGReg)         (a_pu64Dst) = (uint64_t *)iemGRegRef(pVCpu, (a_iGReg))
    97989801/** @note Not for IOPL or IF testing or modification. */
    9799 #define IEM_MC_REF_EFLAGS(a_pEFlags)                    (a_pEFlags) = &(pIemCpu)->CTX_SUFF(pCtx)->eflags.u
    9800 
    9801 #define IEM_MC_ADD_GREG_U8(a_iGReg, a_u8Value)          *(uint8_t  *)iemGRegRef(pIemCpu, (a_iGReg)) += (a_u8Value)
    9802 #define IEM_MC_ADD_GREG_U16(a_iGReg, a_u16Value)        *(uint16_t *)iemGRegRef(pIemCpu, (a_iGReg)) += (a_u16Value)
     9802#define IEM_MC_REF_EFLAGS(a_pEFlags)                    (a_pEFlags) = &(pVCpu)->iem.s.CTX_SUFF(pCtx)->eflags.u
     9803
     9804#define IEM_MC_ADD_GREG_U8(a_iGReg, a_u8Value)          *(uint8_t  *)iemGRegRef(pVCpu, (a_iGReg)) += (a_u8Value)
     9805#define IEM_MC_ADD_GREG_U16(a_iGReg, a_u16Value)        *(uint16_t *)iemGRegRef(pVCpu, (a_iGReg)) += (a_u16Value)
    98039806#define IEM_MC_ADD_GREG_U32(a_iGReg, a_u32Value) \
    98049807    do { \
    9805         uint32_t *pu32Reg = (uint32_t *)iemGRegRef(pIemCpu, (a_iGReg)); \
     9808        uint32_t *pu32Reg = (uint32_t *)iemGRegRef(pVCpu, (a_iGReg)); \
    98069809        *pu32Reg += (a_u32Value); \
    98079810        pu32Reg[1] = 0; /* implicitly clear the high bit. */ \
    98089811    } while (0)
    9809 #define IEM_MC_ADD_GREG_U64(a_iGReg, a_u64Value)        *(uint64_t *)iemGRegRef(pIemCpu, (a_iGReg)) += (a_u64Value)
    9810 
    9811 #define IEM_MC_SUB_GREG_U8(a_iGReg,  a_u8Value)         *(uint8_t *)iemGRegRef(pIemCpu, (a_iGReg)) -= (a_u8Value)
    9812 #define IEM_MC_SUB_GREG_U16(a_iGReg, a_u16Value)        *(uint16_t *)iemGRegRef(pIemCpu, (a_iGReg)) -= (a_u16Value)
     9812#define IEM_MC_ADD_GREG_U64(a_iGReg, a_u64Value)        *(uint64_t *)iemGRegRef(pVCpu, (a_iGReg)) += (a_u64Value)
     9813
     9814#define IEM_MC_SUB_GREG_U8(a_iGReg,  a_u8Value)         *(uint8_t *)iemGRegRef(pVCpu, (a_iGReg)) -= (a_u8Value)
     9815#define IEM_MC_SUB_GREG_U16(a_iGReg, a_u16Value)        *(uint16_t *)iemGRegRef(pVCpu, (a_iGReg)) -= (a_u16Value)
    98139816#define IEM_MC_SUB_GREG_U32(a_iGReg, a_u32Value) \
    98149817    do { \
    9815         uint32_t *pu32Reg = (uint32_t *)iemGRegRef(pIemCpu, (a_iGReg)); \
     9818        uint32_t *pu32Reg = (uint32_t *)iemGRegRef(pVCpu, (a_iGReg)); \
    98169819        *pu32Reg -= (a_u32Value); \
    98179820        pu32Reg[1] = 0; /* implicitly clear the high bit. */ \
    98189821    } while (0)
    9819 #define IEM_MC_SUB_GREG_U64(a_iGReg, a_u64Value)        *(uint64_t *)iemGRegRef(pIemCpu, (a_iGReg)) -= (a_u64Value)
     9822#define IEM_MC_SUB_GREG_U64(a_iGReg, a_u64Value)        *(uint64_t *)iemGRegRef(pVCpu, (a_iGReg)) -= (a_u64Value)
    98209823#define IEM_MC_SUB_LOCAL_U16(a_u16Value, a_u16Const)   do { (a_u16Value) -= a_u16Const; } while (0)
    98219824
    9822 #define IEM_MC_ADD_GREG_U8_TO_LOCAL(a_u8Value, a_iGReg)    do { (a_u8Value)  += iemGRegFetchU8( pIemCpu, (a_iGReg)); } while (0)
    9823 #define IEM_MC_ADD_GREG_U16_TO_LOCAL(a_u16Value, a_iGReg)  do { (a_u16Value) += iemGRegFetchU16(pIemCpu, (a_iGReg)); } while (0)
    9824 #define IEM_MC_ADD_GREG_U32_TO_LOCAL(a_u32Value, a_iGReg)  do { (a_u32Value) += iemGRegFetchU32(pIemCpu, (a_iGReg)); } while (0)
    9825 #define IEM_MC_ADD_GREG_U64_TO_LOCAL(a_u64Value, a_iGReg)  do { (a_u64Value) += iemGRegFetchU64(pIemCpu, (a_iGReg)); } while (0)
     9825#define IEM_MC_ADD_GREG_U8_TO_LOCAL(a_u8Value, a_iGReg)    do { (a_u8Value)  += iemGRegFetchU8( pVCpu, (a_iGReg)); } while (0)
     9826#define IEM_MC_ADD_GREG_U16_TO_LOCAL(a_u16Value, a_iGReg)  do { (a_u16Value) += iemGRegFetchU16(pVCpu, (a_iGReg)); } while (0)
     9827#define IEM_MC_ADD_GREG_U32_TO_LOCAL(a_u32Value, a_iGReg)  do { (a_u32Value) += iemGRegFetchU32(pVCpu, (a_iGReg)); } while (0)
     9828#define IEM_MC_ADD_GREG_U64_TO_LOCAL(a_u64Value, a_iGReg)  do { (a_u64Value) += iemGRegFetchU64(pVCpu, (a_iGReg)); } while (0)
    98269829#define IEM_MC_ADD_LOCAL_S16_TO_EFF_ADDR(a_EffAddr, a_i16) do { (a_EffAddr) += (a_i16); } while (0)
    98279830#define IEM_MC_ADD_LOCAL_S32_TO_EFF_ADDR(a_EffAddr, a_i32) do { (a_EffAddr) += (a_i32); } while (0)
     
    98539856#define IEM_MC_OR_2LOCS_U32(a_u32Local, a_u32Mask)      do { (a_u32Local) |= (a_u32Mask); } while (0)
    98549857
    9855 #define IEM_MC_AND_GREG_U8(a_iGReg, a_u8Value)          *(uint8_t  *)iemGRegRef(pIemCpu, (a_iGReg)) &= (a_u8Value)
    9856 #define IEM_MC_AND_GREG_U16(a_iGReg, a_u16Value)        *(uint16_t *)iemGRegRef(pIemCpu, (a_iGReg)) &= (a_u16Value)
     9858#define IEM_MC_AND_GREG_U8(a_iGReg, a_u8Value)          *(uint8_t  *)iemGRegRef(pVCpu, (a_iGReg)) &= (a_u8Value)
     9859#define IEM_MC_AND_GREG_U16(a_iGReg, a_u16Value)        *(uint16_t *)iemGRegRef(pVCpu, (a_iGReg)) &= (a_u16Value)
    98579860#define IEM_MC_AND_GREG_U32(a_iGReg, a_u32Value) \
    98589861    do { \
    9859         uint32_t *pu32Reg = (uint32_t *)iemGRegRef(pIemCpu, (a_iGReg)); \
     9862        uint32_t *pu32Reg = (uint32_t *)iemGRegRef(pVCpu, (a_iGReg)); \
    98609863        *pu32Reg &= (a_u32Value); \
    98619864        pu32Reg[1] = 0; /* implicitly clear the high bit. */ \
    98629865    } while (0)
    9863 #define IEM_MC_AND_GREG_U64(a_iGReg, a_u64Value)        *(uint64_t *)iemGRegRef(pIemCpu, (a_iGReg)) &= (a_u64Value)
    9864 
    9865 #define IEM_MC_OR_GREG_U8(a_iGReg, a_u8Value)           *(uint8_t  *)iemGRegRef(pIemCpu, (a_iGReg)) |= (a_u8Value)
    9866 #define IEM_MC_OR_GREG_U16(a_iGReg, a_u16Value)         *(uint16_t *)iemGRegRef(pIemCpu, (a_iGReg)) |= (a_u16Value)
     9866#define IEM_MC_AND_GREG_U64(a_iGReg, a_u64Value)        *(uint64_t *)iemGRegRef(pVCpu, (a_iGReg)) &= (a_u64Value)
     9867
     9868#define IEM_MC_OR_GREG_U8(a_iGReg, a_u8Value)           *(uint8_t  *)iemGRegRef(pVCpu, (a_iGReg)) |= (a_u8Value)
     9869#define IEM_MC_OR_GREG_U16(a_iGReg, a_u16Value)         *(uint16_t *)iemGRegRef(pVCpu, (a_iGReg)) |= (a_u16Value)
    98679870#define IEM_MC_OR_GREG_U32(a_iGReg, a_u32Value) \
    98689871    do { \
    9869         uint32_t *pu32Reg = (uint32_t *)iemGRegRef(pIemCpu, (a_iGReg)); \
     9872        uint32_t *pu32Reg = (uint32_t *)iemGRegRef(pVCpu, (a_iGReg)); \
    98709873        *pu32Reg |= (a_u32Value); \
    98719874        pu32Reg[1] = 0; /* implicitly clear the high bit. */ \
    98729875    } while (0)
    9873 #define IEM_MC_OR_GREG_U64(a_iGReg, a_u64Value)         *(uint64_t *)iemGRegRef(pIemCpu, (a_iGReg)) |= (a_u64Value)
     9876#define IEM_MC_OR_GREG_U64(a_iGReg, a_u64Value)         *(uint64_t *)iemGRegRef(pVCpu, (a_iGReg)) |= (a_u64Value)
    98749877
    98759878
    98769879/** @note Not for IOPL or IF modification. */
    9877 #define IEM_MC_SET_EFL_BIT(a_fBit)                      do { (pIemCpu)->CTX_SUFF(pCtx)->eflags.u |= (a_fBit); } while (0)
     9880#define IEM_MC_SET_EFL_BIT(a_fBit)                      do { (pVCpu)->iem.s.CTX_SUFF(pCtx)->eflags.u |= (a_fBit); } while (0)
    98789881/** @note Not for IOPL or IF modification. */
    9879 #define IEM_MC_CLEAR_EFL_BIT(a_fBit)                    do { (pIemCpu)->CTX_SUFF(pCtx)->eflags.u &= ~(a_fBit); } while (0)
     9882#define IEM_MC_CLEAR_EFL_BIT(a_fBit)                    do { (pVCpu)->iem.s.CTX_SUFF(pCtx)->eflags.u &= ~(a_fBit); } while (0)
    98809883/** @note Not for IOPL or IF modification. */
    9881 #define IEM_MC_FLIP_EFL_BIT(a_fBit)                     do { (pIemCpu)->CTX_SUFF(pCtx)->eflags.u ^= (a_fBit); } while (0)
    9882 
    9883 #define IEM_MC_CLEAR_FSW_EX()   do { (pIemCpu)->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.FSW &= X86_FSW_C_MASK | X86_FSW_TOP_MASK; } while (0)
     9884#define IEM_MC_FLIP_EFL_BIT(a_fBit)                     do { (pVCpu)->iem.s.CTX_SUFF(pCtx)->eflags.u ^= (a_fBit); } while (0)
     9885
     9886#define IEM_MC_CLEAR_FSW_EX()   do { (pVCpu)->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.FSW &= X86_FSW_C_MASK | X86_FSW_TOP_MASK; } while (0)
    98849887
    98859888
    98869889#define IEM_MC_FETCH_MREG_U64(a_u64Value, a_iMReg) \
    9887     do { (a_u64Value) = pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx; } while (0)
     9890    do { (a_u64Value) = pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx; } while (0)
    98889891#define IEM_MC_FETCH_MREG_U32(a_u32Value, a_iMReg) \
    9889     do { (a_u32Value) = pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[0]; } while (0)
     9892    do { (a_u32Value) = pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[0]; } while (0)
    98909893#define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) \
    9891     do { pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (a_u64Value); } while (0)
     9894    do { pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (a_u64Value); } while (0)
    98929895#define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value) \
    9893     do { pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); } while (0)
     9896    do { pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); } while (0)
    98949897#define IEM_MC_REF_MREG_U64(a_pu64Dst, a_iMReg)         \
    9895         (a_pu64Dst) = (&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
     9898        (a_pu64Dst) = (&pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
    98969899#define IEM_MC_REF_MREG_U64_CONST(a_pu64Dst, a_iMReg) \
    9897         (a_pu64Dst) = ((uint64_t const *)&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
     9900        (a_pu64Dst) = ((uint64_t const *)&pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
    98989901#define IEM_MC_REF_MREG_U32_CONST(a_pu32Dst, a_iMReg) \
    9899         (a_pu32Dst) = ((uint32_t const *)&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
     9902        (a_pu32Dst) = ((uint32_t const *)&pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
    99009903
    99019904#define IEM_MC_FETCH_XREG_U128(a_u128Value, a_iXReg) \
    9902     do { (a_u128Value) = pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].xmm; } while (0)
     9905    do { (a_u128Value) = pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].xmm; } while (0)
    99039906#define IEM_MC_FETCH_XREG_U64(a_u64Value, a_iXReg) \
    9904     do { (a_u64Value) = pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0]; } while (0)
     9907    do { (a_u64Value) = pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0]; } while (0)
    99059908#define IEM_MC_FETCH_XREG_U32(a_u32Value, a_iXReg) \
    9906     do { (a_u32Value) = pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au32[0]; } while (0)
     9909    do { (a_u32Value) = pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au32[0]; } while (0)
    99079910#define IEM_MC_STORE_XREG_U128(a_iXReg, a_u128Value) \
    9908     do { pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].xmm = (a_u128Value); } while (0)
     9911    do { pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].xmm = (a_u128Value); } while (0)
    99099912#define IEM_MC_STORE_XREG_U64(a_iXReg, a_u64Value) \
    9910     do { pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); } while (0)
     9913    do { pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); } while (0)
    99119914#define IEM_MC_STORE_XREG_U64_ZX_U128(a_iXReg, a_u64Value) \
    9912     do { pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); \
    9913          pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = 0; \
     9915    do { pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); \
     9916         pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = 0; \
    99149917    } while (0)
    99159918#define IEM_MC_STORE_XREG_U32_ZX_U128(a_iXReg, a_u32Value) \
    9916     do { pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (uint32_t)(a_u32Value); \
    9917          pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = 0; \
     9919    do { pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (uint32_t)(a_u32Value); \
     9920         pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = 0; \
    99189921    } while (0)
    99199922#define IEM_MC_REF_XREG_U128(a_pu128Dst, a_iXReg)       \
    9920     (a_pu128Dst) = (&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].xmm)
     9923    (a_pu128Dst) = (&pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].xmm)
    99219924#define IEM_MC_REF_XREG_U128_CONST(a_pu128Dst, a_iXReg) \
    9922     (a_pu128Dst) = ((uint128_t const *)&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].xmm)
     9925    (a_pu128Dst) = ((uint128_t const *)&pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].xmm)
    99239926#define IEM_MC_REF_XREG_U64_CONST(a_pu64Dst, a_iXReg) \
    9924     (a_pu64Dst) = ((uint64_t const *)&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0])
     9927    (a_pu64Dst) = ((uint64_t const *)&pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0])
    99259928#define IEM_MC_COPY_XREG_U128(a_iXRegDst, a_iXRegSrc) \
    9926     do { pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXRegDst)].xmm \
    9927             = pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXRegSrc)].xmm; } while (0)
     9929    do { pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXRegDst)].xmm \
     9930            = pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.aXMM[(a_iXRegSrc)].xmm; } while (0)
    99289931
    99299932#ifndef IEM_WITH_SETJMP
    99309933# define IEM_MC_FETCH_MEM_U8(a_u8Dst, a_iSeg, a_GCPtrMem) \
    9931     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pIemCpu, &(a_u8Dst), (a_iSeg), (a_GCPtrMem)))
     9934    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pVCpu, &(a_u8Dst), (a_iSeg), (a_GCPtrMem)))
    99329935# define IEM_MC_FETCH_MEM16_U8(a_u8Dst, a_iSeg, a_GCPtrMem16) \
    9933     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pIemCpu, &(a_u8Dst), (a_iSeg), (a_GCPtrMem16)))
     9936    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pVCpu, &(a_u8Dst), (a_iSeg), (a_GCPtrMem16)))
    99349937# define IEM_MC_FETCH_MEM32_U8(a_u8Dst, a_iSeg, a_GCPtrMem32) \
    9935     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pIemCpu, &(a_u8Dst), (a_iSeg), (a_GCPtrMem32)))
     9938    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pVCpu, &(a_u8Dst), (a_iSeg), (a_GCPtrMem32)))
    99369939#else
    99379940# define IEM_MC_FETCH_MEM_U8(a_u8Dst, a_iSeg, a_GCPtrMem) \
    9938     ((a_u8Dst) = iemMemFetchDataU8Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     9941    ((a_u8Dst) = iemMemFetchDataU8Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    99399942# define IEM_MC_FETCH_MEM16_U8(a_u8Dst, a_iSeg, a_GCPtrMem16) \
    9940     ((a_u8Dst) = iemMemFetchDataU8Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem16)))
     9943    ((a_u8Dst) = iemMemFetchDataU8Jmp(pVCpu, (a_iSeg), (a_GCPtrMem16)))
    99419944# define IEM_MC_FETCH_MEM32_U8(a_u8Dst, a_iSeg, a_GCPtrMem32) \
    9942     ((a_u8Dst) = iemMemFetchDataU8Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem32)))
     9945    ((a_u8Dst) = iemMemFetchDataU8Jmp(pVCpu, (a_iSeg), (a_GCPtrMem32)))
    99439946#endif
    99449947
    99459948#ifndef IEM_WITH_SETJMP
    99469949# define IEM_MC_FETCH_MEM_U16(a_u16Dst, a_iSeg, a_GCPtrMem) \
    9947     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pIemCpu, &(a_u16Dst), (a_iSeg), (a_GCPtrMem)))
     9950    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pVCpu, &(a_u16Dst), (a_iSeg), (a_GCPtrMem)))
    99489951# define IEM_MC_FETCH_MEM_U16_DISP(a_u16Dst, a_iSeg, a_GCPtrMem, a_offDisp) \
    9949     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pIemCpu, &(a_u16Dst), (a_iSeg), (a_GCPtrMem) + (a_offDisp)))
     9952    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pVCpu, &(a_u16Dst), (a_iSeg), (a_GCPtrMem) + (a_offDisp)))
    99509953# define IEM_MC_FETCH_MEM_I16(a_i16Dst, a_iSeg, a_GCPtrMem) \
    9951     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pIemCpu, (uint16_t *)&(a_i16Dst), (a_iSeg), (a_GCPtrMem)))
     9954    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pVCpu, (uint16_t *)&(a_i16Dst), (a_iSeg), (a_GCPtrMem)))
    99529955#else
    99539956# define IEM_MC_FETCH_MEM_U16(a_u16Dst, a_iSeg, a_GCPtrMem) \
    9954     ((a_u16Dst) = iemMemFetchDataU16Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     9957    ((a_u16Dst) = iemMemFetchDataU16Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    99559958# define IEM_MC_FETCH_MEM_U16_DISP(a_u16Dst, a_iSeg, a_GCPtrMem, a_offDisp) \
    9956     ((a_u16Dst) = iemMemFetchDataU16Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem) + (a_offDisp)))
     9959    ((a_u16Dst) = iemMemFetchDataU16Jmp(pVCpu, (a_iSeg), (a_GCPtrMem) + (a_offDisp)))
    99579960# define IEM_MC_FETCH_MEM_I16(a_i16Dst, a_iSeg, a_GCPtrMem) \
    9958     ((a_i16Dst) = (int16_t)iemMemFetchDataU16Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     9961    ((a_i16Dst) = (int16_t)iemMemFetchDataU16Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    99599962#endif
    99609963
    99619964#ifndef IEM_WITH_SETJMP
    99629965# define IEM_MC_FETCH_MEM_U32(a_u32Dst, a_iSeg, a_GCPtrMem) \
    9963     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU32(pIemCpu, &(a_u32Dst), (a_iSeg), (a_GCPtrMem)))
     9966    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU32(pVCpu, &(a_u32Dst), (a_iSeg), (a_GCPtrMem)))
    99649967# define IEM_MC_FETCH_MEM_U32_DISP(a_u32Dst, a_iSeg, a_GCPtrMem, a_offDisp) \
    9965     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU32(pIemCpu, &(a_u32Dst), (a_iSeg), (a_GCPtrMem) + (a_offDisp)))
     9968    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU32(pVCpu, &(a_u32Dst), (a_iSeg), (a_GCPtrMem) + (a_offDisp)))
    99669969# define IEM_MC_FETCH_MEM_I32(a_i32Dst, a_iSeg, a_GCPtrMem) \
    9967     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU32(pIemCpu, (uint32_t *)&(a_i32Dst), (a_iSeg), (a_GCPtrMem)))
     9970    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU32(pVCpu, (uint32_t *)&(a_i32Dst), (a_iSeg), (a_GCPtrMem)))
    99689971#else
    99699972# define IEM_MC_FETCH_MEM_U32(a_u32Dst, a_iSeg, a_GCPtrMem) \
    9970     ((a_u32Dst) = iemMemFetchDataU32Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     9973    ((a_u32Dst) = iemMemFetchDataU32Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    99719974# define IEM_MC_FETCH_MEM_U32_DISP(a_u32Dst, a_iSeg, a_GCPtrMem, a_offDisp) \
    9972     ((a_u32Dst) = iemMemFetchDataU32Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem) + (a_offDisp)))
     9975    ((a_u32Dst) = iemMemFetchDataU32Jmp(pVCpu, (a_iSeg), (a_GCPtrMem) + (a_offDisp)))
    99739976# define IEM_MC_FETCH_MEM_I32(a_i32Dst, a_iSeg, a_GCPtrMem) \
    9974     ((a_i32Dst) = (int32_t)iemMemFetchDataU32Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     9977    ((a_i32Dst) = (int32_t)iemMemFetchDataU32Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    99759978#endif
    99769979
    99779980#ifdef SOME_UNUSED_FUNCTION
    99789981# define IEM_MC_FETCH_MEM_S32_SX_U64(a_u64Dst, a_iSeg, a_GCPtrMem) \
    9979     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataS32SxU64(pIemCpu, &(a_u64Dst), (a_iSeg), (a_GCPtrMem)))
     9982    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataS32SxU64(pVCpu, &(a_u64Dst), (a_iSeg), (a_GCPtrMem)))
    99809983#endif
    99819984
    99829985#ifndef IEM_WITH_SETJMP
    99839986# define IEM_MC_FETCH_MEM_U64(a_u64Dst, a_iSeg, a_GCPtrMem) \
    9984     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU64(pIemCpu, &(a_u64Dst), (a_iSeg), (a_GCPtrMem)))
     9987    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU64(pVCpu, &(a_u64Dst), (a_iSeg), (a_GCPtrMem)))
    99859988# define IEM_MC_FETCH_MEM_U64_DISP(a_u64Dst, a_iSeg, a_GCPtrMem, a_offDisp) \
    9986     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU64(pIemCpu, &(a_u64Dst), (a_iSeg), (a_GCPtrMem) + (a_offDisp)))
     9989    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU64(pVCpu, &(a_u64Dst), (a_iSeg), (a_GCPtrMem) + (a_offDisp)))
    99879990# define IEM_MC_FETCH_MEM_U64_ALIGN_U128(a_u64Dst, a_iSeg, a_GCPtrMem) \
    9988     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU64AlignedU128(pIemCpu, &(a_u64Dst), (a_iSeg), (a_GCPtrMem)))
     9991    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU64AlignedU128(pVCpu, &(a_u64Dst), (a_iSeg), (a_GCPtrMem)))
    99899992# define IEM_MC_FETCH_MEM_I64(a_i64Dst, a_iSeg, a_GCPtrMem) \
    9990     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU64(pIemCpu, (uint64_t *)&(a_i64Dst), (a_iSeg), (a_GCPtrMem)))
     9993    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU64(pVCpu, (uint64_t *)&(a_i64Dst), (a_iSeg), (a_GCPtrMem)))
    99919994#else
    99929995# define IEM_MC_FETCH_MEM_U64(a_u64Dst, a_iSeg, a_GCPtrMem) \
    9993     ((a_u64Dst) = iemMemFetchDataU64Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     9996    ((a_u64Dst) = iemMemFetchDataU64Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    99949997# define IEM_MC_FETCH_MEM_U64_DISP(a_u64Dst, a_iSeg, a_GCPtrMem, a_offDisp) \
    9995     ((a_u64Dst) = iemMemFetchDataU64Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem) + (a_offDisp)))
     9998    ((a_u64Dst) = iemMemFetchDataU64Jmp(pVCpu, (a_iSeg), (a_GCPtrMem) + (a_offDisp)))
    99969999# define IEM_MC_FETCH_MEM_U64_ALIGN_U128(a_u64Dst, a_iSeg, a_GCPtrMem) \
    9997     ((a_u64Dst) = iemMemFetchDataU64AlignedU128Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10000    ((a_u64Dst) = iemMemFetchDataU64AlignedU128Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    999810001# define IEM_MC_FETCH_MEM_I64(a_i64Dst, a_iSeg, a_GCPtrMem) \
    9999     ((a_i64Dst) = (int64_t)iemMemFetchDataU64Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10002    ((a_i64Dst) = (int64_t)iemMemFetchDataU64Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1000010003#endif
    1000110004
    1000210005#ifndef IEM_WITH_SETJMP
    1000310006# define IEM_MC_FETCH_MEM_R32(a_r32Dst, a_iSeg, a_GCPtrMem) \
    10004     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU32(pIemCpu, &(a_r32Dst).u32, (a_iSeg), (a_GCPtrMem)))
     10007    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU32(pVCpu, &(a_r32Dst).u32, (a_iSeg), (a_GCPtrMem)))
    1000510008# define IEM_MC_FETCH_MEM_R64(a_r64Dst, a_iSeg, a_GCPtrMem) \
    10006     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU64(pIemCpu, &(a_r64Dst).au64[0], (a_iSeg), (a_GCPtrMem)))
     10009    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU64(pVCpu, &(a_r64Dst).au64[0], (a_iSeg), (a_GCPtrMem)))
    1000710010# define IEM_MC_FETCH_MEM_R80(a_r80Dst, a_iSeg, a_GCPtrMem) \
    10008     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataR80(pIemCpu, &(a_r80Dst), (a_iSeg), (a_GCPtrMem)))
     10011    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataR80(pVCpu, &(a_r80Dst), (a_iSeg), (a_GCPtrMem)))
    1000910012#else
    1001010013# define IEM_MC_FETCH_MEM_R32(a_r32Dst, a_iSeg, a_GCPtrMem) \
    10011     ((a_r32Dst).u32 = iemMemFetchDataU32Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10014    ((a_r32Dst).u32 = iemMemFetchDataU32Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1001210015# define IEM_MC_FETCH_MEM_R64(a_r64Dst, a_iSeg, a_GCPtrMem) \
    10013     ((a_r64Dst).au64[0] = iemMemFetchDataU64Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10016    ((a_r64Dst).au64[0] = iemMemFetchDataU64Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1001410017# define IEM_MC_FETCH_MEM_R80(a_r80Dst, a_iSeg, a_GCPtrMem) \
    10015     iemMemFetchDataR80Jmp(pIemCpu, &(a_r80Dst), (a_iSeg), (a_GCPtrMem))
     10018    iemMemFetchDataR80Jmp(pVCpu, &(a_r80Dst), (a_iSeg), (a_GCPtrMem))
    1001610019#endif
    1001710020
    1001810021#ifndef IEM_WITH_SETJMP
    1001910022# define IEM_MC_FETCH_MEM_U128(a_u128Dst, a_iSeg, a_GCPtrMem) \
    10020     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU128(pIemCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem)))
     10023    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU128(pVCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem)))
    1002110024# define IEM_MC_FETCH_MEM_U128_ALIGN_SSE(a_u128Dst, a_iSeg, a_GCPtrMem) \
    10022     IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU128AlignedSse(pIemCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem)))
     10025    IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU128AlignedSse(pVCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem)))
    1002310026#else
    1002410027# define IEM_MC_FETCH_MEM_U128(a_u128Dst, a_iSeg, a_GCPtrMem) \
    10025     iemMemFetchDataU128Jmp(pIemCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem))
     10028    iemMemFetchDataU128Jmp(pVCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem))
    1002610029# define IEM_MC_FETCH_MEM_U128_ALIGN_SSE(a_u128Dst, a_iSeg, a_GCPtrMem) \
    10027     iemMemFetchDataU128AlignedSseJmp(pIemCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem))
     10030    iemMemFetchDataU128AlignedSseJmp(pVCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem))
    1002810031#endif
    1002910032
     
    1003410037    do { \
    1003510038        uint8_t u8Tmp; \
    10036         IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pIemCpu, &u8Tmp, (a_iSeg), (a_GCPtrMem))); \
     10039        IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pVCpu, &u8Tmp, (a_iSeg), (a_GCPtrMem))); \
    1003710040        (a_u16Dst) = u8Tmp; \
    1003810041    } while (0)
     
    1004010043    do { \
    1004110044        uint8_t u8Tmp; \
    10042         IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pIemCpu, &u8Tmp, (a_iSeg), (a_GCPtrMem))); \
     10045        IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pVCpu, &u8Tmp, (a_iSeg), (a_GCPtrMem))); \
    1004310046        (a_u32Dst) = u8Tmp; \
    1004410047    } while (0)
     
    1004610049    do { \
    1004710050        uint8_t u8Tmp; \
    10048         IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pIemCpu, &u8Tmp, (a_iSeg), (a_GCPtrMem))); \
     10051        IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pVCpu, &u8Tmp, (a_iSeg), (a_GCPtrMem))); \
    1004910052        (a_u64Dst) = u8Tmp; \
    1005010053    } while (0)
     
    1005210055    do { \
    1005310056        uint16_t u16Tmp; \
    10054         IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pIemCpu, &u16Tmp, (a_iSeg), (a_GCPtrMem))); \
     10057        IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pVCpu, &u16Tmp, (a_iSeg), (a_GCPtrMem))); \
    1005510058        (a_u32Dst) = u16Tmp; \
    1005610059    } while (0)
     
    1005810061    do { \
    1005910062        uint16_t u16Tmp; \
    10060         IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pIemCpu, &u16Tmp, (a_iSeg), (a_GCPtrMem))); \
     10063        IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pVCpu, &u16Tmp, (a_iSeg), (a_GCPtrMem))); \
    1006110064        (a_u64Dst) = u16Tmp; \
    1006210065    } while (0)
     
    1006410067    do { \
    1006510068        uint32_t u32Tmp; \
    10066         IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU32(pIemCpu, &u32Tmp, (a_iSeg), (a_GCPtrMem))); \
     10069        IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU32(pVCpu, &u32Tmp, (a_iSeg), (a_GCPtrMem))); \
    1006710070        (a_u64Dst) = u32Tmp; \
    1006810071    } while (0)
    1006910072#else  /* IEM_WITH_SETJMP */
    1007010073# define IEM_MC_FETCH_MEM_U8_ZX_U16(a_u16Dst, a_iSeg, a_GCPtrMem) \
    10071     ((a_u16Dst) = iemMemFetchDataU8Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10074    ((a_u16Dst) = iemMemFetchDataU8Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1007210075# define IEM_MC_FETCH_MEM_U8_ZX_U32(a_u32Dst, a_iSeg, a_GCPtrMem) \
    10073     ((a_u32Dst) = iemMemFetchDataU8Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10076    ((a_u32Dst) = iemMemFetchDataU8Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1007410077# define IEM_MC_FETCH_MEM_U8_ZX_U64(a_u64Dst, a_iSeg, a_GCPtrMem) \
    10075     ((a_u64Dst) = iemMemFetchDataU8Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10078    ((a_u64Dst) = iemMemFetchDataU8Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1007610079# define IEM_MC_FETCH_MEM_U16_ZX_U32(a_u32Dst, a_iSeg, a_GCPtrMem) \
    10077     ((a_u32Dst) = iemMemFetchDataU16Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10080    ((a_u32Dst) = iemMemFetchDataU16Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1007810081# define IEM_MC_FETCH_MEM_U16_ZX_U64(a_u64Dst, a_iSeg, a_GCPtrMem) \
    10079     ((a_u64Dst) = iemMemFetchDataU16Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10082    ((a_u64Dst) = iemMemFetchDataU16Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1008010083# define IEM_MC_FETCH_MEM_U32_ZX_U64(a_u64Dst, a_iSeg, a_GCPtrMem) \
    10081     ((a_u64Dst) = iemMemFetchDataU32Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10084    ((a_u64Dst) = iemMemFetchDataU32Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1008210085#endif /* IEM_WITH_SETJMP */
    1008310086
     
    1008610089    do { \
    1008710090        uint8_t u8Tmp; \
    10088         IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pIemCpu, &u8Tmp, (a_iSeg), (a_GCPtrMem))); \
     10091        IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pVCpu, &u8Tmp, (a_iSeg), (a_GCPtrMem))); \
    1008910092        (a_u16Dst) = (int8_t)u8Tmp; \
    1009010093    } while (0)
     
    1009210095    do { \
    1009310096        uint8_t u8Tmp; \
    10094         IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pIemCpu, &u8Tmp, (a_iSeg), (a_GCPtrMem))); \
     10097        IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pVCpu, &u8Tmp, (a_iSeg), (a_GCPtrMem))); \
    1009510098        (a_u32Dst) = (int8_t)u8Tmp; \
    1009610099    } while (0)
     
    1009810101    do { \
    1009910102        uint8_t u8Tmp; \
    10100         IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pIemCpu, &u8Tmp, (a_iSeg), (a_GCPtrMem))); \
     10103        IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU8(pVCpu, &u8Tmp, (a_iSeg), (a_GCPtrMem))); \
    1010110104        (a_u64Dst) = (int8_t)u8Tmp; \
    1010210105    } while (0)
     
    1010410107    do { \
    1010510108        uint16_t u16Tmp; \
    10106         IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pIemCpu, &u16Tmp, (a_iSeg), (a_GCPtrMem))); \
     10109        IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pVCpu, &u16Tmp, (a_iSeg), (a_GCPtrMem))); \
    1010710110        (a_u32Dst) = (int16_t)u16Tmp; \
    1010810111    } while (0)
     
    1011010113    do { \
    1011110114        uint16_t u16Tmp; \
    10112         IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pIemCpu, &u16Tmp, (a_iSeg), (a_GCPtrMem))); \
     10115        IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU16(pVCpu, &u16Tmp, (a_iSeg), (a_GCPtrMem))); \
    1011310116        (a_u64Dst) = (int16_t)u16Tmp; \
    1011410117    } while (0)
     
    1011610119    do { \
    1011710120        uint32_t u32Tmp; \
    10118         IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU32(pIemCpu, &u32Tmp, (a_iSeg), (a_GCPtrMem))); \
     10121        IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU32(pVCpu, &u32Tmp, (a_iSeg), (a_GCPtrMem))); \
    1011910122        (a_u64Dst) = (int32_t)u32Tmp; \
    1012010123    } while (0)
    1012110124#else  /* IEM_WITH_SETJMP */
    1012210125# define IEM_MC_FETCH_MEM_U8_SX_U16(a_u16Dst, a_iSeg, a_GCPtrMem) \
    10123     ((a_u16Dst) = (int8_t)iemMemFetchDataU8Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10126    ((a_u16Dst) = (int8_t)iemMemFetchDataU8Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1012410127# define IEM_MC_FETCH_MEM_U8_SX_U32(a_u32Dst, a_iSeg, a_GCPtrMem) \
    10125     ((a_u32Dst) = (int8_t)iemMemFetchDataU8Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10128    ((a_u32Dst) = (int8_t)iemMemFetchDataU8Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1012610129# define IEM_MC_FETCH_MEM_U8_SX_U64(a_u64Dst, a_iSeg, a_GCPtrMem) \
    10127     ((a_u64Dst) = (int8_t)iemMemFetchDataU8Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10130    ((a_u64Dst) = (int8_t)iemMemFetchDataU8Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1012810131# define IEM_MC_FETCH_MEM_U16_SX_U32(a_u32Dst, a_iSeg, a_GCPtrMem) \
    10129     ((a_u32Dst) = (int16_t)iemMemFetchDataU16Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10132    ((a_u32Dst) = (int16_t)iemMemFetchDataU16Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1013010133# define IEM_MC_FETCH_MEM_U16_SX_U64(a_u64Dst, a_iSeg, a_GCPtrMem) \
    10131     ((a_u64Dst) = (int16_t)iemMemFetchDataU16Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10134    ((a_u64Dst) = (int16_t)iemMemFetchDataU16Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1013210135# define IEM_MC_FETCH_MEM_U32_SX_U64(a_u64Dst, a_iSeg, a_GCPtrMem) \
    10133     ((a_u64Dst) = (int32_t)iemMemFetchDataU32Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem)))
     10136    ((a_u64Dst) = (int32_t)iemMemFetchDataU32Jmp(pVCpu, (a_iSeg), (a_GCPtrMem)))
    1013410137#endif /* IEM_WITH_SETJMP */
    1013510138
    1013610139#ifndef IEM_WITH_SETJMP
    1013710140# define IEM_MC_STORE_MEM_U8(a_iSeg, a_GCPtrMem, a_u8Value) \
    10138     IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU8(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u8Value)))
     10141    IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU8(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u8Value)))
    1013910142# define IEM_MC_STORE_MEM_U16(a_iSeg, a_GCPtrMem, a_u16Value) \
    10140     IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU16(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u16Value)))
     10143    IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU16(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u16Value)))
    1014110144# define IEM_MC_STORE_MEM_U32(a_iSeg, a_GCPtrMem, a_u32Value) \
    10142     IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU32(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u32Value)))
     10145    IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU32(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u32Value)))
    1014310146# define IEM_MC_STORE_MEM_U64(a_iSeg, a_GCPtrMem, a_u64Value) \
    10144     IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU64(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u64Value)))
     10147    IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU64(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u64Value)))
    1014510148#else
    1014610149# define IEM_MC_STORE_MEM_U8(a_iSeg, a_GCPtrMem, a_u8Value) \
    10147     iemMemStoreDataU8Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u8Value))
     10150    iemMemStoreDataU8Jmp(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u8Value))
    1014810151# define IEM_MC_STORE_MEM_U16(a_iSeg, a_GCPtrMem, a_u16Value) \
    10149     iemMemStoreDataU16Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u16Value))
     10152    iemMemStoreDataU16Jmp(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u16Value))
    1015010153# define IEM_MC_STORE_MEM_U32(a_iSeg, a_GCPtrMem, a_u32Value) \
    10151     iemMemStoreDataU32Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u32Value))
     10154    iemMemStoreDataU32Jmp(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u32Value))
    1015210155# define IEM_MC_STORE_MEM_U64(a_iSeg, a_GCPtrMem, a_u64Value) \
    10153     iemMemStoreDataU64Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u64Value))
     10156    iemMemStoreDataU64Jmp(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u64Value))
    1015410157#endif
    1015510158
    1015610159#ifndef IEM_WITH_SETJMP
    1015710160# define IEM_MC_STORE_MEM_U8_CONST(a_iSeg, a_GCPtrMem, a_u8C) \
    10158     IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU8(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u8C)))
     10161    IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU8(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u8C)))
    1015910162# define IEM_MC_STORE_MEM_U16_CONST(a_iSeg, a_GCPtrMem, a_u16C) \
    10160     IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU16(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u16C)))
     10163    IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU16(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u16C)))
    1016110164# define IEM_MC_STORE_MEM_U32_CONST(a_iSeg, a_GCPtrMem, a_u32C) \
    10162     IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU32(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u32C)))
     10165    IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU32(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u32C)))
    1016310166# define IEM_MC_STORE_MEM_U64_CONST(a_iSeg, a_GCPtrMem, a_u64C) \
    10164     IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU64(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u64C)))
     10167    IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU64(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u64C)))
    1016510168#else
    1016610169# define IEM_MC_STORE_MEM_U8_CONST(a_iSeg, a_GCPtrMem, a_u8C) \
    10167     iemMemStoreDataU8Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u8C))
     10170    iemMemStoreDataU8Jmp(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u8C))
    1016810171# define IEM_MC_STORE_MEM_U16_CONST(a_iSeg, a_GCPtrMem, a_u16C) \
    10169     iemMemStoreDataU16Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u16C))
     10172    iemMemStoreDataU16Jmp(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u16C))
    1017010173# define IEM_MC_STORE_MEM_U32_CONST(a_iSeg, a_GCPtrMem, a_u32C) \
    10171     iemMemStoreDataU32Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u32C))
     10174    iemMemStoreDataU32Jmp(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u32C))
    1017210175# define IEM_MC_STORE_MEM_U64_CONST(a_iSeg, a_GCPtrMem, a_u64C) \
    10173     iemMemStoreDataU64Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u64C))
     10176    iemMemStoreDataU64Jmp(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u64C))
    1017410177#endif
    1017510178
     
    1018810191#ifndef IEM_WITH_SETJMP
    1018910192# define IEM_MC_STORE_MEM_U128(a_iSeg, a_GCPtrMem, a_u128Value) \
    10190     IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU128(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u128Value)))
     10193    IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU128(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u128Value)))
    1019110194# define IEM_MC_STORE_MEM_U128_ALIGN_SSE(a_iSeg, a_GCPtrMem, a_u128Value) \
    10192     IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU128AlignedSse(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u128Value)))
     10195    IEM_MC_RETURN_ON_FAILURE(iemMemStoreDataU128AlignedSse(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u128Value)))
    1019310196#else
    1019410197# define IEM_MC_STORE_MEM_U128(a_iSeg, a_GCPtrMem, a_u128Value) \
    10195     iemMemStoreDataU128Jmp(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u128Value))
     10198    iemMemStoreDataU128Jmp(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u128Value))
    1019610199# define IEM_MC_STORE_MEM_U128_ALIGN_SSE(a_iSeg, a_GCPtrMem, a_u128Value) \
    10197     iemMemStoreDataU128AlignedSseJmp(pIemCpu, (a_iSeg), (a_GCPtrMem), (a_u128Value))
     10200    iemMemStoreDataU128AlignedSseJmp(pVCpu, (a_iSeg), (a_GCPtrMem), (a_u128Value))
    1019810201#endif
    1019910202
    1020010203
    1020110204#define IEM_MC_PUSH_U16(a_u16Value) \
    10202     IEM_MC_RETURN_ON_FAILURE(iemMemStackPushU16(pIemCpu, (a_u16Value)))
     10205    IEM_MC_RETURN_ON_FAILURE(iemMemStackPushU16(pVCpu, (a_u16Value)))
    1020310206#define IEM_MC_PUSH_U32(a_u32Value) \
    10204     IEM_MC_RETURN_ON_FAILURE(iemMemStackPushU32(pIemCpu, (a_u32Value)))
     10207    IEM_MC_RETURN_ON_FAILURE(iemMemStackPushU32(pVCpu, (a_u32Value)))
    1020510208#define IEM_MC_PUSH_U32_SREG(a_u32Value) \
    10206     IEM_MC_RETURN_ON_FAILURE(iemMemStackPushU32SReg(pIemCpu, (a_u32Value)))
     10209    IEM_MC_RETURN_ON_FAILURE(iemMemStackPushU32SReg(pVCpu, (a_u32Value)))
    1020710210#define IEM_MC_PUSH_U64(a_u64Value) \
    10208     IEM_MC_RETURN_ON_FAILURE(iemMemStackPushU64(pIemCpu, (a_u64Value)))
     10211    IEM_MC_RETURN_ON_FAILURE(iemMemStackPushU64(pVCpu, (a_u64Value)))
    1020910212
    1021010213#define IEM_MC_POP_U16(a_pu16Value) \
    10211     IEM_MC_RETURN_ON_FAILURE(iemMemStackPopU16(pIemCpu, (a_pu16Value)))
     10214    IEM_MC_RETURN_ON_FAILURE(iemMemStackPopU16(pVCpu, (a_pu16Value)))
    1021210215#define IEM_MC_POP_U32(a_pu32Value) \
    10213     IEM_MC_RETURN_ON_FAILURE(iemMemStackPopU32(pIemCpu, (a_pu32Value)))
     10216    IEM_MC_RETURN_ON_FAILURE(iemMemStackPopU32(pVCpu, (a_pu32Value)))
    1021410217#define IEM_MC_POP_U64(a_pu64Value) \
    10215     IEM_MC_RETURN_ON_FAILURE(iemMemStackPopU64(pIemCpu, (a_pu64Value)))
     10218    IEM_MC_RETURN_ON_FAILURE(iemMemStackPopU64(pVCpu, (a_pu64Value)))
    1021610219
    1021710220/** Maps guest memory for direct or bounce buffered access.
     
    1022010223 */
    1022110224#define IEM_MC_MEM_MAP(a_pMem, a_fAccess, a_iSeg, a_GCPtrMem, a_iArg) \
    10222     IEM_MC_RETURN_ON_FAILURE(iemMemMap(pIemCpu, (void **)&(a_pMem), sizeof(*(a_pMem)), (a_iSeg), (a_GCPtrMem), (a_fAccess)))
     10225    IEM_MC_RETURN_ON_FAILURE(iemMemMap(pVCpu, (void **)&(a_pMem), sizeof(*(a_pMem)), (a_iSeg), (a_GCPtrMem), (a_fAccess)))
    1022310226
    1022410227/** Maps guest memory for direct or bounce buffered access.
     
    1022710230 */
    1022810231#define IEM_MC_MEM_MAP_EX(a_pvMem, a_fAccess, a_cbMem, a_iSeg, a_GCPtrMem, a_iArg) \
    10229     IEM_MC_RETURN_ON_FAILURE(iemMemMap(pIemCpu, (void **)&(a_pvMem), (a_cbMem), (a_iSeg), (a_GCPtrMem), (a_fAccess)))
     10232    IEM_MC_RETURN_ON_FAILURE(iemMemMap(pVCpu, (void **)&(a_pvMem), (a_cbMem), (a_iSeg), (a_GCPtrMem), (a_fAccess)))
    1023010233
    1023110234/** Commits the memory and unmaps the guest memory.
     
    1023310236 */
    1023410237#define IEM_MC_MEM_COMMIT_AND_UNMAP(a_pvMem, a_fAccess) \
    10235     IEM_MC_RETURN_ON_FAILURE(iemMemCommitAndUnmap(pIemCpu, (a_pvMem), (a_fAccess)))
     10238    IEM_MC_RETURN_ON_FAILURE(iemMemCommitAndUnmap(pVCpu, (a_pvMem), (a_fAccess)))
    1023610239
    1023710240/** Commits the memory and unmaps the guest memory unless the FPU status word
     
    1024810251        if (   !(a_u16FSW & X86_FSW_ES) \
    1024910252            || !(  (a_u16FSW & (X86_FSW_UE | X86_FSW_OE | X86_FSW_IE)) \
    10250                  & ~(pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.FCW & X86_FCW_MASK_ALL) ) ) \
    10251             IEM_MC_RETURN_ON_FAILURE(iemMemCommitAndUnmap(pIemCpu, (a_pvMem), (a_fAccess))); \
     10253                 & ~(pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.FCW & X86_FCW_MASK_ALL) ) ) \
     10254            IEM_MC_RETURN_ON_FAILURE(iemMemCommitAndUnmap(pVCpu, (a_pvMem), (a_fAccess))); \
    1025210255    } while (0)
    1025310256
     
    1025510258#ifndef IEM_WITH_SETJMP
    1025610259# define IEM_MC_CALC_RM_EFF_ADDR(a_GCPtrEff, bRm, cbImm) \
    10257     IEM_MC_RETURN_ON_FAILURE(iemOpHlpCalcRmEffAddr(pIemCpu, (bRm), (cbImm), &(a_GCPtrEff)))
     10260    IEM_MC_RETURN_ON_FAILURE(iemOpHlpCalcRmEffAddr(pVCpu, (bRm), (cbImm), &(a_GCPtrEff)))
    1025810261#else
    1025910262# define IEM_MC_CALC_RM_EFF_ADDR(a_GCPtrEff, bRm, cbImm) \
    10260     ((a_GCPtrEff) = iemOpHlpCalcRmEffAddrJmp(pIemCpu, (bRm), (cbImm)))
     10263    ((a_GCPtrEff) = iemOpHlpCalcRmEffAddrJmp(pVCpu, (bRm), (cbImm)))
    1026110264#endif
    1026210265
     
    1027610279 * @sa      IEM_DECL_IMPL_C_TYPE_0 and IEM_CIMPL_DEF_0.
    1027710280 */
    10278 #define IEM_MC_CALL_CIMPL_0(a_pfnCImpl)                 return (a_pfnCImpl)(pIemCpu, pIemCpu->offOpcode)
     10281#define IEM_MC_CALL_CIMPL_0(a_pfnCImpl)                 return (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode)
    1027910282
    1028010283/**
     
    1028510288 * @param   a0              The argument.
    1028610289 */
    10287 #define IEM_MC_CALL_CIMPL_1(a_pfnCImpl, a0)             return (a_pfnCImpl)(pIemCpu, pIemCpu->offOpcode, a0)
     10290#define IEM_MC_CALL_CIMPL_1(a_pfnCImpl, a0)             return (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0)
    1028810291
    1028910292/**
     
    1029510298 * @param   a1              The second extra argument.
    1029610299 */
    10297 #define IEM_MC_CALL_CIMPL_2(a_pfnCImpl, a0, a1)         return (a_pfnCImpl)(pIemCpu, pIemCpu->offOpcode, a0, a1)
     10300#define IEM_MC_CALL_CIMPL_2(a_pfnCImpl, a0, a1)         return (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0, a1)
    1029810301
    1029910302/**
     
    1030610309 * @param   a2              The third extra argument.
    1030710310 */
    10308 #define IEM_MC_CALL_CIMPL_3(a_pfnCImpl, a0, a1, a2)     return (a_pfnCImpl)(pIemCpu, pIemCpu->offOpcode, a0, a1, a2)
     10311#define IEM_MC_CALL_CIMPL_3(a_pfnCImpl, a0, a1, a2)     return (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0, a1, a2)
    1030910312
    1031010313/**
     
    1031810321 * @param   a3              The fourth extra argument.
    1031910322 */
    10320 #define IEM_MC_CALL_CIMPL_4(a_pfnCImpl, a0, a1, a2, a3)     return (a_pfnCImpl)(pIemCpu, pIemCpu->offOpcode, a0, a1, a2, a3)
     10323#define IEM_MC_CALL_CIMPL_4(a_pfnCImpl, a0, a1, a2, a3)     return (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0, a1, a2, a3)
    1032110324
    1032210325/**
     
    1033110334 * @param   a4              The fifth extra argument.
    1033210335 */
    10333 #define IEM_MC_CALL_CIMPL_5(a_pfnCImpl, a0, a1, a2, a3, a4) return (a_pfnCImpl)(pIemCpu, pIemCpu->offOpcode, a0, a1, a2, a3, a4)
     10336#define IEM_MC_CALL_CIMPL_5(a_pfnCImpl, a0, a1, a2, a3, a4) return (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0, a1, a2, a3, a4)
    1033410337
    1033510338/**
     
    1034210345 * @sa      IEM_DECL_IMPL_C_TYPE_0 and IEM_CIMPL_DEF_0.
    1034310346 */
    10344 #define IEM_MC_DEFER_TO_CIMPL_0(a_pfnCImpl)             (a_pfnCImpl)(pIemCpu, pIemCpu->offOpcode)
     10347#define IEM_MC_DEFER_TO_CIMPL_0(a_pfnCImpl)             (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode)
    1034510348
    1034610349/**
     
    1035310356 * @param   a0              The argument.
    1035410357 */
    10355 #define IEM_MC_DEFER_TO_CIMPL_1(a_pfnCImpl, a0)         (a_pfnCImpl)(pIemCpu, pIemCpu->offOpcode, a0)
     10358#define IEM_MC_DEFER_TO_CIMPL_1(a_pfnCImpl, a0)         (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0)
    1035610359
    1035710360/**
     
    1036510368 * @param   a1              The second extra argument.
    1036610369 */
    10367 #define IEM_MC_DEFER_TO_CIMPL_2(a_pfnCImpl, a0, a1)     (a_pfnCImpl)(pIemCpu, pIemCpu->offOpcode, a0, a1)
     10370#define IEM_MC_DEFER_TO_CIMPL_2(a_pfnCImpl, a0, a1)     (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0, a1)
    1036810371
    1036910372/**
     
    1037810381 * @param   a2              The third extra argument.
    1037910382 */
    10380 #define IEM_MC_DEFER_TO_CIMPL_3(a_pfnCImpl, a0, a1, a2) (a_pfnCImpl)(pIemCpu, pIemCpu->offOpcode, a0, a1, a2)
     10383#define IEM_MC_DEFER_TO_CIMPL_3(a_pfnCImpl, a0, a1, a2) (a_pfnCImpl)(pVCpu, pVCpu->iem.s.offOpcode, a0, a1, a2)
    1038110384
    1038210385/**
     
    1038810391#define IEM_MC_CALL_FPU_AIMPL_1(a_pfnAImpl, a0) \
    1038910392    do { \
    10390         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0)); \
     10393        a_pfnAImpl(&pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0)); \
    1039110394    } while (0)
    1039210395
     
    1040010403#define IEM_MC_CALL_FPU_AIMPL_2(a_pfnAImpl, a0, a1) \
    1040110404    do { \
    10402         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0), (a1)); \
     10405        a_pfnAImpl(&pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0), (a1)); \
    1040310406    } while (0)
    1040410407
     
    1041310416#define IEM_MC_CALL_FPU_AIMPL_3(a_pfnAImpl, a0, a1, a2) \
    1041410417    do { \
    10415         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
     10418        a_pfnAImpl(&pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
    1041610419    } while (0)
    1041710420
     
    1042410427/** Pushes FPU result onto the stack. */
    1042510428#define IEM_MC_PUSH_FPU_RESULT(a_FpuData) \
    10426     iemFpuPushResult(pIemCpu, &a_FpuData)
     10429    iemFpuPushResult(pVCpu, &a_FpuData)
    1042710430/** Pushes FPU result onto the stack and sets the FPUDP. */
    1042810431#define IEM_MC_PUSH_FPU_RESULT_MEM_OP(a_FpuData, a_iEffSeg, a_GCPtrEff) \
    10429     iemFpuPushResultWithMemOp(pIemCpu, &a_FpuData, a_iEffSeg, a_GCPtrEff)
     10432    iemFpuPushResultWithMemOp(pVCpu, &a_FpuData, a_iEffSeg, a_GCPtrEff)
    1043010433
    1043110434/** Replaces ST0 with value one and pushes value 2 onto the FPU stack. */
    1043210435#define IEM_MC_PUSH_FPU_RESULT_TWO(a_FpuDataTwo) \
    10433     iemFpuPushResultTwo(pIemCpu, &a_FpuDataTwo)
     10436    iemFpuPushResultTwo(pVCpu, &a_FpuDataTwo)
    1043410437
    1043510438/** Stores FPU result in a stack register. */
    1043610439#define IEM_MC_STORE_FPU_RESULT(a_FpuData, a_iStReg) \
    10437     iemFpuStoreResult(pIemCpu, &a_FpuData, a_iStReg)
     10440    iemFpuStoreResult(pVCpu, &a_FpuData, a_iStReg)
    1043810441/** Stores FPU result in a stack register and pops the stack. */
    1043910442#define IEM_MC_STORE_FPU_RESULT_THEN_POP(a_FpuData, a_iStReg) \
    10440     iemFpuStoreResultThenPop(pIemCpu, &a_FpuData, a_iStReg)
     10443    iemFpuStoreResultThenPop(pVCpu, &a_FpuData, a_iStReg)
    1044110444/** Stores FPU result in a stack register and sets the FPUDP. */
    1044210445#define IEM_MC_STORE_FPU_RESULT_MEM_OP(a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff) \
    10443     iemFpuStoreResultWithMemOp(pIemCpu, &a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff)
     10446    iemFpuStoreResultWithMemOp(pVCpu, &a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff)
    1044410447/** Stores FPU result in a stack register, sets the FPUDP, and pops the
    1044510448 *  stack. */
    1044610449#define IEM_MC_STORE_FPU_RESULT_WITH_MEM_OP_THEN_POP(a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff) \
    10447     iemFpuStoreResultWithMemOpThenPop(pIemCpu, &a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff)
     10450    iemFpuStoreResultWithMemOpThenPop(pVCpu, &a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff)
    1044810451
    1044910452/** Only update the FOP, FPUIP, and FPUCS. (For FNOP.) */
    1045010453#define IEM_MC_UPDATE_FPU_OPCODE_IP() \
    10451     iemFpuUpdateOpcodeAndIp(pIemCpu)
     10454    iemFpuUpdateOpcodeAndIp(pVCpu)
    1045210455/** Free a stack register (for FFREE and FFREEP). */
    1045310456#define IEM_MC_FPU_STACK_FREE(a_iStReg) \
    10454     iemFpuStackFree(pIemCpu, a_iStReg)
     10457    iemFpuStackFree(pVCpu, a_iStReg)
    1045510458/** Increment the FPU stack pointer. */
    1045610459#define IEM_MC_FPU_STACK_INC_TOP() \
    10457     iemFpuStackIncTop(pIemCpu)
     10460    iemFpuStackIncTop(pVCpu)
    1045810461/** Decrement the FPU stack pointer. */
    1045910462#define IEM_MC_FPU_STACK_DEC_TOP() \
    10460     iemFpuStackDecTop(pIemCpu)
     10463    iemFpuStackDecTop(pVCpu)
    1046110464
    1046210465/** Updates the FSW, FOP, FPUIP, and FPUCS. */
    1046310466#define IEM_MC_UPDATE_FSW(a_u16FSW) \
    10464     iemFpuUpdateFSW(pIemCpu, a_u16FSW)
     10467    iemFpuUpdateFSW(pVCpu, a_u16FSW)
    1046510468/** Updates the FSW with a constant value as well as FOP, FPUIP, and FPUCS. */
    1046610469#define IEM_MC_UPDATE_FSW_CONST(a_u16FSW) \
    10467     iemFpuUpdateFSW(pIemCpu, a_u16FSW)
     10470    iemFpuUpdateFSW(pVCpu, a_u16FSW)
    1046810471/** Updates the FSW, FOP, FPUIP, FPUCS, FPUDP, and FPUDS. */
    1046910472#define IEM_MC_UPDATE_FSW_WITH_MEM_OP(a_u16FSW, a_iEffSeg, a_GCPtrEff) \
    10470     iemFpuUpdateFSWWithMemOp(pIemCpu, a_u16FSW, a_iEffSeg, a_GCPtrEff)
     10473    iemFpuUpdateFSWWithMemOp(pVCpu, a_u16FSW, a_iEffSeg, a_GCPtrEff)
    1047110474/** Updates the FSW, FOP, FPUIP, and FPUCS, and then pops the stack. */
    1047210475#define IEM_MC_UPDATE_FSW_THEN_POP(a_u16FSW) \
    10473     iemFpuUpdateFSWThenPop(pIemCpu, a_u16FSW)
     10476    iemFpuUpdateFSWThenPop(pVCpu, a_u16FSW)
    1047410477/** Updates the FSW, FOP, FPUIP, FPUCS, FPUDP and FPUDS, and then pops the
    1047510478 *  stack. */
    1047610479#define IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(a_u16FSW, a_iEffSeg, a_GCPtrEff) \
    10477     iemFpuUpdateFSWWithMemOpThenPop(pIemCpu, a_u16FSW, a_iEffSeg, a_GCPtrEff)
     10480    iemFpuUpdateFSWWithMemOpThenPop(pVCpu, a_u16FSW, a_iEffSeg, a_GCPtrEff)
    1047810481/** Updates the FSW, FOP, FPUIP, and FPUCS, and then pops the stack twice. */
    1047910482#define IEM_MC_UPDATE_FSW_THEN_POP_POP(a_u16FSW) \
    10480     iemFpuUpdateFSWThenPop(pIemCpu, a_u16FSW)
     10483    iemFpuUpdateFSWThenPop(pVCpu, a_u16FSW)
    1048110484
    1048210485/** Raises a FPU stack underflow exception.  Sets FPUIP, FPUCS and FOP. */
    1048310486#define IEM_MC_FPU_STACK_UNDERFLOW(a_iStDst) \
    10484     iemFpuStackUnderflow(pIemCpu, a_iStDst)
     10487    iemFpuStackUnderflow(pVCpu, a_iStDst)
    1048510488/** Raises a FPU stack underflow exception.  Sets FPUIP, FPUCS and FOP. Pops
    1048610489 *  stack. */
    1048710490#define IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(a_iStDst) \
    10488     iemFpuStackUnderflowThenPop(pIemCpu, a_iStDst)
     10491    iemFpuStackUnderflowThenPop(pVCpu, a_iStDst)
    1048910492/** Raises a FPU stack underflow exception.  Sets FPUIP, FPUCS, FOP, FPUDP and
    1049010493 *  FPUDS. */
    1049110494#define IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(a_iStDst, a_iEffSeg, a_GCPtrEff) \
    10492     iemFpuStackUnderflowWithMemOp(pIemCpu, a_iStDst, a_iEffSeg, a_GCPtrEff)
     10495    iemFpuStackUnderflowWithMemOp(pVCpu, a_iStDst, a_iEffSeg, a_GCPtrEff)
    1049310496/** Raises a FPU stack underflow exception.  Sets FPUIP, FPUCS, FOP, FPUDP and
    1049410497 *  FPUDS. Pops stack. */
    1049510498#define IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(a_iStDst, a_iEffSeg, a_GCPtrEff) \
    10496     iemFpuStackUnderflowWithMemOpThenPop(pIemCpu, a_iStDst, a_iEffSeg, a_GCPtrEff)
     10499    iemFpuStackUnderflowWithMemOpThenPop(pVCpu, a_iStDst, a_iEffSeg, a_GCPtrEff)
    1049710500/** Raises a FPU stack underflow exception.  Sets FPUIP, FPUCS and FOP. Pops
    1049810501 *  stack twice. */
    1049910502#define IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP_POP() \
    10500     iemFpuStackUnderflowThenPopPop(pIemCpu)
     10503    iemFpuStackUnderflowThenPopPop(pVCpu)
    1050110504/** Raises a FPU stack underflow exception for an instruction pushing a result
    1050210505 *  value onto the stack. Sets FPUIP, FPUCS and FOP. */
    1050310506#define IEM_MC_FPU_STACK_PUSH_UNDERFLOW() \
    10504     iemFpuStackPushUnderflow(pIemCpu)
     10507    iemFpuStackPushUnderflow(pVCpu)
    1050510508/** Raises a FPU stack underflow exception for an instruction pushing a result
    1050610509 *  value onto the stack and replacing ST0. Sets FPUIP, FPUCS and FOP. */
    1050710510#define IEM_MC_FPU_STACK_PUSH_UNDERFLOW_TWO() \
    10508     iemFpuStackPushUnderflowTwo(pIemCpu)
     10511    iemFpuStackPushUnderflowTwo(pVCpu)
    1050910512
    1051010513/** Raises a FPU stack overflow exception as part of a push attempt.  Sets
    1051110514 *  FPUIP, FPUCS and FOP. */
    1051210515#define IEM_MC_FPU_STACK_PUSH_OVERFLOW() \
    10513     iemFpuStackPushOverflow(pIemCpu)
     10516    iemFpuStackPushOverflow(pVCpu)
    1051410517/** Raises a FPU stack overflow exception as part of a push attempt.  Sets
    1051510518 *  FPUIP, FPUCS, FOP, FPUDP and FPUDS. */
    1051610519#define IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(a_iEffSeg, a_GCPtrEff) \
    10517     iemFpuStackPushOverflowWithMemOp(pIemCpu, a_iEffSeg, a_GCPtrEff)
     10520    iemFpuStackPushOverflowWithMemOp(pVCpu, a_iEffSeg, a_GCPtrEff)
    1051810521/** Prepares for using the FPU state.
    1051910522 * Ensures that we can use the host FPU in the current context (RC+R0.
    1052010523 * Ensures the guest FPU state in the CPUMCTX is up to date. */
    10521 #define IEM_MC_PREPARE_FPU_USAGE()              iemFpuPrepareUsage(pIemCpu)
     10524#define IEM_MC_PREPARE_FPU_USAGE()              iemFpuPrepareUsage(pVCpu)
    1052210525/** Actualizes the guest FPU state so it can be accessed read-only fashion. */
    10523 #define IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ()   iemFpuActualizeStateForRead(pIemCpu)
     10526#define IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ()   iemFpuActualizeStateForRead(pVCpu)
    1052410527/** Actualizes the guest FPU state so it can be accessed and modified. */
    10525 #define IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE() iemFpuActualizeStateForChange(pIemCpu)
     10528#define IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE() iemFpuActualizeStateForChange(pVCpu)
    1052610529
    1052710530/** Prepares for using the SSE state.
    1052810531 * Ensures that we can use the host SSE/FPU in the current context (RC+R0.
    1052910532 * Ensures the guest SSE state in the CPUMCTX is up to date. */
    10530 #define IEM_MC_PREPARE_SSE_USAGE()              iemFpuPrepareUsageSse(pIemCpu)
     10533#define IEM_MC_PREPARE_SSE_USAGE()              iemFpuPrepareUsageSse(pVCpu)
    1053110534/** Actualizes the guest XMM0..15 register state for read-only access. */
    10532 #define IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ()   iemFpuActualizeSseStateForRead(pIemCpu)
     10535#define IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ()   iemFpuActualizeSseStateForRead(pVCpu)
    1053310536/** Actualizes the guest XMM0..15 register state for read-write access. */
    10534 #define IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE() iemFpuActualizeSseStateForChange(pIemCpu)
     10537#define IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE() iemFpuActualizeSseStateForChange(pVCpu)
    1053510538
    1053610539/**
     
    1054410547    do { \
    1054510548        IEM_MC_PREPARE_FPU_USAGE(); \
    10546         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0), (a1)); \
     10549        a_pfnAImpl(&pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0), (a1)); \
    1054710550    } while (0)
    1054810551
     
    1055810561    do { \
    1055910562        IEM_MC_PREPARE_FPU_USAGE(); \
    10560         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
     10563        a_pfnAImpl(&pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
    1056110564    } while (0)
    1056210565
     
    1057210575    do { \
    1057310576        IEM_MC_PREPARE_SSE_USAGE(); \
    10574         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0), (a1)); \
     10577        a_pfnAImpl(&pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0), (a1)); \
    1057510578    } while (0)
    1057610579
     
    1058610589    do { \
    1058710590        IEM_MC_PREPARE_SSE_USAGE(); \
    10588         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
     10591        a_pfnAImpl(&pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
    1058910592    } while (0)
    1059010593
    1059110594/** @note Not for IOPL or IF testing. */
    10592 #define IEM_MC_IF_EFL_BIT_SET(a_fBit)                   if (pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBit)) {
     10595#define IEM_MC_IF_EFL_BIT_SET(a_fBit)                   if (pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBit)) {
    1059310596/** @note Not for IOPL or IF testing. */
    10594 #define IEM_MC_IF_EFL_BIT_NOT_SET(a_fBit)               if (!(pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBit))) {
     10597#define IEM_MC_IF_EFL_BIT_NOT_SET(a_fBit)               if (!(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBit))) {
    1059510598/** @note Not for IOPL or IF testing. */
    10596 #define IEM_MC_IF_EFL_ANY_BITS_SET(a_fBits)             if (pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBits)) {
     10599#define IEM_MC_IF_EFL_ANY_BITS_SET(a_fBits)             if (pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBits)) {
    1059710600/** @note Not for IOPL or IF testing. */
    10598 #define IEM_MC_IF_EFL_NO_BITS_SET(a_fBits)              if (!(pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBits))) {
     10601#define IEM_MC_IF_EFL_NO_BITS_SET(a_fBits)              if (!(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBits))) {
    1059910602/** @note Not for IOPL or IF testing. */
    1060010603#define IEM_MC_IF_EFL_BITS_NE(a_fBit1, a_fBit2)         \
    10601     if (   !!(pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBit1)) \
    10602         != !!(pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBit2)) ) {
     10604    if (   !!(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBit1)) \
     10605        != !!(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBit2)) ) {
    1060310606/** @note Not for IOPL or IF testing. */
    1060410607#define IEM_MC_IF_EFL_BITS_EQ(a_fBit1, a_fBit2)         \
    10605     if (   !!(pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBit1)) \
    10606         == !!(pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBit2)) ) {
     10608    if (   !!(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBit1)) \
     10609        == !!(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBit2)) ) {
    1060710610/** @note Not for IOPL or IF testing. */
    1060810611#define IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(a_fBit, a_fBit1, a_fBit2) \
    10609     if (   (pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBit)) \
    10610         ||    !!(pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBit1)) \
    10611            != !!(pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBit2)) ) {
     10612    if (   (pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBit)) \
     10613        ||    !!(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBit1)) \
     10614           != !!(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBit2)) ) {
    1061210615/** @note Not for IOPL or IF testing. */
    1061310616#define IEM_MC_IF_EFL_BIT_NOT_SET_AND_BITS_EQ(a_fBit, a_fBit1, a_fBit2) \
    10614     if (   !(pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBit)) \
    10615         &&    !!(pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBit1)) \
    10616            == !!(pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBit2)) ) {
    10617 #define IEM_MC_IF_CX_IS_NZ()                            if (pIemCpu->CTX_SUFF(pCtx)->cx != 0) {
    10618 #define IEM_MC_IF_ECX_IS_NZ()                           if (pIemCpu->CTX_SUFF(pCtx)->ecx != 0) {
    10619 #define IEM_MC_IF_RCX_IS_NZ()                           if (pIemCpu->CTX_SUFF(pCtx)->rcx != 0) {
     10617    if (   !(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBit)) \
     10618        &&    !!(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBit1)) \
     10619           == !!(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & (a_fBit2)) ) {
     10620#define IEM_MC_IF_CX_IS_NZ()                            if (pVCpu->iem.s.CTX_SUFF(pCtx)->cx != 0) {
     10621#define IEM_MC_IF_ECX_IS_NZ()                           if (pVCpu->iem.s.CTX_SUFF(pCtx)->ecx != 0) {
     10622#define IEM_MC_IF_RCX_IS_NZ()                           if (pVCpu->iem.s.CTX_SUFF(pCtx)->rcx != 0) {
    1062010623/** @note Not for IOPL or IF testing. */
    1062110624#define IEM_MC_IF_CX_IS_NZ_AND_EFL_BIT_SET(a_fBit) \
    10622         if (   pIemCpu->CTX_SUFF(pCtx)->cx != 0 \
    10623             && (pIemCpu->CTX_SUFF(pCtx)->eflags.u & a_fBit)) {
     10625        if (   pVCpu->iem.s.CTX_SUFF(pCtx)->cx != 0 \
     10626            && (pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & a_fBit)) {
    1062410627/** @note Not for IOPL or IF testing. */
    1062510628#define IEM_MC_IF_ECX_IS_NZ_AND_EFL_BIT_SET(a_fBit) \
    10626         if (   pIemCpu->CTX_SUFF(pCtx)->ecx != 0 \
    10627             && (pIemCpu->CTX_SUFF(pCtx)->eflags.u & a_fBit)) {
     10629        if (   pVCpu->iem.s.CTX_SUFF(pCtx)->ecx != 0 \
     10630            && (pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & a_fBit)) {
    1062810631/** @note Not for IOPL or IF testing. */
    1062910632#define IEM_MC_IF_RCX_IS_NZ_AND_EFL_BIT_SET(a_fBit) \
    10630         if (   pIemCpu->CTX_SUFF(pCtx)->rcx != 0 \
    10631             && (pIemCpu->CTX_SUFF(pCtx)->eflags.u & a_fBit)) {
     10633        if (   pVCpu->iem.s.CTX_SUFF(pCtx)->rcx != 0 \
     10634            && (pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & a_fBit)) {
    1063210635/** @note Not for IOPL or IF testing. */
    1063310636#define IEM_MC_IF_CX_IS_NZ_AND_EFL_BIT_NOT_SET(a_fBit) \
    10634         if (   pIemCpu->CTX_SUFF(pCtx)->cx != 0 \
    10635             && !(pIemCpu->CTX_SUFF(pCtx)->eflags.u & a_fBit)) {
     10637        if (   pVCpu->iem.s.CTX_SUFF(pCtx)->cx != 0 \
     10638            && !(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & a_fBit)) {
    1063610639/** @note Not for IOPL or IF testing. */
    1063710640#define IEM_MC_IF_ECX_IS_NZ_AND_EFL_BIT_NOT_SET(a_fBit) \
    10638         if (   pIemCpu->CTX_SUFF(pCtx)->ecx != 0 \
    10639             && !(pIemCpu->CTX_SUFF(pCtx)->eflags.u & a_fBit)) {
     10641        if (   pVCpu->iem.s.CTX_SUFF(pCtx)->ecx != 0 \
     10642            && !(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & a_fBit)) {
    1064010643/** @note Not for IOPL or IF testing. */
    1064110644#define IEM_MC_IF_RCX_IS_NZ_AND_EFL_BIT_NOT_SET(a_fBit) \
    10642         if (   pIemCpu->CTX_SUFF(pCtx)->rcx != 0 \
    10643             && !(pIemCpu->CTX_SUFF(pCtx)->eflags.u & a_fBit)) {
     10645        if (   pVCpu->iem.s.CTX_SUFF(pCtx)->rcx != 0 \
     10646            && !(pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.u & a_fBit)) {
    1064410647#define IEM_MC_IF_LOCAL_IS_Z(a_Local)                   if ((a_Local) == 0) {
    10645 #define IEM_MC_IF_GREG_BIT_SET(a_iGReg, a_iBitNo)       if (*(uint64_t *)iemGRegRef(pIemCpu, (a_iGReg)) & RT_BIT_64(a_iBitNo)) {
     10648#define IEM_MC_IF_GREG_BIT_SET(a_iGReg, a_iBitNo)       if (*(uint64_t *)iemGRegRef(pVCpu, (a_iGReg)) & RT_BIT_64(a_iBitNo)) {
    1064610649
    1064710650#define IEM_MC_IF_FPUREG_NOT_EMPTY(a_iSt) \
    10648     if (iemFpuStRegNotEmpty(pIemCpu, (a_iSt)) == VINF_SUCCESS) {
     10651    if (iemFpuStRegNotEmpty(pVCpu, (a_iSt)) == VINF_SUCCESS) {
    1064910652#define IEM_MC_IF_FPUREG_IS_EMPTY(a_iSt) \
    10650     if (iemFpuStRegNotEmpty(pIemCpu, (a_iSt)) != VINF_SUCCESS) {
     10653    if (iemFpuStRegNotEmpty(pVCpu, (a_iSt)) != VINF_SUCCESS) {
    1065110654#define IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(a_pr80Dst, a_iSt) \
    10652     if (iemFpuStRegNotEmptyRef(pIemCpu, (a_iSt), &(a_pr80Dst)) == VINF_SUCCESS) {
     10655    if (iemFpuStRegNotEmptyRef(pVCpu, (a_iSt), &(a_pr80Dst)) == VINF_SUCCESS) {
    1065310656#define IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80(a_pr80Dst0, a_iSt0, a_pr80Dst1, a_iSt1) \
    10654     if (iemFpu2StRegsNotEmptyRef(pIemCpu, (a_iSt0), &(a_pr80Dst0), (a_iSt1), &(a_pr80Dst1)) == VINF_SUCCESS) {
     10657    if (iemFpu2StRegsNotEmptyRef(pVCpu, (a_iSt0), &(a_pr80Dst0), (a_iSt1), &(a_pr80Dst1)) == VINF_SUCCESS) {
    1065510658#define IEM_MC_IF_TWO_FPUREGS_NOT_EMPTY_REF_R80_FIRST(a_pr80Dst0, a_iSt0, a_iSt1) \
    10656     if (iemFpu2StRegsNotEmptyRefFirst(pIemCpu, (a_iSt0), &(a_pr80Dst0), (a_iSt1)) == VINF_SUCCESS) {
     10659    if (iemFpu2StRegsNotEmptyRefFirst(pVCpu, (a_iSt0), &(a_pr80Dst0), (a_iSt1)) == VINF_SUCCESS) {
    1065710660#define IEM_MC_IF_FCW_IM() \
    10658     if (pIemCpu->CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.FCW & X86_FCW_IM) {
     10661    if (pVCpu->iem.s.CTX_SUFF(pCtx)->CTX_SUFF(pXState)->x87.FCW & X86_FCW_IM) {
    1065910662
    1066010663#define IEM_MC_ELSE()                                   } else {
     
    1066910672#ifdef DEBUG
    1067010673# define IEMOP_MNEMONIC(a_szMnemonic) \
    10671     Log4(("decode - %04x:%RGv %s%s [#%u]\n", pIemCpu->CTX_SUFF(pCtx)->cs.Sel, pIemCpu->CTX_SUFF(pCtx)->rip, \
    10672           pIemCpu->fPrefixes & IEM_OP_PRF_LOCK ? "lock " : "", a_szMnemonic, pIemCpu->cInstructions))
     10674    Log4(("decode - %04x:%RGv %s%s [#%u]\n", pVCpu->iem.s.CTX_SUFF(pCtx)->cs.Sel, pVCpu->iem.s.CTX_SUFF(pCtx)->rip, \
     10675          pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK ? "lock " : "", a_szMnemonic, pVCpu->iem.s.cInstructions))
    1067310676# define IEMOP_MNEMONIC2(a_szMnemonic, a_szOps) \
    10674     Log4(("decode - %04x:%RGv %s%s %s [#%u]\n", pIemCpu->CTX_SUFF(pCtx)->cs.Sel, pIemCpu->CTX_SUFF(pCtx)->rip, \
    10675           pIemCpu->fPrefixes & IEM_OP_PRF_LOCK ? "lock " : "", a_szMnemonic, a_szOps, pIemCpu->cInstructions))
     10677    Log4(("decode - %04x:%RGv %s%s %s [#%u]\n", pVCpu->iem.s.CTX_SUFF(pCtx)->cs.Sel, pVCpu->iem.s.CTX_SUFF(pCtx)->rip, \
     10678          pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK ? "lock " : "", a_szMnemonic, a_szOps, pVCpu->iem.s.cInstructions))
    1067610679#else
    1067710680# define IEMOP_MNEMONIC(a_szMnemonic) do { } while (0)
     
    1068910692# define IEMOP_HLP_MIN_CPU(a_uMinCpu, a_fOnlyIf) \
    1069010693    do { \
    10691         if (IEM_GET_TARGET_CPU(pIemCpu) >= (a_uMinCpu) || !(a_fOnlyIf)) { } \
     10694        if (IEM_GET_TARGET_CPU(pVCpu) >= (a_uMinCpu) || !(a_fOnlyIf)) { } \
    1069210695        else \
    1069310696        { \
    10694             DBGFSTOP(IEMCPU_TO_VM(pIemCpu)); \
     10697            DBGFSTOP(pVCpu->CTX_SUFF(pVM)); \
    1069510698            return IEMOP_RAISE_INVALID_OPCODE(); \
    1069610699        } \
     
    1069910702# define IEMOP_HLP_MIN_CPU(a_uMinCpu, a_fOnlyIf) \
    1070010703    do { \
    10701         if (IEM_GET_TARGET_CPU(pIemCpu) >= (a_uMinCpu) || !(a_fOnlyIf)) { } \
     10704        if (IEM_GET_TARGET_CPU(pVCpu) >= (a_uMinCpu) || !(a_fOnlyIf)) { } \
    1070210705        else return IEMOP_RAISE_INVALID_OPCODE(); \
    1070310706    } while (0)
     
    1075810761    do \
    1075910762    { \
    10760         if (IEM_IS_REAL_OR_V86_MODE(pIemCpu)) \
     10763        if (IEM_IS_REAL_OR_V86_MODE(pVCpu)) \
    1076110764            return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
    1076210765    } while (0)
     
    1076810771    do \
    1076910772    { \
    10770         if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK) \
     10773        if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK) \
    1077110774            return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
    1077210775    } while (0)
     
    1077710780    do \
    1077810781    { \
    10779         if (pIemCpu->enmCpuMode == IEMMODE_64BIT) \
     10782        if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT) \
    1078010783            return IEMOP_RAISE_INVALID_OPCODE(); \
    1078110784    } while (0)
     
    1078610789    do \
    1078710790    { \
    10788         if (pIemCpu->enmCpuMode != IEMMODE_64BIT) \
     10791        if (pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT) \
    1078910792            return IEMOP_RAISE_INVALID_OPCODE(); \
    1079010793    } while (0)
     
    1079410797    do \
    1079510798    { \
    10796         if (pIemCpu->enmCpuMode == IEMMODE_64BIT) \
    10797             iemRecalEffOpSize64Default(pIemCpu); \
     10799        if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT) \
     10800            iemRecalEffOpSize64Default(pVCpu); \
    1079810801    } while (0)
    1079910802
     
    1080210805    do \
    1080310806    { \
    10804         if (pIemCpu->enmCpuMode == IEMMODE_64BIT) \
    10805             pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_64BIT; \
     10807        if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT) \
     10808            pVCpu->iem.s.enmEffOpSize = pVCpu->iem.s.enmDefOpSize = IEMMODE_64BIT; \
    1080610809    } while (0)
    1080710810
     
    1081110814    do \
    1081210815    { \
    10813         if (RT_UNLIKELY(pIemCpu->fPrefixes & IEM_OP_PRF_REX)) \
     10816        if (RT_UNLIKELY(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REX)) \
    1081410817        { \
    1081510818            Log5((a_szPrf ": Overriding REX prefix at %RX16! fPrefixes=%#x\n", \
    10816                   pIemCpu->CTX_SUFF(pCtx)->rip, pIemCpu->fPrefixes)); \
    10817             pIemCpu->fPrefixes &= ~IEM_OP_PRF_REX_MASK; \
    10818             pIemCpu->uRexB     = 0; \
    10819             pIemCpu->uRexIndex = 0; \
    10820             pIemCpu->uRexReg   = 0; \
    10821             iemRecalEffOpSize(pIemCpu); \
     10819                  pVCpu->iem.s.CTX_SUFF(pCtx)->rip, pVCpu->iem.s.fPrefixes)); \
     10820            pVCpu->iem.s.fPrefixes &= ~IEM_OP_PRF_REX_MASK; \
     10821            pVCpu->iem.s.uRexB     = 0; \
     10822            pVCpu->iem.s.uRexIndex = 0; \
     10823            pVCpu->iem.s.uRexReg   = 0; \
     10824            iemRecalEffOpSize(pVCpu); \
    1082210825        } \
    1082310826    } while (0)
     
    1083810841    do \
    1083910842    { \
    10840         if (RT_LIKELY(!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))) \
     10843        if (RT_LIKELY(!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))) \
    1084110844        { /* likely */ } \
    1084210845        else \
     
    1084610849    do \
    1084710850    { \
    10848         if (RT_LIKELY(!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))) \
     10851        if (RT_LIKELY(!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))) \
    1084910852        { /* likely */ } \
    1085010853        else \
     
    1085710860    do \
    1085810861    { \
    10859         if (RT_LIKELY(!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))) \
     10862        if (RT_LIKELY(!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))) \
    1086010863        { /* likely */ } \
    1086110864        else \
     
    1087210875    do \
    1087310876    { \
    10874         if (RT_LIKELY(!(pIemCpu->fPrefixes & (IEM_OP_PRF_LOCK | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ)))) \
     10877        if (RT_LIKELY(!(pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_LOCK | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ)))) \
    1087510878        { /* likely */ } \
    1087610879        else \
     
    1088510888 *
    1088610889 * @return  Strict VBox status code.
    10887  * @param   pIemCpu             The IEM per CPU data.
     10890 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    1088810891 * @param   bRm                 The ModRM byte.
    1088910892 * @param   cbImm               The size of any immediate following the
     
    1089210895 * @param   pGCPtrEff           Where to return the effective address.
    1089310896 */
    10894 IEM_STATIC VBOXSTRICTRC iemOpHlpCalcRmEffAddr(PIEMCPU pIemCpu, uint8_t bRm, uint8_t cbImm, PRTGCPTR pGCPtrEff)
     10897IEM_STATIC VBOXSTRICTRC iemOpHlpCalcRmEffAddr(PVMCPU pVCpu, uint8_t bRm, uint8_t cbImm, PRTGCPTR pGCPtrEff)
    1089510898{
    1089610899    Log5(("iemOpHlpCalcRmEffAddr: bRm=%#x\n", bRm));
    10897     PCCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     10900    PCCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    1089810901# define SET_SS_DEF() \
    1089910902    do \
    1090010903    { \
    10901         if (!(pIemCpu->fPrefixes & IEM_OP_PRF_SEG_MASK)) \
    10902             pIemCpu->iEffSeg = X86_SREG_SS; \
     10904        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SEG_MASK)) \
     10905            pVCpu->iem.s.iEffSeg = X86_SREG_SS; \
    1090310906    } while (0)
    1090410907
    10905     if (pIemCpu->enmCpuMode != IEMMODE_64BIT)
     10908    if (pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT)
    1090610909    {
    1090710910/** @todo Check the effective address size crap! */
    10908         if (pIemCpu->enmEffAddrMode == IEMMODE_16BIT)
     10911        if (pVCpu->iem.s.enmEffAddrMode == IEMMODE_16BIT)
    1090910912        {
    1091010913            uint16_t u16EffAddr;
     
    1094210945        else
    1094310946        {
    10944             Assert(pIemCpu->enmEffAddrMode == IEMMODE_32BIT);
     10947            Assert(pVCpu->iem.s.enmEffAddrMode == IEMMODE_32BIT);
    1094510948            uint32_t u32EffAddr;
    1094610949
     
    1103111034
    1103211035            }
    11033             if (pIemCpu->enmEffAddrMode == IEMMODE_32BIT)
     11036            if (pVCpu->iem.s.enmEffAddrMode == IEMMODE_32BIT)
    1103411037                *pGCPtrEff = u32EffAddr;
    1103511038            else
    1103611039            {
    11037                 Assert(pIemCpu->enmEffAddrMode == IEMMODE_16BIT);
     11040                Assert(pVCpu->iem.s.enmEffAddrMode == IEMMODE_16BIT);
    1103811041                *pGCPtrEff = u32EffAddr & UINT16_MAX;
    1103911042            }
     
    1104811051        {
    1104911052            IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64EffAddr);
    11050             u64EffAddr += pCtx->rip + pIemCpu->offOpcode + cbImm;
     11053            u64EffAddr += pCtx->rip + pVCpu->iem.s.offOpcode + cbImm;
    1105111054        }
    1105211055        else
    1105311056        {
    1105411057            /* Get the register (or SIB) value. */
    11055             switch ((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB)
     11058            switch ((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB)
    1105611059            {
    1105711060                case  0: u64EffAddr = pCtx->rax; break;
     
    1107611079
    1107711080                    /* Get the index and scale it. */
    11078                     switch (((bSib >> X86_SIB_INDEX_SHIFT) & X86_SIB_INDEX_SMASK) | pIemCpu->uRexIndex)
     11081                    switch (((bSib >> X86_SIB_INDEX_SHIFT) & X86_SIB_INDEX_SMASK) | pVCpu->iem.s.uRexIndex)
    1107911082                    {
    1108011083                        case  0: u64EffAddr = pCtx->rax; break;
     
    1109911102
    1110011103                    /* add base */
    11101                     switch ((bSib & X86_SIB_BASE_MASK) | pIemCpu->uRexB)
     11104                    switch ((bSib & X86_SIB_BASE_MASK) | pVCpu->iem.s.uRexB)
    1110211105                    {
    1110311106                        case  0: u64EffAddr += pCtx->rax; break;
     
    1112011123                            if ((bRm & X86_MODRM_MOD_MASK) != 0)
    1112111124                            {
    11122                                 if (!pIemCpu->uRexB)
     11125                                if (!pVCpu->iem.s.uRexB)
    1112311126                                {
    1112411127                                    u64EffAddr += pCtx->rbp;
     
    1116611169        }
    1116711170
    11168         if (pIemCpu->enmEffAddrMode == IEMMODE_64BIT)
     11171        if (pVCpu->iem.s.enmEffAddrMode == IEMMODE_64BIT)
    1116911172            *pGCPtrEff = u64EffAddr;
    1117011173        else
    1117111174        {
    11172             Assert(pIemCpu->enmEffAddrMode == IEMMODE_32BIT);
     11175            Assert(pVCpu->iem.s.enmEffAddrMode == IEMMODE_32BIT);
    1117311176            *pGCPtrEff = u64EffAddr & UINT32_MAX;
    1117411177        }
     
    1118911192 *
    1119011193 * @return  The effective address.
    11191  * @param   pIemCpu             The IEM per CPU data.
     11194 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    1119211195 * @param   bRm                 The ModRM byte.
    1119311196 * @param   cbImm               The size of any immediate following the
     
    1119511198 *                              RIP relative addressing.
    1119611199 */
    11197 IEM_STATIC RTGCPTR iemOpHlpCalcRmEffAddrJmp(PIEMCPU pIemCpu, uint8_t bRm, uint8_t cbImm)
     11200IEM_STATIC RTGCPTR iemOpHlpCalcRmEffAddrJmp(PVMCPU pVCpu, uint8_t bRm, uint8_t cbImm)
    1119811201{
    1119911202    Log5(("iemOpHlpCalcRmEffAddrJmp: bRm=%#x\n", bRm));
    11200     PCCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     11203    PCCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    1120111204# define SET_SS_DEF() \
    1120211205    do \
    1120311206    { \
    11204         if (!(pIemCpu->fPrefixes & IEM_OP_PRF_SEG_MASK)) \
    11205             pIemCpu->iEffSeg = X86_SREG_SS; \
     11207        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SEG_MASK)) \
     11208            pVCpu->iem.s.iEffSeg = X86_SREG_SS; \
    1120611209    } while (0)
    1120711210
    11208     if (pIemCpu->enmCpuMode != IEMMODE_64BIT)
     11211    if (pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT)
    1120911212    {
    1121011213/** @todo Check the effective address size crap! */
    11211         if (pIemCpu->enmEffAddrMode == IEMMODE_16BIT)
     11214        if (pVCpu->iem.s.enmEffAddrMode == IEMMODE_16BIT)
    1121211215        {
    1121311216            uint16_t u16EffAddr;
     
    1122411227                    case 1:  IEM_OPCODE_GET_NEXT_S8_SX_U16(&u16EffAddr); break;
    1122511228                    case 2:  IEM_OPCODE_GET_NEXT_U16(&u16EffAddr);       break;
    11226                     default: AssertFailedStmt(longjmp(*pIemCpu->CTX_SUFF(pJmpBuf), VERR_IEM_IPE_1)); /* (caller checked for these) */
     11229                    default: AssertFailedStmt(longjmp(*pVCpu->iem.s.CTX_SUFF(pJmpBuf), VERR_IEM_IPE_1)); /* (caller checked for these) */
    1122711230                }
    1122811231
     
    1124511248        }
    1124611249
    11247         Assert(pIemCpu->enmEffAddrMode == IEMMODE_32BIT);
     11250        Assert(pVCpu->iem.s.enmEffAddrMode == IEMMODE_32BIT);
    1124811251        uint32_t u32EffAddr;
    1124911252
     
    1133411337        }
    1133511338
    11336         if (pIemCpu->enmEffAddrMode == IEMMODE_32BIT)
     11339        if (pVCpu->iem.s.enmEffAddrMode == IEMMODE_32BIT)
    1133711340        {
    1133811341            Log5(("iemOpHlpCalcRmEffAddrJmp: EffAddr=%#010RX32\n", u32EffAddr));
    1133911342            return u32EffAddr;
    1134011343        }
    11341         Assert(pIemCpu->enmEffAddrMode == IEMMODE_16BIT);
     11344        Assert(pVCpu->iem.s.enmEffAddrMode == IEMMODE_16BIT);
    1134211345        Log5(("iemOpHlpCalcRmEffAddrJmp: EffAddr=%#06RX32\n", u32EffAddr & UINT16_MAX));
    1134311346        return u32EffAddr & UINT16_MAX;
     
    1135011353    {
    1135111354        IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64EffAddr);
    11352         u64EffAddr += pCtx->rip + pIemCpu->offOpcode + cbImm;
     11355        u64EffAddr += pCtx->rip + pVCpu->iem.s.offOpcode + cbImm;
    1135311356    }
    1135411357    else
    1135511358    {
    1135611359        /* Get the register (or SIB) value. */
    11357         switch ((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB)
     11360        switch ((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB)
    1135811361        {
    1135911362            case  0: u64EffAddr = pCtx->rax; break;
     
    1137811381
    1137911382                /* Get the index and scale it. */
    11380                 switch (((bSib >> X86_SIB_INDEX_SHIFT) & X86_SIB_INDEX_SMASK) | pIemCpu->uRexIndex)
     11383                switch (((bSib >> X86_SIB_INDEX_SHIFT) & X86_SIB_INDEX_SMASK) | pVCpu->iem.s.uRexIndex)
    1138111384                {
    1138211385                    case  0: u64EffAddr = pCtx->rax; break;
     
    1140111404
    1140211405                /* add base */
    11403                 switch ((bSib & X86_SIB_BASE_MASK) | pIemCpu->uRexB)
     11406                switch ((bSib & X86_SIB_BASE_MASK) | pVCpu->iem.s.uRexB)
    1140411407                {
    1140511408                    case  0: u64EffAddr += pCtx->rax; break;
     
    1142211425                        if ((bRm & X86_MODRM_MOD_MASK) != 0)
    1142311426                        {
    11424                             if (!pIemCpu->uRexB)
     11427                            if (!pVCpu->iem.s.uRexB)
    1142511428                            {
    1142611429                                u64EffAddr += pCtx->rbp;
     
    1146811471    }
    1146911472
    11470     if (pIemCpu->enmEffAddrMode == IEMMODE_64BIT)
     11473    if (pVCpu->iem.s.enmEffAddrMode == IEMMODE_64BIT)
    1147111474    {
    1147211475        Log5(("iemOpHlpCalcRmEffAddrJmp: EffAddr=%#010RGv\n", u64EffAddr));
    1147311476        return u64EffAddr;
    1147411477    }
    11475     Assert(pIemCpu->enmEffAddrMode == IEMMODE_32BIT);
     11478    Assert(pVCpu->iem.s.enmEffAddrMode == IEMMODE_32BIT);
    1147611479    Log5(("iemOpHlpCalcRmEffAddrJmp: EffAddr=%#010RGv\n", u64EffAddr & UINT32_MAX));
    1147711480    return u64EffAddr & UINT32_MAX;
     
    1149711500 * Sets up execution verification mode.
    1149811501 */
    11499 IEM_STATIC void iemExecVerificationModeSetup(PIEMCPU pIemCpu)
    11500 {
    11501     PVMCPU   pVCpu   = IEMCPU_TO_VMCPU(pIemCpu);
    11502     PCPUMCTX pOrgCtx = pIemCpu->CTX_SUFF(pCtx);
     11502IEM_STATIC void iemExecVerificationModeSetup(PVMCPU pVCpu)
     11503{
     11504    PVMCPU   pVCpu   = pVCpu;
     11505    PCPUMCTX pOrgCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    1150311506
    1150411507    /*
    1150511508     * Always note down the address of the current instruction.
    1150611509     */
    11507     pIemCpu->uOldCs  = pOrgCtx->cs.Sel;
    11508     pIemCpu->uOldRip = pOrgCtx->rip;
     11510    pVCpu->iem.s.uOldCs  = pOrgCtx->cs.Sel;
     11511    pVCpu->iem.s.uOldRip = pOrgCtx->rip;
    1150911512
    1151011513    /*
     
    1159311596        fNewNoRem = false;
    1159411597    }
    11595     if (fNewNoRem != pIemCpu->fNoRem)
    11596     {
    11597         pIemCpu->fNoRem = fNewNoRem;
     11598    if (fNewNoRem != pVCpu->iem.s.fNoRem)
     11599    {
     11600        pVCpu->iem.s.fNoRem = fNewNoRem;
    1159811601        if (!fNewNoRem)
    1159911602        {
     
    1160811611     * Switch state.
    1160911612     */
    11610     if (IEM_VERIFICATION_ENABLED(pIemCpu))
     11613    if (IEM_VERIFICATION_ENABLED(pVCpu))
    1161111614    {
    1161211615        static CPUMCTX  s_DebugCtx; /* Ugly! */
    1161311616
    1161411617        s_DebugCtx = *pOrgCtx;
    11615         pIemCpu->CTX_SUFF(pCtx) = &s_DebugCtx;
     11618        pVCpu->iem.s.CTX_SUFF(pCtx) = &s_DebugCtx;
    1161611619    }
    1161711620
     
    1161911622     * See if there is an interrupt pending in TRPM and inject it if we can.
    1162011623     */
    11621     pIemCpu->uInjectCpl = UINT8_MAX;
     11624    pVCpu->iem.s.uInjectCpl = UINT8_MAX;
    1162211625    if (   pOrgCtx->eflags.Bits.u1IF
    1162311626        && TRPMHasTrap(pVCpu)
     
    1163011633        int rc2 = TRPMQueryTrapAll(pVCpu, &u8TrapNo, &enmType, &uErrCode, &uCr2, NULL /* pu8InstLen */); AssertRC(rc2);
    1163111634        IEMInjectTrap(pVCpu, u8TrapNo, enmType, (uint16_t)uErrCode, uCr2, 0 /* cbInstr */);
    11632         if (!IEM_VERIFICATION_ENABLED(pIemCpu))
     11635        if (!IEM_VERIFICATION_ENABLED(pVCpu))
    1163311636            TRPMResetTrap(pVCpu);
    11634         pIemCpu->uInjectCpl = pIemCpu->uCpl;
     11637        pVCpu->iem.s.uInjectCpl = pVCpu->iem.s.uCpl;
    1163511638    }
    1163611639
     
    1163811641     * Reset the counters.
    1163911642     */
    11640     pIemCpu->cIOReads    = 0;
    11641     pIemCpu->cIOWrites   = 0;
    11642     pIemCpu->fIgnoreRaxRdx = false;
    11643     pIemCpu->fOverlappingMovs = false;
    11644     pIemCpu->fProblematicMemory = false;
    11645     pIemCpu->fUndefinedEFlags = 0;
    11646 
    11647     if (IEM_VERIFICATION_ENABLED(pIemCpu))
     11643    pVCpu->iem.s.cIOReads    = 0;
     11644    pVCpu->iem.s.cIOWrites   = 0;
     11645    pVCpu->iem.s.fIgnoreRaxRdx = false;
     11646    pVCpu->iem.s.fOverlappingMovs = false;
     11647    pVCpu->iem.s.fProblematicMemory = false;
     11648    pVCpu->iem.s.fUndefinedEFlags = 0;
     11649
     11650    if (IEM_VERIFICATION_ENABLED(pVCpu))
    1164811651    {
    1164911652        /*
    1165011653         * Free all verification records.
    1165111654         */
    11652         PIEMVERIFYEVTREC pEvtRec = pIemCpu->pIemEvtRecHead;
    11653         pIemCpu->pIemEvtRecHead = NULL;
    11654         pIemCpu->ppIemEvtRecNext = &pIemCpu->pIemEvtRecHead;
     11655        PIEMVERIFYEVTREC pEvtRec = pVCpu->iem.s.pIemEvtRecHead;
     11656        pVCpu->iem.s.pIemEvtRecHead = NULL;
     11657        pVCpu->iem.s.ppIemEvtRecNext = &pVCpu->iem.s.pIemEvtRecHead;
    1165511658        do
    1165611659        {
     
    1165811661            {
    1165911662                PIEMVERIFYEVTREC pNext = pEvtRec->pNext;
    11660                 pEvtRec->pNext = pIemCpu->pFreeEvtRec;
    11661                 pIemCpu->pFreeEvtRec = pEvtRec;
     11663                pEvtRec->pNext = pVCpu->iem.s.pFreeEvtRec;
     11664                pVCpu->iem.s.pFreeEvtRec = pEvtRec;
    1166211665                pEvtRec = pNext;
    1166311666            }
    11664             pEvtRec = pIemCpu->pOtherEvtRecHead;
    11665             pIemCpu->pOtherEvtRecHead = NULL;
    11666             pIemCpu->ppOtherEvtRecNext = &pIemCpu->pOtherEvtRecHead;
     11667            pEvtRec = pVCpu->iem.s.pOtherEvtRecHead;
     11668            pVCpu->iem.s.pOtherEvtRecHead = NULL;
     11669            pVCpu->iem.s.ppOtherEvtRecNext = &pVCpu->iem.s.pOtherEvtRecHead;
    1166711670        } while (pEvtRec);
    1166811671    }
     
    1167411677 * @returns Pointer to a record.
    1167511678 */
    11676 IEM_STATIC PIEMVERIFYEVTREC iemVerifyAllocRecord(PIEMCPU pIemCpu)
    11677 {
    11678     if (!IEM_VERIFICATION_ENABLED(pIemCpu))
     11679IEM_STATIC PIEMVERIFYEVTREC iemVerifyAllocRecord(PVMCPU pVCpu)
     11680{
     11681    if (!IEM_VERIFICATION_ENABLED(pVCpu))
    1167911682        return NULL;
    1168011683
    11681     PIEMVERIFYEVTREC pEvtRec = pIemCpu->pFreeEvtRec;
     11684    PIEMVERIFYEVTREC pEvtRec = pVCpu->iem.s.pFreeEvtRec;
    1168211685    if (pEvtRec)
    11683         pIemCpu->pFreeEvtRec = pEvtRec->pNext;
     11686        pVCpu->iem.s.pFreeEvtRec = pEvtRec->pNext;
    1168411687    else
    1168511688    {
    11686         if (!pIemCpu->ppIemEvtRecNext)
     11689        if (!pVCpu->iem.s.ppIemEvtRecNext)
    1168711690            return NULL; /* Too early (fake PCIBIOS), ignore notification. */
    1168811691
    11689         pEvtRec = (PIEMVERIFYEVTREC)MMR3HeapAlloc(IEMCPU_TO_VM(pIemCpu), MM_TAG_EM /* lazy bird*/, sizeof(*pEvtRec));
     11692        pEvtRec = (PIEMVERIFYEVTREC)MMR3HeapAlloc(pVCpu->CTX_SUFF(pVM), MM_TAG_EM /* lazy bird*/, sizeof(*pEvtRec));
    1169011693        if (!pEvtRec)
    1169111694            return NULL;
     
    1170511708    if (!pVCpu)
    1170611709        return;
    11707     PIEMCPU             pIemCpu = &pVCpu->iem.s;
    11708     PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pIemCpu);
     11710    PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pVCpu);
    1170911711    if (!pEvtRec)
    1171011712        return;
     
    1171211714    pEvtRec->u.RamRead.GCPhys  = GCPhys;
    1171311715    pEvtRec->u.RamRead.cb      = (uint32_t)cbValue;
    11714     pEvtRec->pNext = *pIemCpu->ppOtherEvtRecNext;
    11715     *pIemCpu->ppOtherEvtRecNext = pEvtRec;
     11716    pEvtRec->pNext = *pVCpu->iem.s.ppOtherEvtRecNext;
     11717    *pVCpu->iem.s.ppOtherEvtRecNext = pEvtRec;
    1171611718}
    1171711719
     
    1172511727    if (!pVCpu)
    1172611728        return;
    11727     PIEMCPU             pIemCpu = &pVCpu->iem.s;
    11728     PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pIemCpu);
     11729    PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pVCpu);
    1172911730    if (!pEvtRec)
    1173011731        return;
     
    1173611737    pEvtRec->u.RamWrite.ab[2]    = RT_BYTE3(u32Value);
    1173711738    pEvtRec->u.RamWrite.ab[3]    = RT_BYTE4(u32Value);
    11738     pEvtRec->pNext = *pIemCpu->ppOtherEvtRecNext;
    11739     *pIemCpu->ppOtherEvtRecNext = pEvtRec;
     11739    pEvtRec->pNext = *pVCpu->iem.s.ppOtherEvtRecNext;
     11740    *pVCpu->iem.s.ppOtherEvtRecNext = pEvtRec;
    1174011741}
    1174111742
     
    1174911750    if (!pVCpu)
    1175011751        return;
    11751     PIEMCPU             pIemCpu = &pVCpu->iem.s;
    11752     PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pIemCpu);
     11752    PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pVCpu);
    1175311753    if (!pEvtRec)
    1175411754        return;
     
    1175611756    pEvtRec->u.IOPortRead.Port    = Port;
    1175711757    pEvtRec->u.IOPortRead.cbValue = (uint8_t)cbValue;
    11758     pEvtRec->pNext = *pIemCpu->ppOtherEvtRecNext;
    11759     *pIemCpu->ppOtherEvtRecNext = pEvtRec;
     11758    pEvtRec->pNext = *pVCpu->iem.s.ppOtherEvtRecNext;
     11759    *pVCpu->iem.s.ppOtherEvtRecNext = pEvtRec;
    1176011760}
    1176111761
     
    1176811768    if (!pVCpu)
    1176911769        return;
    11770     PIEMCPU             pIemCpu = &pVCpu->iem.s;
    11771     PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pIemCpu);
     11770    PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pVCpu);
    1177211771    if (!pEvtRec)
    1177311772        return;
     
    1177611775    pEvtRec->u.IOPortWrite.cbValue  = (uint8_t)cbValue;
    1177711776    pEvtRec->u.IOPortWrite.u32Value = u32Value;
    11778     pEvtRec->pNext = *pIemCpu->ppOtherEvtRecNext;
    11779     *pIemCpu->ppOtherEvtRecNext = pEvtRec;
     11777    pEvtRec->pNext = *pVCpu->iem.s.ppOtherEvtRecNext;
     11778    *pVCpu->iem.s.ppOtherEvtRecNext = pEvtRec;
    1178011779}
    1178111780
     
    1178611785    if (!pVCpu)
    1178711786        return;
    11788     PIEMCPU             pIemCpu = &pVCpu->iem.s;
    11789     PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pIemCpu);
     11787    PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pVCpu);
    1179011788    if (!pEvtRec)
    1179111789        return;
     
    1179411792    pEvtRec->u.IOPortStrRead.cbValue    = (uint8_t)cbValue;
    1179511793    pEvtRec->u.IOPortStrRead.cTransfers = cTransfers;
    11796     pEvtRec->pNext = *pIemCpu->ppOtherEvtRecNext;
    11797     *pIemCpu->ppOtherEvtRecNext = pEvtRec;
     11794    pEvtRec->pNext = *pVCpu->iem.s.ppOtherEvtRecNext;
     11795    *pVCpu->iem.s.ppOtherEvtRecNext = pEvtRec;
    1179811796}
    1179911797
     
    1180411802    if (!pVCpu)
    1180511803        return;
    11806     PIEMCPU             pIemCpu = &pVCpu->iem.s;
    11807     PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pIemCpu);
     11804    PIEMVERIFYEVTREC    pEvtRec = iemVerifyAllocRecord(pVCpu);
    1180811805    if (!pEvtRec)
    1180911806        return;
     
    1181211809    pEvtRec->u.IOPortStrWrite.cbValue    = (uint8_t)cbValue;
    1181311810    pEvtRec->u.IOPortStrWrite.cTransfers = cTransfers;
    11814     pEvtRec->pNext = *pIemCpu->ppOtherEvtRecNext;
    11815     *pIemCpu->ppOtherEvtRecNext = pEvtRec;
     11811    pEvtRec->pNext = *pVCpu->iem.s.ppOtherEvtRecNext;
     11812    *pVCpu->iem.s.ppOtherEvtRecNext = pEvtRec;
    1181611813}
    1181711814
     
    1182111818 *
    1182211819 * @returns VINF_SUCCESS.
    11823  * @param   pIemCpu             The IEM per CPU data.
     11820 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    1182411821 * @param   Port                The I/O port.
    1182511822 * @param   pu32Value           Where to store the fake value.
    1182611823 * @param   cbValue             The size of the access.
    1182711824 */
    11828 IEM_STATIC VBOXSTRICTRC iemVerifyFakeIOPortRead(PIEMCPU pIemCpu, RTIOPORT Port, uint32_t *pu32Value, size_t cbValue)
    11829 {
    11830     PIEMVERIFYEVTREC pEvtRec = iemVerifyAllocRecord(pIemCpu);
     11825IEM_STATIC VBOXSTRICTRC iemVerifyFakeIOPortRead(PVMCPU pVCpu, RTIOPORT Port, uint32_t *pu32Value, size_t cbValue)
     11826{
     11827    PIEMVERIFYEVTREC pEvtRec = iemVerifyAllocRecord(pVCpu);
    1183111828    if (pEvtRec)
    1183211829    {
     
    1183411831        pEvtRec->u.IOPortRead.Port    = Port;
    1183511832        pEvtRec->u.IOPortRead.cbValue = (uint8_t)cbValue;
    11836         pEvtRec->pNext = *pIemCpu->ppIemEvtRecNext;
    11837         *pIemCpu->ppIemEvtRecNext = pEvtRec;
    11838     }
    11839     pIemCpu->cIOReads++;
     11833        pEvtRec->pNext = *pVCpu->iem.s.ppIemEvtRecNext;
     11834        *pVCpu->iem.s.ppIemEvtRecNext = pEvtRec;
     11835    }
     11836    pVCpu->iem.s.cIOReads++;
    1184011837    *pu32Value = 0xcccccccc;
    1184111838    return VINF_SUCCESS;
     
    1184711844 *
    1184811845 * @returns VINF_SUCCESS.
    11849  * @param   pIemCpu             The IEM per CPU data.
     11846 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    1185011847 * @param   Port                The I/O port.
    1185111848 * @param   u32Value            The value being written.
    1185211849 * @param   cbValue             The size of the access.
    1185311850 */
    11854 IEM_STATIC VBOXSTRICTRC iemVerifyFakeIOPortWrite(PIEMCPU pIemCpu, RTIOPORT Port, uint32_t u32Value, size_t cbValue)
    11855 {
    11856     PIEMVERIFYEVTREC pEvtRec = iemVerifyAllocRecord(pIemCpu);
     11851IEM_STATIC VBOXSTRICTRC iemVerifyFakeIOPortWrite(PVMCPU pVCpu, RTIOPORT Port, uint32_t u32Value, size_t cbValue)
     11852{
     11853    PIEMVERIFYEVTREC pEvtRec = iemVerifyAllocRecord(pVCpu);
    1185711854    if (pEvtRec)
    1185811855    {
     
    1186111858        pEvtRec->u.IOPortWrite.cbValue  = (uint8_t)cbValue;
    1186211859        pEvtRec->u.IOPortWrite.u32Value = u32Value;
    11863         pEvtRec->pNext = *pIemCpu->ppIemEvtRecNext;
    11864         *pIemCpu->ppIemEvtRecNext = pEvtRec;
    11865     }
    11866     pIemCpu->cIOWrites++;
     11860        pEvtRec->pNext = *pVCpu->iem.s.ppIemEvtRecNext;
     11861        *pVCpu->iem.s.ppIemEvtRecNext = pEvtRec;
     11862    }
     11863    pVCpu->iem.s.cIOWrites++;
    1186711864    return VINF_SUCCESS;
    1186811865}
     
    1187111868/**
    1187211869 * Used to add extra details about a stub case.
    11873  * @param   pIemCpu     The IEM per CPU state.
    11874  */
    11875 IEM_STATIC void iemVerifyAssertMsg2(PIEMCPU pIemCpu)
    11876 {
    11877     PCPUMCTX pCtx  = pIemCpu->CTX_SUFF(pCtx);
    11878     PVM      pVM   = IEMCPU_TO_VM(pIemCpu);
    11879     PVMCPU   pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
     11870 * @param   pVCpu       The cross context virtual CPU structure of the calling thread.
     11871 */
     11872IEM_STATIC void iemVerifyAssertMsg2(PVMCPU pVCpu)
     11873{
     11874    PCPUMCTX pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
     11875    PVM      pVM   = pVCpu->CTX_SUFF(pVM);
     11876    PVMCPU   pVCpu = pVCpu;
    1188011877    char szRegs[4096];
    1188111878    DBGFR3RegPrintf(pVM->pUVM, pVCpu->idCpu, &szRegs[0], sizeof(szRegs),
     
    1190711904
    1190811905    char szInstr1[256];
    11909     DBGFR3DisasInstrEx(pVM->pUVM, pVCpu->idCpu, pIemCpu->uOldCs, pIemCpu->uOldRip,
     11906    DBGFR3DisasInstrEx(pVM->pUVM, pVCpu->idCpu, pVCpu->iem.s.uOldCs, pVCpu->iem.s.uOldRip,
    1191011907                       DBGF_DISAS_FLAGS_DEFAULT_MODE,
    1191111908                       szInstr1, sizeof(szInstr1), NULL);
     
    1197511972 * a record dump attached.
    1197611973 *
    11977  * @param   pIemCpu         The IEM per CPU data.
     11974 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    1197811975 * @param   pEvtRec1        The first record.
    1197911976 * @param   pEvtRec2        The second record.
    1198011977 * @param   pszMsg          The message explaining why we're asserting.
    1198111978 */
    11982 IEM_STATIC void iemVerifyAssertRecords(PIEMCPU pIemCpu, PIEMVERIFYEVTREC pEvtRec1, PIEMVERIFYEVTREC pEvtRec2, const char *pszMsg)
     11979IEM_STATIC void iemVerifyAssertRecords(PVMCPU pVCpu, PIEMVERIFYEVTREC pEvtRec1, PIEMVERIFYEVTREC pEvtRec2, const char *pszMsg)
    1198311980{
    1198411981    RTAssertMsg1(pszMsg, __LINE__, __FILE__, __PRETTY_FUNCTION__);
    1198511982    iemVerifyAssertAddRecordDump(pEvtRec1);
    1198611983    iemVerifyAssertAddRecordDump(pEvtRec2);
    11987     iemVerifyAssertMsg2(pIemCpu);
     11984    iemVerifyAssertMsg2(pVCpu);
    1198811985    RTAssertPanic();
    1198911986}
     
    1199411991 * a record dump attached.
    1199511992 *
    11996  * @param   pIemCpu         The IEM per CPU data.
     11993 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    1199711994 * @param   pEvtRec1        The first record.
    1199811995 * @param   pszMsg          The message explaining why we're asserting.
    1199911996 */
    12000 IEM_STATIC void iemVerifyAssertRecord(PIEMCPU pIemCpu, PIEMVERIFYEVTREC pEvtRec, const char *pszMsg)
     11997IEM_STATIC void iemVerifyAssertRecord(PVMCPU pVCpu, PIEMVERIFYEVTREC pEvtRec, const char *pszMsg)
    1200111998{
    1200211999    RTAssertMsg1(pszMsg, __LINE__, __FILE__, __PRETTY_FUNCTION__);
    1200312000    iemVerifyAssertAddRecordDump(pEvtRec);
    12004     iemVerifyAssertMsg2(pIemCpu);
     12001    iemVerifyAssertMsg2(pVCpu);
    1200512002    RTAssertPanic();
    1200612003}
     
    1201012007 * Verifies a write record.
    1201112008 *
    12012  * @param   pIemCpu         The IEM per CPU data.
     12009 * @param   pVCpu           The cross context virtual CPU structure of the calling thread.
    1201312010 * @param   pEvtRec         The write record.
    1201412011 * @param   fRem            Set if REM was doing the other executing. If clear
    1201512012 *                          it was HM.
    1201612013 */
    12017 IEM_STATIC void iemVerifyWriteRecord(PIEMCPU pIemCpu, PIEMVERIFYEVTREC pEvtRec, bool fRem)
     12014IEM_STATIC void iemVerifyWriteRecord(PVMCPU pVCpu, PIEMVERIFYEVTREC pEvtRec, bool fRem)
    1201812015{
    1201912016    uint8_t abBuf[sizeof(pEvtRec->u.RamWrite.ab)]; RT_ZERO(abBuf);
    1202012017    Assert(sizeof(abBuf) >= pEvtRec->u.RamWrite.cb);
    12021     int rc = PGMPhysSimpleReadGCPhys(IEMCPU_TO_VM(pIemCpu), abBuf, pEvtRec->u.RamWrite.GCPhys, pEvtRec->u.RamWrite.cb);
     12018    int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), abBuf, pEvtRec->u.RamWrite.GCPhys, pEvtRec->u.RamWrite.cb);
    1202212019    if (   RT_FAILURE(rc)
    1202312020        || memcmp(abBuf, pEvtRec->u.RamWrite.ab, pEvtRec->u.RamWrite.cb) )
    1202412021    {
    1202512022        /* fend off ins */
    12026         if (   !pIemCpu->cIOReads
     12023        if (   !pVCpu->iem.s.cIOReads
    1202712024            || pEvtRec->u.RamWrite.ab[0] != 0xcc
    1202812025            || (   pEvtRec->u.RamWrite.cb != 1
     
    1203712034                if (pEvtRec->u.RamWrite.cb != 512)
    1203812035                {
    12039                     const char *pszWho = fRem ? "rem" : HMR3IsVmxEnabled(IEMCPU_TO_VM(pIemCpu)->pUVM) ? "vmx" : "svm";
     12036                    const char *pszWho = fRem ? "rem" : HMR3IsVmxEnabled(pVCpu->CTX_SUFF(pVM)->pUVM) ? "vmx" : "svm";
    1204012037                    RTAssertMsg1(NULL, __LINE__, __FILE__, __PRETTY_FUNCTION__);
    1204112038                    RTAssertMsg2Weak("Memory at %RGv differs\n", pEvtRec->u.RamWrite.GCPhys);
     
    1204512042                                    pEvtRec->u.RamWrite.cb, pEvtRec->u.RamWrite.ab);
    1204612043                    iemVerifyAssertAddRecordDump(pEvtRec);
    12047                     iemVerifyAssertMsg2(pIemCpu);
     12044                    iemVerifyAssertMsg2(pVCpu);
    1204812045                    RTAssertPanic();
    1204912046                }
     
    1205712054 * Performs the post-execution verfication checks.
    1205812055 */
    12059 IEM_STATIC VBOXSTRICTRC iemExecVerificationModeCheck(PIEMCPU pIemCpu, VBOXSTRICTRC rcStrictIem)
    12060 {
    12061     if (!IEM_VERIFICATION_ENABLED(pIemCpu))
     12056IEM_STATIC VBOXSTRICTRC iemExecVerificationModeCheck(PVMCPU pVCpu, VBOXSTRICTRC rcStrictIem)
     12057{
     12058    if (!IEM_VERIFICATION_ENABLED(pVCpu))
    1206212059        return rcStrictIem;
    1206312060
     
    1206512062     * Switch back the state.
    1206612063     */
    12067     PCPUMCTX    pOrgCtx   = CPUMQueryGuestCtxPtr(IEMCPU_TO_VMCPU(pIemCpu));
    12068     PCPUMCTX    pDebugCtx = pIemCpu->CTX_SUFF(pCtx);
     12064    PCPUMCTX    pOrgCtx   = CPUMQueryGuestCtxPtr(pVCpu);
     12065    PCPUMCTX    pDebugCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    1206912066    Assert(pOrgCtx != pDebugCtx);
    12070     pIemCpu->CTX_SUFF(pCtx) = pOrgCtx;
     12067    pVCpu->iem.s.CTX_SUFF(pCtx) = pOrgCtx;
    1207112068
    1207212069    /*
     
    1207412071     */
    1207512072    bool   fRem  = false;
    12076     PVM    pVM   = IEMCPU_TO_VM(pIemCpu);
    12077     PVMCPU pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
     12073    PVM    pVM   = pVCpu->CTX_SUFF(pVM);
     12074    PVMCPU pVCpu = pVCpu;
    1207812075    VBOXSTRICTRC rc = VERR_EM_CANNOT_EXEC_GUEST;
    1207912076#ifdef IEM_VERIFICATION_MODE_FULL_HM
    1208012077    if (   HMIsEnabled(pVM)
    12081         && pIemCpu->cIOReads == 0
    12082         && pIemCpu->cIOWrites == 0
    12083         && !pIemCpu->fProblematicMemory)
     12078        && pVCpu->iem.s.cIOReads == 0
     12079        && pVCpu->iem.s.cIOWrites == 0
     12080        && !pVCpu->iem.s.fProblematicMemory)
    1208412081    {
    1208512082        uint64_t uStartRip = pOrgCtx->rip;
     
    1209412091                     && EMGetInhibitInterruptsPC(pVCpu) == pOrgCtx->rip)
    1209512092                 || (   pOrgCtx->rip != pDebugCtx->rip
    12096                      && pIemCpu->uInjectCpl != UINT8_MAX
     12093                     && pVCpu->iem.s.uInjectCpl != UINT8_MAX
    1209712094                     && iLoops < 8) );
    1209812095        if (rc == VINF_EM_RESCHEDULE && pOrgCtx->rip != uStartRip)
     
    1212112118    if (rcStrictIem == VERR_IEM_INSTR_NOT_IMPLEMENTED)
    1212212119    {
    12123         pIemCpu->CTX_SUFF(pCtx) = pOrgCtx;
     12120        pVCpu->iem.s.CTX_SUFF(pCtx) = pOrgCtx;
    1212412121        if (rc == VINF_EM_DBG_STEPPED)
    1212512122            return VINF_SUCCESS;
     
    1225212249        }
    1225312250        CHECK_FIELD(rip);
    12254         uint32_t fFlagsMask = UINT32_MAX & ~pIemCpu->fUndefinedEFlags;
     12251        uint32_t fFlagsMask = UINT32_MAX & ~pVCpu->iem.s.fUndefinedEFlags;
    1225512252        if ((pOrgCtx->rflags.u & fFlagsMask) != (pDebugCtx->rflags.u & fFlagsMask))
    1225612253        {
     
    1228012277        }
    1228112278
    12282         if (pIemCpu->cIOReads != 1 && !pIemCpu->fIgnoreRaxRdx)
     12279        if (pVCpu->iem.s.cIOReads != 1 && !pVCpu->iem.s.fIgnoreRaxRdx)
    1228312280            CHECK_FIELD(rax);
    1228412281        CHECK_FIELD(rcx);
    12285         if (!pIemCpu->fIgnoreRaxRdx)
     12282        if (!pVCpu->iem.s.fIgnoreRaxRdx)
    1228612283            CHECK_FIELD(rdx);
    1228712284        CHECK_FIELD(rbx);
     
    1231012307        if (pOrgCtx->cr2 != pDebugCtx->cr2)
    1231112308        {
    12312             if (pIemCpu->uOldCs == 0x1b && pIemCpu->uOldRip == 0x77f61ff3 && fRem)
     12309            if (pVCpu->iem.s.uOldCs == 0x1b && pVCpu->iem.s.uOldRip == 0x77f61ff3 && fRem)
    1231312310            { /* ignore */ }
    1231412311            else if (   (pOrgCtx->cr2 & ~(uint64_t)3) == (pDebugCtx->cr2 & ~(uint64_t)3)
     
    1236712364     * records.
    1236812365     */
    12369     if (cDiffs == 0 && !pIemCpu->fOverlappingMovs)
     12366    if (cDiffs == 0 && !pVCpu->iem.s.fOverlappingMovs)
    1237012367    {
    1237112368        /*
     
    1237312370         *  - I/O port accesses should be a 1:1 match.
    1237412371         */
    12375         PIEMVERIFYEVTREC pIemRec   = pIemCpu->pIemEvtRecHead;
    12376         PIEMVERIFYEVTREC pOtherRec = pIemCpu->pOtherEvtRecHead;
     12372        PIEMVERIFYEVTREC pIemRec   = pVCpu->iem.s.pIemEvtRecHead;
     12373        PIEMVERIFYEVTREC pOtherRec = pVCpu->iem.s.pOtherEvtRecHead;
    1237712374        while (pIemRec && pOtherRec)
    1237812375        {
     
    1238412381            {
    1238512382                if (pIemRec->enmEvent == IEMVERIFYEVENT_RAM_WRITE)
    12386                     iemVerifyWriteRecord(pIemCpu, pIemRec, fRem);
     12383                    iemVerifyWriteRecord(pVCpu, pIemRec, fRem);
    1238712384                pIemRec = pIemRec->pNext;
    1238812385            }
     
    1239112388            if (pIemRec->enmEvent != pOtherRec->enmEvent)
    1239212389            {
    12393                 iemVerifyAssertRecords(pIemCpu, pIemRec, pOtherRec, "Type mismatches");
     12390                iemVerifyAssertRecords(pVCpu, pIemRec, pOtherRec, "Type mismatches");
    1239412391                break;
    1239512392            }
     
    1243112428            if (!fEquals)
    1243212429            {
    12433                 iemVerifyAssertRecords(pIemCpu, pIemRec, pOtherRec, "Mismatch");
     12430                iemVerifyAssertRecords(pVCpu, pIemRec, pOtherRec, "Mismatch");
    1243412431                break;
    1243512432            }
     
    1244412441        {
    1244512442            if (pIemRec->enmEvent == IEMVERIFYEVENT_RAM_WRITE)
    12446                 iemVerifyWriteRecord(pIemCpu, pIemRec, fRem);
     12443                iemVerifyWriteRecord(pVCpu, pIemRec, fRem);
    1244712444            pIemRec = pIemRec->pNext;
    1244812445        }
    1244912446        if (pIemRec != NULL)
    12450             iemVerifyAssertRecord(pIemCpu, pIemRec, "Extra IEM record!");
     12447            iemVerifyAssertRecord(pVCpu, pIemRec, "Extra IEM record!");
    1245112448        else if (pOtherRec != NULL)
    12452             iemVerifyAssertRecord(pIemCpu, pOtherRec, "Extra Other record!");
    12453     }
    12454     pIemCpu->CTX_SUFF(pCtx) = pOrgCtx;
     12449            iemVerifyAssertRecord(pVCpu, pOtherRec, "Extra Other record!");
     12450    }
     12451    pVCpu->iem.s.CTX_SUFF(pCtx) = pOrgCtx;
    1245512452
    1245612453    return rcStrictIem;
     
    1246012457
    1246112458/* stubs */
    12462 IEM_STATIC VBOXSTRICTRC     iemVerifyFakeIOPortRead(PIEMCPU pIemCpu, RTIOPORT Port, uint32_t *pu32Value, size_t cbValue)
    12463 {
    12464     NOREF(pIemCpu); NOREF(Port); NOREF(pu32Value); NOREF(cbValue);
     12459IEM_STATIC VBOXSTRICTRC     iemVerifyFakeIOPortRead(PVMCPU pVCpu, RTIOPORT Port, uint32_t *pu32Value, size_t cbValue)
     12460{
     12461    NOREF(pVCpu); NOREF(Port); NOREF(pu32Value); NOREF(cbValue);
    1246512462    return VERR_INTERNAL_ERROR;
    1246612463}
    1246712464
    12468 IEM_STATIC VBOXSTRICTRC     iemVerifyFakeIOPortWrite(PIEMCPU pIemCpu, RTIOPORT Port, uint32_t u32Value, size_t cbValue)
    12469 {
    12470     NOREF(pIemCpu); NOREF(Port); NOREF(u32Value); NOREF(cbValue);
     12465IEM_STATIC VBOXSTRICTRC     iemVerifyFakeIOPortWrite(PVMCPU pVCpu, RTIOPORT Port, uint32_t u32Value, size_t cbValue)
     12466{
     12467    NOREF(pVCpu); NOREF(Port); NOREF(u32Value); NOREF(cbValue);
    1247112468    return VERR_INTERNAL_ERROR;
    1247212469}
     
    1254512542 *
    1254612543 * @returns Strict VBox status code to pass up.
    12547  * @param   pIemCpu     The IEM per CPU data.
     12544 * @param   pVCpu       The cross context virtual CPU structure of the calling thread.
    1254812545 * @param   rcStrict    The status from executing an instruction.
    1254912546 */
    12550 DECL_FORCE_INLINE(VBOXSTRICTRC) iemExecStatusCodeFiddling(PIEMCPU pIemCpu, VBOXSTRICTRC rcStrict)
     12547DECL_FORCE_INLINE(VBOXSTRICTRC) iemExecStatusCodeFiddling(PVMCPU pVCpu, VBOXSTRICTRC rcStrict)
    1255112548{
    1255212549    if (rcStrict != VINF_SUCCESS)
     
    1257712574                      , ("rcStrict=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
    1257812575/** @todo adjust for VINF_EM_RAW_EMULATE_INSTR   */
    12579             int32_t const rcPassUp = pIemCpu->rcPassUp;
     12576            int32_t const rcPassUp = pVCpu->iem.s.rcPassUp;
    1258012577            if (rcPassUp == VINF_SUCCESS)
    12581                 pIemCpu->cRetInfStatuses++;
     12578                pVCpu->iem.s.cRetInfStatuses++;
    1258212579            else if (   rcPassUp < VINF_EM_FIRST
    1258312580                     || rcPassUp > VINF_EM_LAST
     
    1258512582            {
    1258612583                Log(("IEM: rcPassUp=%Rrc! rcStrict=%Rrc\n", rcPassUp, VBOXSTRICTRC_VAL(rcStrict)));
    12587                 pIemCpu->cRetPassUpStatus++;
     12584                pVCpu->iem.s.cRetPassUpStatus++;
    1258812585                rcStrict = rcPassUp;
    1258912586            }
     
    1259112588            {
    1259212589                Log(("IEM: rcPassUp=%Rrc  rcStrict=%Rrc!\n", rcPassUp, VBOXSTRICTRC_VAL(rcStrict)));
    12593                 pIemCpu->cRetInfStatuses++;
     12590                pVCpu->iem.s.cRetInfStatuses++;
    1259412591            }
    1259512592        }
    1259612593        else if (rcStrict == VERR_IEM_ASPECT_NOT_IMPLEMENTED)
    12597             pIemCpu->cRetAspectNotImplemented++;
     12594            pVCpu->iem.s.cRetAspectNotImplemented++;
    1259812595        else if (rcStrict == VERR_IEM_INSTR_NOT_IMPLEMENTED)
    12599             pIemCpu->cRetInstrNotImplemented++;
     12596            pVCpu->iem.s.cRetInstrNotImplemented++;
    1260012597#ifdef IEM_VERIFICATION_MODE_FULL
    1260112598        else if (rcStrict == VERR_IEM_RESTART_INSTRUCTION)
     
    1260312600#endif
    1260412601        else
    12605             pIemCpu->cRetErrStatuses++;
    12606     }
    12607     else if (pIemCpu->rcPassUp != VINF_SUCCESS)
    12608     {
    12609         pIemCpu->cRetPassUpStatus++;
    12610         rcStrict = pIemCpu->rcPassUp;
     12602            pVCpu->iem.s.cRetErrStatuses++;
     12603    }
     12604    else if (pVCpu->iem.s.rcPassUp != VINF_SUCCESS)
     12605    {
     12606        pVCpu->iem.s.cRetPassUpStatus++;
     12607        rcStrict = pVCpu->iem.s.rcPassUp;
    1261112608    }
    1261212609
     
    1262312620 * @return  Strict VBox status code.
    1262412621 * @param   pVCpu       The cross context virtual CPU structure of the calling EMT.
    12625  * @param   pIemCpu     The IEM per CPU data.
     12622 * @param   pVCpu       The cross context virtual CPU structure of the calling thread.
    1262612623 * @param   fExecuteInhibit     If set, execute the instruction following CLI,
    1262712624 *                      POP SS and MOV SS,GR.
    1262812625 */
    12629 DECL_FORCE_INLINE(VBOXSTRICTRC) iemExecOneInner(PVMCPU pVCpu, PIEMCPU pIemCpu, bool fExecuteInhibit)
     12626DECL_FORCE_INLINE(VBOXSTRICTRC) iemExecOneInner(PVMCPU pVCpu, bool fExecuteInhibit)
    1263012627{
    1263112628#ifdef IEM_WITH_SETJMP
    1263212629    VBOXSTRICTRC rcStrict;
    1263312630    jmp_buf      JmpBuf;
    12634     jmp_buf     *pSavedJmpBuf  = pIemCpu->CTX_SUFF(pJmpBuf);
    12635     pIemCpu->CTX_SUFF(pJmpBuf) = &JmpBuf;
     12631    jmp_buf     *pSavedJmpBuf  = pVCpu->iem.s.CTX_SUFF(pJmpBuf);
     12632    pVCpu->iem.s.CTX_SUFF(pJmpBuf) = &JmpBuf;
    1263612633    if ((rcStrict = setjmp(JmpBuf)) == 0)
    1263712634    {
     
    1264012637    }
    1264112638    else
    12642         pIemCpu->cLongJumps++;
    12643     pIemCpu->CTX_SUFF(pJmpBuf) = pSavedJmpBuf;
     12639        pVCpu->iem.s.cLongJumps++;
     12640    pVCpu->iem.s.CTX_SUFF(pJmpBuf) = pSavedJmpBuf;
    1264412641#else
    1264512642    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    1264712644#endif
    1264812645    if (rcStrict == VINF_SUCCESS)
    12649         pIemCpu->cInstructions++;
    12650     if (pIemCpu->cActiveMappings > 0)
     12646        pVCpu->iem.s.cInstructions++;
     12647    if (pVCpu->iem.s.cActiveMappings > 0)
    1265112648    {
    1265212649        Assert(rcStrict != VINF_SUCCESS);
    12653         iemMemRollback(pIemCpu);
     12650        iemMemRollback(pVCpu);
    1265412651    }
    1265512652//#ifdef DEBUG
    12656 //    AssertMsg(pIemCpu->offOpcode == cbInstr || rcStrict != VINF_SUCCESS, ("%u %u\n", pIemCpu->offOpcode, cbInstr));
     12653//    AssertMsg(pVCpu->iem.s.offOpcode == cbInstr || rcStrict != VINF_SUCCESS, ("%u %u\n", pVCpu->iem.s.offOpcode, cbInstr));
    1265712654//#endif
    1265812655
     
    1266212659        && rcStrict == VINF_SUCCESS
    1266312660        && VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS)
    12664         && EMGetInhibitInterruptsPC(pVCpu) == pIemCpu->CTX_SUFF(pCtx)->rip )
    12665     {
    12666         rcStrict = iemInitDecoderAndPrefetchOpcodes(pIemCpu, pIemCpu->fBypassHandlers);
     12661        && EMGetInhibitInterruptsPC(pVCpu) == pVCpu->iem.s.CTX_SUFF(pCtx)->rip )
     12662    {
     12663        rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, pVCpu->iem.s.fBypassHandlers);
    1266712664        if (rcStrict == VINF_SUCCESS)
    1266812665        {
    1266912666#ifdef LOG_ENABLED
    12670             iemLogCurInstr(IEMCPU_TO_VMCPU(pIemCpu), pIemCpu->CTX_SUFF(pCtx), false);
     12667            iemLogCurInstr(pVCpu, pVCpu->iem.s.CTX_SUFF(pCtx), false);
    1267112668#endif
    1267212669#ifdef IEM_WITH_SETJMP
    12673             pIemCpu->CTX_SUFF(pJmpBuf) = &JmpBuf;
     12670            pVCpu->iem.s.CTX_SUFF(pJmpBuf) = &JmpBuf;
    1267412671            if ((rcStrict = setjmp(JmpBuf)) == 0)
    1267512672            {
     
    1267812675            }
    1267912676            else
    12680                 pIemCpu->cLongJumps++;
    12681             pIemCpu->CTX_SUFF(pJmpBuf) = pSavedJmpBuf;
     12677                pVCpu->iem.s.cLongJumps++;
     12678            pVCpu->iem.s.CTX_SUFF(pJmpBuf) = pSavedJmpBuf;
    1268212679#else
    1268312680            IEM_OPCODE_GET_NEXT_U8(&b);
     
    1268512682#endif
    1268612683            if (rcStrict == VINF_SUCCESS)
    12687                 pIemCpu->cInstructions++;
    12688             if (pIemCpu->cActiveMappings > 0)
     12684                pVCpu->iem.s.cInstructions++;
     12685            if (pVCpu->iem.s.cActiveMappings > 0)
    1268912686            {
    1269012687                Assert(rcStrict != VINF_SUCCESS);
    12691                 iemMemRollback(pIemCpu);
     12688                iemMemRollback(pVCpu);
    1269212689            }
    1269312690        }
     
    1269812695     * Return value fiddling, statistics and sanity assertions.
    1269912696     */
    12700     rcStrict = iemExecStatusCodeFiddling(pIemCpu, rcStrict);
    12701 
    12702     Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->cs));
    12703     Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->ss));
     12697    rcStrict = iemExecStatusCodeFiddling(pVCpu, rcStrict);
     12698
     12699    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->iem.s.CTX_SUFF(pCtx)->cs));
     12700    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->iem.s.CTX_SUFF(pCtx)->ss));
    1270412701#if defined(IEM_VERIFICATION_MODE_FULL)
    12705     Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->es));
    12706     Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->ds));
    12707     Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->fs));
    12708     Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->gs));
     12702    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->iem.s.CTX_SUFF(pCtx)->es));
     12703    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->iem.s.CTX_SUFF(pCtx)->ds));
     12704    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->iem.s.CTX_SUFF(pCtx)->fs));
     12705    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->iem.s.CTX_SUFF(pCtx)->gs));
    1270912706#endif
    1271012707    return rcStrict;
     
    1271712714 *
    1271812715 * @returns rcStrict, maybe modified.
    12719  * @param   pIemCpu     The IEM CPU structure.
    12720  * @param   pVCpu       The cross context virtual CPU structure of the calling EMT.
     12716 * @param   pVCpu       The cross context virtual CPU structure of the calling thread.
    1272112717 * @param   pCtx        The current CPU context.
    1272212718 * @param   rcStrict    The status code returne by the interpreter.
    1272312719 */
    12724 DECLINLINE(VBOXSTRICTRC) iemRCRawMaybeReenter(PIEMCPU pIemCpu, PVMCPU pVCpu, PCPUMCTX pCtx, VBOXSTRICTRC rcStrict)
    12725 {
    12726     if (   !pIemCpu->fInPatchCode
     12720DECLINLINE(VBOXSTRICTRC) iemRCRawMaybeReenter(PVMCPU pVCpu, PCPUMCTX pCtx, VBOXSTRICTRC rcStrict)
     12721{
     12722    if (   !pVCpu->iem.s.fInPatchCode
    1272712723        && (   rcStrict == VINF_SUCCESS
    1272812724            || rcStrict == VERR_IEM_INSTR_NOT_IMPLEMENTED  /* pgmPoolAccessPfHandlerFlush */
     
    1275012746VMMDECL(VBOXSTRICTRC) IEMExecOne(PVMCPU pVCpu)
    1275112747{
    12752     PIEMCPU  pIemCpu = &pVCpu->iem.s;
    12753 
    1275412748#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
    12755     if (++pIemCpu->cVerifyDepth == 1)
    12756         iemExecVerificationModeSetup(pIemCpu);
     12749    if (++pVCpu->iem.s.cVerifyDepth == 1)
     12750        iemExecVerificationModeSetup(pVCpu);
    1275712751#endif
    1275812752#ifdef LOG_ENABLED
    12759     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     12753    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    1276012754    iemLogCurInstr(pVCpu, pCtx, true);
    1276112755#endif
     
    1276412758     * Do the decoding and emulation.
    1276512759     */
    12766     VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pIemCpu, false);
     12760    VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false);
    1276712761    if (rcStrict == VINF_SUCCESS)
    12768         rcStrict = iemExecOneInner(pVCpu, pIemCpu, true);
     12762        rcStrict = iemExecOneInner(pVCpu, true);
    1276912763
    1277012764#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
     
    1277212766     * Assert some sanity.
    1277312767     */
    12774     if (pIemCpu->cVerifyDepth == 1)
    12775         rcStrict = iemExecVerificationModeCheck(pIemCpu, rcStrict);
    12776     pIemCpu->cVerifyDepth--;
     12768    if (pVCpu->iem.s.cVerifyDepth == 1)
     12769        rcStrict = iemExecVerificationModeCheck(pVCpu, rcStrict);
     12770    pVCpu->iem.s.cVerifyDepth--;
    1277712771#endif
    1277812772#ifdef IN_RC
    12779     rcStrict = iemRCRawMaybeReenter(pIemCpu, pVCpu, pIemCpu->CTX_SUFF(pCtx), rcStrict);
     12773    rcStrict = iemRCRawMaybeReenter(pVCpu, pVCpu->iem.s.CTX_SUFF(pCtx), rcStrict);
    1278012774#endif
    1278112775    if (rcStrict != VINF_SUCCESS)
     
    1278812782VMMDECL(VBOXSTRICTRC)       IEMExecOneEx(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, uint32_t *pcbWritten)
    1278912783{
    12790     PIEMCPU  pIemCpu = &pVCpu->iem.s;
    12791     PCPUMCTX pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
     12784    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    1279212785    AssertReturn(CPUMCTX2CORE(pCtx) == pCtxCore, VERR_IEM_IPE_3);
    1279312786
    12794     uint32_t const cbOldWritten = pIemCpu->cbWritten;
    12795     VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pIemCpu, false);
     12787    uint32_t const cbOldWritten = pVCpu->iem.s.cbWritten;
     12788    VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false);
    1279612789    if (rcStrict == VINF_SUCCESS)
    1279712790    {
    12798         rcStrict = iemExecOneInner(pVCpu, pIemCpu, true);
     12791        rcStrict = iemExecOneInner(pVCpu, true);
    1279912792        if (pcbWritten)
    12800             *pcbWritten = pIemCpu->cbWritten - cbOldWritten;
     12793            *pcbWritten = pVCpu->iem.s.cbWritten - cbOldWritten;
    1280112794    }
    1280212795
    1280312796#ifdef IN_RC
    12804     rcStrict = iemRCRawMaybeReenter(pIemCpu, pVCpu, pCtx, rcStrict);
     12797    rcStrict = iemRCRawMaybeReenter(pVCpu, pCtx, rcStrict);
    1280512798#endif
    1280612799    return rcStrict;
     
    1281112804                                                         const void *pvOpcodeBytes, size_t cbOpcodeBytes)
    1281212805{
    12813     PIEMCPU  pIemCpu = &pVCpu->iem.s;
    12814     PCPUMCTX pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
     12806    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    1281512807    AssertReturn(CPUMCTX2CORE(pCtx) == pCtxCore, VERR_IEM_IPE_3);
    1281612808
     
    1281912811        && pCtx->rip == OpcodeBytesPC)
    1282012812    {
    12821         iemInitDecoder(pIemCpu, false);
    12822         pIemCpu->cbOpcode = (uint8_t)RT_MIN(cbOpcodeBytes, sizeof(pIemCpu->abOpcode));
    12823         memcpy(pIemCpu->abOpcode, pvOpcodeBytes, pIemCpu->cbOpcode);
     12813        iemInitDecoder(pVCpu, false);
     12814        pVCpu->iem.s.cbOpcode = (uint8_t)RT_MIN(cbOpcodeBytes, sizeof(pVCpu->iem.s.abOpcode));
     12815        memcpy(pVCpu->iem.s.abOpcode, pvOpcodeBytes, pVCpu->iem.s.cbOpcode);
    1282412816        rcStrict = VINF_SUCCESS;
    1282512817    }
    1282612818    else
    12827         rcStrict = iemInitDecoderAndPrefetchOpcodes(pIemCpu, false);
     12819        rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false);
    1282812820    if (rcStrict == VINF_SUCCESS)
    1282912821    {
    12830         rcStrict = iemExecOneInner(pVCpu, pIemCpu, true);
     12822        rcStrict = iemExecOneInner(pVCpu, true);
    1283112823    }
    1283212824
    1283312825#ifdef IN_RC
    12834     rcStrict = iemRCRawMaybeReenter(pIemCpu, pVCpu, pCtx, rcStrict);
     12826    rcStrict = iemRCRawMaybeReenter(pVCpu, pCtx, rcStrict);
    1283512827#endif
    1283612828    return rcStrict;
     
    1284012832VMMDECL(VBOXSTRICTRC)       IEMExecOneBypassEx(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, uint32_t *pcbWritten)
    1284112833{
    12842     PIEMCPU  pIemCpu = &pVCpu->iem.s;
    12843     PCPUMCTX pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
     12834    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    1284412835    AssertReturn(CPUMCTX2CORE(pCtx) == pCtxCore, VERR_IEM_IPE_3);
    1284512836
    12846     uint32_t const cbOldWritten = pIemCpu->cbWritten;
    12847     VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pIemCpu, true);
     12837    uint32_t const cbOldWritten = pVCpu->iem.s.cbWritten;
     12838    VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, true);
    1284812839    if (rcStrict == VINF_SUCCESS)
    1284912840    {
    12850         rcStrict = iemExecOneInner(pVCpu, pIemCpu, false);
     12841        rcStrict = iemExecOneInner(pVCpu, false);
    1285112842        if (pcbWritten)
    12852             *pcbWritten = pIemCpu->cbWritten - cbOldWritten;
     12843            *pcbWritten = pVCpu->iem.s.cbWritten - cbOldWritten;
    1285312844    }
    1285412845
    1285512846#ifdef IN_RC
    12856     rcStrict = iemRCRawMaybeReenter(pIemCpu, pVCpu, pCtx, rcStrict);
     12847    rcStrict = iemRCRawMaybeReenter(pVCpu, pCtx, rcStrict);
    1285712848#endif
    1285812849    return rcStrict;
     
    1286312854                                                               const void *pvOpcodeBytes, size_t cbOpcodeBytes)
    1286412855{
    12865     PIEMCPU  pIemCpu = &pVCpu->iem.s;
    12866     PCPUMCTX pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
     12856    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    1286712857    AssertReturn(CPUMCTX2CORE(pCtx) == pCtxCore, VERR_IEM_IPE_3);
    1286812858
     
    1287112861        && pCtx->rip == OpcodeBytesPC)
    1287212862    {
    12873         iemInitDecoder(pIemCpu, true);
    12874         pIemCpu->cbOpcode = (uint8_t)RT_MIN(cbOpcodeBytes, sizeof(pIemCpu->abOpcode));
    12875         memcpy(pIemCpu->abOpcode, pvOpcodeBytes, pIemCpu->cbOpcode);
     12863        iemInitDecoder(pVCpu, true);
     12864        pVCpu->iem.s.cbOpcode = (uint8_t)RT_MIN(cbOpcodeBytes, sizeof(pVCpu->iem.s.abOpcode));
     12865        memcpy(pVCpu->iem.s.abOpcode, pvOpcodeBytes, pVCpu->iem.s.cbOpcode);
    1287612866        rcStrict = VINF_SUCCESS;
    1287712867    }
    1287812868    else
    12879         rcStrict = iemInitDecoderAndPrefetchOpcodes(pIemCpu, true);
     12869        rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, true);
    1288012870    if (rcStrict == VINF_SUCCESS)
    12881         rcStrict = iemExecOneInner(pVCpu, pIemCpu, false);
     12871        rcStrict = iemExecOneInner(pVCpu, false);
    1288212872
    1288312873#ifdef IN_RC
    12884     rcStrict = iemRCRawMaybeReenter(pIemCpu, pVCpu, pCtx, rcStrict);
     12874    rcStrict = iemRCRawMaybeReenter(pVCpu, pCtx, rcStrict);
    1288512875#endif
    1288612876    return rcStrict;
     
    1290512895                                                                      uint32_t *pcbWritten)
    1290612896{
    12907     PIEMCPU  pIemCpu = &pVCpu->iem.s;
    1290812897    PCPUMCTX pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
    1290912898    AssertReturn(CPUMCTX2CORE(pCtx) == pCtxCore, VERR_IEM_IPE_3);
    1291012899
    12911     uint32_t const cbOldWritten = pIemCpu->cbWritten;
     12900    uint32_t const cbOldWritten = pVCpu->iem.s.cbWritten;
    1291212901    VBOXSTRICTRC rcStrict;
    1291312902    if (   cbOpcodeBytes
    1291412903        && pCtx->rip == OpcodeBytesPC)
    1291512904    {
    12916         iemInitDecoder(pIemCpu, true);
    12917         pIemCpu->cbOpcode = (uint8_t)RT_MIN(cbOpcodeBytes, sizeof(pIemCpu->abOpcode));
    12918         memcpy(pIemCpu->abOpcode, pvOpcodeBytes, pIemCpu->cbOpcode);
     12905        iemInitDecoder(pVCpu, true);
     12906        pVCpu->iem.s.cbOpcode = (uint8_t)RT_MIN(cbOpcodeBytes, sizeof(pVCpu->iem.s.abOpcode));
     12907        memcpy(pVCpu->iem.s.abOpcode, pvOpcodeBytes, pVCpu->iem.s.cbOpcode);
    1291912908        rcStrict = VINF_SUCCESS;
    1292012909    }
    1292112910    else
    12922         rcStrict = iemInitDecoderAndPrefetchOpcodes(pIemCpu, true);
     12911        rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, true);
    1292312912    if (rcStrict == VINF_SUCCESS)
    1292412913    {
    12925         rcStrict = iemExecOneInner(pVCpu, pIemCpu, false);
     12914        rcStrict = iemExecOneInner(pVCpu, false);
    1292612915        if (pcbWritten)
    12927             *pcbWritten = pIemCpu->cbWritten - cbOldWritten;
     12916            *pcbWritten = pVCpu->iem.s.cbWritten - cbOldWritten;
    1292812917    }
    1292912918
    1293012919#ifdef IN_RC
    12931     rcStrict = iemRCRawMaybeReenter(pIemCpu, pVCpu, pCtx, rcStrict);
     12920    rcStrict = iemRCRawMaybeReenter(pVCpu, pCtx, rcStrict);
    1293212921#endif
    1293312922    return rcStrict;
     
    1293712926VMMDECL(VBOXSTRICTRC) IEMExecLots(PVMCPU pVCpu, uint32_t *pcInstructions)
    1293812927{
    12939     PIEMCPU         pIemCpu              = &pVCpu->iem.s;
    12940     uint32_t const  cInstructionsAtStart = pIemCpu->cInstructions;
     12928    uint32_t const cInstructionsAtStart = pVCpu->iem.s.cInstructions;
    1294112929
    1294212930#if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3)
     
    1294412932     * See if there is an interrupt pending in TRPM, inject it if we can.
    1294512933     */
    12946     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     12934    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    1294712935# ifdef IEM_VERIFICATION_MODE_FULL
    12948     pIemCpu->uInjectCpl = UINT8_MAX;
     12936    pVCpu->iem.s.uInjectCpl = UINT8_MAX;
    1294912937# endif
    1295012938    if (   pCtx->eflags.Bits.u1IF
     
    1295812946        int rc2 = TRPMQueryTrapAll(pVCpu, &u8TrapNo, &enmType, &uErrCode, &uCr2, NULL /* pu8InstLen */); AssertRC(rc2);
    1295912947        IEMInjectTrap(pVCpu, u8TrapNo, enmType, (uint16_t)uErrCode, uCr2, 0 /* cbInstr */);
    12960         if (!IEM_VERIFICATION_ENABLED(pIemCpu))
     12948        if (!IEM_VERIFICATION_ENABLED(pVCpu))
    1296112949            TRPMResetTrap(pVCpu);
    1296212950    }
     
    1297212960     * Do the decoding and emulation.
    1297312961     */
    12974     VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pIemCpu, false);
     12962    VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false);
    1297512963    if (rcStrict == VINF_SUCCESS)
    12976         rcStrict = iemExecOneInner(pVCpu, pIemCpu, true);
     12964        rcStrict = iemExecOneInner(pVCpu, true);
    1297712965
    1297812966    /*
    1297912967     * Assert some sanity.
    1298012968     */
    12981     rcStrict = iemExecVerificationModeCheck(pIemCpu, rcStrict);
     12969    rcStrict = iemExecVerificationModeCheck(pVCpu, rcStrict);
    1298212970
    1298312971    /*
     
    1298812976                 pCtx->cs.Sel, pCtx->rip, pCtx->ss.Sel, pCtx->rsp, pCtx->eflags.u, VBOXSTRICTRC_VAL(rcStrict)));
    1298912977    if (pcInstructions)
    12990         *pcInstructions = pIemCpu->cInstructions - cInstructionsAtStart;
     12978        *pcInstructions = pVCpu->iem.s.cInstructions - cInstructionsAtStart;
    1299112979    return rcStrict;
    1299212980
     
    1299612984     * See if there is an interrupt pending in TRPM, inject it if we can.
    1299712985     */
    12998     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     12986    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    1299912987# ifdef IEM_VERIFICATION_MODE_FULL
    13000     pIemCpu->uInjectCpl = UINT8_MAX;
     12988    pVCpu->iem.s.uInjectCpl = UINT8_MAX;
    1300112989# endif
    1300212990    if (   pCtx->eflags.Bits.u1IF
     
    1301012998        int rc2 = TRPMQueryTrapAll(pVCpu, &u8TrapNo, &enmType, &uErrCode, &uCr2, NULL /* pu8InstLen */); AssertRC(rc2);
    1301112999        IEMInjectTrap(pVCpu, u8TrapNo, enmType, (uint16_t)uErrCode, uCr2, 0 /* cbInstr */);
    13012         if (!IEM_VERIFICATION_ENABLED(pIemCpu))
     13000        if (!IEM_VERIFICATION_ENABLED(pVCpu))
    1301313001            TRPMResetTrap(pVCpu);
    1301413002    }
     
    1301713005     * Initial decoder init w/ prefetch, then setup setjmp.
    1301813006     */
    13019     VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pIemCpu, false);
     13007    VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false);
    1302013008    if (rcStrict == VINF_SUCCESS)
    1302113009    {
    1302213010# ifdef IEM_WITH_SETJMP
    1302313011        jmp_buf         JmpBuf;
    13024         jmp_buf        *pSavedJmpBuf = pIemCpu->CTX_SUFF(pJmpBuf);
    13025         pIemCpu->CTX_SUFF(pJmpBuf)   = &JmpBuf;
    13026         pIemCpu->cActiveMappings     = 0;
     13012        jmp_buf        *pSavedJmpBuf = pVCpu->iem.s.CTX_SUFF(pJmpBuf);
     13013        pVCpu->iem.s.CTX_SUFF(pJmpBuf)   = &JmpBuf;
     13014        pVCpu->iem.s.cActiveMappings     = 0;
    1302713015        if ((rcStrict = setjmp(JmpBuf)) == 0)
    1302813016# endif
     
    1304913037                if (RT_LIKELY(rcStrict == VINF_SUCCESS))
    1305013038                {
    13051                     Assert(pIemCpu->cActiveMappings == 0);
    13052                     pIemCpu->cInstructions++;
    13053                     if (RT_LIKELY(pIemCpu->rcPassUp == VINF_SUCCESS))
     13039                    Assert(pVCpu->iem.s.cActiveMappings == 0);
     13040                    pVCpu->iem.s.cInstructions++;
     13041                    if (RT_LIKELY(pVCpu->iem.s.rcPassUp == VINF_SUCCESS))
    1305413042                    {
    1305513043                        if (RT_LIKELY(   !VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_ALL_MASK & ~VMCPU_FF_INHIBIT_INTERRUPTS)
     
    1305713045                                      && cInstr-- > 0 ))
    1305813046                        {
    13059                             iemReInitDecoder(pVCpu, pIemCpu);
     13047                            iemReInitDecoder(pVCpu);
    1306013048                            continue;
    1306113049                        }
    1306213050                    }
    1306313051                }
    13064                 else if (pIemCpu->cActiveMappings > 0) /** @todo This should only happen when rcStrict != VINF_SUCCESS! */
    13065                     iemMemRollback(pIemCpu);
    13066                 rcStrict = iemExecStatusCodeFiddling(pIemCpu, rcStrict);
     13052                else if (pVCpu->iem.s.cActiveMappings > 0) /** @todo This should only happen when rcStrict != VINF_SUCCESS! */
     13053                    iemMemRollback(pVCpu);
     13054                rcStrict = iemExecStatusCodeFiddling(pVCpu, rcStrict);
    1306713055                break;
    1306813056            }
     
    1307113059        else
    1307213060        {
    13073             if (pIemCpu->cActiveMappings > 0)
    13074                 iemMemRollback(pIemCpu);
    13075             pIemCpu->cLongJumps++;
     13061            if (pVCpu->iem.s.cActiveMappings > 0)
     13062                iemMemRollback(pVCpu);
     13063            pVCpu->iem.s.cLongJumps++;
    1307613064        }
    1307713065# endif
     
    1308013068         * Assert hidden register sanity (also done in iemInitDecoder and iemReInitDecoder).
    1308113069         */
    13082         Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->cs));
    13083         Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->ss));
     13070        Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->iem.s.CTX_SUFF(pCtx)->cs));
     13071        Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->iem.s.CTX_SUFF(pCtx)->ss));
    1308413072# if defined(IEM_VERIFICATION_MODE_FULL)
    13085         Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->es));
    13086         Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->ds));
    13087         Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->fs));
    13088         Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pIemCpu->CTX_SUFF(pCtx)->gs));
     13073        Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->iem.s.CTX_SUFF(pCtx)->es));
     13074        Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->iem.s.CTX_SUFF(pCtx)->ds));
     13075        Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->iem.s.CTX_SUFF(pCtx)->fs));
     13076        Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->iem.s.CTX_SUFF(pCtx)->gs));
    1308913077# endif
    1309013078    }
     
    1309413082     */
    1309513083# ifdef IN_RC
    13096     rcStrict = iemRCRawMaybeReenter(pIemCpu, pVCpu, pIemCpu->CTX_SUFF(pCtx), rcStrict);
     13084    rcStrict = iemRCRawMaybeReenter(pVCpu, pVCpu->iem.s.CTX_SUFF(pCtx), rcStrict);
    1309713085# endif
    1309813086    if (rcStrict != VINF_SUCCESS)
     
    1310013088                 pCtx->cs.Sel, pCtx->rip, pCtx->ss.Sel, pCtx->rsp, pCtx->eflags.u, VBOXSTRICTRC_VAL(rcStrict)));
    1310113089    if (pcInstructions)
    13102         *pcInstructions = pIemCpu->cInstructions - cInstructionsAtStart;
     13090        *pcInstructions = pVCpu->iem.s.cInstructions - cInstructionsAtStart;
    1310313091    return rcStrict;
    1310413092#endif /* Not verification mode */
     
    1312513113                                         uint8_t cbInstr)
    1312613114{
    13127     iemInitDecoder(&pVCpu->iem.s, false);
     13115    iemInitDecoder(pVCpu, false);
    1312813116#ifdef DBGFTRACE_ENABLED
    1312913117    RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "IEMInjectTrap: %x %d %x %llx",
     
    1317113159    }
    1317213160
    13173     return iemRaiseXcptOrInt(&pVCpu->iem.s, cbInstr, u8TrapNo, fFlags, uErrCode, uCr2);
     13161    return iemRaiseXcptOrInt(pVCpu, cbInstr, u8TrapNo, fFlags, uErrCode, uCr2);
    1317413162}
    1317513163
     
    1323313221VMM_INT_DECL(int) IEMExecInstr_iret(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore)
    1323413222{
    13235     PIEMCPU  pIemCpu = &pVCpu->iem.s;
    13236     PCPUMCTX pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
     13223    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    1323713224
    1323813225    iemCtxCoreToCtx(pCtx, pCtxCore);
    13239     iemInitDecoder(pIemCpu);
    13240     VBOXSTRICTRC rcStrict = iemCImpl_iret(pIemCpu, 1, pIemCpu->enmDefOpSize);
     13226    iemInitDecoder(pVCpu);
     13227    VBOXSTRICTRC rcStrict = iemCImpl_iret(pVCpu, 1, pVCpu->iem.s.enmDefOpSize);
    1324113228    if (rcStrict == VINF_SUCCESS)
    1324213229        iemCtxToCtxCore(pCtxCore, pCtx);
     
    1326813255 *
    1326913256 * @returns Fiddled strict vbox status code, ready to return to non-IEM caller.
    13270  * @param   pIemCpu             The IEM per-CPU structure.
    13271  * @param   rcStrict            The status code to fiddle.
    13272  */
    13273 DECLINLINE(VBOXSTRICTRC) iemUninitExecAndFiddleStatusAndMaybeReenter(PIEMCPU pIemCpu, VBOXSTRICTRC rcStrict)
    13274 {
    13275     iemUninitExec(pIemCpu);
     13257 * @param   pVCpu       The cross context virtual CPU structure of the calling thread.
     13258 * @param   rcStrict    The status code to fiddle.
     13259 */
     13260DECLINLINE(VBOXSTRICTRC) iemUninitExecAndFiddleStatusAndMaybeReenter(PVMCPU pVCpu, VBOXSTRICTRC rcStrict)
     13261{
     13262    iemUninitExec(pVCpu);
    1327613263#ifdef IN_RC
    13277     return iemRCRawMaybeReenter(pIemCpu, IEMCPU_TO_VMCPU(pIemCpu), pIemCpu->CTX_SUFF(pCtx),
    13278                                 iemExecStatusCodeFiddling(pIemCpu, rcStrict));
     13264    return iemRCRawMaybeReenter(pVCpu, pVCpu->iem.s.CTX_SUFF(pCtx),
     13265                                iemExecStatusCodeFiddling(pVCpu, rcStrict));
    1327913266#else
    13280     return iemExecStatusCodeFiddling(pIemCpu, rcStrict);
     13267    return iemExecStatusCodeFiddling(pVCpu, rcStrict);
    1328113268#endif
    1328213269}
     
    1331113298     * State init.
    1331213299     */
    13313     PIEMCPU pIemCpu = &pVCpu->iem.s;
    13314     iemInitExec(pIemCpu, false /*fBypassHandlers*/);
     13300    iemInitExec(pVCpu, false /*fBypassHandlers*/);
    1331513301
    1331613302    /*
     
    1332513311                switch (cbValue)
    1332613312                {
    13327                     case 1: rcStrict = iemCImpl_rep_outs_op8_addr16(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
    13328                     case 2: rcStrict = iemCImpl_rep_outs_op16_addr16(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
    13329                     case 4: rcStrict = iemCImpl_rep_outs_op32_addr16(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
     13313                    case 1: rcStrict = iemCImpl_rep_outs_op8_addr16(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
     13314                    case 2: rcStrict = iemCImpl_rep_outs_op16_addr16(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
     13315                    case 4: rcStrict = iemCImpl_rep_outs_op32_addr16(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
    1333013316                    default:
    1333113317                        AssertMsgFailedReturn(("cbValue=%#x\n", cbValue), VERR_IEM_INVALID_OPERAND_SIZE);
     
    1333613322                switch (cbValue)
    1333713323                {
    13338                     case 1: rcStrict = iemCImpl_rep_outs_op8_addr32(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
    13339                     case 2: rcStrict = iemCImpl_rep_outs_op16_addr32(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
    13340                     case 4: rcStrict = iemCImpl_rep_outs_op32_addr32(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
     13324                    case 1: rcStrict = iemCImpl_rep_outs_op8_addr32(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
     13325                    case 2: rcStrict = iemCImpl_rep_outs_op16_addr32(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
     13326                    case 4: rcStrict = iemCImpl_rep_outs_op32_addr32(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
    1334113327                    default:
    1334213328                        AssertMsgFailedReturn(("cbValue=%#x\n", cbValue), VERR_IEM_INVALID_OPERAND_SIZE);
     
    1334713333                switch (cbValue)
    1334813334                {
    13349                     case 1: rcStrict = iemCImpl_rep_outs_op8_addr64(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
    13350                     case 2: rcStrict = iemCImpl_rep_outs_op16_addr64(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
    13351                     case 4: rcStrict = iemCImpl_rep_outs_op32_addr64(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
     13335                    case 1: rcStrict = iemCImpl_rep_outs_op8_addr64(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
     13336                    case 2: rcStrict = iemCImpl_rep_outs_op16_addr64(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
     13337                    case 4: rcStrict = iemCImpl_rep_outs_op32_addr64(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
    1335213338                    default:
    1335313339                        AssertMsgFailedReturn(("cbValue=%#x\n", cbValue), VERR_IEM_INVALID_OPERAND_SIZE);
     
    1336613352                switch (cbValue)
    1336713353                {
    13368                     case 1: rcStrict = iemCImpl_outs_op8_addr16(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
    13369                     case 2: rcStrict = iemCImpl_outs_op16_addr16(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
    13370                     case 4: rcStrict = iemCImpl_outs_op32_addr16(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
     13354                    case 1: rcStrict = iemCImpl_outs_op8_addr16(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
     13355                    case 2: rcStrict = iemCImpl_outs_op16_addr16(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
     13356                    case 4: rcStrict = iemCImpl_outs_op32_addr16(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
    1337113357                    default:
    1337213358                        AssertMsgFailedReturn(("cbValue=%#x\n", cbValue), VERR_IEM_INVALID_OPERAND_SIZE);
     
    1337713363                switch (cbValue)
    1337813364                {
    13379                     case 1: rcStrict = iemCImpl_outs_op8_addr32(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
    13380                     case 2: rcStrict = iemCImpl_outs_op16_addr32(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
    13381                     case 4: rcStrict = iemCImpl_outs_op32_addr32(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
     13365                    case 1: rcStrict = iemCImpl_outs_op8_addr32(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
     13366                    case 2: rcStrict = iemCImpl_outs_op16_addr32(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
     13367                    case 4: rcStrict = iemCImpl_outs_op32_addr32(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
    1338213368                    default:
    1338313369                        AssertMsgFailedReturn(("cbValue=%#x\n", cbValue), VERR_IEM_INVALID_OPERAND_SIZE);
     
    1338813374                switch (cbValue)
    1338913375                {
    13390                     case 1: rcStrict = iemCImpl_outs_op8_addr64(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
    13391                     case 2: rcStrict = iemCImpl_outs_op16_addr64(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
    13392                     case 4: rcStrict = iemCImpl_outs_op32_addr64(pIemCpu, cbInstr, iEffSeg, fIoChecked); break;
     13376                    case 1: rcStrict = iemCImpl_outs_op8_addr64(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
     13377                    case 2: rcStrict = iemCImpl_outs_op16_addr64(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
     13378                    case 4: rcStrict = iemCImpl_outs_op32_addr64(pVCpu, cbInstr, iEffSeg, fIoChecked); break;
    1339313379                    default:
    1339413380                        AssertMsgFailedReturn(("cbValue=%#x\n", cbValue), VERR_IEM_INVALID_OPERAND_SIZE);
     
    1340113387    }
    1340213388
    13403     return iemUninitExecAndFiddleStatusAndMaybeReenter(pIemCpu, rcStrict);
     13389    return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict);
    1340413390}
    1340513391
     
    1343113417     * State init.
    1343213418     */
    13433     PIEMCPU pIemCpu = &pVCpu->iem.s;
    13434     iemInitExec(pIemCpu, false /*fBypassHandlers*/);
     13419    iemInitExec(pVCpu, false /*fBypassHandlers*/);
    1343513420
    1343613421    /*
     
    1344513430                switch (cbValue)
    1344613431                {
    13447                     case 1: rcStrict = iemCImpl_rep_ins_op8_addr16(pIemCpu, cbInstr, fIoChecked); break;
    13448                     case 2: rcStrict = iemCImpl_rep_ins_op16_addr16(pIemCpu, cbInstr, fIoChecked); break;
    13449                     case 4: rcStrict = iemCImpl_rep_ins_op32_addr16(pIemCpu, cbInstr, fIoChecked); break;
     13432                    case 1: rcStrict = iemCImpl_rep_ins_op8_addr16(pVCpu, cbInstr, fIoChecked); break;
     13433                    case 2: rcStrict = iemCImpl_rep_ins_op16_addr16(pVCpu, cbInstr, fIoChecked); break;
     13434                    case 4: rcStrict = iemCImpl_rep_ins_op32_addr16(pVCpu, cbInstr, fIoChecked); break;
    1345013435                    default:
    1345113436                        AssertMsgFailedReturn(("cbValue=%#x\n", cbValue), VERR_IEM_INVALID_OPERAND_SIZE);
     
    1345613441                switch (cbValue)
    1345713442                {
    13458                     case 1: rcStrict = iemCImpl_rep_ins_op8_addr32(pIemCpu, cbInstr, fIoChecked); break;
    13459                     case 2: rcStrict = iemCImpl_rep_ins_op16_addr32(pIemCpu, cbInstr, fIoChecked); break;
    13460                     case 4: rcStrict = iemCImpl_rep_ins_op32_addr32(pIemCpu, cbInstr, fIoChecked); break;
     13443                    case 1: rcStrict = iemCImpl_rep_ins_op8_addr32(pVCpu, cbInstr, fIoChecked); break;
     13444                    case 2: rcStrict = iemCImpl_rep_ins_op16_addr32(pVCpu, cbInstr, fIoChecked); break;
     13445                    case 4: rcStrict = iemCImpl_rep_ins_op32_addr32(pVCpu, cbInstr, fIoChecked); break;
    1346113446                    default:
    1346213447                        AssertMsgFailedReturn(("cbValue=%#x\n", cbValue), VERR_IEM_INVALID_OPERAND_SIZE);
     
    1346713452                switch (cbValue)
    1346813453                {
    13469                     case 1: rcStrict = iemCImpl_rep_ins_op8_addr64(pIemCpu, cbInstr, fIoChecked); break;
    13470                     case 2: rcStrict = iemCImpl_rep_ins_op16_addr64(pIemCpu, cbInstr, fIoChecked); break;
    13471                     case 4: rcStrict = iemCImpl_rep_ins_op32_addr64(pIemCpu, cbInstr, fIoChecked); break;
     13454                    case 1: rcStrict = iemCImpl_rep_ins_op8_addr64(pVCpu, cbInstr, fIoChecked); break;
     13455                    case 2: rcStrict = iemCImpl_rep_ins_op16_addr64(pVCpu, cbInstr, fIoChecked); break;
     13456                    case 4: rcStrict = iemCImpl_rep_ins_op32_addr64(pVCpu, cbInstr, fIoChecked); break;
    1347213457                    default:
    1347313458                        AssertMsgFailedReturn(("cbValue=%#x\n", cbValue), VERR_IEM_INVALID_OPERAND_SIZE);
     
    1348613471                switch (cbValue)
    1348713472                {
    13488                     case 1: rcStrict = iemCImpl_ins_op8_addr16(pIemCpu, cbInstr, fIoChecked); break;
    13489                     case 2: rcStrict = iemCImpl_ins_op16_addr16(pIemCpu, cbInstr, fIoChecked); break;
    13490                     case 4: rcStrict = iemCImpl_ins_op32_addr16(pIemCpu, cbInstr, fIoChecked); break;
     13473                    case 1: rcStrict = iemCImpl_ins_op8_addr16(pVCpu, cbInstr, fIoChecked); break;
     13474                    case 2: rcStrict = iemCImpl_ins_op16_addr16(pVCpu, cbInstr, fIoChecked); break;
     13475                    case 4: rcStrict = iemCImpl_ins_op32_addr16(pVCpu, cbInstr, fIoChecked); break;
    1349113476                    default:
    1349213477                        AssertMsgFailedReturn(("cbValue=%#x\n", cbValue), VERR_IEM_INVALID_OPERAND_SIZE);
     
    1349713482                switch (cbValue)
    1349813483                {
    13499                     case 1: rcStrict = iemCImpl_ins_op8_addr32(pIemCpu, cbInstr, fIoChecked); break;
    13500                     case 2: rcStrict = iemCImpl_ins_op16_addr32(pIemCpu, cbInstr, fIoChecked); break;
    13501                     case 4: rcStrict = iemCImpl_ins_op32_addr32(pIemCpu, cbInstr, fIoChecked); break;
     13484                    case 1: rcStrict = iemCImpl_ins_op8_addr32(pVCpu, cbInstr, fIoChecked); break;
     13485                    case 2: rcStrict = iemCImpl_ins_op16_addr32(pVCpu, cbInstr, fIoChecked); break;
     13486                    case 4: rcStrict = iemCImpl_ins_op32_addr32(pVCpu, cbInstr, fIoChecked); break;
    1350213487                    default:
    1350313488                        AssertMsgFailedReturn(("cbValue=%#x\n", cbValue), VERR_IEM_INVALID_OPERAND_SIZE);
     
    1350813493                switch (cbValue)
    1350913494                {
    13510                     case 1: rcStrict = iemCImpl_ins_op8_addr64(pIemCpu, cbInstr, fIoChecked); break;
    13511                     case 2: rcStrict = iemCImpl_ins_op16_addr64(pIemCpu, cbInstr, fIoChecked); break;
    13512                     case 4: rcStrict = iemCImpl_ins_op32_addr64(pIemCpu, cbInstr, fIoChecked); break;
     13495                    case 1: rcStrict = iemCImpl_ins_op8_addr64(pVCpu, cbInstr, fIoChecked); break;
     13496                    case 2: rcStrict = iemCImpl_ins_op16_addr64(pVCpu, cbInstr, fIoChecked); break;
     13497                    case 4: rcStrict = iemCImpl_ins_op32_addr64(pVCpu, cbInstr, fIoChecked); break;
    1351313498                    default:
    1351413499                        AssertMsgFailedReturn(("cbValue=%#x\n", cbValue), VERR_IEM_INVALID_OPERAND_SIZE);
     
    1352113506    }
    1352213507
    13523     return iemUninitExecAndFiddleStatusAndMaybeReenter(pIemCpu, rcStrict);
     13508    return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict);
    1352413509}
    1352513510
     
    1354113526    Assert(cbReg <= 4 && cbReg != 3);
    1354213527
    13543     PIEMCPU pIemCpu = &pVCpu->iem.s;
    13544     iemInitExec(pIemCpu, false /*fBypassHandlers*/);
     13528    iemInitExec(pVCpu, false /*fBypassHandlers*/);
    1354513529    VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_2(iemCImpl_out, u16Port, cbReg);
    13546     return iemUninitExecAndFiddleStatusAndMaybeReenter(pIemCpu, rcStrict);
     13530    return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict);
    1354713531}
    1354813532
     
    1356213546    Assert(cbReg <= 4 && cbReg != 3);
    1356313547
    13564     PIEMCPU pIemCpu = &pVCpu->iem.s;
    13565     iemInitExec(pIemCpu, false /*fBypassHandlers*/);
     13548    iemInitExec(pVCpu, false /*fBypassHandlers*/);
    1356613549    VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_2(iemCImpl_in, u16Port, cbReg);
    13567     return iemUninitExecAndFiddleStatusAndMaybeReenter(pIemCpu, rcStrict);
     13550    return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict);
    1356813551}
    1356913552
     
    1358613569    Assert(iGReg < 16);
    1358713570
    13588     PIEMCPU pIemCpu = &pVCpu->iem.s;
    13589     iemInitExec(pIemCpu, false /*fBypassHandlers*/);
     13571    iemInitExec(pVCpu, false /*fBypassHandlers*/);
    1359013572    VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_2(iemCImpl_mov_Cd_Rd, iCrReg, iGReg);
    13591     return iemUninitExecAndFiddleStatusAndMaybeReenter(pIemCpu, rcStrict);
     13573    return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict);
    1359213574}
    1359313575
     
    1361013592    Assert(iGReg < 16);
    1361113593
    13612     PIEMCPU pIemCpu = &pVCpu->iem.s;
    13613     iemInitExec(pIemCpu, false /*fBypassHandlers*/);
     13594    iemInitExec(pVCpu, false /*fBypassHandlers*/);
    1361413595    VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_2(iemCImpl_mov_Rd_Cd, iGReg, iCrReg);
    13615     return iemUninitExecAndFiddleStatusAndMaybeReenter(pIemCpu, rcStrict);
     13596    return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict);
    1361613597}
    1361713598
     
    1363013611    IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 2);
    1363113612
    13632     PIEMCPU pIemCpu = &pVCpu->iem.s;
    13633     iemInitExec(pIemCpu, false /*fBypassHandlers*/);
     13613    iemInitExec(pVCpu, false /*fBypassHandlers*/);
    1363413614    VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_0(iemCImpl_clts);
    13635     return iemUninitExecAndFiddleStatusAndMaybeReenter(pIemCpu, rcStrict);
     13615    return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict);
    1363613616}
    1363713617
     
    1365113631    IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 3);
    1365213632
    13653     PIEMCPU pIemCpu = &pVCpu->iem.s;
    13654     iemInitExec(pIemCpu, false /*fBypassHandlers*/);
     13633    iemInitExec(pVCpu, false /*fBypassHandlers*/);
    1365513634    VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_1(iemCImpl_lmsw, uValue);
    13656     return iemUninitExecAndFiddleStatusAndMaybeReenter(pIemCpu, rcStrict);
     13635    return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict);
    1365713636}
    1365813637
     
    1367313652    IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 3);
    1367413653
    13675     PIEMCPU pIemCpu = &pVCpu->iem.s;
    13676     iemInitExec(pIemCpu, false /*fBypassHandlers*/);
     13654    iemInitExec(pVCpu, false /*fBypassHandlers*/);
    1367713655    VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_0(iemCImpl_xsetbv);
    13678     return iemUninitExecAndFiddleStatusAndMaybeReenter(pIemCpu, rcStrict);
     13656    return iemUninitExecAndFiddleStatusAndMaybeReenter(pVCpu, rcStrict);
    1367913657}
    1368013658
     
    1368913667 *                          with @a rcStrict.
    1369013668 * @param   iMemMap         The memory mapping index. For error reporting only.
    13691  * @param   pIemCpu         The IEMCPU structure of the calling EMT, for error
    13692  *                          reporting only.
     13669 * @param   pVCpu           The cross context virtual CPU structure of the calling
     13670 *                          thread, for error reporting only.
    1369313671 */
    1369413672DECL_NO_INLINE(static, VBOXSTRICTRC) iemR3MergeStatusSlow(VBOXSTRICTRC rcStrict, VBOXSTRICTRC rcStrictCommit,
    13695                                                           unsigned iMemMap, PIEMCPU pIemCpu)
     13673                                                          unsigned iMemMap, PVMCPU pVCpu)
    1369613674{
    1369713675    if (RT_FAILURE_NP(rcStrict))
     
    1370613684    AssertLogRelMsgFailed(("rcStrictCommit=%Rrc rcStrict=%Rrc iMemMap=%u fAccess=%#x FirstPg=%RGp LB %u SecondPg=%RGp LB %u\n",
    1370713685                           VBOXSTRICTRC_VAL(rcStrictCommit), VBOXSTRICTRC_VAL(rcStrict), iMemMap,
    13708                            pIemCpu->aMemMappings[iMemMap].fAccess,
    13709                            pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, pIemCpu->aMemBbMappings[iMemMap].cbFirst,
    13710                            pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, pIemCpu->aMemBbMappings[iMemMap].cbSecond));
     13686                           pVCpu->iem.s.aMemMappings[iMemMap].fAccess,
     13687                           pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, pVCpu->iem.s.aMemBbMappings[iMemMap].cbFirst,
     13688                           pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, pVCpu->iem.s.aMemBbMappings[iMemMap].cbSecond));
    1371113689    return VERR_IOM_FF_STATUS_IPE;
    1371213690}
     
    1372113699 *                          with @a rcStrict.
    1372213700 * @param   iMemMap         The memory mapping index. For error reporting only.
    13723  * @param   pIemCpu         The IEMCPU structure of the calling EMT, for error
    13724  *                          reporting only.
    13725  */
    13726 DECLINLINE(VBOXSTRICTRC) iemR3MergeStatus(VBOXSTRICTRC rcStrict, VBOXSTRICTRC rcStrictCommit, unsigned iMemMap, PIEMCPU pIemCpu)
     13701 * @param   pVCpu           The cross context virtual CPU structure of the calling
     13702 *                          thread, for error reporting only.
     13703 */
     13704DECLINLINE(VBOXSTRICTRC) iemR3MergeStatus(VBOXSTRICTRC rcStrict, VBOXSTRICTRC rcStrictCommit, unsigned iMemMap, PVMCPU pVCpu)
    1372713705{
    1372813706    /* Simple. */
     
    1374313721
    1374413722    /* Unlikely */
    13745     return iemR3MergeStatusSlow(rcStrict, rcStrictCommit, iMemMap, pIemCpu);
     13723    return iemR3MergeStatusSlow(rcStrict, rcStrictCommit, iMemMap, pVCpu);
    1374613724}
    1374713725
     
    1375713735VMMR3_INT_DECL(VBOXSTRICTRC) IEMR3ProcessForceFlag(PVM pVM, PVMCPU pVCpu, VBOXSTRICTRC rcStrict)
    1375813736{
    13759     PIEMCPU pIemCpu = &pVCpu->iem.s;
    13760 
    1376113737    /*
    1376213738     * Reset the pending commit.
    1376313739     */
    13764     AssertMsg(  (pIemCpu->aMemMappings[0].fAccess | pIemCpu->aMemMappings[1].fAccess | pIemCpu->aMemMappings[2].fAccess)
     13740    AssertMsg(  (pVCpu->iem.s.aMemMappings[0].fAccess | pVCpu->iem.s.aMemMappings[1].fAccess | pVCpu->iem.s.aMemMappings[2].fAccess)
    1376513741              & (IEM_ACCESS_PENDING_R3_WRITE_1ST | IEM_ACCESS_PENDING_R3_WRITE_2ND),
    1376613742              ("%#x %#x %#x\n",
    13767                pIemCpu->aMemMappings[0].fAccess, pIemCpu->aMemMappings[1].fAccess, pIemCpu->aMemMappings[2].fAccess));
     13743               pVCpu->iem.s.aMemMappings[0].fAccess, pVCpu->iem.s.aMemMappings[1].fAccess, pVCpu->iem.s.aMemMappings[2].fAccess));
    1376813744    VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_IEM);
    1376913745
     
    1377213748     */
    1377313749    unsigned cBufs = 0;
    13774     unsigned iMemMap = RT_ELEMENTS(pIemCpu->aMemMappings);
     13750    unsigned iMemMap = RT_ELEMENTS(pVCpu->iem.s.aMemMappings);
    1377513751    while (iMemMap-- > 0)
    13776         if (pIemCpu->aMemMappings[iMemMap].fAccess & (IEM_ACCESS_PENDING_R3_WRITE_1ST | IEM_ACCESS_PENDING_R3_WRITE_2ND))
     13752        if (pVCpu->iem.s.aMemMappings[iMemMap].fAccess & (IEM_ACCESS_PENDING_R3_WRITE_1ST | IEM_ACCESS_PENDING_R3_WRITE_2ND))
    1377713753        {
    13778             Assert(pIemCpu->aMemMappings[iMemMap].fAccess & IEM_ACCESS_TYPE_WRITE);
    13779             Assert(pIemCpu->aMemMappings[iMemMap].fAccess & IEM_ACCESS_BOUNCE_BUFFERED);
    13780             Assert(!pIemCpu->aMemBbMappings[iMemMap].fUnassigned);
    13781 
    13782             uint16_t const  cbFirst  = pIemCpu->aMemBbMappings[iMemMap].cbFirst;
    13783             uint16_t const  cbSecond = pIemCpu->aMemBbMappings[iMemMap].cbSecond;
    13784             uint8_t const  *pbBuf    = &pIemCpu->aBounceBuffers[iMemMap].ab[0];
    13785 
    13786             if (pIemCpu->aMemMappings[iMemMap].fAccess & IEM_ACCESS_PENDING_R3_WRITE_1ST)
     13754            Assert(pVCpu->iem.s.aMemMappings[iMemMap].fAccess & IEM_ACCESS_TYPE_WRITE);
     13755            Assert(pVCpu->iem.s.aMemMappings[iMemMap].fAccess & IEM_ACCESS_BOUNCE_BUFFERED);
     13756            Assert(!pVCpu->iem.s.aMemBbMappings[iMemMap].fUnassigned);
     13757
     13758            uint16_t const  cbFirst  = pVCpu->iem.s.aMemBbMappings[iMemMap].cbFirst;
     13759            uint16_t const  cbSecond = pVCpu->iem.s.aMemBbMappings[iMemMap].cbSecond;
     13760            uint8_t const  *pbBuf    = &pVCpu->iem.s.aBounceBuffers[iMemMap].ab[0];
     13761
     13762            if (pVCpu->iem.s.aMemMappings[iMemMap].fAccess & IEM_ACCESS_PENDING_R3_WRITE_1ST)
    1378713763            {
    1378813764                VBOXSTRICTRC rcStrictCommit1 = PGMPhysWrite(pVM,
    13789                                                             pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst,
     13765                                                            pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst,
    1379013766                                                            pbBuf,
    1379113767                                                            cbFirst,
    1379213768                                                            PGMACCESSORIGIN_IEM);
    13793                 rcStrict = iemR3MergeStatus(rcStrict, rcStrictCommit1, iMemMap, pIemCpu);
     13769                rcStrict = iemR3MergeStatus(rcStrict, rcStrictCommit1, iMemMap, pVCpu);
    1379413770                Log(("IEMR3ProcessForceFlag: iMemMap=%u GCPhysFirst=%RGp LB %#x %Rrc => %Rrc\n",
    13795                      iMemMap, pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
     13771                     iMemMap, pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
    1379613772                     VBOXSTRICTRC_VAL(rcStrictCommit1), VBOXSTRICTRC_VAL(rcStrict)));
    1379713773            }
    1379813774
    13799             if (pIemCpu->aMemMappings[iMemMap].fAccess & IEM_ACCESS_PENDING_R3_WRITE_2ND)
     13775            if (pVCpu->iem.s.aMemMappings[iMemMap].fAccess & IEM_ACCESS_PENDING_R3_WRITE_2ND)
    1380013776            {
    1380113777                VBOXSTRICTRC rcStrictCommit2 = PGMPhysWrite(pVM,
    13802                                                             pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond,
     13778                                                            pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond,
    1380313779                                                            pbBuf + cbFirst,
    1380413780                                                            cbSecond,
    1380513781                                                            PGMACCESSORIGIN_IEM);
    13806                 rcStrict = iemR3MergeStatus(rcStrict, rcStrictCommit2, iMemMap, pIemCpu);
     13782                rcStrict = iemR3MergeStatus(rcStrict, rcStrictCommit2, iMemMap, pVCpu);
    1380713783                Log(("IEMR3ProcessForceFlag: iMemMap=%u GCPhysSecond=%RGp LB %#x %Rrc => %Rrc\n",
    13808                      iMemMap, pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond,
     13784                     iMemMap, pVCpu->iem.s.aMemBbMappings[iMemMap].GCPhysSecond, cbSecond,
    1380913785                     VBOXSTRICTRC_VAL(rcStrictCommit2), VBOXSTRICTRC_VAL(rcStrict)));
    1381013786            }
    1381113787            cBufs++;
    13812             pIemCpu->aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
     13788            pVCpu->iem.s.aMemMappings[iMemMap].fAccess = IEM_ACCESS_INVALID;
    1381313789        }
    1381413790
    13815     AssertMsg(cBufs > 0 && cBufs == pIemCpu->cActiveMappings,
    13816               ("cBufs=%u cActiveMappings=%u - %#x %#x %#x\n", cBufs, pIemCpu->cActiveMappings,
    13817                pIemCpu->aMemMappings[0].fAccess, pIemCpu->aMemMappings[1].fAccess, pIemCpu->aMemMappings[2].fAccess));
    13818     pIemCpu->cActiveMappings = 0;
     13791    AssertMsg(cBufs > 0 && cBufs == pVCpu->iem.s.cActiveMappings,
     13792              ("cBufs=%u cActiveMappings=%u - %#x %#x %#x\n", cBufs, pVCpu->iem.s.cActiveMappings,
     13793               pVCpu->iem.s.aMemMappings[0].fAccess, pVCpu->iem.s.aMemMappings[1].fAccess, pVCpu->iem.s.aMemMappings[2].fAccess));
     13794    pVCpu->iem.s.cActiveMappings = 0;
    1381913795    return rcStrict;
    1382013796}
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r61968 r62015  
    2626 * @returns Strict VBox status code.
    2727 *
    28  * @param   pIemCpu             The IEM per CPU data.
     28 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    2929 * @param   pCtx                The register context.
    3030 * @param   u16Port             The port number.
    3131 * @param   cbOperand           The operand size.
    3232 */
    33 static VBOXSTRICTRC iemHlpCheckPortIOPermissionBitmap(PIEMCPU pIemCpu, PCCPUMCTX pCtx, uint16_t u16Port, uint8_t cbOperand)
     33static VBOXSTRICTRC iemHlpCheckPortIOPermissionBitmap(PVMCPU pVCpu, PCCPUMCTX pCtx, uint16_t u16Port, uint8_t cbOperand)
    3434{
    3535    /* The TSS bits we're interested in are the same on 386 and AMD64. */
     
    4848        Log(("iemHlpCheckPortIOPermissionBitmap: Port=%#x cb=%d - TSS type %#x (attr=%#x) has no I/O bitmap -> #GP(0)\n",
    4949             u16Port, cbOperand, pCtx->tr.Attr.n.u4Type, pCtx->tr.Attr.u));
    50         return iemRaiseGeneralProtectionFault0(pIemCpu);
     50        return iemRaiseGeneralProtectionFault0(pVCpu);
    5151    }
    5252
     
    5555     */
    5656    uint16_t offBitmap;
    57     VBOXSTRICTRC rcStrict = iemMemFetchSysU16(pIemCpu, &offBitmap, UINT8_MAX,
     57    VBOXSTRICTRC rcStrict = iemMemFetchSysU16(pVCpu, &offBitmap, UINT8_MAX,
    5858                                              pCtx->tr.u64Base + RT_OFFSETOF(X86TSS64, offIoBitmap));
    5959    if (rcStrict != VINF_SUCCESS)
     
    7575        Log(("iemHlpCheckPortIOPermissionBitmap: offFirstBit=%#x + 1 is beyond u32Limit=%#x -> #GP(0)\n",
    7676             offFirstBit, pCtx->tr.u32Limit));
    77         return iemRaiseGeneralProtectionFault0(pIemCpu);
     77        return iemRaiseGeneralProtectionFault0(pVCpu);
    7878    }
    7979
     
    8585     *        2nd byte when it's not required. */
    8686    uint16_t bmBytes = UINT16_MAX;
    87     rcStrict = iemMemFetchSysU16(pIemCpu, &bmBytes, UINT8_MAX, pCtx->tr.u64Base + offFirstBit);
     87    rcStrict = iemMemFetchSysU16(pVCpu, &bmBytes, UINT8_MAX, pCtx->tr.u64Base + offFirstBit);
    8888    if (rcStrict != VINF_SUCCESS)
    8989    {
     
    101101        Log(("iemHlpCheckPortIOPermissionBitmap: u16Port=%#x LB %u - access denied (bm=%#x mask=%#x) -> #GP(0)\n",
    102102             u16Port, cbOperand, bmBytes, fPortMask));
    103         return iemRaiseGeneralProtectionFault0(pIemCpu);
     103        return iemRaiseGeneralProtectionFault0(pVCpu);
    104104    }
    105105
     
    115115 * @returns Strict VBox status code.
    116116 *
    117  * @param   pIemCpu             The IEM per CPU data.
     117 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    118118 * @param   pCtx                The register context.
    119119 * @param   u16Port             The port number.
    120120 * @param   cbOperand           The operand size.
    121121 */
    122 DECLINLINE(VBOXSTRICTRC) iemHlpCheckPortIOPermission(PIEMCPU pIemCpu, PCCPUMCTX pCtx, uint16_t u16Port, uint8_t cbOperand)
     122DECLINLINE(VBOXSTRICTRC) iemHlpCheckPortIOPermission(PVMCPU pVCpu, PCCPUMCTX pCtx, uint16_t u16Port, uint8_t cbOperand)
    123123{
    124124    X86EFLAGS Efl;
    125     Efl.u = IEMMISC_GET_EFL(pIemCpu, pCtx);
     125    Efl.u = IEMMISC_GET_EFL(pVCpu, pCtx);
    126126    if (   (pCtx->cr0 & X86_CR0_PE)
    127         && (    pIemCpu->uCpl > Efl.Bits.u2IOPL
     127        && (    pVCpu->iem.s.uCpl > Efl.Bits.u2IOPL
    128128            ||  Efl.Bits.u1VM) )
    129         return iemHlpCheckPortIOPermissionBitmap(pIemCpu, pCtx, u16Port, cbOperand);
     129        return iemHlpCheckPortIOPermissionBitmap(pVCpu, pCtx, u16Port, cbOperand);
    130130    return VINF_SUCCESS;
    131131}
     
    169169 * Updates the specified flags according to a 8-bit result.
    170170 *
    171  * @param   pIemCpu             The IEM state of the calling EMT.
     171 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    172172 * @param   u8Result            The result to set the flags according to.
    173173 * @param   fToUpdate           The flags to update.
    174174 * @param   fUndefined          The flags that are specified as undefined.
    175175 */
    176 static void iemHlpUpdateArithEFlagsU8(PIEMCPU pIemCpu, uint8_t u8Result, uint32_t fToUpdate, uint32_t fUndefined)
    177 {
    178     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     176static void iemHlpUpdateArithEFlagsU8(PVMCPU pVCpu, uint8_t u8Result, uint32_t fToUpdate, uint32_t fUndefined)
     177{
     178    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    179179
    180180    uint32_t fEFlags = pCtx->eflags.u;
     
    183183    pCtx->eflags.u |= (fToUpdate | fUndefined) & fEFlags;
    184184#ifdef IEM_VERIFICATION_MODE_FULL
    185     pIemCpu->fUndefinedEFlags |= fUndefined;
     185    pVCpu->iem.s.fUndefinedEFlags |= fUndefined;
    186186#endif
    187187}
     
    194194 * @param   pSReg               Pointer to the segment register.
    195195 */
    196 static void iemHlpAdjustSelectorForNewCpl(PIEMCPU pIemCpu, uint8_t uCpl, PCPUMSELREG pSReg)
     196static void iemHlpAdjustSelectorForNewCpl(PVMCPU pVCpu, uint8_t uCpl, PCPUMSELREG pSReg)
    197197{
    198198#ifdef VBOX_WITH_RAW_MODE_NOT_R0
    199     if (!CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg))
    200         CPUMGuestLazyLoadHiddenSelectorReg(IEMCPU_TO_VMCPU(pIemCpu), pSReg);
     199    if (!CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, pSReg))
     200        CPUMGuestLazyLoadHiddenSelectorReg(pVCpu, pSReg);
    201201#else
    202     Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg));
     202    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, pSReg));
    203203#endif
    204204
     
    207207        &&    (pSReg->Attr.n.u4Type & (X86_SEL_TYPE_CODE | X86_SEL_TYPE_CONF))
    208208           !=                         (X86_SEL_TYPE_CODE | X86_SEL_TYPE_CONF)) /* not conforming code */
    209         iemHlpLoadNullDataSelectorProt(pIemCpu, pSReg, 0);
     209        iemHlpLoadNullDataSelectorProt(pVCpu, pSReg, 0);
    210210}
    211211
     
    214214 * Indicates that we have modified the FPU state.
    215215 *
    216  * @param   pIemCpu             The IEM state of the calling EMT.
    217  */
    218 DECLINLINE(void) iemHlpUsedFpu(PIEMCPU pIemCpu)
    219 {
    220     CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_FPU_REM);
     216 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     217 */
     218DECLINLINE(void) iemHlpUsedFpu(PVMCPU pVCpu)
     219{
     220    CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_FPU_REM);
    221221}
    222222
     
    232232IEM_CIMPL_DEF_0(iemCImpl_popa_16)
    233233{
    234     PCPUMCTX        pCtx        = pIemCpu->CTX_SUFF(pCtx);
    235     RTGCPTR         GCPtrStart  = iemRegGetEffRsp(pIemCpu, pCtx);
     234    PCPUMCTX        pCtx        = pVCpu->iem.s.CTX_SUFF(pCtx);
     235    RTGCPTR         GCPtrStart  = iemRegGetEffRsp(pVCpu, pCtx);
    236236    RTGCPTR         GCPtrLast   = GCPtrStart + 15;
    237237    VBOXSTRICTRC    rcStrict;
     
    245245     */
    246246    /** @todo do popa boundary / wrap-around checks.  */
    247     if (RT_UNLIKELY(   IEM_IS_REAL_OR_V86_MODE(pIemCpu)
     247    if (RT_UNLIKELY(   IEM_IS_REAL_OR_V86_MODE(pVCpu)
    248248                    && (pCtx->cs.u32Limit < GCPtrLast)) ) /* ASSUMES 64-bit RTGCPTR */
    249249    {
     
    251251        RTUINT64U TmpRsp;
    252252        TmpRsp.u = pCtx->rsp;
    253         rcStrict = iemMemStackPopU16Ex(pIemCpu, &pCtx->di, &TmpRsp);
     253        rcStrict = iemMemStackPopU16Ex(pVCpu, &pCtx->di, &TmpRsp);
    254254        if (rcStrict == VINF_SUCCESS)
    255             rcStrict = iemMemStackPopU16Ex(pIemCpu, &pCtx->si, &TmpRsp);
     255            rcStrict = iemMemStackPopU16Ex(pVCpu, &pCtx->si, &TmpRsp);
    256256        if (rcStrict == VINF_SUCCESS)
    257             rcStrict = iemMemStackPopU16Ex(pIemCpu, &pCtx->bp, &TmpRsp);
     257            rcStrict = iemMemStackPopU16Ex(pVCpu, &pCtx->bp, &TmpRsp);
    258258        if (rcStrict == VINF_SUCCESS)
    259259        {
    260             iemRegAddToRspEx(pIemCpu, pCtx, &TmpRsp, 2); /* sp */
    261             rcStrict = iemMemStackPopU16Ex(pIemCpu, &pCtx->bx, &TmpRsp);
     260            iemRegAddToRspEx(pVCpu, pCtx, &TmpRsp, 2); /* sp */
     261            rcStrict = iemMemStackPopU16Ex(pVCpu, &pCtx->bx, &TmpRsp);
    262262        }
    263263        if (rcStrict == VINF_SUCCESS)
    264             rcStrict = iemMemStackPopU16Ex(pIemCpu, &pCtx->dx, &TmpRsp);
     264            rcStrict = iemMemStackPopU16Ex(pVCpu, &pCtx->dx, &TmpRsp);
    265265        if (rcStrict == VINF_SUCCESS)
    266             rcStrict = iemMemStackPopU16Ex(pIemCpu, &pCtx->cx, &TmpRsp);
     266            rcStrict = iemMemStackPopU16Ex(pVCpu, &pCtx->cx, &TmpRsp);
    267267        if (rcStrict == VINF_SUCCESS)
    268             rcStrict = iemMemStackPopU16Ex(pIemCpu, &pCtx->ax, &TmpRsp);
     268            rcStrict = iemMemStackPopU16Ex(pVCpu, &pCtx->ax, &TmpRsp);
    269269        if (rcStrict == VINF_SUCCESS)
    270270        {
    271271            pCtx->rsp = TmpRsp.u;
    272             iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     272            iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    273273        }
    274274    }
     
    276276    {
    277277        uint16_t const *pa16Mem = NULL;
    278         rcStrict = iemMemMap(pIemCpu, (void **)&pa16Mem, 16, X86_SREG_SS, GCPtrStart, IEM_ACCESS_STACK_R);
     278        rcStrict = iemMemMap(pVCpu, (void **)&pa16Mem, 16, X86_SREG_SS, GCPtrStart, IEM_ACCESS_STACK_R);
    279279        if (rcStrict == VINF_SUCCESS)
    280280        {
     
    287287            pCtx->cx = pa16Mem[7 - X86_GREG_xCX];
    288288            pCtx->ax = pa16Mem[7 - X86_GREG_xAX];
    289             rcStrict = iemMemCommitAndUnmap(pIemCpu, (void *)pa16Mem, IEM_ACCESS_STACK_R);
     289            rcStrict = iemMemCommitAndUnmap(pVCpu, (void *)pa16Mem, IEM_ACCESS_STACK_R);
    290290            if (rcStrict == VINF_SUCCESS)
    291291            {
    292                 iemRegAddToRsp(pIemCpu, pCtx, 16);
    293                 iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     292                iemRegAddToRsp(pVCpu, pCtx, 16);
     293                iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    294294            }
    295295        }
     
    304304IEM_CIMPL_DEF_0(iemCImpl_popa_32)
    305305{
    306     PCPUMCTX        pCtx        = pIemCpu->CTX_SUFF(pCtx);
    307     RTGCPTR         GCPtrStart  = iemRegGetEffRsp(pIemCpu, pCtx);
     306    PCPUMCTX        pCtx        = pVCpu->iem.s.CTX_SUFF(pCtx);
     307    RTGCPTR         GCPtrStart  = iemRegGetEffRsp(pVCpu, pCtx);
    308308    RTGCPTR         GCPtrLast   = GCPtrStart + 31;
    309309    VBOXSTRICTRC    rcStrict;
     
    317317     */
    318318    /** @todo do popa boundary / wrap-around checks.  */
    319     if (RT_UNLIKELY(   IEM_IS_REAL_OR_V86_MODE(pIemCpu)
     319    if (RT_UNLIKELY(   IEM_IS_REAL_OR_V86_MODE(pVCpu)
    320320                    && (pCtx->cs.u32Limit < GCPtrLast)) ) /* ASSUMES 64-bit RTGCPTR */
    321321    {
     
    323323        RTUINT64U TmpRsp;
    324324        TmpRsp.u = pCtx->rsp;
    325         rcStrict = iemMemStackPopU32Ex(pIemCpu, &pCtx->edi, &TmpRsp);
     325        rcStrict = iemMemStackPopU32Ex(pVCpu, &pCtx->edi, &TmpRsp);
    326326        if (rcStrict == VINF_SUCCESS)
    327             rcStrict = iemMemStackPopU32Ex(pIemCpu, &pCtx->esi, &TmpRsp);
     327            rcStrict = iemMemStackPopU32Ex(pVCpu, &pCtx->esi, &TmpRsp);
    328328        if (rcStrict == VINF_SUCCESS)
    329             rcStrict = iemMemStackPopU32Ex(pIemCpu, &pCtx->ebp, &TmpRsp);
     329            rcStrict = iemMemStackPopU32Ex(pVCpu, &pCtx->ebp, &TmpRsp);
    330330        if (rcStrict == VINF_SUCCESS)
    331331        {
    332             iemRegAddToRspEx(pIemCpu, pCtx, &TmpRsp, 2); /* sp */
    333             rcStrict = iemMemStackPopU32Ex(pIemCpu, &pCtx->ebx, &TmpRsp);
     332            iemRegAddToRspEx(pVCpu, pCtx, &TmpRsp, 2); /* sp */
     333            rcStrict = iemMemStackPopU32Ex(pVCpu, &pCtx->ebx, &TmpRsp);
    334334        }
    335335        if (rcStrict == VINF_SUCCESS)
    336             rcStrict = iemMemStackPopU32Ex(pIemCpu, &pCtx->edx, &TmpRsp);
     336            rcStrict = iemMemStackPopU32Ex(pVCpu, &pCtx->edx, &TmpRsp);
    337337        if (rcStrict == VINF_SUCCESS)
    338             rcStrict = iemMemStackPopU32Ex(pIemCpu, &pCtx->ecx, &TmpRsp);
     338            rcStrict = iemMemStackPopU32Ex(pVCpu, &pCtx->ecx, &TmpRsp);
    339339        if (rcStrict == VINF_SUCCESS)
    340             rcStrict = iemMemStackPopU32Ex(pIemCpu, &pCtx->eax, &TmpRsp);
     340            rcStrict = iemMemStackPopU32Ex(pVCpu, &pCtx->eax, &TmpRsp);
    341341        if (rcStrict == VINF_SUCCESS)
    342342        {
     
    351351#endif
    352352            pCtx->rsp = TmpRsp.u;
    353             iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     353            iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    354354        }
    355355    }
     
    357357    {
    358358        uint32_t const *pa32Mem;
    359         rcStrict = iemMemMap(pIemCpu, (void **)&pa32Mem, 32, X86_SREG_SS, GCPtrStart, IEM_ACCESS_STACK_R);
     359        rcStrict = iemMemMap(pVCpu, (void **)&pa32Mem, 32, X86_SREG_SS, GCPtrStart, IEM_ACCESS_STACK_R);
    360360        if (rcStrict == VINF_SUCCESS)
    361361        {
     
    368368            pCtx->rcx = pa32Mem[7 - X86_GREG_xCX];
    369369            pCtx->rax = pa32Mem[7 - X86_GREG_xAX];
    370             rcStrict = iemMemCommitAndUnmap(pIemCpu, (void *)pa32Mem, IEM_ACCESS_STACK_R);
     370            rcStrict = iemMemCommitAndUnmap(pVCpu, (void *)pa32Mem, IEM_ACCESS_STACK_R);
    371371            if (rcStrict == VINF_SUCCESS)
    372372            {
    373                 iemRegAddToRsp(pIemCpu, pCtx, 32);
    374                 iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     373                iemRegAddToRsp(pVCpu, pCtx, 32);
     374                iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    375375            }
    376376        }
     
    385385IEM_CIMPL_DEF_0(iemCImpl_pusha_16)
    386386{
    387     PCPUMCTX        pCtx        = pIemCpu->CTX_SUFF(pCtx);
    388     RTGCPTR         GCPtrTop    = iemRegGetEffRsp(pIemCpu, pCtx);
     387    PCPUMCTX        pCtx        = pVCpu->iem.s.CTX_SUFF(pCtx);
     388    RTGCPTR         GCPtrTop    = iemRegGetEffRsp(pVCpu, pCtx);
    389389    RTGCPTR         GCPtrBottom = GCPtrTop - 15;
    390390    VBOXSTRICTRC    rcStrict;
     
    399399    /** @todo do pusha boundary / wrap-around checks.  */
    400400    if (RT_UNLIKELY(   GCPtrBottom > GCPtrTop
    401                     && IEM_IS_REAL_OR_V86_MODE(pIemCpu) ) )
     401                    && IEM_IS_REAL_OR_V86_MODE(pVCpu) ) )
    402402    {
    403403        /* word-by-word */
    404404        RTUINT64U TmpRsp;
    405405        TmpRsp.u = pCtx->rsp;
    406         rcStrict = iemMemStackPushU16Ex(pIemCpu, pCtx->ax, &TmpRsp);
     406        rcStrict = iemMemStackPushU16Ex(pVCpu, pCtx->ax, &TmpRsp);
    407407        if (rcStrict == VINF_SUCCESS)
    408             rcStrict = iemMemStackPushU16Ex(pIemCpu, pCtx->cx, &TmpRsp);
     408            rcStrict = iemMemStackPushU16Ex(pVCpu, pCtx->cx, &TmpRsp);
    409409        if (rcStrict == VINF_SUCCESS)
    410             rcStrict = iemMemStackPushU16Ex(pIemCpu, pCtx->dx, &TmpRsp);
     410            rcStrict = iemMemStackPushU16Ex(pVCpu, pCtx->dx, &TmpRsp);
    411411        if (rcStrict == VINF_SUCCESS)
    412             rcStrict = iemMemStackPushU16Ex(pIemCpu, pCtx->bx, &TmpRsp);
     412            rcStrict = iemMemStackPushU16Ex(pVCpu, pCtx->bx, &TmpRsp);
    413413        if (rcStrict == VINF_SUCCESS)
    414             rcStrict = iemMemStackPushU16Ex(pIemCpu, pCtx->sp, &TmpRsp);
     414            rcStrict = iemMemStackPushU16Ex(pVCpu, pCtx->sp, &TmpRsp);
    415415        if (rcStrict == VINF_SUCCESS)
    416             rcStrict = iemMemStackPushU16Ex(pIemCpu, pCtx->bp, &TmpRsp);
     416            rcStrict = iemMemStackPushU16Ex(pVCpu, pCtx->bp, &TmpRsp);
    417417        if (rcStrict == VINF_SUCCESS)
    418             rcStrict = iemMemStackPushU16Ex(pIemCpu, pCtx->si, &TmpRsp);
     418            rcStrict = iemMemStackPushU16Ex(pVCpu, pCtx->si, &TmpRsp);
    419419        if (rcStrict == VINF_SUCCESS)
    420             rcStrict = iemMemStackPushU16Ex(pIemCpu, pCtx->di, &TmpRsp);
     420            rcStrict = iemMemStackPushU16Ex(pVCpu, pCtx->di, &TmpRsp);
    421421        if (rcStrict == VINF_SUCCESS)
    422422        {
    423423            pCtx->rsp = TmpRsp.u;
    424             iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     424            iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    425425        }
    426426    }
     
    429429        GCPtrBottom--;
    430430        uint16_t *pa16Mem = NULL;
    431         rcStrict = iemMemMap(pIemCpu, (void **)&pa16Mem, 16, X86_SREG_SS, GCPtrBottom, IEM_ACCESS_STACK_W);
     431        rcStrict = iemMemMap(pVCpu, (void **)&pa16Mem, 16, X86_SREG_SS, GCPtrBottom, IEM_ACCESS_STACK_W);
    432432        if (rcStrict == VINF_SUCCESS)
    433433        {
     
    440440            pa16Mem[7 - X86_GREG_xCX] = pCtx->cx;
    441441            pa16Mem[7 - X86_GREG_xAX] = pCtx->ax;
    442             rcStrict = iemMemCommitAndUnmap(pIemCpu, (void *)pa16Mem, IEM_ACCESS_STACK_W);
     442            rcStrict = iemMemCommitAndUnmap(pVCpu, (void *)pa16Mem, IEM_ACCESS_STACK_W);
    443443            if (rcStrict == VINF_SUCCESS)
    444444            {
    445                 iemRegSubFromRsp(pIemCpu, pCtx, 16);
    446                 iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     445                iemRegSubFromRsp(pVCpu, pCtx, 16);
     446                iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    447447            }
    448448        }
     
    457457IEM_CIMPL_DEF_0(iemCImpl_pusha_32)
    458458{
    459     PCPUMCTX        pCtx        = pIemCpu->CTX_SUFF(pCtx);
    460     RTGCPTR         GCPtrTop    = iemRegGetEffRsp(pIemCpu, pCtx);
     459    PCPUMCTX        pCtx        = pVCpu->iem.s.CTX_SUFF(pCtx);
     460    RTGCPTR         GCPtrTop    = iemRegGetEffRsp(pVCpu, pCtx);
    461461    RTGCPTR         GCPtrBottom = GCPtrTop - 31;
    462462    VBOXSTRICTRC    rcStrict;
     
    471471    /** @todo do pusha boundary / wrap-around checks.  */
    472472    if (RT_UNLIKELY(   GCPtrBottom > GCPtrTop
    473                     && IEM_IS_REAL_OR_V86_MODE(pIemCpu) ) )
     473                    && IEM_IS_REAL_OR_V86_MODE(pVCpu) ) )
    474474    {
    475475        /* word-by-word */
    476476        RTUINT64U TmpRsp;
    477477        TmpRsp.u = pCtx->rsp;
    478         rcStrict = iemMemStackPushU32Ex(pIemCpu, pCtx->eax, &TmpRsp);
     478        rcStrict = iemMemStackPushU32Ex(pVCpu, pCtx->eax, &TmpRsp);
    479479        if (rcStrict == VINF_SUCCESS)
    480             rcStrict = iemMemStackPushU32Ex(pIemCpu, pCtx->ecx, &TmpRsp);
     480            rcStrict = iemMemStackPushU32Ex(pVCpu, pCtx->ecx, &TmpRsp);
    481481        if (rcStrict == VINF_SUCCESS)
    482             rcStrict = iemMemStackPushU32Ex(pIemCpu, pCtx->edx, &TmpRsp);
     482            rcStrict = iemMemStackPushU32Ex(pVCpu, pCtx->edx, &TmpRsp);
    483483        if (rcStrict == VINF_SUCCESS)
    484             rcStrict = iemMemStackPushU32Ex(pIemCpu, pCtx->ebx, &TmpRsp);
     484            rcStrict = iemMemStackPushU32Ex(pVCpu, pCtx->ebx, &TmpRsp);
    485485        if (rcStrict == VINF_SUCCESS)
    486             rcStrict = iemMemStackPushU32Ex(pIemCpu, pCtx->esp, &TmpRsp);
     486            rcStrict = iemMemStackPushU32Ex(pVCpu, pCtx->esp, &TmpRsp);
    487487        if (rcStrict == VINF_SUCCESS)
    488             rcStrict = iemMemStackPushU32Ex(pIemCpu, pCtx->ebp, &TmpRsp);
     488            rcStrict = iemMemStackPushU32Ex(pVCpu, pCtx->ebp, &TmpRsp);
    489489        if (rcStrict == VINF_SUCCESS)
    490             rcStrict = iemMemStackPushU32Ex(pIemCpu, pCtx->esi, &TmpRsp);
     490            rcStrict = iemMemStackPushU32Ex(pVCpu, pCtx->esi, &TmpRsp);
    491491        if (rcStrict == VINF_SUCCESS)
    492             rcStrict = iemMemStackPushU32Ex(pIemCpu, pCtx->edi, &TmpRsp);
     492            rcStrict = iemMemStackPushU32Ex(pVCpu, pCtx->edi, &TmpRsp);
    493493        if (rcStrict == VINF_SUCCESS)
    494494        {
    495495            pCtx->rsp = TmpRsp.u;
    496             iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     496            iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    497497        }
    498498    }
     
    501501        GCPtrBottom--;
    502502        uint32_t *pa32Mem;
    503         rcStrict = iemMemMap(pIemCpu, (void **)&pa32Mem, 32, X86_SREG_SS, GCPtrBottom, IEM_ACCESS_STACK_W);
     503        rcStrict = iemMemMap(pVCpu, (void **)&pa32Mem, 32, X86_SREG_SS, GCPtrBottom, IEM_ACCESS_STACK_W);
    504504        if (rcStrict == VINF_SUCCESS)
    505505        {
     
    512512            pa32Mem[7 - X86_GREG_xCX] = pCtx->ecx;
    513513            pa32Mem[7 - X86_GREG_xAX] = pCtx->eax;
    514             rcStrict = iemMemCommitAndUnmap(pIemCpu, pa32Mem, IEM_ACCESS_STACK_W);
     514            rcStrict = iemMemCommitAndUnmap(pVCpu, pa32Mem, IEM_ACCESS_STACK_W);
    515515            if (rcStrict == VINF_SUCCESS)
    516516            {
    517                 iemRegSubFromRsp(pIemCpu, pCtx, 32);
    518                 iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     517                iemRegSubFromRsp(pVCpu, pCtx, 32);
     518                iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    519519            }
    520520        }
     
    532532IEM_CIMPL_DEF_1(iemCImpl_pushf, IEMMODE, enmEffOpSize)
    533533{
    534     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     534    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    535535
    536536    /*
     
    538538     * doing this in a C implementation).
    539539     */
    540     uint32_t fEfl = IEMMISC_GET_EFL(pIemCpu, pCtx);
     540    uint32_t fEfl = IEMMISC_GET_EFL(pVCpu, pCtx);
    541541    if (   (fEfl & X86_EFL_VM)
    542542        && X86_EFL_GET_IOPL(fEfl) != 3 )
     
    545545        if (   enmEffOpSize != IEMMODE_16BIT
    546546            || !(pCtx->cr4 & X86_CR4_VME))
    547             return iemRaiseGeneralProtectionFault0(pIemCpu);
     547            return iemRaiseGeneralProtectionFault0(pVCpu);
    548548        fEfl &= ~X86_EFL_IF;          /* (RF and VM are out of range) */
    549549        fEfl |= (fEfl & X86_EFL_VIF) >> (19 - 9);
    550         return iemMemStackPushU16(pIemCpu, (uint16_t)fEfl);
     550        return iemMemStackPushU16(pVCpu, (uint16_t)fEfl);
    551551    }
    552552
     
    561561        case IEMMODE_16BIT:
    562562            AssertCompile(IEMTARGETCPU_8086 <= IEMTARGETCPU_186 && IEMTARGETCPU_V20 <= IEMTARGETCPU_186 && IEMTARGETCPU_286 > IEMTARGETCPU_186);
    563             if (IEM_GET_TARGET_CPU(pIemCpu) <= IEMTARGETCPU_186)
     563            if (IEM_GET_TARGET_CPU(pVCpu) <= IEMTARGETCPU_186)
    564564                fEfl |= UINT16_C(0xf000);
    565             rcStrict = iemMemStackPushU16(pIemCpu, (uint16_t)fEfl);
     565            rcStrict = iemMemStackPushU16(pVCpu, (uint16_t)fEfl);
    566566            break;
    567567        case IEMMODE_32BIT:
    568             rcStrict = iemMemStackPushU32(pIemCpu, fEfl);
     568            rcStrict = iemMemStackPushU32(pVCpu, fEfl);
    569569            break;
    570570        case IEMMODE_64BIT:
    571             rcStrict = iemMemStackPushU64(pIemCpu, fEfl);
     571            rcStrict = iemMemStackPushU64(pVCpu, fEfl);
    572572            break;
    573573        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    576576        return rcStrict;
    577577
    578     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     578    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    579579    return VINF_SUCCESS;
    580580}
     
    588588IEM_CIMPL_DEF_1(iemCImpl_popf, IEMMODE, enmEffOpSize)
    589589{
    590     PCPUMCTX        pCtx    = pIemCpu->CTX_SUFF(pCtx);
    591     uint32_t const  fEflOld = IEMMISC_GET_EFL(pIemCpu, pCtx);
     590    PCPUMCTX        pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
     591    uint32_t const  fEflOld = IEMMISC_GET_EFL(pVCpu, pCtx);
    592592    VBOXSTRICTRC    rcStrict;
    593593    uint32_t        fEflNew;
     
    608608                {
    609609                    uint16_t u16Value;
    610                     rcStrict = iemMemStackPopU16(pIemCpu, &u16Value);
     610                    rcStrict = iemMemStackPopU16(pVCpu, &u16Value);
    611611                    if (rcStrict != VINF_SUCCESS)
    612612                        return rcStrict;
     
    615615                }
    616616                case IEMMODE_32BIT:
    617                     rcStrict = iemMemStackPopU32(pIemCpu, &fEflNew);
     617                    rcStrict = iemMemStackPopU32(pVCpu, &fEflNew);
    618618                    if (rcStrict != VINF_SUCCESS)
    619619                        return rcStrict;
     
    622622            }
    623623
    624             const uint32_t fPopfBits = IEMCPU_TO_VM(pIemCpu)->cpum.ro.GuestFeatures.enmMicroarch != kCpumMicroarch_Intel_80386
     624            const uint32_t fPopfBits = pVCpu->CTX_SUFF(pVM)->cpum.ro.GuestFeatures.enmMicroarch != kCpumMicroarch_Intel_80386
    625625                                     ? X86_EFL_POPF_BITS : X86_EFL_POPF_BITS_386;
    626626            fEflNew &=   fPopfBits & ~(X86_EFL_IOPL);
     
    636636            RTUINT64U   TmpRsp;
    637637            TmpRsp.u = pCtx->rsp;
    638             rcStrict = iemMemStackPopU16Ex(pIemCpu, &u16Value, &TmpRsp);
     638            rcStrict = iemMemStackPopU16Ex(pVCpu, &u16Value, &TmpRsp);
    639639            if (rcStrict != VINF_SUCCESS)
    640640                return rcStrict;
     
    645645                     && (fEflOld  & X86_EFL_VIP))
    646646                ||  (u16Value & X86_EFL_TF) )
    647                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     647                return iemRaiseGeneralProtectionFault0(pVCpu);
    648648
    649649            fEflNew = u16Value | (fEflOld & UINT32_C(0xffff0000) & ~X86_EFL_VIF);
     
    655655        }
    656656        else
    657             return iemRaiseGeneralProtectionFault0(pIemCpu);
     657            return iemRaiseGeneralProtectionFault0(pVCpu);
    658658
    659659    }
     
    669669            {
    670670                uint16_t u16Value;
    671                 rcStrict = iemMemStackPopU16(pIemCpu, &u16Value);
     671                rcStrict = iemMemStackPopU16(pVCpu, &u16Value);
    672672                if (rcStrict != VINF_SUCCESS)
    673673                    return rcStrict;
     
    685685                 *    therefore be used to detect 286 or 386 CPU in real mode.
    686686                 */
    687                 if (   IEM_GET_TARGET_CPU(pIemCpu) == IEMTARGETCPU_286
     687                if (   IEM_GET_TARGET_CPU(pVCpu) == IEMTARGETCPU_286
    688688                    && !(pCtx->cr0 & X86_CR0_PE) )
    689689                    fEflNew &= ~(X86_EFL_NT | X86_EFL_IOPL);
     
    691691            }
    692692            case IEMMODE_32BIT:
    693                 rcStrict = iemMemStackPopU32(pIemCpu, &fEflNew);
     693                rcStrict = iemMemStackPopU32(pVCpu, &fEflNew);
    694694                if (rcStrict != VINF_SUCCESS)
    695695                    return rcStrict;
     
    698698            {
    699699                uint64_t u64Value;
    700                 rcStrict = iemMemStackPopU64(pIemCpu, &u64Value);
     700                rcStrict = iemMemStackPopU64(pVCpu, &u64Value);
    701701                if (rcStrict != VINF_SUCCESS)
    702702                    return rcStrict;
     
    708708
    709709        /* Merge them with the current flags. */
    710         const uint32_t fPopfBits = IEMCPU_TO_VM(pIemCpu)->cpum.ro.GuestFeatures.enmMicroarch != kCpumMicroarch_Intel_80386
     710        const uint32_t fPopfBits = pVCpu->CTX_SUFF(pVM)->cpum.ro.GuestFeatures.enmMicroarch != kCpumMicroarch_Intel_80386
    711711                                 ? X86_EFL_POPF_BITS : X86_EFL_POPF_BITS_386;
    712712        if (   (fEflNew & (X86_EFL_IOPL | X86_EFL_IF)) == (fEflOld & (X86_EFL_IOPL | X86_EFL_IF))
    713             || pIemCpu->uCpl == 0)
     713            || pVCpu->iem.s.uCpl == 0)
    714714        {
    715715            fEflNew &=  fPopfBits;
    716716            fEflNew |= ~fPopfBits & fEflOld;
    717717        }
    718         else if (pIemCpu->uCpl <= X86_EFL_GET_IOPL(fEflOld))
     718        else if (pVCpu->iem.s.uCpl <= X86_EFL_GET_IOPL(fEflOld))
    719719        {
    720720            fEflNew &=   fPopfBits & ~(X86_EFL_IOPL);
     
    732732     */
    733733    Assert(fEflNew & RT_BIT_32(1));
    734     IEMMISC_SET_EFL(pIemCpu, pCtx, fEflNew);
    735     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     734    IEMMISC_SET_EFL(pVCpu, pCtx, fEflNew);
     735    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    736736
    737737    return VINF_SUCCESS;
     
    748748IEM_CIMPL_DEF_1(iemCImpl_call_16, uint16_t, uNewPC)
    749749{
    750     PCPUMCTX pCtx   = pIemCpu->CTX_SUFF(pCtx);
     750    PCPUMCTX pCtx   = pVCpu->iem.s.CTX_SUFF(pCtx);
    751751    uint16_t uOldPC = pCtx->ip + cbInstr;
    752752    if (uNewPC > pCtx->cs.u32Limit)
    753         return iemRaiseGeneralProtectionFault0(pIemCpu);
    754 
    755     VBOXSTRICTRC rcStrict = iemMemStackPushU16(pIemCpu, uOldPC);
     753        return iemRaiseGeneralProtectionFault0(pVCpu);
     754
     755    VBOXSTRICTRC rcStrict = iemMemStackPushU16(pVCpu, uOldPC);
    756756    if (rcStrict != VINF_SUCCESS)
    757757        return rcStrict;
     
    761761
    762762    /* Flush the prefetch buffer. */
    763     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     763    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    764764    return VINF_SUCCESS;
    765765}
     
    773773IEM_CIMPL_DEF_1(iemCImpl_call_rel_16, int16_t, offDisp)
    774774{
    775     PCPUMCTX pCtx   = pIemCpu->CTX_SUFF(pCtx);
     775    PCPUMCTX pCtx   = pVCpu->iem.s.CTX_SUFF(pCtx);
    776776    uint16_t uOldPC = pCtx->ip + cbInstr;
    777777    uint16_t uNewPC = uOldPC + offDisp;
    778778    if (uNewPC > pCtx->cs.u32Limit)
    779         return iemRaiseGeneralProtectionFault0(pIemCpu);
    780 
    781     VBOXSTRICTRC rcStrict = iemMemStackPushU16(pIemCpu, uOldPC);
     779        return iemRaiseGeneralProtectionFault0(pVCpu);
     780
     781    VBOXSTRICTRC rcStrict = iemMemStackPushU16(pVCpu, uOldPC);
    782782    if (rcStrict != VINF_SUCCESS)
    783783        return rcStrict;
     
    787787
    788788    /* Flush the prefetch buffer. */
    789     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     789    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    790790    return VINF_SUCCESS;
    791791}
     
    801801IEM_CIMPL_DEF_1(iemCImpl_call_32, uint32_t, uNewPC)
    802802{
    803     PCPUMCTX pCtx   = pIemCpu->CTX_SUFF(pCtx);
     803    PCPUMCTX pCtx   = pVCpu->iem.s.CTX_SUFF(pCtx);
    804804    uint32_t uOldPC = pCtx->eip + cbInstr;
    805805    if (uNewPC > pCtx->cs.u32Limit)
    806         return iemRaiseGeneralProtectionFault0(pIemCpu);
    807 
    808     VBOXSTRICTRC rcStrict = iemMemStackPushU32(pIemCpu, uOldPC);
     806        return iemRaiseGeneralProtectionFault0(pVCpu);
     807
     808    VBOXSTRICTRC rcStrict = iemMemStackPushU32(pVCpu, uOldPC);
    809809    if (rcStrict != VINF_SUCCESS)
    810810        return rcStrict;
     
    816816    if (   !pCtx->eflags.Bits.u1IF
    817817        && (pCtx->cr0 & X86_CR0_PG)
    818         && !CSAMIsEnabled(IEMCPU_TO_VM(pIemCpu))
    819         && pIemCpu->uCpl == 0)
    820     {
    821         EMSTATE enmState = EMGetState(IEMCPU_TO_VMCPU(pIemCpu));
     818        && !CSAMIsEnabled(pVCpu->CTX_SUFF(pVM))
     819        && pVCpu->iem.s.uCpl == 0)
     820    {
     821        EMSTATE enmState = EMGetState(pVCpu);
    822822        if (   enmState == EMSTATE_IEM_THEN_REM
    823823            || enmState == EMSTATE_IEM
    824824            || enmState == EMSTATE_REM)
    825             CSAMR3RecordCallAddress(IEMCPU_TO_VM(pIemCpu), pCtx->eip);
     825            CSAMR3RecordCallAddress(pVCpu->CTX_SUFF(pVM), pCtx->eip);
    826826    }
    827827#endif
     
    831831
    832832    /* Flush the prefetch buffer. */
    833     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     833    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    834834    return VINF_SUCCESS;
    835835}
     
    843843IEM_CIMPL_DEF_1(iemCImpl_call_rel_32, int32_t, offDisp)
    844844{
    845     PCPUMCTX pCtx   = pIemCpu->CTX_SUFF(pCtx);
     845    PCPUMCTX pCtx   = pVCpu->iem.s.CTX_SUFF(pCtx);
    846846    uint32_t uOldPC = pCtx->eip + cbInstr;
    847847    uint32_t uNewPC = uOldPC + offDisp;
    848848    if (uNewPC > pCtx->cs.u32Limit)
    849         return iemRaiseGeneralProtectionFault0(pIemCpu);
    850 
    851     VBOXSTRICTRC rcStrict = iemMemStackPushU32(pIemCpu, uOldPC);
     849        return iemRaiseGeneralProtectionFault0(pVCpu);
     850
     851    VBOXSTRICTRC rcStrict = iemMemStackPushU32(pVCpu, uOldPC);
    852852    if (rcStrict != VINF_SUCCESS)
    853853        return rcStrict;
     
    857857
    858858    /* Flush the prefetch buffer. */
    859     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     859    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    860860    return VINF_SUCCESS;
    861861}
     
    871871IEM_CIMPL_DEF_1(iemCImpl_call_64, uint64_t, uNewPC)
    872872{
    873     PCPUMCTX pCtx   = pIemCpu->CTX_SUFF(pCtx);
     873    PCPUMCTX pCtx   = pVCpu->iem.s.CTX_SUFF(pCtx);
    874874    uint64_t uOldPC = pCtx->rip + cbInstr;
    875875    if (!IEM_IS_CANONICAL(uNewPC))
    876         return iemRaiseGeneralProtectionFault0(pIemCpu);
    877 
    878     VBOXSTRICTRC rcStrict = iemMemStackPushU64(pIemCpu, uOldPC);
     876        return iemRaiseGeneralProtectionFault0(pVCpu);
     877
     878    VBOXSTRICTRC rcStrict = iemMemStackPushU64(pVCpu, uOldPC);
    879879    if (rcStrict != VINF_SUCCESS)
    880880        return rcStrict;
     
    884884
    885885    /* Flush the prefetch buffer. */
    886     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     886    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    887887    return VINF_SUCCESS;
    888888}
     
    896896IEM_CIMPL_DEF_1(iemCImpl_call_rel_64, int64_t, offDisp)
    897897{
    898     PCPUMCTX pCtx   = pIemCpu->CTX_SUFF(pCtx);
     898    PCPUMCTX pCtx   = pVCpu->iem.s.CTX_SUFF(pCtx);
    899899    uint64_t uOldPC = pCtx->rip + cbInstr;
    900900    uint64_t uNewPC = uOldPC + offDisp;
    901901    if (!IEM_IS_CANONICAL(uNewPC))
    902         return iemRaiseNotCanonical(pIemCpu);
    903 
    904     VBOXSTRICTRC rcStrict = iemMemStackPushU64(pIemCpu, uOldPC);
     902        return iemRaiseNotCanonical(pVCpu);
     903
     904    VBOXSTRICTRC rcStrict = iemMemStackPushU64(pVCpu, uOldPC);
    905905    if (rcStrict != VINF_SUCCESS)
    906906        return rcStrict;
     
    910910
    911911    /* Flush the prefetch buffer. */
    912     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     912    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    913913
    914914    return VINF_SUCCESS;
     
    934934           || pDesc->Legacy.Gate.u4Type == X86_SEL_TYPE_SYS_386_TSS_AVAIL);
    935935
    936     if (   pDesc->Legacy.Gate.u2Dpl < pIemCpu->uCpl
     936    if (   pDesc->Legacy.Gate.u2Dpl < pVCpu->iem.s.uCpl
    937937        || pDesc->Legacy.Gate.u2Dpl < (uSel & X86_SEL_RPL))
    938938    {
    939939        Log(("BranchTaskSegment invalid priv. uSel=%04x TSS DPL=%d CPL=%u Sel RPL=%u -> #GP\n", uSel, pDesc->Legacy.Gate.u2Dpl,
    940              pIemCpu->uCpl, (uSel & X86_SEL_RPL)));
    941         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel & X86_SEL_MASK_OFF_RPL);
     940             pVCpu->iem.s.uCpl, (uSel & X86_SEL_RPL)));
     941        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel & X86_SEL_MASK_OFF_RPL);
    942942    }
    943943
     
    948948    {
    949949        Log(("BranchTaskSegment TSS not present uSel=%04x -> #NP\n", uSel));
    950         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uSel & X86_SEL_MASK_OFF_RPL);
    951     }
    952 
    953     PCPUMCTX pCtx     = pIemCpu->CTX_SUFF(pCtx);
     950        return iemRaiseSelectorNotPresentBySelector(pVCpu, uSel & X86_SEL_MASK_OFF_RPL);
     951    }
     952
     953    PCPUMCTX pCtx     = pVCpu->iem.s.CTX_SUFF(pCtx);
    954954    uint32_t uNextEip = pCtx->eip + cbInstr;
    955     return iemTaskSwitch(pIemCpu, pIemCpu->CTX_SUFF(pCtx), enmBranch == IEMBRANCH_JUMP ? IEMTASKSWITCH_JUMP : IEMTASKSWITCH_CALL,
     955    return iemTaskSwitch(pVCpu, pVCpu->iem.s.CTX_SUFF(pCtx), enmBranch == IEMBRANCH_JUMP ? IEMTASKSWITCH_JUMP : IEMTASKSWITCH_CALL,
    956956                         uNextEip, 0 /* fFlags */, 0 /* uErr */, 0 /* uCr2 */, uSel, pDesc);
    957957#endif
     
    975975    Assert(enmBranch == IEMBRANCH_JUMP || enmBranch == IEMBRANCH_CALL);
    976976
    977     if (   pDesc->Legacy.Gate.u2Dpl < pIemCpu->uCpl
     977    if (   pDesc->Legacy.Gate.u2Dpl < pVCpu->iem.s.uCpl
    978978        || pDesc->Legacy.Gate.u2Dpl < (uSel & X86_SEL_RPL))
    979979    {
    980980        Log(("BranchTaskGate invalid priv. uSel=%04x TSS DPL=%d CPL=%u Sel RPL=%u -> #GP\n", uSel, pDesc->Legacy.Gate.u2Dpl,
    981              pIemCpu->uCpl, (uSel & X86_SEL_RPL)));
    982         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel & X86_SEL_MASK_OFF_RPL);
     981             pVCpu->iem.s.uCpl, (uSel & X86_SEL_RPL)));
     982        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel & X86_SEL_MASK_OFF_RPL);
    983983    }
    984984
     
    989989    {
    990990        Log(("BranchTaskSegment segment not present uSel=%04x -> #NP\n", uSel));
    991         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uSel & X86_SEL_MASK_OFF_RPL);
     991        return iemRaiseSelectorNotPresentBySelector(pVCpu, uSel & X86_SEL_MASK_OFF_RPL);
    992992    }
    993993
     
    999999    {
    10001000        Log(("BranchTaskGate TSS is in LDT. uSel=%04x uSelTss=%04x -> #GP\n", uSel, uSelTss));
    1001         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel & X86_SEL_MASK_OFF_RPL);
     1001        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel & X86_SEL_MASK_OFF_RPL);
    10021002    }
    10031003
    10041004    IEMSELDESC TssDesc;
    1005     VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &TssDesc, uSelTss, X86_XCPT_GP);
     1005    VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pVCpu, &TssDesc, uSelTss, X86_XCPT_GP);
    10061006    if (rcStrict != VINF_SUCCESS)
    10071007        return rcStrict;
     
    10111011        Log(("BranchTaskGate TSS is busy. uSel=%04x uSelTss=%04x DescType=%#x -> #GP\n", uSel, uSelTss,
    10121012             TssDesc.Legacy.Gate.u4Type));
    1013         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel & X86_SEL_MASK_OFF_RPL);
     1013        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel & X86_SEL_MASK_OFF_RPL);
    10141014    }
    10151015
     
    10171017    {
    10181018        Log(("BranchTaskGate TSS is not present. uSel=%04x uSelTss=%04x -> #NP\n", uSel, uSelTss));
    1019         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uSelTss & X86_SEL_MASK_OFF_RPL);
    1020     }
    1021 
    1022     PCPUMCTX pCtx     = pIemCpu->CTX_SUFF(pCtx);
     1019        return iemRaiseSelectorNotPresentBySelector(pVCpu, uSelTss & X86_SEL_MASK_OFF_RPL);
     1020    }
     1021
     1022    PCPUMCTX pCtx     = pVCpu->iem.s.CTX_SUFF(pCtx);
    10231023    uint32_t uNextEip = pCtx->eip + cbInstr;
    1024     return iemTaskSwitch(pIemCpu, pIemCpu->CTX_SUFF(pCtx), enmBranch == IEMBRANCH_JUMP ? IEMTASKSWITCH_JUMP : IEMTASKSWITCH_CALL,
     1024    return iemTaskSwitch(pVCpu, pVCpu->iem.s.CTX_SUFF(pCtx), enmBranch == IEMBRANCH_JUMP ? IEMTASKSWITCH_JUMP : IEMTASKSWITCH_CALL,
    10251025                         uNextEip, 0 /* fFlags */, 0 /* uErr */, 0 /* uCr2 */, uSelTss, &TssDesc);
    10261026#endif
     
    10741074
    10751075    /* Perform DPL checks on the gate descriptor. */
    1076     if (   pDesc->Legacy.Gate.u2Dpl < pIemCpu->uCpl
     1076    if (   pDesc->Legacy.Gate.u2Dpl < pVCpu->iem.s.uCpl
    10771077        || pDesc->Legacy.Gate.u2Dpl < (uSel & X86_SEL_RPL))
    10781078    {
    10791079        Log(("BranchCallGate invalid priv. uSel=%04x Gate DPL=%d CPL=%u Sel RPL=%u -> #GP\n", uSel, pDesc->Legacy.Gate.u2Dpl,
    1080              pIemCpu->uCpl, (uSel & X86_SEL_RPL)));
    1081         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1080             pVCpu->iem.s.uCpl, (uSel & X86_SEL_RPL)));
     1081        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    10821082    }
    10831083
     
    10861086    {
    10871087        Log(("BranchCallGate Gate not present uSel=%04x -> #NP\n", uSel));
    1088         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uSel);
     1088        return iemRaiseSelectorNotPresentBySelector(pVCpu, uSel);
    10891089    }
    10901090
     
    10931093     */
    10941094    uNewCS = pDesc->Legacy.Gate.u16Sel;
    1095     rcStrict = iemMemFetchSelDesc(pIemCpu, &DescCS, uNewCS, X86_XCPT_GP);
     1095    rcStrict = iemMemFetchSelDesc(pVCpu, &DescCS, uNewCS, X86_XCPT_GP);
    10961096    if (rcStrict != VINF_SUCCESS)
    10971097        return rcStrict;
     
    11031103        Log(("BranchCallGate %04x:%08RX64 -> not a code selector (u1DescType=%u u4Type=%#x).\n",
    11041104             uNewCS, uNewRip, DescCS.Legacy.Gen.u1DescType, DescCS.Legacy.Gen.u4Type));
    1105         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCS);
     1105        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCS);
    11061106    }
    11071107
     
    11111111        if (DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_CONF)
    11121112        {
    1113             if (DescCS.Legacy.Gen.u2Dpl > pIemCpu->uCpl)
     1113            if (DescCS.Legacy.Gen.u2Dpl > pVCpu->iem.s.uCpl)
    11141114            {
    11151115                Log(("BranchCallGate jump (conforming) bad DPL uNewCS=%04x Gate DPL=%d CPL=%u -> #GP\n",
    1116                      uNewCS, DescCS.Legacy.Gen.u2Dpl, pIemCpu->uCpl));
    1117                 return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCS);
     1116                     uNewCS, DescCS.Legacy.Gen.u2Dpl, pVCpu->iem.s.uCpl));
     1117                return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCS);
    11181118            }
    11191119        }
    11201120        else
    11211121        {
    1122             if (DescCS.Legacy.Gen.u2Dpl != pIemCpu->uCpl)
     1122            if (DescCS.Legacy.Gen.u2Dpl != pVCpu->iem.s.uCpl)
    11231123            {
    11241124                Log(("BranchCallGate jump (non-conforming) bad DPL uNewCS=%04x Gate DPL=%d CPL=%u -> #GP\n",
    1125                      uNewCS, DescCS.Legacy.Gen.u2Dpl, pIemCpu->uCpl));
    1126                 return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCS);
     1125                     uNewCS, DescCS.Legacy.Gen.u2Dpl, pVCpu->iem.s.uCpl));
     1126                return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCS);
    11271127            }
    11281128        }
     
    11311131    {
    11321132        Assert(enmBranch == IEMBRANCH_CALL);
    1133         if (DescCS.Legacy.Gen.u2Dpl > pIemCpu->uCpl)
     1133        if (DescCS.Legacy.Gen.u2Dpl > pVCpu->iem.s.uCpl)
    11341134        {
    11351135            Log(("BranchCallGate call invalid priv. uNewCS=%04x Gate DPL=%d CPL=%u -> #GP\n",
    1136                  uNewCS, DescCS.Legacy.Gen.u2Dpl, pIemCpu->uCpl));
    1137             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCS & X86_SEL_MASK_OFF_RPL);
     1136                 uNewCS, DescCS.Legacy.Gen.u2Dpl, pVCpu->iem.s.uCpl));
     1137            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCS & X86_SEL_MASK_OFF_RPL);
    11381138        }
    11391139    }
    11401140
    11411141    /* Additional long mode checks. */
    1142     if (IEM_IS_LONG_MODE(pIemCpu))
     1142    if (IEM_IS_LONG_MODE(pVCpu))
    11431143    {
    11441144        if (!DescCS.Legacy.Gen.u1Long)
    11451145        {
    11461146            Log(("BranchCallGate uNewCS %04x -> not a 64-bit code segment.\n", uNewCS));
    1147             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCS);
     1147            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCS);
    11481148        }
    11491149
     
    11531153        {
    11541154            Log(("BranchCallGate uNewCS %04x -> both L and D are set.\n", uNewCS));
    1155             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCS);
     1155            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCS);
    11561156        }
    11571157    }
     
    11601160    {
    11611161        Log(("BranchCallGate target CS is not present. uSel=%04x uNewCS=%04x -> #NP(CS)\n", uSel, uNewCS));
    1162         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uNewCS);
    1163     }
    1164 
    1165     pCtx = pIemCpu->CTX_SUFF(pCtx);
     1162        return iemRaiseSelectorNotPresentBySelector(pVCpu, uNewCS);
     1163    }
     1164
     1165    pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    11661166
    11671167    if (enmBranch == IEMBRANCH_JUMP)
     
    11831183            {
    11841184                Log(("BranchCallGate jump %04x:%08RX64 -> out of bounds (%#x) -> #GP(0)\n", uNewCS, uNewRip, cbLimit));
    1185                 return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, 0);
     1185                return iemRaiseGeneralProtectionFaultBySelector(pVCpu, 0);
    11861186            }
    11871187            u64Base = X86DESC_BASE(&DescCS.Legacy);
     
    11921192        {
    11931193            Log(("BranchCallGate jump %04x:%016RX64 - not canonical -> #GP\n", uNewCS, uNewRip));
    1194             return iemRaiseNotCanonical(pIemCpu);
     1194            return iemRaiseNotCanonical(pVCpu);
    11951195        }
    11961196
     
    12011201        if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    12021202        {
    1203             rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewCS);
     1203            rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewCS);
    12041204            if (rcStrict != VINF_SUCCESS)
    12051205                return rcStrict;
     
    12111211        pCtx->rip         = uNewRip;
    12121212        pCtx->cs.Sel      = uNewCS & X86_SEL_MASK_OFF_RPL;
    1213         pCtx->cs.Sel     |= pIemCpu->uCpl; /** @todo is this right for conforming segs? or in general? */
     1213        pCtx->cs.Sel     |= pVCpu->iem.s.uCpl; /** @todo is this right for conforming segs? or in general? */
    12141214        pCtx->cs.ValidSel = pCtx->cs.Sel;
    12151215        pCtx->cs.fFlags   = CPUMSELREG_FLAGS_VALID;
     
    12171217        pCtx->cs.u32Limit = cbLimit;
    12181218        pCtx->cs.u64Base  = u64Base;
    1219         pIemCpu->enmCpuMode = iemCalcCpuMode(pCtx);
     1219        pVCpu->iem.s.enmCpuMode = iemCalcCpuMode(pCtx);
    12201220    }
    12211221    else
     
    12241224        /* Calls are much more complicated. */
    12251225
    1226         if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_CONF) && (DescCS.Legacy.Gen.u2Dpl < pIemCpu->uCpl))
     1226        if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_CONF) && (DescCS.Legacy.Gen.u2Dpl < pVCpu->iem.s.uCpl))
    12271227        {
    12281228            uint16_t    offNewStack;    /* Offset of new stack in TSS. */
     
    12491249            /* Figure out where the new stack pointer is stored in the TSS. */
    12501250            uNewCSDpl = DescCS.Legacy.Gen.u2Dpl;
    1251             if (!IEM_IS_LONG_MODE(pIemCpu))
     1251            if (!IEM_IS_LONG_MODE(pVCpu))
    12521252            {
    12531253                if (pCtx->tr.Attr.n.u4Type == X86_SEL_TYPE_SYS_386_TSS_BUSY)
     
    12741274            {
    12751275                Log(("BranchCallGate inner stack past TSS limit - %u > %u -> #TS(TSS)\n", offNewStack + cbNewStack - 1, pCtx->tr.u32Limit));
    1276                 return iemRaiseTaskSwitchFaultBySelector(pIemCpu, pCtx->tr.Sel);
     1276                return iemRaiseTaskSwitchFaultBySelector(pVCpu, pCtx->tr.Sel);
    12771277            }
    12781278
    12791279            GCPtrTSS = pCtx->tr.u64Base + offNewStack;
    1280             rcStrict = iemMemMap(pIemCpu, &uPtrTSS.pv, cbNewStack, UINT8_MAX, GCPtrTSS, IEM_ACCESS_SYS_R);
     1280            rcStrict = iemMemMap(pVCpu, &uPtrTSS.pv, cbNewStack, UINT8_MAX, GCPtrTSS, IEM_ACCESS_SYS_R);
    12811281            if (rcStrict != VINF_SUCCESS)
    12821282            {
     
    12851285            }
    12861286
    1287             if (!IEM_IS_LONG_MODE(pIemCpu))
     1287            if (!IEM_IS_LONG_MODE(pVCpu))
    12881288            {
    12891289                if (pCtx->tr.Attr.n.u4Type == X86_SEL_TYPE_SYS_386_TSS_BUSY)
     
    13081308
    13091309            /* Done with the TSS now. */
    1310             rcStrict = iemMemCommitAndUnmap(pIemCpu, uPtrTSS.pv, IEM_ACCESS_SYS_R);
     1310            rcStrict = iemMemCommitAndUnmap(pVCpu, uPtrTSS.pv, IEM_ACCESS_SYS_R);
    13111311            if (rcStrict != VINF_SUCCESS)
    13121312            {
     
    13191319
    13201320            /* If EFER.LMA is 0, there's extra work to do. */
    1321             if (!IEM_IS_LONG_MODE(pIemCpu))
     1321            if (!IEM_IS_LONG_MODE(pVCpu))
    13221322            {
    13231323                if ((uNewSS & X86_SEL_MASK_OFF_RPL) == 0)
    13241324                {
    13251325                    Log(("BranchCallGate new SS NULL -> #TS(NewSS)\n"));
    1326                     return iemRaiseTaskSwitchFaultBySelector(pIemCpu, uNewSS);
     1326                    return iemRaiseTaskSwitchFaultBySelector(pVCpu, uNewSS);
    13271327                }
    13281328
    13291329                /* Grab the new SS descriptor. */
    1330                 rcStrict = iemMemFetchSelDesc(pIemCpu, &DescSS, uNewSS, X86_XCPT_SS);
     1330                rcStrict = iemMemFetchSelDesc(pVCpu, &DescSS, uNewSS, X86_XCPT_SS);
    13311331                if (rcStrict != VINF_SUCCESS)
    13321332                    return rcStrict;
     
    13381338                    Log(("BranchCallGate call bad RPL/DPL uNewSS=%04x SS DPL=%d CS DPL=%u -> #TS(NewSS)\n",
    13391339                         uNewSS, DescCS.Legacy.Gen.u2Dpl, DescCS.Legacy.Gen.u2Dpl));
    1340                     return iemRaiseTaskSwitchFaultBySelector(pIemCpu, uNewSS);
     1340                    return iemRaiseTaskSwitchFaultBySelector(pVCpu, uNewSS);
    13411341                }
    13421342
     
    13451345                {
    13461346                    Log(("BranchCallGate call new SS -> not a writable data selector (u4Type=%#x)\n", DescSS.Legacy.Gen.u4Type));
    1347                     return iemRaiseTaskSwitchFaultBySelector(pIemCpu, uNewSS);
     1347                    return iemRaiseTaskSwitchFaultBySelector(pVCpu, uNewSS);
    13481348                }
    13491349
     
    13511351                {
    13521352                    Log(("BranchCallGate New stack not present uSel=%04x -> #SS(NewSS)\n", uNewSS));
    1353                     return iemRaiseStackSelectorNotPresentBySelector(pIemCpu, uNewSS);
     1353                    return iemRaiseStackSelectorNotPresentBySelector(pVCpu, uNewSS);
    13541354                }
    13551355                if (pDesc->Legacy.Gate.u4Type == X86_SEL_TYPE_SYS_386_CALL_GATE)
     
    13611361            {
    13621362                /* Just grab the new (NULL) SS descriptor. */
    1363                 rcStrict = iemMemFetchSelDesc(pIemCpu, &DescSS, uNewSS, X86_XCPT_SS);
     1363                rcStrict = iemMemFetchSelDesc(pVCpu, &DescSS, uNewSS, X86_XCPT_SS);
    13641364                if (rcStrict != VINF_SUCCESS)
    13651365                    return rcStrict;
     
    13821382            if (!(DescSS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    13831383            {
    1384                 rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewSS);
     1384                rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewSS);
    13851385                if (rcStrict != VINF_SUCCESS)
    13861386                    return rcStrict;
     
    14021402            pCtx->ss.fFlags   = CPUMSELREG_FLAGS_VALID;
    14031403            pCtx->rsp         = uNewRsp;
    1404             pIemCpu->uCpl     = uNewCSDpl;
    1405             Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), &pCtx->ss));
    1406             CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_HIDDEN_SEL_REGS);
     1404            pVCpu->iem.s.uCpl     = uNewCSDpl;
     1405            Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pCtx->ss));
     1406            CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_HIDDEN_SEL_REGS);
    14071407
    14081408            /* Check new stack - may #SS(NewSS). */
    1409             rcStrict = iemMemStackPushBeginSpecial(pIemCpu, cbNewStack,
     1409            rcStrict = iemMemStackPushBeginSpecial(pVCpu, cbNewStack,
    14101410                                                   &uPtrRet.pv, &uNewRsp);
    14111411            if (rcStrict != VINF_SUCCESS)
     
    14151415            }
    14161416
    1417             if (!IEM_IS_LONG_MODE(pIemCpu))
     1417            if (!IEM_IS_LONG_MODE(pVCpu))
    14181418            {
    14191419                if (pDesc->Legacy.Gate.u4Type == X86_SEL_TYPE_SYS_386_CALL_GATE)
     
    14241424
    14251425                    /* Map the relevant chunk of the old stack. */
    1426                     rcStrict = iemMemMap(pIemCpu, &uPtrParmWds.pv, cbWords * 4, UINT8_MAX, GCPtrParmWds, IEM_ACCESS_DATA_R);
     1426                    rcStrict = iemMemMap(pVCpu, &uPtrParmWds.pv, cbWords * 4, UINT8_MAX, GCPtrParmWds, IEM_ACCESS_DATA_R);
    14271427                    if (rcStrict != VINF_SUCCESS)
    14281428                    {
     
    14361436
    14371437                    /* Unmap the old stack. */
    1438                     rcStrict = iemMemCommitAndUnmap(pIemCpu, uPtrParmWds.pv, IEM_ACCESS_DATA_R);
     1438                    rcStrict = iemMemCommitAndUnmap(pVCpu, uPtrParmWds.pv, IEM_ACCESS_DATA_R);
    14391439                    if (rcStrict != VINF_SUCCESS)
    14401440                    {
     
    14561456
    14571457                    /* Map the relevant chunk of the old stack. */
    1458                     rcStrict = iemMemMap(pIemCpu, &uPtrParmWds.pv, cbWords * 2, UINT8_MAX, GCPtrParmWds, IEM_ACCESS_DATA_R);
     1458                    rcStrict = iemMemMap(pVCpu, &uPtrParmWds.pv, cbWords * 2, UINT8_MAX, GCPtrParmWds, IEM_ACCESS_DATA_R);
    14591459                    if (rcStrict != VINF_SUCCESS)
    14601460                    {
     
    14681468
    14691469                    /* Unmap the old stack. */
    1470                     rcStrict = iemMemCommitAndUnmap(pIemCpu, uPtrParmWds.pv, IEM_ACCESS_DATA_R);
     1470                    rcStrict = iemMemCommitAndUnmap(pVCpu, uPtrParmWds.pv, IEM_ACCESS_DATA_R);
    14711471                    if (rcStrict != VINF_SUCCESS)
    14721472                    {
     
    14911491            }
    14921492
    1493             rcStrict = iemMemStackPushCommitSpecial(pIemCpu, uPtrRet.pv, uNewRsp);
     1493            rcStrict = iemMemStackPushCommitSpecial(pVCpu, uPtrRet.pv, uNewRsp);
    14941494            if (rcStrict != VINF_SUCCESS)
    14951495            {
     
    15041504            /* Limit / canonical check. */
    15051505            cbLimit = X86DESC_LIMIT_G(&DescCS.Legacy);
    1506             if (!IEM_IS_LONG_MODE(pIemCpu))
     1506            if (!IEM_IS_LONG_MODE(pVCpu))
    15071507            {
    15081508                if (uNewRip > cbLimit)
    15091509                {
    15101510                    Log(("BranchCallGate %04x:%08RX64 -> out of bounds (%#x)\n", uNewCS, uNewRip, cbLimit));
    1511                     return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, 0);
     1511                    return iemRaiseGeneralProtectionFaultBySelector(pVCpu, 0);
    15121512                }
    15131513                u64Base = X86DESC_BASE(&DescCS.Legacy);
     
    15191519                {
    15201520                    Log(("BranchCallGate call %04x:%016RX64 - not canonical -> #GP\n", uNewCS, uNewRip));
    1521                     return iemRaiseNotCanonical(pIemCpu);
     1521                    return iemRaiseNotCanonical(pVCpu);
    15221522                }
    15231523                u64Base = 0;
     
    15321532            if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    15331533            {
    1534                 rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewCS);
     1534                rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewCS);
    15351535                if (rcStrict != VINF_SUCCESS)
    15361536                    return rcStrict;
     
    15421542            pCtx->rip         = uNewRip;
    15431543            pCtx->cs.Sel      = uNewCS & X86_SEL_MASK_OFF_RPL;
    1544             pCtx->cs.Sel     |= pIemCpu->uCpl;
     1544            pCtx->cs.Sel     |= pVCpu->iem.s.uCpl;
    15451545            pCtx->cs.ValidSel = pCtx->cs.Sel;
    15461546            pCtx->cs.fFlags   = CPUMSELREG_FLAGS_VALID;
     
    15481548            pCtx->cs.u32Limit = cbLimit;
    15491549            pCtx->cs.u64Base  = u64Base;
    1550             pIemCpu->enmCpuMode = iemCalcCpuMode(pCtx);
     1550            pVCpu->iem.s.enmCpuMode = iemCalcCpuMode(pCtx);
    15511551        }
    15521552        else
     
    15581558            /** @todo check how gate size affects pushing of CS! Does callf 16:32 in
    15591559             *        16-bit code cause a two or four byte CS to be pushed? */
    1560             rcStrict = iemMemStackPushBeginSpecial(pIemCpu,
    1561                                                    IEM_IS_LONG_MODE(pIemCpu) ? 8+8
     1560            rcStrict = iemMemStackPushBeginSpecial(pVCpu,
     1561                                                   IEM_IS_LONG_MODE(pVCpu) ? 8+8
    15621562                                                   : pDesc->Legacy.Gate.u4Type == X86_SEL_TYPE_SYS_386_CALL_GATE ? 4+4 : 2+2,
    15631563                                                   &uPtrRet.pv, &uNewRsp);
     
    15711571            /* Limit / canonical check. */
    15721572            cbLimit = X86DESC_LIMIT_G(&DescCS.Legacy);
    1573             if (!IEM_IS_LONG_MODE(pIemCpu))
     1573            if (!IEM_IS_LONG_MODE(pVCpu))
    15741574            {
    15751575                if (uNewRip > cbLimit)
    15761576                {
    15771577                    Log(("BranchCallGate %04x:%08RX64 -> out of bounds (%#x)\n", uNewCS, uNewRip, cbLimit));
    1578                     return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, 0);
     1578                    return iemRaiseGeneralProtectionFaultBySelector(pVCpu, 0);
    15791579                }
    15801580                u64Base = X86DESC_BASE(&DescCS.Legacy);
     
    15851585                {
    15861586                    Log(("BranchCallGate call %04x:%016RX64 - not canonical -> #GP\n", uNewCS, uNewRip));
    1587                     return iemRaiseNotCanonical(pIemCpu);
     1587                    return iemRaiseNotCanonical(pVCpu);
    15881588                }
    15891589                u64Base = 0;
     
    15981598            if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    15991599            {
    1600                 rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewCS);
     1600                rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewCS);
    16011601                if (rcStrict != VINF_SUCCESS)
    16021602                    return rcStrict;
     
    16061606
    16071607            /* stack */
    1608             if (!IEM_IS_LONG_MODE(pIemCpu))
     1608            if (!IEM_IS_LONG_MODE(pVCpu))
    16091609            {
    16101610                if (pDesc->Legacy.Gate.u4Type == X86_SEL_TYPE_SYS_386_CALL_GATE)
     
    16271627            }
    16281628
    1629             rcStrict = iemMemStackPushCommitSpecial(pIemCpu, uPtrRet.pv, uNewRsp);
     1629            rcStrict = iemMemStackPushCommitSpecial(pVCpu, uPtrRet.pv, uNewRsp);
    16301630            if (rcStrict != VINF_SUCCESS)
    16311631                return rcStrict;
     
    16341634            pCtx->rip         = uNewRip;
    16351635            pCtx->cs.Sel      = uNewCS & X86_SEL_MASK_OFF_RPL;
    1636             pCtx->cs.Sel     |= pIemCpu->uCpl;
     1636            pCtx->cs.Sel     |= pVCpu->iem.s.uCpl;
    16371637            pCtx->cs.ValidSel = pCtx->cs.Sel;
    16381638            pCtx->cs.fFlags   = CPUMSELREG_FLAGS_VALID;
     
    16401640            pCtx->cs.u32Limit = cbLimit;
    16411641            pCtx->cs.u64Base  = u64Base;
    1642             pIemCpu->enmCpuMode  = iemCalcCpuMode(pCtx);
     1642            pVCpu->iem.s.enmCpuMode  = iemCalcCpuMode(pCtx);
    16431643        }
    16441644    }
     
    16461646
    16471647    /* Flush the prefetch buffer. */
    1648     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     1648    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    16491649    return VINF_SUCCESS;
    16501650#endif
     
    16651665    Assert((uSel & X86_SEL_MASK_OFF_RPL));
    16661666
    1667     if (IEM_IS_LONG_MODE(pIemCpu))
     1667    if (IEM_IS_LONG_MODE(pVCpu))
    16681668        switch (pDesc->Legacy.Gen.u4Type)
    16691669        {
     
    16781678            case AMD64_SEL_TYPE_SYS_INT_GATE:
    16791679                Log(("branch %04x -> wrong sys selector (64-bit): %d\n", uSel, pDesc->Legacy.Gen.u4Type));
    1680                 return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1680                return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    16811681        }
    16821682
     
    16961696        case X86_SEL_TYPE_SYS_286_TSS_BUSY:
    16971697            Log(("branch %04x -> busy 286 TSS\n", uSel));
    1698             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1698            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    16991699
    17001700        case X86_SEL_TYPE_SYS_386_TSS_BUSY:
    17011701            Log(("branch %04x -> busy 386 TSS\n", uSel));
    1702             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1702            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    17031703
    17041704        default:
     
    17091709        case X86_SEL_TYPE_SYS_386_TRAP_GATE:
    17101710            Log(("branch %04x -> wrong sys selector: %d\n", uSel, pDesc->Legacy.Gen.u4Type));
    1711             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1711            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    17121712    }
    17131713}
     
    17231723IEM_CIMPL_DEF_3(iemCImpl_FarJmp, uint16_t, uSel, uint64_t, offSeg, IEMMODE, enmEffOpSize)
    17241724{
    1725     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     1725    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    17261726    NOREF(cbInstr);
    17271727    Assert(offSeg <= UINT32_MAX);
     
    17321732     * limit.
    17331733     */
    1734     if (   pIemCpu->enmCpuMode == IEMMODE_16BIT
    1735         && IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     1734    if (   pVCpu->iem.s.enmCpuMode == IEMMODE_16BIT
     1735        && IEM_IS_REAL_OR_V86_MODE(pVCpu))
    17361736    {
    17371737        if (offSeg > pCtx->cs.u32Limit)
    17381738        {
    17391739            Log(("iemCImpl_FarJmp: 16-bit limit\n"));
    1740             return iemRaiseGeneralProtectionFault0(pIemCpu);
     1740            return iemRaiseGeneralProtectionFault0(pVCpu);
    17411741        }
    17421742
     
    17591759    {
    17601760        Log(("jmpf %04x:%08RX64 -> invalid selector, #GP(0)\n", uSel, offSeg));
    1761         return iemRaiseGeneralProtectionFault0(pIemCpu);
     1761        return iemRaiseGeneralProtectionFault0(pVCpu);
    17621762    }
    17631763
    17641764    /* Fetch the descriptor. */
    17651765    IEMSELDESC Desc;
    1766     VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uSel, X86_XCPT_GP);
     1766    VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pVCpu, &Desc, uSel, X86_XCPT_GP);
    17671767    if (rcStrict != VINF_SUCCESS)
    17681768        return rcStrict;
     
    17721772    {
    17731773        Log(("jmpf %04x:%08RX64 -> segment not present\n", uSel, offSeg));
    1774         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uSel);
     1774        return iemRaiseSelectorNotPresentBySelector(pVCpu, uSel);
    17751775    }
    17761776
     
    17861786    {
    17871787        Log(("jmpf %04x:%08RX64 -> not a code selector (u4Type=%#x).\n", uSel, offSeg, Desc.Legacy.Gen.u4Type));
    1788         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1788        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    17891789    }
    17901790
     
    17921792    if (   Desc.Legacy.Gen.u1Long
    17931793        && Desc.Legacy.Gen.u1DefBig
    1794         && IEM_IS_LONG_MODE(pIemCpu))
     1794        && IEM_IS_LONG_MODE(pVCpu))
    17951795    {
    17961796        Log(("jmpf %04x:%08RX64 -> both L and D are set.\n", uSel, offSeg));
    1797         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1797        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    17981798    }
    17991799
     
    18011801    if (Desc.Legacy.Gen.u4Type & X86_SEL_TYPE_CONF)
    18021802    {
    1803         if (pIemCpu->uCpl < Desc.Legacy.Gen.u2Dpl)
     1803        if (pVCpu->iem.s.uCpl < Desc.Legacy.Gen.u2Dpl)
    18041804        {
    18051805            Log(("jmpf %04x:%08RX64 -> DPL violation (conforming); DPL=%d CPL=%u\n",
    1806                  uSel, offSeg, Desc.Legacy.Gen.u2Dpl, pIemCpu->uCpl));
    1807             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1806                 uSel, offSeg, Desc.Legacy.Gen.u2Dpl, pVCpu->iem.s.uCpl));
     1807            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    18081808        }
    18091809    }
    18101810    else
    18111811    {
    1812         if (pIemCpu->uCpl != Desc.Legacy.Gen.u2Dpl)
    1813         {
    1814             Log(("jmpf %04x:%08RX64 -> CPL != DPL; DPL=%d CPL=%u\n", uSel, offSeg, Desc.Legacy.Gen.u2Dpl, pIemCpu->uCpl));
    1815             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
    1816         }
    1817         if ((uSel & X86_SEL_RPL) > pIemCpu->uCpl)
    1818         {
    1819             Log(("jmpf %04x:%08RX64 -> RPL > DPL; RPL=%d CPL=%u\n", uSel, offSeg, (uSel & X86_SEL_RPL), pIemCpu->uCpl));
    1820             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1812        if (pVCpu->iem.s.uCpl != Desc.Legacy.Gen.u2Dpl)
     1813        {
     1814            Log(("jmpf %04x:%08RX64 -> CPL != DPL; DPL=%d CPL=%u\n", uSel, offSeg, Desc.Legacy.Gen.u2Dpl, pVCpu->iem.s.uCpl));
     1815            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
     1816        }
     1817        if ((uSel & X86_SEL_RPL) > pVCpu->iem.s.uCpl)
     1818        {
     1819            Log(("jmpf %04x:%08RX64 -> RPL > DPL; RPL=%d CPL=%u\n", uSel, offSeg, (uSel & X86_SEL_RPL), pVCpu->iem.s.uCpl));
     1820            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    18211821        }
    18221822    }
     
    18381838            Log(("jmpf %04x:%08RX64 -> out of bounds (%#x)\n", uSel, offSeg, cbLimit));
    18391839            /** @todo: Intel says this is #GP(0)! */
    1840             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1840            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    18411841        }
    18421842        u64Base = X86DESC_BASE(&Desc.Legacy);
     
    18491849    if (!(Desc.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    18501850    {
    1851         rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uSel);
     1851        rcStrict = iemMemMarkSelDescAccessed(pVCpu, uSel);
    18521852        if (rcStrict != VINF_SUCCESS)
    18531853            return rcStrict;
     
    18591859    pCtx->rip = offSeg;
    18601860    pCtx->cs.Sel         = uSel & X86_SEL_MASK_OFF_RPL;
    1861     pCtx->cs.Sel        |= pIemCpu->uCpl; /** @todo is this right for conforming segs? or in general? */
     1861    pCtx->cs.Sel        |= pVCpu->iem.s.uCpl; /** @todo is this right for conforming segs? or in general? */
    18621862    pCtx->cs.ValidSel    = pCtx->cs.Sel;
    18631863    pCtx->cs.fFlags      = CPUMSELREG_FLAGS_VALID;
     
    18651865    pCtx->cs.u32Limit    = cbLimit;
    18661866    pCtx->cs.u64Base     = u64Base;
    1867     pIemCpu->enmCpuMode  = iemCalcCpuMode(pCtx);
     1867    pVCpu->iem.s.enmCpuMode  = iemCalcCpuMode(pCtx);
    18681868    pCtx->eflags.Bits.u1RF = 0;
    18691869    /** @todo check if the hidden bits are loaded correctly for 64-bit
     
    18711871
    18721872    /* Flush the prefetch buffer. */
    1873     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     1873    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    18741874
    18751875    return VINF_SUCCESS;
     
    18881888IEM_CIMPL_DEF_3(iemCImpl_callf, uint16_t, uSel, uint64_t, offSeg, IEMMODE, enmEffOpSize)
    18891889{
    1890     PCPUMCTX        pCtx = pIemCpu->CTX_SUFF(pCtx);
     1890    PCPUMCTX        pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    18911891    VBOXSTRICTRC    rcStrict;
    18921892    uint64_t        uNewRsp;
     
    18981898     * limit.
    18991899     */
    1900     if (   pIemCpu->enmCpuMode == IEMMODE_16BIT
    1901         && IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     1900    if (   pVCpu->iem.s.enmCpuMode == IEMMODE_16BIT
     1901        && IEM_IS_REAL_OR_V86_MODE(pVCpu))
    19021902    {
    19031903        Assert(enmEffOpSize == IEMMODE_16BIT || enmEffOpSize == IEMMODE_32BIT);
    19041904
    19051905        /* Check stack first - may #SS(0). */
    1906         rcStrict = iemMemStackPushBeginSpecial(pIemCpu, enmEffOpSize == IEMMODE_32BIT ? 6 : 4,
     1906        rcStrict = iemMemStackPushBeginSpecial(pVCpu, enmEffOpSize == IEMMODE_32BIT ? 6 : 4,
    19071907                                               &uPtrRet.pv, &uNewRsp);
    19081908        if (rcStrict != VINF_SUCCESS)
     
    19111911        /* Check the target address range. */
    19121912        if (offSeg > UINT32_MAX)
    1913             return iemRaiseGeneralProtectionFault0(pIemCpu);
     1913            return iemRaiseGeneralProtectionFault0(pVCpu);
    19141914
    19151915        /* Everything is fine, push the return address. */
     
    19241924            uPtrRet.pu16[3] = pCtx->cs.Sel;
    19251925        }
    1926         rcStrict = iemMemStackPushCommitSpecial(pIemCpu, uPtrRet.pv, uNewRsp);
     1926        rcStrict = iemMemStackPushCommitSpecial(pVCpu, uPtrRet.pv, uNewRsp);
    19271927        if (rcStrict != VINF_SUCCESS)
    19281928            return rcStrict;
     
    19441944    {
    19451945        Log(("callf %04x:%08RX64 -> invalid selector, #GP(0)\n", uSel, offSeg));
    1946         return iemRaiseGeneralProtectionFault0(pIemCpu);
     1946        return iemRaiseGeneralProtectionFault0(pVCpu);
    19471947    }
    19481948
    19491949    /* Fetch the descriptor. */
    19501950    IEMSELDESC Desc;
    1951     rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uSel, X86_XCPT_GP);
     1951    rcStrict = iemMemFetchSelDesc(pVCpu, &Desc, uSel, X86_XCPT_GP);
    19521952    if (rcStrict != VINF_SUCCESS)
    19531953        return rcStrict;
     
    19641964    {
    19651965        Log(("callf %04x:%08RX64 -> not a code selector (u4Type=%#x).\n", uSel, offSeg, Desc.Legacy.Gen.u4Type));
    1966         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1966        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    19671967    }
    19681968
     
    19701970    if (   Desc.Legacy.Gen.u1Long
    19711971        && Desc.Legacy.Gen.u1DefBig
    1972         && IEM_IS_LONG_MODE(pIemCpu))
     1972        && IEM_IS_LONG_MODE(pVCpu))
    19731973    {
    19741974        Log(("callf %04x:%08RX64 -> both L and D are set.\n", uSel, offSeg));
    1975         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1975        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    19761976    }
    19771977
     
    19791979    if (Desc.Legacy.Gen.u4Type & X86_SEL_TYPE_CONF)
    19801980    {
    1981         if (pIemCpu->uCpl < Desc.Legacy.Gen.u2Dpl)
     1981        if (pVCpu->iem.s.uCpl < Desc.Legacy.Gen.u2Dpl)
    19821982        {
    19831983            Log(("callf %04x:%08RX64 -> DPL violation (conforming); DPL=%d CPL=%u\n",
    1984                  uSel, offSeg, Desc.Legacy.Gen.u2Dpl, pIemCpu->uCpl));
    1985             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1984                 uSel, offSeg, Desc.Legacy.Gen.u2Dpl, pVCpu->iem.s.uCpl));
     1985            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    19861986        }
    19871987    }
    19881988    else
    19891989    {
    1990         if (pIemCpu->uCpl != Desc.Legacy.Gen.u2Dpl)
    1991         {
    1992             Log(("callf %04x:%08RX64 -> CPL != DPL; DPL=%d CPL=%u\n", uSel, offSeg, Desc.Legacy.Gen.u2Dpl, pIemCpu->uCpl));
    1993             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
    1994         }
    1995         if ((uSel & X86_SEL_RPL) > pIemCpu->uCpl)
    1996         {
    1997             Log(("callf %04x:%08RX64 -> RPL > DPL; RPL=%d CPL=%u\n", uSel, offSeg, (uSel & X86_SEL_RPL), pIemCpu->uCpl));
    1998             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     1990        if (pVCpu->iem.s.uCpl != Desc.Legacy.Gen.u2Dpl)
     1991        {
     1992            Log(("callf %04x:%08RX64 -> CPL != DPL; DPL=%d CPL=%u\n", uSel, offSeg, Desc.Legacy.Gen.u2Dpl, pVCpu->iem.s.uCpl));
     1993            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
     1994        }
     1995        if ((uSel & X86_SEL_RPL) > pVCpu->iem.s.uCpl)
     1996        {
     1997            Log(("callf %04x:%08RX64 -> RPL > DPL; RPL=%d CPL=%u\n", uSel, offSeg, (uSel & X86_SEL_RPL), pVCpu->iem.s.uCpl));
     1998            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    19991999        }
    20002000    }
     
    20042004    {
    20052005        Log(("callf %04x:%08RX64 -> segment not present\n", uSel, offSeg));
    2006         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uSel);
     2006        return iemRaiseSelectorNotPresentBySelector(pVCpu, uSel);
    20072007    }
    20082008
     
    20102010    /** @todo check how operand prefix affects pushing of CS! Does callf 16:32 in
    20112011     *        16-bit code cause a two or four byte CS to be pushed? */
    2012     rcStrict = iemMemStackPushBeginSpecial(pIemCpu,
     2012    rcStrict = iemMemStackPushBeginSpecial(pVCpu,
    20132013                                           enmEffOpSize == IEMMODE_64BIT   ? 8+8
    20142014                                           : enmEffOpSize == IEMMODE_32BIT ? 4+4 : 2+2,
     
    20242024    uint64_t u64Base;
    20252025    uint32_t cbLimit = X86DESC_LIMIT_G(&Desc.Legacy);
    2026     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     2026    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    20272027    {
    20282028        if (!IEM_IS_CANONICAL(offSeg))
    20292029        {
    20302030            Log(("callf %04x:%016RX64 - not canonical -> #GP\n", uSel, offSeg));
    2031             return iemRaiseNotCanonical(pIemCpu);
     2031            return iemRaiseNotCanonical(pVCpu);
    20322032        }
    20332033        u64Base = 0;
     
    20392039            Log(("callf %04x:%08RX64 -> out of bounds (%#x)\n", uSel, offSeg, cbLimit));
    20402040            /** @todo: Intel says this is #GP(0)! */
    2041             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     2041            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    20422042        }
    20432043        u64Base = X86DESC_BASE(&Desc.Legacy);
     
    20522052    if (!(Desc.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    20532053    {
    2054         rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uSel);
     2054        rcStrict = iemMemMarkSelDescAccessed(pVCpu, uSel);
    20552055        if (rcStrict != VINF_SUCCESS)
    20562056            return rcStrict;
     
    20752075        uPtrRet.pu64[1] = pCtx->cs.Sel; /** @todo Testcase: What is written to the high words when callf is pushing CS? */
    20762076    }
    2077     rcStrict = iemMemStackPushCommitSpecial(pIemCpu, uPtrRet.pv, uNewRsp);
     2077    rcStrict = iemMemStackPushCommitSpecial(pVCpu, uPtrRet.pv, uNewRsp);
    20782078    if (rcStrict != VINF_SUCCESS)
    20792079        return rcStrict;
     
    20822082    pCtx->rip = offSeg;
    20832083    pCtx->cs.Sel         = uSel & X86_SEL_MASK_OFF_RPL;
    2084     pCtx->cs.Sel        |= pIemCpu->uCpl;
     2084    pCtx->cs.Sel        |= pVCpu->iem.s.uCpl;
    20852085    pCtx->cs.ValidSel    = pCtx->cs.Sel;
    20862086    pCtx->cs.fFlags      = CPUMSELREG_FLAGS_VALID;
     
    20882088    pCtx->cs.u32Limit    = cbLimit;
    20892089    pCtx->cs.u64Base     = u64Base;
    2090     pIemCpu->enmCpuMode  = iemCalcCpuMode(pCtx);
     2090    pVCpu->iem.s.enmCpuMode  = iemCalcCpuMode(pCtx);
    20912091    pCtx->eflags.Bits.u1RF = 0;
    20922092    /** @todo check if the hidden bits are loaded correctly for 64-bit
     
    20942094
    20952095    /* Flush the prefetch buffer. */
    2096     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     2096    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    20972097
    20982098    return VINF_SUCCESS;
     
    21092109IEM_CIMPL_DEF_2(iemCImpl_retf, IEMMODE, enmEffOpSize, uint16_t, cbPop)
    21102110{
    2111     PCPUMCTX        pCtx = pIemCpu->CTX_SUFF(pCtx);
     2111    PCPUMCTX        pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    21122112    VBOXSTRICTRC    rcStrict;
    21132113    RTCPTRUNION     uPtrFrame;
     
    21222122    uint32_t        cbRetPtr = enmEffOpSize == IEMMODE_16BIT ? 2+2
    21232123                             : enmEffOpSize == IEMMODE_32BIT ? 4+4 : 8+8;
    2124     rcStrict = iemMemStackPopBeginSpecial(pIemCpu, cbRetPtr, &uPtrFrame.pv, &uNewRsp);
     2124    rcStrict = iemMemStackPopBeginSpecial(pVCpu, cbRetPtr, &uPtrFrame.pv, &uNewRsp);
    21252125    if (rcStrict != VINF_SUCCESS)
    21262126        return rcStrict;
     
    21442144     * Real mode and V8086 mode are easy.
    21452145     */
    2146     if (   pIemCpu->enmCpuMode == IEMMODE_16BIT
    2147         && IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     2146    if (   pVCpu->iem.s.enmCpuMode == IEMMODE_16BIT
     2147        && IEM_IS_REAL_OR_V86_MODE(pVCpu))
    21482148    {
    21492149        Assert(enmEffOpSize == IEMMODE_32BIT || enmEffOpSize == IEMMODE_16BIT);
     
    21542154         *        operands, AMD does not make any distinction. What is right? */
    21552155        if (uNewRip > pCtx->cs.u32Limit)
    2156             return iemRaiseSelectorBounds(pIemCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
     2156            return iemRaiseSelectorBounds(pVCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
    21572157
    21582158        /* commit the operation. */
    2159         rcStrict = iemMemStackPopCommitSpecial(pIemCpu, uPtrFrame.pv, uNewRsp);
     2159        rcStrict = iemMemStackPopCommitSpecial(pVCpu, uPtrFrame.pv, uNewRsp);
    21602160        if (rcStrict != VINF_SUCCESS)
    21612161            return rcStrict;
     
    21682168        /** @todo do we load attribs and limit as well? */
    21692169        if (cbPop)
    2170             iemRegAddToRsp(pIemCpu, pCtx, cbPop);
     2170            iemRegAddToRsp(pVCpu, pCtx, cbPop);
    21712171        return VINF_SUCCESS;
    21722172    }
     
    21782178    {
    21792179        Log(("retf %04x:%08RX64 -> invalid selector, #GP(0)\n", uNewCs, uNewRip));
    2180         return iemRaiseGeneralProtectionFault0(pIemCpu);
     2180        return iemRaiseGeneralProtectionFault0(pVCpu);
    21812181    }
    21822182
    21832183    /* Fetch the descriptor. */
    21842184    IEMSELDESC DescCs;
    2185     rcStrict = iemMemFetchSelDesc(pIemCpu, &DescCs, uNewCs, X86_XCPT_GP);
     2185    rcStrict = iemMemFetchSelDesc(pVCpu, &DescCs, uNewCs, X86_XCPT_GP);
    21862186    if (rcStrict != VINF_SUCCESS)
    21872187        return rcStrict;
     
    21932193        Log(("retf %04x:%08RX64 -> not a code selector (u1DescType=%u u4Type=%#x).\n",
    21942194             uNewCs, uNewRip, DescCs.Legacy.Gen.u1DescType, DescCs.Legacy.Gen.u4Type));
    2195         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     2195        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    21962196    }
    21972197
     
    21992199    if (   DescCs.Legacy.Gen.u1Long /** @todo Testcase: far return to a selector with both L and D set. */
    22002200        && DescCs.Legacy.Gen.u1DefBig
    2201         && IEM_IS_LONG_MODE(pIemCpu))
     2201        && IEM_IS_LONG_MODE(pVCpu))
    22022202    {
    22032203        Log(("retf %04x:%08RX64 -> both L & D set.\n", uNewCs, uNewRip));
    2204         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     2204        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    22052205    }
    22062206
    22072207    /* DPL/RPL/CPL checks. */
    2208     if ((uNewCs & X86_SEL_RPL) < pIemCpu->uCpl)
    2209     {
    2210         Log(("retf %04x:%08RX64 -> RPL < CPL(%d).\n", uNewCs, uNewRip, pIemCpu->uCpl));
    2211         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     2208    if ((uNewCs & X86_SEL_RPL) < pVCpu->iem.s.uCpl)
     2209    {
     2210        Log(("retf %04x:%08RX64 -> RPL < CPL(%d).\n", uNewCs, uNewRip, pVCpu->iem.s.uCpl));
     2211        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    22122212    }
    22132213
     
    22182218            Log(("retf %04x:%08RX64 -> DPL violation (conforming); DPL=%u RPL=%u\n",
    22192219                 uNewCs, uNewRip, DescCs.Legacy.Gen.u2Dpl, (uNewCs & X86_SEL_RPL)));
    2220             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     2220            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    22212221        }
    22222222    }
     
    22272227            Log(("retf %04x:%08RX64 -> RPL != DPL; DPL=%u RPL=%u\n",
    22282228                 uNewCs, uNewRip, DescCs.Legacy.Gen.u2Dpl, (uNewCs & X86_SEL_RPL)));
    2229             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     2229            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    22302230        }
    22312231    }
     
    22352235    {
    22362236        Log(("retf %04x:%08RX64 -> segment not present\n", uNewCs, uNewRip));
    2237         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uNewCs);
     2237        return iemRaiseSelectorNotPresentBySelector(pVCpu, uNewCs);
    22382238    }
    22392239
     
    22412241     * Return to outer privilege? (We'll typically have entered via a call gate.)
    22422242     */
    2243     if ((uNewCs & X86_SEL_RPL) != pIemCpu->uCpl)
     2243    if ((uNewCs & X86_SEL_RPL) != pVCpu->iem.s.uCpl)
    22442244    {
    22452245        /* Read the outer stack pointer stored *after* the parameters. */
    22462246        RTCPTRUNION uPtrStack;
    2247         rcStrict = iemMemStackPopContinueSpecial(pIemCpu, cbPop + cbRetPtr, &uPtrStack.pv, &uNewRsp);
     2247        rcStrict = iemMemStackPopContinueSpecial(pVCpu, cbPop + cbRetPtr, &uPtrStack.pv, &uNewRsp);
    22482248        if (rcStrict != VINF_SUCCESS)
    22492249            return rcStrict;
     
    22792279                Log(("retf %04x:%08RX64 %04x:%08RX64 -> invalid stack selector, #GP\n",
    22802280                     uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp));
    2281                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     2281                return iemRaiseGeneralProtectionFault0(pVCpu);
    22822282            }
    22832283            /** @todo Testcase: Return far to ring-1 or ring-2 with SS=0. */
     
    22872287        {
    22882288            /* Fetch the descriptor for the new stack segment. */
    2289             rcStrict = iemMemFetchSelDesc(pIemCpu, &DescSs, uNewOuterSs, X86_XCPT_GP);
     2289            rcStrict = iemMemFetchSelDesc(pVCpu, &DescSs, uNewOuterSs, X86_XCPT_GP);
    22902290            if (rcStrict != VINF_SUCCESS)
    22912291                return rcStrict;
     
    22962296        {
    22972297            Log(("retf %04x:%08RX64 %04x:%08RX64 - SS.RPL != CS.RPL -> #GP(SS)\n", uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp));
    2298             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewOuterSs);
     2298            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewOuterSs);
    22992299        }
    23002300
     
    23062306            Log(("retf %04x:%08RX64 %04x:%08RX64 - SS not a writable data segment (u1DescType=%u u4Type=%#x) -> #GP(SS).\n",
    23072307                 uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp, DescSs.Legacy.Gen.u1DescType, DescSs.Legacy.Gen.u4Type));
    2308             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewOuterSs);
     2308            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewOuterSs);
    23092309        }
    23102310
     
    23122312        if (   DescSs.Legacy.Gen.u1Long /** @todo Testcase: far return to a stack selector with both L and D set. */
    23132313            && DescSs.Legacy.Gen.u1DefBig
    2314             && IEM_IS_LONG_MODE(pIemCpu))
     2314            && IEM_IS_LONG_MODE(pVCpu))
    23152315        {
    23162316            Log(("retf %04x:%08RX64 %04x:%08RX64 - SS has both L & D set -> #GP(SS).\n",
    23172317                 uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp));
    2318             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewOuterSs);
     2318            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewOuterSs);
    23192319        }
    23202320
     
    23242324            Log(("retf %04x:%08RX64 %04x:%08RX64 - SS.DPL(%u) != CS.RPL (%u) -> #GP(SS).\n",
    23252325                 uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp, DescSs.Legacy.Gen.u2Dpl, uNewCs & X86_SEL_RPL));
    2326             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewOuterSs);
     2326            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewOuterSs);
    23272327        }
    23282328
     
    23312331        {
    23322332            Log(("retf %04x:%08RX64 %04x:%08RX64 - SS not present -> #NP(SS).\n", uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp));
    2333             return iemRaiseSelectorNotPresentBySelector(pIemCpu, uNewCs);
     2333            return iemRaiseSelectorNotPresentBySelector(pVCpu, uNewCs);
    23342334        }
    23352335
     
    23432343        /** @todo Testcase: Is this correct? */
    23442344        if (   DescCs.Legacy.Gen.u1Long
    2345             && IEM_IS_LONG_MODE(pIemCpu) )
     2345            && IEM_IS_LONG_MODE(pVCpu) )
    23462346        {
    23472347            if (!IEM_IS_CANONICAL(uNewRip))
    23482348            {
    23492349                Log(("retf %04x:%08RX64 %04x:%08RX64 - not canonical -> #GP.\n", uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp));
    2350                 return iemRaiseNotCanonical(pIemCpu);
     2350                return iemRaiseNotCanonical(pVCpu);
    23512351            }
    23522352            u64Base = 0;
     
    23592359                     uNewCs, uNewRip, uNewOuterSs, uNewOuterRsp, cbLimitCs));
    23602360                /** @todo: Intel says this is #GP(0)! */
    2361                 return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     2361                return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    23622362            }
    23632363            u64Base = X86DESC_BASE(&DescCs.Legacy);
     
    23722372        if (!(DescCs.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    23732373        {
    2374             rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewCs);
     2374            rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewCs);
    23752375            if (rcStrict != VINF_SUCCESS)
    23762376                return rcStrict;
     
    23812381        if (!(DescSs.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    23822382        {
    2383             rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewOuterSs);
     2383            rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewOuterSs);
    23842384            if (rcStrict != VINF_SUCCESS)
    23852385                return rcStrict;
     
    23892389
    23902390        /* commit */
    2391         rcStrict = iemMemStackPopCommitSpecial(pIemCpu, uPtrFrame.pv, uNewRsp);
     2391        rcStrict = iemMemStackPopCommitSpecial(pVCpu, uPtrFrame.pv, uNewRsp);
    23922392        if (rcStrict != VINF_SUCCESS)
    23932393            return rcStrict;
     
    24022402        pCtx->cs.u32Limit       = cbLimitCs;
    24032403        pCtx->cs.u64Base        = u64Base;
    2404         pIemCpu->enmCpuMode     = iemCalcCpuMode(pCtx);
     2404        pVCpu->iem.s.enmCpuMode     = iemCalcCpuMode(pCtx);
    24052405        pCtx->rsp               = uNewOuterRsp;
    24062406        pCtx->ss.Sel            = uNewOuterSs;
     
    24092409        pCtx->ss.Attr.u         = X86DESC_GET_HID_ATTR(&DescSs.Legacy);
    24102410        pCtx->ss.u32Limit       = cbLimitSs;
    2411         if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     2411        if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    24122412            pCtx->ss.u64Base    = 0;
    24132413        else
    24142414            pCtx->ss.u64Base    = X86DESC_BASE(&DescSs.Legacy);
    24152415
    2416         pIemCpu->uCpl           = (uNewCs & X86_SEL_RPL);
    2417         iemHlpAdjustSelectorForNewCpl(pIemCpu, uNewCs & X86_SEL_RPL, &pCtx->ds);
    2418         iemHlpAdjustSelectorForNewCpl(pIemCpu, uNewCs & X86_SEL_RPL, &pCtx->es);
    2419         iemHlpAdjustSelectorForNewCpl(pIemCpu, uNewCs & X86_SEL_RPL, &pCtx->fs);
    2420         iemHlpAdjustSelectorForNewCpl(pIemCpu, uNewCs & X86_SEL_RPL, &pCtx->gs);
     2416        pVCpu->iem.s.uCpl           = (uNewCs & X86_SEL_RPL);
     2417        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCs & X86_SEL_RPL, &pCtx->ds);
     2418        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCs & X86_SEL_RPL, &pCtx->es);
     2419        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCs & X86_SEL_RPL, &pCtx->fs);
     2420        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCs & X86_SEL_RPL, &pCtx->gs);
    24212421
    24222422        /** @todo check if the hidden bits are loaded correctly for 64-bit
     
    24242424
    24252425        if (cbPop)
    2426             iemRegAddToRsp(pIemCpu, pCtx, cbPop);
     2426            iemRegAddToRsp(pVCpu, pCtx, cbPop);
    24272427        pCtx->eflags.Bits.u1RF = 0;
    24282428
     
    24402440        /** @todo Testcase: Is this correct? */
    24412441        if (   DescCs.Legacy.Gen.u1Long
    2442             && IEM_IS_LONG_MODE(pIemCpu) )
     2442            && IEM_IS_LONG_MODE(pVCpu) )
    24432443        {
    24442444            if (!IEM_IS_CANONICAL(uNewRip))
    24452445            {
    24462446                Log(("retf %04x:%08RX64 - not canonical -> #GP\n", uNewCs, uNewRip));
    2447                 return iemRaiseNotCanonical(pIemCpu);
     2447                return iemRaiseNotCanonical(pVCpu);
    24482448            }
    24492449            u64Base = 0;
     
    24552455                Log(("retf %04x:%08RX64 -> out of bounds (%#x)\n", uNewCs, uNewRip, cbLimitCs));
    24562456                /** @todo: Intel says this is #GP(0)! */
    2457                 return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     2457                return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    24582458            }
    24592459            u64Base = X86DESC_BASE(&DescCs.Legacy);
     
    24682468        if (!(DescCs.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    24692469        {
    2470             rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewCs);
     2470            rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewCs);
    24712471            if (rcStrict != VINF_SUCCESS)
    24722472                return rcStrict;
     
    24762476
    24772477        /* commit */
    2478         rcStrict = iemMemStackPopCommitSpecial(pIemCpu, uPtrFrame.pv, uNewRsp);
     2478        rcStrict = iemMemStackPopCommitSpecial(pVCpu, uPtrFrame.pv, uNewRsp);
    24792479        if (rcStrict != VINF_SUCCESS)
    24802480            return rcStrict;
     
    24912491        /** @todo check if the hidden bits are loaded correctly for 64-bit
    24922492         *        mode.  */
    2493         pIemCpu->enmCpuMode = iemCalcCpuMode(pCtx);
     2493        pVCpu->iem.s.enmCpuMode = iemCalcCpuMode(pCtx);
    24942494        if (cbPop)
    2495             iemRegAddToRsp(pIemCpu, pCtx, cbPop);
     2495            iemRegAddToRsp(pVCpu, pCtx, cbPop);
    24962496        pCtx->eflags.Bits.u1RF = 0;
    24972497    }
    24982498
    24992499    /* Flush the prefetch buffer. */
    2500     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     2500    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    25012501    return VINF_SUCCESS;
    25022502}
     
    25152515IEM_CIMPL_DEF_2(iemCImpl_retn, IEMMODE, enmEffOpSize, uint16_t, cbPop)
    25162516{
    2517     PCPUMCTX        pCtx = pIemCpu->CTX_SUFF(pCtx);
     2517    PCPUMCTX        pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    25182518    NOREF(cbInstr);
    25192519
     
    25272527        case IEMMODE_16BIT:
    25282528            NewRip.u = 0;
    2529             rcStrict = iemMemStackPopU16Ex(pIemCpu, &NewRip.Words.w0, &NewRsp);
     2529            rcStrict = iemMemStackPopU16Ex(pVCpu, &NewRip.Words.w0, &NewRsp);
    25302530            break;
    25312531        case IEMMODE_32BIT:
    25322532            NewRip.u = 0;
    2533             rcStrict = iemMemStackPopU32Ex(pIemCpu, &NewRip.DWords.dw0, &NewRsp);
     2533            rcStrict = iemMemStackPopU32Ex(pVCpu, &NewRip.DWords.dw0, &NewRsp);
    25342534            break;
    25352535        case IEMMODE_64BIT:
    2536             rcStrict = iemMemStackPopU64Ex(pIemCpu, &NewRip.u, &NewRsp);
     2536            rcStrict = iemMemStackPopU64Ex(pVCpu, &NewRip.u, &NewRsp);
    25372537            break;
    25382538        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    25492549        {
    25502550            Log(("retn newrip=%llx - out of bounds (%x) -> #GP\n", NewRip.u, pCtx->cs.u32Limit));
    2551             return iemRaiseSelectorBounds(pIemCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
     2551            return iemRaiseSelectorBounds(pVCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
    25522552        }
    25532553    }
     
    25572557        {
    25582558            Log(("retn newrip=%llx - not canonical -> #GP\n", NewRip.u));
    2559             return iemRaiseNotCanonical(pIemCpu);
     2559            return iemRaiseNotCanonical(pVCpu);
    25602560        }
    25612561    }
     
    25632563    /* Apply cbPop */
    25642564    if (cbPop)
    2565         iemRegAddToRspEx(pIemCpu, pCtx, &NewRsp, cbPop);
     2565        iemRegAddToRspEx(pVCpu, pCtx, &NewRsp, cbPop);
    25662566
    25672567    /* Commit it. */
     
    25712571
    25722572    /* Flush the prefetch buffer. */
    2573     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     2573    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    25742574
    25752575    return VINF_SUCCESS;
     
    25872587IEM_CIMPL_DEF_3(iemCImpl_enter, IEMMODE, enmEffOpSize, uint16_t, cbFrame, uint8_t, cParameters)
    25882588{
    2589     PCPUMCTX        pCtx = pIemCpu->CTX_SUFF(pCtx);
     2589    PCPUMCTX        pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    25902590
    25912591    /* Push RBP, saving the old value in TmpRbp. */
     
    25962596    if (enmEffOpSize == IEMMODE_64BIT)
    25972597    {
    2598         rcStrict = iemMemStackPushU64Ex(pIemCpu, TmpRbp.u, &NewRsp);
     2598        rcStrict = iemMemStackPushU64Ex(pVCpu, TmpRbp.u, &NewRsp);
    25992599        NewRbp = NewRsp;
    26002600    }
    26012601    else if (enmEffOpSize == IEMMODE_32BIT)
    26022602    {
    2603         rcStrict = iemMemStackPushU32Ex(pIemCpu, TmpRbp.DWords.dw0, &NewRsp);
     2603        rcStrict = iemMemStackPushU32Ex(pVCpu, TmpRbp.DWords.dw0, &NewRsp);
    26042604        NewRbp = NewRsp;
    26052605    }
    26062606    else
    26072607    {
    2608         rcStrict = iemMemStackPushU16Ex(pIemCpu, TmpRbp.Words.w0, &NewRsp);
     2608        rcStrict = iemMemStackPushU16Ex(pVCpu, TmpRbp.Words.w0, &NewRsp);
    26092609        NewRbp = TmpRbp;
    26102610        NewRbp.Words.w0 = NewRsp.Words.w0;
     
    26272627                {
    26282628                    uint16_t u16Tmp;
    2629                     rcStrict = iemMemStackPopU16Ex(pIemCpu, &u16Tmp, &TmpRbp);
     2629                    rcStrict = iemMemStackPopU16Ex(pVCpu, &u16Tmp, &TmpRbp);
    26302630                    if (rcStrict != VINF_SUCCESS)
    26312631                        break;
    2632                     rcStrict = iemMemStackPushU16Ex(pIemCpu, u16Tmp, &NewRsp);
     2632                    rcStrict = iemMemStackPushU16Ex(pVCpu, u16Tmp, &NewRsp);
    26332633                } while (--cParameters > 0 && rcStrict == VINF_SUCCESS);
    26342634                break;
     
    26422642                {
    26432643                    uint32_t u32Tmp;
    2644                     rcStrict = iemMemStackPopU32Ex(pIemCpu, &u32Tmp, &TmpRbp);
     2644                    rcStrict = iemMemStackPopU32Ex(pVCpu, &u32Tmp, &TmpRbp);
    26452645                    if (rcStrict != VINF_SUCCESS)
    26462646                        break;
    2647                     rcStrict = iemMemStackPushU32Ex(pIemCpu, u32Tmp, &NewRsp);
     2647                    rcStrict = iemMemStackPushU32Ex(pVCpu, u32Tmp, &NewRsp);
    26482648                } while (--cParameters > 0 && rcStrict == VINF_SUCCESS);
    26492649                break;
     
    26542654                {
    26552655                    uint64_t u64Tmp;
    2656                     rcStrict = iemMemStackPopU64Ex(pIemCpu, &u64Tmp, &TmpRbp);
     2656                    rcStrict = iemMemStackPopU64Ex(pVCpu, &u64Tmp, &TmpRbp);
    26572657                    if (rcStrict != VINF_SUCCESS)
    26582658                        break;
    2659                     rcStrict = iemMemStackPushU64Ex(pIemCpu, u64Tmp, &NewRsp);
     2659                    rcStrict = iemMemStackPushU64Ex(pVCpu, u64Tmp, &NewRsp);
    26602660                } while (--cParameters > 0 && rcStrict == VINF_SUCCESS);
    26612661                break;
     
    26682668        /* Push the new RBP */
    26692669        if (enmEffOpSize == IEMMODE_64BIT)
    2670             rcStrict = iemMemStackPushU64Ex(pIemCpu, NewRbp.u, &NewRsp);
     2670            rcStrict = iemMemStackPushU64Ex(pVCpu, NewRbp.u, &NewRsp);
    26712671        else if (enmEffOpSize == IEMMODE_32BIT)
    2672             rcStrict = iemMemStackPushU32Ex(pIemCpu, NewRbp.DWords.dw0, &NewRsp);
     2672            rcStrict = iemMemStackPushU32Ex(pVCpu, NewRbp.DWords.dw0, &NewRsp);
    26732673        else
    2674             rcStrict = iemMemStackPushU16Ex(pIemCpu, NewRbp.Words.w0, &NewRsp);
     2674            rcStrict = iemMemStackPushU16Ex(pVCpu, NewRbp.Words.w0, &NewRsp);
    26752675        if (rcStrict != VINF_SUCCESS)
    26762676            return rcStrict;
     
    26792679
    26802680    /* Recalc RSP. */
    2681     iemRegSubFromRspEx(pIemCpu, pCtx, &NewRsp, cbFrame);
     2681    iemRegSubFromRspEx(pVCpu, pCtx, &NewRsp, cbFrame);
    26822682
    26832683    /** @todo Should probe write access at the new RSP according to AMD. */
     
    26862686    pCtx->rbp = NewRbp.u;
    26872687    pCtx->rsp = NewRsp.u;
    2688     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     2688    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    26892689
    26902690    return VINF_SUCCESS;
     
    27032703IEM_CIMPL_DEF_1(iemCImpl_leave, IEMMODE, enmEffOpSize)
    27042704{
    2705     PCPUMCTX        pCtx = pIemCpu->CTX_SUFF(pCtx);
     2705    PCPUMCTX        pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    27062706
    27072707    /* Calculate the intermediate RSP from RBP and the stack attributes. */
    27082708    RTUINT64U       NewRsp;
    2709     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     2709    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    27102710        NewRsp.u = pCtx->rbp;
    27112711    else if (pCtx->ss.Attr.n.u1DefBig)
     
    27252725        case IEMMODE_16BIT:
    27262726            NewRbp.u = pCtx->rbp;
    2727             rcStrict = iemMemStackPopU16Ex(pIemCpu, &NewRbp.Words.w0, &NewRsp);
     2727            rcStrict = iemMemStackPopU16Ex(pVCpu, &NewRbp.Words.w0, &NewRsp);
    27282728            break;
    27292729        case IEMMODE_32BIT:
    27302730            NewRbp.u = 0;
    2731             rcStrict = iemMemStackPopU32Ex(pIemCpu, &NewRbp.DWords.dw0, &NewRsp);
     2731            rcStrict = iemMemStackPopU32Ex(pVCpu, &NewRbp.DWords.dw0, &NewRsp);
    27322732            break;
    27332733        case IEMMODE_64BIT:
    2734             rcStrict = iemMemStackPopU64Ex(pIemCpu, &NewRbp.u, &NewRsp);
     2734            rcStrict = iemMemStackPopU64Ex(pVCpu, &NewRbp.u, &NewRsp);
    27352735            break;
    27362736        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    27432743    pCtx->rbp = NewRbp.u;
    27442744    pCtx->rsp = NewRsp.u;
    2745     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     2745    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    27462746
    27472747    return VINF_SUCCESS;
     
    27572757IEM_CIMPL_DEF_2(iemCImpl_int, uint8_t, u8Int, bool, fIsBpInstr)
    27582758{
    2759     Assert(pIemCpu->cXcptRecursions == 0);
    2760     return iemRaiseXcptOrInt(pIemCpu,
     2759    Assert(pVCpu->iem.s.cXcptRecursions == 0);
     2760    return iemRaiseXcptOrInt(pVCpu,
    27612761                             cbInstr,
    27622762                             u8Int,
     
    27742774IEM_CIMPL_DEF_1(iemCImpl_iret_real_v8086, IEMMODE, enmEffOpSize)
    27752775{
    2776     PCPUMCTX  pCtx  = pIemCpu->CTX_SUFF(pCtx);
     2776    PCPUMCTX  pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
    27772777    X86EFLAGS Efl;
    2778     Efl.u = IEMMISC_GET_EFL(pIemCpu, pCtx);
     2778    Efl.u = IEMMISC_GET_EFL(pVCpu, pCtx);
    27792779    NOREF(cbInstr);
    27802780
     
    27852785        && Efl.Bits.u2IOPL != 3
    27862786        && !(pCtx->cr4 & X86_CR4_VME))
    2787         return iemRaiseGeneralProtectionFault0(pIemCpu);
     2787        return iemRaiseGeneralProtectionFault0(pVCpu);
    27882788
    27892789    /*
     
    28002800    if (enmEffOpSize == IEMMODE_32BIT)
    28012801    {
    2802         rcStrict = iemMemStackPopBeginSpecial(pIemCpu, 12, &uFrame.pv, &uNewRsp);
     2802        rcStrict = iemMemStackPopBeginSpecial(pVCpu, 12, &uFrame.pv, &uNewRsp);
    28032803        if (rcStrict != VINF_SUCCESS)
    28042804            return rcStrict;
    28052805        uNewEip    = uFrame.pu32[0];
    28062806        if (uNewEip > UINT16_MAX)
    2807             return iemRaiseGeneralProtectionFault0(pIemCpu);
     2807            return iemRaiseGeneralProtectionFault0(pVCpu);
    28082808
    28092809        uNewCs     = (uint16_t)uFrame.pu32[1];
     
    28132813                   | X86_EFL_RF /*| X86_EFL_VM*/ | X86_EFL_AC /*|X86_EFL_VIF*/ /*|X86_EFL_VIP*/
    28142814                   | X86_EFL_ID;
    2815         if (IEM_GET_TARGET_CPU(pIemCpu) <= IEMTARGETCPU_386)
     2815        if (IEM_GET_TARGET_CPU(pVCpu) <= IEMTARGETCPU_386)
    28162816            uNewFlags &= ~(X86_EFL_AC | X86_EFL_ID | X86_EFL_VIF | X86_EFL_VIP);
    28172817        uNewFlags |= Efl.u & (X86_EFL_VM | X86_EFL_VIF | X86_EFL_VIP | X86_EFL_1);
     
    28192819    else
    28202820    {
    2821         rcStrict = iemMemStackPopBeginSpecial(pIemCpu, 6, &uFrame.pv, &uNewRsp);
     2821        rcStrict = iemMemStackPopBeginSpecial(pVCpu, 6, &uFrame.pv, &uNewRsp);
    28222822        if (rcStrict != VINF_SUCCESS)
    28232823            return rcStrict;
     
    28312831         *        reserved flags. We just ignore them. */
    28322832        /* Ancient CPU adjustments: See iemCImpl_popf. */
    2833         if (IEM_GET_TARGET_CPU(pIemCpu) == IEMTARGETCPU_286)
     2833        if (IEM_GET_TARGET_CPU(pVCpu) == IEMTARGETCPU_286)
    28342834            uNewFlags &= ~(X86_EFL_NT | X86_EFL_IOPL);
    28352835    }
     
    28442844     *        right? */
    28452845    if (uNewEip > pCtx->cs.u32Limit)
    2846         return iemRaiseSelectorBounds(pIemCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
     2846        return iemRaiseSelectorBounds(pVCpu, X86_SREG_CS, IEM_ACCESS_INSTRUCTION);
    28472847
    28482848    /*
     
    28692869        }
    28702870        else
    2871             return iemRaiseGeneralProtectionFault0(pIemCpu);
     2871            return iemRaiseGeneralProtectionFault0(pVCpu);
    28722872        Log7(("iemCImpl_iret_real_v8086: u1VM=1: adjusted uNewFlags=%#x\n", uNewFlags));
    28732873    }
     
    28762876     * Commit the operation.
    28772877     */
    2878     rcStrict = iemMemStackPopCommitSpecial(pIemCpu, uFrame.pv, uNewRsp);
     2878    rcStrict = iemMemStackPopCommitSpecial(pVCpu, uFrame.pv, uNewRsp);
    28792879    if (rcStrict != VINF_SUCCESS)
    28802880        return rcStrict;
    28812881#ifdef DBGFTRACE_ENABLED
    2882     RTTraceBufAddMsgF(IEMCPU_TO_VM(pIemCpu)->CTX_SUFF(hTraceBuf), "iret/rm %04x:%04x -> %04x:%04x %x %04llx",
     2882    RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "iret/rm %04x:%04x -> %04x:%04x %x %04llx",
    28832883                      pCtx->cs.Sel, pCtx->eip, uNewCs, uNewEip, uNewFlags, uNewRsp);
    28842884#endif
     
    28912891    /** @todo do we load attribs and limit as well? */
    28922892    Assert(uNewFlags & X86_EFL_1);
    2893     IEMMISC_SET_EFL(pIemCpu, pCtx, uNewFlags);
     2893    IEMMISC_SET_EFL(pVCpu, pCtx, uNewFlags);
    28942894
    28952895    /* Flush the prefetch buffer. */
    2896     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     2896    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    28972897
    28982898    return VINF_SUCCESS;
     
    29382938    VBOXSTRICTRC    rcStrict;
    29392939    RTCPTRUNION     uFrame;
    2940     rcStrict = iemMemStackPopContinueSpecial(pIemCpu, 24, &uFrame.pv, &uNewRsp);
     2940    rcStrict = iemMemStackPopContinueSpecial(pVCpu, 24, &uFrame.pv, &uNewRsp);
    29412941    if (rcStrict != VINF_SUCCESS)
    29422942        return rcStrict;
     
    29472947    uint16_t uNewFs  = uFrame.pu32[4];
    29482948    uint16_t uNewGs  = uFrame.pu32[5];
    2949     rcStrict = iemMemCommitAndUnmap(pIemCpu, (void *)uFrame.pv, IEM_ACCESS_STACK_R); /* don't use iemMemStackPopCommitSpecial here. */
     2949    rcStrict = iemMemCommitAndUnmap(pVCpu, (void *)uFrame.pv, IEM_ACCESS_STACK_R); /* don't use iemMemStackPopCommitSpecial here. */
    29502950    if (rcStrict != VINF_SUCCESS)
    29512951        return rcStrict;
     
    29572957    uNewFlags |= X86_EFL_RA1_MASK;
    29582958#ifdef DBGFTRACE_ENABLED
    2959     RTTraceBufAddMsgF(IEMCPU_TO_VM(pIemCpu)->CTX_SUFF(hTraceBuf), "iret/p/v %04x:%08x -> %04x:%04x %x %04x:%04x",
     2959    RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "iret/p/v %04x:%08x -> %04x:%04x %x %04x:%04x",
    29602960                      pCtx->cs.Sel, pCtx->eip, uNewCs, uNewEip, uNewFlags, uNewSs, uNewEsp);
    29612961#endif
    29622962
    2963     IEMMISC_SET_EFL(pIemCpu, pCtx, uNewFlags);
     2963    IEMMISC_SET_EFL(pVCpu, pCtx, uNewFlags);
    29642964    iemCImplCommonV8086LoadSeg(&pCtx->cs, uNewCs);
    29652965    iemCImplCommonV8086LoadSeg(&pCtx->ss, uNewSs);
     
    29702970    pCtx->rip      = (uint16_t)uNewEip;
    29712971    pCtx->rsp      = uNewEsp; /** @todo check this out! */
    2972     pIemCpu->uCpl  = 3;
     2972    pVCpu->iem.s.uCpl  = 3;
    29732973
    29742974    /* Flush the prefetch buffer. */
    2975     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     2975    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    29762976
    29772977    return VINF_SUCCESS;
     
    29942994     */
    29952995    RTSEL        uSelRet;
    2996     PCPUMCTX     pCtx = pIemCpu->CTX_SUFF(pCtx);
    2997     VBOXSTRICTRC rcStrict = iemMemFetchSysU16(pIemCpu, &uSelRet, UINT8_MAX, pCtx->tr.u64Base);
     2996    PCPUMCTX     pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
     2997    VBOXSTRICTRC rcStrict = iemMemFetchSysU16(pVCpu, &uSelRet, UINT8_MAX, pCtx->tr.u64Base);
    29982998    if (rcStrict != VINF_SUCCESS)
    29992999        return rcStrict;
     
    30053005    {
    30063006        Log(("iret_prot_NestedTask TSS not in LDT. uSelRet=%04x -> #TS\n", uSelRet));
    3007         return iemRaiseTaskSwitchFaultBySelector(pIemCpu, uSelRet);
     3007        return iemRaiseTaskSwitchFaultBySelector(pVCpu, uSelRet);
    30083008    }
    30093009
    30103010    IEMSELDESC TssDesc;
    3011     rcStrict = iemMemFetchSelDesc(pIemCpu, &TssDesc, uSelRet, X86_XCPT_GP);
     3011    rcStrict = iemMemFetchSelDesc(pVCpu, &TssDesc, uSelRet, X86_XCPT_GP);
    30123012    if (rcStrict != VINF_SUCCESS)
    30133013        return rcStrict;
     
    30163016    {
    30173017        Log(("iret_prot_NestedTask Invalid TSS type. uSelRet=%04x -> #TS\n", uSelRet));
    3018         return iemRaiseTaskSwitchFaultBySelector(pIemCpu, uSelRet & X86_SEL_MASK_OFF_RPL);
     3018        return iemRaiseTaskSwitchFaultBySelector(pVCpu, uSelRet & X86_SEL_MASK_OFF_RPL);
    30193019    }
    30203020
     
    30233023    {
    30243024        Log(("iret_prot_NestedTask TSS is not busy. uSelRet=%04x DescType=%#x -> #TS\n", uSelRet, TssDesc.Legacy.Gate.u4Type));
    3025         return iemRaiseTaskSwitchFaultBySelector(pIemCpu, uSelRet & X86_SEL_MASK_OFF_RPL);
     3025        return iemRaiseTaskSwitchFaultBySelector(pVCpu, uSelRet & X86_SEL_MASK_OFF_RPL);
    30263026    }
    30273027
     
    30293029    {
    30303030        Log(("iret_prot_NestedTask TSS is not present. uSelRet=%04x -> #NP\n", uSelRet));
    3031         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uSelRet & X86_SEL_MASK_OFF_RPL);
     3031        return iemRaiseSelectorNotPresentBySelector(pVCpu, uSelRet & X86_SEL_MASK_OFF_RPL);
    30323032    }
    30333033
    30343034    uint32_t uNextEip = pCtx->eip + cbInstr;
    3035     return iemTaskSwitch(pIemCpu, pIemCpu->CTX_SUFF(pCtx), IEMTASKSWITCH_IRET, uNextEip, 0 /* fFlags */, 0 /* uErr */,
     3035    return iemTaskSwitch(pVCpu, pVCpu->iem.s.CTX_SUFF(pCtx), IEMTASKSWITCH_IRET, uNextEip, 0 /* fFlags */, 0 /* uErr */,
    30363036                         0 /* uCr2 */, uSelRet, &TssDesc);
    30373037#endif
     
    30463046IEM_CIMPL_DEF_1(iemCImpl_iret_prot, IEMMODE, enmEffOpSize)
    30473047{
    3048     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     3048    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    30493049    NOREF(cbInstr);
    30503050    Assert(enmEffOpSize == IEMMODE_32BIT || enmEffOpSize == IEMMODE_16BIT);
     
    30713071    if (enmEffOpSize == IEMMODE_32BIT)
    30723072    {
    3073         rcStrict = iemMemStackPopBeginSpecial(pIemCpu, 12, &uFrame.pv, &uNewRsp);
     3073        rcStrict = iemMemStackPopBeginSpecial(pVCpu, 12, &uFrame.pv, &uNewRsp);
    30743074        if (rcStrict != VINF_SUCCESS)
    30753075            return rcStrict;
     
    30803080    else
    30813081    {
    3082         rcStrict = iemMemStackPopBeginSpecial(pIemCpu, 6, &uFrame.pv, &uNewRsp);
     3082        rcStrict = iemMemStackPopBeginSpecial(pVCpu, 6, &uFrame.pv, &uNewRsp);
    30833083        if (rcStrict != VINF_SUCCESS)
    30843084            return rcStrict;
     
    30873087        uNewFlags  = uFrame.pu16[2];
    30883088    }
    3089     rcStrict = iemMemCommitAndUnmap(pIemCpu, (void *)uFrame.pv, IEM_ACCESS_STACK_R); /* don't use iemMemStackPopCommitSpecial here. */
     3089    rcStrict = iemMemCommitAndUnmap(pVCpu, (void *)uFrame.pv, IEM_ACCESS_STACK_R); /* don't use iemMemStackPopCommitSpecial here. */
    30903090    if (rcStrict != VINF_SUCCESS)
    30913091        return rcStrict;
     
    30963096     */
    30973097    if (   (uNewFlags & X86_EFL_VM)
    3098         && pIemCpu->uCpl == 0)
     3098        && pVCpu->iem.s.uCpl == 0)
    30993099    {
    31003100        Assert(enmEffOpSize == IEMMODE_32BIT);
     
    31093109    {
    31103110        Log(("iret %04x:%08x -> invalid CS selector, #GP(0)\n", uNewCs, uNewEip));
    3111         return iemRaiseGeneralProtectionFault0(pIemCpu);
     3111        return iemRaiseGeneralProtectionFault0(pVCpu);
    31123112    }
    31133113
    31143114    IEMSELDESC DescCS;
    3115     rcStrict = iemMemFetchSelDesc(pIemCpu, &DescCS, uNewCs, X86_XCPT_GP);
     3115    rcStrict = iemMemFetchSelDesc(pVCpu, &DescCS, uNewCs, X86_XCPT_GP);
    31163116    if (rcStrict != VINF_SUCCESS)
    31173117    {
     
    31243124    {
    31253125        Log(("iret %04x:%08x - CS is system segment (%#x) -> #GP\n", uNewCs, uNewEip, DescCS.Legacy.Gen.u4Type));
    3126         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     3126        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    31273127    }
    31283128    if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_CODE))
    31293129    {
    31303130        Log(("iret %04x:%08x - not code segment (%#x) -> #GP\n", uNewCs, uNewEip, DescCS.Legacy.Gen.u4Type));
    3131         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     3131        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    31323132    }
    31333133
    31343134#ifdef VBOX_WITH_RAW_MODE_NOT_R0
    31353135    /* Raw ring-0 and ring-1 compression adjustments for PATM performance tricks and other CS leaks. */
    3136     PVM pVM = IEMCPU_TO_VM(pIemCpu);
     3136    PVM pVM = pVCpu->CTX_SUFF(pVM);
    31373137    if (EMIsRawRing0Enabled(pVM) && !HMIsEnabled(pVM))
    31383138    {
    31393139        if ((uNewCs & X86_SEL_RPL) == 1)
    31403140        {
    3141             if (   pIemCpu->uCpl == 0
     3141            if (   pVCpu->iem.s.uCpl == 0
    31423142                && (   !EMIsRawRing1Enabled(pVM)
    31433143                    || pCtx->cs.Sel == (uNewCs & X86_SEL_MASK_OFF_RPL)) )
     
    31473147            }
    31483148# ifdef LOG_ENABLED
    3149             else if (pIemCpu->uCpl <= 1 && EMIsRawRing1Enabled(pVM))
     3149            else if (pVCpu->iem.s.uCpl <= 1 && EMIsRawRing1Enabled(pVM))
    31503150                Log(("iret: uNewCs=%#x genuine return to ring-1.\n", uNewCs));
    31513151# endif
     
    31533153        else if (   (uNewCs & X86_SEL_RPL) == 2
    31543154                 && EMIsRawRing1Enabled(pVM)
    3155                  && pIemCpu->uCpl <= 1)
     3155                 && pVCpu->iem.s.uCpl <= 1)
    31563156        {
    31573157            Log(("iret: Ring-1 compression fix: uNewCS=%#x -> %#x\n", uNewCs, (uNewCs & X86_SEL_MASK_OFF_RPL) | 1));
     
    31683168        {
    31693169            Log(("iret %04x:%08x - RPL != DPL (%d) -> #GP\n", uNewCs, uNewEip, DescCS.Legacy.Gen.u2Dpl));
    3170             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     3170            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    31713171        }
    31723172    }
     
    31743174    {
    31753175        Log(("iret %04x:%08x - RPL < DPL (%d) -> #GP\n", uNewCs, uNewEip, DescCS.Legacy.Gen.u2Dpl));
    3176         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
    3177     }
    3178     if ((uNewCs & X86_SEL_RPL) < pIemCpu->uCpl)
    3179     {
    3180         Log(("iret %04x:%08x - RPL < CPL (%d) -> #GP\n", uNewCs, uNewEip, pIemCpu->uCpl));
    3181         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     3176        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
     3177    }
     3178    if ((uNewCs & X86_SEL_RPL) < pVCpu->iem.s.uCpl)
     3179    {
     3180        Log(("iret %04x:%08x - RPL < CPL (%d) -> #GP\n", uNewCs, uNewEip, pVCpu->iem.s.uCpl));
     3181        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    31823182    }
    31833183
     
    31863186    {
    31873187        Log(("iret %04x:%08x - CS not present -> #NP\n", uNewCs, uNewEip));
    3188         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uNewCs);
     3188        return iemRaiseSelectorNotPresentBySelector(pVCpu, uNewCs);
    31893189    }
    31903190
     
    31943194     * Return to outer level?
    31953195     */
    3196     if ((uNewCs & X86_SEL_RPL) != pIemCpu->uCpl)
     3196    if ((uNewCs & X86_SEL_RPL) != pVCpu->iem.s.uCpl)
    31973197    {
    31983198        uint16_t    uNewSS;
     
    32003200        if (enmEffOpSize == IEMMODE_32BIT)
    32013201        {
    3202             rcStrict = iemMemStackPopContinueSpecial(pIemCpu, 8, &uFrame.pv, &uNewRsp);
     3202            rcStrict = iemMemStackPopContinueSpecial(pVCpu, 8, &uFrame.pv, &uNewRsp);
    32033203            if (rcStrict != VINF_SUCCESS)
    32043204                return rcStrict;
     
    32113211        else
    32123212        {
    3213             rcStrict = iemMemStackPopContinueSpecial(pIemCpu, 4, &uFrame.pv, &uNewRsp);
     3213            rcStrict = iemMemStackPopContinueSpecial(pVCpu, 4, &uFrame.pv, &uNewRsp);
    32143214            if (rcStrict != VINF_SUCCESS)
    32153215                return rcStrict;
     
    32173217            uNewSS  = uFrame.pu16[1];
    32183218        }
    3219         rcStrict = iemMemCommitAndUnmap(pIemCpu, (void *)uFrame.pv, IEM_ACCESS_STACK_R);
     3219        rcStrict = iemMemCommitAndUnmap(pVCpu, (void *)uFrame.pv, IEM_ACCESS_STACK_R);
    32203220        if (rcStrict != VINF_SUCCESS)
    32213221            return rcStrict;
     
    32263226        {
    32273227            Log(("iret %04x:%08x/%04x:%08x -> invalid SS selector, #GP(0)\n", uNewCs, uNewEip, uNewSS, uNewESP));
    3228             return iemRaiseGeneralProtectionFault0(pIemCpu);
     3228            return iemRaiseGeneralProtectionFault0(pVCpu);
    32293229        }
    32303230
    32313231        IEMSELDESC DescSS;
    3232         rcStrict = iemMemFetchSelDesc(pIemCpu, &DescSS, uNewSS, X86_XCPT_GP); /** @todo Correct exception? */
     3232        rcStrict = iemMemFetchSelDesc(pVCpu, &DescSS, uNewSS, X86_XCPT_GP); /** @todo Correct exception? */
    32333233        if (rcStrict != VINF_SUCCESS)
    32343234        {
     
    32423242        {
    32433243            Log(("iret %04x:%08x/%04x:%08x -> SS.RPL != CS.RPL -> #GP\n", uNewCs, uNewEip, uNewSS, uNewESP));
    3244             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewSS);
     3244            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewSS);
    32453245        }
    32463246        if (DescSS.Legacy.Gen.u2Dpl != (uNewCs & X86_SEL_RPL))
     
    32483248            Log(("iret %04x:%08x/%04x:%08x -> SS.DPL (%d) != CS.RPL -> #GP\n",
    32493249                 uNewCs, uNewEip, uNewSS, uNewESP, DescSS.Legacy.Gen.u2Dpl));
    3250             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewSS);
     3250            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewSS);
    32513251        }
    32523252
     
    32563256            Log(("iret %04x:%08x/%04x:%08x -> SS is system segment (%#x) -> #GP\n",
    32573257                 uNewCs, uNewEip, uNewSS, uNewESP, DescSS.Legacy.Gen.u4Type));
    3258             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewSS);
     3258            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewSS);
    32593259        }
    32603260        if ((DescSS.Legacy.Gen.u4Type & (X86_SEL_TYPE_CODE | X86_SEL_TYPE_WRITE)) != X86_SEL_TYPE_WRITE)
     
    32623262            Log(("iret %04x:%08x/%04x:%08x - not writable data segment (%#x) -> #GP\n",
    32633263                 uNewCs, uNewEip, uNewSS, uNewESP, DescSS.Legacy.Gen.u4Type));
    3264             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewSS);
     3264            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewSS);
    32653265        }
    32663266
     
    32693269        {
    32703270            Log(("iret %04x:%08x/%04x:%08x -> SS not present -> #SS\n", uNewCs, uNewEip, uNewSS, uNewESP));
    3271             return iemRaiseStackSelectorNotPresentBySelector(pIemCpu, uNewSS);
     3271            return iemRaiseStackSelectorNotPresentBySelector(pVCpu, uNewSS);
    32723272        }
    32733273
     
    32803280                 uNewCs, uNewEip, uNewSS, uNewESP, cbLimitCS));
    32813281            /** @todo: Which is it, #GP(0) or #GP(sel)? */
    3282             return iemRaiseSelectorBoundsBySelector(pIemCpu, uNewCs);
     3282            return iemRaiseSelectorBoundsBySelector(pVCpu, uNewCs);
    32833283        }
    32843284
     
    32893289        if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    32903290        {
    3291             rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewCs);
     3291            rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewCs);
    32923292            if (rcStrict != VINF_SUCCESS)
    32933293                return rcStrict;
     
    32963296        if (!(DescSS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    32973297        {
    3298             rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewSS);
     3298            rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewSS);
    32993299            if (rcStrict != VINF_SUCCESS)
    33003300                return rcStrict;
     
    33063306        if (enmEffOpSize != IEMMODE_16BIT)
    33073307            fEFlagsMask |= X86_EFL_RF | X86_EFL_AC | X86_EFL_ID;
    3308         if (pIemCpu->uCpl == 0)
     3308        if (pVCpu->iem.s.uCpl == 0)
    33093309            fEFlagsMask |= X86_EFL_IF | X86_EFL_IOPL | X86_EFL_VIF | X86_EFL_VIP; /* VM is 0 */
    3310         else if (pIemCpu->uCpl <= pCtx->eflags.Bits.u2IOPL)
     3310        else if (pVCpu->iem.s.uCpl <= pCtx->eflags.Bits.u2IOPL)
    33113311            fEFlagsMask |= X86_EFL_IF;
    3312         if (IEM_GET_TARGET_CPU(pIemCpu) <= IEMTARGETCPU_386)
     3312        if (IEM_GET_TARGET_CPU(pVCpu) <= IEMTARGETCPU_386)
    33133313            fEFlagsMask &= ~(X86_EFL_AC | X86_EFL_ID | X86_EFL_VIF | X86_EFL_VIP);
    3314         uint32_t fEFlagsNew = IEMMISC_GET_EFL(pIemCpu, pCtx);
     3314        uint32_t fEFlagsNew = IEMMISC_GET_EFL(pVCpu, pCtx);
    33153315        fEFlagsNew         &= ~fEFlagsMask;
    33163316        fEFlagsNew         |= uNewFlags & fEFlagsMask;
    33173317#ifdef DBGFTRACE_ENABLED
    3318         RTTraceBufAddMsgF(IEMCPU_TO_VM(pIemCpu)->CTX_SUFF(hTraceBuf), "iret/%up%u %04x:%08x -> %04x:%04x %x %04x:%04x",
    3319                           pIemCpu->uCpl, uNewCs & X86_SEL_RPL, pCtx->cs.Sel, pCtx->eip,
     3318        RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "iret/%up%u %04x:%08x -> %04x:%04x %x %04x:%04x",
     3319                          pVCpu->iem.s.uCpl, uNewCs & X86_SEL_RPL, pCtx->cs.Sel, pCtx->eip,
    33203320                          uNewCs, uNewEip, uNewFlags,  uNewSS, uNewESP);
    33213321#endif
    33223322
    3323         IEMMISC_SET_EFL(pIemCpu, pCtx, fEFlagsNew);
     3323        IEMMISC_SET_EFL(pVCpu, pCtx, fEFlagsNew);
    33243324        pCtx->rip           = uNewEip;
    33253325        pCtx->cs.Sel        = uNewCs;
     
    33293329        pCtx->cs.u32Limit   = cbLimitCS;
    33303330        pCtx->cs.u64Base    = X86DESC_BASE(&DescCS.Legacy);
    3331         pIemCpu->enmCpuMode = iemCalcCpuMode(pCtx);
     3331        pVCpu->iem.s.enmCpuMode = iemCalcCpuMode(pCtx);
    33323332        if (!pCtx->ss.Attr.n.u1DefBig)
    33333333            pCtx->sp        = (uint16_t)uNewESP;
     
    33413341        pCtx->ss.u64Base    = X86DESC_BASE(&DescSS.Legacy);
    33423342
    3343         pIemCpu->uCpl       = uNewCs & X86_SEL_RPL;
    3344         iemHlpAdjustSelectorForNewCpl(pIemCpu, uNewCs & X86_SEL_RPL, &pCtx->ds);
    3345         iemHlpAdjustSelectorForNewCpl(pIemCpu, uNewCs & X86_SEL_RPL, &pCtx->es);
    3346         iemHlpAdjustSelectorForNewCpl(pIemCpu, uNewCs & X86_SEL_RPL, &pCtx->fs);
    3347         iemHlpAdjustSelectorForNewCpl(pIemCpu, uNewCs & X86_SEL_RPL, &pCtx->gs);
     3343        pVCpu->iem.s.uCpl       = uNewCs & X86_SEL_RPL;
     3344        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCs & X86_SEL_RPL, &pCtx->ds);
     3345        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCs & X86_SEL_RPL, &pCtx->es);
     3346        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCs & X86_SEL_RPL, &pCtx->fs);
     3347        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCs & X86_SEL_RPL, &pCtx->gs);
    33483348
    33493349        /* Done! */
     
    33603360            Log(("iret %04x:%08x - EIP is out of bounds (%#x) -> #GP(0)\n", uNewCs, uNewEip, cbLimitCS));
    33613361            /** @todo: Which is it, #GP(0) or #GP(sel)? */
    3362             return iemRaiseSelectorBoundsBySelector(pIemCpu, uNewCs);
     3362            return iemRaiseSelectorBoundsBySelector(pVCpu, uNewCs);
    33633363        }
    33643364
     
    33683368        if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    33693369        {
    3370             rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewCs);
     3370            rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewCs);
    33713371            if (rcStrict != VINF_SUCCESS)
    33723372                return rcStrict;
     
    33753375
    33763376        X86EFLAGS NewEfl;
    3377         NewEfl.u = IEMMISC_GET_EFL(pIemCpu, pCtx);
     3377        NewEfl.u = IEMMISC_GET_EFL(pVCpu, pCtx);
    33783378        uint32_t fEFlagsMask = X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_SF
    33793379                             | X86_EFL_TF | X86_EFL_DF | X86_EFL_OF | X86_EFL_NT;
    33803380        if (enmEffOpSize != IEMMODE_16BIT)
    33813381            fEFlagsMask |= X86_EFL_RF | X86_EFL_AC | X86_EFL_ID;
    3382         if (pIemCpu->uCpl == 0)
     3382        if (pVCpu->iem.s.uCpl == 0)
    33833383            fEFlagsMask |= X86_EFL_IF | X86_EFL_IOPL | X86_EFL_VIF | X86_EFL_VIP; /* VM is 0 */
    3384         else if (pIemCpu->uCpl <= NewEfl.Bits.u2IOPL)
     3384        else if (pVCpu->iem.s.uCpl <= NewEfl.Bits.u2IOPL)
    33853385            fEFlagsMask |= X86_EFL_IF;
    3386         if (IEM_GET_TARGET_CPU(pIemCpu) <= IEMTARGETCPU_386)
     3386        if (IEM_GET_TARGET_CPU(pVCpu) <= IEMTARGETCPU_386)
    33873387            fEFlagsMask &= ~(X86_EFL_AC | X86_EFL_ID | X86_EFL_VIF | X86_EFL_VIP);
    33883388        NewEfl.u           &= ~fEFlagsMask;
    33893389        NewEfl.u           |= fEFlagsMask & uNewFlags;
    33903390#ifdef DBGFTRACE_ENABLED
    3391         RTTraceBufAddMsgF(IEMCPU_TO_VM(pIemCpu)->CTX_SUFF(hTraceBuf), "iret/%up %04x:%08x -> %04x:%04x %x %04x:%04llx",
    3392                           pIemCpu->uCpl, pCtx->cs.Sel, pCtx->eip,
     3391        RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "iret/%up %04x:%08x -> %04x:%04x %x %04x:%04llx",
     3392                          pVCpu->iem.s.uCpl, pCtx->cs.Sel, pCtx->eip,
    33933393                          uNewCs, uNewEip, uNewFlags, pCtx->ss.Sel, uNewRsp);
    33943394#endif
    33953395
    3396         IEMMISC_SET_EFL(pIemCpu, pCtx, NewEfl.u);
     3396        IEMMISC_SET_EFL(pVCpu, pCtx, NewEfl.u);
    33973397        pCtx->rip           = uNewEip;
    33983398        pCtx->cs.Sel        = uNewCs;
     
    34023402        pCtx->cs.u32Limit   = cbLimitCS;
    34033403        pCtx->cs.u64Base    = X86DESC_BASE(&DescCS.Legacy);
    3404         pIemCpu->enmCpuMode = iemCalcCpuMode(pCtx);
     3404        pVCpu->iem.s.enmCpuMode = iemCalcCpuMode(pCtx);
    34053405        pCtx->rsp           = uNewRsp;
    34063406        /* Done! */
     
    34083408
    34093409    /* Flush the prefetch buffer. */
    3410     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     3410    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    34113411
    34123412    return VINF_SUCCESS;
     
    34213421IEM_CIMPL_DEF_1(iemCImpl_iret_64bit, IEMMODE, enmEffOpSize)
    34223422{
    3423     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     3423    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    34243424    NOREF(cbInstr);
    34253425
     
    34303430    {
    34313431        Log(("iretq with NT=1 (eflags=%#x) -> #GP(0)\n", pCtx->eflags.u));
    3432         return iemRaiseGeneralProtectionFault0(pIemCpu);
     3432        return iemRaiseGeneralProtectionFault0(pVCpu);
    34333433    }
    34343434
     
    34483448    if (enmEffOpSize == IEMMODE_64BIT)
    34493449    {
    3450         rcStrict = iemMemStackPopBeginSpecial(pIemCpu, 5*8, &uFrame.pv, &uNewRsp);
     3450        rcStrict = iemMemStackPopBeginSpecial(pVCpu, 5*8, &uFrame.pv, &uNewRsp);
    34513451        if (rcStrict != VINF_SUCCESS)
    34523452            return rcStrict;
     
    34593459    else if (enmEffOpSize == IEMMODE_32BIT)
    34603460    {
    3461         rcStrict = iemMemStackPopBeginSpecial(pIemCpu, 5*4, &uFrame.pv, &uNewRsp);
     3461        rcStrict = iemMemStackPopBeginSpecial(pVCpu, 5*4, &uFrame.pv, &uNewRsp);
    34623462        if (rcStrict != VINF_SUCCESS)
    34633463            return rcStrict;
     
    34713471    {
    34723472        Assert(enmEffOpSize == IEMMODE_16BIT);
    3473         rcStrict = iemMemStackPopBeginSpecial(pIemCpu, 5*2, &uFrame.pv, &uNewRsp);
     3473        rcStrict = iemMemStackPopBeginSpecial(pVCpu, 5*2, &uFrame.pv, &uNewRsp);
    34743474        if (rcStrict != VINF_SUCCESS)
    34753475            return rcStrict;
     
    34803480        uNewSs     = uFrame.pu16[4];
    34813481    }
    3482     rcStrict = iemMemCommitAndUnmap(pIemCpu, (void *)uFrame.pv, IEM_ACCESS_STACK_R); /* don't use iemMemStackPopCommitSpecial here. */
     3482    rcStrict = iemMemCommitAndUnmap(pVCpu, (void *)uFrame.pv, IEM_ACCESS_STACK_R); /* don't use iemMemStackPopCommitSpecial here. */
    34833483    if (rcStrict != VINF_SUCCESS)
    34843484        return rcStrict;
     
    34923492    {
    34933493        Log(("iret %04x:%016RX64/%04x:%016RX64 -> invalid CS selector, #GP(0)\n", uNewCs, uNewRip, uNewSs, uNewRsp));
    3494         return iemRaiseGeneralProtectionFault0(pIemCpu);
     3494        return iemRaiseGeneralProtectionFault0(pVCpu);
    34953495    }
    34963496
    34973497    IEMSELDESC DescCS;
    3498     rcStrict = iemMemFetchSelDesc(pIemCpu, &DescCS, uNewCs, X86_XCPT_GP);
     3498    rcStrict = iemMemFetchSelDesc(pVCpu, &DescCS, uNewCs, X86_XCPT_GP);
    34993499    if (rcStrict != VINF_SUCCESS)
    35003500    {
     
    35103510        Log(("iret %04x:%016RX64/%04x:%016RX64 - CS is not a code segment T=%u T=%#xu -> #GP\n",
    35113511             uNewCs, uNewRip, uNewSs, uNewRsp, DescCS.Legacy.Gen.u1DescType, DescCS.Legacy.Gen.u4Type));
    3512         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     3512        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    35133513    }
    35143514
     
    35203520        {
    35213521            Log(("iret %04x:%016RX64 - RPL != DPL (%d) -> #GP\n", uNewCs, uNewRip, DescCS.Legacy.Gen.u2Dpl));
    3522             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     3522            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    35233523        }
    35243524    }
     
    35263526    {
    35273527        Log(("iret %04x:%016RX64 - RPL < DPL (%d) -> #GP\n", uNewCs, uNewRip, DescCS.Legacy.Gen.u2Dpl));
    3528         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
    3529     }
    3530     if ((uNewCs & X86_SEL_RPL) < pIemCpu->uCpl)
    3531     {
    3532         Log(("iret %04x:%016RX64 - RPL < CPL (%d) -> #GP\n", uNewCs, uNewRip, pIemCpu->uCpl));
    3533         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewCs);
     3528        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
     3529    }
     3530    if ((uNewCs & X86_SEL_RPL) < pVCpu->iem.s.uCpl)
     3531    {
     3532        Log(("iret %04x:%016RX64 - RPL < CPL (%d) -> #GP\n", uNewCs, uNewRip, pVCpu->iem.s.uCpl));
     3533        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewCs);
    35343534    }
    35353535
     
    35383538    {
    35393539        Log(("iret %04x:%016RX64/%04x:%016RX64 - CS not present -> #NP\n", uNewCs, uNewRip, uNewSs, uNewRsp));
    3540         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uNewCs);
     3540        return iemRaiseSelectorNotPresentBySelector(pVCpu, uNewCs);
    35413541    }
    35423542
     
    35523552        {
    35533553            Log(("iret %04x:%016RX64/%04x:%016RX64 -> invalid SS selector, #GP(0)\n", uNewCs, uNewRip, uNewSs, uNewRsp));
    3554             return iemRaiseGeneralProtectionFault0(pIemCpu);
     3554            return iemRaiseGeneralProtectionFault0(pVCpu);
    35553555        }
    35563556        DescSS.Legacy.u = 0;
     
    35583558    else
    35593559    {
    3560         rcStrict = iemMemFetchSelDesc(pIemCpu, &DescSS, uNewSs, X86_XCPT_GP); /** @todo Correct exception? */
     3560        rcStrict = iemMemFetchSelDesc(pVCpu, &DescSS, uNewSs, X86_XCPT_GP); /** @todo Correct exception? */
    35613561        if (rcStrict != VINF_SUCCESS)
    35623562        {
     
    35713571    {
    35723572        Log(("iret %04x:%016RX64/%04x:%016RX64 -> SS.RPL != CS.RPL -> #GP\n", uNewCs, uNewRip, uNewSs, uNewRsp));
    3573         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewSs);
     3573        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewSs);
    35743574    }
    35753575
     
    35833583            Log(("iret %04x:%016RX64/%04x:%016RX64 -> SS.DPL (%d) != CS.RPL -> #GP\n",
    35843584                 uNewCs, uNewRip, uNewSs, uNewRsp, DescSS.Legacy.Gen.u2Dpl));
    3585             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewSs);
     3585            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewSs);
    35863586        }
    35873587
     
    35913591            Log(("iret %04x:%016RX64/%04x:%016RX64 -> SS is system segment (%#x) -> #GP\n",
    35923592                 uNewCs, uNewRip, uNewSs, uNewRsp, DescSS.Legacy.Gen.u4Type));
    3593             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewSs);
     3593            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewSs);
    35943594        }
    35953595        if ((DescSS.Legacy.Gen.u4Type & (X86_SEL_TYPE_CODE | X86_SEL_TYPE_WRITE)) != X86_SEL_TYPE_WRITE)
     
    35973597            Log(("iret %04x:%016RX64/%04x:%016RX64 - not writable data segment (%#x) -> #GP\n",
    35983598                 uNewCs, uNewRip, uNewSs, uNewRsp, DescSS.Legacy.Gen.u4Type));
    3599             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewSs);
     3599            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewSs);
    36003600        }
    36013601
     
    36043604        {
    36053605            Log(("iret %04x:%016RX64/%04x:%016RX64 -> SS not present -> #SS\n", uNewCs, uNewRip, uNewSs, uNewRsp));
    3606             return iemRaiseStackSelectorNotPresentBySelector(pIemCpu, uNewSs);
     3606            return iemRaiseStackSelectorNotPresentBySelector(pVCpu, uNewSs);
    36073607        }
    36083608        cbLimitSs = X86DESC_LIMIT_G(&DescSS.Legacy);
     
    36163616            Log(("iret %04x:%016RX64/%04x:%016RX64 -> RIP is not canonical -> #GP(0)\n",
    36173617                 uNewCs, uNewRip, uNewSs, uNewRsp));
    3618             return iemRaiseSelectorBoundsBySelector(pIemCpu, uNewCs);
     3618            return iemRaiseSelectorBoundsBySelector(pVCpu, uNewCs);
    36193619        }
    36203620    }
     
    36263626                 uNewCs, uNewRip, uNewSs, uNewRsp, cbLimitCS));
    36273627            /** @todo: Which is it, #GP(0) or #GP(sel)? */
    3628             return iemRaiseSelectorBoundsBySelector(pIemCpu, uNewCs);
     3628            return iemRaiseSelectorBoundsBySelector(pVCpu, uNewCs);
    36293629        }
    36303630    }
     
    36373637    if (!(DescCS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    36383638    {
    3639         rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewCs);
     3639        rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewCs);
    36403640        if (rcStrict != VINF_SUCCESS)
    36413641            return rcStrict;
     
    36443644    if (!(DescSS.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    36453645    {
    3646         rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uNewSs);
     3646        rcStrict = iemMemMarkSelDescAccessed(pVCpu, uNewSs);
    36473647        if (rcStrict != VINF_SUCCESS)
    36483648            return rcStrict;
     
    36543654    if (enmEffOpSize != IEMMODE_16BIT)
    36553655        fEFlagsMask |= X86_EFL_RF | X86_EFL_AC | X86_EFL_ID;
    3656     if (pIemCpu->uCpl == 0)
     3656    if (pVCpu->iem.s.uCpl == 0)
    36573657        fEFlagsMask |= X86_EFL_IF | X86_EFL_IOPL | X86_EFL_VIF | X86_EFL_VIP; /* VM is ignored */
    3658     else if (pIemCpu->uCpl <= pCtx->eflags.Bits.u2IOPL)
     3658    else if (pVCpu->iem.s.uCpl <= pCtx->eflags.Bits.u2IOPL)
    36593659        fEFlagsMask |= X86_EFL_IF;
    3660     uint32_t fEFlagsNew = IEMMISC_GET_EFL(pIemCpu, pCtx);
     3660    uint32_t fEFlagsNew = IEMMISC_GET_EFL(pVCpu, pCtx);
    36613661    fEFlagsNew         &= ~fEFlagsMask;
    36623662    fEFlagsNew         |= uNewFlags & fEFlagsMask;
    36633663#ifdef DBGFTRACE_ENABLED
    3664     RTTraceBufAddMsgF(IEMCPU_TO_VM(pIemCpu)->CTX_SUFF(hTraceBuf), "iret/%ul%u %08llx -> %04x:%04llx %llx %04x:%04llx",
    3665                       pIemCpu->uCpl, uNewCpl, pCtx->rip, uNewCs, uNewRip, uNewFlags, uNewSs, uNewRsp);
     3664    RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "iret/%ul%u %08llx -> %04x:%04llx %llx %04x:%04llx",
     3665                      pVCpu->iem.s.uCpl, uNewCpl, pCtx->rip, uNewCs, uNewRip, uNewFlags, uNewSs, uNewRsp);
    36663666#endif
    36673667
    3668     IEMMISC_SET_EFL(pIemCpu, pCtx, fEFlagsNew);
     3668    IEMMISC_SET_EFL(pVCpu, pCtx, fEFlagsNew);
    36693669    pCtx->rip           = uNewRip;
    36703670    pCtx->cs.Sel        = uNewCs;
     
    36743674    pCtx->cs.u32Limit   = cbLimitCS;
    36753675    pCtx->cs.u64Base    = X86DESC_BASE(&DescCS.Legacy);
    3676     pIemCpu->enmCpuMode = iemCalcCpuMode(pCtx);
     3676    pVCpu->iem.s.enmCpuMode = iemCalcCpuMode(pCtx);
    36773677    if (pCtx->cs.Attr.n.u1Long || pCtx->cs.Attr.n.u1DefBig)
    36783678        pCtx->rsp       = uNewRsp;
     
    36983698    }
    36993699
    3700     if (pIemCpu->uCpl != uNewCpl)
    3701     {
    3702         pIemCpu->uCpl = uNewCpl;
    3703         iemHlpAdjustSelectorForNewCpl(pIemCpu, uNewCpl, &pCtx->ds);
    3704         iemHlpAdjustSelectorForNewCpl(pIemCpu, uNewCpl, &pCtx->es);
    3705         iemHlpAdjustSelectorForNewCpl(pIemCpu, uNewCpl, &pCtx->fs);
    3706         iemHlpAdjustSelectorForNewCpl(pIemCpu, uNewCpl, &pCtx->gs);
     3700    if (pVCpu->iem.s.uCpl != uNewCpl)
     3701    {
     3702        pVCpu->iem.s.uCpl = uNewCpl;
     3703        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCpl, &pCtx->ds);
     3704        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCpl, &pCtx->es);
     3705        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCpl, &pCtx->fs);
     3706        iemHlpAdjustSelectorForNewCpl(pVCpu, uNewCpl, &pCtx->gs);
    37073707    }
    37083708
    37093709    /* Flush the prefetch buffer. */
    3710     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     3710    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    37113711
    37123712    return VINF_SUCCESS;
     
    37243724     * First, clear NMI blocking, if any, before causing any exceptions.
    37253725     */
    3726     PVMCPU pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
    37273726    VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_BLOCK_NMIS);
    37283727
     
    37303729     * Call a mode specific worker.
    37313730     */
    3732     if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     3731    if (IEM_IS_REAL_OR_V86_MODE(pVCpu))
    37333732        return IEM_CIMPL_CALL_1(iemCImpl_iret_real_v8086, enmEffOpSize);
    3734     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     3733    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    37353734        return IEM_CIMPL_CALL_1(iemCImpl_iret_64bit, enmEffOpSize);
    37363735    return     IEM_CIMPL_CALL_1(iemCImpl_iret_prot, enmEffOpSize);
     
    37453744IEM_CIMPL_DEF_0(iemCImpl_syscall)
    37463745{
    3747     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     3746    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    37483747
    37493748    /*
     
    37573756    {
    37583757        Log(("syscall: Not enabled in EFER -> #UD\n"));
    3759         return iemRaiseUndefinedOpcode(pIemCpu);
     3758        return iemRaiseUndefinedOpcode(pVCpu);
    37603759    }
    37613760    if (!(pCtx->cr0 & X86_CR0_PE))
    37623761    {
    37633762        Log(("syscall: Protected mode is required -> #GP(0)\n"));
    3764         return iemRaiseGeneralProtectionFault0(pIemCpu);
    3765     }
    3766     if (IEM_IS_GUEST_CPU_INTEL(pIemCpu) && !CPUMIsGuestInLongModeEx(pCtx))
     3763        return iemRaiseGeneralProtectionFault0(pVCpu);
     3764    }
     3765    if (IEM_IS_GUEST_CPU_INTEL(pVCpu) && !CPUMIsGuestInLongModeEx(pCtx))
    37673766    {
    37683767        Log(("syscall: Only available in long mode on intel -> #UD\n"));
    3769         return iemRaiseUndefinedOpcode(pIemCpu);
     3768        return iemRaiseUndefinedOpcode(pVCpu);
    37703769    }
    37713770
     
    37773776    {
    37783777        Log(("syscall: msrSTAR.CS = 0 or SS = 0 -> #GP(0)\n"));
    3779         return iemRaiseGeneralProtectionFault0(pIemCpu);
     3778        return iemRaiseGeneralProtectionFault0(pVCpu);
    37803779    }
    37813780
     
    37833782    if (CPUMIsGuestInLongModeEx(pCtx))
    37843783    {
    3785         uint64_t uNewRip = pIemCpu->enmCpuMode == IEMMODE_64BIT ? pCtx->msrLSTAR : pCtx-> msrCSTAR;
     3784        uint64_t uNewRip = pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT ? pCtx->msrLSTAR : pCtx-> msrCSTAR;
    37863785
    37873786        /* This test isn't in the docs, but I'm not trusting the guys writing
     
    37903789        {
    37913790            Log(("syscall: Only available in long mode on intel -> #UD\n"));
    3792             return iemRaiseUndefinedOpcode(pIemCpu);
     3791            return iemRaiseUndefinedOpcode(pVCpu);
    37933792        }
    37943793
     
    38353834
    38363835    /* Flush the prefetch buffer. */
    3837     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     3836    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    38383837
    38393838    return VINF_SUCCESS;
     
    38473846
    38483847{
    3849     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     3848    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    38503849
    38513850    /*
     
    38593858    {
    38603859        Log(("sysret: Not enabled in EFER -> #UD\n"));
    3861         return iemRaiseUndefinedOpcode(pIemCpu);
    3862     }
    3863     if (IEM_IS_GUEST_CPU_INTEL(pIemCpu) && !CPUMIsGuestInLongModeEx(pCtx))
     3860        return iemRaiseUndefinedOpcode(pVCpu);
     3861    }
     3862    if (IEM_IS_GUEST_CPU_INTEL(pVCpu) && !CPUMIsGuestInLongModeEx(pCtx))
    38643863    {
    38653864        Log(("sysret: Only available in long mode on intel -> #UD\n"));
    3866         return iemRaiseUndefinedOpcode(pIemCpu);
     3865        return iemRaiseUndefinedOpcode(pVCpu);
    38673866    }
    38683867    if (!(pCtx->cr0 & X86_CR0_PE))
    38693868    {
    38703869        Log(("sysret: Protected mode is required -> #GP(0)\n"));
    3871         return iemRaiseGeneralProtectionFault0(pIemCpu);
    3872     }
    3873     if (pIemCpu->uCpl != 0)
    3874     {
    3875         Log(("sysret: CPL must be 0 not %u -> #GP(0)\n", pIemCpu->uCpl));
    3876         return iemRaiseGeneralProtectionFault0(pIemCpu);
     3870        return iemRaiseGeneralProtectionFault0(pVCpu);
     3871    }
     3872    if (pVCpu->iem.s.uCpl != 0)
     3873    {
     3874        Log(("sysret: CPL must be 0 not %u -> #GP(0)\n", pVCpu->iem.s.uCpl));
     3875        return iemRaiseGeneralProtectionFault0(pVCpu);
    38773876    }
    38783877
     
    38803879    uint16_t uNewCs = (pCtx->msrSTAR >> MSR_K6_STAR_SYSRET_CS_SS_SHIFT) & X86_SEL_MASK_OFF_RPL;
    38813880    uint16_t uNewSs = uNewCs + 8;
    3882     if (pIemCpu->enmEffOpSize == IEMMODE_64BIT)
     3881    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_64BIT)
    38833882        uNewCs += 16;
    38843883    if (uNewCs == 0 || uNewSs == 0)
    38853884    {
    38863885        Log(("sysret: msrSTAR.CS = 0 or SS = 0 -> #GP(0)\n"));
    3887         return iemRaiseGeneralProtectionFault0(pIemCpu);
     3886        return iemRaiseGeneralProtectionFault0(pVCpu);
    38883887    }
    38893888
     
    38933892    if (CPUMIsGuestInLongModeEx(pCtx))
    38943893    {
    3895         if (pIemCpu->enmEffOpSize == IEMMODE_64BIT)
     3894        if (pVCpu->iem.s.enmEffOpSize == IEMMODE_64BIT)
    38963895        {
    38973896            Log(("sysret: %04x:%016RX64 [efl=%#llx] -> %04x:%016RX64 [r11=%#llx]\n",
     
    39393938
    39403939    /* Flush the prefetch buffer. */
    3941     pIemCpu->cbOpcode = pIemCpu->offOpcode;
     3940    pVCpu->iem.s.cbOpcode = pVCpu->iem.s.offOpcode;
    39423941
    39433942    return VINF_SUCCESS;
     
    39533952IEM_CIMPL_DEF_2(iemCImpl_LoadSReg, uint8_t, iSegReg, uint16_t, uSel)
    39543953{
    3955     /*PCPUMCTX        pCtx = pIemCpu->CTX_SUFF(pCtx);*/
    3956     uint16_t       *pSel = iemSRegRef(pIemCpu, iSegReg);
    3957     PCPUMSELREGHID  pHid = iemSRegGetHid(pIemCpu, iSegReg);
     3954    /*PCPUMCTX        pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);*/
     3955    uint16_t       *pSel = iemSRegRef(pVCpu, iSegReg);
     3956    PCPUMSELREGHID  pHid = iemSRegGetHid(pVCpu, iSegReg);
    39583957
    39593958    Assert(iSegReg <= X86_SREG_GS && iSegReg != X86_SREG_CS);
     
    39623961     * Real mode and V8086 mode are easy.
    39633962     */
    3964     if (   pIemCpu->enmCpuMode == IEMMODE_16BIT
    3965         && IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     3963    if (   pVCpu->iem.s.enmCpuMode == IEMMODE_16BIT
     3964        && IEM_IS_REAL_OR_V86_MODE(pVCpu))
    39663965    {
    39673966        *pSel           = uSel;
     
    39813980                                : X86_SEL_TYPE_READ | X86_SEL_TYPE_CODE;
    39823981#endif
    3983         CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_HIDDEN_SEL_REGS);
    3984         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     3982        CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_HIDDEN_SEL_REGS);
     3983        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    39853984        return VINF_SUCCESS;
    39863985    }
     
    40014000               relaxed relationship to SS.RPL than intel does. */
    40024001            /** @todo We cannot 'mov ss, 3' in 64-bit kernel mode, can we? There is a testcase (bs-cpu-xcpt-1), but double check this! */
    4003             if (   pIemCpu->enmCpuMode != IEMMODE_64BIT
    4004                 || pIemCpu->uCpl > 2
    4005                 || (   uSel != pIemCpu->uCpl
    4006                     && !IEM_IS_GUEST_CPU_AMD(pIemCpu)) )
     4002            if (   pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT
     4003                || pVCpu->iem.s.uCpl > 2
     4004                || (   uSel != pVCpu->iem.s.uCpl
     4005                    && !IEM_IS_GUEST_CPU_AMD(pVCpu)) )
    40074006            {
    40084007                Log(("load sreg %#x -> invalid stack selector, #GP(0)\n", uSel));
    4009                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     4008                return iemRaiseGeneralProtectionFault0(pVCpu);
    40104009            }
    40114010        }
    40124011
    40134012        *pSel = uSel;   /* Not RPL, remember :-) */
    4014         iemHlpLoadNullDataSelectorProt(pIemCpu, pHid, uSel);
     4013        iemHlpLoadNullDataSelectorProt(pVCpu, pHid, uSel);
    40154014        if (iSegReg == X86_SREG_SS)
    4016             pHid->Attr.u |= pIemCpu->uCpl << X86DESCATTR_DPL_SHIFT;
    4017 
    4018         Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pHid));
    4019         CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_HIDDEN_SEL_REGS);
    4020 
    4021         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     4015            pHid->Attr.u |= pVCpu->iem.s.uCpl << X86DESCATTR_DPL_SHIFT;
     4016
     4017        Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, pHid));
     4018        CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_HIDDEN_SEL_REGS);
     4019
     4020        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    40224021        return VINF_SUCCESS;
    40234022    }
     
    40254024    /* Fetch the descriptor. */
    40264025    IEMSELDESC Desc;
    4027     VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uSel, X86_XCPT_GP); /** @todo Correct exception? */
     4026    VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pVCpu, &Desc, uSel, X86_XCPT_GP); /** @todo Correct exception? */
    40284027    if (rcStrict != VINF_SUCCESS)
    40294028        return rcStrict;
     
    40334032    {
    40344033        Log(("load sreg %d (=%#x) - system selector (%#x) -> #GP\n", iSegReg, uSel, Desc.Legacy.Gen.u4Type));
    4035         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     4034        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    40364035    }
    40374036    if (iSegReg == X86_SREG_SS) /* SS gets different treatment */
     
    40414040        {
    40424041            Log(("load sreg SS, %#x - code or read only (%#x) -> #GP\n", uSel, Desc.Legacy.Gen.u4Type));
    4043             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
    4044         }
    4045         if ((uSel & X86_SEL_RPL) != pIemCpu->uCpl)
    4046         {
    4047             Log(("load sreg SS, %#x - RPL and CPL (%d) differs -> #GP\n", uSel, pIemCpu->uCpl));
    4048             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
    4049         }
    4050         if (Desc.Legacy.Gen.u2Dpl != pIemCpu->uCpl)
    4051         {
    4052             Log(("load sreg SS, %#x - DPL (%d) and CPL (%d) differs -> #GP\n", uSel, Desc.Legacy.Gen.u2Dpl, pIemCpu->uCpl));
    4053             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     4042            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
     4043        }
     4044        if ((uSel & X86_SEL_RPL) != pVCpu->iem.s.uCpl)
     4045        {
     4046            Log(("load sreg SS, %#x - RPL and CPL (%d) differs -> #GP\n", uSel, pVCpu->iem.s.uCpl));
     4047            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
     4048        }
     4049        if (Desc.Legacy.Gen.u2Dpl != pVCpu->iem.s.uCpl)
     4050        {
     4051            Log(("load sreg SS, %#x - DPL (%d) and CPL (%d) differs -> #GP\n", uSel, Desc.Legacy.Gen.u2Dpl, pVCpu->iem.s.uCpl));
     4052            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    40544053        }
    40554054    }
     
    40594058        {
    40604059            Log(("load sreg%u, %#x - execute only segment -> #GP\n", iSegReg, uSel));
    4061             return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     4060            return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    40624061        }
    40634062        if (   (Desc.Legacy.Gen.u4Type & (X86_SEL_TYPE_CODE | X86_SEL_TYPE_CONF))
     
    40664065#if 0 /* this is what intel says. */
    40674066            if (   (uSel & X86_SEL_RPL) > Desc.Legacy.Gen.u2Dpl
    4068                 && pIemCpu->uCpl        > Desc.Legacy.Gen.u2Dpl)
     4067                && pVCpu->iem.s.uCpl        > Desc.Legacy.Gen.u2Dpl)
    40694068            {
    40704069                Log(("load sreg%u, %#x - both RPL (%d) and CPL (%d) are greater than DPL (%d) -> #GP\n",
    4071                      iSegReg, uSel, (uSel & X86_SEL_RPL), pIemCpu->uCpl, Desc.Legacy.Gen.u2Dpl));
    4072                 return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     4070                     iSegReg, uSel, (uSel & X86_SEL_RPL), pVCpu->iem.s.uCpl, Desc.Legacy.Gen.u2Dpl));
     4071                return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    40734072            }
    40744073#else /* this is what makes more sense. */
     
    40774076                Log(("load sreg%u, %#x - RPL (%d) is greater than DPL (%d) -> #GP\n",
    40784077                     iSegReg, uSel, (uSel & X86_SEL_RPL), Desc.Legacy.Gen.u2Dpl));
    4079                 return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     4078                return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    40804079            }
    4081             if (pIemCpu->uCpl > Desc.Legacy.Gen.u2Dpl)
     4080            if (pVCpu->iem.s.uCpl > Desc.Legacy.Gen.u2Dpl)
    40824081            {
    40834082                Log(("load sreg%u, %#x - CPL (%d) is greater than DPL (%d) -> #GP\n",
    4084                      iSegReg, uSel, pIemCpu->uCpl, Desc.Legacy.Gen.u2Dpl));
    4085                 return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uSel);
     4083                     iSegReg, uSel, pVCpu->iem.s.uCpl, Desc.Legacy.Gen.u2Dpl));
     4084                return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uSel);
    40864085            }
    40874086#endif
     
    40934092    {
    40944093        Log(("load sreg%d,%#x - segment not present -> #NP\n", iSegReg, uSel));
    4095         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uSel);
     4094        return iemRaiseSelectorNotPresentBySelector(pVCpu, uSel);
    40964095    }
    40974096
     
    41064105    if (!(Desc.Legacy.Gen.u4Type & X86_SEL_TYPE_ACCESSED))
    41074106    {
    4108         rcStrict = iemMemMarkSelDescAccessed(pIemCpu, uSel);
     4107        rcStrict = iemMemMarkSelDescAccessed(pVCpu, uSel);
    41094108        if (rcStrict != VINF_SUCCESS)
    41104109            return rcStrict;
     
    41224121    /** @todo check if the hidden bits are loaded correctly for 64-bit
    41234122     *        mode.  */
    4124     Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pHid));
    4125 
    4126     CPUMSetChangedFlags(IEMCPU_TO_VMCPU(pIemCpu), CPUM_CHANGED_HIDDEN_SEL_REGS);
    4127     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     4123    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, pHid));
     4124
     4125    CPUMSetChangedFlags(pVCpu, CPUM_CHANGED_HIDDEN_SEL_REGS);
     4126    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    41284127    return VINF_SUCCESS;
    41294128}
     
    41434142        if (iSegReg == X86_SREG_SS)
    41444143        {
    4145             PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    4146             EMSetInhibitInterruptsPC(IEMCPU_TO_VMCPU(pIemCpu), pCtx->rip);
     4144            PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
     4145            EMSetInhibitInterruptsPC(pVCpu, pCtx->rip);
    41474146        }
    41484147    }
     
    41594158IEM_CIMPL_DEF_2(iemCImpl_pop_Sreg, uint8_t, iSegReg, IEMMODE, enmEffOpSize)
    41604159{
    4161     PCPUMCTX        pCtx = pIemCpu->CTX_SUFF(pCtx);
     4160    PCPUMCTX        pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    41624161    VBOXSTRICTRC    rcStrict;
    41634162
     
    41724171        {
    41734172            uint16_t uSel;
    4174             rcStrict = iemMemStackPopU16Ex(pIemCpu, &uSel, &TmpRsp);
     4173            rcStrict = iemMemStackPopU16Ex(pVCpu, &uSel, &TmpRsp);
    41754174            if (rcStrict == VINF_SUCCESS)
    41764175                rcStrict = IEM_CIMPL_CALL_2(iemCImpl_LoadSReg, iSegReg, uSel);
     
    41814180        {
    41824181            uint32_t u32Value;
    4183             rcStrict = iemMemStackPopU32Ex(pIemCpu, &u32Value, &TmpRsp);
     4182            rcStrict = iemMemStackPopU32Ex(pVCpu, &u32Value, &TmpRsp);
    41844183            if (rcStrict == VINF_SUCCESS)
    41854184                rcStrict = IEM_CIMPL_CALL_2(iemCImpl_LoadSReg, iSegReg, (uint16_t)u32Value);
     
    41904189        {
    41914190            uint64_t u64Value;
    4192             rcStrict = iemMemStackPopU64Ex(pIemCpu, &u64Value, &TmpRsp);
     4191            rcStrict = iemMemStackPopU64Ex(pVCpu, &u64Value, &TmpRsp);
    41934192            if (rcStrict == VINF_SUCCESS)
    41944193                rcStrict = IEM_CIMPL_CALL_2(iemCImpl_LoadSReg, iSegReg, (uint16_t)u64Value);
     
    42054204        pCtx->rsp = TmpRsp.u;
    42064205        if (iSegReg == X86_SREG_SS)
    4207             EMSetInhibitInterruptsPC(IEMCPU_TO_VMCPU(pIemCpu), pCtx->rip);
     4206            EMSetInhibitInterruptsPC(pVCpu, pCtx->rip);
    42084207    }
    42094208    return rcStrict;
     
    42214220                IEMMODE,  enmEffOpSize)
    42224221{
    4223     /*PCPUMCTX        pCtx = pIemCpu->CTX_SUFF(pCtx);*/
     4222    /*PCPUMCTX        pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);*/
    42244223    VBOXSTRICTRC    rcStrict;
    42254224
     
    42354234        {
    42364235            case IEMMODE_16BIT:
    4237                 *(uint16_t *)iemGRegRef(pIemCpu, iGReg) = offSeg;
     4236                *(uint16_t *)iemGRegRef(pVCpu, iGReg) = offSeg;
    42384237                break;
    42394238            case IEMMODE_32BIT:
    4240                 *(uint64_t *)iemGRegRef(pIemCpu, iGReg) = offSeg;
     4239                *(uint64_t *)iemGRegRef(pVCpu, iGReg) = offSeg;
    42414240                break;
    42424241            case IEMMODE_64BIT:
    4243                 *(uint64_t *)iemGRegRef(pIemCpu, iGReg) = offSeg;
     4242                *(uint64_t *)iemGRegRef(pVCpu, iGReg) = offSeg;
    42444243                break;
    42454244            IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    42584257 * @retval iemMemFetchSysU64 return value.
    42594258 *
    4260  * @param   pIemCpu             The IEM state of the calling EMT.
     4259 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    42614260 * @param   uSel                The selector value.
    42624261 * @param   fAllowSysDesc       Whether system descriptors are OK or not.
    42634262 * @param   pDesc               Where to return the descriptor on success.
    42644263 */
    4265 static VBOXSTRICTRC iemCImpl_LoadDescHelper(PIEMCPU pIemCpu, uint16_t uSel, bool fAllowSysDesc, PIEMSELDESC pDesc)
     4264static VBOXSTRICTRC iemCImpl_LoadDescHelper(PVMCPU pVCpu, uint16_t uSel, bool fAllowSysDesc, PIEMSELDESC pDesc)
    42664265{
    42674266    pDesc->Long.au64[0] = 0;
     
    42724271
    42734272    /* Within the table limits? */
    4274     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     4273    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    42754274    RTGCPTR GCPtrBase;
    42764275    if (uSel & X86_SEL_LDT)
     
    42894288
    42904289    /* Fetch the descriptor. */
    4291     VBOXSTRICTRC rcStrict = iemMemFetchSysU64(pIemCpu, &pDesc->Legacy.u, UINT8_MAX, GCPtrBase + (uSel & X86_SEL_MASK));
     4290    VBOXSTRICTRC rcStrict = iemMemFetchSysU64(pVCpu, &pDesc->Legacy.u, UINT8_MAX, GCPtrBase + (uSel & X86_SEL_MASK));
    42924291    if (rcStrict != VINF_SUCCESS)
    42934292        return rcStrict;
     
    42984297        if (CPUMIsGuestInLongModeEx(pCtx))
    42994298        {
    4300             rcStrict = iemMemFetchSysU64(pIemCpu, &pDesc->Long.au64[1], UINT8_MAX, GCPtrBase + (uSel & X86_SEL_MASK) + 8);
     4299            rcStrict = iemMemFetchSysU64(pVCpu, &pDesc->Long.au64[1], UINT8_MAX, GCPtrBase + (uSel & X86_SEL_MASK) + 8);
    43014300            if (rcStrict != VINF_SUCCESS)
    43024301                return rcStrict;
     
    43144313IEM_CIMPL_DEF_2(iemCImpl_VerX, uint16_t, uSel, bool, fWrite)
    43154314{
    4316     Assert(!IEM_IS_REAL_OR_V86_MODE(pIemCpu));
     4315    Assert(!IEM_IS_REAL_OR_V86_MODE(pVCpu));
    43174316
    43184317    /** @todo figure whether the accessed bit is set or not. */
     
    43204319    bool         fAccessible = true;
    43214320    IEMSELDESC   Desc;
    4322     VBOXSTRICTRC rcStrict = iemCImpl_LoadDescHelper(pIemCpu, uSel, false /*fAllowSysDesc*/, &Desc);
     4321    VBOXSTRICTRC rcStrict = iemCImpl_LoadDescHelper(pVCpu, uSel, false /*fAllowSysDesc*/, &Desc);
    43234322    if (rcStrict == VINF_SUCCESS)
    43244323    {
     
    43404339                if ((unsigned)(uSel & X86_SEL_RPL) > Desc.Legacy.Gen.u2Dpl)
    43414340                    fAccessible = false;
    4342                 else if (pIemCpu->uCpl > Desc.Legacy.Gen.u2Dpl)
     4341                else if (pVCpu->iem.s.uCpl > Desc.Legacy.Gen.u2Dpl)
    43434342                    fAccessible = false;
    43444343            }
     
    43524351
    43534352    /* commit */
    4354     pIemCpu->CTX_SUFF(pCtx)->eflags.Bits.u1ZF = fAccessible;
    4355 
    4356     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     4353    pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.Bits.u1ZF = fAccessible;
     4354
     4355    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    43574356    return VINF_SUCCESS;
    43584357}
     
    43704369IEM_CIMPL_DEF_4(iemCImpl_LarLsl_u64, uint64_t *, pu64Dst, uint16_t, uSel, uint32_t *, pEFlags, bool, fIsLar)
    43714370{
    4372     Assert(!IEM_IS_REAL_OR_V86_MODE(pIemCpu));
     4371    Assert(!IEM_IS_REAL_OR_V86_MODE(pVCpu));
    43734372
    43744373    /** @todo figure whether the accessed bit is set or not. */
     
    43764375    bool         fDescOk = true;
    43774376    IEMSELDESC   Desc;
    4378     VBOXSTRICTRC rcStrict = iemCImpl_LoadDescHelper(pIemCpu, uSel, false /*fAllowSysDesc*/, &Desc);
     4377    VBOXSTRICTRC rcStrict = iemCImpl_LoadDescHelper(pVCpu, uSel, false /*fAllowSysDesc*/, &Desc);
    43794378    if (rcStrict == VINF_SUCCESS)
    43804379    {
     
    43844383        if (!Desc.Legacy.Gen.u1DescType)
    43854384        {
    4386             if (CPUMIsGuestInLongModeEx(pIemCpu->CTX_SUFF(pCtx)))
     4385            if (CPUMIsGuestInLongModeEx(pVCpu->iem.s.CTX_SUFF(pCtx)))
    43874386            {
    43884387                if (Desc.Long.Gen.u5Zeros)
     
    44364435                if ((unsigned)(uSel & X86_SEL_RPL) > Desc.Legacy.Gen.u2Dpl)
    44374436                    fDescOk = false;
    4438                 else if (pIemCpu->uCpl > Desc.Legacy.Gen.u2Dpl)
     4437                else if (pVCpu->iem.s.uCpl > Desc.Legacy.Gen.u2Dpl)
    44394438                    fDescOk = false;
    44404439            }
     
    44594458
    44604459    /* commit flags value and advance rip. */
    4461     pIemCpu->CTX_SUFF(pCtx)->eflags.Bits.u1ZF = fDescOk;
    4462     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     4460    pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.Bits.u1ZF = fDescOk;
     4461    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    44634462
    44644463    return VINF_SUCCESS;
     
    44934492IEM_CIMPL_DEF_3(iemCImpl_lgdt, uint8_t, iEffSeg, RTGCPTR, GCPtrEffSrc, IEMMODE, enmEffOpSize)
    44944493{
    4495     if (pIemCpu->uCpl != 0)
    4496         return iemRaiseGeneralProtectionFault0(pIemCpu);
    4497     Assert(!pIemCpu->CTX_SUFF(pCtx)->eflags.Bits.u1VM);
     4494    if (pVCpu->iem.s.uCpl != 0)
     4495        return iemRaiseGeneralProtectionFault0(pVCpu);
     4496    Assert(!pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.Bits.u1VM);
    44984497
    44994498    /*
     
    45024501    uint16_t cbLimit;
    45034502    RTGCPTR  GCPtrBase;
    4504     VBOXSTRICTRC rcStrict = iemMemFetchDataXdtr(pIemCpu, &cbLimit, &GCPtrBase, iEffSeg, GCPtrEffSrc, enmEffOpSize);
     4503    VBOXSTRICTRC rcStrict = iemMemFetchDataXdtr(pVCpu, &cbLimit, &GCPtrBase, iEffSeg, GCPtrEffSrc, enmEffOpSize);
    45054504    if (rcStrict == VINF_SUCCESS)
    45064505    {
    4507         if (   pIemCpu->enmCpuMode != IEMMODE_64BIT
     4506        if (   pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT
    45084507            || X86_IS_CANONICAL(GCPtrBase))
    45094508        {
    4510             if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
    4511                 rcStrict = CPUMSetGuestGDTR(IEMCPU_TO_VMCPU(pIemCpu), GCPtrBase, cbLimit);
     4509            if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
     4510                rcStrict = CPUMSetGuestGDTR(pVCpu, GCPtrBase, cbLimit);
    45124511            else
    45134512            {
    4514                 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     4513                PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    45154514                pCtx->gdtr.cbGdt = cbLimit;
    45164515                pCtx->gdtr.pGdt  = GCPtrBase;
    45174516            }
    45184517            if (rcStrict == VINF_SUCCESS)
    4519                 iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     4518                iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    45204519        }
    45214520        else
    45224521        {
    45234522            Log(("iemCImpl_lgdt: Non-canonical base %04x:%RGv\n", cbLimit, GCPtrBase));
    4524             return iemRaiseGeneralProtectionFault0(pIemCpu);
     4523            return iemRaiseGeneralProtectionFault0(pVCpu);
    45254524        }
    45264525    }
     
    45424541     *       you really must know.
    45434542     */
    4544     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    4545     VBOXSTRICTRC rcStrict = iemMemStoreDataXdtr(pIemCpu, pCtx->gdtr.cbGdt, pCtx->gdtr.pGdt, iEffSeg, GCPtrEffDst);
     4543    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
     4544    VBOXSTRICTRC rcStrict = iemMemStoreDataXdtr(pVCpu, pCtx->gdtr.cbGdt, pCtx->gdtr.pGdt, iEffSeg, GCPtrEffDst);
    45464545    if (rcStrict == VINF_SUCCESS)
    4547         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     4546        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    45484547    return rcStrict;
    45494548}
     
    45594558IEM_CIMPL_DEF_3(iemCImpl_lidt, uint8_t, iEffSeg, RTGCPTR, GCPtrEffSrc, IEMMODE, enmEffOpSize)
    45604559{
    4561     if (pIemCpu->uCpl != 0)
    4562         return iemRaiseGeneralProtectionFault0(pIemCpu);
    4563     Assert(!pIemCpu->CTX_SUFF(pCtx)->eflags.Bits.u1VM);
     4560    if (pVCpu->iem.s.uCpl != 0)
     4561        return iemRaiseGeneralProtectionFault0(pVCpu);
     4562    Assert(!pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.Bits.u1VM);
    45644563
    45654564    /*
     
    45684567    uint16_t cbLimit;
    45694568    RTGCPTR  GCPtrBase;
    4570     VBOXSTRICTRC rcStrict = iemMemFetchDataXdtr(pIemCpu, &cbLimit, &GCPtrBase, iEffSeg, GCPtrEffSrc, enmEffOpSize);
     4569    VBOXSTRICTRC rcStrict = iemMemFetchDataXdtr(pVCpu, &cbLimit, &GCPtrBase, iEffSeg, GCPtrEffSrc, enmEffOpSize);
    45714570    if (rcStrict == VINF_SUCCESS)
    45724571    {
    4573         if (   pIemCpu->enmCpuMode != IEMMODE_64BIT
     4572        if (   pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT
    45744573            || X86_IS_CANONICAL(GCPtrBase))
    45754574        {
    4576             if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
    4577                 CPUMSetGuestIDTR(IEMCPU_TO_VMCPU(pIemCpu), GCPtrBase, cbLimit);
     4575            if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
     4576                CPUMSetGuestIDTR(pVCpu, GCPtrBase, cbLimit);
    45784577            else
    45794578            {
    4580                 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     4579                PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    45814580                pCtx->idtr.cbIdt = cbLimit;
    45824581                pCtx->idtr.pIdt  = GCPtrBase;
    45834582            }
    4584             iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     4583            iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    45854584        }
    45864585        else
    45874586        {
    45884587            Log(("iemCImpl_lidt: Non-canonical base %04x:%RGv\n", cbLimit, GCPtrBase));
    4589             return iemRaiseGeneralProtectionFault0(pIemCpu);
     4588            return iemRaiseGeneralProtectionFault0(pVCpu);
    45904589        }
    45914590    }
     
    46074606     *       you really must know.
    46084607     */
    4609     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    4610     VBOXSTRICTRC rcStrict = iemMemStoreDataXdtr(pIemCpu, pCtx->idtr.cbIdt, pCtx->idtr.pIdt, iEffSeg, GCPtrEffDst);
     4608    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
     4609    VBOXSTRICTRC rcStrict = iemMemStoreDataXdtr(pVCpu, pCtx->idtr.cbIdt, pCtx->idtr.pIdt, iEffSeg, GCPtrEffDst);
    46114610    if (rcStrict == VINF_SUCCESS)
    4612         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     4611        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    46134612    return rcStrict;
    46144613}
     
    46224621IEM_CIMPL_DEF_1(iemCImpl_lldt, uint16_t, uNewLdt)
    46234622{
    4624     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     4623    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    46254624
    46264625    /*
    46274626     * Check preconditions.
    46284627     */
    4629     if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     4628    if (IEM_IS_REAL_OR_V86_MODE(pVCpu))
    46304629    {
    46314630        Log(("lldt %04x - real or v8086 mode -> #GP(0)\n", uNewLdt));
    4632         return iemRaiseUndefinedOpcode(pIemCpu);
    4633     }
    4634     if (pIemCpu->uCpl != 0)
    4635     {
    4636         Log(("lldt %04x - CPL is %d -> #GP(0)\n", uNewLdt, pIemCpu->uCpl));
    4637         return iemRaiseGeneralProtectionFault0(pIemCpu);
     4631        return iemRaiseUndefinedOpcode(pVCpu);
     4632    }
     4633    if (pVCpu->iem.s.uCpl != 0)
     4634    {
     4635        Log(("lldt %04x - CPL is %d -> #GP(0)\n", uNewLdt, pVCpu->iem.s.uCpl));
     4636        return iemRaiseGeneralProtectionFault0(pVCpu);
    46384637    }
    46394638    if (uNewLdt & X86_SEL_LDT)
    46404639    {
    46414640        Log(("lldt %04x - LDT selector -> #GP\n", uNewLdt));
    4642         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewLdt);
     4641        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewLdt);
    46434642    }
    46444643
     
    46494648    {
    46504649        Log(("lldt %04x: Loading NULL selector.\n",  uNewLdt));
    4651         if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
    4652             CPUMSetGuestLDTR(IEMCPU_TO_VMCPU(pIemCpu), uNewLdt);
     4650        if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
     4651            CPUMSetGuestLDTR(pVCpu, uNewLdt);
    46534652        else
    46544653            pCtx->ldtr.Sel = uNewLdt;
    46554654        pCtx->ldtr.ValidSel = uNewLdt;
    46564655        pCtx->ldtr.fFlags   = CPUMSELREG_FLAGS_VALID;
    4657         if (IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu))
     4656        if (IEM_FULL_VERIFICATION_REM_ENABLED(pVCpu))
    46584657        {
    46594658            pCtx->ldtr.Attr.u = X86DESCATTR_UNUSABLE;
    46604659            pCtx->ldtr.u64Base = pCtx->ldtr.u32Limit = 0; /* For verfication against REM. */
    46614660        }
    4662         else if (IEM_IS_GUEST_CPU_AMD(pIemCpu))
     4661        else if (IEM_IS_GUEST_CPU_AMD(pVCpu))
    46634662        {
    46644663            /* AMD-V seems to leave the base and limit alone. */
    46654664            pCtx->ldtr.Attr.u = X86DESCATTR_UNUSABLE;
    46664665        }
    4667         else if (!IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu))
     4666        else if (!IEM_FULL_VERIFICATION_REM_ENABLED(pVCpu))
    46684667        {
    46694668            /* VT-x (Intel 3960x) seems to be doing the following. */
     
    46734672        }
    46744673
    4675         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     4674        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    46764675        return VINF_SUCCESS;
    46774676    }
     
    46814680     */
    46824681    IEMSELDESC Desc;
    4683     VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uNewLdt, X86_XCPT_GP); /** @todo Correct exception? */
     4682    VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pVCpu, &Desc, uNewLdt, X86_XCPT_GP); /** @todo Correct exception? */
    46844683    if (rcStrict != VINF_SUCCESS)
    46854684        return rcStrict;
     
    46894688    {
    46904689        Log(("lldt %#x - not system selector (type %x) -> #GP\n", uNewLdt, Desc.Legacy.Gen.u4Type));
    4691         return iemRaiseGeneralProtectionFault(pIemCpu, uNewLdt & X86_SEL_MASK_OFF_RPL);
     4690        return iemRaiseGeneralProtectionFault(pVCpu, uNewLdt & X86_SEL_MASK_OFF_RPL);
    46924691    }
    46934692    if (Desc.Legacy.Gen.u4Type != X86_SEL_TYPE_SYS_LDT)
    46944693    {
    46954694        Log(("lldt %#x - not LDT selector (type %x) -> #GP\n", uNewLdt, Desc.Legacy.Gen.u4Type));
    4696         return iemRaiseGeneralProtectionFault(pIemCpu, uNewLdt & X86_SEL_MASK_OFF_RPL);
     4695        return iemRaiseGeneralProtectionFault(pVCpu, uNewLdt & X86_SEL_MASK_OFF_RPL);
    46974696    }
    46984697    uint64_t u64Base;
    4699     if (!IEM_IS_LONG_MODE(pIemCpu))
     4698    if (!IEM_IS_LONG_MODE(pVCpu))
    47004699        u64Base = X86DESC_BASE(&Desc.Legacy);
    47014700    else
     
    47044703        {
    47054704            Log(("lldt %#x - u5Zeros=%#x -> #GP\n", uNewLdt, Desc.Long.Gen.u5Zeros));
    4706             return iemRaiseGeneralProtectionFault(pIemCpu, uNewLdt & X86_SEL_MASK_OFF_RPL);
     4705            return iemRaiseGeneralProtectionFault(pVCpu, uNewLdt & X86_SEL_MASK_OFF_RPL);
    47074706        }
    47084707
     
    47114710        {
    47124711            Log(("lldt %#x - non-canonical base address %#llx -> #GP\n", uNewLdt, u64Base));
    4713             return iemRaiseGeneralProtectionFault(pIemCpu, uNewLdt & X86_SEL_MASK_OFF_RPL);
     4712            return iemRaiseGeneralProtectionFault(pVCpu, uNewLdt & X86_SEL_MASK_OFF_RPL);
    47144713        }
    47154714    }
     
    47194718    {
    47204719        Log(("lldt %#x - segment not present -> #NP\n", uNewLdt));
    4721         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uNewLdt);
     4720        return iemRaiseSelectorNotPresentBySelector(pVCpu, uNewLdt);
    47224721    }
    47234722
     
    47264725     */
    47274726/** @todo check if the actual value is loaded or if the RPL is dropped */
    4728     if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
    4729         CPUMSetGuestLDTR(IEMCPU_TO_VMCPU(pIemCpu), uNewLdt & X86_SEL_MASK_OFF_RPL);
     4727    if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
     4728        CPUMSetGuestLDTR(pVCpu, uNewLdt & X86_SEL_MASK_OFF_RPL);
    47304729    else
    47314730        pCtx->ldtr.Sel  = uNewLdt & X86_SEL_MASK_OFF_RPL;
     
    47364735    pCtx->ldtr.u64Base  = u64Base;
    47374736
    4738     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     4737    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    47394738    return VINF_SUCCESS;
    47404739}
     
    47484747IEM_CIMPL_DEF_1(iemCImpl_ltr, uint16_t, uNewTr)
    47494748{
    4750     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     4749    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    47514750
    47524751    /*
    47534752     * Check preconditions.
    47544753     */
    4755     if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     4754    if (IEM_IS_REAL_OR_V86_MODE(pVCpu))
    47564755    {
    47574756        Log(("ltr %04x - real or v8086 mode -> #GP(0)\n", uNewTr));
    4758         return iemRaiseUndefinedOpcode(pIemCpu);
    4759     }
    4760     if (pIemCpu->uCpl != 0)
    4761     {
    4762         Log(("ltr %04x - CPL is %d -> #GP(0)\n", uNewTr, pIemCpu->uCpl));
    4763         return iemRaiseGeneralProtectionFault0(pIemCpu);
     4757        return iemRaiseUndefinedOpcode(pVCpu);
     4758    }
     4759    if (pVCpu->iem.s.uCpl != 0)
     4760    {
     4761        Log(("ltr %04x - CPL is %d -> #GP(0)\n", uNewTr, pVCpu->iem.s.uCpl));
     4762        return iemRaiseGeneralProtectionFault0(pVCpu);
    47644763    }
    47654764    if (uNewTr & X86_SEL_LDT)
    47664765    {
    47674766        Log(("ltr %04x - LDT selector -> #GP\n", uNewTr));
    4768         return iemRaiseGeneralProtectionFaultBySelector(pIemCpu, uNewTr);
     4767        return iemRaiseGeneralProtectionFaultBySelector(pVCpu, uNewTr);
    47694768    }
    47704769    if (!(uNewTr & X86_SEL_MASK_OFF_RPL))
    47714770    {
    47724771        Log(("ltr %04x - NULL selector -> #GP(0)\n", uNewTr));
    4773         return iemRaiseGeneralProtectionFault0(pIemCpu);
     4772        return iemRaiseGeneralProtectionFault0(pVCpu);
    47744773    }
    47754774
     
    47784777     */
    47794778    IEMSELDESC Desc;
    4780     VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pIemCpu, &Desc, uNewTr, X86_XCPT_GP); /** @todo Correct exception? */
     4779    VBOXSTRICTRC rcStrict = iemMemFetchSelDesc(pVCpu, &Desc, uNewTr, X86_XCPT_GP); /** @todo Correct exception? */
    47814780    if (rcStrict != VINF_SUCCESS)
    47824781        return rcStrict;
     
    47864785    {
    47874786        Log(("ltr %#x - not system selector (type %x) -> #GP\n", uNewTr, Desc.Legacy.Gen.u4Type));
    4788         return iemRaiseGeneralProtectionFault(pIemCpu, uNewTr & X86_SEL_MASK_OFF_RPL);
     4787        return iemRaiseGeneralProtectionFault(pVCpu, uNewTr & X86_SEL_MASK_OFF_RPL);
    47894788    }
    47904789    if (   Desc.Legacy.Gen.u4Type != X86_SEL_TYPE_SYS_386_TSS_AVAIL /* same as AMD64_SEL_TYPE_SYS_TSS_AVAIL */
    47914790        && (   Desc.Legacy.Gen.u4Type != X86_SEL_TYPE_SYS_286_TSS_AVAIL
    4792             || IEM_IS_LONG_MODE(pIemCpu)) )
     4791            || IEM_IS_LONG_MODE(pVCpu)) )
    47934792    {
    47944793        Log(("ltr %#x - not an available TSS selector (type %x) -> #GP\n", uNewTr, Desc.Legacy.Gen.u4Type));
    4795         return iemRaiseGeneralProtectionFault(pIemCpu, uNewTr & X86_SEL_MASK_OFF_RPL);
     4794        return iemRaiseGeneralProtectionFault(pVCpu, uNewTr & X86_SEL_MASK_OFF_RPL);
    47964795    }
    47974796    uint64_t u64Base;
    4798     if (!IEM_IS_LONG_MODE(pIemCpu))
     4797    if (!IEM_IS_LONG_MODE(pVCpu))
    47994798        u64Base = X86DESC_BASE(&Desc.Legacy);
    48004799    else
     
    48034802        {
    48044803            Log(("ltr %#x - u5Zeros=%#x -> #GP\n", uNewTr, Desc.Long.Gen.u5Zeros));
    4805             return iemRaiseGeneralProtectionFault(pIemCpu, uNewTr & X86_SEL_MASK_OFF_RPL);
     4804            return iemRaiseGeneralProtectionFault(pVCpu, uNewTr & X86_SEL_MASK_OFF_RPL);
    48064805        }
    48074806
     
    48104809        {
    48114810            Log(("ltr %#x - non-canonical base address %#llx -> #GP\n", uNewTr, u64Base));
    4812             return iemRaiseGeneralProtectionFault(pIemCpu, uNewTr & X86_SEL_MASK_OFF_RPL);
     4811            return iemRaiseGeneralProtectionFault(pVCpu, uNewTr & X86_SEL_MASK_OFF_RPL);
    48134812        }
    48144813    }
     
    48184817    {
    48194818        Log(("ltr %#x - segment not present -> #NP\n", uNewTr));
    4820         return iemRaiseSelectorNotPresentBySelector(pIemCpu, uNewTr);
     4819        return iemRaiseSelectorNotPresentBySelector(pVCpu, uNewTr);
    48214820    }
    48224821
     
    48284827     */
    48294828    void *pvDesc;
    4830     rcStrict = iemMemMap(pIemCpu, &pvDesc, 8, UINT8_MAX, pCtx->gdtr.pGdt + (uNewTr & X86_SEL_MASK_OFF_RPL), IEM_ACCESS_DATA_RW);
     4829    rcStrict = iemMemMap(pVCpu, &pvDesc, 8, UINT8_MAX, pCtx->gdtr.pGdt + (uNewTr & X86_SEL_MASK_OFF_RPL), IEM_ACCESS_DATA_RW);
    48314830    if (rcStrict != VINF_SUCCESS)
    48324831        return rcStrict;
     
    48384837        case 3: ASMAtomicBitSet((uint8_t *)pvDesc + 1, 40 + 1 -  8); break;
    48394838    }
    4840     rcStrict = iemMemCommitAndUnmap(pIemCpu, pvDesc, IEM_ACCESS_DATA_RW);
     4839    rcStrict = iemMemCommitAndUnmap(pVCpu, pvDesc, IEM_ACCESS_DATA_RW);
    48414840    if (rcStrict != VINF_SUCCESS)
    48424841        return rcStrict;
     
    48474846     */
    48484847/** @todo check if the actual value is loaded or if the RPL is dropped */
    4849     if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
    4850         CPUMSetGuestTR(IEMCPU_TO_VMCPU(pIemCpu), uNewTr & X86_SEL_MASK_OFF_RPL);
     4848    if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
     4849        CPUMSetGuestTR(pVCpu, uNewTr & X86_SEL_MASK_OFF_RPL);
    48514850    else
    48524851        pCtx->tr.Sel  = uNewTr & X86_SEL_MASK_OFF_RPL;
     
    48574856    pCtx->tr.u64Base  = u64Base;
    48584857
    4859     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     4858    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    48604859    return VINF_SUCCESS;
    48614860}
     
    48704869IEM_CIMPL_DEF_2(iemCImpl_mov_Rd_Cd, uint8_t, iGReg, uint8_t, iCrReg)
    48714870{
    4872     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    4873     if (pIemCpu->uCpl != 0)
    4874         return iemRaiseGeneralProtectionFault0(pIemCpu);
     4871    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
     4872    if (pVCpu->iem.s.uCpl != 0)
     4873        return iemRaiseGeneralProtectionFault0(pVCpu);
    48754874    Assert(!pCtx->eflags.Bits.u1VM);
    48764875
     
    48814880        case 0:
    48824881            crX = pCtx->cr0;
    4883             if (IEM_GET_TARGET_CPU(pIemCpu) <= IEMTARGETCPU_386)
     4882            if (IEM_GET_TARGET_CPU(pVCpu) <= IEMTARGETCPU_386)
    48844883                crX |= UINT32_C(0x7fffffe0); /* All reserved CR0 flags are set on a 386, just like MSW on 286. */
    48854884            break;
     
    48904889        {
    48914890            uint8_t uTpr;
    4892             int rc = PDMApicGetTPR(IEMCPU_TO_VMCPU(pIemCpu), &uTpr, NULL, NULL);
     4891            int rc = PDMApicGetTPR(pVCpu, &uTpr, NULL, NULL);
    48934892            if (RT_SUCCESS(rc))
    48944893                crX = uTpr >> 4;
     
    49014900
    49024901    /* store it */
    4903     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
    4904         *(uint64_t *)iemGRegRef(pIemCpu, iGReg) = crX;
     4902    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
     4903        *(uint64_t *)iemGRegRef(pVCpu, iGReg) = crX;
    49054904    else
    4906         *(uint64_t *)iemGRegRef(pIemCpu, iGReg) = (uint32_t)crX;
    4907 
    4908     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     4905        *(uint64_t *)iemGRegRef(pVCpu, iGReg) = (uint32_t)crX;
     4906
     4907    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    49094908    return VINF_SUCCESS;
    49104909}
     
    49194918IEM_CIMPL_DEF_2(iemCImpl_load_CrX, uint8_t, iCrReg, uint64_t, uNewCrX)
    49204919{
    4921     PCPUMCTX        pCtx  = pIemCpu->CTX_SUFF(pCtx);
    4922     PVMCPU          pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
     4920    PCPUMCTX        pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
    49234921    VBOXSTRICTRC    rcStrict;
    49244922    int             rc;
     
    49414939
    49424940            /* ET is hardcoded on 486 and later. */
    4943             if (IEM_GET_TARGET_CPU(pIemCpu) > IEMTARGETCPU_486)
     4941            if (IEM_GET_TARGET_CPU(pVCpu) > IEMTARGETCPU_486)
    49444942                uNewCrX |= X86_CR0_ET;
    49454943            /* The 386 and 486 didn't #GP(0) on attempting to set reserved CR0 bits. ET was settable on 386. */
    4946             else if (IEM_GET_TARGET_CPU(pIemCpu) == IEMTARGETCPU_486)
     4944            else if (IEM_GET_TARGET_CPU(pVCpu) == IEMTARGETCPU_486)
    49474945            {
    49484946                uNewCrX &= fValid;
     
    49564954            {
    49574955                Log(("Trying to set reserved CR0 bits: NewCR0=%#llx InvalidBits=%#llx\n", uNewCrX, uNewCrX & ~(uint64_t)fValid));
    4958                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     4956                return iemRaiseGeneralProtectionFault0(pVCpu);
    49594957            }
    49604958
     
    49644962            {
    49654963                Log(("Trying to set CR0.PG without CR0.PE\n"));
    4966                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     4964                return iemRaiseGeneralProtectionFault0(pVCpu);
    49674965            }
    49684966
     
    49714969            {
    49724970                Log(("Trying to clear CR0.CD while leaving CR0.NW set\n"));
    4973                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     4971                return iemRaiseGeneralProtectionFault0(pVCpu);
    49744972            }
    49754973
     
    49824980                {
    49834981                    Log(("Trying to enabled long mode paging without CR4.PAE set\n"));
    4984                     return iemRaiseGeneralProtectionFault0(pIemCpu);
     4982                    return iemRaiseGeneralProtectionFault0(pVCpu);
    49854983                }
    49864984                if (pCtx->cs.Attr.n.u1Long)
    49874985                {
    49884986                    Log(("Trying to enabled long mode paging with a long CS descriptor loaded.\n"));
    4989                     return iemRaiseGeneralProtectionFault0(pIemCpu);
     4987                    return iemRaiseGeneralProtectionFault0(pVCpu);
    49904988                }
    49914989            }
     
    49964994             * Change CR0.
    49974995             */
    4998             if (!IEM_VERIFICATION_ENABLED(pIemCpu))
     4996            if (!IEM_VERIFICATION_ENABLED(pVCpu))
    49994997                CPUMSetGuestCR0(pVCpu, uNewCrX);
    50004998            else
     
    50145012                    NewEFER &= ~MSR_K6_EFER_LMA;
    50155013
    5016                 if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
     5014                if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
    50175015                    CPUMSetGuestEFER(pVCpu, NewEFER);
    50185016                else
     
    50245022             * Inform PGM.
    50255023             */
    5026             if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
     5024            if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
    50275025            {
    50285026                if (    (uNewCrX & (X86_CR0_PG | X86_CR0_WP | X86_CR0_PE))
     
    50715069            {
    50725070                Log(("Trying to load CR3 with invalid high bits set: %#llx\n", uNewCrX));
    5073                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5071                return iemRaiseGeneralProtectionFault0(pVCpu);
    50745072            }
    50755073
     
    50915089
    50925090            /* Make the change. */
    5093             if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
     5091            if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
    50945092            {
    50955093                rc = CPUMSetGuestCR3(pVCpu, uNewCrX);
     
    51005098
    51015099            /* Inform PGM. */
    5102             if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
     5100            if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
    51035101            {
    51045102                if (pCtx->cr0 & X86_CR0_PG)
     
    51335131            //if (xxx)
    51345132            //    fValid |= X86_CR4_VMXE;
    5135             if (IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fXSaveRstor)
     5133            if (IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fXSaveRstor)
    51365134                fValid |= X86_CR4_OSXSAVE;
    51375135            if (uNewCrX & ~(uint64_t)fValid)
    51385136            {
    51395137                Log(("Trying to set reserved CR4 bits: NewCR4=%#llx InvalidBits=%#llx\n", uNewCrX, uNewCrX & ~(uint64_t)fValid));
    5140                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5138                return iemRaiseGeneralProtectionFault0(pVCpu);
    51415139            }
    51425140
     
    51475145            {
    51485146                Log(("Trying to set clear CR4.PAE while long mode is active\n"));
    5149                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5147                return iemRaiseGeneralProtectionFault0(pVCpu);
    51505148            }
    51515149
     
    51545152             * Change it.
    51555153             */
    5156             if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
     5154            if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
    51575155            {
    51585156                rc = CPUMSetGuestCR4(pVCpu, uNewCrX);
     
    51665164             * Notify SELM and PGM.
    51675165             */
    5168             if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
     5166            if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
    51695167            {
    51705168                /* SELM - VME may change things wrt to the TSS shadowing. */
     
    51745172                         RT_BOOL(uOldCrX & X86_CR4_VME), RT_BOOL(uNewCrX & X86_CR4_VME) ));
    51755173#ifdef VBOX_WITH_RAW_MODE
    5176                     if (!HMIsEnabled(IEMCPU_TO_VM(pIemCpu)))
     5174                    if (!HMIsEnabled(pVCpu->CTX_SUFF(pVM)))
    51775175                        VMCPU_FF_SET(pVCpu, VMCPU_FF_SELM_SYNC_TSS);
    51785176#endif
     
    52005198            {
    52015199                Log(("Trying to set reserved CR8 bits (%#RX64)\n", uNewCrX));
    5202                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5200                return iemRaiseGeneralProtectionFault0(pVCpu);
    52035201            }
    52045202
    5205             if (!IEM_FULL_VERIFICATION_ENABLED(pIemCpu))
    5206                 PDMApicSetTPR(IEMCPU_TO_VMCPU(pIemCpu), (uint8_t)uNewCrX << 4);
     5203            if (!IEM_FULL_VERIFICATION_ENABLED(pVCpu))
     5204                PDMApicSetTPR(pVCpu, (uint8_t)uNewCrX << 4);
    52075205            rcStrict = VINF_SUCCESS;
    52085206            break;
     
    52175215    {
    52185216        if (rcStrict != VINF_SUCCESS)
    5219             rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
    5220         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5217            rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
     5218        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    52215219    }
    52225220
     
    52335231IEM_CIMPL_DEF_2(iemCImpl_mov_Cd_Rd, uint8_t, iCrReg, uint8_t, iGReg)
    52345232{
    5235     if (pIemCpu->uCpl != 0)
    5236         return iemRaiseGeneralProtectionFault0(pIemCpu);
    5237     Assert(!pIemCpu->CTX_SUFF(pCtx)->eflags.Bits.u1VM);
     5233    if (pVCpu->iem.s.uCpl != 0)
     5234        return iemRaiseGeneralProtectionFault0(pVCpu);
     5235    Assert(!pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.Bits.u1VM);
    52385236
    52395237    /*
     
    52415239     */
    52425240    uint64_t uNewCrX;
    5243     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
    5244         uNewCrX = iemGRegFetchU64(pIemCpu, iGReg);
     5241    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
     5242        uNewCrX = iemGRegFetchU64(pVCpu, iGReg);
    52455243    else
    5246         uNewCrX = iemGRegFetchU32(pIemCpu, iGReg);
     5244        uNewCrX = iemGRegFetchU32(pVCpu, iGReg);
    52475245    return IEM_CIMPL_CALL_2(iemCImpl_load_CrX, iCrReg, uNewCrX);
    52485246}
     
    52565254IEM_CIMPL_DEF_1(iemCImpl_lmsw, uint16_t, u16NewMsw)
    52575255{
    5258     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    5259 
    5260     if (pIemCpu->uCpl != 0)
    5261         return iemRaiseGeneralProtectionFault0(pIemCpu);
     5256    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
     5257
     5258    if (pVCpu->iem.s.uCpl != 0)
     5259        return iemRaiseGeneralProtectionFault0(pVCpu);
    52625260    Assert(!pCtx->eflags.Bits.u1VM);
    52635261
     
    52765274IEM_CIMPL_DEF_0(iemCImpl_clts)
    52775275{
    5278     if (pIemCpu->uCpl != 0)
    5279         return iemRaiseGeneralProtectionFault0(pIemCpu);
    5280 
    5281     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5276    if (pVCpu->iem.s.uCpl != 0)
     5277        return iemRaiseGeneralProtectionFault0(pVCpu);
     5278
     5279    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    52825280    uint64_t uNewCr0 = pCtx->cr0;
    52835281    uNewCr0 &= ~X86_CR0_TS;
     
    52945292IEM_CIMPL_DEF_2(iemCImpl_mov_Rd_Dd, uint8_t, iGReg, uint8_t, iDrReg)
    52955293{
    5296     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5294    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    52975295
    52985296    /*
     
    53015299
    53025300    /* Raise GPs. */
    5303     if (pIemCpu->uCpl != 0)
    5304         return iemRaiseGeneralProtectionFault0(pIemCpu);
     5301    if (pVCpu->iem.s.uCpl != 0)
     5302        return iemRaiseGeneralProtectionFault0(pVCpu);
    53055303    Assert(!pCtx->eflags.Bits.u1VM);
    53065304
     
    53095307    {
    53105308        Log(("mov r%u,dr%u: CR4.DE=1 -> #GP(0)\n", iGReg, iDrReg));
    5311         return iemRaiseGeneralProtectionFault0(pIemCpu);
     5309        return iemRaiseGeneralProtectionFault0(pVCpu);
    53125310    }
    53135311
     
    53165314    {
    53175315        Log(("mov r%u,dr%u: DR7.GD=1 -> #DB\n", iGReg, iDrReg));
    5318         return iemRaiseDebugException(pIemCpu);
     5316        return iemRaiseDebugException(pVCpu);
    53195317    }
    53205318
     
    53445342    }
    53455343
    5346     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
    5347         *(uint64_t *)iemGRegRef(pIemCpu, iGReg) = drX;
     5344    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
     5345        *(uint64_t *)iemGRegRef(pVCpu, iGReg) = drX;
    53485346    else
    5349         *(uint64_t *)iemGRegRef(pIemCpu, iGReg) = (uint32_t)drX;
    5350 
    5351     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5347        *(uint64_t *)iemGRegRef(pVCpu, iGReg) = (uint32_t)drX;
     5348
     5349    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    53525350    return VINF_SUCCESS;
    53535351}
     
    53625360IEM_CIMPL_DEF_2(iemCImpl_mov_Dd_Rd, uint8_t, iDrReg, uint8_t, iGReg)
    53635361{
    5364     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5362    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    53655363
    53665364    /*
    53675365     * Check preconditions.
    53685366     */
    5369     if (pIemCpu->uCpl != 0)
    5370         return iemRaiseGeneralProtectionFault0(pIemCpu);
     5367    if (pVCpu->iem.s.uCpl != 0)
     5368        return iemRaiseGeneralProtectionFault0(pVCpu);
    53715369    Assert(!pCtx->eflags.Bits.u1VM);
    53725370
     
    53765374        {
    53775375            Log(("mov dr%u,r%u: CR4.DE=1 -> #GP(0)\n", iDrReg, iGReg));
    5378             return iemRaiseGeneralProtectionFault0(pIemCpu);
     5376            return iemRaiseGeneralProtectionFault0(pVCpu);
    53795377        }
    53805378        iDrReg += 2;
     
    53875385    {
    53885386        Log(("mov dr%u,r%u: DR7.GD=1 -> #DB\n", iDrReg, iGReg));
    5389         return iemRaiseDebugException(pIemCpu);
     5387        return iemRaiseDebugException(pVCpu);
    53905388    }
    53915389
     
    53945392     */
    53955393    uint64_t uNewDrX;
    5396     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
    5397         uNewDrX = iemGRegFetchU64(pIemCpu, iGReg);
     5394    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
     5395        uNewDrX = iemGRegFetchU64(pVCpu, iGReg);
    53985396    else
    5399         uNewDrX = iemGRegFetchU32(pIemCpu, iGReg);
     5397        uNewDrX = iemGRegFetchU32(pVCpu, iGReg);
    54005398
    54015399    /*
     
    54155413            {
    54165414                Log(("mov dr%u,%#llx: DR6 high bits are not zero -> #GP(0)\n", iDrReg, uNewDrX));
    5417                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5415                return iemRaiseGeneralProtectionFault0(pVCpu);
    54185416            }
    54195417            uNewDrX |= X86_DR6_RA1_MASK;
     
    54255423            {
    54265424                Log(("mov dr%u,%#llx: DR7 high bits are not zero -> #GP(0)\n", iDrReg, uNewDrX));
    5427                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5425                return iemRaiseGeneralProtectionFault0(pVCpu);
    54285426            }
    54295427            uNewDrX |= X86_DR7_RA1_MASK;
     
    54375435     * Do the actual setting.
    54385436     */
    5439     if (!IEM_VERIFICATION_ENABLED(pIemCpu))
    5440     {
    5441         int rc = CPUMSetGuestDRx(IEMCPU_TO_VMCPU(pIemCpu), iDrReg, uNewDrX);
     5437    if (!IEM_VERIFICATION_ENABLED(pVCpu))
     5438    {
     5439        int rc = CPUMSetGuestDRx(pVCpu, iDrReg, uNewDrX);
    54425440        AssertRCSuccessReturn(rc, RT_SUCCESS_NP(rc) ? VERR_IEM_IPE_1 : rc);
    54435441    }
     
    54455443        pCtx->dr[iDrReg] = uNewDrX;
    54465444
    5447     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5445    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    54485446    return VINF_SUCCESS;
    54495447}
     
    54595457{
    54605458    /* ring-0 only. */
    5461     if (pIemCpu->uCpl != 0)
    5462         return iemRaiseGeneralProtectionFault0(pIemCpu);
    5463     Assert(!pIemCpu->CTX_SUFF(pCtx)->eflags.Bits.u1VM);
    5464 
    5465     int rc = PGMInvalidatePage(IEMCPU_TO_VMCPU(pIemCpu), GCPtrPage);
    5466     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5459    if (pVCpu->iem.s.uCpl != 0)
     5460        return iemRaiseGeneralProtectionFault0(pVCpu);
     5461    Assert(!pVCpu->iem.s.CTX_SUFF(pCtx)->eflags.Bits.u1VM);
     5462
     5463    int rc = PGMInvalidatePage(pVCpu, GCPtrPage);
     5464    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    54675465
    54685466    if (rc == VINF_SUCCESS)
    54695467        return VINF_SUCCESS;
    54705468    if (rc == VINF_PGM_SYNC_CR3)
    5471         return iemSetPassUpStatus(pIemCpu, rc);
     5469        return iemSetPassUpStatus(pVCpu, rc);
    54725470
    54735471    AssertMsg(rc == VINF_EM_RAW_EMULATE_INSTR || RT_FAILURE_NP(rc), ("%Rrc\n", rc));
     
    54825480IEM_CIMPL_DEF_0(iemCImpl_rdtsc)
    54835481{
    5484     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5482    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    54855483
    54865484    /*
    54875485     * Check preconditions.
    54885486     */
    5489     if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fTsc)
    5490         return iemRaiseUndefinedOpcode(pIemCpu);
     5487    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fTsc)
     5488        return iemRaiseUndefinedOpcode(pVCpu);
    54915489
    54925490    if (   (pCtx->cr4 & X86_CR4_TSD)
    5493         && pIemCpu->uCpl != 0)
    5494     {
    5495         Log(("rdtsc: CR4.TSD and CPL=%u -> #GP(0)\n", pIemCpu->uCpl));
    5496         return iemRaiseGeneralProtectionFault0(pIemCpu);
     5491        && pVCpu->iem.s.uCpl != 0)
     5492    {
     5493        Log(("rdtsc: CR4.TSD and CPL=%u -> #GP(0)\n", pVCpu->iem.s.uCpl));
     5494        return iemRaiseGeneralProtectionFault0(pVCpu);
    54975495    }
    54985496
     
    55005498     * Do the job.
    55015499     */
    5502     uint64_t uTicks = TMCpuTickGet(IEMCPU_TO_VMCPU(pIemCpu));
     5500    uint64_t uTicks = TMCpuTickGet(pVCpu);
    55035501    pCtx->rax = (uint32_t)uTicks;
    55045502    pCtx->rdx = uTicks >> 32;
    55055503#ifdef IEM_VERIFICATION_MODE_FULL
    5506     pIemCpu->fIgnoreRaxRdx = true;
     5504    pVCpu->iem.s.fIgnoreRaxRdx = true;
    55075505#endif
    55085506
    5509     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5507    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    55105508    return VINF_SUCCESS;
    55115509}
     
    55175515IEM_CIMPL_DEF_0(iemCImpl_rdmsr)
    55185516{
    5519     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5517    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    55205518
    55215519    /*
    55225520     * Check preconditions.
    55235521     */
    5524     if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fMsr)
    5525         return iemRaiseUndefinedOpcode(pIemCpu);
    5526     if (pIemCpu->uCpl != 0)
    5527         return iemRaiseGeneralProtectionFault0(pIemCpu);
     5522    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fMsr)
     5523        return iemRaiseUndefinedOpcode(pVCpu);
     5524    if (pVCpu->iem.s.uCpl != 0)
     5525        return iemRaiseGeneralProtectionFault0(pVCpu);
    55285526
    55295527    /*
     
    55315529     */
    55325530    RTUINT64U uValue;
    5533     VBOXSTRICTRC rcStrict = CPUMQueryGuestMsr(IEMCPU_TO_VMCPU(pIemCpu), pCtx->ecx, &uValue.u);
     5531    VBOXSTRICTRC rcStrict = CPUMQueryGuestMsr(pVCpu, pCtx->ecx, &uValue.u);
    55345532    if (rcStrict == VINF_SUCCESS)
    55355533    {
     
    55375535        pCtx->rdx = uValue.s.Hi;
    55385536
    5539         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5537        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    55405538        return VINF_SUCCESS;
    55415539    }
     
    55575555        Log(("IEM: rdmsr(%#x) -> #GP(0)\n", pCtx->ecx));
    55585556    AssertMsgReturn(rcStrict == VERR_CPUM_RAISE_GP_0, ("%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)), VERR_IPE_UNEXPECTED_STATUS);
    5559     return iemRaiseGeneralProtectionFault0(pIemCpu);
     5557    return iemRaiseGeneralProtectionFault0(pVCpu);
    55605558}
    55615559
     
    55665564IEM_CIMPL_DEF_0(iemCImpl_wrmsr)
    55675565{
    5568     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5566    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    55695567
    55705568    /*
    55715569     * Check preconditions.
    55725570     */
    5573     if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fMsr)
    5574         return iemRaiseUndefinedOpcode(pIemCpu);
    5575     if (pIemCpu->uCpl != 0)
    5576         return iemRaiseGeneralProtectionFault0(pIemCpu);
     5571    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fMsr)
     5572        return iemRaiseUndefinedOpcode(pVCpu);
     5573    if (pVCpu->iem.s.uCpl != 0)
     5574        return iemRaiseGeneralProtectionFault0(pVCpu);
    55775575
    55785576    /*
     
    55845582
    55855583    VBOXSTRICTRC rcStrict;
    5586     if (!IEM_VERIFICATION_ENABLED(pIemCpu))
    5587         rcStrict = CPUMSetGuestMsr(IEMCPU_TO_VMCPU(pIemCpu), pCtx->ecx, uValue.u);
     5584    if (!IEM_VERIFICATION_ENABLED(pVCpu))
     5585        rcStrict = CPUMSetGuestMsr(pVCpu, pCtx->ecx, uValue.u);
    55885586    else
    55895587    {
    55905588#ifdef IN_RING3
    55915589        CPUMCTX CtxTmp = *pCtx;
    5592         rcStrict = CPUMSetGuestMsr(IEMCPU_TO_VMCPU(pIemCpu), pCtx->ecx, uValue.u);
    5593         PCPUMCTX pCtx2 = CPUMQueryGuestCtxPtr(IEMCPU_TO_VMCPU(pIemCpu));
     5590        rcStrict = CPUMSetGuestMsr(pVCpu, pCtx->ecx, uValue.u);
     5591        PCPUMCTX pCtx2 = CPUMQueryGuestCtxPtr(pVCpu);
    55945592        *pCtx = *pCtx2;
    55955593        *pCtx2 = CtxTmp;
     
    56005598    if (rcStrict == VINF_SUCCESS)
    56015599    {
    5602         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5600        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    56035601        return VINF_SUCCESS;
    56045602    }
     
    56205618        Log(("IEM: wrmsr(%#x,%#x`%08x) -> #GP(0)\n", pCtx->ecx, uValue.s.Hi, uValue.s.Lo));
    56215619    AssertMsgReturn(rcStrict == VERR_CPUM_RAISE_GP_0, ("%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)), VERR_IPE_UNEXPECTED_STATUS);
    5622     return iemRaiseGeneralProtectionFault0(pIemCpu);
     5620    return iemRaiseGeneralProtectionFault0(pVCpu);
    56235621}
    56245622
     
    56325630IEM_CIMPL_DEF_2(iemCImpl_in, uint16_t, u16Port, uint8_t, cbReg)
    56335631{
    5634     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5632    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    56355633
    56365634    /*
    56375635     * CPL check
    56385636     */
    5639     VBOXSTRICTRC rcStrict = iemHlpCheckPortIOPermission(pIemCpu, pCtx, u16Port, cbReg);
     5637    VBOXSTRICTRC rcStrict = iemHlpCheckPortIOPermission(pVCpu, pCtx, u16Port, cbReg);
    56405638    if (rcStrict != VINF_SUCCESS)
    56415639        return rcStrict;
     
    56455643     */
    56465644    uint32_t u32Value;
    5647     if (!IEM_VERIFICATION_ENABLED(pIemCpu))
    5648         rcStrict = IOMIOPortRead(IEMCPU_TO_VM(pIemCpu), IEMCPU_TO_VMCPU(pIemCpu), u16Port, &u32Value, cbReg);
     5645    if (!IEM_VERIFICATION_ENABLED(pVCpu))
     5646        rcStrict = IOMIOPortRead(pVCpu->CTX_SUFF(pVM), pVCpu, u16Port, &u32Value, cbReg);
    56495647    else
    5650         rcStrict = iemVerifyFakeIOPortRead(pIemCpu, u16Port, &u32Value, cbReg);
     5648        rcStrict = iemVerifyFakeIOPortRead(pVCpu, u16Port, &u32Value, cbReg);
    56515649    if (IOM_SUCCESS(rcStrict))
    56525650    {
     
    56585656            default: AssertFailedReturn(VERR_IEM_IPE_3);
    56595657        }
    5660         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
    5661         pIemCpu->cPotentialExits++;
     5658        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
     5659        pVCpu->iem.s.cPotentialExits++;
    56625660        if (rcStrict != VINF_SUCCESS)
    5663             rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     5661            rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    56645662        Assert(rcStrict == VINF_SUCCESS); /* assumed below */
    56655663
     
    56715669                            && X86_DR7_ANY_RW_IO(uDr7)
    56725670                            && (pCtx->cr4 & X86_CR4_DE))
    5673                         || DBGFBpIsHwIoArmed(IEMCPU_TO_VM(pIemCpu))))
    5674         {
    5675             rcStrict = DBGFBpCheckIo(IEMCPU_TO_VM(pIemCpu), IEMCPU_TO_VMCPU(pIemCpu), pCtx, u16Port, cbReg);
     5671                        || DBGFBpIsHwIoArmed(pVCpu->CTX_SUFF(pVM))))
     5672        {
     5673            rcStrict = DBGFBpCheckIo(pVCpu->CTX_SUFF(pVM), pVCpu, pCtx, u16Port, cbReg);
    56765674            if (rcStrict == VINF_EM_RAW_GUEST_TRAP)
    5677                 rcStrict = iemRaiseDebugException(pIemCpu);
     5675                rcStrict = iemRaiseDebugException(pVCpu);
    56785676        }
    56795677    }
     
    56905688IEM_CIMPL_DEF_1(iemCImpl_in_eAX_DX, uint8_t, cbReg)
    56915689{
    5692     return IEM_CIMPL_CALL_2(iemCImpl_in, pIemCpu->CTX_SUFF(pCtx)->dx, cbReg);
     5690    return IEM_CIMPL_CALL_2(iemCImpl_in, pVCpu->iem.s.CTX_SUFF(pCtx)->dx, cbReg);
    56935691}
    56945692
     
    57025700IEM_CIMPL_DEF_2(iemCImpl_out, uint16_t, u16Port, uint8_t, cbReg)
    57035701{
    5704     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5702    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    57055703
    57065704    /*
    57075705     * CPL check
    57085706     */
    5709     VBOXSTRICTRC rcStrict = iemHlpCheckPortIOPermission(pIemCpu, pCtx, u16Port, cbReg);
     5707    VBOXSTRICTRC rcStrict = iemHlpCheckPortIOPermission(pVCpu, pCtx, u16Port, cbReg);
    57105708    if (rcStrict != VINF_SUCCESS)
    57115709        return rcStrict;
     
    57225720        default: AssertFailedReturn(VERR_IEM_IPE_4);
    57235721    }
    5724     if (!IEM_VERIFICATION_ENABLED(pIemCpu))
    5725         rcStrict = IOMIOPortWrite(IEMCPU_TO_VM(pIemCpu), IEMCPU_TO_VMCPU(pIemCpu), u16Port, u32Value, cbReg);
     5722    if (!IEM_VERIFICATION_ENABLED(pVCpu))
     5723        rcStrict = IOMIOPortWrite(pVCpu->CTX_SUFF(pVM), pVCpu, u16Port, u32Value, cbReg);
    57265724    else
    5727         rcStrict = iemVerifyFakeIOPortWrite(pIemCpu, u16Port, u32Value, cbReg);
     5725        rcStrict = iemVerifyFakeIOPortWrite(pVCpu, u16Port, u32Value, cbReg);
    57285726    if (IOM_SUCCESS(rcStrict))
    57295727    {
    5730         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
    5731         pIemCpu->cPotentialExits++;
     5728        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
     5729        pVCpu->iem.s.cPotentialExits++;
    57325730        if (rcStrict != VINF_SUCCESS)
    5733             rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     5731            rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    57345732        Assert(rcStrict == VINF_SUCCESS); /* assumed below */
    57355733
     
    57415739                            && X86_DR7_ANY_RW_IO(uDr7)
    57425740                            && (pCtx->cr4 & X86_CR4_DE))
    5743                         || DBGFBpIsHwIoArmed(IEMCPU_TO_VM(pIemCpu))))
    5744         {
    5745             rcStrict = DBGFBpCheckIo(IEMCPU_TO_VM(pIemCpu), IEMCPU_TO_VMCPU(pIemCpu), pCtx, u16Port, cbReg);
     5741                        || DBGFBpIsHwIoArmed(pVCpu->CTX_SUFF(pVM))))
     5742        {
     5743            rcStrict = DBGFBpCheckIo(pVCpu->CTX_SUFF(pVM), pVCpu, pCtx, u16Port, cbReg);
    57465744            if (rcStrict == VINF_EM_RAW_GUEST_TRAP)
    5747                 rcStrict = iemRaiseDebugException(pIemCpu);
     5745                rcStrict = iemRaiseDebugException(pVCpu);
    57485746        }
    57495747    }
     
    57595757IEM_CIMPL_DEF_1(iemCImpl_out_DX_eAX, uint8_t, cbReg)
    57605758{
    5761     return IEM_CIMPL_CALL_2(iemCImpl_out, pIemCpu->CTX_SUFF(pCtx)->dx, cbReg);
     5759    return IEM_CIMPL_CALL_2(iemCImpl_out, pVCpu->iem.s.CTX_SUFF(pCtx)->dx, cbReg);
    57625760}
    57635761
     
    57685766IEM_CIMPL_DEF_0(iemCImpl_cli)
    57695767{
    5770     PCPUMCTX        pCtx    = pIemCpu->CTX_SUFF(pCtx);
    5771     uint32_t        fEfl    = IEMMISC_GET_EFL(pIemCpu, pCtx);
     5768    PCPUMCTX        pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
     5769    uint32_t        fEfl    = IEMMISC_GET_EFL(pVCpu, pCtx);
    57725770    uint32_t const  fEflOld = fEfl;
    57735771    if (pCtx->cr0 & X86_CR0_PE)
     
    57765774        if (!(fEfl & X86_EFL_VM))
    57775775        {
    5778             if (pIemCpu->uCpl <= uIopl)
     5776            if (pVCpu->iem.s.uCpl <= uIopl)
    57795777                fEfl &= ~X86_EFL_IF;
    5780             else if (   pIemCpu->uCpl == 3
     5778            else if (   pVCpu->iem.s.uCpl == 3
    57815779                     && (pCtx->cr4 & X86_CR4_PVI) )
    57825780                fEfl &= ~X86_EFL_VIF;
    57835781            else
    5784                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5782                return iemRaiseGeneralProtectionFault0(pVCpu);
    57855783        }
    57865784        /* V8086 */
     
    57915789            fEfl &= ~X86_EFL_VIF;
    57925790        else
    5793             return iemRaiseGeneralProtectionFault0(pIemCpu);
     5791            return iemRaiseGeneralProtectionFault0(pVCpu);
    57945792    }
    57955793    /* real mode */
     
    57985796
    57995797    /* Commit. */
    5800     IEMMISC_SET_EFL(pIemCpu, pCtx, fEfl);
    5801     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5798    IEMMISC_SET_EFL(pVCpu, pCtx, fEfl);
     5799    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    58025800    Log2(("CLI: %#x -> %#x\n", fEflOld, fEfl)); NOREF(fEflOld);
    58035801    return VINF_SUCCESS;
     
    58105808IEM_CIMPL_DEF_0(iemCImpl_sti)
    58115809{
    5812     PCPUMCTX        pCtx    = pIemCpu->CTX_SUFF(pCtx);
    5813     uint32_t        fEfl    = IEMMISC_GET_EFL(pIemCpu, pCtx);
     5810    PCPUMCTX        pCtx    = pVCpu->iem.s.CTX_SUFF(pCtx);
     5811    uint32_t        fEfl    = IEMMISC_GET_EFL(pVCpu, pCtx);
    58145812    uint32_t const  fEflOld = fEfl;
    58155813
     
    58195817        if (!(fEfl & X86_EFL_VM))
    58205818        {
    5821             if (pIemCpu->uCpl <= uIopl)
     5819            if (pVCpu->iem.s.uCpl <= uIopl)
    58225820                fEfl |= X86_EFL_IF;
    5823             else if (   pIemCpu->uCpl == 3
     5821            else if (   pVCpu->iem.s.uCpl == 3
    58245822                     && (pCtx->cr4 & X86_CR4_PVI)
    58255823                     && !(fEfl & X86_EFL_VIP) )
    58265824                fEfl |= X86_EFL_VIF;
    58275825            else
    5828                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     5826                return iemRaiseGeneralProtectionFault0(pVCpu);
    58295827        }
    58305828        /* V8086 */
     
    58365834            fEfl |= X86_EFL_VIF;
    58375835        else
    5838             return iemRaiseGeneralProtectionFault0(pIemCpu);
     5836            return iemRaiseGeneralProtectionFault0(pVCpu);
    58395837    }
    58405838    /* real mode */
     
    58435841
    58445842    /* Commit. */
    5845     IEMMISC_SET_EFL(pIemCpu, pCtx, fEfl);
    5846     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
    5847     if ((!(fEflOld & X86_EFL_IF) && (fEfl & X86_EFL_IF)) || IEM_FULL_VERIFICATION_REM_ENABLED(pIemCpu))
    5848         EMSetInhibitInterruptsPC(IEMCPU_TO_VMCPU(pIemCpu), pCtx->rip);
     5843    IEMMISC_SET_EFL(pVCpu, pCtx, fEfl);
     5844    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
     5845    if ((!(fEflOld & X86_EFL_IF) && (fEfl & X86_EFL_IF)) || IEM_FULL_VERIFICATION_REM_ENABLED(pVCpu))
     5846        EMSetInhibitInterruptsPC(pVCpu, pCtx->rip);
    58495847    Log2(("STI: %#x -> %#x\n", fEflOld, fEfl));
    58505848    return VINF_SUCCESS;
     
    58575855IEM_CIMPL_DEF_0(iemCImpl_hlt)
    58585856{
    5859     if (pIemCpu->uCpl != 0)
    5860         return iemRaiseGeneralProtectionFault0(pIemCpu);
    5861     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5857    if (pVCpu->iem.s.uCpl != 0)
     5858        return iemRaiseGeneralProtectionFault0(pVCpu);
     5859    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    58625860    return VINF_EM_HALT;
    58635861}
     
    58725870     * Permission checks.
    58735871     */
    5874     if (pIemCpu->uCpl != 0)
     5872    if (pVCpu->iem.s.uCpl != 0)
    58755873    {
    58765874        Log2(("monitor: CPL != 0\n"));
    5877         return iemRaiseUndefinedOpcode(pIemCpu); /** @todo MSR[0xC0010015].MonMwaitUserEn if we care. */
    5878     }
    5879     if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fMonitorMWait)
     5875        return iemRaiseUndefinedOpcode(pVCpu); /** @todo MSR[0xC0010015].MonMwaitUserEn if we care. */
     5876    }
     5877    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fMonitorMWait)
    58805878    {
    58815879        Log2(("monitor: Not in CPUID\n"));
    5882         return iemRaiseUndefinedOpcode(pIemCpu);
     5880        return iemRaiseUndefinedOpcode(pVCpu);
    58835881    }
    58845882
     
    58865884     * Gather the operands and validate them.
    58875885     */
    5888     PCPUMCTX pCtx       = pIemCpu->CTX_SUFF(pCtx);
    5889     RTGCPTR  GCPtrMem   = pIemCpu->enmCpuMode == IEMMODE_64BIT ? pCtx->rax : pCtx->eax;
     5886    PCPUMCTX pCtx       = pVCpu->iem.s.CTX_SUFF(pCtx);
     5887    RTGCPTR  GCPtrMem   = pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT ? pCtx->rax : pCtx->eax;
    58905888    uint32_t uEcx       = pCtx->ecx;
    58915889    uint32_t uEdx       = pCtx->edx;
     
    58955893    {
    58965894        Log2(("monitor rax=%RX64, ecx=%RX32, edx=%RX32; ECX != 0 -> #GP(0)\n", GCPtrMem, uEcx, uEdx)); NOREF(uEdx);
    5897         return iemRaiseGeneralProtectionFault0(pIemCpu);
    5898     }
    5899 
    5900     VBOXSTRICTRC rcStrict = iemMemApplySegment(pIemCpu, IEM_ACCESS_TYPE_READ | IEM_ACCESS_WHAT_DATA, iEffSeg, 1, &GCPtrMem);
     5895        return iemRaiseGeneralProtectionFault0(pVCpu);
     5896    }
     5897
     5898    VBOXSTRICTRC rcStrict = iemMemApplySegment(pVCpu, IEM_ACCESS_TYPE_READ | IEM_ACCESS_WHAT_DATA, iEffSeg, 1, &GCPtrMem);
    59015899    if (rcStrict != VINF_SUCCESS)
    59025900        return rcStrict;
    59035901
    59045902    RTGCPHYS GCPhysMem;
    5905     rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, GCPtrMem, IEM_ACCESS_TYPE_READ | IEM_ACCESS_WHAT_DATA, &GCPhysMem);
     5903    rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, GCPtrMem, IEM_ACCESS_TYPE_READ | IEM_ACCESS_WHAT_DATA, &GCPhysMem);
    59065904    if (rcStrict != VINF_SUCCESS)
    59075905        return rcStrict;
     
    59105908     * Call EM to prepare the monitor/wait.
    59115909     */
    5912     rcStrict = EMMonitorWaitPrepare(IEMCPU_TO_VMCPU(pIemCpu), pCtx->rax, pCtx->rcx, pCtx->rdx, GCPhysMem);
     5910    rcStrict = EMMonitorWaitPrepare(pVCpu, pCtx->rax, pCtx->rcx, pCtx->rdx, GCPhysMem);
    59135911    Assert(rcStrict == VINF_SUCCESS);
    59145912
    5915     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5913    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    59165914    return rcStrict;
    59175915}
     
    59265924     * Permission checks.
    59275925     */
    5928     if (pIemCpu->uCpl != 0)
     5926    if (pVCpu->iem.s.uCpl != 0)
    59295927    {
    59305928        Log2(("mwait: CPL != 0\n"));
    59315929        /** @todo MSR[0xC0010015].MonMwaitUserEn if we care. (Remember to check
    59325930         *        EFLAGS.VM then.) */
    5933         return iemRaiseUndefinedOpcode(pIemCpu);
    5934     }
    5935     if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fMonitorMWait)
     5931        return iemRaiseUndefinedOpcode(pVCpu);
     5932    }
     5933    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fMonitorMWait)
    59365934    {
    59375935        Log2(("mwait: Not in CPUID\n"));
    5938         return iemRaiseUndefinedOpcode(pIemCpu);
     5936        return iemRaiseUndefinedOpcode(pVCpu);
    59395937    }
    59405938
     
    59425940     * Gather the operands and validate them.
    59435941     */
    5944     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5942    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    59455943    uint32_t uEax = pCtx->eax;
    59465944    uint32_t uEcx = pCtx->ecx;
     
    59515949        {
    59525950            Log2(("mwait eax=%RX32, ecx=%RX32; ECX > 1 -> #GP(0)\n", uEax, uEcx));
    5953             return iemRaiseGeneralProtectionFault0(pIemCpu);
     5951            return iemRaiseGeneralProtectionFault0(pVCpu);
    59545952        }
    59555953        uint32_t fMWaitFeatures = 0;
    59565954        uint32_t uIgnore = 0;
    5957         CPUMGetGuestCpuId(IEMCPU_TO_VMCPU(pIemCpu), 5, 0, &uIgnore, &uIgnore, &fMWaitFeatures, &uIgnore);
     5955        CPUMGetGuestCpuId(pVCpu, 5, 0, &uIgnore, &uIgnore, &fMWaitFeatures, &uIgnore);
    59585956        if (    (fMWaitFeatures & (X86_CPUID_MWAIT_ECX_EXT | X86_CPUID_MWAIT_ECX_BREAKIRQIF0))
    59595957            !=                    (X86_CPUID_MWAIT_ECX_EXT | X86_CPUID_MWAIT_ECX_BREAKIRQIF0))
    59605958        {
    59615959            Log2(("mwait eax=%RX32, ecx=%RX32; break-on-IRQ-IF=0 extension not enabled -> #GP(0)\n", uEax, uEcx));
    5962             return iemRaiseGeneralProtectionFault0(pIemCpu);
     5960            return iemRaiseGeneralProtectionFault0(pVCpu);
    59635961        }
    59645962    }
     
    59675965     * Call EM to prepare the monitor/wait.
    59685966     */
    5969     VBOXSTRICTRC rcStrict = EMMonitorWaitPerform(IEMCPU_TO_VMCPU(pIemCpu), uEax, uEcx);
    5970 
    5971     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5967    VBOXSTRICTRC rcStrict = EMMonitorWaitPerform(pVCpu, uEax, uEcx);
     5968
     5969    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    59725970    return rcStrict;
    59735971}
     
    59795977IEM_CIMPL_DEF_0(iemCImpl_swapgs)
    59805978{
    5981     Assert(pIemCpu->enmCpuMode == IEMMODE_64BIT); /* Caller checks this. */
     5979    Assert(pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT); /* Caller checks this. */
    59825980
    59835981    /*
    59845982     * Permission checks.
    59855983     */
    5986     if (pIemCpu->uCpl != 0)
     5984    if (pVCpu->iem.s.uCpl != 0)
    59875985    {
    59885986        Log2(("swapgs: CPL != 0\n"));
    5989         return iemRaiseUndefinedOpcode(pIemCpu);
     5987        return iemRaiseUndefinedOpcode(pVCpu);
    59905988    }
    59915989
     
    59935991     * Do the job.
    59945992     */
    5995     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     5993    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    59965994    uint64_t uOtherGsBase = pCtx->msrKERNELGSBASE;
    59975995    pCtx->msrKERNELGSBASE = pCtx->gs.u64Base;
    59985996    pCtx->gs.u64Base = uOtherGsBase;
    59995997
    6000     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     5998    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    60015999    return VINF_SUCCESS;
    60026000}
     
    60086006IEM_CIMPL_DEF_0(iemCImpl_cpuid)
    60096007{
    6010     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    6011 
    6012     CPUMGetGuestCpuId(IEMCPU_TO_VMCPU(pIemCpu), pCtx->eax, pCtx->ecx, &pCtx->eax, &pCtx->ebx, &pCtx->ecx, &pCtx->edx);
     6008    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
     6009
     6010    CPUMGetGuestCpuId(pVCpu, pCtx->eax, pCtx->ecx, &pCtx->eax, &pCtx->ebx, &pCtx->ecx, &pCtx->edx);
    60136011    pCtx->rax &= UINT32_C(0xffffffff);
    60146012    pCtx->rbx &= UINT32_C(0xffffffff);
     
    60166014    pCtx->rdx &= UINT32_C(0xffffffff);
    60176015
    6018     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6016    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    60196017    return VINF_SUCCESS;
    60206018}
     
    60286026IEM_CIMPL_DEF_1(iemCImpl_aad, uint8_t, bImm)
    60296027{
    6030     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     6028    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    60316029
    60326030    uint16_t const ax = pCtx->ax;
    60336031    uint8_t const  al = (uint8_t)ax + (uint8_t)(ax >> 8) * bImm;
    60346032    pCtx->ax = al;
    6035     iemHlpUpdateArithEFlagsU8(pIemCpu, al,
     6033    iemHlpUpdateArithEFlagsU8(pVCpu, al,
    60366034                              X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF,
    60376035                              X86_EFL_OF | X86_EFL_AF | X86_EFL_CF);
    60386036
    6039     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6037    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    60406038    return VINF_SUCCESS;
    60416039}
     
    60496047IEM_CIMPL_DEF_1(iemCImpl_aam, uint8_t, bImm)
    60506048{
    6051     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     6049    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    60526050    Assert(bImm != 0); /* #DE on 0 is handled in the decoder. */
    60536051
     
    60566054    uint8_t const  ah = (uint8_t)ax / bImm;
    60576055    pCtx->ax = (ah << 8) + al;
    6058     iemHlpUpdateArithEFlagsU8(pIemCpu, al,
     6056    iemHlpUpdateArithEFlagsU8(pVCpu, al,
    60596057                              X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF,
    60606058                              X86_EFL_OF | X86_EFL_AF | X86_EFL_CF);
    60616059
    6062     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6060    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    60636061    return VINF_SUCCESS;
    60646062}
     
    60706068IEM_CIMPL_DEF_0(iemCImpl_daa)
    60716069{
    6072     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     6070    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    60736071
    60746072    uint8_t const  al       = pCtx->al;
     
    60926090        pCtx->eflags.Bits.u1CF = 0;
    60936091
    6094     iemHlpUpdateArithEFlagsU8(pIemCpu, pCtx->al, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF);
    6095     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6092    iemHlpUpdateArithEFlagsU8(pVCpu, pCtx->al, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF);
     6093    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    60966094    return VINF_SUCCESS;
    60976095}
     
    61036101IEM_CIMPL_DEF_0(iemCImpl_das)
    61046102{
    6105     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     6103    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    61066104
    61076105    uint8_t const  uInputAL = pCtx->al;
     
    61286126    }
    61296127
    6130     iemHlpUpdateArithEFlagsU8(pIemCpu, pCtx->al, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF);
    6131     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6128    iemHlpUpdateArithEFlagsU8(pVCpu, pCtx->al, X86_EFL_SF | X86_EFL_ZF | X86_EFL_PF, X86_EFL_OF);
     6129    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    61326130    return VINF_SUCCESS;
    61336131}
     
    61826180IEM_CIMPL_DEF_0(iemCImpl_xgetbv)
    61836181{
    6184     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     6182    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    61856183    if (pCtx->cr4 & X86_CR4_OSXSAVE)
    61866184    {
     
    61946192            default:
    61956193                Log(("xgetbv ecx=%RX32 -> #GP(0)\n", uEcx));
    6196                 return iemRaiseGeneralProtectionFault0(pIemCpu);
     6194                return iemRaiseGeneralProtectionFault0(pVCpu);
    61976195
    61986196        }
     
    62006198        pCtx->rdx = RT_HI_U32(pCtx->aXcr[uEcx]);
    62016199
    6202         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6200        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    62036201        return VINF_SUCCESS;
    62046202    }
    62056203    Log(("xgetbv CR4.OSXSAVE=0 -> UD\n"));
    6206     return iemRaiseUndefinedOpcode(pIemCpu);
     6204    return iemRaiseUndefinedOpcode(pVCpu);
    62076205}
    62086206
     
    62136211IEM_CIMPL_DEF_0(iemCImpl_xsetbv)
    62146212{
    6215     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     6213    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    62166214    if (pCtx->cr4 & X86_CR4_OSXSAVE)
    62176215    {
    6218         if (pIemCpu->uCpl == 0)
     6216        if (pVCpu->iem.s.uCpl == 0)
    62196217        {
    62206218            uint32_t uEcx = pCtx->ecx;
     
    62246222                case 0:
    62256223                {
    6226                     int rc = CPUMSetGuestXcr0(IEMCPU_TO_VMCPU(pIemCpu), uNewValue);
     6224                    int rc = CPUMSetGuestXcr0(pVCpu, uNewValue);
    62276225                    if (rc == VINF_SUCCESS)
    62286226                        break;
    62296227                    Assert(rc == VERR_CPUM_RAISE_GP_0);
    62306228                    Log(("xsetbv ecx=%RX32 (newvalue=%RX64) -> #GP(0)\n", uEcx, uNewValue));
    6231                     return iemRaiseGeneralProtectionFault0(pIemCpu);
     6229                    return iemRaiseGeneralProtectionFault0(pVCpu);
    62326230                }
    62336231
     
    62356233                default:
    62366234                    Log(("xsetbv ecx=%RX32 (newvalue=%RX64) -> #GP(0)\n", uEcx, uNewValue));
    6237                     return iemRaiseGeneralProtectionFault0(pIemCpu);
     6235                    return iemRaiseGeneralProtectionFault0(pVCpu);
    62386236
    62396237            }
    62406238
    6241             iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6239            iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    62426240            return VINF_SUCCESS;
    62436241        }
    62446242
    6245         Log(("xsetbv cpl=%u -> GP(0)\n", pIemCpu->uCpl));
    6246         return iemRaiseGeneralProtectionFault0(pIemCpu);
     6243        Log(("xsetbv cpl=%u -> GP(0)\n", pVCpu->iem.s.uCpl));
     6244        return iemRaiseGeneralProtectionFault0(pVCpu);
    62476245    }
    62486246    Log(("xsetbv CR4.OSXSAVE=0 -> UD\n"));
    6249     return iemRaiseUndefinedOpcode(pIemCpu);
     6247    return iemRaiseUndefinedOpcode(pVCpu);
    62506248}
    62516249
     
    62606258IEM_CIMPL_DEF_1(iemCImpl_finit, bool, fCheckXcpts)
    62616259{
    6262     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     6260    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    62636261
    62646262    if (pCtx->cr0 & (X86_CR0_EM | X86_CR0_TS))
    6265         return iemRaiseDeviceNotAvailable(pIemCpu);
     6263        return iemRaiseDeviceNotAvailable(pVCpu);
    62666264
    62676265    NOREF(fCheckXcpts); /** @todo trigger pending exceptions:
    62686266        if (fCheckXcpts && TODO )
    6269         return iemRaiseMathFault(pIemCpu);
     6267        return iemRaiseMathFault(pVCpu);
    62706268     */
    62716269
     
    62826280    pXState->x87.FOP   = 0;
    62836281
    6284     iemHlpUsedFpu(pIemCpu);
    6285     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6282    iemHlpUsedFpu(pVCpu);
     6283    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    62866284    return VINF_SUCCESS;
    62876285}
     
    62976295IEM_CIMPL_DEF_3(iemCImpl_fxsave, uint8_t, iEffSeg, RTGCPTR, GCPtrEff, IEMMODE, enmEffOpSize)
    62986296{
    6299     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     6297    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    63006298
    63016299    /*
     
    63036301     */
    63046302    if (pCtx->cr0 & X86_CR0_EM)
    6305         return iemRaiseUndefinedOpcode(pIemCpu);
     6303        return iemRaiseUndefinedOpcode(pVCpu);
    63066304    if (pCtx->cr0 & (X86_CR0_TS | X86_CR0_EM))
    6307         return iemRaiseDeviceNotAvailable(pIemCpu);
     6305        return iemRaiseDeviceNotAvailable(pVCpu);
    63086306    if (GCPtrEff & 15)
    63096307    {
     
    63126310        if (   (pCtx->cr0 & X86_CR0_AM)
    63136311            && pCtx->eflags.Bits.u1AC
    6314             && pIemCpu->uCpl == 3)
    6315             return iemRaiseAlignmentCheckException(pIemCpu);
    6316         return iemRaiseGeneralProtectionFault0(pIemCpu);
     6312            && pVCpu->iem.s.uCpl == 3)
     6313            return iemRaiseAlignmentCheckException(pVCpu);
     6314        return iemRaiseGeneralProtectionFault0(pVCpu);
    63176315    }
    63186316
     
    63216319     */
    63226320    void *pvMem512;
    6323     VBOXSTRICTRC rcStrict = iemMemMap(pIemCpu, &pvMem512, 512, iEffSeg, GCPtrEff, IEM_ACCESS_DATA_W | IEM_ACCESS_PARTIAL_WRITE);
     6321    VBOXSTRICTRC rcStrict = iemMemMap(pVCpu, &pvMem512, 512, iEffSeg, GCPtrEff, IEM_ACCESS_DATA_W | IEM_ACCESS_PARTIAL_WRITE);
    63246322    if (rcStrict != VINF_SUCCESS)
    63256323        return rcStrict;
     
    63716369    /* XMM registers. */
    63726370    if (   !(pCtx->msrEFER & MSR_K6_EFER_FFXSR)
    6373         || pIemCpu->enmCpuMode != IEMMODE_64BIT
    6374         || pIemCpu->uCpl != 0)
     6371        || pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT
     6372        || pVCpu->iem.s.uCpl != 0)
    63756373    {
    63766374        uint32_t cXmmRegs = enmEffOpSize == IEMMODE_64BIT ? 16 : 8;
     
    63846382     * Commit the memory.
    63856383     */
    6386     rcStrict = iemMemCommitAndUnmap(pIemCpu, pvMem512, IEM_ACCESS_DATA_W | IEM_ACCESS_PARTIAL_WRITE);
     6384    rcStrict = iemMemCommitAndUnmap(pVCpu, pvMem512, IEM_ACCESS_DATA_W | IEM_ACCESS_PARTIAL_WRITE);
    63876385    if (rcStrict != VINF_SUCCESS)
    63886386        return rcStrict;
    63896387
    6390     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6388    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    63916389    return VINF_SUCCESS;
    63926390}
     
    64016399IEM_CIMPL_DEF_3(iemCImpl_fxrstor, uint8_t, iEffSeg, RTGCPTR, GCPtrEff, IEMMODE, enmEffOpSize)
    64026400{
    6403     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     6401    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    64046402
    64056403    /*
     
    64076405     */
    64086406    if (pCtx->cr0 & X86_CR0_EM)
    6409         return iemRaiseUndefinedOpcode(pIemCpu);
     6407        return iemRaiseUndefinedOpcode(pVCpu);
    64106408    if (pCtx->cr0 & (X86_CR0_TS | X86_CR0_EM))
    6411         return iemRaiseDeviceNotAvailable(pIemCpu);
     6409        return iemRaiseDeviceNotAvailable(pVCpu);
    64126410    if (GCPtrEff & 15)
    64136411    {
     
    64166414        if (   (pCtx->cr0 & X86_CR0_AM)
    64176415            && pCtx->eflags.Bits.u1AC
    6418             && pIemCpu->uCpl == 3)
    6419             return iemRaiseAlignmentCheckException(pIemCpu);
    6420         return iemRaiseGeneralProtectionFault0(pIemCpu);
     6416            && pVCpu->iem.s.uCpl == 3)
     6417            return iemRaiseAlignmentCheckException(pVCpu);
     6418        return iemRaiseGeneralProtectionFault0(pVCpu);
    64216419    }
    64226420
     
    64256423     */
    64266424    void *pvMem512;
    6427     VBOXSTRICTRC rcStrict = iemMemMap(pIemCpu, &pvMem512, 512, iEffSeg, GCPtrEff, IEM_ACCESS_DATA_R);
     6425    VBOXSTRICTRC rcStrict = iemMemMap(pVCpu, &pvMem512, 512, iEffSeg, GCPtrEff, IEM_ACCESS_DATA_R);
    64286426    if (rcStrict != VINF_SUCCESS)
    64296427        return rcStrict;
     
    64396437    {
    64406438        Log(("fxrstor: MXCSR=%#x (MXCSR_MASK=%#x) -> #GP(0)\n", fMXCSR, fMXCSR_MASK));
    6441         return iemRaiseGeneralProtectionFault0(pIemCpu);
     6439        return iemRaiseGeneralProtectionFault0(pVCpu);
    64426440    }
    64436441
     
    64646462
    64656463    /* FPU IP, CS, DP and DS. */
    6466     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     6464    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    64676465    {
    64686466        pDst->FPUIP  = pSrc->FPUIP;
     
    64856483    /* XMM registers. */
    64866484    if (   !(pCtx->msrEFER & MSR_K6_EFER_FFXSR)
    6487         || pIemCpu->enmCpuMode != IEMMODE_64BIT
    6488         || pIemCpu->uCpl != 0)
     6485        || pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT
     6486        || pVCpu->iem.s.uCpl != 0)
    64896487    {
    64906488        uint32_t cXmmRegs = enmEffOpSize == IEMMODE_64BIT ? 16 : 8;
     
    64966494     * Commit the memory.
    64976495     */
    6498     rcStrict = iemMemCommitAndUnmap(pIemCpu, pvMem512, IEM_ACCESS_DATA_R);
     6496    rcStrict = iemMemCommitAndUnmap(pVCpu, pvMem512, IEM_ACCESS_DATA_R);
    64996497    if (rcStrict != VINF_SUCCESS)
    65006498        return rcStrict;
    65016499
    6502     iemHlpUsedFpu(pIemCpu);
    6503     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6500    iemHlpUsedFpu(pVCpu);
     6501    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    65046502    return VINF_SUCCESS;
    65056503}
     
    65126510 * @param   pCtx                The CPU context.
    65136511 */
    6514 static void iemCImplCommonFpuStoreEnv(PIEMCPU pIemCpu, IEMMODE enmEffOpSize, RTPTRUNION uPtr, PCCPUMCTX pCtx)
     6512static void iemCImplCommonFpuStoreEnv(PVMCPU pVCpu, IEMMODE enmEffOpSize, RTPTRUNION uPtr, PCCPUMCTX pCtx)
    65156513{
    65166514    PCX86FXSTATE pSrcX87 = &pCtx->CTX_SUFF(pXState)->x87;
     
    65206518        uPtr.pu16[1] = pSrcX87->FSW;
    65216519        uPtr.pu16[2] = iemFpuCalcFullFtw(pSrcX87);
    6522         if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     6520        if (IEM_IS_REAL_OR_V86_MODE(pVCpu))
    65236521        {
    65246522            /** @todo Testcase: How does this work when the FPUIP/CS was saved in
     
    65496547        uPtr.pu16[2*2]   = iemFpuCalcFullFtw(pSrcX87);
    65506548        uPtr.pu16[2*2+1] = 0xffff;
    6551         if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     6549        if (IEM_IS_REAL_OR_V86_MODE(pVCpu))
    65526550        {
    65536551            uPtr.pu16[3*2]   = (uint16_t)pSrcX87->FPUIP;
     
    65756573 * @param   pCtx                The CPU context.
    65766574 */
    6577 static void iemCImplCommonFpuRestoreEnv(PIEMCPU pIemCpu, IEMMODE enmEffOpSize, RTCPTRUNION uPtr, PCPUMCTX pCtx)
     6575static void iemCImplCommonFpuRestoreEnv(PVMCPU pVCpu, IEMMODE enmEffOpSize, RTCPTRUNION uPtr, PCPUMCTX pCtx)
    65786576{
    65796577    PX86FXSTATE pDstX87 = &pCtx->CTX_SUFF(pXState)->x87;
     
    65836581        pDstX87->FSW = uPtr.pu16[1];
    65846582        pDstX87->FTW = uPtr.pu16[2];
    6585         if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     6583        if (IEM_IS_REAL_OR_V86_MODE(pVCpu))
    65866584        {
    65876585            pDstX87->FPUIP = uPtr.pu16[3] | ((uint32_t)(uPtr.pu16[4] & UINT16_C(0xf000)) << 4);
     
    66096607        pDstX87->FSW = uPtr.pu16[1*2];
    66106608        pDstX87->FTW = uPtr.pu16[2*2];
    6611         if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     6609        if (IEM_IS_REAL_OR_V86_MODE(pVCpu))
    66126610        {
    66136611            pDstX87->FPUIP = uPtr.pu16[3*2] | ((uPtr.pu32[4] & UINT32_C(0x0ffff000)) << 4);
     
    66496647IEM_CIMPL_DEF_3(iemCImpl_fnstenv, IEMMODE, enmEffOpSize, uint8_t, iEffSeg, RTGCPTR, GCPtrEffDst)
    66506648{
    6651     PCPUMCTX     pCtx = pIemCpu->CTX_SUFF(pCtx);
     6649    PCPUMCTX     pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    66526650    RTPTRUNION   uPtr;
    6653     VBOXSTRICTRC rcStrict = iemMemMap(pIemCpu, &uPtr.pv, enmEffOpSize == IEMMODE_16BIT ? 14 : 28,
     6651    VBOXSTRICTRC rcStrict = iemMemMap(pVCpu, &uPtr.pv, enmEffOpSize == IEMMODE_16BIT ? 14 : 28,
    66546652                                      iEffSeg, GCPtrEffDst, IEM_ACCESS_DATA_W | IEM_ACCESS_PARTIAL_WRITE);
    66556653    if (rcStrict != VINF_SUCCESS)
    66566654        return rcStrict;
    66576655
    6658     iemCImplCommonFpuStoreEnv(pIemCpu, enmEffOpSize, uPtr, pCtx);
    6659 
    6660     rcStrict = iemMemCommitAndUnmap(pIemCpu, uPtr.pv, IEM_ACCESS_DATA_W | IEM_ACCESS_PARTIAL_WRITE);
     6656    iemCImplCommonFpuStoreEnv(pVCpu, enmEffOpSize, uPtr, pCtx);
     6657
     6658    rcStrict = iemMemCommitAndUnmap(pVCpu, uPtr.pv, IEM_ACCESS_DATA_W | IEM_ACCESS_PARTIAL_WRITE);
    66616659    if (rcStrict != VINF_SUCCESS)
    66626660        return rcStrict;
    66636661
    66646662    /* Note: C0, C1, C2 and C3 are documented as undefined, we leave them untouched! */
    6665     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6663    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    66666664    return VINF_SUCCESS;
    66676665}
     
    66766674IEM_CIMPL_DEF_3(iemCImpl_fnsave, IEMMODE, enmEffOpSize, uint8_t, iEffSeg, RTGCPTR, GCPtrEffDst)
    66776675{
    6678     PCPUMCTX     pCtx = pIemCpu->CTX_SUFF(pCtx);
     6676    PCPUMCTX     pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    66796677    RTPTRUNION   uPtr;
    6680     VBOXSTRICTRC rcStrict = iemMemMap(pIemCpu, &uPtr.pv, enmEffOpSize == IEMMODE_16BIT ? 94 : 108,
     6678    VBOXSTRICTRC rcStrict = iemMemMap(pVCpu, &uPtr.pv, enmEffOpSize == IEMMODE_16BIT ? 94 : 108,
    66816679                                      iEffSeg, GCPtrEffDst, IEM_ACCESS_DATA_W | IEM_ACCESS_PARTIAL_WRITE);
    66826680    if (rcStrict != VINF_SUCCESS)
     
    66846682
    66856683    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6686     iemCImplCommonFpuStoreEnv(pIemCpu, enmEffOpSize, uPtr, pCtx);
     6684    iemCImplCommonFpuStoreEnv(pVCpu, enmEffOpSize, uPtr, pCtx);
    66876685    PRTFLOAT80U paRegs = (PRTFLOAT80U)(uPtr.pu8 + (enmEffOpSize == IEMMODE_16BIT ? 14 : 28));
    66886686    for (uint32_t i = 0; i < RT_ELEMENTS(pFpuCtx->aRegs); i++)
     
    66936691    }
    66946692
    6695     rcStrict = iemMemCommitAndUnmap(pIemCpu, uPtr.pv, IEM_ACCESS_DATA_W | IEM_ACCESS_PARTIAL_WRITE);
     6693    rcStrict = iemMemCommitAndUnmap(pVCpu, uPtr.pv, IEM_ACCESS_DATA_W | IEM_ACCESS_PARTIAL_WRITE);
    66966694    if (rcStrict != VINF_SUCCESS)
    66976695        return rcStrict;
     
    67116709    pFpuCtx->FOP   = 0;
    67126710
    6713     iemHlpUsedFpu(pIemCpu);
    6714     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6711    iemHlpUsedFpu(pVCpu);
     6712    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    67156713    return VINF_SUCCESS;
    67166714}
     
    67276725IEM_CIMPL_DEF_3(iemCImpl_fldenv, IEMMODE, enmEffOpSize, uint8_t, iEffSeg, RTGCPTR, GCPtrEffSrc)
    67286726{
    6729     PCPUMCTX     pCtx = pIemCpu->CTX_SUFF(pCtx);
     6727    PCPUMCTX     pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    67306728    RTCPTRUNION  uPtr;
    6731     VBOXSTRICTRC rcStrict = iemMemMap(pIemCpu, (void **)&uPtr.pv, enmEffOpSize == IEMMODE_16BIT ? 14 : 28,
     6729    VBOXSTRICTRC rcStrict = iemMemMap(pVCpu, (void **)&uPtr.pv, enmEffOpSize == IEMMODE_16BIT ? 14 : 28,
    67326730                                      iEffSeg, GCPtrEffSrc, IEM_ACCESS_DATA_R);
    67336731    if (rcStrict != VINF_SUCCESS)
    67346732        return rcStrict;
    67356733
    6736     iemCImplCommonFpuRestoreEnv(pIemCpu, enmEffOpSize, uPtr, pCtx);
    6737 
    6738     rcStrict = iemMemCommitAndUnmap(pIemCpu, (void *)uPtr.pv, IEM_ACCESS_DATA_R);
     6734    iemCImplCommonFpuRestoreEnv(pVCpu, enmEffOpSize, uPtr, pCtx);
     6735
     6736    rcStrict = iemMemCommitAndUnmap(pVCpu, (void *)uPtr.pv, IEM_ACCESS_DATA_R);
    67396737    if (rcStrict != VINF_SUCCESS)
    67406738        return rcStrict;
    67416739
    6742     iemHlpUsedFpu(pIemCpu);
    6743     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6740    iemHlpUsedFpu(pVCpu);
     6741    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    67446742    return VINF_SUCCESS;
    67456743}
     
    67546752IEM_CIMPL_DEF_3(iemCImpl_frstor, IEMMODE, enmEffOpSize, uint8_t, iEffSeg, RTGCPTR, GCPtrEffSrc)
    67556753{
    6756     PCPUMCTX     pCtx = pIemCpu->CTX_SUFF(pCtx);
     6754    PCPUMCTX     pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    67576755    RTCPTRUNION  uPtr;
    6758     VBOXSTRICTRC rcStrict = iemMemMap(pIemCpu, (void **)&uPtr.pv, enmEffOpSize == IEMMODE_16BIT ? 94 : 108,
     6756    VBOXSTRICTRC rcStrict = iemMemMap(pVCpu, (void **)&uPtr.pv, enmEffOpSize == IEMMODE_16BIT ? 94 : 108,
    67596757                                      iEffSeg, GCPtrEffSrc, IEM_ACCESS_DATA_R);
    67606758    if (rcStrict != VINF_SUCCESS)
     
    67626760
    67636761    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    6764     iemCImplCommonFpuRestoreEnv(pIemCpu, enmEffOpSize, uPtr, pCtx);
     6762    iemCImplCommonFpuRestoreEnv(pVCpu, enmEffOpSize, uPtr, pCtx);
    67656763    PCRTFLOAT80U paRegs = (PCRTFLOAT80U)(uPtr.pu8 + (enmEffOpSize == IEMMODE_16BIT ? 14 : 28));
    67666764    for (uint32_t i = 0; i < RT_ELEMENTS(pFpuCtx->aRegs); i++)
     
    67726770    }
    67736771
    6774     rcStrict = iemMemCommitAndUnmap(pIemCpu, (void *)uPtr.pv, IEM_ACCESS_DATA_R);
     6772    rcStrict = iemMemCommitAndUnmap(pVCpu, (void *)uPtr.pv, IEM_ACCESS_DATA_R);
    67756773    if (rcStrict != VINF_SUCCESS)
    67766774        return rcStrict;
    67776775
    6778     iemHlpUsedFpu(pIemCpu);
    6779     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6776    iemHlpUsedFpu(pVCpu);
     6777    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    67806778    return VINF_SUCCESS;
    67816779}
     
    67896787IEM_CIMPL_DEF_1(iemCImpl_fldcw, uint16_t, u16Fcw)
    67906788{
    6791     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     6789    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    67926790
    67936791    /** @todo Testcase: Check what happens when trying to load X86_FCW_PC_RSVD. */
     
    68016799
    68026800    /* Note: C0, C1, C2 and C3 are documented as undefined, we leave them untouched! */
    6803     iemHlpUsedFpu(pIemCpu);
    6804     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6801    iemHlpUsedFpu(pVCpu);
     6802    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    68056803    return VINF_SUCCESS;
    68066804}
     
    68156813IEM_CIMPL_DEF_1(iemCImpl_fxch_underflow, uint8_t, iStReg)
    68166814{
    6817     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     6815    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    68186816
    68196817    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
     
    68506848    }
    68516849
    6852     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
    6853     iemHlpUsedFpu(pIemCpu);
    6854     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6850    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
     6851    iemHlpUsedFpu(pVCpu);
     6852    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    68556853    return VINF_SUCCESS;
    68566854}
     
    68646862IEM_CIMPL_DEF_3(iemCImpl_fcomi_fucomi, uint8_t, iStReg, PFNIEMAIMPLFPUR80EFL, pfnAImpl, bool, fPop)
    68656863{
    6866     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     6864    PCPUMCTX pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    68676865    Assert(iStReg < 8);
    68686866
     
    68716869     */
    68726870    if (pCtx->cr0 & (X86_CR0_EM | X86_CR0_TS))
    6873         return iemRaiseDeviceNotAvailable(pIemCpu);
     6871        return iemRaiseDeviceNotAvailable(pVCpu);
    68746872
    68756873    PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
    68766874    uint16_t u16Fsw = pFpuCtx->FSW;
    68776875    if (u16Fsw & X86_FSW_ES)
    6878         return iemRaiseMathFault(pIemCpu);
     6876        return iemRaiseMathFault(pVCpu);
    68796877
    68806878    /*
     
    69236921    }
    69246922
    6925     iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx, pFpuCtx);
    6926     iemHlpUsedFpu(pIemCpu);
    6927     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     6923    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pCtx, pFpuCtx);
     6924    iemHlpUsedFpu(pVCpu);
     6925    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    69286926    return VINF_SUCCESS;
    69296927}
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h

    r60907 r62015  
    4848# define ADDR_rCX   rcx
    4949# define ADDR2_TYPE uint64_t
    50 # define IS_64_BIT_CODE(a_pIemCpu) (true)
     50# define IS_64_BIT_CODE(a_pVCpu)    (true)
    5151#else
    5252# error "Bad ADDR_SIZE."
     
    5555
    5656#if ADDR_SIZE == 64 || OP_SIZE == 64
    57 # define IS_64_BIT_CODE(a_pIemCpu)  (true)
     57# define IS_64_BIT_CODE(a_pVCpu)    (true)
    5858#elif ADDR_SIZE == 32
    59 # define IS_64_BIT_CODE(a_pIemCpu)  ((a_pIemCpu)->enmCpuMode == IEMMODE_64BIT)
     59# define IS_64_BIT_CODE(a_pVCpu)    ((a_pVCpu)->iem.s.enmCpuMode == IEMMODE_64BIT)
    6060#else
    61 # define IS_64_BIT_CODE(a_pIemCpu)  (false)
     61# define IS_64_BIT_CODE(a_pVCpu)    (false)
    6262#endif
    6363
     
    6969 */
    7070#ifdef IN_RC
    71 # define IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_pIemCpu, a_fEflags) \
     71# define IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_fEflags) \
    7272    do { \
    7373        if (RT_LIKELY(   (   !VMCPU_FF_IS_PENDING(a_pVCpu, (a_fEflags) & X86_EFL_IF ? VMCPU_FF_YIELD_REPSTR_MASK \
    7474                                                                                   : VMCPU_FF_YIELD_REPSTR_NOINT_MASK) \
    7575                          && !VM_FF_IS_PENDING(a_pVM, VM_FF_YIELD_REPSTR_MASK) ) \
    76                       || IEM_VERIFICATION_ENABLED(a_pIemCpu) )) \
     76                      || IEM_VERIFICATION_ENABLED(a_pVCpu) )) \
    7777        { \
    7878            RTCCUINTREG fSavedFlags = ASMGetFlags(); \
     
    9292    } while (0)
    9393#else
    94 # define IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_pIemCpu, a_fEflags) \
     94# define IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_fEflags) \
    9595    do { \
    9696        if (RT_LIKELY(   (   !VMCPU_FF_IS_PENDING(a_pVCpu, (a_fEflags) & X86_EFL_IF ? VMCPU_FF_YIELD_REPSTR_MASK \
    9797                                                                                   : VMCPU_FF_YIELD_REPSTR_NOINT_MASK) \
    9898                          && !VM_FF_IS_PENDING(a_pVM, VM_FF_YIELD_REPSTR_MASK) ) \
    99                       || IEM_VERIFICATION_ENABLED(a_pIemCpu) )) \
     99                      || IEM_VERIFICATION_ENABLED(a_pVCpu) )) \
    100100        { /* probable */ } \
    101101        else  \
     
    113113 * instructions. Use IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN for
    114114 * ones that are typically cheap. */
    115 #define IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_pIemCpu, a_fExitExpr) \
     115#define IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_fExitExpr) \
    116116    do { \
    117117        if (RT_LIKELY(   (   !VMCPU_FF_IS_PENDING(a_pVCpu, VMCPU_FF_HIGH_PRIORITY_POST_REPSTR_MASK) \
    118118                          && !VM_FF_IS_PENDING(a_pVM,         VM_FF_HIGH_PRIORITY_POST_REPSTR_MASK)) \
    119119                      || (a_fExitExpr) \
    120                       || IEM_VERIFICATION_ENABLED(a_pIemCpu) )) \
     120                      || IEM_VERIFICATION_ENABLED(a_pVCpu) )) \
    121121        { /* very likely */ } \
    122122        else \
     
    135135 * (status code is hidden in IEMCPU::rcPassUp by IEM memory commit code).
    136136 */
    137 #define IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_pIemCpu, a_fExitExpr) \
     137#define IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_fExitExpr) \
    138138    do { \
    139139        if (RT_LIKELY(   !VMCPU_FF_IS_PENDING(a_pVCpu, VMCPU_FF_HIGH_PRIORITY_POST_REPSTR_MASK) \
    140140                      || (a_fExitExpr) \
    141                       || IEM_VERIFICATION_ENABLED(a_pIemCpu) )) \
     141                      || IEM_VERIFICATION_ENABLED(a_pVCpu) )) \
    142142        { /* very likely */ } \
    143143        else \
     
    155155IEM_CIMPL_DEF_1(RT_CONCAT4(iemCImpl_repe_cmps_op,OP_SIZE,_addr,ADDR_SIZE), uint8_t, iEffSeg)
    156156{
    157     PVM         pVM   = IEMCPU_TO_VM(pIemCpu);
    158     PVMCPU      pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
    159     PCPUMCTX    pCtx  = pIemCpu->CTX_SUFF(pCtx);
     157    PVM         pVM   = pVCpu->CTX_SUFF(pVM);
     158    PCPUMCTX    pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
    160159
    161160    /*
     
    165164    if (uCounterReg == 0)
    166165    {
    167         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     166        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    168167        return VINF_SUCCESS;
    169168    }
    170169
    171     PCCPUMSELREGHID pSrc1Hid     = iemSRegGetHid(pIemCpu, iEffSeg);
     170    PCCPUMSELREGHID pSrc1Hid     = iemSRegGetHid(pVCpu, iEffSeg);
    172171    uint64_t        uSrc1Base;
    173     VBOXSTRICTRC    rcStrict     = iemMemSegCheckReadAccessEx(pIemCpu, pSrc1Hid, iEffSeg, &uSrc1Base);
     172    VBOXSTRICTRC    rcStrict     = iemMemSegCheckReadAccessEx(pVCpu, pSrc1Hid, iEffSeg, &uSrc1Base);
    174173    if (rcStrict != VINF_SUCCESS)
    175174        return rcStrict;
    176175
    177176    uint64_t        uSrc2Base;
    178     rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uSrc2Base);
     177    rcStrict = iemMemSegCheckReadAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uSrc2Base);
    179178    if (rcStrict != VINF_SUCCESS)
    180179        return rcStrict;
     
    203202        if (   cLeftPage > 0 /* can be null if unaligned, do one fallback round. */
    204203            && cbIncr > 0    /** @todo Optimize reverse direction string ops. */
    205             && (   IS_64_BIT_CODE(pIemCpu)
     204            && (   IS_64_BIT_CODE(pVCpu)
    206205                || (   uSrc1AddrReg < pSrc1Hid->u32Limit
    207206                    && uSrc1AddrReg + (cLeftPage * (OP_SIZE / 8)) <= pSrc1Hid->u32Limit
     
    212211        {
    213212            RTGCPHYS GCPhysSrc1Mem;
    214             rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtSrc1Addr, IEM_ACCESS_DATA_R, &GCPhysSrc1Mem);
     213            rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, uVirtSrc1Addr, IEM_ACCESS_DATA_R, &GCPhysSrc1Mem);
    215214            if (rcStrict != VINF_SUCCESS)
    216215                return rcStrict;
    217216
    218217            RTGCPHYS GCPhysSrc2Mem;
    219             rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtSrc2Addr, IEM_ACCESS_DATA_R, &GCPhysSrc2Mem);
     218            rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, uVirtSrc2Addr, IEM_ACCESS_DATA_R, &GCPhysSrc2Mem);
    220219            if (rcStrict != VINF_SUCCESS)
    221220                return rcStrict;
     
    227226            PGMPAGEMAPLOCK PgLockSrc2Mem;
    228227            OP_TYPE const *puSrc2Mem;
    229             rcStrict = iemMemPageMap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, (void **)&puSrc2Mem, &PgLockSrc2Mem);
     228            rcStrict = iemMemPageMap(pVCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, (void **)&puSrc2Mem, &PgLockSrc2Mem);
    230229            if (rcStrict == VINF_SUCCESS)
    231230            {
    232231                PGMPAGEMAPLOCK PgLockSrc1Mem;
    233232                OP_TYPE const *puSrc1Mem;
    234                 rcStrict = iemMemPageMap(pIemCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, (void **)&puSrc1Mem, &PgLockSrc1Mem);
     233                rcStrict = iemMemPageMap(pVCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, (void **)&puSrc1Mem, &PgLockSrc1Mem);
    235234                if (rcStrict == VINF_SUCCESS)
    236235                {
     
    265264                    pCtx->eflags.u = uEFlags;
    266265
    267                     iemMemPageUnmap(pIemCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, puSrc1Mem, &PgLockSrc1Mem);
    268                     iemMemPageUnmap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem, &PgLockSrc2Mem);
     266                    iemMemPageUnmap(pVCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, puSrc1Mem, &PgLockSrc1Mem);
     267                    iemMemPageUnmap(pVCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem, &PgLockSrc2Mem);
    269268                    if (   uCounterReg == 0
    270269                        || !(uEFlags & X86_EFL_ZF))
    271270                        break;
    272                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
     271                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
    273272                    continue;
    274273                }
    275                 iemMemPageUnmap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem, &PgLockSrc2Mem);
     274                iemMemPageUnmap(pVCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem, &PgLockSrc2Mem);
    276275            }
    277276        }
     
    285284        {
    286285            OP_TYPE uValue1;
    287             rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pIemCpu, &uValue1, iEffSeg, uSrc1AddrReg);
     286            rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pVCpu, &uValue1, iEffSeg, uSrc1AddrReg);
    288287            if (rcStrict != VINF_SUCCESS)
    289288                return rcStrict;
    290289            OP_TYPE uValue2;
    291             rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pIemCpu, &uValue2, X86_SREG_ES, uSrc2AddrReg);
     290            rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pVCpu, &uValue2, X86_SREG_ES, uSrc2AddrReg);
    292291            if (rcStrict != VINF_SUCCESS)
    293292                return rcStrict;
     
    299298            pCtx->eflags.u = uEFlags;
    300299            cLeftPage--;
    301             IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu,
    302                                                                     uCounterReg == 0 || !(uEFlags & X86_EFL_ZF));
     300            IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0 || !(uEFlags & X86_EFL_ZF));
    303301        } while (   (int32_t)cLeftPage > 0
    304302                 && (uEFlags & X86_EFL_ZF));
     
    310308            || !(uEFlags & X86_EFL_ZF))
    311309            break;
    312         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
     310        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
    313311    }
    314312
     
    316314     * Done.
    317315     */
    318     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     316    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    319317    return VINF_SUCCESS;
    320318}
     
    326324IEM_CIMPL_DEF_1(RT_CONCAT4(iemCImpl_repne_cmps_op,OP_SIZE,_addr,ADDR_SIZE), uint8_t, iEffSeg)
    327325{
    328     PVM         pVM   = IEMCPU_TO_VM(pIemCpu);
    329     PVMCPU      pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
    330     PCPUMCTX    pCtx  = pIemCpu->CTX_SUFF(pCtx);
     326    PVM         pVM   = pVCpu->CTX_SUFF(pVM);
     327    PCPUMCTX    pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
    331328
    332329    /*
     
    336333    if (uCounterReg == 0)
    337334    {
    338         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     335        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    339336        return VINF_SUCCESS;
    340337    }
    341338
    342     PCCPUMSELREGHID pSrc1Hid = iemSRegGetHid(pIemCpu, iEffSeg);
     339    PCCPUMSELREGHID pSrc1Hid = iemSRegGetHid(pVCpu, iEffSeg);
    343340    uint64_t        uSrc1Base;
    344     VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, pSrc1Hid, iEffSeg, &uSrc1Base);
     341    VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pVCpu, pSrc1Hid, iEffSeg, &uSrc1Base);
    345342    if (rcStrict != VINF_SUCCESS)
    346343        return rcStrict;
    347344
    348345    uint64_t        uSrc2Base;
    349     rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uSrc2Base);
     346    rcStrict = iemMemSegCheckReadAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uSrc2Base);
    350347    if (rcStrict != VINF_SUCCESS)
    351348        return rcStrict;
     
    374371        if (   cLeftPage > 0 /* can be null if unaligned, do one fallback round. */
    375372            && cbIncr > 0    /** @todo Optimize reverse direction string ops. */
    376             && (   IS_64_BIT_CODE(pIemCpu)
     373            && (   IS_64_BIT_CODE(pVCpu)
    377374                || (   uSrc1AddrReg < pSrc1Hid->u32Limit
    378375                    && uSrc1AddrReg + (cLeftPage * (OP_SIZE / 8)) <= pSrc1Hid->u32Limit
     
    383380        {
    384381            RTGCPHYS GCPhysSrc1Mem;
    385             rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtSrc1Addr, IEM_ACCESS_DATA_R, &GCPhysSrc1Mem);
     382            rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, uVirtSrc1Addr, IEM_ACCESS_DATA_R, &GCPhysSrc1Mem);
    386383            if (rcStrict != VINF_SUCCESS)
    387384                return rcStrict;
    388385
    389386            RTGCPHYS GCPhysSrc2Mem;
    390             rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtSrc2Addr, IEM_ACCESS_DATA_R, &GCPhysSrc2Mem);
     387            rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, uVirtSrc2Addr, IEM_ACCESS_DATA_R, &GCPhysSrc2Mem);
    391388            if (rcStrict != VINF_SUCCESS)
    392389                return rcStrict;
     
    398395            OP_TYPE const *puSrc2Mem;
    399396            PGMPAGEMAPLOCK PgLockSrc2Mem;
    400             rcStrict = iemMemPageMap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, (void **)&puSrc2Mem, &PgLockSrc2Mem);
     397            rcStrict = iemMemPageMap(pVCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, (void **)&puSrc2Mem, &PgLockSrc2Mem);
    401398            if (rcStrict == VINF_SUCCESS)
    402399            {
    403400                OP_TYPE const *puSrc1Mem;
    404401                PGMPAGEMAPLOCK PgLockSrc1Mem;
    405                 rcStrict = iemMemPageMap(pIemCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, (void **)&puSrc1Mem, &PgLockSrc1Mem);
     402                rcStrict = iemMemPageMap(pVCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, (void **)&puSrc1Mem, &PgLockSrc1Mem);
    406403                if (rcStrict == VINF_SUCCESS)
    407404                {
     
    436433                    pCtx->eflags.u = uEFlags;
    437434
    438                     iemMemPageUnmap(pIemCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, puSrc1Mem, &PgLockSrc1Mem);
    439                     iemMemPageUnmap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem, &PgLockSrc2Mem);
     435                    iemMemPageUnmap(pVCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, puSrc1Mem, &PgLockSrc1Mem);
     436                    iemMemPageUnmap(pVCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem, &PgLockSrc2Mem);
    440437                    if (   uCounterReg == 0
    441438                        || (uEFlags & X86_EFL_ZF))
    442439                        break;
    443                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
     440                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
    444441                    continue;
    445442                }
    446                 iemMemPageUnmap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem, &PgLockSrc2Mem);
     443                iemMemPageUnmap(pVCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem, &PgLockSrc2Mem);
    447444            }
    448445        }
     
    456453        {
    457454            OP_TYPE uValue1;
    458             rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pIemCpu, &uValue1, iEffSeg, uSrc1AddrReg);
     455            rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pVCpu, &uValue1, iEffSeg, uSrc1AddrReg);
    459456            if (rcStrict != VINF_SUCCESS)
    460457                return rcStrict;
    461458            OP_TYPE uValue2;
    462             rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pIemCpu, &uValue2, X86_SREG_ES, uSrc2AddrReg);
     459            rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pVCpu, &uValue2, X86_SREG_ES, uSrc2AddrReg);
    463460            if (rcStrict != VINF_SUCCESS)
    464461                return rcStrict;
     
    470467            pCtx->eflags.u = uEFlags;
    471468            cLeftPage--;
    472             IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu,
    473                                                                     uCounterReg == 0 || (uEFlags & X86_EFL_ZF));
     469            IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0 || (uEFlags & X86_EFL_ZF));
    474470        } while (   (int32_t)cLeftPage > 0
    475471                 && !(uEFlags & X86_EFL_ZF));
     
    481477            || (uEFlags & X86_EFL_ZF))
    482478            break;
    483         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
     479        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
    484480    }
    485481
     
    487483     * Done.
    488484     */
    489     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     485    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    490486    return VINF_SUCCESS;
    491487}
     
    497493IEM_CIMPL_DEF_0(RT_CONCAT4(iemCImpl_repe_scas_,OP_rAX,_m,ADDR_SIZE))
    498494{
    499     PVM         pVM   = IEMCPU_TO_VM(pIemCpu);
    500     PVMCPU      pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
    501     PCPUMCTX    pCtx  = pIemCpu->CTX_SUFF(pCtx);
     495    PVM         pVM   = pVCpu->CTX_SUFF(pVM);
     496    PCPUMCTX    pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
    502497
    503498    /*
     
    507502    if (uCounterReg == 0)
    508503    {
    509         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     504        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    510505        return VINF_SUCCESS;
    511506    }
    512507
    513508    uint64_t        uBaseAddr;
    514     VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
     509    VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
    515510    if (rcStrict != VINF_SUCCESS)
    516511        return rcStrict;
     
    535530        if (   cLeftPage > 0 /* can be null if unaligned, do one fallback round. */
    536531            && cbIncr > 0    /** @todo Implement reverse direction string ops. */
    537             && (   IS_64_BIT_CODE(pIemCpu)
     532            && (   IS_64_BIT_CODE(pVCpu)
    538533                || (   uAddrReg < pCtx->es.u32Limit
    539534                    && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pCtx->es.u32Limit)
     
    542537        {
    543538            RTGCPHYS GCPhysMem;
    544             rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtAddr, IEM_ACCESS_DATA_R, &GCPhysMem);
     539            rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, uVirtAddr, IEM_ACCESS_DATA_R, &GCPhysMem);
    545540            if (rcStrict != VINF_SUCCESS)
    546541                return rcStrict;
     
    552547            PGMPAGEMAPLOCK PgLockMem;
    553548            OP_TYPE const *puMem;
    554             rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem, &PgLockMem);
     549            rcStrict = iemMemPageMap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem, &PgLockMem);
    555550            if (rcStrict == VINF_SUCCESS)
    556551            {
     
    571566                pCtx->eflags.u = uEFlags;
    572567                Assert(!(uEFlags & X86_EFL_ZF) == fQuit);
    573                 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
     568                iemMemPageUnmap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
    574569                if (   fQuit
    575570                    || uCounterReg == 0)
     
    580575                if (!(uVirtAddr & (OP_SIZE - 1)))
    581576                {
    582                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
     577                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
    583578                    continue;
    584579                }
     
    595590        {
    596591            OP_TYPE uTmpValue;
    597             rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pIemCpu, &uTmpValue, X86_SREG_ES, uAddrReg);
     592            rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pVCpu, &uTmpValue, X86_SREG_ES, uAddrReg);
    598593            if (rcStrict != VINF_SUCCESS)
    599594                return rcStrict;
     
    604599            pCtx->eflags.u = uEFlags;
    605600            cLeftPage--;
    606             IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu,
    607                                                                     uCounterReg == 0 || !(uEFlags & X86_EFL_ZF));
     601            IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0 || !(uEFlags & X86_EFL_ZF));
    608602        } while (   (int32_t)cLeftPage > 0
    609603                 && (uEFlags & X86_EFL_ZF));
     
    615609            || !(uEFlags & X86_EFL_ZF))
    616610            break;
    617         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
     611        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
    618612    }
    619613
     
    621615     * Done.
    622616     */
    623     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     617    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    624618    return VINF_SUCCESS;
    625619}
     
    631625IEM_CIMPL_DEF_0(RT_CONCAT4(iemCImpl_repne_scas_,OP_rAX,_m,ADDR_SIZE))
    632626{
    633     PVM         pVM   = IEMCPU_TO_VM(pIemCpu);
    634     PVMCPU      pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
    635     PCPUMCTX    pCtx  = pIemCpu->CTX_SUFF(pCtx);
     627    PVM         pVM   = pVCpu->CTX_SUFF(pVM);
     628    PCPUMCTX    pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
    636629
    637630    /*
     
    641634    if (uCounterReg == 0)
    642635    {
    643         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     636        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    644637        return VINF_SUCCESS;
    645638    }
    646639
    647640    uint64_t        uBaseAddr;
    648     VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
     641    VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
    649642    if (rcStrict != VINF_SUCCESS)
    650643        return rcStrict;
     
    669662        if (   cLeftPage > 0 /* can be null if unaligned, do one fallback round. */
    670663            && cbIncr > 0    /** @todo Implement reverse direction string ops. */
    671             && (   IS_64_BIT_CODE(pIemCpu)
     664            && (   IS_64_BIT_CODE(pVCpu)
    672665                || (   uAddrReg < pCtx->es.u32Limit
    673666                    && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pCtx->es.u32Limit)
     
    676669        {
    677670            RTGCPHYS GCPhysMem;
    678             rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtAddr, IEM_ACCESS_DATA_R, &GCPhysMem);
     671            rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, uVirtAddr, IEM_ACCESS_DATA_R, &GCPhysMem);
    679672            if (rcStrict != VINF_SUCCESS)
    680673                return rcStrict;
     
    686679            PGMPAGEMAPLOCK PgLockMem;
    687680            OP_TYPE const *puMem;
    688             rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem, &PgLockMem);
     681            rcStrict = iemMemPageMap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem, &PgLockMem);
    689682            if (rcStrict == VINF_SUCCESS)
    690683            {
     
    705698                pCtx->eflags.u = uEFlags;
    706699                Assert(!!(uEFlags & X86_EFL_ZF) == fQuit);
    707                 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
     700                iemMemPageUnmap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
    708701                if (   fQuit
    709702                    || uCounterReg == 0)
     
    714707                if (!(uVirtAddr & (OP_SIZE - 1)))
    715708                {
    716                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
     709                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
    717710                    continue;
    718711                }
     
    729722        {
    730723            OP_TYPE uTmpValue;
    731             rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pIemCpu, &uTmpValue, X86_SREG_ES, uAddrReg);
     724            rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pVCpu, &uTmpValue, X86_SREG_ES, uAddrReg);
    732725            if (rcStrict != VINF_SUCCESS)
    733726                return rcStrict;
     
    737730            pCtx->eflags.u = uEFlags;
    738731            cLeftPage--;
    739             IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu,
    740                                                                     uCounterReg == 0 || (uEFlags & X86_EFL_ZF));
     732            IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0 || (uEFlags & X86_EFL_ZF));
    741733        } while (   (int32_t)cLeftPage > 0
    742734                 && !(uEFlags & X86_EFL_ZF));
     
    748740            || (uEFlags & X86_EFL_ZF))
    749741            break;
    750         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags);
     742        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);
    751743    }
    752744
     
    754746     * Done.
    755747     */
    756     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     748    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    757749    return VINF_SUCCESS;
    758750}
     
    766758IEM_CIMPL_DEF_1(RT_CONCAT4(iemCImpl_rep_movs_op,OP_SIZE,_addr,ADDR_SIZE), uint8_t, iEffSeg)
    767759{
    768     PVM         pVM   = IEMCPU_TO_VM(pIemCpu);
    769     PVMCPU      pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
    770     PCPUMCTX    pCtx  = pIemCpu->CTX_SUFF(pCtx);
     760    PVM         pVM   = pVCpu->CTX_SUFF(pVM);
     761    PCPUMCTX    pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
    771762
    772763    /*
     
    776767    if (uCounterReg == 0)
    777768    {
    778         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     769        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    779770        return VINF_SUCCESS;
    780771    }
    781772
    782     PCCPUMSELREGHID pSrcHid = iemSRegGetHid(pIemCpu, iEffSeg);
     773    PCCPUMSELREGHID pSrcHid = iemSRegGetHid(pVCpu, iEffSeg);
    783774    uint64_t        uSrcBase;
    784     VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, pSrcHid, iEffSeg, &uSrcBase);
     775    VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pVCpu, pSrcHid, iEffSeg, &uSrcBase);
    785776    if (rcStrict != VINF_SUCCESS)
    786777        return rcStrict;
    787778
    788779    uint64_t        uDstBase;
    789     rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uDstBase);
     780    rcStrict = iemMemSegCheckWriteAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uDstBase);
    790781    if (rcStrict != VINF_SUCCESS)
    791782        return rcStrict;
     
    798789     * Be careful with handle bypassing.
    799790     */
    800     if (pIemCpu->fBypassHandlers)
     791    if (pVCpu->iem.s.fBypassHandlers)
    801792    {
    802793        Log(("%s: declining because we're bypassing handlers\n", __FUNCTION__));
     
    810801     */
    811802#ifdef IEM_VERIFICATION_MODE_FULL
    812     if (   IEM_VERIFICATION_ENABLED(pIemCpu)
     803    if (   IEM_VERIFICATION_ENABLED(pVCpu)
    813804        && (cbIncr > 0
    814805            ?    uSrcAddrReg <= uDstAddrReg
     
    816807            :    uDstAddrReg <= uSrcAddrReg
    817808              && uDstAddrReg + cbIncr * uCounterReg > uSrcAddrReg))
    818         pIemCpu->fOverlappingMovs = true;
     809        pVCpu->iem.s.fOverlappingMovs = true;
    819810#endif
    820811
     
    837828        if (   cLeftPage > 0 /* can be null if unaligned, do one fallback round. */
    838829            && cbIncr > 0    /** @todo Implement reverse direction string ops. */
    839             && (   IS_64_BIT_CODE(pIemCpu)
     830            && (   IS_64_BIT_CODE(pVCpu)
    840831                || (   uSrcAddrReg < pSrcHid->u32Limit
    841832                    && uSrcAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pSrcHid->u32Limit
     
    846837        {
    847838            RTGCPHYS GCPhysSrcMem;
    848             rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtSrcAddr, IEM_ACCESS_DATA_R, &GCPhysSrcMem);
     839            rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, uVirtSrcAddr, IEM_ACCESS_DATA_R, &GCPhysSrcMem);
    849840            if (rcStrict != VINF_SUCCESS)
    850841                return rcStrict;
    851842
    852843            RTGCPHYS GCPhysDstMem;
    853             rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtDstAddr, IEM_ACCESS_DATA_W, &GCPhysDstMem);
     844            rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, uVirtDstAddr, IEM_ACCESS_DATA_W, &GCPhysDstMem);
    854845            if (rcStrict != VINF_SUCCESS)
    855846                return rcStrict;
     
    861852            PGMPAGEMAPLOCK PgLockDstMem;
    862853            OP_TYPE *puDstMem;
    863             rcStrict = iemMemPageMap(pIemCpu, GCPhysDstMem, IEM_ACCESS_DATA_W, (void **)&puDstMem, &PgLockDstMem);
     854            rcStrict = iemMemPageMap(pVCpu, GCPhysDstMem, IEM_ACCESS_DATA_W, (void **)&puDstMem, &PgLockDstMem);
    864855            if (rcStrict == VINF_SUCCESS)
    865856            {
    866857                PGMPAGEMAPLOCK PgLockSrcMem;
    867858                OP_TYPE const *puSrcMem;
    868                 rcStrict = iemMemPageMap(pIemCpu, GCPhysSrcMem, IEM_ACCESS_DATA_R, (void **)&puSrcMem, &PgLockSrcMem);
     859                rcStrict = iemMemPageMap(pVCpu, GCPhysSrcMem, IEM_ACCESS_DATA_R, (void **)&puSrcMem, &PgLockSrcMem);
    869860                if (rcStrict == VINF_SUCCESS)
    870861                {
     
    886877                    pCtx->ADDR_rCX = uCounterReg -= cLeftPage;
    887878
    888                     iemMemPageUnmap(pIemCpu, GCPhysSrcMem, IEM_ACCESS_DATA_R, puSrcMem, &PgLockSrcMem);
    889                     iemMemPageUnmap(pIemCpu, GCPhysDstMem, IEM_ACCESS_DATA_W, puDstMem, &PgLockDstMem);
     879                    iemMemPageUnmap(pVCpu, GCPhysSrcMem, IEM_ACCESS_DATA_R, puSrcMem, &PgLockSrcMem);
     880                    iemMemPageUnmap(pVCpu, GCPhysDstMem, IEM_ACCESS_DATA_W, puDstMem, &PgLockDstMem);
    890881
    891882                    if (uCounterReg == 0)
    892883                        break;
    893                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
     884                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
    894885                    continue;
    895886                }
    896                 iemMemPageUnmap(pIemCpu, GCPhysDstMem, IEM_ACCESS_DATA_W, puDstMem, &PgLockDstMem);
     887                iemMemPageUnmap(pVCpu, GCPhysDstMem, IEM_ACCESS_DATA_W, puDstMem, &PgLockDstMem);
    897888            }
    898889        }
     
    906897        {
    907898            OP_TYPE uValue;
    908             rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pIemCpu, &uValue, iEffSeg, uSrcAddrReg);
    909             if (rcStrict != VINF_SUCCESS)
    910                 return rcStrict;
    911             rcStrict = RT_CONCAT(iemMemStoreDataU,OP_SIZE)(pIemCpu, X86_SREG_ES, uDstAddrReg, uValue);
     899            rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pVCpu, &uValue, iEffSeg, uSrcAddrReg);
     900            if (rcStrict != VINF_SUCCESS)
     901                return rcStrict;
     902            rcStrict = RT_CONCAT(iemMemStoreDataU,OP_SIZE)(pVCpu, X86_SREG_ES, uDstAddrReg, uValue);
    912903            if (rcStrict != VINF_SUCCESS)
    913904                return rcStrict;
     
    917908            pCtx->ADDR_rCX = --uCounterReg;
    918909            cLeftPage--;
    919             IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uCounterReg == 0);
     910            IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);
    920911        } while ((int32_t)cLeftPage > 0);
    921912
     
    925916        if (uCounterReg == 0)
    926917            break;
    927         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
     918        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
    928919    }
    929920
     
    931922     * Done.
    932923     */
    933     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     924    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    934925    return VINF_SUCCESS;
    935926}
     
    941932IEM_CIMPL_DEF_0(RT_CONCAT4(iemCImpl_stos_,OP_rAX,_m,ADDR_SIZE))
    942933{
    943     PVM         pVM   = IEMCPU_TO_VM(pIemCpu);
    944     PVMCPU      pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
    945     PCPUMCTX    pCtx  = pIemCpu->CTX_SUFF(pCtx);
     934    PVM         pVM   = pVCpu->CTX_SUFF(pVM);
     935    PCPUMCTX    pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
    946936
    947937    /*
     
    951941    if (uCounterReg == 0)
    952942    {
    953         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     943        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    954944        return VINF_SUCCESS;
    955945    }
    956946
    957947    uint64_t        uBaseAddr;
    958     VBOXSTRICTRC rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
     948    VBOXSTRICTRC rcStrict = iemMemSegCheckWriteAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
    959949    if (rcStrict != VINF_SUCCESS)
    960950        return rcStrict;
     
    968958     */
    969959    /** @todo Permit doing a page if correctly aligned. */
    970     if (pIemCpu->fBypassHandlers)
     960    if (pVCpu->iem.s.fBypassHandlers)
    971961    {
    972962        Log(("%s: declining because we're bypassing handlers\n", __FUNCTION__));
     
    988978        if (   cLeftPage > 0 /* can be null if unaligned, do one fallback round. */
    989979            && cbIncr > 0    /** @todo Implement reverse direction string ops. */
    990             && (   IS_64_BIT_CODE(pIemCpu)
     980            && (   IS_64_BIT_CODE(pVCpu)
    991981                || (   uAddrReg < pCtx->es.u32Limit
    992982                    && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pCtx->es.u32Limit)
     
    995985        {
    996986            RTGCPHYS GCPhysMem;
    997             rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtAddr, IEM_ACCESS_DATA_W, &GCPhysMem);
     987            rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, uVirtAddr, IEM_ACCESS_DATA_W, &GCPhysMem);
    998988            if (rcStrict != VINF_SUCCESS)
    999989                return rcStrict;
     
    1005995            PGMPAGEMAPLOCK PgLockMem;
    1006996            OP_TYPE *puMem;
    1007             rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, (void **)&puMem, &PgLockMem);
     997            rcStrict = iemMemPageMap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_W, (void **)&puMem, &PgLockMem);
    1008998            if (rcStrict == VINF_SUCCESS)
    1009999            {
     
    10221012#endif
    10231013
    1024                 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, puMem, &PgLockMem);
     1014                iemMemPageUnmap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_W, puMem, &PgLockMem);
    10251015
    10261016                if (uCounterReg == 0)
     
    10311021                if (!(uVirtAddr & (OP_SIZE - 1)))
    10321022                {
    1033                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
     1023                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
    10341024                    continue;
    10351025                }
     
    10451035        do
    10461036        {
    1047             rcStrict = RT_CONCAT(iemMemStoreDataU,OP_SIZE)(pIemCpu, X86_SREG_ES, uAddrReg, uValue);
     1037            rcStrict = RT_CONCAT(iemMemStoreDataU,OP_SIZE)(pVCpu, X86_SREG_ES, uAddrReg, uValue);
    10481038            if (rcStrict != VINF_SUCCESS)
    10491039                return rcStrict;
     
    10511041            pCtx->ADDR_rCX = --uCounterReg;
    10521042            cLeftPage--;
    1053             IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uCounterReg == 0);
     1043            IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);
    10541044        } while ((int32_t)cLeftPage > 0);
    10551045
     
    10591049        if (uCounterReg == 0)
    10601050            break;
    1061         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
     1051        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
    10621052    }
    10631053
     
    10651055     * Done.
    10661056     */
    1067     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     1057    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    10681058    return VINF_SUCCESS;
    10691059}
     
    10751065IEM_CIMPL_DEF_1(RT_CONCAT4(iemCImpl_lods_,OP_rAX,_m,ADDR_SIZE), int8_t, iEffSeg)
    10761066{
    1077     PVM         pVM   = IEMCPU_TO_VM(pIemCpu);
    1078     PVMCPU      pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
    1079     PCPUMCTX    pCtx  = pIemCpu->CTX_SUFF(pCtx);
     1067    PVM         pVM   = pVCpu->CTX_SUFF(pVM);
     1068    PCPUMCTX    pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
    10801069
    10811070    /*
     
    10851074    if (uCounterReg == 0)
    10861075    {
    1087         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     1076        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    10881077        return VINF_SUCCESS;
    10891078    }
    10901079
    1091     PCCPUMSELREGHID pSrcHid = iemSRegGetHid(pIemCpu, iEffSeg);
     1080    PCCPUMSELREGHID pSrcHid = iemSRegGetHid(pVCpu, iEffSeg);
    10921081    uint64_t        uBaseAddr;
    1093     VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, pSrcHid, iEffSeg, &uBaseAddr);
     1082    VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pVCpu, pSrcHid, iEffSeg, &uBaseAddr);
    10941083    if (rcStrict != VINF_SUCCESS)
    10951084        return rcStrict;
     
    11121101        if (   cLeftPage > 0 /* can be null if unaligned, do one fallback round. */
    11131102            && cbIncr > 0    /** @todo Implement reverse direction string ops. */
    1114             && (   IS_64_BIT_CODE(pIemCpu)
     1103            && (   IS_64_BIT_CODE(pVCpu)
    11151104                || (   uAddrReg < pSrcHid->u32Limit
    11161105                    && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pSrcHid->u32Limit)
     
    11191108        {
    11201109            RTGCPHYS GCPhysMem;
    1121             rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtAddr, IEM_ACCESS_DATA_R, &GCPhysMem);
     1110            rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, uVirtAddr, IEM_ACCESS_DATA_R, &GCPhysMem);
    11221111            if (rcStrict != VINF_SUCCESS)
    11231112                return rcStrict;
     
    11291118            PGMPAGEMAPLOCK PgLockMem;
    11301119            OP_TYPE const *puMem;
    1131             rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem, &PgLockMem);
     1120            rcStrict = iemMemPageMap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem, &PgLockMem);
    11321121            if (rcStrict == VINF_SUCCESS)
    11331122            {
     
    11401129                pCtx->ADDR_rCX = uCounterReg -= cLeftPage;
    11411130                pCtx->ADDR_rSI = uAddrReg    += cLeftPage * cbIncr;
    1142                 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
     1131                iemMemPageUnmap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
    11431132
    11441133                if (uCounterReg == 0)
     
    11491138                if (!(uVirtAddr & (OP_SIZE - 1)))
    11501139                {
    1151                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
     1140                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
    11521141                    continue;
    11531142                }
     
    11641153        {
    11651154            OP_TYPE uTmpValue;
    1166             rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pIemCpu, &uTmpValue, iEffSeg, uAddrReg);
     1155            rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pVCpu, &uTmpValue, iEffSeg, uAddrReg);
    11671156            if (rcStrict != VINF_SUCCESS)
    11681157                return rcStrict;
     
    11751164            pCtx->ADDR_rCX = --uCounterReg;
    11761165            cLeftPage--;
    1177             IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uCounterReg == 0);
     1166            IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);
    11781167        } while ((int32_t)cLeftPage > 0);
    11791168
     
    11861175        if (uCounterReg == 0)
    11871176            break;
    1188         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
     1177        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
    11891178    }
    11901179
     
    11921181     * Done.
    11931182     */
    1194     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     1183    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    11951184    return VINF_SUCCESS;
    11961185}
     
    12041193IEM_CIMPL_DEF_1(RT_CONCAT4(iemCImpl_ins_op,OP_SIZE,_addr,ADDR_SIZE), bool, fIoChecked)
    12051194{
    1206     PVM             pVM  = IEMCPU_TO_VM(pIemCpu);
    1207     PCPUMCTX        pCtx = pIemCpu->CTX_SUFF(pCtx);
     1195    PVM             pVM  = pVCpu->CTX_SUFF(pVM);
     1196    PCPUMCTX        pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    12081197    VBOXSTRICTRC    rcStrict;
    12091198
     
    12111200     * Be careful with handle bypassing.
    12121201     */
    1213     if (pIemCpu->fBypassHandlers)
     1202    if (pVCpu->iem.s.fBypassHandlers)
    12141203    {
    12151204        Log(("%s: declining because we're bypassing handlers\n", __FUNCTION__));
     
    12241213    if (!fIoChecked)
    12251214    {
    1226         rcStrict = iemHlpCheckPortIOPermission(pIemCpu, pCtx, pCtx->dx, OP_SIZE / 8);
     1215        rcStrict = iemHlpCheckPortIOPermission(pVCpu, pCtx, pCtx->dx, OP_SIZE / 8);
    12271216        if (rcStrict != VINF_SUCCESS)
    12281217            return rcStrict;
     
    12301219
    12311220    OP_TYPE        *puMem;
    1232     rcStrict = iemMemMap(pIemCpu, (void **)&puMem, OP_SIZE / 8, X86_SREG_ES, pCtx->ADDR_rDI, IEM_ACCESS_DATA_W);
     1221    rcStrict = iemMemMap(pVCpu, (void **)&puMem, OP_SIZE / 8, X86_SREG_ES, pCtx->ADDR_rDI, IEM_ACCESS_DATA_W);
    12331222    if (rcStrict != VINF_SUCCESS)
    12341223        return rcStrict;
    12351224
    12361225    uint32_t        u32Value = 0;
    1237     if (!IEM_VERIFICATION_ENABLED(pIemCpu))
    1238         rcStrict = IOMIOPortRead(pVM, IEMCPU_TO_VMCPU(pIemCpu), pCtx->dx, &u32Value, OP_SIZE / 8);
     1226    if (!IEM_VERIFICATION_ENABLED(pVCpu))
     1227        rcStrict = IOMIOPortRead(pVM, pVCpu, pCtx->dx, &u32Value, OP_SIZE / 8);
    12391228    else
    1240         rcStrict = iemVerifyFakeIOPortRead(pIemCpu, pCtx->dx, &u32Value, OP_SIZE / 8);
     1229        rcStrict = iemVerifyFakeIOPortRead(pVCpu, pCtx->dx, &u32Value, OP_SIZE / 8);
    12411230    if (IOM_SUCCESS(rcStrict))
    12421231    {
    12431232        *puMem = (OP_TYPE)u32Value;
    12441233# ifdef IN_RING3
    1245         VBOXSTRICTRC rcStrict2 = iemMemCommitAndUnmap(pIemCpu, puMem, IEM_ACCESS_DATA_W);
     1234        VBOXSTRICTRC rcStrict2 = iemMemCommitAndUnmap(pVCpu, puMem, IEM_ACCESS_DATA_W);
    12461235# else
    1247         VBOXSTRICTRC rcStrict2 = iemMemCommitAndUnmapPostponeTroubleToR3(pIemCpu, puMem, IEM_ACCESS_DATA_W);
     1236        VBOXSTRICTRC rcStrict2 = iemMemCommitAndUnmapPostponeTroubleToR3(pVCpu, puMem, IEM_ACCESS_DATA_W);
    12481237# endif
    12491238        if (RT_LIKELY(rcStrict2 == VINF_SUCCESS))
     
    12531242            else
    12541243                pCtx->ADDR_rDI -= OP_SIZE / 8;
    1255             iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     1244            iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    12561245        }
    12571246        else
     
    12671256IEM_CIMPL_DEF_1(RT_CONCAT4(iemCImpl_rep_ins_op,OP_SIZE,_addr,ADDR_SIZE), bool, fIoChecked)
    12681257{
    1269     PVM         pVM   = IEMCPU_TO_VM(pIemCpu);
    1270     PVMCPU      pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
    1271     PCPUMCTX    pCtx  = pIemCpu->CTX_SUFF(pCtx);
     1258    PVM         pVM   = pVCpu->CTX_SUFF(pVM);
     1259    PCPUMCTX    pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
    12721260
    12731261    /*
     
    12781266    if (!fIoChecked)
    12791267    {
    1280         rcStrict = iemHlpCheckPortIOPermission(pIemCpu, pCtx, u16Port, OP_SIZE / 8);
     1268        rcStrict = iemHlpCheckPortIOPermission(pVCpu, pCtx, u16Port, OP_SIZE / 8);
    12811269        if (rcStrict != VINF_SUCCESS)
    12821270            return rcStrict;
     
    12861274    if (uCounterReg == 0)
    12871275    {
    1288         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     1276        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    12891277        return VINF_SUCCESS;
    12901278    }
    12911279
    12921280    uint64_t        uBaseAddr;
    1293     rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
     1281    rcStrict = iemMemSegCheckWriteAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
    12941282    if (rcStrict != VINF_SUCCESS)
    12951283        return rcStrict;
     
    13011289     * Be careful with handle bypassing.
    13021290     */
    1303     if (pIemCpu->fBypassHandlers)
     1291    if (pVCpu->iem.s.fBypassHandlers)
    13041292    {
    13051293        Log(("%s: declining because we're bypassing handlers\n", __FUNCTION__));
     
    13211309        if (   cLeftPage > 0 /* can be null if unaligned, do one fallback round. */
    13221310            && cbIncr > 0    /** @todo Implement reverse direction string ops. */
    1323             && (   IS_64_BIT_CODE(pIemCpu)
     1311            && (   IS_64_BIT_CODE(pVCpu)
    13241312                || (   uAddrReg < pCtx->es.u32Limit
    13251313                    && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pCtx->es.u32Limit)
    13261314               )
    1327             && !IEM_VERIFICATION_ENABLED(pIemCpu)
     1315            && !IEM_VERIFICATION_ENABLED(pVCpu)
    13281316           )
    13291317        {
    13301318            RTGCPHYS GCPhysMem;
    1331             rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtAddr, IEM_ACCESS_DATA_W, &GCPhysMem);
     1319            rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, uVirtAddr, IEM_ACCESS_DATA_W, &GCPhysMem);
    13321320            if (rcStrict != VINF_SUCCESS)
    13331321                return rcStrict;
     
    13391327            PGMPAGEMAPLOCK PgLockMem;
    13401328            OP_TYPE *puMem;
    1341             rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, (void **)&puMem, &PgLockMem);
     1329            rcStrict = iemMemPageMap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_W, (void **)&puMem, &PgLockMem);
    13421330            if (rcStrict == VINF_SUCCESS)
    13431331            {
     
    13511339                puMem += cActualTransfers;
    13521340
    1353                 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, puMem, &PgLockMem);
     1341                iemMemPageUnmap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_W, puMem, &PgLockMem);
    13541342
    13551343                if (rcStrict != VINF_SUCCESS)
     
    13571345                    if (IOM_SUCCESS(rcStrict))
    13581346                    {
    1359                         rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     1347                        rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    13601348                        if (uCounterReg == 0)
    1361                             iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     1349                            iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    13621350                    }
    13631351                    return rcStrict;
     
    13701358                if (!(uVirtAddr & (OP_SIZE - 1)))
    13711359                {
    1372                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
     1360                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
    13731361                    continue;
    13741362                }
     
    13901378        {
    13911379            OP_TYPE *puMem;
    1392             rcStrict = iemMemMap(pIemCpu, (void **)&puMem, OP_SIZE / 8, X86_SREG_ES, uAddrReg, IEM_ACCESS_DATA_W);
     1380            rcStrict = iemMemMap(pVCpu, (void **)&puMem, OP_SIZE / 8, X86_SREG_ES, uAddrReg, IEM_ACCESS_DATA_W);
    13931381            if (rcStrict != VINF_SUCCESS)
    13941382                return rcStrict;
    13951383
    13961384            uint32_t u32Value = 0;
    1397             if (!IEM_VERIFICATION_ENABLED(pIemCpu))
     1385            if (!IEM_VERIFICATION_ENABLED(pVCpu))
    13981386                rcStrict = IOMIOPortRead(pVM, pVCpu, u16Port, &u32Value, OP_SIZE / 8);
    13991387            else
    1400                 rcStrict = iemVerifyFakeIOPortRead(pIemCpu, u16Port, &u32Value, OP_SIZE / 8);
     1388                rcStrict = iemVerifyFakeIOPortRead(pVCpu, u16Port, &u32Value, OP_SIZE / 8);
    14011389            if (!IOM_SUCCESS(rcStrict))
    14021390                return rcStrict;
     
    14041392            *puMem = (OP_TYPE)u32Value;
    14051393# ifdef IN_RING3
    1406             VBOXSTRICTRC rcStrict2 = iemMemCommitAndUnmap(pIemCpu, puMem, IEM_ACCESS_DATA_W);
     1394            VBOXSTRICTRC rcStrict2 = iemMemCommitAndUnmap(pVCpu, puMem, IEM_ACCESS_DATA_W);
    14071395# else
    1408             VBOXSTRICTRC rcStrict2 = iemMemCommitAndUnmapPostponeTroubleToR3(pIemCpu, puMem, IEM_ACCESS_DATA_W);
     1396            VBOXSTRICTRC rcStrict2 = iemMemCommitAndUnmapPostponeTroubleToR3(pVCpu, puMem, IEM_ACCESS_DATA_W);
    14091397# endif
    14101398            if (rcStrict2 == VINF_SUCCESS)
     
    14211409            {
    14221410                if (uCounterReg == 0)
    1423                     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
    1424                 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     1411                    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
     1412                rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    14251413                return rcStrict;
    14261414            }
    14271415
    1428             IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uCounterReg == 0);
     1416            IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);
    14291417        } while ((int32_t)cLeftPage > 0);
    14301418
     
    14351423        if (uCounterReg == 0)
    14361424            break;
    1437         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
     1425        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
    14381426    }
    14391427
     
    14411429     * Done.
    14421430     */
    1443     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     1431    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    14441432    return VINF_SUCCESS;
    14451433}
     
    14511439IEM_CIMPL_DEF_2(RT_CONCAT4(iemCImpl_outs_op,OP_SIZE,_addr,ADDR_SIZE), uint8_t, iEffSeg, bool, fIoChecked)
    14521440{
    1453     PVM             pVM  = IEMCPU_TO_VM(pIemCpu);
    1454     PCPUMCTX        pCtx = pIemCpu->CTX_SUFF(pCtx);
     1441    PVM             pVM  = pVCpu->CTX_SUFF(pVM);
     1442    PCPUMCTX        pCtx = pVCpu->iem.s.CTX_SUFF(pCtx);
    14551443    VBOXSTRICTRC    rcStrict;
    14561444
     
    14621450    if (!fIoChecked)
    14631451    {
    1464         rcStrict = iemHlpCheckPortIOPermission(pIemCpu, pCtx, pCtx->dx, OP_SIZE / 8);
     1452        rcStrict = iemHlpCheckPortIOPermission(pVCpu, pCtx, pCtx->dx, OP_SIZE / 8);
    14651453        if (rcStrict != VINF_SUCCESS)
    14661454            return rcStrict;
     
    14681456
    14691457    OP_TYPE uValue;
    1470     rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pIemCpu, &uValue, iEffSeg, pCtx->ADDR_rSI);
     1458    rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pVCpu, &uValue, iEffSeg, pCtx->ADDR_rSI);
    14711459    if (rcStrict == VINF_SUCCESS)
    14721460    {
    1473         if (!IEM_VERIFICATION_ENABLED(pIemCpu))
    1474             rcStrict = IOMIOPortWrite(pVM, IEMCPU_TO_VMCPU(pIemCpu), pCtx->dx, uValue, OP_SIZE / 8);
     1461        if (!IEM_VERIFICATION_ENABLED(pVCpu))
     1462            rcStrict = IOMIOPortWrite(pVM, pVCpu, pCtx->dx, uValue, OP_SIZE / 8);
    14751463        else
    1476             rcStrict = iemVerifyFakeIOPortWrite(pIemCpu, pCtx->dx, uValue, OP_SIZE / 8);
     1464            rcStrict = iemVerifyFakeIOPortWrite(pVCpu, pCtx->dx, uValue, OP_SIZE / 8);
    14771465        if (IOM_SUCCESS(rcStrict))
    14781466        {
     
    14811469            else
    14821470                pCtx->ADDR_rSI -= OP_SIZE / 8;
    1483             iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
    1484             if (rcStrict != VINF_SUCCESS)
    1485                 rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     1471            iemRegAddToRipAndClearRF(pVCpu, cbInstr);
     1472            if (rcStrict != VINF_SUCCESS)
     1473                rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    14861474        }
    14871475    }
     
    14951483IEM_CIMPL_DEF_2(RT_CONCAT4(iemCImpl_rep_outs_op,OP_SIZE,_addr,ADDR_SIZE), uint8_t, iEffSeg, bool, fIoChecked)
    14961484{
    1497     PVM         pVM   = IEMCPU_TO_VM(pIemCpu);
    1498     PVMCPU      pVCpu = IEMCPU_TO_VMCPU(pIemCpu);
    1499     PCPUMCTX    pCtx  = pIemCpu->CTX_SUFF(pCtx);
     1485    PVM         pVM   = pVCpu->CTX_SUFF(pVM);
     1486    PCPUMCTX    pCtx  = pVCpu->iem.s.CTX_SUFF(pCtx);
    15001487
    15011488    /*
     
    15061493    if (!fIoChecked)
    15071494    {
    1508         rcStrict = iemHlpCheckPortIOPermission(pIemCpu, pCtx, u16Port, OP_SIZE / 8);
     1495        rcStrict = iemHlpCheckPortIOPermission(pVCpu, pCtx, u16Port, OP_SIZE / 8);
    15091496        if (rcStrict != VINF_SUCCESS)
    15101497            return rcStrict;
     
    15141501    if (uCounterReg == 0)
    15151502    {
    1516         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     1503        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    15171504        return VINF_SUCCESS;
    15181505    }
    15191506
    1520     PCCPUMSELREGHID pHid = iemSRegGetHid(pIemCpu, iEffSeg);
     1507    PCCPUMSELREGHID pHid = iemSRegGetHid(pVCpu, iEffSeg);
    15211508    uint64_t        uBaseAddr;
    1522     rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, pHid, iEffSeg, &uBaseAddr);
     1509    rcStrict = iemMemSegCheckReadAccessEx(pVCpu, pHid, iEffSeg, &uBaseAddr);
    15231510    if (rcStrict != VINF_SUCCESS)
    15241511        return rcStrict;
     
    15411528        if (   cLeftPage > 0 /* can be null if unaligned, do one fallback round. */
    15421529            && cbIncr > 0    /** @todo Implement reverse direction string ops. */
    1543             && (   IS_64_BIT_CODE(pIemCpu)
     1530            && (   IS_64_BIT_CODE(pVCpu)
    15441531                || (   uAddrReg < pHid->u32Limit
    15451532                    && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pHid->u32Limit)
    15461533               )
    1547             && !IEM_VERIFICATION_ENABLED(pIemCpu)
     1534            && !IEM_VERIFICATION_ENABLED(pVCpu)
    15481535           )
    15491536        {
    15501537            RTGCPHYS GCPhysMem;
    1551             rcStrict = iemMemPageTranslateAndCheckAccess(pIemCpu, uVirtAddr, IEM_ACCESS_DATA_R, &GCPhysMem);
     1538            rcStrict = iemMemPageTranslateAndCheckAccess(pVCpu, uVirtAddr, IEM_ACCESS_DATA_R, &GCPhysMem);
    15521539            if (rcStrict != VINF_SUCCESS)
    15531540                return rcStrict;
     
    15591546            PGMPAGEMAPLOCK PgLockMem;
    15601547            OP_TYPE const *puMem;
    1561             rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem, &PgLockMem);
     1548            rcStrict = iemMemPageMap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem, &PgLockMem);
    15621549            if (rcStrict == VINF_SUCCESS)
    15631550            {
     
    15711558                puMem += cActualTransfers;
    15721559
    1573                 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
     1560                iemMemPageUnmap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
    15741561
    15751562                if (rcStrict != VINF_SUCCESS)
     
    15771564                    if (IOM_SUCCESS(rcStrict))
    15781565                    {
    1579                         rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     1566                        rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    15801567                        if (uCounterReg == 0)
    1581                             iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     1568                            iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    15821569                    }
    15831570                    return rcStrict;
     
    15911578                if (!(uVirtAddr & (OP_SIZE - 1)))
    15921579                {
    1593                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
     1580                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
    15941581                    continue;
    15951582                }
     
    16111598        {
    16121599            OP_TYPE uValue;
    1613             rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pIemCpu, &uValue, iEffSeg, uAddrReg);
    1614             if (rcStrict != VINF_SUCCESS)
    1615                 return rcStrict;
    1616 
    1617             if (!IEM_VERIFICATION_ENABLED(pIemCpu))
     1600            rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pVCpu, &uValue, iEffSeg, uAddrReg);
     1601            if (rcStrict != VINF_SUCCESS)
     1602                return rcStrict;
     1603
     1604            if (!IEM_VERIFICATION_ENABLED(pVCpu))
    16181605                rcStrict = IOMIOPortWrite(pVM, pVCpu, u16Port, uValue, OP_SIZE / 8);
    16191606            else
    1620                 rcStrict = iemVerifyFakeIOPortWrite(pIemCpu, u16Port, uValue, OP_SIZE / 8);
     1607                rcStrict = iemVerifyFakeIOPortWrite(pVCpu, u16Port, uValue, OP_SIZE / 8);
    16211608            if (IOM_SUCCESS(rcStrict))
    16221609            {
     
    16301617                {
    16311618                    if (uCounterReg == 0)
    1632                         iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
    1633                     rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     1619                        iemRegAddToRipAndClearRF(pVCpu, cbInstr);
     1620                    rcStrict = iemSetPassUpStatus(pVCpu, rcStrict);
    16341621                }
    16351622                return rcStrict;
    16361623            }
    1637             IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uCounterReg == 0);
     1624            IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);
    16381625        } while ((int32_t)cLeftPage > 0);
    16391626
     
    16441631        if (uCounterReg == 0)
    16451632            break;
    1646         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u);
     1633        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
    16471634    }
    16481635
     
    16501637     * Done.
    16511638     */
    1652     iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
     1639    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    16531640    return VINF_SUCCESS;
    16541641}
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r61885 r62015  
    4545        IEM_MC_ARG(uint32_t *, pEFlags, 2);
    4646
    47         IEM_MC_FETCH_GREG_U8(u8Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    48         IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     47        IEM_MC_FETCH_GREG_U8(u8Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     48        IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    4949        IEM_MC_REF_EFLAGS(pEFlags);
    5050        IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);
     
    6868
    6969        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    70         IEM_MC_MEM_MAP(pu8Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    71         IEM_MC_FETCH_GREG_U8(u8Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     70        IEM_MC_MEM_MAP(pu8Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
     71        IEM_MC_FETCH_GREG_U8(u8Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    7272        IEM_MC_FETCH_EFLAGS(EFlags);
    73         if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     73        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    7474            IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);
    7575        else
     
    102102        IEMOP_HLP_NO_LOCK_PREFIX();
    103103
    104         switch (pIemCpu->enmEffOpSize)
     104        switch (pVCpu->iem.s.enmEffOpSize)
    105105        {
    106106            case IEMMODE_16BIT:
     
    110110                IEM_MC_ARG(uint32_t *, pEFlags, 2);
    111111
    112                 IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    113                 IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     112                IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     113                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    114114                IEM_MC_REF_EFLAGS(pEFlags);
    115115                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
     
    125125                IEM_MC_ARG(uint32_t *, pEFlags, 2);
    126126
    127                 IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    128                 IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     127                IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     128                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    129129                IEM_MC_REF_EFLAGS(pEFlags);
    130130                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
     
    142142                IEM_MC_ARG(uint32_t *, pEFlags, 2);
    143143
    144                 IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    145                 IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     144                IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     145                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    146146                IEM_MC_REF_EFLAGS(pEFlags);
    147147                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
     
    160160         */
    161161        uint32_t const fAccess = pImpl->pfnLockedU8 ? IEM_ACCESS_DATA_RW : IEM_ACCESS_DATA_R /* CMP,TEST */;
    162         switch (pIemCpu->enmEffOpSize)
     162        switch (pVCpu->iem.s.enmEffOpSize)
    163163        {
    164164            case IEMMODE_16BIT:
     
    170170
    171171                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    172                 IEM_MC_MEM_MAP(pu16Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    173                 IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     172                IEM_MC_MEM_MAP(pu16Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
     173                IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    174174                IEM_MC_FETCH_EFLAGS(EFlags);
    175                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     175                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    176176                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
    177177                else
     
    192192
    193193                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    194                 IEM_MC_MEM_MAP(pu32Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    195                 IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     194                IEM_MC_MEM_MAP(pu32Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
     195                IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    196196                IEM_MC_FETCH_EFLAGS(EFlags);
    197                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     197                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    198198                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
    199199                else
     
    214214
    215215                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    216                 IEM_MC_MEM_MAP(pu64Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    217                 IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     216                IEM_MC_MEM_MAP(pu64Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
     217                IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    218218                IEM_MC_FETCH_EFLAGS(EFlags);
    219                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     219                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    220220                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
    221221                else
     
    254254        IEM_MC_ARG(uint32_t *, pEFlags, 2);
    255255
    256         IEM_MC_FETCH_GREG_U8(u8Src, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    257         IEM_MC_REF_GREG_U8(pu8Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     256        IEM_MC_FETCH_GREG_U8(u8Src, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     257        IEM_MC_REF_GREG_U8(pu8Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    258258        IEM_MC_REF_EFLAGS(pEFlags);
    259259        IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);
     
    274274
    275275        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    276         IEM_MC_FETCH_MEM_U8(u8Src, pIemCpu->iEffSeg, GCPtrEffDst);
    277         IEM_MC_REF_GREG_U8(pu8Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     276        IEM_MC_FETCH_MEM_U8(u8Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     277        IEM_MC_REF_GREG_U8(pu8Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    278278        IEM_MC_REF_EFLAGS(pEFlags);
    279279        IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);
     
    302302    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    303303    {
    304         switch (pIemCpu->enmEffOpSize)
     304        switch (pVCpu->iem.s.enmEffOpSize)
    305305        {
    306306            case IEMMODE_16BIT:
     
    310310                IEM_MC_ARG(uint32_t *, pEFlags, 2);
    311311
    312                 IEM_MC_FETCH_GREG_U16(u16Src, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    313                 IEM_MC_REF_GREG_U16(pu16Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     312                IEM_MC_FETCH_GREG_U16(u16Src, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     313                IEM_MC_REF_GREG_U16(pu16Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    314314                IEM_MC_REF_EFLAGS(pEFlags);
    315315                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
     
    325325                IEM_MC_ARG(uint32_t *, pEFlags, 2);
    326326
    327                 IEM_MC_FETCH_GREG_U32(u32Src, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    328                 IEM_MC_REF_GREG_U32(pu32Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     327                IEM_MC_FETCH_GREG_U32(u32Src, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     328                IEM_MC_REF_GREG_U32(pu32Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    329329                IEM_MC_REF_EFLAGS(pEFlags);
    330330                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
     
    341341                IEM_MC_ARG(uint32_t *, pEFlags, 2);
    342342
    343                 IEM_MC_FETCH_GREG_U64(u64Src, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    344                 IEM_MC_REF_GREG_U64(pu64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     343                IEM_MC_FETCH_GREG_U64(u64Src, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     344                IEM_MC_REF_GREG_U64(pu64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    345345                IEM_MC_REF_EFLAGS(pEFlags);
    346346                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
     
    356356         * We're accessing memory.
    357357         */
    358         switch (pIemCpu->enmEffOpSize)
     358        switch (pVCpu->iem.s.enmEffOpSize)
    359359        {
    360360            case IEMMODE_16BIT:
     
    366366
    367367                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    368                 IEM_MC_FETCH_MEM_U16(u16Src, pIemCpu->iEffSeg, GCPtrEffDst);
    369                 IEM_MC_REF_GREG_U16(pu16Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     368                IEM_MC_FETCH_MEM_U16(u16Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     369                IEM_MC_REF_GREG_U16(pu16Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    370370                IEM_MC_REF_EFLAGS(pEFlags);
    371371                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
     
    383383
    384384                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    385                 IEM_MC_FETCH_MEM_U32(u32Src, pIemCpu->iEffSeg, GCPtrEffDst);
    386                 IEM_MC_REF_GREG_U32(pu32Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     385                IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     386                IEM_MC_REF_GREG_U32(pu32Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    387387                IEM_MC_REF_EFLAGS(pEFlags);
    388388                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
     
    401401
    402402                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    403                 IEM_MC_FETCH_MEM_U64(u64Src, pIemCpu->iEffSeg, GCPtrEffDst);
    404                 IEM_MC_REF_GREG_U64(pu64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     403                IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     404                IEM_MC_REF_GREG_U64(pu64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    405405                IEM_MC_REF_EFLAGS(pEFlags);
    406406                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
     
    449449FNIEMOP_DEF_1(iemOpHlpBinaryOperator_rAX_Iz, PCIEMOPBINSIZES, pImpl)
    450450{
    451     switch (pIemCpu->enmEffOpSize)
     451    switch (pVCpu->iem.s.enmEffOpSize)
    452452    {
    453453        case IEMMODE_16BIT:
     
    555555    {
    556556        IEMOP_HLP_DECODED_NL_1(OP_SLDT, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    557         switch (pIemCpu->enmEffOpSize)
     557        switch (pVCpu->iem.s.enmEffOpSize)
    558558        {
    559559            case IEMMODE_16BIT:
     
    561561                IEM_MC_LOCAL(uint16_t, u16Ldtr);
    562562                IEM_MC_FETCH_LDTR_U16(u16Ldtr);
    563                 IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Ldtr);
     563                IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u16Ldtr);
    564564                IEM_MC_ADVANCE_RIP();
    565565                IEM_MC_END();
     
    570570                IEM_MC_LOCAL(uint32_t, u32Ldtr);
    571571                IEM_MC_FETCH_LDTR_U32(u32Ldtr);
    572                 IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Ldtr);
     572                IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u32Ldtr);
    573573                IEM_MC_ADVANCE_RIP();
    574574                IEM_MC_END();
     
    579579                IEM_MC_LOCAL(uint64_t, u64Ldtr);
    580580                IEM_MC_FETCH_LDTR_U64(u64Ldtr);
    581                 IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Ldtr);
     581                IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u64Ldtr);
    582582                IEM_MC_ADVANCE_RIP();
    583583                IEM_MC_END();
     
    595595        IEMOP_HLP_DECODED_NL_1(OP_SLDT, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    596596        IEM_MC_FETCH_LDTR_U16(u16Ldtr);
    597         IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Ldtr);
     597        IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u16Ldtr);
    598598        IEM_MC_ADVANCE_RIP();
    599599        IEM_MC_END();
     
    613613    {
    614614        IEMOP_HLP_DECODED_NL_1(OP_STR, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    615         switch (pIemCpu->enmEffOpSize)
     615        switch (pVCpu->iem.s.enmEffOpSize)
    616616        {
    617617            case IEMMODE_16BIT:
     
    619619                IEM_MC_LOCAL(uint16_t, u16Tr);
    620620                IEM_MC_FETCH_TR_U16(u16Tr);
    621                 IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Tr);
     621                IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u16Tr);
    622622                IEM_MC_ADVANCE_RIP();
    623623                IEM_MC_END();
     
    628628                IEM_MC_LOCAL(uint32_t, u32Tr);
    629629                IEM_MC_FETCH_TR_U32(u32Tr);
    630                 IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Tr);
     630                IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u32Tr);
    631631                IEM_MC_ADVANCE_RIP();
    632632                IEM_MC_END();
     
    637637                IEM_MC_LOCAL(uint64_t, u64Tr);
    638638                IEM_MC_FETCH_TR_U64(u64Tr);
    639                 IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Tr);
     639                IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u64Tr);
    640640                IEM_MC_ADVANCE_RIP();
    641641                IEM_MC_END();
     
    653653        IEMOP_HLP_DECODED_NL_1(OP_STR, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    654654        IEM_MC_FETCH_TR_U16(u16Tr);
    655         IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Tr);
     655        IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u16Tr);
    656656        IEM_MC_ADVANCE_RIP();
    657657        IEM_MC_END();
     
    673673        IEM_MC_BEGIN(1, 0);
    674674        IEM_MC_ARG(uint16_t, u16Sel, 0);
    675         IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     675        IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    676676        IEM_MC_CALL_CIMPL_1(iemCImpl_lldt, u16Sel);
    677677        IEM_MC_END();
     
    685685        IEMOP_HLP_DECODED_NL_1(OP_LLDT, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS);
    686686        IEM_MC_RAISE_GP0_IF_CPL_NOT_ZERO(); /** @todo test order */
    687         IEM_MC_FETCH_MEM_U16(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc);
     687        IEM_MC_FETCH_MEM_U16(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    688688        IEM_MC_CALL_CIMPL_1(iemCImpl_lldt, u16Sel);
    689689        IEM_MC_END();
     
    705705        IEM_MC_BEGIN(1, 0);
    706706        IEM_MC_ARG(uint16_t, u16Sel, 0);
    707         IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     707        IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    708708        IEM_MC_CALL_CIMPL_1(iemCImpl_ltr, u16Sel);
    709709        IEM_MC_END();
     
    717717        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    718718        IEM_MC_RAISE_GP0_IF_CPL_NOT_ZERO(); /** @todo test ordre */
    719         IEM_MC_FETCH_MEM_U16(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc);
     719        IEM_MC_FETCH_MEM_U16(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    720720        IEM_MC_CALL_CIMPL_1(iemCImpl_ltr, u16Sel);
    721721        IEM_MC_END();
     
    737737        IEM_MC_ARG(uint16_t,    u16Sel,            0);
    738738        IEM_MC_ARG_CONST(bool,  fWriteArg, fWrite, 1);
    739         IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     739        IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    740740        IEM_MC_CALL_CIMPL_2(iemCImpl_VerX, u16Sel, fWriteArg);
    741741        IEM_MC_END();
     
    749749        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    750750        IEMOP_HLP_DECODED_NL_1(fWrite ? OP_VERW : OP_VERR, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    751         IEM_MC_FETCH_MEM_U16(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc);
     751        IEM_MC_FETCH_MEM_U16(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    752752        IEM_MC_CALL_CIMPL_2(iemCImpl_VerX, u16Sel, fWriteArg);
    753753        IEM_MC_END();
     
    809809    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    810810    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    811     IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
     811    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    812812    IEM_MC_CALL_CIMPL_2(iemCImpl_sgdt, iEffSeg, GCPtrEffSrc);
    813813    IEM_MC_END();
     
    859859    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    860860    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    861     IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
     861    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    862862    IEM_MC_CALL_CIMPL_2(iemCImpl_sidt, iEffSeg, GCPtrEffSrc);
    863863    IEM_MC_END();
     
    871871    IEMOP_MNEMONIC("monitor");
    872872    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); /** @todo Verify that monitor is allergic to lock prefixes. */
    873     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_monitor, pIemCpu->iEffSeg);
     873    return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_monitor, pVCpu->iem.s.iEffSeg);
    874874}
    875875
     
    892892    IEM_MC_ARG(uint8_t,         iEffSeg,                                    0);
    893893    IEM_MC_ARG(RTGCPTR,         GCPtrEffSrc,                                1);
    894     IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSizeArg,/*=*/pIemCpu->enmEffOpSize, 2);
     894    IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSizeArg,/*=*/pVCpu->iem.s.enmEffOpSize, 2);
    895895    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    896896    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    897     IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
     897    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    898898    IEM_MC_CALL_CIMPL_3(iemCImpl_lgdt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
    899899    IEM_MC_END();
     
    906906{
    907907    IEMOP_MNEMONIC("xgetbv");
    908     if (IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fXSaveRstor)
     908    if (IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fXSaveRstor)
    909909    {
    910910        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
     
    919919{
    920920    IEMOP_MNEMONIC("xsetbv");
    921     if (IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fXSaveRstor)
     921    if (IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fXSaveRstor)
    922922    {
    923923        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
     
    931931FNIEMOP_DEF_1(iemOp_Grp7_lidt, uint8_t, bRm)
    932932{
    933     IEMMODE enmEffOpSize = pIemCpu->enmCpuMode == IEMMODE_64BIT
     933    IEMMODE enmEffOpSize = pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT
    934934                         ? IEMMODE_64BIT
    935                          : pIemCpu->enmEffOpSize;
     935                         : pVCpu->iem.s.enmEffOpSize;
    936936    IEM_MC_BEGIN(3, 1);
    937937    IEM_MC_ARG(uint8_t,         iEffSeg,                            0);
     
    940940    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    941941    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    942     IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
     942    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    943943    IEM_MC_CALL_CIMPL_3(iemCImpl_lidt, iEffSeg, GCPtrEffSrc, enmEffOpSizeArg);
    944944    IEM_MC_END();
     
    979979    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    980980    {
    981         switch (pIemCpu->enmEffOpSize)
     981        switch (pVCpu->iem.s.enmEffOpSize)
    982982        {
    983983            case IEMMODE_16BIT:
     
    985985                IEM_MC_LOCAL(uint16_t, u16Tmp);
    986986                IEM_MC_FETCH_CR0_U16(u16Tmp);
    987                 if (IEM_GET_TARGET_CPU(pIemCpu) > IEMTARGETCPU_386)
     987                if (IEM_GET_TARGET_CPU(pVCpu) > IEMTARGETCPU_386)
    988988                { /* likely */ }
    989                 else if (IEM_GET_TARGET_CPU(pIemCpu) >= IEMTARGETCPU_386)
     989                else if (IEM_GET_TARGET_CPU(pVCpu) >= IEMTARGETCPU_386)
    990990                    IEM_MC_OR_LOCAL_U16(u16Tmp, 0xffe0);
    991991                else
    992992                    IEM_MC_OR_LOCAL_U16(u16Tmp, 0xfff0);
    993                 IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Tmp);
     993                IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u16Tmp);
    994994                IEM_MC_ADVANCE_RIP();
    995995                IEM_MC_END();
     
    10001000                IEM_MC_LOCAL(uint32_t, u32Tmp);
    10011001                IEM_MC_FETCH_CR0_U32(u32Tmp);
    1002                 IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Tmp);
     1002                IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u32Tmp);
    10031003                IEM_MC_ADVANCE_RIP();
    10041004                IEM_MC_END();
     
    10091009                IEM_MC_LOCAL(uint64_t, u64Tmp);
    10101010                IEM_MC_FETCH_CR0_U64(u64Tmp);
    1011                 IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Tmp);
     1011                IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u64Tmp);
    10121012                IEM_MC_ADVANCE_RIP();
    10131013                IEM_MC_END();
     
    10251025        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10261026        IEM_MC_FETCH_CR0_U16(u16Tmp);
    1027         if (IEM_GET_TARGET_CPU(pIemCpu) > IEMTARGETCPU_386)
     1027        if (IEM_GET_TARGET_CPU(pVCpu) > IEMTARGETCPU_386)
    10281028        { /* likely */ }
    1029         else if (pIemCpu->uTargetCpu >= IEMTARGETCPU_386)
     1029        else if (pVCpu->iem.s.uTargetCpu >= IEMTARGETCPU_386)
    10301030            IEM_MC_OR_LOCAL_U16(u16Tmp, 0xffe0);
    10311031        else
    10321032            IEM_MC_OR_LOCAL_U16(u16Tmp, 0xfff0);
    1033         IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Tmp);
     1033        IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u16Tmp);
    10341034        IEM_MC_ADVANCE_RIP();
    10351035        IEM_MC_END();
     
    10511051        IEM_MC_BEGIN(1, 0);
    10521052        IEM_MC_ARG(uint16_t, u16Tmp, 0);
    1053         IEM_MC_FETCH_GREG_U16(u16Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     1053        IEM_MC_FETCH_GREG_U16(u16Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    10541054        IEM_MC_CALL_CIMPL_1(iemCImpl_lmsw, u16Tmp);
    10551055        IEM_MC_END();
     
    10611061        IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst);
    10621062        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    1063         IEM_MC_FETCH_MEM_U16(u16Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
     1063        IEM_MC_FETCH_MEM_U16(u16Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    10641064        IEM_MC_CALL_CIMPL_1(iemCImpl_lmsw, u16Tmp);
    10651065        IEM_MC_END();
     
    10971097FNIEMOP_DEF(iemOp_Grp7_rdtscp)
    10981098{
    1099     NOREF(pIemCpu);
     1099    NOREF(pVCpu);
    11001100    IEMOP_BITCH_ABOUT_STUB();
    11011101    return VERR_IEM_INSTR_NOT_IMPLEMENTED;
     
    11891189    {
    11901190        IEMOP_HLP_DECODED_NL_2(fIsLar ? OP_LAR : OP_LSL, IEMOPFORM_RM_REG, OP_PARM_Gv, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    1191         switch (pIemCpu->enmEffOpSize)
     1191        switch (pVCpu->iem.s.enmEffOpSize)
    11921192        {
    11931193            case IEMMODE_16BIT:
     
    11991199                IEM_MC_ARG_CONST(bool,  fIsLarArg, fIsLar, 3);
    12001200
    1201                 IEM_MC_REF_GREG_U16(pu16Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    1202                 IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     1201                IEM_MC_REF_GREG_U16(pu16Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1202                IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    12031203                IEM_MC_REF_EFLAGS(pEFlags);
    12041204                IEM_MC_CALL_CIMPL_4(iemCImpl_LarLsl_u16, pu16Dst, u16Sel, pEFlags, fIsLarArg);
     
    12171217                IEM_MC_ARG_CONST(bool,  fIsLarArg, fIsLar, 3);
    12181218
    1219                 IEM_MC_REF_GREG_U64(pu64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    1220                 IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     1219                IEM_MC_REF_GREG_U64(pu64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1220                IEM_MC_FETCH_GREG_U16(u16Sel, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    12211221                IEM_MC_REF_EFLAGS(pEFlags);
    12221222                IEM_MC_CALL_CIMPL_4(iemCImpl_LarLsl_u64, pu64Dst, u16Sel, pEFlags, fIsLarArg);
     
    12311231    else
    12321232    {
    1233         switch (pIemCpu->enmEffOpSize)
     1233        switch (pVCpu->iem.s.enmEffOpSize)
    12341234        {
    12351235            case IEMMODE_16BIT:
     
    12451245                IEMOP_HLP_DECODED_NL_2(fIsLar ? OP_LAR : OP_LSL, IEMOPFORM_RM_MEM, OP_PARM_Gv, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    12461246
    1247                 IEM_MC_FETCH_MEM_U16(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc);
    1248                 IEM_MC_REF_GREG_U16(pu16Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     1247                IEM_MC_FETCH_MEM_U16(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     1248                IEM_MC_REF_GREG_U16(pu16Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    12491249                IEM_MC_REF_EFLAGS(pEFlags);
    12501250                IEM_MC_CALL_CIMPL_4(iemCImpl_LarLsl_u16, pu16Dst, u16Sel, pEFlags, fIsLarArg);
     
    12681268/** @todo testcase: make sure it's a 16-bit read. */
    12691269
    1270                 IEM_MC_FETCH_MEM_U16(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc);
    1271                 IEM_MC_REF_GREG_U64(pu64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     1270                IEM_MC_FETCH_MEM_U16(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     1271                IEM_MC_REF_GREG_U64(pu64Dst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    12721272                IEM_MC_REF_EFLAGS(pEFlags);
    12731273                IEM_MC_CALL_CIMPL_4(iemCImpl_LarLsl_u64, pu64Dst, u16Sel, pEFlags, fIsLarArg);
     
    13571357{
    13581358    /* AMD prefetch group, Intel implements this as NOP Ev (and so do we). */
    1359     if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->f3DNowPrefetch)
     1359    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->f3DNowPrefetch)
    13601360    {
    13611361        IEMOP_MNEMONIC("GrpP");
     
    14741474FNIEMOP_DEF(iemOp_3Dnow)
    14751475{
    1476     if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->f3DNow)
     1476    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->f3DNow)
    14771477    {
    14781478        IEMOP_MNEMONIC("3Dnow");
     
    15221522{
    15231523    /* Quick hack. Need to restructure all of this later some time. */
    1524     uint32_t const fRelevantPrefix = pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ);
     1524    uint32_t const fRelevantPrefix = pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ);
    15251525    if (fRelevantPrefix == 0)
    15261526    {
     
    15361536            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    15371537            IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    1538             IEM_MC_COPY_XREG_U128((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB,
    1539                                   ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     1538            IEM_MC_COPY_XREG_U128((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
     1539                                  ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    15401540            IEM_MC_ADVANCE_RIP();
    15411541            IEM_MC_END();
     
    15551555            IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    15561556
    1557             IEM_MC_FETCH_XREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    1558             IEM_MC_STORE_MEM_U128(pIemCpu->iEffSeg, GCPtrEffSrc, uSrc);
     1557            IEM_MC_FETCH_XREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1558            IEM_MC_STORE_MEM_U128(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    15591559
    15601560            IEM_MC_ADVANCE_RIP();
     
    15771577            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    15781578            IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    1579             IEM_MC_FETCH_XREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    1580             IEM_MC_STORE_XREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, uSrc);
     1579            IEM_MC_FETCH_XREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1580            IEM_MC_STORE_XREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, uSrc);
    15811581
    15821582            IEM_MC_ADVANCE_RIP();
     
    15971597            IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    15981598
    1599             IEM_MC_FETCH_XREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    1600             IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffSrc, uSrc);
     1599            IEM_MC_FETCH_XREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1600            IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    16011601
    16021602            IEM_MC_ADVANCE_RIP();
     
    16211621{
    16221622    /* Quick hack. Need to restructure all of this later some time. */
    1623     if (pIemCpu->fPrefixes == IEM_OP_PRF_SIZE_OP)
     1623    if (pVCpu->iem.s.fPrefixes == IEM_OP_PRF_SIZE_OP)
    16241624    {
    16251625        IEMOP_MNEMONIC("movlpd Mq,Vq");
     
    16361636            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    16371637            IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    1638             IEM_MC_FETCH_XREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    1639             IEM_MC_STORE_XREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, uSrc);
     1638            IEM_MC_FETCH_XREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1639            IEM_MC_STORE_XREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, uSrc);
    16401640            IEM_MC_ADVANCE_RIP();
    16411641            IEM_MC_END();
     
    16581658            IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    16591659
    1660             IEM_MC_FETCH_XREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    1661             IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffSrc, uSrc);
     1660            IEM_MC_FETCH_XREG_U64(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1661            IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    16621662
    16631663            IEM_MC_ADVANCE_RIP();
     
    17451745    IEMOP_MNEMONIC("mov Rd,Cd");
    17461746    IEMOP_HLP_MIN_386();
    1747     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
    1748         pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_64BIT;
     1747    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
     1748        pVCpu->iem.s.enmEffOpSize = pVCpu->iem.s.enmDefOpSize = IEMMODE_64BIT;
    17491749    else
    1750         pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_32BIT;
     1750        pVCpu->iem.s.enmEffOpSize = pVCpu->iem.s.enmDefOpSize = IEMMODE_32BIT;
    17511751
    17521752    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1753     uint8_t iCrReg = ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg;
    1754     if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK)
     1753    uint8_t iCrReg = ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg;
     1754    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK)
    17551755    {
    17561756        /* The lock prefix can be used to encode CR8 accesses on some CPUs. */
    1757         if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fMovCr8In32Bit)
     1757        if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fMovCr8In32Bit)
    17581758            return IEMOP_RAISE_INVALID_OPCODE(); /* #UD takes precedence over #GP(), see test. */
    17591759        iCrReg |= 8;
     
    17681768    IEMOP_HLP_DONE_DECODING();
    17691769
    1770     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Rd_Cd, (X86_MODRM_RM_MASK & bRm) | pIemCpu->uRexB, iCrReg);
     1770    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Rd_Cd, (X86_MODRM_RM_MASK & bRm) | pVCpu->iem.s.uRexB, iCrReg);
    17711771}
    17721772
     
    17791779    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    17801780    IEMOP_HLP_NO_LOCK_PREFIX();
    1781     if (pIemCpu->fPrefixes & IEM_OP_PRF_REX_R)
     1781    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REX_R)
    17821782        return IEMOP_RAISE_INVALID_OPCODE();
    17831783    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Rd_Dd,
    1784                                    (X86_MODRM_RM_MASK & bRm) | pIemCpu->uRexB,
     1784                                   (X86_MODRM_RM_MASK & bRm) | pVCpu->iem.s.uRexB,
    17851785                                   ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK));
    17861786}
     
    17931793    IEMOP_MNEMONIC("mov Cd,Rd");
    17941794    IEMOP_HLP_MIN_386();
    1795     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
    1796         pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_64BIT;
     1795    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
     1796        pVCpu->iem.s.enmEffOpSize = pVCpu->iem.s.enmDefOpSize = IEMMODE_64BIT;
    17971797    else
    1798         pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_32BIT;
     1798        pVCpu->iem.s.enmEffOpSize = pVCpu->iem.s.enmDefOpSize = IEMMODE_32BIT;
    17991799
    18001800    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1801     uint8_t iCrReg = ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg;
    1802     if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK)
     1801    uint8_t iCrReg = ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg;
     1802    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK)
    18031803    {
    18041804        /* The lock prefix can be used to encode CR8 accesses on some CPUs. */
    1805         if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fMovCr8In32Bit)
     1805        if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fMovCr8In32Bit)
    18061806            return IEMOP_RAISE_INVALID_OPCODE(); /* #UD takes precedence over #GP(), see test. */
    18071807        iCrReg |= 8;
     
    18161816    IEMOP_HLP_DONE_DECODING();
    18171817
    1818     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Cd_Rd, iCrReg, (X86_MODRM_RM_MASK & bRm) | pIemCpu->uRexB);
     1818    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Cd_Rd, iCrReg, (X86_MODRM_RM_MASK & bRm) | pVCpu->iem.s.uRexB);
    18191819}
    18201820
     
    18271827    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    18281828    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1829     if (pIemCpu->fPrefixes & IEM_OP_PRF_REX_R)
     1829    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REX_R)
    18301830        return IEMOP_RAISE_INVALID_OPCODE();
    18311831    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_mov_Dd_Rd,
    18321832                                   ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK),
    1833                                    (X86_MODRM_RM_MASK & bRm) | pIemCpu->uRexB);
     1833                                   (X86_MODRM_RM_MASK & bRm) | pVCpu->iem.s.uRexB);
    18341834}
    18351835
     
    18581858FNIEMOP_DEF(iemOp_movaps_Vps_Wps__movapd_Vpd_Wpd)
    18591859{
    1860     IEMOP_MNEMONIC(!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP) ? "movaps r,mr" : "movapd r,mr");
     1860    IEMOP_MNEMONIC(!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP) ? "movaps r,mr" : "movapd r,mr");
    18611861    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    18621862    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    18671867        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
    18681868        IEM_MC_BEGIN(0, 0);
    1869         if (!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP))
     1869        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP))
    18701870            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    18711871        else
    18721872            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    18731873        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    1874         IEM_MC_COPY_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg,
    1875                               (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     1874        IEM_MC_COPY_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     1875                              (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    18761876        IEM_MC_ADVANCE_RIP();
    18771877        IEM_MC_END();
     
    18881888        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    18891889        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES(); /** @todo check if this is delayed this long for REPZ/NZ */
    1890         if (!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP))
     1890        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP))
    18911891            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    18921892        else
     
    18941894        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    18951895
    1896         IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
    1897         IEM_MC_STORE_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, uSrc);
     1896        IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     1897        IEM_MC_STORE_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
    18981898
    18991899        IEM_MC_ADVANCE_RIP();
     
    19071907FNIEMOP_DEF(iemOp_movaps_Wps_Vps__movapd_Wpd_Vpd)
    19081908{
    1909     IEMOP_MNEMONIC(!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP) ? "movaps mr,r" : "movapd mr,r");
     1909    IEMOP_MNEMONIC(!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP) ? "movaps mr,r" : "movapd mr,r");
    19101910    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    19111911    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    19161916        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
    19171917        IEM_MC_BEGIN(0, 0);
    1918         if (!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP))
     1918        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP))
    19191919            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    19201920        else
    19211921            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    19221922        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    1923         IEM_MC_COPY_XREG_U128((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB,
    1924                               ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     1923        IEM_MC_COPY_XREG_U128((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
     1924                              ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    19251925        IEM_MC_ADVANCE_RIP();
    19261926        IEM_MC_END();
     
    19371937        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    19381938        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES(); /** @todo check if this is delayed this long for REPZ/NZ */
    1939         if (!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP))
     1939        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP))
    19401940            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    19411941        else
     
    19431943        IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    19441944
    1945         IEM_MC_FETCH_XREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    1946         IEM_MC_STORE_MEM_U128_ALIGN_SSE(pIemCpu->iEffSeg, GCPtrEffSrc, uSrc);
     1945        IEM_MC_FETCH_XREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1946        IEM_MC_STORE_MEM_U128_ALIGN_SSE(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    19471947
    19481948        IEM_MC_ADVANCE_RIP();
     
    19601960FNIEMOP_DEF(iemOp_movntps_Mps_Vps__movntpd_Mpd_Vpd)
    19611961{
    1962     IEMOP_MNEMONIC(!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP) ? "movntps mr,r" : "movntpd mr,r");
     1962    IEMOP_MNEMONIC(!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP) ? "movntps mr,r" : "movntpd mr,r");
    19631963    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    19641964    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     
    19731973        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    19741974        IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES(); /** @todo check if this is delayed this long for REPZ/NZ */
    1975         if (!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP))
     1975        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP))
    19761976            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
    19771977        else
     
    19791979        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    19801980
    1981         IEM_MC_FETCH_XREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    1982         IEM_MC_STORE_MEM_U128_ALIGN_SSE(pIemCpu->iEffSeg, GCPtrEffSrc, uSrc);
     1981        IEM_MC_FETCH_XREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1982        IEM_MC_STORE_MEM_U128_ALIGN_SSE(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    19831983
    19841984        IEM_MC_ADVANCE_RIP();
     
    20552055    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) \
    20562056    { \
    2057         switch (pIemCpu->enmEffOpSize) \
     2057        switch (pVCpu->iem.s.enmEffOpSize) \
    20582058        { \
    20592059            case IEMMODE_16BIT: \
     
    20612061                IEM_MC_LOCAL(uint16_t, u16Tmp); \
    20622062                a_Cnd { \
    2063                     IEM_MC_FETCH_GREG_U16(u16Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB); \
    2064                     IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Tmp); \
     2063                    IEM_MC_FETCH_GREG_U16(u16Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB); \
     2064                    IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16Tmp); \
    20652065                } IEM_MC_ENDIF(); \
    20662066                IEM_MC_ADVANCE_RIP(); \
     
    20722072                IEM_MC_LOCAL(uint32_t, u32Tmp); \
    20732073                a_Cnd { \
    2074                     IEM_MC_FETCH_GREG_U32(u32Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB); \
    2075                     IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp); \
     2074                    IEM_MC_FETCH_GREG_U32(u32Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB); \
     2075                    IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Tmp); \
    20762076                } IEM_MC_ELSE() { \
    2077                     IEM_MC_CLEAR_HIGH_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg); \
     2077                    IEM_MC_CLEAR_HIGH_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg); \
    20782078                } IEM_MC_ENDIF(); \
    20792079                IEM_MC_ADVANCE_RIP(); \
     
    20852085                IEM_MC_LOCAL(uint64_t, u64Tmp); \
    20862086                a_Cnd { \
    2087                     IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB); \
    2088                     IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp); \
     2087                    IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB); \
     2088                    IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Tmp); \
    20892089                } IEM_MC_ENDIF(); \
    20902090                IEM_MC_ADVANCE_RIP(); \
     
    20972097    else \
    20982098    { \
    2099         switch (pIemCpu->enmEffOpSize) \
     2099        switch (pVCpu->iem.s.enmEffOpSize) \
    21002100        { \
    21012101            case IEMMODE_16BIT: \
     
    21042104                IEM_MC_LOCAL(uint16_t, u16Tmp); \
    21052105                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    2106                 IEM_MC_FETCH_MEM_U16(u16Tmp, pIemCpu->iEffSeg, GCPtrEffSrc); \
     2106                IEM_MC_FETCH_MEM_U16(u16Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    21072107                a_Cnd { \
    2108                     IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Tmp); \
     2108                    IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16Tmp); \
    21092109                } IEM_MC_ENDIF(); \
    21102110                IEM_MC_ADVANCE_RIP(); \
     
    21172117                IEM_MC_LOCAL(uint32_t, u32Tmp); \
    21182118                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    2119                 IEM_MC_FETCH_MEM_U32(u32Tmp, pIemCpu->iEffSeg, GCPtrEffSrc); \
     2119                IEM_MC_FETCH_MEM_U32(u32Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    21202120                a_Cnd { \
    2121                     IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp); \
     2121                    IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Tmp); \
    21222122                } IEM_MC_ELSE() { \
    2123                     IEM_MC_CLEAR_HIGH_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg); \
     2123                    IEM_MC_CLEAR_HIGH_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg); \
    21242124                } IEM_MC_ENDIF(); \
    21252125                IEM_MC_ADVANCE_RIP(); \
     
    21322132                IEM_MC_LOCAL(uint64_t, u64Tmp); \
    21332133                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    2134                 IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrEffSrc); \
     2134                IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
    21352135                a_Cnd { \
    2136                     IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp); \
     2136                    IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Tmp); \
    21372137                } IEM_MC_ENDIF(); \
    21382138                IEM_MC_ADVANCE_RIP(); \
     
    23232323{
    23242324    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    2325     switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     2325    switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    23262326    {
    23272327        case IEM_OP_PRF_SIZE_OP: /* SSE */
     
    23372337                IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    23382338                IEM_MC_PREPARE_SSE_USAGE();
    2339                 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    2340                 IEM_MC_REF_XREG_U64_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     2339                IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     2340                IEM_MC_REF_XREG_U64_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    23412341                IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);
    23422342                IEM_MC_ADVANCE_RIP();
     
    23572357                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    23582358                IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    2359                 IEM_MC_FETCH_MEM_U64_ALIGN_U128(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
     2359                IEM_MC_FETCH_MEM_U64_ALIGN_U128(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    23602360
    23612361                IEM_MC_PREPARE_SSE_USAGE();
    2362                 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     2362                IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    23632363                IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);
    23642364
     
    24042404                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    24052405                IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    2406                 IEM_MC_FETCH_MEM_U32(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
     2406                IEM_MC_FETCH_MEM_U32(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    24072407
    24082408                IEM_MC_PREPARE_FPU_USAGE();
     
    24712471{
    24722472    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    2473     switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     2473    switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    24742474    {
    24752475        case IEM_OP_PRF_SIZE_OP: /* SSE */
     
    24852485                IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    24862486                IEM_MC_PREPARE_SSE_USAGE();
    2487                 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    2488                 IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     2487                IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     2488                IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    24892489                IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);
    24902490                IEM_MC_ADVANCE_RIP();
     
    25052505                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    25062506                IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    2507                 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc); /* Most CPUs probably only right high qword */
     2507                IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); /* Most CPUs probably only right high qword */
    25082508
    25092509                IEM_MC_PREPARE_SSE_USAGE();
    2510                 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     2510                IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    25112511                IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);
    25122512
     
    25522552                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    25532553                IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    2554                 IEM_MC_FETCH_MEM_U64(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
     2554                IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    25552555
    25562556                IEM_MC_PREPARE_FPU_USAGE();
     
    26162616{
    26172617    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    2618     switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     2618    switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    26192619    {
    26202620        case IEM_OP_PRF_SIZE_OP: /* SSE */
     
    26272627                IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    26282628                IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    2629                 if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     2629                if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    26302630                {
    26312631                    IEM_MC_LOCAL(uint64_t, u64Tmp);
    2632                     IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    2633                     IEM_MC_STORE_XREG_U64_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp);
     2632                    IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     2633                    IEM_MC_STORE_XREG_U64_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Tmp);
    26342634                }
    26352635                else
    26362636                {
    26372637                    IEM_MC_LOCAL(uint32_t, u32Tmp);
    2638                     IEM_MC_FETCH_GREG_U32(u32Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    2639                     IEM_MC_STORE_XREG_U32_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp);
     2638                    IEM_MC_FETCH_GREG_U32(u32Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     2639                    IEM_MC_STORE_XREG_U32_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Tmp);
    26402640                }
    26412641                IEM_MC_ADVANCE_RIP();
     
    26512651                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    26522652                IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    2653                 if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     2653                if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    26542654                {
    26552655                    IEM_MC_LOCAL(uint64_t, u64Tmp);
    2656                     IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
    2657                     IEM_MC_STORE_XREG_U64_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp);
     2656                    IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     2657                    IEM_MC_STORE_XREG_U64_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Tmp);
    26582658                }
    26592659                else
    26602660                {
    26612661                    IEM_MC_LOCAL(uint32_t, u32Tmp);
    2662                     IEM_MC_FETCH_MEM_U32(u32Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
    2663                     IEM_MC_STORE_XREG_U32_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp);
     2662                    IEM_MC_FETCH_MEM_U32(u32Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     2663                    IEM_MC_STORE_XREG_U32_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Tmp);
    26642664                }
    26652665                IEM_MC_ADVANCE_RIP();
     
    26782678                IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    26792679                IEM_MC_LOCAL(uint64_t, u64Tmp);
    2680                 if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    2681                     IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     2680                if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     2681                    IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    26822682                else
    2683                     IEM_MC_FETCH_GREG_U32_ZX_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     2683                    IEM_MC_FETCH_GREG_U32_ZX_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    26842684                IEM_MC_STORE_MREG_U64((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK, u64Tmp);
    26852685                IEM_MC_ADVANCE_RIP();
     
    26952695                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    26962696                IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    2697                 if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     2697                if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    26982698                {
    26992699                    IEM_MC_LOCAL(uint64_t, u64Tmp);
    2700                     IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
     2700                    IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    27012701                    IEM_MC_STORE_MREG_U64((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK, u64Tmp);
    27022702                }
     
    27042704                {
    27052705                    IEM_MC_LOCAL(uint32_t, u32Tmp);
    2706                     IEM_MC_FETCH_MEM_U32(u32Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
     2706                    IEM_MC_FETCH_MEM_U32(u32Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    27072707                    IEM_MC_STORE_MREG_U32_ZX_U64((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK, u32Tmp);
    27082708                }
     
    27232723    bool fAligned = false;
    27242724    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    2725     switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     2725    switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    27262726    {
    27272727        case IEM_OP_PRF_SIZE_OP: /* SSE aligned */
     
    27412741                IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    27422742                IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    2743                 IEM_MC_COPY_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg,
    2744                                       (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     2743                IEM_MC_COPY_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     2744                                      (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    27452745                IEM_MC_ADVANCE_RIP();
    27462746                IEM_MC_END();
     
    27602760                IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    27612761                if (fAligned)
    2762                     IEM_MC_FETCH_MEM_U128_ALIGN_SSE(u128Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
     2762                    IEM_MC_FETCH_MEM_U128_ALIGN_SSE(u128Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    27632763                else
    2764                     IEM_MC_FETCH_MEM_U128(u128Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
    2765                 IEM_MC_STORE_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u128Tmp);
     2764                    IEM_MC_FETCH_MEM_U128(u128Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     2765                IEM_MC_STORE_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u128Tmp);
    27662766
    27672767                IEM_MC_ADVANCE_RIP();
     
    28022802                IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    28032803                IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    2804                 IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
     2804                IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    28052805                IEM_MC_STORE_MREG_U64((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK, u64Tmp);
    28062806
     
    28202820{
    28212821    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    2822     switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     2822    switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    28232823    {
    28242824        case IEM_OP_PRF_SIZE_OP: /* SSE */
     
    28272827        {
    28282828            PFNIEMAIMPLMEDIAPSHUF pfnAImpl;
    2829             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     2829            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    28302830            {
    28312831                case IEM_OP_PRF_SIZE_OP:
     
    28572857                IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    28582858                IEM_MC_PREPARE_SSE_USAGE();
    2859                 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    2860                 IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     2859                IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     2860                IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    28612861                IEM_MC_CALL_SSE_AIMPL_3(pfnAImpl, pDst, pSrc, bEvilArg);
    28622862                IEM_MC_ADVANCE_RIP();
     
    28802880                IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    28812881
    2882                 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
     2882                IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    28832883                IEM_MC_PREPARE_SSE_USAGE();
    2884                 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     2884                IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    28852885                IEM_MC_CALL_SSE_AIMPL_3(pfnAImpl, pDst, pSrc, bEvilArg);
    28862886
     
    29302930                IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
    29312931
    2932                 IEM_MC_FETCH_MEM_U64(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
     2932                IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    29332933                IEM_MC_PREPARE_FPU_USAGE();
    29342934                IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
     
    29762976            return IEMOP_RAISE_INVALID_OPCODE();
    29772977        case 2:
    2978             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     2978            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    29792979            {
    29802980                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp12_psrlw_Nq_Ib, bRm);
     
    29832983            }
    29842984        case 4:
    2985             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     2985            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    29862986            {
    29872987                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp12_psraw_Nq_Ib, bRm);
     
    29902990            }
    29912991        case 6:
    2992             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     2992            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    29932993            {
    29942994                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp12_psllw_Nq_Ib, bRm);
     
    30313031            return IEMOP_RAISE_INVALID_OPCODE();
    30323032        case 2:
    3033             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     3033            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    30343034            {
    30353035                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp13_psrld_Nq_Ib, bRm);
     
    30383038            }
    30393039        case 4:
    3040             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     3040            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    30413041            {
    30423042                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp13_psrad_Nq_Ib, bRm);
     
    30453045            }
    30463046        case 6:
    3047             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     3047            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    30483048            {
    30493049                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp13_pslld_Nq_Ib, bRm);
     
    30863086            return IEMOP_RAISE_INVALID_OPCODE();
    30873087        case 2:
    3088             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     3088            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    30893089            {
    30903090                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp14_psrlq_Nq_Ib, bRm);
     
    30933093            }
    30943094        case 3:
    3095             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     3095            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    30963096            {
    30973097                case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp14_psrldq_Udq_Ib, bRm);
     
    30993099            }
    31003100        case 6:
    3101             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     3101            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    31023102            {
    31033103                case 0:                     return FNIEMOP_CALL_1(iemOp_Grp14_psllq_Nq_Ib, bRm);
     
    31063106            }
    31073107        case 7:
    3108             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     3108            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    31093109            {
    31103110                case IEM_OP_PRF_SIZE_OP:    return FNIEMOP_CALL_1(iemOp_Grp14_pslldq_Udq_Ib, bRm);
     
    31273127{
    31283128    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    3129     switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     3129    switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    31303130    {
    31313131        case IEM_OP_PRF_SIZE_OP: /* SSE */
     
    31413141                IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    31423142                IEM_MC_PREPARE_SSE_USAGE();
    3143                 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    3144                 IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     3143                IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     3144                IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    31453145                IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);
    31463146                IEM_MC_ADVANCE_RIP();
     
    31613161                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    31623162                IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    3163                 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
     3163                IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    31643164
    31653165                IEM_MC_PREPARE_SSE_USAGE();
    3166                 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     3166                IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    31673167                IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);
    31683168
     
    32063206                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    32073207                IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    3208                 IEM_MC_FETCH_MEM_U64(uSrc, pIemCpu->iEffSeg, GCPtrEffSrc);
     3208                IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    32093209
    32103210                IEM_MC_PREPARE_FPU_USAGE();
     
    32633263{
    32643264    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    3265     switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     3265    switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    32663266    {
    32673267        case IEM_OP_PRF_SIZE_OP: /* SSE */
     
    32743274                IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    32753275                IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    3276                 if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     3276                if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    32773277                {
    32783278                    IEM_MC_LOCAL(uint64_t, u64Tmp);
    3279                     IEM_MC_FETCH_XREG_U64(u64Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    3280                     IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Tmp);
     3279                    IEM_MC_FETCH_XREG_U64(u64Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     3280                    IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u64Tmp);
    32813281                }
    32823282                else
    32833283                {
    32843284                    IEM_MC_LOCAL(uint32_t, u32Tmp);
    3285                     IEM_MC_FETCH_XREG_U32(u32Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    3286                     IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Tmp);
     3285                    IEM_MC_FETCH_XREG_U32(u32Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     3286                    IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u32Tmp);
    32873287                }
    32883288                IEM_MC_ADVANCE_RIP();
     
    32983298                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    32993299                IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    3300                 if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     3300                if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    33013301                {
    33023302                    IEM_MC_LOCAL(uint64_t, u64Tmp);
    3303                     IEM_MC_FETCH_XREG_U64(u64Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    3304                     IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffSrc, u64Tmp);
     3303                    IEM_MC_FETCH_XREG_U64(u64Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     3304                    IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u64Tmp);
    33053305                }
    33063306                else
    33073307                {
    33083308                    IEM_MC_LOCAL(uint32_t, u32Tmp);
    3309                     IEM_MC_FETCH_XREG_U32(u32Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    3310                     IEM_MC_STORE_MEM_U32(pIemCpu->iEffSeg, GCPtrEffSrc, u32Tmp);
     3309                    IEM_MC_FETCH_XREG_U32(u32Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     3310                    IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u32Tmp);
    33113311                }
    33123312                IEM_MC_ADVANCE_RIP();
     
    33243324                IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    33253325                IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
    3326                 if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     3326                if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    33273327                {
    33283328                    IEM_MC_LOCAL(uint64_t, u64Tmp);
    33293329                    IEM_MC_FETCH_MREG_U64(u64Tmp, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
    3330                     IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Tmp);
     3330                    IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u64Tmp);
    33313331                }
    33323332                else
     
    33343334                    IEM_MC_LOCAL(uint32_t, u32Tmp);
    33353335                    IEM_MC_FETCH_MREG_U32(u32Tmp, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
    3336                     IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Tmp);
     3336                    IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u32Tmp);
    33373337                }
    33383338                IEM_MC_ADVANCE_RIP();
     
    33483348                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    33493349                IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
    3350                 if (pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     3350                if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    33513351                {
    33523352                    IEM_MC_LOCAL(uint64_t, u64Tmp);
    33533353                    IEM_MC_FETCH_MREG_U64(u64Tmp, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
    3354                     IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffSrc, u64Tmp);
     3354                    IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u64Tmp);
    33553355                }
    33563356                else
     
    33583358                    IEM_MC_LOCAL(uint32_t, u32Tmp);
    33593359                    IEM_MC_FETCH_MREG_U32(u32Tmp, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
    3360                     IEM_MC_STORE_MEM_U32(pIemCpu->iEffSeg, GCPtrEffSrc, u32Tmp);
     3360                    IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u32Tmp);
    33613361                }
    33623362                IEM_MC_ADVANCE_RIP();
     
    33763376    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    33773377    bool fAligned = false;
    3378     switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     3378    switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    33793379    {
    33803380        case IEM_OP_PRF_SIZE_OP: /* SSE aligned */
     
    33943394                IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    33953395                IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    3396                 IEM_MC_COPY_XREG_U128((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB,
    3397                                       ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     3396                IEM_MC_COPY_XREG_U128((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
     3397                                      ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    33983398                IEM_MC_ADVANCE_RIP();
    33993399                IEM_MC_END();
     
    34133413                IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    34143414
    3415                 IEM_MC_FETCH_XREG_U128(u128Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     3415                IEM_MC_FETCH_XREG_U128(u128Tmp, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    34163416                if (fAligned)
    3417                     IEM_MC_STORE_MEM_U128_ALIGN_SSE(pIemCpu->iEffSeg, GCPtrEffSrc, u128Tmp);
     3417                    IEM_MC_STORE_MEM_U128_ALIGN_SSE(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u128Tmp);
    34183418                else
    3419                     IEM_MC_STORE_MEM_U128(pIemCpu->iEffSeg, GCPtrEffSrc, u128Tmp);
     3419                    IEM_MC_STORE_MEM_U128(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u128Tmp);
    34203420
    34213421                IEM_MC_ADVANCE_RIP();
     
    34593459
    34603460                IEM_MC_FETCH_MREG_U64(u64Tmp, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
    3461                 IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffSrc, u64Tmp);
     3461                IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, u64Tmp);
    34623462
    34633463                IEM_MC_ADVANCE_RIP();
     
    34793479    IEMOP_HLP_MIN_386();
    34803480    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3481     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3481    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    34823482    {
    34833483        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    35153515    IEMOP_HLP_MIN_386();
    35163516    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3517     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3517    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    35183518    {
    35193519        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    35513551    IEMOP_HLP_MIN_386();
    35523552    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3553     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3553    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    35543554    {
    35553555        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    35873587    IEMOP_HLP_MIN_386();
    35883588    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3589     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3589    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    35903590    {
    35913591        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    36233623    IEMOP_HLP_MIN_386();
    36243624    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3625     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3625    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    36263626    {
    36273627        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    36593659    IEMOP_HLP_MIN_386();
    36603660    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3661     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3661    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    36623662    {
    36633663        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    36953695    IEMOP_HLP_MIN_386();
    36963696    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3697     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3697    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    36983698    {
    36993699        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    37313731    IEMOP_HLP_MIN_386();
    37323732    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3733     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3733    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    37343734    {
    37353735        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    37673767    IEMOP_HLP_MIN_386();
    37683768    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3769     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3769    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    37703770    {
    37713771        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    38033803    IEMOP_HLP_MIN_386();
    38043804    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3805     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3805    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    38063806    {
    38073807        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    38393839    IEMOP_HLP_MIN_386();
    38403840    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3841     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3841    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    38423842    {
    38433843        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    38753875    IEMOP_HLP_MIN_386();
    38763876    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3877     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3877    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    38783878    {
    38793879        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    39113911    IEMOP_HLP_MIN_386();
    39123912    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3913     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3913    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    39143914    {
    39153915        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    39473947    IEMOP_HLP_MIN_386();
    39483948    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3949     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3949    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    39503950    {
    39513951        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    39833983    IEMOP_HLP_MIN_386();
    39843984    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    3985     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     3985    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    39863986    {
    39873987        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    40194019    IEMOP_HLP_MIN_386();
    40204020    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    4021     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     4021    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    40224022    {
    40234023        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
     
    40654065        IEM_MC_BEGIN(0, 0);
    40664066        IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
    4067             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4067            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    40684068        } IEM_MC_ELSE() {
    4069             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4069            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    40704070        } IEM_MC_ENDIF();
    40714071        IEM_MC_ADVANCE_RIP();
     
    40794079        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    40804080        IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
    4081             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4081            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    40824082        } IEM_MC_ELSE() {
    4083             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4083            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    40844084        } IEM_MC_ENDIF();
    40854085        IEM_MC_ADVANCE_RIP();
     
    41064106        IEM_MC_BEGIN(0, 0);
    41074107        IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
    4108             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4108            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    41094109        } IEM_MC_ELSE() {
    4110             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4110            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    41114111        } IEM_MC_ENDIF();
    41124112        IEM_MC_ADVANCE_RIP();
     
    41204120        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    41214121        IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
    4122             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4122            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    41234123        } IEM_MC_ELSE() {
    4124             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4124            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    41254125        } IEM_MC_ENDIF();
    41264126        IEM_MC_ADVANCE_RIP();
     
    41474147        IEM_MC_BEGIN(0, 0);
    41484148        IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
    4149             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4149            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    41504150        } IEM_MC_ELSE() {
    4151             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4151            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    41524152        } IEM_MC_ENDIF();
    41534153        IEM_MC_ADVANCE_RIP();
     
    41614161        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    41624162        IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
    4163             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4163            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    41644164        } IEM_MC_ELSE() {
    4165             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4165            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    41664166        } IEM_MC_ENDIF();
    41674167        IEM_MC_ADVANCE_RIP();
     
    41884188        IEM_MC_BEGIN(0, 0);
    41894189        IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
    4190             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4190            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    41914191        } IEM_MC_ELSE() {
    4192             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4192            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    41934193        } IEM_MC_ENDIF();
    41944194        IEM_MC_ADVANCE_RIP();
     
    42024202        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    42034203        IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
    4204             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4204            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    42054205        } IEM_MC_ELSE() {
    4206             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4206            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    42074207        } IEM_MC_ENDIF();
    42084208        IEM_MC_ADVANCE_RIP();
     
    42294229        IEM_MC_BEGIN(0, 0);
    42304230        IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
    4231             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4231            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    42324232        } IEM_MC_ELSE() {
    4233             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4233            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    42344234        } IEM_MC_ENDIF();
    42354235        IEM_MC_ADVANCE_RIP();
     
    42434243        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    42444244        IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
    4245             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4245            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    42464246        } IEM_MC_ELSE() {
    4247             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4247            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    42484248        } IEM_MC_ENDIF();
    42494249        IEM_MC_ADVANCE_RIP();
     
    42704270        IEM_MC_BEGIN(0, 0);
    42714271        IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
    4272             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4272            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    42734273        } IEM_MC_ELSE() {
    4274             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4274            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    42754275        } IEM_MC_ENDIF();
    42764276        IEM_MC_ADVANCE_RIP();
     
    42844284        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    42854285        IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
    4286             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4286            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    42874287        } IEM_MC_ELSE() {
    4288             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4288            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    42894289        } IEM_MC_ENDIF();
    42904290        IEM_MC_ADVANCE_RIP();
     
    43114311        IEM_MC_BEGIN(0, 0);
    43124312        IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
    4313             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4313            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    43144314        } IEM_MC_ELSE() {
    4315             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4315            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    43164316        } IEM_MC_ENDIF();
    43174317        IEM_MC_ADVANCE_RIP();
     
    43254325        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    43264326        IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
    4327             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4327            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    43284328        } IEM_MC_ELSE() {
    4329             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4329            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    43304330        } IEM_MC_ENDIF();
    43314331        IEM_MC_ADVANCE_RIP();
     
    43524352        IEM_MC_BEGIN(0, 0);
    43534353        IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
    4354             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4354            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    43554355        } IEM_MC_ELSE() {
    4356             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4356            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    43574357        } IEM_MC_ENDIF();
    43584358        IEM_MC_ADVANCE_RIP();
     
    43664366        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    43674367        IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
    4368             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4368            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    43694369        } IEM_MC_ELSE() {
    4370             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4370            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    43714371        } IEM_MC_ENDIF();
    43724372        IEM_MC_ADVANCE_RIP();
     
    43934393        IEM_MC_BEGIN(0, 0);
    43944394        IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
    4395             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4395            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    43964396        } IEM_MC_ELSE() {
    4397             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4397            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    43984398        } IEM_MC_ENDIF();
    43994399        IEM_MC_ADVANCE_RIP();
     
    44074407        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    44084408        IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
    4409             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4409            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    44104410        } IEM_MC_ELSE() {
    4411             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4411            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    44124412        } IEM_MC_ENDIF();
    44134413        IEM_MC_ADVANCE_RIP();
     
    44344434        IEM_MC_BEGIN(0, 0);
    44354435        IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
    4436             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4436            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    44374437        } IEM_MC_ELSE() {
    4438             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4438            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    44394439        } IEM_MC_ENDIF();
    44404440        IEM_MC_ADVANCE_RIP();
     
    44484448        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    44494449        IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
    4450             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4450            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    44514451        } IEM_MC_ELSE() {
    4452             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4452            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    44534453        } IEM_MC_ENDIF();
    44544454        IEM_MC_ADVANCE_RIP();
     
    44754475        IEM_MC_BEGIN(0, 0);
    44764476        IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
    4477             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4477            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    44784478        } IEM_MC_ELSE() {
    4479             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4479            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    44804480        } IEM_MC_ENDIF();
    44814481        IEM_MC_ADVANCE_RIP();
     
    44894489        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    44904490        IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
    4491             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4491            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    44924492        } IEM_MC_ELSE() {
    4493             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4493            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    44944494        } IEM_MC_ENDIF();
    44954495        IEM_MC_ADVANCE_RIP();
     
    45164516        IEM_MC_BEGIN(0, 0);
    45174517        IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
    4518             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4518            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    45194519        } IEM_MC_ELSE() {
    4520             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4520            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    45214521        } IEM_MC_ENDIF();
    45224522        IEM_MC_ADVANCE_RIP();
     
    45304530        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    45314531        IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
    4532             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4532            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    45334533        } IEM_MC_ELSE() {
    4534             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4534            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    45354535        } IEM_MC_ENDIF();
    45364536        IEM_MC_ADVANCE_RIP();
     
    45574557        IEM_MC_BEGIN(0, 0);
    45584558        IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
    4559             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4559            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    45604560        } IEM_MC_ELSE() {
    4561             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4561            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    45624562        } IEM_MC_ENDIF();
    45634563        IEM_MC_ADVANCE_RIP();
     
    45714571        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    45724572        IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
    4573             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4573            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    45744574        } IEM_MC_ELSE() {
    4575             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4575            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    45764576        } IEM_MC_ENDIF();
    45774577        IEM_MC_ADVANCE_RIP();
     
    45984598        IEM_MC_BEGIN(0, 0);
    45994599        IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
    4600             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4600            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    46014601        } IEM_MC_ELSE() {
    4602             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4602            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    46034603        } IEM_MC_ENDIF();
    46044604        IEM_MC_ADVANCE_RIP();
     
    46124612        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    46134613        IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
    4614             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4614            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    46154615        } IEM_MC_ELSE() {
    4616             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4616            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    46174617        } IEM_MC_ENDIF();
    46184618        IEM_MC_ADVANCE_RIP();
     
    46394639        IEM_MC_BEGIN(0, 0);
    46404640        IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
    4641             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4641            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    46424642        } IEM_MC_ELSE() {
    4643             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4643            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    46444644        } IEM_MC_ENDIF();
    46454645        IEM_MC_ADVANCE_RIP();
     
    46534653        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    46544654        IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
    4655             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4655            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    46564656        } IEM_MC_ELSE() {
    4657             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4657            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    46584658        } IEM_MC_ENDIF();
    46594659        IEM_MC_ADVANCE_RIP();
     
    46804680        IEM_MC_BEGIN(0, 0);
    46814681        IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
    4682             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 0);
     4682            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 0);
    46834683        } IEM_MC_ELSE() {
    4684             IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, 1);
     4684            IEM_MC_STORE_GREG_U8_CONST((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, 1);
    46854685        } IEM_MC_ENDIF();
    46864686        IEM_MC_ADVANCE_RIP();
     
    46944694        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    46954695        IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
    4696             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 0);
     4696            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    46974697        } IEM_MC_ELSE() {
    4698             IEM_MC_STORE_MEM_U8_CONST(pIemCpu->iEffSeg, GCPtrEffDst, 1);
     4698            IEM_MC_STORE_MEM_U8_CONST(pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1);
    46994699        } IEM_MC_ENDIF();
    47004700        IEM_MC_ADVANCE_RIP();
     
    47154715    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    47164716
    4717     switch (pIemCpu->enmEffOpSize)
     4717    switch (pVCpu->iem.s.enmEffOpSize)
    47184718    {
    47194719        case IEMMODE_16BIT:
     
    47654765    IEMOP_HLP_MIN_386();
    47664766    IEMOP_HLP_NO_LOCK_PREFIX();
    4767     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_FS, pIemCpu->enmEffOpSize);
     4767    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_FS, pVCpu->iem.s.enmEffOpSize);
    47684768}
    47694769
     
    47924792        /* register destination. */
    47934793        IEMOP_HLP_NO_LOCK_PREFIX();
    4794         switch (pIemCpu->enmEffOpSize)
     4794        switch (pVCpu->iem.s.enmEffOpSize)
    47954795        {
    47964796            case IEMMODE_16BIT:
     
    48004800                IEM_MC_ARG(uint32_t *,      pEFlags,                2);
    48014801
    4802                 IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     4802                IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    48034803                IEM_MC_AND_LOCAL_U16(u16Src, 0xf);
    4804                 IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4804                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    48054805                IEM_MC_REF_EFLAGS(pEFlags);
    48064806                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
     
    48164816                IEM_MC_ARG(uint32_t *,      pEFlags,                2);
    48174817
    4818                 IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     4818                IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    48194819                IEM_MC_AND_LOCAL_U32(u32Src, 0x1f);
    4820                 IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4820                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    48214821                IEM_MC_REF_EFLAGS(pEFlags);
    48224822                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
     
    48334833                IEM_MC_ARG(uint32_t *,      pEFlags,                2);
    48344834
    4835                 IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     4835                IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    48364836                IEM_MC_AND_LOCAL_U64(u64Src, 0x3f);
    4837                 IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4837                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    48384838                IEM_MC_REF_EFLAGS(pEFlags);
    48394839                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
     
    48624862
    48634863        /** @todo test negative bit offsets! */
    4864         switch (pIemCpu->enmEffOpSize)
     4864        switch (pVCpu->iem.s.enmEffOpSize)
    48654865        {
    48664866            case IEMMODE_16BIT:
     
    48734873
    48744874                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    4875                 IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     4875                IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    48764876                IEM_MC_ASSIGN(i16AddrAdj, u16Src);
    48774877                IEM_MC_AND_ARG_U16(u16Src, 0x0f);
     
    48814881                IEM_MC_FETCH_EFLAGS(EFlags);
    48824882
    4883                 IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
    4884                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     4883                IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
     4884                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    48854885                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
    48864886                else
     
    49024902
    49034903                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    4904                 IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     4904                IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    49054905                IEM_MC_ASSIGN(i32AddrAdj, u32Src);
    49064906                IEM_MC_AND_ARG_U32(u32Src, 0x1f);
     
    49104910                IEM_MC_FETCH_EFLAGS(EFlags);
    49114911
    4912                 IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
    4913                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     4912                IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
     4913                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    49144914                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
    49154915                else
     
    49314931
    49324932                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    4933                 IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     4933                IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    49344934                IEM_MC_ASSIGN(i64AddrAdj, u64Src);
    49354935                IEM_MC_AND_ARG_U64(u64Src, 0x3f);
     
    49394939                IEM_MC_FETCH_EFLAGS(EFlags);
    49404940
    4941                 IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
    4942                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     4941                IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
     4942                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    49434943                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
    49444944                else
     
    49804980        IEMOP_HLP_NO_LOCK_PREFIX();
    49814981
    4982         switch (pIemCpu->enmEffOpSize)
     4982        switch (pVCpu->iem.s.enmEffOpSize)
    49834983        {
    49844984            case IEMMODE_16BIT:
     
    49894989                IEM_MC_ARG(uint32_t *,      pEFlags,                3);
    49904990
    4991                 IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    4992                 IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     4991                IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     4992                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    49934993                IEM_MC_REF_EFLAGS(pEFlags);
    49944994                IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU16, pu16Dst, u16Src, cShiftArg, pEFlags);
     
    50055005                IEM_MC_ARG(uint32_t *,      pEFlags,                3);
    50065006
    5007                 IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    5008                 IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     5007                IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     5008                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    50095009                IEM_MC_REF_EFLAGS(pEFlags);
    50105010                IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU32, pu32Dst, u32Src, cShiftArg, pEFlags);
     
    50225022                IEM_MC_ARG(uint32_t *,      pEFlags,                3);
    50235023
    5024                 IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    5025                 IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     5024                IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     5025                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    50265026                IEM_MC_REF_EFLAGS(pEFlags);
    50275027                IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU64, pu64Dst, u64Src, cShiftArg, pEFlags);
     
    50385038        IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
    50395039
    5040         switch (pIemCpu->enmEffOpSize)
     5040        switch (pVCpu->iem.s.enmEffOpSize)
    50415041        {
    50425042            case IEMMODE_16BIT:
     
    50515051                uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
    50525052                IEM_MC_ASSIGN(cShiftArg, cShift);
    5053                 IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     5053                IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    50545054                IEM_MC_FETCH_EFLAGS(EFlags);
    5055                 IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
     5055                IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    50565056                IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU16, pu16Dst, u16Src, cShiftArg, pEFlags);
    50575057
     
    50735073                uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
    50745074                IEM_MC_ASSIGN(cShiftArg, cShift);
    5075                 IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     5075                IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    50765076                IEM_MC_FETCH_EFLAGS(EFlags);
    5077                 IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
     5077                IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    50785078                IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU32, pu32Dst, u32Src, cShiftArg, pEFlags);
    50795079
     
    50955095                uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
    50965096                IEM_MC_ASSIGN(cShiftArg, cShift);
    5097                 IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     5097                IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    50985098                IEM_MC_FETCH_EFLAGS(EFlags);
    5099                 IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
     5099                IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    51005100                IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU64, pu64Dst, u64Src, cShiftArg, pEFlags);
    51015101
     
    51255125        IEMOP_HLP_NO_LOCK_PREFIX();
    51265126
    5127         switch (pIemCpu->enmEffOpSize)
     5127        switch (pVCpu->iem.s.enmEffOpSize)
    51285128        {
    51295129            case IEMMODE_16BIT:
     
    51345134                IEM_MC_ARG(uint32_t *,      pEFlags,                3);
    51355135
    5136                 IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    5137                 IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     5136                IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     5137                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    51385138                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    51395139                IEM_MC_REF_EFLAGS(pEFlags);
     
    51515151                IEM_MC_ARG(uint32_t *,      pEFlags,                3);
    51525152
    5153                 IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    5154                 IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     5153                IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     5154                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    51555155                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    51565156                IEM_MC_REF_EFLAGS(pEFlags);
     
    51695169                IEM_MC_ARG(uint32_t *,      pEFlags,                3);
    51705170
    5171                 IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    5172                 IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     5171                IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     5172                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    51735173                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    51745174                IEM_MC_REF_EFLAGS(pEFlags);
     
    51865186        IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo too early? */
    51875187
    5188         switch (pIemCpu->enmEffOpSize)
     5188        switch (pVCpu->iem.s.enmEffOpSize)
    51895189        {
    51905190            case IEMMODE_16BIT:
     
    51975197
    51985198                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    5199                 IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     5199                IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    52005200                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    52015201                IEM_MC_FETCH_EFLAGS(EFlags);
    5202                 IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
     5202                IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    52035203                IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU16, pu16Dst, u16Src, cShiftArg, pEFlags);
    52045204
     
    52185218
    52195219                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    5220                 IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     5220                IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    52215221                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    52225222                IEM_MC_FETCH_EFLAGS(EFlags);
    5223                 IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
     5223                IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    52245224                IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU32, pu32Dst, u32Src, cShiftArg, pEFlags);
    52255225
     
    52395239
    52405240                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    5241                 IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     5241                IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    52425242                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    52435243                IEM_MC_FETCH_EFLAGS(EFlags);
    5244                 IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
     5244                IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    52455245                IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnNormalU64, pu64Dst, u64Src, cShiftArg, pEFlags);
    52465246
     
    52925292    IEMOP_HLP_MIN_386();
    52935293    IEMOP_HLP_NO_LOCK_PREFIX();
    5294     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_GS, pIemCpu->enmEffOpSize);
     5294    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_GS, pVCpu->iem.s.enmEffOpSize);
    52955295}
    52965296
     
    53325332{
    53335333    IEMOP_MNEMONIC("fxsave m512");
    5334     if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fFxSaveRstor)
     5334    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fFxSaveRstor)
    53355335        return IEMOP_RAISE_INVALID_OPCODE();
    53365336
     
    53385338    IEM_MC_ARG(uint8_t,         iEffSeg,                                 0);
    53395339    IEM_MC_ARG(RTGCPTR,         GCPtrEff,                                1);
    5340     IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 2);
     5340    IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pVCpu->iem.s.enmEffOpSize, 2);
    53415341    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
    53425342    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5343     IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
     5343    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    53445344    IEM_MC_CALL_CIMPL_3(iemCImpl_fxsave, iEffSeg, GCPtrEff, enmEffOpSize);
    53455345    IEM_MC_END();
     
    53525352{
    53535353    IEMOP_MNEMONIC("fxrstor m512");
    5354     if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fFxSaveRstor)
     5354    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fFxSaveRstor)
    53555355        return IEMOP_RAISE_INVALID_OPCODE();
    53565356
     
    53585358    IEM_MC_ARG(uint8_t,         iEffSeg,                                 0);
    53595359    IEM_MC_ARG(RTGCPTR,         GCPtrEff,                                1);
    5360     IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 2);
     5360    IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pVCpu->iem.s.enmEffOpSize, 2);
    53615361    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
    53625362    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5363     IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
     5363    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    53645364    IEM_MC_CALL_CIMPL_3(iemCImpl_fxrstor, iEffSeg, GCPtrEff, enmEffOpSize);
    53655365    IEM_MC_END();
     
    53925392    IEMOP_MNEMONIC("lfence");
    53935393    IEMOP_HLP_NO_LOCK_PREFIX();
    5394     if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse2)
     5394    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse2)
    53955395        return IEMOP_RAISE_INVALID_OPCODE();
    53965396
    53975397    IEM_MC_BEGIN(0, 0);
    5398     if (IEM_GET_HOST_CPU_FEATURES(pIemCpu)->fSse2)
     5398    if (IEM_GET_HOST_CPU_FEATURES(pVCpu)->fSse2)
    53995399        IEM_MC_CALL_VOID_AIMPL_0(iemAImpl_lfence);
    54005400    else
     
    54115411    IEMOP_MNEMONIC("mfence");
    54125412    IEMOP_HLP_NO_LOCK_PREFIX();
    5413     if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse2)
     5413    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse2)
    54145414        return IEMOP_RAISE_INVALID_OPCODE();
    54155415
    54165416    IEM_MC_BEGIN(0, 0);
    5417     if (IEM_GET_HOST_CPU_FEATURES(pIemCpu)->fSse2)
     5417    if (IEM_GET_HOST_CPU_FEATURES(pVCpu)->fSse2)
    54185418        IEM_MC_CALL_VOID_AIMPL_0(iemAImpl_mfence);
    54195419    else
     
    54305430    IEMOP_MNEMONIC("sfence");
    54315431    IEMOP_HLP_NO_LOCK_PREFIX();
    5432     if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse2)
     5432    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse2)
    54335433        return IEMOP_RAISE_INVALID_OPCODE();
    54345434
    54355435    IEM_MC_BEGIN(0, 0);
    5436     if (IEM_GET_HOST_CPU_FEATURES(pIemCpu)->fSse2)
     5436    if (IEM_GET_HOST_CPU_FEATURES(pVCpu)->fSse2)
    54375437        IEM_MC_CALL_VOID_AIMPL_0(iemAImpl_sfence);
    54385438    else
     
    54795479    else
    54805480    {
    5481         switch (pIemCpu->fPrefixes & (IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_LOCK))
     5481        switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_LOCK))
    54825482        {
    54835483            case 0:
     
    55445544        IEM_MC_ARG(uint32_t *,      pEFlags,                3);
    55455545
    5546         IEM_MC_FETCH_GREG_U8(u8Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    5547         IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     5546        IEM_MC_FETCH_GREG_U8(u8Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     5547        IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    55485548        IEM_MC_REF_GREG_U8(pu8Al, X86_GREG_xAX);
    55495549        IEM_MC_REF_EFLAGS(pEFlags);
    5550         if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     5550        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    55515551            IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u8, pu8Dst, pu8Al, u8Src, pEFlags);
    55525552        else
     
    55685568        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    55695569        IEMOP_HLP_DONE_DECODING();
    5570         IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
    5571         IEM_MC_FETCH_GREG_U8(u8Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     5570        IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
     5571        IEM_MC_FETCH_GREG_U8(u8Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    55725572        IEM_MC_FETCH_GREG_U8(u8Al, X86_GREG_xAX);
    55735573        IEM_MC_FETCH_EFLAGS(EFlags);
    55745574        IEM_MC_REF_LOCAL(pu8Al, u8Al);
    5575         if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     5575        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    55765576            IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u8, pu8Dst, pu8Al, u8Src, pEFlags);
    55775577        else
     
    55975597    {
    55985598        IEMOP_HLP_DONE_DECODING();
    5599         switch (pIemCpu->enmEffOpSize)
     5599        switch (pVCpu->iem.s.enmEffOpSize)
    56005600        {
    56015601            case IEMMODE_16BIT:
     
    56065606                IEM_MC_ARG(uint32_t *,      pEFlags,                3);
    56075607
    5608                 IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    5609                 IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     5608                IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     5609                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    56105610                IEM_MC_REF_GREG_U16(pu16Ax, X86_GREG_xAX);
    56115611                IEM_MC_REF_EFLAGS(pEFlags);
    5612                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     5612                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    56135613                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u16, pu16Dst, pu16Ax, u16Src, pEFlags);
    56145614                else
     
    56265626                IEM_MC_ARG(uint32_t *,      pEFlags,                3);
    56275627
    5628                 IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    5629                 IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     5628                IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     5629                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    56305630                IEM_MC_REF_GREG_U32(pu32Eax, X86_GREG_xAX);
    56315631                IEM_MC_REF_EFLAGS(pEFlags);
    5632                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     5632                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    56335633                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u32, pu32Dst, pu32Eax, u32Src, pEFlags);
    56345634                else
     
    56525652                IEM_MC_ARG(uint32_t *,      pEFlags,                3);
    56535653
    5654                 IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     5654                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    56555655                IEM_MC_REF_GREG_U64(pu64Rax, X86_GREG_xAX);
    56565656                IEM_MC_REF_EFLAGS(pEFlags);
    56575657#ifdef RT_ARCH_X86
    5658                 IEM_MC_REF_GREG_U64(pu64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    5659                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     5658                IEM_MC_REF_GREG_U64(pu64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     5659                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    56605660                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64, pu64Dst, pu64Rax, pu64Src, pEFlags);
    56615661                else
    56625662                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64_locked, pu64Dst, pu64Rax, pu64Src, pEFlags);
    56635663#else
    5664                 IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    5665                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     5664                IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     5665                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    56665666                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64, pu64Dst, pu64Rax, u64Src, pEFlags);
    56675667                else
     
    56785678    else
    56795679    {
    5680         switch (pIemCpu->enmEffOpSize)
     5680        switch (pVCpu->iem.s.enmEffOpSize)
    56815681        {
    56825682            case IEMMODE_16BIT:
     
    56915691                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    56925692                IEMOP_HLP_DONE_DECODING();
    5693                 IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
    5694                 IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     5693                IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
     5694                IEM_MC_FETCH_GREG_U16(u16Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    56955695                IEM_MC_FETCH_GREG_U16(u16Ax, X86_GREG_xAX);
    56965696                IEM_MC_FETCH_EFLAGS(EFlags);
    56975697                IEM_MC_REF_LOCAL(pu16Ax, u16Ax);
    5698                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     5698                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    56995699                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u16, pu16Dst, pu16Ax, u16Src, pEFlags);
    57005700                else
     
    57195719                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    57205720                IEMOP_HLP_DONE_DECODING();
    5721                 IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
    5722                 IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     5721                IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
     5722                IEM_MC_FETCH_GREG_U32(u32Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    57235723                IEM_MC_FETCH_GREG_U32(u32Eax, X86_GREG_xAX);
    57245724                IEM_MC_FETCH_EFLAGS(EFlags);
    57255725                IEM_MC_REF_LOCAL(pu32Eax, u32Eax);
    5726                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     5726                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    57275727                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u32, pu32Dst, pu32Eax, u32Src, pEFlags);
    57285728                else
     
    57515751                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    57525752                IEMOP_HLP_DONE_DECODING();
    5753                 IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0);
     5753                IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
    57545754                IEM_MC_FETCH_GREG_U64(u64Rax, X86_GREG_xAX);
    57555755                IEM_MC_FETCH_EFLAGS(EFlags);
    57565756                IEM_MC_REF_LOCAL(pu64Rax, u64Rax);
    57575757#ifdef RT_ARCH_X86
    5758                 IEM_MC_REF_GREG_U64(pu64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    5759                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     5758                IEM_MC_REF_GREG_U64(pu64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     5759                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    57605760                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64, pu64Dst, pu64Rax, pu64Src, pEFlags);
    57615761                else
    57625762                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64_locked, pu64Dst, pu64Rax, pu64Src, pEFlags);
    57635763#else
    5764                 IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    5765                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     5764                IEM_MC_FETCH_GREG_U64(u64Src, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     5765                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    57665766                    IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg_u64, pu64Dst, pu64Rax, u64Src, pEFlags);
    57675767                else
     
    57855785{
    57865786    Assert((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT)); /* Caller checks this */
    5787     uint8_t const iGReg = ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg;
    5788 
    5789     switch (pIemCpu->enmEffOpSize)
     5787    uint8_t const iGReg = ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg;
     5788
     5789    switch (pVCpu->iem.s.enmEffOpSize)
    57905790    {
    57915791        case IEMMODE_16BIT:
     
    57955795            IEM_MC_ARG_CONST(uint8_t,   iSegRegArg,/*=*/iSegReg,                 2);
    57965796            IEM_MC_ARG_CONST(uint8_t,   iGRegArg,  /*=*/iGReg,                   3);
    5797             IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 4);
     5797            IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pVCpu->iem.s.enmEffOpSize, 4);
    57985798            IEM_MC_LOCAL(RTGCPTR,       GCPtrEff);
    57995799            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
    58005800            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5801             IEM_MC_FETCH_MEM_U16(offSeg, pIemCpu->iEffSeg, GCPtrEff);
    5802             IEM_MC_FETCH_MEM_U16_DISP(uSel, pIemCpu->iEffSeg, GCPtrEff, 2);
     5801            IEM_MC_FETCH_MEM_U16(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEff);
     5802            IEM_MC_FETCH_MEM_U16_DISP(uSel, pVCpu->iem.s.iEffSeg, GCPtrEff, 2);
    58035803            IEM_MC_CALL_CIMPL_5(iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
    58045804            IEM_MC_END();
     
    58115811            IEM_MC_ARG_CONST(uint8_t,   iSegRegArg,/*=*/iSegReg,                 2);
    58125812            IEM_MC_ARG_CONST(uint8_t,   iGRegArg,  /*=*/iGReg,                   3);
    5813             IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 4);
     5813            IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pVCpu->iem.s.enmEffOpSize, 4);
    58145814            IEM_MC_LOCAL(RTGCPTR,       GCPtrEff);
    58155815            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
    58165816            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5817             IEM_MC_FETCH_MEM_U32(offSeg, pIemCpu->iEffSeg, GCPtrEff);
    5818             IEM_MC_FETCH_MEM_U16_DISP(uSel, pIemCpu->iEffSeg, GCPtrEff, 4);
     5817            IEM_MC_FETCH_MEM_U32(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEff);
     5818            IEM_MC_FETCH_MEM_U16_DISP(uSel, pVCpu->iem.s.iEffSeg, GCPtrEff, 4);
    58195819            IEM_MC_CALL_CIMPL_5(iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
    58205820            IEM_MC_END();
     
    58275827            IEM_MC_ARG_CONST(uint8_t,   iSegRegArg,/*=*/iSegReg,                 2);
    58285828            IEM_MC_ARG_CONST(uint8_t,   iGRegArg,  /*=*/iGReg,                   3);
    5829             IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pIemCpu->enmEffOpSize, 4);
     5829            IEM_MC_ARG_CONST(IEMMODE,   enmEffOpSize,/*=*/pVCpu->iem.s.enmEffOpSize, 4);
    58305830            IEM_MC_LOCAL(RTGCPTR,       GCPtrEff);
    58315831            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
    58325832            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    5833             if (IEM_IS_GUEST_CPU_AMD(pIemCpu)) /** @todo testcase: rev 3.15 of the amd manuals claims it only loads a 32-bit greg. */
    5834                 IEM_MC_FETCH_MEM_U32_SX_U64(offSeg, pIemCpu->iEffSeg, GCPtrEff);
     5833            if (IEM_IS_GUEST_CPU_AMD(pVCpu)) /** @todo testcase: rev 3.15 of the amd manuals claims it only loads a 32-bit greg. */
     5834                IEM_MC_FETCH_MEM_U32_SX_U64(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEff);
    58355835            else
    5836                 IEM_MC_FETCH_MEM_U64(offSeg, pIemCpu->iEffSeg, GCPtrEff);
    5837             IEM_MC_FETCH_MEM_U16_DISP(uSel, pIemCpu->iEffSeg, GCPtrEff, 8);
     5836                IEM_MC_FETCH_MEM_U64(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEff);
     5837            IEM_MC_FETCH_MEM_U16_DISP(uSel, pVCpu->iem.s.iEffSeg, GCPtrEff, 8);
    58385838            IEM_MC_CALL_CIMPL_5(iemCImpl_load_SReg_Greg, uSel, offSeg, iSegRegArg, iGRegArg, enmEffOpSize);
    58395839            IEM_MC_END();
     
    59035903    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    59045904    {
    5905         switch (pIemCpu->enmEffOpSize)
     5905        switch (pVCpu->iem.s.enmEffOpSize)
    59065906        {
    59075907            case IEMMODE_16BIT:
    59085908                IEM_MC_BEGIN(0, 1);
    59095909                IEM_MC_LOCAL(uint16_t, u16Value);
    5910                 IEM_MC_FETCH_GREG_U8_ZX_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    5911                 IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Value);
     5910                IEM_MC_FETCH_GREG_U8_ZX_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     5911                IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16Value);
    59125912                IEM_MC_ADVANCE_RIP();
    59135913                IEM_MC_END();
     
    59175917                IEM_MC_BEGIN(0, 1);
    59185918                IEM_MC_LOCAL(uint32_t, u32Value);
    5919                 IEM_MC_FETCH_GREG_U8_ZX_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    5920                 IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
     5919                IEM_MC_FETCH_GREG_U8_ZX_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     5920                IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Value);
    59215921                IEM_MC_ADVANCE_RIP();
    59225922                IEM_MC_END();
     
    59265926                IEM_MC_BEGIN(0, 1);
    59275927                IEM_MC_LOCAL(uint64_t, u64Value);
    5928                 IEM_MC_FETCH_GREG_U8_ZX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    5929                 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
     5928                IEM_MC_FETCH_GREG_U8_ZX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     5929                IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Value);
    59305930                IEM_MC_ADVANCE_RIP();
    59315931                IEM_MC_END();
     
    59405940         * We're loading a register from memory.
    59415941         */
    5942         switch (pIemCpu->enmEffOpSize)
     5942        switch (pVCpu->iem.s.enmEffOpSize)
    59435943        {
    59445944            case IEMMODE_16BIT:
     
    59475947                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    59485948                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    5949                 IEM_MC_FETCH_MEM_U8_ZX_U16(u16Value, pIemCpu->iEffSeg, GCPtrEffDst);
    5950                 IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Value);
     5949                IEM_MC_FETCH_MEM_U8_ZX_U16(u16Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     5950                IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16Value);
    59515951                IEM_MC_ADVANCE_RIP();
    59525952                IEM_MC_END();
     
    59585958                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    59595959                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    5960                 IEM_MC_FETCH_MEM_U8_ZX_U32(u32Value, pIemCpu->iEffSeg, GCPtrEffDst);
    5961                 IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
     5960                IEM_MC_FETCH_MEM_U8_ZX_U32(u32Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     5961                IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Value);
    59625962                IEM_MC_ADVANCE_RIP();
    59635963                IEM_MC_END();
     
    59695969                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    59705970                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    5971                 IEM_MC_FETCH_MEM_U8_ZX_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
    5972                 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
     5971                IEM_MC_FETCH_MEM_U8_ZX_U64(u64Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     5972                IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Value);
    59735973                IEM_MC_ADVANCE_RIP();
    59745974                IEM_MC_END();
     
    59985998    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    59995999    {
    6000         if (pIemCpu->enmEffOpSize != IEMMODE_64BIT)
     6000        if (pVCpu->iem.s.enmEffOpSize != IEMMODE_64BIT)
    60016001        {
    60026002            IEM_MC_BEGIN(0, 1);
    60036003            IEM_MC_LOCAL(uint32_t, u32Value);
    6004             IEM_MC_FETCH_GREG_U16_ZX_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    6005             IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
     6004            IEM_MC_FETCH_GREG_U16_ZX_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     6005            IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Value);
    60066006            IEM_MC_ADVANCE_RIP();
    60076007            IEM_MC_END();
     
    60116011            IEM_MC_BEGIN(0, 1);
    60126012            IEM_MC_LOCAL(uint64_t, u64Value);
    6013             IEM_MC_FETCH_GREG_U16_ZX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    6014             IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
     6013            IEM_MC_FETCH_GREG_U16_ZX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     6014            IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Value);
    60156015            IEM_MC_ADVANCE_RIP();
    60166016            IEM_MC_END();
     
    60226022         * We're loading a register from memory.
    60236023         */
    6024         if (pIemCpu->enmEffOpSize != IEMMODE_64BIT)
     6024        if (pVCpu->iem.s.enmEffOpSize != IEMMODE_64BIT)
    60256025        {
    60266026            IEM_MC_BEGIN(0, 2);
     
    60286028            IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    60296029            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    6030             IEM_MC_FETCH_MEM_U16_ZX_U32(u32Value, pIemCpu->iEffSeg, GCPtrEffDst);
    6031             IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
     6030            IEM_MC_FETCH_MEM_U16_ZX_U32(u32Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     6031            IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Value);
    60326032            IEM_MC_ADVANCE_RIP();
    60336033            IEM_MC_END();
     
    60396039            IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    60406040            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    6041             IEM_MC_FETCH_MEM_U16_ZX_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
    6042             IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
     6041            IEM_MC_FETCH_MEM_U16_ZX_U64(u64Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     6042            IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Value);
    60436043            IEM_MC_ADVANCE_RIP();
    60446044            IEM_MC_END();
     
    60856085        IEMOP_HLP_NO_LOCK_PREFIX();
    60866086
    6087         switch (pIemCpu->enmEffOpSize)
     6087        switch (pVCpu->iem.s.enmEffOpSize)
    60886088        {
    60896089            case IEMMODE_16BIT:
     
    60936093                IEM_MC_ARG(uint32_t *,      pEFlags,                    2);
    60946094
    6095                 IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     6095                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    60966096                IEM_MC_REF_EFLAGS(pEFlags);
    60976097                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
     
    61076107                IEM_MC_ARG(uint32_t *,      pEFlags,                    2);
    61086108
    6109                 IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     6109                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    61106110                IEM_MC_REF_EFLAGS(pEFlags);
    61116111                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
     
    61226122                IEM_MC_ARG(uint32_t *,      pEFlags,                    2);
    61236123
    6124                 IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     6124                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    61256125                IEM_MC_REF_EFLAGS(pEFlags);
    61266126                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
     
    61476147
    61486148        /** @todo test negative bit offsets! */
    6149         switch (pIemCpu->enmEffOpSize)
     6149        switch (pVCpu->iem.s.enmEffOpSize)
    61506150        {
    61516151            case IEMMODE_16BIT:
     
    61606160                IEM_MC_ASSIGN(u16Src, u8Bit & 0x0f);
    61616161                IEM_MC_FETCH_EFLAGS(EFlags);
    6162                 IEM_MC_MEM_MAP(pu16Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0);
    6163                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     6162                IEM_MC_MEM_MAP(pu16Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
     6163                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    61646164                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
    61656165                else
     
    61836183                IEM_MC_ASSIGN(u32Src, u8Bit & 0x1f);
    61846184                IEM_MC_FETCH_EFLAGS(EFlags);
    6185                 IEM_MC_MEM_MAP(pu32Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0);
    6186                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     6185                IEM_MC_MEM_MAP(pu32Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
     6186                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    61876187                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
    61886188                else
     
    62066206                IEM_MC_ASSIGN(u64Src, u8Bit & 0x3f);
    62076207                IEM_MC_FETCH_EFLAGS(EFlags);
    6208                 IEM_MC_MEM_MAP(pu64Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0);
    6209                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     6208                IEM_MC_MEM_MAP(pu64Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0);
     6209                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    62106210                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
    62116211                else
     
    62686268    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    62696269    {
    6270         switch (pIemCpu->enmEffOpSize)
     6270        switch (pVCpu->iem.s.enmEffOpSize)
    62716271        {
    62726272            case IEMMODE_16BIT:
    62736273                IEM_MC_BEGIN(0, 1);
    62746274                IEM_MC_LOCAL(uint16_t, u16Value);
    6275                 IEM_MC_FETCH_GREG_U8_SX_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    6276                 IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Value);
     6275                IEM_MC_FETCH_GREG_U8_SX_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     6276                IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16Value);
    62776277                IEM_MC_ADVANCE_RIP();
    62786278                IEM_MC_END();
     
    62826282                IEM_MC_BEGIN(0, 1);
    62836283                IEM_MC_LOCAL(uint32_t, u32Value);
    6284                 IEM_MC_FETCH_GREG_U8_SX_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    6285                 IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
     6284                IEM_MC_FETCH_GREG_U8_SX_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     6285                IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Value);
    62866286                IEM_MC_ADVANCE_RIP();
    62876287                IEM_MC_END();
     
    62916291                IEM_MC_BEGIN(0, 1);
    62926292                IEM_MC_LOCAL(uint64_t, u64Value);
    6293                 IEM_MC_FETCH_GREG_U8_SX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    6294                 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
     6293                IEM_MC_FETCH_GREG_U8_SX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     6294                IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Value);
    62956295                IEM_MC_ADVANCE_RIP();
    62966296                IEM_MC_END();
     
    63056305         * We're loading a register from memory.
    63066306         */
    6307         switch (pIemCpu->enmEffOpSize)
     6307        switch (pVCpu->iem.s.enmEffOpSize)
    63086308        {
    63096309            case IEMMODE_16BIT:
     
    63126312                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    63136313                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    6314                 IEM_MC_FETCH_MEM_U8_SX_U16(u16Value, pIemCpu->iEffSeg, GCPtrEffDst);
    6315                 IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Value);
     6314                IEM_MC_FETCH_MEM_U8_SX_U16(u16Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     6315                IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16Value);
    63166316                IEM_MC_ADVANCE_RIP();
    63176317                IEM_MC_END();
     
    63236323                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    63246324                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    6325                 IEM_MC_FETCH_MEM_U8_SX_U32(u32Value, pIemCpu->iEffSeg, GCPtrEffDst);
    6326                 IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
     6325                IEM_MC_FETCH_MEM_U8_SX_U32(u32Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     6326                IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Value);
    63276327                IEM_MC_ADVANCE_RIP();
    63286328                IEM_MC_END();
     
    63346334                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    63356335                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    6336                 IEM_MC_FETCH_MEM_U8_SX_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
    6337                 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
     6336                IEM_MC_FETCH_MEM_U8_SX_U64(u64Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     6337                IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Value);
    63386338                IEM_MC_ADVANCE_RIP();
    63396339                IEM_MC_END();
     
    63636363    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    63646364    {
    6365         if (pIemCpu->enmEffOpSize != IEMMODE_64BIT)
     6365        if (pVCpu->iem.s.enmEffOpSize != IEMMODE_64BIT)
    63666366        {
    63676367            IEM_MC_BEGIN(0, 1);
    63686368            IEM_MC_LOCAL(uint32_t, u32Value);
    6369             IEM_MC_FETCH_GREG_U16_SX_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    6370             IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
     6369            IEM_MC_FETCH_GREG_U16_SX_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     6370            IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Value);
    63716371            IEM_MC_ADVANCE_RIP();
    63726372            IEM_MC_END();
     
    63766376            IEM_MC_BEGIN(0, 1);
    63776377            IEM_MC_LOCAL(uint64_t, u64Value);
    6378             IEM_MC_FETCH_GREG_U16_SX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    6379             IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
     6378            IEM_MC_FETCH_GREG_U16_SX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     6379            IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Value);
    63806380            IEM_MC_ADVANCE_RIP();
    63816381            IEM_MC_END();
     
    63876387         * We're loading a register from memory.
    63886388         */
    6389         if (pIemCpu->enmEffOpSize != IEMMODE_64BIT)
     6389        if (pVCpu->iem.s.enmEffOpSize != IEMMODE_64BIT)
    63906390        {
    63916391            IEM_MC_BEGIN(0, 2);
     
    63936393            IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    63946394            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    6395             IEM_MC_FETCH_MEM_U16_SX_U32(u32Value, pIemCpu->iEffSeg, GCPtrEffDst);
    6396             IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
     6395            IEM_MC_FETCH_MEM_U16_SX_U32(u32Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     6396            IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Value);
    63976397            IEM_MC_ADVANCE_RIP();
    63986398            IEM_MC_END();
     
    64046404            IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    64056405            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    6406             IEM_MC_FETCH_MEM_U16_SX_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
    6407             IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
     6406            IEM_MC_FETCH_MEM_U16_SX_U64(u64Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     6407            IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Value);
    64086408            IEM_MC_ADVANCE_RIP();
    64096409            IEM_MC_END();
     
    64336433        IEM_MC_ARG(uint32_t *, pEFlags, 2);
    64346434
    6435         IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    6436         IEM_MC_REF_GREG_U8(pu8Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     6435        IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     6436        IEM_MC_REF_GREG_U8(pu8Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    64376437        IEM_MC_REF_EFLAGS(pEFlags);
    64386438        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u8, pu8Dst, pu8Reg, pEFlags);
     
    64546454
    64556455        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    6456         IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    6457         IEM_MC_FETCH_GREG_U8(u8RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     6456        IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
     6457        IEM_MC_FETCH_GREG_U8(u8RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    64586458        IEM_MC_REF_LOCAL(pu8Reg, u8RegCopy);
    64596459        IEM_MC_FETCH_EFLAGS(EFlags);
    6460         if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     6460        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    64616461            IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u8, pu8Dst, pu8Reg, pEFlags);
    64626462        else
     
    64656465        IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW);
    64666466        IEM_MC_COMMIT_EFLAGS(EFlags);
    6467         IEM_MC_STORE_GREG_U8(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u8RegCopy);
     6467        IEM_MC_STORE_GREG_U8(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u8RegCopy);
    64686468        IEM_MC_ADVANCE_RIP();
    64696469        IEM_MC_END();
     
    64886488        IEMOP_HLP_NO_LOCK_PREFIX();
    64896489
    6490         switch (pIemCpu->enmEffOpSize)
     6490        switch (pVCpu->iem.s.enmEffOpSize)
    64916491        {
    64926492            case IEMMODE_16BIT:
     
    64966496                IEM_MC_ARG(uint32_t *, pEFlags, 2);
    64976497
    6498                 IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    6499                 IEM_MC_REF_GREG_U16(pu16Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     6498                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     6499                IEM_MC_REF_GREG_U16(pu16Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    65006500                IEM_MC_REF_EFLAGS(pEFlags);
    65016501                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u16, pu16Dst, pu16Reg, pEFlags);
     
    65116511                IEM_MC_ARG(uint32_t *, pEFlags, 2);
    65126512
    6513                 IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    6514                 IEM_MC_REF_GREG_U32(pu32Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     6513                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     6514                IEM_MC_REF_GREG_U32(pu32Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    65156515                IEM_MC_REF_EFLAGS(pEFlags);
    65166516                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u32, pu32Dst, pu32Reg, pEFlags);
     
    65286528                IEM_MC_ARG(uint32_t *, pEFlags, 2);
    65296529
    6530                 IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    6531                 IEM_MC_REF_GREG_U64(pu64Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     6530                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     6531                IEM_MC_REF_GREG_U64(pu64Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    65326532                IEM_MC_REF_EFLAGS(pEFlags);
    65336533                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u64, pu64Dst, pu64Reg, pEFlags);
     
    65456545         * We're accessing memory.
    65466546         */
    6547         switch (pIemCpu->enmEffOpSize)
     6547        switch (pVCpu->iem.s.enmEffOpSize)
    65486548        {
    65496549            case IEMMODE_16BIT:
     
    65566556
    65576557                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    6558                 IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    6559                 IEM_MC_FETCH_GREG_U16(u16RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     6558                IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
     6559                IEM_MC_FETCH_GREG_U16(u16RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    65606560                IEM_MC_REF_LOCAL(pu16Reg, u16RegCopy);
    65616561                IEM_MC_FETCH_EFLAGS(EFlags);
    6562                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     6562                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    65636563                    IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u16, pu16Dst, pu16Reg, pEFlags);
    65646564                else
     
    65676567                IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Dst, IEM_ACCESS_DATA_RW);
    65686568                IEM_MC_COMMIT_EFLAGS(EFlags);
    6569                 IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16RegCopy);
     6569                IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16RegCopy);
    65706570                IEM_MC_ADVANCE_RIP();
    65716571                IEM_MC_END();
     
    65816581
    65826582                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    6583                 IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    6584                 IEM_MC_FETCH_GREG_U32(u32RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     6583                IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
     6584                IEM_MC_FETCH_GREG_U32(u32RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    65856585                IEM_MC_REF_LOCAL(pu32Reg, u32RegCopy);
    65866586                IEM_MC_FETCH_EFLAGS(EFlags);
    6587                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     6587                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    65886588                    IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u32, pu32Dst, pu32Reg, pEFlags);
    65896589                else
     
    65926592                IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Dst, IEM_ACCESS_DATA_RW);
    65936593                IEM_MC_COMMIT_EFLAGS(EFlags);
    6594                 IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32RegCopy);
     6594                IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32RegCopy);
    65956595                IEM_MC_ADVANCE_RIP();
    65966596                IEM_MC_END();
     
    66066606
    66076607                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    6608                 IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    6609                 IEM_MC_FETCH_GREG_U64(u64RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     6608                IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
     6609                IEM_MC_FETCH_GREG_U64(u64RegCopy, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    66106610                IEM_MC_REF_LOCAL(pu64Reg, u64RegCopy);
    66116611                IEM_MC_FETCH_EFLAGS(EFlags);
    6612                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     6612                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    66136613                    IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_xadd_u64, pu64Dst, pu64Reg, pEFlags);
    66146614                else
     
    66176617                IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Dst, IEM_ACCESS_DATA_RW);
    66186618                IEM_MC_COMMIT_EFLAGS(EFlags);
    6619                 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64RegCopy);
     6619                IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64RegCopy);
    66206620                IEM_MC_ADVANCE_RIP();
    66216621                IEM_MC_END();
     
    66416641    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
    66426642    {
    6643         switch (pIemCpu->enmEffOpSize)
     6643        switch (pVCpu->iem.s.enmEffOpSize)
    66446644        {
    66456645            case IEMMODE_32BIT:
     
    66506650                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    66516651                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    6652                 if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse2)
     6652                if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse2)
    66536653                    return IEMOP_RAISE_INVALID_OPCODE();
    66546654
    6655                 IEM_MC_FETCH_GREG_U32(u32Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    6656                 IEM_MC_STORE_MEM_U32(pIemCpu->iEffSeg, GCPtrEffDst, u32Value);
     6655                IEM_MC_FETCH_GREG_U32(u32Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     6656                IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u32Value);
    66576657                IEM_MC_ADVANCE_RIP();
    66586658                IEM_MC_END();
     
    66666666                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    66676667                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    6668                 if (!IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fSse2)
     6668                if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse2)
    66696669                    return IEMOP_RAISE_INVALID_OPCODE();
    66706670
    6671                 IEM_MC_FETCH_GREG_U64(u64Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    6672                 IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffDst, u64Value);
     6671                IEM_MC_FETCH_GREG_U64(u64Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     6672                IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u64Value);
    66736673                IEM_MC_ADVANCE_RIP();
    66746674                IEM_MC_END();
     
    67126712    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    67136713    IEMOP_HLP_DONE_DECODING();
    6714     IEM_MC_MEM_MAP(pu64MemDst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     6714    IEM_MC_MEM_MAP(pu64MemDst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    67156715
    67166716    IEM_MC_FETCH_GREG_U32(u64EaxEdx.s.Lo, X86_GREG_xAX);
     
    67236723
    67246724    IEM_MC_FETCH_EFLAGS(EFlags);
    6725     if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     6725    if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    67266726        IEM_MC_CALL_VOID_AIMPL_4(iemAImpl_cmpxchg8b, pu64MemDst, pu64EaxEdx, pu64EbxEcx, pEFlags);
    67276727    else
     
    67736773            /** @todo Testcase: Check prefix effects on cmpxchg8b/16b. */
    67746774            if (   (bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)
    6775                 || (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ))) /** @todo Testcase: AMD seems to express a different idea here wrt prefixes. */
     6775                || (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ))) /** @todo Testcase: AMD seems to express a different idea here wrt prefixes. */
    67766776                return IEMOP_RAISE_INVALID_OPCODE();
    67776777            if (bRm & IEM_OP_PRF_SIZE_REX_W)
     
    67816781            if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    67826782                return FNIEMOP_CALL_1(iemOp_Grp9_rdrand_Rv, bRm);
    6783             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ))
     6783            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ))
    67846784            {
    67856785                case 0:
     
    67936793            }
    67946794        case 7:
    6795             switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ))
     6795            switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ))
    67966796            {
    67976797                case 0:
     
    68126812{
    68136813    IEMOP_HLP_NO_LOCK_PREFIX();
    6814     switch (pIemCpu->enmEffOpSize)
     6814    switch (pVCpu->iem.s.enmEffOpSize)
    68156815    {
    68166816        case IEMMODE_16BIT:
     
    68556855             case, see iemOp_mov_AL_Ib and iemOp_mov_eAX_Iv. */
    68566856    IEMOP_HLP_MIN_486();
    6857     return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xAX | pIemCpu->uRexB);
     6857    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xAX | pVCpu->iem.s.uRexB);
    68586858}
    68596859
     
    68646864    IEMOP_MNEMONIC("bswap rCX/r9");
    68656865    IEMOP_HLP_MIN_486();
    6866     return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xCX | pIemCpu->uRexB);
     6866    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xCX | pVCpu->iem.s.uRexB);
    68676867}
    68686868
     
    68736873    IEMOP_MNEMONIC("bswap rDX/r9");
    68746874    IEMOP_HLP_MIN_486();
    6875     return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xDX | pIemCpu->uRexB);
     6875    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xDX | pVCpu->iem.s.uRexB);
    68766876}
    68776877
     
    68826882    IEMOP_MNEMONIC("bswap rBX/r9");
    68836883    IEMOP_HLP_MIN_486();
    6884     return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xBX | pIemCpu->uRexB);
     6884    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xBX | pVCpu->iem.s.uRexB);
    68856885}
    68866886
     
    68916891    IEMOP_MNEMONIC("bswap rSP/r12");
    68926892    IEMOP_HLP_MIN_486();
    6893     return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xSP | pIemCpu->uRexB);
     6893    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xSP | pVCpu->iem.s.uRexB);
    68946894}
    68956895
     
    69006900    IEMOP_MNEMONIC("bswap rBP/r13");
    69016901    IEMOP_HLP_MIN_486();
    6902     return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xBP | pIemCpu->uRexB);
     6902    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xBP | pVCpu->iem.s.uRexB);
    69036903}
    69046904
     
    69096909    IEMOP_MNEMONIC("bswap rSI/r14");
    69106910    IEMOP_HLP_MIN_486();
    6911     return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xSI | pIemCpu->uRexB);
     6911    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xSI | pVCpu->iem.s.uRexB);
    69126912}
    69136913
     
    69186918    IEMOP_MNEMONIC("bswap rDI/r15");
    69196919    IEMOP_HLP_MIN_486();
    6920     return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xDI | pIemCpu->uRexB);
     6920    return FNIEMOP_CALL_1(iemOpCommonBswapGReg, X86_GREG_xDI | pVCpu->iem.s.uRexB);
    69216921}
    69226922
     
    69526952     *        and opcode modifications are made to work with the whole width (not
    69536953     *        just 128). */
    6954     switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     6954    switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    69556955    {
    69566956        case IEM_OP_PRF_SIZE_OP: /* SSE */
     
    69626962            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    69636963            IEM_MC_PREPARE_SSE_USAGE();
    6964             IEM_MC_REF_GREG_U64(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    6965             IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     6964            IEM_MC_REF_GREG_U64(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     6965            IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    69666966            IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_pmovmskb_u128, pDst, pSrc);
    69676967            IEM_MC_ADVANCE_RIP();
     
    70257025FNIEMOP_DEF(iemOp_movntq_Mq_Pq__movntdq_Mdq_Vdq)
    70267026{
    7027     IEMOP_MNEMONIC(!(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP) ? "movntq mr,r" : "movntdq mr,r");
     7027    IEMOP_MNEMONIC(!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP) ? "movntq mr,r" : "movntdq mr,r");
    70287028    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    70297029    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     
    70337033         */
    70347034/** @todo check when the REPNZ/Z bits kick in. Same as lock, probably... */
    7035         switch (pIemCpu->fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     7035        switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    70367036        {
    70377037
     
    70467046                IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    70477047
    7048                 IEM_MC_FETCH_XREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    7049                 IEM_MC_STORE_MEM_U128_ALIGN_SSE(pIemCpu->iEffSeg, GCPtrEffSrc, uSrc);
     7048                IEM_MC_FETCH_XREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     7049                IEM_MC_STORE_MEM_U128_ALIGN_SSE(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    70507050
    70517051                IEM_MC_ADVANCE_RIP();
     
    70647064
    70657065                IEM_MC_FETCH_MREG_U64(uSrc, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
    7066                 IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffSrc, uSrc);
     7066                IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    70677067
    70687068                IEM_MC_ADVANCE_RIP();
     
    74677467    IEMOP_HLP_NO_64BIT();
    74687468    IEMOP_HLP_NO_LOCK_PREFIX();
    7469     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_ES, pIemCpu->enmEffOpSize);
     7469    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_ES, pVCpu->iem.s.enmEffOpSize);
    74707470}
    74717471
     
    76047604    IEMOP_HLP_NO_LOCK_PREFIX();
    76057605    IEMOP_HLP_NO_64BIT();
    7606     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_SS, pIemCpu->enmEffOpSize);
     7606    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_SS, pVCpu->iem.s.enmEffOpSize);
    76077607}
    76087608
     
    76707670    IEMOP_HLP_NO_LOCK_PREFIX();
    76717671    IEMOP_HLP_NO_64BIT();
    7672     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_DS, pIemCpu->enmEffOpSize);
     7672    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_pop_Sreg, X86_SREG_DS, pVCpu->iem.s.enmEffOpSize);
    76737673}
    76747674
     
    77327732{
    77337733    IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("seg es");
    7734     pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_ES;
    7735     pIemCpu->iEffSeg    = X86_SREG_ES;
     7734    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SEG_ES;
     7735    pVCpu->iem.s.iEffSeg    = X86_SREG_ES;
    77367736
    77377737    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    78037803{
    78047804    IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("seg cs");
    7805     pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_CS;
    7806     pIemCpu->iEffSeg    = X86_SREG_CS;
     7805    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SEG_CS;
     7806    pVCpu->iem.s.iEffSeg    = X86_SREG_CS;
    78077807
    78087808    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    78807880{
    78817881    IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("seg ss");
    7882     pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_SS;
    7883     pIemCpu->iEffSeg    = X86_SREG_SS;
     7882    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SEG_SS;
     7883    pVCpu->iem.s.iEffSeg    = X86_SREG_SS;
    78847884
    78857885    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    79467946{
    79477947    IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("seg ds");
    7948     pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_DS;
    7949     pIemCpu->iEffSeg    = X86_SREG_DS;
     7948    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SEG_DS;
     7949    pVCpu->iem.s.iEffSeg    = X86_SREG_DS;
    79507950
    79517951    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    79637963{
    79647964    IEMOP_HLP_NO_LOCK_PREFIX();
    7965     switch (pIemCpu->enmEffOpSize)
     7965    switch (pVCpu->iem.s.enmEffOpSize)
    79667966    {
    79677967        case IEMMODE_16BIT:
     
    80098009     * This is a REX prefix in 64-bit mode.
    80108010     */
    8011     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8011    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    80128012    {
    80138013        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex");
    8014         pIemCpu->fPrefixes |= IEM_OP_PRF_REX;
     8014        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX;
    80158015
    80168016        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    80298029     * This is a REX prefix in 64-bit mode.
    80308030     */
    8031     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8031    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    80328032    {
    80338033        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.b");
    8034         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_B;
    8035         pIemCpu->uRexB     = 1 << 3;
     8034        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_B;
     8035        pVCpu->iem.s.uRexB     = 1 << 3;
    80368036
    80378037        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    80508050     * This is a REX prefix in 64-bit mode.
    80518051     */
    8052     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8052    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    80538053    {
    80548054        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.x");
    8055         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_X;
    8056         pIemCpu->uRexIndex = 1 << 3;
     8055        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_X;
     8056        pVCpu->iem.s.uRexIndex = 1 << 3;
    80578057
    80588058        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    80728072     * This is a REX prefix in 64-bit mode.
    80738073     */
    8074     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8074    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    80758075    {
    80768076        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.bx");
    8077         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_B | IEM_OP_PRF_REX_X;
    8078         pIemCpu->uRexB     = 1 << 3;
    8079         pIemCpu->uRexIndex = 1 << 3;
     8077        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_B | IEM_OP_PRF_REX_X;
     8078        pVCpu->iem.s.uRexB     = 1 << 3;
     8079        pVCpu->iem.s.uRexIndex = 1 << 3;
    80808080
    80818081        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    80948094     * This is a REX prefix in 64-bit mode.
    80958095     */
    8096     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8096    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    80978097    {
    80988098        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.r");
    8099         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R;
    8100         pIemCpu->uRexReg   = 1 << 3;
     8099        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R;
     8100        pVCpu->iem.s.uRexReg   = 1 << 3;
    81018101
    81028102        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    81158115     * This is a REX prefix in 64-bit mode.
    81168116     */
    8117     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8117    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    81188118    {
    81198119        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rb");
    8120         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_B;
    8121         pIemCpu->uRexReg   = 1 << 3;
    8122         pIemCpu->uRexB     = 1 << 3;
     8120        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_B;
     8121        pVCpu->iem.s.uRexReg   = 1 << 3;
     8122        pVCpu->iem.s.uRexB     = 1 << 3;
    81238123
    81248124        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    81378137     * This is a REX prefix in 64-bit mode.
    81388138     */
    8139     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8139    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    81408140    {
    81418141        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rx");
    8142         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_X;
    8143         pIemCpu->uRexReg   = 1 << 3;
    8144         pIemCpu->uRexIndex = 1 << 3;
     8142        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_X;
     8143        pVCpu->iem.s.uRexReg   = 1 << 3;
     8144        pVCpu->iem.s.uRexIndex = 1 << 3;
    81458145
    81468146        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    81598159     * This is a REX prefix in 64-bit mode.
    81608160     */
    8161     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8161    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    81628162    {
    81638163        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rbx");
    8164         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_B | IEM_OP_PRF_REX_X;
    8165         pIemCpu->uRexReg   = 1 << 3;
    8166         pIemCpu->uRexB     = 1 << 3;
    8167         pIemCpu->uRexIndex = 1 << 3;
     8164        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_B | IEM_OP_PRF_REX_X;
     8165        pVCpu->iem.s.uRexReg   = 1 << 3;
     8166        pVCpu->iem.s.uRexB     = 1 << 3;
     8167        pVCpu->iem.s.uRexIndex = 1 << 3;
    81688168
    81698169        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    81828182     * This is a REX prefix in 64-bit mode.
    81838183     */
    8184     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8184    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    81858185    {
    81868186        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.w");
    8187         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_SIZE_REX_W;
    8188         iemRecalEffOpSize(pIemCpu);
     8187        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_SIZE_REX_W;
     8188        iemRecalEffOpSize(pVCpu);
    81898189
    81908190        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    82038203     * This is a REX prefix in 64-bit mode.
    82048204     */
    8205     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8205    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    82068206    {
    82078207        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.bw");
    8208         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_B | IEM_OP_PRF_SIZE_REX_W;
    8209         pIemCpu->uRexB     = 1 << 3;
    8210         iemRecalEffOpSize(pIemCpu);
     8208        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_B | IEM_OP_PRF_SIZE_REX_W;
     8209        pVCpu->iem.s.uRexB     = 1 << 3;
     8210        iemRecalEffOpSize(pVCpu);
    82118211
    82128212        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    82258225     * This is a REX prefix in 64-bit mode.
    82268226     */
    8227     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8227    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    82288228    {
    82298229        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.xw");
    8230         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_X | IEM_OP_PRF_SIZE_REX_W;
    8231         pIemCpu->uRexIndex = 1 << 3;
    8232         iemRecalEffOpSize(pIemCpu);
     8230        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_X | IEM_OP_PRF_SIZE_REX_W;
     8231        pVCpu->iem.s.uRexIndex = 1 << 3;
     8232        iemRecalEffOpSize(pVCpu);
    82338233
    82348234        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    82478247     * This is a REX prefix in 64-bit mode.
    82488248     */
    8249     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8249    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    82508250    {
    82518251        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.bxw");
    8252         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_B | IEM_OP_PRF_REX_X | IEM_OP_PRF_SIZE_REX_W;
    8253         pIemCpu->uRexB     = 1 << 3;
    8254         pIemCpu->uRexIndex = 1 << 3;
    8255         iemRecalEffOpSize(pIemCpu);
     8252        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_B | IEM_OP_PRF_REX_X | IEM_OP_PRF_SIZE_REX_W;
     8253        pVCpu->iem.s.uRexB     = 1 << 3;
     8254        pVCpu->iem.s.uRexIndex = 1 << 3;
     8255        iemRecalEffOpSize(pVCpu);
    82568256
    82578257        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    82708270     * This is a REX prefix in 64-bit mode.
    82718271     */
    8272     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8272    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    82738273    {
    82748274        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rw");
    8275         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_SIZE_REX_W;
    8276         pIemCpu->uRexReg   = 1 << 3;
    8277         iemRecalEffOpSize(pIemCpu);
     8275        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_SIZE_REX_W;
     8276        pVCpu->iem.s.uRexReg   = 1 << 3;
     8277        iemRecalEffOpSize(pVCpu);
    82788278
    82798279        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    82928292     * This is a REX prefix in 64-bit mode.
    82938293     */
    8294     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8294    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    82958295    {
    82968296        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rbw");
    8297         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_B | IEM_OP_PRF_SIZE_REX_W;
    8298         pIemCpu->uRexReg   = 1 << 3;
    8299         pIemCpu->uRexB     = 1 << 3;
    8300         iemRecalEffOpSize(pIemCpu);
     8297        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_B | IEM_OP_PRF_SIZE_REX_W;
     8298        pVCpu->iem.s.uRexReg   = 1 << 3;
     8299        pVCpu->iem.s.uRexB     = 1 << 3;
     8300        iemRecalEffOpSize(pVCpu);
    83018301
    83028302        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    83158315     * This is a REX prefix in 64-bit mode.
    83168316     */
    8317     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8317    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    83188318    {
    83198319        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rxw");
    8320         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_X | IEM_OP_PRF_SIZE_REX_W;
    8321         pIemCpu->uRexReg   = 1 << 3;
    8322         pIemCpu->uRexIndex = 1 << 3;
    8323         iemRecalEffOpSize(pIemCpu);
     8320        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_X | IEM_OP_PRF_SIZE_REX_W;
     8321        pVCpu->iem.s.uRexReg   = 1 << 3;
     8322        pVCpu->iem.s.uRexIndex = 1 << 3;
     8323        iemRecalEffOpSize(pVCpu);
    83248324
    83258325        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    83388338     * This is a REX prefix in 64-bit mode.
    83398339     */
    8340     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
     8340    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
    83418341    {
    83428342        IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("rex.rbxw");
    8343         pIemCpu->fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_B | IEM_OP_PRF_REX_X | IEM_OP_PRF_SIZE_REX_W;
    8344         pIemCpu->uRexReg   = 1 << 3;
    8345         pIemCpu->uRexB     = 1 << 3;
    8346         pIemCpu->uRexIndex = 1 << 3;
    8347         iemRecalEffOpSize(pIemCpu);
     8343        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REX | IEM_OP_PRF_REX_R | IEM_OP_PRF_REX_B | IEM_OP_PRF_REX_X | IEM_OP_PRF_SIZE_REX_W;
     8344        pVCpu->iem.s.uRexReg   = 1 << 3;
     8345        pVCpu->iem.s.uRexB     = 1 << 3;
     8346        pVCpu->iem.s.uRexIndex = 1 << 3;
     8347        iemRecalEffOpSize(pVCpu);
    83488348
    83498349        uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    83628362{
    83638363    IEMOP_HLP_NO_LOCK_PREFIX();
    8364     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
    8365     {
    8366         iReg |= pIemCpu->uRexB;
    8367         pIemCpu->enmDefOpSize = IEMMODE_64BIT;
    8368         pIemCpu->enmEffOpSize = !(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP) ? IEMMODE_64BIT : IEMMODE_16BIT;
    8369     }
    8370 
    8371     switch (pIemCpu->enmEffOpSize)
     8364    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
     8365    {
     8366        iReg |= pVCpu->iem.s.uRexB;
     8367        pVCpu->iem.s.enmDefOpSize = IEMMODE_64BIT;
     8368        pVCpu->iem.s.enmEffOpSize = !(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP) ? IEMMODE_64BIT : IEMMODE_16BIT;
     8369    }
     8370
     8371    switch (pVCpu->iem.s.enmEffOpSize)
    83728372    {
    83738373        case IEMMODE_16BIT:
     
    84398439{
    84408440    IEMOP_MNEMONIC("push rSP");
    8441     if (IEM_GET_TARGET_CPU(pIemCpu) == IEMTARGETCPU_8086)
     8441    if (IEM_GET_TARGET_CPU(pVCpu) == IEMTARGETCPU_8086)
    84428442    {
    84438443        IEM_MC_BEGIN(0, 1);
     
    84838483{
    84848484    IEMOP_HLP_NO_LOCK_PREFIX();
    8485     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
    8486     {
    8487         iReg |= pIemCpu->uRexB;
    8488         pIemCpu->enmDefOpSize = IEMMODE_64BIT;
    8489         pIemCpu->enmEffOpSize = !(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP) ? IEMMODE_64BIT : IEMMODE_16BIT;
    8490     }
    8491 
    8492     switch (pIemCpu->enmEffOpSize)
     8485    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
     8486    {
     8487        iReg |= pVCpu->iem.s.uRexB;
     8488        pVCpu->iem.s.enmDefOpSize = IEMMODE_64BIT;
     8489        pVCpu->iem.s.enmEffOpSize = !(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP) ? IEMMODE_64BIT : IEMMODE_16BIT;
     8490    }
     8491
     8492    switch (pVCpu->iem.s.enmEffOpSize)
    84938493    {
    84948494        case IEMMODE_16BIT:
     
    85618561{
    85628562    IEMOP_MNEMONIC("pop rSP");
    8563     if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
    8564     {
    8565         if (pIemCpu->uRexB)
     8563    if (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT)
     8564    {
     8565        if (pVCpu->iem.s.uRexB)
    85668566            return FNIEMOP_CALL_1(iemOpCommonPopGReg, X86_GREG_xSP);
    8567         pIemCpu->enmDefOpSize = IEMMODE_64BIT;
    8568         pIemCpu->enmEffOpSize = !(pIemCpu->fPrefixes & IEM_OP_PRF_SIZE_OP) ? IEMMODE_64BIT : IEMMODE_16BIT;
     8567        pVCpu->iem.s.enmDefOpSize = IEMMODE_64BIT;
     8568        pVCpu->iem.s.enmEffOpSize = !(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_OP) ? IEMMODE_64BIT : IEMMODE_16BIT;
    85698569    }
    85708570
     
    85728572                           DISOPTYPE_HARMLESS | DISOPTYPE_DEFAULT_64_OP_SIZE | DISOPTYPE_REXB_EXTENDS_OPREG);
    85738573    /** @todo add testcase for this instruction. */
    8574     switch (pIemCpu->enmEffOpSize)
     8574    switch (pVCpu->iem.s.enmEffOpSize)
    85758575    {
    85768576        case IEMMODE_16BIT:
     
    86368636    IEMOP_HLP_MIN_186();
    86378637    IEMOP_HLP_NO_64BIT();
    8638     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     8638    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    86398639        return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_pusha_16);
    8640     Assert(pIemCpu->enmEffOpSize == IEMMODE_32BIT);
     8640    Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_32BIT);
    86418641    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_pusha_32);
    86428642}
     
    86498649    IEMOP_HLP_MIN_186();
    86508650    IEMOP_HLP_NO_64BIT();
    8651     if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
     8651    if (pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT)
    86528652        return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_16);
    8653     Assert(pIemCpu->enmEffOpSize == IEMMODE_32BIT);
     8653    Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_32BIT);
    86548654    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_popa_32);
    86558655}
     
    86978697        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    86988698        IEMOP_HLP_DECODED_NL_2(OP_ARPL, IEMOPFORM_MR_REG, OP_PARM_Ew, OP_PARM_Gw, DISOPTYPE_HARMLESS);
    8699         IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     8699        IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    87008700        IEM_MC_FETCH_GREG_U16(u16Src, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
    87018701        IEM_MC_FETCH_EFLAGS(EFlags);
     
    87188718FNIEMOP_DEF(iemOp_movsxd_Gv_Ev)
    87198719{
    8720     Assert(pIemCpu->enmEffOpSize == IEMMODE_64BIT); /* Caller branched already . */
     8720    Assert(pVCpu->iem.s.enmEffOpSize == IEMMODE_64BIT); /* Caller branched already . */
    87218721
    87228722    IEMOP_MNEMONIC("movsxd Gv,Ev");
     
    87318731        IEM_MC_BEGIN(0, 1);
    87328732        IEM_MC_LOCAL(uint64_t, u64Value);
    8733         IEM_MC_FETCH_GREG_U32_SX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    8734         IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
     8733        IEM_MC_FETCH_GREG_U32_SX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     8734        IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Value);
    87358735        IEM_MC_ADVANCE_RIP();
    87368736        IEM_MC_END();
     
    87468746        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    87478747        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8748         IEM_MC_FETCH_MEM_U32_SX_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
    8749         IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
     8748        IEM_MC_FETCH_MEM_U32_SX_U64(u64Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     8749        IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Value);
    87508750        IEM_MC_ADVANCE_RIP();
    87518751        IEM_MC_END();
     
    87618761    IEMOP_HLP_MIN_386();
    87628762
    8763     pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_FS;
    8764     pIemCpu->iEffSeg    = X86_SREG_FS;
     8763    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SEG_FS;
     8764    pVCpu->iem.s.iEffSeg    = X86_SREG_FS;
    87658765
    87668766    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    87758775    IEMOP_HLP_MIN_386();
    87768776
    8777     pIemCpu->fPrefixes |= IEM_OP_PRF_SEG_GS;
    8778     pIemCpu->iEffSeg    = X86_SREG_GS;
     8777    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SEG_GS;
     8778    pVCpu->iem.s.iEffSeg    = X86_SREG_GS;
    87798779
    87808780    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    87898789    IEMOP_HLP_MIN_386();
    87908790
    8791     pIemCpu->fPrefixes |= IEM_OP_PRF_SIZE_OP;
    8792     iemRecalEffOpSize(pIemCpu);
     8791    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SIZE_OP;
     8792    iemRecalEffOpSize(pVCpu);
    87938793
    87948794    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    88038803    IEMOP_HLP_MIN_386();
    88048804
    8805     pIemCpu->fPrefixes |= IEM_OP_PRF_SIZE_ADDR;
    8806     switch (pIemCpu->enmDefAddrMode)
    8807     {
    8808         case IEMMODE_16BIT: pIemCpu->enmEffAddrMode = IEMMODE_32BIT; break;
    8809         case IEMMODE_32BIT: pIemCpu->enmEffAddrMode = IEMMODE_16BIT; break;
    8810         case IEMMODE_64BIT: pIemCpu->enmEffAddrMode = IEMMODE_32BIT; break;
     8805    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_SIZE_ADDR;
     8806    switch (pVCpu->iem.s.enmDefAddrMode)
     8807    {
     8808        case IEMMODE_16BIT: pVCpu->iem.s.enmEffAddrMode = IEMMODE_32BIT; break;
     8809        case IEMMODE_32BIT: pVCpu->iem.s.enmEffAddrMode = IEMMODE_16BIT; break;
     8810        case IEMMODE_64BIT: pVCpu->iem.s.enmEffAddrMode = IEMMODE_32BIT; break;
    88118811        default: AssertFailed();
    88128812    }
     
    88238823    IEMOP_HLP_MIN_186();
    88248824    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    8825     switch (pIemCpu->enmEffOpSize)
     8825    switch (pVCpu->iem.s.enmEffOpSize)
    88268826    {
    88278827        case IEMMODE_16BIT:
     
    88718871    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
    88728872
    8873     switch (pIemCpu->enmEffOpSize)
     8873    switch (pVCpu->iem.s.enmEffOpSize)
    88748874    {
    88758875        case IEMMODE_16BIT:
     
    88878887                IEM_MC_LOCAL(uint16_t,      u16Tmp);
    88888888
    8889                 IEM_MC_FETCH_GREG_U16(u16Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     8889                IEM_MC_FETCH_GREG_U16(u16Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    88908890                IEM_MC_REF_LOCAL(pu16Dst, u16Tmp);
    88918891                IEM_MC_REF_EFLAGS(pEFlags);
    88928892                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u16, pu16Dst, u16Src, pEFlags);
    8893                 IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Tmp);
     8893                IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16Tmp);
    88948894
    88958895                IEM_MC_ADVANCE_RIP();
     
    89108910                IEM_MC_ASSIGN(u16Src, u16Imm);
    89118911                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8912                 IEM_MC_FETCH_MEM_U16(u16Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
     8912                IEM_MC_FETCH_MEM_U16(u16Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    89138913                IEM_MC_REF_LOCAL(pu16Dst, u16Tmp);
    89148914                IEM_MC_REF_EFLAGS(pEFlags);
    89158915                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u16, pu16Dst, u16Src, pEFlags);
    8916                 IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Tmp);
     8916                IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16Tmp);
    89178917
    89188918                IEM_MC_ADVANCE_RIP();
     
    89368936                IEM_MC_LOCAL(uint32_t,      u32Tmp);
    89378937
    8938                 IEM_MC_FETCH_GREG_U32(u32Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     8938                IEM_MC_FETCH_GREG_U32(u32Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    89398939                IEM_MC_REF_LOCAL(pu32Dst, u32Tmp);
    89408940                IEM_MC_REF_EFLAGS(pEFlags);
    89418941                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u32, pu32Dst, u32Src, pEFlags);
    8942                 IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp);
     8942                IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Tmp);
    89438943
    89448944                IEM_MC_ADVANCE_RIP();
     
    89598959                IEM_MC_ASSIGN(u32Src, u32Imm);
    89608960                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8961                 IEM_MC_FETCH_MEM_U32(u32Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
     8961                IEM_MC_FETCH_MEM_U32(u32Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    89628962                IEM_MC_REF_LOCAL(pu32Dst, u32Tmp);
    89638963                IEM_MC_REF_EFLAGS(pEFlags);
    89648964                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u32, pu32Dst, u32Src, pEFlags);
    8965                 IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp);
     8965                IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Tmp);
    89668966
    89678967                IEM_MC_ADVANCE_RIP();
     
    89858985                IEM_MC_LOCAL(uint64_t,      u64Tmp);
    89868986
    8987                 IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     8987                IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    89888988                IEM_MC_REF_LOCAL(pu64Dst, u64Tmp);
    89898989                IEM_MC_REF_EFLAGS(pEFlags);
    89908990                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u64, pu64Dst, u64Src, pEFlags);
    8991                 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp);
     8991                IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Tmp);
    89928992
    89938993                IEM_MC_ADVANCE_RIP();
     
    90089008                IEM_MC_ASSIGN(u64Src, u64Imm);
    90099009                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    9010                 IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
     9010                IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    90119011                IEM_MC_REF_LOCAL(pu64Dst, u64Tmp);
    90129012                IEM_MC_REF_EFLAGS(pEFlags);
    90139013                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u64, pu64Dst, u64Src, pEFlags);
    9014                 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp);
     9014                IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Tmp);
    90159015
    90169016                IEM_MC_ADVANCE_RIP();
     
    90349034
    90359035    IEM_MC_BEGIN(0,0);
    9036     switch (pIemCpu->enmEffOpSize)
     9036    switch (pVCpu->iem.s.enmEffOpSize)
    90379037    {
    90389038        case IEMMODE_16BIT:
     
    90609060    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF);
    90619061
    9062     switch (pIemCpu->enmEffOpSize)
     9062    switch (pVCpu->iem.s.enmEffOpSize)
    90639063    {
    90649064        case IEMMODE_16BIT:
     
    90759075                IEM_MC_LOCAL(uint16_t,      u16Tmp);
    90769076
    9077                 IEM_MC_FETCH_GREG_U16(u16Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     9077                IEM_MC_FETCH_GREG_U16(u16Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    90789078                IEM_MC_REF_LOCAL(pu16Dst, u16Tmp);
    90799079                IEM_MC_REF_EFLAGS(pEFlags);
    90809080                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u16, pu16Dst, u16Src, pEFlags);
    9081                 IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Tmp);
     9081                IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16Tmp);
    90829082
    90839083                IEM_MC_ADVANCE_RIP();
     
    90989098                IEM_MC_ASSIGN(u16Src, u16Imm);
    90999099                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    9100                 IEM_MC_FETCH_MEM_U16(u16Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
     9100                IEM_MC_FETCH_MEM_U16(u16Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    91019101                IEM_MC_REF_LOCAL(pu16Dst, u16Tmp);
    91029102                IEM_MC_REF_EFLAGS(pEFlags);
    91039103                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u16, pu16Dst, u16Src, pEFlags);
    9104                 IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Tmp);
     9104                IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16Tmp);
    91059105
    91069106                IEM_MC_ADVANCE_RIP();
     
    91229122                IEM_MC_LOCAL(uint32_t,      u32Tmp);
    91239123
    9124                 IEM_MC_FETCH_GREG_U32(u32Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     9124                IEM_MC_FETCH_GREG_U32(u32Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    91259125                IEM_MC_REF_LOCAL(pu32Dst, u32Tmp);
    91269126                IEM_MC_REF_EFLAGS(pEFlags);
    91279127                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u32, pu32Dst, u32Src, pEFlags);
    9128                 IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp);
     9128                IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Tmp);
    91299129
    91309130                IEM_MC_ADVANCE_RIP();
     
    91459145                IEM_MC_ASSIGN(u32Src, u32Imm);
    91469146                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    9147                 IEM_MC_FETCH_MEM_U32(u32Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
     9147                IEM_MC_FETCH_MEM_U32(u32Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    91489148                IEM_MC_REF_LOCAL(pu32Dst, u32Tmp);
    91499149                IEM_MC_REF_EFLAGS(pEFlags);
    91509150                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u32, pu32Dst, u32Src, pEFlags);
    9151                 IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Tmp);
     9151                IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Tmp);
    91529152
    91539153                IEM_MC_ADVANCE_RIP();
     
    91699169                IEM_MC_LOCAL(uint64_t,      u64Tmp);
    91709170
    9171                 IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     9171                IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    91729172                IEM_MC_REF_LOCAL(pu64Dst, u64Tmp);
    91739173                IEM_MC_REF_EFLAGS(pEFlags);
    91749174                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u64, pu64Dst, u64Src, pEFlags);
    9175                 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp);
     9175                IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Tmp);
    91769176
    91779177                IEM_MC_ADVANCE_RIP();
     
    91929192                IEM_MC_ASSIGN(u64Src, u64Imm);
    91939193                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    9194                 IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrEffDst);
     9194                IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    91959195                IEM_MC_REF_LOCAL(pu64Dst, u64Tmp);
    91969196                IEM_MC_REF_EFLAGS(pEFlags);
    91979197                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_imul_two_u64, pu64Dst, u64Src, pEFlags);
    9198                 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Tmp);
     9198                IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Tmp);
    91999199
    92009200                IEM_MC_ADVANCE_RIP();
     
    92129212    IEMOP_HLP_MIN_186();
    92139213    IEMOP_HLP_NO_LOCK_PREFIX();
    9214     if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     9214    if (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    92159215    {
    92169216        IEMOP_MNEMONIC("rep ins Yb,DX");
    9217         switch (pIemCpu->enmEffAddrMode)
     9217        switch (pVCpu->iem.s.enmEffAddrMode)
    92189218        {
    92199219            case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op8_addr16, false);
     
    92269226    {
    92279227        IEMOP_MNEMONIC("ins Yb,DX");
    9228         switch (pIemCpu->enmEffAddrMode)
     9228        switch (pVCpu->iem.s.enmEffAddrMode)
    92299229        {
    92309230            case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op8_addr16, false);
     
    92429242    IEMOP_HLP_MIN_186();
    92439243    IEMOP_HLP_NO_LOCK_PREFIX();
    9244     if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     9244    if (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    92459245    {
    92469246        IEMOP_MNEMONIC("rep ins Yv,DX");
    9247         switch (pIemCpu->enmEffOpSize)
     9247        switch (pVCpu->iem.s.enmEffOpSize)
    92489248        {
    92499249            case IEMMODE_16BIT:
    9250                 switch (pIemCpu->enmEffAddrMode)
     9250                switch (pVCpu->iem.s.enmEffAddrMode)
    92519251                {
    92529252                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op16_addr16, false);
     
    92589258            case IEMMODE_64BIT:
    92599259            case IEMMODE_32BIT:
    9260                 switch (pIemCpu->enmEffAddrMode)
     9260                switch (pVCpu->iem.s.enmEffAddrMode)
    92619261                {
    92629262                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_ins_op32_addr16, false);
     
    92729272    {
    92739273        IEMOP_MNEMONIC("ins Yv,DX");
    9274         switch (pIemCpu->enmEffOpSize)
     9274        switch (pVCpu->iem.s.enmEffOpSize)
    92759275        {
    92769276            case IEMMODE_16BIT:
    9277                 switch (pIemCpu->enmEffAddrMode)
     9277                switch (pVCpu->iem.s.enmEffAddrMode)
    92789278                {
    92799279                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op16_addr16, false);
     
    92859285            case IEMMODE_64BIT:
    92869286            case IEMMODE_32BIT:
    9287                 switch (pIemCpu->enmEffAddrMode)
     9287                switch (pVCpu->iem.s.enmEffAddrMode)
    92889288                {
    92899289                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_ins_op32_addr16, false);
     
    93049304    IEMOP_HLP_MIN_186();
    93059305    IEMOP_HLP_NO_LOCK_PREFIX();
    9306     if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     9306    if (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    93079307    {
    93089308        IEMOP_MNEMONIC("rep outs DX,Yb");
    9309         switch (pIemCpu->enmEffAddrMode)
     9309        switch (pVCpu->iem.s.enmEffAddrMode)
    93109310        {
    9311             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op8_addr16, pIemCpu->iEffSeg, false);
    9312             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op8_addr32, pIemCpu->iEffSeg, false);
    9313             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op8_addr64, pIemCpu->iEffSeg, false);
     9311            case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op8_addr16, pVCpu->iem.s.iEffSeg, false);
     9312            case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op8_addr32, pVCpu->iem.s.iEffSeg, false);
     9313            case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op8_addr64, pVCpu->iem.s.iEffSeg, false);
    93149314            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    93159315        }
     
    93189318    {
    93199319        IEMOP_MNEMONIC("outs DX,Yb");
    9320         switch (pIemCpu->enmEffAddrMode)
     9320        switch (pVCpu->iem.s.enmEffAddrMode)
    93219321        {
    9322             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op8_addr16, pIemCpu->iEffSeg, false);
    9323             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op8_addr32, pIemCpu->iEffSeg, false);
    9324             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op8_addr64, pIemCpu->iEffSeg, false);
     9322            case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op8_addr16, pVCpu->iem.s.iEffSeg, false);
     9323            case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op8_addr32, pVCpu->iem.s.iEffSeg, false);
     9324            case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op8_addr64, pVCpu->iem.s.iEffSeg, false);
    93259325            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    93269326        }
     
    93349334    IEMOP_HLP_MIN_186();
    93359335    IEMOP_HLP_NO_LOCK_PREFIX();
    9336     if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
     9336    if (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ))
    93379337    {
    93389338        IEMOP_MNEMONIC("rep outs DX,Yv");
    9339         switch (pIemCpu->enmEffOpSize)
     9339        switch (pVCpu->iem.s.enmEffOpSize)
    93409340        {
    93419341            case IEMMODE_16BIT:
    9342                 switch (pIemCpu->enmEffAddrMode)
     9342                switch (pVCpu->iem.s.enmEffAddrMode)
    93439343                {
    9344                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op16_addr16, pIemCpu->iEffSeg, false);
    9345                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op16_addr32, pIemCpu->iEffSeg, false);
    9346                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op16_addr64, pIemCpu->iEffSeg, false);
     9344                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op16_addr16, pVCpu->iem.s.iEffSeg, false);
     9345                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op16_addr32, pVCpu->iem.s.iEffSeg, false);
     9346                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op16_addr64, pVCpu->iem.s.iEffSeg, false);
    93479347                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    93489348                }
     
    93509350            case IEMMODE_64BIT:
    93519351            case IEMMODE_32BIT:
    9352                 switch (pIemCpu->enmEffAddrMode)
     9352                switch (pVCpu->iem.s.enmEffAddrMode)
    93539353                {
    9354                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op32_addr16, pIemCpu->iEffSeg, false);
    9355                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op32_addr32, pIemCpu->iEffSeg, false);
    9356                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op32_addr64, pIemCpu->iEffSeg, false);
     9354                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op32_addr16, pVCpu->iem.s.iEffSeg, false);
     9355                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op32_addr32, pVCpu->iem.s.iEffSeg, false);
     9356                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_rep_outs_op32_addr64, pVCpu->iem.s.iEffSeg, false);
    93579357                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    93589358                }
     
    93649364    {
    93659365        IEMOP_MNEMONIC("outs DX,Yv");
    9366         switch (pIemCpu->enmEffOpSize)
     9366        switch (pVCpu->iem.s.enmEffOpSize)
    93679367        {
    93689368            case IEMMODE_16BIT:
    9369                 switch (pIemCpu->enmEffAddrMode)
     9369                switch (pVCpu->iem.s.enmEffAddrMode)
    93709370                {
    9371                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op16_addr16, pIemCpu->iEffSeg, false);
    9372                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op16_addr32, pIemCpu->iEffSeg, false);
    9373                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op16_addr64, pIemCpu->iEffSeg, false);
     9371                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op16_addr16, pVCpu->iem.s.iEffSeg, false);
     9372                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op16_addr32, pVCpu->iem.s.iEffSeg, false);
     9373                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op16_addr64, pVCpu->iem.s.iEffSeg, false);
    93749374                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    93759375                }
     
    93779377            case IEMMODE_64BIT:
    93789378            case IEMMODE_32BIT:
    9379                 switch (pIemCpu->enmEffAddrMode)
     9379                switch (pVCpu->iem.s.enmEffAddrMode)
    93809380                {
    9381                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op32_addr16, pIemCpu->iEffSeg, false);
    9382                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op32_addr32, pIemCpu->iEffSeg, false);
    9383                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op32_addr64, pIemCpu->iEffSeg, false);
     9381                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op32_addr16, pVCpu->iem.s.iEffSeg, false);
     9382                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op32_addr32, pVCpu->iem.s.iEffSeg, false);
     9383                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_outs_op32_addr64, pVCpu->iem.s.iEffSeg, false);
    93849384                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    93859385                }
     
    97119711        IEM_MC_ARG(uint32_t *,      pEFlags,                2);
    97129712
    9713         IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     9713        IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    97149714        IEM_MC_REF_EFLAGS(pEFlags);
    97159715        IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);
     
    97389738        IEM_MC_ARG_CONST(uint8_t,   u8Src, /*=*/ u8Imm,     1);
    97399739
    9740         IEM_MC_MEM_MAP(pu8Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     9740        IEM_MC_MEM_MAP(pu8Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    97419741        IEM_MC_FETCH_EFLAGS(EFlags);
    9742         if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     9742        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    97439743            IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, u8Src, pEFlags);
    97449744        else
     
    97619761    PCIEMOPBINSIZES pImpl = g_apIemImplGrp1[(bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK];
    97629762
    9763     switch (pIemCpu->enmEffOpSize)
     9763    switch (pVCpu->iem.s.enmEffOpSize)
    97649764    {
    97659765        case IEMMODE_16BIT:
     
    97759775                IEM_MC_ARG(uint32_t *,      pEFlags,                2);
    97769776
    9777                 IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     9777                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    97789778                IEM_MC_REF_EFLAGS(pEFlags);
    97799779                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
     
    98029802                uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
    98039803                IEM_MC_ASSIGN(u16Src, u16Imm);
    9804                 IEM_MC_MEM_MAP(pu16Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     9804                IEM_MC_MEM_MAP(pu16Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    98059805                IEM_MC_FETCH_EFLAGS(EFlags);
    9806                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     9806                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    98079807                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
    98089808                else
     
    98299829                IEM_MC_ARG(uint32_t *,      pEFlags,                2);
    98309830
    9831                 IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     9831                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    98329832                IEM_MC_REF_EFLAGS(pEFlags);
    98339833                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
     
    98579857                uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
    98589858                IEM_MC_ASSIGN(u32Src, u32Imm);
    9859                 IEM_MC_MEM_MAP(pu32Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     9859                IEM_MC_MEM_MAP(pu32Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    98609860                IEM_MC_FETCH_EFLAGS(EFlags);
    9861                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     9861                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    98629862                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
    98639863                else
     
    98849884                IEM_MC_ARG(uint32_t *,      pEFlags,                2);
    98859885
    9886                 IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     9886                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    98879887                IEM_MC_REF_EFLAGS(pEFlags);
    98889888                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
     
    99119911                uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
    99129912                IEM_MC_ASSIGN(u64Src, u64Imm);
    9913                 IEM_MC_MEM_MAP(pu64Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     9913                IEM_MC_MEM_MAP(pu64Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    99149914                IEM_MC_FETCH_EFLAGS(EFlags);
    9915                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     9915                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    99169916                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
    99179917                else
     
    99559955        IEMOP_HLP_NO_LOCK_PREFIX();
    99569956        uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    9957         switch (pIemCpu->enmEffOpSize)
     9957        switch (pVCpu->iem.s.enmEffOpSize)
    99589958        {
    99599959            case IEMMODE_16BIT:
     
    99649964                IEM_MC_ARG(uint32_t *,      pEFlags,                    2);
    99659965
    9966                 IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     9966                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    99679967                IEM_MC_REF_EFLAGS(pEFlags);
    99689968                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
     
    99809980                IEM_MC_ARG(uint32_t *,      pEFlags,                    2);
    99819981
    9982                 IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     9982                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    99839983                IEM_MC_REF_EFLAGS(pEFlags);
    99849984                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
     
    99979997                IEM_MC_ARG(uint32_t *,      pEFlags,                    2);
    99989998
    9999                 IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     9999                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1000010000                IEM_MC_REF_EFLAGS(pEFlags);
    1000110001                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
     
    1002110021        }
    1002210022
    10023         switch (pIemCpu->enmEffOpSize)
     10023        switch (pVCpu->iem.s.enmEffOpSize)
    1002410024        {
    1002510025            case IEMMODE_16BIT:
     
    1003410034                uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1003510035                IEM_MC_ASSIGN(u16Src, (int8_t)u8Imm);
    10036                 IEM_MC_MEM_MAP(pu16Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     10036                IEM_MC_MEM_MAP(pu16Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1003710037                IEM_MC_FETCH_EFLAGS(EFlags);
    10038                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     10038                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    1003910039                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, u16Src, pEFlags);
    1004010040                else
     
    1005910059                uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1006010060                IEM_MC_ASSIGN(u32Src, (int8_t)u8Imm);
    10061                 IEM_MC_MEM_MAP(pu32Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     10061                IEM_MC_MEM_MAP(pu32Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1006210062                IEM_MC_FETCH_EFLAGS(EFlags);
    10063                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     10063                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    1006410064                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, u32Src, pEFlags);
    1006510065                else
     
    1008410084                uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1008510085                IEM_MC_ASSIGN(u64Src, (int8_t)u8Imm);
    10086                 IEM_MC_MEM_MAP(pu64Dst, fAccess, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     10086                IEM_MC_MEM_MAP(pu64Dst, fAccess, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1008710087                IEM_MC_FETCH_EFLAGS(EFlags);
    10088                 if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     10088                if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    1008910089                    IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, u64Src, pEFlags);
    1009010090                else
     
    1014010140        IEM_MC_LOCAL(uint8_t, uTmp2);
    1014110141
    10142         IEM_MC_FETCH_GREG_U8(uTmp1, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    10143         IEM_MC_FETCH_GREG_U8(uTmp2, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    10144         IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB,                              uTmp1);
    10145         IEM_MC_STORE_GREG_U8(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, uTmp2);
     10142        IEM_MC_FETCH_GREG_U8(uTmp1, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     10143        IEM_MC_FETCH_GREG_U8(uTmp2, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     10144        IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,                              uTmp1);
     10145        IEM_MC_STORE_GREG_U8(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uTmp2);
    1014610146
    1014710147        IEM_MC_ADVANCE_RIP();
     
    1016010160
    1016110161        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10162         IEM_MC_MEM_MAP(pu8Mem, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    10163         IEM_MC_REF_GREG_U8(pu8Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     10162        IEM_MC_MEM_MAP(pu8Mem, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
     10163        IEM_MC_REF_GREG_U8(pu8Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    1016410164        IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u8, pu8Mem, pu8Reg);
    1016510165        IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Mem, IEM_ACCESS_DATA_RW);
     
    1018510185        IEMOP_HLP_NO_LOCK_PREFIX();
    1018610186
    10187         switch (pIemCpu->enmEffOpSize)
     10187        switch (pVCpu->iem.s.enmEffOpSize)
    1018810188        {
    1018910189            case IEMMODE_16BIT:
     
    1019210192                IEM_MC_LOCAL(uint16_t, uTmp2);
    1019310193
    10194                 IEM_MC_FETCH_GREG_U16(uTmp1, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    10195                 IEM_MC_FETCH_GREG_U16(uTmp2, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    10196                 IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB,                              uTmp1);
    10197                 IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, uTmp2);
     10194                IEM_MC_FETCH_GREG_U16(uTmp1, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     10195                IEM_MC_FETCH_GREG_U16(uTmp2, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     10196                IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,                              uTmp1);
     10197                IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uTmp2);
    1019810198
    1019910199                IEM_MC_ADVANCE_RIP();
     
    1020610206                IEM_MC_LOCAL(uint32_t, uTmp2);
    1020710207
    10208                 IEM_MC_FETCH_GREG_U32(uTmp1, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    10209                 IEM_MC_FETCH_GREG_U32(uTmp2, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    10210                 IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB,                              uTmp1);
    10211                 IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, uTmp2);
     10208                IEM_MC_FETCH_GREG_U32(uTmp1, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     10209                IEM_MC_FETCH_GREG_U32(uTmp2, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     10210                IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,                              uTmp1);
     10211                IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uTmp2);
    1021210212
    1021310213                IEM_MC_ADVANCE_RIP();
     
    1022010220                IEM_MC_LOCAL(uint64_t, uTmp2);
    1022110221
    10222                 IEM_MC_FETCH_GREG_U64(uTmp1, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    10223                 IEM_MC_FETCH_GREG_U64(uTmp2, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    10224                 IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB,                              uTmp1);
    10225                 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, uTmp2);
     10222                IEM_MC_FETCH_GREG_U64(uTmp1, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     10223                IEM_MC_FETCH_GREG_U64(uTmp2, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     10224                IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,                              uTmp1);
     10225                IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uTmp2);
    1022610226
    1022710227                IEM_MC_ADVANCE_RIP();
     
    1023710237         * We're accessing memory.
    1023810238         */
    10239         switch (pIemCpu->enmEffOpSize)
     10239        switch (pVCpu->iem.s.enmEffOpSize)
    1024010240        {
    1024110241/** @todo the register must be committed separately! */
     
    1024710247
    1024810248                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10249                 IEM_MC_MEM_MAP(pu16Mem, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    10250                 IEM_MC_REF_GREG_U16(pu16Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     10249                IEM_MC_MEM_MAP(pu16Mem, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
     10250                IEM_MC_REF_GREG_U16(pu16Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    1025110251                IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u16, pu16Mem, pu16Reg);
    1025210252                IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Mem, IEM_ACCESS_DATA_RW);
     
    1026310263
    1026410264                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10265                 IEM_MC_MEM_MAP(pu32Mem, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    10266                 IEM_MC_REF_GREG_U32(pu32Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     10265                IEM_MC_MEM_MAP(pu32Mem, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
     10266                IEM_MC_REF_GREG_U32(pu32Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    1026710267                IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u32, pu32Mem, pu32Reg);
    1026810268                IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Mem, IEM_ACCESS_DATA_RW);
     
    1028010280
    1028110281                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10282                 IEM_MC_MEM_MAP(pu64Mem, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
    10283                 IEM_MC_REF_GREG_U64(pu64Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
     10282                IEM_MC_MEM_MAP(pu64Mem, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
     10283                IEM_MC_REF_GREG_U64(pu64Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    1028410284                IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u64, pu64Mem, pu64Reg);
    1028510285                IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Mem, IEM_ACCESS_DATA_RW);
     
    1031110311        IEM_MC_BEGIN(0, 1);
    1031210312        IEM_MC_LOCAL(uint8_t, u8Value);
    10313         IEM_MC_FETCH_GREG_U8(u8Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    10314         IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u8Value);
     10313        IEM_MC_FETCH_GREG_U8(u8Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     10314        IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u8Value);
    1031510315        IEM_MC_ADVANCE_RIP();
    1031610316        IEM_MC_END();
     
    1032510325        IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    1032610326        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10327         IEM_MC_FETCH_GREG_U8(u8Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    10328         IEM_MC_STORE_MEM_U8(pIemCpu->iEffSeg, GCPtrEffDst, u8Value);
     10327        IEM_MC_FETCH_GREG_U8(u8Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     10328        IEM_MC_STORE_MEM_U8(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u8Value);
    1032910329        IEM_MC_ADVANCE_RIP();
    1033010330        IEM_MC_END();
     
    1034810348    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    1034910349    {
    10350         switch (pIemCpu->enmEffOpSize)
     10350        switch (pVCpu->iem.s.enmEffOpSize)
    1035110351        {
    1035210352            case IEMMODE_16BIT:
    1035310353                IEM_MC_BEGIN(0, 1);
    1035410354                IEM_MC_LOCAL(uint16_t, u16Value);
    10355                 IEM_MC_FETCH_GREG_U16(u16Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    10356                 IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Value);
     10355                IEM_MC_FETCH_GREG_U16(u16Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     10356                IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u16Value);
    1035710357                IEM_MC_ADVANCE_RIP();
    1035810358                IEM_MC_END();
     
    1036210362                IEM_MC_BEGIN(0, 1);
    1036310363                IEM_MC_LOCAL(uint32_t, u32Value);
    10364                 IEM_MC_FETCH_GREG_U32(u32Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    10365                 IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Value);
     10364                IEM_MC_FETCH_GREG_U32(u32Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     10365                IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u32Value);
    1036610366                IEM_MC_ADVANCE_RIP();
    1036710367                IEM_MC_END();
     
    1037110371                IEM_MC_BEGIN(0, 1);
    1037210372                IEM_MC_LOCAL(uint64_t, u64Value);
    10373                 IEM_MC_FETCH_GREG_U64(u64Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    10374                 IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Value);
     10373                IEM_MC_FETCH_GREG_U64(u64Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     10374                IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u64Value);
    1037510375                IEM_MC_ADVANCE_RIP();
    1037610376                IEM_MC_END();
     
    1038310383         * We're writing a register to memory.
    1038410384         */
    10385         switch (pIemCpu->enmEffOpSize)
     10385        switch (pVCpu->iem.s.enmEffOpSize)
    1038610386        {
    1038710387            case IEMMODE_16BIT:
     
    1039010390                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    1039110391                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10392                 IEM_MC_FETCH_GREG_U16(u16Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    10393                 IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Value);
     10392                IEM_MC_FETCH_GREG_U16(u16Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     10393                IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u16Value);
    1039410394                IEM_MC_ADVANCE_RIP();
    1039510395                IEM_MC_END();
     
    1040110401                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    1040210402                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10403                 IEM_MC_FETCH_GREG_U32(u32Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    10404                 IEM_MC_STORE_MEM_U32(pIemCpu->iEffSeg, GCPtrEffDst, u32Value);
     10403                IEM_MC_FETCH_GREG_U32(u32Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     10404                IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u32Value);
    1040510405                IEM_MC_ADVANCE_RIP();
    1040610406                IEM_MC_END();
     
    1041210412                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    1041310413                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10414                 IEM_MC_FETCH_GREG_U64(u64Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg);
    10415                 IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffDst, u64Value);
     10414                IEM_MC_FETCH_GREG_U64(u64Value, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     10415                IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u64Value);
    1041610416                IEM_MC_ADVANCE_RIP();
    1041710417                IEM_MC_END();
     
    1043810438        IEM_MC_BEGIN(0, 1);
    1043910439        IEM_MC_LOCAL(uint8_t, u8Value);
    10440         IEM_MC_FETCH_GREG_U8(u8Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    10441         IEM_MC_STORE_GREG_U8(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u8Value);
     10440        IEM_MC_FETCH_GREG_U8(u8Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     10441        IEM_MC_STORE_GREG_U8(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u8Value);
    1044210442        IEM_MC_ADVANCE_RIP();
    1044310443        IEM_MC_END();
     
    1045210452        IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    1045310453        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10454         IEM_MC_FETCH_MEM_U8(u8Value, pIemCpu->iEffSeg, GCPtrEffDst);
    10455         IEM_MC_STORE_GREG_U8(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u8Value);
     10454        IEM_MC_FETCH_MEM_U8(u8Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10455        IEM_MC_STORE_GREG_U8(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u8Value);
    1045610456        IEM_MC_ADVANCE_RIP();
    1045710457        IEM_MC_END();
     
    1047410474    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    1047510475    {
    10476         switch (pIemCpu->enmEffOpSize)
     10476        switch (pVCpu->iem.s.enmEffOpSize)
    1047710477        {
    1047810478            case IEMMODE_16BIT:
    1047910479                IEM_MC_BEGIN(0, 1);
    1048010480                IEM_MC_LOCAL(uint16_t, u16Value);
    10481                 IEM_MC_FETCH_GREG_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    10482                 IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Value);
     10481                IEM_MC_FETCH_GREG_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     10482                IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16Value);
    1048310483                IEM_MC_ADVANCE_RIP();
    1048410484                IEM_MC_END();
     
    1048810488                IEM_MC_BEGIN(0, 1);
    1048910489                IEM_MC_LOCAL(uint32_t, u32Value);
    10490                 IEM_MC_FETCH_GREG_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    10491                 IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
     10490                IEM_MC_FETCH_GREG_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     10491                IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Value);
    1049210492                IEM_MC_ADVANCE_RIP();
    1049310493                IEM_MC_END();
     
    1049710497                IEM_MC_BEGIN(0, 1);
    1049810498                IEM_MC_LOCAL(uint64_t, u64Value);
    10499                 IEM_MC_FETCH_GREG_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
    10500                 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
     10499                IEM_MC_FETCH_GREG_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     10500                IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Value);
    1050110501                IEM_MC_ADVANCE_RIP();
    1050210502                IEM_MC_END();
     
    1050910509         * We're loading a register from memory.
    1051010510         */
    10511         switch (pIemCpu->enmEffOpSize)
     10511        switch (pVCpu->iem.s.enmEffOpSize)
    1051210512        {
    1051310513            case IEMMODE_16BIT:
     
    1051610516                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    1051710517                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10518                 IEM_MC_FETCH_MEM_U16(u16Value, pIemCpu->iEffSeg, GCPtrEffDst);
    10519                 IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Value);
     10518                IEM_MC_FETCH_MEM_U16(u16Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10519                IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16Value);
    1052010520                IEM_MC_ADVANCE_RIP();
    1052110521                IEM_MC_END();
     
    1052710527                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    1052810528                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10529                 IEM_MC_FETCH_MEM_U32(u32Value, pIemCpu->iEffSeg, GCPtrEffDst);
    10530                 IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Value);
     10529                IEM_MC_FETCH_MEM_U32(u32Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10530                IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Value);
    1053110531                IEM_MC_ADVANCE_RIP();
    1053210532                IEM_MC_END();
     
    1053810538                IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    1053910539                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10540                 IEM_MC_FETCH_MEM_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
    10541                 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value);
     10540                IEM_MC_FETCH_MEM_U64(u64Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
     10541                IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Value);
    1054210542                IEM_MC_ADVANCE_RIP();
    1054310543                IEM_MC_END();
     
    1055210552FNIEMOP_DEF(iemOp_arpl_Ew_Gw_movsx_Gv_Ev)
    1055310553{
    10554     if (pIemCpu->enmCpuMode != IEMMODE_64BIT)
     10554    if (pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT)
    1055510555        return FNIEMOP_CALL(iemOp_arpl_Ew_Gw);
    10556     if (pIemCpu->enmEffOpSize != IEMMODE_64BIT)
     10556    if (pVCpu->iem.s.enmEffOpSize != IEMMODE_64BIT)
    1055710557        return FNIEMOP_CALL(iemOp_mov_Gv_Ev);
    1055810558    return FNIEMOP_CALL(iemOp_movsxd_Gv_Ev);
     
    1058210582    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    1058310583    {
    10584         switch (pIemCpu->enmEffOpSize)
     10584        switch (pVCpu->iem.s.enmEffOpSize)
    1058510585        {
    1058610586            case IEMMODE_16BIT:
     
    1058810588                IEM_MC_LOCAL(uint16_t, u16Value);
    1058910589                IEM_MC_FETCH_SREG_U16(u16Value, iSegReg);
    10590                 IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Value);
     10590                IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u16Value);
    1059110591                IEM_MC_ADVANCE_RIP();
    1059210592                IEM_MC_END();
     
    1059710597                IEM_MC_LOCAL(uint32_t, u32Value);
    1059810598                IEM_MC_FETCH_SREG_ZX_U32(u32Value, iSegReg);
    10599                 IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Value);
     10599                IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u32Value);
    1060010600                IEM_MC_ADVANCE_RIP();
    1060110601                IEM_MC_END();
     
    1060610606                IEM_MC_LOCAL(uint64_t, u64Value);
    1060710607                IEM_MC_FETCH_SREG_ZX_U64(u64Value, iSegReg);
    10608                 IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Value);
     10608                IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u64Value);
    1060910609                IEM_MC_ADVANCE_RIP();
    1061010610                IEM_MC_END();
     
    1061910619         */
    1062010620#if 0 /* not necessary */
    10621         pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_16BIT;
     10621        pVCpu->iem.s.enmEffOpSize = pVCpu->iem.s.enmDefOpSize = IEMMODE_16BIT;
    1062210622#endif
    1062310623        IEM_MC_BEGIN(0, 2);
     
    1062610626        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    1062710627        IEM_MC_FETCH_SREG_U16(u16Value, iSegReg);
    10628         IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Value);
     10628        IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u16Value);
    1062910629        IEM_MC_ADVANCE_RIP();
    1063010630        IEM_MC_END();
     
    1064510645        return IEMOP_RAISE_INVALID_OPCODE(); /* no register form */
    1064610646
    10647     switch (pIemCpu->enmEffOpSize)
     10647    switch (pVCpu->iem.s.enmEffOpSize)
    1064810648    {
    1064910649        case IEMMODE_16BIT:
     
    1065310653            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1065410654            IEM_MC_ASSIGN_TO_SMALLER(u16Cast, GCPtrEffSrc);
    10655             IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u16Cast);
     10655            IEM_MC_STORE_GREG_U16(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u16Cast);
    1065610656            IEM_MC_ADVANCE_RIP();
    1065710657            IEM_MC_END();
     
    1066410664            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1066510665            IEM_MC_ASSIGN_TO_SMALLER(u32Cast, GCPtrEffSrc);
    10666             IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u32Cast);
     10666            IEM_MC_STORE_GREG_U32(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Cast);
    1066710667            IEM_MC_ADVANCE_RIP();
    1066810668            IEM_MC_END();
     
    1067310673            IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    1067410674            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    10675             IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, GCPtrEffSrc);
     10675            IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, GCPtrEffSrc);
    1067610676            IEM_MC_ADVANCE_RIP();
    1067710677            IEM_MC_END();
     
    1069410694     */
    1069510695#if 0 /* not necessary */
    10696     pIemCpu->enmEffOpSize = pIemCpu->enmDefOpSize = IEMMODE_16BIT;
     10696    pVCpu->iem.s.enmEffOpSize = pVCpu->iem.s.enmDefOpSize = IEMMODE_16BIT;
    1069710697#endif
    1069810698
     
    1071410714        IEM_MC_ARG_CONST(uint8_t, iSRegArg, iSegReg, 0);
    1071510715        IEM_MC_ARG(uint16_t,      u16Value,          1);
    10716         IEM_MC_FETCH_GREG_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     10716        IEM_MC_FETCH_GREG_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1071710717        IEM_MC_CALL_CIMPL_2(iemCImpl_load_SReg, iSRegArg, u16Value);
    1071810718        IEM_MC_END();
     
    1072910729        IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    1073010730        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    10731         IEM_MC_FETCH_MEM_U16(u16Value, pIemCpu->iEffSeg, GCPtrEffDst);
     10731        IEM_MC_FETCH_MEM_U16(u16Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1073210732        IEM_MC_CALL_CIMPL_2(iemCImpl_load_SReg, iSRegArg, u16Value);
    1073310733        IEM_MC_END();
     
    1075510755    /* Register access is relatively easy and can share code. */
    1075610756    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    10757         return FNIEMOP_CALL_1(iemOpCommonPopGReg, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     10757        return FNIEMOP_CALL_1(iemOpCommonPopGReg, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1075810758
    1075910759    /*
     
    1077210772#ifndef TST_IEM_CHECK_MC
    1077310773    /* Calc effective address with modified ESP. */
    10774     uint8_t const   offOpcodeSaved = pIemCpu->offOpcode;
     10774    uint8_t const   offOpcodeSaved = pVCpu->iem.s.offOpcode;
    1077510775    RTGCPTR         GCPtrEff;
    1077610776    VBOXSTRICTRC    rcStrict;
    10777     rcStrict = iemOpHlpCalcRmEffAddr(pIemCpu, bRm, 0, &GCPtrEff);
     10777    rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);
    1077810778    if (rcStrict != VINF_SUCCESS)
    1077910779        return rcStrict;
    10780     pIemCpu->offOpcode = offOpcodeSaved;
    10781 
    10782     PCPUMCTX        pCtx     = pIemCpu->CTX_SUFF(pCtx);
     10780    pVCpu->iem.s.offOpcode = offOpcodeSaved;
     10781
     10782    PCPUMCTX        pCtx     = pVCpu->iem.s.CTX_SUFF(pCtx);
    1078310783    uint64_t const  RspSaved = pCtx->rsp;
    10784     switch (pIemCpu->enmEffOpSize)
    10785     {
    10786         case IEMMODE_16BIT: iemRegAddToRsp(pIemCpu, pCtx, 2); break;
    10787         case IEMMODE_32BIT: iemRegAddToRsp(pIemCpu, pCtx, 4); break;
    10788         case IEMMODE_64BIT: iemRegAddToRsp(pIemCpu, pCtx, 8); break;
     10784    switch (pVCpu->iem.s.enmEffOpSize)
     10785    {
     10786        case IEMMODE_16BIT: iemRegAddToRsp(pVCpu, pCtx, 2); break;
     10787        case IEMMODE_32BIT: iemRegAddToRsp(pVCpu, pCtx, 4); break;
     10788        case IEMMODE_64BIT: iemRegAddToRsp(pVCpu, pCtx, 8); break;
    1078910789        IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1079010790    }
    10791     rcStrict = iemOpHlpCalcRmEffAddr(pIemCpu, bRm, 0, &GCPtrEff);
     10791    rcStrict = iemOpHlpCalcRmEffAddr(pVCpu, bRm, 0, &GCPtrEff);
    1079210792    Assert(rcStrict == VINF_SUCCESS);
    1079310793    pCtx->rsp = RspSaved;
     
    1079610796    RTUINT64U TmpRsp;
    1079710797    TmpRsp.u = pCtx->rsp;
    10798     switch (pIemCpu->enmEffOpSize)
     10798    switch (pVCpu->iem.s.enmEffOpSize)
    1079910799    {
    1080010800        case IEMMODE_16BIT:
    1080110801        {
    1080210802            uint16_t u16Value;
    10803             rcStrict = iemMemStackPopU16Ex(pIemCpu, &u16Value, &TmpRsp);
     10803            rcStrict = iemMemStackPopU16Ex(pVCpu, &u16Value, &TmpRsp);
    1080410804            if (rcStrict == VINF_SUCCESS)
    10805                 rcStrict = iemMemStoreDataU16(pIemCpu, pIemCpu->iEffSeg, GCPtrEff, u16Value);
     10805                rcStrict = iemMemStoreDataU16(pVCpu, pVCpu->iem.s.iEffSeg, GCPtrEff, u16Value);
    1080610806            break;
    1080710807        }
     
    1081010810        {
    1081110811            uint32_t u32Value;
    10812             rcStrict = iemMemStackPopU32Ex(pIemCpu, &u32Value, &TmpRsp);
     10812            rcStrict = iemMemStackPopU32Ex(pVCpu, &u32Value, &TmpRsp);
    1081310813            if (rcStrict == VINF_SUCCESS)
    10814                 rcStrict = iemMemStoreDataU32(pIemCpu, pIemCpu->iEffSeg, GCPtrEff, u32Value);
     10814                rcStrict = iemMemStoreDataU32(pVCpu, pVCpu->iem.s.iEffSeg, GCPtrEff, u32Value);
    1081510815            break;
    1081610816        }
     
    1081910819        {
    1082010820            uint64_t u64Value;
    10821             rcStrict = iemMemStackPopU64Ex(pIemCpu, &u64Value, &TmpRsp);
     10821            rcStrict = iemMemStackPopU64Ex(pVCpu, &u64Value, &TmpRsp);
    1082210822            if (rcStrict == VINF_SUCCESS)
    10823                 rcStrict = iemMemStoreDataU64(pIemCpu, pIemCpu->iEffSeg, GCPtrEff, u64Value);
     10823                rcStrict = iemMemStoreDataU64(pVCpu, pVCpu->iem.s.iEffSeg, GCPtrEff, u64Value);
    1082410824            break;
    1082510825        }
     
    1083010830    {
    1083110831        pCtx->rsp = TmpRsp.u;
    10832         iemRegUpdateRipAndClearRF(pIemCpu);
     10832        iemRegUpdateRipAndClearRF(pVCpu);
    1083310833    }
    1083410834    return rcStrict;
     
    1086110861    IEMOP_HLP_NO_LOCK_PREFIX();
    1086210862
    10863     iReg |= pIemCpu->uRexB;
    10864     switch (pIemCpu->enmEffOpSize)
     10863    iReg |= pVCpu->iem.s.uRexB;
     10864    switch (pVCpu->iem.s.enmEffOpSize)
    1086510865    {
    1086610866        case IEMMODE_16BIT:
     
    1090910909{
    1091010910    /* R8/R8D and RAX/EAX can be exchanged. */
    10911     if (pIemCpu->fPrefixes & IEM_OP_PRF_REX_B)
     10911    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REX_B)
    1091210912    {
    1091310913        IEMOP_MNEMONIC("xchg r8,rAX");
     
    1091510915    }
    1091610916
    10917     if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK)
     10917    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK)
    1091810918        IEMOP_MNEMONIC("pause");
    1091910919    else
     
    1098610986{
    1098710987    IEMOP_HLP_NO_LOCK_PREFIX();
    10988     switch (pIemCpu->enmEffOpSize)
     10988    switch (pVCpu->iem.s.enmEffOpSize)
    1098910989    {
    1099010990        case IEMMODE_16BIT:
     
    1103311033{
    1103411034    IEMOP_HLP_NO_LOCK_PREFIX();
    11035     switch (pIemCpu->enmEffOpSize)
     11035    switch (pVCpu->iem.s.enmEffOpSize)
    1103611036    {
    1103711037        case IEMMODE_16BIT:
     
    1108411084    /* Decode the far pointer address and pass it on to the far call C implementation. */
    1108511085    uint32_t offSeg;
    11086     if (pIemCpu->enmEffOpSize != IEMMODE_16BIT)
     11086    if (pVCpu->iem.s.enmEffOpSize != IEMMODE_16BIT)
    1108711087        IEM_OPCODE_GET_NEXT_U32(&offSeg);
    1108811088    else
     
    1109011090    uint16_t uSel;  IEM_OPCODE_GET_NEXT_U16(&uSel);
    1109111091    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    11092     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_callf, uSel, offSeg, pIemCpu->enmEffOpSize);
     11092    return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_callf, uSel, offSeg, pVCpu->iem.s.enmEffOpSize);
    1109311093}
    1109411094
     
    1111411114    IEMOP_HLP_NO_LOCK_PREFIX();
    1111511115    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    11116     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_pushf, pIemCpu->enmEffOpSize);
     11116    return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_pushf, pVCpu->iem.s.enmEffOpSize);
    1111711117}
    1111811118
     
    1112311123    IEMOP_HLP_NO_LOCK_PREFIX();
    1112411124    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    11125     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_popf, pIemCpu->enmEffOpSize);
     11125    return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_popf, pVCpu->iem.s.enmEffOpSize);
    1112611126}
    1112711127
     
    1113211132    IEMOP_MNEMONIC("sahf");
    1113311133    IEMOP_HLP_NO_LOCK_PREFIX();
    11134     if (   pIemCpu->enmCpuMode == IEMMODE_64BIT
    11135         && !IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fLahfSahf)
     11134    if (   pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT
     11135        && !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fLahfSahf)
    1113611136        return IEMOP_RAISE_INVALID_OPCODE();
    1113711137    IEM_MC_BEGIN(0, 2);
     
    1115611156    IEMOP_MNEMONIC("lahf");
    1115711157    IEMOP_HLP_NO_LOCK_PREFIX();
    11158     if (   pIemCpu->enmCpuMode == IEMMODE_64BIT
    11159         && !IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fLahfSahf)
     11158    if (   pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT
     11159        && !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fLahfSahf)
    1116011160        return IEMOP_RAISE_INVALID_OPCODE();
    1116111161    IEM_MC_BEGIN(0, 1);
     
    1117811178    do \
    1117911179    { \
    11180         switch (pIemCpu->enmEffAddrMode) \
     11180        switch (pVCpu->iem.s.enmEffAddrMode) \
    1118111181        { \
    1118211182            case IEMMODE_16BIT: \
     
    1120811208    IEM_MC_BEGIN(0,1);
    1120911209    IEM_MC_LOCAL(uint8_t, u8Tmp);
    11210     IEM_MC_FETCH_MEM_U8(u8Tmp, pIemCpu->iEffSeg, GCPtrMemOff);
     11210    IEM_MC_FETCH_MEM_U8(u8Tmp, pVCpu->iem.s.iEffSeg, GCPtrMemOff);
    1121111211    IEM_MC_STORE_GREG_U8(X86_GREG_xAX, u8Tmp);
    1121211212    IEM_MC_ADVANCE_RIP();
     
    1122911229     * Fetch rAX.
    1123011230     */
    11231     switch (pIemCpu->enmEffOpSize)
     11231    switch (pVCpu->iem.s.enmEffOpSize)
    1123211232    {
    1123311233        case IEMMODE_16BIT:
    1123411234            IEM_MC_BEGIN(0,1);
    1123511235            IEM_MC_LOCAL(uint16_t, u16Tmp);
    11236             IEM_MC_FETCH_MEM_U16(u16Tmp, pIemCpu->iEffSeg, GCPtrMemOff);
     11236            IEM_MC_FETCH_MEM_U16(u16Tmp, pVCpu->iem.s.iEffSeg, GCPtrMemOff);
    1123711237            IEM_MC_STORE_GREG_U16(X86_GREG_xAX, u16Tmp);
    1123811238            IEM_MC_ADVANCE_RIP();
     
    1124311243            IEM_MC_BEGIN(0,1);
    1124411244            IEM_MC_LOCAL(uint32_t, u32Tmp);
    11245             IEM_MC_FETCH_MEM_U32(u32Tmp, pIemCpu->iEffSeg, GCPtrMemOff);
     11245            IEM_MC_FETCH_MEM_U32(u32Tmp, pVCpu->iem.s.iEffSeg, GCPtrMemOff);
    1124611246            IEM_MC_STORE_GREG_U32(X86_GREG_xAX, u32Tmp);
    1124711247            IEM_MC_ADVANCE_RIP();
     
    1125211252            IEM_MC_BEGIN(0,1);
    1125311253            IEM_MC_LOCAL(uint64_t, u64Tmp);
    11254             IEM_MC_FETCH_MEM_U64(u64Tmp, pIemCpu->iEffSeg, GCPtrMemOff);
     11254            IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrMemOff);
    1125511255            IEM_MC_STORE_GREG_U64(X86_GREG_xAX, u64Tmp);
    1125611256            IEM_MC_ADVANCE_RIP();
     
    1127811278    IEM_MC_LOCAL(uint8_t, u8Tmp);
    1127911279    IEM_MC_FETCH_GREG_U8(u8Tmp, X86_GREG_xAX);
    11280     IEM_MC_STORE_MEM_U8(pIemCpu->iEffSeg, GCPtrMemOff, u8Tmp);
     11280    IEM_MC_STORE_MEM_U8(pVCpu->iem.s.iEffSeg, GCPtrMemOff, u8Tmp);
    1128111281    IEM_MC_ADVANCE_RIP();
    1128211282    IEM_MC_END();
     
    1129711297     * Store rAX.
    1129811298     */
    11299     switch (pIemCpu->enmEffOpSize)
     11299    switch (pVCpu->iem.s.enmEffOpSize)
    1130011300    {
    1130111301        case IEMMODE_16BIT:
     
    1130311303            IEM_MC_LOCAL(uint16_t, u16Tmp);
    1130411304            IEM_MC_FETCH_GREG_U16(u16Tmp, X86_GREG_xAX);
    11305             IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrMemOff, u16Tmp);
     11305            IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrMemOff, u16Tmp);
    1130611306            IEM_MC_ADVANCE_RIP();
    1130711307            IEM_MC_END();
     
    1131211312            IEM_MC_LOCAL(uint32_t, u32Tmp);
    1131311313            IEM_MC_FETCH_GREG_U32(u32Tmp, X86_GREG_xAX);
    11314             IEM_MC_STORE_MEM_U32(pIemCpu->iEffSeg, GCPtrMemOff, u32Tmp);
     11314            IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrMemOff, u32Tmp);
    1131511315            IEM_MC_ADVANCE_RIP();
    1131611316            IEM_MC_END();
     
    1132111321            IEM_MC_LOCAL(uint64_t, u64Tmp);
    1132211322            IEM_MC_FETCH_GREG_U64(u64Tmp, X86_GREG_xAX);
    11323             IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrMemOff, u64Tmp);
     11323            IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrMemOff, u64Tmp);
    1132411324            IEM_MC_ADVANCE_RIP();
    1132511325            IEM_MC_END();
     
    1133611336        IEM_MC_LOCAL(RTGCPTR,           uAddr); \
    1133711337        IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xSI); \
    11338         IEM_MC_FETCH_MEM_U##ValBits(uValue, pIemCpu->iEffSeg, uAddr); \
     11338        IEM_MC_FETCH_MEM_U##ValBits(uValue, pVCpu->iem.s.iEffSeg, uAddr); \
    1133911339        IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xDI); \
    1134011340        IEM_MC_STORE_MEM_U##ValBits(X86_SREG_ES, uAddr, uValue); \
     
    1135711357     * Use the C implementation if a repeat prefix is encountered.
    1135811358     */
    11359     if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     11359    if (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    1136011360    {
    1136111361        IEMOP_MNEMONIC("rep movsb Xb,Yb");
    11362         switch (pIemCpu->enmEffAddrMode)
     11362        switch (pVCpu->iem.s.enmEffAddrMode)
    1136311363        {
    11364             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op8_addr16, pIemCpu->iEffSeg);
    11365             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op8_addr32, pIemCpu->iEffSeg);
    11366             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op8_addr64, pIemCpu->iEffSeg);
     11364            case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op8_addr16, pVCpu->iem.s.iEffSeg);
     11365            case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op8_addr32, pVCpu->iem.s.iEffSeg);
     11366            case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op8_addr64, pVCpu->iem.s.iEffSeg);
    1136711367            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1136811368        }
     
    1137311373     * Sharing case implementation with movs[wdq] below.
    1137411374     */
    11375     switch (pIemCpu->enmEffAddrMode)
     11375    switch (pVCpu->iem.s.enmEffAddrMode)
    1137611376    {
    1137711377        case IEMMODE_16BIT: IEM_MOVS_CASE(8, 16); break;
     
    1139211392     * Use the C implementation if a repeat prefix is encountered.
    1139311393     */
    11394     if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     11394    if (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    1139511395    {
    1139611396        IEMOP_MNEMONIC("rep movs Xv,Yv");
    11397         switch (pIemCpu->enmEffOpSize)
     11397        switch (pVCpu->iem.s.enmEffOpSize)
    1139811398        {
    1139911399            case IEMMODE_16BIT:
    11400                 switch (pIemCpu->enmEffAddrMode)
     11400                switch (pVCpu->iem.s.enmEffAddrMode)
    1140111401                {
    11402                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op16_addr16, pIemCpu->iEffSeg);
    11403                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op16_addr32, pIemCpu->iEffSeg);
    11404                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op16_addr64, pIemCpu->iEffSeg);
     11402                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op16_addr16, pVCpu->iem.s.iEffSeg);
     11403                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op16_addr32, pVCpu->iem.s.iEffSeg);
     11404                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op16_addr64, pVCpu->iem.s.iEffSeg);
    1140511405                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1140611406                }
    1140711407                break;
    1140811408            case IEMMODE_32BIT:
    11409                 switch (pIemCpu->enmEffAddrMode)
     11409                switch (pVCpu->iem.s.enmEffAddrMode)
    1141011410                {
    11411                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op32_addr16, pIemCpu->iEffSeg);
    11412                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op32_addr32, pIemCpu->iEffSeg);
    11413                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op32_addr64, pIemCpu->iEffSeg);
     11411                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op32_addr16, pVCpu->iem.s.iEffSeg);
     11412                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op32_addr32, pVCpu->iem.s.iEffSeg);
     11413                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op32_addr64, pVCpu->iem.s.iEffSeg);
    1141411414                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1141511415                }
    1141611416            case IEMMODE_64BIT:
    11417                 switch (pIemCpu->enmEffAddrMode)
     11417                switch (pVCpu->iem.s.enmEffAddrMode)
    1141811418                {
    1141911419                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_6);
    11420                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op64_addr32, pIemCpu->iEffSeg);
    11421                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op64_addr64, pIemCpu->iEffSeg);
     11420                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op64_addr32, pVCpu->iem.s.iEffSeg);
     11421                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_rep_movs_op64_addr64, pVCpu->iem.s.iEffSeg);
    1142211422                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1142311423                }
     
    1143111431     * Using ugly macro for implementing the cases, sharing it with movsb.
    1143211432     */
    11433     switch (pIemCpu->enmEffOpSize)
     11433    switch (pVCpu->iem.s.enmEffOpSize)
    1143411434    {
    1143511435        case IEMMODE_16BIT:
    11436             switch (pIemCpu->enmEffAddrMode)
     11436            switch (pVCpu->iem.s.enmEffAddrMode)
    1143711437            {
    1143811438                case IEMMODE_16BIT: IEM_MOVS_CASE(16, 16); break;
     
    1144411444
    1144511445        case IEMMODE_32BIT:
    11446             switch (pIemCpu->enmEffAddrMode)
     11446            switch (pVCpu->iem.s.enmEffAddrMode)
    1144711447            {
    1144811448                case IEMMODE_16BIT: IEM_MOVS_CASE(32, 16); break;
     
    1145411454
    1145511455        case IEMMODE_64BIT:
    11456             switch (pIemCpu->enmEffAddrMode)
     11456            switch (pVCpu->iem.s.enmEffAddrMode)
    1145711457            {
    1145811458                case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_1); /* cannot be encoded */ break;
     
    1147911479        \
    1148011480        IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xSI); \
    11481         IEM_MC_FETCH_MEM_U##ValBits(uValue1, pIemCpu->iEffSeg, uAddr); \
     11481        IEM_MC_FETCH_MEM_U##ValBits(uValue1, pVCpu->iem.s.iEffSeg, uAddr); \
    1148211482        IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xDI); \
    1148311483        IEM_MC_FETCH_MEM_U##ValBits(uValue2, X86_SREG_ES, uAddr); \
     
    1150411504     * Use the C implementation if a repeat prefix is encountered.
    1150511505     */
    11506     if (pIemCpu->fPrefixes & IEM_OP_PRF_REPZ)
     11506    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REPZ)
    1150711507    {
    1150811508        IEMOP_MNEMONIC("repe cmps Xb,Yb");
    11509         switch (pIemCpu->enmEffAddrMode)
     11509        switch (pVCpu->iem.s.enmEffAddrMode)
    1151011510        {
    11511             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op8_addr16, pIemCpu->iEffSeg);
    11512             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op8_addr32, pIemCpu->iEffSeg);
    11513             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op8_addr64, pIemCpu->iEffSeg);
     11511            case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op8_addr16, pVCpu->iem.s.iEffSeg);
     11512            case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op8_addr32, pVCpu->iem.s.iEffSeg);
     11513            case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op8_addr64, pVCpu->iem.s.iEffSeg);
    1151411514            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1151511515        }
    1151611516    }
    11517     if (pIemCpu->fPrefixes & IEM_OP_PRF_REPNZ)
     11517    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REPNZ)
    1151811518    {
    1151911519        IEMOP_MNEMONIC("repe cmps Xb,Yb");
    11520         switch (pIemCpu->enmEffAddrMode)
     11520        switch (pVCpu->iem.s.enmEffAddrMode)
    1152111521        {
    11522             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op8_addr16, pIemCpu->iEffSeg);
    11523             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op8_addr32, pIemCpu->iEffSeg);
    11524             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op8_addr64, pIemCpu->iEffSeg);
     11522            case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op8_addr16, pVCpu->iem.s.iEffSeg);
     11523            case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op8_addr32, pVCpu->iem.s.iEffSeg);
     11524            case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op8_addr64, pVCpu->iem.s.iEffSeg);
    1152511525            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1152611526        }
     
    1153111531     * Sharing case implementation with cmps[wdq] below.
    1153211532     */
    11533     switch (pIemCpu->enmEffAddrMode)
     11533    switch (pVCpu->iem.s.enmEffAddrMode)
    1153411534    {
    1153511535        case IEMMODE_16BIT: IEM_CMPS_CASE(8, 16); break;
     
    1155111551     * Use the C implementation if a repeat prefix is encountered.
    1155211552     */
    11553     if (pIemCpu->fPrefixes & IEM_OP_PRF_REPZ)
     11553    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REPZ)
    1155411554    {
    1155511555        IEMOP_MNEMONIC("repe cmps Xv,Yv");
    11556         switch (pIemCpu->enmEffOpSize)
     11556        switch (pVCpu->iem.s.enmEffOpSize)
    1155711557        {
    1155811558            case IEMMODE_16BIT:
    11559                 switch (pIemCpu->enmEffAddrMode)
     11559                switch (pVCpu->iem.s.enmEffAddrMode)
    1156011560                {
    11561                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op16_addr16, pIemCpu->iEffSeg);
    11562                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op16_addr32, pIemCpu->iEffSeg);
    11563                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op16_addr64, pIemCpu->iEffSeg);
     11561                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op16_addr16, pVCpu->iem.s.iEffSeg);
     11562                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op16_addr32, pVCpu->iem.s.iEffSeg);
     11563                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op16_addr64, pVCpu->iem.s.iEffSeg);
    1156411564                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1156511565                }
    1156611566                break;
    1156711567            case IEMMODE_32BIT:
    11568                 switch (pIemCpu->enmEffAddrMode)
     11568                switch (pVCpu->iem.s.enmEffAddrMode)
    1156911569                {
    11570                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op32_addr16, pIemCpu->iEffSeg);
    11571                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op32_addr32, pIemCpu->iEffSeg);
    11572                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op32_addr64, pIemCpu->iEffSeg);
     11570                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op32_addr16, pVCpu->iem.s.iEffSeg);
     11571                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op32_addr32, pVCpu->iem.s.iEffSeg);
     11572                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op32_addr64, pVCpu->iem.s.iEffSeg);
    1157311573                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1157411574                }
    1157511575            case IEMMODE_64BIT:
    11576                 switch (pIemCpu->enmEffAddrMode)
     11576                switch (pVCpu->iem.s.enmEffAddrMode)
    1157711577                {
    1157811578                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_4);
    11579                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op64_addr32, pIemCpu->iEffSeg);
    11580                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op64_addr64, pIemCpu->iEffSeg);
     11579                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op64_addr32, pVCpu->iem.s.iEffSeg);
     11580                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repe_cmps_op64_addr64, pVCpu->iem.s.iEffSeg);
    1158111581                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1158211582                }
     
    1158511585    }
    1158611586
    11587     if (pIemCpu->fPrefixes & IEM_OP_PRF_REPNZ)
     11587    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REPNZ)
    1158811588    {
    1158911589        IEMOP_MNEMONIC("repne cmps Xv,Yv");
    11590         switch (pIemCpu->enmEffOpSize)
     11590        switch (pVCpu->iem.s.enmEffOpSize)
    1159111591        {
    1159211592            case IEMMODE_16BIT:
    11593                 switch (pIemCpu->enmEffAddrMode)
     11593                switch (pVCpu->iem.s.enmEffAddrMode)
    1159411594                {
    11595                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op16_addr16, pIemCpu->iEffSeg);
    11596                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op16_addr32, pIemCpu->iEffSeg);
    11597                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op16_addr64, pIemCpu->iEffSeg);
     11595                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op16_addr16, pVCpu->iem.s.iEffSeg);
     11596                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op16_addr32, pVCpu->iem.s.iEffSeg);
     11597                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op16_addr64, pVCpu->iem.s.iEffSeg);
    1159811598                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1159911599                }
    1160011600                break;
    1160111601            case IEMMODE_32BIT:
    11602                 switch (pIemCpu->enmEffAddrMode)
     11602                switch (pVCpu->iem.s.enmEffAddrMode)
    1160311603                {
    11604                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op32_addr16, pIemCpu->iEffSeg);
    11605                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op32_addr32, pIemCpu->iEffSeg);
    11606                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op32_addr64, pIemCpu->iEffSeg);
     11604                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op32_addr16, pVCpu->iem.s.iEffSeg);
     11605                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op32_addr32, pVCpu->iem.s.iEffSeg);
     11606                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op32_addr64, pVCpu->iem.s.iEffSeg);
    1160711607                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1160811608                }
    1160911609            case IEMMODE_64BIT:
    11610                 switch (pIemCpu->enmEffAddrMode)
     11610                switch (pVCpu->iem.s.enmEffAddrMode)
    1161111611                {
    1161211612                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_2);
    11613                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op64_addr32, pIemCpu->iEffSeg);
    11614                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op64_addr64, pIemCpu->iEffSeg);
     11613                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op64_addr32, pVCpu->iem.s.iEffSeg);
     11614                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_repne_cmps_op64_addr64, pVCpu->iem.s.iEffSeg);
    1161511615                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1161611616                }
     
    1162511625     * Using ugly macro for implementing the cases, sharing it with cmpsb.
    1162611626     */
    11627     switch (pIemCpu->enmEffOpSize)
     11627    switch (pVCpu->iem.s.enmEffOpSize)
    1162811628    {
    1162911629        case IEMMODE_16BIT:
    11630             switch (pIemCpu->enmEffAddrMode)
     11630            switch (pVCpu->iem.s.enmEffAddrMode)
    1163111631            {
    1163211632                case IEMMODE_16BIT: IEM_CMPS_CASE(16, 16); break;
     
    1163811638
    1163911639        case IEMMODE_32BIT:
    11640             switch (pIemCpu->enmEffAddrMode)
     11640            switch (pVCpu->iem.s.enmEffAddrMode)
    1164111641            {
    1164211642                case IEMMODE_16BIT: IEM_CMPS_CASE(32, 16); break;
     
    1164811648
    1164911649        case IEMMODE_64BIT:
    11650             switch (pIemCpu->enmEffAddrMode)
     11650            switch (pVCpu->iem.s.enmEffAddrMode)
    1165111651            {
    1165211652                case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_1); /* cannot be encoded */ break;
     
    1170611706     * Use the C implementation if a repeat prefix is encountered.
    1170711707     */
    11708     if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     11708    if (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    1170911709    {
    1171011710        IEMOP_MNEMONIC("rep stos Yb,al");
    11711         switch (pIemCpu->enmEffAddrMode)
     11711        switch (pVCpu->iem.s.enmEffAddrMode)
    1171211712        {
    1171311713            case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_al_m16);
     
    1172211722     * Sharing case implementation with stos[wdq] below.
    1172311723     */
    11724     switch (pIemCpu->enmEffAddrMode)
     11724    switch (pVCpu->iem.s.enmEffAddrMode)
    1172511725    {
    1172611726        case IEMMODE_16BIT: IEM_STOS_CASE(8, 16); break;
     
    1174111741     * Use the C implementation if a repeat prefix is encountered.
    1174211742     */
    11743     if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     11743    if (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    1174411744    {
    1174511745        IEMOP_MNEMONIC("rep stos Yv,rAX");
    11746         switch (pIemCpu->enmEffOpSize)
     11746        switch (pVCpu->iem.s.enmEffOpSize)
    1174711747        {
    1174811748            case IEMMODE_16BIT:
    11749                 switch (pIemCpu->enmEffAddrMode)
     11749                switch (pVCpu->iem.s.enmEffAddrMode)
    1175011750                {
    1175111751                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_ax_m16);
     
    1175611756                break;
    1175711757            case IEMMODE_32BIT:
    11758                 switch (pIemCpu->enmEffAddrMode)
     11758                switch (pVCpu->iem.s.enmEffAddrMode)
    1175911759                {
    1176011760                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_stos_eax_m16);
     
    1176411764                }
    1176511765            case IEMMODE_64BIT:
    11766                 switch (pIemCpu->enmEffAddrMode)
     11766                switch (pVCpu->iem.s.enmEffAddrMode)
    1176711767                {
    1176811768                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_9);
     
    1178011780     * Using ugly macro for implementing the cases, sharing it with stosb.
    1178111781     */
    11782     switch (pIemCpu->enmEffOpSize)
     11782    switch (pVCpu->iem.s.enmEffOpSize)
    1178311783    {
    1178411784        case IEMMODE_16BIT:
    11785             switch (pIemCpu->enmEffAddrMode)
     11785            switch (pVCpu->iem.s.enmEffAddrMode)
    1178611786            {
    1178711787                case IEMMODE_16BIT: IEM_STOS_CASE(16, 16); break;
     
    1179311793
    1179411794        case IEMMODE_32BIT:
    11795             switch (pIemCpu->enmEffAddrMode)
     11795            switch (pVCpu->iem.s.enmEffAddrMode)
    1179611796            {
    1179711797                case IEMMODE_16BIT: IEM_STOS_CASE(32, 16); break;
     
    1180311803
    1180411804        case IEMMODE_64BIT:
    11805             switch (pIemCpu->enmEffAddrMode)
     11805            switch (pVCpu->iem.s.enmEffAddrMode)
    1180611806            {
    1180711807                case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_1); /* cannot be encoded */ break;
     
    1182411824        IEM_MC_LOCAL(RTGCPTR, uAddr); \
    1182511825        IEM_MC_FETCH_GREG_U##AddrBits##_ZX_U64(uAddr, X86_GREG_xSI); \
    11826         IEM_MC_FETCH_MEM_U##ValBits(uValue, pIemCpu->iEffSeg, uAddr); \
     11826        IEM_MC_FETCH_MEM_U##ValBits(uValue, pVCpu->iem.s.iEffSeg, uAddr); \
    1182711827        IEM_MC_STORE_GREG_U##ValBits(X86_GREG_xAX, uValue); \
    1182811828        IEM_MC_IF_EFL_BIT_SET(X86_EFL_DF) { \
     
    1184211842     * Use the C implementation if a repeat prefix is encountered.
    1184311843     */
    11844     if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     11844    if (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    1184511845    {
    1184611846        IEMOP_MNEMONIC("rep lodsb al,Xb");
    11847         switch (pIemCpu->enmEffAddrMode)
     11847        switch (pVCpu->iem.s.enmEffAddrMode)
    1184811848        {
    11849             case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_al_m16, pIemCpu->iEffSeg);
    11850             case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_al_m32, pIemCpu->iEffSeg);
    11851             case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_al_m64, pIemCpu->iEffSeg);
     11849            case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_al_m16, pVCpu->iem.s.iEffSeg);
     11850            case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_al_m32, pVCpu->iem.s.iEffSeg);
     11851            case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_al_m64, pVCpu->iem.s.iEffSeg);
    1185211852            IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1185311853        }
     
    1185811858     * Sharing case implementation with stos[wdq] below.
    1185911859     */
    11860     switch (pIemCpu->enmEffAddrMode)
     11860    switch (pVCpu->iem.s.enmEffAddrMode)
    1186111861    {
    1186211862        case IEMMODE_16BIT: IEM_LODS_CASE(8, 16); break;
     
    1187711877     * Use the C implementation if a repeat prefix is encountered.
    1187811878     */
    11879     if (pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
     11879    if (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    1188011880    {
    1188111881        IEMOP_MNEMONIC("rep lods rAX,Xv");
    11882         switch (pIemCpu->enmEffOpSize)
     11882        switch (pVCpu->iem.s.enmEffOpSize)
    1188311883        {
    1188411884            case IEMMODE_16BIT:
    11885                 switch (pIemCpu->enmEffAddrMode)
     11885                switch (pVCpu->iem.s.enmEffAddrMode)
    1188611886                {
    11887                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_ax_m16, pIemCpu->iEffSeg);
    11888                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_ax_m32, pIemCpu->iEffSeg);
    11889                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_ax_m64, pIemCpu->iEffSeg);
     11887                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_ax_m16, pVCpu->iem.s.iEffSeg);
     11888                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_ax_m32, pVCpu->iem.s.iEffSeg);
     11889                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_ax_m64, pVCpu->iem.s.iEffSeg);
    1189011890                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1189111891                }
    1189211892                break;
    1189311893            case IEMMODE_32BIT:
    11894                 switch (pIemCpu->enmEffAddrMode)
     11894                switch (pVCpu->iem.s.enmEffAddrMode)
    1189511895                {
    11896                     case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_eax_m16, pIemCpu->iEffSeg);
    11897                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_eax_m32, pIemCpu->iEffSeg);
    11898                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_eax_m64, pIemCpu->iEffSeg);
     11896                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_eax_m16, pVCpu->iem.s.iEffSeg);
     11897                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_eax_m32, pVCpu->iem.s.iEffSeg);
     11898                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_eax_m64, pVCpu->iem.s.iEffSeg);
    1189911899                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1190011900                }
    1190111901            case IEMMODE_64BIT:
    11902                 switch (pIemCpu->enmEffAddrMode)
     11902                switch (pVCpu->iem.s.enmEffAddrMode)
    1190311903                {
    1190411904                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_7);
    11905                     case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_rax_m32, pIemCpu->iEffSeg);
    11906                     case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_rax_m64, pIemCpu->iEffSeg);
     11905                    case IEMMODE_32BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_rax_m32, pVCpu->iem.s.iEffSeg);
     11906                    case IEMMODE_64BIT: return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_lods_rax_m64, pVCpu->iem.s.iEffSeg);
    1190711907                    IEM_NOT_REACHED_DEFAULT_CASE_RET();
    1190811908                }
     
    1191611916     * Using ugly macro for implementing the cases, sharing it with lodsb.
    1191711917     */
    11918     switch (pIemCpu->enmEffOpSize)
     11918    switch (pVCpu->iem.s.enmEffOpSize)
    1191911919    {
    1192011920        case IEMMODE_16BIT:
    11921             switch (pIemCpu->enmEffAddrMode)
     11921            switch (pVCpu->iem.s.enmEffAddrMode)
    1192211922            {
    1192311923                case IEMMODE_16BIT: IEM_LODS_CASE(16, 16); break;
     
    1192911929
    1193011930        case IEMMODE_32BIT:
    11931             switch (pIemCpu->enmEffAddrMode)
     11931            switch (pVCpu->iem.s.enmEffAddrMode)
    1193211932            {
    1193311933                case IEMMODE_16BIT: IEM_LODS_CASE(32, 16); break;
     
    1193911939
    1194011940        case IEMMODE_64BIT:
    11941             switch (pIemCpu->enmEffAddrMode)
     11941            switch (pVCpu->iem.s.enmEffAddrMode)
    1194211942            {
    1194311943                case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_1); /* cannot be encoded */ break;
     
    1198411984     * Use the C implementation if a repeat prefix is encountered.
    1198511985     */
    11986     if (pIemCpu->fPrefixes & IEM_OP_PRF_REPZ)
     11986    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REPZ)
    1198711987    {
    1198811988        IEMOP_MNEMONIC("repe scasb al,Xb");
    11989         switch (pIemCpu->enmEffAddrMode)
     11989        switch (pVCpu->iem.s.enmEffAddrMode)
    1199011990        {
    1199111991            case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_al_m16);
     
    1199511995        }
    1199611996    }
    11997     if (pIemCpu->fPrefixes & IEM_OP_PRF_REPNZ)
     11997    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REPNZ)
    1199811998    {
    1199911999        IEMOP_MNEMONIC("repne scasb al,Xb");
    12000         switch (pIemCpu->enmEffAddrMode)
     12000        switch (pVCpu->iem.s.enmEffAddrMode)
    1200112001        {
    1200212002            case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_al_m16);
     
    1201112011     * Sharing case implementation with stos[wdq] below.
    1201212012     */
    12013     switch (pIemCpu->enmEffAddrMode)
     12013    switch (pVCpu->iem.s.enmEffAddrMode)
    1201412014    {
    1201512015        case IEMMODE_16BIT: IEM_SCAS_CASE(8, 16); break;
     
    1203012030     * Use the C implementation if a repeat prefix is encountered.
    1203112031     */
    12032     if (pIemCpu->fPrefixes & IEM_OP_PRF_REPZ)
     12032    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REPZ)
    1203312033    {
    1203412034        IEMOP_MNEMONIC("repe scas rAX,Xv");
    12035         switch (pIemCpu->enmEffOpSize)
     12035        switch (pVCpu->iem.s.enmEffOpSize)
    1203612036        {
    1203712037            case IEMMODE_16BIT:
    12038                 switch (pIemCpu->enmEffAddrMode)
     12038                switch (pVCpu->iem.s.enmEffAddrMode)
    1203912039                {
    1204012040                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_ax_m16);
     
    1204512045                break;
    1204612046            case IEMMODE_32BIT:
    12047                 switch (pIemCpu->enmEffAddrMode)
     12047                switch (pVCpu->iem.s.enmEffAddrMode)
    1204812048                {
    1204912049                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repe_scas_eax_m16);
     
    1205312053                }
    1205412054            case IEMMODE_64BIT:
    12055                 switch (pIemCpu->enmEffAddrMode)
     12055                switch (pVCpu->iem.s.enmEffAddrMode)
    1205612056                {
    1205712057                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_6); /** @todo It's this wrong, we can do 16-bit addressing in 64-bit mode, but not 32-bit. right? */
     
    1206312063        }
    1206412064    }
    12065     if (pIemCpu->fPrefixes & IEM_OP_PRF_REPNZ)
     12065    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REPNZ)
    1206612066    {
    1206712067        IEMOP_MNEMONIC("repne scas rAX,Xv");
    12068         switch (pIemCpu->enmEffOpSize)
     12068        switch (pVCpu->iem.s.enmEffOpSize)
    1206912069        {
    1207012070            case IEMMODE_16BIT:
    12071                 switch (pIemCpu->enmEffAddrMode)
     12071                switch (pVCpu->iem.s.enmEffAddrMode)
    1207212072                {
    1207312073                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_ax_m16);
     
    1207812078                break;
    1207912079            case IEMMODE_32BIT:
    12080                 switch (pIemCpu->enmEffAddrMode)
     12080                switch (pVCpu->iem.s.enmEffAddrMode)
    1208112081                {
    1208212082                    case IEMMODE_16BIT: return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_repne_scas_eax_m16);
     
    1208612086                }
    1208712087            case IEMMODE_64BIT:
    12088                 switch (pIemCpu->enmEffAddrMode)
     12088                switch (pVCpu->iem.s.enmEffAddrMode)
    1208912089                {
    1209012090                    case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_5);
     
    1210212102     * Using ugly macro for implementing the cases, sharing it with scasb.
    1210312103     */
    12104     switch (pIemCpu->enmEffOpSize)
     12104    switch (pVCpu->iem.s.enmEffOpSize)
    1210512105    {
    1210612106        case IEMMODE_16BIT:
    12107             switch (pIemCpu->enmEffAddrMode)
     12107            switch (pVCpu->iem.s.enmEffAddrMode)
    1210812108            {
    1210912109                case IEMMODE_16BIT: IEM_SCAS_CASE(16, 16); break;
     
    1211512115
    1211612116        case IEMMODE_32BIT:
    12117             switch (pIemCpu->enmEffAddrMode)
     12117            switch (pVCpu->iem.s.enmEffAddrMode)
    1211812118            {
    1211912119                case IEMMODE_16BIT: IEM_SCAS_CASE(32, 16); break;
     
    1212512125
    1212612126        case IEMMODE_64BIT:
    12127             switch (pIemCpu->enmEffAddrMode)
     12127            switch (pVCpu->iem.s.enmEffAddrMode)
    1212812128            {
    1212912129                case IEMMODE_16BIT: AssertFailedReturn(VERR_IEM_IPE_1); /* cannot be encoded */ break;
     
    1216212162{
    1216312163    IEMOP_MNEMONIC("mov AL,Ib");
    12164     return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xAX | pIemCpu->uRexB);
     12164    return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xAX | pVCpu->iem.s.uRexB);
    1216512165}
    1216612166
     
    1217012170{
    1217112171    IEMOP_MNEMONIC("mov CL,Ib");
    12172     return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xCX | pIemCpu->uRexB);
     12172    return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xCX | pVCpu->iem.s.uRexB);
    1217312173}
    1217412174
     
    1217812178{
    1217912179    IEMOP_MNEMONIC("mov DL,Ib");
    12180     return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xDX | pIemCpu->uRexB);
     12180    return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xDX | pVCpu->iem.s.uRexB);
    1218112181}
    1218212182
     
    1218612186{
    1218712187    IEMOP_MNEMONIC("mov BL,Ib");
    12188     return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xBX | pIemCpu->uRexB);
     12188    return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xBX | pVCpu->iem.s.uRexB);
    1218912189}
    1219012190
     
    1219412194{
    1219512195    IEMOP_MNEMONIC("mov AH,Ib");
    12196     return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xSP | pIemCpu->uRexB);
     12196    return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xSP | pVCpu->iem.s.uRexB);
    1219712197}
    1219812198
     
    1220212202{
    1220312203    IEMOP_MNEMONIC("mov CH,Ib");
    12204     return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xBP | pIemCpu->uRexB);
     12204    return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xBP | pVCpu->iem.s.uRexB);
    1220512205}
    1220612206
     
    1221012210{
    1221112211    IEMOP_MNEMONIC("mov DH,Ib");
    12212     return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xSI | pIemCpu->uRexB);
     12212    return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xSI | pVCpu->iem.s.uRexB);
    1221312213}
    1221412214
     
    1221812218{
    1221912219    IEMOP_MNEMONIC("mov BH,Ib");
    12220     return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xDI | pIemCpu->uRexB);
     12220    return FNIEMOP_CALL_1(iemOpCommonMov_r8_Ib, X86_GREG_xDI | pVCpu->iem.s.uRexB);
    1222112221}
    1222212222
     
    1222712227FNIEMOP_DEF_1(iemOpCommonMov_Rv_Iv, uint8_t, iReg)
    1222812228{
    12229     switch (pIemCpu->enmEffOpSize)
     12229    switch (pVCpu->iem.s.enmEffOpSize)
    1223012230    {
    1223112231        case IEMMODE_16BIT:
     
    1227612276{
    1227712277    IEMOP_MNEMONIC("mov rAX,IV");
    12278     return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xAX | pIemCpu->uRexB);
     12278    return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xAX | pVCpu->iem.s.uRexB);
    1227912279}
    1228012280
     
    1228412284{
    1228512285    IEMOP_MNEMONIC("mov rCX,IV");
    12286     return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xCX | pIemCpu->uRexB);
     12286    return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xCX | pVCpu->iem.s.uRexB);
    1228712287}
    1228812288
     
    1229212292{
    1229312293    IEMOP_MNEMONIC("mov rDX,IV");
    12294     return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xDX | pIemCpu->uRexB);
     12294    return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xDX | pVCpu->iem.s.uRexB);
    1229512295}
    1229612296
     
    1230012300{
    1230112301    IEMOP_MNEMONIC("mov rBX,IV");
    12302     return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xBX | pIemCpu->uRexB);
     12302    return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xBX | pVCpu->iem.s.uRexB);
    1230312303}
    1230412304
     
    1230812308{
    1230912309    IEMOP_MNEMONIC("mov rSP,IV");
    12310     return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xSP | pIemCpu->uRexB);
     12310    return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xSP | pVCpu->iem.s.uRexB);
    1231112311}
    1231212312
     
    1231612316{
    1231712317    IEMOP_MNEMONIC("mov rBP,IV");
    12318     return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xBP | pIemCpu->uRexB);
     12318    return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xBP | pVCpu->iem.s.uRexB);
    1231912319}
    1232012320
     
    1232412324{
    1232512325    IEMOP_MNEMONIC("mov rSI,IV");
    12326     return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xSI | pIemCpu->uRexB);
     12326    return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xSI | pVCpu->iem.s.uRexB);
    1232712327}
    1232812328
     
    1233212332{
    1233312333    IEMOP_MNEMONIC("mov rDI,IV");
    12334     return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xDI | pIemCpu->uRexB);
     12334    return FNIEMOP_CALL_1(iemOpCommonMov_Rv_Iv, X86_GREG_xDI | pVCpu->iem.s.uRexB);
    1233512335}
    1233612336
     
    1236512365        IEM_MC_ARG_CONST(uint8_t,   cShiftArg, cShift, 1);
    1236612366        IEM_MC_ARG(uint32_t *,      pEFlags,           2);
    12367         IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     12367        IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1236812368        IEM_MC_REF_EFLAGS(pEFlags);
    1236912369        IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags);
     
    1238412384        uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
    1238512385        IEM_MC_ASSIGN(cShiftArg, cShift);
    12386         IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     12386        IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1238712387        IEM_MC_FETCH_EFLAGS(EFlags);
    1238812388        IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags);
     
    1242212422        uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
    1242312423        IEMOP_HLP_NO_LOCK_PREFIX();
    12424         switch (pIemCpu->enmEffOpSize)
     12424        switch (pVCpu->iem.s.enmEffOpSize)
    1242512425        {
    1242612426            case IEMMODE_16BIT:
     
    1242912429                IEM_MC_ARG_CONST(uint8_t,   cShiftArg, cShift, 1);
    1243012430                IEM_MC_ARG(uint32_t *,      pEFlags,           2);
    12431                 IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     12431                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1243212432                IEM_MC_REF_EFLAGS(pEFlags);
    1243312433                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags);
     
    1244112441                IEM_MC_ARG_CONST(uint8_t,   cShiftArg, cShift, 1);
    1244212442                IEM_MC_ARG(uint32_t *,      pEFlags,           2);
    12443                 IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     12443                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1244412444                IEM_MC_REF_EFLAGS(pEFlags);
    1244512445                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags);
     
    1245412454                IEM_MC_ARG_CONST(uint8_t,   cShiftArg, cShift, 1);
    1245512455                IEM_MC_ARG(uint32_t *,      pEFlags,           2);
    12456                 IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     12456                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1245712457                IEM_MC_REF_EFLAGS(pEFlags);
    1245812458                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags);
     
    1246812468        /* memory */
    1246912469        IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
    12470         switch (pIemCpu->enmEffOpSize)
     12470        switch (pVCpu->iem.s.enmEffOpSize)
    1247112471        {
    1247212472            case IEMMODE_16BIT:
     
    1248012480                uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
    1248112481                IEM_MC_ASSIGN(cShiftArg, cShift);
    12482                 IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     12482                IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1248312483                IEM_MC_FETCH_EFLAGS(EFlags);
    1248412484                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags);
     
    1250012500                uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
    1250112501                IEM_MC_ASSIGN(cShiftArg, cShift);
    12502                 IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     12502                IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1250312503                IEM_MC_FETCH_EFLAGS(EFlags);
    1250412504                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags);
     
    1252012520                uint8_t cShift; IEM_OPCODE_GET_NEXT_U8(&cShift);
    1252112521                IEM_MC_ASSIGN(cShiftArg, cShift);
    12522                 IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     12522                IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1252312523                IEM_MC_FETCH_EFLAGS(EFlags);
    1252412524                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags);
     
    1254312543    IEMOP_HLP_NO_LOCK_PREFIX();
    1254412544    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    12545     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retn, pIemCpu->enmEffOpSize, u16Imm);
     12545    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retn, pVCpu->iem.s.enmEffOpSize, u16Imm);
    1254612546}
    1254712547
     
    1255312553    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    1255412554    IEMOP_HLP_NO_LOCK_PREFIX();
    12555     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retn, pIemCpu->enmEffOpSize, 0);
     12555    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retn, pVCpu->iem.s.enmEffOpSize, 0);
    1255612556}
    1255712557
     
    1256112561{
    1256212562    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    12563     if (   pIemCpu->enmCpuMode == IEMMODE_64BIT
     12563    if (   pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT
    1256412564        || (bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    1256512565    {
     
    1258812588       outside of 64-bit mode.  VEX is not available in real or v86 mode. */
    1258912589    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    12590     if (pIemCpu->enmCpuMode != IEMMODE_64BIT)
     12590    if (pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT)
    1259112591    {
    1259212592        if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     
    1260512605    uint8_t bOpcode; IEM_OPCODE_GET_NEXT_U8(&bOpcode);
    1260612606#if 0 /* will make sense of this next week... */
    12607     if (   !(pIemCpu->fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REX))
     12607    if (   !(pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPZ | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REX))
    1260812608        &&
    1260912609        )
     
    1263212632        uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1263312633        IEM_MC_BEGIN(0, 0);
    12634         IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u8Imm);
     12634        IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u8Imm);
    1263512635        IEM_MC_ADVANCE_RIP();
    1263612636        IEM_MC_END();
     
    1264312643        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 1);
    1264412644        uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    12645         IEM_MC_STORE_MEM_U8(pIemCpu->iEffSeg, GCPtrEffDst, u8Imm);
     12645        IEM_MC_STORE_MEM_U8(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u8Imm);
    1264612646        IEM_MC_ADVANCE_RIP();
    1264712647        IEM_MC_END();
     
    1266312663    {
    1266412664        /* register access */
    12665         switch (pIemCpu->enmEffOpSize)
     12665        switch (pVCpu->iem.s.enmEffOpSize)
    1266612666        {
    1266712667            case IEMMODE_16BIT:
    1266812668                IEM_MC_BEGIN(0, 0);
    1266912669                uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
    12670                 IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u16Imm);
     12670                IEM_MC_STORE_GREG_U16((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u16Imm);
    1267112671                IEM_MC_ADVANCE_RIP();
    1267212672                IEM_MC_END();
     
    1267612676                IEM_MC_BEGIN(0, 0);
    1267712677                uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
    12678                 IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u32Imm);
     12678                IEM_MC_STORE_GREG_U32((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u32Imm);
    1267912679                IEM_MC_ADVANCE_RIP();
    1268012680                IEM_MC_END();
     
    1268412684                IEM_MC_BEGIN(0, 0);
    1268512685                uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
    12686                 IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u64Imm);
     12686                IEM_MC_STORE_GREG_U64((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB, u64Imm);
    1268712687                IEM_MC_ADVANCE_RIP();
    1268812688                IEM_MC_END();
     
    1269512695    {
    1269612696        /* memory access. */
    12697         switch (pIemCpu->enmEffOpSize)
     12697        switch (pVCpu->iem.s.enmEffOpSize)
    1269812698        {
    1269912699            case IEMMODE_16BIT:
     
    1270212702                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 2);
    1270312703                uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
    12704                 IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Imm);
     12704                IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u16Imm);
    1270512705                IEM_MC_ADVANCE_RIP();
    1270612706                IEM_MC_END();
     
    1271212712                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 4);
    1271312713                uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
    12714                 IEM_MC_STORE_MEM_U32(pIemCpu->iEffSeg, GCPtrEffDst, u32Imm);
     12714                IEM_MC_STORE_MEM_U32(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u32Imm);
    1271512715                IEM_MC_ADVANCE_RIP();
    1271612716                IEM_MC_END();
     
    1272212722                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 4);
    1272312723                uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
    12724                 IEM_MC_STORE_MEM_U64(pIemCpu->iEffSeg, GCPtrEffDst, u64Imm);
     12724                IEM_MC_STORE_MEM_U64(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u64Imm);
    1272512725                IEM_MC_ADVANCE_RIP();
    1272612726                IEM_MC_END();
     
    1274412744    uint16_t cbFrame;        IEM_OPCODE_GET_NEXT_U16(&cbFrame);
    1274512745    uint8_t  u8NestingLevel; IEM_OPCODE_GET_NEXT_U8(&u8NestingLevel);
    12746     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_enter, pIemCpu->enmEffOpSize, cbFrame, u8NestingLevel);
     12746    return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_enter, pVCpu->iem.s.enmEffOpSize, cbFrame, u8NestingLevel);
    1274712747}
    1274812748
     
    1275512755    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    1275612756    IEMOP_HLP_NO_LOCK_PREFIX();
    12757     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_leave, pIemCpu->enmEffOpSize);
     12757    return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_leave, pVCpu->iem.s.enmEffOpSize);
    1275812758}
    1275912759
     
    1276612766    IEMOP_HLP_NO_LOCK_PREFIX();
    1276712767    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    12768     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retf, pIemCpu->enmEffOpSize, u16Imm);
     12768    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retf, pVCpu->iem.s.enmEffOpSize, u16Imm);
    1276912769}
    1277012770
     
    1277612776    IEMOP_HLP_NO_LOCK_PREFIX();
    1277712777    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    12778     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retf, pIemCpu->enmEffOpSize, 0);
     12778    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_retf, pVCpu->iem.s.enmEffOpSize, 0);
    1277912779}
    1278012780
     
    1281712817    IEMOP_MNEMONIC("iret");
    1281812818    IEMOP_HLP_NO_LOCK_PREFIX();
    12819     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_iret, pIemCpu->enmEffOpSize);
     12819    return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_iret, pVCpu->iem.s.enmEffOpSize);
    1282012820}
    1282112821
     
    1284812848        IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=*/1,   1);
    1284912849        IEM_MC_ARG(uint32_t *,      pEFlags,            2);
    12850         IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     12850        IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1285112851        IEM_MC_REF_EFLAGS(pEFlags);
    1285212852        IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags);
     
    1286512865
    1286612866        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    12867         IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     12867        IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1286812868        IEM_MC_FETCH_EFLAGS(EFlags);
    1286912869        IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags);
     
    1290212902        /* register */
    1290312903        IEMOP_HLP_NO_LOCK_PREFIX();
    12904         switch (pIemCpu->enmEffOpSize)
     12904        switch (pVCpu->iem.s.enmEffOpSize)
    1290512905        {
    1290612906            case IEMMODE_16BIT:
     
    1290912909                IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=1*/1, 1);
    1291012910                IEM_MC_ARG(uint32_t *,      pEFlags,           2);
    12911                 IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     12911                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1291212912                IEM_MC_REF_EFLAGS(pEFlags);
    1291312913                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags);
     
    1292112921                IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=1*/1, 1);
    1292212922                IEM_MC_ARG(uint32_t *,      pEFlags,           2);
    12923                 IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     12923                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1292412924                IEM_MC_REF_EFLAGS(pEFlags);
    1292512925                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags);
     
    1293412934                IEM_MC_ARG_CONST(uint8_t,   cShiftArg,/*=1*/1, 1);
    1293512935                IEM_MC_ARG(uint32_t *,      pEFlags,           2);
    12936                 IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     12936                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1293712937                IEM_MC_REF_EFLAGS(pEFlags);
    1293812938                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags);
     
    1294812948        /* memory */
    1294912949        IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
    12950         switch (pIemCpu->enmEffOpSize)
     12950        switch (pVCpu->iem.s.enmEffOpSize)
    1295112951        {
    1295212952            case IEMMODE_16BIT:
     
    1295812958
    1295912959                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    12960                 IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     12960                IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1296112961                IEM_MC_FETCH_EFLAGS(EFlags);
    1296212962                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags);
     
    1297612976
    1297712977                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    12978                 IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     12978                IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1297912979                IEM_MC_FETCH_EFLAGS(EFlags);
    1298012980                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags);
     
    1299412994
    1299512995                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    12996                 IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     12996                IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1299712997                IEM_MC_FETCH_EFLAGS(EFlags);
    1299812998                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags);
     
    1303713037        IEM_MC_ARG(uint8_t,     cShiftArg,  1);
    1303813038        IEM_MC_ARG(uint32_t *,  pEFlags,    2);
    13039         IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     13039        IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1304013040        IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    1304113041        IEM_MC_REF_EFLAGS(pEFlags);
     
    1305613056        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    1305713057        IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    13058         IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     13058        IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1305913059        IEM_MC_FETCH_EFLAGS(EFlags);
    1306013060        IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU8, pu8Dst, cShiftArg, pEFlags);
     
    1309213092        /* register */
    1309313093        IEMOP_HLP_NO_LOCK_PREFIX();
    13094         switch (pIemCpu->enmEffOpSize)
     13094        switch (pVCpu->iem.s.enmEffOpSize)
    1309513095        {
    1309613096            case IEMMODE_16BIT:
     
    1309913099                IEM_MC_ARG(uint8_t,         cShiftArg,  1);
    1310013100                IEM_MC_ARG(uint32_t *,      pEFlags,    2);
    13101                 IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     13101                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1310213102                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    1310313103                IEM_MC_REF_EFLAGS(pEFlags);
     
    1311213112                IEM_MC_ARG(uint8_t,         cShiftArg,  1);
    1311313113                IEM_MC_ARG(uint32_t *,      pEFlags,    2);
    13114                 IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     13114                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1311513115                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    1311613116                IEM_MC_REF_EFLAGS(pEFlags);
     
    1312613126                IEM_MC_ARG(uint8_t,         cShiftArg,  1);
    1312713127                IEM_MC_ARG(uint32_t *,      pEFlags,    2);
    13128                 IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     13128                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1312913129                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    1313013130                IEM_MC_REF_EFLAGS(pEFlags);
     
    1314113141        /* memory */
    1314213142        IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
    13143         switch (pIemCpu->enmEffOpSize)
     13143        switch (pVCpu->iem.s.enmEffOpSize)
    1314413144        {
    1314513145            case IEMMODE_16BIT:
     
    1315213152                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    1315313153                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    13154                 IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     13154                IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1315513155                IEM_MC_FETCH_EFLAGS(EFlags);
    1315613156                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU16, pu16Dst, cShiftArg, pEFlags);
     
    1317113171                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    1317213172                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    13173                 IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     13173                IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1317413174                IEM_MC_FETCH_EFLAGS(EFlags);
    1317513175                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU32, pu32Dst, cShiftArg, pEFlags);
     
    1319013190                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    1319113191                IEM_MC_FETCH_GREG_U8(cShiftArg, X86_GREG_xCX);
    13192                 IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     13192                IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1319313193                IEM_MC_FETCH_EFLAGS(EFlags);
    1319413194                IEM_MC_CALL_VOID_AIMPL_3(pImpl->pfnNormalU64, pu64Dst, cShiftArg, pEFlags);
     
    1325513255    IEMOP_MNEMONIC("xlat");
    1325613256    IEMOP_HLP_NO_LOCK_PREFIX();
    13257     switch (pIemCpu->enmEffAddrMode)
     13257    switch (pVCpu->iem.s.enmEffAddrMode)
    1325813258    {
    1325913259        case IEMMODE_16BIT:
     
    1326313263            IEM_MC_FETCH_GREG_U8_ZX_U16(u16Addr, X86_GREG_xAX);
    1326413264            IEM_MC_ADD_GREG_U16_TO_LOCAL(u16Addr, X86_GREG_xBX);
    13265             IEM_MC_FETCH_MEM16_U8(u8Tmp, pIemCpu->iEffSeg, u16Addr);
     13265            IEM_MC_FETCH_MEM16_U8(u8Tmp, pVCpu->iem.s.iEffSeg, u16Addr);
    1326613266            IEM_MC_STORE_GREG_U8(X86_GREG_xAX, u8Tmp);
    1326713267            IEM_MC_ADVANCE_RIP();
     
    1327513275            IEM_MC_FETCH_GREG_U8_ZX_U32(u32Addr, X86_GREG_xAX);
    1327613276            IEM_MC_ADD_GREG_U32_TO_LOCAL(u32Addr, X86_GREG_xBX);
    13277             IEM_MC_FETCH_MEM32_U8(u8Tmp, pIemCpu->iEffSeg, u32Addr);
     13277            IEM_MC_FETCH_MEM32_U8(u8Tmp, pVCpu->iem.s.iEffSeg, u32Addr);
    1327813278            IEM_MC_STORE_GREG_U8(X86_GREG_xAX, u8Tmp);
    1327913279            IEM_MC_ADVANCE_RIP();
     
    1328713287            IEM_MC_FETCH_GREG_U8_ZX_U64(u64Addr, X86_GREG_xAX);
    1328813288            IEM_MC_ADD_GREG_U64_TO_LOCAL(u64Addr, X86_GREG_xBX);
    13289             IEM_MC_FETCH_MEM_U8(u8Tmp, pIemCpu->iEffSeg, u64Addr);
     13289            IEM_MC_FETCH_MEM_U8(u8Tmp, pVCpu->iem.s.iEffSeg, u64Addr);
    1329013290            IEM_MC_STORE_GREG_U8(X86_GREG_xAX, u8Tmp);
    1329113291            IEM_MC_ADVANCE_RIP();
     
    1347913479    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1348013480    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    13481     IEM_MC_FETCH_MEM_R32(r32Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     13481    IEM_MC_FETCH_MEM_R32(r32Val2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1348213482
    1348313483    IEM_MC_PREPARE_FPU_USAGE();
     
    1352913529    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1353013530    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    13531     IEM_MC_FETCH_MEM_R32(r32Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     13531    IEM_MC_FETCH_MEM_R32(r32Val2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1353213532
    1353313533    IEM_MC_PREPARE_FPU_USAGE();
    1353413534    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
    1353513535        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fcom_r80_by_r32, pu16Fsw, pr80Value1, pr32Val2);
    13536         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
     13536        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1353713537    IEM_MC_ELSE()
    13538         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
     13538        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1353913539    IEM_MC_ENDIF();
    1354013540    IEM_MC_ADVANCE_RIP();
     
    1356313563    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1356413564    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    13565     IEM_MC_FETCH_MEM_R32(r32Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     13565    IEM_MC_FETCH_MEM_R32(r32Val2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1356613566
    1356713567    IEM_MC_PREPARE_FPU_USAGE();
    1356813568    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
    1356913569        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fcom_r80_by_r32, pu16Fsw, pr80Value1, pr32Val2);
    13570         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
     13570        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1357113571    IEM_MC_ELSE()
    13572         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
     13572        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1357313573    IEM_MC_ENDIF();
    1357413574    IEM_MC_ADVANCE_RIP();
     
    1361413614FNIEMOP_DEF(iemOp_EscF0)
    1361513615{
    13616     pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
     13616    pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1361713617    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1361813618
     
    1366813668    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1366913669    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    13670     IEM_MC_FETCH_MEM_R32(r32Val, pIemCpu->iEffSeg, GCPtrEffSrc);
     13670    IEM_MC_FETCH_MEM_R32(r32Val, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1367113671
    1367213672    IEM_MC_PREPARE_FPU_USAGE();
    1367313673    IEM_MC_IF_FPUREG_IS_EMPTY(7)
    1367413674        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fld_r32_to_r80, pFpuRes, pr32Val);
    13675         IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pIemCpu->iEffSeg, GCPtrEffSrc);
     13675        IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1367613676    IEM_MC_ELSE()
    13677         IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pIemCpu->iEffSeg, GCPtrEffSrc);
     13677        IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1367813678    IEM_MC_ENDIF();
    1367913679    IEM_MC_ADVANCE_RIP();
     
    1370013700    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1370113701
    13702     IEM_MC_MEM_MAP(pr32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     13702    IEM_MC_MEM_MAP(pr32Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1370313703    IEM_MC_PREPARE_FPU_USAGE();
    1370413704    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
    1370513705        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r32, pu16Fsw, pr32Dst, pr80Value);
    1370613706        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr32Dst, IEM_ACCESS_DATA_W, u16Fsw);
    13707         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
     13707        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1370813708    IEM_MC_ELSE()
    1370913709        IEM_MC_IF_FCW_IM()
     
    1371113711            IEM_MC_MEM_COMMIT_AND_UNMAP(pr32Dst, IEM_ACCESS_DATA_W);
    1371213712        IEM_MC_ENDIF();
    13713         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     13713        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1371413714    IEM_MC_ENDIF();
    1371513715    IEM_MC_ADVANCE_RIP();
     
    1373613736    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1373713737
    13738     IEM_MC_MEM_MAP(pr32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     13738    IEM_MC_MEM_MAP(pr32Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1373913739    IEM_MC_PREPARE_FPU_USAGE();
    1374013740    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
    1374113741        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r32, pu16Fsw, pr32Dst, pr80Value);
    1374213742        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr32Dst, IEM_ACCESS_DATA_W, u16Fsw);
    13743         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
     13743        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1374413744    IEM_MC_ELSE()
    1374513745        IEM_MC_IF_FCW_IM()
     
    1374713747            IEM_MC_MEM_COMMIT_AND_UNMAP(pr32Dst, IEM_ACCESS_DATA_W);
    1374813748        IEM_MC_ENDIF();
    13749         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     13749        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1375013750    IEM_MC_ENDIF();
    1375113751    IEM_MC_ADVANCE_RIP();
     
    1376113761    IEMOP_MNEMONIC("fldenv m14/28byte");
    1376213762    IEM_MC_BEGIN(3, 0);
    13763     IEM_MC_ARG_CONST(IEMMODE,           enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize,  0);
     13763    IEM_MC_ARG_CONST(IEMMODE,           enmEffOpSize, /*=*/ pVCpu->iem.s.enmEffOpSize,  0);
    1376413764    IEM_MC_ARG(uint8_t,                 iEffSeg,                                    1);
    1376513765    IEM_MC_ARG(RTGCPTR,                 GCPtrEffSrc,                                2);
     
    1376813768    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1376913769    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    13770     IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
     13770    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1377113771    IEM_MC_CALL_CIMPL_3(iemCImpl_fldenv, enmEffOpSize, iEffSeg, GCPtrEffSrc);
    1377213772    IEM_MC_END();
     
    1378613786    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1378713787    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    13788     IEM_MC_FETCH_MEM_U16(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
     13788    IEM_MC_FETCH_MEM_U16(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1378913789    IEM_MC_CALL_CIMPL_1(iemCImpl_fldcw, u16Fsw);
    1379013790    IEM_MC_END();
     
    1379813798    IEMOP_MNEMONIC("fstenv m14/m28byte");
    1379913799    IEM_MC_BEGIN(3, 0);
    13800     IEM_MC_ARG_CONST(IEMMODE,           enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize,  0);
     13800    IEM_MC_ARG_CONST(IEMMODE,           enmEffOpSize, /*=*/ pVCpu->iem.s.enmEffOpSize,  0);
    1380113801    IEM_MC_ARG(uint8_t,                 iEffSeg,                                    1);
    1380213802    IEM_MC_ARG(RTGCPTR,                 GCPtrEffDst,                                2);
     
    1380513805    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1380613806    IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
    13807     IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
     13807    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1380813808    IEM_MC_CALL_CIMPL_3(iemCImpl_fnstenv, enmEffOpSize, iEffSeg, GCPtrEffDst);
    1380913809    IEM_MC_END();
     
    1382413824    IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
    1382513825    IEM_MC_FETCH_FCW(u16Fcw);
    13826     IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Fcw);
     13826    IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u16Fcw);
    1382713827    IEM_MC_ADVANCE_RIP(); /* C0-C3 are documented as undefined, we leave them unmodified. */
    1382813828    IEM_MC_END();
     
    1440014400FNIEMOP_DEF(iemOp_EscF1)
    1440114401{
    14402     pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
     14402    pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1440314403    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1440414404    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    1461414614    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1461514615    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    14616     IEM_MC_FETCH_MEM_I32(i32Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     14616    IEM_MC_FETCH_MEM_I32(i32Val2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1461714617
    1461814618    IEM_MC_PREPARE_FPU_USAGE();
     
    1466414664    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1466514665    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    14666     IEM_MC_FETCH_MEM_I32(i32Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     14666    IEM_MC_FETCH_MEM_I32(i32Val2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1466714667
    1466814668    IEM_MC_PREPARE_FPU_USAGE();
    1466914669    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
    1467014670        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i32, pu16Fsw, pr80Value1, pi32Val2);
    14671         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
     14671        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1467214672    IEM_MC_ELSE()
    14673         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
     14673        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1467414674    IEM_MC_ENDIF();
    1467514675    IEM_MC_ADVANCE_RIP();
     
    1469814698    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1469914699    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    14700     IEM_MC_FETCH_MEM_I32(i32Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     14700    IEM_MC_FETCH_MEM_I32(i32Val2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1470114701
    1470214702    IEM_MC_PREPARE_FPU_USAGE();
    1470314703    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
    1470414704        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i32, pu16Fsw, pr80Value1, pi32Val2);
    14705         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
     14705        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1470614706    IEM_MC_ELSE()
    14707         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
     14707        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1470814708    IEM_MC_ENDIF();
    1470914709    IEM_MC_ADVANCE_RIP();
     
    1474914749FNIEMOP_DEF(iemOp_EscF2)
    1475014750{
    14751     pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
     14751    pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1475214752    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1475314753    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    1480414804    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1480514805    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    14806     IEM_MC_FETCH_MEM_I32(i32Val, pIemCpu->iEffSeg, GCPtrEffSrc);
     14806    IEM_MC_FETCH_MEM_I32(i32Val, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1480714807
    1480814808    IEM_MC_PREPARE_FPU_USAGE();
    1480914809    IEM_MC_IF_FPUREG_IS_EMPTY(7)
    1481014810        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fild_i32_to_r80, pFpuRes, pi32Val);
    14811         IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pIemCpu->iEffSeg, GCPtrEffSrc);
     14811        IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1481214812    IEM_MC_ELSE()
    14813         IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pIemCpu->iEffSeg, GCPtrEffSrc);
     14813        IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1481414814    IEM_MC_ENDIF();
    1481514815    IEM_MC_ADVANCE_RIP();
     
    1483614836    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1483714837
    14838     IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     14838    IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1483914839    IEM_MC_PREPARE_FPU_USAGE();
    1484014840    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
    1484114841        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i32, pu16Fsw, pi32Dst, pr80Value);
    1484214842        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw);
    14843         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
     14843        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1484414844    IEM_MC_ELSE()
    1484514845        IEM_MC_IF_FCW_IM()
     
    1484714847            IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W);
    1484814848        IEM_MC_ENDIF();
    14849         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     14849        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1485014850    IEM_MC_ENDIF();
    1485114851    IEM_MC_ADVANCE_RIP();
     
    1487214872    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1487314873
    14874     IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     14874    IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1487514875    IEM_MC_PREPARE_FPU_USAGE();
    1487614876    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
    1487714877        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i32, pu16Fsw, pi32Dst, pr80Value);
    1487814878        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw);
    14879         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
     14879        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1488014880    IEM_MC_ELSE()
    1488114881        IEM_MC_IF_FCW_IM()
     
    1488314883            IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W);
    1488414884        IEM_MC_ENDIF();
    14885         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     14885        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1488614886    IEM_MC_ENDIF();
    1488714887    IEM_MC_ADVANCE_RIP();
     
    1490814908    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1490914909
    14910     IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     14910    IEM_MC_MEM_MAP(pi32Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1491114911    IEM_MC_PREPARE_FPU_USAGE();
    1491214912    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
    1491314913        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i32, pu16Fsw, pi32Dst, pr80Value);
    1491414914        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi32Dst, IEM_ACCESS_DATA_W, u16Fsw);
    14915         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
     14915        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1491614916    IEM_MC_ELSE()
    1491714917        IEM_MC_IF_FCW_IM()
     
    1491914919            IEM_MC_MEM_COMMIT_AND_UNMAP(pi32Dst, IEM_ACCESS_DATA_W);
    1492014920        IEM_MC_ENDIF();
    14921         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     14921        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1492214922    IEM_MC_ENDIF();
    1492314923    IEM_MC_ADVANCE_RIP();
     
    1494514945    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1494614946    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    14947     IEM_MC_FETCH_MEM_R80(r80Val, pIemCpu->iEffSeg, GCPtrEffSrc);
     14947    IEM_MC_FETCH_MEM_R80(r80Val, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1494814948
    1494914949    IEM_MC_PREPARE_FPU_USAGE();
    1495014950    IEM_MC_IF_FPUREG_IS_EMPTY(7)
    1495114951        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fld_r80_from_r80, pFpuRes, pr80Val);
    14952         IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pIemCpu->iEffSeg, GCPtrEffSrc);
     14952        IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1495314953    IEM_MC_ELSE()
    14954         IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pIemCpu->iEffSeg, GCPtrEffSrc);
     14954        IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1495514955    IEM_MC_ENDIF();
    1495614956    IEM_MC_ADVANCE_RIP();
     
    1497714977    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1497814978
    14979     IEM_MC_MEM_MAP(pr80Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     14979    IEM_MC_MEM_MAP(pr80Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1498014980    IEM_MC_PREPARE_FPU_USAGE();
    1498114981    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
    1498214982        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r80, pu16Fsw, pr80Dst, pr80Value);
    1498314983        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr80Dst, IEM_ACCESS_DATA_W, u16Fsw);
    14984         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
     14984        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1498514985    IEM_MC_ELSE()
    1498614986        IEM_MC_IF_FCW_IM()
     
    1498814988            IEM_MC_MEM_COMMIT_AND_UNMAP(pr80Dst, IEM_ACCESS_DATA_W);
    1498914989        IEM_MC_ENDIF();
    14990         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     14990        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1499114991    IEM_MC_ENDIF();
    1499214992    IEM_MC_ADVANCE_RIP();
     
    1520915209FNIEMOP_DEF(iemOp_EscF3)
    1521015210{
    15211     pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
     15211    pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1521215212    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1521315213    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    1535915359    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1536015360
    15361     IEM_MC_FETCH_MEM_R64(r64Factor2, pIemCpu->iEffSeg, GCPtrEffSrc);
     15361    IEM_MC_FETCH_MEM_R64(r64Factor2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1536215362    IEM_MC_PREPARE_FPU_USAGE();
    1536315363    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Factor1, 0)
    1536415364        IEM_MC_CALL_FPU_AIMPL_3(pfnImpl, pFpuRes, pr80Factor1, pr64Factor2);
    15365         IEM_MC_STORE_FPU_RESULT_MEM_OP(FpuRes, 0, pIemCpu->iEffSeg, GCPtrEffSrc);
     15365        IEM_MC_STORE_FPU_RESULT_MEM_OP(FpuRes, 0, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1536615366    IEM_MC_ELSE()
    15367         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(0, pIemCpu->iEffSeg, GCPtrEffSrc);
     15367        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(0, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1536815368    IEM_MC_ENDIF();
    1536915369    IEM_MC_ADVANCE_RIP();
     
    1540815408    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1540915409    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    15410     IEM_MC_FETCH_MEM_R64(r64Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     15410    IEM_MC_FETCH_MEM_R64(r64Val2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1541115411
    1541215412    IEM_MC_PREPARE_FPU_USAGE();
    1541315413    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
    1541415414        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fcom_r80_by_r64, pu16Fsw, pr80Value1, pr64Val2);
    15415         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
     15415        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1541615416    IEM_MC_ELSE()
    15417         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
     15417        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1541815418    IEM_MC_ENDIF();
    1541915419    IEM_MC_ADVANCE_RIP();
     
    1544215442    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1544315443    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    15444     IEM_MC_FETCH_MEM_R64(r64Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     15444    IEM_MC_FETCH_MEM_R64(r64Val2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1544515445
    1544615446    IEM_MC_PREPARE_FPU_USAGE();
    1544715447    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
    1544815448        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fcom_r80_by_r64, pu16Fsw, pr80Value1, pr64Val2);
    15449         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
     15449        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1545015450    IEM_MC_ELSE()
    15451         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
     15451        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1545215452    IEM_MC_ENDIF();
    1545315453    IEM_MC_ADVANCE_RIP();
     
    1549315493FNIEMOP_DEF(iemOp_EscF4)
    1549415494{
    15495     pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
     15495    pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1549615496    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1549715497    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    1554615546    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1554715547
    15548     IEM_MC_FETCH_MEM_R64(r64Val, pIemCpu->iEffSeg, GCPtrEffSrc);
     15548    IEM_MC_FETCH_MEM_R64(r64Val, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1554915549    IEM_MC_PREPARE_FPU_USAGE();
    1555015550    IEM_MC_IF_FPUREG_IS_EMPTY(7)
    1555115551        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fld_r64_to_r80, pFpuRes, pr64Val);
    15552         IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pIemCpu->iEffSeg, GCPtrEffSrc);
     15552        IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1555315553    IEM_MC_ELSE()
    15554         IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pIemCpu->iEffSeg, GCPtrEffSrc);
     15554        IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1555515555    IEM_MC_ENDIF();
    1555615556    IEM_MC_ADVANCE_RIP();
     
    1557715577    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1557815578
    15579     IEM_MC_MEM_MAP(pi64Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     15579    IEM_MC_MEM_MAP(pi64Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1558015580    IEM_MC_PREPARE_FPU_USAGE();
    1558115581    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
    1558215582        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i64, pu16Fsw, pi64Dst, pr80Value);
    1558315583        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi64Dst, IEM_ACCESS_DATA_W, u16Fsw);
    15584         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
     15584        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1558515585    IEM_MC_ELSE()
    1558615586        IEM_MC_IF_FCW_IM()
     
    1558815588            IEM_MC_MEM_COMMIT_AND_UNMAP(pi64Dst, IEM_ACCESS_DATA_W);
    1558915589        IEM_MC_ENDIF();
    15590         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     15590        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1559115591    IEM_MC_ENDIF();
    1559215592    IEM_MC_ADVANCE_RIP();
     
    1561315613    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1561415614
    15615     IEM_MC_MEM_MAP(pr64Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     15615    IEM_MC_MEM_MAP(pr64Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1561615616    IEM_MC_PREPARE_FPU_USAGE();
    1561715617    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
    1561815618        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r64, pu16Fsw, pr64Dst, pr80Value);
    1561915619        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr64Dst, IEM_ACCESS_DATA_W, u16Fsw);
    15620         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
     15620        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1562115621    IEM_MC_ELSE()
    1562215622        IEM_MC_IF_FCW_IM()
     
    1562415624            IEM_MC_MEM_COMMIT_AND_UNMAP(pr64Dst, IEM_ACCESS_DATA_W);
    1562515625        IEM_MC_ENDIF();
    15626         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     15626        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1562715627    IEM_MC_ENDIF();
    1562815628    IEM_MC_ADVANCE_RIP();
     
    1565115651    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1565215652
    15653     IEM_MC_MEM_MAP(pr64Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     15653    IEM_MC_MEM_MAP(pr64Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1565415654    IEM_MC_PREPARE_FPU_USAGE();
    1565515655    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
    1565615656        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fst_r80_to_r64, pu16Fsw, pr64Dst, pr80Value);
    1565715657        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pr64Dst, IEM_ACCESS_DATA_W, u16Fsw);
    15658         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
     15658        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1565915659    IEM_MC_ELSE()
    1566015660        IEM_MC_IF_FCW_IM()
     
    1566215662            IEM_MC_MEM_COMMIT_AND_UNMAP(pr64Dst, IEM_ACCESS_DATA_W);
    1566315663        IEM_MC_ENDIF();
    15664         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     15664        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1566515665    IEM_MC_ENDIF();
    1566615666    IEM_MC_ADVANCE_RIP();
     
    1567615676    IEMOP_MNEMONIC("frstor m94/108byte");
    1567715677    IEM_MC_BEGIN(3, 0);
    15678     IEM_MC_ARG_CONST(IEMMODE,           enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize,  0);
     15678    IEM_MC_ARG_CONST(IEMMODE,           enmEffOpSize, /*=*/ pVCpu->iem.s.enmEffOpSize,  0);
    1567915679    IEM_MC_ARG(uint8_t,                 iEffSeg,                                    1);
    1568015680    IEM_MC_ARG(RTGCPTR,                 GCPtrEffSrc,                                2);
     
    1568315683    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1568415684    IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    15685     IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
     15685    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1568615686    IEM_MC_CALL_CIMPL_3(iemCImpl_frstor, enmEffOpSize, iEffSeg, GCPtrEffSrc);
    1568715687    IEM_MC_END();
     
    1569515695    IEMOP_MNEMONIC("fnsave m94/108byte");
    1569615696    IEM_MC_BEGIN(3, 0);
    15697     IEM_MC_ARG_CONST(IEMMODE,           enmEffOpSize, /*=*/ pIemCpu->enmEffOpSize,  0);
     15697    IEM_MC_ARG_CONST(IEMMODE,           enmEffOpSize, /*=*/ pVCpu->iem.s.enmEffOpSize,  0);
    1569815698    IEM_MC_ARG(uint8_t,                 iEffSeg,                                    1);
    1569915699    IEM_MC_ARG(RTGCPTR,                 GCPtrEffDst,                                2);
     
    1570215702    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1570315703    IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
    15704     IEM_MC_ASSIGN(iEffSeg, pIemCpu->iEffSeg);
     15704    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
    1570515705    IEM_MC_CALL_CIMPL_3(iemCImpl_fnsave, enmEffOpSize, iEffSeg, GCPtrEffDst);
    1570615706    IEM_MC_END();
     
    1572415724    IEM_MC_ACTUALIZE_FPU_STATE_FOR_READ();
    1572515725    IEM_MC_FETCH_FSW(u16Tmp);
    15726     IEM_MC_STORE_MEM_U16(pIemCpu->iEffSeg, GCPtrEffDst, u16Tmp);
     15726    IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u16Tmp);
    1572715727    IEM_MC_ADVANCE_RIP();
    1572815728
     
    1580315803FNIEMOP_DEF(iemOp_EscF5)
    1580415804{
    15805     pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
     15805    pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1580615806    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1580715807    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    1591515915    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1591615916    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    15917     IEM_MC_FETCH_MEM_I16(i16Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     15917    IEM_MC_FETCH_MEM_I16(i16Val2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1591815918
    1591915919    IEM_MC_PREPARE_FPU_USAGE();
     
    1596515965    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1596615966    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    15967     IEM_MC_FETCH_MEM_I16(i16Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     15967    IEM_MC_FETCH_MEM_I16(i16Val2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1596815968
    1596915969    IEM_MC_PREPARE_FPU_USAGE();
    1597015970    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
    1597115971        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i16, pu16Fsw, pr80Value1, pi16Val2);
    15972         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
     15972        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1597315973    IEM_MC_ELSE()
    15974         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
     15974        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1597515975    IEM_MC_ENDIF();
    1597615976    IEM_MC_ADVANCE_RIP();
     
    1599915999    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1600016000    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    16001     IEM_MC_FETCH_MEM_I16(i16Val2, pIemCpu->iEffSeg, GCPtrEffSrc);
     16001    IEM_MC_FETCH_MEM_I16(i16Val2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1600216002
    1600316003    IEM_MC_PREPARE_FPU_USAGE();
    1600416004    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value1, 0)
    1600516005        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_ficom_r80_by_i16, pu16Fsw, pr80Value1, pi16Val2);
    16006         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffSrc);
     16006        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1600716007    IEM_MC_ELSE()
    16008         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffSrc);
     16008        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1600916009    IEM_MC_ENDIF();
    1601016010    IEM_MC_ADVANCE_RIP();
     
    1605016050FNIEMOP_DEF(iemOp_EscF6)
    1605116051{
    16052     pIemCpu->offFpuOpcode = pIemCpu->offOpcode - 1;
     16052    pVCpu->iem.s.offFpuOpcode = pVCpu->iem.s.offOpcode - 1;
    1605316053    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1605416054    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     
    1616116161    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1616216162    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    16163     IEM_MC_FETCH_MEM_I16(i16Val, pIemCpu->iEffSeg, GCPtrEffSrc);
     16163    IEM_MC_FETCH_MEM_I16(i16Val, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1616416164
    1616516165    IEM_MC_PREPARE_FPU_USAGE();
    1616616166    IEM_MC_IF_FPUREG_IS_EMPTY(7)
    1616716167        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fild_i16_to_r80, pFpuRes, pi16Val);
    16168         IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pIemCpu->iEffSeg, GCPtrEffSrc);
     16168        IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1616916169    IEM_MC_ELSE()
    16170         IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pIemCpu->iEffSeg, GCPtrEffSrc);
     16170        IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1617116171    IEM_MC_ENDIF();
    1617216172    IEM_MC_ADVANCE_RIP();
     
    1619316193    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1619416194
    16195     IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     16195    IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1619616196    IEM_MC_PREPARE_FPU_USAGE();
    1619716197    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
    1619816198        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fistt_r80_to_i16, pu16Fsw, pi16Dst, pr80Value);
    1619916199        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw);
    16200         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
     16200        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1620116201    IEM_MC_ELSE()
    1620216202        IEM_MC_IF_FCW_IM()
     
    1620416204            IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W);
    1620516205        IEM_MC_ENDIF();
    16206         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     16206        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1620716207    IEM_MC_ENDIF();
    1620816208    IEM_MC_ADVANCE_RIP();
     
    1622916229    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1623016230
    16231     IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     16231    IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1623216232    IEM_MC_PREPARE_FPU_USAGE();
    1623316233    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
    1623416234        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i16, pu16Fsw, pi16Dst, pr80Value);
    1623516235        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw);
    16236         IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
     16236        IEM_MC_UPDATE_FSW_WITH_MEM_OP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1623716237    IEM_MC_ELSE()
    1623816238        IEM_MC_IF_FCW_IM()
     
    1624016240            IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W);
    1624116241        IEM_MC_ENDIF();
    16242         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     16242        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1624316243    IEM_MC_ENDIF();
    1624416244    IEM_MC_ADVANCE_RIP();
     
    1626516265    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1626616266
    16267     IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     16267    IEM_MC_MEM_MAP(pi16Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1626816268    IEM_MC_PREPARE_FPU_USAGE();
    1626916269    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
    1627016270        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i16, pu16Fsw, pi16Dst, pr80Value);
    1627116271        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi16Dst, IEM_ACCESS_DATA_W, u16Fsw);
    16272         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
     16272        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1627316273    IEM_MC_ELSE()
    1627416274        IEM_MC_IF_FCW_IM()
     
    1627616276            IEM_MC_MEM_COMMIT_AND_UNMAP(pi16Dst, IEM_ACCESS_DATA_W);
    1627716277        IEM_MC_ENDIF();
    16278         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     16278        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1627916279    IEM_MC_ENDIF();
    1628016280    IEM_MC_ADVANCE_RIP();
     
    1630616306    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1630716307    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    16308     IEM_MC_FETCH_MEM_I64(i64Val, pIemCpu->iEffSeg, GCPtrEffSrc);
     16308    IEM_MC_FETCH_MEM_I64(i64Val, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1630916309
    1631016310    IEM_MC_PREPARE_FPU_USAGE();
    1631116311    IEM_MC_IF_FPUREG_IS_EMPTY(7)
    1631216312        IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fild_i64_to_r80, pFpuRes, pi64Val);
    16313         IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pIemCpu->iEffSeg, GCPtrEffSrc);
     16313        IEM_MC_PUSH_FPU_RESULT_MEM_OP(FpuRes, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1631416314    IEM_MC_ELSE()
    16315         IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pIemCpu->iEffSeg, GCPtrEffSrc);
     16315        IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1631616316    IEM_MC_ENDIF();
    1631716317    IEM_MC_ADVANCE_RIP();
     
    1634216342    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    1634316343
    16344     IEM_MC_MEM_MAP(pi64Dst, IEM_ACCESS_DATA_W, pIemCpu->iEffSeg, GCPtrEffDst, 1 /*arg*/);
     16344    IEM_MC_MEM_MAP(pi64Dst, IEM_ACCESS_DATA_W, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 1 /*arg*/);
    1634516345    IEM_MC_PREPARE_FPU_USAGE();
    1634616346    IEM_MC_IF_FPUREG_NOT_EMPTY_REF_R80(pr80Value, 0)
    1634716347        IEM_MC_CALL_FPU_AIMPL_3(iemAImpl_fist_r80_to_i64, pu16Fsw, pi64Dst, pr80Value);
    1634816348        IEM_MC_MEM_COMMIT_AND_UNMAP_FOR_FPU_STORE(pi64Dst, IEM_ACCESS_DATA_W, u16Fsw);
    16349         IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pIemCpu->iEffSeg, GCPtrEffDst);
     16349        IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(u16Fsw, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1635016350    IEM_MC_ELSE()
    1635116351        IEM_MC_IF_FCW_IM()
     
    1635316353            IEM_MC_MEM_COMMIT_AND_UNMAP(pi64Dst, IEM_ACCESS_DATA_W);
    1635416354        IEM_MC_ENDIF();
    16355         IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pIemCpu->iEffSeg, GCPtrEffDst);
     16355        IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(UINT8_MAX, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1635616356    IEM_MC_ENDIF();
    1635716357    IEM_MC_ADVANCE_RIP();
     
    1640916409    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    1641016410
    16411     switch (pIemCpu->enmEffAddrMode)
     16411    switch (pVCpu->iem.s.enmEffAddrMode)
    1641216412    {
    1641316413        case IEMMODE_16BIT:
     
    1645716457    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    1645816458
    16459     switch (pIemCpu->enmEffAddrMode)
     16459    switch (pVCpu->iem.s.enmEffAddrMode)
    1646016460    {
    1646116461        case IEMMODE_16BIT:
     
    1650816508     * using the 32-bit operand size override.  How can that be restarted?  See
    1650916509     * weird pseudo code in intel manual. */
    16510     switch (pIemCpu->enmEffAddrMode)
     16510    switch (pVCpu->iem.s.enmEffAddrMode)
    1651116511    {
    1651216512        case IEMMODE_16BIT:
    1651316513            IEM_MC_BEGIN(0,0);
    16514             if (-(int8_t)pIemCpu->offOpcode != i8Imm)
     16514            if (-(int8_t)pVCpu->iem.s.offOpcode != i8Imm)
    1651516515            {
    1651616516                IEM_MC_SUB_GREG_U16(X86_GREG_xCX, 1);
     
    1653116531        case IEMMODE_32BIT:
    1653216532            IEM_MC_BEGIN(0,0);
    16533             if (-(int8_t)pIemCpu->offOpcode != i8Imm)
     16533            if (-(int8_t)pVCpu->iem.s.offOpcode != i8Imm)
    1653416534            {
    1653516535                IEM_MC_SUB_GREG_U32(X86_GREG_xCX, 1);
     
    1655016550        case IEMMODE_64BIT:
    1655116551            IEM_MC_BEGIN(0,0);
    16552             if (-(int8_t)pIemCpu->offOpcode != i8Imm)
     16552            if (-(int8_t)pVCpu->iem.s.offOpcode != i8Imm)
    1655316553            {
    1655416554                IEM_MC_SUB_GREG_U64(X86_GREG_xCX, 1);
     
    1658016580    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    1658116581
    16582     switch (pIemCpu->enmEffAddrMode)
     16582    switch (pVCpu->iem.s.enmEffAddrMode)
    1658316583    {
    1658416584        case IEMMODE_16BIT:
     
    1663316633    uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1663416634    IEMOP_HLP_NO_LOCK_PREFIX();
    16635     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_in, u8Imm, pIemCpu->enmEffOpSize == IEMMODE_16BIT ? 2 : 4);
     16635    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_in, u8Imm, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4);
    1663616636}
    1663716637
     
    1665316653    uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1665416654    IEMOP_HLP_NO_LOCK_PREFIX();
    16655     return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_out, u8Imm, pIemCpu->enmEffOpSize == IEMMODE_16BIT ? 2 : 4);
     16655    return IEM_MC_DEFER_TO_CIMPL_2(iemCImpl_out, u8Imm, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4);
    1665616656}
    1665716657
     
    1666216662    IEMOP_MNEMONIC("call Jv");
    1666316663    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    16664     switch (pIemCpu->enmEffOpSize)
     16664    switch (pVCpu->iem.s.enmEffOpSize)
    1666516665    {
    1666616666        case IEMMODE_16BIT:
     
    1669216692    IEMOP_MNEMONIC("jmp Jv");
    1669316693    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    16694     switch (pIemCpu->enmEffOpSize)
     16694    switch (pVCpu->iem.s.enmEffOpSize)
    1669516695    {
    1669616696        case IEMMODE_16BIT:
     
    1672616726    /* Decode the far pointer address and pass it on to the far call C implementation. */
    1672716727    uint32_t offSeg;
    16728     if (pIemCpu->enmEffOpSize != IEMMODE_16BIT)
     16728    if (pVCpu->iem.s.enmEffOpSize != IEMMODE_16BIT)
    1672916729        IEM_OPCODE_GET_NEXT_U32(&offSeg);
    1673016730    else
     
    1673216732    uint16_t uSel;  IEM_OPCODE_GET_NEXT_U16(&uSel);
    1673316733    IEMOP_HLP_NO_LOCK_PREFIX();
    16734     return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_FarJmp, uSel, offSeg, pIemCpu->enmEffOpSize);
     16734    return IEM_MC_DEFER_TO_CIMPL_3(iemCImpl_FarJmp, uSel, offSeg, pVCpu->iem.s.enmEffOpSize);
    1673516735}
    1673616736
     
    1676516765    IEMOP_MNEMONIC("in  eAX,DX");
    1676616766    IEMOP_HLP_NO_LOCK_PREFIX();
    16767     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_in_eAX_DX, pIemCpu->enmEffOpSize == IEMMODE_16BIT ? 2 : 4);
     16767    return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_in_eAX_DX, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4);
    1676816768}
    1676916769
     
    1678316783    IEMOP_MNEMONIC("out DX,eAX");
    1678416784    IEMOP_HLP_NO_LOCK_PREFIX();
    16785     return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_out_DX_eAX, pIemCpu->enmEffOpSize == IEMMODE_16BIT ? 2 : 4);
     16785    return IEM_MC_DEFER_TO_CIMPL_1(iemCImpl_out_DX_eAX, pVCpu->iem.s.enmEffOpSize == IEMMODE_16BIT ? 2 : 4);
    1678616786}
    1678716787
     
    1679116791{
    1679216792    IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("lock");
    16793     pIemCpu->fPrefixes |= IEM_OP_PRF_LOCK;
     16793    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_LOCK;
    1679416794
    1679516795    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    1681216812{
    1681316813    /* This overrides any previous REPE prefix. */
    16814     pIemCpu->fPrefixes &= ~IEM_OP_PRF_REPZ;
     16814    pVCpu->iem.s.fPrefixes &= ~IEM_OP_PRF_REPZ;
    1681516815    IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("repne");
    16816     pIemCpu->fPrefixes |= IEM_OP_PRF_REPNZ;
     16816    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REPNZ;
    1681716817
    1681816818    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    1682516825{
    1682616826    /* This overrides any previous REPNE prefix. */
    16827     pIemCpu->fPrefixes &= ~IEM_OP_PRF_REPNZ;
     16827    pVCpu->iem.s.fPrefixes &= ~IEM_OP_PRF_REPNZ;
    1682816828    IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("repe");
    16829     pIemCpu->fPrefixes |= IEM_OP_PRF_REPZ;
     16829    pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_REPZ;
    1683016830
    1683116831    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
     
    1686916869        IEM_MC_ARG(uint8_t *,   pu8Dst, 0);
    1687016870        IEM_MC_ARG(uint32_t *,  pEFlags, 1);
    16871         IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     16871        IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1687216872        IEM_MC_REF_EFLAGS(pEFlags);
    1687316873        IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU8, pu8Dst, pEFlags);
     
    1688416884
    1688516885        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    16886         IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     16886        IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1688716887        IEM_MC_FETCH_EFLAGS(EFlags);
    16888         if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     16888        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    1688916889            IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU8, pu8Dst, pEFlags);
    1689016890        else
     
    1691016910    /* Registers are handled by a common worker. */
    1691116911    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    16912         return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, pImpl, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     16912        return FNIEMOP_CALL_2(iemOpCommonUnaryGReg, pImpl, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1691316913
    1691416914    /* Memory we do here. */
    16915     switch (pIemCpu->enmEffOpSize)
     16915    switch (pVCpu->iem.s.enmEffOpSize)
    1691616916    {
    1691716917        case IEMMODE_16BIT:
     
    1692216922
    1692316923            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    16924             IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     16924            IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1692516925            IEM_MC_FETCH_EFLAGS(EFlags);
    16926             if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     16926            if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    1692716927                IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU16, pu16Dst, pEFlags);
    1692816928            else
     
    1694216942
    1694316943            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    16944             IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     16944            IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1694516945            IEM_MC_FETCH_EFLAGS(EFlags);
    16946             if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     16946            if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    1694716947                IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU32, pu32Dst, pEFlags);
    1694816948            else
     
    1696216962
    1696316963            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    16964             IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     16964            IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1696516965            IEM_MC_FETCH_EFLAGS(EFlags);
    16966             if (!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))
     16966            if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    1696716967                IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU64, pu64Dst, pEFlags);
    1696816968            else
     
    1699616996        IEM_MC_ARG_CONST(uint8_t,   u8Src,/*=*/u8Imm,   1);
    1699716997        IEM_MC_ARG(uint32_t *,      pEFlags,            2);
    16998         IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     16998        IEM_MC_REF_GREG_U8(pu8Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1699916999        IEM_MC_REF_EFLAGS(pEFlags);
    1700017000        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u8, pu8Dst, u8Src, pEFlags);
     
    1701617016        uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
    1701717017        IEM_MC_ASSIGN(u8Src, u8Imm);
    17018         IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_R, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     17018        IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_R, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1701917019        IEM_MC_FETCH_EFLAGS(EFlags);
    1702017020        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u8, pu8Dst, u8Src, pEFlags);
     
    1703917039    {
    1704017040        /* register access */
    17041         switch (pIemCpu->enmEffOpSize)
     17041        switch (pVCpu->iem.s.enmEffOpSize)
    1704217042        {
    1704317043            case IEMMODE_16BIT:
     
    1704817048                IEM_MC_ARG_CONST(uint16_t,  u16Src,/*=*/u16Imm,     1);
    1704917049                IEM_MC_ARG(uint32_t *,      pEFlags,                2);
    17050                 IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17050                IEM_MC_REF_GREG_U16(pu16Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1705117051                IEM_MC_REF_EFLAGS(pEFlags);
    1705217052                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u16, pu16Dst, u16Src, pEFlags);
     
    1706317063                IEM_MC_ARG_CONST(uint32_t,  u32Src,/*=*/u32Imm,     1);
    1706417064                IEM_MC_ARG(uint32_t *,      pEFlags,                2);
    17065                 IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17065                IEM_MC_REF_GREG_U32(pu32Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1706617066                IEM_MC_REF_EFLAGS(pEFlags);
    1706717067                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u32, pu32Dst, u32Src, pEFlags);
     
    1707917079                IEM_MC_ARG_CONST(uint64_t,  u64Src,/*=*/u64Imm,     1);
    1708017080                IEM_MC_ARG(uint32_t *,      pEFlags,                2);
    17081                 IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17081                IEM_MC_REF_GREG_U64(pu64Dst, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1708217082                IEM_MC_REF_EFLAGS(pEFlags);
    1708317083                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u64, pu64Dst, u64Src, pEFlags);
     
    1709317093    {
    1709417094        /* memory access. */
    17095         switch (pIemCpu->enmEffOpSize)
     17095        switch (pVCpu->iem.s.enmEffOpSize)
    1709617096        {
    1709717097            case IEMMODE_16BIT:
     
    1710617106                uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(&u16Imm);
    1710717107                IEM_MC_ASSIGN(u16Src, u16Imm);
    17108                 IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_R, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     17108                IEM_MC_MEM_MAP(pu16Dst, IEM_ACCESS_DATA_R, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1710917109                IEM_MC_FETCH_EFLAGS(EFlags);
    1711017110                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u16, pu16Dst, u16Src, pEFlags);
     
    1712817128                uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(&u32Imm);
    1712917129                IEM_MC_ASSIGN(u32Src, u32Imm);
    17130                 IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_R, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     17130                IEM_MC_MEM_MAP(pu32Dst, IEM_ACCESS_DATA_R, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1713117131                IEM_MC_FETCH_EFLAGS(EFlags);
    1713217132                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u32, pu32Dst, u32Src, pEFlags);
     
    1715017150                uint64_t u64Imm; IEM_OPCODE_GET_NEXT_S32_SX_U64(&u64Imm);
    1715117151                IEM_MC_ASSIGN(u64Src, u64Imm);
    17152                 IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_R, pIemCpu->iEffSeg, GCPtrEffDst, 0 /*arg*/);
     17152                IEM_MC_MEM_MAP(pu64Dst, IEM_ACCESS_DATA_R, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    1715317153                IEM_MC_FETCH_EFLAGS(EFlags);
    1715417154                IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_test_u64, pu64Dst, u64Src, pEFlags);
     
    1718217182        IEM_MC_LOCAL(int32_t,       rc);
    1718317183
    17184         IEM_MC_FETCH_GREG_U8(u8Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17184        IEM_MC_FETCH_GREG_U8(u8Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1718517185        IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX);
    1718617186        IEM_MC_REF_EFLAGS(pEFlags);
     
    1720717207
    1720817208        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    17209         IEM_MC_FETCH_MEM_U8(u8Value, pIemCpu->iEffSeg, GCPtrEffDst);
     17209        IEM_MC_FETCH_MEM_U8(u8Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1721017210        IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX);
    1721117211        IEM_MC_REF_EFLAGS(pEFlags);
     
    1723217232    {
    1723317233        /* register access */
    17234         switch (pIemCpu->enmEffOpSize)
     17234        switch (pVCpu->iem.s.enmEffOpSize)
    1723517235        {
    1723617236            case IEMMODE_16BIT:
     
    1724417244                IEM_MC_LOCAL(int32_t,       rc);
    1724517245
    17246                 IEM_MC_FETCH_GREG_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17246                IEM_MC_FETCH_GREG_U16(u16Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1724717247                IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX);
    1724817248                IEM_MC_REF_GREG_U16(pu16DX, X86_GREG_xDX);
     
    1726917269                IEM_MC_LOCAL(int32_t,       rc);
    1727017270
    17271                 IEM_MC_FETCH_GREG_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17271                IEM_MC_FETCH_GREG_U32(u32Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1727217272                IEM_MC_REF_GREG_U32(pu32AX, X86_GREG_xAX);
    1727317273                IEM_MC_REF_GREG_U32(pu32DX, X86_GREG_xDX);
     
    1729617296                IEM_MC_LOCAL(int32_t,       rc);
    1729717297
    17298                 IEM_MC_FETCH_GREG_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17298                IEM_MC_FETCH_GREG_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1729917299                IEM_MC_REF_GREG_U64(pu64AX, X86_GREG_xAX);
    1730017300                IEM_MC_REF_GREG_U64(pu64DX, X86_GREG_xDX);
     
    1731717317    {
    1731817318        /* memory access. */
    17319         switch (pIemCpu->enmEffOpSize)
     17319        switch (pVCpu->iem.s.enmEffOpSize)
    1732017320        {
    1732117321            case IEMMODE_16BIT:
     
    1733117331
    1733217332                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    17333                 IEM_MC_FETCH_MEM_U16(u16Value, pIemCpu->iEffSeg, GCPtrEffDst);
     17333                IEM_MC_FETCH_MEM_U16(u16Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1733417334                IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX);
    1733517335                IEM_MC_REF_GREG_U16(pu16DX, X86_GREG_xDX);
     
    1735817358
    1735917359                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    17360                 IEM_MC_FETCH_MEM_U32(u32Value, pIemCpu->iEffSeg, GCPtrEffDst);
     17360                IEM_MC_FETCH_MEM_U32(u32Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1736117361                IEM_MC_REF_GREG_U32(pu32AX, X86_GREG_xAX);
    1736217362                IEM_MC_REF_GREG_U32(pu32DX, X86_GREG_xDX);
     
    1738717387
    1738817388                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    17389                 IEM_MC_FETCH_MEM_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst);
     17389                IEM_MC_FETCH_MEM_U64(u64Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst);
    1739017390                IEM_MC_REF_GREG_U64(pu64AX, X86_GREG_xAX);
    1739117391                IEM_MC_REF_GREG_U64(pu64DX, X86_GREG_xDX);
     
    1758417584    {
    1758517585        /* The new RIP is taken from a register. */
    17586         switch (pIemCpu->enmEffOpSize)
     17586        switch (pVCpu->iem.s.enmEffOpSize)
    1758717587        {
    1758817588            case IEMMODE_16BIT:
    1758917589                IEM_MC_BEGIN(1, 0);
    1759017590                IEM_MC_ARG(uint16_t, u16Target, 0);
    17591                 IEM_MC_FETCH_GREG_U16(u16Target, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17591                IEM_MC_FETCH_GREG_U16(u16Target, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1759217592                IEM_MC_CALL_CIMPL_1(iemCImpl_call_16, u16Target);
    1759317593                IEM_MC_END()
     
    1759717597                IEM_MC_BEGIN(1, 0);
    1759817598                IEM_MC_ARG(uint32_t, u32Target, 0);
    17599                 IEM_MC_FETCH_GREG_U32(u32Target, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17599                IEM_MC_FETCH_GREG_U32(u32Target, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1760017600                IEM_MC_CALL_CIMPL_1(iemCImpl_call_32, u32Target);
    1760117601                IEM_MC_END()
     
    1760517605                IEM_MC_BEGIN(1, 0);
    1760617606                IEM_MC_ARG(uint64_t, u64Target, 0);
    17607                 IEM_MC_FETCH_GREG_U64(u64Target, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17607                IEM_MC_FETCH_GREG_U64(u64Target, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1760817608                IEM_MC_CALL_CIMPL_1(iemCImpl_call_64, u64Target);
    1760917609                IEM_MC_END()
     
    1761617616    {
    1761717617        /* The new RIP is taken from a register. */
    17618         switch (pIemCpu->enmEffOpSize)
     17618        switch (pVCpu->iem.s.enmEffOpSize)
    1761917619        {
    1762017620            case IEMMODE_16BIT:
     
    1762317623                IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    1762417624                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    17625                 IEM_MC_FETCH_MEM_U16(u16Target, pIemCpu->iEffSeg, GCPtrEffSrc);
     17625                IEM_MC_FETCH_MEM_U16(u16Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1762617626                IEM_MC_CALL_CIMPL_1(iemCImpl_call_16, u16Target);
    1762717627                IEM_MC_END()
     
    1763317633                IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    1763417634                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    17635                 IEM_MC_FETCH_MEM_U32(u32Target, pIemCpu->iEffSeg, GCPtrEffSrc);
     17635                IEM_MC_FETCH_MEM_U32(u32Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1763617636                IEM_MC_CALL_CIMPL_1(iemCImpl_call_32, u32Target);
    1763717637                IEM_MC_END()
     
    1764317643                IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    1764417644                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    17645                 IEM_MC_FETCH_MEM_U64(u64Target, pIemCpu->iEffSeg, GCPtrEffSrc);
     17645                IEM_MC_FETCH_MEM_U64(u64Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1764617646                IEM_MC_CALL_CIMPL_1(iemCImpl_call_64, u64Target);
    1764717647                IEM_MC_END()
     
    1766217662
    1766317663    /* Far pointer loaded from memory. */
    17664     switch (pIemCpu->enmEffOpSize)
     17664    switch (pVCpu->iem.s.enmEffOpSize)
    1766517665    {
    1766617666        case IEMMODE_16BIT:
     
    1767217672            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1767317673            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    17674             IEM_MC_FETCH_MEM_U16(offSeg, pIemCpu->iEffSeg, GCPtrEffSrc);
    17675             IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc, 2);
     17674            IEM_MC_FETCH_MEM_U16(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     17675            IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 2);
    1767617676            IEM_MC_CALL_CIMPL_3(pfnCImpl, u16Sel, offSeg, enmEffOpSize);
    1767717677            IEM_MC_END();
     
    1768217682             *        and will apparently ignore REX.W, at least for the jmp far qword [rsp]
    1768317683             *        and call far qword [rsp] encodings. */
    17684             if (!IEM_IS_GUEST_CPU_AMD(pIemCpu))
     17684            if (!IEM_IS_GUEST_CPU_AMD(pVCpu))
    1768517685            {
    1768617686                IEM_MC_BEGIN(3, 1);
     
    1769117691                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1769217692                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    17693                 IEM_MC_FETCH_MEM_U64(offSeg, pIemCpu->iEffSeg, GCPtrEffSrc);
    17694                 IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc, 8);
     17693                IEM_MC_FETCH_MEM_U64(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     17694                IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 8);
    1769517695                IEM_MC_CALL_CIMPL_3(pfnCImpl, u16Sel, offSeg, enmEffOpSize);
    1769617696                IEM_MC_END();
     
    1770717707            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1770817708            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    17709             IEM_MC_FETCH_MEM_U32(offSeg, pIemCpu->iEffSeg, GCPtrEffSrc);
    17710             IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pIemCpu->iEffSeg, GCPtrEffSrc, 4);
     17709            IEM_MC_FETCH_MEM_U32(offSeg, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     17710            IEM_MC_FETCH_MEM_U16_DISP(u16Sel, pVCpu->iem.s.iEffSeg, GCPtrEffSrc, 4);
    1771117711            IEM_MC_CALL_CIMPL_3(pfnCImpl, u16Sel, offSeg, enmEffOpSize);
    1771217712            IEM_MC_END();
     
    1774217742    {
    1774317743        /* The new RIP is taken from a register. */
    17744         switch (pIemCpu->enmEffOpSize)
     17744        switch (pVCpu->iem.s.enmEffOpSize)
    1774517745        {
    1774617746            case IEMMODE_16BIT:
    1774717747                IEM_MC_BEGIN(0, 1);
    1774817748                IEM_MC_LOCAL(uint16_t, u16Target);
    17749                 IEM_MC_FETCH_GREG_U16(u16Target, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17749                IEM_MC_FETCH_GREG_U16(u16Target, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1775017750                IEM_MC_SET_RIP_U16(u16Target);
    1775117751                IEM_MC_END()
     
    1775517755                IEM_MC_BEGIN(0, 1);
    1775617756                IEM_MC_LOCAL(uint32_t, u32Target);
    17757                 IEM_MC_FETCH_GREG_U32(u32Target, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17757                IEM_MC_FETCH_GREG_U32(u32Target, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1775817758                IEM_MC_SET_RIP_U32(u32Target);
    1775917759                IEM_MC_END()
     
    1776317763                IEM_MC_BEGIN(0, 1);
    1776417764                IEM_MC_LOCAL(uint64_t, u64Target);
    17765                 IEM_MC_FETCH_GREG_U64(u64Target, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17765                IEM_MC_FETCH_GREG_U64(u64Target, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1776617766                IEM_MC_SET_RIP_U64(u64Target);
    1776717767                IEM_MC_END()
     
    1777417774    {
    1777517775        /* The new RIP is taken from a memory location. */
    17776         switch (pIemCpu->enmEffOpSize)
     17776        switch (pVCpu->iem.s.enmEffOpSize)
    1777717777        {
    1777817778            case IEMMODE_16BIT:
     
    1778117781                IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    1778217782                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    17783                 IEM_MC_FETCH_MEM_U16(u16Target, pIemCpu->iEffSeg, GCPtrEffSrc);
     17783                IEM_MC_FETCH_MEM_U16(u16Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1778417784                IEM_MC_SET_RIP_U16(u16Target);
    1778517785                IEM_MC_END()
     
    1779117791                IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    1779217792                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    17793                 IEM_MC_FETCH_MEM_U32(u32Target, pIemCpu->iEffSeg, GCPtrEffSrc);
     17793                IEM_MC_FETCH_MEM_U32(u32Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1779417794                IEM_MC_SET_RIP_U32(u32Target);
    1779517795                IEM_MC_END()
     
    1780117801                IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    1780217802                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    17803                 IEM_MC_FETCH_MEM_U64(u64Target, pIemCpu->iEffSeg, GCPtrEffSrc);
     17803                IEM_MC_FETCH_MEM_U64(u64Target, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1780417804                IEM_MC_SET_RIP_U64(u64Target);
    1780517805                IEM_MC_END()
     
    1783417834    /* Registers are handled by a common worker. */
    1783517835    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    17836         return FNIEMOP_CALL_1(iemOpCommonPushGReg, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB);
     17836        return FNIEMOP_CALL_1(iemOpCommonPushGReg, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1783717837
    1783817838    /* Memory we do here. */
    1783917839    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    17840     switch (pIemCpu->enmEffOpSize)
     17840    switch (pVCpu->iem.s.enmEffOpSize)
    1784117841    {
    1784217842        case IEMMODE_16BIT:
     
    1784517845            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    1784617846            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    17847             IEM_MC_FETCH_MEM_U16(u16Src, pIemCpu->iEffSeg, GCPtrEffSrc);
     17847            IEM_MC_FETCH_MEM_U16(u16Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1784817848            IEM_MC_PUSH_U16(u16Src);
    1784917849            IEM_MC_ADVANCE_RIP();
     
    1785617856            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    1785717857            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    17858             IEM_MC_FETCH_MEM_U32(u32Src, pIemCpu->iEffSeg, GCPtrEffSrc);
     17858            IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1785917859            IEM_MC_PUSH_U32(u32Src);
    1786017860            IEM_MC_ADVANCE_RIP();
     
    1786717867            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
    1786817868            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    17869             IEM_MC_FETCH_MEM_U64(u64Src, pIemCpu->iEffSeg, GCPtrEffSrc);
     17869            IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1787017870            IEM_MC_PUSH_U64(u64Src);
    1787117871            IEM_MC_ADVANCE_RIP();
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r62010 r62015  
    264264        mov     r8d, ACCESS_FLAGS
    265265        mov     rdx, [VA]
    266         mov     rcx, [pIemCpu]
     266        mov     rcx, [pVCpu]
    267267        call    iemTlbTypeMiss
    268268    .Done:
     
    648648/** Gets the current IEMTARGETCPU value.
    649649 * @returns IEMTARGETCPU value.
    650  * @param   a_pIemCpu       The IEM per CPU instance data.
     650 * @param   a_pVCpu         The IEM per CPU instance data.
    651651 */
    652652#if IEM_CFG_TARGET_CPU != IEMTARGETCPU_DYNAMIC
    653 # define IEM_GET_TARGET_CPU(a_pIemCpu)   (IEM_CFG_TARGET_CPU)
     653# define IEM_GET_TARGET_CPU(a_pVCpu)   (IEM_CFG_TARGET_CPU)
    654654#else
    655 # define IEM_GET_TARGET_CPU(a_pIemCpu)   ((a_pIemCpu)->uTargetCpu)
     655# define IEM_GET_TARGET_CPU(a_pVCpu)   ((a_pVCpu)->iem.s.uTargetCpu)
    656656#endif
    657657
     
    785785 * of an if statement.  */
    786786#ifdef IEM_VERIFICATION_MODE_FULL
    787 # define IEM_VERIFICATION_ENABLED(a_pIemCpu)    (!(a_pIemCpu)->fNoRem)
     787# define IEM_VERIFICATION_ENABLED(a_pVCpu)      (!(a_pVCpu)->iem.s.fNoRem)
    788788#elif defined(IEM_VERIFICATION_MODE_MINIMAL)
    789 # define IEM_VERIFICATION_ENABLED(a_pIemCpu)    (true)
     789# define IEM_VERIFICATION_ENABLED(a_pVCpu)      (true)
    790790#else
    791 # define IEM_VERIFICATION_ENABLED(a_pIemCpu)    (false)
     791# define IEM_VERIFICATION_ENABLED(a_pVCpu)      (false)
    792792#endif
    793793
     
    799799 * of an if statement.  */
    800800#ifdef IEM_VERIFICATION_MODE_FULL
    801 # define IEM_FULL_VERIFICATION_ENABLED(a_pIemCpu) (!(a_pIemCpu)->fNoRem)
     801# define IEM_FULL_VERIFICATION_ENABLED(a_pVCpu) (!(a_pVCpu)->iem.s.fNoRem)
    802802#else
    803 # define IEM_FULL_VERIFICATION_ENABLED(a_pIemCpu) (false)
     803# define IEM_FULL_VERIFICATION_ENABLED(a_pVCpu) (false)
    804804#endif
    805805
     
    812812#ifdef IEM_VERIFICATION_MODE_FULL
    813813# ifdef IEM_VERIFICATION_MODE_FULL_HM
    814 #  define IEM_FULL_VERIFICATION_REM_ENABLED(a_pIemCpu) (!(a_pIemCpu)->fNoRem && !HMIsEnabled(IEMCPU_TO_VM(a_pIemCpu)))
     814#  define IEM_FULL_VERIFICATION_REM_ENABLED(a_pVCpu)    (!(a_pVCpu)->iem.s.fNoRem && !HMIsEnabled((a_pVCpu)->CTX_SUFF(pVM)))
    815815# else
    816 #  define IEM_FULL_VERIFICATION_REM_ENABLED(a_pIemCpu) (!(a_pIemCpu)->fNoRem)
     816#  define IEM_FULL_VERIFICATION_REM_ENABLED(a_pVCpu)    (!(a_pVCpu)->iem.s.fNoRem)
    817817# endif
    818818#else
    819 # define IEM_FULL_VERIFICATION_REM_ENABLED(a_pIemCpu) (false)
     819# define IEM_FULL_VERIFICATION_REM_ENABLED(a_pVCpu)    (false)
    820820#endif
    821821
     
    836836 */
    837837#ifdef IEM_VERIFICATION_MODE_FULL
    838 # define IEMOP_VERIFICATION_UNDEFINED_EFLAGS(a_fEfl) do { pIemCpu->fUndefinedEFlags |= (a_fEfl); } while (0)
     838# define IEMOP_VERIFICATION_UNDEFINED_EFLAGS(a_fEfl) do { pVCpu->iem.s.fUndefinedEFlags |= (a_fEfl); } while (0)
    839839#else
    840840# define IEMOP_VERIFICATION_UNDEFINED_EFLAGS(a_fEfl) do { } while (0)
     
    15441544 */
    15451545# define IEM_CIMPL_DECL_TYPE_0(a_Name) \
    1546     IEM_DECL_IMPL_TYPE(VBOXSTRICTRC, a_Name, (PIEMCPU pIemCpu, uint8_t cbInstr))
     1546    IEM_DECL_IMPL_TYPE(VBOXSTRICTRC, a_Name, (PVMCPU pVCpu, uint8_t cbInstr))
    15471547/**
    15481548 * For defining a C instruction implementation function taking no extra
     
    15521552 */
    15531553# define IEM_CIMPL_DEF_0(a_Name) \
    1554     IEM_DECL_IMPL_DEF(VBOXSTRICTRC, a_Name, (PIEMCPU pIemCpu, uint8_t cbInstr))
     1554    IEM_DECL_IMPL_DEF(VBOXSTRICTRC, a_Name, (PVMCPU pVCpu, uint8_t cbInstr))
    15551555/**
    15561556 * For calling a C instruction implementation function taking no extra
     
    15621562 * @param   a_fn                The name of the function.
    15631563 */
    1564 # define IEM_CIMPL_CALL_0(a_fn)            a_fn(pIemCpu, cbInstr)
     1564# define IEM_CIMPL_CALL_0(a_fn)            a_fn(pVCpu, cbInstr)
    15651565
    15661566/**
     
    15731573 */
    15741574# define IEM_CIMPL_DECL_TYPE_1(a_Name, a_Type0, a_Arg0) \
    1575     IEM_DECL_IMPL_TYPE(VBOXSTRICTRC, a_Name, (PIEMCPU pIemCpu, uint8_t cbInstr, a_Type0 a_Arg0))
     1575    IEM_DECL_IMPL_TYPE(VBOXSTRICTRC, a_Name, (PVMCPU pVCpu, uint8_t cbInstr, a_Type0 a_Arg0))
    15761576/**
    15771577 * For defining a C instruction implementation function taking one extra
     
    15831583 */
    15841584# define IEM_CIMPL_DEF_1(a_Name, a_Type0, a_Arg0) \
    1585     IEM_DECL_IMPL_DEF(VBOXSTRICTRC, a_Name, (PIEMCPU pIemCpu, uint8_t cbInstr, a_Type0 a_Arg0))
     1585    IEM_DECL_IMPL_DEF(VBOXSTRICTRC, a_Name, (PVMCPU pVCpu, uint8_t cbInstr, a_Type0 a_Arg0))
    15861586/**
    15871587 * For calling a C instruction implementation function taking one extra
     
    15941594 * @param   a0                  The name of the 1st argument.
    15951595 */
    1596 # define IEM_CIMPL_CALL_1(a_fn, a0)        a_fn(pIemCpu, cbInstr, (a0))
     1596# define IEM_CIMPL_CALL_1(a_fn, a0)        a_fn(pVCpu, cbInstr, (a0))
    15971597
    15981598/**
     
    16071607 */
    16081608# define IEM_CIMPL_DECL_TYPE_2(a_Name, a_Type0, a_Arg0, a_Type1, a_Arg1) \
    1609     IEM_DECL_IMPL_TYPE(VBOXSTRICTRC, a_Name, (PIEMCPU pIemCpu, uint8_t cbInstr, a_Type0 a_Arg0, a_Type1 a_Arg1))
     1609    IEM_DECL_IMPL_TYPE(VBOXSTRICTRC, a_Name, (PVMCPU pVCpu, uint8_t cbInstr, a_Type0 a_Arg0, a_Type1 a_Arg1))
    16101610/**
    16111611 * For defining a C instruction implementation function taking two extra
     
    16191619 */
    16201620# define IEM_CIMPL_DEF_2(a_Name, a_Type0, a_Arg0, a_Type1, a_Arg1) \
    1621     IEM_DECL_IMPL_DEF(VBOXSTRICTRC, a_Name, (PIEMCPU pIemCpu, uint8_t cbInstr, a_Type0 a_Arg0, a_Type1 a_Arg1))
     1621    IEM_DECL_IMPL_DEF(VBOXSTRICTRC, a_Name, (PVMCPU pVCpu, uint8_t cbInstr, a_Type0 a_Arg0, a_Type1 a_Arg1))
    16221622/**
    16231623 * For calling a C instruction implementation function taking two extra
     
    16311631 * @param   a1                  The name of the 2nd argument.
    16321632 */
    1633 # define IEM_CIMPL_CALL_2(a_fn, a0, a1)    a_fn(pIemCpu, cbInstr, (a0), (a1))
     1633# define IEM_CIMPL_CALL_2(a_fn, a0, a1)    a_fn(pVCpu, cbInstr, (a0), (a1))
    16341634
    16351635/**
     
    16461646 */
    16471647# define IEM_CIMPL_DECL_TYPE_3(a_Name, a_Type0, a_Arg0, a_Type1, a_Arg1, a_Type2, a_Arg2) \
    1648     IEM_DECL_IMPL_TYPE(VBOXSTRICTRC, a_Name, (PIEMCPU pIemCpu, uint8_t cbInstr, a_Type0 a_Arg0, a_Type1 a_Arg1, a_Type2 a_Arg2))
     1648    IEM_DECL_IMPL_TYPE(VBOXSTRICTRC, a_Name, (PVMCPU pVCpu, uint8_t cbInstr, a_Type0 a_Arg0, a_Type1 a_Arg1, a_Type2 a_Arg2))
    16491649/**
    16501650 * For defining a C instruction implementation function taking three extra
     
    16601660 */
    16611661# define IEM_CIMPL_DEF_3(a_Name, a_Type0, a_Arg0, a_Type1, a_Arg1, a_Type2, a_Arg2) \
    1662     IEM_DECL_IMPL_DEF(VBOXSTRICTRC, a_Name, (PIEMCPU pIemCpu, uint8_t cbInstr, a_Type0 a_Arg0, a_Type1 a_Arg1, a_Type2 a_Arg2))
     1662    IEM_DECL_IMPL_DEF(VBOXSTRICTRC, a_Name, (PVMCPU pVCpu, uint8_t cbInstr, a_Type0 a_Arg0, a_Type1 a_Arg1, a_Type2 a_Arg2))
    16631663/**
    16641664 * For calling a C instruction implementation function taking three extra
     
    16731673 * @param   a2                  The name of the 3rd argument.
    16741674 */
    1675 # define IEM_CIMPL_CALL_3(a_fn, a0, a1, a2) a_fn(pIemCpu, cbInstr, (a0), (a1), (a2))
     1675# define IEM_CIMPL_CALL_3(a_fn, a0, a1, a2) a_fn(pVCpu, cbInstr, (a0), (a1), (a2))
    16761676
    16771677
     
    16911691 */
    16921692# define IEM_CIMPL_DECL_TYPE_4(a_Name, a_Type0, a_Arg0, a_Type1, a_Arg1, a_Type2, a_Arg2, a_Type3, a_Arg3) \
    1693     IEM_DECL_IMPL_TYPE(VBOXSTRICTRC, a_Name, (PIEMCPU pIemCpu, uint8_t cbInstr, a_Type0 a_Arg0, a_Type1 a_Arg1, a_Type2 a_Arg2, a_Type3 a_Arg3))
     1693    IEM_DECL_IMPL_TYPE(VBOXSTRICTRC, a_Name, (PVMCPU pVCpu, uint8_t cbInstr, a_Type0 a_Arg0, a_Type1 a_Arg1, a_Type2 a_Arg2, a_Type3 a_Arg3))
    16941694/**
    16951695 * For defining a C instruction implementation function taking four extra
     
    17071707 */
    17081708# define IEM_CIMPL_DEF_4(a_Name, a_Type0, a_Arg0, a_Type1, a_Arg1, a_Type2, a_Arg2, a_Type3, a_Arg3) \
    1709     IEM_DECL_IMPL_DEF(VBOXSTRICTRC, a_Name, (PIEMCPU pIemCpu, uint8_t cbInstr, a_Type0 a_Arg0, a_Type1 a_Arg1, \
     1709    IEM_DECL_IMPL_DEF(VBOXSTRICTRC, a_Name, (PVMCPU pVCpu, uint8_t cbInstr, a_Type0 a_Arg0, a_Type1 a_Arg1, \
    17101710                                             a_Type2 a_Arg2, a_Type3 a_Arg3))
    17111711/**
     
    17221722 * @param   a3                  The name of the 4th argument.
    17231723 */
    1724 # define IEM_CIMPL_CALL_4(a_fn, a0, a1, a2, a3) a_fn(pIemCpu, cbInstr, (a0), (a1), (a2), (a3))
     1724# define IEM_CIMPL_CALL_4(a_fn, a0, a1, a2, a3) a_fn(pVCpu, cbInstr, (a0), (a1), (a2), (a3))
    17251725
    17261726
     
    17421742 */
    17431743# define IEM_CIMPL_DECL_TYPE_5(a_Name, a_Type0, a_Arg0, a_Type1, a_Arg1, a_Type2, a_Arg2, a_Type3, a_Arg3, a_Type4, a_Arg4) \
    1744     IEM_DECL_IMPL_TYPE(VBOXSTRICTRC, a_Name, (PIEMCPU pIemCpu, uint8_t cbInstr, \
     1744    IEM_DECL_IMPL_TYPE(VBOXSTRICTRC, a_Name, (PVMCPU pVCpu, uint8_t cbInstr, \
    17451745                                               a_Type0 a_Arg0, a_Type1 a_Arg1, a_Type2 a_Arg2, \
    17461746                                               a_Type3 a_Arg3, a_Type4 a_Arg4))
     
    17621762 */
    17631763# define IEM_CIMPL_DEF_5(a_Name, a_Type0, a_Arg0, a_Type1, a_Arg1, a_Type2, a_Arg2, a_Type3, a_Arg3, a_Type4, a_Arg4) \
    1764     IEM_DECL_IMPL_DEF(VBOXSTRICTRC, a_Name, (PIEMCPU pIemCpu, uint8_t cbInstr, \
     1764    IEM_DECL_IMPL_DEF(VBOXSTRICTRC, a_Name, (PVMCPU pVCpu, uint8_t cbInstr, \
    17651765                                             a_Type0 a_Arg0, a_Type1 a_Arg1, a_Type2 a_Arg2, \
    17661766                                             a_Type3 a_Arg3, a_Type4 a_Arg4))
     
    17791779 * @param   a4                  The name of the 5th argument.
    17801780 */
    1781 # define IEM_CIMPL_CALL_5(a_fn, a0, a1, a2, a3, a4) a_fn(pIemCpu, cbInstr, (a0), (a1), (a2), (a3), (a4))
     1781# define IEM_CIMPL_CALL_5(a_fn, a0, a1, a2, a3, a4) a_fn(pVCpu, cbInstr, (a0), (a1), (a2), (a3), (a4))
    17821782
    17831783/** @}  */
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r61886 r62015  
    2828#include <VBox/log.h>
    2929#include "../include/IEMInternal.h"
     30#include <VBox/vmm/vm.h>
    3031
    3132
     
    7374 * @{   */
    7475
    75 typedef VBOXSTRICTRC (* PFNIEMOP)(PIEMCPU pIemCpu);
     76typedef VBOXSTRICTRC (* PFNIEMOP)(PVMCPU pVCpu);
    7677#define FNIEMOP_DEF(a_Name) \
    77     static VBOXSTRICTRC a_Name(PIEMCPU pIemCpu) RT_NO_THROW_DEF
     78    static VBOXSTRICTRC a_Name(PVMCPU pVCpu) RT_NO_THROW_DEF
    7879#define FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) \
    79     static VBOXSTRICTRC a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0) RT_NO_THROW_DEF
     80    static VBOXSTRICTRC a_Name(PVMCPU pVCpu, a_Type0 a_Name0) RT_NO_THROW_DEF
    8081#define FNIEMOP_DEF_2(a_Name, a_Type0, a_Name0, a_Type1, a_Name1) \
    81     static VBOXSTRICTRC a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0, a_Type1 a_Name1) RT_NO_THROW_DEF
    82 
    83 typedef VBOXSTRICTRC (* PFNIEMOPRM)(PIEMCPU pIemCpu, uint8_t bRm);
     82    static VBOXSTRICTRC a_Name(PVMCPU pVCpu, a_Type0 a_Name0, a_Type1 a_Name1) RT_NO_THROW_DEF
     83
     84typedef VBOXSTRICTRC (* PFNIEMOPRM)(PVMCPU pVCpu, uint8_t bRm);
    8485#define FNIEMOPRM_DEF(a_Name) \
    85     static VBOXSTRICTRC a_Name(PIEMCPU pIemCpu, uint8_t bRm) RT_NO_THROW_DEF
     86    static VBOXSTRICTRC a_Name(PVMCPU pVCpu, uint8_t bRm) RT_NO_THROW_DEF
    8687
    8788#define IEM_NOT_REACHED_DEFAULT_CASE_RET()                  default: return VERR_IPE_NOT_REACHED_DEFAULT_CASE
     
    144145
    145146
    146 #define FNIEMOP_CALL(a_pfn)                                 (a_pfn)(pIemCpu)
    147 #define FNIEMOP_CALL_1(a_pfn, a0)                           (a_pfn)(pIemCpu, a0)
    148 #define FNIEMOP_CALL_2(a_pfn, a0, a1)                       (a_pfn)(pIemCpu, a0, a1)
    149 
    150 #define IEM_IS_REAL_OR_V86_MODE(a_pIemCpu)                  (g_fRandom)
    151 #define IEM_IS_LONG_MODE(a_pIemCpu)                         (g_fRandom)
    152 #define IEM_IS_REAL_MODE(a_pIemCpu)                         (g_fRandom)
    153 #define IEM_IS_GUEST_CPU_AMD(a_pIemCpu)                     (g_fRandom)
    154 #define IEM_IS_GUEST_CPU_INTEL(a_pIemCpu)                   (g_fRandom)
    155 #define IEM_GET_GUEST_CPU_FEATURES(a_pIemCpu)               ((PCCPUMFEATURES)(uintptr_t)42)
    156 #define IEM_GET_HOST_CPU_FEATURES(a_pIemCpu)                ((PCCPUMFEATURES)(uintptr_t)88)
    157 
    158 #define iemRecalEffOpSize(a_pIemCpu)                        do { } while (0)
     147#define FNIEMOP_CALL(a_pfn)                                 (a_pfn)(pVCpu)
     148#define FNIEMOP_CALL_1(a_pfn, a0)                           (a_pfn)(pVCpu, a0)
     149#define FNIEMOP_CALL_2(a_pfn, a0, a1)                       (a_pfn)(pVCpu, a0, a1)
     150
     151#define IEM_IS_REAL_OR_V86_MODE(a_pVCpu)                    (g_fRandom)
     152#define IEM_IS_LONG_MODE(a_pVCpu)                           (g_fRandom)
     153#define IEM_IS_REAL_MODE(a_pVCpu)                           (g_fRandom)
     154#define IEM_IS_GUEST_CPU_AMD(a_pVCpu)                       (g_fRandom)
     155#define IEM_IS_GUEST_CPU_INTEL(a_pVCpu)                     (g_fRandom)
     156#define IEM_GET_GUEST_CPU_FEATURES(a_pVCpu)                 ((PCCPUMFEATURES)(uintptr_t)42)
     157#define IEM_GET_HOST_CPU_FEATURES(a_pVCpu)                  ((PCCPUMFEATURES)(uintptr_t)88)
     158
     159#define iemRecalEffOpSize(a_pVCpu)                          do { } while (0)
    159160
    160161IEMOPBINSIZES g_iemAImpl_add;
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