VirtualBox

Ignore:
Timestamp:
Apr 14, 2015 6:35:43 AM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
99536
Message:

CPUM,IEM: Expose GuestFeatures and HostFeatures (exploded CPUID), making IEM use it. Early XSAVE/AVX guest support preps.

File:
1 edited

Legend:

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

    r55062 r55229  
    4949# pragma optimize("y", off)
    5050#endif
     51
     52AssertCompile2MemberOffsets(VM, cpum.s.HostFeatures,  cpum.ro.HostFeatures);
     53AssertCompile2MemberOffsets(VM, cpum.s.GuestFeatures, cpum.ro.GuestFeatures);
    5154
    5255
     
    742745VMMDECL(int) CPUMSetGuestCR4(PVMCPU pVCpu, uint64_t cr4)
    743746{
    744     if (    (cr4                     & (X86_CR4_PGE | X86_CR4_PAE | X86_CR4_PSE))
    745         !=  (pVCpu->cpum.s.Guest.cr4 & (X86_CR4_PGE | X86_CR4_PAE | X86_CR4_PSE)))
     747    /*
     748     * The CR4.OSXSAVE bit is reflected in CPUID(1).ECX[27].
     749     */
     750    if (   (cr4                     & X86_CR4_OSXSAVE)
     751        != (pVCpu->cpum.s.Guest.cr4 & X86_CR4_OSXSAVE) )
     752    {
     753        PVM pVM = pVCpu->CTX_SUFF(pVM);
     754        if (cr4 & X86_CR4_OSXSAVE)
     755            CPUMSetGuestCpuIdFeature(pVM, CPUMCPUIDFEATURE_OSXSAVE);
     756        else
     757            CPUMClearGuestCpuIdFeature(pVM, CPUMCPUIDFEATURE_OSXSAVE);
     758    }
     759
     760    if (   (cr4                     & (X86_CR4_PGE | X86_CR4_PAE | X86_CR4_PSE))
     761        != (pVCpu->cpum.s.Guest.cr4 & (X86_CR4_PGE | X86_CR4_PAE | X86_CR4_PSE)))
    746762        pVCpu->cpum.s.fChanged |= CPUM_CHANGED_GLOBAL_TLB_FLUSH;
     763
    747764    pVCpu->cpum.s.fChanged |= CPUM_CHANGED_CR4;
    748765    pVCpu->cpum.s.Guest.cr4 = cr4;
     
    12841301             * Deal with CPU specific information (currently only APIC ID).
    12851302             */
    1286             if (pLeaf->fFlags & CPUMCPUIDLEAF_F_CONTAINS_APIC_ID)
     1303            if (pLeaf->fFlags & (CPUMCPUIDLEAF_F_CONTAINS_APIC_ID | CPUMCPUIDLEAF_F_CONTAINS_OSXSAVE))
    12871304            {
    12881305                if (uLeaf == 1)
    12891306                {
    1290                     /* Bits 31-24: Initial APIC ID */
     1307                    /* EBX: Bits 31-24: Initial APIC ID. */
    12911308                    Assert(pVCpu->idCpu <= 255);
    12921309                    AssertMsg((pLeaf->uEbx >> 24) == 0, ("%#x\n", pLeaf->uEbx)); /* raw-mode assumption */
    12931310                    *pEbx = (pLeaf->uEbx & UINT32_C(0x00ffffff)) | (pVCpu->idCpu << 24);
     1311
     1312                    /* ECX: Bit 27: CR4.OSXSAVE mirror. */
     1313                    *pEcx = (pLeaf->uEcx & ~X86_CPUID_FEATURE_ECX_OSXSAVE)
     1314                          | (pVCpu->cpum.s.Guest.cr4 & X86_CR4_OSXSAVE ? X86_CPUID_FEATURE_ECX_OSXSAVE : 0);
    12941315                }
    12951316                else if (uLeaf == 0xb)
     
    15891610            break;
    15901611
     1612        /*
     1613         * OSXSAVE - only used from CPUMSetGuestCR4.
     1614         */
     1615        case CPUMCPUIDFEATURE_OSXSAVE:
     1616            AssertLogRelReturnVoid(pVM->cpum.s.HostFeatures.fXSaveRstor && pVM->cpum.s.HostFeatures.fOpSysXSaveRstor);
     1617
     1618            pLeaf = cpumCpuIdGetLeaf(pVM, UINT32_C(0x00000001));
     1619            AssertLogRelReturnVoid(pLeaf);
     1620
     1621            /* UNI: Special case for single CPU to make life simple for CPUMPatchHlpCpuId. */
     1622            if (pVM->cCpus == 1)
     1623                pVM->cpum.s.aGuestCpuIdPatmStd[1].uEcx = pLeaf->uEcx |= X86_CPUID_FEATURE_ECX_OSXSAVE;
     1624            /* SMP: Set flag indicating OSXSAVE updating (superfluous because of the APIC ID, but that's fine). */
     1625            else
     1626                ASMAtomicOrU32(&pLeaf->fFlags, CPUMCPUIDLEAF_F_CONTAINS_OSXSAVE);
     1627            break;
     1628
    15911629        default:
    15921630            AssertMsgFailed(("enmFeature=%d\n", enmFeature));
     
    16261664        case CPUMCPUIDFEATURE_MWAIT_EXTS:   return pVM->cpum.s.GuestFeatures.fMWaitExtensions;
    16271665
     1666        case CPUMCPUIDFEATURE_OSXSAVE:
    16281667        case CPUMCPUIDFEATURE_INVALID:
    16291668        case CPUMCPUIDFEATURE_32BIT_HACK:
     
    17321771            Log(("CPUM: ClearGuestCpuIdFeature: Disabled MWAIT Extensions!\n"));
    17331772            break;
     1773
     1774        /*
     1775         * OSXSAVE - only used from CPUMSetGuestCR4.
     1776         */
     1777        case CPUMCPUIDFEATURE_OSXSAVE:
     1778            AssertLogRelReturnVoid(pVM->cpum.s.HostFeatures.fXSaveRstor && pVM->cpum.s.HostFeatures.fOpSysXSaveRstor);
     1779
     1780            pLeaf = cpumCpuIdGetLeaf(pVM, UINT32_C(0x00000001));
     1781            AssertLogRelReturnVoid(pLeaf);
     1782
     1783            /* UNI: Special case for single CPU to make life easy for CPUMPatchHlpCpuId. */
     1784            if (pVM->cCpus == 1)
     1785                pVM->cpum.s.aGuestCpuIdPatmStd[1].uEcx = pLeaf->uEcx &= ~X86_CPUID_FEATURE_ECX_OSXSAVE;
     1786            /* else: SMP: We never set the OSXSAVE bit and leaving the CONTAINS_OSXSAVE flag is fine. */
     1787            break;
     1788
    17341789
    17351790        default:
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