lkml.org 
[lkml]   [2021]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: x86/fpu] x86/fpu: Rename and sanitize fpu__save/copy()
    The following commit has been merged into the x86/fpu branch of tip:

    Commit-ID: b2681e791dbcee6acb1dca7a5076a0285109ac4c
    Gitweb: https://git.kernel.org/tip/b2681e791dbcee6acb1dca7a5076a0285109ac4c
    Author: Thomas Gleixner <tglx@linutronix.de>
    AuthorDate: Wed, 23 Jun 2021 14:02:06 +02:00
    Committer: Borislav Petkov <bp@suse.de>
    CommitterDate: Wed, 23 Jun 2021 18:55:56 +02:00

    x86/fpu: Rename and sanitize fpu__save/copy()

    Both function names are a misnomer.

    fpu__save() is actually about synchronizing the hardware register state
    into the task's memory state so that either coredump or a math exception
    handler can inspect the state at the time where the problem happens.

    The function guarantees to preserve the register state, while "save" is a
    common terminology for saving the current state so it can be modified and
    restored later. This is clearly not the case here.

    Rename it to fpu_sync_fpstate().

    fpu__copy() is used to clone the current task's FPU state when duplicating
    task_struct. While the register state is a copy the rest of the FPU state
    is not.

    Name it accordingly and remove the really pointless @src argument along
    with the warning which comes along with it.

    Nothing can ever copy the FPU state of a non-current task. It's clearly
    just a consequence of arch_dup_task_struct(), but it makes no sense to
    proliferate that further.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Reviewed-by: Borislav Petkov <bp@suse.de>
    Link: https://lkml.kernel.org/r/20210623121455.196727450@linutronix.de
    ---
    arch/x86/include/asm/fpu/internal.h | 6 ++++--
    arch/x86/kernel/fpu/core.c | 17 ++++++++---------
    arch/x86/kernel/fpu/regset.c | 2 +-
    arch/x86/kernel/process.c | 3 +--
    arch/x86/kernel/traps.c | 5 +++--
    5 files changed, 17 insertions(+), 16 deletions(-)

    diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h
    index 3558cd0..f5da2e9 100644
    --- a/arch/x86/include/asm/fpu/internal.h
    +++ b/arch/x86/include/asm/fpu/internal.h
    @@ -26,14 +26,16 @@
    /*
    * High level FPU state handling functions:
    */
    -extern void fpu__save(struct fpu *fpu);
    extern int fpu__restore_sig(void __user *buf, int ia32_frame);
    extern void fpu__drop(struct fpu *fpu);
    -extern int fpu__copy(struct task_struct *dst, struct task_struct *src);
    extern void fpu__clear_user_states(struct fpu *fpu);
    extern void fpu__clear_all(struct fpu *fpu);
    extern int fpu__exception_code(struct fpu *fpu, int trap_nr);

    +extern void fpu_sync_fpstate(struct fpu *fpu);
    +
    +extern int fpu_clone(struct task_struct *dst);
    +
    /*
    * Boot time FPU initialization functions:
    */
    diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c
    index 4a59e0f..8762b1a 100644
    --- a/arch/x86/kernel/fpu/core.c
    +++ b/arch/x86/kernel/fpu/core.c
    @@ -159,11 +159,10 @@ void kernel_fpu_end(void)
    EXPORT_SYMBOL_GPL(kernel_fpu_end);

    /*
    - * Save the FPU state (mark it for reload if necessary):
    - *
    - * This only ever gets called for the current task.
    + * Sync the FPU register state to current's memory register state when the
    + * current task owns the FPU. The hardware register state is preserved.
    */
    -void fpu__save(struct fpu *fpu)
    +void fpu_sync_fpstate(struct fpu *fpu)
    {
    WARN_ON_FPU(fpu != &current->thread.fpu);

    @@ -221,18 +220,18 @@ void fpstate_init(union fpregs_state *state)
    }
    EXPORT_SYMBOL_GPL(fpstate_init);

    -int fpu__copy(struct task_struct *dst, struct task_struct *src)
    +/* Clone current's FPU state on fork */
    +int fpu_clone(struct task_struct *dst)
    {
    + struct fpu *src_fpu = &current->thread.fpu;
    struct fpu *dst_fpu = &dst->thread.fpu;
    - struct fpu *src_fpu = &src->thread.fpu;

    + /* The new task's FPU state cannot be valid in the hardware. */
    dst_fpu->last_cpu = -1;

    - if (!static_cpu_has(X86_FEATURE_FPU))
    + if (!cpu_feature_enabled(X86_FEATURE_FPU))
    return 0;

    - WARN_ON_FPU(src_fpu != &current->thread.fpu);
    -
    /*
    * Don't let 'init optimized' areas of the XSAVE area
    * leak into the child task:
    diff --git a/arch/x86/kernel/fpu/regset.c b/arch/x86/kernel/fpu/regset.c
    index 892aec1..4575796 100644
    --- a/arch/x86/kernel/fpu/regset.c
    +++ b/arch/x86/kernel/fpu/regset.c
    @@ -41,7 +41,7 @@ int regset_xregset_fpregs_active(struct task_struct *target, const struct user_r
    static void sync_fpstate(struct fpu *fpu)
    {
    if (fpu == &current->thread.fpu)
    - fpu__save(fpu);
    + fpu_sync_fpstate(fpu);
    }

    /*
    diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
    index 5e1f381..af3db53 100644
    --- a/arch/x86/kernel/process.c
    +++ b/arch/x86/kernel/process.c
    @@ -87,8 +87,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
    #ifdef CONFIG_VM86
    dst->thread.vm86 = NULL;
    #endif
    -
    - return fpu__copy(dst, src);
    + return fpu_clone(dst);
    }

    /*
    diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
    index 853ea7a..4c9c4aa 100644
    --- a/arch/x86/kernel/traps.c
    +++ b/arch/x86/kernel/traps.c
    @@ -1046,9 +1046,10 @@ static void math_error(struct pt_regs *regs, int trapnr)
    }

    /*
    - * Save the info for the exception handler and clear the error.
    + * Synchronize the FPU register state to the memory register state
    + * if necessary. This allows the exception handler to inspect it.
    */
    - fpu__save(fpu);
    + fpu_sync_fpstate(fpu);

    task->thread.trap_nr = trapnr;
    task->thread.error_code = 0;
    \
     
     \ /
      Last update: 2021-06-24 00:10    [W:2.341 / U:1.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site