[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] vmx: Better tracing in vmcs_dump_vcpu() -- grab RIP/RSP/RFLAGS from



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1196289393 0
# Node ID e10eacec8b919b4fea0d16b6dadb61bde1e9734a
# Parent  0b9048f7f257c95e7df9b84ffda2f9ec1dd83185
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 <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/hvm/vmx/vmcs.c        |   25 +++++++++++++++++--------
 xen/arch/x86/hvm/vmx/vmx.c         |    7 ++++---
 xen/include/asm-x86/hvm/vmx/vmcs.h |    2 +-
 3 files changed, 22 insertions(+), 12 deletions(-)

diff -r 0b9048f7f257 -r e10eacec8b91 xen/arch/x86/hvm/vmx/vmcs.c
--- a/xen/arch/x86/hvm/vmx/vmcs.c       Wed Nov 28 22:09:19 2007 +0000
+++ b/xen/arch/x86/hvm/vmx/vmcs.c       Wed Nov 28 22:36:33 2007 +0000
@@ -819,9 +819,15 @@ static unsigned long vmr(unsigned long f
     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",
@@ -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 -r 0b9048f7f257 -r e10eacec8b91 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Wed Nov 28 22:09:19 2007 +0000
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Wed Nov 28 22:36:33 2007 +0000
@@ -2722,6 +2722,7 @@ static void vmx_failed_vmentry(unsigned 
 {
     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 
         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 
     }
 
     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 -r 0b9048f7f257 -r e10eacec8b91 xen/include/asm-x86/hvm/vmx/vmcs.h
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h        Wed Nov 28 22:09:19 2007 +0000
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h        Wed Nov 28 22:36:33 2007 +0000
@@ -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);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.