X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_handler.c;h=1e96118e8c7c277e794d94a1cf0577373eaee6ef;hb=c0a5974089157e1a5ea18ea443fab587c577296a;hp=5535a6fb095c9074148302de8945ba05dafd8dbe;hpb=78818a71a31b4cbe264c1292f7bcbdbfd2ceb544;p=palacios.git diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c index 5535a6f..1e96118 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -71,22 +71,33 @@ int v3_handle_svm_exit(struct guest_info * info) { exit_code = guest_ctrl->exit_code; - // PrintDebug("SVM Exit: %s (rip=%p)\n", vmexit_code_to_str(exit_code), (void *)info->rip); + // PrintDebug("SVM Exit: %s (rip=%p) (info1=%p)\n", vmexit_code_to_str(exit_code), + // (void *)(addr_t)info->rip, (void *)(addr_t)guest_ctrl->exit_info1); if ((info->intr_state.irq_pending == 1) && (guest_ctrl->guest_ctrl.V_IRQ == 0)) { #ifdef DEBUG_INTERRUPTS + PrintDebug("INTAK cycle completed for irq %d\n", info->intr_state.irq_vector); +#endif + + info->intr_state.irq_started = 1; + info->intr_state.irq_pending = 0; + + v3_injecting_intr(info, info->intr_state.irq_vector, EXTERNAL_IRQ); + } + + if ((info->intr_state.irq_started == 1) && (guest_ctrl->exit_int_info.valid == 0)) { +#ifdef DEBUG_INTERRUPTS PrintDebug("Interrupt %d taken by guest\n", info->intr_state.irq_vector); #endif - if (!guest_ctrl->exit_int_info.valid) { - info->intr_state.irq_pending = 0; - // PrintDebug("Injected Interrupt %d\n", info->intr_state.irq_vector); - v3_injecting_intr(info, info->intr_state.irq_vector, EXTERNAL_IRQ); - } else { + + // Interrupt was taken fully vectored + info->intr_state.irq_started = 0; + + } else { #ifdef DEBUG_INTERRUPTS - PrintDebug("EXIT INT INFO is set (vec=%d)\n", guest_ctrl->exit_int_info.vector); + PrintDebug("EXIT INT INFO is set (vec=%d)\n", guest_ctrl->exit_int_info.vector); #endif - } } @@ -360,7 +371,7 @@ int v3_handle_svm_exit(struct guest_info * info) { } - // Update the low level state + if (v3_excp_pending(info)) { uint_t excp = v3_get_excp_number(info); @@ -383,7 +394,7 @@ int v3_handle_svm_exit(struct guest_info * info) { (void *)(addr_t)info->rip); #endif v3_injecting_excp(info, excp); - } else if (info->intr_state.irq_pending == 1) { + } else if (info->intr_state.irq_started == 1) { #ifdef DEBUG_INTERRUPTS PrintDebug("IRQ pending from previous injection\n"); #endif