# HG changeset patch
# User cegger
# Date 1351254394 -7200
svm debug methods

diff -r 6f9e46917eb8 -r 85e28b8f038f xen/arch/x86/hvm/svm/svmdebug.c
--- a/xen/arch/x86/hvm/svm/svmdebug.c
+++ b/xen/arch/x86/hvm/svm/svmdebug.c
@@ -28,6 +28,48 @@ static void svm_dump_sel(const char *nam
            (unsigned long long)s->base);
 }
 
+void svm_dump_instr(const char *from, uint64_t rip)
+{
+    enum hvm_copy_result rc;
+    uint8_t instrbuf[15];
+    size_t i, len;
+
+    len = PAGE_SIZE - (rip & ~PAGE_MASK);
+    if (len > sizeof(instrbuf))
+        len = sizeof(instrbuf);
+
+    rc = hvm_fetch_from_guest_virt(instrbuf, rip, len, 0);
+
+    switch (rc) {
+    case HVMCOPY_unhandleable:
+        printk("%s: can't fetch instruction bytes from rip (unhandleable)\n",
+            from);
+        break;
+    case HVMCOPY_bad_gva_to_gfn:
+        printk("%s: can't fetch instruction bytes from rip (bad_gva_to_gfn)\n",
+            from);
+        break;
+    case HVMCOPY_bad_gfn_to_mfn:
+        printk("%s: can't fetch instruction bytes from rip (bad_gfn_to_mfn)\n",
+            from);
+        break;
+    case HVMCOPY_gfn_paged_out:
+        printk("%s: can't fetch instruction bytes from rip (gfn_paged_out)\n",
+            from);
+        break;
+    case HVMCOPY_gfn_shared:
+        printk("%s: can't fetch instruction bytes from rip (gfn_shared)\n",
+            from);
+        break;
+    case HVMCOPY_okay:
+        printk("%s: instruction bytes @rip ", from);
+        for (i = 0; i < len; i++)
+            printk("%#2x ", instrbuf[i]);
+        printk("\n");
+        break;
+    }
+}
+
 /* This function can directly access fields which are covered by clean bits. */
 void svm_vmcb_dump(const char *from, struct vmcb_struct *vmcb)
 {
diff -r 6f9e46917eb8 -r 85e28b8f038f xen/include/asm-x86/hvm/svm/svmdebug.h
--- a/xen/include/asm-x86/hvm/svm/svmdebug.h
+++ b/xen/include/asm-x86/hvm/svm/svmdebug.h
@@ -24,6 +24,8 @@
 #include <asm/hvm/svm/vmcb.h>
 
 void svm_vmcb_dump(const char *from, struct vmcb_struct *vmcb);
+void svm_instr_dump(const char *from, uint64_t rip);
+
 bool_t svm_vmcb_isvalid(const char *from, struct vmcb_struct *vmcb,
                         bool_t verbose);