* remote-sim.h: Delete - moved to ../include/remote-sim.h.
[deliverable/binutils-gdb.git] / gdb / remote-sim.c
CommitLineData
40b92220 1/* Generic remote debugging interface for simulators.
286f83b4 2 Copyright 1993, 1994, 1996, 1997 Free Software Foundation, Inc.
40b92220 3 Contributed by Cygnus Support.
47424e79 4 Steve Chamberlain (sac@cygnus.com).
ec25d19b
SC
5
6This file is part of GDB.
7
8This program is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2 of the License, or
11(at your option) any later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with this program; if not, write to the Free Software
6c9638b4 20Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
ec25d19b
SC
21
22#include "defs.h"
23#include "inferior.h"
24#include "wait.h"
25#include "value.h"
2b576293 26#include "gdb_string.h"
ec25d19b
SC
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"
4da8b2a5 35#include "callback.h"
59c2be48 36#include "remote-sim.h"
f1e7bafc 37#include "remote-utils.h"
40b92220 38
8501c742
SG
39/* Prototypes */
40
41static void dump_mem PARAMS ((char *buf, int len));
42
4da8b2a5
DE
43static void init_callbacks PARAMS ((void));
44
45static void end_callbacks PARAMS ((void));
46
47static int gdb_os_write_stdout PARAMS ((host_callback *, const char *, int));
48
48ae8057
AC
49static void gdb_os_flush_stdout PARAMS ((host_callback *));
50
51static int gdb_os_write_stderr PARAMS ((host_callback *, const char *, int));
52
53static void gdb_os_flush_stderr PARAMS ((host_callback *));
54
55/* printf_filtered is depreciated */
4da8b2a5
DE
56static void gdb_os_printf_filtered PARAMS ((host_callback *, const char *, ...));
57
48ae8057
AC
58static void gdb_os_vprintf_filtered PARAMS ((host_callback *, const char *, void *));
59
60static void gdb_os_evprintf_filtered PARAMS ((host_callback *, const char *, void *));
61
163a75af
DE
62static void gdb_os_error PARAMS ((host_callback *, const char *, ...));
63
8501c742
SG
64static void gdbsim_fetch_register PARAMS ((int regno));
65
66static void gdbsim_store_register PARAMS ((int regno));
67
68static void gdbsim_kill PARAMS ((void));
69
70static void gdbsim_load PARAMS ((char *prog, int fromtty));
71
72static void gdbsim_create_inferior PARAMS ((char *exec_file, char *args, char **env));
73
74static void gdbsim_open PARAMS ((char *args, int from_tty));
75
76static void gdbsim_close PARAMS ((int quitting));
77
78static void gdbsim_detach PARAMS ((char *args, int from_tty));
79
80static void gdbsim_resume PARAMS ((int pid, int step, enum target_signal siggnal));
81
82static int gdbsim_wait PARAMS ((int pid, struct target_waitstatus *status));
83
84static void gdbsim_prepare_to_store PARAMS ((void));
85
86static int gdbsim_xfer_inferior_memory PARAMS ((CORE_ADDR memaddr,
87 char *myaddr, int len,
88 int write,
89 struct target_ops *target));
90
91static void gdbsim_files_info PARAMS ((struct target_ops *target));
92
93static void gdbsim_mourn_inferior PARAMS ((void));
94
95static void simulator_command PARAMS ((char *args, int from_tty));
96
40b92220
JK
97/* Naming convention:
98
99 sim_* are the interface to the simulator (see remote-sim.h).
40b92220 100 gdbsim_* are stuff which is internal to gdb. */
ec25d19b
SC
101
102/* Forward data declarations */
40b92220 103extern struct target_ops gdbsim_ops;
ec25d19b 104
40b92220
JK
105static int program_loaded = 0;
106
d9ad8adf
DE
107/* We must keep track of whether the simulator has been opened or not because
108 GDB can call a target's close routine twice, but sim_close doesn't allow
286f83b4
DE
109 this. We also need to record the result of sim_open so we can pass it
110 back to the other sim_foo routines. */
111static SIM_DESC gdbsim_desc = 0;
d9ad8adf 112
40b92220
JK
113static void
114dump_mem (buf, len)
115 char *buf;
ec25d19b
SC
116 int len;
117{
40b92220
JK
118 if (len <= 8)
119 {
120 if (len == 8 || len == 4)
121 {
122 long l[2];
123 memcpy (l, buf, len);
124 printf_filtered ("\t0x%x", l[0]);
125 printf_filtered (len == 8 ? " 0x%x\n" : "\n", l[1]);
126 }
127 else
128 {
129 int i;
130 printf_filtered ("\t");
131 for (i = 0; i < len; i++)
132 printf_filtered ("0x%x ", buf[i]);
133 printf_filtered ("\n");
134 }
135 }
136}
137
4da8b2a5
DE
138static host_callback gdb_callback;
139static int callbacks_initialized = 0;
140
141/* Initialize gdb_callback. */
142
143static void
144init_callbacks ()
145{
146 if (! callbacks_initialized)
147 {
148 gdb_callback = default_callback;
163a75af
DE
149 gdb_callback.init (&gdb_callback);
150 gdb_callback.write_stdout = gdb_os_write_stdout;
48ae8057
AC
151 gdb_callback.flush_stdout = gdb_os_flush_stdout;
152 gdb_callback.write_stderr = gdb_os_write_stderr;
153 gdb_callback.flush_stderr = gdb_os_flush_stderr;
163a75af 154 gdb_callback.printf_filtered = gdb_os_printf_filtered;
48ae8057
AC
155 gdb_callback.vprintf_filtered = gdb_os_vprintf_filtered;
156 gdb_callback.evprintf_filtered = gdb_os_evprintf_filtered;
1387cba1 157 gdb_callback.error = gdb_os_error;
286f83b4 158 sim_set_callbacks (gdbsim_desc, &gdb_callback);
4da8b2a5
DE
159 callbacks_initialized = 1;
160 }
161}
162
163/* Release callbacks (free resources used by them). */
164
165static void
166end_callbacks ()
167{
168 if (callbacks_initialized)
169 {
170 gdb_callback.shutdown (&gdb_callback);
171 callbacks_initialized = 0;
172 }
173}
174
175/* GDB version of os_write_stdout callback. */
176
177static int
178gdb_os_write_stdout (p, buf, len)
179 host_callback *p;
180 const char *buf;
181 int len;
182{
183 int i;
184 char b[2];
185
186 for (i = 0; i < len; i++)
187 {
188 b[0] = buf[i];
189 b[1] = 0;
190 if (target_output_hook)
191 target_output_hook (b);
192 else
193 fputs_filtered (b, gdb_stdout);
194 }
195 return len;
196}
197
48ae8057
AC
198/* GDB version of os_flush_stdout callback. */
199
200static void
201gdb_os_flush_stdout (p)
202 host_callback *p;
203{
204 gdb_flush (gdb_stdout);
205}
206
207/* GDB version of os_write_stderr callback. */
208
209static int
210gdb_os_write_stderr (p, buf, len)
211 host_callback *p;
212 const char *buf;
213 int len;
214{
215 int i;
216 char b[2];
217
218 for (i = 0; i < len; i++)
219 {
220 b[0] = buf[i];
221 b[1] = 0;
222 if (target_output_hook)
223 target_output_hook (b);
224 else
225 fputs_filtered (b, gdb_stderr);
226 }
227 return len;
228}
229
230/* GDB version of os_flush_stderr callback. */
231
232static void
233gdb_os_flush_stderr (p)
234 host_callback *p;
235{
236 gdb_flush (gdb_stderr);
237}
238
4da8b2a5
DE
239/* GDB version of printf_filtered callback. */
240
241/* VARARGS */
242static void
243#ifdef ANSI_PROTOTYPES
244gdb_os_printf_filtered (host_callback *p, const char *format, ...)
245#else
246gdb_os_printf_filtered (p, va_alist)
247 host_callback *p;
248 va_dcl
249#endif
250{
251 va_list args;
252#ifdef ANSI_PROTOTYPES
253 va_start (args, format);
254#else
255 char *format;
256
257 va_start (args);
258 format = va_arg (args, char *);
259#endif
260
163a75af 261 vfprintf_filtered (gdb_stdout, format, args);
4da8b2a5
DE
262
263 va_end (args);
264}
265
48ae8057
AC
266/* GDB version of error vprintf_filtered. */
267
268/* VARARGS */
269static void
270#ifdef ANSI_PROTOTYPES
271gdb_os_vprintf_filtered (host_callback *p, const char *format, void *ap)
272#else
273gdb_os_vprintf_filtered (p, ap)
274 host_callback *p;
275 void *ap;
276#endif
277{
278 vfprintf_filtered (gdb_stdout, format, (va_list)ap);
279}
280
281/* GDB version of error evprintf_filtered. */
282
283/* VARARGS */
284static void
285#ifdef ANSI_PROTOTYPES
286gdb_os_evprintf_filtered (host_callback *p, const char *format, void *ap)
287#else
288gdb_os_vprintf_filtered (p, ap)
289 host_callback *p;
290 void *ap;
291#endif
292{
293 vfprintf_filtered (gdb_stderr, format, (va_list)ap);
294}
295
163a75af
DE
296/* GDB version of error callback. */
297
298/* VARARGS */
299static void
300#ifdef ANSI_PROTOTYPES
301gdb_os_error (host_callback *p, const char *format, ...)
302#else
303gdb_os_error (p, va_alist)
304 host_callback *p;
305 va_dcl
306#endif
307{
308 if (error_hook)
309 (*error_hook) ();
310 else
311 {
312 va_list args;
313#ifdef ANSI_PROTOTYPES
314 va_start (args, format);
315#else
316 char *format;
317
318 va_start (args);
319 format = va_arg (args, char *);
320#endif
321
322 error_begin ();
323 vfprintf_filtered (gdb_stderr, format, args);
324 fprintf_filtered (gdb_stderr, "\n");
325 va_end (args);
326 return_to_top_level (RETURN_ERROR);
327 }
328}
329
40b92220
JK
330static void
331gdbsim_fetch_register (regno)
332int regno;
333{
334 if (regno == -1)
335 {
336 for (regno = 0; regno < NUM_REGS; regno++)
337 gdbsim_fetch_register (regno);
338 }
339 else
340 {
341 char buf[MAX_REGISTER_RAW_SIZE];
342
286f83b4 343 sim_fetch_register (gdbsim_desc, regno, buf);
40b92220
JK
344 supply_register (regno, buf);
345 if (sr_get_debug ())
346 {
347 printf_filtered ("gdbsim_fetch_register: %d", regno);
348 /* FIXME: We could print something more intelligible. */
349 dump_mem (buf, REGISTER_RAW_SIZE (regno));
350 }
351 }
ec25d19b
SC
352}
353
6b009ef6 354
a944e79a 355static void
40b92220 356gdbsim_store_register (regno)
ec25d19b
SC
357int regno;
358{
359 if (regno == -1)
40b92220
JK
360 {
361 for (regno = 0; regno < NUM_REGS; regno++)
362 gdbsim_store_register (regno);
363 }
364 else
365 {
366 /* FIXME: Until read_register() returns LONGEST, we have this. */
3beff94e
SC
367 char tmp[MAX_REGISTER_RAW_SIZE];
368 read_register_gen (regno, tmp);
286f83b4 369 sim_store_register (gdbsim_desc, regno, tmp);
40b92220
JK
370 if (sr_get_debug ())
371 {
372 printf_filtered ("gdbsim_store_register: %d", regno);
373 /* FIXME: We could print something more intelligible. */
3beff94e 374 dump_mem (tmp, REGISTER_RAW_SIZE (regno));
40b92220
JK
375 }
376 }
ec25d19b
SC
377}
378
47424e79
DE
379/* Kill the running program. This may involve closing any open files
380 and releasing other resources acquired by the simulated program. */
381
40b92220
JK
382static void
383gdbsim_kill ()
384{
385 if (sr_get_debug ())
386 printf_filtered ("gdbsim_kill\n");
387
286f83b4 388 sim_kill (gdbsim_desc); /* close fd's, remove mappings, etc. */
40b92220
JK
389 inferior_pid = 0;
390}
391
392/* Load an executable file into the target process. This is expected to
393 not only bring new code into the target process, but also to update
394 GDB's symbol tables to match. */
ec25d19b 395
ec25d19b 396static void
40b92220
JK
397gdbsim_load (prog, fromtty)
398 char *prog;
399 int fromtty;
ec25d19b 400{
40b92220
JK
401 if (sr_get_debug ())
402 printf_filtered ("gdbsim_load: prog \"%s\"\n", prog);
ec25d19b 403
47424e79
DE
404 inferior_pid = 0;
405
406 /* This must be done before calling gr_load_image. */
40b92220 407 program_loaded = 1;
47424e79 408
286f83b4 409 if (sim_load (gdbsim_desc, prog, fromtty) != 0)
dedcc91d 410 generic_load (prog, fromtty);
40b92220
JK
411}
412
ec25d19b 413
40b92220
JK
414/* Start an inferior process and set inferior_pid to its pid.
415 EXEC_FILE is the file to run.
163a75af 416 ARGS is a string containing the arguments to the program.
40b92220
JK
417 ENV is the environment vector to pass. Errors reported with error().
418 On VxWorks and various standalone systems, we ignore exec_file. */
ec25d19b
SC
419/* This is called not only when we first attach, but also when the
420 user types "run" after having attached. */
40b92220
JK
421
422static void
423gdbsim_create_inferior (exec_file, args, env)
424 char *exec_file;
ec25d19b
SC
425 char *args;
426 char **env;
427{
47424e79 428 int len;
40b92220 429 char *arg_buf,**argv;
47424e79 430 CORE_ADDR entry_pt;
ec25d19b 431
40b92220
JK
432 if (! program_loaded)
433 error ("No program loaded.");
ec25d19b 434
40b92220
JK
435 if (sr_get_debug ())
436 printf_filtered ("gdbsim_create_inferior: exec_file \"%s\", args \"%s\"\n",
437 exec_file, args);
438
439 if (exec_file == 0 || exec_bfd == 0)
440 error ("No exec file specified.");
ec25d19b 441
47424e79 442 entry_pt = (CORE_ADDR) bfd_get_start_address (exec_bfd);
40b92220 443
8501c742 444 gdbsim_kill ();
40b92220 445 remove_breakpoints ();
ec25d19b 446 init_wait_for_inferior ();
ec25d19b 447
163a75af 448 len = strlen (exec_file) + 1 + strlen (args) + 1 + /*slop*/ 10;
40b92220
JK
449 arg_buf = (char *) alloca (len);
450 arg_buf[0] = '\0';
451 strcat (arg_buf, exec_file);
452 strcat (arg_buf, " ");
453 strcat (arg_buf, args);
454 argv = buildargv (arg_buf);
455 make_cleanup (freeargv, (char *) argv);
286f83b4 456 sim_create_inferior (gdbsim_desc, entry_pt, argv, env);
40b92220
JK
457
458 inferior_pid = 42;
459 insert_breakpoints (); /* Needed to get correct instruction in cache */
45dc9be3 460 proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
40b92220 461}
ec25d19b 462
40b92220
JK
463/* The open routine takes the rest of the parameters from the command,
464 and (if successful) pushes a new target onto the stack.
465 Targets should supply this routine, if only to provide an error message. */
466/* Called when selecting the simulator. EG: (gdb) target sim name. */
ec25d19b 467
a944e79a 468static void
40b92220
JK
469gdbsim_open (args, from_tty)
470 char *args;
ec25d19b
SC
471 int from_tty;
472{
286f83b4
DE
473 int len;
474 char *arg_buf;
475 char **argv;
476
40b92220 477 if (sr_get_debug ())
47424e79 478 printf_filtered ("gdbsim_open: args \"%s\"\n", args ? args : "(null)");
7a29d686 479
d9ad8adf
DE
480 /* Remove current simulator if one exists. Only do this if the simulator
481 has been opened because sim_close requires it.
482 This is important because the call to push_target below will cause
483 sim_close to be called if the simulator is already open, but push_target
484 is called after sim_open! We can't move the call to push_target before
485 the call to sim_open because sim_open may invoke `error'. */
286f83b4 486 if (gdbsim_desc != NULL)
d9ad8adf
DE
487 unpush_target (&gdbsim_ops);
488
4da8b2a5 489 init_callbacks ();
7a29d686 490
286f83b4
DE
491 len = 7 + 1 + (args ? strlen (args) : 0) + 1 + /*slop*/ 10;
492 arg_buf = (char *) alloca (len);
493 strcpy (arg_buf, "gdbsim");
494 if (args)
495 {
496 strcat (arg_buf, " ");
497 strcat (arg_buf, args);
498 }
499 argv = buildargv (arg_buf);
500 if (argv == NULL)
501 error ("Insufficient memory available to allocate simulator arg list.");
502 make_cleanup (freeargv, (char *) argv);
503
504 /* FIXME: sim_open may call `error' if it fails, but perhaps it should
505 just return an error indicator and let us call `error'. */
506 gdbsim_desc = sim_open (argv);
3e38efa0 507
40b92220
JK
508 push_target (&gdbsim_ops);
509 target_fetch_registers (-1);
40b92220 510 printf_filtered ("Connected to the simulator.\n");
ec25d19b
SC
511}
512
40b92220
JK
513/* Does whatever cleanup is required for a target that we are no longer
514 going to be calling. Argument says whether we are quitting gdb and
515 should not get hung in case of errors, or whether we want a clean
516 termination even if it takes a while. This routine is automatically
517 always called just before a routine is popped off the target stack.
518 Closing file descriptors and freeing memory are typical things it should
519 do. */
ec25d19b
SC
520/* Close out all files and local state before this target loses control. */
521
a944e79a 522static void
40b92220 523gdbsim_close (quitting)
ec25d19b
SC
524 int quitting;
525{
40b92220
JK
526 if (sr_get_debug ())
527 printf_filtered ("gdbsim_close: quitting %d\n", quitting);
528
529 program_loaded = 0;
530
286f83b4 531 if (gdbsim_desc != NULL)
d9ad8adf 532 {
286f83b4
DE
533 sim_close (gdbsim_desc, quitting);
534 gdbsim_desc = NULL;
d9ad8adf 535 }
4da8b2a5
DE
536
537 end_callbacks ();
ec25d19b
SC
538}
539
40b92220
JK
540/* Takes a program previously attached to and detaches it.
541 The program may resume execution (some targets do, some don't) and will
542 no longer stop on signals, etc. We better not have left any breakpoints
543 in the program or it'll die when it hits one. ARGS is arguments
544 typed by the user (e.g. a signal to send the process). FROM_TTY
545 says whether to be verbose or not. */
ec25d19b 546/* Terminate the open connection to the remote debugger.
40b92220
JK
547 Use this when you want to detach and do something else with your gdb. */
548
549static void
550gdbsim_detach (args,from_tty)
ec25d19b
SC
551 char *args;
552 int from_tty;
553{
40b92220
JK
554 if (sr_get_debug ())
555 printf_filtered ("gdbsim_detach: args \"%s\"\n", args);
a944e79a 556
40b92220
JK
557 pop_target (); /* calls gdbsim_close to do the real work */
558 if (from_tty)
559 printf_filtered ("Ending simulator %s debugging\n", target_shortname);
ec25d19b
SC
560}
561
40b92220
JK
562/* Resume execution of the target process. STEP says whether to single-step
563 or to run free; SIGGNAL is the signal value (e.g. SIGINT) to be given
564 to the target, or zero for no signal. */
565
566static void
567gdbsim_resume (pid, step, siggnal)
67ac9759
JK
568 int pid, step;
569 enum target_signal siggnal;
40b92220 570{
6bafbdfb
JL
571 if (inferior_pid != 42)
572 error ("The program is not being run.");
573
40b92220
JK
574 if (sr_get_debug ())
575 printf_filtered ("gdbsim_resume: step %d, signal %d\n", step, siggnal);
ec25d19b 576
286f83b4 577 sim_resume (gdbsim_desc, step, target_signal_to_host (siggnal));
40b92220 578}
ec25d19b 579
40b92220
JK
580/* Wait for inferior process to do something. Return pid of child,
581 or -1 in case of error; store status through argument pointer STATUS,
582 just as `wait' would. */
ec25d19b 583
40b92220 584static int
de43d7d0
SG
585gdbsim_wait (pid, status)
586 int pid;
67ac9759 587 struct target_waitstatus *status;
ec25d19b 588{
592f517a 589 int sigrc;
c7efaa16 590 enum sim_stop reason;
592f517a 591
40b92220 592 if (sr_get_debug ())
67ac9759
JK
593 printf_filtered ("gdbsim_wait\n");
594
286f83b4 595 sim_stop_reason (gdbsim_desc, &reason, &sigrc);
67ac9759
JK
596 switch (reason)
597 {
598 case sim_exited:
599 status->kind = TARGET_WAITKIND_EXITED;
600 status->value.integer = sigrc;
601 break;
602 case sim_stopped:
603 status->kind = TARGET_WAITKIND_STOPPED;
604 /* The signal in sigrc is a host signal. That probably
605 should be fixed. */
606 status->value.sig = target_signal_from_host (sigrc);
607 break;
608 case sim_signalled:
609 status->kind = TARGET_WAITKIND_SIGNALLED;
610 /* The signal in sigrc is a host signal. That probably
611 should be fixed. */
612 status->value.sig = target_signal_from_host (sigrc);
613 break;
614 }
615
3f0184ac 616 return inferior_pid;
ec25d19b
SC
617}
618
40b92220
JK
619/* Get ready to modify the registers array. On machines which store
620 individual registers, this doesn't need to do anything. On machines
621 which store all the registers in one fell swoop, this makes sure
622 that registers contains all the registers from the program being
623 debugged. */
624
ec25d19b 625static void
40b92220 626gdbsim_prepare_to_store ()
ec25d19b 627{
40b92220 628 /* Do nothing, since we can store individual regs */
ec25d19b
SC
629}
630
40b92220
JK
631static int
632gdbsim_xfer_inferior_memory (memaddr, myaddr, len, write, target)
ec25d19b
SC
633 CORE_ADDR memaddr;
634 char *myaddr;
635 int len;
636 int write;
637 struct target_ops *target; /* ignored */
638{
40b92220
JK
639 if (! program_loaded)
640 error ("No program loaded.");
641
642 if (sr_get_debug ())
643 {
644 printf_filtered ("gdbsim_xfer_inferior_memory: myaddr 0x%x, memaddr 0x%x, len %d, write %d\n",
645 myaddr, memaddr, len, write);
646 if (sr_get_debug () && write)
647 dump_mem(myaddr, len);
648 }
649
ec25d19b 650 if (write)
40b92220 651 {
286f83b4 652 len = sim_write (gdbsim_desc, memaddr, myaddr, len);
40b92220 653 }
ec25d19b 654 else
40b92220 655 {
286f83b4 656 len = sim_read (gdbsim_desc, memaddr, myaddr, len);
40b92220
JK
657 if (sr_get_debug () && len > 0)
658 dump_mem(myaddr, len);
659 }
ec25d19b
SC
660 return len;
661}
662
40b92220
JK
663static void
664gdbsim_files_info (target)
665 struct target_ops *target;
666{
667 char *file = "nothing";
ec25d19b 668
40b92220
JK
669 if (exec_bfd)
670 file = bfd_get_filename (exec_bfd);
ec25d19b 671
40b92220
JK
672 if (sr_get_debug ())
673 printf_filtered ("gdbsim_files_info: file \"%s\"\n", file);
674
675 if (exec_bfd)
676 {
677 printf_filtered ("\tAttached to %s running program %s\n",
678 target_shortname, file);
286f83b4 679 sim_info (gdbsim_desc, 0);
40b92220 680 }
ec25d19b
SC
681}
682
fb506180 683/* Clear the simulator's notion of what the break points are. */
ec25d19b 684
40b92220
JK
685static void
686gdbsim_mourn_inferior ()
687{
688 if (sr_get_debug ())
689 printf_filtered ("gdbsim_mourn_inferior:\n");
ec25d19b 690
40b92220
JK
691 remove_breakpoints ();
692 generic_mourn_inferior ();
ec25d19b 693}
40b92220 694
07997f65
SS
695/* Pass the command argument through to the simulator verbatim. The
696 simulator must do any command interpretation work. */
ec25d19b 697
fb506180
SS
698static void
699simulator_command (args, from_tty)
700 char *args;
701 int from_tty;
ec25d19b 702{
07997f65
SS
703 /* The user may give a command before the simulator is opened, so
704 ensure that the callbacks have been set up. */
4da8b2a5 705 init_callbacks ();
07997f65 706
286f83b4
DE
707 /* Note that if the simulator hasn't been opened, gdbsim_desc == NULL
708 which is correct (??? assuming of course one wishes to continue to
709 allow commands to be sent to unopened simulators, which isn't entirely
710 unreasonable). */
711 sim_do_command (gdbsim_desc, args);
fb506180
SS
712}
713
714/* Define the target subroutine names */
715
716struct target_ops gdbsim_ops = {
717 "sim", /* to_shortname */
718 "simulator", /* to_longname */
719 "Use the compiled-in simulator.", /* to_doc */
720 gdbsim_open, /* to_open */
721 gdbsim_close, /* to_close */
722 NULL, /* to_attach */
723 gdbsim_detach, /* to_detach */
724 gdbsim_resume, /* to_resume */
725 gdbsim_wait, /* to_wait */
726 gdbsim_fetch_register, /* to_fetch_registers */
727 gdbsim_store_register, /* to_store_registers */
728 gdbsim_prepare_to_store, /* to_prepare_to_store */
729 gdbsim_xfer_inferior_memory, /* to_xfer_memory */
730 gdbsim_files_info, /* to_files_info */
731 memory_insert_breakpoint, /* to_insert_breakpoint */
732 memory_remove_breakpoint, /* to_remove_breakpoint */
733 NULL, /* to_terminal_init */
734 NULL, /* to_terminal_inferior */
735 NULL, /* to_terminal_ours_for_output */
736 NULL, /* to_terminal_ours */
737 NULL, /* to_terminal_info */
738 gdbsim_kill, /* to_kill */
739 gdbsim_load, /* to_load */
740 NULL, /* to_lookup_symbol */
741 gdbsim_create_inferior, /* to_create_inferior */
742 gdbsim_mourn_inferior, /* to_mourn_inferior */
743 0, /* to_can_run */
744 0, /* to_notice_signals */
43fc25c8 745 0, /* to_thread_alive */
78b459a7 746 0, /* to_stop */
fb506180
SS
747 process_stratum, /* to_stratum */
748 NULL, /* to_next */
749 1, /* to_has_all_memory */
750 1, /* to_has_memory */
751 1, /* to_has_stack */
752 1, /* to_has_registers */
753 1, /* to_has_execution */
754 NULL, /* sections */
755 NULL, /* sections_end */
756 OPS_MAGIC, /* to_magic */
ec25d19b
SC
757};
758
ec25d19b
SC
759void
760_initialize_remote_sim ()
761{
40b92220 762 add_target (&gdbsim_ops);
fb506180
SS
763
764 add_com ("sim <command>", class_obscure, simulator_command,
765 "Send a command to the simulator.");
ec25d19b 766}
This page took 0.268768 seconds and 4 git commands to generate.