1 /* (c) 2008, Jack Lange <jarusl@cs.northwestern.edu> */
2 /* (c) 2008, The V3VEE Project <http://www.v3vee.org> */
4 #include <devices/simple_pic.h>
5 #include <palacios/vmm_intr.h>
6 #include <palacios/vmm_types.h>
7 #include <palacios/vmm.h>
15 static int pic_intr_pending(void * private_data) {
16 struct pic_internal * data = (struct pic_internal *)private_data;
18 return (data->pending_irq > 0);
21 static int pic_raise_intr(void * private_data, int irq) {
22 struct pic_internal * data = (struct pic_internal *)private_data;
24 data->pending_irq = irq;
31 static int pic_get_intr_number(void * private_data) {
32 struct pic_internal * data = (struct pic_internal *)private_data;
34 return data->pending_irq;
38 static struct intr_ctrl_ops intr_ops = {
39 .intr_pending = pic_intr_pending,
40 .get_intr_number = pic_get_intr_number,
41 .raise_intr = pic_raise_intr
47 int pic_init_device(struct vm_device * dev) {
48 struct pic_internal * data = (struct pic_internal *)dev->private_data;
49 set_intr_controller(dev->vm, &intr_ops, data);
50 data->pending_irq = 0;
56 int pic_deinit_device(struct vm_device * dev) {
64 static struct vm_device_ops dev_ops = {
65 .init = pic_init_device,
66 .deinit = pic_deinit_device,
73 struct vm_device * create_simple_pic() {
74 struct pic_internal * state = NULL;
75 state = (struct pic_internal *)V3_Malloc(sizeof(struct pic_internal));
76 V3_ASSERT(state != NULL);
78 struct vm_device * pic_dev = create_device("Simple Pic", &dev_ops, state);