Call set_gdbarch_get_siginfo_type in linux_init_abi
[deliverable/binutils-gdb.git] / gdb / remote-sim.c
CommitLineData
c906108c 1/* Generic remote debugging interface for simulators.
0a65a603 2
32d0add0 3 Copyright (C) 1993-2015 Free Software Foundation, Inc.
0a65a603 4
c906108c
SS
5 Contributed by Cygnus Support.
6 Steve Chamberlain (sac@cygnus.com).
7
c5aa993b 8 This file is part of GDB.
c906108c 9
c5aa993b
JM
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
c5aa993b 13 (at your option) any later version.
c906108c 14
c5aa993b
JM
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
c906108c 19
c5aa993b 20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
22
23#include "defs.h"
24#include "inferior.h"
45741a9c 25#include "infrun.h"
c906108c 26#include "value.h"
c906108c
SS
27#include <ctype.h>
28#include <fcntl.h>
29#include <signal.h>
30#include <setjmp.h>
c906108c
SS
31#include "terminal.h"
32#include "target.h"
33#include "gdbcore.h"
3c25f8c7
AC
34#include "gdb/callback.h"
35#include "gdb/remote-sim.h"
c906108c 36#include "command.h"
4e052eda 37#include "regcache.h"
8238d0bf 38#include "sim-regno.h"
a8cf2722 39#include "arch-utils.h"
1986bccd 40#include "readline/readline.h"
9de2bdd7 41#include "gdbthread.h"
c906108c
SS
42
43/* Prototypes */
44
a14ed312 45extern void _initialize_remote_sim (void);
392a587b 46
a14ed312 47static void init_callbacks (void);
c906108c 48
a14ed312 49static void end_callbacks (void);
c906108c 50
a14ed312 51static int gdb_os_write_stdout (host_callback *, const char *, int);
c906108c 52
a14ed312 53static void gdb_os_flush_stdout (host_callback *);
c906108c 54
a14ed312 55static int gdb_os_write_stderr (host_callback *, const char *, int);
c906108c 56
a14ed312 57static void gdb_os_flush_stderr (host_callback *);
c906108c 58
a14ed312 59static int gdb_os_poll_quit (host_callback *);
c906108c 60
0df8b418 61/* printf_filtered is depreciated. */
a14ed312 62static void gdb_os_printf_filtered (host_callback *, const char *, ...);
c906108c 63
a14ed312 64static void gdb_os_vprintf_filtered (host_callback *, const char *, va_list);
c906108c 65
a14ed312 66static void gdb_os_evprintf_filtered (host_callback *, const char *, va_list);
c906108c 67
c25c4a8b
JK
68static void gdb_os_error (host_callback *, const char *, ...)
69 ATTRIBUTE_NORETURN;
c906108c 70
7d85a9c0 71static void gdbsim_kill (struct target_ops *);
c906108c 72
9cbe5fff
TT
73static void gdbsim_load (struct target_ops *self, const char *prog,
74 int fromtty);
c906108c 75
74228e77 76static void gdbsim_open (const char *args, int from_tty);
c906108c 77
de90e03d 78static void gdbsim_close (struct target_ops *self);
c906108c 79
8ca5801b
JB
80static void gdbsim_detach (struct target_ops *ops, const char *args,
81 int from_tty);
c906108c 82
f32dbf8c
MM
83static void gdbsim_prepare_to_store (struct target_ops *self,
84 struct regcache *regcache);
c906108c 85
a14ed312 86static void gdbsim_files_info (struct target_ops *target);
c906108c 87
3c8b2eda 88static void gdbsim_mourn_inferior (struct target_ops *target);
c906108c 89
1eab8a48 90static void gdbsim_stop (struct target_ops *self, ptid_t ptid);
c906108c 91
a14ed312 92void simulator_command (char *args, int from_tty);
c906108c
SS
93
94/* Naming convention:
95
96 sim_* are the interface to the simulator (see remote-sim.h).
97 gdbsim_* are stuff which is internal to gdb. */
98
99/* Forward data declarations */
100extern struct target_ops gdbsim_ops;
101
db04efe6
KB
102static const struct inferior_data *sim_inferior_data_key;
103
104/* Simulator-specific, per-inferior state. */
105struct sim_inferior_data {
106 /* Flag which indicates whether or not the program has been loaded. */
107 int program_loaded;
108
109 /* Simulator descriptor for this inferior. */
110 SIM_DESC gdbsim_desc;
111
112 /* This is the ptid we use for this particular simulator instance. Its
113 value is somewhat arbitrary, as the simulator target don't have a
114 notion of tasks or threads, but we need something non-null to place
115 in inferior_ptid. For simulators which permit multiple instances,
116 we also need a unique identifier to use for each inferior. */
117 ptid_t remote_sim_ptid;
118
119 /* Signal with which to resume. */
2ea28649 120 enum gdb_signal resume_siggnal;
db04efe6
KB
121
122 /* Flag which indicates whether resume should step or not. */
123 int resume_step;
124};
125
126/* Flag indicating the "open" status of this module. It's set to 1
127 in gdbsim_open() and 0 in gdbsim_close(). */
128static int gdbsim_is_open = 0;
129
130/* Value of the next pid to allocate for an inferior. As indicated
131 elsewhere, its initial value is somewhat arbitrary; it's critical
132 though that it's not zero or negative. */
133static int next_pid;
134#define INITIAL_PID 42000
135
136/* Argument list to pass to sim_open(). It is allocated in gdbsim_open()
137 and deallocated in gdbsim_close(). The lifetime needs to extend beyond
138 the call to gdbsim_open() due to the fact that other sim instances other
139 than the first will be allocated after the gdbsim_open() call. */
140static char **sim_argv = NULL;
141
142/* OS-level callback functions for write, flush, etc. */
143static host_callback gdb_callback;
144static int callbacks_initialized = 0;
145
146/* Callback for iterate_over_inferiors. It checks to see if the sim
147 descriptor passed via ARG is the same as that for the inferior
148 designated by INF. Return true if so; false otherwise. */
149
150static int
151check_for_duplicate_sim_descriptor (struct inferior *inf, void *arg)
152{
153 struct sim_inferior_data *sim_data;
154 SIM_DESC new_sim_desc = arg;
155
156 sim_data = inferior_data (inf, sim_inferior_data_key);
157
158 return (sim_data != NULL && sim_data->gdbsim_desc == new_sim_desc);
159}
160
161/* Flags indicating whether or not a sim instance is needed. One of these
162 flags should be passed to get_sim_inferior_data(). */
163
164enum {SIM_INSTANCE_NOT_NEEDED = 0, SIM_INSTANCE_NEEDED = 1};
165
166/* Obtain pointer to per-inferior simulator data, allocating it if necessary.
167 Attempt to open the sim if SIM_INSTANCE_NEEDED is true. */
168
169static struct sim_inferior_data *
170get_sim_inferior_data (struct inferior *inf, int sim_instance_needed)
171{
172 SIM_DESC sim_desc = NULL;
173 struct sim_inferior_data *sim_data
174 = inferior_data (inf, sim_inferior_data_key);
175
176 /* Try to allocate a new sim instance, if needed. We do this ahead of
177 a potential allocation of a sim_inferior_data struct in order to
178 avoid needlessly allocating that struct in the event that the sim
179 instance allocation fails. */
74228e77 180 if (sim_instance_needed == SIM_INSTANCE_NEEDED
db04efe6
KB
181 && (sim_data == NULL || sim_data->gdbsim_desc == NULL))
182 {
183 struct inferior *idup;
184 sim_desc = sim_open (SIM_OPEN_DEBUG, &gdb_callback, exec_bfd, sim_argv);
185 if (sim_desc == NULL)
186 error (_("Unable to create simulator instance for inferior %d."),
187 inf->num);
188
189 idup = iterate_over_inferiors (check_for_duplicate_sim_descriptor,
74228e77 190 sim_desc);
db04efe6
KB
191 if (idup != NULL)
192 {
193 /* We don't close the descriptor due to the fact that it's
194 shared with some other inferior. If we were to close it,
195 that might needlessly muck up the other inferior. Of
196 course, it's possible that the damage has already been
197 done... Note that it *will* ultimately be closed during
198 cleanup of the other inferior. */
199 sim_desc = NULL;
200 error (
201 _("Inferior %d and inferior %d would have identical simulator state.\n"
202 "(This simulator does not support the running of more than one inferior.)"),
74228e77
RM
203 inf->num, idup->num);
204 }
db04efe6
KB
205 }
206
207 if (sim_data == NULL)
208 {
41bf6aca 209 sim_data = XCNEW(struct sim_inferior_data);
db04efe6
KB
210 set_inferior_data (inf, sim_inferior_data_key, sim_data);
211
212 /* Allocate a ptid for this inferior. */
213 sim_data->remote_sim_ptid = ptid_build (next_pid, 0, next_pid);
214 next_pid++;
215
216 /* Initialize the other instance variables. */
217 sim_data->program_loaded = 0;
218 sim_data->gdbsim_desc = sim_desc;
a493e3e2 219 sim_data->resume_siggnal = GDB_SIGNAL_0;
db04efe6
KB
220 sim_data->resume_step = 0;
221 }
222 else if (sim_desc)
223 {
224 /* This handles the case where sim_data was allocated prior to
74228e77 225 needing a sim instance. */
db04efe6
KB
226 sim_data->gdbsim_desc = sim_desc;
227 }
c906108c 228
c906108c 229
db04efe6
KB
230 return sim_data;
231}
232
233/* Return pointer to per-inferior simulator data using PTID to find the
234 inferior in question. Return NULL when no inferior is found or
235 when ptid has a zero or negative pid component. */
236
237static struct sim_inferior_data *
238get_sim_inferior_data_by_ptid (ptid_t ptid, int sim_instance_needed)
239{
240 struct inferior *inf;
241 int pid = ptid_get_pid (ptid);
242
243 if (pid <= 0)
244 return NULL;
74228e77 245
db04efe6
KB
246 inf = find_inferior_pid (pid);
247
248 if (inf)
249 return get_sim_inferior_data (inf, sim_instance_needed);
250 else
251 return NULL;
252}
253
254/* Free the per-inferior simulator data. */
255
256static void
257sim_inferior_data_cleanup (struct inferior *inf, void *data)
258{
259 struct sim_inferior_data *sim_data = data;
260
261 if (sim_data != NULL)
262 {
263 if (sim_data->gdbsim_desc)
264 {
265 sim_close (sim_data->gdbsim_desc, 0);
266 sim_data->gdbsim_desc = NULL;
267 }
268 xfree (sim_data);
269 }
270}
9de2bdd7 271
c906108c 272static void
146ec4db 273dump_mem (const gdb_byte *buf, int len)
c906108c 274{
1385f66c 275 fputs_unfiltered ("\t", gdb_stdlog);
3d468296
AB
276
277 if (len == 8 || len == 4)
c906108c 278 {
3d468296 279 uint32_t l[2];
123f5f96 280
3d468296 281 memcpy (l, buf, len);
1385f66c 282 fprintf_unfiltered (gdb_stdlog, "0x%08x", l[0]);
3d468296 283 if (len == 8)
1385f66c 284 fprintf_unfiltered (gdb_stdlog, " 0x%08x", l[1]);
3d468296
AB
285 }
286 else
287 {
288 int i;
123f5f96 289
3d468296 290 for (i = 0; i < len; i++)
1385f66c 291 fprintf_unfiltered (gdb_stdlog, "0x%02x ", buf[i]);
c906108c 292 }
3d468296 293
1385f66c 294 fputs_unfiltered ("\n", gdb_stdlog);
c906108c
SS
295}
296
c906108c
SS
297/* Initialize gdb_callback. */
298
299static void
fba45db2 300init_callbacks (void)
c906108c 301{
c5aa993b 302 if (!callbacks_initialized)
c906108c
SS
303 {
304 gdb_callback = default_callback;
305 gdb_callback.init (&gdb_callback);
306 gdb_callback.write_stdout = gdb_os_write_stdout;
307 gdb_callback.flush_stdout = gdb_os_flush_stdout;
308 gdb_callback.write_stderr = gdb_os_write_stderr;
309 gdb_callback.flush_stderr = gdb_os_flush_stderr;
310 gdb_callback.printf_filtered = gdb_os_printf_filtered;
311 gdb_callback.vprintf_filtered = gdb_os_vprintf_filtered;
312 gdb_callback.evprintf_filtered = gdb_os_evprintf_filtered;
313 gdb_callback.error = gdb_os_error;
314 gdb_callback.poll_quit = gdb_os_poll_quit;
315 gdb_callback.magic = HOST_CALLBACK_MAGIC;
316 callbacks_initialized = 1;
317 }
318}
319
320/* Release callbacks (free resources used by them). */
321
322static void
fba45db2 323end_callbacks (void)
c906108c
SS
324{
325 if (callbacks_initialized)
326 {
327 gdb_callback.shutdown (&gdb_callback);
328 callbacks_initialized = 0;
329 }
330}
331
332/* GDB version of os_write_stdout callback. */
333
c5aa993b 334static int
fba45db2 335gdb_os_write_stdout (host_callback *p, const char *buf, int len)
c906108c
SS
336{
337 int i;
338 char b[2];
339
d9fcf2fb 340 ui_file_write (gdb_stdtarg, buf, len);
c906108c
SS
341 return len;
342}
343
344/* GDB version of os_flush_stdout callback. */
345
346static void
fba45db2 347gdb_os_flush_stdout (host_callback *p)
c906108c 348{
4ce44c66 349 gdb_flush (gdb_stdtarg);
c906108c
SS
350}
351
352/* GDB version of os_write_stderr callback. */
353
c5aa993b 354static int
fba45db2 355gdb_os_write_stderr (host_callback *p, const char *buf, int len)
c906108c
SS
356{
357 int i;
358 char b[2];
359
c5aa993b 360 for (i = 0; i < len; i++)
c906108c
SS
361 {
362 b[0] = buf[i];
363 b[1] = 0;
22e8e3c7 364 fputs_unfiltered (b, gdb_stdtargerr);
c906108c
SS
365 }
366 return len;
367}
368
369/* GDB version of os_flush_stderr callback. */
370
371static void
fba45db2 372gdb_os_flush_stderr (host_callback *p)
c906108c 373{
22e8e3c7 374 gdb_flush (gdb_stdtargerr);
c906108c
SS
375}
376
377/* GDB version of printf_filtered callback. */
378
c906108c 379static void
c5aa993b 380gdb_os_printf_filtered (host_callback * p, const char *format,...)
c906108c
SS
381{
382 va_list args;
c906108c 383
123f5f96 384 va_start (args, format);
c906108c 385 vfprintf_filtered (gdb_stdout, format, args);
c906108c
SS
386 va_end (args);
387}
388
389/* GDB version of error vprintf_filtered. */
390
c906108c 391static void
c5aa993b 392gdb_os_vprintf_filtered (host_callback * p, const char *format, va_list ap)
c906108c
SS
393{
394 vfprintf_filtered (gdb_stdout, format, ap);
395}
396
397/* GDB version of error evprintf_filtered. */
398
c906108c 399static void
c5aa993b 400gdb_os_evprintf_filtered (host_callback * p, const char *format, va_list ap)
c906108c
SS
401{
402 vfprintf_filtered (gdb_stderr, format, ap);
403}
404
405/* GDB version of error callback. */
406
c906108c 407static void
58d4abe1 408gdb_os_error (host_callback * p, const char *format, ...)
c906108c 409{
58d4abe1 410 va_list args;
123f5f96 411
58d4abe1
PA
412 va_start (args, format);
413 verror (format, args);
414 va_end (args);
c906108c
SS
415}
416
8238d0bf 417int
e7faf938 418one2one_register_sim_regno (struct gdbarch *gdbarch, int regnum)
8238d0bf
AC
419{
420 /* Only makes sense to supply raw registers. */
e7faf938 421 gdb_assert (regnum >= 0 && regnum < gdbarch_num_regs (gdbarch));
8238d0bf
AC
422 return regnum;
423}
424
c906108c 425static void
28439f5e
PA
426gdbsim_fetch_register (struct target_ops *ops,
427 struct regcache *regcache, int regno)
c906108c 428{
40a6adc1 429 struct gdbarch *gdbarch = get_regcache_arch (regcache);
db04efe6
KB
430 struct sim_inferior_data *sim_data
431 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
123f5f96 432
c5aa993b 433 if (regno == -1)
c906108c 434 {
40a6adc1 435 for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
28439f5e 436 gdbsim_fetch_register (ops, regcache, regno);
8238d0bf 437 return;
c906108c 438 }
8238d0bf 439
40a6adc1 440 switch (gdbarch_register_sim_regno (gdbarch, regno))
c906108c 441 {
8238d0bf
AC
442 case LEGACY_SIM_REGNO_IGNORE:
443 break;
444 case SIM_REGNO_DOES_NOT_EXIST:
445 {
446 /* For moment treat a `does not exist' register the same way
74228e77 447 as an ``unavailable'' register. */
e362b510 448 gdb_byte buf[MAX_REGISTER_SIZE];
8238d0bf 449 int nr_bytes;
123f5f96 450
d9d9c31f 451 memset (buf, 0, MAX_REGISTER_SIZE);
56be3814 452 regcache_raw_supply (regcache, regno, buf);
8238d0bf
AC
453 break;
454 }
74228e77 455
8238d0bf
AC
456 default:
457 {
458 static int warn_user = 1;
e362b510 459 gdb_byte buf[MAX_REGISTER_SIZE];
8238d0bf 460 int nr_bytes;
123f5f96 461
40a6adc1 462 gdb_assert (regno >= 0 && regno < gdbarch_num_regs (gdbarch));
d9d9c31f 463 memset (buf, 0, MAX_REGISTER_SIZE);
db04efe6 464 nr_bytes = sim_fetch_register (sim_data->gdbsim_desc,
474c1661 465 gdbarch_register_sim_regno
40a6adc1 466 (gdbarch, regno),
474c1661 467 buf,
40a6adc1
MD
468 register_size (gdbarch, regno));
469 if (nr_bytes > 0
470 && nr_bytes != register_size (gdbarch, regno) && warn_user)
8238d0bf
AC
471 {
472 fprintf_unfiltered (gdb_stderr,
0df8b418
MS
473 "Size of register %s (%d/%d) "
474 "incorrect (%d instead of %d))",
40a6adc1 475 gdbarch_register_name (gdbarch, regno),
474c1661
UW
476 regno,
477 gdbarch_register_sim_regno
40a6adc1
MD
478 (gdbarch, regno),
479 nr_bytes, register_size (gdbarch, regno));
8238d0bf
AC
480 warn_user = 0;
481 }
482 /* FIXME: cagney/2002-05-27: Should check `nr_bytes == 0'
278a7cf7 483 indicating that GDB and the SIM have different ideas about
8238d0bf
AC
484 which registers are fetchable. */
485 /* Else if (nr_bytes < 0): an old simulator, that doesn't
486 think to return the register size. Just assume all is ok. */
56be3814 487 regcache_raw_supply (regcache, regno, buf);
ea35711c 488 if (remote_debug)
8238d0bf 489 {
1385f66c
PA
490 fprintf_unfiltered (gdb_stdlog,
491 "gdbsim_fetch_register: %d", regno);
8238d0bf 492 /* FIXME: We could print something more intelligible. */
40a6adc1 493 dump_mem (buf, register_size (gdbarch, regno));
8238d0bf
AC
494 }
495 break;
496 }
c906108c
SS
497 }
498}
499
500
501static void
28439f5e
PA
502gdbsim_store_register (struct target_ops *ops,
503 struct regcache *regcache, int regno)
c906108c 504{
40a6adc1 505 struct gdbarch *gdbarch = get_regcache_arch (regcache);
db04efe6
KB
506 struct sim_inferior_data *sim_data
507 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
508
c5aa993b 509 if (regno == -1)
c906108c 510 {
40a6adc1 511 for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
28439f5e 512 gdbsim_store_register (ops, regcache, regno);
8238d0bf 513 return;
c906108c 514 }
40a6adc1 515 else if (gdbarch_register_sim_regno (gdbarch, regno) >= 0)
c906108c 516 {
5fda2332 517 gdb_byte tmp[MAX_REGISTER_SIZE];
c906108c 518 int nr_bytes;
123f5f96 519
56be3814 520 regcache_cooked_read (regcache, regno, tmp);
db04efe6 521 nr_bytes = sim_store_register (sim_data->gdbsim_desc,
474c1661 522 gdbarch_register_sim_regno
40a6adc1
MD
523 (gdbarch, regno),
524 tmp, register_size (gdbarch, regno));
525 if (nr_bytes > 0 && nr_bytes != register_size (gdbarch, regno))
8e65ff28 526 internal_error (__FILE__, __LINE__,
e2e0b3e5 527 _("Register size different to expected"));
dae477fe 528 if (nr_bytes < 0)
74228e77
RM
529 internal_error (__FILE__, __LINE__,
530 _("Register %d not updated"), regno);
dae477fe 531 if (nr_bytes == 0)
74228e77
RM
532 warning (_("Register %s not updated"),
533 gdbarch_register_name (gdbarch, regno));
dae477fe 534
ea35711c 535 if (remote_debug)
c906108c 536 {
1385f66c 537 fprintf_unfiltered (gdb_stdlog, "gdbsim_store_register: %d", regno);
c906108c 538 /* FIXME: We could print something more intelligible. */
40a6adc1 539 dump_mem (tmp, register_size (gdbarch, regno));
c906108c
SS
540 }
541 }
542}
543
544/* Kill the running program. This may involve closing any open files
545 and releasing other resources acquired by the simulated program. */
546
547static void
7d85a9c0 548gdbsim_kill (struct target_ops *ops)
c906108c 549{
ea35711c 550 if (remote_debug)
1385f66c 551 fprintf_unfiltered (gdb_stdlog, "gdbsim_kill\n");
c906108c
SS
552
553 /* There is no need to `kill' running simulator - the simulator is
52bb452f
DJ
554 not running. Mourning it is enough. */
555 target_mourn_inferior ();
c906108c
SS
556}
557
558/* Load an executable file into the target process. This is expected to
559 not only bring new code into the target process, but also to update
560 GDB's symbol tables to match. */
561
562static void
9cbe5fff 563gdbsim_load (struct target_ops *self, const char *args, int fromtty)
c906108c 564{
d1a41061 565 char **argv;
b2b255bd 566 const char *prog;
db04efe6
KB
567 struct sim_inferior_data *sim_data
568 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
1986bccd 569
d1a41061
PP
570 if (args == NULL)
571 error_no_arg (_("program to load"));
1986bccd 572
d1a41061 573 argv = gdb_buildargv (args);
1986bccd
AS
574 make_cleanup_freeargv (argv);
575
576 prog = tilde_expand (argv[0]);
577
578 if (argv[1] != NULL)
579 error (_("GDB sim does not yet support a load offset."));
580
ea35711c 581 if (remote_debug)
1385f66c 582 fprintf_unfiltered (gdb_stdlog, "gdbsim_load: prog \"%s\"\n", prog);
c906108c 583
c906108c
SS
584 /* FIXME: We will print two messages on error.
585 Need error to either not print anything if passed NULL or need
586 another routine that doesn't take any arguments. */
db04efe6 587 if (sim_load (sim_data->gdbsim_desc, prog, NULL, fromtty) == SIM_RC_FAIL)
8a3fe4f8 588 error (_("unable to load program"));
c906108c
SS
589
590 /* FIXME: If a load command should reset the targets registers then
0df8b418 591 a call to sim_create_inferior() should go here. */
c906108c 592
db04efe6 593 sim_data->program_loaded = 1;
c906108c
SS
594}
595
596
39f77062 597/* Start an inferior process and set inferior_ptid to its pid.
c906108c
SS
598 EXEC_FILE is the file to run.
599 ARGS is a string containing the arguments to the program.
600 ENV is the environment vector to pass. Errors reported with error().
601 On VxWorks and various standalone systems, we ignore exec_file. */
602/* This is called not only when we first attach, but also when the
603 user types "run" after having attached. */
604
605static void
3c8b2eda
TJB
606gdbsim_create_inferior (struct target_ops *target, char *exec_file, char *args,
607 char **env, int from_tty)
c906108c 608{
db04efe6
KB
609 struct sim_inferior_data *sim_data
610 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
c906108c 611 int len;
c5aa993b 612 char *arg_buf, **argv;
c906108c
SS
613
614 if (exec_file == 0 || exec_bfd == 0)
8a3fe4f8 615 warning (_("No executable file specified."));
db04efe6 616 if (!sim_data->program_loaded)
8a3fe4f8 617 warning (_("No program loaded."));
c906108c 618
ea35711c 619 if (remote_debug)
1385f66c
PA
620 fprintf_unfiltered (gdb_stdlog,
621 "gdbsim_create_inferior: exec_file \"%s\", args \"%s\"\n",
622 (exec_file ? exec_file : "(NULL)"),
623 args);
c906108c 624
db04efe6 625 if (ptid_equal (inferior_ptid, sim_data->remote_sim_ptid))
7d85a9c0 626 gdbsim_kill (target);
c906108c
SS
627 remove_breakpoints ();
628 init_wait_for_inferior ();
629
630 if (exec_file != NULL)
631 {
c5aa993b 632 len = strlen (exec_file) + 1 + strlen (args) + 1 + /*slop */ 10;
c906108c
SS
633 arg_buf = (char *) alloca (len);
634 arg_buf[0] = '\0';
635 strcat (arg_buf, exec_file);
636 strcat (arg_buf, " ");
637 strcat (arg_buf, args);
d1a41061 638 argv = gdb_buildargv (arg_buf);
7a292a7a 639 make_cleanup_freeargv (argv);
c906108c
SS
640 }
641 else
642 argv = NULL;
ddd60447 643
2a7c8fd5
AB
644 if (!have_inferiors ())
645 init_thread_list ();
646
ddd60447
MF
647 if (sim_create_inferior (sim_data->gdbsim_desc, exec_bfd, argv, env)
648 != SIM_RC_OK)
649 error (_("Unable to create sim inferior."));
c906108c 650
db04efe6 651 inferior_ptid = sim_data->remote_sim_ptid;
20176d8f 652 inferior_appeared (current_inferior (), ptid_get_pid (inferior_ptid));
9de2bdd7
PA
653 add_thread_silent (inferior_ptid);
654
0df8b418
MS
655 insert_breakpoints (); /* Needed to get correct instruction
656 in cache. */
c906108c 657
88056fbb 658 clear_proceed_status (0);
c906108c
SS
659}
660
661/* The open routine takes the rest of the parameters from the command,
662 and (if successful) pushes a new target onto the stack.
663 Targets should supply this routine, if only to provide an error message. */
0df8b418 664/* Called when selecting the simulator. E.g. (gdb) target sim name. */
c906108c
SS
665
666static void
014f9477 667gdbsim_open (const char *args, int from_tty)
c906108c
SS
668{
669 int len;
670 char *arg_buf;
db04efe6
KB
671 struct sim_inferior_data *sim_data;
672 SIM_DESC gdbsim_desc;
c906108c 673
ea35711c 674 if (remote_debug)
1385f66c
PA
675 fprintf_unfiltered (gdb_stdlog,
676 "gdbsim_open: args \"%s\"\n", args ? args : "(null)");
c906108c 677
db04efe6
KB
678 /* Ensure that the sim target is not on the target stack. This is
679 necessary, because if it is on the target stack, the call to
680 push_target below will invoke sim_close(), thus freeing various
681 state (including a sim instance) that we allocate prior to
682 invoking push_target(). We want to delay the push_target()
683 operation until after we complete those operations which could
684 error out. */
685 if (gdbsim_is_open)
c906108c
SS
686 unpush_target (&gdbsim_ops);
687
c5aa993b 688 len = (7 + 1 /* gdbsim */
c906108c
SS
689 + strlen (" -E little")
690 + strlen (" --architecture=xxxxxxxxxx")
f4b8c29b 691 + strlen (" --sysroot=") + strlen (gdb_sysroot) +
c906108c 692 + (args ? strlen (args) : 0)
c5aa993b 693 + 50) /* slack */ ;
c906108c 694 arg_buf = (char *) alloca (len);
c5aa993b 695 strcpy (arg_buf, "gdbsim"); /* 7 */
b6d373df 696 /* Specify the byte order for the target when it is explicitly
0df8b418 697 specified by the user (not auto detected). */
b6d373df 698 switch (selected_byte_order ())
c906108c 699 {
a8cf2722
AC
700 case BFD_ENDIAN_BIG:
701 strcat (arg_buf, " -E big");
702 break;
703 case BFD_ENDIAN_LITTLE:
704 strcat (arg_buf, " -E little");
705 break;
706 case BFD_ENDIAN_UNKNOWN:
707 break;
c906108c
SS
708 }
709 /* Specify the architecture of the target when it has been
710 explicitly specified */
a8cf2722 711 if (selected_architecture_name () != NULL)
c906108c
SS
712 {
713 strcat (arg_buf, " --architecture=");
a8cf2722 714 strcat (arg_buf, selected_architecture_name ());
c906108c 715 }
f4b8c29b
MF
716 /* Pass along gdb's concept of the sysroot. */
717 strcat (arg_buf, " --sysroot=");
718 strcat (arg_buf, gdb_sysroot);
c906108c
SS
719 /* finally, any explicit args */
720 if (args)
721 {
c5aa993b 722 strcat (arg_buf, " "); /* 1 */
c906108c
SS
723 strcat (arg_buf, args);
724 }
db04efe6 725 sim_argv = gdb_buildargv (arg_buf);
c906108c
SS
726
727 init_callbacks ();
db04efe6 728 gdbsim_desc = sim_open (SIM_OPEN_DEBUG, &gdb_callback, exec_bfd, sim_argv);
c906108c
SS
729
730 if (gdbsim_desc == 0)
db04efe6
KB
731 {
732 freeargv (sim_argv);
733 sim_argv = NULL;
734 error (_("unable to create simulator instance"));
735 }
736
737 /* Reset the pid numberings for this batch of sim instances. */
738 next_pid = INITIAL_PID;
739
740 /* Allocate the inferior data, but do not allocate a sim instance
741 since we've already just done that. */
0df8b418
MS
742 sim_data = get_sim_inferior_data (current_inferior (),
743 SIM_INSTANCE_NOT_NEEDED);
db04efe6
KB
744
745 sim_data->gdbsim_desc = gdbsim_desc;
c906108c
SS
746
747 push_target (&gdbsim_ops);
c906108c 748 printf_filtered ("Connected to the simulator.\n");
52bb452f
DJ
749
750 /* There's nothing running after "target sim" or "load"; not until
751 "run". */
752 inferior_ptid = null_ptid;
db04efe6
KB
753
754 gdbsim_is_open = 1;
755}
756
757/* Callback for iterate_over_inferiors. Called (indirectly) by
758 gdbsim_close(). */
759
760static int
761gdbsim_close_inferior (struct inferior *inf, void *arg)
762{
763 struct sim_inferior_data *sim_data = inferior_data (inf,
74228e77 764 sim_inferior_data_key);
db04efe6
KB
765 if (sim_data != NULL)
766 {
767 ptid_t ptid = sim_data->remote_sim_ptid;
768
769 sim_inferior_data_cleanup (inf, sim_data);
770 set_inferior_data (inf, sim_inferior_data_key, NULL);
771
772 /* Having a ptid allocated and stored in remote_sim_ptid does
0df8b418 773 not mean that a corresponding inferior was ever created.
db04efe6
KB
774 Thus we need to verify the existence of an inferior using the
775 pid in question before setting inferior_ptid via
776 switch_to_thread() or mourning the inferior. */
c9657e70 777 if (find_inferior_ptid (ptid) != NULL)
db04efe6
KB
778 {
779 switch_to_thread (ptid);
780 generic_mourn_inferior ();
781 }
782 }
783
784 return 0;
c906108c
SS
785}
786
0df8b418 787/* Close out all files and local state before this target loses control. */
c906108c
SS
788
789static void
de90e03d 790gdbsim_close (struct target_ops *self)
c906108c 791{
db04efe6
KB
792 struct sim_inferior_data *sim_data
793 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
794
ea35711c 795 if (remote_debug)
1385f66c 796 fprintf_unfiltered (gdb_stdlog, "gdbsim_close\n");
c906108c 797
db04efe6 798 iterate_over_inferiors (gdbsim_close_inferior, NULL);
c906108c 799
db04efe6 800 if (sim_argv != NULL)
c906108c 801 {
db04efe6
KB
802 freeargv (sim_argv);
803 sim_argv = NULL;
c906108c
SS
804 }
805
806 end_callbacks ();
db04efe6
KB
807
808 gdbsim_is_open = 0;
c906108c
SS
809}
810
811/* Takes a program previously attached to and detaches it.
812 The program may resume execution (some targets do, some don't) and will
813 no longer stop on signals, etc. We better not have left any breakpoints
814 in the program or it'll die when it hits one. ARGS is arguments
815 typed by the user (e.g. a signal to send the process). FROM_TTY
816 says whether to be verbose or not. */
817/* Terminate the open connection to the remote debugger.
818 Use this when you want to detach and do something else with your gdb. */
819
820static void
52554a0e 821gdbsim_detach (struct target_ops *ops, const char *args, int from_tty)
c906108c 822{
ea35711c 823 if (remote_debug)
1385f66c 824 fprintf_unfiltered (gdb_stdlog, "gdbsim_detach: args \"%s\"\n", args);
c906108c 825
7fdc1521 826 unpush_target (ops); /* calls gdbsim_close to do the real work */
c906108c
SS
827 if (from_tty)
828 printf_filtered ("Ending simulator %s debugging\n", target_shortname);
829}
c5aa993b 830
c906108c
SS
831/* Resume execution of the target process. STEP says whether to single-step
832 or to run free; SIGGNAL is the signal value (e.g. SIGINT) to be given
833 to the target, or zero for no signal. */
834
db04efe6
KB
835struct resume_data
836{
2ea28649 837 enum gdb_signal siggnal;
db04efe6
KB
838 int step;
839};
840
841static int
842gdbsim_resume_inferior (struct inferior *inf, void *arg)
843{
844 struct sim_inferior_data *sim_data
845 = get_sim_inferior_data (inf, SIM_INSTANCE_NOT_NEEDED);
846 struct resume_data *rd = arg;
847
848 if (sim_data)
849 {
850 sim_data->resume_siggnal = rd->siggnal;
851 sim_data->resume_step = rd->step;
852
853 if (remote_debug)
1385f66c
PA
854 fprintf_unfiltered (gdb_stdlog,
855 _("gdbsim_resume: pid %d, step %d, signal %d\n"),
856 inf->pid, rd->step, rd->siggnal);
db04efe6
KB
857 }
858
859 /* When called from iterate_over_inferiors, a zero return causes the
860 iteration process to proceed until there are no more inferiors to
861 consider. */
862 return 0;
863}
c906108c
SS
864
865static void
2fb89e62 866gdbsim_resume (struct target_ops *ops,
2ea28649 867 ptid_t ptid, int step, enum gdb_signal siggnal)
c906108c 868{
db04efe6
KB
869 struct resume_data rd;
870 struct sim_inferior_data *sim_data
871 = get_sim_inferior_data_by_ptid (ptid, SIM_INSTANCE_NOT_NEEDED);
872
873 rd.siggnal = siggnal;
874 rd.step = step;
875
0df8b418 876 /* We don't access any sim_data members within this function.
db04efe6
KB
877 What's of interest is whether or not the call to
878 get_sim_inferior_data_by_ptid(), above, is able to obtain a
879 non-NULL pointer. If it managed to obtain a non-NULL pointer, we
880 know we have a single inferior to consider. If it's NULL, we
881 either have multiple inferiors to resume or an error condition. */
882
883 if (sim_data)
c9657e70 884 gdbsim_resume_inferior (find_inferior_ptid (ptid), &rd);
db04efe6
KB
885 else if (ptid_equal (ptid, minus_one_ptid))
886 iterate_over_inferiors (gdbsim_resume_inferior, &rd);
887 else
8a3fe4f8 888 error (_("The program is not being run."));
c906108c
SS
889}
890
891/* Notify the simulator of an asynchronous request to stop.
c5aa993b 892
c906108c
SS
893 The simulator shall ensure that the stop request is eventually
894 delivered to the simulator. If the call is made while the
895 simulator is not running then the stop request is processed when
896 the simulator is next resumed.
897
db04efe6
KB
898 For simulators that do not support this operation, just abort. */
899
900static int
901gdbsim_stop_inferior (struct inferior *inf, void *arg)
902{
903 struct sim_inferior_data *sim_data
904 = get_sim_inferior_data (inf, SIM_INSTANCE_NEEDED);
905
906 if (sim_data)
907 {
908 if (!sim_stop (sim_data->gdbsim_desc))
909 {
910 quit ();
911 }
912 }
913
914 /* When called from iterate_over_inferiors, a zero return causes the
915 iteration process to proceed until there are no more inferiors to
916 consider. */
917 return 0;
918}
c906108c
SS
919
920static void
1eab8a48 921gdbsim_stop (struct target_ops *self, ptid_t ptid)
c906108c 922{
db04efe6
KB
923 struct sim_inferior_data *sim_data;
924
925 if (ptid_equal (ptid, minus_one_ptid))
c906108c 926 {
db04efe6
KB
927 iterate_over_inferiors (gdbsim_stop_inferior, NULL);
928 }
929 else
930 {
c9657e70 931 struct inferior *inf = find_inferior_ptid (ptid);
db04efe6
KB
932
933 if (inf == NULL)
0df8b418
MS
934 error (_("Can't stop pid %d. No inferior found."),
935 ptid_get_pid (ptid));
db04efe6
KB
936
937 gdbsim_stop_inferior (inf, NULL);
c906108c
SS
938 }
939}
940
941/* GDB version of os_poll_quit callback.
8a0ce09a 942 Taken from gdb/util.c - should be in a library. */
c906108c
SS
943
944static int
fba45db2 945gdb_os_poll_quit (host_callback *p)
c906108c 946{
98bbd631
AC
947 if (deprecated_ui_loop_hook != NULL)
948 deprecated_ui_loop_hook (0);
7a292a7a 949
522002f9 950 if (check_quit_flag ()) /* gdb's idea of quit */
c906108c 951 {
522002f9 952 clear_quit_flag (); /* we've stolen it */
c906108c
SS
953 return 1;
954 }
c906108c
SS
955 return 0;
956}
957
958/* Wait for inferior process to do something. Return pid of child,
959 or -1 in case of error; store status through argument pointer STATUS,
0df8b418 960 just as `wait' would. */
c906108c
SS
961
962static void
fba45db2 963gdbsim_cntrl_c (int signo)
c906108c 964{
1eab8a48 965 gdbsim_stop (NULL, minus_one_ptid);
c906108c
SS
966}
967
39f77062 968static ptid_t
117de6a9 969gdbsim_wait (struct target_ops *ops,
47608cb1 970 ptid_t ptid, struct target_waitstatus *status, int options)
c906108c 971{
db04efe6 972 struct sim_inferior_data *sim_data;
c906108c
SS
973 static RETSIGTYPE (*prev_sigint) ();
974 int sigrc = 0;
975 enum sim_stop reason = sim_running;
976
db04efe6
KB
977 /* This target isn't able to (yet) resume more than one inferior at a time.
978 When ptid is minus_one_ptid, just use the current inferior. If we're
979 given an explicit pid, we'll try to find it and use that instead. */
980 if (ptid_equal (ptid, minus_one_ptid))
0df8b418
MS
981 sim_data = get_sim_inferior_data (current_inferior (),
982 SIM_INSTANCE_NEEDED);
db04efe6
KB
983 else
984 {
985 sim_data = get_sim_inferior_data_by_ptid (ptid, SIM_INSTANCE_NEEDED);
986 if (sim_data == NULL)
987 error (_("Unable to wait for pid %d. Inferior not found."),
988 ptid_get_pid (ptid));
989 inferior_ptid = ptid;
990 }
991
ea35711c 992 if (remote_debug)
1385f66c 993 fprintf_unfiltered (gdb_stdlog, "gdbsim_wait\n");
c906108c
SS
994
995#if defined (HAVE_SIGACTION) && defined (SA_RESTART)
996 {
997 struct sigaction sa, osa;
998 sa.sa_handler = gdbsim_cntrl_c;
999 sigemptyset (&sa.sa_mask);
1000 sa.sa_flags = 0;
1001 sigaction (SIGINT, &sa, &osa);
1002 prev_sigint = osa.sa_handler;
1003 }
1004#else
1005 prev_sigint = signal (SIGINT, gdbsim_cntrl_c);
1006#endif
db04efe6 1007 sim_resume (sim_data->gdbsim_desc, sim_data->resume_step,
74228e77 1008 sim_data->resume_siggnal);
db04efe6 1009
c906108c 1010 signal (SIGINT, prev_sigint);
db04efe6 1011 sim_data->resume_step = 0;
c906108c 1012
db04efe6 1013 sim_stop_reason (sim_data->gdbsim_desc, &reason, &sigrc);
c906108c
SS
1014
1015 switch (reason)
1016 {
1017 case sim_exited:
1018 status->kind = TARGET_WAITKIND_EXITED;
1019 status->value.integer = sigrc;
1020 break;
1021 case sim_stopped:
1022 switch (sigrc)
1023 {
a493e3e2 1024 case GDB_SIGNAL_ABRT:
c906108c
SS
1025 quit ();
1026 break;
a493e3e2
PA
1027 case GDB_SIGNAL_INT:
1028 case GDB_SIGNAL_TRAP:
c906108c
SS
1029 default:
1030 status->kind = TARGET_WAITKIND_STOPPED;
aba6488e 1031 status->value.sig = sigrc;
c906108c
SS
1032 break;
1033 }
1034 break;
1035 case sim_signalled:
1036 status->kind = TARGET_WAITKIND_SIGNALLED;
aba6488e 1037 status->value.sig = sigrc;
c906108c
SS
1038 break;
1039 case sim_running:
1040 case sim_polling:
0df8b418 1041 /* FIXME: Is this correct? */
c906108c
SS
1042 break;
1043 }
1044
39f77062 1045 return inferior_ptid;
c906108c
SS
1046}
1047
1048/* Get ready to modify the registers array. On machines which store
1049 individual registers, this doesn't need to do anything. On machines
1050 which store all the registers in one fell swoop, this makes sure
1051 that registers contains all the registers from the program being
1052 debugged. */
1053
1054static void
f32dbf8c 1055gdbsim_prepare_to_store (struct target_ops *self, struct regcache *regcache)
c906108c 1056{
0df8b418 1057 /* Do nothing, since we can store individual regs. */
c906108c
SS
1058}
1059
146ec4db
PA
1060/* Helper for gdbsim_xfer_partial that handles memory transfers.
1061 Arguments are like target_xfer_partial. */
d93bce06 1062
9b409511 1063static enum target_xfer_status
146ec4db
PA
1064gdbsim_xfer_memory (struct target_ops *target,
1065 gdb_byte *readbuf, const gdb_byte *writebuf,
9b409511 1066 ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
c906108c 1067{
db04efe6
KB
1068 struct sim_inferior_data *sim_data
1069 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
b55e14c7 1070 int l;
db04efe6 1071
0c012db1
KB
1072 /* If this target doesn't have memory yet, return 0 causing the
1073 request to be passed to a lower target, hopefully an exec
1074 file. */
1075 if (!target->to_has_memory (target))
9b409511 1076 return TARGET_XFER_EOF;
52bb452f 1077
db04efe6 1078 if (!sim_data->program_loaded)
8a3fe4f8 1079 error (_("No program loaded."));
c906108c 1080
db04efe6
KB
1081 /* Note that we obtained the sim_data pointer above using
1082 SIM_INSTANCE_NOT_NEEDED. We do this so that we don't needlessly
1083 allocate a sim instance prior to loading a program. If we
1084 get to this point in the code though, gdbsim_desc should be
1085 non-NULL. (Note that a sim instance is needed in order to load
1086 the program...) */
1087 gdb_assert (sim_data->gdbsim_desc != NULL);
1088
ea35711c 1089 if (remote_debug)
fcde0081 1090 fprintf_unfiltered (gdb_stdlog,
146ec4db
PA
1091 "gdbsim_xfer_memory: readbuf %s, writebuf %s, "
1092 "memaddr %s, len %s\n",
1093 host_address_to_string (readbuf),
1094 host_address_to_string (writebuf),
fcde0081 1095 paddress (target_gdbarch (), memaddr),
b55e14c7 1096 pulongest (len));
c906108c 1097
146ec4db 1098 if (writebuf)
c906108c 1099 {
fcde0081 1100 if (remote_debug && len > 0)
146ec4db 1101 dump_mem (writebuf, len);
b55e14c7 1102 l = sim_write (sim_data->gdbsim_desc, memaddr, writebuf, len);
c906108c 1103 }
c5aa993b 1104 else
c906108c 1105 {
b55e14c7 1106 l = sim_read (sim_data->gdbsim_desc, memaddr, readbuf, len);
ea35711c 1107 if (remote_debug && len > 0)
146ec4db 1108 dump_mem (readbuf, len);
c5aa993b 1109 }
9b409511
YQ
1110 if (l > 0)
1111 {
1112 *xfered_len = (ULONGEST) l;
1113 return TARGET_XFER_OK;
1114 }
1115 else if (l == 0)
1116 return TARGET_XFER_EOF;
1117 else
1118 return TARGET_XFER_E_IO;
c906108c
SS
1119}
1120
146ec4db
PA
1121/* Target to_xfer_partial implementation. */
1122
9b409511 1123static enum target_xfer_status
146ec4db
PA
1124gdbsim_xfer_partial (struct target_ops *ops, enum target_object object,
1125 const char *annex, gdb_byte *readbuf,
9b409511
YQ
1126 const gdb_byte *writebuf, ULONGEST offset, ULONGEST len,
1127 ULONGEST *xfered_len)
146ec4db
PA
1128{
1129 switch (object)
1130 {
1131 case TARGET_OBJECT_MEMORY:
9b409511
YQ
1132 return gdbsim_xfer_memory (ops, readbuf, writebuf, offset, len,
1133 xfered_len);
146ec4db
PA
1134
1135 default:
2ed4b548 1136 return TARGET_XFER_E_IO;
146ec4db
PA
1137 }
1138}
1139
c906108c 1140static void
fba45db2 1141gdbsim_files_info (struct target_ops *target)
c906108c 1142{
db04efe6
KB
1143 struct sim_inferior_data *sim_data
1144 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
0d18d720 1145 const char *file = "nothing";
c906108c
SS
1146
1147 if (exec_bfd)
1148 file = bfd_get_filename (exec_bfd);
1149
ea35711c 1150 if (remote_debug)
1385f66c 1151 fprintf_unfiltered (gdb_stdlog, "gdbsim_files_info: file \"%s\"\n", file);
c906108c
SS
1152
1153 if (exec_bfd)
1154 {
1385f66c
PA
1155 fprintf_unfiltered (gdb_stdlog, "\tAttached to %s running program %s\n",
1156 target_shortname, file);
db04efe6 1157 sim_info (sim_data->gdbsim_desc, 0);
c906108c
SS
1158 }
1159}
1160
1161/* Clear the simulator's notion of what the break points are. */
1162
1163static void
3c8b2eda 1164gdbsim_mourn_inferior (struct target_ops *target)
c5aa993b 1165{
db04efe6
KB
1166 struct sim_inferior_data *sim_data
1167 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
1168
ea35711c 1169 if (remote_debug)
1385f66c 1170 fprintf_unfiltered (gdb_stdlog, "gdbsim_mourn_inferior:\n");
c906108c
SS
1171
1172 remove_breakpoints ();
1173 generic_mourn_inferior ();
db04efe6 1174 delete_thread_silent (sim_data->remote_sim_ptid);
c906108c
SS
1175}
1176
c906108c
SS
1177/* Pass the command argument through to the simulator verbatim. The
1178 simulator must do any command interpretation work. */
1179
1180void
fba45db2 1181simulator_command (char *args, int from_tty)
c906108c 1182{
db04efe6
KB
1183 struct sim_inferior_data *sim_data;
1184
1185 /* We use inferior_data() instead of get_sim_inferior_data() here in
1186 order to avoid attaching a sim_inferior_data struct to an
1187 inferior unnecessarily. The reason we take such care here is due
1188 to the fact that this function, simulator_command(), may be called
1189 even when the sim target is not active. If we were to use
1190 get_sim_inferior_data() here, it is possible that this call would
1191 be made either prior to gdbsim_open() or after gdbsim_close(),
1192 thus allocating memory that would not be garbage collected until
1193 the ultimate destruction of the associated inferior. */
1194
1195 sim_data = inferior_data (current_inferior (), sim_inferior_data_key);
1196 if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
c906108c
SS
1197 {
1198
1199 /* PREVIOUSLY: The user may give a command before the simulator
74228e77
RM
1200 is opened. [...] (??? assuming of course one wishes to
1201 continue to allow commands to be sent to unopened simulators,
1202 which isn't entirely unreasonable). */
c906108c
SS
1203
1204 /* The simulator is a builtin abstraction of a remote target.
74228e77
RM
1205 Consistent with that model, access to the simulator, via sim
1206 commands, is restricted to the period when the channel to the
1207 simulator is open. */
c906108c 1208
8a3fe4f8 1209 error (_("Not connected to the simulator target"));
c906108c
SS
1210 }
1211
db04efe6 1212 sim_do_command (sim_data->gdbsim_desc, args);
c906108c
SS
1213
1214 /* Invalidate the register cache, in case the simulator command does
0df8b418 1215 something funny. */
c5aa993b 1216 registers_changed ();
c906108c
SS
1217}
1218
34370865 1219static VEC (char_ptr) *
3cb2ab1a
SE
1220sim_command_completer (struct cmd_list_element *ignore, const char *text,
1221 const char *word)
56a9aa1d
MF
1222{
1223 struct sim_inferior_data *sim_data;
34370865
JB
1224 char **tmp;
1225 int i;
09d5912c 1226 VEC (char_ptr) *result = NULL;
56a9aa1d
MF
1227
1228 sim_data = inferior_data (current_inferior (), sim_inferior_data_key);
1229 if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
1230 return NULL;
1231
34370865
JB
1232 tmp = sim_complete_command (sim_data->gdbsim_desc, text, word);
1233 if (tmp == NULL)
1234 return NULL;
1235
1236 /* Transform the array into a VEC, and then free the array. */
1237 for (i = 0; tmp[i] != NULL; i++)
1238 VEC_safe_push (char_ptr, result, tmp[i]);
1239 xfree (tmp);
1240
1241 return result;
56a9aa1d
MF
1242}
1243
9de2bdd7
PA
1244/* Check to see if a thread is still alive. */
1245
1246static int
28439f5e 1247gdbsim_thread_alive (struct target_ops *ops, ptid_t ptid)
9de2bdd7 1248{
db04efe6
KB
1249 struct sim_inferior_data *sim_data
1250 = get_sim_inferior_data_by_ptid (ptid, SIM_INSTANCE_NOT_NEEDED);
1251
1252 if (sim_data == NULL)
1253 return 0;
1254
1255 if (ptid_equal (ptid, sim_data->remote_sim_ptid))
9de2bdd7
PA
1256 /* The simulators' task is always alive. */
1257 return 1;
1258
1259 return 0;
1260}
1261
1262/* Convert a thread ID to a string. Returns the string in a static
1263 buffer. */
1264
1265static char *
117de6a9 1266gdbsim_pid_to_str (struct target_ops *ops, ptid_t ptid)
9de2bdd7 1267{
9de2bdd7
PA
1268 return normal_pid_to_str (ptid);
1269}
1270
0c012db1
KB
1271/* Simulator memory may be accessed after the program has been loaded. */
1272
b261e0c5 1273static int
0c012db1
KB
1274gdbsim_has_all_memory (struct target_ops *ops)
1275{
1276 struct sim_inferior_data *sim_data
1277 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
1278
1279 if (!sim_data->program_loaded)
1280 return 0;
1281
1282 return 1;
1283}
1284
b261e0c5 1285static int
0c012db1
KB
1286gdbsim_has_memory (struct target_ops *ops)
1287{
1288 struct sim_inferior_data *sim_data
1289 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
1290
1291 if (!sim_data->program_loaded)
1292 return 0;
1293
1294 return 1;
1295}
1296
0df8b418 1297/* Define the target subroutine names. */
c906108c 1298
c5aa993b
JM
1299struct target_ops gdbsim_ops;
1300
1301static void
1302init_gdbsim_ops (void)
1303{
1304 gdbsim_ops.to_shortname = "sim";
1305 gdbsim_ops.to_longname = "simulator";
1306 gdbsim_ops.to_doc = "Use the compiled-in simulator.";
1307 gdbsim_ops.to_open = gdbsim_open;
1308 gdbsim_ops.to_close = gdbsim_close;
c5aa993b 1309 gdbsim_ops.to_detach = gdbsim_detach;
c5aa993b
JM
1310 gdbsim_ops.to_resume = gdbsim_resume;
1311 gdbsim_ops.to_wait = gdbsim_wait;
c5aa993b
JM
1312 gdbsim_ops.to_fetch_registers = gdbsim_fetch_register;
1313 gdbsim_ops.to_store_registers = gdbsim_store_register;
1314 gdbsim_ops.to_prepare_to_store = gdbsim_prepare_to_store;
146ec4db 1315 gdbsim_ops.to_xfer_partial = gdbsim_xfer_partial;
c5aa993b 1316 gdbsim_ops.to_files_info = gdbsim_files_info;
8181d85f
DJ
1317 gdbsim_ops.to_insert_breakpoint = memory_insert_breakpoint;
1318 gdbsim_ops.to_remove_breakpoint = memory_remove_breakpoint;
c5aa993b
JM
1319 gdbsim_ops.to_kill = gdbsim_kill;
1320 gdbsim_ops.to_load = gdbsim_load;
c5aa993b 1321 gdbsim_ops.to_create_inferior = gdbsim_create_inferior;
c5aa993b 1322 gdbsim_ops.to_mourn_inferior = gdbsim_mourn_inferior;
c5aa993b 1323 gdbsim_ops.to_stop = gdbsim_stop;
9de2bdd7
PA
1324 gdbsim_ops.to_thread_alive = gdbsim_thread_alive;
1325 gdbsim_ops.to_pid_to_str = gdbsim_pid_to_str;
c5aa993b 1326 gdbsim_ops.to_stratum = process_stratum;
0c012db1
KB
1327 gdbsim_ops.to_has_all_memory = gdbsim_has_all_memory;
1328 gdbsim_ops.to_has_memory = gdbsim_has_memory;
c35b1492
PA
1329 gdbsim_ops.to_has_stack = default_child_has_stack;
1330 gdbsim_ops.to_has_registers = default_child_has_registers;
1331 gdbsim_ops.to_has_execution = default_child_has_execution;
c5aa993b 1332 gdbsim_ops.to_magic = OPS_MAGIC;
c906108c
SS
1333}
1334
1335void
fba45db2 1336_initialize_remote_sim (void)
c906108c 1337{
56a9aa1d
MF
1338 struct cmd_list_element *c;
1339
c5aa993b 1340 init_gdbsim_ops ();
c906108c
SS
1341 add_target (&gdbsim_ops);
1342
56a9aa1d
MF
1343 c = add_com ("sim", class_obscure, simulator_command,
1344 _("Send a command to the simulator."));
1345 set_cmd_completer (c, sim_command_completer);
9de2bdd7 1346
db04efe6 1347 sim_inferior_data_key
c5d9b215 1348 = register_inferior_data_with_cleanup (NULL, sim_inferior_data_cleanup);
c906108c 1349}
This page took 2.043962 seconds and 4 git commands to generate.