X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_handler.c;h=5afadae0dbfd3dbbe90ad2a85be7b2565f773186;hb=5abf9894e3137a7ee0b704c121c1b1ec98860862;hp=9102c16bc1d13e886c80efa27de9adbcbd3f55b2;hpb=d4101540fb62c0459cacca0b3b8299e7ada91306;p=palacios-OLD.git diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c index 9102c16..5afadae 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -73,7 +73,12 @@ int v3_handle_svm_exit(struct guest_info * info) { if ((info->intr_state.irq_pending == 1) && (guest_ctrl->guest_ctrl.V_IRQ == 0)) { // Interrupt was taken in the guest - PrintDebug("Interrupt taken by guest\n"); +#ifdef DEBUG_INTERRUPTS + if ((info->intr_state.irq_vector == 238) || + (info->intr_state.irq_vector == 239)) { + PrintDebug("Interrupt %d taken by guest\n", info->intr_state.irq_vector); + } +#endif v3_injecting_intr(info, info->intr_state.irq_vector, EXTERNAL_IRQ); } @@ -363,14 +368,17 @@ int v3_handle_svm_exit(struct guest_info * info) { guest_ctrl->guest_ctrl.V_INTR_VECTOR = irq; 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 ((irq == 238) || (irq == 239)) { + 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; - break; } @@ -386,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 } @@ -394,9 +402,11 @@ 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 v3_injecting_intr(info, excp, EXCEPTION); break; @@ -414,12 +424,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;