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 031/208] x86/fpu: Factor out the FPU bug detection code into fpu__init_check_bugs()
    Date
    Move the boot-time FPU bug detection code to the other FPU boot time
    init code in fpu/init.c.

    No change in code size:

    text data bss dec hex filename
    13044568 1884440 1130496 16059504 f50c70 vmlinux.before
    13044568 1884440 1130496 16059504 f50c70 vmlinux.after

    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/include/asm/i387.h | 1 +
    arch/x86/kernel/cpu/bugs.c | 53 +----------------------------------------------------
    arch/x86/kernel/fpu/init.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    3 files changed, 65 insertions(+), 52 deletions(-)

    diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h
    index c8ee395dd6c6..89ae3e051741 100644
    --- a/arch/x86/include/asm/i387.h
    +++ b/arch/x86/include/asm/i387.h
    @@ -24,6 +24,7 @@ extern void fpu__flush_thread(struct task_struct *tsk);

    extern int dump_fpu(struct pt_regs *, struct user_i387_struct *);
    extern void fpu__restore(void);
    +extern void fpu__init_check_bugs(void);

    extern bool irq_fpu_usable(void);

    diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
    index 03445346ee0a..eb8be0c5823b 100644
    --- a/arch/x86/kernel/cpu/bugs.c
    +++ b/arch/x86/kernel/cpu/bugs.c
    @@ -17,52 +17,6 @@
    #include <asm/paravirt.h>
    #include <asm/alternative.h>

    -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 __init check_bugs(void)
    {
    identify_boot_cpu();
    @@ -85,10 +39,5 @@ void __init check_bugs(void)
    '0' + (boot_cpu_data.x86 > 6 ? 6 : boot_cpu_data.x86);
    alternative_instructions();

    - /*
    - * kernel_fpu_begin/end() in check_fpu() relies on the patched
    - * alternative instructions.
    - */
    - if (cpu_has_fpu)
    - check_fpu();
    + fpu__init_check_bugs();
    }
    diff --git a/arch/x86/kernel/fpu/init.c b/arch/x86/kernel/fpu/init.c
    index 5e06aa6cc22e..4eabb426e910 100644
    --- a/arch/x86/kernel/fpu/init.c
    +++ b/arch/x86/kernel/fpu/init.c
    @@ -4,6 +4,69 @@
    #include <asm/fpu-internal.h>
    #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();
    +}
    +
    +/*
    + * Boot time FPU feature detection code:
    + */
    unsigned int mxcsr_feature_mask __read_mostly = 0xffffffffu;
    unsigned int xstate_size;
    EXPORT_SYMBOL_GPL(xstate_size);
    --
    2.1.0


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