1 /* Generic remote debugging interface for simulators.
2 Copyright 1993, 1994, 1996 Free Software Foundation, Inc.
3 Contributed by Cygnus Support.
4 Steve Chamberlain (sac@cygnus.com).
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
26 #include "gdb_string.h"
36 #include "remote-sim.h"
37 #include "remote-utils.h"
41 static void dump_mem
PARAMS ((char *buf
, int len
));
43 static void init_callbacks
PARAMS ((void));
45 static void end_callbacks
PARAMS ((void));
47 static int gdb_os_write_stdout
PARAMS ((host_callback
*, const char *, int));
49 static void gdb_os_printf_filtered
PARAMS ((host_callback
*, const char *, ...));
51 static void gdb_os_error
PARAMS ((host_callback
*, const char *, ...));
53 static void gdbsim_fetch_register
PARAMS ((int regno
));
55 static void gdbsim_store_register
PARAMS ((int regno
));
57 static void gdbsim_kill
PARAMS ((void));
59 static void gdbsim_load
PARAMS ((char *prog
, int fromtty
));
61 static void gdbsim_create_inferior
PARAMS ((char *exec_file
, char *args
, char **env
));
63 static void gdbsim_open
PARAMS ((char *args
, int from_tty
));
65 static void gdbsim_close
PARAMS ((int quitting
));
67 static void gdbsim_detach
PARAMS ((char *args
, int from_tty
));
69 static void gdbsim_resume
PARAMS ((int pid
, int step
, enum target_signal siggnal
));
71 static int gdbsim_wait
PARAMS ((int pid
, struct target_waitstatus
*status
));
73 static void gdbsim_prepare_to_store
PARAMS ((void));
75 static int gdbsim_xfer_inferior_memory
PARAMS ((CORE_ADDR memaddr
,
76 char *myaddr
, int len
,
78 struct target_ops
*target
));
80 static void gdbsim_files_info
PARAMS ((struct target_ops
*target
));
82 static void gdbsim_mourn_inferior
PARAMS ((void));
84 static void simulator_command
PARAMS ((char *args
, int from_tty
));
88 sim_* are the interface to the simulator (see remote-sim.h).
89 gdbsim_* are stuff which is internal to gdb. */
91 /* Forward data declarations */
92 extern struct target_ops gdbsim_ops
;
94 static int program_loaded
= 0;
103 if (len
== 8 || len
== 4)
106 memcpy (l
, buf
, len
);
107 printf_filtered ("\t0x%x", l
[0]);
108 printf_filtered (len
== 8 ? " 0x%x\n" : "\n", l
[1]);
113 printf_filtered ("\t");
114 for (i
= 0; i
< len
; i
++)
115 printf_filtered ("0x%x ", buf
[i
]);
116 printf_filtered ("\n");
121 static host_callback gdb_callback
;
122 static int callbacks_initialized
= 0;
124 /* Initialize gdb_callback. */
129 if (! callbacks_initialized
)
131 gdb_callback
= default_callback
;
132 gdb_callback
.init (&gdb_callback
);
133 gdb_callback
.write_stdout
= gdb_os_write_stdout
;
134 gdb_callback
.printf_filtered
= gdb_os_printf_filtered
;
135 gdb_callback
.error
= gdb_os_error
;
136 sim_set_callbacks (&gdb_callback
);
137 callbacks_initialized
= 1;
141 /* Release callbacks (free resources used by them). */
146 if (callbacks_initialized
)
148 gdb_callback
.shutdown (&gdb_callback
);
149 callbacks_initialized
= 0;
153 /* GDB version of os_write_stdout callback. */
156 gdb_os_write_stdout (p
, buf
, len
)
164 for (i
= 0; i
< len
; i
++)
168 if (target_output_hook
)
169 target_output_hook (b
);
171 fputs_filtered (b
, gdb_stdout
);
176 /* GDB version of printf_filtered callback. */
180 #ifdef ANSI_PROTOTYPES
181 gdb_os_printf_filtered (host_callback
*p
, const char *format
, ...)
183 gdb_os_printf_filtered (p
, va_alist
)
189 #ifdef ANSI_PROTOTYPES
190 va_start (args
, format
);
195 format
= va_arg (args
, char *);
198 vfprintf_filtered (gdb_stdout
, format
, args
);
203 /* GDB version of error callback. */
207 #ifdef ANSI_PROTOTYPES
208 gdb_os_error (host_callback
*p
, const char *format
, ...)
210 gdb_os_error (p
, va_alist
)
220 #ifdef ANSI_PROTOTYPES
221 va_start (args
, format
);
226 format
= va_arg (args
, char *);
230 vfprintf_filtered (gdb_stderr
, format
, args
);
231 fprintf_filtered (gdb_stderr
, "\n");
233 return_to_top_level (RETURN_ERROR
);
238 gdbsim_fetch_register (regno
)
243 for (regno
= 0; regno
< NUM_REGS
; regno
++)
244 gdbsim_fetch_register (regno
);
248 char buf
[MAX_REGISTER_RAW_SIZE
];
250 sim_fetch_register (regno
, buf
);
251 supply_register (regno
, buf
);
254 printf_filtered ("gdbsim_fetch_register: %d", regno
);
255 /* FIXME: We could print something more intelligible. */
256 dump_mem (buf
, REGISTER_RAW_SIZE (regno
));
263 gdbsim_store_register (regno
)
268 for (regno
= 0; regno
< NUM_REGS
; regno
++)
269 gdbsim_store_register (regno
);
273 /* FIXME: Until read_register() returns LONGEST, we have this. */
274 char tmp
[MAX_REGISTER_RAW_SIZE
];
275 read_register_gen (regno
, tmp
);
276 sim_store_register (regno
, tmp
);
279 printf_filtered ("gdbsim_store_register: %d", regno
);
280 /* FIXME: We could print something more intelligible. */
281 dump_mem (tmp
, REGISTER_RAW_SIZE (regno
));
286 /* Kill the running program. This may involve closing any open files
287 and releasing other resources acquired by the simulated program. */
293 printf_filtered ("gdbsim_kill\n");
295 sim_kill (); /* close fd's, remove mappings */
299 /* Load an executable file into the target process. This is expected to
300 not only bring new code into the target process, but also to update
301 GDB's symbol tables to match. */
304 gdbsim_load (prog
, fromtty
)
309 printf_filtered ("gdbsim_load: prog \"%s\"\n", prog
);
313 /* This must be done before calling gr_load_image. */
316 if (sim_load (prog
, fromtty
) != 0)
317 generic_load (prog
, fromtty
);
321 /* Start an inferior process and set inferior_pid to its pid.
322 EXEC_FILE is the file to run.
323 ARGS is a string containing the arguments to the program.
324 ENV is the environment vector to pass. Errors reported with error().
325 On VxWorks and various standalone systems, we ignore exec_file. */
326 /* This is called not only when we first attach, but also when the
327 user types "run" after having attached. */
330 gdbsim_create_inferior (exec_file
, args
, env
)
336 char *arg_buf
,**argv
;
339 if (! program_loaded
)
340 error ("No program loaded.");
343 printf_filtered ("gdbsim_create_inferior: exec_file \"%s\", args \"%s\"\n",
346 if (exec_file
== 0 || exec_bfd
== 0)
347 error ("No exec file specified.");
349 entry_pt
= (CORE_ADDR
) bfd_get_start_address (exec_bfd
);
352 remove_breakpoints ();
353 init_wait_for_inferior ();
355 len
= strlen (exec_file
) + 1 + strlen (args
) + 1 + /*slop*/ 10;
356 arg_buf
= (char *) alloca (len
);
358 strcat (arg_buf
, exec_file
);
359 strcat (arg_buf
, " ");
360 strcat (arg_buf
, args
);
361 argv
= buildargv (arg_buf
);
362 make_cleanup (freeargv
, (char *) argv
);
363 sim_create_inferior (entry_pt
, argv
, env
);
366 insert_breakpoints (); /* Needed to get correct instruction in cache */
367 proceed (entry_pt
, TARGET_SIGNAL_DEFAULT
, 0);
370 /* The open routine takes the rest of the parameters from the command,
371 and (if successful) pushes a new target onto the stack.
372 Targets should supply this routine, if only to provide an error message. */
373 /* Called when selecting the simulator. EG: (gdb) target sim name. */
376 gdbsim_open (args
, from_tty
)
381 printf_filtered ("gdbsim_open: args \"%s\"\n", args
? args
: "(null)");
387 push_target (&gdbsim_ops
);
388 target_fetch_registers (-1);
389 printf_filtered ("Connected to the simulator.\n");
392 /* Does whatever cleanup is required for a target that we are no longer
393 going to be calling. Argument says whether we are quitting gdb and
394 should not get hung in case of errors, or whether we want a clean
395 termination even if it takes a while. This routine is automatically
396 always called just before a routine is popped off the target stack.
397 Closing file descriptors and freeing memory are typical things it should
399 /* Close out all files and local state before this target loses control. */
402 gdbsim_close (quitting
)
406 printf_filtered ("gdbsim_close: quitting %d\n", quitting
);
410 sim_close (quitting
);
415 /* Takes a program previously attached to and detaches it.
416 The program may resume execution (some targets do, some don't) and will
417 no longer stop on signals, etc. We better not have left any breakpoints
418 in the program or it'll die when it hits one. ARGS is arguments
419 typed by the user (e.g. a signal to send the process). FROM_TTY
420 says whether to be verbose or not. */
421 /* Terminate the open connection to the remote debugger.
422 Use this when you want to detach and do something else with your gdb. */
425 gdbsim_detach (args
,from_tty
)
430 printf_filtered ("gdbsim_detach: args \"%s\"\n", args
);
432 pop_target (); /* calls gdbsim_close to do the real work */
434 printf_filtered ("Ending simulator %s debugging\n", target_shortname
);
437 /* Resume execution of the target process. STEP says whether to single-step
438 or to run free; SIGGNAL is the signal value (e.g. SIGINT) to be given
439 to the target, or zero for no signal. */
442 gdbsim_resume (pid
, step
, siggnal
)
444 enum target_signal siggnal
;
446 if (inferior_pid
!= 42)
447 error ("The program is not being run.");
450 printf_filtered ("gdbsim_resume: step %d, signal %d\n", step
, siggnal
);
452 sim_resume (step
, target_signal_to_host (siggnal
));
455 /* Wait for inferior process to do something. Return pid of child,
456 or -1 in case of error; store status through argument pointer STATUS,
457 just as `wait' would. */
460 gdbsim_wait (pid
, status
)
462 struct target_waitstatus
*status
;
465 enum sim_stop reason
;
468 printf_filtered ("gdbsim_wait\n");
470 sim_stop_reason (&reason
, &sigrc
);
474 status
->kind
= TARGET_WAITKIND_EXITED
;
475 status
->value
.integer
= sigrc
;
478 status
->kind
= TARGET_WAITKIND_STOPPED
;
479 /* The signal in sigrc is a host signal. That probably
481 status
->value
.sig
= target_signal_from_host (sigrc
);
484 status
->kind
= TARGET_WAITKIND_SIGNALLED
;
485 /* The signal in sigrc is a host signal. That probably
487 status
->value
.sig
= target_signal_from_host (sigrc
);
494 /* Get ready to modify the registers array. On machines which store
495 individual registers, this doesn't need to do anything. On machines
496 which store all the registers in one fell swoop, this makes sure
497 that registers contains all the registers from the program being
501 gdbsim_prepare_to_store ()
503 /* Do nothing, since we can store individual regs */
507 gdbsim_xfer_inferior_memory (memaddr
, myaddr
, len
, write
, target
)
512 struct target_ops
*target
; /* ignored */
514 if (! program_loaded
)
515 error ("No program loaded.");
519 printf_filtered ("gdbsim_xfer_inferior_memory: myaddr 0x%x, memaddr 0x%x, len %d, write %d\n",
520 myaddr
, memaddr
, len
, write
);
521 if (sr_get_debug () && write
)
522 dump_mem(myaddr
, len
);
527 len
= sim_write (memaddr
, myaddr
, len
);
531 len
= sim_read (memaddr
, myaddr
, len
);
532 if (sr_get_debug () && len
> 0)
533 dump_mem(myaddr
, len
);
539 gdbsim_files_info (target
)
540 struct target_ops
*target
;
542 char *file
= "nothing";
545 file
= bfd_get_filename (exec_bfd
);
548 printf_filtered ("gdbsim_files_info: file \"%s\"\n", file
);
552 printf_filtered ("\tAttached to %s running program %s\n",
553 target_shortname
, file
);
558 /* Clear the simulator's notion of what the break points are. */
561 gdbsim_mourn_inferior ()
564 printf_filtered ("gdbsim_mourn_inferior:\n");
566 remove_breakpoints ();
567 generic_mourn_inferior ();
570 /* Pass the command argument through to the simulator verbatim. The
571 simulator must do any command interpretation work. */
574 simulator_command (args
, from_tty
)
578 /* The user may give a command before the simulator is opened, so
579 ensure that the callbacks have been set up. */
582 sim_do_command (args
);
585 /* Define the target subroutine names */
587 struct target_ops gdbsim_ops
= {
588 "sim", /* to_shortname */
589 "simulator", /* to_longname */
590 "Use the compiled-in simulator.", /* to_doc */
591 gdbsim_open
, /* to_open */
592 gdbsim_close
, /* to_close */
593 NULL
, /* to_attach */
594 gdbsim_detach
, /* to_detach */
595 gdbsim_resume
, /* to_resume */
596 gdbsim_wait
, /* to_wait */
597 gdbsim_fetch_register
, /* to_fetch_registers */
598 gdbsim_store_register
, /* to_store_registers */
599 gdbsim_prepare_to_store
, /* to_prepare_to_store */
600 gdbsim_xfer_inferior_memory
, /* to_xfer_memory */
601 gdbsim_files_info
, /* to_files_info */
602 memory_insert_breakpoint
, /* to_insert_breakpoint */
603 memory_remove_breakpoint
, /* to_remove_breakpoint */
604 NULL
, /* to_terminal_init */
605 NULL
, /* to_terminal_inferior */
606 NULL
, /* to_terminal_ours_for_output */
607 NULL
, /* to_terminal_ours */
608 NULL
, /* to_terminal_info */
609 gdbsim_kill
, /* to_kill */
610 gdbsim_load
, /* to_load */
611 NULL
, /* to_lookup_symbol */
612 gdbsim_create_inferior
, /* to_create_inferior */
613 gdbsim_mourn_inferior
, /* to_mourn_inferior */
615 0, /* to_notice_signals */
616 0, /* to_thread_alive */
618 process_stratum
, /* to_stratum */
620 1, /* to_has_all_memory */
621 1, /* to_has_memory */
622 1, /* to_has_stack */
623 1, /* to_has_registers */
624 1, /* to_has_execution */
626 NULL
, /* sections_end */
627 OPS_MAGIC
, /* to_magic */
631 _initialize_remote_sim ()
633 add_target (&gdbsim_ops
);
635 add_com ("sim <command>", class_obscure
, simulator_command
,
636 "Send a command to the simulator.");