Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/cpuctl/arch The Intel and AMD docs (more or less) a...



details:   https://anonhg.NetBSD.org/src/rev/1b4c4e9c8ae7
branches:  trunk
changeset: 783723:1b4c4e9c8ae7
user:      dsl <dsl%NetBSD.org@localhost>
date:      Sat Jan 05 21:16:22 2013 +0000

description:
The Intel and AMD docs (more or less) agree on how the cpuid 'extended
  family' and 'extended model' bits are used to create larger values
  than the original 16bit value allowed for.
Calculate and save these values 'up-front' and use them throughout.
Untangle the (backwards) nested switch statement for amd 'model 15' cpus.
Works as badly as ever on my i7.

diffstat:

 usr.sbin/cpuctl/arch/i386.c |  288 ++++++++++++++++---------------------------
 1 files changed, 108 insertions(+), 180 deletions(-)

diffs (truncated from 504 to 300 lines):

diff -r a1f9241a642e -r 1b4c4e9c8ae7 usr.sbin/cpuctl/arch/i386.c
--- a/usr.sbin/cpuctl/arch/i386.c       Sat Jan 05 20:31:23 2013 +0000
+++ b/usr.sbin/cpuctl/arch/i386.c       Sat Jan 05 21:16:22 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: i386.c,v 1.35 2013/01/05 16:38:12 dsl Exp $    */
+/*     $NetBSD: i386.c,v 1.36 2013/01/05 21:16:22 dsl Exp $    */
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: i386.c,v 1.35 2013/01/05 16:38:12 dsl Exp $");
+__RCSID("$NetBSD: i386.c,v 1.36 2013/01/05 21:16:22 dsl Exp $");
 #endif /* not lint */
 
 #include <sys/types.h>
@@ -95,6 +95,8 @@
        int32_t         ci_cpu_type;     /* for cpu's without cpuid */
        int32_t         ci_cpuid_level;  /* highest cpuid supported */
        uint32_t        ci_signature;    /* X86 cpuid type */
+       uint32_t        ci_family;       /* from ci_signature */
+       uint32_t        ci_model;        /* from ci_signature */
        uint32_t        ci_feat_val[5];  /* X86 CPUID feature bits
                                          *     [0] basic features %edx
                                          *     [1] basic features %ecx
@@ -660,7 +662,7 @@
 void
 winchip_cpu_setup(struct cpu_info *ci)
 {
-       switch (CPUID2MODEL(ci->ci_signature)) { /* model */
+       switch (ci->ci_model) {
        case 4: /* WinChip C6 */
                disable_tsc(ci);
        }
@@ -725,7 +727,6 @@
 static void
 via_cpu_probe(struct cpu_info *ci)
 {
-       u_int model = CPUID2MODEL(ci->ci_signature);
        u_int stepping = CPUID2STEPPING(ci->ci_signature);
        u_int descs[4];
        u_int lfunc;
@@ -744,7 +745,7 @@
                ci->ci_feat_val[2] |= descs[3];
        }
 
-       if (model < 0x9 || (model == 0x9 && stepping < 3))
+       if (ci->ci_model < 0x9 || (ci->ci_model == 0x9 && stepping < 3))
                return;
 
        /* Nehemiah or Esther */
@@ -761,11 +762,10 @@
 static const char *
 intel_family6_name(struct cpu_info *ci)
 {
-       int model = CPUID2MODEL(ci->ci_signature);
        const char *ret = NULL;
        u_int l2cache = ci->ci_cinfo[CAI_L2CACHE].cai_totalsize;
 
-       if (model == 5) {
+       if (ci->ci_model == 5) {
                switch (l2cache) {
                case 0:
                case 128 * 1024:
@@ -782,14 +782,14 @@
                        ret = "Pentium II Xeon";
                        break;
                }
-       } else if (model == 6) {
+       } else if (ci->ci_model == 6) {
                switch (l2cache) {
                case 256 * 1024:
                case 512 * 1024:
                        ret = "Mobile Pentium II";
                        break;
                }
-       } else if (model == 7) {
+       } else if (ci->ci_model == 7) {
                switch (l2cache) {
                case 512 * 1024:
                        ret = "Pentium III";
@@ -799,7 +799,7 @@
                        ret = "Pentium III Xeon";
                        break;
                }
-       } else if (model >= 8) {
+       } else if (ci->ci_model >= 8) {
                if (ci->ci_brand_id && ci->ci_brand_id < 0x10) {
                        switch (ci->ci_brand_id) {
                        case 0x3:
@@ -836,150 +836,87 @@
  * "Revision Guide for AMD NPT Family 0Fh Processors"
  * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/33610.pdf
  * and other miscellaneous reports.
+ *
+ * This is all rather pointless, these are cross 'brand' since the raw
+ * silicon is shared.
  */
 static const char *
 amd_amd64_name(struct cpu_info *ci)
 {
-       int extfamily, extmodel, model;
-       const char *ret = NULL;
+       static char family_str[32];
 
-       model = CPUID2MODEL(ci->ci_signature);
-       extfamily = CPUID2EXTFAMILY(ci->ci_signature);
-       extmodel  = CPUID2EXTMODEL(ci->ci_signature);
+       /* Only called if family >= 15 */
 
-       switch (extfamily) {
-       case 0x00:
-               switch (model) {
-               case 0x1:
-                       switch (extmodel) {
-                       case 0x2:       /* rev JH-E1/E6 */
-                       case 0x4:       /* rev JH-F2 */
-                               ret = "Dual-Core Opteron";
-                               break;
-                       }
-                       break;
-               case 0x3:
-                       switch (extmodel) {
-                       case 0x2:       /* rev JH-E6 (Toledo) */
-                               ret = "Dual-Core Opteron or Athlon 64 X2";
-                               break;
-                       case 0x4:       /* rev JH-F2 (Windsor) */
-                               ret = "Athlon 64 FX or Athlon 64 X2";
-                               break;
-                       }
-                       break;
-               case 0x4:
-                       switch (extmodel) {
-                       case 0x0:       /* rev SH-B0/C0/CG (ClawHammer) */
-                       case 0x1:       /* rev SH-D0 */
-                               ret = "Athlon 64";
-                               break;
-                       case 0x2:       /* rev SH-E5 (Lancaster?) */
-                               ret = "Mobile Athlon 64 or Turion 64";
-                               break;
-                       }
-                       break;
-               case 0x5:
-                       switch (extmodel) {
-                       case 0x0:       /* rev SH-B0/B3/C0/CG (SledgeHammer?) */
-                               ret = "Opteron or Athlon 64 FX";
-                               break;
-                       case 0x1:       /* rev SH-D0 */
-                       case 0x2:       /* rev SH-E4 */
-                               ret = "Opteron";
-                               break;
-                       }
-                       break;
-               case 0x7:
-                       switch (extmodel) {
-                       case 0x0:       /* rev SH-CG (ClawHammer) */
-                       case 0x1:       /* rev SH-D0 */
-                               ret = "Athlon 64";
-                               break;
-                       case 0x2:       /* rev DH-E4, SH-E4 */
-                               ret = "Athlon 64 or Athlon 64 FX or Opteron";
-                               break;
-                       }
+       switch (ci->ci_family) {
+       case 15:
+               switch (ci->ci_model) {
+               case 0x21:      /* rev JH-E1/E6 */
+               case 0x41:      /* rev JH-F2 */
+                       return "Dual-Core Opteron";
+               case 0x23:      /* rev JH-E6 (Toledo) */
+                       return "Dual-Core Opteron or Athlon 64 X2";
+               case 0x43:      /* rev JH-F2 (Windsor) */
+                       return "Athlon 64 FX or Athlon 64 X2";
+               case 0x24:      /* rev SH-E5 (Lancaster?) */
+                       return "Mobile Athlon 64 or Turion 64";
+               case 0x05:      /* rev SH-B0/B3/C0/CG (SledgeHammer?) */
+                       return "Opteron or Athlon 64 FX";
+               case 0x15:      /* rev SH-D0 */
+               case 0x25:      /* rev SH-E4 */
+                       return "Opteron";
+               case 0x27:      /* rev DH-E4, SH-E4 */
+                       return "Athlon 64 or Athlon 64 FX or Opteron";
+               case 0x48:      /* rev BH-F2 */
+                       return "Turion 64 X2";
+               case 0x04:      /* rev SH-B0/C0/CG (ClawHammer) */
+               case 0x07:      /* rev SH-CG (ClawHammer) */
+               case 0x0b:      /* rev CH-CG */
+               case 0x14:      /* rev SH-D0 */
+               case 0x17:      /* rev SH-D0 */
+               case 0x1b:      /* rev CH-D0 */
+                       return "Athlon 64";
+               case 0x2b:      /* rev BH-E4 (Manchester) */
+               case 0x4b:      /* rev BH-F2 (Windsor) */
+                       return "Athlon 64 X2";
+               case 0x6b:      /* rev BH-G1 (Brisbane) */
+                       return "Athlon X2 or Athlon 64 X2";
+               case 0x08:      /* rev CH-CG */
+               case 0x0c:      /* rev DH-CG (Newcastle) */
+               case 0x0e:      /* rev DH-CG (Newcastle?) */
+               case 0x0f:      /* rev DH-CG (Newcastle/Paris) */
+               case 0x18:      /* rev CH-D0 */
+               case 0x1c:      /* rev DH-D0 (Winchester) */
+               case 0x1f:      /* rev DH-D0 (Winchester/Victoria) */
+               case 0x2c:      /* rev DH-E3/E6 */
+               case 0x2f:      /* rev DH-E3/E6 (Venice/Palermo) */
+               case 0x4f:      /* rev DH-F2 (Orleans/Manila) */
+               case 0x5f:      /* rev DH-F2 (Orleans/Manila) */
+               case 0x6f:      /* rev DH-G1 */
+                       return "Athlon 64 or Sempron";
+               default:
                        break;
-               case 0x8:
-                       switch (extmodel) {
-                       case 0x0:       /* rev CH-CG */
-                       case 0x1:       /* rev CH-D0 */
-                               ret = "Athlon 64 or Sempron";
-                               break;
-                       case 0x4:       /* rev BH-F2 */
-                               ret = "Turion 64 X2";
-                               break;
-                       }
-                       break;
-               case 0xb:
-                       switch (extmodel) {
-                       case 0x0:       /* rev CH-CG */
-                       case 0x1:       /* rev CH-D0 */
-                               ret = "Athlon 64";
-                               break;
-                       case 0x2:       /* rev BH-E4 (Manchester) */
-                       case 0x4:       /* rev BH-F2 (Windsor) */
-                               ret = "Athlon 64 X2";
-                               break;
-                       case 0x6:       /* rev BH-G1 (Brisbane) */
-                               ret = "Athlon X2 or Athlon 64 X2";
-                               break;
-                       }
-                       break;
-               case 0xc:
-                       switch (extmodel) {
-                       case 0x0:       /* rev DH-CG (Newcastle) */
-                       case 0x1:       /* rev DH-D0 (Winchester) */
-                       case 0x2:       /* rev DH-E3/E6 */
-                               ret = "Athlon 64 or Sempron";
-                               break;
-                       }
-                       break;
-               case 0xe:
-                       switch (extmodel) {
-                       case 0x0:       /* rev DH-CG (Newcastle?) */
-                               ret = "Athlon 64 or Sempron";
-                               break;
-                       }
-                       break;
-               case 0xf:
-                       switch (extmodel) {
-                       case 0x0:       /* rev DH-CG (Newcastle/Paris) */
-                       case 0x1:       /* rev DH-D0 (Winchester/Victoria) */
-                       case 0x2:       /* rev DH-E3/E6 (Venice/Palermo) */
-                       case 0x4:       /* rev DH-F2 (Orleans/Manila) */
-                       case 0x5:       /* rev DH-F2 (Orleans/Manila) */
-                       case 0x6:       /* rev DH-G1 */
-                               ret = "Athlon 64 or Sempron";
-                               break;
-                       }
-                       break;
-               default:
-                       ret = "Unknown AMD64 CPU";
                }
-               break;
-       case 0x01:
-               ret = "Family 10h";
-               break;
-       case 0x02:
-               ret = "Family 11h";
-               break;
-       case 0x03:
-               ret = "Family 12h";
-               break;
-       case 0x05:
-               ret = "Family 14h";
-               break;
-       case 0x06:
-               ret = "Family 15h";
-               break;
+               return "Unknown AMD64 CPU";
+
+#if 0
+       case 16:
+               return "Family 10h";
+       case 17:
+               return "Family 11h";
+       case 18:
+               return "Family 12h";
+       case 19:
+               return "Family 14h";
+       case 20:
+               return "Family 15h";
+#endif



Home | Main Index | Thread Index | Old Index