* valprint.c (print_longest): Don't lose upper bits
[deliverable/binutils-gdb.git] / gdb / remote-sim.c
CommitLineData
40b92220 1/* Generic remote debugging interface for simulators.
4da8b2a5 2 Copyright 1993, 1994, 1996 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
49static void gdb_os_printf_filtered PARAMS ((host_callback *, const char *, ...));
50
163a75af
DE
51static void gdb_os_error PARAMS ((host_callback *, const char *, ...));
52
8501c742
SG
53static void gdbsim_fetch_register PARAMS ((int regno));
54
55static void gdbsim_store_register PARAMS ((int regno));
56
57static void gdbsim_kill PARAMS ((void));
58
59static void gdbsim_load PARAMS ((char *prog, int fromtty));
60
61static void gdbsim_create_inferior PARAMS ((char *exec_file, char *args, char **env));
62
63static void gdbsim_open PARAMS ((char *args, int from_tty));
64
65static void gdbsim_close PARAMS ((int quitting));
66
67static void gdbsim_detach PARAMS ((char *args, int from_tty));
68
69static void gdbsim_resume PARAMS ((int pid, int step, enum target_signal siggnal));
70
71static int gdbsim_wait PARAMS ((int pid, struct target_waitstatus *status));
72
73static void gdbsim_prepare_to_store PARAMS ((void));
74
75static int gdbsim_xfer_inferior_memory PARAMS ((CORE_ADDR memaddr,
76 char *myaddr, int len,
77 int write,
78 struct target_ops *target));
79
80static void gdbsim_files_info PARAMS ((struct target_ops *target));
81
82static void gdbsim_mourn_inferior PARAMS ((void));
83
84static void simulator_command PARAMS ((char *args, int from_tty));
85
40b92220
JK
86/* Naming convention:
87
88 sim_* are the interface to the simulator (see remote-sim.h).
40b92220 89 gdbsim_* are stuff which is internal to gdb. */
ec25d19b
SC
90
91/* Forward data declarations */
40b92220 92extern struct target_ops gdbsim_ops;
ec25d19b 93
40b92220
JK
94static int program_loaded = 0;
95
96static void
97dump_mem (buf, len)
98 char *buf;
ec25d19b
SC
99 int len;
100{
40b92220
JK
101 if (len <= 8)
102 {
103 if (len == 8 || len == 4)
104 {
105 long l[2];
106 memcpy (l, buf, len);
107 printf_filtered ("\t0x%x", l[0]);
108 printf_filtered (len == 8 ? " 0x%x\n" : "\n", l[1]);
109 }
110 else
111 {
112 int i;
113 printf_filtered ("\t");
114 for (i = 0; i < len; i++)
115 printf_filtered ("0x%x ", buf[i]);
116 printf_filtered ("\n");
117 }
118 }
119}
120
4da8b2a5
DE
121static host_callback gdb_callback;
122static int callbacks_initialized = 0;
123
124/* Initialize gdb_callback. */
125
126static void
127init_callbacks ()
128{
129 if (! callbacks_initialized)
130 {
131 gdb_callback = default_callback;
163a75af
DE
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;
4da8b2a5
DE
136 sim_set_callbacks (&gdb_callback);
137 callbacks_initialized = 1;
138 }
139}
140
141/* Release callbacks (free resources used by them). */
142
143static void
144end_callbacks ()
145{
146 if (callbacks_initialized)
147 {
148 gdb_callback.shutdown (&gdb_callback);
149 callbacks_initialized = 0;
150 }
151}
152
153/* GDB version of os_write_stdout callback. */
154
155static int
156gdb_os_write_stdout (p, buf, len)
157 host_callback *p;
158 const char *buf;
159 int len;
160{
161 int i;
162 char b[2];
163
164 for (i = 0; i < len; i++)
165 {
166 b[0] = buf[i];
167 b[1] = 0;
168 if (target_output_hook)
169 target_output_hook (b);
170 else
171 fputs_filtered (b, gdb_stdout);
172 }
173 return len;
174}
175
176/* GDB version of printf_filtered callback. */
177
178/* VARARGS */
179static void
180#ifdef ANSI_PROTOTYPES
181gdb_os_printf_filtered (host_callback *p, const char *format, ...)
182#else
183gdb_os_printf_filtered (p, va_alist)
184 host_callback *p;
185 va_dcl
186#endif
187{
188 va_list args;
189#ifdef ANSI_PROTOTYPES
190 va_start (args, format);
191#else
192 char *format;
193
194 va_start (args);
195 format = va_arg (args, char *);
196#endif
197
163a75af 198 vfprintf_filtered (gdb_stdout, format, args);
4da8b2a5
DE
199
200 va_end (args);
201}
202
163a75af
DE
203/* GDB version of error callback. */
204
205/* VARARGS */
206static void
207#ifdef ANSI_PROTOTYPES
208gdb_os_error (host_callback *p, const char *format, ...)
209#else
210gdb_os_error (p, va_alist)
211 host_callback *p;
212 va_dcl
213#endif
214{
215 if (error_hook)
216 (*error_hook) ();
217 else
218 {
219 va_list args;
220#ifdef ANSI_PROTOTYPES
221 va_start (args, format);
222#else
223 char *format;
224
225 va_start (args);
226 format = va_arg (args, char *);
227#endif
228
229 error_begin ();
230 vfprintf_filtered (gdb_stderr, format, args);
231 fprintf_filtered (gdb_stderr, "\n");
232 va_end (args);
233 return_to_top_level (RETURN_ERROR);
234 }
235}
236
40b92220
JK
237static void
238gdbsim_fetch_register (regno)
239int regno;
240{
241 if (regno == -1)
242 {
243 for (regno = 0; regno < NUM_REGS; regno++)
244 gdbsim_fetch_register (regno);
245 }
246 else
247 {
248 char buf[MAX_REGISTER_RAW_SIZE];
249
250 sim_fetch_register (regno, buf);
251 supply_register (regno, buf);
252 if (sr_get_debug ())
253 {
254 printf_filtered ("gdbsim_fetch_register: %d", regno);
255 /* FIXME: We could print something more intelligible. */
256 dump_mem (buf, REGISTER_RAW_SIZE (regno));
257 }
258 }
ec25d19b
SC
259}
260
6b009ef6 261
a944e79a 262static void
40b92220 263gdbsim_store_register (regno)
ec25d19b
SC
264int regno;
265{
266 if (regno == -1)
40b92220
JK
267 {
268 for (regno = 0; regno < NUM_REGS; regno++)
269 gdbsim_store_register (regno);
270 }
271 else
272 {
273 /* FIXME: Until read_register() returns LONGEST, we have this. */
3beff94e
SC
274 char tmp[MAX_REGISTER_RAW_SIZE];
275 read_register_gen (regno, tmp);
276 sim_store_register (regno, tmp);
40b92220
JK
277 if (sr_get_debug ())
278 {
279 printf_filtered ("gdbsim_store_register: %d", regno);
280 /* FIXME: We could print something more intelligible. */
3beff94e 281 dump_mem (tmp, REGISTER_RAW_SIZE (regno));
40b92220
JK
282 }
283 }
ec25d19b
SC
284}
285
47424e79
DE
286/* Kill the running program. This may involve closing any open files
287 and releasing other resources acquired by the simulated program. */
288
40b92220
JK
289static void
290gdbsim_kill ()
291{
292 if (sr_get_debug ())
293 printf_filtered ("gdbsim_kill\n");
294
295 sim_kill (); /* close fd's, remove mappings */
296 inferior_pid = 0;
297}
298
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. */
ec25d19b 302
ec25d19b 303static void
40b92220
JK
304gdbsim_load (prog, fromtty)
305 char *prog;
306 int fromtty;
ec25d19b 307{
40b92220
JK
308 if (sr_get_debug ())
309 printf_filtered ("gdbsim_load: prog \"%s\"\n", prog);
ec25d19b 310
47424e79
DE
311 inferior_pid = 0;
312
313 /* This must be done before calling gr_load_image. */
40b92220 314 program_loaded = 1;
47424e79
DE
315
316 if (sim_load (prog, fromtty) != 0)
dedcc91d 317 generic_load (prog, fromtty);
40b92220
JK
318}
319
ec25d19b 320
40b92220
JK
321/* Start an inferior process and set inferior_pid to its pid.
322 EXEC_FILE is the file to run.
163a75af 323 ARGS is a string containing the arguments to the program.
40b92220
JK
324 ENV is the environment vector to pass. Errors reported with error().
325 On VxWorks and various standalone systems, we ignore exec_file. */
ec25d19b
SC
326/* This is called not only when we first attach, but also when the
327 user types "run" after having attached. */
40b92220
JK
328
329static void
330gdbsim_create_inferior (exec_file, args, env)
331 char *exec_file;
ec25d19b
SC
332 char *args;
333 char **env;
334{
47424e79 335 int len;
40b92220 336 char *arg_buf,**argv;
47424e79 337 CORE_ADDR entry_pt;
ec25d19b 338
40b92220
JK
339 if (! program_loaded)
340 error ("No program loaded.");
ec25d19b 341
40b92220
JK
342 if (sr_get_debug ())
343 printf_filtered ("gdbsim_create_inferior: exec_file \"%s\", args \"%s\"\n",
344 exec_file, args);
345
346 if (exec_file == 0 || exec_bfd == 0)
347 error ("No exec file specified.");
ec25d19b 348
47424e79 349 entry_pt = (CORE_ADDR) bfd_get_start_address (exec_bfd);
40b92220 350
8501c742 351 gdbsim_kill ();
40b92220 352 remove_breakpoints ();
ec25d19b 353 init_wait_for_inferior ();
ec25d19b 354
163a75af 355 len = strlen (exec_file) + 1 + strlen (args) + 1 + /*slop*/ 10;
40b92220
JK
356 arg_buf = (char *) alloca (len);
357 arg_buf[0] = '\0';
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);
47424e79 363 sim_create_inferior (entry_pt, argv, env);
40b92220
JK
364
365 inferior_pid = 42;
366 insert_breakpoints (); /* Needed to get correct instruction in cache */
45dc9be3 367 proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
40b92220 368}
ec25d19b 369
40b92220
JK
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. */
ec25d19b 374
a944e79a 375static void
40b92220
JK
376gdbsim_open (args, from_tty)
377 char *args;
ec25d19b
SC
378 int from_tty;
379{
40b92220 380 if (sr_get_debug ())
47424e79 381 printf_filtered ("gdbsim_open: args \"%s\"\n", args ? args : "(null)");
7a29d686 382
4da8b2a5 383 init_callbacks ();
7a29d686 384
3e38efa0
JSC
385 sim_open (args);
386
40b92220
JK
387 push_target (&gdbsim_ops);
388 target_fetch_registers (-1);
40b92220 389 printf_filtered ("Connected to the simulator.\n");
ec25d19b
SC
390}
391
40b92220
JK
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
398 do. */
ec25d19b
SC
399/* Close out all files and local state before this target loses control. */
400
a944e79a 401static void
40b92220 402gdbsim_close (quitting)
ec25d19b
SC
403 int quitting;
404{
40b92220
JK
405 if (sr_get_debug ())
406 printf_filtered ("gdbsim_close: quitting %d\n", quitting);
407
408 program_loaded = 0;
409
47424e79 410 sim_close (quitting);
4da8b2a5
DE
411
412 end_callbacks ();
ec25d19b
SC
413}
414
40b92220
JK
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. */
ec25d19b 421/* Terminate the open connection to the remote debugger.
40b92220
JK
422 Use this when you want to detach and do something else with your gdb. */
423
424static void
425gdbsim_detach (args,from_tty)
ec25d19b
SC
426 char *args;
427 int from_tty;
428{
40b92220
JK
429 if (sr_get_debug ())
430 printf_filtered ("gdbsim_detach: args \"%s\"\n", args);
a944e79a 431
40b92220
JK
432 pop_target (); /* calls gdbsim_close to do the real work */
433 if (from_tty)
434 printf_filtered ("Ending simulator %s debugging\n", target_shortname);
ec25d19b
SC
435}
436
40b92220
JK
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. */
440
441static void
442gdbsim_resume (pid, step, siggnal)
67ac9759
JK
443 int pid, step;
444 enum target_signal siggnal;
40b92220 445{
6bafbdfb
JL
446 if (inferior_pid != 42)
447 error ("The program is not being run.");
448
40b92220
JK
449 if (sr_get_debug ())
450 printf_filtered ("gdbsim_resume: step %d, signal %d\n", step, siggnal);
ec25d19b 451
67ac9759 452 sim_resume (step, target_signal_to_host (siggnal));
40b92220 453}
ec25d19b 454
40b92220
JK
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. */
ec25d19b 458
40b92220 459static int
de43d7d0
SG
460gdbsim_wait (pid, status)
461 int pid;
67ac9759 462 struct target_waitstatus *status;
ec25d19b 463{
592f517a 464 int sigrc;
c7efaa16 465 enum sim_stop reason;
592f517a 466
40b92220 467 if (sr_get_debug ())
67ac9759
JK
468 printf_filtered ("gdbsim_wait\n");
469
c7efaa16 470 sim_stop_reason (&reason, &sigrc);
67ac9759
JK
471 switch (reason)
472 {
473 case sim_exited:
474 status->kind = TARGET_WAITKIND_EXITED;
475 status->value.integer = sigrc;
476 break;
477 case sim_stopped:
478 status->kind = TARGET_WAITKIND_STOPPED;
479 /* The signal in sigrc is a host signal. That probably
480 should be fixed. */
481 status->value.sig = target_signal_from_host (sigrc);
482 break;
483 case sim_signalled:
484 status->kind = TARGET_WAITKIND_SIGNALLED;
485 /* The signal in sigrc is a host signal. That probably
486 should be fixed. */
487 status->value.sig = target_signal_from_host (sigrc);
488 break;
489 }
490
3f0184ac 491 return inferior_pid;
ec25d19b
SC
492}
493
40b92220
JK
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
498 debugged. */
499
ec25d19b 500static void
40b92220 501gdbsim_prepare_to_store ()
ec25d19b 502{
40b92220 503 /* Do nothing, since we can store individual regs */
ec25d19b
SC
504}
505
40b92220
JK
506static int
507gdbsim_xfer_inferior_memory (memaddr, myaddr, len, write, target)
ec25d19b
SC
508 CORE_ADDR memaddr;
509 char *myaddr;
510 int len;
511 int write;
512 struct target_ops *target; /* ignored */
513{
40b92220
JK
514 if (! program_loaded)
515 error ("No program loaded.");
516
517 if (sr_get_debug ())
518 {
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);
523 }
524
ec25d19b 525 if (write)
40b92220
JK
526 {
527 len = sim_write (memaddr, myaddr, len);
528 }
ec25d19b 529 else
40b92220
JK
530 {
531 len = sim_read (memaddr, myaddr, len);
532 if (sr_get_debug () && len > 0)
533 dump_mem(myaddr, len);
534 }
ec25d19b
SC
535 return len;
536}
537
40b92220
JK
538static void
539gdbsim_files_info (target)
540 struct target_ops *target;
541{
542 char *file = "nothing";
ec25d19b 543
40b92220
JK
544 if (exec_bfd)
545 file = bfd_get_filename (exec_bfd);
ec25d19b 546
40b92220
JK
547 if (sr_get_debug ())
548 printf_filtered ("gdbsim_files_info: file \"%s\"\n", file);
549
550 if (exec_bfd)
551 {
552 printf_filtered ("\tAttached to %s running program %s\n",
553 target_shortname, file);
47424e79 554 sim_info (0);
40b92220 555 }
ec25d19b
SC
556}
557
fb506180 558/* Clear the simulator's notion of what the break points are. */
ec25d19b 559
40b92220
JK
560static void
561gdbsim_mourn_inferior ()
562{
563 if (sr_get_debug ())
564 printf_filtered ("gdbsim_mourn_inferior:\n");
ec25d19b 565
40b92220
JK
566 remove_breakpoints ();
567 generic_mourn_inferior ();
ec25d19b 568}
40b92220 569
07997f65
SS
570/* Pass the command argument through to the simulator verbatim. The
571 simulator must do any command interpretation work. */
ec25d19b 572
fb506180
SS
573static void
574simulator_command (args, from_tty)
575 char *args;
576 int from_tty;
ec25d19b 577{
07997f65
SS
578 /* The user may give a command before the simulator is opened, so
579 ensure that the callbacks have been set up. */
4da8b2a5 580 init_callbacks ();
07997f65 581
fb506180
SS
582 sim_do_command (args);
583}
584
585/* Define the target subroutine names */
586
587struct 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 */
614 0, /* to_can_run */
615 0, /* to_notice_signals */
43fc25c8 616 0, /* to_thread_alive */
78b459a7 617 0, /* to_stop */
fb506180
SS
618 process_stratum, /* to_stratum */
619 NULL, /* to_next */
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 */
625 NULL, /* sections */
626 NULL, /* sections_end */
627 OPS_MAGIC, /* to_magic */
ec25d19b
SC
628};
629
ec25d19b
SC
630void
631_initialize_remote_sim ()
632{
40b92220 633 add_target (&gdbsim_ops);
fb506180
SS
634
635 add_com ("sim <command>", class_obscure, simulator_command,
636 "Send a command to the simulator.");
ec25d19b 637}
This page took 0.252958 seconds and 4 git commands to generate.