x86/fpu: Use pkru_write_default() in copy_init_fpstate_to_fpregs()
ANBZ: #173 commit371071131c
upstream. There is no point in using copy_init_pkru_to_fpregs() which in turn calls write_pkru(). write_pkru() tries to fiddle with the task's xstate buffer for nothing because the XRSTOR[S](init_fpstate) just cleared the xfeature flag in the xstate header which makes get_xsave_addr() fail. It's a useless exercise anyway because the reinitialization activates the FPU so before the task's xstate buffer can be used again a XRSTOR[S] must happen which in turn dumps the PKRU value. Get rid of the now unused copy_init_pkru_to_fpregs(). Intel-SIG: commit371071131c
x86/fpu: Use pkru_write_default() in copy_init_fpstate_to_fpregs(). Intel Advanced Matrix Extensions(AMX) is one of the key features on Sapphire Rapids(SPR) and it depends on xsave, this patch is part of Thomas Gleixner's x86 FPU code cleanup that upstream AMX implementation is building on, and is also key to all code for being developed in upstream that depends on xsave. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Borislav Petkov <bp@suse.de> Link: https://lkml.kernel.org/r/20210623121455.732508792@linutronix.de [ Lin Wang: amend commit log ] Signed-off-by: Lin Wang <lin.x.wang@intel.com> Reviewed-by: Artie Ding <artie.ding@linux.alibaba.com>
This commit is contained in:
parent
9d07b71d98
commit
33975ff5b5
|
@ -124,7 +124,6 @@ extern int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
|
|||
unsigned long init_val);
|
||||
extern int __arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
|
||||
unsigned long init_val);
|
||||
extern void copy_init_pkru_to_fpregs(void);
|
||||
|
||||
static inline int vma_pkey(struct vm_area_struct *vma)
|
||||
{
|
||||
|
|
|
@ -311,8 +311,7 @@ static inline void restore_fpregs_from_init_fpstate(u64 features_mask)
|
|||
else
|
||||
frstor(&init_fpstate.fsave);
|
||||
|
||||
if (cpu_feature_enabled(X86_FEATURE_OSPKE))
|
||||
copy_init_pkru_to_fpregs();
|
||||
pkru_write_default();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
|
||||
#include <asm/cpufeature.h> /* boot_cpu_has, ... */
|
||||
#include <asm/mmu_context.h> /* vma_pkey() */
|
||||
#include <asm/pkru.h> /* read/write_pkru() */
|
||||
|
||||
int __execute_only_pkey(struct mm_struct *mm)
|
||||
{
|
||||
|
@ -125,22 +124,6 @@ u32 init_pkru_value = PKRU_AD_KEY( 1) | PKRU_AD_KEY( 2) | PKRU_AD_KEY( 3) |
|
|||
PKRU_AD_KEY(10) | PKRU_AD_KEY(11) | PKRU_AD_KEY(12) |
|
||||
PKRU_AD_KEY(13) | PKRU_AD_KEY(14) | PKRU_AD_KEY(15);
|
||||
|
||||
/*
|
||||
* Called from the FPU code when creating a fresh set of FPU
|
||||
* registers. This is called from a very specific context where
|
||||
* we know the FPU regstiers are safe for use and we can use PKRU
|
||||
* directly.
|
||||
*/
|
||||
void copy_init_pkru_to_fpregs(void)
|
||||
{
|
||||
u32 init_pkru_value_snapshot = READ_ONCE(init_pkru_value);
|
||||
/*
|
||||
* Override the PKRU state that came from 'init_fpstate'
|
||||
* with the baseline from the process.
|
||||
*/
|
||||
write_pkru(init_pkru_value_snapshot);
|
||||
}
|
||||
|
||||
static ssize_t init_pkru_read_file(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
|
|
|
@ -44,10 +44,6 @@ static inline bool arch_pkeys_enabled(void)
|
|||
return false;
|
||||
}
|
||||
|
||||
static inline void copy_init_pkru_to_fpregs(void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* ! CONFIG_ARCH_HAS_PKEYS */
|
||||
|
||||
#endif /* _LINUX_PKEYS_H */
|
||||
|
|
Loading…
Reference in New Issue