On 7/22/22 00:56, Sean Christopherson wrote:
Except the errata are based on FMS and the FMS exposed to the L1 hypervisor may not be the real FMS. But that's moot, because they_should_ be fully emulated by KVM anyways; KVM runs L2 with a MSR value modified by perf, not the raw MSR value requested by L1. Of course KVM screws things up and fails to clear the flag in entry controls... All exit controls are emulated so at least KVM gets those right.
Can you send this as a separate patch? Paolo
Untested, but I believe KVM the fix is: diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index d0e781c7ac72..76926147b672 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -2357,7 +2357,8 @@ static void prepare_vmcs02_early(struct vcpu_vmx *vmx, struct loaded_vmcs *vmcs0 * we can avoid VMWrites during vmx_set_efer(). */ exec_control = __vm_entry_controls_get(vmcs01); - exec_control |= vmcs12->vm_entry_controls; + exec_control |= (vmcs12->vm_entry_controls & + ~VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL); exec_control &= ~(VM_ENTRY_IA32E_MODE | VM_ENTRY_LOAD_IA32_EFER); if (cpu_has_load_ia32_efer()) { if (guest_efer & EFER_LMA)