lkml.org 
[lkml]   [2020]   [Jul]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 034/215] x86/fpu: Reset MXCSR to default in kernel_fpu_begin()
    Date
    From: Petteri Aimonen <jpa@git.mail.kapsi.fi>

    [ Upstream commit 7ad816762f9bf89e940e618ea40c43138b479e10 ]

    Previously, kernel floating point code would run with the MXCSR control
    register value last set by userland code by the thread that was active
    on the CPU core just before kernel call. This could affect calculation
    results if rounding mode was changed, or a crash if a FPU/SIMD exception
    was unmasked.

    Restore MXCSR to the kernel's default value.

    [ bp: Carve out from a bigger patch by Petteri, add feature check, add
    FNINIT call too (amluto). ]

    Signed-off-by: Petteri Aimonen <jpa@git.mail.kapsi.fi>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=207979
    Link: https://lkml.kernel.org/r/20200624114646.28953-2-bp@alien8.de
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/x86/include/asm/fpu/internal.h | 5 +++++
    arch/x86/kernel/fpu/core.c | 6 ++++++
    2 files changed, 11 insertions(+)

    diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h
    index 44c48e34d7994..00eac7f1529b0 100644
    --- a/arch/x86/include/asm/fpu/internal.h
    +++ b/arch/x86/include/asm/fpu/internal.h
    @@ -619,6 +619,11 @@ static inline void switch_fpu_finish(struct fpu *new_fpu)
    * MXCSR and XCR definitions:
    */

    +static inline void ldmxcsr(u32 mxcsr)
    +{
    + asm volatile("ldmxcsr %0" :: "m" (mxcsr));
    +}
    +
    extern unsigned int mxcsr_feature_mask;

    #define XCR_XFEATURE_ENABLED_MASK 0x00000000
    diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c
    index 12c70840980e4..cd8839027f66d 100644
    --- a/arch/x86/kernel/fpu/core.c
    +++ b/arch/x86/kernel/fpu/core.c
    @@ -101,6 +101,12 @@ void kernel_fpu_begin(void)
    copy_fpregs_to_fpstate(&current->thread.fpu);
    }
    __cpu_invalidate_fpregs_state();
    +
    + if (boot_cpu_has(X86_FEATURE_XMM))
    + ldmxcsr(MXCSR_DEFAULT);
    +
    + if (boot_cpu_has(X86_FEATURE_FPU))
    + asm volatile ("fninit");
    }
    EXPORT_SYMBOL_GPL(kernel_fpu_begin);

    --
    2.25.1


    \
     
     \ /
      Last update: 2020-07-20 17:59    [W:4.148 / U:0.400 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site