X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvm_guest.c;h=e9ff5f7178761c8be57dfaf89667f00405a08457;hb=0b9cb865c52bc2b6e0a5637d1e1a3cb340ce50f8;hp=5d01aa93eb564190d022ece93eb319c912806474;hpb=07a12ade201ee7c2fe2358084ca079d2facac500;p=palacios.git diff --git a/palacios/src/palacios/vm_guest.c b/palacios/src/palacios/vm_guest.c index 5d01aa9..e9ff5f7 100644 --- a/palacios/src/palacios/vm_guest.c +++ b/palacios/src/palacios/vm_guest.c @@ -29,6 +29,7 @@ #include #include #include +#include v3_cpu_mode_t v3_get_vm_cpu_mode(struct guest_info * info) { @@ -257,6 +258,55 @@ void v3_print_ctrl_regs(struct guest_info * info) { } +static int safe_gva_to_hva(struct guest_info * info, addr_t linear_addr, addr_t * host_addr) { + /* select the proper translation based on guest mode */ + if (info->mem_mode == PHYSICAL_MEM) { + if (v3_gpa_to_hva(info, linear_addr, host_addr) == -1) return -1; + } else if (info->mem_mode == VIRTUAL_MEM) { + if (v3_gva_to_hva(info, linear_addr, host_addr) == -1) return -1; + } + return 0; +} + +static int v3_print_disassembly(struct guest_info * info) { + int passed_rip = 0; + addr_t rip, rip_linear, rip_host; + + /* we don't know where the instructions preceding RIP start, so we just take + * a guess and hope the instruction stream synced up with our disassembly + * some time before RIP; if it has not we correct RIP at that point + */ + + /* start disassembly 64 bytes before current RIP, continue 32 bytes after */ + rip = (addr_t) info->rip - 64; + while ((int) (rip - info->rip) < 32) { + /* always print RIP, even if the instructions before were bad */ + if (!passed_rip && rip >= info->rip) { + if (rip != info->rip) { + V3_Print("***** bad disassembly up to this point *****\n"); + rip = info->rip; + } + passed_rip = 1; + } + + /* look up host virtual address for this instruction */ + rip_linear = get_addr_linear(info, rip, &(info->segments.cs)); + if (safe_gva_to_hva(info, rip_linear, &rip_host) < 0) { + rip++; + continue; + } + + /* print disassembled instrcution (updates rip) */ + if (v3_disasm(info, (void *) rip_host, &rip, rip == info->rip) < 0) { + rip++; + continue; + } + } + + return 0; +} + + void v3_print_guest_state(struct guest_info * info) { addr_t linear_addr = 0; @@ -281,6 +331,8 @@ void v3_print_guest_state(struct guest_info * info) { v3_print_mem_map(info->vm_info); v3_print_stack(info); + + v3_print_disassembly(info); } @@ -367,6 +419,7 @@ static int info_hcall(struct guest_info * core, uint_t hcall_id, void * priv_dat v3_cpu_arch_t cpu_type = v3_get_cpu_type(V3_Get_CPU()); int cpu_valid = 0; + V3_Print("************** Guest State ************\n"); v3_print_guest_state(core); // init SVM/VMX