VirtualBox

Changeset 91281 in vbox


Ignore:
Timestamp:
Sep 16, 2021 1:32:18 PM (3 years ago)
Author:
vboxsync
Message:

VMM/CPUM,++: Moved the guest's extended state (XState) from the hyper heap and into CPUMCTX. bugref:10093

Location:
trunk
Files:
21 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/cpum.mac

    r91271 r91281  
    247247    .msrKERNELGSBASE    resb    8
    248248    .uMsrPadding0       resb    8
     249
     250    alignb 8
     251    .fExtrn             resq    1
     252
     253    alignb 32
     254    .aPaePdpes          resq    4
     255
    249256    alignb 8
    250257    .aXcr               resq    2
    251258    .fXStateMask        resq    1
    252     .pXStateR0      RTR0PTR_RES 1
    253     alignb 8
    254     .pXStateR3      RTR3PTR_RES 1
     259    .fUsedFpuGuest      resb    1
     260    alignb 8
    255261    .aoffXState         resw    64
    256     .fUsedFpuGuest      resb    1
    257     alignb 8
    258     .fExtrn             resq    1
    259     .aPaePdpes          resq    4
    260     alignb 8
     262    alignb 256
     263    .abXState           resb    0x4000-0x300
     264    .XState             EQU     .abXState
     265
     266    alignb 4096
    261267    .hwvirt.svm.uMsrHSavePa            resq          1
    262268    .hwvirt.svm.GCPhysVmcb             resq          1
  • trunk/include/VBox/vmm/cpumctx.h

    r91271 r91281  
    422422     *          neither do we.
    423423     */
    424     uint64_t        dr[8];
     424    uint64_t            dr[8];
    425425
    426426    /** Padding before the structure so the 64-bit member is correctly aligned.
    427427     * @todo fix this structure!  */
    428     uint16_t        gdtrPadding[3];
     428    uint16_t            gdtrPadding[3];
    429429    /** Global Descriptor Table register. */
    430     VBOXGDTR        gdtr;
     430    VBOXGDTR            gdtr;
    431431
    432432    /** Padding before the structure so the 64-bit member is correctly aligned.
    433433     * @todo fix this structure!  */
    434     uint16_t        idtrPadding[3];
     434    uint16_t            idtrPadding[3];
    435435    /** Interrupt Descriptor Table register. */
    436     VBOXIDTR        idtr;
     436    VBOXIDTR            idtr;
    437437
    438438    /** The task register.
    439439     * Only the guest context uses all the members. */
    440     CPUMSELREG      ldtr;
     440    CPUMSELREG          ldtr;
    441441    /** The task register.
    442442     * Only the guest context uses all the members. */
    443     CPUMSELREG      tr;
     443    CPUMSELREG          tr;
    444444
    445445    /** The sysenter msr registers.
    446446     * This member is not used by the hypervisor context. */
    447     CPUMSYSENTER    SysEnter;
     447    CPUMSYSENTER        SysEnter;
    448448
    449449    /** @name System MSRs.
    450450     * @{ */
    451     uint64_t        msrEFER;
    452     uint64_t        msrSTAR;            /**< Legacy syscall eip, cs & ss. */
    453     uint64_t        msrPAT;             /**< Page attribute table. */
    454     uint64_t        msrLSTAR;           /**< 64 bits mode syscall rip. */
    455     uint64_t        msrCSTAR;           /**< Compatibility mode syscall rip. */
    456     uint64_t        msrSFMASK;          /**< syscall flag mask. */
    457     uint64_t        msrKERNELGSBASE;    /**< swapgs exchange value. */
    458     uint64_t        uMsrPadding0;       /**< no longer used (used to hold a copy of APIC base MSR). */
     451    uint64_t            msrEFER;
     452    uint64_t            msrSTAR;            /**< Legacy syscall eip, cs & ss. */
     453    uint64_t            msrPAT;             /**< Page attribute table. */
     454    uint64_t            msrLSTAR;           /**< 64 bits mode syscall rip. */
     455    uint64_t            msrCSTAR;           /**< Compatibility mode syscall rip. */
     456    uint64_t            msrSFMASK;          /**< syscall flag mask. */
     457    uint64_t            msrKERNELGSBASE;    /**< swapgs exchange value. */
     458    uint64_t            uMsrPadding0;       /**< no longer used (used to hold a copy of APIC base MSR). */
    459459    /** @} */
    460460
    461     /** The XCR0..XCR1 registers. */
    462     uint64_t                    aXcr[2];
    463     /** The mask to pass to XSAVE/XRSTOR in EDX:EAX.  If zero we use
     461    /** 0x228 - Externalized state tracker, CPUMCTX_EXTRN_XXX.
     462     * Currently only used internally in NEM/win.  */
     463    uint64_t            fExtrn;
     464
     465    uint64_t            au64Unused[2];
     466
     467    /** 0x240 - PAE PDPTEs. */
     468    X86PDPE             aPaePdpes[4];
     469
     470    /** 0x260 - The XCR0..XCR1 registers. */
     471    uint64_t            aXcr[2];
     472    /** 0x270 - The mask to pass to XSAVE/XRSTOR in EDX:EAX.  If zero we use
    464473     *  FXSAVE/FXRSTOR (since bit 0 will always be set, we only need to test it). */
    465     uint64_t                    fXStateMask;
    466 
    467     /** Pointer to the FPU/SSE/AVX/XXXX state ring-0 mapping. */
    468     R0PTRTYPE(PX86XSAVEAREA)    pXStateR0;
    469     /** Pointer to the FPU/SSE/AVX/XXXX state ring-3 mapping. */
    470     R3PTRTYPE(PX86XSAVEAREA)    pXStateR3;
    471     /** State component offsets into pXState, UINT16_MAX if not present. */
    472     uint16_t                    aoffXState[64];
    473 
    474     /** 0x2d4 - Mirror of CPUMCPU::fUseFlags[CPUM_USED_FPU_GUEST]. */
    475     bool                        fUsedFpuGuest;
    476     uint8_t                     afUnused[7];
    477     /** 0x2d8 - Externalized state tracker, CPUMCTX_EXTRN_XXX.
    478      * Currently only used internally in NEM/win.  */
    479     uint64_t                    fExtrn;
    480 
    481     /** 0x2e0 - PAE PDPTEs. */
    482     X86PDPE                     aPaePdpes[4];
    483 
    484     /** 0x300 - Hardware virtualization state.   */
     474    uint64_t            fXStateMask;
     475    /** 0x278 - Mirror of CPUMCPU::fUseFlags[CPUM_USED_FPU_GUEST]. */
     476    bool                fUsedFpuGuest;
     477    uint8_t             afUnused[7];
     478
     479    /* ---- Start of members not zeroed at reset. ---- */
     480
     481    /** 0x280 - State component offsets into pXState, UINT16_MAX if not present.
     482     * @note Everything before this member will be memset to zero during reset. */
     483    uint16_t            aoffXState[64];
     484    /** 0x300 - The extended state (FPU/SSE/AVX/AVX-2/XXXX).
     485     * Aligned on 256 byte boundrary (min req is currently 64 bytes). */
     486    union /* no tag */
     487    {
     488        X86XSAVEAREA    XState;
     489        /** Byte view for simple indexing and space allocation. */
     490        uint8_t         abXState[0x4000 - 0x300];
     491    } CPUM_UNION_NM(u);
     492
     493    /** 0x4000 - Hardware virtualization state.
     494     * @note This is page aligned, so an full page member comes first in the
     495     *       substructures. */
    485496    struct
    486497    {
     
    689700AssertCompileMemberOffset(CPUMCTX,                  msrSFMASK, 528);
    690701AssertCompileMemberOffset(CPUMCTX,            msrKERNELGSBASE, 536);
    691 AssertCompileMemberOffset(CPUMCTX,                       aXcr, 552);
    692 AssertCompileMemberOffset(CPUMCTX,                fXStateMask, 568);
    693 AssertCompileMemberOffset(CPUMCTX,                  pXStateR0, 576);
    694 AssertCompileMemberOffset(CPUMCTX,                  pXStateR3, 584);
    695 AssertCompileMemberOffset(CPUMCTX,                 aoffXState, 592);
    696 AssertCompileMemberOffset(CPUMCTX, aPaePdpes, 0x2e0);
     702AssertCompileMemberOffset(CPUMCTX,                  aPaePdpes, 0x240);
     703AssertCompileMemberOffset(CPUMCTX,                       aXcr, 0x260);
     704AssertCompileMemberOffset(CPUMCTX,                fXStateMask, 0x270);
     705AssertCompileMemberOffset(CPUMCTX,                fUsedFpuGuest, 0x278);
     706AssertCompileMemberOffset(CPUMCTX,   CPUM_UNION_NM(u.) XState, 0x300);
     707AssertCompileMemberOffset(CPUMCTX,   CPUM_UNION_NM(u.) abXState, 0x300);
     708AssertCompileMemberAlignment(CPUMCTX, CPUM_UNION_NM(u.) XState, 0x100);
     709AssertCompileMemberAlignment(CPUMCTX,                   hwvirt, 0x1000);
     710#if 0
    697711AssertCompileMemberOffset(CPUMCTX, hwvirt,    0x300);
    698712AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.uMsrHSavePa,                 0x300);
     
    758772AssertCompileMemberOffset(CPUMCTX, hwvirt.fGif,                0x524);
    759773AssertCompileMemberOffset(CPUMCTX, hwvirt.fLocalForcedActions, 0x528);
     774#endif
    760775AssertCompileMembersAtSameOffset(CPUMCTX, CPUM_UNION_STRUCT_NM(g,qw.) rax, CPUMCTX, CPUM_UNION_NM(g.) aGRegs);
    761776AssertCompileMembersAtSameOffset(CPUMCTX, CPUM_UNION_STRUCT_NM(g,qw.) rax, CPUMCTX, CPUM_UNION_STRUCT_NM(g,qw2.)  r0);
     
    871886        AssertMsg(a_pLambdaCtx->fXStateMask & RT_BIT_64(a_iCompBit), (#a_iCompBit "\n")); \
    872887        AssertMsg(a_pLambdaCtx->aoffXState[(a_iCompBit)] != UINT16_MAX, (#a_iCompBit "\n")); \
    873         return (a_PtrType)((uint8_t *)a_pLambdaCtx->CTX_SUFF(pXState) + a_pLambdaCtx->aoffXState[(a_iCompBit)]); \
     888        return (a_PtrType)(&a_pLambdaCtx->abXState[a_pLambdaCtx->aoffXState[(a_iCompBit)]]); \
    874889    }(a_pCtx))
    875890#elif defined(VBOX_STRICT) && defined(__GNUC__)
     
    880895        AssertMsg((a_pCtx)->fXStateMask & RT_BIT_64(a_iCompBit), (#a_iCompBit "\n")); \
    881896        AssertMsg((a_pCtx)->aoffXState[(a_iCompBit)] != UINT16_MAX, (#a_iCompBit "\n")); \
    882         (a_PtrType)((uint8_t *)(a_pCtx)->CTX_SUFF(pXState) + (a_pCtx)->aoffXState[(a_iCompBit)]); \
     897        (a_PtrType)(&(a_pCtx)->abXState[(a_pCtx)->aoffXState[(a_iCompBit)]]); \
    883898    })
    884899#else
    885900# define CPUMCTX_XSAVE_C_PTR(a_pCtx, a_iCompBit, a_PtrType) \
    886     ((a_PtrType)((uint8_t *)(a_pCtx)->CTX_SUFF(pXState) + (a_pCtx)->aoffXState[(a_iCompBit)]))
     901    ((a_PtrType)(&(a_pCtx)->abXState[(a_pCtx)->aoffXState[(a_iCompBit)])])
    887902#endif
    888903
  • trunk/include/VBox/vmm/vm.h

    r91271 r91281  
    305305        CPUMCTX             GstCtx;
    306306#endif
    307         uint8_t             padding[4096];      /* multiple of 4096 */
     307        uint8_t             padding[20480];      /* multiple of 4096 */
    308308    } cpum;
    309309
  • trunk/include/VBox/vmm/vm.mac

    r91266 r91281  
    9191    .pgm                    resb 4096+28672
    9292    alignb 4096
    93     .cpum                   resb 4096
     93    .cpum                   resb 20480
    9494%define VMCPU.cpum.GstCtx   VMCPU.cpum
    9595    alignb 4096
  • trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp

    r91275 r91281  
    13881388                if (pVCpu->cpum.s.Guest.fXStateMask != 0)
    13891389                    /* Adding more components. */
    1390                     ASMXRstor(pVCpu->cpum.s.Guest.CTX_SUFF(pXState), fNewComponents);
     1390                    ASMXRstor(&pVCpu->cpum.s.Guest.XState, fNewComponents);
    13911391                else
    13921392                {
     
    13941394                    pVCpu->cpum.s.Guest.fXStateMask |= XSAVE_C_X87 | XSAVE_C_SSE;
    13951395                    if (uNewValue & ~(XSAVE_C_X87 | XSAVE_C_SSE))
    1396                         ASMXRstor(pVCpu->cpum.s.Guest.CTX_SUFF(pXState), uNewValue & ~(XSAVE_C_X87 | XSAVE_C_SSE));
     1396                        ASMXRstor(&pVCpu->cpum.s.Guest.XState, uNewValue & ~(XSAVE_C_X87 | XSAVE_C_SSE));
    13971397                }
    13981398            }
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r91263 r91281  
    70027002
    70037003    /* Make sure any changes are loaded the next time around. */
    7004     pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->Hdr.bmXState |= XSAVE_C_SSE;
     7004    pVCpu->cpum.GstCtx.XState.Hdr.bmXState |= XSAVE_C_SSE;
    70057005}
    70067006
     
    70437043
    70447044    /* Just assume we're going to make changes to the SSE and YMM_HI parts. */
    7045     pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->Hdr.bmXState |= XSAVE_C_YMM | XSAVE_C_SSE;
     7045    pVCpu->cpum.GstCtx.XState.Hdr.bmXState |= XSAVE_C_YMM | XSAVE_C_SSE;
    70467046}
    70477047
     
    72817281IEM_STATIC void iemFpuPushResult(PVMCPUCC pVCpu, PIEMFPURESULT pResult)
    72827282{
    7283     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7283    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    72847284    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    72857285    iemFpuMaybePushResult(pResult, pFpuCtx);
     
    72987298IEM_STATIC void iemFpuPushResultWithMemOp(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    72997299{
    7300     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7300    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    73017301    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    73027302    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     
    73147314IEM_STATIC void iemFpuPushResultTwo(PVMCPUCC pVCpu, PIEMFPURESULTTWO pResult)
    73157315{
    7316     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7316    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    73177317    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    73187318
     
    73687368IEM_STATIC void iemFpuStoreResult(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg)
    73697369{
    7370     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7370    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    73717371    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    73727372    iemFpuStoreResultOnly(pFpuCtx, pResult, iStReg);
     
    73847384IEM_STATIC void iemFpuStoreResultThenPop(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg)
    73857385{
    7386     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7386    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    73877387    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    73887388    iemFpuStoreResultOnly(pFpuCtx, pResult, iStReg);
     
    74047404                                           uint8_t iEffSeg, RTGCPTR GCPtrEff)
    74057405{
    7406     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7406    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    74077407    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    74087408    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     
    74247424                                                  uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    74257425{
    7426     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7426    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    74277427    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    74287428    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     
    74397439IEM_STATIC void iemFpuUpdateOpcodeAndIp(PVMCPUCC pVCpu)
    74407440{
    7441     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7441    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    74427442    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    74437443}
     
    74537453{
    74547454    Assert(iStReg < 8);
    7455     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7455    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    74567456    uint8_t     iReg    = (X86_FSW_TOP_GET(pFpuCtx->FSW) + iStReg) & X86_FSW_TOP_SMASK;
    74577457    pFpuCtx->FTW &= ~RT_BIT(iReg);
     
    74667466IEM_STATIC void iemFpuStackIncTop(PVMCPUCC pVCpu)
    74677467{
    7468     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7468    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    74697469    uint16_t    uFsw    = pFpuCtx->FSW;
    74707470    uint16_t    uTop    = uFsw & X86_FSW_TOP_MASK;
     
    74837483IEM_STATIC void iemFpuStackDecTop(PVMCPUCC pVCpu)
    74847484{
    7485     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7485    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    74867486    uint16_t    uFsw    = pFpuCtx->FSW;
    74877487    uint16_t    uTop    = uFsw & X86_FSW_TOP_MASK;
     
    75017501IEM_STATIC void iemFpuUpdateFSW(PVMCPUCC pVCpu, uint16_t u16FSW)
    75027502{
    7503     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7503    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    75047504    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    75057505    iemFpuUpdateFSWOnly(pFpuCtx, u16FSW);
     
    75157515IEM_STATIC void iemFpuUpdateFSWThenPop(PVMCPUCC pVCpu, uint16_t u16FSW)
    75167516{
    7517     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7517    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    75187518    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    75197519    iemFpuUpdateFSWOnly(pFpuCtx, u16FSW);
     
    75327532IEM_STATIC void iemFpuUpdateFSWWithMemOp(PVMCPUCC pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    75337533{
    7534     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7534    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    75357535    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    75367536    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     
    75477547IEM_STATIC void iemFpuUpdateFSWThenPopPop(PVMCPUCC pVCpu, uint16_t u16FSW)
    75487548{
    7549     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7549    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    75507550    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    75517551    iemFpuUpdateFSWOnly(pFpuCtx, u16FSW);
     
    75657565IEM_STATIC void iemFpuUpdateFSWWithMemOpThenPop(PVMCPUCC pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    75667566{
    7567     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7567    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    75687568    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    75697569    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     
    76127612DECL_NO_INLINE(IEM_STATIC, void) iemFpuStackUnderflow(PVMCPUCC pVCpu, uint8_t iStReg)
    76137613{
    7614     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7614    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    76157615    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    76167616    iemFpuStackUnderflowOnly(pFpuCtx, iStReg);
     
    76217621iemFpuStackUnderflowWithMemOp(PVMCPUCC pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    76227622{
    7623     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7623    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    76247624    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    76257625    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     
    76307630DECL_NO_INLINE(IEM_STATIC, void) iemFpuStackUnderflowThenPop(PVMCPUCC pVCpu, uint8_t iStReg)
    76317631{
    7632     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7632    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    76337633    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    76347634    iemFpuStackUnderflowOnly(pFpuCtx, iStReg);
     
    76407640iemFpuStackUnderflowWithMemOpThenPop(PVMCPUCC pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    76417641{
    7642     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7642    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    76437643    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    76447644    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     
    76507650DECL_NO_INLINE(IEM_STATIC, void) iemFpuStackUnderflowThenPopPop(PVMCPUCC pVCpu)
    76517651{
    7652     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7652    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    76537653    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    76547654    iemFpuStackUnderflowOnly(pFpuCtx, UINT8_MAX);
     
    76617661iemFpuStackPushUnderflow(PVMCPUCC pVCpu)
    76627662{
    7663     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7663    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    76647664    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    76657665
     
    76877687iemFpuStackPushUnderflowTwo(PVMCPUCC pVCpu)
    76887688{
    7689     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7689    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    76907690    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    76917691
     
    77457745DECL_NO_INLINE(IEM_STATIC, void) iemFpuStackPushOverflow(PVMCPUCC pVCpu)
    77467746{
    7747     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7747    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    77487748    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
    77497749    iemFpuStackPushOverflowOnly(pFpuCtx);
     
    77617761iemFpuStackPushOverflowWithMemOp(PVMCPUCC pVCpu, uint8_t iEffSeg, RTGCPTR GCPtrEff)
    77627762{
    7763     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7763    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    77647764    iemFpuUpdateDP(pVCpu, pFpuCtx, iEffSeg, GCPtrEff);
    77657765    iemFpuUpdateOpcodeAndIpWorker(pVCpu, pFpuCtx);
     
    77707770IEM_STATIC int iemFpuStRegNotEmpty(PVMCPUCC pVCpu, uint8_t iStReg)
    77717771{
    7772     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7772    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    77737773    uint16_t    iReg    = (X86_FSW_TOP_GET(pFpuCtx->FSW) + iStReg) & X86_FSW_TOP_SMASK;
    77747774    if (pFpuCtx->FTW & RT_BIT(iReg))
     
    77807780IEM_STATIC int iemFpuStRegNotEmptyRef(PVMCPUCC pVCpu, uint8_t iStReg, PCRTFLOAT80U *ppRef)
    77817781{
    7782     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7782    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    77837783    uint16_t    iReg    = (X86_FSW_TOP_GET(pFpuCtx->FSW) + iStReg) & X86_FSW_TOP_SMASK;
    77847784    if (pFpuCtx->FTW & RT_BIT(iReg))
     
    77947794                                        uint8_t iStReg1, PCRTFLOAT80U *ppRef1)
    77957795{
    7796     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7796    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    77977797    uint16_t    iTop    = X86_FSW_TOP_GET(pFpuCtx->FSW);
    77987798    uint16_t    iReg0   = (iTop + iStReg0) & X86_FSW_TOP_SMASK;
     
    78107810IEM_STATIC int iemFpu2StRegsNotEmptyRefFirst(PVMCPUCC pVCpu, uint8_t iStReg0, PCRTFLOAT80U *ppRef0, uint8_t iStReg1)
    78117811{
    7812     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     7812    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    78137813    uint16_t    iTop    = X86_FSW_TOP_GET(pFpuCtx->FSW);
    78147814    uint16_t    iReg0   = (iTop + iStReg0) & X86_FSW_TOP_SMASK;
     
    95989598    /** @todo testcase: Ordering of \#SS(0) vs \#GP() vs \#PF on SSE stuff. */
    95999599    if (   (GCPtrMem & 15)
    9600         && !(pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     9600        && !(pVCpu->cpum.GstCtx.XState.x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    96019601        return iemRaiseGeneralProtectionFault0(pVCpu);
    96029602
     
    96319631    /** @todo testcase: Ordering of \#SS(0) vs \#GP() vs \#PF on SSE stuff. */
    96329632    if (   (GCPtrMem & 15) == 0
    9633         || (pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     9633        || (pVCpu->cpum.GstCtx.XState.x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    96349634    {
    96359635        PCRTUINT128U pu128Src = (PCRTUINT128U)iemMemMapJmp(pVCpu, sizeof(*pu128Src), iSegReg, GCPtrMem, IEM_ACCESS_DATA_R);
     
    1007410074    /* The lazy approach for now... */
    1007510075    if (   (GCPtrMem & 15)
    10076         && !(pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     10076        && !(pVCpu->cpum.GstCtx.XState.x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    1007710077        return iemRaiseGeneralProtectionFault0(pVCpu);
    1007810078
     
    1010510105    /* The lazy approach for now... */
    1010610106    if (   (GCPtrMem & 15) == 0
    10107         || (pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     10107        || (pVCpu->cpum.GstCtx.XState.x87.MXCSR & X86_MXCSR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    1010810108    {
    1010910109        PRTUINT128U pu128Dst = (PRTUINT128U)iemMemMapJmp(pVCpu, sizeof(*pu128Dst), iSegReg, GCPtrMem, IEM_ACCESS_DATA_W);
     
    1110111101#define IEM_MC_MAYBE_RAISE_FPU_XCPT() \
    1110211102    do { \
    11103         if (pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FSW & X86_FSW_ES) \
     11103        if (pVCpu->cpum.GstCtx.XState.x87.FSW & X86_FSW_ES) \
    1110411104            return iemRaiseMathFault(pVCpu); \
    1110511105    } while (0)
     
    1125511255#define IEM_MC_FETCH_EFLAGS(a_EFlags)                   (a_EFlags) = pVCpu->cpum.GstCtx.eflags.u
    1125611256#define IEM_MC_FETCH_EFLAGS_U8(a_EFlags)                (a_EFlags) = (uint8_t)pVCpu->cpum.GstCtx.eflags.u
    11257 #define IEM_MC_FETCH_FSW(a_u16Fsw)                      (a_u16Fsw) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FSW
    11258 #define IEM_MC_FETCH_FCW(a_u16Fcw)                      (a_u16Fcw) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FCW
     11257#define IEM_MC_FETCH_FSW(a_u16Fsw)                      (a_u16Fsw) = pVCpu->cpum.GstCtx.XState.x87.FSW
     11258#define IEM_MC_FETCH_FCW(a_u16Fcw)                      (a_u16Fcw) = pVCpu->cpum.GstCtx.XState.x87.FCW
    1125911259
    1126011260#define IEM_MC_STORE_GREG_U8(a_iGReg, a_u8Value)        *iemGRegRefU8( pVCpu, (a_iGReg)) = (a_u8Value)
     
    1127811278    } while (0)
    1127911279#define IEM_MC_STORE_FPUREG_R80_SRC_REF(a_iSt, a_pr80Src) \
    11280     do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[a_iSt].r80 = *(a_pr80Src); } while (0)
     11280    do { pVCpu->cpum.GstCtx.XState.x87.aRegs[a_iSt].r80 = *(a_pr80Src); } while (0)
    1128111281
    1128211282
     
    1137211372#define IEM_MC_FLIP_EFL_BIT(a_fBit)                     do { pVCpu->cpum.GstCtx.eflags.u ^= (a_fBit); } while (0)
    1137311373
    11374 #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)
     11374#define IEM_MC_CLEAR_FSW_EX()   do { pVCpu->cpum.GstCtx.XState.x87.FSW &= X86_FSW_C_MASK | X86_FSW_TOP_MASK; } while (0)
    1137511375
    1137611376/** Switches the FPU state to MMX mode (FSW.TOS=0, FTW=0) if necessary. */
    1137711377#define IEM_MC_FPU_TO_MMX_MODE() do { \
    11378         pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FSW &= ~X86_FSW_TOP_MASK; \
    11379         pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FTW  = 0xff; \
     11378        pVCpu->cpum.GstCtx.XState.x87.FSW &= ~X86_FSW_TOP_MASK; \
     11379        pVCpu->cpum.GstCtx.XState.x87.FTW  = 0xff; \
    1138011380    } while (0)
    1138111381
    1138211382/** Switches the FPU state from MMX mode (FTW=0xffff). */
    1138311383#define IEM_MC_FPU_FROM_MMX_MODE() do { \
    11384         pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FTW  = 0; \
     11384        pVCpu->cpum.GstCtx.XState.x87.FTW  = 0; \
    1138511385    } while (0)
    1138611386
    1138711387#define IEM_MC_FETCH_MREG_U64(a_u64Value, a_iMReg) \
    11388     do { (a_u64Value) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx; } while (0)
     11388    do { (a_u64Value) = pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].mmx; } while (0)
    1138911389#define IEM_MC_FETCH_MREG_U32(a_u32Value, a_iMReg) \
    11390     do { (a_u32Value) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[0]; } while (0)
     11390    do { (a_u32Value) = pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au32[0]; } while (0)
    1139111391#define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) do { \
    11392         pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (a_u64Value); \
    11393         pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \
     11392        pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].mmx = (a_u64Value); \
     11393        pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \
    1139411394    } while (0)
    1139511395#define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value) do { \
    11396         pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); \
    11397         pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \
     11396        pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); \
     11397        pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \
    1139811398    } while (0)
    1139911399#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) */ \
    11400         (a_pu64Dst) = (&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
     11400        (a_pu64Dst) = (&pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].mmx)
    1140111401#define IEM_MC_REF_MREG_U64_CONST(a_pu64Dst, a_iMReg) \
    11402         (a_pu64Dst) = ((uint64_t const *)&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
     11402        (a_pu64Dst) = ((uint64_t const *)&pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].mmx)
    1140311403#define IEM_MC_REF_MREG_U32_CONST(a_pu32Dst, a_iMReg) \
    11404         (a_pu32Dst) = ((uint32_t const *)&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
     11404        (a_pu32Dst) = ((uint32_t const *)&pVCpu->cpum.GstCtx.XState.x87.aRegs[(a_iMReg)].mmx)
    1140511405
    1140611406#define IEM_MC_FETCH_XREG_U128(a_u128Value, a_iXReg) \
    11407     do { (a_u128Value).au64[0] = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0]; \
    11408          (a_u128Value).au64[1] = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1]; \
     11407    do { (a_u128Value).au64[0] = pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[0]; \
     11408         (a_u128Value).au64[1] = pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[1]; \
    1140911409    } while (0)
    1141011410#define IEM_MC_FETCH_XREG_U64(a_u64Value, a_iXReg) \
    11411     do { (a_u64Value) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0]; } while (0)
     11411    do { (a_u64Value) = pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[0]; } while (0)
    1141211412#define IEM_MC_FETCH_XREG_U32(a_u32Value, a_iXReg) \
    11413     do { (a_u32Value) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au32[0]; } while (0)
     11413    do { (a_u32Value) = pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[0]; } while (0)
    1141411414#define IEM_MC_FETCH_XREG_HI_U64(a_u64Value, a_iXReg) \
    11415     do { (a_u64Value) = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1]; } while (0)
     11415    do { (a_u64Value) = pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[1]; } while (0)
    1141611416#define IEM_MC_STORE_XREG_U128(a_iXReg, a_u128Value) \
    11417     do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (a_u128Value).au64[0]; \
    11418          pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = (a_u128Value).au64[1]; \
     11417    do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[0] = (a_u128Value).au64[0]; \
     11418         pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[1] = (a_u128Value).au64[1]; \
    1141911419    } while (0)
    1142011420#define IEM_MC_STORE_XREG_U64(a_iXReg, a_u64Value) \
    11421     do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); } while (0)
     11421    do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); } while (0)
    1142211422#define IEM_MC_STORE_XREG_U64_ZX_U128(a_iXReg, a_u64Value) \
    11423     do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); \
    11424          pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = 0; \
     11423    do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); \
     11424         pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[1] = 0; \
    1142511425    } while (0)
    1142611426#define IEM_MC_STORE_XREG_U32(a_iXReg, a_u32Value) \
    11427     do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au32[0] = (a_u32Value); } while (0)
     11427    do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[0] = (a_u32Value); } while (0)
    1142811428#define IEM_MC_STORE_XREG_U32_ZX_U128(a_iXReg, a_u32Value) \
    11429     do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0] = (uint32_t)(a_u32Value); \
    11430          pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = 0; \
     11429    do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[0] = (uint32_t)(a_u32Value); \
     11430         pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[1] = 0; \
    1143111431    } while (0)
    1143211432#define IEM_MC_STORE_XREG_HI_U64(a_iXReg, a_u64Value) \
    11433     do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = (a_u64Value); } while (0)
     11433    do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[1] = (a_u64Value); } while (0)
    1143411434#define IEM_MC_REF_XREG_U128(a_pu128Dst, a_iXReg)       \
    11435     (a_pu128Dst) = (&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].uXmm)
     11435    (a_pu128Dst) = (&pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].uXmm)
    1143611436#define IEM_MC_REF_XREG_U128_CONST(a_pu128Dst, a_iXReg) \
    11437     (a_pu128Dst) = ((PCRTUINT128U)&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].uXmm)
     11437    (a_pu128Dst) = ((PCRTUINT128U)&pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].uXmm)
    1143811438#define IEM_MC_REF_XREG_U64_CONST(a_pu64Dst, a_iXReg) \
    11439     (a_pu64Dst) = ((uint64_t const *)&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[0])
     11439    (a_pu64Dst) = ((uint64_t const *)&pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[0])
    1144011440#define IEM_MC_COPY_XREG_U128(a_iXRegDst, a_iXRegSrc) \
    11441     do { pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXRegDst)].au64[0] \
    11442             = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXRegSrc)].au64[0]; \
    11443          pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXRegDst)].au64[1] \
    11444             = pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aXMM[(a_iXRegSrc)].au64[1]; \
     11441    do { pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXRegDst)].au64[0] \
     11442            = pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXRegSrc)].au64[0]; \
     11443         pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXRegDst)].au64[1] \
     11444            = pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXRegSrc)].au64[1]; \
    1144511445    } while (0)
    1144611446
    1144711447#define IEM_MC_FETCH_YREG_U32(a_u32Dst, a_iYRegSrc) \
    11448     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11449          uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
    11450          (a_u32Dst) = pXStateTmp->x87.aXMM[iYRegSrcTmp].au32[0]; \
     11448    do { uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
     11449         (a_u32Dst) = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcTmp].au32[0]; \
    1145111450    } while (0)
    1145211451#define IEM_MC_FETCH_YREG_U64(a_u64Dst, a_iYRegSrc) \
    11453     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11454          uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
    11455          (a_u64Dst) = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[0]; \
     11452    do { uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
     11453         (a_u64Dst) = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcTmp].au64[0]; \
    1145611454    } while (0)
    1145711455#define IEM_MC_FETCH_YREG_U128(a_u128Dst, a_iYRegSrc) \
    11458     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11459          uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
    11460          (a_u128Dst).au64[0] = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[0]; \
    11461          (a_u128Dst).au64[1] = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[1]; \
     11456    do { uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
     11457         (a_u128Dst).au64[0] = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcTmp].au64[0]; \
     11458         (a_u128Dst).au64[1] = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcTmp].au64[1]; \
    1146211459    } while (0)
    1146311460#define IEM_MC_FETCH_YREG_U256(a_u256Dst, a_iYRegSrc) \
    11464     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11465          uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
    11466          (a_u256Dst).au64[0] = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[0]; \
    11467          (a_u256Dst).au64[1] = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[1]; \
    11468          (a_u256Dst).au64[2] = pXStateTmp->u.YmmHi.aYmmHi[iYRegSrcTmp].au64[0]; \
    11469          (a_u256Dst).au64[3] = pXStateTmp->u.YmmHi.aYmmHi[iYRegSrcTmp].au64[1]; \
     11461    do { uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
     11462         (a_u256Dst).au64[0] = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcTmp].au64[0]; \
     11463         (a_u256Dst).au64[1] = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcTmp].au64[1]; \
     11464         (a_u256Dst).au64[2] = pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegSrcTmp].au64[0]; \
     11465         (a_u256Dst).au64[3] = pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegSrcTmp].au64[1]; \
    1147011466    } while (0)
    1147111467
    11472 #define IEM_MC_INT_CLEAR_ZMM_256_UP(a_pXState, a_iXRegDst) do { /* For AVX512 and AVX1024 support. */ } while (0)
     11468#define IEM_MC_INT_CLEAR_ZMM_256_UP(a_iXRegDst) do { /* For AVX512 and AVX1024 support. */ } while (0)
    1147311469#define IEM_MC_STORE_YREG_U32_ZX_VLMAX(a_iYRegDst, a_u32Src) \
    11474     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11475          uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    11476          pXStateTmp->x87.aXMM[iYRegDstTmp].au32[0]       = (a_u32Src); \
    11477          pXStateTmp->x87.aXMM[iYRegDstTmp].au32[1]       = 0; \
    11478          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[1]       = 0; \
    11479          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
    11480          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
    11481          IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, iYRegDstTmp); \
     11470    do { uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     11471         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au32[0]       = (a_u32Src); \
     11472         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au32[1]       = 0; \
     11473         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[1]       = 0; \
     11474         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
     11475         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
     11476         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegDstTmp); \
    1148211477    } while (0)
    1148311478#define IEM_MC_STORE_YREG_U64_ZX_VLMAX(a_iYRegDst, a_u64Src) \
    11484     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11485          uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    11486          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[0]       = (a_u64Src); \
    11487          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[1]       = 0; \
    11488          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
    11489          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
    11490          IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, iYRegDstTmp); \
     11479    do { uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     11480         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[0]       = (a_u64Src); \
     11481         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[1]       = 0; \
     11482         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
     11483         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
     11484         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegDstTmp); \
    1149111485    } while (0)
    1149211486#define IEM_MC_STORE_YREG_U128_ZX_VLMAX(a_iYRegDst, a_u128Src) \
    11493     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11494          uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    11495          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[0]       = (a_u128Src).au64[0]; \
    11496          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[1]       = (a_u128Src).au64[1]; \
    11497          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
    11498          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
    11499          IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, iYRegDstTmp); \
     11487    do { uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     11488         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[0]       = (a_u128Src).au64[0]; \
     11489         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[1]       = (a_u128Src).au64[1]; \
     11490         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
     11491         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
     11492         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegDstTmp); \
    1150011493    } while (0)
    1150111494#define IEM_MC_STORE_YREG_U256_ZX_VLMAX(a_iYRegDst, a_u256Src) \
    11502     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11503          uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    11504          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[0]       = (a_u256Src).au64[0]; \
    11505          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[1]       = (a_u256Src).au64[1]; \
    11506          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = (a_u256Src).au64[2]; \
    11507          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = (a_u256Src).au64[3]; \
    11508          IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, iYRegDstTmp); \
     11495    do { uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     11496         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[0]       = (a_u256Src).au64[0]; \
     11497         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[1]       = (a_u256Src).au64[1]; \
     11498         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = (a_u256Src).au64[2]; \
     11499         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = (a_u256Src).au64[3]; \
     11500         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegDstTmp); \
    1150911501    } while (0)
    1151011502
    1151111503#define IEM_MC_REF_YREG_U128(a_pu128Dst, a_iYReg)       \
    11512     (a_pu128Dst) = (&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aYMM[(a_iYReg)].uXmm)
     11504    (a_pu128Dst) = (&pVCpu->cpum.GstCtx.XState.x87.aYMM[(a_iYReg)].uXmm)
    1151311505#define IEM_MC_REF_YREG_U128_CONST(a_pu128Dst, a_iYReg) \
    11514     (a_pu128Dst) = ((PCRTUINT128U)&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aYMM[(a_iYReg)].uXmm)
     11506    (a_pu128Dst) = ((PCRTUINT128U)&pVCpu->cpum.GstCtx.XState.x87.aYMM[(a_iYReg)].uXmm)
    1151511507#define IEM_MC_REF_YREG_U64_CONST(a_pu64Dst, a_iYReg) \
    11516     (a_pu64Dst) = ((uint64_t const *)&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.aYMM[(a_iYReg)].au64[0])
     11508    (a_pu64Dst) = ((uint64_t const *)&pVCpu->cpum.GstCtx.XState.x87.aYMM[(a_iYReg)].au64[0])
    1151711509#define IEM_MC_CLEAR_YREG_128_UP(a_iYReg) \
    11518     do { PX86XSAVEAREA   pXStateTmp = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11519          uintptr_t const iYRegTmp   = (a_iYReg); \
    11520          pXStateTmp->u.YmmHi.aYmmHi[iYRegTmp].au64[0] = 0; \
    11521          pXStateTmp->u.YmmHi.aYmmHi[iYRegTmp].au64[1] = 0; \
    11522          IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, iYRegTmp); \
     11510    do { uintptr_t const iYRegTmp   = (a_iYReg); \
     11511         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegTmp].au64[0] = 0; \
     11512         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegTmp].au64[1] = 0; \
     11513         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegTmp); \
    1152311514    } while (0)
    1152411515
    1152511516#define IEM_MC_COPY_YREG_U256_ZX_VLMAX(a_iYRegDst, a_iYRegSrc) \
    11526     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11527          uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     11517    do { uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1152811518         uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
    11529          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[0]       = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[0]; \
    11530          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[1]       = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[1]; \
    11531          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = pXStateTmp->u.YmmHi.aYmmHi[iYRegSrcTmp].au64[0]; \
    11532          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = pXStateTmp->u.YmmHi.aYmmHi[iYRegSrcTmp].au64[1]; \
    11533          IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, iYRegDstTmp); \
     11519         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[0]       = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcTmp].au64[0]; \
     11520         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[1]       = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcTmp].au64[1]; \
     11521         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegSrcTmp].au64[0]; \
     11522         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegSrcTmp].au64[1]; \
     11523         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegDstTmp); \
    1153411524    } while (0)
    1153511525#define IEM_MC_COPY_YREG_U128_ZX_VLMAX(a_iYRegDst, a_iYRegSrc) \
    11536     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11537          uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     11526    do { uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1153811527         uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
    11539          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[0]       = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[0]; \
    11540          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[1]       = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[1]; \
    11541          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
    11542          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
    11543          IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, iYRegDstTmp); \
     11528         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[0]       = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcTmp].au64[0]; \
     11529         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[1]       = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcTmp].au64[1]; \
     11530         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
     11531         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
     11532         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegDstTmp); \
    1154411533    } while (0)
    1154511534#define IEM_MC_COPY_YREG_U64_ZX_VLMAX(a_iYRegDst, a_iYRegSrc) \
    11546     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11547          uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     11535    do { uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1154811536         uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
    11549          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[0]       = pXStateTmp->x87.aXMM[iYRegSrcTmp].au64[0]; \
    11550          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[1]       = 0; \
    11551          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
    11552          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
    11553          IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, iYRegDstTmp); \
     11537         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[0]       = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcTmp].au64[0]; \
     11538         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[1]       = 0; \
     11539         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
     11540         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
     11541         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegDstTmp); \
    1155411542    } while (0)
    1155511543
    1155611544#define IEM_MC_MERGE_YREG_U32_U96_ZX_VLMAX(a_iYRegDst, a_iYRegSrc32, a_iYRegSrcHx) \
    11557     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11558          uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     11545    do { uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1155911546         uintptr_t const iYRegSrc32Tmp  = (a_iYRegSrc32); \
    1156011547         uintptr_t const iYRegSrcHxTmp  = (a_iYRegSrcHx); \
    11561          pXStateTmp->x87.aXMM[iYRegDstTmp].au32[0]       = pXStateTmp->x87.aXMM[iYRegSrc32Tmp].au32[0]; \
    11562          pXStateTmp->x87.aXMM[iYRegDstTmp].au32[1]       = pXStateTmp->x87.aXMM[iYRegSrcHxTmp].au32[1]; \
    11563          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[1]       = pXStateTmp->x87.aXMM[iYRegSrcHxTmp].au64[1]; \
    11564          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
    11565          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
    11566          IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, iYRegDstTmp); \
     11548         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au32[0]       = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrc32Tmp].au32[0]; \
     11549         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au32[1]       = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcHxTmp].au32[1]; \
     11550         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[1]       = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcHxTmp].au64[1]; \
     11551         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
     11552         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
     11553         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegDstTmp); \
    1156711554    } while (0)
    1156811555#define IEM_MC_MERGE_YREG_U64_U64_ZX_VLMAX(a_iYRegDst, a_iYRegSrc64, a_iYRegSrcHx) \
    11569     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11570          uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     11556    do { uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1157111557         uintptr_t const iYRegSrc64Tmp  = (a_iYRegSrc64); \
    1157211558         uintptr_t const iYRegSrcHxTmp  = (a_iYRegSrcHx); \
    11573          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[0]       = pXStateTmp->x87.aXMM[iYRegSrc64Tmp].au64[0]; \
    11574          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[1]       = pXStateTmp->x87.aXMM[iYRegSrcHxTmp].au64[1]; \
    11575          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
    11576          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
    11577          IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, iYRegDstTmp); \
     11559         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[0]       = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrc64Tmp].au64[0]; \
     11560         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[1]       = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcHxTmp].au64[1]; \
     11561         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
     11562         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
     11563         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegDstTmp); \
    1157811564    } while (0)
    1157911565#define IEM_MC_MERGE_YREG_U64HI_U64_ZX_VLMAX(a_iYRegDst, a_iYRegSrc64, a_iYRegSrcHx) /* for vmovhlps */ \
    11580     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11581          uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     11566    do { uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1158211567         uintptr_t const iYRegSrc64Tmp  = (a_iYRegSrc64); \
    1158311568         uintptr_t const iYRegSrcHxTmp  = (a_iYRegSrcHx); \
    11584          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[0]       = pXStateTmp->x87.aXMM[iYRegSrc64Tmp].au64[1]; \
    11585          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[1]       = pXStateTmp->x87.aXMM[iYRegSrcHxTmp].au64[1]; \
    11586          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
    11587          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
    11588          IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, iYRegDstTmp); \
     11569         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[0]       = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrc64Tmp].au64[1]; \
     11570         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[1]       = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcHxTmp].au64[1]; \
     11571         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
     11572         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
     11573         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegDstTmp); \
    1158911574    } while (0)
    1159011575#define IEM_MC_MERGE_YREG_U64LOCAL_U64_ZX_VLMAX(a_iYRegDst, a_u64Local, a_iYRegSrcHx) \
    11591     do { PX86XSAVEAREA   pXStateTmp     = pVCpu->cpum.GstCtx.CTX_SUFF(pXState); \
    11592          uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     11576    do { uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
    1159311577         uintptr_t const iYRegSrcHxTmp  = (a_iYRegSrcHx); \
    11594          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[0]       = (a_u64Local); \
    11595          pXStateTmp->x87.aXMM[iYRegDstTmp].au64[1]       = pXStateTmp->x87.aXMM[iYRegSrcHxTmp].au64[1]; \
    11596          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
    11597          pXStateTmp->u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
    11598          IEM_MC_INT_CLEAR_ZMM_256_UP(pXStateTmp, iYRegDstTmp); \
     11578         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[0]       = (a_u64Local); \
     11579         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[1]       = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcHxTmp].au64[1]; \
     11580         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = 0; \
     11581         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = 0; \
     11582         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegDstTmp); \
    1159911583    } while (0)
    1160011584
     
    1194411928        if (   !(a_u16FSW & X86_FSW_ES) \
    1194511929            || !(  (a_u16FSW & (X86_FSW_UE | X86_FSW_OE | X86_FSW_IE)) \
    11946                  & ~(pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FCW & X86_FCW_MASK_ALL) ) ) \
     11930                 & ~(pVCpu->cpum.GstCtx.XState.x87.FCW & X86_FCW_MASK_ALL) ) ) \
    1194711931            IEM_MC_RETURN_ON_FAILURE(iemMemCommitAndUnmap(pVCpu, (a_pvMem), (a_fAccess))); \
    1194811932    } while (0)
     
    1208412068#define IEM_MC_CALL_FPU_AIMPL_1(a_pfnAImpl, a0) \
    1208512069    do { \
    12086         a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0)); \
     12070        a_pfnAImpl(&pVCpu->cpum.GstCtx.XState.x87, (a0)); \
    1208712071    } while (0)
    1208812072
     
    1209612080#define IEM_MC_CALL_FPU_AIMPL_2(a_pfnAImpl, a0, a1) \
    1209712081    do { \
    12098         a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0), (a1)); \
     12082        a_pfnAImpl(&pVCpu->cpum.GstCtx.XState.x87, (a0), (a1)); \
    1209912083    } while (0)
    1210012084
     
    1210912093#define IEM_MC_CALL_FPU_AIMPL_3(a_pfnAImpl, a0, a1, a2) \
    1211012094    do { \
    12111         a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
     12095        a_pfnAImpl(&pVCpu->cpum.GstCtx.XState.x87, (a0), (a1), (a2)); \
    1211212096    } while (0)
    1211312097
     
    1225112235    do { \
    1225212236        IEM_MC_PREPARE_FPU_USAGE(); \
    12253         a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0), (a1)); \
     12237        a_pfnAImpl(&pVCpu->cpum.GstCtx.XState.x87, (a0), (a1)); \
    1225412238    } while (0)
    1225512239
     
    1226512249    do { \
    1226612250        IEM_MC_PREPARE_FPU_USAGE(); \
    12267         a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
     12251        a_pfnAImpl(&pVCpu->cpum.GstCtx.XState.x87, (a0), (a1), (a2)); \
    1226812252    } while (0)
    1226912253
     
    1227912263    do { \
    1228012264        IEM_MC_PREPARE_SSE_USAGE(); \
    12281         a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0), (a1)); \
     12265        a_pfnAImpl(&pVCpu->cpum.GstCtx.XState.x87, (a0), (a1)); \
    1228212266    } while (0)
    1228312267
     
    1229312277    do { \
    1229412278        IEM_MC_PREPARE_SSE_USAGE(); \
    12295         a_pfnAImpl(&pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87, (a0), (a1), (a2)); \
     12279        a_pfnAImpl(&pVCpu->cpum.GstCtx.XState.x87, (a0), (a1), (a2)); \
    1229612280    } while (0)
    1229712281
     
    1230012284 *  IEM_MC_CALL_AVX_AIMPL_3, IEM_MC_CALL_AVX_AIMPL_4, ... */
    1230112285#define IEM_MC_IMPLICIT_AVX_AIMPL_ARGS() \
    12302     IEM_MC_ARG_CONST(PX86XSAVEAREA, pXState, pVCpu->cpum.GstCtx.CTX_SUFF(pXState), 0)
     12286    IEM_MC_ARG_CONST(PX86XSAVEAREA, pXState, &pVCpu->cpum.GstCtx.XState, 0)
    1230312287
    1230412288/**
     
    1240012384    if (iemFpu2StRegsNotEmptyRefFirst(pVCpu, (a_iSt0), &(a_pr80Dst0), (a_iSt1)) == VINF_SUCCESS) {
    1240112385#define IEM_MC_IF_FCW_IM() \
    12402     if (pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.FCW & X86_FCW_IM) {
     12386    if (pVCpu->cpum.GstCtx.XState.x87.FCW & X86_FCW_IM) {
    1240312387
    1240412388#define IEM_MC_ELSE()                                   } else {
     
    1379413778        }
    1379513779
    13796         PCX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     13780        PCX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    1379713781        Log2(("**** %s\n"
    1379813782              " eax=%08x ebx=%08x ecx=%08x edx=%08x esi=%08x edi=%08x\n"
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r91251 r91281  
    81918191     */
    81928192
    8193     PX86XSAVEAREA pXState = pVCpu->cpum.GstCtx.CTX_SUFF(pXState);
     8193    PX86XSAVEAREA pXState = &pVCpu->cpum.GstCtx.XState;
    81948194    pXState->x87.FCW   = 0x37f;
    81958195    pXState->x87.FSW   = 0;
     
    82468246        return rcStrict;
    82478247    PX86FXSTATE  pDst = (PX86FXSTATE)pvMem512;
    8248     PCX86FXSTATE pSrc = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     8248    PCX86FXSTATE pSrc = &pVCpu->cpum.GstCtx.XState.x87;
    82498249
    82508250    /*
     
    83508350        return rcStrict;
    83518351    PCX86FXSTATE pSrc = (PCX86FXSTATE)pvMem512;
    8352     PX86FXSTATE  pDst = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     8352    PX86FXSTATE  pDst = &pVCpu->cpum.GstCtx.XState.x87;
    83538353
    83548354    /*
     
    84848484        return rcStrict;
    84858485    PX86FXSTATE  pDst = (PX86FXSTATE)pvMem512;
    8486     PCX86FXSTATE pSrc = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     8486    PCX86FXSTATE pSrc = &pVCpu->cpum.GstCtx.XState.x87;
    84878487
    84888488    /* The header.  */
     
    86408640        return rcStrict;
    86418641    PCX86FXSTATE pSrc = (PCX86FXSTATE)pvMem512;
    8642     PX86FXSTATE  pDst = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     8642    PX86FXSTATE  pDst = &pVCpu->cpum.GstCtx.XState.x87;
    86438643
    86448644    /*
    86458645     * Calc the requested mask
    86468646     */
    8647     PX86XSAVEHDR  pHdrDst = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->Hdr;
     8647    PX86XSAVEHDR  pHdrDst = &pVCpu->cpum.GstCtx.XState.Hdr;
    86488648    PCX86XSAVEHDR pHdrSrc;
    86498649    rcStrict = iemMemMap(pVCpu, (void **)&pHdrSrc, sizeof(&pHdrSrc), iEffSeg, GCPtrEff + 512, IEM_ACCESS_DATA_R);
     
    88238823             * Do the job.
    88248824             */
    8825             VBOXSTRICTRC rcStrict = iemMemStoreDataU32(pVCpu, iEffSeg, GCPtrEff, pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.MXCSR);
     8825            VBOXSTRICTRC rcStrict = iemMemStoreDataU32(pVCpu, iEffSeg, GCPtrEff, pVCpu->cpum.GstCtx.XState.x87.MXCSR);
    88268826            if (rcStrict == VINF_SUCCESS)
    88278827            {
     
    88598859             * Do the job.
    88608860             */
    8861             VBOXSTRICTRC rcStrict = iemMemStoreDataU32(pVCpu, iEffSeg, GCPtrEff, pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.MXCSR);
     8861            VBOXSTRICTRC rcStrict = iemMemStoreDataU32(pVCpu, iEffSeg, GCPtrEff, pVCpu->cpum.GstCtx.XState.x87.MXCSR);
    88628862            if (rcStrict == VINF_SUCCESS)
    88638863            {
     
    89028902                if (!(fNewMxCsr & ~fMxCsrMask))
    89038903                {
    8904                     pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87.MXCSR = fNewMxCsr;
     8904                    pVCpu->cpum.GstCtx.XState.x87.MXCSR = fNewMxCsr;
    89058905                    iemRegAddToRipAndClearRF(pVCpu, cbInstr);
    89068906                    return VINF_SUCCESS;
     
    89288928{
    89298929    IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_CR0 | CPUMCTX_EXTRN_X87);
    8930     PCX86FXSTATE pSrcX87 = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     8930    PCX86FXSTATE pSrcX87 = &pVCpu->cpum.GstCtx.XState.x87;
    89318931    if (enmEffOpSize == IEMMODE_16BIT)
    89328932    {
     
    89938993{
    89948994    IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_CR0 | CPUMCTX_EXTRN_X87);
    8995     PX86FXSTATE pDstX87 = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     8995    PX86FXSTATE pDstX87 = &pVCpu->cpum.GstCtx.XState.x87;
    89968996    if (enmEffOpSize == IEMMODE_16BIT)
    89978997    {
     
    90999099        return rcStrict;
    91009100
    9101     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     9101    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    91029102    iemCImplCommonFpuStoreEnv(pVCpu, enmEffOpSize, uPtr);
    91039103    PRTFLOAT80U paRegs = (PRTFLOAT80U)(uPtr.pu8 + (enmEffOpSize == IEMMODE_16BIT ? 14 : 28));
     
    91759175        return rcStrict;
    91769176
    9177     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     9177    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    91789178    iemCImplCommonFpuRestoreEnv(pVCpu, enmEffOpSize, uPtr);
    91799179    PCRTFLOAT80U paRegs = (PCRTFLOAT80U)(uPtr.pu8 + (enmEffOpSize == IEMMODE_16BIT ? 14 : 28));
     
    92109210    /** @todo Testcase: Test that it raises and loweres the FPU exception bits
    92119211     *        according to FSW. (This is was is currently implemented.) */
    9212     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     9212    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    92139213    pFpuCtx->FCW = u16Fcw & ~X86_FCW_ZERO_MASK;
    92149214    iemFpuRecalcExceptionStatus(pFpuCtx);
     
    92319231    IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_CR0 | CPUMCTX_EXTRN_X87);
    92329232
    9233     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     9233    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    92349234    unsigned const iReg1 = X86_FSW_TOP_GET(pFpuCtx->FSW);
    92359235    unsigned const iReg2 = (iReg1 + iStReg) & X86_FSW_TOP_SMASK;
     
    92879287        return iemRaiseDeviceNotAvailable(pVCpu);
    92889288
    9289     PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.CTX_SUFF(pXState)->x87;
     9289    PX86FXSTATE pFpuCtx = &pVCpu->cpum.GstCtx.XState.x87;
    92909290    uint16_t u16Fsw = pFpuCtx->FSW;
    92919291    if (u16Fsw & X86_FSW_ES)
  • trunk/src/VBox/VMM/VMMAll/NEMAllNativeTemplate-win.cpp.h

    r88745 r91281  
    303303    if (fWhat & CPUMCTX_EXTRN_X87)
    304304    {
    305         ADD_REG128(WHvX64RegisterFpMmx0, pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[0].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[0].au64[1]);
    306         ADD_REG128(WHvX64RegisterFpMmx1, pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[1].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[1].au64[1]);
    307         ADD_REG128(WHvX64RegisterFpMmx2, pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[2].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[2].au64[1]);
    308         ADD_REG128(WHvX64RegisterFpMmx3, pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[3].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[3].au64[1]);
    309         ADD_REG128(WHvX64RegisterFpMmx4, pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[4].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[4].au64[1]);
    310         ADD_REG128(WHvX64RegisterFpMmx5, pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[5].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[5].au64[1]);
    311         ADD_REG128(WHvX64RegisterFpMmx6, pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[6].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[6].au64[1]);
    312         ADD_REG128(WHvX64RegisterFpMmx7, pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[7].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[7].au64[1]);
     305        ADD_REG128(WHvX64RegisterFpMmx0, pVCpu->cpum.GstCtx.XState.x87.aRegs[0].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[0].au64[1]);
     306        ADD_REG128(WHvX64RegisterFpMmx1, pVCpu->cpum.GstCtx.XState.x87.aRegs[1].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[1].au64[1]);
     307        ADD_REG128(WHvX64RegisterFpMmx2, pVCpu->cpum.GstCtx.XState.x87.aRegs[2].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[2].au64[1]);
     308        ADD_REG128(WHvX64RegisterFpMmx3, pVCpu->cpum.GstCtx.XState.x87.aRegs[3].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[3].au64[1]);
     309        ADD_REG128(WHvX64RegisterFpMmx4, pVCpu->cpum.GstCtx.XState.x87.aRegs[4].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[4].au64[1]);
     310        ADD_REG128(WHvX64RegisterFpMmx5, pVCpu->cpum.GstCtx.XState.x87.aRegs[5].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[5].au64[1]);
     311        ADD_REG128(WHvX64RegisterFpMmx6, pVCpu->cpum.GstCtx.XState.x87.aRegs[6].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[6].au64[1]);
     312        ADD_REG128(WHvX64RegisterFpMmx7, pVCpu->cpum.GstCtx.XState.x87.aRegs[7].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[7].au64[1]);
    313313
    314314        aenmNames[iReg] = WHvX64RegisterFpControlStatus;
    315         aValues[iReg].FpControlStatus.FpControl = pVCpu->cpum.GstCtx.pXStateR3->x87.FCW;
    316         aValues[iReg].FpControlStatus.FpStatus  = pVCpu->cpum.GstCtx.pXStateR3->x87.FSW;
    317         aValues[iReg].FpControlStatus.FpTag     = pVCpu->cpum.GstCtx.pXStateR3->x87.FTW;
    318         aValues[iReg].FpControlStatus.Reserved  = pVCpu->cpum.GstCtx.pXStateR3->x87.FTW >> 8;
    319         aValues[iReg].FpControlStatus.LastFpOp  = pVCpu->cpum.GstCtx.pXStateR3->x87.FOP;
    320         aValues[iReg].FpControlStatus.LastFpRip = (pVCpu->cpum.GstCtx.pXStateR3->x87.FPUIP)
    321                                                 | ((uint64_t)pVCpu->cpum.GstCtx.pXStateR3->x87.CS << 32)
    322                                                 | ((uint64_t)pVCpu->cpum.GstCtx.pXStateR3->x87.Rsrvd1 << 48);
     315        aValues[iReg].FpControlStatus.FpControl = pVCpu->cpum.GstCtx.XState.x87.FCW;
     316        aValues[iReg].FpControlStatus.FpStatus  = pVCpu->cpum.GstCtx.XState.x87.FSW;
     317        aValues[iReg].FpControlStatus.FpTag     = pVCpu->cpum.GstCtx.XState.x87.FTW;
     318        aValues[iReg].FpControlStatus.Reserved  = pVCpu->cpum.GstCtx.XState.x87.FTW >> 8;
     319        aValues[iReg].FpControlStatus.LastFpOp  = pVCpu->cpum.GstCtx.XState.x87.FOP;
     320        aValues[iReg].FpControlStatus.LastFpRip = (pVCpu->cpum.GstCtx.XState.x87.FPUIP)
     321                                                | ((uint64_t)pVCpu->cpum.GstCtx.XState.x87.CS << 32)
     322                                                | ((uint64_t)pVCpu->cpum.GstCtx.XState.x87.Rsrvd1 << 48);
    323323        iReg++;
    324324
    325325        aenmNames[iReg] = WHvX64RegisterXmmControlStatus;
    326         aValues[iReg].XmmControlStatus.LastFpRdp            = (pVCpu->cpum.GstCtx.pXStateR3->x87.FPUDP)
    327                                                             | ((uint64_t)pVCpu->cpum.GstCtx.pXStateR3->x87.DS << 32)
    328                                                             | ((uint64_t)pVCpu->cpum.GstCtx.pXStateR3->x87.Rsrvd2 << 48);
    329         aValues[iReg].XmmControlStatus.XmmStatusControl     = pVCpu->cpum.GstCtx.pXStateR3->x87.MXCSR;
    330         aValues[iReg].XmmControlStatus.XmmStatusControlMask = pVCpu->cpum.GstCtx.pXStateR3->x87.MXCSR_MASK; /** @todo ??? (Isn't this an output field?) */
     326        aValues[iReg].XmmControlStatus.LastFpRdp            = (pVCpu->cpum.GstCtx.XState.x87.FPUDP)
     327                                                            | ((uint64_t)pVCpu->cpum.GstCtx.XState.x87.DS << 32)
     328                                                            | ((uint64_t)pVCpu->cpum.GstCtx.XState.x87.Rsrvd2 << 48);
     329        aValues[iReg].XmmControlStatus.XmmStatusControl     = pVCpu->cpum.GstCtx.XState.x87.MXCSR;
     330        aValues[iReg].XmmControlStatus.XmmStatusControlMask = pVCpu->cpum.GstCtx.XState.x87.MXCSR_MASK; /** @todo ??? (Isn't this an output field?) */
    331331        iReg++;
    332332    }
     
    335335    if (fWhat & CPUMCTX_EXTRN_SSE_AVX)
    336336    {
    337         ADD_REG128(WHvX64RegisterXmm0,  pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 0].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 0].uXmm.s.Hi);
    338         ADD_REG128(WHvX64RegisterXmm1,  pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 1].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 1].uXmm.s.Hi);
    339         ADD_REG128(WHvX64RegisterXmm2,  pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 2].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 2].uXmm.s.Hi);
    340         ADD_REG128(WHvX64RegisterXmm3,  pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 3].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 3].uXmm.s.Hi);
    341         ADD_REG128(WHvX64RegisterXmm4,  pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 4].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 4].uXmm.s.Hi);
    342         ADD_REG128(WHvX64RegisterXmm5,  pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 5].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 5].uXmm.s.Hi);
    343         ADD_REG128(WHvX64RegisterXmm6,  pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 6].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 6].uXmm.s.Hi);
    344         ADD_REG128(WHvX64RegisterXmm7,  pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 7].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 7].uXmm.s.Hi);
    345         ADD_REG128(WHvX64RegisterXmm8,  pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 8].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 8].uXmm.s.Hi);
    346         ADD_REG128(WHvX64RegisterXmm9,  pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 9].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 9].uXmm.s.Hi);
    347         ADD_REG128(WHvX64RegisterXmm10, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[10].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[10].uXmm.s.Hi);
    348         ADD_REG128(WHvX64RegisterXmm11, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[11].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[11].uXmm.s.Hi);
    349         ADD_REG128(WHvX64RegisterXmm12, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[12].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[12].uXmm.s.Hi);
    350         ADD_REG128(WHvX64RegisterXmm13, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[13].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[13].uXmm.s.Hi);
    351         ADD_REG128(WHvX64RegisterXmm14, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[14].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[14].uXmm.s.Hi);
    352         ADD_REG128(WHvX64RegisterXmm15, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[15].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[15].uXmm.s.Hi);
     337        ADD_REG128(WHvX64RegisterXmm0,  pVCpu->cpum.GstCtx.XState.x87.aXMM[ 0].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 0].uXmm.s.Hi);
     338        ADD_REG128(WHvX64RegisterXmm1,  pVCpu->cpum.GstCtx.XState.x87.aXMM[ 1].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 1].uXmm.s.Hi);
     339        ADD_REG128(WHvX64RegisterXmm2,  pVCpu->cpum.GstCtx.XState.x87.aXMM[ 2].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 2].uXmm.s.Hi);
     340        ADD_REG128(WHvX64RegisterXmm3,  pVCpu->cpum.GstCtx.XState.x87.aXMM[ 3].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 3].uXmm.s.Hi);
     341        ADD_REG128(WHvX64RegisterXmm4,  pVCpu->cpum.GstCtx.XState.x87.aXMM[ 4].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 4].uXmm.s.Hi);
     342        ADD_REG128(WHvX64RegisterXmm5,  pVCpu->cpum.GstCtx.XState.x87.aXMM[ 5].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 5].uXmm.s.Hi);
     343        ADD_REG128(WHvX64RegisterXmm6,  pVCpu->cpum.GstCtx.XState.x87.aXMM[ 6].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 6].uXmm.s.Hi);
     344        ADD_REG128(WHvX64RegisterXmm7,  pVCpu->cpum.GstCtx.XState.x87.aXMM[ 7].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 7].uXmm.s.Hi);
     345        ADD_REG128(WHvX64RegisterXmm8,  pVCpu->cpum.GstCtx.XState.x87.aXMM[ 8].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 8].uXmm.s.Hi);
     346        ADD_REG128(WHvX64RegisterXmm9,  pVCpu->cpum.GstCtx.XState.x87.aXMM[ 9].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 9].uXmm.s.Hi);
     347        ADD_REG128(WHvX64RegisterXmm10, pVCpu->cpum.GstCtx.XState.x87.aXMM[10].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[10].uXmm.s.Hi);
     348        ADD_REG128(WHvX64RegisterXmm11, pVCpu->cpum.GstCtx.XState.x87.aXMM[11].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[11].uXmm.s.Hi);
     349        ADD_REG128(WHvX64RegisterXmm12, pVCpu->cpum.GstCtx.XState.x87.aXMM[12].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[12].uXmm.s.Hi);
     350        ADD_REG128(WHvX64RegisterXmm13, pVCpu->cpum.GstCtx.XState.x87.aXMM[13].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[13].uXmm.s.Hi);
     351        ADD_REG128(WHvX64RegisterXmm14, pVCpu->cpum.GstCtx.XState.x87.aXMM[14].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[14].uXmm.s.Hi);
     352        ADD_REG128(WHvX64RegisterXmm15, pVCpu->cpum.GstCtx.XState.x87.aXMM[15].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[15].uXmm.s.Hi);
    353353    }
    354354
     
    922922    if (fWhat & CPUMCTX_EXTRN_X87)
    923923    {
    924         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[0].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[0].au64[1], WHvX64RegisterFpMmx0);
    925         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[1].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[1].au64[1], WHvX64RegisterFpMmx1);
    926         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[2].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[2].au64[1], WHvX64RegisterFpMmx2);
    927         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[3].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[3].au64[1], WHvX64RegisterFpMmx3);
    928         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[4].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[4].au64[1], WHvX64RegisterFpMmx4);
    929         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[5].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[5].au64[1], WHvX64RegisterFpMmx5);
    930         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[6].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[6].au64[1], WHvX64RegisterFpMmx6);
    931         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[7].au64[0], pVCpu->cpum.GstCtx.pXStateR3->x87.aRegs[7].au64[1], WHvX64RegisterFpMmx7);
     924        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aRegs[0].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[0].au64[1], WHvX64RegisterFpMmx0);
     925        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aRegs[1].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[1].au64[1], WHvX64RegisterFpMmx1);
     926        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aRegs[2].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[2].au64[1], WHvX64RegisterFpMmx2);
     927        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aRegs[3].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[3].au64[1], WHvX64RegisterFpMmx3);
     928        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aRegs[4].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[4].au64[1], WHvX64RegisterFpMmx4);
     929        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aRegs[5].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[5].au64[1], WHvX64RegisterFpMmx5);
     930        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aRegs[6].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[6].au64[1], WHvX64RegisterFpMmx6);
     931        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aRegs[7].au64[0], pVCpu->cpum.GstCtx.XState.x87.aRegs[7].au64[1], WHvX64RegisterFpMmx7);
    932932
    933933        Assert(aenmNames[iReg] == WHvX64RegisterFpControlStatus);
    934         pVCpu->cpum.GstCtx.pXStateR3->x87.FCW        = aValues[iReg].FpControlStatus.FpControl;
    935         pVCpu->cpum.GstCtx.pXStateR3->x87.FSW        = aValues[iReg].FpControlStatus.FpStatus;
    936         pVCpu->cpum.GstCtx.pXStateR3->x87.FTW        = aValues[iReg].FpControlStatus.FpTag
     934        pVCpu->cpum.GstCtx.XState.x87.FCW        = aValues[iReg].FpControlStatus.FpControl;
     935        pVCpu->cpum.GstCtx.XState.x87.FSW        = aValues[iReg].FpControlStatus.FpStatus;
     936        pVCpu->cpum.GstCtx.XState.x87.FTW        = aValues[iReg].FpControlStatus.FpTag
    937937                                        /*| (aValues[iReg].FpControlStatus.Reserved << 8)*/;
    938         pVCpu->cpum.GstCtx.pXStateR3->x87.FOP        = aValues[iReg].FpControlStatus.LastFpOp;
    939         pVCpu->cpum.GstCtx.pXStateR3->x87.FPUIP      = (uint32_t)aValues[iReg].FpControlStatus.LastFpRip;
    940         pVCpu->cpum.GstCtx.pXStateR3->x87.CS         = (uint16_t)(aValues[iReg].FpControlStatus.LastFpRip >> 32);
    941         pVCpu->cpum.GstCtx.pXStateR3->x87.Rsrvd1     = (uint16_t)(aValues[iReg].FpControlStatus.LastFpRip >> 48);
     938        pVCpu->cpum.GstCtx.XState.x87.FOP        = aValues[iReg].FpControlStatus.LastFpOp;
     939        pVCpu->cpum.GstCtx.XState.x87.FPUIP      = (uint32_t)aValues[iReg].FpControlStatus.LastFpRip;
     940        pVCpu->cpum.GstCtx.XState.x87.CS         = (uint16_t)(aValues[iReg].FpControlStatus.LastFpRip >> 32);
     941        pVCpu->cpum.GstCtx.XState.x87.Rsrvd1     = (uint16_t)(aValues[iReg].FpControlStatus.LastFpRip >> 48);
    942942        iReg++;
    943943    }
     
    948948        if (fWhat & CPUMCTX_EXTRN_X87)
    949949        {
    950             pVCpu->cpum.GstCtx.pXStateR3->x87.FPUDP  = (uint32_t)aValues[iReg].XmmControlStatus.LastFpRdp;
    951             pVCpu->cpum.GstCtx.pXStateR3->x87.DS     = (uint16_t)(aValues[iReg].XmmControlStatus.LastFpRdp >> 32);
    952             pVCpu->cpum.GstCtx.pXStateR3->x87.Rsrvd2 = (uint16_t)(aValues[iReg].XmmControlStatus.LastFpRdp >> 48);
    953         }
    954         pVCpu->cpum.GstCtx.pXStateR3->x87.MXCSR      = aValues[iReg].XmmControlStatus.XmmStatusControl;
    955         pVCpu->cpum.GstCtx.pXStateR3->x87.MXCSR_MASK = aValues[iReg].XmmControlStatus.XmmStatusControlMask; /** @todo ??? (Isn't this an output field?) */
     950            pVCpu->cpum.GstCtx.XState.x87.FPUDP  = (uint32_t)aValues[iReg].XmmControlStatus.LastFpRdp;
     951            pVCpu->cpum.GstCtx.XState.x87.DS     = (uint16_t)(aValues[iReg].XmmControlStatus.LastFpRdp >> 32);
     952            pVCpu->cpum.GstCtx.XState.x87.Rsrvd2 = (uint16_t)(aValues[iReg].XmmControlStatus.LastFpRdp >> 48);
     953        }
     954        pVCpu->cpum.GstCtx.XState.x87.MXCSR      = aValues[iReg].XmmControlStatus.XmmStatusControl;
     955        pVCpu->cpum.GstCtx.XState.x87.MXCSR_MASK = aValues[iReg].XmmControlStatus.XmmStatusControlMask; /** @todo ??? (Isn't this an output field?) */
    956956        iReg++;
    957957    }
     
    960960    if (fWhat & CPUMCTX_EXTRN_SSE_AVX)
    961961    {
    962         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 0].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 0].uXmm.s.Hi, WHvX64RegisterXmm0);
    963         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 1].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 1].uXmm.s.Hi, WHvX64RegisterXmm1);
    964         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 2].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 2].uXmm.s.Hi, WHvX64RegisterXmm2);
    965         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 3].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 3].uXmm.s.Hi, WHvX64RegisterXmm3);
    966         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 4].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 4].uXmm.s.Hi, WHvX64RegisterXmm4);
    967         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 5].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 5].uXmm.s.Hi, WHvX64RegisterXmm5);
    968         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 6].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 6].uXmm.s.Hi, WHvX64RegisterXmm6);
    969         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 7].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 7].uXmm.s.Hi, WHvX64RegisterXmm7);
    970         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 8].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 8].uXmm.s.Hi, WHvX64RegisterXmm8);
    971         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 9].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[ 9].uXmm.s.Hi, WHvX64RegisterXmm9);
    972         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[10].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[10].uXmm.s.Hi, WHvX64RegisterXmm10);
    973         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[11].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[11].uXmm.s.Hi, WHvX64RegisterXmm11);
    974         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[12].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[12].uXmm.s.Hi, WHvX64RegisterXmm12);
    975         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[13].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[13].uXmm.s.Hi, WHvX64RegisterXmm13);
    976         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[14].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[14].uXmm.s.Hi, WHvX64RegisterXmm14);
    977         GET_REG128(pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[15].uXmm.s.Lo, pVCpu->cpum.GstCtx.pXStateR3->x87.aXMM[15].uXmm.s.Hi, WHvX64RegisterXmm15);
     962        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[ 0].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 0].uXmm.s.Hi, WHvX64RegisterXmm0);
     963        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[ 1].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 1].uXmm.s.Hi, WHvX64RegisterXmm1);
     964        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[ 2].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 2].uXmm.s.Hi, WHvX64RegisterXmm2);
     965        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[ 3].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 3].uXmm.s.Hi, WHvX64RegisterXmm3);
     966        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[ 4].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 4].uXmm.s.Hi, WHvX64RegisterXmm4);
     967        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[ 5].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 5].uXmm.s.Hi, WHvX64RegisterXmm5);
     968        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[ 6].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 6].uXmm.s.Hi, WHvX64RegisterXmm6);
     969        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[ 7].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 7].uXmm.s.Hi, WHvX64RegisterXmm7);
     970        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[ 8].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 8].uXmm.s.Hi, WHvX64RegisterXmm8);
     971        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[ 9].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[ 9].uXmm.s.Hi, WHvX64RegisterXmm9);
     972        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[10].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[10].uXmm.s.Hi, WHvX64RegisterXmm10);
     973        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[11].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[11].uXmm.s.Hi, WHvX64RegisterXmm11);
     974        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[12].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[12].uXmm.s.Hi, WHvX64RegisterXmm12);
     975        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[13].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[13].uXmm.s.Hi, WHvX64RegisterXmm13);
     976        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[14].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[14].uXmm.s.Hi, WHvX64RegisterXmm14);
     977        GET_REG128(pVCpu->cpum.GstCtx.XState.x87.aXMM[15].uXmm.s.Lo, pVCpu->cpum.GstCtx.XState.x87.aXMM[15].uXmm.s.Hi, WHvX64RegisterXmm15);
    978978    }
    979979
  • trunk/src/VBox/VMM/VMMR0/CPUMR0A.asm

    r87361 r91281  
    264264 %ifdef VBOX_WITH_KERNEL_USING_XMM
    265265        ; Load the guest XMM register values we already saved in HMR0VMXStartVMWrapXMM.
    266         mov     pXState, [pCpumCpu + CPUMCPU.Guest.pXStateR0]
     266        lea     pXState, [pCpumCpu + CPUMCPU.Guest.XState]
    267267        movdqa  xmm0,  [pXState + X86FXSTATE.xmm0]
    268268        movdqa  xmm1,  [pXState + X86FXSTATE.xmm1]
  • trunk/src/VBox/VMM/VMMR0/HMR0.cpp

    r91016 r91281  
    18791879    if (fFlags & HM_DUMP_REG_FLAGS_FPU)
    18801880    {
    1881         PCX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
     1881        PCX86FXSTATE pFpuCtx = &pCtx->XState.x87;
    18821882        Log(("FPU:\n"
    18831883            "FCW=%04x FSW=%04x FTW=%02x\n"
  • trunk/src/VBox/VMM/VMMR0/HMR0A.asm

    r89780 r91281  
    775775
    776776        ; Load the guest state related to the above non-volatile and volatile SSE registers. Trashes rcx, eax and edx.
    777         mov     rcx, [rdi + CPUMCTX.pXStateR0]
     777        lea     rcx, [rdi + CPUMCTX.XState]
    778778  %if %4 = 1 ; manual
    779779        movdqa  xmm0,  [rcx + XMM_OFF_IN_X86FXSTATE + 000h]
     
    944944
    945945        ; Save the guest SSE state related to non-volatile and volatile SSE registers.
    946         mov     rcx, [r8 + CPUMCTX.pXStateR0]
     946        lea     rcx, [r8 + CPUMCTX.XState]
    947947  %if %4 = 1 ; manual
    948948        stmxcsr [rcx + X86FXSTATE.MXCSR]
     
    12391239
    12401240        ; Load the guest state related to the above non-volatile and volatile SSE registers. Trashes rcx, eax and edx.
    1241         mov     rcx, [rsi + VMCPU.cpum.GstCtx + CPUMCTX.pXStateR0]
     1241        lea     rcx, [rsi + VMCPU.cpum.GstCtx + CPUMCTX.XState]
    12421242  %if %4 = 1 ; manual
    12431243        movdqa  xmm0,  [rcx + XMM_OFF_IN_X86FXSTATE + 000h]
     
    14021402 %if %4 != 0
    14031403        ; Save the guest SSE state related to non-volatile and volatile SSE registers.
    1404         mov     rcx, [r8 + CPUMCTX.pXStateR0]
     1404        lea     rcx, [r8 + CPUMCTX.XState]
    14051405  %if %4 = 1 ; manual
    14061406        stmxcsr [rcx + X86FXSTATE.MXCSR]
  • trunk/src/VBox/VMM/VMMR0/NEMR0Native-win.cpp

    r86055 r91281  
    918918        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    919919        pInput->Elements[iReg].Name                      = HvX64RegisterFpMmx0;
    920         pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->pXStateR0->x87.aRegs[0].au64[0];
    921         pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->pXStateR0->x87.aRegs[0].au64[1];
     920        pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->XState.x87.aRegs[0].au64[0];
     921        pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->XState.x87.aRegs[0].au64[1];
    922922        iReg++;
    923923        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    924924        pInput->Elements[iReg].Name                      = HvX64RegisterFpMmx1;
    925         pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->pXStateR0->x87.aRegs[1].au64[0];
    926         pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->pXStateR0->x87.aRegs[1].au64[1];
     925        pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->XState.x87.aRegs[1].au64[0];
     926        pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->XState.x87.aRegs[1].au64[1];
    927927        iReg++;
    928928        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    929929        pInput->Elements[iReg].Name                      = HvX64RegisterFpMmx2;
    930         pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->pXStateR0->x87.aRegs[2].au64[0];
    931         pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->pXStateR0->x87.aRegs[2].au64[1];
     930        pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->XState.x87.aRegs[2].au64[0];
     931        pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->XState.x87.aRegs[2].au64[1];
    932932        iReg++;
    933933        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    934934        pInput->Elements[iReg].Name                      = HvX64RegisterFpMmx3;
    935         pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->pXStateR0->x87.aRegs[3].au64[0];
    936         pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->pXStateR0->x87.aRegs[3].au64[1];
     935        pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->XState.x87.aRegs[3].au64[0];
     936        pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->XState.x87.aRegs[3].au64[1];
    937937        iReg++;
    938938        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    939939        pInput->Elements[iReg].Name                      = HvX64RegisterFpMmx4;
    940         pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->pXStateR0->x87.aRegs[4].au64[0];
    941         pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->pXStateR0->x87.aRegs[4].au64[1];
     940        pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->XState.x87.aRegs[4].au64[0];
     941        pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->XState.x87.aRegs[4].au64[1];
    942942        iReg++;
    943943        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    944944        pInput->Elements[iReg].Name                      = HvX64RegisterFpMmx5;
    945         pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->pXStateR0->x87.aRegs[5].au64[0];
    946         pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->pXStateR0->x87.aRegs[5].au64[1];
     945        pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->XState.x87.aRegs[5].au64[0];
     946        pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->XState.x87.aRegs[5].au64[1];
    947947        iReg++;
    948948        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    949949        pInput->Elements[iReg].Name                      = HvX64RegisterFpMmx6;
    950         pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->pXStateR0->x87.aRegs[6].au64[0];
    951         pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->pXStateR0->x87.aRegs[6].au64[1];
     950        pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->XState.x87.aRegs[6].au64[0];
     951        pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->XState.x87.aRegs[6].au64[1];
    952952        iReg++;
    953953        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    954954        pInput->Elements[iReg].Name                      = HvX64RegisterFpMmx7;
    955         pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->pXStateR0->x87.aRegs[7].au64[0];
    956         pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->pXStateR0->x87.aRegs[7].au64[1];
     955        pInput->Elements[iReg].Value.Fp.AsUINT128.Low64  = pCtx->XState.x87.aRegs[7].au64[0];
     956        pInput->Elements[iReg].Value.Fp.AsUINT128.High64 = pCtx->XState.x87.aRegs[7].au64[1];
    957957        iReg++;
    958958
    959959        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    960960        pInput->Elements[iReg].Name                            = HvX64RegisterFpControlStatus;
    961         pInput->Elements[iReg].Value.FpControlStatus.FpControl = pCtx->pXStateR0->x87.FCW;
    962         pInput->Elements[iReg].Value.FpControlStatus.FpStatus  = pCtx->pXStateR0->x87.FSW;
    963         pInput->Elements[iReg].Value.FpControlStatus.FpTag     = pCtx->pXStateR0->x87.FTW;
    964         pInput->Elements[iReg].Value.FpControlStatus.Reserved  = pCtx->pXStateR0->x87.FTW >> 8;
    965         pInput->Elements[iReg].Value.FpControlStatus.LastFpOp  = pCtx->pXStateR0->x87.FOP;
    966         pInput->Elements[iReg].Value.FpControlStatus.LastFpRip = (pCtx->pXStateR0->x87.FPUIP)
    967                                                                | ((uint64_t)pCtx->pXStateR0->x87.CS << 32)
    968                                                                | ((uint64_t)pCtx->pXStateR0->x87.Rsrvd1 << 48);
     961        pInput->Elements[iReg].Value.FpControlStatus.FpControl = pCtx->XState.x87.FCW;
     962        pInput->Elements[iReg].Value.FpControlStatus.FpStatus  = pCtx->XState.x87.FSW;
     963        pInput->Elements[iReg].Value.FpControlStatus.FpTag     = pCtx->XState.x87.FTW;
     964        pInput->Elements[iReg].Value.FpControlStatus.Reserved  = pCtx->XState.x87.FTW >> 8;
     965        pInput->Elements[iReg].Value.FpControlStatus.LastFpOp  = pCtx->XState.x87.FOP;
     966        pInput->Elements[iReg].Value.FpControlStatus.LastFpRip = (pCtx->XState.x87.FPUIP)
     967                                                               | ((uint64_t)pCtx->XState.x87.CS << 32)
     968                                                               | ((uint64_t)pCtx->XState.x87.Rsrvd1 << 48);
    969969        iReg++;
    970970/** @todo we've got trouble if if we try write just SSE w/o X87.  */
    971971        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    972972        pInput->Elements[iReg].Name                                        = HvX64RegisterXmmControlStatus;
    973         pInput->Elements[iReg].Value.XmmControlStatus.LastFpRdp            = (pCtx->pXStateR0->x87.FPUDP)
    974                                                                            | ((uint64_t)pCtx->pXStateR0->x87.DS << 32)
    975                                                                            | ((uint64_t)pCtx->pXStateR0->x87.Rsrvd2 << 48);
    976         pInput->Elements[iReg].Value.XmmControlStatus.XmmStatusControl     = pCtx->pXStateR0->x87.MXCSR;
    977         pInput->Elements[iReg].Value.XmmControlStatus.XmmStatusControlMask = pCtx->pXStateR0->x87.MXCSR_MASK; /** @todo ??? (Isn't this an output field?) */
     973        pInput->Elements[iReg].Value.XmmControlStatus.LastFpRdp            = (pCtx->XState.x87.FPUDP)
     974                                                                           | ((uint64_t)pCtx->XState.x87.DS << 32)
     975                                                                           | ((uint64_t)pCtx->XState.x87.Rsrvd2 << 48);
     976        pInput->Elements[iReg].Value.XmmControlStatus.XmmStatusControl     = pCtx->XState.x87.MXCSR;
     977        pInput->Elements[iReg].Value.XmmControlStatus.XmmStatusControlMask = pCtx->XState.x87.MXCSR_MASK; /** @todo ??? (Isn't this an output field?) */
    978978        iReg++;
    979979    }
     
    984984        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    985985        pInput->Elements[iReg].Name                 = HvX64RegisterXmm0;
    986         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[0].uXmm.s.Lo;
    987         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[0].uXmm.s.Hi;
     986        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[0].uXmm.s.Lo;
     987        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[0].uXmm.s.Hi;
    988988        iReg++;
    989989        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    990990        pInput->Elements[iReg].Name                 = HvX64RegisterXmm1;
    991         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[1].uXmm.s.Lo;
    992         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[1].uXmm.s.Hi;
     991        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[1].uXmm.s.Lo;
     992        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[1].uXmm.s.Hi;
    993993        iReg++;
    994994        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    995995        pInput->Elements[iReg].Name                 = HvX64RegisterXmm2;
    996         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[2].uXmm.s.Lo;
    997         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[2].uXmm.s.Hi;
     996        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[2].uXmm.s.Lo;
     997        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[2].uXmm.s.Hi;
    998998        iReg++;
    999999        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    10001000        pInput->Elements[iReg].Name                 = HvX64RegisterXmm3;
    1001         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[3].uXmm.s.Lo;
    1002         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[3].uXmm.s.Hi;
     1001        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[3].uXmm.s.Lo;
     1002        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[3].uXmm.s.Hi;
    10031003        iReg++;
    10041004        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    10051005        pInput->Elements[iReg].Name                 = HvX64RegisterXmm4;
    1006         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[4].uXmm.s.Lo;
    1007         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[4].uXmm.s.Hi;
     1006        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[4].uXmm.s.Lo;
     1007        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[4].uXmm.s.Hi;
    10081008        iReg++;
    10091009        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    10101010        pInput->Elements[iReg].Name                 = HvX64RegisterXmm5;
    1011         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[5].uXmm.s.Lo;
    1012         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[5].uXmm.s.Hi;
     1011        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[5].uXmm.s.Lo;
     1012        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[5].uXmm.s.Hi;
    10131013        iReg++;
    10141014        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    10151015        pInput->Elements[iReg].Name                 = HvX64RegisterXmm6;
    1016         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[6].uXmm.s.Lo;
    1017         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[6].uXmm.s.Hi;
     1016        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[6].uXmm.s.Lo;
     1017        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[6].uXmm.s.Hi;
    10181018        iReg++;
    10191019        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    10201020        pInput->Elements[iReg].Name                 = HvX64RegisterXmm7;
    1021         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[7].uXmm.s.Lo;
    1022         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[7].uXmm.s.Hi;
     1021        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[7].uXmm.s.Lo;
     1022        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[7].uXmm.s.Hi;
    10231023        iReg++;
    10241024        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    10251025        pInput->Elements[iReg].Name                 = HvX64RegisterXmm8;
    1026         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[8].uXmm.s.Lo;
    1027         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[8].uXmm.s.Hi;
     1026        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[8].uXmm.s.Lo;
     1027        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[8].uXmm.s.Hi;
    10281028        iReg++;
    10291029        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    10301030        pInput->Elements[iReg].Name                 = HvX64RegisterXmm9;
    1031         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[9].uXmm.s.Lo;
    1032         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[9].uXmm.s.Hi;
     1031        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[9].uXmm.s.Lo;
     1032        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[9].uXmm.s.Hi;
    10331033        iReg++;
    10341034        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    10351035        pInput->Elements[iReg].Name                 = HvX64RegisterXmm10;
    1036         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[10].uXmm.s.Lo;
    1037         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[10].uXmm.s.Hi;
     1036        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[10].uXmm.s.Lo;
     1037        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[10].uXmm.s.Hi;
    10381038        iReg++;
    10391039        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    10401040        pInput->Elements[iReg].Name                 = HvX64RegisterXmm11;
    1041         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[11].uXmm.s.Lo;
    1042         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[11].uXmm.s.Hi;
     1041        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[11].uXmm.s.Lo;
     1042        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[11].uXmm.s.Hi;
    10431043        iReg++;
    10441044        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    10451045        pInput->Elements[iReg].Name                 = HvX64RegisterXmm12;
    1046         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[12].uXmm.s.Lo;
    1047         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[12].uXmm.s.Hi;
     1046        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[12].uXmm.s.Lo;
     1047        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[12].uXmm.s.Hi;
    10481048        iReg++;
    10491049        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    10501050        pInput->Elements[iReg].Name                 = HvX64RegisterXmm13;
    1051         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[13].uXmm.s.Lo;
    1052         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[13].uXmm.s.Hi;
     1051        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[13].uXmm.s.Lo;
     1052        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[13].uXmm.s.Hi;
    10531053        iReg++;
    10541054        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    10551055        pInput->Elements[iReg].Name                 = HvX64RegisterXmm14;
    1056         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[14].uXmm.s.Lo;
    1057         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[14].uXmm.s.Hi;
     1056        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[14].uXmm.s.Lo;
     1057        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[14].uXmm.s.Hi;
    10581058        iReg++;
    10591059        HV_REGISTER_ASSOC_ZERO_PADDING(&pInput->Elements[iReg]);
    10601060        pInput->Elements[iReg].Name                 = HvX64RegisterXmm15;
    1061         pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->pXStateR0->x87.aXMM[15].uXmm.s.Lo;
    1062         pInput->Elements[iReg].Value.Reg128.High64  = pCtx->pXStateR0->x87.aXMM[15].uXmm.s.Hi;
     1061        pInput->Elements[iReg].Value.Reg128.Low64   = pCtx->XState.x87.aXMM[15].uXmm.s.Lo;
     1062        pInput->Elements[iReg].Value.Reg128.High64  = pCtx->XState.x87.aXMM[15].uXmm.s.Hi;
    10631063        iReg++;
    10641064    }
     
    18181818        Assert(pInput->Names[iReg] == HvX64RegisterFpMmx0);
    18191819        Assert(pInput->Names[iReg + 7] == HvX64RegisterFpMmx7);
    1820         pCtx->pXStateR0->x87.aRegs[0].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
    1821         pCtx->pXStateR0->x87.aRegs[0].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
    1822         iReg++;
    1823         pCtx->pXStateR0->x87.aRegs[1].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
    1824         pCtx->pXStateR0->x87.aRegs[1].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
    1825         iReg++;
    1826         pCtx->pXStateR0->x87.aRegs[2].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
    1827         pCtx->pXStateR0->x87.aRegs[2].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
    1828         iReg++;
    1829         pCtx->pXStateR0->x87.aRegs[3].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
    1830         pCtx->pXStateR0->x87.aRegs[3].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
    1831         iReg++;
    1832         pCtx->pXStateR0->x87.aRegs[4].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
    1833         pCtx->pXStateR0->x87.aRegs[4].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
    1834         iReg++;
    1835         pCtx->pXStateR0->x87.aRegs[5].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
    1836         pCtx->pXStateR0->x87.aRegs[5].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
    1837         iReg++;
    1838         pCtx->pXStateR0->x87.aRegs[6].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
    1839         pCtx->pXStateR0->x87.aRegs[6].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
    1840         iReg++;
    1841         pCtx->pXStateR0->x87.aRegs[7].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
    1842         pCtx->pXStateR0->x87.aRegs[7].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
     1820        pCtx->XState.x87.aRegs[0].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
     1821        pCtx->XState.x87.aRegs[0].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
     1822        iReg++;
     1823        pCtx->XState.x87.aRegs[1].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
     1824        pCtx->XState.x87.aRegs[1].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
     1825        iReg++;
     1826        pCtx->XState.x87.aRegs[2].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
     1827        pCtx->XState.x87.aRegs[2].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
     1828        iReg++;
     1829        pCtx->XState.x87.aRegs[3].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
     1830        pCtx->XState.x87.aRegs[3].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
     1831        iReg++;
     1832        pCtx->XState.x87.aRegs[4].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
     1833        pCtx->XState.x87.aRegs[4].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
     1834        iReg++;
     1835        pCtx->XState.x87.aRegs[5].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
     1836        pCtx->XState.x87.aRegs[5].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
     1837        iReg++;
     1838        pCtx->XState.x87.aRegs[6].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
     1839        pCtx->XState.x87.aRegs[6].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
     1840        iReg++;
     1841        pCtx->XState.x87.aRegs[7].au64[0] = paValues[iReg].Fp.AsUINT128.Low64;
     1842        pCtx->XState.x87.aRegs[7].au64[1] = paValues[iReg].Fp.AsUINT128.High64;
    18431843        iReg++;
    18441844
    18451845        Assert(pInput->Names[iReg] == HvX64RegisterFpControlStatus);
    1846         pCtx->pXStateR0->x87.FCW        = paValues[iReg].FpControlStatus.FpControl;
    1847         pCtx->pXStateR0->x87.FSW        = paValues[iReg].FpControlStatus.FpStatus;
    1848         pCtx->pXStateR0->x87.FTW        = paValues[iReg].FpControlStatus.FpTag
     1846        pCtx->XState.x87.FCW        = paValues[iReg].FpControlStatus.FpControl;
     1847        pCtx->XState.x87.FSW        = paValues[iReg].FpControlStatus.FpStatus;
     1848        pCtx->XState.x87.FTW        = paValues[iReg].FpControlStatus.FpTag
    18491849                                        /*| (paValues[iReg].FpControlStatus.Reserved << 8)*/;
    1850         pCtx->pXStateR0->x87.FOP        = paValues[iReg].FpControlStatus.LastFpOp;
    1851         pCtx->pXStateR0->x87.FPUIP      = (uint32_t)paValues[iReg].FpControlStatus.LastFpRip;
    1852         pCtx->pXStateR0->x87.CS         = (uint16_t)(paValues[iReg].FpControlStatus.LastFpRip >> 32);
    1853         pCtx->pXStateR0->x87.Rsrvd1     = (uint16_t)(paValues[iReg].FpControlStatus.LastFpRip >> 48);
     1850        pCtx->XState.x87.FOP        = paValues[iReg].FpControlStatus.LastFpOp;
     1851        pCtx->XState.x87.FPUIP      = (uint32_t)paValues[iReg].FpControlStatus.LastFpRip;
     1852        pCtx->XState.x87.CS         = (uint16_t)(paValues[iReg].FpControlStatus.LastFpRip >> 32);
     1853        pCtx->XState.x87.Rsrvd1     = (uint16_t)(paValues[iReg].FpControlStatus.LastFpRip >> 48);
    18541854        iReg++;
    18551855    }
     
    18601860        if (fWhat & CPUMCTX_EXTRN_X87)
    18611861        {
    1862             pCtx->pXStateR0->x87.FPUDP  = (uint32_t)paValues[iReg].XmmControlStatus.LastFpRdp;
    1863             pCtx->pXStateR0->x87.DS     = (uint16_t)(paValues[iReg].XmmControlStatus.LastFpRdp >> 32);
    1864             pCtx->pXStateR0->x87.Rsrvd2 = (uint16_t)(paValues[iReg].XmmControlStatus.LastFpRdp >> 48);
    1865         }
    1866         pCtx->pXStateR0->x87.MXCSR      = paValues[iReg].XmmControlStatus.XmmStatusControl;
    1867         pCtx->pXStateR0->x87.MXCSR_MASK = paValues[iReg].XmmControlStatus.XmmStatusControlMask; /** @todo ??? (Isn't this an output field?) */
     1862            pCtx->XState.x87.FPUDP  = (uint32_t)paValues[iReg].XmmControlStatus.LastFpRdp;
     1863            pCtx->XState.x87.DS     = (uint16_t)(paValues[iReg].XmmControlStatus.LastFpRdp >> 32);
     1864            pCtx->XState.x87.Rsrvd2 = (uint16_t)(paValues[iReg].XmmControlStatus.LastFpRdp >> 48);
     1865        }
     1866        pCtx->XState.x87.MXCSR      = paValues[iReg].XmmControlStatus.XmmStatusControl;
     1867        pCtx->XState.x87.MXCSR_MASK = paValues[iReg].XmmControlStatus.XmmStatusControlMask; /** @todo ??? (Isn't this an output field?) */
    18681868        iReg++;
    18691869    }
     
    18741874        Assert(pInput->Names[iReg] == HvX64RegisterXmm0);
    18751875        Assert(pInput->Names[iReg+15] == HvX64RegisterXmm15);
    1876         pCtx->pXStateR0->x87.aXMM[0].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
    1877         pCtx->pXStateR0->x87.aXMM[0].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
    1878         iReg++;
    1879         pCtx->pXStateR0->x87.aXMM[1].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
    1880         pCtx->pXStateR0->x87.aXMM[1].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
    1881         iReg++;
    1882         pCtx->pXStateR0->x87.aXMM[2].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
    1883         pCtx->pXStateR0->x87.aXMM[2].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
    1884         iReg++;
    1885         pCtx->pXStateR0->x87.aXMM[3].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
    1886         pCtx->pXStateR0->x87.aXMM[3].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
    1887         iReg++;
    1888         pCtx->pXStateR0->x87.aXMM[4].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
    1889         pCtx->pXStateR0->x87.aXMM[4].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
    1890         iReg++;
    1891         pCtx->pXStateR0->x87.aXMM[5].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
    1892         pCtx->pXStateR0->x87.aXMM[5].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
    1893         iReg++;
    1894         pCtx->pXStateR0->x87.aXMM[6].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
    1895         pCtx->pXStateR0->x87.aXMM[6].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
    1896         iReg++;
    1897         pCtx->pXStateR0->x87.aXMM[7].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
    1898         pCtx->pXStateR0->x87.aXMM[7].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
    1899         iReg++;
    1900         pCtx->pXStateR0->x87.aXMM[8].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
    1901         pCtx->pXStateR0->x87.aXMM[8].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
    1902         iReg++;
    1903         pCtx->pXStateR0->x87.aXMM[9].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
    1904         pCtx->pXStateR0->x87.aXMM[9].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
    1905         iReg++;
    1906         pCtx->pXStateR0->x87.aXMM[10].uXmm.s.Lo = paValues[iReg].Reg128.Low64;
    1907         pCtx->pXStateR0->x87.aXMM[10].uXmm.s.Hi = paValues[iReg].Reg128.High64;
    1908         iReg++;
    1909         pCtx->pXStateR0->x87.aXMM[11].uXmm.s.Lo = paValues[iReg].Reg128.Low64;
    1910         pCtx->pXStateR0->x87.aXMM[11].uXmm.s.Hi = paValues[iReg].Reg128.High64;
    1911         iReg++;
    1912         pCtx->pXStateR0->x87.aXMM[12].uXmm.s.Lo = paValues[iReg].Reg128.Low64;
    1913         pCtx->pXStateR0->x87.aXMM[12].uXmm.s.Hi = paValues[iReg].Reg128.High64;
    1914         iReg++;
    1915         pCtx->pXStateR0->x87.aXMM[13].uXmm.s.Lo = paValues[iReg].Reg128.Low64;
    1916         pCtx->pXStateR0->x87.aXMM[13].uXmm.s.Hi = paValues[iReg].Reg128.High64;
    1917         iReg++;
    1918         pCtx->pXStateR0->x87.aXMM[14].uXmm.s.Lo = paValues[iReg].Reg128.Low64;
    1919         pCtx->pXStateR0->x87.aXMM[14].uXmm.s.Hi = paValues[iReg].Reg128.High64;
    1920         iReg++;
    1921         pCtx->pXStateR0->x87.aXMM[15].uXmm.s.Lo = paValues[iReg].Reg128.Low64;
    1922         pCtx->pXStateR0->x87.aXMM[15].uXmm.s.Hi = paValues[iReg].Reg128.High64;
     1876        pCtx->XState.x87.aXMM[0].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
     1877        pCtx->XState.x87.aXMM[0].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
     1878        iReg++;
     1879        pCtx->XState.x87.aXMM[1].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
     1880        pCtx->XState.x87.aXMM[1].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
     1881        iReg++;
     1882        pCtx->XState.x87.aXMM[2].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
     1883        pCtx->XState.x87.aXMM[2].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
     1884        iReg++;
     1885        pCtx->XState.x87.aXMM[3].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
     1886        pCtx->XState.x87.aXMM[3].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
     1887        iReg++;
     1888        pCtx->XState.x87.aXMM[4].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
     1889        pCtx->XState.x87.aXMM[4].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
     1890        iReg++;
     1891        pCtx->XState.x87.aXMM[5].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
     1892        pCtx->XState.x87.aXMM[5].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
     1893        iReg++;
     1894        pCtx->XState.x87.aXMM[6].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
     1895        pCtx->XState.x87.aXMM[6].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
     1896        iReg++;
     1897        pCtx->XState.x87.aXMM[7].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
     1898        pCtx->XState.x87.aXMM[7].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
     1899        iReg++;
     1900        pCtx->XState.x87.aXMM[8].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
     1901        pCtx->XState.x87.aXMM[8].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
     1902        iReg++;
     1903        pCtx->XState.x87.aXMM[9].uXmm.s.Lo  = paValues[iReg].Reg128.Low64;
     1904        pCtx->XState.x87.aXMM[9].uXmm.s.Hi  = paValues[iReg].Reg128.High64;
     1905        iReg++;
     1906        pCtx->XState.x87.aXMM[10].uXmm.s.Lo = paValues[iReg].Reg128.Low64;
     1907        pCtx->XState.x87.aXMM[10].uXmm.s.Hi = paValues[iReg].Reg128.High64;
     1908        iReg++;
     1909        pCtx->XState.x87.aXMM[11].uXmm.s.Lo = paValues[iReg].Reg128.Low64;
     1910        pCtx->XState.x87.aXMM[11].uXmm.s.Hi = paValues[iReg].Reg128.High64;
     1911        iReg++;
     1912        pCtx->XState.x87.aXMM[12].uXmm.s.Lo = paValues[iReg].Reg128.Low64;
     1913        pCtx->XState.x87.aXMM[12].uXmm.s.Hi = paValues[iReg].Reg128.High64;
     1914        iReg++;
     1915        pCtx->XState.x87.aXMM[13].uXmm.s.Lo = paValues[iReg].Reg128.Low64;
     1916        pCtx->XState.x87.aXMM[13].uXmm.s.Hi = paValues[iReg].Reg128.High64;
     1917        iReg++;
     1918        pCtx->XState.x87.aXMM[14].uXmm.s.Lo = paValues[iReg].Reg128.Low64;
     1919        pCtx->XState.x87.aXMM[14].uXmm.s.Hi = paValues[iReg].Reg128.High64;
     1920        iReg++;
     1921        pCtx->XState.x87.aXMM[15].uXmm.s.Lo = paValues[iReg].Reg128.Low64;
     1922        pCtx->XState.x87.aXMM[15].uXmm.s.Hi = paValues[iReg].Reg128.High64;
    19231923        iReg++;
    19241924    }
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r91280 r91281  
    22882288
    22892289    uint8_t *pbXStates;
    2290     rc = MMR3HyperAllocOnceNoRelEx(pVM, cbMaxXState * 2 * pVM->cCpus, PAGE_SIZE, MM_TAG_CPUM_CTX,
     2290    rc = MMR3HyperAllocOnceNoRelEx(pVM, cbMaxXState * pVM->cCpus, PAGE_SIZE, MM_TAG_CPUM_CTX,
    22912291                                   MMHYPER_AONR_FLAGS_KERNEL_MAPPING, (void **)&pbXStates);
    22922292    AssertLogRelRCReturn(rc, rc);
     
    22952295    {
    22962296        PVMCPU pVCpu = pVM->apCpusR3[i];
    2297 
    2298         pVCpu->cpum.s.Guest.pXStateR3 = (PX86XSAVEAREA)pbXStates;
    2299         pVCpu->cpum.s.Guest.pXStateR0 = MMHyperR3ToR0(pVM, pbXStates);
    2300         pbXStates += cbMaxXState;
    23012297
    23022298        pVCpu->cpum.s.Host.pXStateR3  = (PX86XSAVEAREA)pbXStates;
     
    24512447    uint32_t fUseFlags              =  pVCpu->cpum.s.fUseFlags & ~CPUM_USED_FPU_SINCE_REM;
    24522448
    2453     AssertCompile(RTASSERT_OFFSET_OF(CPUMCTX, pXStateR0) < RTASSERT_OFFSET_OF(CPUMCTX, pXStateR3));
    2454     memset(pCtx, 0, RT_UOFFSETOF(CPUMCTX, pXStateR0));
     2449    RT_BZERO(pCtx, RT_UOFFSETOF(CPUMCTX, aoffXState));
    24552450
    24562451    pVCpu->cpum.s.fUseFlags         = fUseFlags;
     
    25162511    pCtx->dr[7]                     = X86_DR7_INIT_VAL;
    25172512
    2518     PX86FXSTATE pFpuCtx = &pCtx->pXStateR3->x87; AssertReleaseMsg(RT_VALID_PTR(pFpuCtx), ("%p\n", pFpuCtx));
     2513    PX86FXSTATE pFpuCtx = &pCtx->XState.x87;
    25192514    pFpuCtx->FTW                    = 0x00;         /* All empty (abbridged tag reg edition). */
    25202515    pFpuCtx->FCW                    = 0x37f;
     
    25302525        /* The entire FXSAVE state needs loading when we switch to XSAVE/XRSTOR
    25312526           as we don't know what happened before.  (Bother optimize later?) */
    2532         pCtx->pXStateR3->Hdr.bmXState = XSAVE_C_X87 | XSAVE_C_SSE;
     2527        pCtx->XState.Hdr.bmXState  = XSAVE_C_X87 | XSAVE_C_SSE;
    25332528    }
    25342529
     
    26572652        PCPUMCTX pGstCtx = &pVCpu->cpum.s.Guest;
    26582653        SSMR3PutStructEx(pSSM, pGstCtx,                  sizeof(*pGstCtx),                0, g_aCpumCtxFields, NULL);
    2659         SSMR3PutStructEx(pSSM, &pGstCtx->pXStateR3->x87, sizeof(pGstCtx->pXStateR3->x87), 0, g_aCpumX87Fields, NULL);
     2654        SSMR3PutStructEx(pSSM, &pGstCtx->XState.x87,     sizeof(pGstCtx->XState.x87),    0, g_aCpumX87Fields, NULL);
    26602655        if (pGstCtx->fXStateMask != 0)
    2661             SSMR3PutStructEx(pSSM, &pGstCtx->pXStateR3->Hdr, sizeof(pGstCtx->pXStateR3->Hdr), 0, g_aCpumXSaveHdrFields, NULL);
     2656            SSMR3PutStructEx(pSSM, &pGstCtx->XState.Hdr, sizeof(pGstCtx->XState.Hdr),    0, g_aCpumXSaveHdrFields, NULL);
    26622657        if (pGstCtx->fXStateMask & XSAVE_C_YMM)
    26632658        {
     
    28892884                 */
    28902885                rc = SSMR3GetStructEx(pSSM, pGstCtx,                  sizeof(*pGstCtx),                0, g_aCpumCtxFields, NULL);
    2891                 rc = SSMR3GetStructEx(pSSM, &pGstCtx->pXStateR3->x87, sizeof(pGstCtx->pXStateR3->x87), 0, g_aCpumX87Fields, NULL);
     2886                rc = SSMR3GetStructEx(pSSM, &pGstCtx->XState.x87,     sizeof(pGstCtx->XState.x87),    0, g_aCpumX87Fields, NULL);
    28922887                AssertRCReturn(rc, rc);
    28932888
     
    29342929                if (pGstCtx->fXStateMask != 0)
    29352930                {
    2936                     rc = SSMR3GetStructEx(pSSM, &pGstCtx->pXStateR3->Hdr, sizeof(pGstCtx->pXStateR3->Hdr),
     2931                    rc = SSMR3GetStructEx(pSSM, &pGstCtx->XState.Hdr, sizeof(pGstCtx->XState.Hdr),
    29372932                                          0, g_aCpumXSaveHdrFields, NULL);
    29382933                    AssertRCReturn(rc, rc);
    2939                     AssertLogRelMsgReturn(!(pGstCtx->pXStateR3->Hdr.bmXState & ~pGstCtx->fXStateMask),
     2934                    AssertLogRelMsgReturn(!(pGstCtx->XState.Hdr.bmXState & ~pGstCtx->fXStateMask),
    29402935                                          ("bmXState=%#RX64 fXStateMask=%#RX64\n",
    2941                                            pGstCtx->pXStateR3->Hdr.bmXState, pGstCtx->fXStateMask),
     2936                                           pGstCtx->XState.Hdr.bmXState, pGstCtx->fXStateMask),
    29422937                                          VERR_CPUM_INVALID_XSAVE_HDR);
    29432938                }
     
    30493044                 * Pre XSAVE saved state.
    30503045                 */
    3051                 SSMR3GetStructEx(pSSM, &pGstCtx->pXStateR3->x87, sizeof(pGstCtx->pXStateR3->x87),
     3046                SSMR3GetStructEx(pSSM, &pGstCtx->XState.x87, sizeof(pGstCtx->XState.x87),
    30523047                                 fLoad | SSMSTRUCT_FLAGS_NO_TAIL_MARKER, paCpumCtx1Fields, NULL);
    30533048                SSMR3GetStructEx(pSSM, pGstCtx, sizeof(*pGstCtx), fLoad | SSMSTRUCT_FLAGS_NO_LEAD_MARKER, paCpumCtx2Fields, NULL);
     
    34393434                            pszPrefix, pCtx->aXcr[0], pszPrefix, pCtx->aXcr[1],
    34403435                            pszPrefix, UINT64_C(0) /** @todo XSS */, pCtx->fXStateMask);
    3441             if (pCtx->CTX_SUFF(pXState))
    34423436            {
    3443                 PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
     3437                PX86FXSTATE pFpuCtx = &pCtx->XState.x87;
    34443438                pHlp->pfnPrintf(pHlp,
    34453439                    "%sFCW=%04x %sFSW=%04x %sFTW=%04x %sFOP=%04x %sMXCSR=%08x %sMXCSR_MASK=%08x\n"
  • trunk/src/VBox/VMM/VMMR3/CPUMDbg.cpp

    r86179 r91281  
    111111{
    112112    PVMCPU      pVCpu   = (PVMCPU)pvUser;
    113     void const *pv      = (uint8_t const *)&pVCpu->cpum.s.Guest.pXStateR3 + pDesc->offRegister;
     113    void const *pv      = (uint8_t const *)&pVCpu->cpum.s.Guest.XState + pDesc->offRegister;
    114114
    115115    VMCPU_ASSERT_EMT(pVCpu);
     
    134134{
    135135    PVMCPU      pVCpu = (PVMCPU)pvUser;
    136     void       *pv    = (uint8_t *)&pVCpu->cpum.s.Guest.pXStateR3 + pDesc->offRegister;
     136    void       *pv    = (uint8_t *)&pVCpu->cpum.s.Guest.XState + pDesc->offRegister;
    137137
    138138    VMCPU_ASSERT_EMT(pVCpu);
     
    378378    if (iReg < 16)
    379379    {
    380         pValue->u256.DQWords.dqw0 = pVCpu->cpum.s.Guest.pXStateR3->x87.aXMM[iReg].uXmm;
    381         pValue->u256.DQWords.dqw1 = pVCpu->cpum.s.Guest.pXStateR3->u.YmmHi.aYmmHi[iReg].uXmm;
     380        pValue->u256.DQWords.dqw0 = pVCpu->cpum.s.Guest.XState.x87.aXMM[iReg].uXmm;
     381        pValue->u256.DQWords.dqw1 = pVCpu->cpum.s.Guest.XState.u.YmmHi.aYmmHi[iReg].uXmm;
    382382        return VINF_SUCCESS;
    383383    }
     
    400400    {
    401401        RTUINT128U Val;
    402         RTUInt128AssignAnd(&pVCpu->cpum.s.Guest.pXStateR3->x87.aXMM[iReg].uXmm,
     402        RTUInt128AssignAnd(&pVCpu->cpum.s.Guest.XState.x87.aXMM[iReg].uXmm,
    403403                           RTUInt128AssignBitwiseNot(RTUInt128Assign(&Val, &pfMask->u256.DQWords.dqw0)));
    404         RTUInt128AssignOr(&pVCpu->cpum.s.Guest.pXStateR3->u.YmmHi.aYmmHi[iReg].uXmm,
     404        RTUInt128AssignOr(&pVCpu->cpum.s.Guest.XState.u.YmmHi.aYmmHi[iReg].uXmm,
    405405                          RTUInt128AssignAnd(RTUInt128Assign(&Val, &pValue->u128), &pfMask->u128));
    406406
     
    666666    Assert(pDesc->enmType == DBGFREGVALTYPE_R80);
    667667
    668     PX86FXSTATE pFpuCtx = &pVCpu->cpum.s.Guest.CTX_SUFF(pXState)->x87;
     668    PX86FXSTATE pFpuCtx = &pVCpu->cpum.s.Guest.XState.x87;
    669669    unsigned iReg = (pFpuCtx->FSW >> 11) & 7;
    670670    iReg += pDesc->offRegister;
  • trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp

    r91276 r91281  
    4242/** For sanity and avoid wasting hyper heap on buggy config / saved state. */
    4343#define CPUM_CPUID_MAX_LEAVES       2048
    44 /* Max size we accept for the XSAVE area. */
    45 #define CPUM_MAX_XSAVE_AREA_SIZE    10240
     44/** Max size we accept for the XSAVE area.
     45 * @see CPUMCTX::abXSave */
     46#define CPUM_MAX_XSAVE_AREA_SIZE    (0x4000 - 0x300)
    4647/* Min size we accept for the XSAVE area. */
    4748#define CPUM_MIN_XSAVE_AREA_SIZE    0x240
     
    24582459     */
    24592460    PVMCPU pVCpu0 = pVM->apCpusR3[0];
     2461    AssertCompile(sizeof(pVCpu0->cpum.s.Guest.abXState) == CPUM_MAX_XSAVE_AREA_SIZE);
    24602462    memset(&pVCpu0->cpum.s.Guest.aoffXState[0], 0xff, sizeof(pVCpu0->cpum.s.Guest.aoffXState));
    24612463    pVCpu0->cpum.s.Guest.aoffXState[XSAVE_C_X87_BIT] = 0;
  • trunk/src/VBox/VMM/VMMR3/DBGFCoreWrite.cpp

    r83122 r91281  
    380380    pDbgfCpu->aXcr[0]         = pCtx->aXcr[0];
    381381    pDbgfCpu->aXcr[1]         = pCtx->aXcr[1];
    382     AssertCompile(sizeof(pDbgfCpu->ext) == sizeof(*pCtx->pXStateR3));
     382    AssertCompile(sizeof(pDbgfCpu->ext) == sizeof(pCtx->XState));
    383383    pDbgfCpu->cbExt = pVM->cpum.ro.GuestFeatures.cbMaxExtendedState;
    384384    if (RT_LIKELY(pDbgfCpu->cbExt))
    385         memcpy(&pDbgfCpu->ext, pCtx->pXStateR3, pDbgfCpu->cbExt);
     385        memcpy(&pDbgfCpu->ext, &pCtx->XState, pDbgfCpu->cbExt);
    386386
    387387#undef DBGFCOPYSEL
  • trunk/src/VBox/VMM/VMMRZ/CPUMRZA.asm

    r87361 r91281  
    173173
    174174        ; Load the guest XMM register values we already saved in HMR0VMXStartVMWrapXMM.
    175         mov     pXState, [pCpumCpu + CPUMCPU.Guest.pXStateR0]
     175        lea     pXState, [pCpumCpu + CPUMCPU.Guest.XState]
    176176        movdqa  xmm0,  [pXState + X86FXSTATE.xmm0]
    177177        movdqa  xmm1,  [pXState + X86FXSTATE.xmm1]
     
    256256        mov     xCX, dword [ebp + 8]
    257257 %endif
    258  %ifdef IN_RING0
    259         mov     xCX, [xCX + CPUMCPU.Guest.pXStateR0]
    260  %elifdef IN_RC
    261         mov     xCX, [xCX + CPUMCPU.Guest.pXStateRC]
    262  %else
    263   %error "Invalid context!"
    264  %endif
     258        lea     xCX, [xCX + CPUMCPU.Guest.XState]
    265259
    266260 %ifdef IN_RC
     
    336330        mov     xCX, dword [ebp + 8]
    337331%endif
    338 %ifdef IN_RING0
    339         mov     xCX, [xCX + CPUMCPU.Guest.pXStateR0]
    340 %elifdef IN_RC
    341         mov     xCX, [xCX + CPUMCPU.Guest.pXStateRC]
    342 %else
    343  %error "Invalid context!"
    344 %endif
     332        lea     xCX, [xCX + CPUMCPU.Guest.XState]
    345333
    346334%ifdef IN_RC
  • trunk/src/VBox/VMM/include/CPUMInternal.mac

    r91271 r91281  
    213213    .Guest.msrKERNELGSBASE    resb    8
    214214    .Guest.uMsrPadding0       resb    8
     215
     216    alignb 8
     217    .Guest.fExtrn             resq    1
     218
     219    alignb 32
     220    .Guest.aPaePdpes          resq    4
     221
    215222    alignb 8
    216223    .Guest.aXcr               resq    2
    217224    .Guest.fXStateMask        resq    1
    218     .Guest.pXStateR0      RTR0PTR_RES 1
    219     alignb 8
    220     .Guest.pXStateR3      RTR3PTR_RES 1
     225    .Guest.fUsedFpuGuest      resb    1
    221226    alignb 8
    222227    .Guest.aoffXState         resw    64
    223     .Guest.fUsedFpuGuest      resb    1
    224     alignb 8
    225     .Guest.fExtrn             resq    1
    226     .Guest.aPaePdpes          resq    4
    227     alignb 8
     228    alignb 256
     229    .Guest.abXState           resb    0x4000-0x300
     230    .Guest.XState             EQU     .Guest.abXState
     231
     232    alignb 4096
    228233    .Guest.hwvirt.svm.uMsrHSavePa            resq         1
    229234    .Guest.hwvirt.svm.GCPhysVmcb             resq         1
     
    606611        ;
    607612 %ifdef IN_RING0
    608         mov     pXState, [pCpumCpu + CPUMCPU.Guest.pXStateR0]
     613        lea     pXState, [pCpumCpu + CPUMCPU.Guest.XState]
    609614 %else
    610615  %error "Unsupported context!"
     
    675680        ;
    676681 %ifdef IN_RING0
    677         mov     pXState, [pCpumCpu + CPUMCPU.Guest.pXStateR0]
     682        lea     pXState, [pCpumCpu + CPUMCPU.Guest.XState]
    678683 %else
    679684  %error "Unsupported context!"
  • trunk/src/VBox/VMM/testcase/tstAsmStructsAsm-lst.sed

    r82968 r91281  
    4040/<gap>/b member
    4141/^\.[[:alpha:]_][[:alnum:]_.:]* res.*$/b member_two
     42/^\.[[:alpha:]_][[:alnum:]_.:]* EQU .*$/b member_two
    4243/^\.[[:alpha:]_][[:alnum:]_.:]*:$/b member_alias
    4344b error
     
    7980:member_two
    8081s/[:]*  *res[bwdtq] .*$//
     82s/[:]*  *EQU .*$//
    8183s/$/ /
    8284/^\.[[:alnum:]_.]* *$/!t error
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r82968 r91281  
    704704#define IEM_MC_CALL_SSE_AIMPL_3(a_pfnAImpl, a0, a1, a2) \
    705705    do { (void)fSseHost; (void)fSseWrite; CHK_CALL_ARG(a0, 0); CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2); (void)fMcBegin; } while (0)
    706 #define IEM_MC_IMPLICIT_AVX_AIMPL_ARGS() do { IEM_MC_ARG_CONST(PX86XSAVEAREA, pXState, pVCpu->cpum.GstCtx.CTX_SUFF(pXState), 0); (void)fMcBegin; } while (0)
     706#define IEM_MC_IMPLICIT_AVX_AIMPL_ARGS() do { IEM_MC_ARG_CONST(PX86XSAVEAREA, pXState, &pVCpu->cpum.GstCtx.XState, 0); (void)fMcBegin; } while (0)
    707707#define IEM_MC_CALL_AVX_AIMPL_2(a_pfnAImpl, a1, a2) \
    708708    do { (void)fAvxHost; (void)fAvxWrite; CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2); (void)fMcBegin; } while (0)
  • trunk/src/VBox/VMM/testcase/tstVMStruct.h

    r91016 r91281  
    192192    /** @todo NSTVMX: add rest of hwvirt fields when code is more
    193193     *        finalized. */
    194     GEN_CHECK_OFF(CPUMCTX, pXStateR0);
    195     GEN_CHECK_OFF(CPUMCTX, pXStateR3);
     194    GEN_CHECK_OFF(CPUMCTX, XState);
    196195    GEN_CHECK_OFF(CPUMCTX, rdi);
    197196    GEN_CHECK_OFF(CPUMCTX, rsi);
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