X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmx_handler.c;h=4066bf2b18a43c715dea822cf55c6d796a45d65b;hb=9e5edc5349bbd8d3e8e4f0dabe78e6543f32708a;hp=357f0d21ac29f7a72c80bfa91f962be08b501de1;hpb=b650a788fd1a43d34554af1acbabc41ad0323a19;p=palacios.git diff --git a/palacios/src/palacios/vmx_handler.c b/palacios/src/palacios/vmx_handler.c index 357f0d2..4066bf2 100644 --- a/palacios/src/palacios/vmx_handler.c +++ b/palacios/src/palacios/vmx_handler.c @@ -41,12 +41,27 @@ #include #endif +/* At this point the GPRs are already copied into the guest_info state */ +int v3_handle_atomic_vmx_exit(struct guest_info * info, struct vmx_exit_info * exit_info) { + struct vmx_data * vmx_info = (struct vmx_data *)(info->vmm_data); + switch (exit_info->exit_reason) { + case VMEXIT_INTR_WINDOW: + // This is here because we touch the VMCS + vmcs_read(VMCS_PROC_CTRLS, &(vmx_info->pri_proc_ctrls.value)); + vmx_info->pri_proc_ctrls.int_wndw_exit = 0; + vmcs_write(VMCS_PROC_CTRLS, vmx_info->pri_proc_ctrls.value); + +#ifdef CONFIG_DEBUG_INTERRUPTS + PrintDebug("Interrupts available again! (RIP=%llx)\n", info->rip); +#endif + break; + } + return 0; +} /* At this point the GPRs are already copied into the guest_info state */ int v3_handle_vmx_exit(struct guest_info * info, struct vmx_exit_info * exit_info) { - struct vmx_data * vmx_info = (struct vmx_data *)(info->vmm_data); - /* PrintError("Handling VMEXIT: %s (%u), %lu (0x%lx)\n", v3_vmx_exit_code_to_str(exit_info->exit_reason), @@ -221,15 +236,8 @@ int v3_handle_vmx_exit(struct guest_info * info, struct vmx_exit_info * exit_inf // Interrupts are handled outside switch break; case VMEXIT_INTR_WINDOW: - - vmcs_read(VMCS_PROC_CTRLS, &(vmx_info->pri_proc_ctrls.value)); - vmx_info->pri_proc_ctrls.int_wndw_exit = 0; - vmcs_write(VMCS_PROC_CTRLS, vmx_info->pri_proc_ctrls.value); - -#ifdef CONFIG_DEBUG_INTERRUPTS - PrintDebug("Interrupts available again! (RIP=%llx)\n", info->rip); -#endif - + // This is handled in the atomic part of the vmx code, + // not in the generic (interruptable) vmx handler break; default: PrintError("Unhandled VMEXIT: %s (%u), %lu (0x%lx)\n",