1e93f7393Sniklas /* Generic remote debugging interface for simulators.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
4b725ae77Skettenis 2002, 2004 Free Software Foundation, Inc.
5b725ae77Skettenis
6e93f7393Sniklas Contributed by Cygnus Support.
7e93f7393Sniklas Steve Chamberlain (sac@cygnus.com).
8e93f7393Sniklas
9e93f7393Sniklas This file is part of GDB.
10e93f7393Sniklas
11e93f7393Sniklas This program is free software; you can redistribute it and/or modify
12e93f7393Sniklas it under the terms of the GNU General Public License as published by
13e93f7393Sniklas the Free Software Foundation; either version 2 of the License, or
14e93f7393Sniklas (at your option) any later version.
15e93f7393Sniklas
16e93f7393Sniklas This program is distributed in the hope that it will be useful,
17e93f7393Sniklas but WITHOUT ANY WARRANTY; without even the implied warranty of
18e93f7393Sniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19e93f7393Sniklas GNU General Public License for more details.
20e93f7393Sniklas
21e93f7393Sniklas You should have received a copy of the GNU General Public License
22e93f7393Sniklas along with this program; if not, write to the Free Software
23b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
24b725ae77Skettenis Boston, MA 02111-1307, USA. */
25e93f7393Sniklas
26e93f7393Sniklas #include "defs.h"
27e93f7393Sniklas #include "inferior.h"
28e93f7393Sniklas #include "value.h"
29e93f7393Sniklas #include "gdb_string.h"
30e93f7393Sniklas #include <ctype.h>
31e93f7393Sniklas #include <fcntl.h>
32e93f7393Sniklas #include <signal.h>
33e93f7393Sniklas #include <setjmp.h>
34e93f7393Sniklas #include <errno.h>
35e93f7393Sniklas #include "terminal.h"
36e93f7393Sniklas #include "target.h"
37e93f7393Sniklas #include "gdbcore.h"
38b725ae77Skettenis #include "gdb/callback.h"
39b725ae77Skettenis #include "gdb/remote-sim.h"
40e93f7393Sniklas #include "remote-utils.h"
41b725ae77Skettenis #include "command.h"
42b725ae77Skettenis #include "regcache.h"
43b725ae77Skettenis #include "gdb_assert.h"
44b725ae77Skettenis #include "sim-regno.h"
45b725ae77Skettenis #include "arch-utils.h"
46e93f7393Sniklas
47e93f7393Sniklas /* Prototypes */
48e93f7393Sniklas
49b725ae77Skettenis extern void _initialize_remote_sim (void);
50e93f7393Sniklas
51b725ae77Skettenis static void dump_mem (char *buf, int len);
52e93f7393Sniklas
53b725ae77Skettenis static void init_callbacks (void);
54e93f7393Sniklas
55b725ae77Skettenis static void end_callbacks (void);
56e93f7393Sniklas
57b725ae77Skettenis static int gdb_os_write_stdout (host_callback *, const char *, int);
58e93f7393Sniklas
59b725ae77Skettenis static void gdb_os_flush_stdout (host_callback *);
60e93f7393Sniklas
61b725ae77Skettenis static int gdb_os_write_stderr (host_callback *, const char *, int);
62e93f7393Sniklas
63b725ae77Skettenis static void gdb_os_flush_stderr (host_callback *);
64e93f7393Sniklas
65b725ae77Skettenis static int gdb_os_poll_quit (host_callback *);
66e93f7393Sniklas
67b725ae77Skettenis /* printf_filtered is depreciated */
68b725ae77Skettenis static void gdb_os_printf_filtered (host_callback *, const char *, ...);
69e93f7393Sniklas
70b725ae77Skettenis static void gdb_os_vprintf_filtered (host_callback *, const char *, va_list);
71e93f7393Sniklas
72b725ae77Skettenis static void gdb_os_evprintf_filtered (host_callback *, const char *, va_list);
73e93f7393Sniklas
74b725ae77Skettenis static void gdb_os_error (host_callback *, const char *, ...);
75e93f7393Sniklas
76b725ae77Skettenis static void gdbsim_fetch_register (int regno);
77e93f7393Sniklas
78b725ae77Skettenis static void gdbsim_store_register (int regno);
79b725ae77Skettenis
80b725ae77Skettenis static void gdbsim_kill (void);
81b725ae77Skettenis
82b725ae77Skettenis static void gdbsim_load (char *prog, int fromtty);
83b725ae77Skettenis
84b725ae77Skettenis static void gdbsim_open (char *args, int from_tty);
85b725ae77Skettenis
86b725ae77Skettenis static void gdbsim_close (int quitting);
87b725ae77Skettenis
88b725ae77Skettenis static void gdbsim_detach (char *args, int from_tty);
89b725ae77Skettenis
90b725ae77Skettenis static void gdbsim_resume (ptid_t ptid, int step, enum target_signal siggnal);
91b725ae77Skettenis
92b725ae77Skettenis static ptid_t gdbsim_wait (ptid_t ptid, struct target_waitstatus *status);
93b725ae77Skettenis
94b725ae77Skettenis static void gdbsim_prepare_to_store (void);
95b725ae77Skettenis
96b725ae77Skettenis static int gdbsim_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr,
97b725ae77Skettenis int len, int write,
98b725ae77Skettenis struct mem_attrib *attrib,
99b725ae77Skettenis struct target_ops *target);
100b725ae77Skettenis
101b725ae77Skettenis static void gdbsim_files_info (struct target_ops *target);
102b725ae77Skettenis
103b725ae77Skettenis static void gdbsim_mourn_inferior (void);
104b725ae77Skettenis
105b725ae77Skettenis static void gdbsim_stop (void);
106b725ae77Skettenis
107b725ae77Skettenis void simulator_command (char *args, int from_tty);
108e93f7393Sniklas
109e93f7393Sniklas /* Naming convention:
110e93f7393Sniklas
111e93f7393Sniklas sim_* are the interface to the simulator (see remote-sim.h).
112e93f7393Sniklas gdbsim_* are stuff which is internal to gdb. */
113e93f7393Sniklas
114e93f7393Sniklas /* Forward data declarations */
115e93f7393Sniklas extern struct target_ops gdbsim_ops;
116e93f7393Sniklas
117e93f7393Sniklas static int program_loaded = 0;
118e93f7393Sniklas
119b725ae77Skettenis /* We must keep track of whether the simulator has been opened or not because
120b725ae77Skettenis GDB can call a target's close routine twice, but sim_close doesn't allow
121b725ae77Skettenis this. We also need to record the result of sim_open so we can pass it
122b725ae77Skettenis back to the other sim_foo routines. */
123b725ae77Skettenis static SIM_DESC gdbsim_desc = 0;
124b725ae77Skettenis
125e93f7393Sniklas static void
dump_mem(char * buf,int len)126b725ae77Skettenis dump_mem (char *buf, int len)
127e93f7393Sniklas {
128e93f7393Sniklas if (len <= 8)
129e93f7393Sniklas {
130e93f7393Sniklas if (len == 8 || len == 4)
131e93f7393Sniklas {
132e93f7393Sniklas long l[2];
133e93f7393Sniklas memcpy (l, buf, len);
134b725ae77Skettenis printf_filtered ("\t0x%lx", l[0]);
135b725ae77Skettenis if (len == 8)
136b725ae77Skettenis printf_filtered (" 0x%lx", l[1]);
137b725ae77Skettenis printf_filtered ("\n");
138e93f7393Sniklas }
139e93f7393Sniklas else
140e93f7393Sniklas {
141e93f7393Sniklas int i;
142e93f7393Sniklas printf_filtered ("\t");
143e93f7393Sniklas for (i = 0; i < len; i++)
144e93f7393Sniklas printf_filtered ("0x%x ", buf[i]);
145e93f7393Sniklas printf_filtered ("\n");
146e93f7393Sniklas }
147e93f7393Sniklas }
148e93f7393Sniklas }
149e93f7393Sniklas
150b725ae77Skettenis static host_callback gdb_callback;
151b725ae77Skettenis static int callbacks_initialized = 0;
152b725ae77Skettenis
153b725ae77Skettenis /* Initialize gdb_callback. */
154b725ae77Skettenis
155e93f7393Sniklas static void
init_callbacks(void)156b725ae77Skettenis init_callbacks (void)
157b725ae77Skettenis {
158b725ae77Skettenis if (!callbacks_initialized)
159b725ae77Skettenis {
160b725ae77Skettenis gdb_callback = default_callback;
161b725ae77Skettenis gdb_callback.init (&gdb_callback);
162b725ae77Skettenis gdb_callback.write_stdout = gdb_os_write_stdout;
163b725ae77Skettenis gdb_callback.flush_stdout = gdb_os_flush_stdout;
164b725ae77Skettenis gdb_callback.write_stderr = gdb_os_write_stderr;
165b725ae77Skettenis gdb_callback.flush_stderr = gdb_os_flush_stderr;
166b725ae77Skettenis gdb_callback.printf_filtered = gdb_os_printf_filtered;
167b725ae77Skettenis gdb_callback.vprintf_filtered = gdb_os_vprintf_filtered;
168b725ae77Skettenis gdb_callback.evprintf_filtered = gdb_os_evprintf_filtered;
169b725ae77Skettenis gdb_callback.error = gdb_os_error;
170b725ae77Skettenis gdb_callback.poll_quit = gdb_os_poll_quit;
171b725ae77Skettenis gdb_callback.magic = HOST_CALLBACK_MAGIC;
172b725ae77Skettenis callbacks_initialized = 1;
173b725ae77Skettenis }
174b725ae77Skettenis }
175b725ae77Skettenis
176b725ae77Skettenis /* Release callbacks (free resources used by them). */
177b725ae77Skettenis
178b725ae77Skettenis static void
end_callbacks(void)179b725ae77Skettenis end_callbacks (void)
180b725ae77Skettenis {
181b725ae77Skettenis if (callbacks_initialized)
182b725ae77Skettenis {
183b725ae77Skettenis gdb_callback.shutdown (&gdb_callback);
184b725ae77Skettenis callbacks_initialized = 0;
185b725ae77Skettenis }
186b725ae77Skettenis }
187b725ae77Skettenis
188b725ae77Skettenis /* GDB version of os_write_stdout callback. */
189b725ae77Skettenis
190b725ae77Skettenis static int
gdb_os_write_stdout(host_callback * p,const char * buf,int len)191b725ae77Skettenis gdb_os_write_stdout (host_callback *p, const char *buf, int len)
192b725ae77Skettenis {
193b725ae77Skettenis int i;
194b725ae77Skettenis char b[2];
195b725ae77Skettenis
196b725ae77Skettenis ui_file_write (gdb_stdtarg, buf, len);
197b725ae77Skettenis return len;
198b725ae77Skettenis }
199b725ae77Skettenis
200b725ae77Skettenis /* GDB version of os_flush_stdout callback. */
201b725ae77Skettenis
202b725ae77Skettenis static void
gdb_os_flush_stdout(host_callback * p)203b725ae77Skettenis gdb_os_flush_stdout (host_callback *p)
204b725ae77Skettenis {
205b725ae77Skettenis gdb_flush (gdb_stdtarg);
206b725ae77Skettenis }
207b725ae77Skettenis
208b725ae77Skettenis /* GDB version of os_write_stderr callback. */
209b725ae77Skettenis
210b725ae77Skettenis static int
gdb_os_write_stderr(host_callback * p,const char * buf,int len)211b725ae77Skettenis gdb_os_write_stderr (host_callback *p, const char *buf, int len)
212b725ae77Skettenis {
213b725ae77Skettenis int i;
214b725ae77Skettenis char b[2];
215b725ae77Skettenis
216b725ae77Skettenis for (i = 0; i < len; i++)
217b725ae77Skettenis {
218b725ae77Skettenis b[0] = buf[i];
219b725ae77Skettenis b[1] = 0;
220b725ae77Skettenis fputs_unfiltered (b, gdb_stdtargerr);
221b725ae77Skettenis }
222b725ae77Skettenis return len;
223b725ae77Skettenis }
224b725ae77Skettenis
225b725ae77Skettenis /* GDB version of os_flush_stderr callback. */
226b725ae77Skettenis
227b725ae77Skettenis static void
gdb_os_flush_stderr(host_callback * p)228b725ae77Skettenis gdb_os_flush_stderr (host_callback *p)
229b725ae77Skettenis {
230b725ae77Skettenis gdb_flush (gdb_stdtargerr);
231b725ae77Skettenis }
232b725ae77Skettenis
233b725ae77Skettenis /* GDB version of printf_filtered callback. */
234b725ae77Skettenis
235b725ae77Skettenis static void
gdb_os_printf_filtered(host_callback * p,const char * format,...)236b725ae77Skettenis gdb_os_printf_filtered (host_callback * p, const char *format,...)
237b725ae77Skettenis {
238b725ae77Skettenis va_list args;
239b725ae77Skettenis va_start (args, format);
240b725ae77Skettenis
241b725ae77Skettenis vfprintf_filtered (gdb_stdout, format, args);
242b725ae77Skettenis
243b725ae77Skettenis va_end (args);
244b725ae77Skettenis }
245b725ae77Skettenis
246b725ae77Skettenis /* GDB version of error vprintf_filtered. */
247b725ae77Skettenis
248b725ae77Skettenis static void
gdb_os_vprintf_filtered(host_callback * p,const char * format,va_list ap)249b725ae77Skettenis gdb_os_vprintf_filtered (host_callback * p, const char *format, va_list ap)
250b725ae77Skettenis {
251b725ae77Skettenis vfprintf_filtered (gdb_stdout, format, ap);
252b725ae77Skettenis }
253b725ae77Skettenis
254b725ae77Skettenis /* GDB version of error evprintf_filtered. */
255b725ae77Skettenis
256b725ae77Skettenis static void
gdb_os_evprintf_filtered(host_callback * p,const char * format,va_list ap)257b725ae77Skettenis gdb_os_evprintf_filtered (host_callback * p, const char *format, va_list ap)
258b725ae77Skettenis {
259b725ae77Skettenis vfprintf_filtered (gdb_stderr, format, ap);
260b725ae77Skettenis }
261b725ae77Skettenis
262b725ae77Skettenis /* GDB version of error callback. */
263b725ae77Skettenis
264b725ae77Skettenis static void
gdb_os_error(host_callback * p,const char * format,...)265b725ae77Skettenis gdb_os_error (host_callback * p, const char *format,...)
266b725ae77Skettenis {
267*63addd46Skettenis if (deprecated_error_hook)
268*63addd46Skettenis (*deprecated_error_hook) ();
269b725ae77Skettenis else
270b725ae77Skettenis {
271b725ae77Skettenis va_list args;
272b725ae77Skettenis va_start (args, format);
273b725ae77Skettenis verror (format, args);
274b725ae77Skettenis va_end (args);
275b725ae77Skettenis }
276b725ae77Skettenis }
277b725ae77Skettenis
278b725ae77Skettenis int
one2one_register_sim_regno(int regnum)279b725ae77Skettenis one2one_register_sim_regno (int regnum)
280b725ae77Skettenis {
281b725ae77Skettenis /* Only makes sense to supply raw registers. */
282b725ae77Skettenis gdb_assert (regnum >= 0 && regnum < NUM_REGS);
283b725ae77Skettenis return regnum;
284b725ae77Skettenis }
285b725ae77Skettenis
286b725ae77Skettenis static void
gdbsim_fetch_register(int regno)287b725ae77Skettenis gdbsim_fetch_register (int regno)
288e93f7393Sniklas {
289e93f7393Sniklas if (regno == -1)
290e93f7393Sniklas {
291e93f7393Sniklas for (regno = 0; regno < NUM_REGS; regno++)
292e93f7393Sniklas gdbsim_fetch_register (regno);
293b725ae77Skettenis return;
294e93f7393Sniklas }
295e93f7393Sniklas
296b725ae77Skettenis switch (REGISTER_SIM_REGNO (regno))
297b725ae77Skettenis {
298b725ae77Skettenis case LEGACY_SIM_REGNO_IGNORE:
299b725ae77Skettenis break;
300b725ae77Skettenis case SIM_REGNO_DOES_NOT_EXIST:
301b725ae77Skettenis {
302b725ae77Skettenis /* For moment treat a `does not exist' register the same way
303b725ae77Skettenis as an ``unavailable'' register. */
304b725ae77Skettenis char buf[MAX_REGISTER_SIZE];
305b725ae77Skettenis int nr_bytes;
306b725ae77Skettenis memset (buf, 0, MAX_REGISTER_SIZE);
307*63addd46Skettenis regcache_raw_supply (current_regcache, regno, buf);
308b725ae77Skettenis set_register_cached (regno, -1);
309b725ae77Skettenis break;
310b725ae77Skettenis }
311b725ae77Skettenis default:
312b725ae77Skettenis {
313b725ae77Skettenis static int warn_user = 1;
314b725ae77Skettenis char buf[MAX_REGISTER_SIZE];
315b725ae77Skettenis int nr_bytes;
316b725ae77Skettenis gdb_assert (regno >= 0 && regno < NUM_REGS);
317b725ae77Skettenis memset (buf, 0, MAX_REGISTER_SIZE);
318b725ae77Skettenis nr_bytes = sim_fetch_register (gdbsim_desc,
319b725ae77Skettenis REGISTER_SIM_REGNO (regno),
320*63addd46Skettenis buf, register_size (current_gdbarch, regno));
321*63addd46Skettenis if (nr_bytes > 0 && nr_bytes != register_size (current_gdbarch, regno) && warn_user)
322b725ae77Skettenis {
323b725ae77Skettenis fprintf_unfiltered (gdb_stderr,
324b725ae77Skettenis "Size of register %s (%d/%d) incorrect (%d instead of %d))",
325b725ae77Skettenis REGISTER_NAME (regno),
326b725ae77Skettenis regno, REGISTER_SIM_REGNO (regno),
327*63addd46Skettenis nr_bytes, register_size (current_gdbarch, regno));
328b725ae77Skettenis warn_user = 0;
329b725ae77Skettenis }
330b725ae77Skettenis /* FIXME: cagney/2002-05-27: Should check `nr_bytes == 0'
331b725ae77Skettenis indicating that GDB and the SIM have different ideas about
332b725ae77Skettenis which registers are fetchable. */
333b725ae77Skettenis /* Else if (nr_bytes < 0): an old simulator, that doesn't
334b725ae77Skettenis think to return the register size. Just assume all is ok. */
335*63addd46Skettenis regcache_raw_supply (current_regcache, regno, buf);
336e93f7393Sniklas if (sr_get_debug ())
337e93f7393Sniklas {
338e93f7393Sniklas printf_filtered ("gdbsim_fetch_register: %d", regno);
339e93f7393Sniklas /* FIXME: We could print something more intelligible. */
340*63addd46Skettenis dump_mem (buf, register_size (current_gdbarch, regno));
341b725ae77Skettenis }
342b725ae77Skettenis break;
343e93f7393Sniklas }
344e93f7393Sniklas }
345e93f7393Sniklas }
346e93f7393Sniklas
347e93f7393Sniklas
348e93f7393Sniklas static void
gdbsim_store_register(int regno)349b725ae77Skettenis gdbsim_store_register (int regno)
350e93f7393Sniklas {
351e93f7393Sniklas if (regno == -1)
352e93f7393Sniklas {
353e93f7393Sniklas for (regno = 0; regno < NUM_REGS; regno++)
354e93f7393Sniklas gdbsim_store_register (regno);
355b725ae77Skettenis return;
356e93f7393Sniklas }
357b725ae77Skettenis else if (REGISTER_SIM_REGNO (regno) >= 0)
358e93f7393Sniklas {
359b725ae77Skettenis char tmp[MAX_REGISTER_SIZE];
360b725ae77Skettenis int nr_bytes;
361b725ae77Skettenis deprecated_read_register_gen (regno, tmp);
362b725ae77Skettenis nr_bytes = sim_store_register (gdbsim_desc,
363b725ae77Skettenis REGISTER_SIM_REGNO (regno),
364*63addd46Skettenis tmp, register_size (current_gdbarch, regno));
365*63addd46Skettenis if (nr_bytes > 0 && nr_bytes != register_size (current_gdbarch, regno))
366b725ae77Skettenis internal_error (__FILE__, __LINE__,
367b725ae77Skettenis "Register size different to expected");
368b725ae77Skettenis /* FIXME: cagney/2002-05-27: Should check `nr_bytes == 0'
369b725ae77Skettenis indicating that GDB and the SIM have different ideas about
370b725ae77Skettenis which registers are fetchable. */
371e93f7393Sniklas if (sr_get_debug ())
372e93f7393Sniklas {
373e93f7393Sniklas printf_filtered ("gdbsim_store_register: %d", regno);
374e93f7393Sniklas /* FIXME: We could print something more intelligible. */
375*63addd46Skettenis dump_mem (tmp, register_size (current_gdbarch, regno));
376e93f7393Sniklas }
377e93f7393Sniklas }
378e93f7393Sniklas }
379e93f7393Sniklas
380e93f7393Sniklas /* Kill the running program. This may involve closing any open files
381e93f7393Sniklas and releasing other resources acquired by the simulated program. */
382e93f7393Sniklas
383e93f7393Sniklas static void
gdbsim_kill(void)384b725ae77Skettenis gdbsim_kill (void)
385e93f7393Sniklas {
386e93f7393Sniklas if (sr_get_debug ())
387e93f7393Sniklas printf_filtered ("gdbsim_kill\n");
388e93f7393Sniklas
389b725ae77Skettenis /* There is no need to `kill' running simulator - the simulator is
390b725ae77Skettenis not running */
391b725ae77Skettenis inferior_ptid = null_ptid;
392e93f7393Sniklas }
393e93f7393Sniklas
394e93f7393Sniklas /* Load an executable file into the target process. This is expected to
395e93f7393Sniklas not only bring new code into the target process, but also to update
396e93f7393Sniklas GDB's symbol tables to match. */
397e93f7393Sniklas
398e93f7393Sniklas static void
gdbsim_load(char * prog,int fromtty)399b725ae77Skettenis gdbsim_load (char *prog, int fromtty)
400e93f7393Sniklas {
401e93f7393Sniklas if (sr_get_debug ())
402e93f7393Sniklas printf_filtered ("gdbsim_load: prog \"%s\"\n", prog);
403e93f7393Sniklas
404b725ae77Skettenis inferior_ptid = null_ptid;
405e93f7393Sniklas
406b725ae77Skettenis /* FIXME: We will print two messages on error.
407b725ae77Skettenis Need error to either not print anything if passed NULL or need
408b725ae77Skettenis another routine that doesn't take any arguments. */
409b725ae77Skettenis if (sim_load (gdbsim_desc, prog, NULL, fromtty) == SIM_RC_FAIL)
410b725ae77Skettenis error ("unable to load program");
411b725ae77Skettenis
412b725ae77Skettenis /* FIXME: If a load command should reset the targets registers then
413b725ae77Skettenis a call to sim_create_inferior() should go here. */
414b725ae77Skettenis
415e93f7393Sniklas program_loaded = 1;
416e93f7393Sniklas }
417e93f7393Sniklas
418e93f7393Sniklas
419b725ae77Skettenis /* Start an inferior process and set inferior_ptid to its pid.
420e93f7393Sniklas EXEC_FILE is the file to run.
421b725ae77Skettenis ARGS is a string containing the arguments to the program.
422e93f7393Sniklas ENV is the environment vector to pass. Errors reported with error().
423e93f7393Sniklas On VxWorks and various standalone systems, we ignore exec_file. */
424e93f7393Sniklas /* This is called not only when we first attach, but also when the
425e93f7393Sniklas user types "run" after having attached. */
426e93f7393Sniklas
427e93f7393Sniklas static void
gdbsim_create_inferior(char * exec_file,char * args,char ** env,int from_tty)428*63addd46Skettenis gdbsim_create_inferior (char *exec_file, char *args, char **env, int from_tty)
429e93f7393Sniklas {
430e93f7393Sniklas int len;
431e93f7393Sniklas char *arg_buf, **argv;
432e93f7393Sniklas
433b725ae77Skettenis if (exec_file == 0 || exec_bfd == 0)
434b725ae77Skettenis warning ("No executable file specified.");
435e93f7393Sniklas if (!program_loaded)
436b725ae77Skettenis warning ("No program loaded.");
437e93f7393Sniklas
438e93f7393Sniklas if (sr_get_debug ())
439e93f7393Sniklas printf_filtered ("gdbsim_create_inferior: exec_file \"%s\", args \"%s\"\n",
440b725ae77Skettenis (exec_file ? exec_file : "(NULL)"),
441b725ae77Skettenis args);
442e93f7393Sniklas
443e93f7393Sniklas gdbsim_kill ();
444e93f7393Sniklas remove_breakpoints ();
445e93f7393Sniklas init_wait_for_inferior ();
446e93f7393Sniklas
447b725ae77Skettenis if (exec_file != NULL)
448b725ae77Skettenis {
449b725ae77Skettenis len = strlen (exec_file) + 1 + strlen (args) + 1 + /*slop */ 10;
450e93f7393Sniklas arg_buf = (char *) alloca (len);
451e93f7393Sniklas arg_buf[0] = '\0';
452e93f7393Sniklas strcat (arg_buf, exec_file);
453e93f7393Sniklas strcat (arg_buf, " ");
454e93f7393Sniklas strcat (arg_buf, args);
455e93f7393Sniklas argv = buildargv (arg_buf);
456b725ae77Skettenis make_cleanup_freeargv (argv);
457b725ae77Skettenis }
458b725ae77Skettenis else
459b725ae77Skettenis argv = NULL;
460b725ae77Skettenis sim_create_inferior (gdbsim_desc, exec_bfd, argv, env);
461e93f7393Sniklas
462b725ae77Skettenis inferior_ptid = pid_to_ptid (42);
463e93f7393Sniklas insert_breakpoints (); /* Needed to get correct instruction in cache */
464b725ae77Skettenis
465b725ae77Skettenis clear_proceed_status ();
466b725ae77Skettenis
467b725ae77Skettenis /* NB: Entry point already set by sim_create_inferior. */
468b725ae77Skettenis proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0);
469e93f7393Sniklas }
470e93f7393Sniklas
471e93f7393Sniklas /* The open routine takes the rest of the parameters from the command,
472e93f7393Sniklas and (if successful) pushes a new target onto the stack.
473e93f7393Sniklas Targets should supply this routine, if only to provide an error message. */
474e93f7393Sniklas /* Called when selecting the simulator. EG: (gdb) target sim name. */
475e93f7393Sniklas
476e93f7393Sniklas static void
gdbsim_open(char * args,int from_tty)477b725ae77Skettenis gdbsim_open (char *args, int from_tty)
478e93f7393Sniklas {
479b725ae77Skettenis int len;
480b725ae77Skettenis char *arg_buf;
481b725ae77Skettenis char **argv;
482b725ae77Skettenis
483e93f7393Sniklas if (sr_get_debug ())
484e93f7393Sniklas printf_filtered ("gdbsim_open: args \"%s\"\n", args ? args : "(null)");
485e93f7393Sniklas
486b725ae77Skettenis /* Remove current simulator if one exists. Only do this if the simulator
487b725ae77Skettenis has been opened because sim_close requires it.
488b725ae77Skettenis This is important because the call to push_target below will cause
489b725ae77Skettenis sim_close to be called if the simulator is already open, but push_target
490b725ae77Skettenis is called after sim_open! We can't move the call to push_target before
491b725ae77Skettenis the call to sim_open because sim_open may invoke `error'. */
492b725ae77Skettenis if (gdbsim_desc != NULL)
493b725ae77Skettenis unpush_target (&gdbsim_ops);
494e93f7393Sniklas
495b725ae77Skettenis len = (7 + 1 /* gdbsim */
496b725ae77Skettenis + strlen (" -E little")
497b725ae77Skettenis + strlen (" --architecture=xxxxxxxxxx")
498b725ae77Skettenis + (args ? strlen (args) : 0)
499b725ae77Skettenis + 50) /* slack */ ;
500b725ae77Skettenis arg_buf = (char *) alloca (len);
501b725ae77Skettenis strcpy (arg_buf, "gdbsim"); /* 7 */
502b725ae77Skettenis /* Specify the byte order for the target when it is both selectable
503b725ae77Skettenis and explicitly specified by the user (not auto detected). */
504b725ae77Skettenis switch (selected_byte_order ())
505b725ae77Skettenis {
506b725ae77Skettenis case BFD_ENDIAN_BIG:
507b725ae77Skettenis strcat (arg_buf, " -E big");
508b725ae77Skettenis break;
509b725ae77Skettenis case BFD_ENDIAN_LITTLE:
510b725ae77Skettenis strcat (arg_buf, " -E little");
511b725ae77Skettenis break;
512b725ae77Skettenis case BFD_ENDIAN_UNKNOWN:
513b725ae77Skettenis break;
514b725ae77Skettenis }
515b725ae77Skettenis /* Specify the architecture of the target when it has been
516b725ae77Skettenis explicitly specified */
517b725ae77Skettenis if (selected_architecture_name () != NULL)
518b725ae77Skettenis {
519b725ae77Skettenis strcat (arg_buf, " --architecture=");
520b725ae77Skettenis strcat (arg_buf, selected_architecture_name ());
521b725ae77Skettenis }
522b725ae77Skettenis /* finally, any explicit args */
523b725ae77Skettenis if (args)
524b725ae77Skettenis {
525b725ae77Skettenis strcat (arg_buf, " "); /* 1 */
526b725ae77Skettenis strcat (arg_buf, args);
527b725ae77Skettenis }
528b725ae77Skettenis argv = buildargv (arg_buf);
529b725ae77Skettenis if (argv == NULL)
530b725ae77Skettenis error ("Insufficient memory available to allocate simulator arg list.");
531b725ae77Skettenis make_cleanup_freeargv (argv);
532b725ae77Skettenis
533b725ae77Skettenis init_callbacks ();
534b725ae77Skettenis gdbsim_desc = sim_open (SIM_OPEN_DEBUG, &gdb_callback, exec_bfd, argv);
535b725ae77Skettenis
536b725ae77Skettenis if (gdbsim_desc == 0)
537b725ae77Skettenis error ("unable to create simulator instance");
538e93f7393Sniklas
539e93f7393Sniklas push_target (&gdbsim_ops);
540e93f7393Sniklas target_fetch_registers (-1);
541e93f7393Sniklas printf_filtered ("Connected to the simulator.\n");
542e93f7393Sniklas }
543e93f7393Sniklas
544e93f7393Sniklas /* Does whatever cleanup is required for a target that we are no longer
545e93f7393Sniklas going to be calling. Argument says whether we are quitting gdb and
546e93f7393Sniklas should not get hung in case of errors, or whether we want a clean
547e93f7393Sniklas termination even if it takes a while. This routine is automatically
548e93f7393Sniklas always called just before a routine is popped off the target stack.
549e93f7393Sniklas Closing file descriptors and freeing memory are typical things it should
550e93f7393Sniklas do. */
551e93f7393Sniklas /* Close out all files and local state before this target loses control. */
552e93f7393Sniklas
553e93f7393Sniklas static void
gdbsim_close(int quitting)554b725ae77Skettenis gdbsim_close (int quitting)
555e93f7393Sniklas {
556e93f7393Sniklas if (sr_get_debug ())
557e93f7393Sniklas printf_filtered ("gdbsim_close: quitting %d\n", quitting);
558e93f7393Sniklas
559e93f7393Sniklas program_loaded = 0;
560e93f7393Sniklas
561b725ae77Skettenis if (gdbsim_desc != NULL)
562b725ae77Skettenis {
563b725ae77Skettenis sim_close (gdbsim_desc, quitting);
564b725ae77Skettenis gdbsim_desc = NULL;
565b725ae77Skettenis }
566b725ae77Skettenis
567b725ae77Skettenis end_callbacks ();
568b725ae77Skettenis generic_mourn_inferior ();
569e93f7393Sniklas }
570e93f7393Sniklas
571e93f7393Sniklas /* Takes a program previously attached to and detaches it.
572e93f7393Sniklas The program may resume execution (some targets do, some don't) and will
573e93f7393Sniklas no longer stop on signals, etc. We better not have left any breakpoints
574e93f7393Sniklas in the program or it'll die when it hits one. ARGS is arguments
575e93f7393Sniklas typed by the user (e.g. a signal to send the process). FROM_TTY
576e93f7393Sniklas says whether to be verbose or not. */
577e93f7393Sniklas /* Terminate the open connection to the remote debugger.
578e93f7393Sniklas Use this when you want to detach and do something else with your gdb. */
579e93f7393Sniklas
580e93f7393Sniklas static void
gdbsim_detach(char * args,int from_tty)581b725ae77Skettenis gdbsim_detach (char *args, int from_tty)
582e93f7393Sniklas {
583e93f7393Sniklas if (sr_get_debug ())
584e93f7393Sniklas printf_filtered ("gdbsim_detach: args \"%s\"\n", args);
585e93f7393Sniklas
586e93f7393Sniklas pop_target (); /* calls gdbsim_close to do the real work */
587e93f7393Sniklas if (from_tty)
588e93f7393Sniklas printf_filtered ("Ending simulator %s debugging\n", target_shortname);
589e93f7393Sniklas }
590e93f7393Sniklas
591e93f7393Sniklas /* Resume execution of the target process. STEP says whether to single-step
592e93f7393Sniklas or to run free; SIGGNAL is the signal value (e.g. SIGINT) to be given
593e93f7393Sniklas to the target, or zero for no signal. */
594e93f7393Sniklas
595b725ae77Skettenis static enum target_signal resume_siggnal;
596b725ae77Skettenis static int resume_step;
597b725ae77Skettenis
598e93f7393Sniklas static void
gdbsim_resume(ptid_t ptid,int step,enum target_signal siggnal)599b725ae77Skettenis gdbsim_resume (ptid_t ptid, int step, enum target_signal siggnal)
600e93f7393Sniklas {
601b725ae77Skettenis if (PIDGET (inferior_ptid) != 42)
602e93f7393Sniklas error ("The program is not being run.");
603e93f7393Sniklas
604e93f7393Sniklas if (sr_get_debug ())
605e93f7393Sniklas printf_filtered ("gdbsim_resume: step %d, signal %d\n", step, siggnal);
606e93f7393Sniklas
607b725ae77Skettenis resume_siggnal = siggnal;
608b725ae77Skettenis resume_step = step;
609b725ae77Skettenis }
610b725ae77Skettenis
611b725ae77Skettenis /* Notify the simulator of an asynchronous request to stop.
612b725ae77Skettenis
613b725ae77Skettenis The simulator shall ensure that the stop request is eventually
614b725ae77Skettenis delivered to the simulator. If the call is made while the
615b725ae77Skettenis simulator is not running then the stop request is processed when
616b725ae77Skettenis the simulator is next resumed.
617b725ae77Skettenis
618b725ae77Skettenis For simulators that do not support this operation, just abort */
619b725ae77Skettenis
620b725ae77Skettenis static void
gdbsim_stop(void)621b725ae77Skettenis gdbsim_stop (void)
622b725ae77Skettenis {
623b725ae77Skettenis if (!sim_stop (gdbsim_desc))
624b725ae77Skettenis {
625b725ae77Skettenis quit ();
626b725ae77Skettenis }
627b725ae77Skettenis }
628b725ae77Skettenis
629b725ae77Skettenis /* GDB version of os_poll_quit callback.
630b725ae77Skettenis Taken from gdb/util.c - should be in a library */
631b725ae77Skettenis
632b725ae77Skettenis static int
gdb_os_poll_quit(host_callback * p)633b725ae77Skettenis gdb_os_poll_quit (host_callback *p)
634b725ae77Skettenis {
635*63addd46Skettenis if (deprecated_ui_loop_hook != NULL)
636*63addd46Skettenis deprecated_ui_loop_hook (0);
637b725ae77Skettenis
638b725ae77Skettenis if (quit_flag) /* gdb's idea of quit */
639b725ae77Skettenis {
640b725ae77Skettenis quit_flag = 0; /* we've stolen it */
641b725ae77Skettenis return 1;
642b725ae77Skettenis }
643b725ae77Skettenis else if (immediate_quit)
644b725ae77Skettenis {
645b725ae77Skettenis return 1;
646b725ae77Skettenis }
647b725ae77Skettenis return 0;
648e93f7393Sniklas }
649e93f7393Sniklas
650e93f7393Sniklas /* Wait for inferior process to do something. Return pid of child,
651e93f7393Sniklas or -1 in case of error; store status through argument pointer STATUS,
652e93f7393Sniklas just as `wait' would. */
653e93f7393Sniklas
654b725ae77Skettenis static void
gdbsim_cntrl_c(int signo)655b725ae77Skettenis gdbsim_cntrl_c (int signo)
656e93f7393Sniklas {
657b725ae77Skettenis gdbsim_stop ();
658b725ae77Skettenis }
659b725ae77Skettenis
660b725ae77Skettenis static ptid_t
gdbsim_wait(ptid_t ptid,struct target_waitstatus * status)661b725ae77Skettenis gdbsim_wait (ptid_t ptid, struct target_waitstatus *status)
662b725ae77Skettenis {
663b725ae77Skettenis static RETSIGTYPE (*prev_sigint) ();
664b725ae77Skettenis int sigrc = 0;
665b725ae77Skettenis enum sim_stop reason = sim_running;
666e93f7393Sniklas
667e93f7393Sniklas if (sr_get_debug ())
668e93f7393Sniklas printf_filtered ("gdbsim_wait\n");
669e93f7393Sniklas
670b725ae77Skettenis #if defined (HAVE_SIGACTION) && defined (SA_RESTART)
671b725ae77Skettenis {
672b725ae77Skettenis struct sigaction sa, osa;
673b725ae77Skettenis sa.sa_handler = gdbsim_cntrl_c;
674b725ae77Skettenis sigemptyset (&sa.sa_mask);
675b725ae77Skettenis sa.sa_flags = 0;
676b725ae77Skettenis sigaction (SIGINT, &sa, &osa);
677b725ae77Skettenis prev_sigint = osa.sa_handler;
678b725ae77Skettenis }
679b725ae77Skettenis #else
680b725ae77Skettenis prev_sigint = signal (SIGINT, gdbsim_cntrl_c);
681b725ae77Skettenis #endif
682b725ae77Skettenis sim_resume (gdbsim_desc, resume_step,
683b725ae77Skettenis target_signal_to_host (resume_siggnal));
684b725ae77Skettenis signal (SIGINT, prev_sigint);
685b725ae77Skettenis resume_step = 0;
686b725ae77Skettenis
687b725ae77Skettenis sim_stop_reason (gdbsim_desc, &reason, &sigrc);
688b725ae77Skettenis
689e93f7393Sniklas switch (reason)
690e93f7393Sniklas {
691e93f7393Sniklas case sim_exited:
692e93f7393Sniklas status->kind = TARGET_WAITKIND_EXITED;
693e93f7393Sniklas status->value.integer = sigrc;
694e93f7393Sniklas break;
695e93f7393Sniklas case sim_stopped:
696b725ae77Skettenis switch (sigrc)
697b725ae77Skettenis {
698b725ae77Skettenis case SIGABRT:
699b725ae77Skettenis quit ();
700b725ae77Skettenis break;
701b725ae77Skettenis case SIGINT:
702b725ae77Skettenis case SIGTRAP:
703b725ae77Skettenis default:
704e93f7393Sniklas status->kind = TARGET_WAITKIND_STOPPED;
705e93f7393Sniklas /* The signal in sigrc is a host signal. That probably
706e93f7393Sniklas should be fixed. */
707e93f7393Sniklas status->value.sig = target_signal_from_host (sigrc);
708e93f7393Sniklas break;
709b725ae77Skettenis }
710b725ae77Skettenis break;
711e93f7393Sniklas case sim_signalled:
712e93f7393Sniklas status->kind = TARGET_WAITKIND_SIGNALLED;
713e93f7393Sniklas /* The signal in sigrc is a host signal. That probably
714e93f7393Sniklas should be fixed. */
715e93f7393Sniklas status->value.sig = target_signal_from_host (sigrc);
716e93f7393Sniklas break;
717b725ae77Skettenis case sim_running:
718b725ae77Skettenis case sim_polling:
719b725ae77Skettenis /* FIXME: Is this correct? */
720b725ae77Skettenis break;
721e93f7393Sniklas }
722e93f7393Sniklas
723b725ae77Skettenis return inferior_ptid;
724e93f7393Sniklas }
725e93f7393Sniklas
726e93f7393Sniklas /* Get ready to modify the registers array. On machines which store
727e93f7393Sniklas individual registers, this doesn't need to do anything. On machines
728e93f7393Sniklas which store all the registers in one fell swoop, this makes sure
729e93f7393Sniklas that registers contains all the registers from the program being
730e93f7393Sniklas debugged. */
731e93f7393Sniklas
732e93f7393Sniklas static void
gdbsim_prepare_to_store(void)733b725ae77Skettenis gdbsim_prepare_to_store (void)
734e93f7393Sniklas {
735e93f7393Sniklas /* Do nothing, since we can store individual regs */
736e93f7393Sniklas }
737e93f7393Sniklas
738b725ae77Skettenis /* Transfer LEN bytes between GDB address MYADDR and target address
739b725ae77Skettenis MEMADDR. If WRITE is non-zero, transfer them to the target,
740b725ae77Skettenis otherwise transfer them from the target. TARGET is unused.
741b725ae77Skettenis
742b725ae77Skettenis Returns the number of bytes transferred. */
743b725ae77Skettenis
744e93f7393Sniklas static int
gdbsim_xfer_inferior_memory(CORE_ADDR memaddr,char * myaddr,int len,int write,struct mem_attrib * attrib,struct target_ops * target)745b725ae77Skettenis gdbsim_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len,
746b725ae77Skettenis int write, struct mem_attrib *attrib,
747b725ae77Skettenis struct target_ops *target)
748e93f7393Sniklas {
749e93f7393Sniklas if (!program_loaded)
750e93f7393Sniklas error ("No program loaded.");
751e93f7393Sniklas
752e93f7393Sniklas if (sr_get_debug ())
753e93f7393Sniklas {
754b725ae77Skettenis /* FIXME: Send to something other than STDOUT? */
755b725ae77Skettenis printf_filtered ("gdbsim_xfer_inferior_memory: myaddr 0x");
756b725ae77Skettenis gdb_print_host_address (myaddr, gdb_stdout);
757b725ae77Skettenis printf_filtered (", memaddr 0x%s, len %d, write %d\n",
758b725ae77Skettenis paddr_nz (memaddr), len, write);
759e93f7393Sniklas if (sr_get_debug () && write)
760e93f7393Sniklas dump_mem (myaddr, len);
761e93f7393Sniklas }
762e93f7393Sniklas
763e93f7393Sniklas if (write)
764e93f7393Sniklas {
765b725ae77Skettenis len = sim_write (gdbsim_desc, memaddr, myaddr, len);
766e93f7393Sniklas }
767e93f7393Sniklas else
768e93f7393Sniklas {
769b725ae77Skettenis len = sim_read (gdbsim_desc, memaddr, myaddr, len);
770e93f7393Sniklas if (sr_get_debug () && len > 0)
771e93f7393Sniklas dump_mem (myaddr, len);
772e93f7393Sniklas }
773e93f7393Sniklas return len;
774e93f7393Sniklas }
775e93f7393Sniklas
776e93f7393Sniklas static void
gdbsim_files_info(struct target_ops * target)777b725ae77Skettenis gdbsim_files_info (struct target_ops *target)
778e93f7393Sniklas {
779e93f7393Sniklas char *file = "nothing";
780e93f7393Sniklas
781e93f7393Sniklas if (exec_bfd)
782e93f7393Sniklas file = bfd_get_filename (exec_bfd);
783e93f7393Sniklas
784e93f7393Sniklas if (sr_get_debug ())
785e93f7393Sniklas printf_filtered ("gdbsim_files_info: file \"%s\"\n", file);
786e93f7393Sniklas
787e93f7393Sniklas if (exec_bfd)
788e93f7393Sniklas {
789e93f7393Sniklas printf_filtered ("\tAttached to %s running program %s\n",
790e93f7393Sniklas target_shortname, file);
791b725ae77Skettenis sim_info (gdbsim_desc, 0);
792e93f7393Sniklas }
793e93f7393Sniklas }
794e93f7393Sniklas
795e93f7393Sniklas /* Clear the simulator's notion of what the break points are. */
796e93f7393Sniklas
797e93f7393Sniklas static void
gdbsim_mourn_inferior(void)798b725ae77Skettenis gdbsim_mourn_inferior (void)
799e93f7393Sniklas {
800e93f7393Sniklas if (sr_get_debug ())
801e93f7393Sniklas printf_filtered ("gdbsim_mourn_inferior:\n");
802e93f7393Sniklas
803e93f7393Sniklas remove_breakpoints ();
804e93f7393Sniklas generic_mourn_inferior ();
805e93f7393Sniklas }
806e93f7393Sniklas
807b725ae77Skettenis static int
gdbsim_insert_breakpoint(CORE_ADDR addr,char * contents_cache)808b725ae77Skettenis gdbsim_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
809b725ae77Skettenis {
810b725ae77Skettenis return memory_insert_breakpoint (addr, contents_cache);
811b725ae77Skettenis }
812b725ae77Skettenis
813b725ae77Skettenis static int
gdbsim_remove_breakpoint(CORE_ADDR addr,char * contents_cache)814b725ae77Skettenis gdbsim_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
815b725ae77Skettenis {
816b725ae77Skettenis return memory_remove_breakpoint (addr, contents_cache);
817b725ae77Skettenis }
818b725ae77Skettenis
819e93f7393Sniklas /* Pass the command argument through to the simulator verbatim. The
820e93f7393Sniklas simulator must do any command interpretation work. */
821e93f7393Sniklas
822b725ae77Skettenis void
simulator_command(char * args,int from_tty)823b725ae77Skettenis simulator_command (char *args, int from_tty)
824e93f7393Sniklas {
825b725ae77Skettenis if (gdbsim_desc == NULL)
826b725ae77Skettenis {
827e93f7393Sniklas
828b725ae77Skettenis /* PREVIOUSLY: The user may give a command before the simulator
829b725ae77Skettenis is opened. [...] (??? assuming of course one wishes to
830b725ae77Skettenis continue to allow commands to be sent to unopened simulators,
831b725ae77Skettenis which isn't entirely unreasonable). */
832b725ae77Skettenis
833b725ae77Skettenis /* The simulator is a builtin abstraction of a remote target.
834b725ae77Skettenis Consistent with that model, access to the simulator, via sim
835b725ae77Skettenis commands, is restricted to the period when the channel to the
836b725ae77Skettenis simulator is open. */
837b725ae77Skettenis
838b725ae77Skettenis error ("Not connected to the simulator target");
839b725ae77Skettenis }
840b725ae77Skettenis
841b725ae77Skettenis sim_do_command (gdbsim_desc, args);
842b725ae77Skettenis
843b725ae77Skettenis /* Invalidate the register cache, in case the simulator command does
844b725ae77Skettenis something funny. */
845b725ae77Skettenis registers_changed ();
846e93f7393Sniklas }
847e93f7393Sniklas
848e93f7393Sniklas /* Define the target subroutine names */
849e93f7393Sniklas
850b725ae77Skettenis struct target_ops gdbsim_ops;
851b725ae77Skettenis
852b725ae77Skettenis static void
init_gdbsim_ops(void)853b725ae77Skettenis init_gdbsim_ops (void)
854b725ae77Skettenis {
855b725ae77Skettenis gdbsim_ops.to_shortname = "sim";
856b725ae77Skettenis gdbsim_ops.to_longname = "simulator";
857b725ae77Skettenis gdbsim_ops.to_doc = "Use the compiled-in simulator.";
858b725ae77Skettenis gdbsim_ops.to_open = gdbsim_open;
859b725ae77Skettenis gdbsim_ops.to_close = gdbsim_close;
860b725ae77Skettenis gdbsim_ops.to_detach = gdbsim_detach;
861b725ae77Skettenis gdbsim_ops.to_resume = gdbsim_resume;
862b725ae77Skettenis gdbsim_ops.to_wait = gdbsim_wait;
863b725ae77Skettenis gdbsim_ops.to_fetch_registers = gdbsim_fetch_register;
864b725ae77Skettenis gdbsim_ops.to_store_registers = gdbsim_store_register;
865b725ae77Skettenis gdbsim_ops.to_prepare_to_store = gdbsim_prepare_to_store;
866*63addd46Skettenis gdbsim_ops.deprecated_xfer_memory = gdbsim_xfer_inferior_memory;
867b725ae77Skettenis gdbsim_ops.to_files_info = gdbsim_files_info;
868b725ae77Skettenis gdbsim_ops.to_insert_breakpoint = gdbsim_insert_breakpoint;
869b725ae77Skettenis gdbsim_ops.to_remove_breakpoint = gdbsim_remove_breakpoint;
870b725ae77Skettenis gdbsim_ops.to_kill = gdbsim_kill;
871b725ae77Skettenis gdbsim_ops.to_load = gdbsim_load;
872b725ae77Skettenis gdbsim_ops.to_create_inferior = gdbsim_create_inferior;
873b725ae77Skettenis gdbsim_ops.to_mourn_inferior = gdbsim_mourn_inferior;
874b725ae77Skettenis gdbsim_ops.to_stop = gdbsim_stop;
875b725ae77Skettenis gdbsim_ops.to_stratum = process_stratum;
876b725ae77Skettenis gdbsim_ops.to_has_all_memory = 1;
877b725ae77Skettenis gdbsim_ops.to_has_memory = 1;
878b725ae77Skettenis gdbsim_ops.to_has_stack = 1;
879b725ae77Skettenis gdbsim_ops.to_has_registers = 1;
880b725ae77Skettenis gdbsim_ops.to_has_execution = 1;
881b725ae77Skettenis gdbsim_ops.to_magic = OPS_MAGIC;
882b725ae77Skettenis
883b725ae77Skettenis #ifdef TARGET_REDEFINE_DEFAULT_OPS
884b725ae77Skettenis TARGET_REDEFINE_DEFAULT_OPS (&gdbsim_ops);
885b725ae77Skettenis #endif
886b725ae77Skettenis }
887e93f7393Sniklas
888e93f7393Sniklas void
_initialize_remote_sim(void)889b725ae77Skettenis _initialize_remote_sim (void)
890e93f7393Sniklas {
891b725ae77Skettenis init_gdbsim_ops ();
892e93f7393Sniklas add_target (&gdbsim_ops);
893e93f7393Sniklas
894e93f7393Sniklas add_com ("sim <command>", class_obscure, simulator_command,
895e93f7393Sniklas "Send a command to the simulator.");
896e93f7393Sniklas }
897