[PATCH] i386: Replace broken serialize_cpu in microcode driver with correct sync_core
authorAndi Kleen <ak@suse.de>
Wed, 11 Jan 2006 21:45:27 +0000 (22:45 +0100)
committerLinus Torvalds <torvalds@g5.osdl.org>
Thu, 12 Jan 2006 03:04:58 +0000 (19:04 -0800)
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>
arch/i386/kernel/microcode.c
include/asm-i386/processor.h

index fad3037ebaefbdfe05b173007baff4a9d78bf8f2..d3fdf0057d82bec9adaccb5555dcdb5af6bf0135 100644 (file)
@@ -166,7 +166,7 @@ static void collect_cpu_info (void *unused)
 
        wrmsr(MSR_IA32_UCODE_REV, 0, 0);
        /* see notes above for revision 1.07.  Apparent chip bug */
-       serialize_cpu();
+       sync_core();
        /* get the current revision from MSR 0x8B */
        rdmsr(MSR_IA32_UCODE_REV, val[0], uci->rev);
        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)
        wrmsr(MSR_IA32_UCODE_REV, 0, 0);
 
        /* see notes above for revision 1.07.  Apparent chip bug */
-       serialize_cpu();
+       sync_core();
 
        /* get the current revision from MSR 0x8B */
        rdmsr(MSR_IA32_UCODE_REV, val[0], val[1]);
index 53461f42b663973ea4dd7a5d3b8f1b30f1f4f7b9..13ecf66b098cd6fe165546fe8581422485ca1d45 100644 (file)
@@ -281,9 +281,11 @@ static inline void clear_in_cr4 (unsigned long mask)
        outb((data), 0x23); \
 } while (0)
 
-static inline void serialize_cpu(void)
+/* Stop speculative execution */
+static inline void sync_core(void)
 {
-        __asm__ __volatile__ ("cpuid" : : : "ax", "bx", "cx", "dx");
+       int tmp;
+       asm volatile("cpuid" : "=a" (tmp) : "0" (1) : "ebx","ecx","edx","memory");
 }
 
 static inline void __monitor(const void *eax, unsigned long ecx,