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
39 info->intr_state.controller->raise_intr(info->intr_state.controller_state, irq, error_code);
45 int intr_pending(struct vm_intr * intr) {
46 if (intr->excp_pending) {
48 } else if (intr->controller->intr_pending(intr->controller_state)) {
58 uint_t get_intr_number(struct vm_intr * intr) {
59 if (intr->excp_pending) {
60 return intr->excp_num;
61 } else if (intr->controller->intr_pending(intr->controller_state)) {
62 return intr->controller->get_intr_number(intr->controller_state) + 32;
65 /* someway to get the [A]PIC intr */
71 uint_t get_intr_type(struct vm_intr * intr) {
72 if (intr->excp_pending) {
74 } else if (intr->controller->intr_pending(intr->controller_state)) {
81 int hook_irq(struct guest_info * info, int irq) {
82 extern struct vmm_os_hooks * os_hooks;
84 return os_hooks->hook_interrupt(info, irq);