X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fgeekos%2Fsvm_handler.c;h=6624da63cf6a6655e5ab2c28144e797588ae1d3b;hb=959ed075fac59969a8dc299e51824166f50bb2d0;hp=ea2a7b874feeec6420aaf4cc1eb2d80344549be5;hpb=158640d601f6c710cfce7bc4a6bd8f7e7847b7a3;p=palacios.git diff --git a/palacios/src/geekos/svm_handler.c b/palacios/src/geekos/svm_handler.c index ea2a7b8..6624da6 100644 --- a/palacios/src/geekos/svm_handler.c +++ b/palacios/src/geekos/svm_handler.c @@ -1,10 +1,11 @@ #include #include +#include +extern struct vmm_os_hooks * os_hooks; - -int handle_svm_exit(guest_info_t * info) { +int handle_svm_exit(struct guest_info * info) { vmcb_ctrl_t * guest_ctrl = 0; vmcb_saved_state_t * guest_state = 0; ulong_t exit_code = 0; @@ -12,13 +13,22 @@ int handle_svm_exit(guest_info_t * info) { guest_ctrl = GET_VMCB_CTRL_AREA((vmcb_t*)(info->vmm_data)); guest_state = GET_VMCB_SAVE_STATE_AREA((vmcb_t*)(info->vmm_data)); - PrintDebug("SVM Returned: (Exit Code=%x) (VMCB=%x)\n",&(guest_ctrl->exit_code), info->vmm_data); + + // Update the high level state + info->rip = guest_state->rip; + info->vm_regs.rsp = guest_state->rsp; + info->vm_regs.rax = guest_state->rax; + info->vm_regs.rsp = guest_state->rsp; + + + PrintDebug("SVM Returned: (Exit Code=%x) (VMCB=%x)\n", &(guest_ctrl->exit_code), info->vmm_data); PrintDebug("RIP: %x\n", guest_state->rip); - + + exit_code = guest_ctrl->exit_code; - // PrintDebugVMCB((vmcb_t*)(info->vmm_data)); + // 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)); @@ -27,16 +37,37 @@ int handle_svm_exit(guest_info_t * info) { 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); + + } 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; + + } else if (( (exit_code == VMEXIT_CR3_READ) || + (exit_code == VMEXIT_CR3_WRITE) || + (exit_code == VMEXIT_INVLPG) || + (exit_code == VMEXIT_INVLPGA) || + (exit_code == VMEXIT_EXCP14)) && + (info->page_mode == SHADOW_PAGING)) { + handle_shadow_paging(info); } + // Update the low level state + guest_state->rax = info->vm_regs.rax; + guest_state->rip = info->rip; + guest_state->rsp = info->vm_regs.rsp; + return 0; } // This should package up an IO request and call vmm_handle_io -int handle_svm_io(guest_info_t * info) { +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)); @@ -57,3 +88,18 @@ int handle_svm_io(guest_info_t * info) { return 0; } + + +int handle_shadow_paging(struct guest_info * info) { + vmcb_ctrl_t * guest_ctrl = 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)); + + if (guest_ctrl->exit_code == VMEXIT_CR3_READ) { + + } + + return 0; +} + + +