X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fsimple_pic.c;fp=palacios%2Fsrc%2Fdevices%2Fsimple_pic.c;h=a4e25f56fc8e4ac0ad4b808033eb20d979b6fcd5;hb=a9ba0182142340a2dd7b6a0b7c63727e87b08c89;hp=0000000000000000000000000000000000000000;hpb=28b1d0ae6db40cb3e1f5a9b3596b625d2f2af0e4;p=palacios.git diff --git a/palacios/src/devices/simple_pic.c b/palacios/src/devices/simple_pic.c new file mode 100644 index 0000000..a4e25f5 --- /dev/null +++ b/palacios/src/devices/simple_pic.c @@ -0,0 +1,78 @@ +#include +#include +#include +#include + +struct pic_internal { + int pending_irq; + int error_code; +}; + + +int pic_intr_pending(void * private_data) { + struct pic_internal * data = (struct pic_internal *)private_data; + + return (data->pending_irq > 0); +} + +int pic_raise_intr(void * private_data, int irq, int error_code) { + struct pic_internal * data = (struct pic_internal *)private_data; + + data->pending_irq = irq; + data->error_code = error_code; + + return 0; +} + + +int pic_get_intr_number(void * private_data) { + struct pic_internal * data = (struct pic_internal *)private_data; + + return data->pending_irq; +} + + +static struct intr_ctrl_ops intr_ops = { + .intr_pending = pic_intr_pending, + .get_intr_number = pic_get_intr_number, + .raise_intr = pic_raise_intr +}; + + + + +int pic_init_device(struct vm_device * dev) { + struct pic_internal * data = (struct pic_internal *)dev->private_data; + set_intr_controller(dev->vm, &intr_ops, data); + data->pending_irq = 0; + + return 0; +} + + +int pic_deinit_device(struct vm_device * dev) { + return 0; +} + + + + + +static struct vm_device_ops dev_ops = { + .init = pic_init_device, + .deinit = pic_deinit_device, + .reset = NULL, + .start = NULL, + .stop = NULL +}; + + +struct vm_device * create_pic() { + struct pic_internal * state = NULL; + VMMMalloc(struct pic_internal *, state, sizeof(struct pic_internal)); + + struct vm_device * pic_dev = create_device("Simple Pic", &dev_ops, state); + + + return pic_dev; +}