1 #include <devices/simple_pic.h>
2 #include <palacios/vmm_intr.h>
3 #include <palacios/vmm_types.h>
4 #include <palacios/vmm.h>
12 static int pic_intr_pending(void * private_data) {
13 struct pic_internal * data = (struct pic_internal *)private_data;
15 return (data->pending_irq > 0);
18 static int pic_raise_intr(void * private_data, int irq) {
19 struct pic_internal * data = (struct pic_internal *)private_data;
21 data->pending_irq = irq;
28 static int pic_get_intr_number(void * private_data) {
29 struct pic_internal * data = (struct pic_internal *)private_data;
31 return data->pending_irq;
35 static struct intr_ctrl_ops intr_ops = {
36 .intr_pending = pic_intr_pending,
37 .get_intr_number = pic_get_intr_number,
38 .raise_intr = pic_raise_intr
44 int pic_init_device(struct vm_device * dev) {
45 struct pic_internal * data = (struct pic_internal *)dev->private_data;
46 set_intr_controller(dev->vm, &intr_ops, data);
47 data->pending_irq = 0;
53 int pic_deinit_device(struct vm_device * dev) {
61 static struct vm_device_ops dev_ops = {
62 .init = pic_init_device,
63 .deinit = pic_deinit_device,
70 struct vm_device * create_simple_pic() {
71 struct pic_internal * state = NULL;
72 state = (struct pic_internal *)V3_Malloc(sizeof(struct pic_internal));
73 V3_ASSERT(state != NULL);
75 struct vm_device * pic_dev = create_device("Simple Pic", &dev_ops, state);