X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_handler.c;h=15e320f4dcfcca5ec1999d8186919b4461fcc338;hb=40be15894eccfbb51e42bcfe550aaf8d9841bc3a;hp=fed7b79a7bcdb39a80149ee3c751c0d2db66a4bd;hpb=a109eb919a162bd7de58d62020801bc2e633be50;p=palacios.git diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c index fed7b79..15e320f 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -1,5 +1,7 @@ #include #include +#include +#include #include #include @@ -22,21 +24,13 @@ int handle_svm_exit(struct guest_info * info) { info->vm_regs.rsp = guest_state->rsp; - PrintDebug("SVM Returned:(VMCB=%x)\n", info->vmm_data); - PrintDebug("RIP: %x\n", guest_state->rip); + exit_code = guest_ctrl->exit_code; // PrintDebugVMCB((vmcb_t*)(info->vmm_data)); - PrintDebug("SVM Returned: Exit Code: %x\n",exit_code); - - PrintDebug("io_info1 low = 0x%.8x\n", *(uint_t*)&(guest_ctrl->exit_info1)); - PrintDebug("io_info1 high = 0x%.8x\n", *(uint_t *)(((uchar_t *)&(guest_ctrl->exit_info1)) + 4)); - - PrintDebug("io_info2 low = 0x%.8x\n", *(uint_t*)&(guest_ctrl->exit_info2)); - PrintDebug("io_info2 high = 0x%.8x\n", *(uint_t *)(((uchar_t *)&(guest_ctrl->exit_info2)) + 4)); if (exit_code == VMEXIT_IOIO) { @@ -61,7 +55,7 @@ int handle_svm_exit(struct guest_info * info) { if (handle_cr0_write(info) == -1) { return -1; } - + /* } else if (( (exit_code == VMEXIT_CR3_READ) || (exit_code == VMEXIT_CR3_WRITE) || (exit_code == VMEXIT_INVLPG) || @@ -69,6 +63,44 @@ int handle_svm_exit(struct guest_info * info) { (exit_code == VMEXIT_EXCP14)) && (info->page_mode == SHADOW_PAGING)) { handle_shadow_paging(info); + */ + } else { + addr_t rip_addr = get_addr_linear(info, guest_state->rip, guest_state->cs.selector); + char buf[15]; + addr_t host_addr; + + + PrintDebug("SVM Returned:(VMCB=%x)\n", info->vmm_data); + PrintDebug("RIP: %x\n", guest_state->rip); + PrintDebug("RIP Linear: %x\n", rip_addr); + + PrintDebug("SVM Returned: Exit Code: %x\n",exit_code); + + PrintDebug("io_info1 low = 0x%.8x\n", *(uint_t*)&(guest_ctrl->exit_info1)); + PrintDebug("io_info1 high = 0x%.8x\n", *(uint_t *)(((uchar_t *)&(guest_ctrl->exit_info1)) + 4)); + + PrintDebug("io_info2 low = 0x%.8x\n", *(uint_t*)&(guest_ctrl->exit_info2)); + PrintDebug("io_info2 high = 0x%.8x\n", *(uint_t *)(((uchar_t *)&(guest_ctrl->exit_info2)) + 4)); + + + + if (guest_pa_to_host_pa(info, guest_state->rip, &host_addr) == -1) { + PrintDebug("Could not translate guest_state->rip to host address\n"); + return -1; + } + + PrintDebug("Host Address of rip = 0x%x\n", host_addr); + + memset(buf, 0, 15); + + PrintDebug("Reading from 0x%x in guest\n", rip_addr); + + read_guest_pa_memory(info, rip_addr, 15, buf); + + PrintTraceMemDump(buf, 15); + + while(1); + }