X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2F8259a.c;h=c24402de9093ed972cd8ea8e4559cb40402d3610;hb=9b42eba2271981b4642c83cb520b68fe15f270fb;hp=69707b901522115e36efdf0c84d8ac80a8c3719a;hpb=6d6988cc9c8bac21d96afd800076afe0915cf2cd;p=palacios-OLD.git diff --git a/palacios/src/devices/8259a.c b/palacios/src/devices/8259a.c index 69707b9..c24402d 100644 --- a/palacios/src/devices/8259a.c +++ b/palacios/src/devices/8259a.c @@ -23,8 +23,9 @@ #include #include #include +#include -#ifndef CONFIG_DEBUG_PIC +#ifndef V3_CONFIG_DEBUG_PIC #undef PrintDebug #define PrintDebug(fmt, args...) #endif @@ -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 V3_CONFIG_MULTITHREAD_OS v3_interrupt_cpu(vm, 0, 0); +#endif return 0; } @@ -718,25 +727,17 @@ 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; - - // unregister intr_controller - // unregister intr router + v3_remove_intr_controller(core, state->controller_handle); + v3_remove_intr_router(core->vm_info, state->router_handle); V3_Free(state); return 0; } - - - - - static struct v3_device_ops dev_ops = { .free = (int (*)(void *))pic_free, @@ -744,7 +745,7 @@ static struct v3_device_ops dev_ops = { -#include + static int pic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { struct pic_internal * state = NULL; @@ -767,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;