From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Lalancette Subject: Re: [PATCH] Print Guest VMCS state on vmexit failure Date: Tue, 20 Oct 2009 10:01:26 +0200 Message-ID: <4ADD6E56.5020007@redhat.com> References: <1256025045-4972-1-git-send-email-clalance@redhat.com> <20091020075746.GI29477@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org To: Gleb Natapov Return-path: Received: from mx1.redhat.com ([209.132.183.28]:32035 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751035AbZJTIBY (ORCPT ); Tue, 20 Oct 2009 04:01:24 -0400 Received: from int-mx03.intmail.prod.int.phx2.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n9K81Ssk029483 for ; Tue, 20 Oct 2009 04:01:29 -0400 In-Reply-To: <20091020075746.GI29477@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: Gleb Natapov wrote: > On Tue, Oct 20, 2009 at 09:50:45AM +0200, Chris Lalancette wrote: >> If we fail to handle a VMEXIT for some reason, print out a lot >> more debugging information about the state of the GUEST VMCS >> area. This does not fix a bug, but helps a lot when trying to >> track down the cause of a VMEXIT/VMENTRY failure. >> >> Signed-off-by: Chris Lalancette >> --- >> arch/x86/kvm/vmx.c | 38 ++++++++++++++++++++++++++++++++++++++ >> 1 files changed, 38 insertions(+), 0 deletions(-) >> >> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c >> index 311afd4..37b1682 100644 >> --- a/arch/x86/kvm/vmx.c >> +++ b/arch/x86/kvm/vmx.c >> @@ -3452,6 +3452,14 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = { >> static const int kvm_vmx_max_exit_handlers = >> ARRAY_SIZE(kvm_vmx_exit_handlers); >> >> +#define PRINT_GUEST_SEGMENT(seg) do { \ >> + printk(KERN_DEBUG #seg ": SELECTOR 0x%lx, BASE 0x%lx, LIMIT 0x%lx, AR 0x%lx\n", \ >> + vmcs_readl(GUEST_##seg##_SELECTOR), \ >> + vmcs_readl(GUEST_##seg##_BASE), \ >> + vmcs_readl(GUEST_##seg##_LIMIT), \ >> + vmcs_readl(GUEST_##seg##_AR_BYTES)); \ >> + while(0) >> + >> /* >> * The guest has exited. See if we can fix it or if we need userspace >> * assistance. >> @@ -3512,6 +3520,36 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu) >> else { >> vcpu->run->exit_reason = KVM_EXIT_UNKNOWN; >> vcpu->run->hw.hardware_exit_reason = exit_reason; >> + >> + printk(KERN_DEBUG "GUEST STATE:\n"); >> + printk(KERN_DEBUG "CR0: 0x%lx\n", vmcs_readl(GUEST_CR0)); >> + printk(KERN_DEBUG "CR3: 0x%lx\n", vmcs_readl(GUEST_CR3)); >> + printk(KERN_DEBUG "CR4: 0x%lx\n", vmcs_readl(GUEST_CR4)); >> + printk(KERN_DEBUG "VMENTRY CONTROL: 0x%lx\n", >> + vmcs_readl(VM_ENTRY_CONTROLS)); >> + printk(KERN_DEBUG "DR7: 0x%lx\n", vmcs_readl(GUEST_DR7)); >> + printk(KERN_DEBUG "SYSENTER ESP: 0x%lx\n", >> + vmcs_readl(GUEST_SYSENTER_ESP)); >> + printk(KERN_DEBUG "SYSENTER EIP: 0x%lx\n", >> + vmcs_readl(GUEST_SYSENTER_EIP)); >> + >> + PRINT_GUEST_SEGMENT(CS); >> + PRINT_GUEST_SEGMENT(SS); >> + PRINT_GUEST_SEGMENT(DS); >> + PRINT_GUEST_SEGMENT(ES); >> + PRINT_GUEST_SEGMENT(FS); >> + PRINT_GUEST_SEGMENT(GS); >> + PRINT_GUEST_SEGMENT(TR); >> + PRINT_GUEST_SEGMENT(LDTR); >> + >> + printk(KERN_DEBUG "GDTR: BASE 0x%lx, LIMIT 0x%lx", >> + vmcs_readl(GUEST_GDTR_BASE), >> + vmcs_readl(GUEST_GDTR_LIMIT)); >> + printk(KERN_DEBUG "IDTR: BASE 0x%lx, LIMIT 0x%lx", >> + vmcs_readl(GUEST_IDTR_BASE), >> + vmcs_readl(GUEST_IDTR_LIMIT)); >> + printk(KERN_DEBUG "RIP: 0x%lx\n",vmcs_readl(GUEST_RIP)); >> + printk(KERN_DEBUG "RFLAGS: 0x%lx\n",vmcs_readl(GUEST_RFLAGS)); >> } >> return 0; > Move this to separate function may be? vmx_handle_exit() will be hard > to read with this blob in the middle. The blob is at the end, so I don't think it is terrible, but I see what you mean. I'm happy to move it to a function; I'll repost with that change after seeing if there are other comments. Thanks, -- Chris Lalancette