From: Jack Lange Date: Thu, 6 Jan 2011 22:12:32 +0000 (-0600) Subject: add interrupt deinitialization to devices X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=96a71766125d211be08d7670c93938cf0ea09c04 add interrupt deinitialization to devices --- diff --git a/palacios/src/devices/8259a.c b/palacios/src/devices/8259a.c index 69707b9..66b3768 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; }; @@ -718,25 +725,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 +743,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 +766,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; diff --git a/palacios/src/devices/apic.c b/palacios/src/devices/apic.c index 3d7f792..e7d0177 100644 --- a/palacios/src/devices/apic.c +++ b/palacios/src/devices/apic.c @@ -207,6 +207,8 @@ struct apic_state { struct guest_info * core; + void * controller_handle; + struct v3_timer * timer; uint32_t eoi; @@ -1472,7 +1474,7 @@ static int apic_free(struct apic_dev_state * apic_dev) { vm = core->vm_info; - // unregister intr controller + v3_remove_intr_controller(core, apic->controller_handle); if (apic->timer) { v3_remove_timer(core, apic->timer); @@ -1526,7 +1528,7 @@ static int apic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { init_apic_state(apic, i); - v3_register_intr_controller(core, &intr_ops, apic_dev); + apic->controller_handle = v3_register_intr_controller(core, &intr_ops, apic_dev); apic->timer = v3_add_timer(core, &timer_ops, apic_dev); diff --git a/palacios/src/devices/io_apic.c b/palacios/src/devices/io_apic.c index b0e9584..a1d3d9f 100644 --- a/palacios/src/devices/io_apic.c +++ b/palacios/src/devices/io_apic.c @@ -136,6 +136,10 @@ struct io_apic_state { struct redir_tbl_entry redir_tbl[24]; void * apic_dev_data; + + void * router_handle; + + struct v3_vm_info * vm; }; @@ -309,7 +313,7 @@ static struct intr_router_ops router_ops = { static int io_apic_free(struct io_apic_state * ioapic) { - // unregister intr router + v3_remove_intr_router(ioapic->vm, ioapic->router_handle); // unhook memory @@ -345,7 +349,8 @@ static int ioapic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { return -1; } - v3_register_intr_router(vm, &router_ops, ioapic); + ioapic->router_handle = v3_register_intr_router(vm, &router_ops, ioapic); + ioapic->vm = vm; init_ioapic_state(ioapic, vm->num_cores);