KVM: x86: Calculate the supported xcr0 mask at load time
Add a new global variable, supported_xcr0, to track which xcr0 bits can be exposed to the guest instead of calculating the mask on every call. The supported bits are constant for a given instance of KVM. This paves the way toward eliminating the ->mpx_supported() call in kvm_mpx_supported(), e.g. eliminates multiple retpolines in VMX's nested VM-Enter path, and eventually toward eliminating ->mpx_supported() altogether. No functional change intended. Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com> Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com> Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
committed by
Paolo Bonzini
parent
2ef7619d43
commit
cfc481810c
@@ -181,6 +181,11 @@ struct kvm_shared_msrs {
|
||||
static struct kvm_shared_msrs_global __read_mostly shared_msrs_global;
|
||||
static struct kvm_shared_msrs __percpu *shared_msrs;
|
||||
|
||||
#define KVM_SUPPORTED_XCR0 (XFEATURE_MASK_FP | XFEATURE_MASK_SSE \
|
||||
| XFEATURE_MASK_YMM | XFEATURE_MASK_BNDREGS \
|
||||
| XFEATURE_MASK_BNDCSR | XFEATURE_MASK_AVX512 \
|
||||
| XFEATURE_MASK_PKRU)
|
||||
|
||||
static u64 __read_mostly host_xss;
|
||||
|
||||
struct kvm_stats_debugfs_item debugfs_entries[] = {
|
||||
@@ -227,6 +232,8 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
|
||||
};
|
||||
|
||||
u64 __read_mostly host_xcr0;
|
||||
u64 __read_mostly supported_xcr0;
|
||||
EXPORT_SYMBOL_GPL(supported_xcr0);
|
||||
|
||||
struct kmem_cache *x86_fpu_cache;
|
||||
EXPORT_SYMBOL_GPL(x86_fpu_cache);
|
||||
@@ -4114,8 +4121,7 @@ static int kvm_vcpu_ioctl_x86_set_xsave(struct kvm_vcpu *vcpu,
|
||||
* CPUID leaf 0xD, index 0, EDX:EAX. This is for compatibility
|
||||
* with old userspace.
|
||||
*/
|
||||
if (xstate_bv & ~kvm_supported_xcr0() ||
|
||||
mxcsr & ~mxcsr_feature_mask)
|
||||
if (xstate_bv & ~supported_xcr0 || mxcsr & ~mxcsr_feature_mask)
|
||||
return -EINVAL;
|
||||
load_xsave(vcpu, (u8 *)guest_xsave->region);
|
||||
} else {
|
||||
@@ -7352,8 +7358,10 @@ int kvm_arch_init(void *opaque)
|
||||
|
||||
perf_register_guest_info_callbacks(&kvm_guest_cbs);
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_XSAVE))
|
||||
if (boot_cpu_has(X86_FEATURE_XSAVE)) {
|
||||
host_xcr0 = xgetbv(XCR_XFEATURE_ENABLED_MASK);
|
||||
supported_xcr0 = host_xcr0 & KVM_SUPPORTED_XCR0;
|
||||
}
|
||||
|
||||
kvm_lapic_init();
|
||||
if (pi_inject_timer == -1)
|
||||
|
||||
Reference in New Issue
Block a user