On Thu, Mar 04, 2021, Like Xu wrote: > On 2021/3/4 2:03, Sean Christopherson wrote: > > if (vmx_umip_emulated()) > > kvm_cpu_cap_set(X86_FEATURE_UMIP); > > > > /* CPUID 0xD.1 */ > > - supported_xss = 0; > > if (!cpu_has_vmx_xsaves()) > > kvm_cpu_cap_clear(X86_FEATURE_XSAVES); > > if (!cpu_has_vmx_xsaves()) > supported_xss = 0; Argh, I forgot XSAVES has a VMCS control. That's why kvm_arch_hardware_setup() clears supported_xss if !XSAVES. I guess just leave that existing code, but maybe add a comment. Paolo, any thoughts on how to keep supported_xss aligned with support_xcr0, without spreading the logic around too much? > kvm_cpu_cap_clear(X86_FEATURE_XSAVES); > > > > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > > index 7b0adebec1ef..5f9eb1f5b840 100644 > > --- a/arch/x86/kvm/x86.c > > +++ b/arch/x86/kvm/x86.c > > @@ -205,6 +205,8 @@ static struct kvm_user_return_msrs __percpu *user_return_msrs; > > | XFEATURE_MASK_BNDCSR | XFEATURE_MASK_AVX512 \ > > | XFEATURE_MASK_PKRU) > > > > +#define KVM_SUPPORTED_XSS XFEATURE_MASK_LBR > > + > > u64 __read_mostly host_efer; > > EXPORT_SYMBOL_GPL(host_efer); > > > > @@ -8037,6 +8039,11 @@ int kvm_arch_init(void *opaque) > > supported_xcr0 = host_xcr0 & KVM_SUPPORTED_XCR0; > > } > > > > + if (boot_cpu_has(X86_FEATURE_XSAVES)) > > { > > > + rdmsrl(MSR_IA32_XSS, host_xss); > > + supported_xss = host_xss & KVM_SUPPORTED_XSS; > > + } > > + > > if (pi_inject_timer == -1) > > pi_inject_timer = housekeeping_enabled(HK_FLAG_TIMER); > > #ifdef CONFIG_X86_64 > > @@ -10412,9 +10419,6 @@ int kvm_arch_hardware_setup(void *opaque) > > > > rdmsrl_safe(MSR_EFER, &host_efer); > > > > - if (boot_cpu_has(X86_FEATURE_XSAVES)) > > - rdmsrl(MSR_IA32_XSS, host_xss); > > - > > r = ops->hardware_setup(); > > if (r != 0) > > return r; > > @@ -10422,9 +10426,6 @@ int kvm_arch_hardware_setup(void *opaque) > > memcpy(&kvm_x86_ops, ops->runtime_ops, sizeof(kvm_x86_ops)); > > kvm_ops_static_call_update(); > > > > - if (!kvm_cpu_cap_has(X86_FEATURE_XSAVES)) > > - supported_xss = 0; > > - > > #define __kvm_cpu_cap_has(UNUSED_, f) kvm_cpu_cap_has(f) > > cr4_reserved_bits = __cr4_reserved_bits(__kvm_cpu_cap_has, UNUSED_); > > #undef __kvm_cpu_cap_has > > >