X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_handler.c;h=3808ac2fca26cc803ea8734a5111842a323f6e19;hb=6ce5a308d167ac392c0f0ca66811f51580358191;hp=5b0b7619d11fbf3ed934916771de86d5ade37760;hpb=18cc68af5caa15264a853167e9d2d885cb79317a;p=palacios.releases.git diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c index 5b0b761..3808ac2 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -63,7 +63,7 @@ int v3_handle_svm_exit(struct guest_info * info) { info->ctrl_regs.rflags = guest_state->rflags; info->ctrl_regs.efer = guest_state->efer; - get_vmcb_segments((vmcb_t*)(info->vmm_data), &(info->segments)); + v3_get_vmcb_segments((vmcb_t*)(info->vmm_data), &(info->segments)); info->cpu_mode = v3_get_vm_cpu_mode(info); info->mem_mode = v3_get_vm_mem_mode(info); @@ -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 @@ -456,7 +466,7 @@ int v3_handle_svm_exit(struct guest_info * info) { guest_state->rsp = info->vm_regs.rsp; - set_vmcb_segments((vmcb_t*)(info->vmm_data), &(info->segments)); + v3_set_vmcb_segments((vmcb_t*)(info->vmm_data), &(info->segments)); if (exit_code == VMEXIT_INTR) { //PrintDebug("INTR ret IP = %x\n", guest_state->rip);