2003-02-20 Andrew Cagney <ac131313@redhat.com>
[deliverable/binutils-gdb.git] / sim / common / sim-module.c
index e58e6f3c57fce597ffa400783d5814ca3ea79a08..35eb32a65ff13857e001f99597ed83af88754d9f 100644 (file)
@@ -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,11 +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
@@ -42,15 +50,17 @@ static MODULE_INSTALL_FN * const modules[] = {
   /* FIXME: should handle flatmem as well FLATMEM */
   sim_memopt_install,
 #endif
-  sim_events_install,
 #if WITH_WATCHPOINTS
   sim_watchpoint_install,
 #endif
 #if WITH_SCACHE
   scache_install,
 #endif
-#ifdef SIM_HAVE_MODEL /* FIXME: temporary */
-  model_install,
+#ifdef SIM_HAVE_BREAKPOINTS
+  sim_break_install,
+#endif
+#if WITH_HW
+  sim_hw_install,
 #endif
   /* Configured in [simulator specific] additional modules.  */
 #ifdef MODULE_LIST
@@ -67,10 +77,25 @@ 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);
 
+  /* Set the cpu names to default values.  */
+  {
+    int i;
+    for (i = 0; i < MAX_NR_PROCESSORS; ++i)
+      {
+       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;
@@ -85,29 +110,41 @@ 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;
 }
 \f
-/* Install all modules.  */
+/* Install all modules.
+   If this fails, no modules are left installed.  */
 
 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)
-       return SIM_RC_FAIL;
+       {
+         sim_module_uninstall (sd);
+         SIM_ASSERT (STATE_MODULES (sd) == NULL);
+         return SIM_RC_FAIL;
+       }
     }
   return SIM_RC_OK;
 }
@@ -118,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;
@@ -134,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;
@@ -150,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;
@@ -166,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);
+    }
 }
 \f
 /* Add FN to the init handler list.
@@ -180,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);
 
@@ -199,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);
 
@@ -218,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.
@@ -237,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 = 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 = STATE_UNINSTALL_LIST (sd);
-  STATE_UNINSTALL_LIST (sd) = l;
+  l->next = NULL;
+  *last = l;
 }
This page took 0.027574 seconds and 4 git commands to generate.