• Yu-cheng Yu's avatar
    x86/fpu/xstate: Preserve supervisor states for the slow path in __fpu__restore_sig() · 98265c17
    Yu-cheng Yu authored
    The signal return code is responsible for taking an XSAVE buffer
    present in user memory and loading it into the hardware registers. This
    operation only affects user XSAVE state and never affects supervisor
    state.
    
    The fast path through this code simply points XRSTOR directly at the
    user buffer. However, since user memory is not guaranteed to be always
    mapped, this XRSTOR can fail. If it fails, the signal return code falls
    back to a slow path which can tolerate page faults.
    
    That slow path copies the xfeatures one by one out of the user buffer
    into the task's fpu state area. However, by being in a context where it
    can handle page faults, the code can also schedule.
    
    The lazy-fpu-load code would think it has an up-to-date fpstate and
    would fail to save the supervisor state when scheduling the task out.
    When scheduling back in, it would likely restore stale supervisor state.
    
    To fix that, preserve supervisor state before the slow path.  Modify
    copy_user_to_fpregs_zeroing() so that if it fails, fpregs are not zeroed,
    and there is no need for fpregs_deactivate() and supervisor states are
    preserved.
    
    Move set_thread_flag(TIF_NEED_FPU_LOAD) to the slow path.  Without doing
    this, the fast path also needs supervisor states to be saved first.
    Signed-off-by: default avatarYu-cheng Yu <yu-cheng.yu@intel.com>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Link: https://lkml.kernel.org/r/20200512145444.15483-10-yu-cheng.yu@intel.com
    98265c17
signal.c 13.4 KB