From: Jack Lange Date: Thu, 23 Jun 2011 02:09:31 +0000 (-0500) Subject: moved software interrupt injection to core interrupt code X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=66b396a1e89ad214c18ff9ebae9f803ab661aa46;p=palacios.releases.git moved software interrupt injection to core interrupt code --- diff --git a/palacios/include/interfaces/sw_intr.h b/palacios/include/interfaces/sw_intr.h index 5eedb3f..f09bfd0 100644 --- a/palacios/include/interfaces/sw_intr.h +++ b/palacios/include/interfaces/sw_intr.h @@ -25,7 +25,7 @@ int v3_handle_swintr (struct guest_info * core); -int v3_signal_swintr (struct guest_info * core, uint8_t vector); + int v3_hook_swintr (struct guest_info * core, uint8_t vector, int (*handler)(struct guest_info * core, uint8_t vector, void * priv_data), diff --git a/palacios/include/palacios/vmm_intr.h b/palacios/include/palacios/vmm_intr.h index 0ae7da1..adf2aa4 100644 --- a/palacios/include/palacios/vmm_intr.h +++ b/palacios/include/palacios/vmm_intr.h @@ -83,6 +83,8 @@ int v3_raise_irq(struct v3_vm_info * vm, int irq); int v3_lower_irq(struct v3_vm_info * vm, int irq); +int v3_raise_swintr(struct guest_info * core, uint8_t vector); + struct intr_ctrl_ops { int (*intr_pending)(struct guest_info * info, void * private_data); diff --git a/palacios/src/extensions/ext_sw_intr.c b/palacios/src/extensions/ext_sw_intr.c index 8264260..5fbb72f 100644 --- a/palacios/src/extensions/ext_sw_intr.c +++ b/palacios/src/extensions/ext_sw_intr.c @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -110,7 +111,7 @@ int v3_handle_swintr (struct guest_info * core) { hook = swintr_hooks[vector]; #else core->rip += instr.instr_length; - return v3_signal_swintr(core, vector); + return v3_raise_swintr(core, vector); #endif } @@ -124,19 +125,9 @@ int v3_handle_swintr (struct guest_info * core) { so that they finish in time for the next instruction... */ core->rip += instr.instr_length; - return v3_signal_swintr(core, vector); + return v3_raise_swintr(core, vector); } -int v3_signal_swintr (struct guest_info * core, uint8_t vector) { - struct v3_intr_core_state * intr_state = &(core->intr_core_state); - - PrintDebug("Signaling software interrupt in v3_signal_swintr()\n"); - PrintDebug("\tINT vector: %d\n", vector); - - intr_state->swintr_posted = 1; - intr_state->swintr_vector = vector; - return 0; -} int v3_hook_swintr (struct guest_info * core, diff --git a/palacios/src/extensions/ext_syscall_hijack.c b/palacios/src/extensions/ext_syscall_hijack.c index 59ea961..0bd0b08 100644 --- a/palacios/src/extensions/ext_syscall_hijack.c +++ b/palacios/src/extensions/ext_syscall_hijack.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -66,7 +67,7 @@ static int v3_syscall_handler (struct guest_info * core, uint8_t vector, void * } hook = syscall_hooks[syscall_nr]; #else - return v3_signal_swintr(core, vector); + return v3_raise_swintr(core, vector); #endif } diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index 824f7d2..bdb9862 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -424,20 +424,20 @@ static int update_irq_entry_state(struct guest_info * info) { guest_ctrl->EVENTINJ.type = SVM_INJECTION_NMI; break; case V3_SOFTWARE_INTR: - guest_ctrl->EVENTINJ.type = SVM_INJECTION_SOFT_INTR; -#ifdef V3_CONFIG_EXT_SW_INTERRUPTS -#ifdef V3_CONFIG_DEBUG_EXT_SW_INTERRUPTS - PrintDebug("Caught an injected software interrupt\n"); - PrintDebug("\ttype: %d, vector: %d\n", SVM_INJECTION_SOFT_INTR, info->intr_core_state.swintr_vector); + guest_ctrl->EVENTINJ.type = SVM_INJECTION_SOFT_INTR; + +#ifdef V3_CONFIG_DEBUG_INTERRUPTS + PrintDebug("Injecting software interrupt -- type: %d, vector: %d\n", + SVM_INJECTION_SOFT_INTR, info->intr_core_state.swintr_vector); #endif - guest_ctrl->EVENTINJ.vector = info->intr_core_state.swintr_vector; - guest_ctrl->EVENTINJ.valid = 1; + guest_ctrl->EVENTINJ.vector = info->intr_core_state.swintr_vector; + guest_ctrl->EVENTINJ.valid = 1; - /* reset swintr state */ - info->intr_core_state.swintr_posted = 0; - info->intr_core_state.swintr_vector = 0; -#endif - break; + /* reset swintr state */ + info->intr_core_state.swintr_posted = 0; + info->intr_core_state.swintr_vector = 0; + + break; case V3_VIRTUAL_IRQ: guest_ctrl->EVENTINJ.type = SVM_INJECTION_IRQ; break; diff --git a/palacios/src/palacios/vmm_intr.c b/palacios/src/palacios/vmm_intr.c index a30659f..9010a4c 100644 --- a/palacios/src/palacios/vmm_intr.c +++ b/palacios/src/palacios/vmm_intr.c @@ -239,6 +239,18 @@ int v3_deliver_irq(struct v3_vm_info * vm, struct v3_interrupt * intr) { +int v3_raise_swintr (struct guest_info * core, uint8_t vector) { + struct v3_intr_core_state * intr_state = &(core->intr_core_state); + + PrintDebug("Signaling software interrupt in v3_signal_swintr()\n"); + PrintDebug("\tINT vector: %d\n", vector); + + intr_state->swintr_posted = 1; + intr_state->swintr_vector = vector; + return 0; +} + + int v3_raise_virq(struct guest_info * info, int irq) { struct v3_intr_core_state * intr_state = &(info->intr_core_state); @@ -294,6 +306,8 @@ int v3_raise_irq(struct v3_vm_info * vm, int irq) { } + + void v3_clear_pending_intr(struct guest_info * core) { struct v3_intr_core_state * intr_state = &(core->intr_core_state);