From 0e528772db367034b41b693336ffee8bc765a62f Mon Sep 17 00:00:00 2001 From: Ahmed Samy Date: Thu, 7 Nov 2013 19:06:16 +0200 Subject: [PATCH] cpuid: better parser for processor info Signed-off-by: Ahmed Samy --- ccan/cpuid/cpuid.c | 14 ++++++++++---- ccan/cpuid/cpuid.h | 16 +++++++--------- ccan/cpuid/test/run.c | 5 +++++ 3 files changed, 22 insertions(+), 13 deletions(-) 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]; -- 2.39.2