void sim_module_add_uninstall_fn (SIM_DESC sd, MODULE_UNINSTALL_FN fn) { struct module_list *modules = STATE_MODULES (sd); MODULE_UNINSTALL_LIST *l = ZALLOC (MODULE_UNINSTALL_LIST); SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); SIM_ASSERT (STATE_MODULES (sd) != NULL); l->fn = fn; l->next = modules->uninstall_list; modules->uninstall_list = l; }
void sim_module_info (SIM_DESC sd, int verbose) { struct module_list *modules = STATE_MODULES (sd); MODULE_INFO_LIST *modp; SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); SIM_ASSERT (STATE_MODULES (sd) != NULL); for (modp = modules->info_list; modp != NULL; modp = modp->next) { (*modp->fn) (sd, verbose); } }
SIM_RC sim_pre_argv_init (SIM_DESC sd, const char *myname) { SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); SIM_ASSERT (STATE_MODULES (sd) == NULL); STATE_MY_NAME (sd) = lbasename (myname); /* Set the cpu names to default values. */ { int i; for (i = 0; i < MAX_NR_PROCESSORS; ++i) { char *name; if (asprintf (&name, "cpu%d", i) < 0) return SIM_RC_FAIL; CPU_NAME (STATE_CPU (sd, i)) = name; } } sim_config_default (sd); /* Install all configured in modules. */ if (sim_module_install (sd) != SIM_RC_OK) return SIM_RC_FAIL; return SIM_RC_OK; }
SIM_RC sim_module_suspend (SIM_DESC sd) { struct module_list *modules = STATE_MODULES (sd); MODULE_SUSPEND_LIST *modp; SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); SIM_ASSERT (STATE_MODULES (sd) != NULL); for (modp = modules->suspend_list; modp != NULL; modp = modp->next) { if ((*modp->fn) (sd) != SIM_RC_OK) return SIM_RC_FAIL; } return SIM_RC_OK; }
static void free_state (SIM_DESC sd) { if (STATE_MODULES (sd) != NULL) sim_module_uninstall (sd); sim_cpu_free_all (sd); sim_state_free (sd); }
void sim_module_add_info_fn (SIM_DESC sd, MODULE_INFO_FN fn) { struct module_list *modules = STATE_MODULES (sd); MODULE_INFO_LIST *l = ZALLOC (MODULE_INFO_LIST); MODULE_INFO_LIST **last; SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); SIM_ASSERT (STATE_MODULES (sd) != NULL); last = &modules->info_list; while (*last != NULL) last = &((*last)->next); l->fn = fn; l->next = NULL; *last = l; }
void sim_module_add_suspend_fn (SIM_DESC sd, MODULE_SUSPEND_FN fn) { struct module_list *modules = STATE_MODULES (sd); MODULE_SUSPEND_LIST *l = ZALLOC (MODULE_SUSPEND_LIST); MODULE_SUSPEND_LIST **last; SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); SIM_ASSERT (STATE_MODULES (sd) != NULL); last = &modules->suspend_list; while (*last != NULL) last = &((*last)->next); l->fn = fn; l->next = modules->suspend_list; modules->suspend_list = l; }
SIM_RC sim_module_install (SIM_DESC sd) { MODULE_INSTALL_FN * const *modp; SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); SIM_ASSERT (STATE_MODULES (sd) == NULL); STATE_MODULES (sd) = ZALLOC (struct module_list); for (modp = modules; *modp != NULL; ++modp) { if ((*modp) (sd) != SIM_RC_OK) { sim_module_uninstall (sd); SIM_ASSERT (STATE_MODULES (sd) == NULL); return SIM_RC_FAIL; } } return SIM_RC_OK; }
SIM_RC sim_post_argv_init (SIM_DESC sd) { int i; SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); SIM_ASSERT (STATE_MODULES (sd) != NULL); /* Set the cpu->state backlinks for each cpu. */ for (i = 0; i < MAX_NR_PROCESSORS; ++i) { CPU_STATE (STATE_CPU (sd, i)) = sd; CPU_INDEX (STATE_CPU (sd, i)) = i; } if (sim_module_init (sd) != SIM_RC_OK) return SIM_RC_FAIL; return SIM_RC_OK; }
void sim_module_uninstall (SIM_DESC sd) { struct module_list *modules = STATE_MODULES (sd); MODULE_UNINSTALL_LIST *modp; SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); SIM_ASSERT (STATE_MODULES (sd) != NULL); /* Uninstall the modules. */ for (modp = modules->uninstall_list; modp != NULL; modp = modp->next) (*modp->fn) (sd); /* clean-up init list */ { MODULE_INIT_LIST *n, *d; for (d = modules->init_list; d != NULL; d = n) { n = d->next; free (d); } } /* clean-up resume list */ { MODULE_RESUME_LIST *n, *d; for (d = modules->resume_list; d != NULL; d = n) { n = d->next; free (d); } } /* clean-up suspend list */ { MODULE_SUSPEND_LIST *n, *d; for (d = modules->suspend_list; d != NULL; d = n) { n = d->next; free (d); } } /* clean-up uninstall list */ { MODULE_UNINSTALL_LIST *n, *d; for (d = modules->uninstall_list; d != NULL; d = n) { n = d->next; free (d); } } /* clean-up info list */ { MODULE_INFO_LIST *n, *d; for (d = modules->info_list; d != NULL; d = n) { n = d->next; free (d); } } free (modules); STATE_MODULES (sd) = NULL; }