提交 a26e2255 编写于 作者: T Thomas Gleixner 提交者: Lin Wang

x86/pkru: Remove xstate fiddling from write_pkru()

mainline inclusion
from mainline-v5.14-rc1
commit 72a6c08c
category: feature
bugzilla: https://gitee.com/openeuler/intel-kernel/issues/I590ZC
CVE: NA

Intel-SIG: commit 72a6c08c x86/pkru: Remove xstate fiddling from write_pkru().

--------------------------------

The PKRU value of a task is stored in task->thread.pkru when the task is
scheduled out. PKRU is restored on schedule in from there. So keeping the
XSAVE buffer up to date is a pointless exercise.

Remove the xstate fiddling and cleanup all related functions.
Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
Signed-off-by: NBorislav Petkov <bp@suse.de>
Reviewed-by: NBorislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20210623121456.897372712@linutronix.deSigned-off-by: NLin Wang <lin.x.wang@intel.com>
上级 88cae429
...@@ -41,23 +41,14 @@ static inline u32 read_pkru(void) ...@@ -41,23 +41,14 @@ static inline u32 read_pkru(void)
static inline void write_pkru(u32 pkru) static inline void write_pkru(u32 pkru)
{ {
struct pkru_state *pk;
if (!cpu_feature_enabled(X86_FEATURE_OSPKE)) if (!cpu_feature_enabled(X86_FEATURE_OSPKE))
return; return;
pk = get_xsave_addr(&current->thread.fpu.state.xsave, XFEATURE_PKRU);
/* /*
* The PKRU value in xstate needs to be in sync with the value that is * WRPKRU is relatively expensive compared to RDPKRU.
* written to the CPU. The FPU restore on return to userland would * Avoid WRPKRU when it would not change the value.
* otherwise load the previous value again.
*/ */
fpregs_lock(); if (pkru != rdpkru())
if (pk) wrpkru(pkru);
pk->pkru = pkru;
__write_pkru(pkru);
fpregs_unlock();
} }
static inline void pkru_write_default(void) static inline void pkru_write_default(void)
......
...@@ -104,25 +104,13 @@ static inline void wrpkru(u32 pkru) ...@@ -104,25 +104,13 @@ static inline void wrpkru(u32 pkru)
: : "a" (pkru), "c"(ecx), "d"(edx)); : : "a" (pkru), "c"(ecx), "d"(edx));
} }
static inline void __write_pkru(u32 pkru)
{
/*
* WRPKRU is relatively expensive compared to RDPKRU.
* Avoid WRPKRU when it would not change the value.
*/
if (pkru == rdpkru())
return;
wrpkru(pkru);
}
#else #else
static inline u32 rdpkru(void) static inline u32 rdpkru(void)
{ {
return 0; return 0;
} }
static inline void __write_pkru(u32 pkru) static inline void wrpkru(u32 pkru)
{ {
} }
#endif #endif
......
...@@ -946,7 +946,7 @@ void kvm_load_guest_xsave_state(struct kvm_vcpu *vcpu) ...@@ -946,7 +946,7 @@ void kvm_load_guest_xsave_state(struct kvm_vcpu *vcpu)
(kvm_read_cr4_bits(vcpu, X86_CR4_PKE) || (kvm_read_cr4_bits(vcpu, X86_CR4_PKE) ||
(vcpu->arch.xcr0 & XFEATURE_MASK_PKRU)) && (vcpu->arch.xcr0 & XFEATURE_MASK_PKRU)) &&
vcpu->arch.pkru != vcpu->arch.host_pkru) vcpu->arch.pkru != vcpu->arch.host_pkru)
__write_pkru(vcpu->arch.pkru); write_pkru(vcpu->arch.pkru);
} }
EXPORT_SYMBOL_GPL(kvm_load_guest_xsave_state); EXPORT_SYMBOL_GPL(kvm_load_guest_xsave_state);
...@@ -957,7 +957,7 @@ void kvm_load_host_xsave_state(struct kvm_vcpu *vcpu) ...@@ -957,7 +957,7 @@ void kvm_load_host_xsave_state(struct kvm_vcpu *vcpu)
(vcpu->arch.xcr0 & XFEATURE_MASK_PKRU))) { (vcpu->arch.xcr0 & XFEATURE_MASK_PKRU))) {
vcpu->arch.pkru = rdpkru(); vcpu->arch.pkru = rdpkru();
if (vcpu->arch.pkru != vcpu->arch.host_pkru) if (vcpu->arch.pkru != vcpu->arch.host_pkru)
__write_pkru(vcpu->arch.host_pkru); write_pkru(vcpu->arch.host_pkru);
} }
if (kvm_read_cr4_bits(vcpu, X86_CR4_OSXSAVE)) { if (kvm_read_cr4_bits(vcpu, X86_CR4_OSXSAVE)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册