• Andy Lutomirski's avatar
    x86/fpu: Clean up the fpu__clear() variants · 33344368
    Andy Lutomirski authored
    fpu__clear() currently resets both register state and kernel XSAVE buffer
    state.  It has two modes: one for all state (supervisor and user) and
    another for user state only.  fpu__clear_all() uses the "all state"
    (user_only=0) mode, while a number of signal paths use the user_only=1
    mode.
    
    Make fpu__clear() work only for user state (user_only=1) and remove the
    "all state" (user_only=0) code.  Rename it to match so it can be used by
    the signal paths.
    
    Replace the "all state" (user_only=0) fpu__clear() functionality.  Use the
    TIF_NEED_FPU_LOAD functionality instead of making any actual hardware
    registers changes in this path.
    
    Instead of invoking fpu__initialize() just memcpy() init_fpstate into the
    task's FPU state because that has already the correct format and in case of
    PKRU also contains the default PKRU value. Move the actual PKRU write out
    into flush_thread() where it belongs and where it will end up anyway when
    PKRU and XSTATE have been untangled.
    
    For bisectability a workaround is required which stores the PKRU value in
    the xstate memory until PKRU is untangled from XSTATE for context
    switching and return to user.
    
    [ Dave Hansen: Polished changelog ]
    [ tglx: Fixed the PKRU fallout ]
    Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Link: https://lkml.kernel.org/r/20210623121455.922729522@linutronix.de
    33344368
process.c 24.3 KB