# 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 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);