>diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h >index 0fc5e6312e93..d77b030e996c 100644 >--- a/arch/x86/include/asm/kvm_host.h >+++ b/arch/x86/include/asm/kvm_host.h >@@ -803,6 +803,7 @@ struct kvm_vcpu_arch { > > u64 xcr0; > u64 guest_supported_xcr0; >+ u64 guest_supported_xss; This structure has the ia32_xss field. how about moving it here for symmetry? > > struct kvm_pio_request pio; > void *pio_data; >diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c >index 1f206caec559..4e7a820cba62 100644 >--- a/arch/x86/kvm/cpuid.c >+++ b/arch/x86/kvm/cpuid.c >@@ -275,7 +275,8 @@ static void __kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu, struct kvm_cpuid_e > best = cpuid_entry2_find(entries, nent, 0xD, 1); > if (best && (cpuid_entry_has(best, X86_FEATURE_XSAVES) || > cpuid_entry_has(best, X86_FEATURE_XSAVEC))) >- best->ebx = xstate_required_size(vcpu->arch.xcr0, true); >+ best->ebx = xstate_required_size(vcpu->arch.xcr0 | >+ vcpu->arch.ia32_xss, true); > > best = __kvm_find_kvm_cpuid_features(vcpu, entries, nent); > if (kvm_hlt_in_guest(vcpu->kvm) && best && >@@ -312,6 +313,17 @@ static u64 vcpu_get_supported_xcr0(struct kvm_vcpu *vcpu) > return (best->eax | ((u64)best->edx << 32)) & kvm_caps.supported_xcr0; > } > >+static u64 vcpu_get_supported_xss(struct kvm_vcpu *vcpu) >+{ >+ struct kvm_cpuid_entry2 *best; >+ >+ best = kvm_find_cpuid_entry_index(vcpu, 0xd, 1); >+ if (!best) >+ return 0; >+ >+ return (best->ecx | ((u64)best->edx << 32)) & kvm_caps.supported_xss; >+} >+ > static bool kvm_cpuid_has_hyperv(struct kvm_cpuid_entry2 *entries, int nent) > { > struct kvm_cpuid_entry2 *entry; >@@ -358,6 +370,7 @@ static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu) > } > > vcpu->arch.guest_supported_xcr0 = vcpu_get_supported_xcr0(vcpu); >+ vcpu->arch.guest_supported_xss = vcpu_get_supported_xss(vcpu); > > /* > * FP+SSE can always be saved/restored via KVM_{G,S}ET_XSAVE, even if >diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c >index 1258d1d6dd52..9a616d84bd39 100644 >--- a/arch/x86/kvm/x86.c >+++ b/arch/x86/kvm/x86.c >@@ -3795,20 +3795,25 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > vcpu->arch.ia32_tsc_adjust_msr += adj; > } > break; >- case MSR_IA32_XSS: >- if (!msr_info->host_initiated && >- !guest_cpuid_has(vcpu, X86_FEATURE_XSAVES)) >+ case MSR_IA32_XSS: { >+ bool host_msr_reset = msr_info->host_initiated && data == 0; >+ >+ if (!guest_cpuid_has(vcpu, X86_FEATURE_XSAVES) && >+ (!host_msr_reset || !msr_info->host_initiated)) !msr_info->host_initiated can be dropped here.