X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_handler.c;fp=palacios%2Fsrc%2Fpalacios%2Fsvm_handler.c;h=1e96118e8c7c277e794d94a1cf0577373eaee6ef;hp=5b0b7619d11fbf3ed934916771de86d5ade37760;hb=6d57b915c82345c4dfb1897209f4778b4548bc31;hpb=18cc68af5caa15264a853167e9d2d885cb79317a diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c index 5b0b761..1e96118 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -77,17 +77,27 @@ int v3_handle_svm_exit(struct guest_info * info) { 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 - } } @@ -384,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