Commit | Line | Data |
---|---|---|
a332e593 | 1 | /* Remote debugging interface for Zilog Z8000 simulator |
f48c6d1a | 2 | Copyright 1992,1993 Free Software Foundation, Inc. |
a332e593 SC |
3 | Contributed by Cygnus Support. Written by Steve Chamberlain |
4 | (sac@cygnus.com). | |
5 | ||
6 | This file is part of GDB. | |
7 | ||
8 | This program is free software; you can redistribute it and/or modify | |
9 | it under the terms of the GNU General Public License as published by | |
10 | the Free Software Foundation; either version 2 of the License, or | |
11 | (at your option) any later version. | |
12 | ||
13 | This program is distributed in the hope that it will be useful, | |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
17 | ||
18 | You should have received a copy of the GNU General Public License | |
19 | along with this program; if not, write to the Free Software | |
20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
21 | ||
22 | #include "defs.h" | |
23 | #include "inferior.h" | |
24 | #include "wait.h" | |
25 | #include "value.h" | |
26 | #include <string.h> | |
27 | #include <ctype.h> | |
28 | #include <fcntl.h> | |
29 | #include <signal.h> | |
30 | #include <setjmp.h> | |
31 | #include <errno.h> | |
32 | #include "terminal.h" | |
33 | #include "target.h" | |
34 | #include "gdbcore.h" | |
6d2f03fe | 35 | #include "../sim/z8k/sim.h" |
a332e593 SC |
36 | |
37 | /* External data declarations */ | |
e4ebb8e5 | 38 | extern int stop_soon_quietly; /* for wait_for_inferior */ |
a332e593 SC |
39 | |
40 | /* Forward data declarations */ | |
863099f4 | 41 | /*extern struct target_ops sim_ops; /* Forward declaration */ |
a332e593 | 42 | |
e4ebb8e5 SC |
43 | void sim_store_register (); |
44 | void sim_set_oc (); | |
a332e593 | 45 | |
863099f4 | 46 | int inferior_pid; |
a332e593 SC |
47 | int |
48 | sim_write_inferior_memory (memaddr, myaddr, len) | |
49 | CORE_ADDR memaddr; | |
50 | unsigned char *myaddr; | |
51 | int len; | |
52 | { | |
e4ebb8e5 | 53 | sim_write (memaddr, myaddr, len); |
1f21d3dc | 54 | return 1; |
a332e593 SC |
55 | } |
56 | ||
1f21d3dc | 57 | static void |
e4ebb8e5 SC |
58 | store_register (regno) |
59 | int regno; | |
a332e593 | 60 | { |
e4ebb8e5 SC |
61 | if (regno == -1) |
62 | { | |
63 | for (regno = 0; regno < 16; regno++) | |
64 | { | |
65 | store_register (regno); | |
66 | } | |
67 | } | |
68 | else | |
f48c6d1a | 69 | { |
e4ebb8e5 | 70 | sim_store_register (regno, read_register (regno)); |
f48c6d1a | 71 | } |
a332e593 SC |
72 | } |
73 | ||
a332e593 | 74 | void |
e4ebb8e5 SC |
75 | sim_kill (arg, from_tty) |
76 | char *arg; | |
77 | int from_tty; | |
a332e593 | 78 | { |
a332e593 SC |
79 | } |
80 | ||
a332e593 | 81 | /* |
e4ebb8e5 | 82 | * Download a file specified in 'args', to the sim. |
a332e593 SC |
83 | */ |
84 | static void | |
863099f4 | 85 | sasassim_load (args, fromtty) |
e4ebb8e5 SC |
86 | char *args; |
87 | int fromtty; | |
a332e593 | 88 | { |
e4ebb8e5 | 89 | bfd *abfd; |
a332e593 SC |
90 | asection *s; |
91 | ||
e4ebb8e5 SC |
92 | inferior_pid = 0; |
93 | abfd = bfd_openr (args, "coff-z8k"); | |
a332e593 | 94 | |
e4ebb8e5 SC |
95 | if (!abfd) |
96 | { | |
97 | printf_filtered ("Unable to open file %s\n", args); | |
98 | return; | |
99 | } | |
a332e593 | 100 | |
e4ebb8e5 SC |
101 | if (bfd_check_format (abfd, bfd_object) == 0) |
102 | { | |
103 | printf_filtered ("File is not an object file\n"); | |
104 | return; | |
105 | } | |
a332e593 SC |
106 | |
107 | s = abfd->sections; | |
e4ebb8e5 | 108 | while (s != (asection *) NULL) |
a332e593 | 109 | { |
e4ebb8e5 SC |
110 | if (s->flags & SEC_LOAD) |
111 | { | |
112 | int i; | |
113 | int delta = 4096; | |
114 | char *buffer = xmalloc (delta); | |
115 | ||
116 | printf_filtered ("%s\t: 0x%4x .. 0x%4x ", | |
117 | s->name, s->vma, s->vma + s->_raw_size); | |
118 | for (i = 0; i < s->_raw_size; i += delta) | |
119 | { | |
120 | int sub_delta = delta; | |
121 | ||
122 | if (sub_delta > s->_raw_size - i) | |
123 | sub_delta = s->_raw_size - i; | |
124 | ||
125 | bfd_get_section_contents (abfd, s, buffer, i, sub_delta); | |
126 | sim_write_inferior_memory (s->vma + i, buffer, sub_delta); | |
127 | printf_filtered ("*"); | |
199b2450 | 128 | gdb_flush (gdb_stdout); |
e4ebb8e5 SC |
129 | } |
130 | printf_filtered ("\n"); | |
131 | free (buffer); | |
132 | } | |
133 | s = s->next; | |
a332e593 | 134 | } |
a332e593 | 135 | |
e4ebb8e5 | 136 | sim_set_pc (abfd->start_address); |
a332e593 SC |
137 | } |
138 | ||
139 | /* This is called not only when we first attach, but also when the | |
140 | user types "run" after having attached. */ | |
1f21d3dc | 141 | static void |
a332e593 SC |
142 | sim_create_inferior (execfile, args, env) |
143 | char *execfile; | |
144 | char *args; | |
145 | char **env; | |
146 | { | |
147 | int entry_pt; | |
a332e593 SC |
148 | |
149 | if (args && *args) | |
e4ebb8e5 | 150 | error ("Can't pass arguments to remote sim process."); |
a332e593 SC |
151 | |
152 | if (execfile == 0 || exec_bfd == 0) | |
e4ebb8e5 | 153 | error ("No exec file specified"); |
a332e593 SC |
154 | |
155 | entry_pt = (int) bfd_get_start_address (exec_bfd); | |
156 | ||
e4ebb8e5 SC |
157 | sim_kill (NULL, NULL); |
158 | sim_clear_breakpoints (); | |
a332e593 | 159 | init_wait_for_inferior (); |
1f21d3dc | 160 | insert_breakpoints (); |
e4ebb8e5 | 161 | proceed (entry_pt, -1, 0); |
a332e593 | 162 | } |
863099f4 | 163 | #if 0 |
a332e593 SC |
164 | static void |
165 | sim_open (name, from_tty) | |
166 | char *name; | |
167 | int from_tty; | |
168 | { | |
e4ebb8e5 SC |
169 | if (name == 0) |
170 | { | |
171 | name = ""; | |
172 | } | |
a332e593 SC |
173 | |
174 | /* Clear any break points */ | |
e4ebb8e5 | 175 | sim_clear_breakpoints (); |
a332e593 SC |
176 | |
177 | push_target (&sim_ops); | |
e4ebb8e5 | 178 | target_fetch_registers (-1); |
a332e593 | 179 | |
e4ebb8e5 | 180 | printf_filtered ("Connected to the Z8000 Simulator.\n"); |
a332e593 SC |
181 | } |
182 | ||
183 | /* Close out all files and local state before this target loses control. */ | |
184 | ||
185 | static void | |
186 | sim_close (quitting) | |
187 | int quitting; | |
188 | { | |
e4ebb8e5 | 189 | sim_clear_breakpoints (); |
a332e593 SC |
190 | } |
191 | ||
192 | /* Terminate the open connection to the remote debugger. | |
193 | Use this when you want to detach and do something else | |
194 | with your gdb. */ | |
1f21d3dc | 195 | static void |
e4ebb8e5 | 196 | sim_detach (args, from_tty) |
a332e593 SC |
197 | char *args; |
198 | int from_tty; | |
199 | { | |
e4ebb8e5 SC |
200 | sim_clear_breakpoints (); |
201 | ||
202 | pop_target (); /* calls sim_close to do the real work */ | |
a332e593 | 203 | if (from_tty) |
e4ebb8e5 | 204 | printf_filtered ("Ending remote %s debugging\n", target_shortname); |
a332e593 | 205 | } |
863099f4 | 206 | #endif |
e4ebb8e5 | 207 | /* Tell the remote machine to resume. */ |
a332e593 SC |
208 | |
209 | /* Wait until the remote machine stops, then return, | |
210 | storing status in STATUS just as `wait' would. */ | |
863099f4 | 211 | #if 0 |
67ac9759 | 212 | /* See remote-sim.c for how this is done now. */ |
a332e593 | 213 | int |
de43d7d0 SG |
214 | sim_wait (pid, status) |
215 | int pid; | |
a332e593 SC |
216 | WAITTYPE *status; |
217 | { | |
863099f4 SC |
218 | sim_stop_reason (&reason, &sigrc); |
219 | return inferior_pid; | |
a332e593 | 220 | } |
863099f4 | 221 | #endif |
a332e593 SC |
222 | /* Get ready to modify the registers array. On machines which store |
223 | individual registers, this doesn't need to do anything. On machines | |
224 | which store all the registers in one fell swoop, this makes sure | |
225 | that registers contains all the registers from the program being | |
226 | debugged. */ | |
227 | ||
1f21d3dc | 228 | static void |
a332e593 SC |
229 | sim_prepare_to_store () |
230 | { | |
231 | /* Do nothing, since we can store individual regs */ | |
232 | } | |
233 | ||
a332e593 | 234 | static void |
e4ebb8e5 SC |
235 | fetch_register (regno) |
236 | int regno; | |
a332e593 | 237 | { |
e4ebb8e5 SC |
238 | if (regno == -1) |
239 | { | |
240 | for (regno = 0; regno < 16; regno++) | |
241 | fetch_register (regno); | |
242 | } | |
243 | else | |
244 | { | |
245 | char buf[MAX_REGISTER_RAW_SIZE]; | |
246 | ||
247 | sim_fetch_register (regno, buf); | |
248 | supply_register (regno, buf); | |
249 | } | |
a332e593 SC |
250 | } |
251 | ||
252 | /* Write a word WORD into remote address ADDR. | |
253 | This goes through the data cache. */ | |
254 | ||
255 | void | |
256 | sim_store_word (addr, word) | |
257 | CORE_ADDR addr; | |
258 | int word; | |
259 | { | |
260 | /* dcache_poke (addr, word);*/ | |
261 | } | |
262 | ||
263 | int | |
e4ebb8e5 | 264 | sim_xfer_inferior_memory (memaddr, myaddr, len, write, target) |
a332e593 SC |
265 | CORE_ADDR memaddr; |
266 | char *myaddr; | |
267 | int len; | |
268 | int write; | |
e4ebb8e5 | 269 | struct target_ops *target; /* ignored */ |
a332e593 SC |
270 | { |
271 | if (write) | |
e4ebb8e5 SC |
272 | { |
273 | sim_write (memaddr, myaddr, len); | |
274 | ||
275 | } | |
276 | else | |
277 | { | |
278 | sim_read (memaddr, myaddr, len); | |
279 | } | |
280 | return len; | |
a332e593 SC |
281 | } |
282 | ||
283 | void | |
284 | sim_files_info () | |
285 | { | |
f48c6d1a | 286 | char *file = "nothing"; |
e4ebb8e5 | 287 | |
f48c6d1a | 288 | if (exec_bfd) |
e4ebb8e5 | 289 | file = bfd_get_filename (exec_bfd); |
f48c6d1a | 290 | |
e4ebb8e5 | 291 | printf_filtered ("\tAttached to %s running on the z8k simulator\n", file); |
a332e593 SC |
292 | } |
293 | ||
294 | /* This routine is run as a hook, just before the main command loop is | |
295 | entered. If gdb is configured for the H8, but has not had its | |
296 | target specified yet, this will loop prompting the user to do so. | |
297 | */ | |
298 | ||
863099f4 | 299 | #if 0 |
a332e593 SC |
300 | void |
301 | sim_before_main_loop () | |
302 | { | |
a332e593 SC |
303 | push_target (&sim_ops); |
304 | } | |
305 | ||
863099f4 | 306 | |
a332e593 | 307 | /* Clear the sims notion of what the break points are */ |
1f21d3dc | 308 | static void |
e4ebb8e5 SC |
309 | sim_mourn () |
310 | { | |
311 | sim_clear_breakpoints (); | |
71607f9d | 312 | unpush_target (&sim_ops); |
a332e593 | 313 | generic_mourn_inferior (); |
a332e593 | 314 | } |
863099f4 | 315 | #endif |
e4ebb8e5 | 316 | static void |
25286543 SG |
317 | rem_resume (pid, a, b) |
318 | int pid; | |
e4ebb8e5 | 319 | int a; |
67ac9759 | 320 | enum target_signal siggnal; |
a332e593 | 321 | { |
67ac9759 | 322 | sim_resume (a, target_signal_to_host (siggnal)); |
a332e593 SC |
323 | } |
324 | ||
a332e593 | 325 | |
863099f4 SC |
326 | /* Define the target subroutine names */ |
327 | #if 0 | |
e4ebb8e5 | 328 | struct target_ops sim_ops = |
a332e593 SC |
329 | { |
330 | "sim", "Remote SIM monitor", | |
331 | "Use the Z8000 simulator", | |
e4ebb8e5 SC |
332 | sim_open, sim_close, |
333 | 0, sim_detach, rem_resume, sim_wait, /* attach */ | |
a332e593 SC |
334 | fetch_register, store_register, |
335 | sim_prepare_to_store, | |
e4ebb8e5 | 336 | sim_xfer_inferior_memory, |
a332e593 | 337 | sim_files_info, |
e4ebb8e5 | 338 | 0, 0, /* Breakpoints */ |
a332e593 SC |
339 | 0, 0, 0, 0, 0, /* Terminal handling */ |
340 | sim_kill, /* FIXME, kill */ | |
e4ebb8e5 | 341 | sim_load, |
a332e593 | 342 | 0, /* lookup_symbol */ |
e4ebb8e5 | 343 | sim_create_inferior, /* create_inferior */ |
a332e593 SC |
344 | sim_mourn, /* mourn_inferior FIXME */ |
345 | 0, /* can_run */ | |
346 | 0, /* notice_signals */ | |
347 | process_stratum, 0, /* next */ | |
348 | 1, 1, 1, 1, 1, /* all mem, mem, stack, regs, exec */ | |
e4ebb8e5 | 349 | 0, 0, /* Section pointers */ |
a332e593 SC |
350 | OPS_MAGIC, /* Always the last thing */ |
351 | }; | |
352 | ||
a332e593 SC |
353 | /***********************************************************************/ |
354 | ||
355 | void | |
356 | _initialize_remote_sim () | |
357 | { | |
a332e593 | 358 | add_target (&sim_ops); |
e4ebb8e5 | 359 | } |
863099f4 | 360 | #endif |