• Rik van Riel's avatar
    x86/fpu: Eager switch PKRU state · 0cecca9d
    Rik van Riel authored
    While most of a task's FPU state is only needed in user space, the
    protection keys need to be in place immediately after a context switch.
    
    The reason is that any access to userspace memory while running in
    kernel mode also needs to abide by the memory permissions specified in
    the protection keys.
    
    The "eager switch" is a preparation for loading the FPU state on return
    to userland. Instead of decoupling PKRU state from xstate, update PKRU
    within xstate on write operations by the kernel.
    
    For user tasks the PKRU should be always read from the xsave area and it
    should not change anything because the PKRU value was loaded as part of
    FPU restore.
    
    For kernel threads the default "init_pkru_value" will be written. Before
    this commit, the kernel thread would end up with a random value which it
    inherited from the previous user task.
    
     [ bigeasy: save pkru to xstate, no cache, don't use __raw_xsave_addr() ]
    
     [ bp: update commit message, sort headers properly in asm/fpu/xstate.h ]
    Signed-off-by: default avatarRik van Riel <riel@surriel.com>
    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: Andi Kleen <ak@linux.intel.com>
    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: Joerg Roedel <jroedel@suse.de>
    Cc: Juergen Gross <jgross@suse.com>
    Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
    Cc: kvm ML <kvm@vger.kernel.org>
    Cc: Michal Hocko <mhocko@suse.cz>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Radim Krčmář <rkrcmar@redhat.com>
    Cc: x86-ml <x86@kernel.org>
    Link: https://lkml.kernel.org/r/20190403164156.19645-16-bigeasy@linutronix.de
    0cecca9d
xstate.h 1.87 KB