VirtualBox

Changeset 44171 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Dec 19, 2012 6:05:58 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
82881
Message:

HMR0.cpp: Use ASMIsXyzCpuEx and friends, also be a bit more paranoid about checking that CPUID leaves we query are supported.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMR0.cpp

    r43879 r44171  
    547547 * AMD-specific initialization code.
    548548 */
    549 static void hmR0InitAmd(uint32_t u32FeaturesEDX)
     549static void hmR0InitAmd(uint32_t u32FeaturesEDX, uint32_t uMaxExtLeaf)
    550550{
    551551    /*
     
    556556        && (u32FeaturesEDX & X86_CPUID_FEATURE_EDX_MSR)
    557557        && (u32FeaturesEDX & X86_CPUID_FEATURE_EDX_FXSR)
     558        && ASMIsValidExtRange(uMaxExtLeaf)
     559        && uMaxExtLeaf >= 0x8000000a
    558560       )
    559561    {
     
    571573        /* Query AMD features. */
    572574        uint32_t u32Dummy;
    573         ASMCpuId(0x8000000A, &g_HvmR0.svm.u32Rev, &g_HvmR0.uMaxAsid, &u32Dummy, &g_HvmR0.svm.u32Features);
     575        ASMCpuId(0x8000000a, &g_HvmR0.svm.u32Rev, &g_HvmR0.uMaxAsid, &u32Dummy, &g_HvmR0.svm.u32Features);
    574576
    575577        /*
     
    647649    if (ASMHasCpuId())
    648650    {
    649         uint32_t u32FeaturesECX, u32FeaturesEDX;
    650         uint32_t u32VendorEBX, u32VendorECX, u32VendorEDX;
    651         uint32_t u32Dummy;
    652 
    653651        /* Standard features. */
    654         ASMCpuId(0, &u32Dummy, &u32VendorEBX, &u32VendorECX, &u32VendorEDX);
    655         ASMCpuId(1, &u32Dummy, &u32Dummy, &u32FeaturesECX, &u32FeaturesEDX);
    656 
    657         /* Query AMD features. */
    658         ASMCpuId(0x80000001, &u32Dummy, &u32Dummy,
    659                  &g_HvmR0.cpuid.u32AMDFeatureECX,
    660                  &g_HvmR0.cpuid.u32AMDFeatureEDX);
    661 
    662         /* Go to CPU specific initialization code. */
    663         if (   (   u32VendorEBX == X86_CPUID_VENDOR_INTEL_EBX
    664                 && u32VendorECX == X86_CPUID_VENDOR_INTEL_ECX
    665                 && u32VendorEDX == X86_CPUID_VENDOR_INTEL_EDX)
    666             || (   u32VendorEBX == X86_CPUID_VENDOR_VIA_EBX
    667                 && u32VendorECX == X86_CPUID_VENDOR_VIA_ECX
    668                 && u32VendorEDX == X86_CPUID_VENDOR_VIA_EDX))
     652        uint32_t uMaxLeaf, u32VendorEBX, u32VendorECX, u32VendorEDX;
     653        ASMCpuId(0, &uMaxLeaf, &u32VendorEBX, &u32VendorECX, &u32VendorEDX);
     654        if (ASMIsValidStdRange(uMaxLeaf))
    669655        {
    670             rc = hmR0InitIntel(u32FeaturesECX, u32FeaturesEDX);
    671             if (RT_FAILURE(rc))
    672                 return rc;
     656            uint32_t u32FeaturesECX, u32FeaturesEDX, u32Dummy;
     657            ASMCpuId(1, &u32Dummy, &u32Dummy,   &u32FeaturesECX, &u32FeaturesEDX);
     658
     659            /* Query AMD features. */
     660            uint32_t uMaxExtLeaf = ASMCpuId_EAX(0x80000000);
     661            if (ASMIsValidExtRange(uMaxExtLeaf))
     662                ASMCpuId(0x80000001, &u32Dummy, &u32Dummy,
     663                         &g_HvmR0.cpuid.u32AMDFeatureECX,
     664                         &g_HvmR0.cpuid.u32AMDFeatureEDX);
     665            else
     666                g_HvmR0.cpuid.u32AMDFeatureECX = g_HvmR0.cpuid.u32AMDFeatureEDX = 0;
     667
     668            /* Go to CPU specific initialization code. */
     669            if (   ASMIsIntelCpuEx(u32VendorEBX, u32VendorECX, u32VendorEDX)
     670                || ASMIsViaCentaurCpuEx(u32VendorEBX, u32VendorECX, u32VendorEDX))
     671            {
     672                rc = hmR0InitIntel(u32FeaturesECX, u32FeaturesEDX);
     673                if (RT_FAILURE(rc))
     674                    return rc;
     675            }
     676            else if (ASMIsAmdCpuEx(u32VendorEBX, u32VendorECX, u32VendorEDX))
     677                hmR0InitAmd(u32FeaturesEDX, uMaxExtLeaf);
     678            else
     679                g_HvmR0.lLastError = VERR_HM_UNKNOWN_CPU;
    673680        }
    674         else if (   u32VendorEBX == X86_CPUID_VENDOR_AMD_EBX
    675                  && u32VendorECX == X86_CPUID_VENDOR_AMD_ECX
    676                  && u32VendorEDX == X86_CPUID_VENDOR_AMD_EDX)
    677             hmR0InitAmd(u32FeaturesEDX);
    678681        else
    679682            g_HvmR0.lLastError = VERR_HM_UNKNOWN_CPU;
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