[tip: x86/fpu] x86/fpu/xstate: Update copy_kernel_to_xregs_err() for supervisor states
From: tip-bot2 for Yu-cheng Yu
Date: Sat May 16 2020 - 11:10:34 EST
The following commit has been merged into the x86/fpu branch of tip:
Commit-ID: c95473e175dd1234b7440daa6eb2670ebf529653
Gitweb: https://git.kernel.org/tip/c95473e175dd1234b7440daa6eb2670ebf529653
Author: Yu-cheng Yu <yu-cheng.yu@xxxxxxxxx>
AuthorDate: Tue, 12 May 2020 07:54:41 -07:00
Committer: Borislav Petkov <bp@xxxxxxx>
CommitterDate: Thu, 14 May 2020 16:46:43 +02:00
x86/fpu/xstate: Update copy_kernel_to_xregs_err() for supervisor states
The function copy_kernel_to_xregs_err() uses XRSTOR which can work with
standard or compacted format without supervisor xstates. However, when
supervisor xstates are present, XRSTORS must be used. Fix it by using
XRSTORS when supervisor state handling is enabled.
I also considered if there were additional cases where XRSTOR might be
mistakenly called instead of XRSTORS. There are only three XRSTOR sites
in the kernel:
1. copy_kernel_to_xregs_booting(), already switches between XRSTOR and
XRSTORS based on X86_FEATURE_XSAVES.
2. copy_user_to_xregs(), which *needs* XRSTOR because it is copying from
userspace and must never copy supervisor state with XRSTORS.
3. copy_kernel_to_xregs_err() mistakenly used XRSTOR only. Fix it.
[ bp: Massage commit message. ]
Signed-off-by: Yu-cheng Yu <yu-cheng.yu@xxxxxxxxx>
Signed-off-by: Borislav Petkov <bp@xxxxxxx>
Reviewed-by: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
Link: https://lkml.kernel.org/r/20200512145444.15483-8-yu-cheng.yu@xxxxxxxxx
---
arch/x86/include/asm/fpu/internal.h | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h
index a42fcb4..42159f4 100644
--- a/arch/x86/include/asm/fpu/internal.h
+++ b/arch/x86/include/asm/fpu/internal.h
@@ -400,7 +400,10 @@ static inline int copy_kernel_to_xregs_err(struct xregs_state *xstate, u64 mask)
u32 hmask = mask >> 32;
int err;
- XSTATE_OP(XRSTOR, xstate, lmask, hmask, err);
+ if (static_cpu_has(X86_FEATURE_XSAVES))
+ XSTATE_OP(XRSTORS, xstate, lmask, hmask, err);
+ else
+ XSTATE_OP(XRSTOR, xstate, lmask, hmask, err);
return err;
}