| From 136e32002ad6b8e028f3298dc610a5799dd1780e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 18 Mar 2021 12:08:37 +0000 |
| Subject: KVM: x86: dump_vmcs should not assume GUEST_IA32_EFER is valid |
| |
| From: David Edmondson <david.edmondson@oracle.com> |
| |
| [ Upstream commit d9e46d344e62a0d56fd86a8289db5bed8a57c92e ] |
| |
| If the VM entry/exit controls for loading/saving MSR_EFER are either |
| not available (an older processor or explicitly disabled) or not |
| used (host and guest values are the same), reading GUEST_IA32_EFER |
| from the VMCS returns an inaccurate value. |
| |
| Because of this, in dump_vmcs() don't use GUEST_IA32_EFER to decide |
| whether to print the PDPTRs - always do so if the fields exist. |
| |
| Fixes: 4eb64dce8d0a ("KVM: x86: dump VMCS on invalid entry") |
| Signed-off-by: David Edmondson <david.edmondson@oracle.com> |
| Message-Id: <20210318120841.133123-2-david.edmondson@oracle.com> |
| Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/x86/kvm/vmx/vmx.c | 9 +++------ |
| 1 file changed, 3 insertions(+), 6 deletions(-) |
| |
| diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c |
| index 95f836fbceb2..855c9740d957 100644 |
| --- a/arch/x86/kvm/vmx/vmx.c |
| +++ b/arch/x86/kvm/vmx/vmx.c |
| @@ -5759,7 +5759,6 @@ void dump_vmcs(void) |
| u32 vmentry_ctl, vmexit_ctl; |
| u32 cpu_based_exec_ctrl, pin_based_exec_ctrl, secondary_exec_control; |
| unsigned long cr4; |
| - u64 efer; |
| |
| if (!dump_invalid_vmcs) { |
| pr_warn_ratelimited("set kvm_intel.dump_invalid_vmcs=1 to dump internal KVM state.\n"); |
| @@ -5771,7 +5770,6 @@ void dump_vmcs(void) |
| cpu_based_exec_ctrl = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL); |
| pin_based_exec_ctrl = vmcs_read32(PIN_BASED_VM_EXEC_CONTROL); |
| cr4 = vmcs_readl(GUEST_CR4); |
| - efer = vmcs_read64(GUEST_IA32_EFER); |
| secondary_exec_control = 0; |
| if (cpu_has_secondary_exec_ctrls()) |
| secondary_exec_control = vmcs_read32(SECONDARY_VM_EXEC_CONTROL); |
| @@ -5783,9 +5781,7 @@ void dump_vmcs(void) |
| pr_err("CR4: actual=0x%016lx, shadow=0x%016lx, gh_mask=%016lx\n", |
| cr4, vmcs_readl(CR4_READ_SHADOW), vmcs_readl(CR4_GUEST_HOST_MASK)); |
| pr_err("CR3 = 0x%016lx\n", vmcs_readl(GUEST_CR3)); |
| - if ((secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT) && |
| - (cr4 & X86_CR4_PAE) && !(efer & EFER_LMA)) |
| - { |
| + if (cpu_has_vmx_ept()) { |
| pr_err("PDPTR0 = 0x%016llx PDPTR1 = 0x%016llx\n", |
| vmcs_read64(GUEST_PDPTR0), vmcs_read64(GUEST_PDPTR1)); |
| pr_err("PDPTR2 = 0x%016llx PDPTR3 = 0x%016llx\n", |
| @@ -5811,7 +5807,8 @@ void dump_vmcs(void) |
| if ((vmexit_ctl & (VM_EXIT_SAVE_IA32_PAT | VM_EXIT_SAVE_IA32_EFER)) || |
| (vmentry_ctl & (VM_ENTRY_LOAD_IA32_PAT | VM_ENTRY_LOAD_IA32_EFER))) |
| pr_err("EFER = 0x%016llx PAT = 0x%016llx\n", |
| - efer, vmcs_read64(GUEST_IA32_PAT)); |
| + vmcs_read64(GUEST_IA32_EFER), |
| + vmcs_read64(GUEST_IA32_PAT)); |
| pr_err("DebugCtl = 0x%016llx DebugExceptions = 0x%016lx\n", |
| vmcs_read64(GUEST_IA32_DEBUGCTL), |
| vmcs_readl(GUEST_PENDING_DBG_EXCEPTIONS)); |
| -- |
| 2.30.2 |
| |