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