X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fsvm_handler.c;h=e35179b4465fd779249091655aeaf235ae3e45e9;hb=c7e3f043b6458083162e23e1a8adb7703fd06559;hp=6624da63cf6a6655e5ab2c28144e797588ae1d3b;hpb=959ed075fac59969a8dc299e51824166f50bb2d0;p=palacios.git diff --git a/palacios/src/geekos/svm_handler.c b/palacios/src/geekos/svm_handler.c index 6624da6..e35179b 100644 --- a/palacios/src/geekos/svm_handler.c +++ b/palacios/src/geekos/svm_handler.c @@ -1,6 +1,7 @@ #include #include #include +#include extern struct vmm_os_hooks * os_hooks; @@ -21,7 +22,7 @@ int handle_svm_exit(struct guest_info * info) { info->vm_regs.rsp = guest_state->rsp; - PrintDebug("SVM Returned: (Exit Code=%x) (VMCB=%x)\n", &(guest_ctrl->exit_code), info->vmm_data); + PrintDebug("SVM Returned:(VMCB=%x)\n", info->vmm_data); PrintDebug("RIP: %x\n", guest_state->rip); @@ -30,21 +31,36 @@ int handle_svm_exit(struct guest_info * info) { // 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) { - handle_svm_io(info); + + if (exit_code == VMEXIT_IOIO) { + struct svm_io_info * io_info = (struct svm_io_info *)&(guest_ctrl->exit_info1); + + if (io_info->type == 0) { + if (io_info->str) { + handle_svm_io_outs(info); + } else { + handle_svm_io_out(info); + } + } else { + if (io_info->str) { + handle_svm_io_ins(info); + } else { + handle_svm_io_in(info); + } + } } else if (exit_code == VMEXIT_CR0_WRITE) { PrintDebug("CR0 Write\n"); - ullong_t new_cr0 = 0; - - handle_cr0_write(info, &new_cr0); - guest_state->cr0 = new_cr0; + if (handle_cr0_write(info) == -1) { + return -1; + } } else if (( (exit_code == VMEXIT_CR3_READ) || (exit_code == VMEXIT_CR3_WRITE) || @@ -66,29 +82,6 @@ int handle_svm_exit(struct guest_info * info) { -// This should package up an IO request and call vmm_handle_io -int handle_svm_io(struct guest_info * info) { - vmcb_ctrl_t * ctrl_area = GET_VMCB_CTRL_AREA((vmcb_t *)(info->vmm_data)); - vmcb_saved_state_t * guest_state = GET_VMCB_SAVE_STATE_AREA((vmcb_t*)(info->vmm_data)); - - PrintDebug("Ctrl Area=%x\n", ctrl_area); - - // struct svm_io_info * io_info = (struct svm_io_info *)&(ctrl_area->exit_info1); - - - - // PrintDebugVMCB((vmcb_t*)(info->vmm_data)); - - guest_state->rip = ctrl_area->exit_info2; - - - - - // PrintDebug("Exit On Port %d\n", io_info->port); - - return 0; -} - int handle_shadow_paging(struct guest_info * info) { vmcb_ctrl_t * guest_ctrl = GET_VMCB_CTRL_AREA((vmcb_t*)(info->vmm_data));