X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_handler.c;h=46b4fa2e2f927dede49a70ec26e7eaaaf81dd5c0;hb=d0be182a2424036db4bc179bc512ea7e5b0bd62f;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..46b4fa2 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -1,7 +1,10 @@ #include #include +#include +#include #include #include +#include extern struct vmm_os_hooks * os_hooks; @@ -22,21 +25,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 +56,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,10 +64,82 @@ 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); + } // Update the low level state + + if (intr_pending(&(info->intr_state))) { + guest_ctrl->EVENTINJ.vector = get_intr_number(&(info->intr_state)); + guest_ctrl->EVENTINJ.valid = 1; + + switch (get_intr_type(&(info->intr_state))) { + case EXTERNAL_IRQ: + guest_ctrl->EVENTINJ.type = SVM_INJECTION_EXTERNAL_INTR; + break; + case NMI: + guest_ctrl->EVENTINJ.type = SVM_INJECTION_NMI; + break; + case EXCEPTION: + guest_ctrl->EVENTINJ.type = SVM_INJECTION_EXCEPTION; + break; + case SOFTWARE: + guest_ctrl->EVENTINJ.type = SVM_INJECTION_SOFT_INTR; + break; + case VIRTUAL: + guest_ctrl->EVENTINJ.type = SVM_INJECTION_VIRTUAL_INTR; + break; + + case INVALID_INTR: + default: + PrintDebug("Attempted to issue and invalid interrupt\n"); + return -1; + } + + // IMPORTANT TODO + // We need to figure out stack parameters.... + // EVENTINJ.error_code + + } + guest_state->rax = info->vm_regs.rax; guest_state->rip = info->rip; guest_state->rsp = info->vm_regs.rsp;