X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_handler.c;h=85b70f0bcadf1fbcba83dc769332c5e6daa57228;hb=bc7e32ac62565b9f2aca07acdfa430aa3d444e8c;hp=4d5ce3e46e2684ccc5ae606cf44e36b137290b4b;hpb=0b276ccfe1caf79b6c2752bf26d0e9933e52fb32;p=palacios.git diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c index 4d5ce3e..85b70f0 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -71,12 +71,18 @@ int v3_handle_svm_exit(struct guest_info * info) { exit_code = guest_ctrl->exit_code; - if ((info->intr_state.irq_pending) && (guest_ctrl->guest_ctrl.V_IRQ = 0)) { + if ((info->intr_state.irq_pending == 1) && (guest_ctrl->guest_ctrl.V_IRQ == 0)) { // Interrupt was taken in the guest +#ifdef DEBUG_INTERRUPTS + if ((info->intr_state.irq_vector == 238) || + (info->intr_state.irq_vector == 238)) { + PrintDebug("Interrupt taken by guest\n"); + } +#endif v3_injecting_intr(info, info->intr_state.irq_vector, EXTERNAL_IRQ); - info->intr_state.irq_pending = 0; } + info->intr_state.irq_pending = 0; // Disable printing io exits due to bochs debug messages @@ -363,9 +369,12 @@ int v3_handle_svm_exit(struct guest_info * info) { guest_ctrl->guest_ctrl.V_IGN_TPR = 1; guest_ctrl->guest_ctrl.V_INTR_PRIO = 0xf; #ifdef DEBUG_INTERRUPTS - PrintDebug("Injecting Interrupt %d (EIP=%p)\n", - guest_ctrl->guest_ctrl.V_INTR_VECTOR, - (void *)(addr_t)info->rip); + if ((guest_ctrl->guest_ctrl.V_INTR_VECTOR == 238) || + (guest_ctrl->guest_ctrl.V_INTR_VECTOR == 238)) { + PrintDebug("Injecting Interrupt %d (EIP=%p)\n", + guest_ctrl->guest_ctrl.V_INTR_VECTOR, + (void *)(addr_t)info->rip); + } #endif info->intr_state.irq_pending = 1; info->intr_state.irq_vector = irq; @@ -385,7 +394,7 @@ int v3_handle_svm_exit(struct guest_info * info) { guest_ctrl->EVENTINJ.error_code = info->intr_state.excp_error_code; guest_ctrl->EVENTINJ.ev = 1; #ifdef DEBUG_INTERRUPTS - PrintDebug("Injecting error code %x\n", guest_ctrl->EVENTINJ.error_code); + // PrintDebug("Injecting exception %d with error code %x\n", excp, guest_ctrl->EVENTINJ.error_code); #endif } @@ -393,7 +402,7 @@ int v3_handle_svm_exit(struct guest_info * info) { guest_ctrl->EVENTINJ.valid = 1; #ifdef DEBUG_INTERRUPTS - PrintDebug("Injecting Interrupt %d (EIP=%p)\n", + PrintDebug("Injecting Exception %d (EIP=%p)\n", guest_ctrl->EVENTINJ.vector, (void *)(addr_t)info->rip); #endif @@ -413,12 +422,9 @@ int v3_handle_svm_exit(struct guest_info * info) { return -1; } - } else { -#ifdef DEBUG_INTERRUPTS - PrintDebug("No interrupts/exceptions pending\n"); -#endif } - + + guest_state->cr0 = info->ctrl_regs.cr0; guest_state->cr2 = info->ctrl_regs.cr2; guest_state->cr3 = info->ctrl_regs.cr3;