VirtualBox

Changeset 72497 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jun 10, 2018 5:33:31 PM (7 years ago)
Author:
vboxsync
Message:

IEM: Use pVCpu->cpum.s.GstCtx, avoid passing pCtx as a parameter or having it as a local variable.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
3 edited

Legend:

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

    r72496 r72497  
    32383238                                                                        : IEMXCPTRAISEINFO_PF_CONTRIBUTORY_XCPT;
    32393239                Log2(("IEMEvaluateRecursiveXcpt: Vectoring page fault. uPrevVector=%#x uCurVector=%#x uCr2=%#RX64\n", uPrevVector,
    3240                       uCurVector, IEM_GET_CTX(pVCpu)->cr2));
     3240                      uCurVector, pVCpu->cpum.GstCtx.cr2));
    32413241            }
    32423242            else if (   enmPrevXcptClass == IEMXCPTCLASS_CONTRIBUTORY
     
    55455545{
    55465546    /** @todo set/clear RF. */
    5547     IEM_GET_CTX(pVCpu)->dr[7] &= ~X86_DR7_GD;
     5547    pVCpu->cpum.GstCtx.dr[7] &= ~X86_DR7_GD;
    55485548    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_DB, IEM_XCPT_FLAGS_T_CPU_XCPT, 0, 0);
    55495549}
     
    55825582{
    55835583    return iemRaiseXcptOrInt(pVCpu, 0, X86_XCPT_TS, IEM_XCPT_FLAGS_T_CPU_XCPT | IEM_XCPT_FLAGS_ERR,
    5584                              IEM_GET_CTX(pVCpu)->tr.Sel, 0);
     5584                             pVCpu->cpum.GstCtx.tr.Sel, 0);
    55855585}
    55865586
     
    57495749
    57505750    if (   (fAccess & IEM_ACCESS_WHAT_MASK) == IEM_ACCESS_WHAT_CODE
    5751         && (   (IEM_GET_CTX(pVCpu)->cr4 & X86_CR4_PAE)
    5752             && (IEM_GET_CTX(pVCpu)->msrEFER & MSR_K6_EFER_NXE) ) )
     5751        && (   (pVCpu->cpum.GstCtx.cr4 & X86_CR4_PAE)
     5752            && (pVCpu->cpum.GstCtx.msrEFER & MSR_K6_EFER_NXE) ) )
    57535753        uErr |= X86_TRAP_PF_ID;
    57545754
     
    59585958    RTAssertMsg2Weak("%s%s\n", szRegs, szInstr);
    59595959#else
    5960     RTAssertMsg2Weak("cs:rip=%04x:%RX64\n", IEM_GET_CTX(pVCpu)->cs, IEM_GET_CTX(pVCpu)->rip);
     5960    RTAssertMsg2Weak("cs:rip=%04x:%RX64\n", pVCpu->cpum.GstCtx.cs, pVCpu->cpum.GstCtx.rip);
    59615961#endif
    59625962}
     
    62336233{
    62346234    Assert(iReg < 16);
    6235     return IEM_GET_CTX(pVCpu)->aGRegs[iReg].u16;
     6235    return pVCpu->cpum.GstCtx.aGRegs[iReg].u16;
    62366236}
    62376237
     
    62476247{
    62486248    Assert(iReg < 16);
    6249     return IEM_GET_CTX(pVCpu)->aGRegs[iReg].u32;
     6249    return pVCpu->cpum.GstCtx.aGRegs[iReg].u32;
    62506250}
    62516251
     
    62616261{
    62626262    Assert(iReg < 16);
    6263     return IEM_GET_CTX(pVCpu)->aGRegs[iReg].u64;
     6263    return pVCpu->cpum.GstCtx.aGRegs[iReg].u64;
    62646264}
    62656265
     
    73117311{
    73127312    Assert(iStReg < 8);
    7313     PX86FXSTATE pFpuCtx = &IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87;
     7313    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
    73147314    uint8_t     iReg    = (X86_FSW_TOP_GET(pFpuCtx->FSW) + iStReg) & X86_FSW_TOP_SMASK;
    73157315    pFpuCtx->FTW &= ~RT_BIT(iReg);
     
    73247324IEM_STATIC void iemFpuStackIncTop(PVMCPU pVCpu)
    73257325{
    7326     PX86FXSTATE pFpuCtx = &IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87;
     7326    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
    73277327    uint16_t    uFsw    = pFpuCtx->FSW;
    73287328    uint16_t    uTop    = uFsw & X86_FSW_TOP_MASK;
     
    73417341IEM_STATIC void iemFpuStackDecTop(PVMCPU pVCpu)
    73427342{
    7343     PX86FXSTATE pFpuCtx = &IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87;
     7343    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
    73447344    uint16_t    uFsw    = pFpuCtx->FSW;
    73457345    uint16_t    uTop    = uFsw & X86_FSW_TOP_MASK;
     
    76287628IEM_STATIC int iemFpuStRegNotEmpty(PVMCPU pVCpu, uint8_t iStReg)
    76297629{
    7630     PX86FXSTATE pFpuCtx = &IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87;
     7630    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
    76317631    uint16_t    iReg    = (X86_FSW_TOP_GET(pFpuCtx->FSW) + iStReg) & X86_FSW_TOP_SMASK;
    76327632    if (pFpuCtx->FTW & RT_BIT(iReg))
     
    76387638IEM_STATIC int iemFpuStRegNotEmptyRef(PVMCPU pVCpu, uint8_t iStReg, PCRTFLOAT80U *ppRef)
    76397639{
    7640     PX86FXSTATE pFpuCtx = &IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87;
     7640    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
    76417641    uint16_t    iReg    = (X86_FSW_TOP_GET(pFpuCtx->FSW) + iStReg) & X86_FSW_TOP_SMASK;
    76427642    if (pFpuCtx->FTW & RT_BIT(iReg))
     
    76527652                                        uint8_t iStReg1, PCRTFLOAT80U *ppRef1)
    76537653{
    7654     PX86FXSTATE pFpuCtx = &IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87;
     7654    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
    76557655    uint16_t    iTop    = X86_FSW_TOP_GET(pFpuCtx->FSW);
    76567656    uint16_t    iReg0   = (iTop + iStReg0) & X86_FSW_TOP_SMASK;
     
    76687668IEM_STATIC int iemFpu2StRegsNotEmptyRefFirst(PVMCPU pVCpu, uint8_t iStReg0, PCRTFLOAT80U *ppRef0, uint8_t iStReg1)
    76697669{
    7670     PX86FXSTATE pFpuCtx = &IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87;
     7670    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
    76717671    uint16_t    iTop    = X86_FSW_TOP_GET(pFpuCtx->FSW);
    76727672    uint16_t    iReg0   = (iTop + iStReg0) & X86_FSW_TOP_SMASK;
     
    80128012            && (       (pVCpu->iem.s.uCpl == 3
    80138013                    && !(fAccess & IEM_ACCESS_WHAT_SYS))
    8014                 || (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_WP)))
     8014                || (pVCpu->cpum.GstCtx.cr0 & X86_CR0_WP)))
    80158015        {
    80168016            Log(("iemMemPageTranslateAndCheckAccess: GCPtrMem=%RGv - read-only page -> #PF\n", GCPtrMem));
     
    80328032        if (   (fAccess & IEM_ACCESS_TYPE_EXEC)
    80338033            && (fFlags & X86_PTE_PAE_NX)
    8034             && (IEM_GET_CTX(pVCpu)->msrEFER & MSR_K6_EFER_NXE) )
     8034            && (pVCpu->cpum.GstCtx.msrEFER & MSR_K6_EFER_NXE) )
    80358035        {
    80368036            Log(("iemMemPageTranslateAndCheckAccess: GCPtrMem=%RGv - NX -> #PF\n", GCPtrMem));
     
    94289428    /** @todo testcase: Ordering of \#SS(0) vs \#GP() vs \#PF on SSE stuff. */
    94299429    if (   (GCPtrMem & 15)
    9430         && !(IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     9430        && !(pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    94319431        return iemRaiseGeneralProtectionFault0(pVCpu);
    94329432
     
    94619461    /** @todo testcase: Ordering of \#SS(0) vs \#GP() vs \#PF on SSE stuff. */
    94629462    if (   (GCPtrMem & 15) == 0
    9463         || (IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     9463        || (pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    94649464    {
    94659465        PCRTUINT128U pu128Src = (PCRTUINT128U)iemMemMapJmp(pVCpu, sizeof(*pu128Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     
    99049904    /* The lazy approach for now... */
    99059905    if (   (GCPtrMem & 15)
    9906         && !(IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     9906        && !(pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    99079907        return iemRaiseGeneralProtectionFault0(pVCpu);
    99089908
     
    99359935    /* The lazy approach for now... */
    99369936    if (   (GCPtrMem & 15) == 0
    9937         || (IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     9937        || (pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    99389938    {
    99399939        PRTUINT128U pu128Dst = (PRTUINT128U)iemMemMapJmp(pVCpu, sizeof(*pu128Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     
    1054210542    VBOXSTRICTRC rcStrict = iemMemCommitAndUnmap(pVCpu, pvMem, IEM_ACCESS_STACK_W);
    1054310543    if (rcStrict == VINF_SUCCESS)
    10544         IEM_GET_CTX(pVCpu)->rsp = uNewRsp;
     10544        pVCpu->cpum.GstCtx.rsp = uNewRsp;
    1054510545    return rcStrict;
    1054610546}
     
    1092110921#define IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE()       \
    1092210922    do { \
    10923         if (IEM_GET_CTX(pVCpu)->cr0 & (X86_CR0_EM | X86_CR0_TS)) \
     10923        if (pVCpu->cpum.GstCtx.cr0 & (X86_CR0_EM | X86_CR0_TS)) \
    1092410924            return iemRaiseDeviceNotAvailable(pVCpu); \
    1092510925    } while (0)
    1092610926#define IEM_MC_MAYBE_RAISE_WAIT_DEVICE_NOT_AVAILABLE()  \
    1092710927    do { \
    10928         if ((IEM_GET_CTX(pVCpu)->cr0 & (X86_CR0_MP | X86_CR0_TS)) == (X86_CR0_MP | X86_CR0_TS)) \
     10928        if ((pVCpu->cpum.GstCtx.cr0 & (X86_CR0_MP | X86_CR0_TS)) == (X86_CR0_MP | X86_CR0_TS)) \
    1092910929            return iemRaiseDeviceNotAvailable(pVCpu); \
    1093010930    } while (0)
    1093110931#define IEM_MC_MAYBE_RAISE_FPU_XCPT() \
    1093210932    do { \
    10933         if (IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.FSW & X86_FSW_ES) \
     10933        if (pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FSW & X86_FSW_ES) \
    1093410934            return iemRaiseMathFault(pVCpu); \
    1093510935    } while (0)
    1093610936#define IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT() \
    1093710937    do { \
    10938         if (   (IEM_GET_CTX(pVCpu)->aXcr[0] & (XSAVE_C_YMM | XSAVE_C_SSE)) != (XSAVE_C_YMM | XSAVE_C_SSE) \
    10939             || !(IEM_GET_CTX(pVCpu)->cr4 & X86_CR4_OSXSAVE) \
     10938        if (   (pVCpu->cpum.GstCtx.aXcr[0] & (XSAVE_C_YMM | XSAVE_C_SSE)) != (XSAVE_C_YMM | XSAVE_C_SSE) \
     10939            || !(pVCpu->cpum.GstCtx.cr4 & X86_CR4_OSXSAVE) \
    1094010940            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx2) \
    1094110941            return iemRaiseUndefinedOpcode(pVCpu); \
    10942         if (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_TS) \
     10942        if (pVCpu->cpum.GstCtx.cr0 & X86_CR0_TS) \
    1094310943            return iemRaiseDeviceNotAvailable(pVCpu); \
    1094410944    } while (0)
    1094510945#define IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT() \
    1094610946    do { \
    10947         if (   (IEM_GET_CTX(pVCpu)->aXcr[0] & (XSAVE_C_YMM | XSAVE_C_SSE)) != (XSAVE_C_YMM | XSAVE_C_SSE) \
    10948             || !(IEM_GET_CTX(pVCpu)->cr4 & X86_CR4_OSXSAVE) \
     10947        if (   (pVCpu->cpum.GstCtx.aXcr[0] & (XSAVE_C_YMM | XSAVE_C_SSE)) != (XSAVE_C_YMM | XSAVE_C_SSE) \
     10948            || !(pVCpu->cpum.GstCtx.cr4 & X86_CR4_OSXSAVE) \
    1094910949            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx) \
    1095010950            return iemRaiseUndefinedOpcode(pVCpu); \
    10951         if (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_TS) \
     10951        if (pVCpu->cpum.GstCtx.cr0 & X86_CR0_TS) \
    1095210952            return iemRaiseDeviceNotAvailable(pVCpu); \
    1095310953    } while (0)
    1095410954#define IEM_MC_MAYBE_RAISE_SSE41_RELATED_XCPT() \
    1095510955    do { \
    10956         if (   (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_EM) \
    10957             || !(IEM_GET_CTX(pVCpu)->cr4 & X86_CR4_OSFXSR) \
     10956        if (   (pVCpu->cpum.GstCtx.cr0 & X86_CR0_EM) \
     10957            || !(pVCpu->cpum.GstCtx.cr4 & X86_CR4_OSFXSR) \
    1095810958            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse41) \
    1095910959            return iemRaiseUndefinedOpcode(pVCpu); \
    10960         if (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_TS) \
     10960        if (pVCpu->cpum.GstCtx.cr0 & X86_CR0_TS) \
    1096110961            return iemRaiseDeviceNotAvailable(pVCpu); \
    1096210962    } while (0)
    1096310963#define IEM_MC_MAYBE_RAISE_SSE3_RELATED_XCPT() \
    1096410964    do { \
    10965         if (   (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_EM) \
    10966             || !(IEM_GET_CTX(pVCpu)->cr4 & X86_CR4_OSFXSR) \
     10965        if (   (pVCpu->cpum.GstCtx.cr0 & X86_CR0_EM) \
     10966            || !(pVCpu->cpum.GstCtx.cr4 & X86_CR4_OSFXSR) \
    1096710967            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse3) \
    1096810968            return iemRaiseUndefinedOpcode(pVCpu); \
    10969         if (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_TS) \
     10969        if (pVCpu->cpum.GstCtx.cr0 & X86_CR0_TS) \
    1097010970            return iemRaiseDeviceNotAvailable(pVCpu); \
    1097110971    } while (0)
    1097210972#define IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT() \
    1097310973    do { \
    10974         if (   (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_EM) \
    10975             || !(IEM_GET_CTX(pVCpu)->cr4 & X86_CR4_OSFXSR) \
     10974        if (   (pVCpu->cpum.GstCtx.cr0 & X86_CR0_EM) \
     10975            || !(pVCpu->cpum.GstCtx.cr4 & X86_CR4_OSFXSR) \
    1097610976            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse2) \
    1097710977            return iemRaiseUndefinedOpcode(pVCpu); \
    10978         if (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_TS) \
     10978        if (pVCpu->cpum.GstCtx.cr0 & X86_CR0_TS) \
    1097910979            return iemRaiseDeviceNotAvailable(pVCpu); \
    1098010980    } while (0)
    1098110981#define IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT() \
    1098210982    do { \
    10983         if (   (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_EM) \
    10984             || !(IEM_GET_CTX(pVCpu)->cr4 & X86_CR4_OSFXSR) \
     10983        if (   (pVCpu->cpum.GstCtx.cr0 & X86_CR0_EM) \
     10984            || !(pVCpu->cpum.GstCtx.cr4 & X86_CR4_OSFXSR) \
    1098510985            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse) \
    1098610986            return iemRaiseUndefinedOpcode(pVCpu); \
    10987         if (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_TS) \
     10987        if (pVCpu->cpum.GstCtx.cr0 & X86_CR0_TS) \
    1098810988            return iemRaiseDeviceNotAvailable(pVCpu); \
    1098910989    } while (0)
    1099010990#define IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT() \
    1099110991    do { \
    10992         if (   (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_EM) \
     10992        if (   (pVCpu->cpum.GstCtx.cr0 & X86_CR0_EM) \
    1099310993            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fMmx) \
    1099410994            return iemRaiseUndefinedOpcode(pVCpu); \
    10995         if (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_TS) \
     10995        if (pVCpu->cpum.GstCtx.cr0 & X86_CR0_TS) \
    1099610996            return iemRaiseDeviceNotAvailable(pVCpu); \
    1099710997    } while (0)
    1099810998#define IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT() \
    1099910999    do { \
    11000         if (   (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_EM) \
     11000        if (   (pVCpu->cpum.GstCtx.cr0 & X86_CR0_EM) \
    1100111001            || (   !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse \
    1100211002                && !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAmdMmxExts) ) \
    1100311003            return iemRaiseUndefinedOpcode(pVCpu); \
    11004         if (IEM_GET_CTX(pVCpu)->cr0 & X86_CR0_TS) \
     11004        if (pVCpu->cpum.GstCtx.cr0 & X86_CR0_TS) \
    1100511005            return iemRaiseDeviceNotAvailable(pVCpu); \
    1100611006    } while (0)
     
    1101911019        if (   pVCpu->iem.s.enmCpuMode != IEMMODE_64BIT \
    1102011020            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fFsGsBase \
    11021             || !(IEM_GET_CTX(pVCpu)->cr4 & X86_CR4_FSGSBASE)) \
     11021            || !(pVCpu->cpum.GstCtx.cr4 & X86_CR4_FSGSBASE)) \
    1102211022            return iemRaiseUndefinedOpcode(pVCpu); \
    1102311023    } while (0)
     
    1103911039    uint32_t *a_pName = &a_Name
    1104011040#define IEM_MC_COMMIT_EFLAGS(a_EFlags) \
    11041    do { IEM_GET_CTX(pVCpu)->eflags.u = (a_EFlags); Assert(IEM_GET_CTX(pVCpu)->eflags.u & X86_EFL_1); } while (0)
     11041   do { pVCpu->cpum.GstCtx.eflags.u = (a_EFlags); Assert(pVCpu->cpum.GstCtx.eflags.u & X86_EFL_1); } while (0)
    1104211042
    1104311043#define IEM_MC_ASSIGN(a_VarOrArg, a_CVariableOrConst)   (a_VarOrArg) = (a_CVariableOrConst)
     
    1108211082        (a_u32Dst) = iemSRegBaseFetchU64(pVCpu, (a_iSReg)); \
    1108311083    } while (0)
    11084 #define IEM_MC_FETCH_CR0_U16(a_u16Dst)                  (a_u16Dst) = (uint16_t)IEM_GET_CTX(pVCpu)->cr0
    11085 #define IEM_MC_FETCH_CR0_U32(a_u32Dst)                  (a_u32Dst) = (uint32_t)IEM_GET_CTX(pVCpu)->cr0
    11086 #define IEM_MC_FETCH_CR0_U64(a_u64Dst)                  (a_u64Dst) = IEM_GET_CTX(pVCpu)->cr0
     11084#define IEM_MC_FETCH_CR0_U16(a_u16Dst)                  (a_u16Dst) = (uint16_t)pVCpu->cpum.GstCtx.cr0
     11085#define IEM_MC_FETCH_CR0_U32(a_u32Dst)                  (a_u32Dst) = (uint32_t)pVCpu->cpum.GstCtx.cr0
     11086#define IEM_MC_FETCH_CR0_U64(a_u64Dst)                  (a_u64Dst) = pVCpu->cpum.GstCtx.cr0
    1108711087/** @todo IEM_MC_FETCH_LDTR_U16, IEM_MC_FETCH_LDTR_U32, IEM_MC_FETCH_LDTR_U64, IEM_MC_FETCH_TR_U16, IEM_MC_FETCH_TR_U32, and IEM_MC_FETCH_TR_U64 aren't worth it... */
    1108811088#define IEM_MC_FETCH_LDTR_U16(a_u16Dst) do { \
    1108911089        IEM_CTX_IMPORT_NORET(pVCpu, CPUMCTX_EXTRN_LDTR); \
    11090         (a_u16Dst) = IEM_GET_CTX(pVCpu)->ldtr.Sel; \
     11090        (a_u16Dst) = pVCpu->cpum.GstCtx.ldtr.Sel; \
    1109111091   } while (0)
    1109211092#define IEM_MC_FETCH_LDTR_U32(a_u32Dst) do { \
    1109311093        IEM_CTX_IMPORT_NORET(pVCpu, CPUMCTX_EXTRN_LDTR); \
    11094         (a_u32Dst) = IEM_GET_CTX(pVCpu)->ldtr.Sel; \
     11094        (a_u32Dst) = pVCpu->cpum.GstCtx.ldtr.Sel; \
    1109511095    } while (0)
    1109611096#define IEM_MC_FETCH_LDTR_U64(a_u64Dst) do { \
    1109711097        IEM_CTX_IMPORT_NORET(pVCpu, CPUMCTX_EXTRN_LDTR); \
    11098         (a_u64Dst) = IEM_GET_CTX(pVCpu)->ldtr.Sel; \
     11098        (a_u64Dst) = pVCpu->cpum.GstCtx.ldtr.Sel; \
    1109911099   } while (0)
    1110011100#define IEM_MC_FETCH_TR_U16(a_u16Dst) do { \
    1110111101        IEM_CTX_IMPORT_NORET(pVCpu, CPUMCTX_EXTRN_TR); \
    11102         (a_u16Dst) = IEM_GET_CTX(pVCpu)->tr.Sel; \
     11102        (a_u16Dst) = pVCpu->cpum.GstCtx.tr.Sel; \
    1110311103   } while (0)
    1110411104#define IEM_MC_FETCH_TR_U32(a_u32Dst) do { \
    1110511105        IEM_CTX_IMPORT_NORET(pVCpu, CPUMCTX_EXTRN_TR); \
    11106         (a_u32Dst) = IEM_GET_CTX(pVCpu)->tr.Sel; \
     11106        (a_u32Dst) = pVCpu->cpum.GstCtx.tr.Sel; \
    1110711107   } while (0)
    1110811108#define IEM_MC_FETCH_TR_U64(a_u64Dst) do { \
    1110911109        IEM_CTX_IMPORT_NORET(pVCpu, CPUMCTX_EXTRN_TR); \
    11110         (a_u64Dst) = IEM_GET_CTX(pVCpu)->tr.Sel; \
     11110        (a_u64Dst) = pVCpu->cpum.GstCtx.tr.Sel; \
    1111111111   } while (0)
    1111211112/** @note Not for IOPL or IF testing or modification. */
    11113 #define IEM_MC_FETCH_EFLAGS(a_EFlags)                   (a_EFlags) = IEM_GET_CTX(pVCpu)->eflags.u
    11114 #define IEM_MC_FETCH_EFLAGS_U8(a_EFlags)                (a_EFlags) = (uint8_t)IEM_GET_CTX(pVCpu)->eflags.u
    11115 #define IEM_MC_FETCH_FSW(a_u16Fsw)                      (a_u16Fsw) = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.FSW
    11116 #define IEM_MC_FETCH_FCW(a_u16Fcw)                      (a_u16Fcw) = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.FCW
     11113#define IEM_MC_FETCH_EFLAGS(a_EFlags)                   (a_EFlags) = pVCpu->cpum.GstCtx.eflags.u
     11114#define IEM_MC_FETCH_EFLAGS_U8(a_EFlags)                (a_EFlags) = (uint8_t)pVCpu->cpum.GstCtx.eflags.u
     11115#define IEM_MC_FETCH_FSW(a_u16Fsw)                      (a_u16Fsw) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FSW
     11116#define IEM_MC_FETCH_FCW(a_u16Fcw)                      (a_u16Fcw) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FCW
    1111711117
    1111811118#define IEM_MC_STORE_GREG_U8(a_iGReg, a_u8Value)        *iemGRegRefU8( pVCpu, (a_iGReg)) = (a_u8Value)
     
    1113611136    } while (0)
    1113711137#define IEM_MC_STORE_FPUREG_R80_SRC_REF(a_iSt, a_pr80Src) \
    11138     do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[a_iSt].r80 = *(a_pr80Src); } while (0)
     11138    do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[a_iSt].r80 = *(a_pr80Src); } while (0)
    1113911139
    1114011140
     
    1114611146#define IEM_MC_REF_GREG_U64(a_pu64Dst, a_iGReg)         (a_pu64Dst) = iemGRegRefU64(pVCpu, (a_iGReg))
    1114711147/** @note Not for IOPL or IF testing or modification. */
    11148 #define IEM_MC_REF_EFLAGS(a_pEFlags)                    (a_pEFlags) = &IEM_GET_CTX(pVCpu)->eflags.u
     11148#define IEM_MC_REF_EFLAGS(a_pEFlags)                    (a_pEFlags) = &pVCpu->cpum.GstCtx.eflags.u
    1114911149
    1115011150#define IEM_MC_ADD_GREG_U8(a_iGReg, a_u8Value)          *iemGRegRefU8( pVCpu, (a_iGReg)) += (a_u8Value)
     
    1122411224
    1122511225/** @note Not for IOPL or IF modification. */
    11226 #define IEM_MC_SET_EFL_BIT(a_fBit)                      do { IEM_GET_CTX(pVCpu)->eflags.u |= (a_fBit); } while (0)
     11226#define IEM_MC_SET_EFL_BIT(a_fBit)                      do { pVCpu->cpum.GstCtx.eflags.u |= (a_fBit); } while (0)
    1122711227/** @note Not for IOPL or IF modification. */
    11228 #define IEM_MC_CLEAR_EFL_BIT(a_fBit)                    do { IEM_GET_CTX(pVCpu)->eflags.u &= ~(a_fBit); } while (0)
     11228#define IEM_MC_CLEAR_EFL_BIT(a_fBit)                    do { pVCpu->cpum.GstCtx.eflags.u &= ~(a_fBit); } while (0)
    1122911229/** @note Not for IOPL or IF modification. */
    11230 #define IEM_MC_FLIP_EFL_BIT(a_fBit)                     do { IEM_GET_CTX(pVCpu)->eflags.u ^= (a_fBit); } while (0)
    11231 
    11232 #define IEM_MC_CLEAR_FSW_EX()   do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.FSW &= X86_FSW_C_MASK | X86_FSW_TOP_MASK; } while (0)
     11230#define IEM_MC_FLIP_EFL_BIT(a_fBit)                     do { pVCpu->cpum.GstCtx.eflags.u ^= (a_fBit); } while (0)
     11231
     11232#define IEM_MC_CLEAR_FSW_EX()   do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FSW &= X86_FSW_C_MASK | X86_FSW_TOP_MASK; } while (0)
    1123311233
    1123411234/** Switches the FPU state to MMX mode (FSW.TOS=0, FTW=0) if necessary. */
    1123511235#define IEM_MC_FPU_TO_MMX_MODE() do { \
    11236         IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.FSW &= ~X86_FSW_TOP_MASK; \
    11237         IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.FTW  = 0xff; \
     11236        pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FSW &= ~X86_FSW_TOP_MASK; \
     11237        pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FTW  = 0xff; \
    1123811238    } while (0)
    1123911239
    1124011240/** Switches the FPU state from MMX mode (FTW=0xffff). */
    1124111241#define IEM_MC_FPU_FROM_MMX_MODE() do { \
    11242         IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.FTW  = 0; \
     11242        pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FTW  = 0; \
    1124311243    } while (0)
    1124411244
    1124511245#define IEM_MC_FETCH_MREG_U64(a_u64Value, a_iMReg) \
    11246     do { (a_u64Value) = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx; } while (0)
     11246    do { (a_u64Value) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx; } while (0)
    1124711247#define IEM_MC_FETCH_MREG_U32(a_u32Value, a_iMReg) \
    11248     do { (a_u32Value) = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[0]; } while (0)
     11248    do { (a_u32Value) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[0]; } while (0)
    1124911249#define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) do { \
    11250         IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (a_u64Value); \
    11251         IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \
     11250        pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (a_u64Value); \
     11251        pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \
    1125211252    } while (0)
    1125311253#define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value) do { \
    11254         IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); \
    11255         IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \
     11254        pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); \
     11255        pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \
    1125611256    } while (0)
    1125711257#define IEM_MC_REF_MREG_U64(a_pu64Dst, a_iMReg) /** @todo need to set high word to 0xffff on commit (see IEM_MC_STORE_MREG_U64) */ \
    11258         (a_pu64Dst) = (&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
     11258        (a_pu64Dst) = (&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
    1125911259#define IEM_MC_REF_MREG_U64_CONST(a_pu64Dst, a_iMReg) \
    11260         (a_pu64Dst) = ((uint64_t const *)&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
     11260        (a_pu64Dst) = ((uint64_t const *)&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
    1126111261#define IEM_MC_REF_MREG_U32_CONST(a_pu32Dst, a_iMReg) \
    11262         (a_pu32Dst) = ((uint32_t const *)&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
     11262        (a_pu32Dst) = ((uint32_t const *)&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
    1126311263
    1126411264#define IEM_MC_FETCH_XREG_U128(a_u128Value, a_iXReg) \
    11265     do { (a_u128Value).au64[0] = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0]; \
    11266          (a_u128Value).au64[1] = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1]; \
     11265    do { (a_u128Value).au64[0] = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0]; \
     11266         (a_u128Value).au64[1] = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1]; \
    1126711267    } while (0)
    1126811268#define IEM_MC_FETCH_XREG_U64(a_u64Value, a_iXReg) \
    11269     do { (a_u64Value) = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0]; } while (0)
     11269    do { (a_u64Value) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0]; } while (0)
    1127011270#define IEM_MC_FETCH_XREG_U32(a_u32Value, a_iXReg) \
    11271     do { (a_u32Value) = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au32[0]; } while (0)
     11271    do { (a_u32Value) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au32[0]; } while (0)
    1127211272#define IEM_MC_FETCH_XREG_HI_U64(a_u64Value, a_iXReg) \
    11273     do { (a_u64Value) = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1]; } while (0)
     11273    do { (a_u64Value) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1]; } while (0)
    1127411274#define IEM_MC_STORE_XREG_U128(a_iXReg, a_u128Value) \
    11275     do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (a_u128Value).au64[0]; \
    11276          IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = (a_u128Value).au64[1]; \
     11275    do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (a_u128Value).au64[0]; \
     11276         pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = (a_u128Value).au64[1]; \
    1127711277    } while (0)
    1127811278#define IEM_MC_STORE_XREG_U64(a_iXReg, a_u64Value) \
    11279     do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); } while (0)
     11279    do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); } while (0)
    1128011280#define IEM_MC_STORE_XREG_U64_ZX_U128(a_iXReg, a_u64Value) \
    11281     do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); \
    11282          IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = 0; \
     11281    do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); \
     11282         pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = 0; \
    1128311283    } while (0)
    1128411284#define IEM_MC_STORE_XREG_U32(a_iXReg, a_u32Value) \
    11285     do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au32[0] = (a_u32Value); } while (0)
     11285    do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au32[0] = (a_u32Value); } while (0)
    1128611286#define IEM_MC_STORE_XREG_U32_ZX_U128(a_iXReg, a_u32Value) \
    11287     do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (uint32_t)(a_u32Value); \
    11288          IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = 0; \
     11287    do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (uint32_t)(a_u32Value); \
     11288         pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = 0; \
    1128911289    } while (0)
    1129011290#define IEM_MC_STORE_XREG_HI_U64(a_iXReg, a_u64Value) \
    11291     do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = (a_u64Value); } while (0)
     11291    do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = (a_u64Value); } while (0)
    1129211292#define IEM_MC_REF_XREG_U128(a_pu128Dst, a_iXReg)       \
    11293     (a_pu128Dst) = (&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].uXmm)
     11293    (a_pu128Dst) = (&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].uXmm)
    1129411294#define IEM_MC_REF_XREG_U128_CONST(a_pu128Dst, a_iXReg) \
    11295     (a_pu128Dst) = ((PCRTUINT128U)&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].uXmm)
     11295    (a_pu128Dst) = ((PCRTUINT128U)&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].uXmm)
    1129611296#define IEM_MC_REF_XREG_U64_CONST(a_pu64Dst, a_iXReg) \
    11297     (a_pu64Dst) = ((uint64_t const *)&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0])
     11297    (a_pu64Dst) = ((uint64_t const *)&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0])
    1129811298#define IEM_MC_COPY_XREG_U128(a_iXRegDst, a_iXRegSrc) \
    11299     do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXRegDst)].au64[0] \
    11300             = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXRegSrc)].au64[0]; \
    11301          IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXRegDst)].au64[1] \
    11302             = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXRegSrc)].au64[1]; \
     11299    do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXRegDst)].au64[0] \
     11300            = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXRegSrc)].au64[0]; \
     11301         pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXRegDst)].au64[1] \
     11302            = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXRegSrc)].au64[1]; \
    1130311303    } while (0)
    1130411304
    1130511305#define IEM_MC_FETCH_YREG_U32(a_u32Dst, a_iYRegSrc) \
    11306     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11306    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1130711307         uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
    1130811308         (a_u32Dst) = pXStateTmp->x87.aXMM[iYRegSrcTmp].au32[0]; \
    1130911309    } while (0)
    1131011310#define IEM_MC_FETCH_YREG_U64(a_u64Dst, a_iYRegSrc) \
    11311     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11311    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1131211312         uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
    1131311313         (a_u64Dst) = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[0]; \
    1131411314    } while (0)
    1131511315#define IEM_MC_FETCH_YREG_U128(a_u128Dst, a_iYRegSrc) \
    11316     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11316    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1131711317         uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
    1131811318         (a_u128Dst).au64[0] = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[0]; \
     
    1132011320    } while (0)
    1132111321#define IEM_MC_FETCH_YREG_U256(a_u256Dst, a_iYRegSrc) \
    11322     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11322    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1132311323         uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
    1132411324         (a_u256Dst).au64[0] = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[0]; \
     
    1133011330#define IEM_MC_INT_CLEAR_ZMM_256_UP(a_pXState, a_iXRegDst) do { /* For AVX512 and AVX1024 support. */ } while (0)
    1133111331#define IEM_MC_STORE_YREG_U32_ZX_VLMAX(a_iYRegDst, a_u32Src) \
    11332     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11332    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1133311333         uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1133411334         pXStateTmp->x87.aXMM[iYRegDstTmp].au32[0]       = (a_u32Src); \
     
    1134011340    } while (0)
    1134111341#define IEM_MC_STORE_YREG_U64_ZX_VLMAX(a_iYRegDst, a_u64Src) \
    11342     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11342    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1134311343         uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1134411344         pXStateTmp->x87.aXMM[iYRegDstTmp].au64[0]       = (a_u64Src); \
     
    1134911349    } while (0)
    1135011350#define IEM_MC_STORE_YREG_U128_ZX_VLMAX(a_iYRegDst, a_u128Src) \
    11351     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11351    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1135211352         uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1135311353         pXStateTmp->x87.aXMM[iYRegDstTmp].au64[0]       = (a_u128Src).au64[0]; \
     
    1135811358    } while (0)
    1135911359#define IEM_MC_STORE_YREG_U256_ZX_VLMAX(a_iYRegDst, a_u256Src) \
    11360     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11360    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1136111361         uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1136211362         pXStateTmp->x87.aXMM[iYRegDstTmp].au64[0]       = (a_u256Src).au64[0]; \
     
    1136811368
    1136911369#define IEM_MC_REF_YREG_U128(a_pu128Dst, a_iYReg)       \
    11370     (a_pu128Dst) = (&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aYMM[(a_iYReg)].uXmm)
     11370    (a_pu128Dst) = (&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aYMM[(a_iYReg)].uXmm)
    1137111371#define IEM_MC_REF_YREG_U128_CONST(a_pu128Dst, a_iYReg) \
    11372     (a_pu128Dst) = ((PCRTUINT128U)&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aYMM[(a_iYReg)].uXmm)
     11372    (a_pu128Dst) = ((PCRTUINT128U)&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aYMM[(a_iYReg)].uXmm)
    1137311373#define IEM_MC_REF_YREG_U64_CONST(a_pu64Dst, a_iYReg) \
    11374     (a_pu64Dst) = ((uint64_t const *)&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aYMM[(a_iYReg)].au64[0])
     11374    (a_pu64Dst) = ((uint64_t const *)&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aYMM[(a_iYReg)].au64[0])
    1137511375#define IEM_MC_CLEAR_YREG_128_UP(a_iYReg) \
    11376     do { PX86XSAVEAREA   pXStateTmp = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11376    do { PX86XSAVEAREA   pXStateTmp = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1137711377         uintptr_t const iYRegTmp   = (a_iYReg); \
    1137811378         pXStateTmp->u.YmmHi.aYmmHi[iYRegTmp].au64[0] = 0; \
     
    1138211382
    1138311383#define IEM_MC_COPY_YREG_U256_ZX_VLMAX(a_iYRegDst, a_iYRegSrc) \
    11384     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11384    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1138511385         uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1138611386         uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
     
    1139211392    } while (0)
    1139311393#define IEM_MC_COPY_YREG_U128_ZX_VLMAX(a_iYRegDst, a_iYRegSrc) \
    11394     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11394    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1139511395         uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1139611396         uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
     
    1140211402    } while (0)
    1140311403#define IEM_MC_COPY_YREG_U64_ZX_VLMAX(a_iYRegDst, a_iYRegSrc) \
    11404     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11404    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1140511405         uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1140611406         uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
     
    1141311413
    1141411414#define IEM_MC_MERGE_YREG_U32_U96_ZX_VLMAX(a_iYRegDst, a_iYRegSrc32, a_iYRegSrcHx) \
    11415     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11415    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1141611416         uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1141711417         uintptr_t const iYRegSrc32Tmp  = (a_iYRegSrc32); \
     
    1142511425    } while (0)
    1142611426#define IEM_MC_MERGE_YREG_U64_U64_ZX_VLMAX(a_iYRegDst, a_iYRegSrc64, a_iYRegSrcHx) \
    11427     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11427    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1142811428         uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1142911429         uintptr_t const iYRegSrc64Tmp  = (a_iYRegSrc64); \
     
    1143611436    } while (0)
    1143711437#define IEM_MC_MERGE_YREG_U64HI_U64_ZX_VLMAX(a_iYRegDst, a_iYRegSrc64, a_iYRegSrcHx) /* for vmovhlps */ \
    11438     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11438    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1143911439         uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1144011440         uintptr_t const iYRegSrc64Tmp  = (a_iYRegSrc64); \
     
    1144711447    } while (0)
    1144811448#define IEM_MC_MERGE_YREG_U64LOCAL_U64_ZX_VLMAX(a_iYRegDst, a_u64Local, a_iYRegSrcHx) \
    11449     do { PX86XSAVEAREA   pXStateTmp     = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState); \
     11449    do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    1145011450         uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1145111451         uintptr_t const iYRegSrcHxTmp  = (a_iYRegSrcHx); \
     
    1180211802        if (   !(a_u16FSW & X86_FSW_ES) \
    1180311803            || !(  (a_u16FSW & (X86_FSW_UE | X86_FSW_OE | X86_FSW_IE)) \
    11804                  & ~(IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.FCW & X86_FCW_MASK_ALL) ) ) \
     11804                 & ~(pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FCW & X86_FCW_MASK_ALL) ) ) \
    1180511805            IEM_MC_RETURN_ON_FAILURE(iemMemCommitAndUnmap(pVCpu, (a_pvMem), (a_fAccess))); \
    1180611806    } while (0)
     
    1194211942#define IEM_MC_CALL_FPU_AIMPL_1(a_pfnAImpl, a0) \
    1194311943    do { \
    11944         a_pfnAImpl(&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87, (a0)); \
     11944        a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0)); \
    1194511945    } while (0)
    1194611946
     
    1195411954#define IEM_MC_CALL_FPU_AIMPL_2(a_pfnAImpl, a0, a1) \
    1195511955    do { \
    11956         a_pfnAImpl(&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87, (a0), (a1)); \
     11956        a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0), (a1)); \
    1195711957    } while (0)
    1195811958
     
    1196711967#define IEM_MC_CALL_FPU_AIMPL_3(a_pfnAImpl, a0, a1, a2) \
    1196811968    do { \
    11969         a_pfnAImpl(&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
     11969        a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
    1197011970    } while (0)
    1197111971
     
    1210912109    do { \
    1211012110        IEM_MC_PREPARE_FPU_USAGE(); \
    12111         a_pfnAImpl(&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87, (a0), (a1)); \
     12111        a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0), (a1)); \
    1211212112    } while (0)
    1211312113
     
    1212312123    do { \
    1212412124        IEM_MC_PREPARE_FPU_USAGE(); \
    12125         a_pfnAImpl(&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
     12125        a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
    1212612126    } while (0)
    1212712127
     
    1213712137    do { \
    1213812138        IEM_MC_PREPARE_SSE_USAGE(); \
    12139         a_pfnAImpl(&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87, (a0), (a1)); \
     12139        a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0), (a1)); \
    1214012140    } while (0)
    1214112141
     
    1215112151    do { \
    1215212152        IEM_MC_PREPARE_SSE_USAGE(); \
    12153         a_pfnAImpl(&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
     12153        a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
    1215412154    } while (0)
    1215512155
     
    1215812158 *  IEM_MC_CALL_AVX_AIMPL_3, IEM_MC_CALL_AVX_AIMPL_4, ... */
    1215912159#define IEM_MC_IMPLICIT_AVX_AIMPL_ARGS() \
    12160     IEM_MC_ARG_CONST(PX86XSAVEAREA, pXState, IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState), 0)
     12160    IEM_MC_ARG_CONST(PX86XSAVEAREA, pXState, pVCpu->cpum.GstCtx.CTX_SUFF(pXState), 0)
    1216112161
    1216212162/**
     
    1219212192
    1219312193/** @note Not for IOPL or IF testing. */
    12194 #define IEM_MC_IF_EFL_BIT_SET(a_fBit)                   if (IEM_GET_CTX(pVCpu)->eflags.u & (a_fBit)) {
     12194#define IEM_MC_IF_EFL_BIT_SET(a_fBit)                   if (pVCpu->cpum.GstCtx.eflags.u & (a_fBit)) {
    1219512195/** @note Not for IOPL or IF testing. */
    12196 #define IEM_MC_IF_EFL_BIT_NOT_SET(a_fBit)               if (!(IEM_GET_CTX(pVCpu)->eflags.u & (a_fBit))) {
     12196#define IEM_MC_IF_EFL_BIT_NOT_SET(a_fBit)               if (!(pVCpu->cpum.GstCtx.eflags.u & (a_fBit))) {
    1219712197/** @note Not for IOPL or IF testing. */
    12198 #define IEM_MC_IF_EFL_ANY_BITS_SET(a_fBits)             if (IEM_GET_CTX(pVCpu)->eflags.u & (a_fBits)) {
     12198#define IEM_MC_IF_EFL_ANY_BITS_SET(a_fBits)             if (pVCpu->cpum.GstCtx.eflags.u & (a_fBits)) {
    1219912199/** @note Not for IOPL or IF testing. */
    12200 #define IEM_MC_IF_EFL_NO_BITS_SET(a_fBits)              if (!(IEM_GET_CTX(pVCpu)->eflags.u & (a_fBits))) {
     12200#define IEM_MC_IF_EFL_NO_BITS_SET(a_fBits)              if (!(pVCpu->cpum.GstCtx.eflags.u & (a_fBits))) {
    1220112201/** @note Not for IOPL or IF testing. */
    1220212202#define IEM_MC_IF_EFL_BITS_NE(a_fBit1, a_fBit2)         \
    12203     if (   !!(IEM_GET_CTX(pVCpu)->eflags.u & (a_fBit1)) \
    12204         != !!(IEM_GET_CTX(pVCpu)->eflags.u & (a_fBit2)) ) {
     12203    if (   !!(pVCpu->cpum.GstCtx.eflags.u & (a_fBit1)) \
     12204        != !!(pVCpu->cpum.GstCtx.eflags.u & (a_fBit2)) ) {
    1220512205/** @note Not for IOPL or IF testing. */
    1220612206#define IEM_MC_IF_EFL_BITS_EQ(a_fBit1, a_fBit2)         \
    12207     if (   !!(IEM_GET_CTX(pVCpu)->eflags.u & (a_fBit1)) \
    12208         == !!(IEM_GET_CTX(pVCpu)->eflags.u & (a_fBit2)) ) {
     12207    if (   !!(pVCpu->cpum.GstCtx.eflags.u & (a_fBit1)) \
     12208        == !!(pVCpu->cpum.GstCtx.eflags.u & (a_fBit2)) ) {
    1220912209/** @note Not for IOPL or IF testing. */
    1221012210#define IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(a_fBit, a_fBit1, a_fBit2) \
    12211     if (   (IEM_GET_CTX(pVCpu)->eflags.u & (a_fBit)) \
    12212         ||    !!(IEM_GET_CTX(pVCpu)->eflags.u & (a_fBit1)) \
    12213            != !!(IEM_GET_CTX(pVCpu)->eflags.u & (a_fBit2)) ) {
     12211    if (   (pVCpu->cpum.GstCtx.eflags.u & (a_fBit)) \
     12212        ||    !!(pVCpu->cpum.GstCtx.eflags.u & (a_fBit1)) \
     12213           != !!(pVCpu->cpum.GstCtx.eflags.u & (a_fBit2)) ) {
    1221412214/** @note Not for IOPL or IF testing. */
    1221512215#define IEM_MC_IF_EFL_BIT_NOT_SET_AND_BITS_EQ(a_fBit, a_fBit1, a_fBit2) \
    12216     if (   !(IEM_GET_CTX(pVCpu)->eflags.u & (a_fBit)) \
    12217         &&    !!(IEM_GET_CTX(pVCpu)->eflags.u & (a_fBit1)) \
    12218            == !!(IEM_GET_CTX(pVCpu)->eflags.u & (a_fBit2)) ) {
    12219 #define IEM_MC_IF_CX_IS_NZ()                            if (IEM_GET_CTX(pVCpu)->cx != 0) {
    12220 #define IEM_MC_IF_ECX_IS_NZ()                           if (IEM_GET_CTX(pVCpu)->ecx != 0) {
    12221 #define IEM_MC_IF_RCX_IS_NZ()                           if (IEM_GET_CTX(pVCpu)->rcx != 0) {
     12216    if (   !(pVCpu->cpum.GstCtx.eflags.u & (a_fBit)) \
     12217        &&    !!(pVCpu->cpum.GstCtx.eflags.u & (a_fBit1)) \
     12218           == !!(pVCpu->cpum.GstCtx.eflags.u & (a_fBit2)) ) {
     12219#define IEM_MC_IF_CX_IS_NZ()                            if (pVCpu->cpum.GstCtx.cx != 0) {
     12220#define IEM_MC_IF_ECX_IS_NZ()                           if (pVCpu->cpum.GstCtx.ecx != 0) {
     12221#define IEM_MC_IF_RCX_IS_NZ()                           if (pVCpu->cpum.GstCtx.rcx != 0) {
    1222212222/** @note Not for IOPL or IF testing. */
    1222312223#define IEM_MC_IF_CX_IS_NZ_AND_EFL_BIT_SET(a_fBit) \
    12224         if (   IEM_GET_CTX(pVCpu)->cx != 0 \
    12225             && (IEM_GET_CTX(pVCpu)->eflags.u & a_fBit)) {
     12224        if (   pVCpu->cpum.GstCtx.cx != 0 \
     12225            && (pVCpu->cpum.GstCtx.eflags.u & a_fBit)) {
    1222612226/** @note Not for IOPL or IF testing. */
    1222712227#define IEM_MC_IF_ECX_IS_NZ_AND_EFL_BIT_SET(a_fBit) \
    12228         if (   IEM_GET_CTX(pVCpu)->ecx != 0 \
    12229             && (IEM_GET_CTX(pVCpu)->eflags.u & a_fBit)) {
     12228        if (   pVCpu->cpum.GstCtx.ecx != 0 \
     12229            && (pVCpu->cpum.GstCtx.eflags.u & a_fBit)) {
    1223012230/** @note Not for IOPL or IF testing. */
    1223112231#define IEM_MC_IF_RCX_IS_NZ_AND_EFL_BIT_SET(a_fBit) \
    12232         if (   IEM_GET_CTX(pVCpu)->rcx != 0 \
    12233             && (IEM_GET_CTX(pVCpu)->eflags.u & a_fBit)) {
     12232        if (   pVCpu->cpum.GstCtx.rcx != 0 \
     12233            && (pVCpu->cpum.GstCtx.eflags.u & a_fBit)) {
    1223412234/** @note Not for IOPL or IF testing. */
    1223512235#define IEM_MC_IF_CX_IS_NZ_AND_EFL_BIT_NOT_SET(a_fBit) \
    12236         if (   IEM_GET_CTX(pVCpu)->cx != 0 \
    12237             && !(IEM_GET_CTX(pVCpu)->eflags.u & a_fBit)) {
     12236        if (   pVCpu->cpum.GstCtx.cx != 0 \
     12237            && !(pVCpu->cpum.GstCtx.eflags.u & a_fBit)) {
    1223812238/** @note Not for IOPL or IF testing. */
    1223912239#define IEM_MC_IF_ECX_IS_NZ_AND_EFL_BIT_NOT_SET(a_fBit) \
    12240         if (   IEM_GET_CTX(pVCpu)->ecx != 0 \
    12241             && !(IEM_GET_CTX(pVCpu)->eflags.u & a_fBit)) {
     12240        if (   pVCpu->cpum.GstCtx.ecx != 0 \
     12241            && !(pVCpu->cpum.GstCtx.eflags.u & a_fBit)) {
    1224212242/** @note Not for IOPL or IF testing. */
    1224312243#define IEM_MC_IF_RCX_IS_NZ_AND_EFL_BIT_NOT_SET(a_fBit) \
    12244         if (   IEM_GET_CTX(pVCpu)->rcx != 0 \
    12245             && !(IEM_GET_CTX(pVCpu)->eflags.u & a_fBit)) {
     12244        if (   pVCpu->cpum.GstCtx.rcx != 0 \
     12245            && !(pVCpu->cpum.GstCtx.eflags.u & a_fBit)) {
    1224612246#define IEM_MC_IF_LOCAL_IS_Z(a_Local)                   if ((a_Local) == 0) {
    1224712247#define IEM_MC_IF_GREG_BIT_SET(a_iGReg, a_iBitNo)       if (iemGRegFetchU64(pVCpu, (a_iGReg)) & RT_BIT_64(a_iBitNo)) {
     
    1225812258    if (iemFpu2StRegsNotEmptyRefFirst(pVCpu, (a_iSt0), &(a_pr80Dst0), (a_iSt1)) == VINF_SUCCESS) {
    1225912259#define IEM_MC_IF_FCW_IM() \
    12260     if (IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.FCW & X86_FCW_IM) {
     12260    if (pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FCW & X86_FCW_IM) {
    1226112261
    1226212262#define IEM_MC_ELSE()                                   } else {
     
    1227912279    do { \
    1228012280        IEMOP_INC_STATS(a_Stats); \
    12281         Log4(("decode - %04x:%RGv %s%s [#%u]\n", IEM_GET_CTX(pVCpu)->cs.Sel, IEM_GET_CTX(pVCpu)->rip, \
     12281        Log4(("decode - %04x:%RGv %s%s [#%u]\n", pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.rip, \
    1228212282              pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK ? "lock " : "", a_szMnemonic, pVCpu->iem.s.cInstructions)); \
    1228312283    } while (0)
     
    1249912499        if (RT_UNLIKELY(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_REX)) \
    1250012500        { \
    12501             Log5((a_szPrf ": Overriding REX prefix at %RX16! fPrefixes=%#x\n", \
    12502                   IEM_GET_CTX(pVCpu)->rip, pVCpu->iem.s.fPrefixes)); \
     12501            Log5((a_szPrf ": Overriding REX prefix at %RX16! fPrefixes=%#x\n", pVCpu->cpum.GstCtx.rip, pVCpu->iem.s.fPrefixes)); \
    1250312502            pVCpu->iem.s.fPrefixes &= ~IEM_OP_PRF_REX_MASK; \
    1250412503            pVCpu->iem.s.uRexB     = 0; \
     
    1378013779        && rcStrict == VINF_SUCCESS
    1378113780        && VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS)
    13782         && EMGetInhibitInterruptsPC(pVCpu) == IEM_GET_CTX(pVCpu)->rip )
     13781        && EMGetInhibitInterruptsPC(pVCpu) == pVCpu->cpum.GstCtx.rip )
    1378313782    {
    1378413783        rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, pVCpu->iem.s.fBypassHandlers);
     
    1382313822    rcStrict = iemExecStatusCodeFiddling(pVCpu, rcStrict);
    1382413823
    13825     Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &IEM_GET_CTX(pVCpu)->cs));
    13826     Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &IEM_GET_CTX(pVCpu)->ss));
     13824    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->cpum.GstCtx.cs));
     13825    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->cpum.GstCtx.ss));
    1382713826    return rcStrict;
    1382813827}
     
    1389013889VMMDECL(VBOXSTRICTRC)       IEMExecOneEx(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, uint32_t *pcbWritten)
    1389113890{
    13892     PCPUMCTX pCtx = IEM_GET_CTX(pVCpu);
    13893     AssertReturn(CPUMCTX2CORE(pCtx) == pCtxCore, VERR_IEM_IPE_3);
     13891    AssertReturn(CPUMCTX2CORE(IEM_GET_CTX(pVCpu)) == pCtxCore, VERR_IEM_IPE_3);
    1389413892
    1389513893    uint32_t const cbOldWritten = pVCpu->iem.s.cbWritten;
     
    1391413912                                                         const void *pvOpcodeBytes, size_t cbOpcodeBytes)
    1391513913{
    13916     PCPUMCTX pCtx = IEM_GET_CTX(pVCpu);
    13917     AssertReturn(CPUMCTX2CORE(pCtx) == pCtxCore, VERR_IEM_IPE_3);
     13914    AssertReturn(CPUMCTX2CORE(IEM_GET_CTX(pVCpu)) == pCtxCore, VERR_IEM_IPE_3);
    1391813915
    1391913916    VBOXSTRICTRC rcStrict;
     
    1395013947VMMDECL(VBOXSTRICTRC)       IEMExecOneBypassEx(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore, uint32_t *pcbWritten)
    1395113948{
    13952     PCPUMCTX pCtx = IEM_GET_CTX(pVCpu);
    13953     AssertReturn(CPUMCTX2CORE(pCtx) == pCtxCore, VERR_IEM_IPE_3);
     13949    AssertReturn(CPUMCTX2CORE(IEM_GET_CTX(pVCpu)) == pCtxCore, VERR_IEM_IPE_3);
    1395413950
    1395513951    uint32_t const cbOldWritten = pVCpu->iem.s.cbWritten;
     
    1397413970                                                               const void *pvOpcodeBytes, size_t cbOpcodeBytes)
    1397513971{
    13976     PCPUMCTX pCtx = IEM_GET_CTX(pVCpu);
    13977     AssertReturn(CPUMCTX2CORE(pCtx) == pCtxCore, VERR_IEM_IPE_3);
     13972    AssertReturn(CPUMCTX2CORE(IEM_GET_CTX(pVCpu)) == pCtxCore, VERR_IEM_IPE_3);
    1397813973
    1397913974    VBOXSTRICTRC rcStrict;
     
    1418414179         * Assert hidden register sanity (also done in iemInitDecoder and iemReInitDecoder).
    1418514180         */
    14186         Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &IEM_GET_CTX(pVCpu)->cs));
    14187         Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &IEM_GET_CTX(pVCpu)->ss));
     14181        Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->cpum.GstCtx.cs));
     14182        Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, &pVCpu->cpum.GstCtx.ss));
    1418814183    }
    1418914184    else
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r72496 r72497  
    44894489
    44904490    /* commit */
    4491     IEM_GET_CTX(pVCpu)->eflags.Bits.u1ZF = fAccessible;
     4491    pVCpu->cpum.GstCtx.eflags.Bits.u1ZF = fAccessible;
    44924492
    44934493    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
     
    45954595
    45964596    /* commit flags value and advance rip. */
    4597     IEM_GET_CTX(pVCpu)->eflags.Bits.u1ZF = fDescOk;
     4597    pVCpu->cpum.GstCtx.eflags.Bits.u1ZF = fDescOk;
    45984598    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    45994599
     
    46304630    if (pVCpu->iem.s.uCpl != 0)
    46314631        return iemRaiseGeneralProtectionFault0(pVCpu);
    4632     Assert(!IEM_GET_CTX(pVCpu)->eflags.Bits.u1VM);
     4632    Assert(!pVCpu->cpum.GstCtx.eflags.Bits.u1VM);
    46334633
    46344634    if (IEM_IS_SVM_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_GDTR_WRITES))
     
    47034703    if (pVCpu->iem.s.uCpl != 0)
    47044704        return iemRaiseGeneralProtectionFault0(pVCpu);
    4705     Assert(!IEM_GET_CTX(pVCpu)->eflags.Bits.u1VM);
     4705    Assert(!pVCpu->cpum.GstCtx.eflags.Bits.u1VM);
    47064706
    47074707    if (IEM_IS_SVM_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_IDTR_WRITES))
     
    55005500    if (pVCpu->iem.s.uCpl != 0)
    55015501        return iemRaiseGeneralProtectionFault0(pVCpu);
    5502     Assert(!IEM_GET_CTX(pVCpu)->eflags.Bits.u1VM);
     5502    Assert(!pVCpu->cpum.GstCtx.eflags.Bits.u1VM);
    55035503
    55045504    /*
     
    57615761    if (pVCpu->iem.s.uCpl != 0)
    57625762        return iemRaiseGeneralProtectionFault0(pVCpu);
    5763     Assert(!IEM_GET_CTX(pVCpu)->eflags.Bits.u1VM);
     5763    Assert(!pVCpu->cpum.GstCtx.eflags.Bits.u1VM);
    57645764    IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_CR0 | CPUMCTX_EXTRN_CR3 | CPUMCTX_EXTRN_CR4 | CPUMCTX_EXTRN_EFER);
    57655765
     
    58355835        RTGCUINTPTR64 const GCPtrInvAddr = uDesc.s.Hi;
    58365836        uint8_t       const uPcid        = uDesc.s.Lo & UINT64_C(0xfff);
    5837         uint32_t      const uCr4         = IEM_GET_CTX(pVCpu)->cr4;
    5838         uint64_t      const uCr3         = IEM_GET_CTX(pVCpu)->cr3;
     5837        uint32_t      const uCr4         = pVCpu->cpum.GstCtx.cr4;
     5838        uint64_t      const uCr3         = pVCpu->cpum.GstCtx.cr3;
    58395839        switch (uInvpcidType)
    58405840        {
     
    62216221IEM_CIMPL_DEF_1(iemCImpl_in_eAX_DX, uint8_t, cbReg)
    62226222{
    6223     return IEM_CIMPL_CALL_2(iemCImpl_in, IEM_GET_CTX(pVCpu)->dx, cbReg);
     6223    return IEM_CIMPL_CALL_2(iemCImpl_in, pVCpu->cpum.GstCtx.dx, cbReg);
    62246224}
    62256225
     
    63136313IEM_CIMPL_DEF_1(iemCImpl_out_DX_eAX, uint8_t, cbReg)
    63146314{
    6315     return IEM_CIMPL_CALL_2(iemCImpl_out, IEM_GET_CTX(pVCpu)->dx, cbReg);
     6315    return IEM_CIMPL_CALL_2(iemCImpl_out, pVCpu->cpum.GstCtx.dx, cbReg);
    63166316}
    63176317
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h

    r72496 r72497  
    153153IEM_CIMPL_DEF_1(RT_CONCAT4(iemCImpl_repe_cmps_op,OP_SIZE,_addr,ADDR_SIZE), uint8_t, iEffSeg)
    154154{
    155     PVM         pVM   = pVCpu->CTX_SUFF(pVM);
    156     PCPUMCTX    pCtx  = IEM_GET_CTX(pVCpu);
     155    PVM pVM = pVCpu->CTX_SUFF(pVM);
    157156
    158157    /*
    159158     * Setup.
    160159     */
    161     ADDR_TYPE       uCounterReg  = pCtx->ADDR_rCX;
     160    ADDR_TYPE       uCounterReg  = pVCpu->cpum.GstCtx.ADDR_rCX;
    162161    if (uCounterReg == 0)
    163162    {
     
    175174
    176175    uint64_t        uSrc2Base;
    177     rcStrict = iemMemSegCheckReadAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uSrc2Base);
     176    rcStrict = iemMemSegCheckReadAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pVCpu->cpum.GstCtx.es), X86_SREG_ES, &uSrc2Base);
    178177    if (rcStrict != VINF_SUCCESS)
    179178        return rcStrict;
    180179
    181     int8_t const    cbIncr       = pCtx->eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
    182     ADDR_TYPE       uSrc1AddrReg = pCtx->ADDR_rSI;
    183     ADDR_TYPE       uSrc2AddrReg = pCtx->ADDR_rDI;
    184     uint32_t        uEFlags      = pCtx->eflags.u;
     180    int8_t const    cbIncr       = pVCpu->cpum.GstCtx.eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
     181    ADDR_TYPE       uSrc1AddrReg = pVCpu->cpum.GstCtx.ADDR_rSI;
     182    ADDR_TYPE       uSrc2AddrReg = pVCpu->cpum.GstCtx.ADDR_rDI;
     183    uint32_t        uEFlags      = pVCpu->cpum.GstCtx.eflags.u;
    185184
    186185    /*
     
    205204                || (   uSrc1AddrReg < pSrc1Hid->u32Limit
    206205                    && uSrc1AddrReg + (cLeftPage * (OP_SIZE / 8)) <= pSrc1Hid->u32Limit
    207                     && uSrc2AddrReg < pCtx->es.u32Limit
    208                     && uSrc2AddrReg + (cLeftPage * (OP_SIZE / 8)) <= pCtx->es.u32Limit)
     206                    && uSrc2AddrReg < pVCpu->cpum.GstCtx.es.u32Limit
     207                    && uSrc2AddrReg + (cLeftPage * (OP_SIZE / 8)) <= pVCpu->cpum.GstCtx.es.u32Limit)
    209208               )
    210209           )
     
    259258
    260259                    /* Update the registers before looping. */
    261                     pCtx->ADDR_rCX = uCounterReg;
    262                     pCtx->ADDR_rSI = uSrc1AddrReg;
    263                     pCtx->ADDR_rDI = uSrc2AddrReg;
    264                     pCtx->eflags.u = uEFlags;
     260                    pVCpu->cpum.GstCtx.ADDR_rCX = uCounterReg;
     261                    pVCpu->cpum.GstCtx.ADDR_rSI = uSrc1AddrReg;
     262                    pVCpu->cpum.GstCtx.ADDR_rDI = uSrc2AddrReg;
     263                    pVCpu->cpum.GstCtx.eflags.u = uEFlags;
    265264
    266265                    iemMemPageUnmap(pVCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, puSrc1Mem, &PgLockSrc1Mem);
     
    293292            RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(&uValue1, uValue2, &uEFlags);
    294293
    295             pCtx->ADDR_rSI = uSrc1AddrReg += cbIncr;
    296             pCtx->ADDR_rDI = uSrc2AddrReg += cbIncr;
    297             pCtx->ADDR_rCX = --uCounterReg;
    298             pCtx->eflags.u = uEFlags;
     294            pVCpu->cpum.GstCtx.ADDR_rSI = uSrc1AddrReg += cbIncr;
     295            pVCpu->cpum.GstCtx.ADDR_rDI = uSrc2AddrReg += cbIncr;
     296            pVCpu->cpum.GstCtx.ADDR_rCX = --uCounterReg;
     297            pVCpu->cpum.GstCtx.eflags.u = uEFlags;
    299298            cLeftPage--;
    300299            IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0 || !(uEFlags & X86_EFL_ZF));
     
    324323IEM_CIMPL_DEF_1(RT_CONCAT4(iemCImpl_repne_cmps_op,OP_SIZE,_addr,ADDR_SIZE), uint8_t, iEffSeg)
    325324{
    326     PVM         pVM   = pVCpu->CTX_SUFF(pVM);
    327     PCPUMCTX    pCtx  = IEM_GET_CTX(pVCpu);
     325    PVM pVM = pVCpu->CTX_SUFF(pVM);
    328326
    329327    /*
    330328     * Setup.
    331329     */
    332     ADDR_TYPE       uCounterReg = pCtx->ADDR_rCX;
     330    ADDR_TYPE       uCounterReg = pVCpu->cpum.GstCtx.ADDR_rCX;
    333331    if (uCounterReg == 0)
    334332    {
     
    346344
    347345    uint64_t        uSrc2Base;
    348     rcStrict = iemMemSegCheckReadAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uSrc2Base);
     346    rcStrict = iemMemSegCheckReadAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pVCpu->cpum.GstCtx.es), X86_SREG_ES, &uSrc2Base);
    349347    if (rcStrict != VINF_SUCCESS)
    350348        return rcStrict;
    351349
    352     int8_t const    cbIncr       = pCtx->eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
    353     ADDR_TYPE       uSrc1AddrReg = pCtx->ADDR_rSI;
    354     ADDR_TYPE       uSrc2AddrReg = pCtx->ADDR_rDI;
    355     uint32_t        uEFlags      = pCtx->eflags.u;
     350    int8_t const    cbIncr       = pVCpu->cpum.GstCtx.eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
     351    ADDR_TYPE       uSrc1AddrReg = pVCpu->cpum.GstCtx.ADDR_rSI;
     352    ADDR_TYPE       uSrc2AddrReg = pVCpu->cpum.GstCtx.ADDR_rDI;
     353    uint32_t        uEFlags      = pVCpu->cpum.GstCtx.eflags.u;
    356354
    357355    /*
     
    376374                || (   uSrc1AddrReg < pSrc1Hid->u32Limit
    377375                    && uSrc1AddrReg + (cLeftPage * (OP_SIZE / 8)) <= pSrc1Hid->u32Limit
    378                     && uSrc2AddrReg < pCtx->es.u32Limit
    379                     && uSrc2AddrReg + (cLeftPage * (OP_SIZE / 8)) <= pCtx->es.u32Limit)
     376                    && uSrc2AddrReg < pVCpu->cpum.GstCtx.es.u32Limit
     377                    && uSrc2AddrReg + (cLeftPage * (OP_SIZE / 8)) <= pVCpu->cpum.GstCtx.es.u32Limit)
    380378                )
    381379           )
     
    430428
    431429                    /* Update the registers before looping. */
    432                     pCtx->ADDR_rCX = uCounterReg;
    433                     pCtx->ADDR_rSI = uSrc1AddrReg;
    434                     pCtx->ADDR_rDI = uSrc2AddrReg;
    435                     pCtx->eflags.u = uEFlags;
     430                    pVCpu->cpum.GstCtx.ADDR_rCX = uCounterReg;
     431                    pVCpu->cpum.GstCtx.ADDR_rSI = uSrc1AddrReg;
     432                    pVCpu->cpum.GstCtx.ADDR_rDI = uSrc2AddrReg;
     433                    pVCpu->cpum.GstCtx.eflags.u = uEFlags;
    436434
    437435                    iemMemPageUnmap(pVCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, puSrc1Mem, &PgLockSrc1Mem);
     
    464462            RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)(&uValue1, uValue2, &uEFlags);
    465463
    466             pCtx->ADDR_rSI = uSrc1AddrReg += cbIncr;
    467             pCtx->ADDR_rDI = uSrc2AddrReg += cbIncr;
    468             pCtx->ADDR_rCX = --uCounterReg;
    469             pCtx->eflags.u = uEFlags;
     464            pVCpu->cpum.GstCtx.ADDR_rSI = uSrc1AddrReg += cbIncr;
     465            pVCpu->cpum.GstCtx.ADDR_rDI = uSrc2AddrReg += cbIncr;
     466            pVCpu->cpum.GstCtx.ADDR_rCX = --uCounterReg;
     467            pVCpu->cpum.GstCtx.eflags.u = uEFlags;
    470468            cLeftPage--;
    471469            IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0 || (uEFlags & X86_EFL_ZF));
     
    495493IEM_CIMPL_DEF_0(RT_CONCAT4(iemCImpl_repe_scas_,OP_rAX,_m,ADDR_SIZE))
    496494{
    497     PVM         pVM   = pVCpu->CTX_SUFF(pVM);
    498     PCPUMCTX    pCtx  = IEM_GET_CTX(pVCpu);
     495    PVM pVM = pVCpu->CTX_SUFF(pVM);
    499496
    500497    /*
    501498     * Setup.
    502499     */
    503     ADDR_TYPE       uCounterReg = pCtx->ADDR_rCX;
     500    ADDR_TYPE       uCounterReg = pVCpu->cpum.GstCtx.ADDR_rCX;
    504501    if (uCounterReg == 0)
    505502    {
     
    510507    IEM_CTX_IMPORT_RET(pVCpu, CPUMCTX_EXTRN_ES);
    511508    uint64_t        uBaseAddr;
    512     VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
     509    VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pVCpu->cpum.GstCtx.es), X86_SREG_ES, &uBaseAddr);
    513510    if (rcStrict != VINF_SUCCESS)
    514511        return rcStrict;
    515512
    516     int8_t const    cbIncr      = pCtx->eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
    517     OP_TYPE const   uValueReg   = pCtx->OP_rAX;
    518     ADDR_TYPE       uAddrReg    = pCtx->ADDR_rDI;
    519     uint32_t        uEFlags     = pCtx->eflags.u;
     513    int8_t const    cbIncr      = pVCpu->cpum.GstCtx.eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
     514    OP_TYPE const   uValueReg   = pVCpu->cpum.GstCtx.OP_rAX;
     515    ADDR_TYPE       uAddrReg    = pVCpu->cpum.GstCtx.ADDR_rDI;
     516    uint32_t        uEFlags     = pVCpu->cpum.GstCtx.eflags.u;
    520517
    521518    /*
     
    534531            && cbIncr > 0    /** @todo Implement reverse direction string ops. */
    535532            && (   IS_64_BIT_CODE(pVCpu)
    536                 || (   uAddrReg < pCtx->es.u32Limit
    537                     && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pCtx->es.u32Limit)
     533                || (   uAddrReg < pVCpu->cpum.GstCtx.es.u32Limit
     534                    && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pVCpu->cpum.GstCtx.es.u32Limit)
    538535               )
    539536           )
     
    565562                /* Update the regs. */
    566563                RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&uValueReg, uTmpValue, &uEFlags);
    567                 pCtx->ADDR_rCX = uCounterReg -= i;
    568                 pCtx->ADDR_rDI = uAddrReg    += i * cbIncr;
    569                 pCtx->eflags.u = uEFlags;
     564                pVCpu->cpum.GstCtx.ADDR_rCX = uCounterReg -= i;
     565                pVCpu->cpum.GstCtx.ADDR_rDI = uAddrReg    += i * cbIncr;
     566                pVCpu->cpum.GstCtx.eflags.u = uEFlags;
    570567                Assert(!(uEFlags & X86_EFL_ZF) == fQuit);
    571568                iemMemPageUnmap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
     
    598595            RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&uValueReg, uTmpValue, &uEFlags);
    599596
    600             pCtx->ADDR_rDI = uAddrReg += cbIncr;
    601             pCtx->ADDR_rCX = --uCounterReg;
    602             pCtx->eflags.u = uEFlags;
     597            pVCpu->cpum.GstCtx.ADDR_rDI = uAddrReg += cbIncr;
     598            pVCpu->cpum.GstCtx.ADDR_rCX = --uCounterReg;
     599            pVCpu->cpum.GstCtx.eflags.u = uEFlags;
    603600            cLeftPage--;
    604601            IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0 || !(uEFlags & X86_EFL_ZF));
     
    628625IEM_CIMPL_DEF_0(RT_CONCAT4(iemCImpl_repne_scas_,OP_rAX,_m,ADDR_SIZE))
    629626{
    630     PVM         pVM   = pVCpu->CTX_SUFF(pVM);
    631     PCPUMCTX    pCtx  = IEM_GET_CTX(pVCpu);
     627    PVM pVM = pVCpu->CTX_SUFF(pVM);
    632628
    633629    /*
    634630     * Setup.
    635631     */
    636     ADDR_TYPE       uCounterReg = pCtx->ADDR_rCX;
     632    ADDR_TYPE       uCounterReg = pVCpu->cpum.GstCtx.ADDR_rCX;
    637633    if (uCounterReg == 0)
    638634    {
     
    643639    IEM_CTX_IMPORT_RET(pVCpu, CPUMCTX_EXTRN_ES);
    644640    uint64_t        uBaseAddr;
    645     VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
     641    VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pVCpu->cpum.GstCtx.es), X86_SREG_ES, &uBaseAddr);
    646642    if (rcStrict != VINF_SUCCESS)
    647643        return rcStrict;
    648644
    649     int8_t const    cbIncr      = pCtx->eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
    650     OP_TYPE const   uValueReg   = pCtx->OP_rAX;
    651     ADDR_TYPE       uAddrReg    = pCtx->ADDR_rDI;
    652     uint32_t        uEFlags     = pCtx->eflags.u;
     645    int8_t const    cbIncr      = pVCpu->cpum.GstCtx.eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
     646    OP_TYPE const   uValueReg   = pVCpu->cpum.GstCtx.OP_rAX;
     647    ADDR_TYPE       uAddrReg    = pVCpu->cpum.GstCtx.ADDR_rDI;
     648    uint32_t        uEFlags     = pVCpu->cpum.GstCtx.eflags.u;
    653649
    654650    /*
     
    667663            && cbIncr > 0    /** @todo Implement reverse direction string ops. */
    668664            && (   IS_64_BIT_CODE(pVCpu)
    669                 || (   uAddrReg < pCtx->es.u32Limit
    670                     && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pCtx->es.u32Limit)
     665                || (   uAddrReg < pVCpu->cpum.GstCtx.es.u32Limit
     666                    && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pVCpu->cpum.GstCtx.es.u32Limit)
    671667               )
    672668           )
     
    698694                /* Update the regs. */
    699695                RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&uValueReg, uTmpValue, &uEFlags);
    700                 pCtx->ADDR_rCX = uCounterReg -= i;
    701                 pCtx->ADDR_rDI = uAddrReg    += i * cbIncr;
    702                 pCtx->eflags.u = uEFlags;
     696                pVCpu->cpum.GstCtx.ADDR_rCX = uCounterReg -= i;
     697                pVCpu->cpum.GstCtx.ADDR_rDI = uAddrReg    += i * cbIncr;
     698                pVCpu->cpum.GstCtx.eflags.u = uEFlags;
    703699                Assert(!!(uEFlags & X86_EFL_ZF) == fQuit);
    704700                iemMemPageUnmap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
     
    730726                return rcStrict;
    731727            RT_CONCAT(iemAImpl_cmp_u,OP_SIZE)((OP_TYPE *)&uValueReg, uTmpValue, &uEFlags);
    732             pCtx->ADDR_rDI = uAddrReg += cbIncr;
    733             pCtx->ADDR_rCX = --uCounterReg;
    734             pCtx->eflags.u = uEFlags;
     728            pVCpu->cpum.GstCtx.ADDR_rDI = uAddrReg += cbIncr;
     729            pVCpu->cpum.GstCtx.ADDR_rCX = --uCounterReg;
     730            pVCpu->cpum.GstCtx.eflags.u = uEFlags;
    735731            cLeftPage--;
    736732            IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0 || (uEFlags & X86_EFL_ZF));
     
    762758IEM_CIMPL_DEF_1(RT_CONCAT4(iemCImpl_rep_movs_op,OP_SIZE,_addr,ADDR_SIZE), uint8_t, iEffSeg)
    763759{
    764     PVM         pVM   = pVCpu->CTX_SUFF(pVM);
    765     PCPUMCTX    pCtx  = IEM_GET_CTX(pVCpu);
     760    PVM pVM = pVCpu->CTX_SUFF(pVM);
    766761
    767762    /*
    768763     * Setup.
    769764     */
    770     ADDR_TYPE       uCounterReg = pCtx->ADDR_rCX;
     765    ADDR_TYPE       uCounterReg = pVCpu->cpum.GstCtx.ADDR_rCX;
    771766    if (uCounterReg == 0)
    772767    {
     
    784779
    785780    uint64_t        uDstBase;
    786     rcStrict = iemMemSegCheckWriteAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uDstBase);
     781    rcStrict = iemMemSegCheckWriteAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pVCpu->cpum.GstCtx.es), X86_SREG_ES, &uDstBase);
    787782    if (rcStrict != VINF_SUCCESS)
    788783        return rcStrict;
    789784
    790     int8_t const    cbIncr      = pCtx->eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
    791     ADDR_TYPE       uSrcAddrReg = pCtx->ADDR_rSI;
    792     ADDR_TYPE       uDstAddrReg = pCtx->ADDR_rDI;
     785    int8_t const    cbIncr      = pVCpu->cpum.GstCtx.eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
     786    ADDR_TYPE       uSrcAddrReg = pVCpu->cpum.GstCtx.ADDR_rSI;
     787    ADDR_TYPE       uDstAddrReg = pVCpu->cpum.GstCtx.ADDR_rDI;
    793788
    794789    /*
     
    822817                || (   uSrcAddrReg < pSrcHid->u32Limit
    823818                    && uSrcAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pSrcHid->u32Limit
    824                     && uDstAddrReg < pCtx->es.u32Limit
    825                     && uDstAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pCtx->es.u32Limit)
     819                    && uDstAddrReg < pVCpu->cpum.GstCtx.es.u32Limit
     820                    && uDstAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pVCpu->cpum.GstCtx.es.u32Limit)
    826821               )
    827822           )
     
    864859
    865860                    /* Update the registers. */
    866                     pCtx->ADDR_rSI = uSrcAddrReg += cLeftPage * cbIncr;
    867                     pCtx->ADDR_rDI = uDstAddrReg += cLeftPage * cbIncr;
    868                     pCtx->ADDR_rCX = uCounterReg -= cLeftPage;
     861                    pVCpu->cpum.GstCtx.ADDR_rSI = uSrcAddrReg += cLeftPage * cbIncr;
     862                    pVCpu->cpum.GstCtx.ADDR_rDI = uDstAddrReg += cLeftPage * cbIncr;
     863                    pVCpu->cpum.GstCtx.ADDR_rCX = uCounterReg -= cLeftPage;
    869864
    870865                    iemMemPageUnmap(pVCpu, GCPhysSrcMem, IEM_ACCESS_DATA_R, puSrcMem, &PgLockSrcMem);
     
    873868                    if (uCounterReg == 0)
    874869                        break;
    875                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     870                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pVCpu->cpum.GstCtx.eflags.u);
    876871                    continue;
    877872                }
     
    895890                return rcStrict;
    896891
    897             pCtx->ADDR_rSI = uSrcAddrReg += cbIncr;
    898             pCtx->ADDR_rDI = uDstAddrReg += cbIncr;
    899             pCtx->ADDR_rCX = --uCounterReg;
     892            pVCpu->cpum.GstCtx.ADDR_rSI = uSrcAddrReg += cbIncr;
     893            pVCpu->cpum.GstCtx.ADDR_rDI = uDstAddrReg += cbIncr;
     894            pVCpu->cpum.GstCtx.ADDR_rCX = --uCounterReg;
    900895            cLeftPage--;
    901896            IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);
     
    907902        if (uCounterReg == 0)
    908903            break;
    909         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     904        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pVCpu->cpum.GstCtx.eflags.u);
    910905    }
    911906
     
    923918IEM_CIMPL_DEF_0(RT_CONCAT4(iemCImpl_stos_,OP_rAX,_m,ADDR_SIZE))
    924919{
    925     PVM         pVM   = pVCpu->CTX_SUFF(pVM);
    926     PCPUMCTX    pCtx  = IEM_GET_CTX(pVCpu);
     920    PVM pVM = pVCpu->CTX_SUFF(pVM);
    927921
    928922    /*
    929923     * Setup.
    930924     */
    931     ADDR_TYPE       uCounterReg = pCtx->ADDR_rCX;
     925    ADDR_TYPE       uCounterReg = pVCpu->cpum.GstCtx.ADDR_rCX;
    932926    if (uCounterReg == 0)
    933927    {
     
    939933
    940934    uint64_t        uBaseAddr;
    941     VBOXSTRICTRC rcStrict = iemMemSegCheckWriteAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
     935    VBOXSTRICTRC rcStrict = iemMemSegCheckWriteAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pVCpu->cpum.GstCtx.es), X86_SREG_ES, &uBaseAddr);
    942936    if (rcStrict != VINF_SUCCESS)
    943937        return rcStrict;
    944938
    945     int8_t const    cbIncr      = pCtx->eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
    946     OP_TYPE const   uValue      = pCtx->OP_rAX;
    947     ADDR_TYPE       uAddrReg    = pCtx->ADDR_rDI;
     939    int8_t const    cbIncr      = pVCpu->cpum.GstCtx.eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
     940    OP_TYPE const   uValue      = pVCpu->cpum.GstCtx.OP_rAX;
     941    ADDR_TYPE       uAddrReg    = pVCpu->cpum.GstCtx.ADDR_rDI;
    948942
    949943    /*
     
    972966            && cbIncr > 0    /** @todo Implement reverse direction string ops. */
    973967            && (   IS_64_BIT_CODE(pVCpu)
    974                 || (   uAddrReg < pCtx->es.u32Limit
    975                     && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pCtx->es.u32Limit)
     968                || (   uAddrReg < pVCpu->cpum.GstCtx.es.u32Limit
     969                    && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pVCpu->cpum.GstCtx.es.u32Limit)
    976970               )
    977971           )
     
    992986            {
    993987                /* Update the regs first so we can loop on cLeftPage. */
    994                 pCtx->ADDR_rCX = uCounterReg -= cLeftPage;
    995                 pCtx->ADDR_rDI = uAddrReg    += cLeftPage * cbIncr;
     988                pVCpu->cpum.GstCtx.ADDR_rCX = uCounterReg -= cLeftPage;
     989                pVCpu->cpum.GstCtx.ADDR_rDI = uAddrReg    += cLeftPage * cbIncr;
    996990
    997991                /* Do the memsetting. */
     
    10141008                if (!(uVirtAddr & (OP_SIZE - 1)))
    10151009                {
    1016                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1010                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pVCpu->cpum.GstCtx.eflags.u);
    10171011                    continue;
    10181012                }
     
    10311025            if (rcStrict != VINF_SUCCESS)
    10321026                return rcStrict;
    1033             pCtx->ADDR_rDI = uAddrReg += cbIncr;
    1034             pCtx->ADDR_rCX = --uCounterReg;
     1027            pVCpu->cpum.GstCtx.ADDR_rDI = uAddrReg += cbIncr;
     1028            pVCpu->cpum.GstCtx.ADDR_rCX = --uCounterReg;
    10351029            cLeftPage--;
    10361030            IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);
     
    10421036        if (uCounterReg == 0)
    10431037            break;
    1044         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1038        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pVCpu->cpum.GstCtx.eflags.u);
    10451039    }
    10461040
     
    10581052IEM_CIMPL_DEF_1(RT_CONCAT4(iemCImpl_lods_,OP_rAX,_m,ADDR_SIZE), int8_t, iEffSeg)
    10591053{
    1060     PVM         pVM   = pVCpu->CTX_SUFF(pVM);
    1061     PCPUMCTX    pCtx  = IEM_GET_CTX(pVCpu);
     1054    PVM pVM = pVCpu->CTX_SUFF(pVM);
    10621055
    10631056    /*
    10641057     * Setup.
    10651058     */
    1066     ADDR_TYPE       uCounterReg = pCtx->ADDR_rCX;
     1059    ADDR_TYPE       uCounterReg = pVCpu->cpum.GstCtx.ADDR_rCX;
    10671060    if (uCounterReg == 0)
    10681061    {
     
    10781071        return rcStrict;
    10791072
    1080     int8_t const    cbIncr      = pCtx->eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
    1081     ADDR_TYPE       uAddrReg    = pCtx->ADDR_rSI;
     1073    int8_t const    cbIncr      = pVCpu->cpum.GstCtx.eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
     1074    ADDR_TYPE       uAddrReg    = pVCpu->cpum.GstCtx.ADDR_rSI;
    10821075
    10831076    /*
     
    11171110                /* Only get the last byte, the rest doesn't matter in direct access mode. */
    11181111#if OP_SIZE == 32
    1119                 pCtx->rax      = puMem[cLeftPage - 1];
     1112                pVCpu->cpum.GstCtx.rax      = puMem[cLeftPage - 1];
    11201113#else
    1121                 pCtx->OP_rAX   = puMem[cLeftPage - 1];
     1114                pVCpu->cpum.GstCtx.OP_rAX   = puMem[cLeftPage - 1];
    11221115#endif
    1123                 pCtx->ADDR_rCX = uCounterReg -= cLeftPage;
    1124                 pCtx->ADDR_rSI = uAddrReg    += cLeftPage * cbIncr;
     1116                pVCpu->cpum.GstCtx.ADDR_rCX = uCounterReg -= cLeftPage;
     1117                pVCpu->cpum.GstCtx.ADDR_rSI = uAddrReg    += cLeftPage * cbIncr;
    11251118                iemMemPageUnmap(pVCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
    11261119
     
    11321125                if (!(uVirtAddr & (OP_SIZE - 1)))
    11331126                {
    1134                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1127                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pVCpu->cpum.GstCtx.eflags.u);
    11351128                    continue;
    11361129                }
     
    11511144                return rcStrict;
    11521145#if OP_SIZE == 32
    1153             pCtx->rax      = uTmpValue;
     1146            pVCpu->cpum.GstCtx.rax      = uTmpValue;
    11541147#else
    1155             pCtx->OP_rAX   = uTmpValue;
     1148            pVCpu->cpum.GstCtx.OP_rAX   = uTmpValue;
    11561149#endif
    1157             pCtx->ADDR_rSI = uAddrReg += cbIncr;
    1158             pCtx->ADDR_rCX = --uCounterReg;
     1150            pVCpu->cpum.GstCtx.ADDR_rSI = uAddrReg += cbIncr;
     1151            pVCpu->cpum.GstCtx.ADDR_rCX = --uCounterReg;
    11591152            cLeftPage--;
    11601153            IEM_CHECK_FF_CPU_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);
     
    11691162        if (uCounterReg == 0)
    11701163            break;
    1171         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1164        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pVCpu->cpum.GstCtx.eflags.u);
    11721165    }
    11731166
     
    11881181{
    11891182    PVM             pVM  = pVCpu->CTX_SUFF(pVM);
    1190     PCPUMCTX        pCtx = IEM_GET_CTX(pVCpu);
    11911183    VBOXSTRICTRC    rcStrict;
    11921184
     
    12071199    if (!fIoChecked)
    12081200    {
    1209         rcStrict = iemHlpCheckPortIOPermission(pVCpu, pCtx->dx, OP_SIZE / 8);
     1201        rcStrict = iemHlpCheckPortIOPermission(pVCpu, pVCpu->cpum.GstCtx.dx, OP_SIZE / 8);
    12101202        if (rcStrict != VINF_SUCCESS)
    12111203            return rcStrict;
     
    12181210    if (IEM_IS_SVM_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_IOIO_PROT))
    12191211    {
    1220         rcStrict = iemSvmHandleIOIntercept(pVCpu, pCtx->dx, SVMIOIOTYPE_IN, OP_SIZE / 8, ADDR_SIZE, X86_SREG_ES, false /* fRep */,
     1212        rcStrict = iemSvmHandleIOIntercept(pVCpu, pVCpu->cpum.GstCtx.dx, SVMIOIOTYPE_IN, OP_SIZE / 8, ADDR_SIZE, X86_SREG_ES, false /* fRep */,
    12211213                                           true /* fStrIo */, cbInstr);
    12221214        if (rcStrict == VINF_SVM_VMEXIT)
     
    12241216        if (rcStrict != VINF_HM_INTERCEPT_NOT_ACTIVE)
    12251217        {
    1226             Log(("iemCImpl_ins_op: iemSvmHandleIOIntercept failed (u16Port=%#x, cbReg=%u) rc=%Rrc\n", pCtx->dx, OP_SIZE / 8,
     1218            Log(("iemCImpl_ins_op: iemSvmHandleIOIntercept failed (u16Port=%#x, cbReg=%u) rc=%Rrc\n", pVCpu->cpum.GstCtx.dx, OP_SIZE / 8,
    12271219                 VBOXSTRICTRC_VAL(rcStrict)));
    12281220            return rcStrict;
     
    12321224
    12331225    OP_TYPE        *puMem;
    1234     rcStrict = iemMemMap(pVCpu, (void **)&puMem, OP_SIZE / 8, X86_SREG_ES, pCtx->ADDR_rDI, IEM_ACCESS_DATA_W);
     1226    rcStrict = iemMemMap(pVCpu, (void **)&puMem, OP_SIZE / 8, X86_SREG_ES, pVCpu->cpum.GstCtx.ADDR_rDI, IEM_ACCESS_DATA_W);
    12351227    if (rcStrict != VINF_SUCCESS)
    12361228        return rcStrict;
    12371229
    12381230    uint32_t        u32Value = 0;
    1239     rcStrict = IOMIOPortRead(pVM, pVCpu, pCtx->dx, &u32Value, OP_SIZE / 8);
     1231    rcStrict = IOMIOPortRead(pVM, pVCpu, pVCpu->cpum.GstCtx.dx, &u32Value, OP_SIZE / 8);
    12401232    if (IOM_SUCCESS(rcStrict))
    12411233    {
     
    12481240        if (RT_LIKELY(rcStrict2 == VINF_SUCCESS))
    12491241        {
    1250             if (!pCtx->eflags.Bits.u1DF)
    1251                 pCtx->ADDR_rDI += OP_SIZE / 8;
     1242            if (!pVCpu->cpum.GstCtx.eflags.Bits.u1DF)
     1243                pVCpu->cpum.GstCtx.ADDR_rDI += OP_SIZE / 8;
    12521244            else
    1253                 pCtx->ADDR_rDI -= OP_SIZE / 8;
     1245                pVCpu->cpum.GstCtx.ADDR_rDI -= OP_SIZE / 8;
    12541246            iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    12551247        }
     
    12661258IEM_CIMPL_DEF_1(RT_CONCAT4(iemCImpl_rep_ins_op,OP_SIZE,_addr,ADDR_SIZE), bool, fIoChecked)
    12671259{
    1268     PVM         pVM   = pVCpu->CTX_SUFF(pVM);
    1269     PCPUMCTX    pCtx  = IEM_GET_CTX(pVCpu);
     1260    PVM pVM = pVCpu->CTX_SUFF(pVM);
    12701261
    12711262    IEM_CTX_IMPORT_RET(pVCpu, CPUMCTX_EXTRN_ES | CPUMCTX_EXTRN_TR);
     
    12741265     * Setup.
    12751266     */
    1276     uint16_t const  u16Port    = pCtx->dx;
     1267    uint16_t const  u16Port    = pVCpu->cpum.GstCtx.dx;
    12771268    VBOXSTRICTRC    rcStrict;
    12781269    if (!fIoChecked)
     
    13031294#endif
    13041295
    1305     ADDR_TYPE       uCounterReg = pCtx->ADDR_rCX;
     1296    ADDR_TYPE       uCounterReg = pVCpu->cpum.GstCtx.ADDR_rCX;
    13061297    if (uCounterReg == 0)
    13071298    {
     
    13111302
    13121303    uint64_t        uBaseAddr;
    1313     rcStrict = iemMemSegCheckWriteAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr);
     1304    rcStrict = iemMemSegCheckWriteAccessEx(pVCpu, iemSRegUpdateHid(pVCpu, &pVCpu->cpum.GstCtx.es), X86_SREG_ES, &uBaseAddr);
    13141305    if (rcStrict != VINF_SUCCESS)
    13151306        return rcStrict;
    13161307
    1317     int8_t const    cbIncr      = pCtx->eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
    1318     ADDR_TYPE       uAddrReg    = pCtx->ADDR_rDI;
     1308    int8_t const    cbIncr      = pVCpu->cpum.GstCtx.eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
     1309    ADDR_TYPE       uAddrReg    = pVCpu->cpum.GstCtx.ADDR_rDI;
    13191310
    13201311    /*
     
    13421333            && cbIncr > 0    /** @todo Implement reverse direction string ops. */
    13431334            && (   IS_64_BIT_CODE(pVCpu)
    1344                 || (   uAddrReg < pCtx->es.u32Limit
    1345                     && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pCtx->es.u32Limit)
     1335                || (   uAddrReg < pVCpu->cpum.GstCtx.es.u32Limit
     1336                    && uAddrReg + (cLeftPage * (OP_SIZE / 8)) <= pVCpu->cpum.GstCtx.es.u32Limit)
    13461337               )
    13471338           )
     
    13661357                uint32_t cActualTransfers = cLeftPage - cTransfers;
    13671358                Assert(cActualTransfers <= cLeftPage);
    1368                 pCtx->ADDR_rDI = uAddrReg    += cbIncr * cActualTransfers;
    1369                 pCtx->ADDR_rCX = uCounterReg -= cActualTransfers;
     1359                pVCpu->cpum.GstCtx.ADDR_rDI = uAddrReg    += cbIncr * cActualTransfers;
     1360                pVCpu->cpum.GstCtx.ADDR_rCX = uCounterReg -= cActualTransfers;
    13701361                puMem += cActualTransfers;
    13711362
     
    13891380                if (!(uVirtAddr & (OP_SIZE - 1)))
    13901381                {
    1391                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1382                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pVCpu->cpum.GstCtx.eflags.u);
    13921383                    continue;
    13931384                }
     
    14301421                                            RT_FAILURE(rcStrict2) ? rcStrict2 : VERR_IEM_IPE_1);
    14311422
    1432             pCtx->ADDR_rDI = uAddrReg += cbIncr;
    1433             pCtx->ADDR_rCX = --uCounterReg;
     1423            pVCpu->cpum.GstCtx.ADDR_rDI = uAddrReg += cbIncr;
     1424            pVCpu->cpum.GstCtx.ADDR_rCX = --uCounterReg;
    14341425
    14351426            cLeftPage--;
     
    14511442        if (uCounterReg == 0)
    14521443            break;
    1453         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1444        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pVCpu->cpum.GstCtx.eflags.u);
    14541445    }
    14551446
     
    14681459{
    14691460    PVM             pVM  = pVCpu->CTX_SUFF(pVM);
    1470     PCPUMCTX        pCtx = IEM_GET_CTX(pVCpu);
    14711461    VBOXSTRICTRC    rcStrict;
    14721462
     
    14781468    if (!fIoChecked)
    14791469    {
    1480         rcStrict = iemHlpCheckPortIOPermission(pVCpu, pCtx->dx, OP_SIZE / 8);
     1470        rcStrict = iemHlpCheckPortIOPermission(pVCpu, pVCpu->cpum.GstCtx.dx, OP_SIZE / 8);
    14811471        if (rcStrict != VINF_SUCCESS)
    14821472            return rcStrict;
     
    14891479    if (IEM_IS_SVM_CTRL_INTERCEPT_SET(pVCpu, SVM_CTRL_INTERCEPT_IOIO_PROT))
    14901480    {
    1491         rcStrict = iemSvmHandleIOIntercept(pVCpu, pCtx->dx, SVMIOIOTYPE_OUT, OP_SIZE / 8, ADDR_SIZE, iEffSeg, false /* fRep */,
     1481        rcStrict = iemSvmHandleIOIntercept(pVCpu, pVCpu->cpum.GstCtx.dx, SVMIOIOTYPE_OUT, OP_SIZE / 8, ADDR_SIZE, iEffSeg, false /* fRep */,
    14921482                                           true /* fStrIo */, cbInstr);
    14931483        if (rcStrict == VINF_SVM_VMEXIT)
     
    14951485        if (rcStrict != VINF_HM_INTERCEPT_NOT_ACTIVE)
    14961486        {
    1497             Log(("iemCImpl_outs_op: iemSvmHandleIOIntercept failed (u16Port=%#x, cbReg=%u) rc=%Rrc\n", pCtx->dx, OP_SIZE / 8,
     1487            Log(("iemCImpl_outs_op: iemSvmHandleIOIntercept failed (u16Port=%#x, cbReg=%u) rc=%Rrc\n", pVCpu->cpum.GstCtx.dx, OP_SIZE / 8,
    14981488                 VBOXSTRICTRC_VAL(rcStrict)));
    14991489            return rcStrict;
     
    15031493
    15041494    OP_TYPE uValue;
    1505     rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pVCpu, &uValue, iEffSeg, pCtx->ADDR_rSI);
     1495    rcStrict = RT_CONCAT(iemMemFetchDataU,OP_SIZE)(pVCpu, &uValue, iEffSeg, pVCpu->cpum.GstCtx.ADDR_rSI);
    15061496    if (rcStrict == VINF_SUCCESS)
    15071497    {
    1508         rcStrict = IOMIOPortWrite(pVM, pVCpu, pCtx->dx, uValue, OP_SIZE / 8);
     1498        rcStrict = IOMIOPortWrite(pVM, pVCpu, pVCpu->cpum.GstCtx.dx, uValue, OP_SIZE / 8);
    15091499        if (IOM_SUCCESS(rcStrict))
    15101500        {
    1511             if (!pCtx->eflags.Bits.u1DF)
    1512                 pCtx->ADDR_rSI += OP_SIZE / 8;
     1501            if (!pVCpu->cpum.GstCtx.eflags.Bits.u1DF)
     1502                pVCpu->cpum.GstCtx.ADDR_rSI += OP_SIZE / 8;
    15131503            else
    1514                 pCtx->ADDR_rSI -= OP_SIZE / 8;
     1504                pVCpu->cpum.GstCtx.ADDR_rSI -= OP_SIZE / 8;
    15151505            iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    15161506            if (rcStrict != VINF_SUCCESS)
     
    15271517IEM_CIMPL_DEF_2(RT_CONCAT4(iemCImpl_rep_outs_op,OP_SIZE,_addr,ADDR_SIZE), uint8_t, iEffSeg, bool, fIoChecked)
    15281518{
    1529     PVM         pVM   = pVCpu->CTX_SUFF(pVM);
    1530     PCPUMCTX    pCtx  = IEM_GET_CTX(pVCpu);
     1519    PVM pVM = pVCpu->CTX_SUFF(pVM);
    15311520
    15321521    /*
    15331522     * Setup.
    15341523     */
    1535     uint16_t const  u16Port    = pCtx->dx;
     1524    uint16_t const  u16Port    = pVCpu->cpum.GstCtx.dx;
    15361525    VBOXSTRICTRC    rcStrict;
    15371526    if (!fIoChecked)
     
    15621551#endif
    15631552
    1564     ADDR_TYPE       uCounterReg = pCtx->ADDR_rCX;
     1553    ADDR_TYPE       uCounterReg = pVCpu->cpum.GstCtx.ADDR_rCX;
    15651554    if (uCounterReg == 0)
    15661555    {
     
    15751564        return rcStrict;
    15761565
    1577     int8_t const    cbIncr      = pCtx->eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
    1578     ADDR_TYPE       uAddrReg    = pCtx->ADDR_rSI;
     1566    int8_t const    cbIncr      = pVCpu->cpum.GstCtx.eflags.Bits.u1DF ? -(OP_SIZE / 8) : (OP_SIZE / 8);
     1567    ADDR_TYPE       uAddrReg    = pVCpu->cpum.GstCtx.ADDR_rSI;
    15791568
    15801569    /*
     
    16171606                uint32_t cActualTransfers = cLeftPage - cTransfers;
    16181607                Assert(cActualTransfers <= cLeftPage);
    1619                 pCtx->ADDR_rSI = uAddrReg    += cbIncr * cActualTransfers;
    1620                 pCtx->ADDR_rCX = uCounterReg -= cActualTransfers;
     1608                pVCpu->cpum.GstCtx.ADDR_rSI = uAddrReg    += cbIncr * cActualTransfers;
     1609                pVCpu->cpum.GstCtx.ADDR_rCX = uCounterReg -= cActualTransfers;
    16211610                puMem += cActualTransfers;
    16221611
     
    16411630                if (!(uVirtAddr & (OP_SIZE - 1)))
    16421631                {
    1643                     IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1632                    IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pVCpu->cpum.GstCtx.eflags.u);
    16441633                    continue;
    16451634                }
     
    16681657            if (IOM_SUCCESS(rcStrict))
    16691658            {
    1670                 pCtx->ADDR_rSI = uAddrReg += cbIncr;
    1671                 pCtx->ADDR_rCX = --uCounterReg;
     1659                pVCpu->cpum.GstCtx.ADDR_rSI = uAddrReg += cbIncr;
     1660                pVCpu->cpum.GstCtx.ADDR_rCX = --uCounterReg;
    16721661                cLeftPage--;
    16731662            }
     
    16911680        if (uCounterReg == 0)
    16921681            break;
    1693         IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pCtx->eflags.u);
     1682        IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pVCpu->cpum.GstCtx.eflags.u);
    16941683    }
    16951684
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