VirtualBox

Changeset 55114 in vbox


Ignore:
Timestamp:
Apr 7, 2015 1:30:16 PM (9 years ago)
Author:
vboxsync
Message:

CPUM: Use XSAVE/XRSTOR for host state.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r55063 r55114  
    647647
    648648    /*
    649      * Allocate memory for the extended CPU state.
     649     * Figure out which XSAVE/XRSTOR features are available on the host.
     650     */
     651    uint64_t fXStateHostMask = 0;
     652    if (   pVM->cpum.s.HostFeatures.fXSaveRstor
     653        && pVM->cpum.s.HostFeatures.fOpSysXSaveRstor)
     654    {
     655        fXStateHostMask = ASMGetXcr0() & (  XSAVE_C_X87 | XSAVE_C_SSE | XSAVE_C_YMM | XSAVE_C_OPMASK
     656                                          | XSAVE_C_ZMM_HI256 | XSAVE_C_ZMM_16HI);
     657        AssertLogRelMsgStmt((fXStateHostMask & (XSAVE_C_X87 | XSAVE_C_SSE)) == (XSAVE_C_X87 | XSAVE_C_SSE),
     658                            ("%#llx\n", fXStateHostMask), fXStateHostMask = 0);
     659    }
     660    pVM->cpum.s.fXStateHostMask = fXStateHostMask;
     661    if (!HMIsEnabled(pVM)) /* For raw-mode, we only use XSAVE/XRSTOR when the guest starts using it (CPUID/CR4 visibility). */
     662        fXStateHostMask = 0;
     663    LogRel(("CPUML: fXStateHostMask=%#llx; initial: %#llx\n", pVM->cpum.s.fXStateHostMask, fXStateHostMask));
     664
     665    /*
     666     * Allocate memory for the extended CPU state and initialize the host XSAVE/XRSTOR mask.
    650667     */
    651668    uint32_t cbMaxXState = pVM->cpum.s.HostFeatures.cbMaxExtendedState;
     
    676693        pVCpu->cpum.s.Hyper.pXStateRC = MMHyperR3ToR0(pVM, pbXStates);
    677694        pbXStates += cbMaxXState;
     695
     696        pVCpu->cpum.s.Host.fXStateMask = fXStateHostMask;
    678697    }
    679698
  • trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp

    r55062 r55114  
    15091509
    15101510    /* Linear sub-leaf search. Lazy as usual. */
    1511     cLeaves = pLeaf - paLeaves;
     1511    cLeaves -= pLeaf - paLeaves;
    15121512    while (   cLeaves-- > 0
    15131513           && pLeaf->uLeaf == uLeaf)
     
    15291529        AssertLogRelReturn(paLeaves[0].uLeaf == 0, VERR_CPUM_IPE_1);
    15301530        AssertLogRelReturn(paLeaves[1].uLeaf == 1, VERR_CPUM_IPE_1);
    1531 
    1532         pFeatures->enmCpuVendor = CPUMR3CpuIdDetectVendorEx(paLeaves[0].uEax,
    1533                                                             paLeaves[0].uEbx,
    1534                                                             paLeaves[0].uEcx,
    1535                                                             paLeaves[0].uEdx);
    1536         pFeatures->uFamily      = ASMGetCpuFamily(paLeaves[1].uEax);
    1537         pFeatures->uModel       = ASMGetCpuModel(paLeaves[1].uEax, pFeatures->enmCpuVendor == CPUMCPUVENDOR_INTEL);
    1538         pFeatures->uStepping    = ASMGetCpuStepping(paLeaves[1].uEax);
     1531        PCCPUMCPUIDLEAF const pStd0Leaf = cpumR3CpuIdFindLeafEx(paLeaves, cLeaves, 0, 0);
     1532        AssertLogRelReturn(pStd0Leaf, VERR_CPUM_IPE_1);
     1533        PCCPUMCPUIDLEAF const pStd1Leaf = cpumR3CpuIdFindLeafEx(paLeaves, cLeaves, 1, 0);
     1534        AssertLogRelReturn(pStd1Leaf, VERR_CPUM_IPE_1);
     1535
     1536        pFeatures->enmCpuVendor = CPUMR3CpuIdDetectVendorEx(pStd0Leaf->uEax,
     1537                                                            pStd0Leaf->uEbx,
     1538                                                            pStd0Leaf->uEcx,
     1539                                                            pStd0Leaf->uEdx);
     1540        pFeatures->uFamily      = ASMGetCpuFamily(pStd1Leaf->uEax);
     1541        pFeatures->uModel       = ASMGetCpuModel(pStd1Leaf->uEax, pFeatures->enmCpuVendor == CPUMCPUVENDOR_INTEL);
     1542        pFeatures->uStepping    = ASMGetCpuStepping(pStd1Leaf->uEax);
    15391543        pFeatures->enmMicroarch = CPUMR3CpuIdDetermineMicroarchEx((CPUMCPUVENDOR)pFeatures->enmCpuVendor,
    15401544                                                                  pFeatures->uFamily,
     
    15451549        if (pLeaf)
    15461550            pFeatures->cMaxPhysAddrWidth = pLeaf->uEax & 0xff;
    1547         else if (paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_PSE36)
     1551        else if (pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_PSE36)
    15481552            pFeatures->cMaxPhysAddrWidth = 36;
    15491553        else
     
    15511555
    15521556        /* Standard features. */
    1553         pFeatures->fMsr                 = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_MSR);
    1554         pFeatures->fApic                = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_APIC);
    1555         pFeatures->fX2Apic              = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_X2APIC);
    1556         pFeatures->fPse                 = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_PSE);
    1557         pFeatures->fPse36               = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_PSE36);
    1558         pFeatures->fPae                 = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_PAE);
    1559         pFeatures->fPat                 = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_PAT);
    1560         pFeatures->fFxSaveRstor         = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_FXSR);
    1561         pFeatures->fXSaveRstor          = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_XSAVE);
    1562         pFeatures->fMmx                 = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_MMX);
    1563         pFeatures->fSse                 = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_SSE);
    1564         pFeatures->fSse2                = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_SSE2);
    1565         pFeatures->fSse3                = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_SSE3);
    1566         pFeatures->fSsse3               = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_SSSE3);
    1567         pFeatures->fSse41               = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_SSE4_1);
    1568         pFeatures->fSse42               = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_SSE4_2);
    1569         pFeatures->fAvx                 = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_AVX);
    1570         pFeatures->fTsc                 = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_TSC);
    1571         pFeatures->fSysEnter            = RT_BOOL(paLeaves[1].uEdx & X86_CPUID_FEATURE_EDX_SEP);
    1572         pFeatures->fHypervisorPresent   = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_HVP);
    1573         pFeatures->fMonitorMWait        = RT_BOOL(paLeaves[1].uEcx & X86_CPUID_FEATURE_ECX_MONITOR);
     1557        pFeatures->fMsr                 = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_MSR);
     1558        pFeatures->fApic                = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_APIC);
     1559        pFeatures->fX2Apic              = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_X2APIC);
     1560        pFeatures->fPse                 = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_PSE);
     1561        pFeatures->fPse36               = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_PSE36);
     1562        pFeatures->fPae                 = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_PAE);
     1563        pFeatures->fPat                 = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_PAT);
     1564        pFeatures->fFxSaveRstor         = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_FXSR);
     1565        pFeatures->fXSaveRstor          = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_XSAVE);
     1566        pFeatures->fOpSysXSaveRstor     = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_OSXSAVE);
     1567        pFeatures->fMmx                 = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_MMX);
     1568        pFeatures->fSse                 = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_SSE);
     1569        pFeatures->fSse2                = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_SSE2);
     1570        pFeatures->fSse3                = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_SSE3);
     1571        pFeatures->fSsse3               = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_SSSE3);
     1572        pFeatures->fSse41               = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_SSE4_1);
     1573        pFeatures->fSse42               = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_SSE4_2);
     1574        pFeatures->fAvx                 = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_AVX);
     1575        pFeatures->fTsc                 = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_TSC);
     1576        pFeatures->fSysEnter            = RT_BOOL(pStd1Leaf->uEdx & X86_CPUID_FEATURE_EDX_SEP);
     1577        pFeatures->fHypervisorPresent   = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_HVP);
     1578        pFeatures->fMonitorMWait        = RT_BOOL(pStd1Leaf->uEcx & X86_CPUID_FEATURE_ECX_MONITOR);
    15741579
    15751580        /* Structured extended features. */
  • trunk/src/VBox/VMM/include/CPUMInternal.h

    r55106 r55114  
    191191    /** Supports the XSAVE and XRSTOR instructions. */
    192192    uint32_t        fXSaveRstor : 1;
     193    /** The XSAVE/XRSTOR bit in CR4 has been set (only applicable for host!). */
     194    uint32_t        fOpSysXSaveRstor : 1;
    193195    /** Supports MMX. */
    194196    uint32_t        fMmx : 1;
     
    243245
    244246    /** Alignment padding / reserved for future use. */
    245     uint32_t        fPadding : 2;
     247    uint32_t        fPadding : 1;
    246248    uint64_t        auPadding[2];
    247249} CPUMFEATURES;
     
    526528    /** Host CPU feature information. */
    527529    CPUMFEATURES            HostFeatures;
     530    /** XSAVE/XRSTOR host mask.  Only state components in this mask can be exposed
     531     * to the guest.  This is 0 if no XSAVE/XRSTOR bits can be exposed. */
     532    uint64_t                fXStateHostMask;
    528533
    529534    /** @name MSR statistics.
  • trunk/src/VBox/VMM/include/CPUMInternal.mac

    r55106 r55114  
    103103    .GuestFeatures        resb    32
    104104    .HostFeatures         resb    32
     105    .fXStateHostMask      resq    1
    105106
    106107    .cMsrWrites                 resq  1
Note: See TracChangeset for help on using the changeset viewer.

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