lkml.org 
[lkml]   [2021]   [Feb]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 5/5] KVM: x86: dump_vmcs should include the autoload/autostore MSR lists
    Date
    When dumping the current VMCS state, include the MSRs that are being
    automatically loaded/stored during VM entry/exit.

    Signed-off-by: David Edmondson <david.edmondson@oracle.com>
    ---
    arch/x86/kvm/vmx/vmx.c | 25 +++++++++++++++++++++----
    arch/x86/kvm/vmx/vmx.h | 2 +-
    2 files changed, 22 insertions(+), 5 deletions(-)

    diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
    index ed04827a3593..de42b8c14a38 100644
    --- a/arch/x86/kvm/vmx/vmx.c
    +++ b/arch/x86/kvm/vmx/vmx.c
    @@ -5810,8 +5810,19 @@ static void vmx_dump_dtsel(char *name, uint32_t limit)
    vmcs_readl(limit + GUEST_GDTR_BASE - GUEST_GDTR_LIMIT));
    }

    -void dump_vmcs(void)
    +static void vmx_dump_msrs(char *name, struct vmx_msrs *m)
    {
    + unsigned int i;
    + struct vmx_msr_entry *e;
    +
    + pr_err("MSR %s:\n", name);
    + for (i = 0, e = m->val; i < m->nr; ++i, ++e)
    + pr_err(" %2d: msr=0x%08x value=0x%016llx\n", i, e->index, e->value);
    +}
    +
    +void dump_vmcs(struct kvm_vcpu *vcpu)
    +{
    + struct vcpu_vmx *vmx = to_vmx(vcpu);
    u32 vmentry_ctl, vmexit_ctl;
    u32 cpu_based_exec_ctrl, pin_based_exec_ctrl, secondary_exec_control;
    unsigned long cr4;
    @@ -5890,6 +5901,10 @@ void dump_vmcs(void)
    if (secondary_exec_control & SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY)
    pr_err("InterruptStatus = %04x\n",
    vmcs_read16(GUEST_INTR_STATUS));
    + if (vmcs_read32(VM_ENTRY_MSR_LOAD_COUNT) > 0)
    + vmx_dump_msrs("guest autoload", &vmx->msr_autoload.guest);
    + if (vmcs_read32(VM_EXIT_MSR_STORE_COUNT) > 0)
    + vmx_dump_msrs("guest autostore", &vmx->msr_autostore.guest);

    pr_err("*** Host State ***\n");
    pr_err("RIP = 0x%016lx RSP = 0x%016lx\n",
    @@ -5919,6 +5934,8 @@ void dump_vmcs(void)
    vmexit_ctl & VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL)
    pr_err("PerfGlobCtl = 0x%016llx\n",
    vmcs_read64(HOST_IA32_PERF_GLOBAL_CTRL));
    + if (vmcs_read32(VM_EXIT_MSR_LOAD_COUNT) > 0)
    + vmx_dump_msrs("host autoload", &vmx->msr_autoload.host);

    pr_err("*** Control State ***\n");
    pr_err("PinBased=%08x CPUBased=%08x SecondaryExec=%08x\n",
    @@ -6019,7 +6036,7 @@ static int __vmx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
    }

    if (exit_reason.failed_vmentry) {
    - dump_vmcs();
    + dump_vmcs(vcpu);
    vcpu->run->exit_reason = KVM_EXIT_FAIL_ENTRY;
    vcpu->run->fail_entry.hardware_entry_failure_reason
    = exit_reason.full;
    @@ -6028,7 +6045,7 @@ static int __vmx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
    }

    if (unlikely(vmx->fail)) {
    - dump_vmcs();
    + dump_vmcs(vcpu);
    vcpu->run->exit_reason = KVM_EXIT_FAIL_ENTRY;
    vcpu->run->fail_entry.hardware_entry_failure_reason
    = vmcs_read32(VM_INSTRUCTION_ERROR);
    @@ -6114,7 +6131,7 @@ static int __vmx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
    unexpected_vmexit:
    vcpu_unimpl(vcpu, "vmx: unexpected exit reason 0x%x\n",
    exit_reason.full);
    - dump_vmcs();
    + dump_vmcs(vcpu);
    vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
    vcpu->run->internal.suberror =
    KVM_INTERNAL_ERROR_UNEXPECTED_EXIT_REASON;
    diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h
    index 12c53d05a902..4d4a24e00012 100644
    --- a/arch/x86/kvm/vmx/vmx.h
    +++ b/arch/x86/kvm/vmx/vmx.h
    @@ -541,6 +541,6 @@ static inline bool vmx_guest_state_valid(struct kvm_vcpu *vcpu)
    return is_unrestricted_guest(vcpu) || __vmx_guest_state_valid(vcpu);
    }

    -void dump_vmcs(void);
    +void dump_vmcs(struct kvm_vcpu *vcpu);

    #endif /* __KVM_X86_VMX_H */
    --
    2.30.0
    \
     
     \ /
      Last update: 2021-02-24 16:11    [W:4.306 / U:0.368 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site