cpuid: better parser for processor info
authorAhmed Samy <f.fallen45@gmail.com>
Thu, 7 Nov 2013 17:06:16 +0000 (19:06 +0200)
committerAhmed Samy <f.fallen45@gmail.com>
Thu, 7 Nov 2013 17:07:14 +0000 (19:07 +0200)
Signed-off-by: Ahmed Samy <f.fallen45@gmail.com>
ccan/cpuid/cpuid.c
ccan/cpuid/cpuid.h
ccan/cpuid/test/run.c

index 57883e2bd0982b17fccdeaf34fd5da945c1134ea..bc44fcf2f9d7c264071cbc3cf67cf2e31022670c 100644 (file)
@@ -29,6 +29,7 @@
 #include "cpuid.h"
 
 #include <string.h>
+#include <stdio.h>
 
 enum {
        CPU_PROC_BRAND_STRING_INTERNAL0                 = 0x80000003,
@@ -309,10 +310,15 @@ void cpuid(cpuid_t info, uint32_t *buf)
                        buf[2] = ecx;
                        break;
                case CPU_PROCINFO_AND_FEATUREBITS:
-                       buf[0] = eax;   /* The so called "signature" of the CPU.  */
-                       buf[1] = edx;   /* Feature flags #1.  */
-                       buf[2] = ecx;   /* Feature flags #2.  */
-                       buf[3] = ebx;   /* Additional feature information.  */
+                       buf[0] = (eax & 0x0F);          /* Stepping  */
+                       buf[1] = (eax >> 4)  & 0x0F;    /* Model  */
+                       buf[2] = (eax >> 8)  & 0x0F;    /* Family  */
+                       buf[3] = (eax >> 16) & 0x0F;    /* Extended Model.  */
+                       buf[4] = (eax >> 24) & 0x0F;    /* Extended Family.  */
+
+                       buf[5] = edx;                   /* Feature flags #1.  */
+                       buf[6] = ecx;                   /* Feature flags #2.  */
+                       buf[7] = ebx;                   /* Additional feature information.  */
                        break;
                case CPU_CACHE_AND_TLBD_INFO:
                        buf[0] = eax;
index 7bf903a6db397af69c454cd20eab3a061d1b084a..bf6c5113fb589a1de54071be8a7fa5b21a2e5c1e 100644 (file)
@@ -173,16 +173,14 @@ uint32_t cpuid_highest_ext_func_supported(void);
  *     Returns a string into buf.
  *
  * For CPU_PROCINFO_AND_FEATUREBITS:
- *     buf[0]:
- *             - 3:0 - Stepping
- *             - 7:4 - Model
- *             - 11:8 - Family
- *             - 13:12 - Processor Type
- *             - 19:16 - Extended Model
- *             - 27:20 - Extended family
- *     buf[1] and buf[2]:
+ *     buf[0]: Stepping
+ *     buf[1]: Model
+ *     buf[2]: Family
+ *     buf[3]: Extended Model
+ *     buf[4]: Extended Family
+ *     buf[5] and buf[6]:
  *             Feature flags
- *     buf[3]:
+ *     buf[7]:
  *             Additional feature information.
  *
  * For CPU_L1_CACHE_AND_TLB_IDS:
index 843389fa2a7733178b4399bfb6d6fe3e2c07dd5d..83b90f37ebd346c6c08a3bf9f33efa7fef3771d7 100644 (file)
@@ -18,6 +18,11 @@ int main(void)
        cpuid(CPU_PROC_BRAND_STRING, (uint32_t *)buf);
        printf ("Processor Brand: %s\n", buf);
 
+       uint32_t procinfo[8];
+       cpuid(CPU_PROCINFO_AND_FEATUREBITS, procinfo);
+       printf("Stepping: %d Model: 0x%X Family: %d extended model: %d extended family: %d\n",
+               procinfo[0], procinfo[1], procinfo[2], procinfo[3], procinfo[4]);
+
        printf ("Highest extended function supported: %#010x\n", cpuid_highest_ext_func_supported());
 
        uint32_t phys_virt[2];