diff options
author | Andi Kleen <ak@suse.de> | 2006-01-11 16:45:27 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-11 22:04:58 -0500 |
commit | 487472bc01fab0625996aad37836aad931e4eda9 (patch) | |
tree | ede143ee4c756413b396911b3702068283b052f2 | |
parent | c818a18146997d1356a4840b0c01f1168c16c8a4 (diff) |
[PATCH] i386: Replace broken serialize_cpu in microcode driver with correct sync_core
Passing random input values in eax to cpuid is not a good idea
because the CPU will GPF for unknown ones.
Use the correct x86-64 version that exists for a longer time too.
This also adds a memory barrier to prevent the optimizer from
reordering.
Cc: tigran@veritas.com
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | arch/i386/kernel/microcode.c | 4 | ||||
-rw-r--r-- | include/asm-i386/processor.h | 6 |
2 files changed, 6 insertions, 4 deletions
diff --git a/arch/i386/kernel/microcode.c b/arch/i386/kernel/microcode.c index fad3037ebaef..d3fdf0057d82 100644 --- a/arch/i386/kernel/microcode.c +++ b/arch/i386/kernel/microcode.c | |||
@@ -166,7 +166,7 @@ static void collect_cpu_info (void *unused) | |||
166 | 166 | ||
167 | wrmsr(MSR_IA32_UCODE_REV, 0, 0); | 167 | wrmsr(MSR_IA32_UCODE_REV, 0, 0); |
168 | /* see notes above for revision 1.07. Apparent chip bug */ | 168 | /* see notes above for revision 1.07. Apparent chip bug */ |
169 | serialize_cpu(); | 169 | sync_core(); |
170 | /* get the current revision from MSR 0x8B */ | 170 | /* get the current revision from MSR 0x8B */ |
171 | rdmsr(MSR_IA32_UCODE_REV, val[0], uci->rev); | 171 | rdmsr(MSR_IA32_UCODE_REV, val[0], uci->rev); |
172 | pr_debug("microcode: collect_cpu_info : sig=0x%x, pf=0x%x, rev=0x%x\n", | 172 | pr_debug("microcode: collect_cpu_info : sig=0x%x, pf=0x%x, rev=0x%x\n", |
@@ -380,7 +380,7 @@ static void do_update_one (void * unused) | |||
380 | wrmsr(MSR_IA32_UCODE_REV, 0, 0); | 380 | wrmsr(MSR_IA32_UCODE_REV, 0, 0); |
381 | 381 | ||
382 | /* see notes above for revision 1.07. Apparent chip bug */ | 382 | /* see notes above for revision 1.07. Apparent chip bug */ |
383 | serialize_cpu(); | 383 | sync_core(); |
384 | 384 | ||
385 | /* get the current revision from MSR 0x8B */ | 385 | /* get the current revision from MSR 0x8B */ |
386 | rdmsr(MSR_IA32_UCODE_REV, val[0], val[1]); | 386 | rdmsr(MSR_IA32_UCODE_REV, val[0], val[1]); |
diff --git a/include/asm-i386/processor.h b/include/asm-i386/processor.h index 53461f42b663..13ecf66b098c 100644 --- a/include/asm-i386/processor.h +++ b/include/asm-i386/processor.h | |||
@@ -281,9 +281,11 @@ static inline void clear_in_cr4 (unsigned long mask) | |||
281 | outb((data), 0x23); \ | 281 | outb((data), 0x23); \ |
282 | } while (0) | 282 | } while (0) |
283 | 283 | ||
284 | static inline void serialize_cpu(void) | 284 | /* Stop speculative execution */ |
285 | static inline void sync_core(void) | ||
285 | { | 286 | { |
286 | __asm__ __volatile__ ("cpuid" : : : "ax", "bx", "cx", "dx"); | 287 | int tmp; |
288 | asm volatile("cpuid" : "=a" (tmp) : "0" (1) : "ebx","ecx","edx","memory"); | ||
287 | } | 289 | } |
288 | 290 | ||
289 | static inline void __monitor(const void *eax, unsigned long ecx, | 291 | static inline void __monitor(const void *eax, unsigned long ecx, |