• Sebastian Andrzej Siewior's avatar
    x86/fpu: Restore from kernel memory on the 64-bit path too · 926b21f3
    Sebastian Andrzej Siewior authored
    The 64-bit case (both 64-bit and 32-bit frames) loads the new state from
    user memory.
    
    However, doing this is not desired if the FPU state is going to be
    restored on return to userland: it would be required to disable
    preemption in order to avoid a context switch which would set
    TIF_NEED_FPU_LOAD. If this happens before the restore operation then the
    loaded registers would become volatile.
    
    Furthermore, disabling preemption while accessing user memory requires
    to disable the pagefault handler. An error during FXRSTOR would then
    mean that either a page fault occurred (and it would have to be retried
    with enabled page fault handler) or a #GP occurred because the xstate is
    bogus (after all, the signal handler can modify it).
    
    In order to avoid that mess, copy the FPU state from userland, validate
    it and then load it. The copy_kernel_…() helpers are basically just
    like the old helpers except that they operate on kernel memory and the
    fault handler just sets the error value and the caller handles it.
    
    copy_user_to_fpregs_zeroing() and its helpers remain and will be used
    later for a fastpath optimisation.
    
     [ bp: Clarify commit message. ]
    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: Aubrey Li <aubrey.li@intel.com>
    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-22-bigeasy@linutronix.de
    926b21f3
internal.h 16.3 KB