lkml.org 
[lkml]   [2021]   [Jun]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch V3 62/66] x86/fpu/signal: Sanitize copy_user_to_fpregs_zeroing()
    Now that user_xfeatures is correctly set when xsave is enabled, remove the
    duplicated initialization of components.

    Rename the function while at it.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    ---
    arch/x86/kernel/fpu/signal.c | 36 +++++++++++++++---------------------
    1 file changed, 15 insertions(+), 21 deletions(-)

    --- a/arch/x86/kernel/fpu/signal.c
    +++ b/arch/x86/kernel/fpu/signal.c
    @@ -250,33 +250,27 @@ sanitize_restored_user_xstate(union fpre
    }

    /*
    - * Restore the extended state if present. Otherwise, restore the FP/SSE state.
    + * Restore the FPU state directly from the userspace signal frame.
    */
    -static int copy_user_to_fpregs_zeroing(void __user *buf, u64 xbv, int fx_only)
    +static int restore_fpregs_from_user(void __user *buf, u64 xrestore, bool fx_only)
    {
    - u64 init_bv;
    - int r;
    -
    if (use_xsave()) {
    - if (fx_only) {
    - init_bv = xfeatures_mask_uabi() & ~XFEATURE_MASK_FPSSE;
    + u64 init_bv = xfeatures_mask_uabi() & ~xrestore;
    + int ret;

    - r = fxrstor_from_user_sigframe(buf);
    - if (!r)
    - os_xrstor(&init_fpstate.xsave, init_bv);
    - return r;
    - } else {
    - init_bv = xfeatures_mask_uabi() & ~xbv;
    -
    - r = xrstor_from_user_sigframe(buf, xbv);
    - if (!r && unlikely(init_bv))
    - os_xrstor(&init_fpstate.xsave, init_bv);
    - return r;
    - }
    + if (likely(!fx_only))
    + ret = xrstor_from_user_sigframe(buf, xrestore);
    + else
    + ret = fxrstor_from_user_sigframe(buf);
    +
    + if (!ret && unlikely(init_bv))
    + os_xrstor(&init_fpstate.xsave, init_bv);
    + return ret;
    } else if (use_fxsr()) {
    return fxrstor_from_user_sigframe(buf);
    - } else
    + } else {
    return frstor_from_user_sigframe(buf);
    + }
    }

    static int __fpu_restore_sig(void __user *buf, void __user *buf_fx,
    @@ -313,7 +307,7 @@ static int __fpu_restore_sig(void __user
    */
    fpregs_lock();
    pagefault_disable();
    - ret = copy_user_to_fpregs_zeroing(buf_fx, user_xfeatures, fx_only);
    + ret = restore_fpregs_from_user(buf_fx, user_xfeatures, fx_only);
    pagefault_enable();
    if (!ret) {

    \
     
     \ /
      Last update: 2021-06-18 17:26    [W:4.207 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site