Loading...
Note: File does not exist in v3.5.6.
1/*
2 * x86 FPU bug checks:
3 */
4#include <asm/fpu/internal.h>
5
6/*
7 * Boot time CPU/FPU FDIV bug detection code:
8 */
9
10static double __initdata x = 4195835.0;
11static double __initdata y = 3145727.0;
12
13/*
14 * This used to check for exceptions..
15 * However, it turns out that to support that,
16 * the XMM trap handlers basically had to
17 * be buggy. So let's have a correct XMM trap
18 * handler, and forget about printing out
19 * some status at boot.
20 *
21 * We should really only care about bugs here
22 * anyway. Not features.
23 */
24void __init fpu__init_check_bugs(void)
25{
26 s32 fdiv_bug;
27
28 /* kernel_fpu_begin/end() relies on patched alternative instructions. */
29 if (!boot_cpu_has(X86_FEATURE_FPU))
30 return;
31
32 kernel_fpu_begin();
33
34 /*
35 * trap_init() enabled FXSR and company _before_ testing for FP
36 * problems here.
37 *
38 * Test for the divl bug: http://en.wikipedia.org/wiki/Fdiv_bug
39 */
40 __asm__("fninit\n\t"
41 "fldl %1\n\t"
42 "fdivl %2\n\t"
43 "fmull %2\n\t"
44 "fldl %1\n\t"
45 "fsubp %%st,%%st(1)\n\t"
46 "fistpl %0\n\t"
47 "fwait\n\t"
48 "fninit"
49 : "=m" (*&fdiv_bug)
50 : "m" (*&x), "m" (*&y));
51
52 kernel_fpu_end();
53
54 if (fdiv_bug) {
55 set_cpu_bug(&boot_cpu_data, X86_BUG_FDIV);
56 pr_warn("Hmm, FPU with FDIV bug\n");
57 }
58}