diff options
author | Borislav Petkov <bp@suse.de> | 2013-03-20 10:07:25 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2013-04-02 13:12:53 -0400 |
commit | 93a829e8e2c292f1d30155f64803101ca1cb7d3d (patch) | |
tree | 14543e11fa52235976ed9cda780e65d294bfd1af | |
parent | e2604b49e8a8827e8bc5b61bc0c5a889e028fdad (diff) |
x86, cpu: Convert FDIV bug detection
... 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>
-rw-r--r-- | arch/x86/include/asm/cpufeature.h | 1 | ||||
-rw-r--r-- | arch/x86/include/asm/processor.h | 1 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/bugs.c | 7 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/proc.c | 2 | ||||
-rw-r--r-- | arch/x86/kernel/setup.c | 2 |
5 files changed, 6 insertions, 7 deletions
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index c0ad7e75815c..25eb9488a9a5 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h | |||
@@ -223,6 +223,7 @@ | |||
223 | #define X86_BUG(x) (NCAPINTS*32 + (x)) | 223 | #define X86_BUG(x) (NCAPINTS*32 + (x)) |
224 | 224 | ||
225 | #define X86_BUG_F00F X86_BUG(0) /* Intel F00F */ | 225 | #define X86_BUG_F00F X86_BUG(0) /* Intel F00F */ |
226 | #define X86_BUG_FDIV X86_BUG(1) /* FPU FDIV */ | ||
226 | 227 | ||
227 | #if defined(__KERNEL__) && !defined(__ASSEMBLY__) | 228 | #if defined(__KERNEL__) && !defined(__ASSEMBLY__) |
228 | 229 | ||
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 1e55e2d543b5..ea22dfaf6c5e 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
@@ -91,7 +91,6 @@ struct cpuinfo_x86 { | |||
91 | /* Problems on some 486Dx4's and old 386's: */ | 91 | /* Problems on some 486Dx4's and old 386's: */ |
92 | char hard_math; | 92 | char hard_math; |
93 | char rfu; | 93 | char rfu; |
94 | char fdiv_bug; | ||
95 | char coma_bug; | 94 | char coma_bug; |
96 | char pad0; | 95 | char pad0; |
97 | #else | 96 | #else |
diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c index af6455e3fcc9..c59635ecbbb8 100644 --- a/arch/x86/kernel/cpu/bugs.c +++ b/arch/x86/kernel/cpu/bugs.c | |||
@@ -59,7 +59,7 @@ static void __init check_fpu(void) | |||
59 | * trap_init() enabled FXSR and company _before_ testing for FP | 59 | * trap_init() enabled FXSR and company _before_ testing for FP |
60 | * problems here. | 60 | * problems here. |
61 | * | 61 | * |
62 | * Test for the divl bug.. | 62 | * Test for the divl bug: http://en.wikipedia.org/wiki/Fdiv_bug |
63 | */ | 63 | */ |
64 | __asm__("fninit\n\t" | 64 | __asm__("fninit\n\t" |
65 | "fldl %1\n\t" | 65 | "fldl %1\n\t" |
@@ -75,9 +75,10 @@ static void __init check_fpu(void) | |||
75 | 75 | ||
76 | kernel_fpu_end(); | 76 | kernel_fpu_end(); |
77 | 77 | ||
78 | boot_cpu_data.fdiv_bug = fdiv_bug; | 78 | if (fdiv_bug) { |
79 | if (boot_cpu_data.fdiv_bug) | 79 | set_cpu_bug(&boot_cpu_data, X86_BUG_FDIV); |
80 | pr_warn("Hmm, FPU with FDIV bug\n"); | 80 | pr_warn("Hmm, FPU with FDIV bug\n"); |
81 | } | ||
81 | } | 82 | } |
82 | 83 | ||
83 | /* | 84 | /* |
diff --git a/arch/x86/kernel/cpu/proc.c b/arch/x86/kernel/cpu/proc.c index 2d60b2bec01c..5dfb6c65138f 100644 --- a/arch/x86/kernel/cpu/proc.c +++ b/arch/x86/kernel/cpu/proc.c | |||
@@ -34,7 +34,7 @@ static void show_cpuinfo_misc(struct seq_file *m, struct cpuinfo_x86 *c) | |||
34 | "fpu_exception\t: %s\n" | 34 | "fpu_exception\t: %s\n" |
35 | "cpuid level\t: %d\n" | 35 | "cpuid level\t: %d\n" |
36 | "wp\t\t: %s\n", | 36 | "wp\t\t: %s\n", |
37 | c->fdiv_bug ? "yes" : "no", | 37 | static_cpu_has_bug(X86_BUG_FDIV) ? "yes" : "no", |
38 | static_cpu_has_bug(X86_BUG_F00F) ? "yes" : "no", | 38 | static_cpu_has_bug(X86_BUG_F00F) ? "yes" : "no", |
39 | c->coma_bug ? "yes" : "no", | 39 | c->coma_bug ? "yes" : "no", |
40 | c->hard_math ? "yes" : "no", | 40 | c->hard_math ? "yes" : "no", |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 90d8cc930f5e..29258c75a2f3 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -173,12 +173,10 @@ static struct resource bss_resource = { | |||
173 | /* cpu data as detected by the assembly code in head.S */ | 173 | /* cpu data as detected by the assembly code in head.S */ |
174 | struct cpuinfo_x86 new_cpu_data __cpuinitdata = { | 174 | struct cpuinfo_x86 new_cpu_data __cpuinitdata = { |
175 | .wp_works_ok = -1, | 175 | .wp_works_ok = -1, |
176 | .fdiv_bug = -1, | ||
177 | }; | 176 | }; |
178 | /* common cpu data for all cpus */ | 177 | /* common cpu data for all cpus */ |
179 | struct cpuinfo_x86 boot_cpu_data __read_mostly = { | 178 | struct cpuinfo_x86 boot_cpu_data __read_mostly = { |
180 | .wp_works_ok = -1, | 179 | .wp_works_ok = -1, |
181 | .fdiv_bug = -1, | ||
182 | }; | 180 | }; |
183 | EXPORT_SYMBOL(boot_cpu_data); | 181 | EXPORT_SYMBOL(boot_cpu_data); |
184 | 182 | ||