xref: /openbsd-src/gnu/usr.bin/binutils/gdb/remote-sim.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
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