x86: Fix cpuid detection
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 8 Sep 2017 16:44:38 +0000 (12:44 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 8 Sep 2017 17:49:51 +0000 (13:49 -0400)
You're only supposed to use the extended family and model under certain
circumstances.  Also, extended model is a concat, not an add.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/cpuinfo.c

index c97d175..ef19f2d 100644 (file)
@@ -19,7 +19,7 @@
 void print_cpuinfo(void)
 {
        uint32_t eax, ebx, ecx, edx;
-       uint32_t model, family;
+       uint32_t model, family, ext_model, ext_family;
        uint64_t msr_val;
        char vendor_id[13];
        int max_std_lvl, max_extd_lvl;
@@ -61,8 +61,14 @@ void print_cpuinfo(void)
        cprintf("Largest Extended Function Number Supported: 0x%08x\n", eax);
        max_extd_lvl = eax;
        cpuid(1, 0x0, &eax, &ebx, &ecx, &edx);
-       family = ((eax & 0x0FF00000) >> 20) + ((eax & 0x00000F00) >> 8);
-       model = ((eax & 0x000F0000) >> 16) + ((eax & 0x000000F0) >> 4);
+       ext_family = (eax >> 20) & 0xff;
+       ext_model = (eax >> 16) & 0xf;
+       family = (eax >> 8) & 0xf;
+       model = (eax >> 4) & 0xf;
+       if ((family == 15) || (family == 6))
+               model += ext_model << 4;
+       if (family == 15)
+               family += ext_family;
        cprintf("Family: %d\n", family);
        cprintf("Model: %d\n", model);
        cprintf("Stepping: %d\n", eax & 0x0000000F);