diff usr/src/uts/i86pc/os/cpuid.c @ 4265:6be078c4d3b4

6555108 workarounds being applied for errata not present in greyhound processors 6555368 cpi_model does not include the extended model for greyhound processors
author kchow
date Thu, 17 May 2007 08:35:02 -0700
parents f34a44686f8b
children 2bb321aaf3c3
line wrap: on
line diff
--- a/usr/src/uts/i86pc/os/cpuid.c	Thu May 17 04:11:28 2007 -0700
+++ b/usr/src/uts/i86pc/os/cpuid.c	Thu May 17 08:35:02 2007 -0700
@@ -461,14 +461,14 @@
 		cpi->cpi_family += CPI_FAMILY_XTD(cpi);
 
 	/*
-	 * Beware: AMD uses "extended model" iff *FAMILY* == 0xf.
+	 * Beware: AMD uses "extended model" iff base *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)
+		if (CPI_FAMILY(cpi) == 0xf)
 			cpi->cpi_model += CPI_MODEL_XTD(cpi) << 4;
 		break;
 	default:
@@ -2112,8 +2112,8 @@
 	 * a legacy (32-bit) AMD CPU.
 	 */
 	if (cpi->cpi_vendor != X86_VENDOR_AMD ||
-	    CPI_FAMILY(cpi) == 4 || CPI_FAMILY(cpi) == 5 ||
-	    CPI_FAMILY(cpi) == 6)
+	    cpi->cpi_family == 4 || cpi->cpi_family == 5 ||
+	    cpi->cpi_family == 6)
 
 		return (0);
 
@@ -2149,17 +2149,17 @@
 
 	switch (erratum) {
 	case 1:
-		return (1);
+		return (cpi->cpi_family < 0x10);
 	case 51:	/* what does the asterisk mean? */
 		return (B(eax) || SH_C0(eax) || CG(eax));
 	case 52:
 		return (B(eax));
 	case 57:
-		return (1);
+		return (cpi->cpi_family <= 0x10);
 	case 58:
 		return (B(eax));
 	case 60:
-		return (1);
+		return (cpi->cpi_family <= 0x10);
 	case 61:
 	case 62:
 	case 63:
@@ -2176,11 +2176,11 @@
 	case 74:
 		return (B(eax));
 	case 75:
-		return (1);
+		return (cpi->cpi_family < 0x10);
 	case 76:
 		return (B(eax));
 	case 77:
-		return (1);
+		return (cpi->cpi_family <= 0x10);
 	case 78:
 		return (B(eax) || SH_C0(eax));
 	case 79:
@@ -2192,7 +2192,7 @@
 	case 83:
 		return (B(eax) || SH_C0(eax) || CG(eax));
 	case 85:
-		return (1);
+		return (cpi->cpi_family < 0x10);
 	case 86:
 		return (SH_C0(eax) || CG(eax));
 	case 88:
@@ -2202,7 +2202,7 @@
 		return (B(eax) || SH_C0(eax));
 #endif
 	case 89:
-		return (1);
+		return (cpi->cpi_family < 0x10);
 	case 90:
 		return (B(eax) || SH_C0(eax) || CG(eax));
 	case 91:
@@ -2262,15 +2262,15 @@
 	case 121:
 		return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax) || EX(eax));
 	case 122:
-		return (1);
+		return (cpi->cpi_family < 0x10);
 	case 123:
 		return (JH_E1(eax) || BH_E4(eax) || JH_E6(eax));
 	case 131:
-		return (1);
+		return (cpi->cpi_family < 0x10);
 	case 6336786:
 		/*
 		 * Test for AdvPowerMgmtInfo.TscPStateInvariant
-		 * if this is a K8 family processor
+		 * if this is a K8 family or newer processor
 		 */
 		if (CPI_FAMILY(cpi) == 0xf) {
 			struct cpuid_regs regs;