mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
39ea9baffd
This is a preparation for the removal of the ->initialized member in the fpu struct. __fpu__restore_sig() is deactivating the FPU via fpu__drop() and then setting manually ->initialized followed by fpu__restore(). The result is that it is possible to manipulate fpu->state and the state of registers won't be saved/restored on a context switch which would overwrite fpu->state: fpu__drop(fpu): ... fpu->initialized = 0; preempt_enable(); <--- context switch Don't access the fpu->state while the content is read from user space and examined/sanitized. Use a temporary kmalloc() buffer for the preparation of the FPU registers and once the state is considered okay, load it. Should something go wrong, return with an error and without altering the original FPU registers. The removal of fpu__initialize() is a nop because fpu->initialized is already set for the user task. [ bp: Massage a bit. ] Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Dave Hansen <dave.hansen@intel.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Borislav Petkov <bp@suse.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-2-bigeasy@linutronix.de
35 lines
1.0 KiB
C
35 lines
1.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* x86 FPU signal frame handling methods:
|
|
*/
|
|
#ifndef _ASM_X86_FPU_SIGNAL_H
|
|
#define _ASM_X86_FPU_SIGNAL_H
|
|
|
|
#ifdef CONFIG_X86_64
|
|
# include <uapi/asm/sigcontext.h>
|
|
# include <asm/user32.h>
|
|
struct ksignal;
|
|
int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
|
|
compat_sigset_t *set, struct pt_regs *regs);
|
|
int ia32_setup_frame(int sig, struct ksignal *ksig,
|
|
compat_sigset_t *set, struct pt_regs *regs);
|
|
#else
|
|
# define user_i387_ia32_struct user_i387_struct
|
|
# define user32_fxsr_struct user_fxsr_struct
|
|
# define ia32_setup_frame __setup_frame
|
|
# define ia32_setup_rt_frame __setup_rt_frame
|
|
#endif
|
|
|
|
extern void convert_from_fxsr(struct user_i387_ia32_struct *env,
|
|
struct task_struct *tsk);
|
|
extern void convert_to_fxsr(struct fxregs_state *fxsave,
|
|
const struct user_i387_ia32_struct *env);
|
|
|
|
unsigned long
|
|
fpu__alloc_mathframe(unsigned long sp, int ia32_frame,
|
|
unsigned long *buf_fx, unsigned long *size);
|
|
|
|
extern void fpu__init_prepare_fx_sw_frame(void);
|
|
|
|
#endif /* _ASM_X86_FPU_SIGNAL_H */
|