x86, cpu: Convert FDIV bug detection
authorBorislav Petkov <bp@suse.de>
Wed, 20 Mar 2013 14:07:25 +0000 (15:07 +0100)
committerH. Peter Anvin <hpa@zytor.com>
Tue, 2 Apr 2013 17:12:53 +0000 (10:12 -0700)
... to the new facility. Add a reference to the wikipedia article
explaining the FDIV test we're doing here.

Signed-off-by: Borislav Petkov <bp@suse.de>
Link: http://lkml.kernel.org/r/1363788448-31325-4-git-send-email-bp@alien8.de
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
arch/x86/include/asm/cpufeature.h
arch/x86/include/asm/processor.h
arch/x86/kernel/cpu/bugs.c
arch/x86/kernel/cpu/proc.c
arch/x86/kernel/setup.c

index c0ad7e75815c5859edb01ef2fe300bf527bfd13b..25eb9488a9a52af9ebeb10cd124e9f4dc2018e78 100644 (file)
 #define X86_BUG(x)             (NCAPINTS*32 + (x))
 
 #define X86_BUG_F00F           X86_BUG(0) /* Intel F00F */
+#define X86_BUG_FDIV           X86_BUG(1) /* FPU FDIV */
 
 #if defined(__KERNEL__) && !defined(__ASSEMBLY__)
 
index 1e55e2d543b5c0857b7ce5bbd3fdbb995ac5a68d..ea22dfaf6c5e859d6b93d17a95f6c4c66fbbbb44 100644 (file)
@@ -91,7 +91,6 @@ struct cpuinfo_x86 {
        /* Problems on some 486Dx4's and old 386's: */
        char                    hard_math;
        char                    rfu;
-       char                    fdiv_bug;
        char                    coma_bug;
        char                    pad0;
 #else
index af6455e3fcc9b9e6f7f1d75b6ee5ce112a689590..c59635ecbbb8ffeea91567c3315949473eaeb685 100644 (file)
@@ -59,7 +59,7 @@ static void __init check_fpu(void)
         * trap_init() enabled FXSR and company _before_ testing for FP
         * problems here.
         *
-        * Test for the divl bug..
+        * Test for the divl bug: http://en.wikipedia.org/wiki/Fdiv_bug
         */
        __asm__("fninit\n\t"
                "fldl %1\n\t"
@@ -75,9 +75,10 @@ static void __init check_fpu(void)
 
        kernel_fpu_end();
 
-       boot_cpu_data.fdiv_bug = fdiv_bug;
-       if (boot_cpu_data.fdiv_bug)
+       if (fdiv_bug) {
+               set_cpu_bug(&boot_cpu_data, X86_BUG_FDIV);
                pr_warn("Hmm, FPU with FDIV bug\n");
+       }
 }
 
 /*
index 2d60b2bec01c7e97e7eb5249148b9cf95ba09e64..5dfb6c65138fec3a98ce168554488495d47bfa87 100644 (file)
@@ -34,7 +34,7 @@ static void show_cpuinfo_misc(struct seq_file *m, struct cpuinfo_x86 *c)
                   "fpu_exception\t: %s\n"
                   "cpuid level\t: %d\n"
                   "wp\t\t: %s\n",
-                  c->fdiv_bug ? "yes" : "no",
+                  static_cpu_has_bug(X86_BUG_FDIV) ? "yes" : "no",
                   static_cpu_has_bug(X86_BUG_F00F) ? "yes" : "no",
                   c->coma_bug ? "yes" : "no",
                   c->hard_math ? "yes" : "no",
index 90d8cc930f5ed134735f7697e016a83e5657dcb8..29258c75a2f3287e7bfbacc27e11d02448c00964 100644 (file)
@@ -173,12 +173,10 @@ static struct resource bss_resource = {
 /* cpu data as detected by the assembly code in head.S */
 struct cpuinfo_x86 new_cpu_data __cpuinitdata = {
        .wp_works_ok = -1,
-       .fdiv_bug = -1,
 };
 /* common cpu data for all cpus */
 struct cpuinfo_x86 boot_cpu_data __read_mostly = {
        .wp_works_ok = -1,
-       .fdiv_bug = -1,
 };
 EXPORT_SYMBOL(boot_cpu_data);