On Tue, Oct 8, 2019 at 11:32 PM Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote: > > On 09/10/19 03:42, Yang Weijiang wrote: > > + if (guest_cpuid_has(vcpu, X86_FEATURE_XSAVE) && > > + boot_cpu_has(X86_FEATURE_XSAVES)) > > + guest_cpuid_set(vcpu, X86_FEATURE_XSAVES); > > + > > This is incorrect, as it would cause a change in the guest ABI when > migrating from an XSAVES-enabled processor to one that doesn't have it. > > As long as IA32_XSS is 0, XSAVES is indistinguishable from XSAVEC, so > it's okay if the guest "tries" to run it despite the bit being clear in > CPUID. My bad. When Aaron and I were discussing this, I expressed concern about guest behavior on a future day when (a) AMD supports a non-zero IA32_XSS, and (b) Linux supports an intercepting non-zero IA32_XSS. One could argue that if XSAVES isn't enumerated, the guest gets what it deserves for trying it anyway. Or, one could argue that the decision to swap guest/host IA32_XSS values on VM-entry/VM-exit shouldn't be predicated on whether or not the guest CPUID enumerates XSAVES. I'm going to suggest the latter. How would you feel about having {vmx,svm}_cpuid_update set a boolean in kvm_vcpu_arch that indicates whether or not the guest can execute XSAVES, regardless of what is enumerated in the guest CPUID? The wrmsr(IA32_XSS) in the VM-entry/VM-exit path would then query that boolean rather than guest_cpuid_has(XSAVES).