X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=sim%2Fcommon%2Fsim-module.c;h=35eb32a65ff13857e001f99597ed83af88754d9f;hb=501eef1260d7e203ba1e555ba94ec918d7c32725;hp=c4dcd30091883ab01ccc946ad8ca033c4f0d4b40;hpb=966df5804d7586c1a30853ffb4aa0663c942c337;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/common/sim-module.c b/sim/common/sim-module.c index c4dcd30091..35eb32a65f 100644 --- a/sim/common/sim-module.c +++ b/sim/common/sim-module.c @@ -1,5 +1,5 @@ /* Module support. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. Contributed by Cygnus Support. This file is part of GDB, the GNU debugger. @@ -23,12 +23,19 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "sim-options.h" #include "sim-assert.h" +#if WITH_HW +#include "sim-hw.h" +#endif + #include "libiberty.h" /* List of all modules. */ static MODULE_INSTALL_FN * const modules[] = { standard_install, sim_events_install, +#ifdef SIM_HAVE_MODEL + sim_model_install, +#endif #if WITH_ENGINE sim_engine_install, #endif @@ -49,11 +56,11 @@ static MODULE_INSTALL_FN * const modules[] = { #if WITH_SCACHE scache_install, #endif -#ifdef SIM_HAVE_MODEL - model_install, -#endif #ifdef SIM_HAVE_BREAKPOINTS sim_break_install, +#endif +#if WITH_HW + sim_hw_install, #endif /* Configured in [simulator specific] additional modules. */ #ifdef MODULE_LIST @@ -70,6 +77,8 @@ 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) = myname + strlen (myname); while (STATE_MY_NAME (sd) > myname && STATE_MY_NAME (sd)[-1] != '/') --STATE_MY_NAME (sd); @@ -79,12 +88,14 @@ sim_pre_argv_init (SIM_DESC sd, const char *myname) int i; for (i = 0; i < MAX_NR_PROCESSORS; ++i) { - const char *name; + char *name; asprintf (&name, "cpu%d", i); 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; @@ -99,13 +110,17 @@ sim_post_argv_init (SIM_DESC sd) { int i; SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); - - if (sim_module_init (sd) != SIM_RC_OK) - return SIM_RC_FAIL; + 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_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; } @@ -117,13 +132,17 @@ 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; } } @@ -136,10 +155,13 @@ sim_module_install (SIM_DESC sd) SIM_RC sim_module_init (SIM_DESC sd) { + struct module_list *modules = STATE_MODULES (sd); MODULE_INIT_LIST *modp; + SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); + SIM_ASSERT (STATE_MODULES (sd) != NULL); - for (modp = STATE_INIT_LIST (sd); modp != NULL; modp = modp->next) + for (modp = modules->init_list; modp != NULL; modp = modp->next) { if ((*modp->fn) (sd) != SIM_RC_OK) return SIM_RC_FAIL; @@ -152,10 +174,13 @@ sim_module_init (SIM_DESC sd) SIM_RC sim_module_resume (SIM_DESC sd) { + struct module_list *modules = STATE_MODULES (sd); MODULE_RESUME_LIST *modp; + SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); + SIM_ASSERT (STATE_MODULES (sd) != NULL); - for (modp = STATE_RESUME_LIST (sd); modp != NULL; modp = modp->next) + for (modp = modules->resume_list; modp != NULL; modp = modp->next) { if ((*modp->fn) (sd) != SIM_RC_OK) return SIM_RC_FAIL; @@ -168,10 +193,13 @@ sim_module_resume (SIM_DESC sd) 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 = STATE_SUSPEND_LIST (sd); modp != NULL; modp = modp->next) + for (modp = modules->suspend_list; modp != NULL; modp = modp->next) { if ((*modp->fn) (sd) != SIM_RC_OK) return SIM_RC_FAIL; @@ -184,12 +212,85 @@ sim_module_suspend (SIM_DESC sd) 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 = STATE_UNINSTALL_LIST (sd); modp != NULL; modp = modp->next) + 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; + zfree (d); + } + } + + /* clean-up resume list */ + { + MODULE_RESUME_LIST *n, *d; + for (d = modules->resume_list; d != NULL; d = n) + { + n = d->next; + zfree (d); + } + } + + /* clean-up suspend list */ + { + MODULE_SUSPEND_LIST *n, *d; + for (d = modules->suspend_list; d != NULL; d = n) + { + n = d->next; + zfree (d); + } + } + + /* clean-up uninstall list */ + { + MODULE_UNINSTALL_LIST *n, *d; + for (d = modules->uninstall_list; d != NULL; d = n) + { + n = d->next; + zfree (d); + } + } + + /* clean-up info list */ + { + MODULE_INFO_LIST *n, *d; + for (d = modules->info_list; d != NULL; d = n) + { + n = d->next; + zfree (d); + } + } + + zfree (modules); + STATE_MODULES (sd) = NULL; +} + +/* Called when ever simulator info is needed */ + +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); + } } /* Add FN to the init handler list. @@ -198,11 +299,14 @@ sim_module_uninstall (SIM_DESC sd) void sim_module_add_init_fn (SIM_DESC sd, MODULE_INIT_FN fn) { - MODULE_INIT_LIST *l = - (MODULE_INIT_LIST *) xmalloc (sizeof (MODULE_INIT_LIST)); - MODULE_INIT_LIST **last = &STATE_INIT_LIST (sd); + struct module_list *modules = STATE_MODULES (sd); + MODULE_INIT_LIST *l = ZALLOC (MODULE_INIT_LIST); + MODULE_INIT_LIST **last; + SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); + SIM_ASSERT (STATE_MODULES (sd) != NULL); + last = &modules->init_list; while (*last != NULL) last = &((*last)->next); @@ -217,11 +321,14 @@ sim_module_add_init_fn (SIM_DESC sd, MODULE_INIT_FN fn) void sim_module_add_resume_fn (SIM_DESC sd, MODULE_RESUME_FN fn) { + struct module_list *modules = STATE_MODULES (sd); MODULE_RESUME_LIST *l = ZALLOC (MODULE_RESUME_LIST); MODULE_RESUME_LIST **last; + SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); + SIM_ASSERT (STATE_MODULES (sd) != NULL); - last = &STATE_RESUME_LIST (sd); + last = &modules->resume_list; while (*last != NULL) last = &((*last)->next); @@ -236,17 +343,20 @@ sim_module_add_resume_fn (SIM_DESC sd, MODULE_RESUME_FN fn) 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 = &STATE_SUSPEND_LIST (sd); + last = &modules->suspend_list; while (*last != NULL) last = &((*last)->next); l->fn = fn; - l->next = STATE_SUSPEND_LIST (sd); - STATE_SUSPEND_LIST (sd) = l; + l->next = modules->suspend_list; + modules->suspend_list = l; } /* Add FN to the uninstall handler list. @@ -255,10 +365,35 @@ sim_module_add_suspend_fn (SIM_DESC sd, MODULE_SUSPEND_FN fn) void sim_module_add_uninstall_fn (SIM_DESC sd, MODULE_UNINSTALL_FN fn) { - MODULE_UNINSTALL_LIST *l = - (MODULE_UNINSTALL_LIST *) xmalloc (sizeof (MODULE_UNINSTALL_LIST)); + 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 = STATE_UNINSTALL_LIST (sd); - STATE_UNINSTALL_LIST (sd) = l; + l->next = modules->uninstall_list; + modules->uninstall_list = l; +} + +/* Add FN to the info handler list. + Report info in the same order as the install. */ + +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; }