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),
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);
#include <palacios/vm_guest_mem.h>
#include <palacios/vmm_decoder.h>
#include <palacios/vmm_extensions.h>
+#include <palacios/vmm_intr.h>
#include <interfaces/sw_intr.h>
hook = swintr_hooks[vector];
#else
core->rip += instr.instr_length;
- return v3_signal_swintr(core, vector);
+ return v3_raise_swintr(core, vector);
#endif
}
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,
#include <palacios/vmm_string.h>
#include <palacios/vmm_shadow_paging.h>
#include <palacios/vmm_extensions.h>
+#include <palacios/vmm_intr.h>
#include <interfaces/syscall_hijack.h>
#include <interfaces/sw_intr.h>
}
hook = syscall_hooks[syscall_nr];
#else
- return v3_signal_swintr(core, vector);
+ return v3_raise_swintr(core, vector);
#endif
}
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;
+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);
}
+
+
void v3_clear_pending_intr(struct guest_info * core) {
struct v3_intr_core_state * intr_state = &(core->intr_core_state);