6427092 extended-model CPUID information is different between AMD and Intel
authordmick
Wed, 17 May 2006 19:19:18 -0700
changeset 2001 427a702b03e2
parent 2000 e8ec391b4304
child 2002 2b583c154156
6427092 extended-model CPUID information is different between AMD and Intel
usr/src/uts/i86pc/os/cpuid.c
--- 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;