CPUMR3CpuId.cpp revision 1bc6deb47f3874f8d1d7a7b6e01d7d7c314d808f
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * CPUM - CPU ID part.
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * Copyright (C) 2013-2014 Oracle Corporation
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * available from http://www.virtualbox.org. This file is free software;
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * you can redistribute it and/or modify it under the terms of the GNU
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * General Public License (GPL) as published by the Free Software
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync/*******************************************************************************
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync* Header Files *
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync*******************************************************************************/
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync/*******************************************************************************
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync* Global Variables *
28626a5957b49791b505bf66131448a847043763vboxsync*******************************************************************************/
ae6cc8f82ba26e3940022ea7d26078bec3d2a05fvboxsync * The intel pentium family.
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [ 0(0x00)] = */ kCpumMicroarch_Intel_P6, /* Pentium Pro A-step (says sandpile.org). */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [ 1(0x01)] = */ kCpumMicroarch_Intel_P6, /* Pentium Pro */
9b0ba1d4360299b4e6ee23c946feb5a4f16c6d00vboxsync /* [ 3(0x03)] = */ kCpumMicroarch_Intel_P6_II, /* PII Klamath */
9b0ba1d4360299b4e6ee23c946feb5a4f16c6d00vboxsync /* [ 5(0x05)] = */ kCpumMicroarch_Intel_P6_II, /* PII Deschutes */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [ 6(0x06)] = */ kCpumMicroarch_Intel_P6_II, /* Celeron Mendocino. */
7cca5a9aeb06913531b982bf772508d09b4c2f0bvboxsync /* [ 7(0x07)] = */ kCpumMicroarch_Intel_P6_III, /* PIII Katmai. */
7cca5a9aeb06913531b982bf772508d09b4c2f0bvboxsync /* [ 8(0x08)] = */ kCpumMicroarch_Intel_P6_III, /* PIII Coppermine (includes Celeron). */
7cca5a9aeb06913531b982bf772508d09b4c2f0bvboxsync /* [ 9(0x09)] = */ kCpumMicroarch_Intel_P6_M_Banias, /* Pentium/Celeron M Banias. */
7cca5a9aeb06913531b982bf772508d09b4c2f0bvboxsync /* [10(0x0a)] = */ kCpumMicroarch_Intel_P6_III, /* PIII Xeon */
7cca5a9aeb06913531b982bf772508d09b4c2f0bvboxsync /* [11(0x0b)] = */ kCpumMicroarch_Intel_P6_III, /* PIII Tualatin (includes Celeron). */
2f827df539da232220444c27f2b207a707a045b0vboxsync /* [13(0x0d)] = */ kCpumMicroarch_Intel_P6_M_Dothan, /* Pentium/Celeron M Dothan. */
2f827df539da232220444c27f2b207a707a045b0vboxsync /* [14(0x0e)] = */ kCpumMicroarch_Intel_Core_Yonah, /* Core Yonah (Enhanced Pentium M). */
2f827df539da232220444c27f2b207a707a045b0vboxsync /* [15(0x0f)] = */ kCpumMicroarch_Intel_Core2_Merom, /* Merom */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [21(0x15)] = */ kCpumMicroarch_Intel_P6_M_Dothan, /* Tolapai - System-on-a-chip. */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [22(0x16)] = */ kCpumMicroarch_Intel_Core2_Merom,
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [23(0x17)] = */ kCpumMicroarch_Intel_Core2_Penryn,
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [26(0x1a)] = */ kCpumMicroarch_Intel_Core7_Nehalem,
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [28(0x1c)] = */ kCpumMicroarch_Intel_Atom_Bonnell, /* Diamonville, Pineview, */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [29(0x1d)] = */ kCpumMicroarch_Intel_Core2_Penryn,
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [30(0x1e)] = */ kCpumMicroarch_Intel_Core7_Nehalem, /* Clarksfield, Lynnfield, Jasper Forest. */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [31(0x1f)] = */ kCpumMicroarch_Intel_Core7_Nehalem, /* Only listed by sandpile.org. 2 cores ABD/HVD, whatever that means. */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [37(0x25)] = */ kCpumMicroarch_Intel_Core7_Westmere, /* Arrandale, Clarksdale. */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [38(0x26)] = */ kCpumMicroarch_Intel_Atom_Lincroft,
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [39(0x27)] = */ kCpumMicroarch_Intel_Atom_Saltwell,
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [42(0x2a)] = */ kCpumMicroarch_Intel_Core7_SandyBridge,
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [44(0x2c)] = */ kCpumMicroarch_Intel_Core7_Westmere, /* Gulftown, Westmere-EP. */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [45(0x2d)] = */ kCpumMicroarch_Intel_Core7_SandyBridge, /* SandyBridge-E, SandyBridge-EN, SandyBridge-EP. */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [46(0x2e)] = */ kCpumMicroarch_Intel_Core7_Nehalem, /* Beckton (Xeon). */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [47(0x2f)] = */ kCpumMicroarch_Intel_Core7_Westmere, /* Westmere-EX. */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* [53(0x35)] = */ kCpumMicroarch_Intel_Atom_Saltwell, /* ?? */
7f9e93577d96c7f2a6977229c1baab57d5ec94e4vboxsync /* [54(0x36)] = */ kCpumMicroarch_Intel_Atom_Saltwell, /* Cedarview, ++ */
2f827df539da232220444c27f2b207a707a045b0vboxsync /* [55(0x37)] = */ kCpumMicroarch_Intel_Atom_Silvermont,
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync /* [58(0x3a)] = */ kCpumMicroarch_Intel_Core7_IvyBridge,
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync /* [60(0x3c)] = */ kCpumMicroarch_Intel_Core7_Haswell,
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync /* [61(0x3d)] = */ kCpumMicroarch_Intel_Core7_Broadwell,
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync /* [62(0x3e)] = */ kCpumMicroarch_Intel_Core7_IvyBridge,
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync /* [63(0x3f)] = */ kCpumMicroarch_Intel_Core7_Haswell,
2cb52dd865592ea8e27b588beb22898d189646b1vboxsync /* [69(0x45)] = */ kCpumMicroarch_Intel_Core7_Haswell,
2cb52dd865592ea8e27b588beb22898d189646b1vboxsync /* [70(0x46)] = */ kCpumMicroarch_Intel_Core7_Haswell,
5b0adfbdd9550a026f5d6209743504562f791f97vboxsync /* [74(0x4a)] = */ kCpumMicroarch_Intel_Atom_Silvermont,
2cb52dd865592ea8e27b588beb22898d189646b1vboxsync /* [77(0x4d)] = */ kCpumMicroarch_Intel_Atom_Silvermont,
2cb52dd865592ea8e27b588beb22898d189646b1vboxsync * Figures out the (sub-)micro architecture given a bit of CPUID info.
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * @returns Micro architecture.
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * @param enmVendor The CPU vendor .
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * @param bFamily The CPU family.
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * @param bModel The CPU model.
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * @param bStepping The CPU stepping.
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsyncVMMR3DECL(CPUMMICROARCH) CPUMR3CpuIdDetermineMicroarchEx(CPUMCPUVENDOR enmVendor, uint8_t bFamily,
2f827df539da232220444c27f2b207a707a045b0vboxsync case 0x02: return kCpumMicroarch_AMD_Am286; /* Not really kosher... */
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync case 0x23: return kCpumMicroarch_AMD_Am386; /* SX*/
2cb52dd865592ea8e27b588beb22898d189646b1vboxsync case 0x04: return bModel < 14 ? kCpumMicroarch_AMD_Am486 : kCpumMicroarch_AMD_Am486Enh;
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync case 0x05: return bModel < 6 ? kCpumMicroarch_AMD_K5 : kCpumMicroarch_AMD_K6; /* Genode LX is 0x0a, lump it with K6. */
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync case 10: kCpumMicroarch_AMD_K7_Barton; /* Thorton too. */
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * This family is a friggin mess. Trying my best to make some
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * sense out of it. Too much happened in the 0x0f family to
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * lump it all together as K8 (130nm->90nm->65nm, AMD-V, ++).
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * Emperical CPUID.01h.EAX evidence from revision guides, wikipedia,
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * cpu-world.com, and other places:
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * - ClawHammer: F7A/SH-CG, F5A/-CG, F4A/-CG, F50/-B0, F48/-C0, F58/-C0,
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * - SledgeHammer: F50/SH-B0, F48/-C0, F58/-C0, F4A/-CG, F5A/-CG, F7A/-CG, F51/-B3
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * - Newcastle: FC0/DH-CG (errum #180: FE0/DH-CG), FF0/DH-CG
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * - Dublin: FC0/-CG, FF0/-CG, F82/CH-CG, F4A/-CG, F48/SH-C0,
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * - Paris: FF0/DH-CG, FC0/DH-CG (errum #180: FE0/DH-CG),
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - Oakville: 10FC0/DH-D0.
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - Georgetown: 10FC0/DH-D0.
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * - Sonora: 10FC0/DH-D0.
38754ce3fec7064c34ccedb1dbce89cdfba65953vboxsync * - Venus: 20F71/SH-E4
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - Troy: 20F51/SH-E4
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - Athens: 20F51/SH-E4
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - San Diego: 20F71/SH-E4.
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - Lancaster: 20F42/SH-E5
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * - Newark: 20F42/SH-E5.
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * - Albany: 20FC2/DH-E6.
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - Roma: 20FC2/DH-E6.
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - Palermo: 10FC0/DH-D0, 20FF0/DH-E3, 20FC0/DH-E3, 20FC2/DH-E6, 20FF2/DH-E6
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - 90nm introducing Dual core:
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * - Toledo: 20F32/JH-E6, 30F72/DH-E6 (single code variant).
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - 90nm 2nd gen opteron ++, AMD-V introduced (might be missing in some cheeper models):
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - Santa Ana: 40F32/JH-F2, /-F3
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - Windsor: 40F32/JH-F2, 40F33/JH-F3, C0F13/JH-F3, 40FB2/BH-F2, ??20FB1/BH-E4??.
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - Orleans: 40FF2/DH-F2, 50FF2/DH-F2, 50FF3/DH-F3.
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - Keene: 40FC2/DH-F2.
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync * - Richmond: 40FC2/DH-F2
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * - Taylor: 40F82/BH-F2
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * - Trinidad: 40F82/BH-F2
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * - Sherman: /-G1, 70FC2/DH-G2.
56f538fa476fdbd9cc3d60438083a3f0d5f3ff7fvboxsync * - Huron: 70FF2/DH-G2.
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync case 0x00: return kCpumMicroarch_AMD_15h_Bulldozer; /* Any? prerelease? */
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync case 0x01: return kCpumMicroarch_AMD_15h_Bulldozer; /* Opteron 4200, FX-81xx. */
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync case 0x02: return kCpumMicroarch_AMD_15h_Piledriver; /* Opteron 4300, FX-83xx. */
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync case 0x10: return kCpumMicroarch_AMD_15h_Piledriver; /* A10-5800K for e.g. */
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync case 0x13: return kCpumMicroarch_AMD_15h_Piledriver; /* A10-6800K for e.g. */
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync case 4: return kCpumMicroarch_Intel_NB_Prescott2M; /* ?? */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync case 5: return kCpumMicroarch_Intel_NB_Unknown; /*??*/
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync /* The following are not kosher but kind of follow intuitively from 6, 5 & 4. */
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync case 7: return bStepping < 8 ? kCpumMicroarch_VIA_C3_C5B : kCpumMicroarch_VIA_C3_C5C;
f46e7db81f80ea09725c6cc048fa0cad86573dc2vboxsync case 9: return bStepping < 8 ? kCpumMicroarch_VIA_C3_C5XL : kCpumMicroarch_VIA_C3_C5P;
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * Translates a microarchitecture enum value to the corresponding string
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * constant.
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * @returns Read-only string constant (omits "kCpumMicroarch_" prefix). Returns
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * NULL if the value is invalid.
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * @param enmMicroarch The enum value to convert.
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsyncVMMR3DECL(const char *) CPUMR3MicroarchName(CPUMMICROARCH enmMicroarch)
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync#define CASE_RET_STR(enmValue) case enmValue: return #enmValue + (sizeof("kCpumMicroarch_") - 1)
7753dc7a3bcd14c9ec9d969cbc1a0155b0673c06vboxsync CASE_RET_STR(kCpumMicroarch_Intel_Core7_SandyBridge);
7753dc7a3bcd14c9ec9d969cbc1a0155b0673c06vboxsync CASE_RET_STR(kCpumMicroarch_Intel_Core7_IvyBridge);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync CASE_RET_STR(kCpumMicroarch_Intel_Core7_Broadwell);
7753dc7a3bcd14c9ec9d969cbc1a0155b0673c06vboxsync CASE_RET_STR(kCpumMicroarch_Intel_Core7_Cannonlake);
7753dc7a3bcd14c9ec9d969cbc1a0155b0673c06vboxsync CASE_RET_STR(kCpumMicroarch_Intel_Atom_Silvermont);
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync /* no default! */
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * Gets a matching leaf in the CPUID leaf array.
b6517c5cc3b7a38889416706905a3cf2fd010785vboxsync * @returns Pointer to the matching leaf, or NULL if not found.
PCPUMCPUIDLEAF cpumR3CpuIdGetLeaf(PCPUMCPUIDLEAF paLeaves, uint32_t cLeaves, uint32_t uLeaf, uint32_t uSubLeaf)
return &paLeaves[i];
return NULL;
bool cpumR3CpuIdGetLeafLegacy(PCPUMCPUIDLEAF paLeaves, uint32_t cLeaves, uint32_t uLeaf, uint32_t uSubLeaf, PCPUMCPUID pLeagcy)
if (pLeaf)
void *pvNew;
#ifndef IN_VBOX_CPU_REPORT
if (pVM)
return NULL;
if (!pvNew)
return NULL;
return *ppaLeaves;
return VERR_NO_MEMORY;
return VINF_SUCCESS;
* host-context heap and has only been allocated/reallocated by the
int cpumR3CpuIdInsert(PVM pVM, PCPUMCPUIDLEAF *ppaLeaves, uint32_t *pcLeaves, PCPUMCPUIDLEAF pNewLeaf)
if (pVM)
AssertReturn((pNewLeaf->fSubLeafMask & pNewLeaf->uSubLeaf) == pNewLeaf->uSubLeaf, VERR_INVALID_PARAMETER);
uint32_t i = 0;
while ( i < cLeaves
if ( i < cLeaves
while ( i + c < cLeaves
return VINF_SUCCESS;
while ( i < cLeaves
return VINF_SUCCESS;
if (!paLeaves)
return VERR_NO_MEMORY;
if (i < cLeaves)
return VINF_SUCCESS;
void cpumR3CpuIdRemoveRange(PCPUMCPUIDLEAF paLeaves, uint32_t *pcLeaves, uint32_t uFirst, uint32_t uLast)
iFirst++;
iEnd++;
static bool cpumR3IsEcxRelevantForCpuIdLeaf(uint32_t uLeaf, uint32_t *pcSubLeaves, bool *pfFinalEcxUnchanged)
*pfFinalEcxUnchanged = false;
uSubLeaf++;
uSubLeaf = 0;
if ( auCur[0] == 0
cRepeats++;
cRepeats = 0;
#ifndef IN_VBOX_CPU_REPORT
uSubLeaf++;
*pcLeaves = 0;
while (cLeaves-- > 0)
bool fFinalEcxUnchanged;
LogRel(("CPUM: VERR_CPUM_TOO_MANY_CPUID_SUBLEAVES! uLeaf=%#x cSubLeaves=%#x\n", uLeaf, cSubLeaves));
return rc;
return rc;
uLeaf++;
bool fKeep = false;
fKeep = true;
fKeep = true;
if (fKeep)
return rc;
return VINF_SUCCESS;
VMMR3DECL(int) CPUMR3CpuIdDetectUnknownLeafMethod(PCPUMUKNOWNCPUID penmUnknownMethod, PCPUMCPUID pDefUnknown)
while (cChecks > 0)
cChecks--;
if (cChecks == 0)
while (cValues > 0)
while (cChecks > 0)
ASMCpuIdExSlow(auChecks[cChecks - 1], uValue, uValue, uValue, &auCur[0], &auCur[1], &auCur[2], &auCur[3]);
cSame++;
cLastWithEcx++;
cLastWithEcx++;
cNeither++;
cTotal++;
cChecks--;
cValues--;
Log(("CPUM: cNeither=%d cSame=%d cLastWithEcx=%d cTotal=%d\n", cNeither, cSame, cLastWithEcx, cTotal));
return VINF_SUCCESS;
while (cChecks > 0)
while (cValues > 0)
cValues--;
if (cValues != 0)
cChecks--;
if (cChecks == 0)
return VINF_SUCCESS;
return VINF_SUCCESS;
switch (enmUnknownMethod)
case CPUMUKNOWNCPUID_INVALID:
case CPUMUKNOWNCPUID_END:
VMMR3DECL(CPUMCPUVENDOR) CPUMR3CpuIdDetectVendorEx(uint32_t uEAX, uint32_t uEBX, uint32_t uECX, uint32_t uEDX)
return CPUMCPUVENDOR_AMD;
return CPUMCPUVENDOR_INTEL;
return CPUMCPUVENDOR_VIA;
return CPUMCPUVENDOR_CYRIX;
return CPUMCPUVENDOR_UNKNOWN;
switch (enmVendor)
case CPUMCPUVENDOR_INVALID:
case CPUMCPUVENDOR_32BIT_HACK:
static PCCPUMCPUIDLEAF cpumR3CpuIdFindLeaf(PCCPUMCPUIDLEAF paLeaves, uint32_t cLeaves, uint32_t uLeaf)
while (cLeaves-- > 0)
return pLeaf;
pLeaf++;
return NULL;
pFeatures->uModel = ASMGetCpuModel(paLeaves[1].uEax, pFeatures->enmCpuVendor == CPUMCPUVENDOR_INTEL);
if (pLeaf)
if (pExtLeaf)
if ( pExtLeaf
return VINF_SUCCESS;