lkml.org 
[lkml]   [2015]   [May]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 121/208] x86/fpu: Factor out FPU bug checks into fpu/bugs.c
    Date
    Create separate fpu/bugs.c code so that if we read generic FPU code
    we don't have to wade through all the bugcheck related code first.

    Reviewed-by: Borislav Petkov <bp@alien8.de>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Fenghua Yu <fenghua.yu@intel.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    arch/x86/kernel/fpu/Makefile | 2 +-
    arch/x86/kernel/fpu/bugs.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    arch/x86/kernel/fpu/init.c | 60 ------------------------------------------------------------
    3 files changed, 65 insertions(+), 61 deletions(-)

    diff --git a/arch/x86/kernel/fpu/Makefile b/arch/x86/kernel/fpu/Makefile
    index 50464a716b87..2020a2b7a597 100644
    --- a/arch/x86/kernel/fpu/Makefile
    +++ b/arch/x86/kernel/fpu/Makefile
    @@ -2,4 +2,4 @@
    # Build rules for the FPU support code:
    #

    -obj-y += init.o core.o xsave.o
    +obj-y += init.o bugs.o core.o xsave.o
    diff --git a/arch/x86/kernel/fpu/bugs.c b/arch/x86/kernel/fpu/bugs.c
    new file mode 100644
    index 000000000000..400a3d713fb2
    --- /dev/null
    +++ b/arch/x86/kernel/fpu/bugs.c
    @@ -0,0 +1,64 @@
    +/*
    + * x86 FPU bug checks:
    + */
    +#include <asm/fpu/internal.h>
    +
    +/*
    + * Boot time CPU/FPU FDIV bug detection code:
    + */
    +
    +static double __initdata x = 4195835.0;
    +static double __initdata y = 3145727.0;
    +
    +/*
    + * This used to check for exceptions..
    + * However, it turns out that to support that,
    + * the XMM trap handlers basically had to
    + * be buggy. So let's have a correct XMM trap
    + * handler, and forget about printing out
    + * some status at boot.
    + *
    + * We should really only care about bugs here
    + * anyway. Not features.
    + */
    +static void __init check_fpu(void)
    +{
    + s32 fdiv_bug;
    +
    + kernel_fpu_begin();
    +
    + /*
    + * trap_init() enabled FXSR and company _before_ testing for FP
    + * problems here.
    + *
    + * Test for the divl bug: http://en.wikipedia.org/wiki/Fdiv_bug
    + */
    + __asm__("fninit\n\t"
    + "fldl %1\n\t"
    + "fdivl %2\n\t"
    + "fmull %2\n\t"
    + "fldl %1\n\t"
    + "fsubp %%st,%%st(1)\n\t"
    + "fistpl %0\n\t"
    + "fwait\n\t"
    + "fninit"
    + : "=m" (*&fdiv_bug)
    + : "m" (*&x), "m" (*&y));
    +
    + kernel_fpu_end();
    +
    + if (fdiv_bug) {
    + set_cpu_bug(&boot_cpu_data, X86_BUG_FDIV);
    + pr_warn("Hmm, FPU with FDIV bug\n");
    + }
    +}
    +
    +void fpu__init_check_bugs(void)
    +{
    + /*
    + * kernel_fpu_begin/end() in check_fpu() relies on the patched
    + * alternative instructions.
    + */
    + if (cpu_has_fpu)
    + check_fpu();
    +}
    diff --git a/arch/x86/kernel/fpu/init.c b/arch/x86/kernel/fpu/init.c
    index 69cdadd49ddf..63cd1703d25c 100644
    --- a/arch/x86/kernel/fpu/init.c
    +++ b/arch/x86/kernel/fpu/init.c
    @@ -5,66 +5,6 @@
    #include <asm/tlbflush.h>

    /*
    - * Boot time CPU/FPU FDIV bug detection code:
    - */
    -
    -static double __initdata x = 4195835.0;
    -static double __initdata y = 3145727.0;
    -
    -/*
    - * This used to check for exceptions..
    - * However, it turns out that to support that,
    - * the XMM trap handlers basically had to
    - * be buggy. So let's have a correct XMM trap
    - * handler, and forget about printing out
    - * some status at boot.
    - *
    - * We should really only care about bugs here
    - * anyway. Not features.
    - */
    -static void __init check_fpu(void)
    -{
    - s32 fdiv_bug;
    -
    - kernel_fpu_begin();
    -
    - /*
    - * trap_init() enabled FXSR and company _before_ testing for FP
    - * problems here.
    - *
    - * Test for the divl bug: http://en.wikipedia.org/wiki/Fdiv_bug
    - */
    - __asm__("fninit\n\t"
    - "fldl %1\n\t"
    - "fdivl %2\n\t"
    - "fmull %2\n\t"
    - "fldl %1\n\t"
    - "fsubp %%st,%%st(1)\n\t"
    - "fistpl %0\n\t"
    - "fwait\n\t"
    - "fninit"
    - : "=m" (*&fdiv_bug)
    - : "m" (*&x), "m" (*&y));
    -
    - kernel_fpu_end();
    -
    - if (fdiv_bug) {
    - set_cpu_bug(&boot_cpu_data, X86_BUG_FDIV);
    - pr_warn("Hmm, FPU with FDIV bug\n");
    - }
    -}
    -
    -void fpu__init_check_bugs(void)
    -{
    - /*
    - * kernel_fpu_begin/end() in check_fpu() relies on the patched
    - * alternative instructions.
    - */
    - if (cpu_has_fpu)
    - check_fpu();
    -}
    -
    -/*
    * The earliest FPU detection code:
    */
    static void fpu__init_system_early_generic(struct cpuinfo_x86 *c)
    --
    2.1.0


    \
     
     \ /
      Last update: 2015-05-05 21:01    [W:4.437 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site