• Sebastian Andrzej Siewior's avatar
    x86/fpu: Don't save fxregs for ia32 frames in copy_fpstate_to_sigframe() · 39388e80
    Sebastian Andrzej Siewior authored
    In commit
    
      72a671ce ("x86, fpu: Unify signal handling code paths for x86 and x86_64 kernels")
    
    the 32bit and 64bit path of the signal delivery code were merged.
    
    The 32bit version:
    
      int save_i387_xstate_ia32(void __user *buf)
      …
             if (cpu_has_xsave)
                     return save_i387_xsave(fp);
             if (cpu_has_fxsr)
                     return save_i387_fxsave(fp);
    
    The 64bit version:
    
      int save_i387_xstate(void __user *buf)
      …
             if (user_has_fpu()) {
                     if (use_xsave())
                             err = xsave_user(buf);
                     else
                             err = fxsave_user(buf);
    
                     if (unlikely(err)) {
                             __clear_user(buf, xstate_size);
                             return err;
    
    The merge:
    
      int save_xstate_sig(void __user *buf, void __user *buf_fx, int size)
      …
             if (user_has_fpu()) {
                     /* Save the live register state to the user directly. */
                     if (save_user_xstate(buf_fx))
                             return -1;
                     /* Update the thread's fxstate to save the fsave header. */
                     if (ia32_fxstate)
                             fpu_fxsave(&tsk->thread.fpu);
    
    I don't think that we needed to save the FPU registers to ->thread.fpu
    because the registers were stored in buf_fx. Today the state will be
    restored from buf_fx after the signal was handled (I assume that this
    was also the case with lazy-FPU).
    
    Since commit
    
      66463db4 ("x86, fpu: shift drop_init_fpu() from save_xstate_sig() to handle_signal()")
    
    it is ensured that the signal handler starts with clear/fresh set of FPU
    registers which means that the previous store is futile.
    
    Remove the copy_fxregs_to_kernel() call because task's FPU state is
    cleared later in handle_signal() via fpu__clear().
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Reviewed-by: default avatarDave Hansen <dave.hansen@intel.com>
    Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jann Horn <jannh@google.com>
    Cc: "Jason A. Donenfeld" <Jason@zx2c4.com>
    Cc: kvm ML <kvm@vger.kernel.org>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Radim Krčmář <rkrcmar@redhat.com>
    Cc: Rik van Riel <riel@surriel.com>
    Cc: x86-ml <x86@kernel.org>
    Link: https://lkml.kernel.org/r/20190403164156.19645-7-bigeasy@linutronix.de
    39388e80
signal.c 10.6 KB