From: Jack Lange Date: Thu, 6 Jan 2011 22:00:08 +0000 (-0600) Subject: deinitialization of interrupt state X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=16745fa0dd0900263d4d92315cd17e0ed9ccae91;p=palacios.git deinitialization of interrupt state --- diff --git a/palacios/include/palacios/vmm_decoder.h b/palacios/include/palacios/vmm_decoder.h index 20623d0..3f71036 100644 --- a/palacios/include/palacios/vmm_decoder.h +++ b/palacios/include/palacios/vmm_decoder.h @@ -99,7 +99,8 @@ struct basic_instr_info { /* * Initializes a decoder */ -int v3_init_decoder(); +int v3_init_decoder(struct guest_info * core); +int v3_deinit_decoder(struct guest_info * core); /* * Decodes an instruction diff --git a/palacios/include/palacios/vmm_intr.h b/palacios/include/palacios/vmm_intr.h index 8cc9ae1..626b98b 100644 --- a/palacios/include/palacios/vmm_intr.h +++ b/palacios/include/palacios/vmm_intr.h @@ -67,9 +67,12 @@ struct v3_intr_core_state { -void v3_init_intr_controllers(struct guest_info * info); +void v3_init_intr_controllers(struct guest_info * core); void v3_init_intr_routers(struct v3_vm_info * vm); +void v3_deinit_intr_controllers(struct guest_info * core); +void v3_deinit_intr_routers(struct v3_vm_info * vm); + int v3_raise_virq(struct guest_info * info, int irq); int v3_lower_virq(struct guest_info * info, int irq); @@ -92,8 +95,11 @@ struct intr_router_ops { void v3_clear_pending_intr(struct guest_info * core); -int v3_register_intr_controller(struct guest_info * info, struct intr_ctrl_ops * ops, void * priv_data); -int v3_register_intr_router(struct v3_vm_info * vm, struct intr_router_ops * ops, void * priv_data); +void * v3_register_intr_controller(struct guest_info * info, struct intr_ctrl_ops * ops, void * priv_data); +void * v3_register_intr_router(struct v3_vm_info * vm, struct intr_router_ops * ops, void * priv_data); + +void v3_remove_intr_controller(struct guest_info * core, void * handle); +void v3_remove_intr_router(struct v3_vm_info * vm, void * handle); v3_intr_type_t v3_intr_pending(struct guest_info * info); uint32_t v3_get_intr(struct guest_info * info); diff --git a/palacios/src/palacios/vm_guest.c b/palacios/src/palacios/vm_guest.c index 95b109f..afb9921 100644 --- a/palacios/src/palacios/vm_guest.c +++ b/palacios/src/palacios/vm_guest.c @@ -587,6 +587,15 @@ int v3_init_core(struct guest_info * core) { int v3_free_core(struct guest_info * core) { v3_cpu_arch_t cpu_type = v3_get_cpu_type(V3_Get_CPU()); + +#ifdef CONFIG_SYMBIOTIC + //v3_deinit_symbiotic_core(core); +#endif + + v3_deinit_decoder(core); + + v3_deinit_intr_controllers(core); + switch (cpu_type) { #ifdef CONFIG_SVM case V3_SVM_CPU: diff --git a/palacios/src/palacios/vmm_intr.c b/palacios/src/palacios/vmm_intr.c index 1397c07..c9c1800 100644 --- a/palacios/src/palacios/vmm_intr.c +++ b/palacios/src/palacios/vmm_intr.c @@ -62,6 +62,19 @@ void v3_init_intr_controllers(struct guest_info * info) { INIT_LIST_HEAD(&(intr_state->controller_list)); } + +void v3_deinit_intr_controllers(struct guest_info * core) { + struct v3_intr_core_state * intr_state = &(core->intr_core_state); + struct intr_controller * ctrlr; + struct intr_controller * tmp; + + // clear out any controllers that were left around + list_for_each_entry_safe(ctrlr, tmp, &(intr_state->controller_list), ctrl_node) { + v3_remove_intr_controller(core, ctrlr); + } +} + + void v3_init_intr_routers(struct v3_vm_info * vm) { INIT_LIST_HEAD(&(vm->intr_routers.router_list)); @@ -72,7 +85,17 @@ void v3_init_intr_routers(struct v3_vm_info * vm) { } -int v3_register_intr_controller(struct guest_info * info, struct intr_ctrl_ops * ops, void * priv_data) { +void v3_deinit_intr_routers(struct v3_vm_info * vm) { + struct intr_router * rtr = NULL; + struct intr_router * tmp = NULL; + + // clear out any controllers that were left around + list_for_each_entry_safe(rtr, tmp, &(vm->intr_routers.router_list), router_node) { + v3_remove_intr_router(vm, rtr); + } +} + +void * v3_register_intr_controller(struct guest_info * info, struct intr_ctrl_ops * ops, void * priv_data) { struct intr_controller * ctrlr = (struct intr_controller *)V3_Malloc(sizeof(struct intr_controller)); ctrlr->priv_data = priv_data; @@ -80,10 +103,32 @@ int v3_register_intr_controller(struct guest_info * info, struct intr_ctrl_ops * list_add(&(ctrlr->ctrl_node), &(info->intr_core_state.controller_list)); - return 0; + return (void *)ctrlr; +} + +void v3_remove_intr_controller(struct guest_info * core, void * handle) { + struct v3_intr_core_state * intr_state = &(core->intr_core_state); + struct intr_controller * ctrlr = handle; + struct intr_controller * tmp = NULL; + int found = 0; + + // search for the entry in the router list + list_for_each_entry(tmp, &(intr_state->controller_list), ctrl_node) { + if (tmp == ctrlr) { + found = 1; + } + } + + if (found == 0) { + PrintError("Attempted to remove invalid interrupt controller handle\n"); + return; + } + + list_del(&(ctrlr->ctrl_node)); + V3_Free(ctrlr); } -int v3_register_intr_router(struct v3_vm_info * vm, struct intr_router_ops * ops, void * priv_data) { +void * v3_register_intr_router(struct v3_vm_info * vm, struct intr_router_ops * ops, void * priv_data) { struct intr_router * router = (struct intr_router *)V3_Malloc(sizeof(struct intr_router)); router->priv_data = priv_data; @@ -91,7 +136,28 @@ int v3_register_intr_router(struct v3_vm_info * vm, struct intr_router_ops * ops list_add(&(router->router_node), &(vm->intr_routers.router_list)); - return 0; + return (void *)router; +} + +void v3_remove_intr_router(struct v3_vm_info * vm, void * handle) { + struct intr_router * router = handle; + struct intr_router * tmp = NULL; + int found = 0; + + // search for the entry in the router list + list_for_each_entry(tmp, &(vm->intr_routers.router_list), router_node) { + if (tmp == router) { + found = 1; + } + } + + if (found == 0) { + PrintError("Attempted to remove invalid interrupt router\n"); + return; + } + + list_del(&(router->router_node)); + V3_Free(router); } diff --git a/palacios/src/palacios/vmm_xed.c b/palacios/src/palacios/vmm_xed.c index 99ce14e..f4408f2 100644 --- a/palacios/src/palacios/vmm_xed.c +++ b/palacios/src/palacios/vmm_xed.c @@ -180,6 +180,13 @@ int v3_init_decoder(struct guest_info * info) { +int v3_deinit_decoder(struct guest_info * core) { + V3_Free(core->decoder_state); + + return 0; +} + + int v3_basic_mem_decode(struct guest_info * info, addr_t instr_ptr, struct basic_instr_info * instr_info) { xed_decoded_inst_t xed_instr; xed_error_enum_t xed_error;