| From fd6b6d9b82f97a851fb0078201ddc38fe9728cda Mon Sep 17 00:00:00 2001 |
| From: Sean Christopherson <sean.j.christopherson@intel.com> |
| Date: Mon, 1 Oct 2018 14:25:34 -0700 |
| Subject: KVM: VMX: check for existence of secondary exec controls before accessing |
| |
| From: Sean Christopherson <sean.j.christopherson@intel.com> |
| |
| commit fd6b6d9b82f97a851fb0078201ddc38fe9728cda upstream. |
| |
| Return early from vmx_set_virtual_apic_mode() if the processor doesn't |
| support VIRTUALIZE_APIC_ACCESSES or VIRTUALIZE_X2APIC_MODE, both of |
| which reside in SECONDARY_VM_EXEC_CONTROL. This eliminates warnings |
| due to VMWRITEs to SECONDARY_VM_EXEC_CONTROL (VMCS field 401e) failing |
| on processors without secondary exec controls. |
| |
| Remove the similar check for TPR shadowing as it is incorporated in the |
| flexpriority_enabled check and the APIC-related code in |
| vmx_update_msr_bitmap() is further gated by VIRTUALIZE_X2APIC_MODE. |
| |
| Reported-by: Gerhard Wiesinger <redhat@wiesinger.com> |
| Fixes: 8d860bbeedef ("kvm: vmx: Basic APIC virtualization controls have three settings") |
| Cc: Jim Mattson <jmattson@google.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Cc: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kvm/vmx.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| --- a/arch/x86/kvm/vmx.c |
| +++ b/arch/x86/kvm/vmx.c |
| @@ -9280,15 +9280,16 @@ static void vmx_set_virtual_apic_mode(st |
| if (!lapic_in_kernel(vcpu)) |
| return; |
| |
| + if (!flexpriority_enabled && |
| + !cpu_has_vmx_virtualize_x2apic_mode()) |
| + return; |
| + |
| /* Postpone execution until vmcs01 is the current VMCS. */ |
| if (is_guest_mode(vcpu)) { |
| to_vmx(vcpu)->nested.change_vmcs01_virtual_apic_mode = true; |
| return; |
| } |
| |
| - if (!cpu_need_tpr_shadow(vcpu)) |
| - return; |
| - |
| sec_exec_control = vmcs_read32(SECONDARY_VM_EXEC_CONTROL); |
| sec_exec_control &= ~(SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | |
| SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE); |