]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - sim/common/sim-module.c
Pacify GCC: const char * passed to asprintf; int function returning
[thirdparty/binutils-gdb.git] / sim / common / sim-module.c
CommitLineData
c967f187
DE
1/* Module support.
2 Copyright (C) 1996, 1997 Free Software Foundation, Inc.
3 Contributed by Cygnus Support.
4
5This file is part of GDB, the GNU debugger.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License along
18with this program; if not, write to the Free Software Foundation, Inc.,
1959 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21#include "sim-main.h"
22#include "sim-io.h"
23#include "sim-options.h"
fdd64f95
AC
24#include "sim-assert.h"
25
26#include "libiberty.h"
c967f187
DE
27
28/* List of all modules. */
29static MODULE_INSTALL_FN * const modules[] = {
30 standard_install,
c2481130 31 sim_events_install,
fdd64f95
AC
32#if WITH_ENGINE
33 sim_engine_install,
34#endif
35#if WITH_TRACE
c967f187 36 trace_install,
fdd64f95
AC
37#endif
38#if WITH_PROFILE
c967f187 39 profile_install,
fdd64f95 40#endif
c967f187 41 sim_core_install,
a34abff8
AC
42#ifndef SIM_HAVE_FLATMEM
43 /* FIXME: should handle flatmem as well FLATMEM */
44 sim_memopt_install,
45#endif
fdd64f95
AC
46#if WITH_WATCHPOINTS
47 sim_watchpoint_install,
48#endif
c967f187
DE
49#if WITH_SCACHE
50 scache_install,
51#endif
c2481130 52#ifdef SIM_HAVE_MODEL
c967f187 53 model_install,
c2481130
DE
54#endif
55#ifdef SIM_HAVE_BREAKPOINTS
56 sim_break_install,
c967f187
DE
57#endif
58 /* Configured in [simulator specific] additional modules. */
59#ifdef MODULE_LIST
60 MODULE_LIST
61#endif
62 0
63};
64\f
65/* Functions called from sim_open. */
66
67/* Initialize common parts before argument processing. */
68
69SIM_RC
70sim_pre_argv_init (SIM_DESC sd, const char *myname)
71{
fdd64f95 72 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
0e701ac3
AC
73 SIM_ASSERT (STATE_MODULES (sd) == NULL);
74
c967f187
DE
75 STATE_MY_NAME (sd) = myname + strlen (myname);
76 while (STATE_MY_NAME (sd) > myname && STATE_MY_NAME (sd)[-1] != '/')
77 --STATE_MY_NAME (sd);
78
966df580
DE
79 /* Set the cpu names to default values. */
80 {
81 int i;
82 for (i = 0; i < MAX_NR_PROCESSORS; ++i)
83 {
baf8377d 84 char *name;
966df580
DE
85 asprintf (&name, "cpu%d", i);
86 CPU_NAME (STATE_CPU (sd, i)) = name;
87 }
88 }
89
c967f187
DE
90 /* Install all configured in modules. */
91 if (sim_module_install (sd) != SIM_RC_OK)
92 return SIM_RC_FAIL;
93
94 return SIM_RC_OK;
95}
96
97/* Initialize common parts after argument processing. */
98
99SIM_RC
100sim_post_argv_init (SIM_DESC sd)
101{
102 int i;
fdd64f95 103 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
0e701ac3 104 SIM_ASSERT (STATE_MODULES (sd) != NULL);
c967f187
DE
105
106 if (sim_module_init (sd) != SIM_RC_OK)
107 return SIM_RC_FAIL;
108
109 /* Set the cpu->state backlinks for each cpu. */
110 for (i = 0; i < MAX_NR_PROCESSORS; ++i)
111 CPU_STATE (STATE_CPU (sd, i)) = sd;
112
113 return SIM_RC_OK;
114}
115\f
c2481130
DE
116/* Install all modules.
117 If this fails, no modules are left installed. */
c967f187
DE
118
119SIM_RC
120sim_module_install (SIM_DESC sd)
121{
122 MODULE_INSTALL_FN * const *modp;
0e701ac3 123
fdd64f95 124 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
0e701ac3 125 SIM_ASSERT (STATE_MODULES (sd) == NULL);
c967f187 126
0e701ac3 127 STATE_MODULES (sd) = ZALLOC (struct module_list);
c967f187
DE
128 for (modp = modules; *modp != NULL; ++modp)
129 {
130 if ((*modp) (sd) != SIM_RC_OK)
c2481130
DE
131 {
132 sim_module_uninstall (sd);
0e701ac3 133 SIM_ASSERT (STATE_MODULES (sd) == NULL);
c2481130
DE
134 return SIM_RC_FAIL;
135 }
c967f187
DE
136 }
137 return SIM_RC_OK;
138}
139
140/* Called after all modules have been installed and after argv
141 has been processed. */
142
143SIM_RC
144sim_module_init (SIM_DESC sd)
145{
0e701ac3 146 struct module_list *modules = STATE_MODULES (sd);
c967f187 147 MODULE_INIT_LIST *modp;
0e701ac3 148
fdd64f95 149 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
0e701ac3 150 SIM_ASSERT (STATE_MODULES (sd) == NULL);
c967f187 151
0e701ac3 152 for (modp = modules->init_list; modp != NULL; modp = modp->next)
c967f187
DE
153 {
154 if ((*modp->fn) (sd) != SIM_RC_OK)
155 return SIM_RC_FAIL;
156 }
157 return SIM_RC_OK;
158}
159
fdd64f95
AC
160/* Called when ever the simulator is resumed */
161
162SIM_RC
163sim_module_resume (SIM_DESC sd)
164{
0e701ac3 165 struct module_list *modules = STATE_MODULES (sd);
fdd64f95 166 MODULE_RESUME_LIST *modp;
0e701ac3 167
fdd64f95 168 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
0e701ac3 169 SIM_ASSERT (STATE_MODULES (sd) == NULL);
fdd64f95 170
0e701ac3 171 for (modp = modules->resume_list; modp != NULL; modp = modp->next)
fdd64f95
AC
172 {
173 if ((*modp->fn) (sd) != SIM_RC_OK)
174 return SIM_RC_FAIL;
175 }
176 return SIM_RC_OK;
177}
178
179/* Called when ever the simulator is suspended */
180
181SIM_RC
182sim_module_suspend (SIM_DESC sd)
183{
0e701ac3 184 struct module_list *modules = STATE_MODULES (sd);
fdd64f95 185 MODULE_SUSPEND_LIST *modp;
0e701ac3 186
fdd64f95 187 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
0e701ac3 188 SIM_ASSERT (STATE_MODULES (sd) == NULL);
fdd64f95 189
0e701ac3 190 for (modp = modules->suspend_list; modp != NULL; modp = modp->next)
fdd64f95
AC
191 {
192 if ((*modp->fn) (sd) != SIM_RC_OK)
193 return SIM_RC_FAIL;
194 }
195 return SIM_RC_OK;
196}
197
c967f187
DE
198/* Uninstall installed modules, called by sim_close. */
199
200void
201sim_module_uninstall (SIM_DESC sd)
202{
0e701ac3 203 struct module_list *modules = STATE_MODULES (sd);
c967f187 204 MODULE_UNINSTALL_LIST *modp;
0e701ac3 205
fdd64f95 206 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
0e701ac3 207 SIM_ASSERT (STATE_MODULES (sd) == NULL);
c967f187
DE
208
209 /* Uninstall the modules. */
0e701ac3 210 for (modp = modules->uninstall_list; modp != NULL; modp = modp->next)
c967f187 211 (*modp->fn) (sd);
0e701ac3
AC
212
213 /* clean-up init list */
214 {
215 MODULE_INIT_LIST *n, *d;
216 for (d = modules->init_list; d != NULL; d = n)
217 {
218 n = d->next;
219 zfree (d);
220 }
221 }
222
223 /* clean-up resume list */
224 {
225 MODULE_RESUME_LIST *n, *d;
226 for (d = modules->resume_list; d != NULL; d = n)
227 {
228 n = d->next;
229 zfree (d);
230 }
231 }
232
233 /* clean-up suspend list */
234 {
235 MODULE_SUSPEND_LIST *n, *d;
236 for (d = modules->suspend_list; d != NULL; d = n)
237 {
238 n = d->next;
239 zfree (d);
240 }
241 }
242
243 /* clean-up uninstall list */
244 {
245 MODULE_UNINSTALL_LIST *n, *d;
246 for (d = modules->uninstall_list; d != NULL; d = n)
247 {
248 n = d->next;
249 zfree (d);
250 }
251 }
252
253 /* clean-up info list */
254 {
255 MODULE_INFO_LIST *n, *d;
256 for (d = modules->info_list; d != NULL; d = n)
257 {
258 n = d->next;
259 zfree (d);
260 }
261 }
262
263 zfree (modules);
264 STATE_MODULES (sd) = NULL;
265}
266
267/* Called when ever simulator info is needed */
268
269void
270sim_module_info (SIM_DESC sd, int verbose)
271{
272 struct module_list *modules = STATE_MODULES (sd);
273 MODULE_INFO_LIST *modp;
274
275 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
276 SIM_ASSERT (STATE_MODULES (sd) == NULL);
277
278 for (modp = modules->info_list; modp != NULL; modp = modp->next)
279 {
280 (*modp->fn) (sd, verbose);
281 }
c967f187
DE
282}
283\f
fdd64f95
AC
284/* Add FN to the init handler list.
285 init in the same order as the install. */
c967f187
DE
286
287void
288sim_module_add_init_fn (SIM_DESC sd, MODULE_INIT_FN fn)
289{
0e701ac3
AC
290 struct module_list *modules = STATE_MODULES (sd);
291 MODULE_INIT_LIST *l = ZALLOC (MODULE_INIT_LIST);
292 MODULE_INIT_LIST **last;
293
fdd64f95 294 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
0e701ac3 295 SIM_ASSERT (STATE_MODULES (sd) == NULL);
fdd64f95 296
0e701ac3 297 last = &modules->init_list;
fdd64f95
AC
298 while (*last != NULL)
299 last = &((*last)->next);
300
301 l->fn = fn;
302 l->next = NULL;
303 *last = l;
304}
305
306/* Add FN to the resume handler list.
307 resume in the same order as the install. */
308
309void
310sim_module_add_resume_fn (SIM_DESC sd, MODULE_RESUME_FN fn)
311{
0e701ac3 312 struct module_list *modules = STATE_MODULES (sd);
fdd64f95
AC
313 MODULE_RESUME_LIST *l = ZALLOC (MODULE_RESUME_LIST);
314 MODULE_RESUME_LIST **last;
0e701ac3 315
fdd64f95 316 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
0e701ac3 317 SIM_ASSERT (STATE_MODULES (sd) == NULL);
fdd64f95 318
0e701ac3 319 last = &modules->resume_list;
fdd64f95
AC
320 while (*last != NULL)
321 last = &((*last)->next);
322
323 l->fn = fn;
324 l->next = NULL;
325 *last = l;
326}
327
328/* Add FN to the init handler list.
329 suspend in the reverse order to install. */
330
331void
332sim_module_add_suspend_fn (SIM_DESC sd, MODULE_SUSPEND_FN fn)
333{
0e701ac3 334 struct module_list *modules = STATE_MODULES (sd);
fdd64f95
AC
335 MODULE_SUSPEND_LIST *l = ZALLOC (MODULE_SUSPEND_LIST);
336 MODULE_SUSPEND_LIST **last;
0e701ac3 337
fdd64f95 338 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
0e701ac3 339 SIM_ASSERT (STATE_MODULES (sd) == NULL);
fdd64f95 340
0e701ac3 341 last = &modules->suspend_list;
fdd64f95
AC
342 while (*last != NULL)
343 last = &((*last)->next);
c967f187
DE
344
345 l->fn = fn;
0e701ac3
AC
346 l->next = modules->suspend_list;
347 modules->suspend_list = l;
c967f187
DE
348}
349
fdd64f95
AC
350/* Add FN to the uninstall handler list.
351 Uninstall in reverse order to install. */
c967f187
DE
352
353void
354sim_module_add_uninstall_fn (SIM_DESC sd, MODULE_UNINSTALL_FN fn)
355{
0e701ac3
AC
356 struct module_list *modules = STATE_MODULES (sd);
357 MODULE_UNINSTALL_LIST *l = ZALLOC (MODULE_UNINSTALL_LIST);
358
359 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
360 SIM_ASSERT (STATE_MODULES (sd) == NULL);
361
362 l->fn = fn;
363 l->next = modules->uninstall_list;
364 modules->uninstall_list = l;
365}
366
367/* Add FN to the info handler list.
368 Report info in the same order as the install. */
369
370void
371sim_module_add_info_fn (SIM_DESC sd, MODULE_INFO_FN fn)
372{
373 struct module_list *modules = STATE_MODULES (sd);
374 MODULE_INFO_LIST *l = ZALLOC (MODULE_INFO_LIST);
375 MODULE_INFO_LIST **last;
376
377 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
378 SIM_ASSERT (STATE_MODULES (sd) == NULL);
379
380 last = &modules->info_list;
381 while (*last != NULL)
382 last = &((*last)->next);
c967f187
DE
383
384 l->fn = fn;
0e701ac3
AC
385 l->next = NULL;
386 *last = l;
c967f187 387}