Linux Audio

Check our new training course

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}