From: Keir Fraser Date: Wed, 28 Nov 2007 22:36:33 +0000 (+0000) Subject: vmx: Better tracing in vmcs_dump_vcpu() -- grab RIP/RSP/RFLAGS from X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14684^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=e29c63f1fe4ffe63cfb62e457c8b75f56b933aaa;p=xen.git vmx: Better tracing in vmcs_dump_vcpu() -- grab RIP/RSP/RFLAGS from cpu_user_regs structure as well as VMCS. Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c index 3a184c55ba..1cb1746516 100644 --- a/xen/arch/x86/hvm/vmx/vmcs.c +++ b/xen/arch/x86/hvm/vmx/vmcs.c @@ -819,10 +819,16 @@ static unsigned long vmr(unsigned long field) return rc ? 0 : val; } -void vmcs_dump_vcpu(void) +void vmcs_dump_vcpu(struct vcpu *v) { + struct cpu_user_regs *regs = &v->arch.guest_context.user_regs; unsigned long long x; + if ( v == current ) + regs = guest_cpu_user_regs(); + + vmx_vmcs_enter(v); + printk("*** Guest State ***\n"); printk("CR0: actual=0x%016llx, shadow=0x%016llx, gh_mask=%016llx\n", (unsigned long long)vmr(GUEST_CR0), @@ -841,11 +847,14 @@ void vmcs_dump_vcpu(void) printk(" target2=%016llx, target3=%016llx\n", (unsigned long long)vmr(CR3_TARGET_VALUE2), (unsigned long long)vmr(CR3_TARGET_VALUE3)); - printk("RSP = 0x%016llx RIP = 0x%016llx\n", + printk("RSP = 0x%016llx (0x%016llx) RIP = 0x%016llx (0x%016llx)\n", (unsigned long long)vmr(GUEST_RSP), - (unsigned long long)vmr(GUEST_RIP)); - printk("RFLAGS=0x%016llx DR7 = 0x%016llx\n", + (unsigned long long)regs->esp, + (unsigned long long)vmr(GUEST_RIP), + (unsigned long long)regs->eip); + printk("RFLAGS=0x%016llx (0x%016llx) DR7 = 0x%016llx\n", (unsigned long long)vmr(GUEST_RFLAGS), + (unsigned long long)regs->eflags, (unsigned long long)vmr(GUEST_DR7)); printk("Sysenter RSP=%016llx CS:RIP=%04x:%016llx\n", (unsigned long long)vmr(GUEST_SYSENTER_ESP), @@ -926,6 +935,8 @@ void vmcs_dump_vcpu(void) (uint32_t)vmr(IDT_VECTORING_ERROR_CODE)); printk("TPR Threshold = 0x%02x\n", (uint32_t)vmr(TPR_THRESHOLD)); + + vmx_vmcs_exit(v); } static void vmcs_dump(unsigned char ch) @@ -945,9 +956,7 @@ static void vmcs_dump(unsigned char ch) for_each_vcpu ( d, v ) { printk("\tVCPU %d\n", v->vcpu_id); - vmx_vmcs_enter(v); - vmcs_dump_vcpu(); - vmx_vmcs_exit(v); + vmcs_dump_vcpu(v); } } diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index fd61b48823..667b59f964 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2722,6 +2722,7 @@ static void vmx_failed_vmentry(unsigned int exit_reason, { unsigned int failed_vmentry_reason = (uint16_t)exit_reason; unsigned long exit_qualification = __vmread(EXIT_QUALIFICATION); + struct vcpu *curr = current; printk("Failed vm entry (exit reason 0x%x) ", exit_reason); switch ( failed_vmentry_reason ) @@ -2734,7 +2735,7 @@ static void vmx_failed_vmentry(unsigned int exit_reason, break; case EXIT_REASON_MACHINE_CHECK: printk("caused by machine check.\n"); - HVMTRACE_0D(MCE, current); + HVMTRACE_0D(MCE, curr); do_machine_check(regs); break; default: @@ -2743,10 +2744,10 @@ static void vmx_failed_vmentry(unsigned int exit_reason, } printk("************* VMCS Area **************\n"); - vmcs_dump_vcpu(); + vmcs_dump_vcpu(curr); printk("**************************************\n"); - domain_crash(current->domain); + domain_crash(curr->domain); } asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs) diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h b/xen/include/asm-x86/hvm/vmx/vmcs.h index 68d1819d32..47ef3a9da7 100644 --- a/xen/include/asm-x86/hvm/vmx/vmcs.h +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h @@ -28,7 +28,7 @@ #endif extern void start_vmx(void); -extern void vmcs_dump_vcpu(void); +extern void vmcs_dump_vcpu(struct vcpu *v); extern void setup_vmcs_dump(void); extern int vmx_cpu_up(void); extern void vmx_cpu_down(void);