diff options
author | Anton Kochkov <anton.kochkov@gmail.com> | 2012-07-04 07:31:37 +0400 |
---|---|---|
committer | Stefan Reinauer <stefan.reinauer@coreboot.org> | 2012-07-10 00:56:49 +0200 |
commit | ffbbecc9eed9705d7fdb9f6825ab7ccd9224fb09 (patch) | |
tree | 122ff5685804395ad52288e2601529d752f94916 /util/msrtool/sys.c | |
parent | e1e6a91ce0738400fa1615179de88ebc0df29f66 (diff) |
msrtool: Fix Intel CPUs detection
Added vendor check in sys.c file and fixed models checking
in intel targets files.
Change-Id: I1ce52bbce431dea79e903d6bc7a12e5b9ad061be
Signed-off-by: Anton Kochkov <anton.kochkov@gmail.com>
Reviewed-on: http://review.coreboot.org/1169
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'util/msrtool/sys.c')
-rw-r--r-- | util/msrtool/sys.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/util/msrtool/sys.c b/util/msrtool/sys.c index f6aded52bc..7300abf476 100644 --- a/util/msrtool/sys.c +++ b/util/msrtool/sys.c @@ -26,7 +26,23 @@ static struct cpuid_t id; struct cpuid_t *cpuid(void) { uint32_t outeax; + uint32_t outebx; +/* First, we need determine which vendor we have */ +#if defined(__DARWIN__) && !defined(__LP64__) + asm volatile ( + "pushl %%ebx \n" + "cpuid \n" + "popl %%ebx \n" + : "=b" (outebx) : "a" (0) : "%ecx", "%edx" + ); +#else + asm ("cpuid" : "=b" (outebx) : "a" (0) : "%ecx", "%edx"); +#endif + + id.vendor = (outebx == 0x756e6547) ? VENDOR_INTEL : VENDOR_AMD; + +/* Then, identificate CPU itself */ #if defined(__DARWIN__) && !defined(__LP64__) asm volatile ( "pushl %%ebx \n" @@ -47,7 +63,8 @@ struct cpuid_t *cpuid(void) { id.ext_model = outeax & 0xf; outeax >>= 4; id.ext_family = outeax & 0xff; - if (0xf == id.family) { + if ((0xf == id.family) || ((VENDOR_INTEL == id.vendor) + && (0x6 == id.family))) { /* Intel says always do this, AMD says only for family f */ id.model |= (id.ext_model << 4); id.family += id.ext_family; |