VirtualBox

Changeset 54898 in vbox


Ignore:
Timestamp:
Mar 22, 2015 11:47:07 PM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
99113
Message:

CPUMCTX,CPUMHOST: Replaced the fpu (X86FXSAVE) member with an XState (X86XSAVEAREA) member.

Location:
trunk
Files:
21 edited

Legend:

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

    r54738 r54898  
    133133
    134134
     135%define XSTATE_SIZE             8192
     136
    135137struc CPUMCTX
    136     .fpu                resb    512
     138    .XState             resb    XSTATE_SIZE
    137139    .eax                resq    1
    138140    .ecx                resq    1
  • trunk/include/VBox/vmm/cpumctx.h

    r54897 r54898  
    250250     * @todo This doesn't have to be in X86FXSTATE on CPUs without fxsr - we need a type for the
    251251     *       actual format or convert it (waste of time).  */
    252     X86FXSTATE      fpu;
     252    X86XSAVEAREA        XState;
    253253
    254254    /** CPUMCTXCORE Part.
  • trunk/include/VBox/vmm/vm.h

    r54897 r54898  
    231231    uint8_t                 abAlignment2[3584];
    232232
     233    /** PGM part. */
     234    union
     235    {
     236#ifdef ___PGMInternal_h
     237        struct PGMCPU       s;
     238#endif
     239        uint8_t             padding[4096];      /* multiple of 4096 */
     240    } pgm;
     241
    233242    /** CPUM part. */
    234243    union
     
    237246        struct CPUMCPU      s;
    238247#endif
    239         uint8_t             padding[4096];      /* multiple of 4096 */
     248        uint8_t             padding[28672];      /* multiple of 4096 */
    240249    } cpum;
    241 
    242     /** PGM part. */
    243     union
    244     {
    245 #ifdef ___PGMInternal_h
    246         struct PGMCPU       s;
    247 #endif
    248         uint8_t             padding[4096];      /* multiple of 4096 */
    249     } pgm;
    250250
    251251} VMCPU;
  • trunk/include/VBox/vmm/vm.mac

    r54897 r54898  
    146146
    147147    alignb 4096
    148     .cpum                   resb 4096
    149148    .pgm                    resb 4096
     149    alignb 4096
     150    .cpum                   resb 28672
     151    alignb 4096
    150152endstruc
    151153
  • trunk/include/iprt/x86.h

    r54896 r54898  
    27722772        } AmdBd;
    27732773
    2774         /** Reserved 8K here for current and future state info. */
     2774        /** To enbling static deployments that have a reasonable chance of working for
     2775         * the next 3-6 CPU generations without running short on space, we allocate a
     2776         * lot of extra space here, making the structure a round 8KB in size.  This
     2777         * leaves us 7616 bytes for extended state.  The skylake xeons are likely to use
     2778         * 2112 of these, leaving us with 5504 bytes for future Intel generations. */
    27752779        uint8_t         ab[8192 - 512 - 64];
    27762780    } u;
     
    27782782#ifndef VBOX_FOR_DTRACE_LIB
    27792783AssertCompileSize(X86XSAVEAREA, 8192);
     2784AssertCompileMemberSize(X86XSAVEAREA, u.Intel, 0x840 /*2112 => total 0xa80 (2688) */);
    27802785AssertCompileMemberOffset(X86XSAVEAREA, Hdr,                0x200);
    27812786AssertCompileMemberOffset(X86XSAVEAREA, u.Intel.YmmHi,      0x240);
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r54892 r54898  
    52295229DECLINLINE(void) iemFpuUpdateOpcodeAndIpWorker(PIEMCPU pIemCpu, PCPUMCTX pCtx)
    52305230{
    5231     pCtx->fpu.FOP   = pIemCpu->abOpcode[pIemCpu->offFpuOpcode]
     5231    pCtx->XState.x87.FOP   = pIemCpu->abOpcode[pIemCpu->offFpuOpcode]
    52325232                    | ((uint16_t)(pIemCpu->abOpcode[pIemCpu->offFpuOpcode - 1] & 0x7) << 8);
    5233     /** @todo FPU.CS and FPUIP needs to be kept seperately. */
     5233    /** @todo XState.x87.CS and FPUIP needs to be kept seperately. */
    52345234    if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
    52355235    {
    52365236        /** @todo Testcase: making assumptions about how FPUIP and FPUDP are handled
    52375237         *        happens in real mode here based on the fnsave and fnstenv images. */
    5238         pCtx->fpu.CS    = 0;
    5239         pCtx->fpu.FPUIP = pCtx->eip | ((uint32_t)pCtx->cs.Sel << 4);
     5238        pCtx->XState.x87.CS    = 0;
     5239        pCtx->XState.x87.FPUIP = pCtx->eip | ((uint32_t)pCtx->cs.Sel << 4);
    52405240    }
    52415241    else
    52425242    {
    5243         pCtx->fpu.CS    = pCtx->cs.Sel;
    5244         pCtx->fpu.FPUIP = pCtx->rip;
    5245     }
    5246 }
    5247 
    5248 
    5249 /**
    5250  * Updates the FPU.DS and FPUDP registers.
     5243        pCtx->XState.x87.CS    = pCtx->cs.Sel;
     5244        pCtx->XState.x87.FPUIP = pCtx->rip;
     5245    }
     5246}
     5247
     5248
     5249/**
     5250 * Updates the XState.x87.DS and FPUDP registers.
    52515251 *
    52525252 * @param   pIemCpu             The IEM per CPU data.
     
    52705270            sel = pCtx->ds.Sel;
    52715271    }
    5272     /** @todo FPU.DS and FPUDP needs to be kept seperately. */
     5272    /** @todo XState.x87.DS and FPUDP needs to be kept seperately. */
    52735273    if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
    52745274    {
    5275         pCtx->fpu.DS    = 0;
    5276         pCtx->fpu.FPUDP = (uint32_t)GCPtrEff | ((uint32_t)sel << 4);
     5275        pCtx->XState.x87.DS    = 0;
     5276        pCtx->XState.x87.FPUDP = (uint32_t)GCPtrEff | ((uint32_t)sel << 4);
    52775277    }
    52785278    else
    52795279    {
    5280         pCtx->fpu.DS    = sel;
    5281         pCtx->fpu.FPUDP = GCPtrEff;
     5280        pCtx->XState.x87.DS    = sel;
     5281        pCtx->XState.x87.FPUDP = GCPtrEff;
    52825282    }
    52835283}
     
    52935293DECLINLINE(void) iemFpuRotateStackPush(PCPUMCTX pCtx)
    52945294{
    5295     RTFLOAT80U r80Tmp = pCtx->fpu.aRegs[7].r80;
    5296     pCtx->fpu.aRegs[7].r80 = pCtx->fpu.aRegs[6].r80;
    5297     pCtx->fpu.aRegs[6].r80 = pCtx->fpu.aRegs[5].r80;
    5298     pCtx->fpu.aRegs[5].r80 = pCtx->fpu.aRegs[4].r80;
    5299     pCtx->fpu.aRegs[4].r80 = pCtx->fpu.aRegs[3].r80;
    5300     pCtx->fpu.aRegs[3].r80 = pCtx->fpu.aRegs[2].r80;
    5301     pCtx->fpu.aRegs[2].r80 = pCtx->fpu.aRegs[1].r80;
    5302     pCtx->fpu.aRegs[1].r80 = pCtx->fpu.aRegs[0].r80;
    5303     pCtx->fpu.aRegs[0].r80 = r80Tmp;
     5295    RTFLOAT80U r80Tmp = pCtx->XState.x87.aRegs[7].r80;
     5296    pCtx->XState.x87.aRegs[7].r80 = pCtx->XState.x87.aRegs[6].r80;
     5297    pCtx->XState.x87.aRegs[6].r80 = pCtx->XState.x87.aRegs[5].r80;
     5298    pCtx->XState.x87.aRegs[5].r80 = pCtx->XState.x87.aRegs[4].r80;
     5299    pCtx->XState.x87.aRegs[4].r80 = pCtx->XState.x87.aRegs[3].r80;
     5300    pCtx->XState.x87.aRegs[3].r80 = pCtx->XState.x87.aRegs[2].r80;
     5301    pCtx->XState.x87.aRegs[2].r80 = pCtx->XState.x87.aRegs[1].r80;
     5302    pCtx->XState.x87.aRegs[1].r80 = pCtx->XState.x87.aRegs[0].r80;
     5303    pCtx->XState.x87.aRegs[0].r80 = r80Tmp;
    53045304}
    53055305
     
    53145314DECLINLINE(void) iemFpuRotateStackPop(PCPUMCTX pCtx)
    53155315{
    5316     RTFLOAT80U r80Tmp = pCtx->fpu.aRegs[0].r80;
    5317     pCtx->fpu.aRegs[0].r80 = pCtx->fpu.aRegs[1].r80;
    5318     pCtx->fpu.aRegs[1].r80 = pCtx->fpu.aRegs[2].r80;
    5319     pCtx->fpu.aRegs[2].r80 = pCtx->fpu.aRegs[3].r80;
    5320     pCtx->fpu.aRegs[3].r80 = pCtx->fpu.aRegs[4].r80;
    5321     pCtx->fpu.aRegs[4].r80 = pCtx->fpu.aRegs[5].r80;
    5322     pCtx->fpu.aRegs[5].r80 = pCtx->fpu.aRegs[6].r80;
    5323     pCtx->fpu.aRegs[6].r80 = pCtx->fpu.aRegs[7].r80;
    5324     pCtx->fpu.aRegs[7].r80 = r80Tmp;
     5316    RTFLOAT80U r80Tmp = pCtx->XState.x87.aRegs[0].r80;
     5317    pCtx->XState.x87.aRegs[0].r80 = pCtx->XState.x87.aRegs[1].r80;
     5318    pCtx->XState.x87.aRegs[1].r80 = pCtx->XState.x87.aRegs[2].r80;
     5319    pCtx->XState.x87.aRegs[2].r80 = pCtx->XState.x87.aRegs[3].r80;
     5320    pCtx->XState.x87.aRegs[3].r80 = pCtx->XState.x87.aRegs[4].r80;
     5321    pCtx->XState.x87.aRegs[4].r80 = pCtx->XState.x87.aRegs[5].r80;
     5322    pCtx->XState.x87.aRegs[5].r80 = pCtx->XState.x87.aRegs[6].r80;
     5323    pCtx->XState.x87.aRegs[6].r80 = pCtx->XState.x87.aRegs[7].r80;
     5324    pCtx->XState.x87.aRegs[7].r80 = r80Tmp;
    53255325}
    53265326
     
    53375337{
    53385338    /* Update FSW and bail if there are pending exceptions afterwards. */
    5339     uint16_t fFsw = pCtx->fpu.FSW & ~X86_FSW_C_MASK;
     5339    uint16_t fFsw = pCtx->XState.x87.FSW & ~X86_FSW_C_MASK;
    53405340    fFsw |= pResult->FSW & ~X86_FSW_TOP_MASK;
    5341     if (   (fFsw          & (X86_FSW_IE | X86_FSW_ZE | X86_FSW_DE))
    5342         & ~(pCtx->fpu.FCW & (X86_FCW_IM | X86_FCW_ZM | X86_FCW_DM)))
    5343     {
    5344         pCtx->fpu.FSW = fFsw;
     5341    if (   (fFsw                 & (X86_FSW_IE | X86_FSW_ZE | X86_FSW_DE))
     5342        & ~(pCtx->XState.x87.FCW & (X86_FCW_IM | X86_FCW_ZM | X86_FCW_DM)))
     5343    {
     5344        pCtx->XState.x87.FSW = fFsw;
    53455345        return;
    53465346    }
    53475347
    53485348    uint16_t iNewTop = (X86_FSW_TOP_GET(fFsw) + 7) & X86_FSW_TOP_SMASK;
    5349     if (!(pCtx->fpu.FTW & RT_BIT(iNewTop)))
     5349    if (!(pCtx->XState.x87.FTW & RT_BIT(iNewTop)))
    53505350    {
    53515351        /* All is fine, push the actual value. */
    5352         pCtx->fpu.FTW |= RT_BIT(iNewTop);
    5353         pCtx->fpu.aRegs[7].r80 = pResult->r80Result;
    5354     }
    5355     else if (pCtx->fpu.FCW & X86_FCW_IM)
     5352        pCtx->XState.x87.FTW |= RT_BIT(iNewTop);
     5353        pCtx->XState.x87.aRegs[7].r80 = pResult->r80Result;
     5354    }
     5355    else if (pCtx->XState.x87.FCW & X86_FCW_IM)
    53565356    {
    53575357        /* Masked stack overflow, push QNaN. */
    53585358        fFsw |= X86_FSW_IE | X86_FSW_SF | X86_FSW_C1;
    5359         iemFpuStoreQNan(&pCtx->fpu.aRegs[7].r80);
     5359        iemFpuStoreQNan(&pCtx->XState.x87.aRegs[7].r80);
    53605360    }
    53615361    else
    53625362    {
    53635363        /* Raise stack overflow, don't push anything. */
    5364         pCtx->fpu.FSW |= pResult->FSW & ~X86_FSW_C_MASK;
    5365         pCtx->fpu.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_C1 | X86_FSW_B | X86_FSW_ES;
     5364        pCtx->XState.x87.FSW |= pResult->FSW & ~X86_FSW_C_MASK;
     5365        pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_C1 | X86_FSW_B | X86_FSW_ES;
    53665366        return;
    53675367    }
     
    53695369    fFsw &= ~X86_FSW_TOP_MASK;
    53705370    fFsw |= iNewTop << X86_FSW_TOP_SHIFT;
    5371     pCtx->fpu.FSW = fFsw;
     5371    pCtx->XState.x87.FSW = fFsw;
    53725372
    53735373    iemFpuRotateStackPush(pCtx);
     
    53865386{
    53875387    Assert(iStReg < 8);
    5388     uint16_t  iReg = (X86_FSW_TOP_GET(pCtx->fpu.FSW) + iStReg) & X86_FSW_TOP_SMASK;
    5389     pCtx->fpu.FSW &= ~X86_FSW_C_MASK;
    5390     pCtx->fpu.FSW |= pResult->FSW & ~X86_FSW_TOP_MASK;
    5391     pCtx->fpu.FTW |= RT_BIT(iReg);
    5392     pCtx->fpu.aRegs[iStReg].r80 = pResult->r80Result;
     5388    uint16_t  iReg = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + iStReg) & X86_FSW_TOP_SMASK;
     5389    pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK;
     5390    pCtx->XState.x87.FSW |= pResult->FSW & ~X86_FSW_TOP_MASK;
     5391    pCtx->XState.x87.FTW |= RT_BIT(iReg);
     5392    pCtx->XState.x87.aRegs[iStReg].r80 = pResult->r80Result;
    53935393}
    53945394
     
    54035403static void iemFpuUpdateFSWOnly(PCPUMCTX pCtx, uint16_t u16FSW)
    54045404{
    5405     pCtx->fpu.FSW &= ~X86_FSW_C_MASK;
    5406     pCtx->fpu.FSW |= u16FSW & ~X86_FSW_TOP_MASK;
     5405    pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK;
     5406    pCtx->XState.x87.FSW |= u16FSW & ~X86_FSW_TOP_MASK;
    54075407}
    54085408
     
    54165416{
    54175417    /* Check pending exceptions. */
    5418     uint16_t uFSW = pCtx->fpu.FSW;
    5419     if (   (pCtx->fpu.FSW & (X86_FSW_IE | X86_FSW_ZE | X86_FSW_DE))
    5420         & ~(pCtx->fpu.FCW & (X86_FCW_IM | X86_FCW_ZM | X86_FCW_DM)))
     5418    uint16_t uFSW = pCtx->XState.x87.FSW;
     5419    if (   (pCtx->XState.x87.FSW & (X86_FSW_IE | X86_FSW_ZE | X86_FSW_DE))
     5420        & ~(pCtx->XState.x87.FCW & (X86_FCW_IM | X86_FCW_ZM | X86_FCW_DM)))
    54215421        return;
    54225422
     
    54255425    uFSW &= ~X86_FSW_TOP_MASK;
    54265426    uFSW |= (iOldTop + (UINT16_C(9) << X86_FSW_TOP_SHIFT)) & X86_FSW_TOP_MASK;
    5427     pCtx->fpu.FSW = uFSW;
     5427    pCtx->XState.x87.FSW = uFSW;
    54285428
    54295429    /* Mark the previous ST0 as empty. */
    54305430    iOldTop >>= X86_FSW_TOP_SHIFT;
    5431     pCtx->fpu.FTW &= ~RT_BIT(iOldTop);
     5431    pCtx->XState.x87.FTW &= ~RT_BIT(iOldTop);
    54325432
    54335433    /* Rotate the registers. */
     
    54815481
    54825482    /* Update FSW and bail if there are pending exceptions afterwards. */
    5483     uint16_t fFsw = pCtx->fpu.FSW & ~X86_FSW_C_MASK;
     5483    uint16_t fFsw = pCtx->XState.x87.FSW & ~X86_FSW_C_MASK;
    54845484    fFsw |= pResult->FSW & ~X86_FSW_TOP_MASK;
    54855485    if (   (fFsw          & (X86_FSW_IE | X86_FSW_ZE | X86_FSW_DE))
    5486         & ~(pCtx->fpu.FCW & (X86_FCW_IM | X86_FCW_ZM | X86_FCW_DM)))
    5487     {
    5488         pCtx->fpu.FSW = fFsw;
     5486        & ~(pCtx->XState.x87.FCW & (X86_FCW_IM | X86_FCW_ZM | X86_FCW_DM)))
     5487    {
     5488        pCtx->XState.x87.FSW = fFsw;
    54895489        return;
    54905490    }
    54915491
    54925492    uint16_t iNewTop = (X86_FSW_TOP_GET(fFsw) + 7) & X86_FSW_TOP_SMASK;
    5493     if (!(pCtx->fpu.FTW & RT_BIT(iNewTop)))
     5493    if (!(pCtx->XState.x87.FTW & RT_BIT(iNewTop)))
    54945494    {
    54955495        /* All is fine, push the actual value. */
    5496         pCtx->fpu.FTW |= RT_BIT(iNewTop);
    5497         pCtx->fpu.aRegs[0].r80 = pResult->r80Result1;
    5498         pCtx->fpu.aRegs[7].r80 = pResult->r80Result2;
    5499     }
    5500     else if (pCtx->fpu.FCW & X86_FCW_IM)
     5496        pCtx->XState.x87.FTW |= RT_BIT(iNewTop);
     5497        pCtx->XState.x87.aRegs[0].r80 = pResult->r80Result1;
     5498        pCtx->XState.x87.aRegs[7].r80 = pResult->r80Result2;
     5499    }
     5500    else if (pCtx->XState.x87.FCW & X86_FCW_IM)
    55015501    {
    55025502        /* Masked stack overflow, push QNaN. */
    55035503        fFsw |= X86_FSW_IE | X86_FSW_SF | X86_FSW_C1;
    5504         iemFpuStoreQNan(&pCtx->fpu.aRegs[0].r80);
    5505         iemFpuStoreQNan(&pCtx->fpu.aRegs[7].r80);
     5504        iemFpuStoreQNan(&pCtx->XState.x87.aRegs[0].r80);
     5505        iemFpuStoreQNan(&pCtx->XState.x87.aRegs[7].r80);
    55065506    }
    55075507    else
    55085508    {
    55095509        /* Raise stack overflow, don't push anything. */
    5510         pCtx->fpu.FSW |= pResult->FSW & ~X86_FSW_C_MASK;
    5511         pCtx->fpu.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_C1 | X86_FSW_B | X86_FSW_ES;
     5510        pCtx->XState.x87.FSW |= pResult->FSW & ~X86_FSW_C_MASK;
     5511        pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_C1 | X86_FSW_B | X86_FSW_ES;
    55125512        return;
    55135513    }
     
    55155515    fFsw &= ~X86_FSW_TOP_MASK;
    55165516    fFsw |= iNewTop << X86_FSW_TOP_SHIFT;
    5517     pCtx->fpu.FSW = fFsw;
     5517    pCtx->XState.x87.FSW = fFsw;
    55185518
    55195519    iemFpuRotateStackPush(pCtx);
     
    56195619    Assert(iStReg < 8);
    56205620    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    5621     uint8_t iReg = (X86_FSW_TOP_GET(pCtx->fpu.FSW) + iStReg) & X86_FSW_TOP_SMASK;
    5622     pCtx->fpu.FTW &= ~RT_BIT(iReg);
     5621    uint8_t iReg = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + iStReg) & X86_FSW_TOP_SMASK;
     5622    pCtx->XState.x87.FTW &= ~RT_BIT(iReg);
    56235623}
    56245624
     
    56325632{
    56335633    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    5634     uint16_t uFsw = pCtx->fpu.FSW;
     5634    uint16_t uFsw = pCtx->XState.x87.FSW;
    56355635    uint16_t uTop = uFsw & X86_FSW_TOP_MASK;
    56365636    uTop  = (uTop + (1 << X86_FSW_TOP_SHIFT)) & X86_FSW_TOP_MASK;
    56375637    uFsw &= ~X86_FSW_TOP_MASK;
    56385638    uFsw |= uTop;
    5639     pCtx->fpu.FSW = uFsw;
     5639    pCtx->XState.x87.FSW = uFsw;
    56405640}
    56415641
     
    56495649{
    56505650    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    5651     uint16_t uFsw = pCtx->fpu.FSW;
     5651    uint16_t uFsw = pCtx->XState.x87.FSW;
    56525652    uint16_t uTop = uFsw & X86_FSW_TOP_MASK;
    56535653    uTop  = (uTop + (7 << X86_FSW_TOP_SHIFT)) & X86_FSW_TOP_MASK;
    56545654    uFsw &= ~X86_FSW_TOP_MASK;
    56555655    uFsw |= uTop;
    5656     pCtx->fpu.FSW = uFsw;
     5656    pCtx->XState.x87.FSW = uFsw;
    56575657}
    56585658
     
    57485748{
    57495749    Assert(iStReg < 8 || iStReg == UINT8_MAX);
    5750     if (pCtx->fpu.FCW & X86_FCW_IM)
     5750    if (pCtx->XState.x87.FCW & X86_FCW_IM)
    57515751    {
    57525752        /* Masked underflow. */
    5753         pCtx->fpu.FSW &= ~X86_FSW_C_MASK;
    5754         pCtx->fpu.FSW |= X86_FSW_IE | X86_FSW_SF;
    5755         uint16_t iReg = (X86_FSW_TOP_GET(pCtx->fpu.FSW) + iStReg) & X86_FSW_TOP_SMASK;
     5753        pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK;
     5754        pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF;
     5755        uint16_t iReg = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + iStReg) & X86_FSW_TOP_SMASK;
    57565756        if (iStReg != UINT8_MAX)
    57575757        {
    5758             pCtx->fpu.FTW |= RT_BIT(iReg);
    5759             iemFpuStoreQNan(&pCtx->fpu.aRegs[iStReg].r80);
     5758            pCtx->XState.x87.FTW |= RT_BIT(iReg);
     5759            iemFpuStoreQNan(&pCtx->XState.x87.aRegs[iStReg].r80);
    57605760        }
    57615761    }
    57625762    else
    57635763    {
    5764         pCtx->fpu.FSW &= ~X86_FSW_C_MASK;
    5765         pCtx->fpu.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
     5764        pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK;
     5765        pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
    57665766    }
    57675767}
     
    58305830    iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx);
    58315831
    5832     if (pCtx->fpu.FCW & X86_FCW_IM)
     5832    if (pCtx->XState.x87.FCW & X86_FCW_IM)
    58335833    {
    58345834        /* Masked overflow - Push QNaN. */
    5835         uint16_t iNewTop = (X86_FSW_TOP_GET(pCtx->fpu.FSW) + 7) & X86_FSW_TOP_SMASK;
    5836         pCtx->fpu.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C_MASK);
    5837         pCtx->fpu.FSW |= X86_FSW_IE | X86_FSW_SF;
    5838         pCtx->fpu.FSW |= iNewTop << X86_FSW_TOP_SHIFT;
    5839         pCtx->fpu.FTW |= RT_BIT(iNewTop);
    5840         iemFpuStoreQNan(&pCtx->fpu.aRegs[7].r80);
     5835        uint16_t iNewTop = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + 7) & X86_FSW_TOP_SMASK;
     5836        pCtx->XState.x87.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C_MASK);
     5837        pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF;
     5838        pCtx->XState.x87.FSW |= iNewTop << X86_FSW_TOP_SHIFT;
     5839        pCtx->XState.x87.FTW |= RT_BIT(iNewTop);
     5840        iemFpuStoreQNan(&pCtx->XState.x87.aRegs[7].r80);
    58415841        iemFpuRotateStackPush(pCtx);
    58425842    }
     
    58445844    {
    58455845        /* Exception pending - don't change TOP or the register stack. */
    5846         pCtx->fpu.FSW &= ~X86_FSW_C_MASK;
    5847         pCtx->fpu.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
     5846        pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK;
     5847        pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
    58485848    }
    58495849}
     
    58565856    iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx);
    58575857
    5858     if (pCtx->fpu.FCW & X86_FCW_IM)
     5858    if (pCtx->XState.x87.FCW & X86_FCW_IM)
    58595859    {
    58605860        /* Masked overflow - Push QNaN. */
    5861         uint16_t iNewTop = (X86_FSW_TOP_GET(pCtx->fpu.FSW) + 7) & X86_FSW_TOP_SMASK;
    5862         pCtx->fpu.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C_MASK);
    5863         pCtx->fpu.FSW |= X86_FSW_IE | X86_FSW_SF;
    5864         pCtx->fpu.FSW |= iNewTop << X86_FSW_TOP_SHIFT;
    5865         pCtx->fpu.FTW |= RT_BIT(iNewTop);
    5866         iemFpuStoreQNan(&pCtx->fpu.aRegs[0].r80);
    5867         iemFpuStoreQNan(&pCtx->fpu.aRegs[7].r80);
     5861        uint16_t iNewTop = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + 7) & X86_FSW_TOP_SMASK;
     5862        pCtx->XState.x87.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C_MASK);
     5863        pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF;
     5864        pCtx->XState.x87.FSW |= iNewTop << X86_FSW_TOP_SHIFT;
     5865        pCtx->XState.x87.FTW |= RT_BIT(iNewTop);
     5866        iemFpuStoreQNan(&pCtx->XState.x87.aRegs[0].r80);
     5867        iemFpuStoreQNan(&pCtx->XState.x87.aRegs[7].r80);
    58685868        iemFpuRotateStackPush(pCtx);
    58695869    }
     
    58715871    {
    58725872        /* Exception pending - don't change TOP or the register stack. */
    5873         pCtx->fpu.FSW &= ~X86_FSW_C_MASK;
    5874         pCtx->fpu.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
     5873        pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK;
     5874        pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
    58755875    }
    58765876}
     
    58855885static void iemFpuStackPushOverflowOnly(PIEMCPU pIemCpu, PCPUMCTX pCtx)
    58865886{
    5887     if (pCtx->fpu.FCW & X86_FCW_IM)
     5887    if (pCtx->XState.x87.FCW & X86_FCW_IM)
    58885888    {
    58895889        /* Masked overflow. */
    5890         uint16_t iNewTop = (X86_FSW_TOP_GET(pCtx->fpu.FSW) + 7) & X86_FSW_TOP_SMASK;
    5891         pCtx->fpu.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C_MASK);
    5892         pCtx->fpu.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF;
    5893         pCtx->fpu.FSW |= iNewTop << X86_FSW_TOP_SHIFT;
    5894         pCtx->fpu.FTW |= RT_BIT(iNewTop);
    5895         iemFpuStoreQNan(&pCtx->fpu.aRegs[7].r80);
     5890        uint16_t iNewTop = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + 7) & X86_FSW_TOP_SMASK;
     5891        pCtx->XState.x87.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C_MASK);
     5892        pCtx->XState.x87.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF;
     5893        pCtx->XState.x87.FSW |= iNewTop << X86_FSW_TOP_SHIFT;
     5894        pCtx->XState.x87.FTW |= RT_BIT(iNewTop);
     5895        iemFpuStoreQNan(&pCtx->XState.x87.aRegs[7].r80);
    58965896        iemFpuRotateStackPush(pCtx);
    58975897    }
     
    58995899    {
    59005900        /* Exception pending - don't change TOP or the register stack. */
    5901         pCtx->fpu.FSW &= ~X86_FSW_C_MASK;
    5902         pCtx->fpu.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
     5901        pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK;
     5902        pCtx->XState.x87.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
    59035903    }
    59045904}
     
    59385938{
    59395939    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    5940     uint16_t iReg = (X86_FSW_TOP_GET(pCtx->fpu.FSW) + iStReg) & X86_FSW_TOP_SMASK;
    5941     if (pCtx->fpu.FTW & RT_BIT(iReg))
     5940    uint16_t iReg = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + iStReg) & X86_FSW_TOP_SMASK;
     5941    if (pCtx->XState.x87.FTW & RT_BIT(iReg))
    59425942        return VINF_SUCCESS;
    59435943    return VERR_NOT_FOUND;
     
    59485948{
    59495949    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    5950     uint16_t iReg = (X86_FSW_TOP_GET(pCtx->fpu.FSW) + iStReg) & X86_FSW_TOP_SMASK;
    5951     if (pCtx->fpu.FTW & RT_BIT(iReg))
    5952     {
    5953         *ppRef = &pCtx->fpu.aRegs[iStReg].r80;
     5950    uint16_t iReg = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + iStReg) & X86_FSW_TOP_SMASK;
     5951    if (pCtx->XState.x87.FTW & RT_BIT(iReg))
     5952    {
     5953        *ppRef = &pCtx->XState.x87.aRegs[iStReg].r80;
    59545954        return VINF_SUCCESS;
    59555955    }
     
    59625962{
    59635963    PCPUMCTX pCtx  = pIemCpu->CTX_SUFF(pCtx);
    5964     uint16_t iTop  = X86_FSW_TOP_GET(pCtx->fpu.FSW);
     5964    uint16_t iTop  = X86_FSW_TOP_GET(pCtx->XState.x87.FSW);
    59655965    uint16_t iReg0 = (iTop + iStReg0) & X86_FSW_TOP_SMASK;
    59665966    uint16_t iReg1 = (iTop + iStReg1) & X86_FSW_TOP_SMASK;
    5967     if ((pCtx->fpu.FTW & (RT_BIT(iReg0) | RT_BIT(iReg1))) == (RT_BIT(iReg0) | RT_BIT(iReg1)))
    5968     {
    5969         *ppRef0 = &pCtx->fpu.aRegs[iStReg0].r80;
    5970         *ppRef1 = &pCtx->fpu.aRegs[iStReg1].r80;
     5967    if ((pCtx->XState.x87.FTW & (RT_BIT(iReg0) | RT_BIT(iReg1))) == (RT_BIT(iReg0) | RT_BIT(iReg1)))
     5968    {
     5969        *ppRef0 = &pCtx->XState.x87.aRegs[iStReg0].r80;
     5970        *ppRef1 = &pCtx->XState.x87.aRegs[iStReg1].r80;
    59715971        return VINF_SUCCESS;
    59725972    }
     
    59785978{
    59795979    PCPUMCTX pCtx  = pIemCpu->CTX_SUFF(pCtx);
    5980     uint16_t iTop  = X86_FSW_TOP_GET(pCtx->fpu.FSW);
     5980    uint16_t iTop  = X86_FSW_TOP_GET(pCtx->XState.x87.FSW);
    59815981    uint16_t iReg0 = (iTop + iStReg0) & X86_FSW_TOP_SMASK;
    59825982    uint16_t iReg1 = (iTop + iStReg1) & X86_FSW_TOP_SMASK;
    5983     if ((pCtx->fpu.FTW & (RT_BIT(iReg0) | RT_BIT(iReg1))) == (RT_BIT(iReg0) | RT_BIT(iReg1)))
    5984     {
    5985         *ppRef0 = &pCtx->fpu.aRegs[iStReg0].r80;
     5983    if ((pCtx->XState.x87.FTW & (RT_BIT(iReg0) | RT_BIT(iReg1))) == (RT_BIT(iReg0) | RT_BIT(iReg1)))
     5984    {
     5985        *ppRef0 = &pCtx->XState.x87.aRegs[iStReg0].r80;
    59865986        return VINF_SUCCESS;
    59875987    }
     
    59975997static void iemFpuRecalcExceptionStatus(PCPUMCTX pCtx)
    59985998{
    5999     uint16_t u16Fsw = pCtx->fpu.FSW;
    6000     if ((u16Fsw & X86_FSW_XCPT_MASK) & ~(pCtx->fpu.FCW & X86_FCW_XCPT_MASK))
     5999    uint16_t u16Fsw = pCtx->XState.x87.FSW;
     6000    if ((u16Fsw & X86_FSW_XCPT_MASK) & ~(pCtx->XState.x87.FCW & X86_FCW_XCPT_MASK))
    60016001        u16Fsw |= X86_FSW_ES | X86_FSW_B;
    60026002    else
    60036003        u16Fsw &= ~(X86_FSW_ES | X86_FSW_B);
    6004     pCtx->fpu.FSW = u16Fsw;
     6004    pCtx->XState.x87.FSW = u16Fsw;
    60056005}
    60066006
     
    60146014static uint16_t iemFpuCalcFullFtw(PCCPUMCTX pCtx)
    60156015{
    6016     uint8_t const   u8Ftw  = (uint8_t)pCtx->fpu.FTW;
     6016    uint8_t const   u8Ftw  = (uint8_t)pCtx->XState.x87.FTW;
    60176017    uint16_t        u16Ftw = 0;
    6018     unsigned const  iTop   = X86_FSW_TOP_GET(pCtx->fpu.FSW);
     6018    unsigned const  iTop   = X86_FSW_TOP_GET(pCtx->XState.x87.FSW);
    60196019    for (unsigned iSt = 0; iSt < 8; iSt++)
    60206020    {
     
    60256025        {
    60266026            uint16_t uTag;
    6027             PCRTFLOAT80U const pr80Reg = &pCtx->fpu.aRegs[iSt].r80;
     6027            PCRTFLOAT80U const pr80Reg = &pCtx->XState.x87.aRegs[iSt].r80;
    60286028            if (pr80Reg->s.uExponent == 0x7fff)
    60296029                uTag = 2; /* Exponent is all 1's => Special. */
     
    71727172    /* The lazy approach for now... */
    71737173    /** @todo testcase: Ordering of \#SS(0) vs \#GP() vs \#PF on SSE stuff. */
    7174     if ((GCPtrMem & 15) && !(pIemCpu->CTX_SUFF(pCtx)->fpu.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     7174    if ((GCPtrMem & 15) && !(pIemCpu->CTX_SUFF(pCtx)->XState.x87.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    71757175        return iemRaiseGeneralProtectionFault0(pIemCpu);
    71767176
     
    73727372{
    73737373    /* The lazy approach for now... */
    7374     if ((GCPtrMem & 15) && !(pIemCpu->CTX_SUFF(pCtx)->fpu.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
     7374    if ((GCPtrMem & 15) && !(pIemCpu->CTX_SUFF(pCtx)->XState.x87.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */
    73757375        return iemRaiseGeneralProtectionFault0(pIemCpu);
    73767376
     
    83048304#define IEM_MC_MAYBE_RAISE_FPU_XCPT() \
    83058305    do { \
    8306         if ((pIemCpu)->CTX_SUFF(pCtx)->fpu.FSW & X86_FSW_ES) \
     8306        if ((pIemCpu)->CTX_SUFF(pCtx)->XState.x87.FSW & X86_FSW_ES) \
    83078307            return iemRaiseMathFault(pIemCpu); \
    83088308    } while (0)
     
    83878387#define IEM_MC_FETCH_EFLAGS(a_EFlags)                   (a_EFlags) = (pIemCpu)->CTX_SUFF(pCtx)->eflags.u
    83888388#define IEM_MC_FETCH_EFLAGS_U8(a_EFlags)                (a_EFlags) = (uint8_t)(pIemCpu)->CTX_SUFF(pCtx)->eflags.u
    8389 #define IEM_MC_FETCH_FSW(a_u16Fsw)                      (a_u16Fsw) = pIemCpu->CTX_SUFF(pCtx)->fpu.FSW
    8390 #define IEM_MC_FETCH_FCW(a_u16Fcw)                      (a_u16Fcw) = pIemCpu->CTX_SUFF(pCtx)->fpu.FCW
     8389#define IEM_MC_FETCH_FSW(a_u16Fsw)                      (a_u16Fsw) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.FSW
     8390#define IEM_MC_FETCH_FCW(a_u16Fcw)                      (a_u16Fcw) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.FCW
    83918391
    83928392#define IEM_MC_STORE_GREG_U8(a_iGReg, a_u8Value)        *iemGRegRefU8(pIemCpu, (a_iGReg)) = (a_u8Value)
     
    84018401#define IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(a_pu32Dst)    do { (a_pu32Dst)[1] = 0; } while (0)
    84028402#define IEM_MC_STORE_FPUREG_R80_SRC_REF(a_iSt, a_pr80Src) \
    8403     do { pIemCpu->CTX_SUFF(pCtx)->fpu.aRegs[a_iSt].r80 = *(a_pr80Src); } while (0)
     8403    do { pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[a_iSt].r80 = *(a_pr80Src); } while (0)
    84048404
    84058405#define IEM_MC_REF_GREG_U8(a_pu8Dst, a_iGReg)           (a_pu8Dst) = iemGRegRefU8(pIemCpu, (a_iGReg))
     
    84928492#define IEM_MC_FLIP_EFL_BIT(a_fBit)                     do { (pIemCpu)->CTX_SUFF(pCtx)->eflags.u ^= (a_fBit); } while (0)
    84938493
    8494 #define IEM_MC_CLEAR_FSW_EX()   do { (pIemCpu)->CTX_SUFF(pCtx)->fpu.FSW &= X86_FSW_C_MASK | X86_FSW_TOP_MASK; } while (0)
     8494#define IEM_MC_CLEAR_FSW_EX()   do { (pIemCpu)->CTX_SUFF(pCtx)->XState.x87.FSW &= X86_FSW_C_MASK | X86_FSW_TOP_MASK; } while (0)
    84958495
    84968496
    84978497#define IEM_MC_FETCH_MREG_U64(a_u64Value, a_iMReg) \
    8498     do { (a_u64Value) = pIemCpu->CTX_SUFF(pCtx)->fpu.aRegs[(a_iMReg)].mmx; } while (0)
     8498    do { (a_u64Value) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].mmx; } while (0)
    84998499#define IEM_MC_FETCH_MREG_U32(a_u32Value, a_iMReg) \
    8500     do { (a_u32Value) = pIemCpu->CTX_SUFF(pCtx)->fpu.aRegs[(a_iMReg)].au32[0]; } while (0)
     8500    do { (a_u32Value) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].au32[0]; } while (0)
    85018501#define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) \
    8502     do { pIemCpu->CTX_SUFF(pCtx)->fpu.aRegs[(a_iMReg)].mmx = (a_u64Value); } while (0)
     8502    do { pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].mmx = (a_u64Value); } while (0)
    85038503#define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value) \
    8504     do { pIemCpu->CTX_SUFF(pCtx)->fpu.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); } while (0)
     8504    do { pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); } while (0)
    85058505#define IEM_MC_REF_MREG_U64(a_pu64Dst, a_iMReg)         \
    8506         (a_pu64Dst) = (&pIemCpu->CTX_SUFF(pCtx)->fpu.aRegs[(a_iMReg)].mmx)
     8506        (a_pu64Dst) = (&pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].mmx)
    85078507#define IEM_MC_REF_MREG_U64_CONST(a_pu64Dst, a_iMReg) \
    8508         (a_pu64Dst) = ((uint64_t const *)&pIemCpu->CTX_SUFF(pCtx)->fpu.aRegs[(a_iMReg)].mmx)
     8508        (a_pu64Dst) = ((uint64_t const *)&pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].mmx)
    85098509#define IEM_MC_REF_MREG_U32_CONST(a_pu32Dst, a_iMReg) \
    8510         (a_pu32Dst) = ((uint32_t const *)&pIemCpu->CTX_SUFF(pCtx)->fpu.aRegs[(a_iMReg)].mmx)
     8510        (a_pu32Dst) = ((uint32_t const *)&pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].mmx)
    85118511
    85128512#define IEM_MC_FETCH_XREG_U128(a_u128Value, a_iXReg) \
    8513     do { (a_u128Value) = pIemCpu->CTX_SUFF(pCtx)->fpu.aXMM[(a_iXReg)].xmm; } while (0)
     8513    do { (a_u128Value) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].xmm; } while (0)
    85148514#define IEM_MC_FETCH_XREG_U64(a_u64Value, a_iXReg) \
    8515     do { (a_u64Value) = pIemCpu->CTX_SUFF(pCtx)->fpu.aXMM[(a_iXReg)].au64[0]; } while (0)
     8515    do { (a_u64Value) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au64[0]; } while (0)
    85168516#define IEM_MC_FETCH_XREG_U32(a_u32Value, a_iXReg) \
    8517     do { (a_u32Value) = pIemCpu->CTX_SUFF(pCtx)->fpu.aXMM[(a_iXReg)].au32[0]; } while (0)
     8517    do { (a_u32Value) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au32[0]; } while (0)
    85188518#define IEM_MC_STORE_XREG_U128(a_iXReg, a_u128Value) \
    8519     do { pIemCpu->CTX_SUFF(pCtx)->fpu.aXMM[(a_iXReg)].xmm = (a_u128Value); } while (0)
     8519    do { pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].xmm = (a_u128Value); } while (0)
    85208520#define IEM_MC_STORE_XREG_U64_ZX_U128(a_iXReg, a_u64Value) \
    8521     do { pIemCpu->CTX_SUFF(pCtx)->fpu.aXMM[(a_iXReg)].au64[0] = (a_u64Value); \
    8522          pIemCpu->CTX_SUFF(pCtx)->fpu.aXMM[(a_iXReg)].au64[1] = 0; \
     8521    do { pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); \
     8522         pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au64[1] = 0; \
    85238523    } while (0)
    85248524#define IEM_MC_STORE_XREG_U32_ZX_U128(a_iXReg, a_u32Value) \
    8525     do { pIemCpu->CTX_SUFF(pCtx)->fpu.aXMM[(a_iXReg)].au64[0] = (uint32_t)(a_u32Value); \
    8526          pIemCpu->CTX_SUFF(pCtx)->fpu.aXMM[(a_iXReg)].au64[1] = 0; \
     8525    do { pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au64[0] = (uint32_t)(a_u32Value); \
     8526         pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au64[1] = 0; \
    85278527    } while (0)
    85288528#define IEM_MC_REF_XREG_U128(a_pu128Dst, a_iXReg)       \
    8529     (a_pu128Dst) = (&pIemCpu->CTX_SUFF(pCtx)->fpu.aXMM[(a_iXReg)].xmm)
     8529    (a_pu128Dst) = (&pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].xmm)
    85308530#define IEM_MC_REF_XREG_U128_CONST(a_pu128Dst, a_iXReg) \
    8531     (a_pu128Dst) = ((uint128_t const *)&pIemCpu->CTX_SUFF(pCtx)->fpu.aXMM[(a_iXReg)].xmm)
     8531    (a_pu128Dst) = ((uint128_t const *)&pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].xmm)
    85328532#define IEM_MC_REF_XREG_U64_CONST(a_pu64Dst, a_iXReg) \
    8533     (a_pu64Dst) = ((uint64_t const *)&pIemCpu->CTX_SUFF(pCtx)->fpu.aXMM[(a_iXReg)].au64[0])
     8533    (a_pu64Dst) = ((uint64_t const *)&pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au64[0])
    85348534
    85358535#define IEM_MC_FETCH_MEM_U8(a_u8Dst, a_iSeg, a_GCPtrMem) \
     
    87398739        if (   !(a_u16FSW & X86_FSW_ES) \
    87408740            || !(  (a_u16FSW & (X86_FSW_UE | X86_FSW_OE | X86_FSW_IE)) \
    8741                  & ~(pIemCpu->CTX_SUFF(pCtx)->fpu.FCW & X86_FCW_MASK_ALL) ) ) \
     8741                 & ~(pIemCpu->CTX_SUFF(pCtx)->XState.x87.FCW & X86_FCW_MASK_ALL) ) ) \
    87428742            IEM_MC_RETURN_ON_FAILURE(iemMemCommitAndUnmap(pIemCpu, (a_pvMem), (a_fAccess))); \
    87438743    } while (0)
     
    88758875    do { \
    88768876        iemFpuPrepareUsage(pIemCpu); \
    8877         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->fpu, (a0)); \
     8877        a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0)); \
    88788878    } while (0)
    88798879
     
    88888888    do { \
    88898889        iemFpuPrepareUsage(pIemCpu); \
    8890         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->fpu, (a0), (a1)); \
     8890        a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0), (a1)); \
    88918891    } while (0)
    88928892
     
    89028902    do { \
    89038903        iemFpuPrepareUsage(pIemCpu); \
    8904         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->fpu, (a0), (a1), (a2)); \
     8904        a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0), (a1), (a2)); \
    89058905    } while (0)
    89068906
     
    90199019    do { \
    90209020        iemFpuPrepareUsage(pIemCpu); \
    9021         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->fpu, (a0), (a1)); \
     9021        a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0), (a1)); \
    90229022    } while (0)
    90239023
     
    90339033    do { \
    90349034        iemFpuPrepareUsage(pIemCpu); \
    9035         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->fpu, (a0), (a1), (a2)); \
     9035        a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0), (a1), (a2)); \
    90369036    } while (0)
    90379037
     
    90479047    do { \
    90489048        iemFpuPrepareUsageSse(pIemCpu); \
    9049         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->fpu, (a0), (a1)); \
     9049        a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0), (a1)); \
    90509050    } while (0)
    90519051
     
    90619061    do { \
    90629062        iemFpuPrepareUsageSse(pIemCpu); \
    9063         a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->fpu, (a0), (a1), (a2)); \
     9063        a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0), (a1), (a2)); \
    90649064    } while (0)
    90659065
     
    91319131    if (iemFpu2StRegsNotEmptyRefFirst(pIemCpu, (a_iSt0), &(a_pr80Dst0), (a_iSt1)) == VINF_SUCCESS) {
    91329132#define IEM_MC_IF_FCW_IM() \
    9133     if (pIemCpu->CTX_SUFF(pCtx)->fpu.FCW & X86_FCW_IM) {
     9133    if (pIemCpu->CTX_SUFF(pCtx)->XState.x87.FCW & X86_FCW_IM) {
    91349134
    91359135#define IEM_MC_ELSE()                                   } else {
     
    1021910219        if (fRem)
    1022010220        {
    10221             pOrgCtx->fpu.FOP        = pDebugCtx->fpu.FOP;
    10222             pOrgCtx->fpu.FPUIP      = pDebugCtx->fpu.FPUIP;
    10223             pOrgCtx->fpu.CS         = pDebugCtx->fpu.CS;
    10224             pOrgCtx->fpu.Rsrvd1     = pDebugCtx->fpu.Rsrvd1;
    10225             pOrgCtx->fpu.FPUDP      = pDebugCtx->fpu.FPUDP;
    10226             pOrgCtx->fpu.DS         = pDebugCtx->fpu.DS;
    10227             pOrgCtx->fpu.Rsrvd2     = pDebugCtx->fpu.Rsrvd2;
    10228             //pOrgCtx->fpu.MXCSR_MASK = pDebugCtx->fpu.MXCSR_MASK;
    10229             if ((pOrgCtx->fpu.FSW & X86_FSW_TOP_MASK) == (pDebugCtx->fpu.FSW & X86_FSW_TOP_MASK))
    10230                 pOrgCtx->fpu.FSW = pDebugCtx->fpu.FSW;
     10221            pOrgCtx->XState.x87.FOP        = pDebugCtx->XState.x87.FOP;
     10222            pOrgCtx->XState.x87.FPUIP      = pDebugCtx->XState.x87.FPUIP;
     10223            pOrgCtx->XState.x87.CS         = pDebugCtx->XState.x87.CS;
     10224            pOrgCtx->XState.x87.Rsrvd1     = pDebugCtx->XState.x87.Rsrvd1;
     10225            pOrgCtx->XState.x87.FPUDP      = pDebugCtx->XState.x87.FPUDP;
     10226            pOrgCtx->XState.x87.DS         = pDebugCtx->XState.x87.DS;
     10227            pOrgCtx->XState.x87.Rsrvd2     = pDebugCtx->XState.x87.Rsrvd2;
     10228            //pOrgCtx->XState.x87.MXCSR_MASK = pDebugCtx->XState.x87.MXCSR_MASK;
     10229            if ((pOrgCtx->XState.x87.FSW & X86_FSW_TOP_MASK) == (pDebugCtx->XState.x87.FSW & X86_FSW_TOP_MASK))
     10230                pOrgCtx->XState.x87.FSW = pDebugCtx->XState.x87.FSW;
    1023110231        }
    1023210232#endif
    10233         if (memcmp(&pOrgCtx->fpu, &pDebugCtx->fpu, sizeof(pDebugCtx->fpu)))
     10233        if (memcmp(&pOrgCtx->XState.x87, &pDebugCtx->XState.x87, sizeof(pDebugCtx->XState.x87)))
    1023410234        {
    1023510235            RTAssertMsg2Weak("  the FPU state differs\n");
    1023610236            cDiffs++;
    10237             CHECK_FIELD(fpu.FCW);
    10238             CHECK_FIELD(fpu.FSW);
    10239             CHECK_FIELD(fpu.FTW);
    10240             CHECK_FIELD(fpu.FOP);
    10241             CHECK_FIELD(fpu.FPUIP);
    10242             CHECK_FIELD(fpu.CS);
    10243             CHECK_FIELD(fpu.Rsrvd1);
    10244             CHECK_FIELD(fpu.FPUDP);
    10245             CHECK_FIELD(fpu.DS);
    10246             CHECK_FIELD(fpu.Rsrvd2);
    10247             CHECK_FIELD(fpu.MXCSR);
    10248             CHECK_FIELD(fpu.MXCSR_MASK);
    10249             CHECK_FIELD(fpu.aRegs[0].au64[0]); CHECK_FIELD(fpu.aRegs[0].au64[1]);
    10250             CHECK_FIELD(fpu.aRegs[1].au64[0]); CHECK_FIELD(fpu.aRegs[1].au64[1]);
    10251             CHECK_FIELD(fpu.aRegs[2].au64[0]); CHECK_FIELD(fpu.aRegs[2].au64[1]);
    10252             CHECK_FIELD(fpu.aRegs[3].au64[0]); CHECK_FIELD(fpu.aRegs[3].au64[1]);
    10253             CHECK_FIELD(fpu.aRegs[4].au64[0]); CHECK_FIELD(fpu.aRegs[4].au64[1]);
    10254             CHECK_FIELD(fpu.aRegs[5].au64[0]); CHECK_FIELD(fpu.aRegs[5].au64[1]);
    10255             CHECK_FIELD(fpu.aRegs[6].au64[0]); CHECK_FIELD(fpu.aRegs[6].au64[1]);
    10256             CHECK_FIELD(fpu.aRegs[7].au64[0]); CHECK_FIELD(fpu.aRegs[7].au64[1]);
    10257             CHECK_FIELD(fpu.aXMM[ 0].au64[0]);  CHECK_FIELD(fpu.aXMM[ 0].au64[1]);
    10258             CHECK_FIELD(fpu.aXMM[ 1].au64[0]);  CHECK_FIELD(fpu.aXMM[ 1].au64[1]);
    10259             CHECK_FIELD(fpu.aXMM[ 2].au64[0]);  CHECK_FIELD(fpu.aXMM[ 2].au64[1]);
    10260             CHECK_FIELD(fpu.aXMM[ 3].au64[0]);  CHECK_FIELD(fpu.aXMM[ 3].au64[1]);
    10261             CHECK_FIELD(fpu.aXMM[ 4].au64[0]);  CHECK_FIELD(fpu.aXMM[ 4].au64[1]);
    10262             CHECK_FIELD(fpu.aXMM[ 5].au64[0]);  CHECK_FIELD(fpu.aXMM[ 5].au64[1]);
    10263             CHECK_FIELD(fpu.aXMM[ 6].au64[0]);  CHECK_FIELD(fpu.aXMM[ 6].au64[1]);
    10264             CHECK_FIELD(fpu.aXMM[ 7].au64[0]);  CHECK_FIELD(fpu.aXMM[ 7].au64[1]);
    10265             CHECK_FIELD(fpu.aXMM[ 8].au64[0]);  CHECK_FIELD(fpu.aXMM[ 8].au64[1]);
    10266             CHECK_FIELD(fpu.aXMM[ 9].au64[0]);  CHECK_FIELD(fpu.aXMM[ 9].au64[1]);
    10267             CHECK_FIELD(fpu.aXMM[10].au64[0]);  CHECK_FIELD(fpu.aXMM[10].au64[1]);
    10268             CHECK_FIELD(fpu.aXMM[11].au64[0]);  CHECK_FIELD(fpu.aXMM[11].au64[1]);
    10269             CHECK_FIELD(fpu.aXMM[12].au64[0]);  CHECK_FIELD(fpu.aXMM[12].au64[1]);
    10270             CHECK_FIELD(fpu.aXMM[13].au64[0]);  CHECK_FIELD(fpu.aXMM[13].au64[1]);
    10271             CHECK_FIELD(fpu.aXMM[14].au64[0]);  CHECK_FIELD(fpu.aXMM[14].au64[1]);
    10272             CHECK_FIELD(fpu.aXMM[15].au64[0]);  CHECK_FIELD(fpu.aXMM[15].au64[1]);
    10273             for (unsigned i = 0; i < RT_ELEMENTS(pOrgCtx->fpu.au32RsrvdRest); i++)
    10274                 CHECK_FIELD(fpu.au32RsrvdRest[i]);
     10237            CHECK_FIELD(XState.x87.FCW);
     10238            CHECK_FIELD(XState.x87.FSW);
     10239            CHECK_FIELD(XState.x87.FTW);
     10240            CHECK_FIELD(XState.x87.FOP);
     10241            CHECK_FIELD(XState.x87.FPUIP);
     10242            CHECK_FIELD(XState.x87.CS);
     10243            CHECK_FIELD(XState.x87.Rsrvd1);
     10244            CHECK_FIELD(XState.x87.FPUDP);
     10245            CHECK_FIELD(XState.x87.DS);
     10246            CHECK_FIELD(XState.x87.Rsrvd2);
     10247            CHECK_FIELD(XState.x87.MXCSR);
     10248            CHECK_FIELD(XState.x87.MXCSR_MASK);
     10249            CHECK_FIELD(XState.x87.aRegs[0].au64[0]); CHECK_FIELD(XState.x87.aRegs[0].au64[1]);
     10250            CHECK_FIELD(XState.x87.aRegs[1].au64[0]); CHECK_FIELD(XState.x87.aRegs[1].au64[1]);
     10251            CHECK_FIELD(XState.x87.aRegs[2].au64[0]); CHECK_FIELD(XState.x87.aRegs[2].au64[1]);
     10252            CHECK_FIELD(XState.x87.aRegs[3].au64[0]); CHECK_FIELD(XState.x87.aRegs[3].au64[1]);
     10253            CHECK_FIELD(XState.x87.aRegs[4].au64[0]); CHECK_FIELD(XState.x87.aRegs[4].au64[1]);
     10254            CHECK_FIELD(XState.x87.aRegs[5].au64[0]); CHECK_FIELD(XState.x87.aRegs[5].au64[1]);
     10255            CHECK_FIELD(XState.x87.aRegs[6].au64[0]); CHECK_FIELD(XState.x87.aRegs[6].au64[1]);
     10256            CHECK_FIELD(XState.x87.aRegs[7].au64[0]); CHECK_FIELD(XState.x87.aRegs[7].au64[1]);
     10257            CHECK_FIELD(XState.x87.aXMM[ 0].au64[0]);  CHECK_FIELD(XState.x87.aXMM[ 0].au64[1]);
     10258            CHECK_FIELD(XState.x87.aXMM[ 1].au64[0]);  CHECK_FIELD(XState.x87.aXMM[ 1].au64[1]);
     10259            CHECK_FIELD(XState.x87.aXMM[ 2].au64[0]);  CHECK_FIELD(XState.x87.aXMM[ 2].au64[1]);
     10260            CHECK_FIELD(XState.x87.aXMM[ 3].au64[0]);  CHECK_FIELD(XState.x87.aXMM[ 3].au64[1]);
     10261            CHECK_FIELD(XState.x87.aXMM[ 4].au64[0]);  CHECK_FIELD(XState.x87.aXMM[ 4].au64[1]);
     10262            CHECK_FIELD(XState.x87.aXMM[ 5].au64[0]);  CHECK_FIELD(XState.x87.aXMM[ 5].au64[1]);
     10263            CHECK_FIELD(XState.x87.aXMM[ 6].au64[0]);  CHECK_FIELD(XState.x87.aXMM[ 6].au64[1]);
     10264            CHECK_FIELD(XState.x87.aXMM[ 7].au64[0]);  CHECK_FIELD(XState.x87.aXMM[ 7].au64[1]);
     10265            CHECK_FIELD(XState.x87.aXMM[ 8].au64[0]);  CHECK_FIELD(XState.x87.aXMM[ 8].au64[1]);
     10266            CHECK_FIELD(XState.x87.aXMM[ 9].au64[0]);  CHECK_FIELD(XState.x87.aXMM[ 9].au64[1]);
     10267            CHECK_FIELD(XState.x87.aXMM[10].au64[0]);  CHECK_FIELD(XState.x87.aXMM[10].au64[1]);
     10268            CHECK_FIELD(XState.x87.aXMM[11].au64[0]);  CHECK_FIELD(XState.x87.aXMM[11].au64[1]);
     10269            CHECK_FIELD(XState.x87.aXMM[12].au64[0]);  CHECK_FIELD(XState.x87.aXMM[12].au64[1]);
     10270            CHECK_FIELD(XState.x87.aXMM[13].au64[0]);  CHECK_FIELD(XState.x87.aXMM[13].au64[1]);
     10271            CHECK_FIELD(XState.x87.aXMM[14].au64[0]);  CHECK_FIELD(XState.x87.aXMM[14].au64[1]);
     10272            CHECK_FIELD(XState.x87.aXMM[15].au64[0]);  CHECK_FIELD(XState.x87.aXMM[15].au64[1]);
     10273            for (unsigned i = 0; i < RT_ELEMENTS(pOrgCtx->XState.x87.au32RsrvdRest); i++)
     10274                CHECK_FIELD(XState.x87.au32RsrvdRest[i]);
    1027510275        }
    1027610276        CHECK_FIELD(rip);
     
    1052910529              pCtx->cs.Sel, pCtx->ss.Sel, pCtx->ds.Sel, pCtx->es.Sel,
    1053010530              pCtx->fs.Sel, pCtx->gs.Sel, pCtx->eflags.u,
    10531               pCtx->fpu.FSW, pCtx->fpu.FCW, pCtx->fpu.FTW, pCtx->fpu.MXCSR, pCtx->fpu.MXCSR_MASK,
     10531              pCtx->XState.x87.FSW, pCtx->XState.x87.FCW, pCtx->XState.x87.FTW, pCtx->XState.x87.MXCSR, pCtx->XState.x87.MXCSR_MASK,
    1053210532              szInstr));
    1053310533
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r54862 r54898  
    54365436    else
    54375437    {
     5438#ifdef IN_RING3
    54385439        CPUMCTX CtxTmp = *pCtx;
    54395440        rcStrict = CPUMSetGuestMsr(IEMCPU_TO_VMCPU(pIemCpu), pCtx->ecx, uValue.u);
     
    54415442        *pCtx = *pCtx2;
    54425443        *pCtx2 = CtxTmp;
     5444#else
     5445        AssertReleaseFailedReturn(VERR_INTERNAL_ERROR_4);
     5446#endif
    54435447    }
    54445448    if (rcStrict == VINF_SUCCESS)
     
    60416045    if (iemFRegIsFxSaveFormat(pIemCpu))
    60426046    {
    6043         pCtx->fpu.FCW   = 0x37f;
    6044         pCtx->fpu.FSW   = 0;
    6045         pCtx->fpu.FTW   = 0x00;         /* 0 - empty. */
    6046         pCtx->fpu.FPUDP = 0;
    6047         pCtx->fpu.DS    = 0; //??
    6048         pCtx->fpu.Rsrvd2= 0;
    6049         pCtx->fpu.FPUIP = 0;
    6050         pCtx->fpu.CS    = 0; //??
    6051         pCtx->fpu.Rsrvd1= 0;
    6052         pCtx->fpu.FOP   = 0;
     6047        pCtx->XState.x87.FCW   = 0x37f;
     6048        pCtx->XState.x87.FSW   = 0;
     6049        pCtx->XState.x87.FTW   = 0x00;         /* 0 - empty. */
     6050        pCtx->XState.x87.FPUDP = 0;
     6051        pCtx->XState.x87.DS    = 0; //??
     6052        pCtx->XState.x87.Rsrvd2= 0;
     6053        pCtx->XState.x87.FPUIP = 0;
     6054        pCtx->XState.x87.CS    = 0; //??
     6055        pCtx->XState.x87.Rsrvd1= 0;
     6056        pCtx->XState.x87.FOP   = 0;
    60536057    }
    60546058    else
    60556059    {
    6056         PX86FPUSTATE pFpu = (PX86FPUSTATE)&pCtx->fpu;
     6060        PX86FPUSTATE pFpu = (PX86FPUSTATE)&pCtx->XState.x87;
    60576061        pFpu->FCW       = 0x37f;
    60586062        pFpu->FSW       = 0;
     
    61176121
    61186122    /* common for all formats */
    6119     pDst->FCW           = pCtx->fpu.FCW;
    6120     pDst->FSW           = pCtx->fpu.FSW;
    6121     pDst->FTW           = pCtx->fpu.FTW & UINT16_C(0xff);
    6122     pDst->FOP           = pCtx->fpu.FOP;
    6123     pDst->MXCSR         = pCtx->fpu.MXCSR;
    6124     pDst->MXCSR_MASK    = pCtx->fpu.MXCSR_MASK;
     6123    pDst->FCW           = pCtx->XState.x87.FCW;
     6124    pDst->FSW           = pCtx->XState.x87.FSW;
     6125    pDst->FTW           = pCtx->XState.x87.FTW & UINT16_C(0xff);
     6126    pDst->FOP           = pCtx->XState.x87.FOP;
     6127    pDst->MXCSR         = pCtx->XState.x87.MXCSR;
     6128    pDst->MXCSR_MASK    = pCtx->XState.x87.MXCSR_MASK;
    61256129    for (uint32_t i = 0; i < RT_ELEMENTS(pDst->aRegs); i++)
    61266130    {
    61276131        /** @todo Testcase: What actually happens to the 6 reserved bytes? I'm clearing
    61286132         *        them for now... */
    6129         pDst->aRegs[i].au32[0] = pCtx->fpu.aRegs[i].au32[0];
    6130         pDst->aRegs[i].au32[1] = pCtx->fpu.aRegs[i].au32[1];
    6131         pDst->aRegs[i].au32[2] = pCtx->fpu.aRegs[i].au32[2] & UINT32_C(0xffff);
     6133        pDst->aRegs[i].au32[0] = pCtx->XState.x87.aRegs[i].au32[0];
     6134        pDst->aRegs[i].au32[1] = pCtx->XState.x87.aRegs[i].au32[1];
     6135        pDst->aRegs[i].au32[2] = pCtx->XState.x87.aRegs[i].au32[2] & UINT32_C(0xffff);
    61326136        pDst->aRegs[i].au32[3] = 0;
    61336137    }
    61346138
    61356139    /* FPU IP, CS, DP and DS. */
    6136     pDst->FPUIP  = pCtx->fpu.FPUIP;
    6137     pDst->CS     = pCtx->fpu.CS;
    6138     pDst->FPUDP  = pCtx->fpu.FPUDP;
    6139     pDst->DS     = pCtx->fpu.DS;
     6140    pDst->FPUIP  = pCtx->XState.x87.FPUIP;
     6141    pDst->CS     = pCtx->XState.x87.CS;
     6142    pDst->FPUDP  = pCtx->XState.x87.FPUDP;
     6143    pDst->DS     = pCtx->XState.x87.DS;
    61406144    if (enmEffOpSize == IEMMODE_64BIT)
    61416145    {
    61426146        /* Save upper 16-bits of FPUIP (IP:CS:Rsvd1) and FPUDP (DP:DS:Rsvd2). */
    6143         pDst->Rsrvd1 = pCtx->fpu.Rsrvd1;
    6144         pDst->Rsrvd2 = pCtx->fpu.Rsrvd2;
     6147        pDst->Rsrvd1 = pCtx->XState.x87.Rsrvd1;
     6148        pDst->Rsrvd2 = pCtx->XState.x87.Rsrvd2;
    61456149        pDst->au32RsrvdForSoftware[0] = 0;
    61466150    }
     
    61596163        uint32_t cXmmRegs = enmEffOpSize == IEMMODE_64BIT ? 16 : 8;
    61606164        for (uint32_t i = 0; i < cXmmRegs; i++)
    6161             pDst->aXMM[i] = pCtx->fpu.aXMM[i];
     6165            pDst->aXMM[i] = pCtx->XState.x87.aXMM[i];
    61626166        /** @todo Testcase: What happens to the reserved XMM registers? Untouched,
    61636167         *        right? */
     
    62186222     */
    62196223    uint32_t const fMXCSR      = pSrc->MXCSR;
    6220     uint32_t const fMXCSR_MASK = pCtx->fpu.MXCSR_MASK ? pCtx->fpu.MXCSR_MASK : UINT32_C(0xffbf);
     6224    uint32_t const fMXCSR_MASK = pCtx->XState.x87.MXCSR_MASK ? pCtx->XState.x87.MXCSR_MASK : UINT32_C(0xffbf);
    62216225    if (fMXCSR & ~fMXCSR_MASK)
    62226226    {
     
    62326236
    62336237    /* common for all formats */
    6234     pCtx->fpu.FCW       = pSrc->FCW;
    6235     pCtx->fpu.FSW       = pSrc->FSW;
    6236     pCtx->fpu.FTW       = pSrc->FTW & UINT16_C(0xff);
    6237     pCtx->fpu.FOP       = pSrc->FOP;
    6238     pCtx->fpu.MXCSR     = fMXCSR;
     6238    pCtx->XState.x87.FCW       = pSrc->FCW;
     6239    pCtx->XState.x87.FSW       = pSrc->FSW;
     6240    pCtx->XState.x87.FTW       = pSrc->FTW & UINT16_C(0xff);
     6241    pCtx->XState.x87.FOP       = pSrc->FOP;
     6242    pCtx->XState.x87.MXCSR     = fMXCSR;
    62396243    /* (MXCSR_MASK is read-only) */
    62406244    for (uint32_t i = 0; i < RT_ELEMENTS(pSrc->aRegs); i++)
    62416245    {
    6242         pCtx->fpu.aRegs[i].au32[0] = pSrc->aRegs[i].au32[0];
    6243         pCtx->fpu.aRegs[i].au32[1] = pSrc->aRegs[i].au32[1];
    6244         pCtx->fpu.aRegs[i].au32[2] = pSrc->aRegs[i].au32[2] & UINT32_C(0xffff);
    6245         pCtx->fpu.aRegs[i].au32[3] = 0;
     6246        pCtx->XState.x87.aRegs[i].au32[0] = pSrc->aRegs[i].au32[0];
     6247        pCtx->XState.x87.aRegs[i].au32[1] = pSrc->aRegs[i].au32[1];
     6248        pCtx->XState.x87.aRegs[i].au32[2] = pSrc->aRegs[i].au32[2] & UINT32_C(0xffff);
     6249        pCtx->XState.x87.aRegs[i].au32[3] = 0;
    62466250    }
    62476251
     
    62496253    if (pIemCpu->enmCpuMode == IEMMODE_64BIT)
    62506254    {
    6251         pCtx->fpu.FPUIP  = pSrc->FPUIP;
    6252         pCtx->fpu.CS     = pSrc->CS;
    6253         pCtx->fpu.Rsrvd1 = pSrc->Rsrvd1;
    6254         pCtx->fpu.FPUDP  = pSrc->FPUDP;
    6255         pCtx->fpu.DS     = pSrc->DS;
    6256         pCtx->fpu.Rsrvd2 = pSrc->Rsrvd2;
     6255        pCtx->XState.x87.FPUIP  = pSrc->FPUIP;
     6256        pCtx->XState.x87.CS     = pSrc->CS;
     6257        pCtx->XState.x87.Rsrvd1 = pSrc->Rsrvd1;
     6258        pCtx->XState.x87.FPUDP  = pSrc->FPUDP;
     6259        pCtx->XState.x87.DS     = pSrc->DS;
     6260        pCtx->XState.x87.Rsrvd2 = pSrc->Rsrvd2;
    62576261    }
    62586262    else
    62596263    {
    6260         pCtx->fpu.FPUIP  = pSrc->FPUIP;
    6261         pCtx->fpu.CS     = pSrc->CS;
    6262         pCtx->fpu.Rsrvd1 = 0;
    6263         pCtx->fpu.FPUDP  = pSrc->FPUDP;
    6264         pCtx->fpu.DS     = pSrc->DS;
    6265         pCtx->fpu.Rsrvd2 = 0;
     6264        pCtx->XState.x87.FPUIP  = pSrc->FPUIP;
     6265        pCtx->XState.x87.CS     = pSrc->CS;
     6266        pCtx->XState.x87.Rsrvd1 = 0;
     6267        pCtx->XState.x87.FPUDP  = pSrc->FPUDP;
     6268        pCtx->XState.x87.DS     = pSrc->DS;
     6269        pCtx->XState.x87.Rsrvd2 = 0;
    62666270    }
    62676271
     
    62736277        uint32_t cXmmRegs = enmEffOpSize == IEMMODE_64BIT ? 16 : 8;
    62746278        for (uint32_t i = 0; i < cXmmRegs; i++)
    6275             pCtx->fpu.aXMM[i] = pSrc->aXMM[i];
     6279            pCtx->XState.x87.aXMM[i] = pSrc->aXMM[i];
    62766280    }
    62776281
     
    62996303    if (enmEffOpSize == IEMMODE_16BIT)
    63006304    {
    6301         uPtr.pu16[0] = pCtx->fpu.FCW;
    6302         uPtr.pu16[1] = pCtx->fpu.FSW;
     6305        uPtr.pu16[0] = pCtx->XState.x87.FCW;
     6306        uPtr.pu16[1] = pCtx->XState.x87.FSW;
    63036307        uPtr.pu16[2] = iemFpuCalcFullFtw(pCtx);
    63046308        if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
     
    63096313             *        effective address ((CS << 4) + IP) in the offset register and not
    63106314             *        doing any address calculations here. */
    6311             uPtr.pu16[3] = (uint16_t)pCtx->fpu.FPUIP;
    6312             uPtr.pu16[4] = ((pCtx->fpu.FPUIP >> 4) & UINT16_C(0xf000)) | pCtx->fpu.FOP;
    6313             uPtr.pu16[5] = (uint16_t)pCtx->fpu.FPUDP;
    6314             uPtr.pu16[6] = (pCtx->fpu.FPUDP  >> 4) & UINT16_C(0xf000);
     6315            uPtr.pu16[3] = (uint16_t)pCtx->XState.x87.FPUIP;
     6316            uPtr.pu16[4] = ((pCtx->XState.x87.FPUIP >> 4) & UINT16_C(0xf000)) | pCtx->XState.x87.FOP;
     6317            uPtr.pu16[5] = (uint16_t)pCtx->XState.x87.FPUDP;
     6318            uPtr.pu16[6] = (pCtx->XState.x87.FPUDP  >> 4) & UINT16_C(0xf000);
    63156319        }
    63166320        else
    63176321        {
    6318             uPtr.pu16[3] = pCtx->fpu.FPUIP;
    6319             uPtr.pu16[4] = pCtx->fpu.CS;
    6320             uPtr.pu16[5] = pCtx->fpu.FPUDP;
    6321             uPtr.pu16[6] = pCtx->fpu.DS;
     6322            uPtr.pu16[3] = pCtx->XState.x87.FPUIP;
     6323            uPtr.pu16[4] = pCtx->XState.x87.CS;
     6324            uPtr.pu16[5] = pCtx->XState.x87.FPUDP;
     6325            uPtr.pu16[6] = pCtx->XState.x87.DS;
    63226326        }
    63236327    }
     
    63256329    {
    63266330        /** @todo Testcase: what is stored in the "gray" areas? (figure 8-9 and 8-10) */
    6327         uPtr.pu16[0*2] = pCtx->fpu.FCW;
    6328         uPtr.pu16[1*2] = pCtx->fpu.FSW;
     6331        uPtr.pu16[0*2] = pCtx->XState.x87.FCW;
     6332        uPtr.pu16[1*2] = pCtx->XState.x87.FSW;
    63296333        uPtr.pu16[2*2] = iemFpuCalcFullFtw(pCtx);
    63306334        if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
    63316335        {
    6332             uPtr.pu16[3*2]  = (uint16_t)pCtx->fpu.FPUIP;
    6333             uPtr.pu32[4]    = ((pCtx->fpu.FPUIP & UINT32_C(0xffff0000)) >> 4) | pCtx->fpu.FOP;
    6334             uPtr.pu16[5*2]  = (uint16_t)pCtx->fpu.FPUDP;
    6335             uPtr.pu32[6]    = (pCtx->fpu.FPUDP  & UINT32_C(0xffff0000)) >> 4;
     6336            uPtr.pu16[3*2]  = (uint16_t)pCtx->XState.x87.FPUIP;
     6337            uPtr.pu32[4]    = ((pCtx->XState.x87.FPUIP & UINT32_C(0xffff0000)) >> 4) | pCtx->XState.x87.FOP;
     6338            uPtr.pu16[5*2]  = (uint16_t)pCtx->XState.x87.FPUDP;
     6339            uPtr.pu32[6]    = (pCtx->XState.x87.FPUDP  & UINT32_C(0xffff0000)) >> 4;
    63366340        }
    63376341        else
    63386342        {
    6339             uPtr.pu32[3]    = pCtx->fpu.FPUIP;
    6340             uPtr.pu16[4*2]  = pCtx->fpu.CS;
    6341             uPtr.pu16[4*2+1]= pCtx->fpu.FOP;
    6342             uPtr.pu32[5]    = pCtx->fpu.FPUDP;
    6343             uPtr.pu16[6*2]  = pCtx->fpu.DS;
     6343            uPtr.pu32[3]    = pCtx->XState.x87.FPUIP;
     6344            uPtr.pu16[4*2]  = pCtx->XState.x87.CS;
     6345            uPtr.pu16[4*2+1]= pCtx->XState.x87.FOP;
     6346            uPtr.pu32[5]    = pCtx->XState.x87.FPUDP;
     6347            uPtr.pu16[6*2]  = pCtx->XState.x87.DS;
    63446348        }
    63456349    }
     
    63576361    if (enmEffOpSize == IEMMODE_16BIT)
    63586362    {
    6359         pCtx->fpu.FCW = uPtr.pu16[0];
    6360         pCtx->fpu.FSW = uPtr.pu16[1];
    6361         pCtx->fpu.FTW = uPtr.pu16[2];
     6363        pCtx->XState.x87.FCW = uPtr.pu16[0];
     6364        pCtx->XState.x87.FSW = uPtr.pu16[1];
     6365        pCtx->XState.x87.FTW = uPtr.pu16[2];
    63626366        if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
    63636367        {
    6364             pCtx->fpu.FPUIP = uPtr.pu16[3] | ((uint32_t)(uPtr.pu16[4] & UINT16_C(0xf000)) << 4);
    6365             pCtx->fpu.FPUDP = uPtr.pu16[5] | ((uint32_t)(uPtr.pu16[6] & UINT16_C(0xf000)) << 4);
    6366             pCtx->fpu.FOP   = uPtr.pu16[4] & UINT16_C(0x07ff);
    6367             pCtx->fpu.CS    = 0;
    6368             pCtx->fpu.Rsrvd1= 0;
    6369             pCtx->fpu.DS    = 0;
    6370             pCtx->fpu.Rsrvd2= 0;
     6368            pCtx->XState.x87.FPUIP = uPtr.pu16[3] | ((uint32_t)(uPtr.pu16[4] & UINT16_C(0xf000)) << 4);
     6369            pCtx->XState.x87.FPUDP = uPtr.pu16[5] | ((uint32_t)(uPtr.pu16[6] & UINT16_C(0xf000)) << 4);
     6370            pCtx->XState.x87.FOP   = uPtr.pu16[4] & UINT16_C(0x07ff);
     6371            pCtx->XState.x87.CS    = 0;
     6372            pCtx->XState.x87.Rsrvd1= 0;
     6373            pCtx->XState.x87.DS    = 0;
     6374            pCtx->XState.x87.Rsrvd2= 0;
    63716375        }
    63726376        else
    63736377        {
    6374             pCtx->fpu.FPUIP = uPtr.pu16[3];
    6375             pCtx->fpu.CS    = uPtr.pu16[4];
    6376             pCtx->fpu.Rsrvd1= 0;
    6377             pCtx->fpu.FPUDP = uPtr.pu16[5];
    6378             pCtx->fpu.DS    = uPtr.pu16[6];
    6379             pCtx->fpu.Rsrvd2= 0;
     6378            pCtx->XState.x87.FPUIP = uPtr.pu16[3];
     6379            pCtx->XState.x87.CS    = uPtr.pu16[4];
     6380            pCtx->XState.x87.Rsrvd1= 0;
     6381            pCtx->XState.x87.FPUDP = uPtr.pu16[5];
     6382            pCtx->XState.x87.DS    = uPtr.pu16[6];
     6383            pCtx->XState.x87.Rsrvd2= 0;
    63806384            /** @todo Testcase: Is FOP cleared when doing 16-bit protected mode fldenv? */
    63816385        }
     
    63836387    else
    63846388    {
    6385         pCtx->fpu.FCW = uPtr.pu16[0*2];
    6386         pCtx->fpu.FSW = uPtr.pu16[1*2];
    6387         pCtx->fpu.FTW = uPtr.pu16[2*2];
     6389        pCtx->XState.x87.FCW = uPtr.pu16[0*2];
     6390        pCtx->XState.x87.FSW = uPtr.pu16[1*2];
     6391        pCtx->XState.x87.FTW = uPtr.pu16[2*2];
    63886392        if (IEM_IS_REAL_OR_V86_MODE(pIemCpu))
    63896393        {
    6390             pCtx->fpu.FPUIP = uPtr.pu16[3*2] | ((uPtr.pu32[4] & UINT32_C(0x0ffff000)) << 4);
    6391             pCtx->fpu.FOP   = uPtr.pu32[4] & UINT16_C(0x07ff);
    6392             pCtx->fpu.FPUDP = uPtr.pu16[5*2] | ((uPtr.pu32[6] & UINT32_C(0x0ffff000)) << 4);
    6393             pCtx->fpu.CS    = 0;
    6394             pCtx->fpu.Rsrvd1= 0;
    6395             pCtx->fpu.DS    = 0;
    6396             pCtx->fpu.Rsrvd2= 0;
     6394            pCtx->XState.x87.FPUIP = uPtr.pu16[3*2] | ((uPtr.pu32[4] & UINT32_C(0x0ffff000)) << 4);
     6395            pCtx->XState.x87.FOP   = uPtr.pu32[4] & UINT16_C(0x07ff);
     6396            pCtx->XState.x87.FPUDP = uPtr.pu16[5*2] | ((uPtr.pu32[6] & UINT32_C(0x0ffff000)) << 4);
     6397            pCtx->XState.x87.CS    = 0;
     6398            pCtx->XState.x87.Rsrvd1= 0;
     6399            pCtx->XState.x87.DS    = 0;
     6400            pCtx->XState.x87.Rsrvd2= 0;
    63976401        }
    63986402        else
    63996403        {
    6400             pCtx->fpu.FPUIP = uPtr.pu32[3];
    6401             pCtx->fpu.CS    = uPtr.pu16[4*2];
    6402             pCtx->fpu.Rsrvd1= 0;
    6403             pCtx->fpu.FOP   = uPtr.pu16[4*2+1];
    6404             pCtx->fpu.FPUDP = uPtr.pu32[5];
    6405             pCtx->fpu.DS    = uPtr.pu16[6*2];
    6406             pCtx->fpu.Rsrvd2= 0;
     6404            pCtx->XState.x87.FPUIP = uPtr.pu32[3];
     6405            pCtx->XState.x87.CS    = uPtr.pu16[4*2];
     6406            pCtx->XState.x87.Rsrvd1= 0;
     6407            pCtx->XState.x87.FOP   = uPtr.pu16[4*2+1];
     6408            pCtx->XState.x87.FPUDP = uPtr.pu32[5];
     6409            pCtx->XState.x87.DS    = uPtr.pu16[6*2];
     6410            pCtx->XState.x87.Rsrvd2= 0;
    64076411        }
    64086412    }
    64096413
    64106414    /* Make adjustments. */
    6411     pCtx->fpu.FTW = iemFpuCompressFtw(pCtx->fpu.FTW);
    6412     pCtx->fpu.FCW &= ~X86_FCW_ZERO_MASK;
     6415    pCtx->XState.x87.FTW = iemFpuCompressFtw(pCtx->XState.x87.FTW);
     6416    pCtx->XState.x87.FCW &= ~X86_FCW_ZERO_MASK;
    64136417    iemFpuRecalcExceptionStatus(pCtx);
    64146418    /** @todo Testcase: Check if ES and/or B are automatically cleared if no
     
    64626466    iemCImplCommonFpuStoreEnv(pIemCpu, enmEffOpSize, uPtr, pCtx);
    64636467    PRTFLOAT80U paRegs = (PRTFLOAT80U)(uPtr.pu8 + (enmEffOpSize == IEMMODE_16BIT ? 14 : 28));
    6464     for (uint32_t i = 0; i < RT_ELEMENTS(pCtx->fpu.aRegs); i++)
    6465     {
    6466         paRegs[i].au32[0] = pCtx->fpu.aRegs[i].au32[0];
    6467         paRegs[i].au32[1] = pCtx->fpu.aRegs[i].au32[1];
    6468         paRegs[i].au16[4] = pCtx->fpu.aRegs[i].au16[4];
     6468    for (uint32_t i = 0; i < RT_ELEMENTS(pCtx->XState.x87.aRegs); i++)
     6469    {
     6470        paRegs[i].au32[0] = pCtx->XState.x87.aRegs[i].au32[0];
     6471        paRegs[i].au32[1] = pCtx->XState.x87.aRegs[i].au32[1];
     6472        paRegs[i].au16[4] = pCtx->XState.x87.aRegs[i].au16[4];
    64696473    }
    64706474
     
    64746478
    64756479    /*
    6476      * Re-initialize the FPU.
    6477      */
    6478     pCtx->fpu.FCW   = 0x37f;
    6479     pCtx->fpu.FSW   = 0;
    6480     pCtx->fpu.FTW   = 0x00;       /* 0 - empty */
    6481     pCtx->fpu.FPUDP = 0;
    6482     pCtx->fpu.DS    = 0;
    6483     pCtx->fpu.Rsrvd2= 0;
    6484     pCtx->fpu.FPUIP = 0;
    6485     pCtx->fpu.CS    = 0;
    6486     pCtx->fpu.Rsrvd1= 0;
    6487     pCtx->fpu.FOP   = 0;
     6480     * Re-initialize the XState.x87.
     6481     */
     6482    pCtx->XState.x87.FCW   = 0x37f;
     6483    pCtx->XState.x87.FSW   = 0;
     6484    pCtx->XState.x87.FTW   = 0x00;       /* 0 - empty */
     6485    pCtx->XState.x87.FPUDP = 0;
     6486    pCtx->XState.x87.DS    = 0;
     6487    pCtx->XState.x87.Rsrvd2= 0;
     6488    pCtx->XState.x87.FPUIP = 0;
     6489    pCtx->XState.x87.CS    = 0;
     6490    pCtx->XState.x87.Rsrvd1= 0;
     6491    pCtx->XState.x87.FOP   = 0;
    64886492
    64896493    iemHlpUsedFpu(pIemCpu);
     
    65396543    iemCImplCommonFpuRestoreEnv(pIemCpu, enmEffOpSize, uPtr, pCtx);
    65406544    PCRTFLOAT80U paRegs = (PCRTFLOAT80U)(uPtr.pu8 + (enmEffOpSize == IEMMODE_16BIT ? 14 : 28));
    6541     for (uint32_t i = 0; i < RT_ELEMENTS(pCtx->fpu.aRegs); i++)
    6542     {
    6543         pCtx->fpu.aRegs[i].au32[0] = paRegs[i].au32[0];
    6544         pCtx->fpu.aRegs[i].au32[1] = paRegs[i].au32[1];
    6545         pCtx->fpu.aRegs[i].au32[2] = paRegs[i].au16[4];
    6546         pCtx->fpu.aRegs[i].au32[3] = 0;
     6545    for (uint32_t i = 0; i < RT_ELEMENTS(pCtx->XState.x87.aRegs); i++)
     6546    {
     6547        pCtx->XState.x87.aRegs[i].au32[0] = paRegs[i].au32[0];
     6548        pCtx->XState.x87.aRegs[i].au32[1] = paRegs[i].au32[1];
     6549        pCtx->XState.x87.aRegs[i].au32[2] = paRegs[i].au16[4];
     6550        pCtx->XState.x87.aRegs[i].au32[3] = 0;
    65476551    }
    65486552
     
    65716575    /** @todo Testcase: Test that it raises and loweres the FPU exception bits
    65726576     *        according to FSW. (This is was is currently implemented.) */
    6573     pCtx->fpu.FCW = u16Fcw & ~X86_FCW_ZERO_MASK;
     6577    pCtx->XState.x87.FCW = u16Fcw & ~X86_FCW_ZERO_MASK;
    65746578    iemFpuRecalcExceptionStatus(pCtx);
    65756579
     
    65916595    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    65926596
    6593     unsigned const iReg1 = X86_FSW_TOP_GET(pCtx->fpu.FSW);
     6597    unsigned const iReg1 = X86_FSW_TOP_GET(pCtx->XState.x87.FSW);
    65946598    unsigned const iReg2 = (iReg1 + iStReg) & X86_FSW_TOP_SMASK;
    6595     Assert(!(RT_BIT(iReg1) & pCtx->fpu.FTW) || !(RT_BIT(iReg2) & pCtx->fpu.FTW));
     6599    Assert(!(RT_BIT(iReg1) & pCtx->XState.x87.FTW) || !(RT_BIT(iReg2) & pCtx->XState.x87.FTW));
    65966600
    65976601    /** @todo Testcase: fxch underflow. Making assumptions that underflowed
    65986602     *        registers are read as QNaN and then exchanged. This could be
    65996603     *        wrong... */
    6600     if (pCtx->fpu.FCW & X86_FCW_IM)
    6601     {
    6602         if (RT_BIT(iReg1) & pCtx->fpu.FTW)
    6603         {
    6604             if (RT_BIT(iReg2) & pCtx->fpu.FTW)
    6605                 iemFpuStoreQNan(&pCtx->fpu.aRegs[0].r80);
     6604    if (pCtx->XState.x87.FCW & X86_FCW_IM)
     6605    {
     6606        if (RT_BIT(iReg1) & pCtx->XState.x87.FTW)
     6607        {
     6608            if (RT_BIT(iReg2) & pCtx->XState.x87.FTW)
     6609                iemFpuStoreQNan(&pCtx->XState.x87.aRegs[0].r80);
    66066610            else
    6607                 pCtx->fpu.aRegs[0].r80 = pCtx->fpu.aRegs[iStReg].r80;
    6608             iemFpuStoreQNan(&pCtx->fpu.aRegs[iStReg].r80);
     6611                pCtx->XState.x87.aRegs[0].r80 = pCtx->XState.x87.aRegs[iStReg].r80;
     6612            iemFpuStoreQNan(&pCtx->XState.x87.aRegs[iStReg].r80);
    66096613        }
    66106614        else
    66116615        {
    6612             pCtx->fpu.aRegs[iStReg].r80 = pCtx->fpu.aRegs[0].r80;
    6613             iemFpuStoreQNan(&pCtx->fpu.aRegs[0].r80);
    6614         }
    6615         pCtx->fpu.FSW &= ~X86_FSW_C_MASK;
    6616         pCtx->fpu.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF;
     6616            pCtx->XState.x87.aRegs[iStReg].r80 = pCtx->XState.x87.aRegs[0].r80;
     6617            iemFpuStoreQNan(&pCtx->XState.x87.aRegs[0].r80);
     6618        }
     6619        pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK;
     6620        pCtx->XState.x87.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF;
    66176621    }
    66186622    else
    66196623    {
    66206624        /* raise underflow exception, don't change anything. */
    6621         pCtx->fpu.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_XCPT_MASK);
    6622         pCtx->fpu.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
     6625        pCtx->XState.x87.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_XCPT_MASK);
     6626        pCtx->XState.x87.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
    66236627    }
    66246628
     
    66456649    if (pCtx->cr0 & (X86_CR0_EM | X86_CR0_TS))
    66466650        return iemRaiseDeviceNotAvailable(pIemCpu);
    6647     uint16_t u16Fsw = pCtx->fpu.FSW;
     6651    uint16_t u16Fsw = pCtx->XState.x87.FSW;
    66486652    if (u16Fsw & X86_FSW_ES)
    66496653        return iemRaiseMathFault(pIemCpu);
     
    66546658    unsigned const iReg1 = X86_FSW_TOP_GET(u16Fsw);
    66556659    unsigned const iReg2 = (iReg1 + iStReg) & X86_FSW_TOP_SMASK;
    6656     if ((pCtx->fpu.FTW & (RT_BIT(iReg1) | RT_BIT(iReg2))) == (RT_BIT(iReg1) | RT_BIT(iReg2)))
    6657     {
    6658         uint32_t u32Eflags = pfnAImpl(&pCtx->fpu, &u16Fsw, &pCtx->fpu.aRegs[0].r80, &pCtx->fpu.aRegs[iStReg].r80);
     6660    if ((pCtx->XState.x87.FTW & (RT_BIT(iReg1) | RT_BIT(iReg2))) == (RT_BIT(iReg1) | RT_BIT(iReg2)))
     6661    {
     6662        uint32_t u32Eflags = pfnAImpl(&pCtx->XState.x87, &u16Fsw,
     6663                                      &pCtx->XState.x87.aRegs[0].r80, &pCtx->XState.x87.aRegs[iStReg].r80);
    66596664        NOREF(u32Eflags);
    66606665
    6661         pCtx->fpu.FSW &= ~X86_FSW_C1;
    6662         pCtx->fpu.FSW |= u16Fsw & ~X86_FSW_TOP_MASK;
     6666        pCtx->XState.x87.FSW &= ~X86_FSW_C1;
     6667        pCtx->XState.x87.FSW |= u16Fsw & ~X86_FSW_TOP_MASK;
    66636668        if (   !(u16Fsw & X86_FSW_IE)
    6664             || (pCtx->fpu.FCW & X86_FCW_IM) )
     6669            || (pCtx->XState.x87.FCW & X86_FCW_IM) )
    66656670        {
    66666671            pCtx->eflags.u &= ~(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF);
     
    66686673        }
    66696674    }
    6670     else if (pCtx->fpu.FCW & X86_FCW_IM)
     6675    else if (pCtx->XState.x87.FCW & X86_FCW_IM)
    66716676    {
    66726677        /* Masked underflow. */
    6673         pCtx->fpu.FSW &= ~X86_FSW_C1;
    6674         pCtx->fpu.FSW |= X86_FSW_IE | X86_FSW_SF;
     6678        pCtx->XState.x87.FSW &= ~X86_FSW_C1;
     6679        pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF;
    66756680        pCtx->eflags.u &= ~(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF);
    66766681        pCtx->eflags.u |= X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF;
     
    66796684    {
    66806685        /* Raise underflow - don't touch EFLAGS or TOP. */
    6681         pCtx->fpu.FSW &= ~X86_FSW_C1;
    6682         pCtx->fpu.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
     6686        pCtx->XState.x87.FSW &= ~X86_FSW_C1;
     6687        pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;
    66836688        fPop = false;
    66846689    }
     
    66896694    if (fPop)
    66906695    {
    6691         pCtx->fpu.FTW &= ~RT_BIT(iReg1);
    6692         pCtx->fpu.FSW &= X86_FSW_TOP_MASK;
    6693         pCtx->fpu.FSW |= ((iReg1 + 7) & X86_FSW_TOP_SMASK) << X86_FSW_TOP_SHIFT;
     6696        pCtx->XState.x87.FTW &= ~RT_BIT(iReg1);
     6697        pCtx->XState.x87.FSW &= X86_FSW_TOP_MASK;
     6698        pCtx->XState.x87.FSW |= ((iReg1 + 7) & X86_FSW_TOP_SMASK) << X86_FSW_TOP_SHIFT;
    66946699    }
    66956700
  • trunk/src/VBox/VMM/VMMR0/CPUMR0.cpp

    r54862 r54898  
    488488         *        We could just all this in assembly. */
    489489        uint128_t aGuestXmmRegs[16];
    490         memcpy(&aGuestXmmRegs[0], &pVCpu->cpum.s.Guest.fpu.aXMM[0], sizeof(aGuestXmmRegs));
     490        memcpy(&aGuestXmmRegs[0], &pVCpu->cpum.s.Guest.XState.x87.aXMM[0], sizeof(aGuestXmmRegs));
    491491#endif
    492492
     
    511511
    512512#ifdef VBOX_WITH_KERNEL_USING_XMM
    513         memcpy(&pVCpu->cpum.s.Guest.fpu.aXMM[0], &aGuestXmmRegs[0], sizeof(aGuestXmmRegs));
     513        memcpy(&pVCpu->cpum.s.Guest.XState.x87.aXMM[0], &aGuestXmmRegs[0], sizeof(aGuestXmmRegs));
    514514#endif
    515515    }
  • trunk/src/VBox/VMM/VMMR0/CPUMR0A.asm

    r54674 r54898  
    9090    ffree   st7              ; Clear FPU stack register(7)'s tag entry to prevent overflow if a wraparound occurs
    9191                             ; for the upcoming push (load)
    92     fild    dword [xDX + CPUMCPU.Guest.fpu] ; Explicit FPU load to overwrite FIP, FOP, FDP registers in the FPU.
     92    fild    dword [xDX + CPUMCPU.Guest.XState] ; Explicit FPU load to overwrite FIP, FOP, FDP registers in the FPU.
    9393
    9494.nothing_to_clean:
     
    101101; @remarks Requires CPUMCPU pointer in RDX
    102102%macro SAVE_32_OR_64_FPU 0
    103     o64 fxsave  [rdx + CPUMCPU.Guest.fpu]
     103    o64 fxsave  [rdx + CPUMCPU.Guest.XState]
    104104
    105105    ; Shouldn't be necessary to check if the entire 64-bit FIP is 0 (i.e. guest hasn't used its FPU yet) because it should
    106106    ; be taken care of by the calling code, i.e. hmR0[Vmx|Svm]LoadSharedCR0() and hmR0[Vmx|Svm]ExitXcptNm() which ensure
    107107    ; we swap the guest FPU state when it starts using it (#NM). In any case it's only a performance optimization.
    108     ; cmp         qword [rdx + CPUMCPU.Guest.fpu + IP_OFF_IN_X86FXSTATE], 0
     108    ; cmp         qword [rdx + CPUMCPU.Guest.XState + IP_OFF_IN_X86FXSTATE], 0
    109109    ; je          short %%save_done
    110110
    111     cmp         dword [rdx + CPUMCPU.Guest.fpu + CS_OFF_IN_X86FXSTATE], 0
     111    cmp         dword [rdx + CPUMCPU.Guest.XState + CS_OFF_IN_X86FXSTATE], 0
    112112    jne         short %%save_done
    113113    sub         rsp, 20h                         ; Only need 1ch bytes but keep stack aligned otherwise we #GP(0)
    114114    fnstenv     [rsp]
    115115    movzx       eax, word [rsp + 10h]
    116     mov         [rdx + CPUMCPU.Guest.fpu + CS_OFF_IN_X86FXSTATE], eax
     116    mov         [rdx + CPUMCPU.Guest.XState + CS_OFF_IN_X86FXSTATE], eax
    117117    movzx       eax, word [rsp + 18h]
    118     mov         [rdx + CPUMCPU.Guest.fpu + DS_OFF_IN_X86FXSTATE], eax
     118    mov         [rdx + CPUMCPU.Guest.XState + DS_OFF_IN_X86FXSTATE], eax
    119119    add         rsp, 20h
    120     mov         dword [rdx + CPUMCPU.Guest.fpu + X86_OFF_FXSTATE_RSVD], X86_FXSTATE_RSVD_32BIT_MAGIC
     120    mov         dword [rdx + CPUMCPU.Guest.XState + X86_OFF_FXSTATE_RSVD], X86_FXSTATE_RSVD_32BIT_MAGIC
    121121%%save_done:
    122122%endmacro
     
    127127; @remarks Requires CPUMCPU pointer in RDX
    128128%macro RESTORE_32_OR_64_FPU 0
    129     cmp         dword [rdx + CPUMCPU.Guest.fpu + X86_OFF_FXSTATE_RSVD], X86_FXSTATE_RSVD_32BIT_MAGIC
     129    cmp         dword [rdx + CPUMCPU.Guest.XState + X86_OFF_FXSTATE_RSVD], X86_FXSTATE_RSVD_32BIT_MAGIC
    130130    jne         short %%restore_64bit_fpu
    131     fxrstor     [rdx + CPUMCPU.Guest.fpu]
     131    fxrstor     [rdx + CPUMCPU.Guest.XState]
    132132    jmp         short %%restore_fpu_done
    133133%%restore_64bit_fpu:
    134     o64 fxrstor [rdx + CPUMCPU.Guest.fpu]
     134    o64 fxrstor [rdx + CPUMCPU.Guest.XState]
    135135%%restore_fpu_done:
    136136%endmacro
     
    201201%ifdef RT_ARCH_AMD64
    202202    ; Use explicit REX prefix. See @bugref{6398}.
    203     o64 fxsave  [rdx + CPUMCPU.Host.fpu]    ; ASSUMES that all VT-x/AMD-V boxes sports fxsave/fxrstor (safe assumption)
     203    o64 fxsave  [rdx + CPUMCPU.Host.XState] ; ASSUMES that all VT-x/AMD-V boxes sports fxsave/fxrstor (safe assumption)
    204204
    205205    ; Restore the guest FPU (32-bit or 64-bit), preserves existing broken state. See @bugref{7138}.
    206206    test    dword [rdx + CPUMCPU.fUseFlags], CPUM_USE_SUPPORTS_LONGMODE
    207207    jnz     short .fpu_load_32_or_64
    208     fxrstor [rdx + CPUMCPU.Guest.fpu]
     208    fxrstor [rdx + CPUMCPU.Guest.XState]
    209209    jmp     short .fpu_load_done
    210210.fpu_load_32_or_64:
     
    212212.fpu_load_done:
    213213%else
    214     fxsave  [edx + CPUMCPU.Host.fpu]        ; ASSUMES that all VT-x/AMD-V boxes sports fxsave/fxrstor (safe assumption)
    215     fxrstor [edx + CPUMCPU.Guest.fpu]
     214    fxsave  [edx + CPUMCPU.Host.XState]     ; ASSUMES that all VT-x/AMD-V boxes sports fxsave/fxrstor (safe assumption)
     215    fxrstor [edx + CPUMCPU.Guest.XState]
    216216%endif
    217217
    218218%ifdef VBOX_WITH_KERNEL_USING_XMM
    219219    ; Restore the non-volatile xmm registers. ASSUMING 64-bit windows
    220     lea     r11, [xDX + CPUMCPU.Host.fpu + XMM_OFF_IN_X86FXSTATE]
     220    lea     r11, [xDX + CPUMCPU.Host.XState + XMM_OFF_IN_X86FXSTATE]
    221221    movdqa  xmm6,  [r11 + 060h]
    222222    movdqa  xmm7,  [r11 + 070h]
     
    243243.sixtyfourbit_mode:
    244244    and     edx, 0ffffffffh
    245     o64 fxsave  [rdx + CPUMCPU.Host.fpu]
     245    o64 fxsave  [rdx + CPUMCPU.Host.XState]
    246246
    247247    ; Restore the guest FPU (32-bit or 64-bit), preserves existing broken state. See @bugref{7138}.
    248248    test    dword [rdx + CPUMCPU.fUseFlags], CPUM_USE_SUPPORTS_LONGMODE
    249249    jnz     short .fpu_load_32_or_64_darwin
    250     fxrstor [rdx + CPUMCPU.Guest.fpu]
     250    fxrstor [rdx + CPUMCPU.Guest.XState]
    251251    jmp     short .fpu_load_done_darwin
    252252.fpu_load_32_or_64_darwin:
     
    284284    ; Do NOT use xCX from this point!
    285285
    286     fxsave  [xDX + CPUMCPU.Host.fpu]    ; ASSUMES that all VT-x/AMD-V boxes support fxsave/fxrstor (safe assumption)
     286    fxsave  [xDX + CPUMCPU.Host.XState] ; ASSUMES that all VT-x/AMD-V boxes support fxsave/fxrstor (safe assumption)
    287287
    288288    ; Restore CR0 from xCX if it was saved previously.
     
    340340    test    dword [rdx + CPUMCPU.fUseFlags], CPUM_USE_SUPPORTS_LONGMODE
    341341    jnz     short .fpu_save_32_or_64
    342     fxsave  [rdx + CPUMCPU.Guest.fpu]
     342    fxsave  [rdx + CPUMCPU.Guest.XState]
    343343    jmp     short .fpu_save_done
    344344.fpu_save_32_or_64:
     
    347347
    348348    ; Use explicit REX prefix. See @bugref{6398}.
    349     o64 fxrstor [rdx + CPUMCPU.Host.fpu]
    350 %else
    351     fxsave  [edx + CPUMCPU.Guest.fpu]       ; ASSUMES that all VT-x/AMD-V boxes support fxsave/fxrstor (safe assumption)
    352     fxrstor [edx + CPUMCPU.Host.fpu]
     349    o64 fxrstor [rdx + CPUMCPU.Host.XState]
     350%else
     351    fxsave  [edx + CPUMCPU.Guest.XState]    ; ASSUMES that all VT-x/AMD-V boxes support fxsave/fxrstor (safe assumption)
     352    fxrstor [edx + CPUMCPU.Host.XState]
    353353%endif
    354354
     
    371371    test    dword [rdx + CPUMCPU.fUseFlags], CPUM_USE_SUPPORTS_LONGMODE
    372372    jnz     short .fpu_save_32_or_64_darwin
    373     fxsave  [rdx + CPUMCPU.Guest.fpu]
     373    fxsave  [rdx + CPUMCPU.Guest.XState]
    374374    jmp     short .fpu_save_done_darwin
    375375.fpu_save_32_or_64_darwin:
     
    377377.fpu_save_done_darwin:
    378378
    379     o64 fxrstor [rdx + CPUMCPU.Host.fpu]
     379    o64 fxrstor [rdx + CPUMCPU.Host.XState]
    380380    jmp far [.fpret wrt rip]
    381381.fpret:                                 ; 16:32 Pointer to .the_end.
     
    425425
    426426%ifdef RT_ARCH_AMD64
    427     o64 fxrstor [xDX + CPUMCPU.Host.fpu]
    428 %else
    429     fxrstor [xDX + CPUMCPU.Host.fpu]
     427    o64 fxrstor [xDX + CPUMCPU.Host.XState]
     428%else
     429    fxrstor [xDX + CPUMCPU.Host.XState]
    430430%endif
    431431
     
    444444.sixtyfourbit_mode:
    445445    and     edx, 0ffffffffh
    446     o64 fxrstor [rdx + CPUMCPU.Host.fpu]
     446    o64 fxrstor [rdx + CPUMCPU.Host.XState]
    447447    jmp far [.fpret wrt rip]
    448448.fpret:                                 ; 16:32 Pointer to .the_end.
  • trunk/src/VBox/VMM/VMMR0/HMR0.cpp

    r54712 r54898  
    19761976        "FPUDP=%04x DS=%04x Rsvrd2=%04x MXCSR=%08x MXCSR_MASK=%08x\n"
    19771977        ,
    1978         pCtx->fpu.FCW, pCtx->fpu.FSW, pCtx->fpu.FTW,
    1979         pCtx->fpu.FOP, pCtx->fpu.FPUIP, pCtx->fpu.CS, pCtx->fpu.Rsrvd1,
    1980         pCtx->fpu.FPUDP, pCtx->fpu.DS, pCtx->fpu.Rsrvd2,
    1981         pCtx->fpu.MXCSR, pCtx->fpu.MXCSR_MASK));
     1978        pCtx->XState.x87.FCW, pCtx->XState.x87.FSW, pCtx->XState.x87.FTW,
     1979        pCtx->XState.x87.FOP, pCtx->XState.x87.FPUIP, pCtx->XState.x87.CS, pCtx->XState.x87.Rsrvd1,
     1980        pCtx->XState.x87.FPUDP, pCtx->XState.x87.DS, pCtx->XState.x87.Rsrvd2,
     1981        pCtx->XState.x87.MXCSR, pCtx->XState.x87.MXCSR_MASK));
    19821982
    19831983    Log(("MSR:\n"
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r54862 r54898  
    114114static const SSMFIELD g_aCpumCtxFields[] =
    115115{
    116     SSMFIELD_ENTRY(         CPUMCTX, fpu.FCW),
    117     SSMFIELD_ENTRY(         CPUMCTX, fpu.FSW),
    118     SSMFIELD_ENTRY(         CPUMCTX, fpu.FTW),
    119     SSMFIELD_ENTRY(         CPUMCTX, fpu.FOP),
    120     SSMFIELD_ENTRY(         CPUMCTX, fpu.FPUIP),
    121     SSMFIELD_ENTRY(         CPUMCTX, fpu.CS),
    122     SSMFIELD_ENTRY(         CPUMCTX, fpu.Rsrvd1),
    123     SSMFIELD_ENTRY(         CPUMCTX, fpu.FPUDP),
    124     SSMFIELD_ENTRY(         CPUMCTX, fpu.DS),
    125     SSMFIELD_ENTRY(         CPUMCTX, fpu.Rsrvd2),
    126     SSMFIELD_ENTRY(         CPUMCTX, fpu.MXCSR),
    127     SSMFIELD_ENTRY(         CPUMCTX, fpu.MXCSR_MASK),
    128     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[0]),
    129     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[1]),
    130     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[2]),
    131     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[3]),
    132     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[4]),
    133     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[5]),
    134     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[6]),
    135     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[7]),
    136     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[0]),
    137     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[1]),
    138     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[2]),
    139     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[3]),
    140     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[4]),
    141     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[5]),
    142     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[6]),
    143     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[7]),
    144     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[8]),
    145     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[9]),
    146     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[10]),
    147     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[11]),
    148     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[12]),
    149     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[13]),
    150     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[14]),
    151     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[15]),
     116    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.FCW),
     117    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.FSW),
     118    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.FTW),
     119    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.FOP),
     120    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.FPUIP),
     121    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.CS),
     122    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.Rsrvd1),
     123    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.FPUDP),
     124    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.DS),
     125    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.Rsrvd2),
     126    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.MXCSR),
     127    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.MXCSR_MASK),
     128    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[0]),
     129    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[1]),
     130    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[2]),
     131    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[3]),
     132    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[4]),
     133    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[5]),
     134    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[6]),
     135    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[7]),
     136    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[0]),
     137    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[1]),
     138    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[2]),
     139    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[3]),
     140    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[4]),
     141    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[5]),
     142    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[6]),
     143    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[7]),
     144    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[8]),
     145    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[9]),
     146    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[10]),
     147    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[11]),
     148    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[12]),
     149    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[13]),
     150    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[14]),
     151    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[15]),
    152152    SSMFIELD_ENTRY(         CPUMCTX, rdi),
    153153    SSMFIELD_ENTRY(         CPUMCTX, rsi),
     
    248248static const SSMFIELD g_aCpumCtxFieldsMem[] =
    249249{
    250     SSMFIELD_ENTRY(         CPUMCTX, fpu.FCW),
    251     SSMFIELD_ENTRY(         CPUMCTX, fpu.FSW),
    252     SSMFIELD_ENTRY(         CPUMCTX, fpu.FTW),
    253     SSMFIELD_ENTRY(         CPUMCTX, fpu.FOP),
    254     SSMFIELD_ENTRY(         CPUMCTX, fpu.FPUIP),
    255     SSMFIELD_ENTRY(         CPUMCTX, fpu.CS),
    256     SSMFIELD_ENTRY(         CPUMCTX, fpu.Rsrvd1),
    257     SSMFIELD_ENTRY(         CPUMCTX, fpu.FPUDP),
    258     SSMFIELD_ENTRY(         CPUMCTX, fpu.DS),
    259     SSMFIELD_ENTRY(         CPUMCTX, fpu.Rsrvd2),
    260     SSMFIELD_ENTRY(         CPUMCTX, fpu.MXCSR),
    261     SSMFIELD_ENTRY(         CPUMCTX, fpu.MXCSR_MASK),
    262     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[0]),
    263     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[1]),
    264     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[2]),
    265     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[3]),
    266     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[4]),
    267     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[5]),
    268     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[6]),
    269     SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[7]),
    270     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[0]),
    271     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[1]),
    272     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[2]),
    273     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[3]),
    274     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[4]),
    275     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[5]),
    276     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[6]),
    277     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[7]),
    278     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[8]),
    279     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[9]),
    280     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[10]),
    281     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[11]),
    282     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[12]),
    283     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[13]),
    284     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[14]),
    285     SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[15]),
    286     SSMFIELD_ENTRY_IGNORE(  CPUMCTX, fpu.au32RsrvdRest),
     250    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.FCW),
     251    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.FSW),
     252    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.FTW),
     253    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.FOP),
     254    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.FPUIP),
     255    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.CS),
     256    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.Rsrvd1),
     257    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.FPUDP),
     258    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.DS),
     259    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.Rsrvd2),
     260    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.MXCSR),
     261    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.MXCSR_MASK),
     262    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[0]),
     263    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[1]),
     264    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[2]),
     265    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[3]),
     266    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[4]),
     267    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[5]),
     268    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[6]),
     269    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aRegs[7]),
     270    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[0]),
     271    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[1]),
     272    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[2]),
     273    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[3]),
     274    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[4]),
     275    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[5]),
     276    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[6]),
     277    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[7]),
     278    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[8]),
     279    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[9]),
     280    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[10]),
     281    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[11]),
     282    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[12]),
     283    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[13]),
     284    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[14]),
     285    SSMFIELD_ENTRY(         CPUMCTX, XState.x87.aXMM[15]),
     286    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, XState.x87.au32RsrvdRest),
    287287    SSMFIELD_ENTRY(         CPUMCTX, rdi),
    288288    SSMFIELD_ENTRY(         CPUMCTX, rsi),
     
    378378static const SSMFIELD g_aCpumCtxFieldsV16[] =
    379379{
    380     SSMFIELD_ENTRY(             CPUMCTX, fpu.FCW),
    381     SSMFIELD_ENTRY(             CPUMCTX, fpu.FSW),
    382     SSMFIELD_ENTRY(             CPUMCTX, fpu.FTW),
    383     SSMFIELD_ENTRY(             CPUMCTX, fpu.FOP),
    384     SSMFIELD_ENTRY(             CPUMCTX, fpu.FPUIP),
    385     SSMFIELD_ENTRY(             CPUMCTX, fpu.CS),
    386     SSMFIELD_ENTRY(             CPUMCTX, fpu.Rsrvd1),
    387     SSMFIELD_ENTRY(             CPUMCTX, fpu.FPUDP),
    388     SSMFIELD_ENTRY(             CPUMCTX, fpu.DS),
    389     SSMFIELD_ENTRY(             CPUMCTX, fpu.Rsrvd2),
    390     SSMFIELD_ENTRY(             CPUMCTX, fpu.MXCSR),
    391     SSMFIELD_ENTRY(             CPUMCTX, fpu.MXCSR_MASK),
    392     SSMFIELD_ENTRY(             CPUMCTX, fpu.aRegs[0]),
    393     SSMFIELD_ENTRY(             CPUMCTX, fpu.aRegs[1]),
    394     SSMFIELD_ENTRY(             CPUMCTX, fpu.aRegs[2]),
    395     SSMFIELD_ENTRY(             CPUMCTX, fpu.aRegs[3]),
    396     SSMFIELD_ENTRY(             CPUMCTX, fpu.aRegs[4]),
    397     SSMFIELD_ENTRY(             CPUMCTX, fpu.aRegs[5]),
    398     SSMFIELD_ENTRY(             CPUMCTX, fpu.aRegs[6]),
    399     SSMFIELD_ENTRY(             CPUMCTX, fpu.aRegs[7]),
    400     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[0]),
    401     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[1]),
    402     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[2]),
    403     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[3]),
    404     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[4]),
    405     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[5]),
    406     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[6]),
    407     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[7]),
    408     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[8]),
    409     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[9]),
    410     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[10]),
    411     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[11]),
    412     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[12]),
    413     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[13]),
    414     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[14]),
    415     SSMFIELD_ENTRY(             CPUMCTX, fpu.aXMM[15]),
    416     SSMFIELD_ENTRY_IGNORE(      CPUMCTX, fpu.au32RsrvdRest),
     380    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.FCW),
     381    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.FSW),
     382    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.FTW),
     383    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.FOP),
     384    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.FPUIP),
     385    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.CS),
     386    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.Rsrvd1),
     387    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.FPUDP),
     388    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.DS),
     389    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.Rsrvd2),
     390    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.MXCSR),
     391    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.MXCSR_MASK),
     392    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aRegs[0]),
     393    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aRegs[1]),
     394    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aRegs[2]),
     395    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aRegs[3]),
     396    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aRegs[4]),
     397    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aRegs[5]),
     398    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aRegs[6]),
     399    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aRegs[7]),
     400    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[0]),
     401    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[1]),
     402    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[2]),
     403    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[3]),
     404    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[4]),
     405    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[5]),
     406    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[6]),
     407    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[7]),
     408    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[8]),
     409    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[9]),
     410    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[10]),
     411    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[11]),
     412    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[12]),
     413    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[13]),
     414    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[14]),
     415    SSMFIELD_ENTRY(             CPUMCTX, XState.x87.aXMM[15]),
     416    SSMFIELD_ENTRY_IGNORE(      CPUMCTX, XState.x87.au32RsrvdRest),
    417417    SSMFIELD_ENTRY(             CPUMCTX, rdi),
    418418    SSMFIELD_ENTRY(             CPUMCTX, rsi),
     
    842842    pCtx->dr[7]                     = X86_DR7_INIT_VAL;
    843843
    844     pCtx->fpu.FTW                   = 0x00;         /* All empty (abbridged tag reg edition). */
    845     pCtx->fpu.FCW                   = 0x37f;
     844    pCtx->XState.x87.FTW            = 0x00;         /* All empty (abbridged tag reg edition). */
     845    pCtx->XState.x87.FCW            = 0x37f;
    846846
    847847    /* Intel 64 and IA-32 Architectures Software Developer's Manual Volume 3A, Table 8-1.
    848848       IA-32 Processor States Following Power-up, Reset, or INIT */
    849     pCtx->fpu.MXCSR                 = 0x1F80;
    850     pCtx->fpu.MXCSR_MASK            = 0xffff; /** @todo REM always changed this for us. Should probably check if the HW really
     849    pCtx->XState.x87.MXCSR          = 0x1F80;
     850    pCtx->XState.x87.MXCSR_MASK     = 0xffff; /** @todo REM always changed this for us. Should probably check if the HW really
    851851                                                        supports all bits, since a zero value here should be read as 0xffbf. */
    852852
     
    15211521                "%sFPUIP=%08x %sCS=%04x %sRsrvd1=%04x  %sFPUDP=%08x %sDS=%04x %sRsvrd2=%04x\n"
    15221522                ,
    1523                 pszPrefix, pCtx->fpu.FCW,   pszPrefix, pCtx->fpu.FSW, pszPrefix, pCtx->fpu.FTW, pszPrefix, pCtx->fpu.FOP,
    1524                 pszPrefix, pCtx->fpu.MXCSR, pszPrefix, pCtx->fpu.MXCSR_MASK,
    1525                 pszPrefix, pCtx->fpu.FPUIP, pszPrefix, pCtx->fpu.CS,  pszPrefix, pCtx->fpu.Rsrvd1,
    1526                 pszPrefix, pCtx->fpu.FPUDP, pszPrefix, pCtx->fpu.DS,  pszPrefix, pCtx->fpu.Rsrvd2
     1523                pszPrefix, pCtx->XState.x87.FCW,   pszPrefix, pCtx->XState.x87.FSW, pszPrefix, pCtx->XState.x87.FTW, pszPrefix, pCtx->XState.x87.FOP,
     1524                pszPrefix, pCtx->XState.x87.MXCSR, pszPrefix, pCtx->XState.x87.MXCSR_MASK,
     1525                pszPrefix, pCtx->XState.x87.FPUIP, pszPrefix, pCtx->XState.x87.CS,  pszPrefix, pCtx->XState.x87.Rsrvd1,
     1526                pszPrefix, pCtx->XState.x87.FPUDP, pszPrefix, pCtx->XState.x87.DS,  pszPrefix, pCtx->XState.x87.Rsrvd2
    15271527                );
    1528             unsigned iShift = (pCtx->fpu.FSW >> 11) & 7;
    1529             for (unsigned iST = 0; iST < RT_ELEMENTS(pCtx->fpu.aRegs); iST++)
     1528            unsigned iShift = (pCtx->XState.x87.FSW >> 11) & 7;
     1529            for (unsigned iST = 0; iST < RT_ELEMENTS(pCtx->XState.x87.aRegs); iST++)
    15301530            {
    1531                 unsigned iFPR        = (iST + iShift) % RT_ELEMENTS(pCtx->fpu.aRegs);
    1532                 unsigned uTag        = pCtx->fpu.FTW & (1 << iFPR) ? 1 : 0;
    1533                 char     chSign      = pCtx->fpu.aRegs[0].au16[4] & 0x8000 ? '-' : '+';
    1534                 unsigned iInteger    = (unsigned)(pCtx->fpu.aRegs[0].au64[0] >> 63);
    1535                 uint64_t u64Fraction = pCtx->fpu.aRegs[0].au64[0] & UINT64_C(0x7fffffffffffffff);
    1536                 unsigned uExponent   = pCtx->fpu.aRegs[0].au16[4] & 0x7fff;
     1531                unsigned iFPR        = (iST + iShift) % RT_ELEMENTS(pCtx->XState.x87.aRegs);
     1532                unsigned uTag        = pCtx->XState.x87.FTW & (1 << iFPR) ? 1 : 0;
     1533                char     chSign      = pCtx->XState.x87.aRegs[0].au16[4] & 0x8000 ? '-' : '+';
     1534                unsigned iInteger    = (unsigned)(pCtx->XState.x87.aRegs[0].au64[0] >> 63);
     1535                uint64_t u64Fraction = pCtx->XState.x87.aRegs[0].au64[0] & UINT64_C(0x7fffffffffffffff);
     1536                unsigned uExponent   = pCtx->XState.x87.aRegs[0].au16[4] & 0x7fff;
    15371537                /** @todo This isn't entirenly correct and needs more work! */
    15381538                pHlp->pfnPrintf(pHlp,
    15391539                                "%sST(%u)=%sFPR%u={%04RX16'%08RX32'%08RX32} t%d %c%u.%022llu ^ %u",
    15401540                                pszPrefix, iST, pszPrefix, iFPR,
    1541                                 pCtx->fpu.aRegs[0].au16[4], pCtx->fpu.aRegs[0].au32[1], pCtx->fpu.aRegs[0].au32[0],
     1541                                pCtx->XState.x87.aRegs[0].au16[4], pCtx->XState.x87.aRegs[0].au32[1], pCtx->XState.x87.aRegs[0].au32[0],
    15421542                                uTag, chSign, iInteger, u64Fraction, uExponent);
    1543                 if (pCtx->fpu.aRegs[0].au16[5] || pCtx->fpu.aRegs[0].au16[6] || pCtx->fpu.aRegs[0].au16[7])
     1543                if (pCtx->XState.x87.aRegs[0].au16[5] || pCtx->XState.x87.aRegs[0].au16[6] || pCtx->XState.x87.aRegs[0].au16[7])
    15441544                    pHlp->pfnPrintf(pHlp, " res={%04RX16,%04RX16,%04RX16}\n",
    1545                                     pCtx->fpu.aRegs[0].au16[5], pCtx->fpu.aRegs[0].au16[6], pCtx->fpu.aRegs[0].au16[7]);
     1545                                    pCtx->XState.x87.aRegs[0].au16[5], pCtx->XState.x87.aRegs[0].au16[6], pCtx->XState.x87.aRegs[0].au16[7]);
    15461546                else
    15471547                    pHlp->pfnPrintf(pHlp, "\n");
    15481548            }
    1549             for (unsigned iXMM = 0; iXMM < RT_ELEMENTS(pCtx->fpu.aXMM); iXMM++)
     1549            for (unsigned iXMM = 0; iXMM < RT_ELEMENTS(pCtx->XState.x87.aXMM); iXMM++)
    15501550                pHlp->pfnPrintf(pHlp,
    15511551                                iXMM & 1
     
    15531553                                : "%sXMM%u%s=%08RX32'%08RX32'%08RX32'%08RX32  ",
    15541554                                pszPrefix, iXMM, iXMM < 10 ? " " : "",
    1555                                 pCtx->fpu.aXMM[iXMM].au32[3],
    1556                                 pCtx->fpu.aXMM[iXMM].au32[2],
    1557                                 pCtx->fpu.aXMM[iXMM].au32[1],
    1558                                 pCtx->fpu.aXMM[iXMM].au32[0]);
    1559             for (unsigned i = 0; i < RT_ELEMENTS(pCtx->fpu.au32RsrvdRest); i++)
    1560                 if (pCtx->fpu.au32RsrvdRest[i])
     1555                                pCtx->XState.x87.aXMM[iXMM].au32[3],
     1556                                pCtx->XState.x87.aXMM[iXMM].au32[2],
     1557                                pCtx->XState.x87.aXMM[iXMM].au32[1],
     1558                                pCtx->XState.x87.aXMM[iXMM].au32[0]);
     1559            for (unsigned i = 0; i < RT_ELEMENTS(pCtx->XState.x87.au32RsrvdRest); i++)
     1560                if (pCtx->XState.x87.au32RsrvdRest[i])
    15611561                    pHlp->pfnPrintf(pHlp, "%sRsrvdRest[i]=%RX32 (offset=%#x)\n",
    1562                                     pszPrefix, i, pCtx->fpu.au32RsrvdRest[i], RT_OFFSETOF(X86FXSTATE, au32RsrvdRest[i]) );
     1562                                    pszPrefix, i, pCtx->XState.x87.au32RsrvdRest[i], RT_OFFSETOF(X86FXSTATE, au32RsrvdRest[i]) );
    15631563
    15641564            pHlp->pfnPrintf(pHlp,
  • trunk/src/VBox/VMM/VMMR3/CPUMDbg.cpp

    r54862 r54898  
    513513    if (cpumR3RegIsFxSaveFormat(pVCpu))
    514514    {
    515         unsigned iReg = (pVCpu->cpum.s.Guest.fpu.FSW >> 11) & 7;
     515        unsigned iReg = (pVCpu->cpum.s.Guest.XState.x87.FSW >> 11) & 7;
    516516        iReg += pDesc->offRegister;
    517517        iReg &= 7;
    518         pValue->r80Ex = pVCpu->cpum.s.Guest.fpu.aRegs[iReg].r80Ex;
     518        pValue->r80Ex = pVCpu->cpum.s.Guest.XState.x87.aRegs[iReg].r80Ex;
    519519    }
    520520    else
    521521    {
    522         PCX86FPUSTATE pOldFpu = (PCX86FPUSTATE)&pVCpu->cpum.s.Guest.fpu;
     522        PCX86FPUSTATE pOldFpu = (PCX86FPUSTATE)&pVCpu->cpum.s.Guest.XState.x87;
    523523
    524524        unsigned iReg = (pOldFpu->FSW >> 11) & 7;
     
    677677    if (cpumR3RegIsFxSaveFormat(pVCpu))
    678678    {
    679         unsigned iReg = (pVCpu->cpum.s.Guest.fpu.FSW >> 11) & 7;
     679        unsigned iReg = (pVCpu->cpum.s.Guest.XState.x87.FSW >> 11) & 7;
    680680        iReg += pDesc->offRegister;
    681681        iReg &= 7;
    682         pValue->r80Ex = pVCpu->cpum.s.Guest.fpu.aRegs[iReg].r80Ex;
     682        pValue->r80Ex = pVCpu->cpum.s.Guest.XState.x87.aRegs[iReg].r80Ex;
    683683    }
    684684    else
    685685    {
    686         PCX86FPUSTATE pOldFpu = (PCX86FPUSTATE)&pVCpu->cpum.s.Guest.fpu;
     686        PCX86FPUSTATE pOldFpu = (PCX86FPUSTATE)&pVCpu->cpum.s.Guest.XState.x87;
    687687
    688688        unsigned iReg = (pOldFpu->FSW >> 11) & 7;
     
    10791079
    10801080#define CPU_REG_MM(n) \
    1081     CPU_REG_RW_AS("mm" #n,          MM##n,          U64, fpu.aRegs[n].mmx,      cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL,                       g_aCpumRegFields_mmN)
     1081    CPU_REG_RW_AS("mm" #n,          MM##n,          U64, XState.x87.aRegs[n].mmx, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL,                       g_aCpumRegFields_mmN)
    10821082
    10831083#define CPU_REG_XMM(n) \
    1084     CPU_REG_RW_AS("xmm" #n,         XMM##n,         U128, fpu.aXMM[n].xmm,      cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL,                       g_aCpumRegFields_xmmN)
     1084    CPU_REG_RW_AS("xmm" #n,         XMM##n,         U128, XState.x87.aXMM[n].xmm, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL,                       g_aCpumRegFields_xmmN)
    10851085/** @} */
    10861086
     
    11241124    CPU_REG_REG(RIP, rip),
    11251125    CPU_REG_RW_AS("rflags",         RFLAGS,         U64, rflags,                cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   g_aCpumRegAliases_rflags,   g_aCpumRegFields_rflags ),
    1126     CPU_REG_RW_AS("fcw",            FCW,            U16, fpu.FCW,               cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_fcw    ),
    1127     CPU_REG_RW_AS("fsw",            FSW,            U16, fpu.FSW,               cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_fsw    ),
    1128     CPU_REG_RO_AS("ftw",            FTW,            U16, fpu,                   cpumR3RegGet_ftw,       cpumR3RegSet_ftw,       NULL,                       g_aCpumRegFields_ftw    ),
    1129     CPU_REG_RW_AS("fop",            FOP,            U16, fpu.FOP,               cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       NULL                    ),
    1130     CPU_REG_RW_AS("fpuip",          FPUIP,          U32, fpu.FPUIP,             cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   g_aCpumRegAliases_fpuip,    NULL                    ),
    1131     CPU_REG_RW_AS("fpucs",          FPUCS,          U16, fpu.CS,                cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       NULL                    ),
    1132     CPU_REG_RW_AS("fpudp",          FPUDP,          U32, fpu.FPUDP,             cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   g_aCpumRegAliases_fpudp,    NULL                    ),
    1133     CPU_REG_RW_AS("fpuds",          FPUDS,          U16, fpu.DS,                cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       NULL                    ),
    1134     CPU_REG_RW_AS("mxcsr",          MXCSR,          U32, fpu.MXCSR,             cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_mxcsr  ),
    1135     CPU_REG_RW_AS("mxcsr_mask",     MXCSR_MASK,     U32, fpu.MXCSR_MASK,        cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_mxcsr  ),
     1126    CPU_REG_RW_AS("fcw",            FCW,            U16, XState.x87.FCW,        cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_fcw    ),
     1127    CPU_REG_RW_AS("fsw",            FSW,            U16, XState.x87.FSW,        cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_fsw    ),
     1128    CPU_REG_RO_AS("ftw",            FTW,            U16, XState.x87,            cpumR3RegGet_ftw,       cpumR3RegSet_ftw,       NULL,                       g_aCpumRegFields_ftw    ),
     1129    CPU_REG_RW_AS("fop",            FOP,            U16, XState.x87.FOP,        cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       NULL                    ),
     1130    CPU_REG_RW_AS("fpuip",          FPUIP,          U32, XState.x87.FPUIP,      cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   g_aCpumRegAliases_fpuip,    NULL                    ),
     1131    CPU_REG_RW_AS("fpucs",          FPUCS,          U16, XState.x87.CS,         cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       NULL                    ),
     1132    CPU_REG_RW_AS("fpudp",          FPUDP,          U32, XState.x87.FPUDP,      cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   g_aCpumRegAliases_fpudp,    NULL                    ),
     1133    CPU_REG_RW_AS("fpuds",          FPUDS,          U16, XState.x87.DS,         cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       NULL                    ),
     1134    CPU_REG_RW_AS("mxcsr",          MXCSR,          U32, XState.x87.MXCSR,      cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_mxcsr  ),
     1135    CPU_REG_RW_AS("mxcsr_mask",     MXCSR_MASK,     U32, XState.x87.MXCSR_MASK, cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_mxcsr  ),
    11361136    CPU_REG_ST(0),
    11371137    CPU_REG_ST(1),
     
    12521252    CPU_REG_REG(RIP, rip),
    12531253    CPU_REG_RW_AS("rflags",         RFLAGS,         U64, rflags,                cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   g_aCpumRegAliases_rflags,   g_aCpumRegFields_rflags ),
    1254     CPU_REG_RW_AS("fcw",            FCW,            U16, fpu.FCW,               cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_fcw    ),
    1255     CPU_REG_RW_AS("fsw",            FSW,            U16, fpu.FSW,               cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_fsw    ),
    1256     CPU_REG_RO_AS("ftw",            FTW,            U16, fpu,                   cpumR3RegGet_ftw,       cpumR3RegSet_ftw,       NULL,                       g_aCpumRegFields_ftw    ),
    1257     CPU_REG_RW_AS("fop",            FOP,            U16, fpu.FOP,               cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       NULL                    ),
    1258     CPU_REG_RW_AS("fpuip",          FPUIP,          U32, fpu.FPUIP,             cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   g_aCpumRegAliases_fpuip,    NULL                    ),
    1259     CPU_REG_RW_AS("fpucs",          FPUCS,          U16, fpu.CS,                cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       NULL                    ),
    1260     CPU_REG_RW_AS("fpudp",          FPUDP,          U32, fpu.FPUDP,             cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   g_aCpumRegAliases_fpudp,    NULL                    ),
    1261     CPU_REG_RW_AS("fpuds",          FPUDS,          U16, fpu.DS,                cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       NULL                    ),
    1262     CPU_REG_RW_AS("mxcsr",          MXCSR,          U32, fpu.MXCSR,             cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_mxcsr  ),
    1263     CPU_REG_RW_AS("mxcsr_mask",     MXCSR_MASK,     U32, fpu.MXCSR_MASK,        cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_mxcsr  ),
     1254    CPU_REG_RW_AS("fcw",            FCW,            U16, XState.x87.FCW,        cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_fcw    ),
     1255    CPU_REG_RW_AS("fsw",            FSW,            U16, XState.x87.FSW,        cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_fsw    ),
     1256    CPU_REG_RO_AS("ftw",            FTW,            U16, XState.x87,            cpumR3RegGet_ftw,       cpumR3RegSet_ftw,       NULL,                       g_aCpumRegFields_ftw    ),
     1257    CPU_REG_RW_AS("fop",            FOP,            U16, XState.x87.FOP,        cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       NULL                    ),
     1258    CPU_REG_RW_AS("fpuip",          FPUIP,          U32, XState.x87.FPUIP,      cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   g_aCpumRegAliases_fpuip,    NULL                    ),
     1259    CPU_REG_RW_AS("fpucs",          FPUCS,          U16, XState.x87.CS,         cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       NULL                    ),
     1260    CPU_REG_RW_AS("fpudp",          FPUDP,          U32, XState.x87.FPUDP,      cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   g_aCpumRegAliases_fpudp,    NULL                    ),
     1261    CPU_REG_RW_AS("fpuds",          FPUDS,          U16, XState.x87.DS,         cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       NULL                    ),
     1262    CPU_REG_RW_AS("mxcsr",          MXCSR,          U32, XState.x87.MXCSR,      cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_mxcsr  ),
     1263    CPU_REG_RW_AS("mxcsr_mask",     MXCSR_MASK,     U32, XState.x87.MXCSR_MASK, cpumR3RegGet_Generic,   cpumR3RegSet_Generic,   NULL,                       g_aCpumRegFields_mxcsr  ),
    12641264    CPU_REG_ST(0),
    12651265    CPU_REG_ST(1),
  • trunk/src/VBox/VMM/VMMRC/CPUMRCA.asm

    r54674 r54898  
    6565    ffree   st7              ; Clear FPU stack register(7)'s tag entry to prevent overflow if a wraparound occurs
    6666                             ; for the upcoming push (load)
    67     fild    dword [xDX + CPUMCPU.Guest.fpu] ; Explicit FPU load to overwrite FIP, FOP, FDP registers in the FPU.
     67    fild    dword [xDX + CPUMCPU.Guest.XState] ; Explicit FPU load to overwrite FIP, FOP, FDP registers in the FPU.
    6868
    6969.nothing_to_clean:
     
    197197%ifdef RT_ARCH_AMD64
    198198    ; Use explicit REX prefix. See @bugref{6398}.
    199     o64 fxsave  [xDX + CPUMCPU.Host.fpu]
     199    o64 fxsave  [xDX + CPUMCPU.Host.XState]
    200200%else
    201     fxsave  [xDX + CPUMCPU.Host.fpu]
     201    fxsave  [xDX + CPUMCPU.Host.XState]
    202202%endif
    203203    or      dword [xDX + CPUMCPU.fUseFlags], (CPUM_USED_FPU | CPUM_USED_FPU_SINCE_REM)
    204     fxrstor [xDX + CPUMCPU.Guest.fpu]           ; raw-mode guest is always 32-bit. See @bugref{7138}.
     204    fxrstor [xDX + CPUMCPU.Guest.XState]        ; raw-mode guest is always 32-bit. See @bugref{7138}.
    205205
    206206hlfpua_finished_switch:
     
    217217; legacy support.
    218218hlfpua_no_fxsave:
    219     fnsave  [xDX + CPUMCPU.Host.fpu]
     219    fnsave  [xDX + CPUMCPU.Host.XState]
    220220    or      dword [xDX + CPUMCPU.fUseFlags], dword (CPUM_USED_FPU | CPUM_USED_FPU_SINCE_REM) ; yasm / nasm
    221     mov     eax, [xDX + CPUMCPU.Guest.fpu]      ; control word
     221    mov     eax, [xDX + CPUMCPU.Guest.XState]   ; control word
    222222    not     eax                                 ; 1 means exception ignored (6 LS bits)
    223223    and     eax, byte 03Fh                      ; 6 LS bits only
    224     test    eax, [xDX + CPUMCPU.Guest.fpu + 4] ; status word
     224    test    eax, [xDX + CPUMCPU.Guest.XState + 4] ; status word
    225225    jz short hlfpua_no_exceptions_pending
    226226    ; technically incorrect, but we certainly don't want any exceptions now!!
    227     and     dword [xDX + CPUMCPU.Guest.fpu + 4], ~03Fh
     227    and     dword [xDX + CPUMCPU.Guest.XState + 4], ~03Fh
    228228hlfpua_no_exceptions_pending:
    229     frstor  [xDX + CPUMCPU.Guest.fpu]
     229    frstor  [xDX + CPUMCPU.Guest.XState]
    230230    jmp near hlfpua_finished_switch
    231231%endif ; !RT_ARCH_AMD64
  • trunk/src/VBox/VMM/VMMSwitcher/AMD64andLegacy.mac

    r54707 r54898  
    11441144    mov     cr0, rcx
    11451145
    1146     fxsave  [rdx + r8 + CPUMCPU.Guest.fpu]
    1147     o64 fxrstor [rdx + r8 + CPUMCPU.Host.fpu]       ; Restore 64-bit host FPU state. See @bugref{7138}
     1146    fxsave  [rdx + r8 + CPUMCPU.Guest.XState]
     1147    o64 fxrstor [rdx + r8 + CPUMCPU.Host.XState]    ; Restore 64-bit host FPU state. See @bugref{7138}
    11481148    jmp short gth_fpu_no
    11491149
  • trunk/src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac

    r54862 r54898  
    665665    mov     cr0, rax
    666666    ; Use explicit REX prefix. See @bugref{6398}.
    667     o64 fxrstor [rdx + CPUMCPU.Guest.fpu]
     667    o64 fxrstor [rdx + CPUMCPU.Guest.XState]
    668668    mov     cr0, rcx                    ; and restore old CR0 again
    669669
     
    725725    ; parameter for all helper functions (pCtx)
    726726    DEBUG64_CHAR('9')
    727     lea     rsi, [rdx + CPUMCPU.Guest.fpu]
     727    lea     rsi, [rdx + CPUMCPU.Guest.XState]
    728728    lea     rax, [htg_return wrt rip]
    729729    push    rax                         ; return address
     
    12591259
    12601260    ; Use explicit REX prefix. See @bugref{6398}.
    1261     o64 fxsave  [rsi + CPUMCTX.fpu]
     1261    o64 fxsave  [rsi + CPUMCTX.XState]
    12621262
    12631263    mov     cr0, rcx                    ; and restore old CR0 again
  • trunk/src/VBox/VMM/VMMSwitcher/PAEand32Bit.mac

    r54546 r54898  
    991991
    992992    FIXUP FIX_NO_FXSAVE_JMP, 0, gth_no_fxsave - NAME(Start) ; this will insert a jmp gth_no_fxsave if fxsave isn't supported.
    993     fxsave  [edx + CPUMCPU.Guest.fpu]
    994     fxrstor [edx + CPUMCPU.Host.fpu]
     993    fxsave  [edx + CPUMCPU.Guest.XState]
     994    fxrstor [edx + CPUMCPU.Host.XState]
    995995    jmp near gth_fpu_no
    996996
    997997gth_no_fxsave:
    998     fnsave  [edx + CPUMCPU.Guest.fpu]
    999     mov     eax, [edx + CPUMCPU.Host.fpu]    ; control word
     998    fnsave  [edx + CPUMCPU.Guest.XState]
     999    mov     eax, [edx + CPUMCPU.Host.XState] ; control word
    10001000    not     eax                            ; 1 means exception ignored (6 LS bits)
    10011001    and     eax, byte 03Fh                 ; 6 LS bits only
    1002     test    eax, [edx + CPUMCPU.Host.fpu + 4] ; status word
     1002    test    eax, [edx + CPUMCPU.Host.XState + 4] ; status word
    10031003    jz      gth_no_exceptions_pending
    10041004
    10051005    ; technically incorrect, but we certainly don't want any exceptions now!!
    1006     and     dword [edx + CPUMCPU.Host.fpu + 4], ~03Fh
     1006    and     dword [edx + CPUMCPU.Host.XState + 4], ~03Fh
    10071007
    10081008gth_no_exceptions_pending:
    1009     frstor  [edx + CPUMCPU.Host.fpu]
     1009    frstor  [edx + CPUMCPU.Host.XState]
    10101010    jmp short gth_fpu_no
    10111011
  • trunk/src/VBox/VMM/include/CPUMInternal.h

    r54897 r54898  
    288288    /** FPU state. (16-byte alignment)
    289289     * @remark On x86, the format isn't necessarily X86FXSTATE (not important). */
    290     X86FXSTATE      fpu;
     290    X86XSAVEAREA    XState;
    291291
    292292    /** General purpose register, selectors, flags and more
  • trunk/src/VBox/VMM/include/CPUMInternal.mac

    r54897 r54898  
    1717
    1818%include "VBox/asmdefs.mac"
     19%include "VBox/vmm/cpum.mac"
    1920
    2021;;
     
    6465%define VMMGCRET_USED_FPU               040000000h
    6566
    66 %define FPUSTATE_SIZE                   512
    6767
    6868;; if anyone figures how to do %if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL) in
     
    127127    ;
    128128    alignb 64
    129     .Guest.fpu                resb    512
     129    .Guest.XState             resb    XSTATE_SIZE
    130130    .Guest.eax                resq    1
    131131    .Guest.ecx                resq    1
     
    256256    ;
    257257    alignb 64
    258     .Host.fpu            resb    FPUSTATE_SIZE
     258    .Host.XState         resb    XSTATE_SIZE
    259259
    260260%if HC_ARCH_BITS == 64 || fVBOX_WITH_HYBRID_32BIT_KERNEL
     
    368368    ;
    369369    alignb 64
    370     .Hyper.fpu                resb    512
     370    .Hyper.XState             resb    XSTATE_SIZE
    371371    .Hyper.eax                resq    1
    372372    .Hyper.ecx                resq    1
  • trunk/src/VBox/VMM/testcase/tstVMStruct.h

    r54737 r54898  
    6363
    6464    GEN_CHECK_SIZE(CPUMHOSTCTX);
    65     GEN_CHECK_OFF(CPUMHOSTCTX, fpu);
     65    GEN_CHECK_OFF(CPUMHOSTCTX, XState);
    6666#if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
    6767    GEN_CHECK_OFF(CPUMHOSTCTX, rbx);
     
    132132
    133133    GEN_CHECK_SIZE(CPUMCTX);
    134     GEN_CHECK_OFF(CPUMCTX, fpu);
     134    GEN_CHECK_OFF(CPUMCTX, XState);
    135135    GEN_CHECK_OFF(CPUMCTX, rdi);
    136136    GEN_CHECK_OFF(CPUMCTX, rsi);
  • trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp

    r51643 r54898  
    298298
    299299    /* cpumctx */
    300     CHECK_MEMBER_ALIGNMENT(CPUMCTX, fpu, 32);
     300    CHECK_MEMBER_ALIGNMENT(CPUMCTX, XState, 64);
    301301    CHECK_MEMBER_ALIGNMENT(CPUMCTX, rax, 32);
    302302    CHECK_MEMBER_ALIGNMENT(CPUMCTX, idtr.pIdt, 8);
  • trunk/src/recompiler/VBoxRecompiler.c

    r54737 r54898  
    23522352        /* Sync FPU state after CR4, CPUID and EFER (!). */
    23532353        if (fFlags & CPUM_CHANGED_FPU_REM)
    2354             save_raw_fp_state(&pVM->rem.s.Env, (uint8_t *)&pCtx->fpu); /* 'save' is an excellent name. */
     2354            save_raw_fp_state(&pVM->rem.s.Env, (uint8_t *)&pCtx->XState.x87); /* 'save' is an excellent name. */
    23552355    }
    23562356
     
    25452545
    25462546    /** @todo check if FPU/XMM was actually used in the recompiler */
    2547     restore_raw_fp_state(&pVM->rem.s.Env, (uint8_t *)&pCtx->fpu);
     2547    restore_raw_fp_state(&pVM->rem.s.Env, (uint8_t *)&pCtx->XState.x87);
    25482548////    dprintf2(("FPU state CW=%04X TT=%04X SW=%04X (%04X)\n", env->fpuc, env->fpstt, env->fpus, pVMCtx->fpu.FSW));
    25492549
     
    28162816    /** @todo DS */
    28172817    /** @todo Fix MXCSR support in QEMU so we don't overwrite MXCSR with 0 when we shouldn't! */
    2818     pCtx->fpu.MXCSR         = 0;
    2819     pCtx->fpu.MXCSR_MASK    = 0;
     2818    pCtx->XState.x87.MXCSR       = 0;
     2819    pCtx->XState.x87.MXCSR_MASK  = 0;
    28202820
    28212821    /** @todo check if FPU/XMM was actually used in the recompiler */
    2822     restore_raw_fp_state(&pVM->rem.s.Env, (uint8_t *)&pCtx->fpu);
     2822    restore_raw_fp_state(&pVM->rem.s.Env, (uint8_t *)&pCtx->XState.x87);
    28232823////    dprintf2(("FPU state CW=%04X TT=%04X SW=%04X (%04X)\n", env->fpuc, env->fpstt, env->fpus, pVMCtx->fpu.FSW));
    28242824
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette