X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_handler.c;h=d1123b6f9b3dba28c0e75aa6d52727ae5d8fac2e;hb=1ca13097c7c85318c400c3811ccbb54ac6c619f1;hp=23efbc6c4fa5fc6b3424541a4464464587c3879c;hpb=1cf6b8a334fd683681665c177d33ad6c452ad366;p=palacios.git diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c index 23efbc6..d1123b6 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -4,6 +4,7 @@ #include #include #include +#include extern struct vmm_os_hooks * os_hooks; @@ -24,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) { @@ -77,6 +70,21 @@ int handle_svm_exit(struct guest_info * info) { 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; @@ -92,10 +100,48 @@ int handle_svm_exit(struct guest_info * info) { 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; + guest_ctrl->EVENTINJ.excp_error_code = info->intr_state.excp_error_code; + 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 an 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;