From: Ahmed Samy Date: Thu, 7 Nov 2013 17:06:16 +0000 (+0200) Subject: cpuid: better parser for processor info X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=0e528772db367034b41b693336ffee8bc765a62f cpuid: better parser for processor info Signed-off-by: Ahmed Samy --- diff --git a/ccan/cpuid/cpuid.c b/ccan/cpuid/cpuid.c index 57883e2b..bc44fcf2 100644 --- a/ccan/cpuid/cpuid.c +++ b/ccan/cpuid/cpuid.c @@ -29,6 +29,7 @@ #include "cpuid.h" #include +#include 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; diff --git a/ccan/cpuid/cpuid.h b/ccan/cpuid/cpuid.h index 7bf903a6..bf6c5113 100644 --- a/ccan/cpuid/cpuid.h +++ b/ccan/cpuid/cpuid.h @@ -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: diff --git a/ccan/cpuid/test/run.c b/ccan/cpuid/test/run.c index 843389fa..83b90f37 100644 --- a/ccan/cpuid/test/run.c +++ b/ccan/cpuid/test/run.c @@ -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];