1 #include <palacios/vmm_intr.h>
2 #include <palacios/vmm.h>
4 #include <palacios/vm_guest.h>
7 void init_interrupt_state(struct guest_info * info) {
8 info->intr_state.excp_pending = 0;
9 info->intr_state.excp_num = 0;
10 info->intr_state.excp_error_code = 0;
12 info->vm_ops.raise_irq = &raise_irq;
15 void set_intr_controller(struct guest_info * info, struct intr_ctrl_ops * ops, void * state) {
16 info->intr_state.controller = ops;
17 info->intr_state.controller_state = state;
21 int raise_exception(struct guest_info * info, uint_t excp) {
23 /* We can't stack exceptions,
24 but do we need to have some sort of priority?
26 if (info->intr_state.excp_pending) {
27 info->intr_state.excp_pending = 1;
28 info->intr_state.excp_num = excp;
37 int raise_irq(struct guest_info * info, int irq, int error_code) {
38 // Look up PIC and resend
40 V3_ASSERT(info->intr_state.controller);
41 V3_ASSERT(info->intr_state.controller->raise_intr);
43 // if ((info->intr_state.controller) &&
44 // (info->intr_state.controller->raise_intr)) {
45 info->intr_state.controller->raise_intr(info->intr_state.controller_state, irq, error_code);
47 // PrintDebug("There is no registered Interrupt Controller... (NULL POINTER)\n");
54 int intr_pending(struct vm_intr * intr) {
55 if (intr->excp_pending) {
57 } else if (intr->controller->intr_pending(intr->controller_state)) {
67 uint_t get_intr_number(struct vm_intr * intr) {
68 if (intr->excp_pending) {
69 return intr->excp_num;
70 } else if (intr->controller->intr_pending(intr->controller_state)) {
71 return intr->controller->get_intr_number(intr->controller_state);
74 /* someway to get the [A]PIC intr */
80 uint_t get_intr_type(struct vm_intr * intr) {
81 if (intr->excp_pending) {
83 } else if (intr->controller->intr_pending(intr->controller_state)) {
90 int hook_irq(struct guest_info * info, int irq) {
91 extern struct vmm_os_hooks * os_hooks;
93 return os_hooks->hook_interrupt(info, irq);