On Thu, May 11, 2023 at 12:08:43AM -0400, Yang Weijiang wrote: >Update CPUID(EAX=0DH,ECX=1) when the guest's XSS is modified. >CPUID(EAX=0DH,ECX=1).EBX reports current required storage size for all >features enabled via XCR0 | XSS so that guest can allocate correct xsave >buffer. > >Note, KVM does not yet support any XSS based features, i.e. supported_xss >is guaranteed to be zero at this time. > >Co-developed-by: Zhang Yi Z <yi.z.zhang@xxxxxxxxxxxxxxx> >Signed-off-by: Zhang Yi Z <yi.z.zhang@xxxxxxxxxxxxxxx> >Signed-off-by: Yang Weijiang <weijiang.yang@xxxxxxxxx> >--- > arch/x86/kvm/cpuid.c | 7 +++++-- > arch/x86/kvm/x86.c | 6 ++++-- > 2 files changed, 9 insertions(+), 4 deletions(-) > >diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c >index 123bf8b97a4b..cbb1b8a65502 100644 >--- a/arch/x86/kvm/cpuid.c >+++ b/arch/x86/kvm/cpuid.c >@@ -277,8 +277,11 @@ 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); >+ cpuid_entry_has(best, X86_FEATURE_XSAVEC))) { Align indentation. if (best && (cpuid_entry_has(best, X86_FEATURE_XSAVES) || cpuid_entry_has(best, X86_FEATURE_XSAVEC))) { >+ u64 xstate = vcpu->arch.xcr0 | vcpu->arch.ia32_xss; >+ >+ best->ebx = xstate_required_size(xstate, true); >+ } > > best = __kvm_find_kvm_cpuid_features(vcpu, entries, nent); > if (kvm_hlt_in_guest(vcpu->kvm) && best && >diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c >index 33a780fe820b..ab3360a10933 100644 >--- a/arch/x86/kvm/x86.c >+++ b/arch/x86/kvm/x86.c >@@ -3776,8 +3776,10 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) > */ > if (data & ~kvm_caps.supported_xss) Shouldn't we check against the supported value of _this_ guest? similar to guest_supported_xcr0. > return 1; >- vcpu->arch.ia32_xss = data; >- kvm_update_cpuid_runtime(vcpu); >+ if (vcpu->arch.ia32_xss != data) { >+ vcpu->arch.ia32_xss = data; >+ kvm_update_cpuid_runtime(vcpu); >+ } > break; > case MSR_SMI_COUNT: > if (!msr_info->host_initiated) >-- >2.27.0 >