X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2F8259a.c;h=0d5e5ffdf09c62f72fff889981301b38cde056d7;hb=18713f98a14335b09cb7d87b3bea087255eaf10d;hp=9bbef1e4ce4689dee24b94fe1af1e8b5c648ee39;hpb=72420d58d18ec71d4777d029daaf0c6a1c820b32;p=palacios.git diff --git a/palacios/src/devices/8259a.c b/palacios/src/devices/8259a.c index 9bbef1e..0d5e5ff 100644 --- a/palacios/src/devices/8259a.c +++ b/palacios/src/devices/8259a.c @@ -23,6 +23,7 @@ #include #include #include +#include #ifndef CONFIG_DEBUG_PIC #undef PrintDebug @@ -155,6 +156,12 @@ struct pic_internal { pic_state_t master_state; pic_state_t slave_state; + + struct guest_info * core; + + + void * router_handle; + void * controller_handle; }; @@ -209,7 +216,9 @@ static int pic_raise_intr(struct v3_vm_info * vm, void * private_data, int irq) return -1; } +#ifdef CONFIG_MULTITHREAD_OS v3_interrupt_cpu(vm, 0, 0); +#endif return 0; } @@ -718,28 +727,25 @@ static int write_elcr_port(struct guest_info * core, ushort_t port, void * src, +static int pic_free(struct pic_internal * state) { + struct guest_info * core = state->core; + v3_remove_intr_controller(core, state->controller_handle); + v3_remove_intr_router(core->vm_info, state->router_handle); - -static int pic_free(struct vm_device * dev) { - + V3_Free(state); return 0; } - - - - - static struct v3_device_ops dev_ops = { - .free = pic_free, + .free = (int (*)(void *))pic_free, }; -#include + static int pic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { struct pic_internal * state = NULL; @@ -749,11 +755,10 @@ static int pic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { // PIC is only usable in non-multicore environments // just hardcode the core context struct guest_info * core = &(vm->cores[0]); + + state = (struct pic_internal *)V3_Malloc(sizeof(struct pic_internal)); V3_ASSERT(state != NULL); - - state = (struct pic_internal *)V3_Malloc(sizeof(struct pic_internal)); - struct vm_device * dev = v3_add_device(vm, dev_id, &dev_ops, state); @@ -763,9 +768,10 @@ static int pic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { return -1; } + state->core = core; - v3_register_intr_controller(core, &intr_ops, state); - v3_register_intr_router(vm, &router_ops, state); + state->controller_handle = v3_register_intr_controller(core, &intr_ops, state); + state->router_handle = v3_register_intr_router(vm, &router_ops, state); state->master_irr = 0; state->master_isr = 0;