--- a/usr/src/uts/i86pc/os/cpuid.c Wed May 17 16:43:08 2006 -0700
+++ b/usr/src/uts/i86pc/os/cpuid.c Wed May 17 19:19:18 2006 -0700
@@ -311,8 +311,22 @@
if (cpi->cpi_family == 0xf)
cpi->cpi_family += CPI_FAMILY_XTD(cpi);
- if (cpi->cpi_model == 0xf)
- cpi->cpi_model += CPI_MODEL_XTD(cpi) << 4;
+ /*
+ * Beware: AMD uses "extended model" iff *FAMILY* == 0xf.
+ * Intel, and presumably everyone else, uses model == 0xf, as
+ * one would expect (max value means possible overflow). Sigh.
+ */
+
+ switch (cpi->cpi_vendor) {
+ case X86_VENDOR_AMD:
+ if (cpi->cpi_family == 0xf)
+ cpi->cpi_model += CPI_MODEL_XTD(cpi) << 4;
+ break;
+ default:
+ if (cpi->cpi_model == 0xf)
+ cpi->cpi_model += CPI_MODEL_XTD(cpi) << 4;
+ break;
+ }
cpi->cpi_step = CPI_STEP(cpi);
cpi->cpi_brandid = CPI_BRANDID(cpi);
@@ -2591,6 +2605,8 @@
switch (cpi->cpi_vendor) {
case X86_VENDOR_Intel:
+ create = CPI_MODEL(cpi) == 0xf;
+ break;
case X86_VENDOR_AMD:
create = CPI_FAMILY(cpi) == 0xf;
break;