X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fsvm_handler.c;h=e35179b4465fd779249091655aeaf235ae3e45e9;hb=29dcf8d7134d5c8fe56ec1f3ffaaa37192ce6fb8;hp=6cd7afe55f6a4e6a20b4a3d11358b0b2f36ba138;hpb=b85f79b8030114370851ed3422c078debe630570;p=palacios.git diff --git a/palacios/src/geekos/svm_handler.c b/palacios/src/geekos/svm_handler.c index 6cd7afe..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; @@ -36,10 +37,24 @@ int handle_svm_exit(struct guest_info * info) { 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); - + 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"); @@ -67,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));