Index: /trunk/src/VBox/VMM/VMMR0/HMR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/HMR0.cpp	(revision 44170)
+++ /trunk/src/VBox/VMM/VMMR0/HMR0.cpp	(revision 44171)
@@ -547,5 +547,5 @@
  * AMD-specific initialization code.
  */
-static void hmR0InitAmd(uint32_t u32FeaturesEDX)
+static void hmR0InitAmd(uint32_t u32FeaturesEDX, uint32_t uMaxExtLeaf)
 {
     /*
@@ -556,4 +556,6 @@
         && (u32FeaturesEDX & X86_CPUID_FEATURE_EDX_MSR)
         && (u32FeaturesEDX & X86_CPUID_FEATURE_EDX_FXSR)
+        && ASMIsValidExtRange(uMaxExtLeaf)
+        && uMaxExtLeaf >= 0x8000000a
        )
     {
@@ -571,5 +573,5 @@
         /* Query AMD features. */
         uint32_t u32Dummy;
-        ASMCpuId(0x8000000A, &g_HvmR0.svm.u32Rev, &g_HvmR0.uMaxAsid, &u32Dummy, &g_HvmR0.svm.u32Features);
+        ASMCpuId(0x8000000a, &g_HvmR0.svm.u32Rev, &g_HvmR0.uMaxAsid, &u32Dummy, &g_HvmR0.svm.u32Features);
 
         /*
@@ -647,33 +649,34 @@
     if (ASMHasCpuId())
     {
-        uint32_t u32FeaturesECX, u32FeaturesEDX;
-        uint32_t u32VendorEBX, u32VendorECX, u32VendorEDX;
-        uint32_t u32Dummy;
-
         /* Standard features. */
-        ASMCpuId(0, &u32Dummy, &u32VendorEBX, &u32VendorECX, &u32VendorEDX);
-        ASMCpuId(1, &u32Dummy, &u32Dummy, &u32FeaturesECX, &u32FeaturesEDX);
-
-        /* Query AMD features. */
-        ASMCpuId(0x80000001, &u32Dummy, &u32Dummy,
-                 &g_HvmR0.cpuid.u32AMDFeatureECX,
-                 &g_HvmR0.cpuid.u32AMDFeatureEDX);
-
-        /* Go to CPU specific initialization code. */
-        if (   (   u32VendorEBX == X86_CPUID_VENDOR_INTEL_EBX
-                && u32VendorECX == X86_CPUID_VENDOR_INTEL_ECX
-                && u32VendorEDX == X86_CPUID_VENDOR_INTEL_EDX)
-            || (   u32VendorEBX == X86_CPUID_VENDOR_VIA_EBX
-                && u32VendorECX == X86_CPUID_VENDOR_VIA_ECX
-                && u32VendorEDX == X86_CPUID_VENDOR_VIA_EDX))
+        uint32_t uMaxLeaf, u32VendorEBX, u32VendorECX, u32VendorEDX;
+        ASMCpuId(0, &uMaxLeaf, &u32VendorEBX, &u32VendorECX, &u32VendorEDX);
+        if (ASMIsValidStdRange(uMaxLeaf))
         {
-            rc = hmR0InitIntel(u32FeaturesECX, u32FeaturesEDX);
-            if (RT_FAILURE(rc))
-                return rc;
+            uint32_t u32FeaturesECX, u32FeaturesEDX, u32Dummy;
+            ASMCpuId(1, &u32Dummy, &u32Dummy,   &u32FeaturesECX, &u32FeaturesEDX);
+
+            /* Query AMD features. */
+            uint32_t uMaxExtLeaf = ASMCpuId_EAX(0x80000000);
+            if (ASMIsValidExtRange(uMaxExtLeaf))
+                ASMCpuId(0x80000001, &u32Dummy, &u32Dummy,
+                         &g_HvmR0.cpuid.u32AMDFeatureECX,
+                         &g_HvmR0.cpuid.u32AMDFeatureEDX);
+            else
+                g_HvmR0.cpuid.u32AMDFeatureECX = g_HvmR0.cpuid.u32AMDFeatureEDX = 0;
+
+            /* Go to CPU specific initialization code. */
+            if (   ASMIsIntelCpuEx(u32VendorEBX, u32VendorECX, u32VendorEDX)
+                || ASMIsViaCentaurCpuEx(u32VendorEBX, u32VendorECX, u32VendorEDX))
+            {
+                rc = hmR0InitIntel(u32FeaturesECX, u32FeaturesEDX);
+                if (RT_FAILURE(rc))
+                    return rc;
+            }
+            else if (ASMIsAmdCpuEx(u32VendorEBX, u32VendorECX, u32VendorEDX))
+                hmR0InitAmd(u32FeaturesEDX, uMaxExtLeaf);
+            else
+                g_HvmR0.lLastError = VERR_HM_UNKNOWN_CPU;
         }
-        else if (   u32VendorEBX == X86_CPUID_VENDOR_AMD_EBX
-                 && u32VendorECX == X86_CPUID_VENDOR_AMD_ECX
-                 && u32VendorEDX == X86_CPUID_VENDOR_AMD_EDX)
-            hmR0InitAmd(u32FeaturesEDX);
         else
             g_HvmR0.lLastError = VERR_HM_UNKNOWN_CPU;
