delete FIXME
[binutils-gdb.git] / sim / common / sim-module.c
1 /* Module support.
2 Copyright (C) 1996, 1997 Free Software Foundation, Inc.
3 Contributed by Cygnus Support.
4
5 This file is part of GDB, the GNU debugger.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License along
18 with this program; if not, write to the Free Software Foundation, Inc.,
19 59 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"
24 #include "sim-assert.h"
25
26 #include "libiberty.h"
27
28 /* List of all modules. */
29 static MODULE_INSTALL_FN * const modules[] = {
30 standard_install,
31 sim_events_install,
32 #if WITH_ENGINE
33 sim_engine_install,
34 #endif
35 #if WITH_TRACE
36 trace_install,
37 #endif
38 #if WITH_PROFILE
39 profile_install,
40 #endif
41 sim_core_install,
42 #ifndef SIM_HAVE_FLATMEM
43 /* FIXME: should handle flatmem as well FLATMEM */
44 sim_memopt_install,
45 #endif
46 #if WITH_WATCHPOINTS
47 sim_watchpoint_install,
48 #endif
49 #if WITH_SCACHE
50 scache_install,
51 #endif
52 #ifdef SIM_HAVE_MODEL
53 model_install,
54 #endif
55 #ifdef SIM_HAVE_BREAKPOINTS
56 sim_break_install,
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
69 SIM_RC
70 sim_pre_argv_init (SIM_DESC sd, const char *myname)
71 {
72 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
73 STATE_MY_NAME (sd) = myname + strlen (myname);
74 while (STATE_MY_NAME (sd) > myname && STATE_MY_NAME (sd)[-1] != '/')
75 --STATE_MY_NAME (sd);
76
77 /* Install all configured in modules. */
78 if (sim_module_install (sd) != SIM_RC_OK)
79 return SIM_RC_FAIL;
80
81 return SIM_RC_OK;
82 }
83
84 /* Initialize common parts after argument processing. */
85
86 SIM_RC
87 sim_post_argv_init (SIM_DESC sd)
88 {
89 int i;
90 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
91
92 if (sim_module_init (sd) != SIM_RC_OK)
93 return SIM_RC_FAIL;
94
95 /* Set the cpu->state backlinks for each cpu. */
96 for (i = 0; i < MAX_NR_PROCESSORS; ++i)
97 CPU_STATE (STATE_CPU (sd, i)) = sd;
98
99 return SIM_RC_OK;
100 }
101 \f
102 /* Install all modules.
103 If this fails, no modules are left installed. */
104
105 SIM_RC
106 sim_module_install (SIM_DESC sd)
107 {
108 MODULE_INSTALL_FN * const *modp;
109 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
110
111 for (modp = modules; *modp != NULL; ++modp)
112 {
113 if ((*modp) (sd) != SIM_RC_OK)
114 {
115 sim_module_uninstall (sd);
116 return SIM_RC_FAIL;
117 }
118 }
119 return SIM_RC_OK;
120 }
121
122 /* Called after all modules have been installed and after argv
123 has been processed. */
124
125 SIM_RC
126 sim_module_init (SIM_DESC sd)
127 {
128 MODULE_INIT_LIST *modp;
129 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
130
131 for (modp = STATE_INIT_LIST (sd); modp != NULL; modp = modp->next)
132 {
133 if ((*modp->fn) (sd) != SIM_RC_OK)
134 return SIM_RC_FAIL;
135 }
136 return SIM_RC_OK;
137 }
138
139 /* Called when ever the simulator is resumed */
140
141 SIM_RC
142 sim_module_resume (SIM_DESC sd)
143 {
144 MODULE_RESUME_LIST *modp;
145 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
146
147 for (modp = STATE_RESUME_LIST (sd); modp != NULL; modp = modp->next)
148 {
149 if ((*modp->fn) (sd) != SIM_RC_OK)
150 return SIM_RC_FAIL;
151 }
152 return SIM_RC_OK;
153 }
154
155 /* Called when ever the simulator is suspended */
156
157 SIM_RC
158 sim_module_suspend (SIM_DESC sd)
159 {
160 MODULE_SUSPEND_LIST *modp;
161 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
162
163 for (modp = STATE_SUSPEND_LIST (sd); modp != NULL; modp = modp->next)
164 {
165 if ((*modp->fn) (sd) != SIM_RC_OK)
166 return SIM_RC_FAIL;
167 }
168 return SIM_RC_OK;
169 }
170
171 /* Uninstall installed modules, called by sim_close. */
172
173 void
174 sim_module_uninstall (SIM_DESC sd)
175 {
176 MODULE_UNINSTALL_LIST *modp;
177 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
178
179 /* Uninstall the modules. */
180 for (modp = STATE_UNINSTALL_LIST (sd); modp != NULL; modp = modp->next)
181 (*modp->fn) (sd);
182 }
183 \f
184 /* Add FN to the init handler list.
185 init in the same order as the install. */
186
187 void
188 sim_module_add_init_fn (SIM_DESC sd, MODULE_INIT_FN fn)
189 {
190 MODULE_INIT_LIST *l =
191 (MODULE_INIT_LIST *) xmalloc (sizeof (MODULE_INIT_LIST));
192 MODULE_INIT_LIST **last = &STATE_INIT_LIST (sd);
193 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
194
195 while (*last != NULL)
196 last = &((*last)->next);
197
198 l->fn = fn;
199 l->next = NULL;
200 *last = l;
201 }
202
203 /* Add FN to the resume handler list.
204 resume in the same order as the install. */
205
206 void
207 sim_module_add_resume_fn (SIM_DESC sd, MODULE_RESUME_FN fn)
208 {
209 MODULE_RESUME_LIST *l = ZALLOC (MODULE_RESUME_LIST);
210 MODULE_RESUME_LIST **last;
211 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
212
213 last = &STATE_RESUME_LIST (sd);
214 while (*last != NULL)
215 last = &((*last)->next);
216
217 l->fn = fn;
218 l->next = NULL;
219 *last = l;
220 }
221
222 /* Add FN to the init handler list.
223 suspend in the reverse order to install. */
224
225 void
226 sim_module_add_suspend_fn (SIM_DESC sd, MODULE_SUSPEND_FN fn)
227 {
228 MODULE_SUSPEND_LIST *l = ZALLOC (MODULE_SUSPEND_LIST);
229 MODULE_SUSPEND_LIST **last;
230 SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
231
232 last = &STATE_SUSPEND_LIST (sd);
233 while (*last != NULL)
234 last = &((*last)->next);
235
236 l->fn = fn;
237 l->next = STATE_SUSPEND_LIST (sd);
238 STATE_SUSPEND_LIST (sd) = l;
239 }
240
241 /* Add FN to the uninstall handler list.
242 Uninstall in reverse order to install. */
243
244 void
245 sim_module_add_uninstall_fn (SIM_DESC sd, MODULE_UNINSTALL_FN fn)
246 {
247 MODULE_UNINSTALL_LIST *l =
248 (MODULE_UNINSTALL_LIST *) xmalloc (sizeof (MODULE_UNINSTALL_LIST));
249
250 l->fn = fn;
251 l->next = STATE_UNINSTALL_LIST (sd);
252 STATE_UNINSTALL_LIST (sd) = l;
253 }