+
+ /* 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);
+ }