Remove args from target detach
[deliverable/binutils-gdb.git] / gdb / remote-sim.c
CommitLineData
c906108c 1/* Generic remote debugging interface for simulators.
0a65a603 2
e2882c85 3 Copyright (C) 1993-2018 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"
23bf70af 24#include "gdb_bfd.h"
c906108c 25#include "inferior.h"
45741a9c 26#include "infrun.h"
c906108c 27#include "value.h"
c906108c
SS
28#include <ctype.h>
29#include <fcntl.h>
30#include <signal.h>
31#include <setjmp.h>
c906108c
SS
32#include "terminal.h"
33#include "target.h"
34#include "gdbcore.h"
3c25f8c7
AC
35#include "gdb/callback.h"
36#include "gdb/remote-sim.h"
c906108c 37#include "command.h"
4e052eda 38#include "regcache.h"
8238d0bf 39#include "sim-regno.h"
a8cf2722 40#include "arch-utils.h"
1986bccd 41#include "readline/readline.h"
9de2bdd7 42#include "gdbthread.h"
a4d1e79a 43#include "common/byte-vector.h"
c906108c
SS
44
45/* Prototypes */
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
6bd6f3b6 80static void gdbsim_detach (struct target_ops *ops, int from_tty);
c906108c 81
f32dbf8c
MM
82static void gdbsim_prepare_to_store (struct target_ops *self,
83 struct regcache *regcache);
c906108c 84
a14ed312 85static void gdbsim_files_info (struct target_ops *target);
c906108c 86
3c8b2eda 87static void gdbsim_mourn_inferior (struct target_ops *target);
c906108c 88
bfedc46a 89static void gdbsim_interrupt (struct target_ops *self, ptid_t ptid);
c906108c 90
a14ed312 91void simulator_command (char *args, int from_tty);
c906108c
SS
92
93/* Naming convention:
94
95 sim_* are the interface to the simulator (see remote-sim.h).
96 gdbsim_* are stuff which is internal to gdb. */
97
98/* Forward data declarations */
99extern struct target_ops gdbsim_ops;
100
db04efe6
KB
101static const struct inferior_data *sim_inferior_data_key;
102
103/* Simulator-specific, per-inferior state. */
104struct sim_inferior_data {
105 /* Flag which indicates whether or not the program has been loaded. */
106 int program_loaded;
107
108 /* Simulator descriptor for this inferior. */
109 SIM_DESC gdbsim_desc;
110
111 /* This is the ptid we use for this particular simulator instance. Its
112 value is somewhat arbitrary, as the simulator target don't have a
113 notion of tasks or threads, but we need something non-null to place
114 in inferior_ptid. For simulators which permit multiple instances,
115 we also need a unique identifier to use for each inferior. */
116 ptid_t remote_sim_ptid;
117
118 /* Signal with which to resume. */
2ea28649 119 enum gdb_signal resume_siggnal;
db04efe6
KB
120
121 /* Flag which indicates whether resume should step or not. */
122 int resume_step;
123};
124
125/* Flag indicating the "open" status of this module. It's set to 1
126 in gdbsim_open() and 0 in gdbsim_close(). */
127static int gdbsim_is_open = 0;
128
129/* Value of the next pid to allocate for an inferior. As indicated
130 elsewhere, its initial value is somewhat arbitrary; it's critical
131 though that it's not zero or negative. */
132static int next_pid;
133#define INITIAL_PID 42000
134
135/* Argument list to pass to sim_open(). It is allocated in gdbsim_open()
136 and deallocated in gdbsim_close(). The lifetime needs to extend beyond
137 the call to gdbsim_open() due to the fact that other sim instances other
138 than the first will be allocated after the gdbsim_open() call. */
139static char **sim_argv = NULL;
140
141/* OS-level callback functions for write, flush, etc. */
142static host_callback gdb_callback;
143static int callbacks_initialized = 0;
144
145/* Callback for iterate_over_inferiors. It checks to see if the sim
146 descriptor passed via ARG is the same as that for the inferior
147 designated by INF. Return true if so; false otherwise. */
148
149static int
150check_for_duplicate_sim_descriptor (struct inferior *inf, void *arg)
151{
152 struct sim_inferior_data *sim_data;
653090d3 153 SIM_DESC new_sim_desc = (SIM_DESC) arg;
db04efe6 154
653090d3
SM
155 sim_data = ((struct sim_inferior_data *)
156 inferior_data (inf, sim_inferior_data_key));
db04efe6
KB
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
653090d3 174 = (struct sim_inferior_data *) inferior_data (inf, sim_inferior_data_key);
db04efe6
KB
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{
653090d3 259 struct sim_inferior_data *sim_data = (struct sim_inferior_data *) data;
db04efe6
KB
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{
ac7936df 429 struct gdbarch *gdbarch = regcache->arch ();
bcc0c096 430 struct inferior *inf = find_inferior_ptid (regcache_get_ptid (regcache));
db04efe6 431 struct sim_inferior_data *sim_data
bcc0c096 432 = get_sim_inferior_data (inf, SIM_INSTANCE_NEEDED);
123f5f96 433
c5aa993b 434 if (regno == -1)
c906108c 435 {
40a6adc1 436 for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
28439f5e 437 gdbsim_fetch_register (ops, regcache, regno);
8238d0bf 438 return;
c906108c 439 }
8238d0bf 440
40a6adc1 441 switch (gdbarch_register_sim_regno (gdbarch, regno))
c906108c 442 {
8238d0bf
AC
443 case LEGACY_SIM_REGNO_IGNORE:
444 break;
445 case SIM_REGNO_DOES_NOT_EXIST:
446 {
447 /* For moment treat a `does not exist' register the same way
74228e77 448 as an ``unavailable'' register. */
a4d1e79a 449 regcache->raw_supply_zeroed (regno);
8238d0bf
AC
450 break;
451 }
74228e77 452
8238d0bf
AC
453 default:
454 {
455 static int warn_user = 1;
a4d1e79a
AH
456 int regsize = register_size (gdbarch, regno);
457 gdb::byte_vector buf (regsize, 0);
8238d0bf 458 int nr_bytes;
123f5f96 459
40a6adc1 460 gdb_assert (regno >= 0 && regno < gdbarch_num_regs (gdbarch));
db04efe6 461 nr_bytes = sim_fetch_register (sim_data->gdbsim_desc,
474c1661 462 gdbarch_register_sim_regno
40a6adc1 463 (gdbarch, regno),
a4d1e79a
AH
464 buf.data (), regsize);
465 if (nr_bytes > 0 && nr_bytes != regsize && warn_user)
8238d0bf
AC
466 {
467 fprintf_unfiltered (gdb_stderr,
0df8b418
MS
468 "Size of register %s (%d/%d) "
469 "incorrect (%d instead of %d))",
40a6adc1 470 gdbarch_register_name (gdbarch, regno),
474c1661 471 regno,
a4d1e79a
AH
472 gdbarch_register_sim_regno (gdbarch, regno),
473 nr_bytes, regsize);
8238d0bf
AC
474 warn_user = 0;
475 }
476 /* FIXME: cagney/2002-05-27: Should check `nr_bytes == 0'
278a7cf7 477 indicating that GDB and the SIM have different ideas about
8238d0bf
AC
478 which registers are fetchable. */
479 /* Else if (nr_bytes < 0): an old simulator, that doesn't
480 think to return the register size. Just assume all is ok. */
a4d1e79a 481 regcache->raw_supply (regno, buf.data ());
ea35711c 482 if (remote_debug)
8238d0bf 483 {
1385f66c
PA
484 fprintf_unfiltered (gdb_stdlog,
485 "gdbsim_fetch_register: %d", regno);
8238d0bf 486 /* FIXME: We could print something more intelligible. */
a4d1e79a 487 dump_mem (buf.data (), regsize);
8238d0bf
AC
488 }
489 break;
490 }
c906108c
SS
491 }
492}
493
494
495static void
28439f5e
PA
496gdbsim_store_register (struct target_ops *ops,
497 struct regcache *regcache, int regno)
c906108c 498{
ac7936df 499 struct gdbarch *gdbarch = regcache->arch ();
bcc0c096 500 struct inferior *inf = find_inferior_ptid (regcache_get_ptid (regcache));
db04efe6 501 struct sim_inferior_data *sim_data
bcc0c096 502 = get_sim_inferior_data (inf, SIM_INSTANCE_NEEDED);
db04efe6 503
c5aa993b 504 if (regno == -1)
c906108c 505 {
40a6adc1 506 for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
28439f5e 507 gdbsim_store_register (ops, regcache, regno);
8238d0bf 508 return;
c906108c 509 }
40a6adc1 510 else if (gdbarch_register_sim_regno (gdbarch, regno) >= 0)
c906108c 511 {
a4d1e79a
AH
512 int regsize = register_size (gdbarch, regno);
513 gdb::byte_vector tmp (regsize);
c906108c 514 int nr_bytes;
123f5f96 515
a4d1e79a 516 regcache->cooked_read (regno, tmp.data ());
db04efe6 517 nr_bytes = sim_store_register (sim_data->gdbsim_desc,
474c1661 518 gdbarch_register_sim_regno
40a6adc1 519 (gdbarch, regno),
a4d1e79a
AH
520 tmp.data (), regsize);
521
522 if (nr_bytes > 0 && nr_bytes != regsize)
8e65ff28 523 internal_error (__FILE__, __LINE__,
e2e0b3e5 524 _("Register size different to expected"));
dae477fe 525 if (nr_bytes < 0)
74228e77
RM
526 internal_error (__FILE__, __LINE__,
527 _("Register %d not updated"), regno);
dae477fe 528 if (nr_bytes == 0)
74228e77
RM
529 warning (_("Register %s not updated"),
530 gdbarch_register_name (gdbarch, regno));
dae477fe 531
ea35711c 532 if (remote_debug)
c906108c 533 {
1385f66c 534 fprintf_unfiltered (gdb_stdlog, "gdbsim_store_register: %d", regno);
c906108c 535 /* FIXME: We could print something more intelligible. */
a4d1e79a 536 dump_mem (tmp.data (), regsize);
c906108c
SS
537 }
538 }
539}
540
541/* Kill the running program. This may involve closing any open files
542 and releasing other resources acquired by the simulated program. */
543
544static void
7d85a9c0 545gdbsim_kill (struct target_ops *ops)
c906108c 546{
ea35711c 547 if (remote_debug)
1385f66c 548 fprintf_unfiltered (gdb_stdlog, "gdbsim_kill\n");
c906108c
SS
549
550 /* There is no need to `kill' running simulator - the simulator is
52bb452f 551 not running. Mourning it is enough. */
bc1e6c81 552 target_mourn_inferior (inferior_ptid);
c906108c
SS
553}
554
555/* Load an executable file into the target process. This is expected to
556 not only bring new code into the target process, but also to update
557 GDB's symbol tables to match. */
558
559static void
9cbe5fff 560gdbsim_load (struct target_ops *self, const char *args, int fromtty)
c906108c 561{
b2b255bd 562 const char *prog;
db04efe6
KB
563 struct sim_inferior_data *sim_data
564 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
1986bccd 565
d1a41061
PP
566 if (args == NULL)
567 error_no_arg (_("program to load"));
1986bccd 568
773a1edc 569 gdb_argv argv (args);
1986bccd
AS
570
571 prog = tilde_expand (argv[0]);
572
573 if (argv[1] != NULL)
574 error (_("GDB sim does not yet support a load offset."));
575
ea35711c 576 if (remote_debug)
1385f66c 577 fprintf_unfiltered (gdb_stdlog, "gdbsim_load: prog \"%s\"\n", prog);
c906108c 578
c906108c
SS
579 /* FIXME: We will print two messages on error.
580 Need error to either not print anything if passed NULL or need
581 another routine that doesn't take any arguments. */
db04efe6 582 if (sim_load (sim_data->gdbsim_desc, prog, NULL, fromtty) == SIM_RC_FAIL)
8a3fe4f8 583 error (_("unable to load program"));
c906108c
SS
584
585 /* FIXME: If a load command should reset the targets registers then
0df8b418 586 a call to sim_create_inferior() should go here. */
c906108c 587
db04efe6 588 sim_data->program_loaded = 1;
c906108c
SS
589}
590
591
39f77062 592/* Start an inferior process and set inferior_ptid to its pid.
c906108c
SS
593 EXEC_FILE is the file to run.
594 ARGS is a string containing the arguments to the program.
595 ENV is the environment vector to pass. Errors reported with error().
596 On VxWorks and various standalone systems, we ignore exec_file. */
597/* This is called not only when we first attach, but also when the
598 user types "run" after having attached. */
599
600static void
7c5ded6a
SDJ
601gdbsim_create_inferior (struct target_ops *target, const char *exec_file,
602 const std::string &allargs, char **env, int from_tty)
c906108c 603{
db04efe6
KB
604 struct sim_inferior_data *sim_data
605 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
c906108c 606 int len;
773a1edc 607 char *arg_buf;
7c5ded6a 608 const char *args = allargs.c_str ();
c906108c
SS
609
610 if (exec_file == 0 || exec_bfd == 0)
8a3fe4f8 611 warning (_("No executable file specified."));
db04efe6 612 if (!sim_data->program_loaded)
8a3fe4f8 613 warning (_("No program loaded."));
c906108c 614
ea35711c 615 if (remote_debug)
1385f66c
PA
616 fprintf_unfiltered (gdb_stdlog,
617 "gdbsim_create_inferior: exec_file \"%s\", args \"%s\"\n",
618 (exec_file ? exec_file : "(NULL)"),
619 args);
c906108c 620
db04efe6 621 if (ptid_equal (inferior_ptid, sim_data->remote_sim_ptid))
7d85a9c0 622 gdbsim_kill (target);
c906108c
SS
623 remove_breakpoints ();
624 init_wait_for_inferior ();
625
773a1edc 626 gdb_argv built_argv;
c906108c
SS
627 if (exec_file != NULL)
628 {
7c5ded6a 629 len = strlen (exec_file) + 1 + allargs.size () + 1 + /*slop */ 10;
c906108c
SS
630 arg_buf = (char *) alloca (len);
631 arg_buf[0] = '\0';
632 strcat (arg_buf, exec_file);
633 strcat (arg_buf, " ");
634 strcat (arg_buf, args);
773a1edc 635 built_argv.reset (arg_buf);
c906108c 636 }
ddd60447 637
2a7c8fd5
AB
638 if (!have_inferiors ())
639 init_thread_list ();
640
773a1edc
TT
641 if (sim_create_inferior (sim_data->gdbsim_desc, exec_bfd,
642 built_argv.get (), env)
ddd60447
MF
643 != SIM_RC_OK)
644 error (_("Unable to create sim inferior."));
c906108c 645
db04efe6 646 inferior_ptid = sim_data->remote_sim_ptid;
20176d8f 647 inferior_appeared (current_inferior (), ptid_get_pid (inferior_ptid));
9de2bdd7
PA
648 add_thread_silent (inferior_ptid);
649
0df8b418
MS
650 insert_breakpoints (); /* Needed to get correct instruction
651 in cache. */
c906108c 652
88056fbb 653 clear_proceed_status (0);
c906108c
SS
654}
655
656/* The open routine takes the rest of the parameters from the command,
657 and (if successful) pushes a new target onto the stack.
658 Targets should supply this routine, if only to provide an error message. */
0df8b418 659/* Called when selecting the simulator. E.g. (gdb) target sim name. */
c906108c
SS
660
661static void
014f9477 662gdbsim_open (const char *args, int from_tty)
c906108c
SS
663{
664 int len;
665 char *arg_buf;
db04efe6 666 struct sim_inferior_data *sim_data;
87d1b309 667 const char *sysroot;
db04efe6 668 SIM_DESC gdbsim_desc;
c906108c 669
87d1b309
MF
670 sysroot = gdb_sysroot;
671 if (is_target_filename (sysroot))
672 sysroot += strlen (TARGET_SYSROOT_PREFIX);
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")
23bf70af 691 + strlen (" --sysroot=") + strlen (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=");
23bf70af 718 strcat (arg_buf, 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 }
773a1edc 725
74cbb09e
SM
726 gdb_argv argv (arg_buf);
727 sim_argv = argv.get ();
c906108c
SS
728
729 init_callbacks ();
db04efe6 730 gdbsim_desc = sim_open (SIM_OPEN_DEBUG, &gdb_callback, exec_bfd, sim_argv);
c906108c
SS
731
732 if (gdbsim_desc == 0)
db04efe6 733 {
db04efe6
KB
734 sim_argv = NULL;
735 error (_("unable to create simulator instance"));
736 }
737
74cbb09e 738 argv.release ();
773a1edc 739
db04efe6
KB
740 /* Reset the pid numberings for this batch of sim instances. */
741 next_pid = INITIAL_PID;
742
743 /* Allocate the inferior data, but do not allocate a sim instance
744 since we've already just done that. */
0df8b418
MS
745 sim_data = get_sim_inferior_data (current_inferior (),
746 SIM_INSTANCE_NOT_NEEDED);
db04efe6
KB
747
748 sim_data->gdbsim_desc = gdbsim_desc;
c906108c
SS
749
750 push_target (&gdbsim_ops);
c906108c 751 printf_filtered ("Connected to the simulator.\n");
52bb452f
DJ
752
753 /* There's nothing running after "target sim" or "load"; not until
754 "run". */
755 inferior_ptid = null_ptid;
db04efe6
KB
756
757 gdbsim_is_open = 1;
758}
759
760/* Callback for iterate_over_inferiors. Called (indirectly) by
761 gdbsim_close(). */
762
763static int
764gdbsim_close_inferior (struct inferior *inf, void *arg)
765{
653090d3
SM
766 struct sim_inferior_data *sim_data
767 = (struct sim_inferior_data *) inferior_data (inf, sim_inferior_data_key);
db04efe6
KB
768 if (sim_data != NULL)
769 {
770 ptid_t ptid = sim_data->remote_sim_ptid;
771
772 sim_inferior_data_cleanup (inf, sim_data);
773 set_inferior_data (inf, sim_inferior_data_key, NULL);
774
775 /* Having a ptid allocated and stored in remote_sim_ptid does
0df8b418 776 not mean that a corresponding inferior was ever created.
db04efe6
KB
777 Thus we need to verify the existence of an inferior using the
778 pid in question before setting inferior_ptid via
779 switch_to_thread() or mourning the inferior. */
c9657e70 780 if (find_inferior_ptid (ptid) != NULL)
db04efe6
KB
781 {
782 switch_to_thread (ptid);
783 generic_mourn_inferior ();
784 }
785 }
786
787 return 0;
c906108c
SS
788}
789
0df8b418 790/* Close out all files and local state before this target loses control. */
c906108c
SS
791
792static void
de90e03d 793gdbsim_close (struct target_ops *self)
c906108c 794{
db04efe6
KB
795 struct sim_inferior_data *sim_data
796 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
797
ea35711c 798 if (remote_debug)
1385f66c 799 fprintf_unfiltered (gdb_stdlog, "gdbsim_close\n");
c906108c 800
db04efe6 801 iterate_over_inferiors (gdbsim_close_inferior, NULL);
c906108c 802
db04efe6 803 if (sim_argv != NULL)
c906108c 804 {
db04efe6
KB
805 freeargv (sim_argv);
806 sim_argv = NULL;
c906108c
SS
807 }
808
809 end_callbacks ();
db04efe6
KB
810
811 gdbsim_is_open = 0;
c906108c
SS
812}
813
814/* Takes a program previously attached to and detaches it.
815 The program may resume execution (some targets do, some don't) and will
816 no longer stop on signals, etc. We better not have left any breakpoints
6bd6f3b6
SM
817 in the program or it'll die when it hits one. FROM_TTY says whether to be
818 verbose or not. */
c906108c
SS
819/* Terminate the open connection to the remote debugger.
820 Use this when you want to detach and do something else with your gdb. */
821
822static void
6bd6f3b6 823gdbsim_detach (struct target_ops *ops, int from_tty)
c906108c 824{
ea35711c 825 if (remote_debug)
6bd6f3b6 826 fprintf_unfiltered (gdb_stdlog, "gdbsim_detach\n");
c906108c 827
7fdc1521 828 unpush_target (ops); /* calls gdbsim_close to do the real work */
c906108c
SS
829 if (from_tty)
830 printf_filtered ("Ending simulator %s debugging\n", target_shortname);
831}
c5aa993b 832
c906108c
SS
833/* Resume execution of the target process. STEP says whether to single-step
834 or to run free; SIGGNAL is the signal value (e.g. SIGINT) to be given
835 to the target, or zero for no signal. */
836
db04efe6
KB
837struct resume_data
838{
2ea28649 839 enum gdb_signal siggnal;
db04efe6
KB
840 int step;
841};
842
843static int
844gdbsim_resume_inferior (struct inferior *inf, void *arg)
845{
846 struct sim_inferior_data *sim_data
847 = get_sim_inferior_data (inf, SIM_INSTANCE_NOT_NEEDED);
653090d3 848 struct resume_data *rd = (struct resume_data *) arg;
db04efe6
KB
849
850 if (sim_data)
851 {
852 sim_data->resume_siggnal = rd->siggnal;
853 sim_data->resume_step = rd->step;
854
855 if (remote_debug)
1385f66c
PA
856 fprintf_unfiltered (gdb_stdlog,
857 _("gdbsim_resume: pid %d, step %d, signal %d\n"),
858 inf->pid, rd->step, rd->siggnal);
db04efe6
KB
859 }
860
861 /* When called from iterate_over_inferiors, a zero return causes the
862 iteration process to proceed until there are no more inferiors to
863 consider. */
864 return 0;
865}
c906108c
SS
866
867static void
2fb89e62 868gdbsim_resume (struct target_ops *ops,
2ea28649 869 ptid_t ptid, int step, enum gdb_signal siggnal)
c906108c 870{
db04efe6
KB
871 struct resume_data rd;
872 struct sim_inferior_data *sim_data
873 = get_sim_inferior_data_by_ptid (ptid, SIM_INSTANCE_NOT_NEEDED);
874
875 rd.siggnal = siggnal;
876 rd.step = step;
877
0df8b418 878 /* We don't access any sim_data members within this function.
db04efe6
KB
879 What's of interest is whether or not the call to
880 get_sim_inferior_data_by_ptid(), above, is able to obtain a
881 non-NULL pointer. If it managed to obtain a non-NULL pointer, we
882 know we have a single inferior to consider. If it's NULL, we
883 either have multiple inferiors to resume or an error condition. */
884
885 if (sim_data)
c9657e70 886 gdbsim_resume_inferior (find_inferior_ptid (ptid), &rd);
db04efe6
KB
887 else if (ptid_equal (ptid, minus_one_ptid))
888 iterate_over_inferiors (gdbsim_resume_inferior, &rd);
889 else
8a3fe4f8 890 error (_("The program is not being run."));
c906108c
SS
891}
892
bfedc46a 893/* Notify the simulator of an asynchronous request to interrupt.
c5aa993b 894
bfedc46a 895 The simulator shall ensure that the interrupt request is eventually
c906108c 896 delivered to the simulator. If the call is made while the
bfedc46a 897 simulator is not running then the interrupt request is processed when
c906108c
SS
898 the simulator is next resumed.
899
db04efe6
KB
900 For simulators that do not support this operation, just abort. */
901
902static int
bfedc46a 903gdbsim_interrupt_inferior (struct inferior *inf, void *arg)
db04efe6
KB
904{
905 struct sim_inferior_data *sim_data
906 = get_sim_inferior_data (inf, SIM_INSTANCE_NEEDED);
907
908 if (sim_data)
909 {
910 if (!sim_stop (sim_data->gdbsim_desc))
911 {
912 quit ();
913 }
914 }
915
916 /* When called from iterate_over_inferiors, a zero return causes the
917 iteration process to proceed until there are no more inferiors to
918 consider. */
919 return 0;
920}
c906108c
SS
921
922static void
bfedc46a 923gdbsim_interrupt (struct target_ops *self, ptid_t ptid)
c906108c 924{
db04efe6
KB
925 struct sim_inferior_data *sim_data;
926
927 if (ptid_equal (ptid, minus_one_ptid))
c906108c 928 {
bfedc46a 929 iterate_over_inferiors (gdbsim_interrupt_inferior, NULL);
db04efe6
KB
930 }
931 else
932 {
c9657e70 933 struct inferior *inf = find_inferior_ptid (ptid);
db04efe6
KB
934
935 if (inf == NULL)
0df8b418
MS
936 error (_("Can't stop pid %d. No inferior found."),
937 ptid_get_pid (ptid));
db04efe6 938
bfedc46a 939 gdbsim_interrupt_inferior (inf, NULL);
c906108c
SS
940 }
941}
942
943/* GDB version of os_poll_quit callback.
8a0ce09a 944 Taken from gdb/util.c - should be in a library. */
c906108c
SS
945
946static int
fba45db2 947gdb_os_poll_quit (host_callback *p)
c906108c 948{
98bbd631
AC
949 if (deprecated_ui_loop_hook != NULL)
950 deprecated_ui_loop_hook (0);
7a292a7a 951
522002f9 952 if (check_quit_flag ()) /* gdb's idea of quit */
abf009ef 953 return 1;
c906108c
SS
954 return 0;
955}
956
957/* Wait for inferior process to do something. Return pid of child,
958 or -1 in case of error; store status through argument pointer STATUS,
0df8b418 959 just as `wait' would. */
c906108c
SS
960
961static void
fba45db2 962gdbsim_cntrl_c (int signo)
c906108c 963{
bfedc46a 964 gdbsim_interrupt (NULL, minus_one_ptid);
c906108c
SS
965}
966
39f77062 967static ptid_t
117de6a9 968gdbsim_wait (struct target_ops *ops,
47608cb1 969 ptid_t ptid, struct target_waitstatus *status, int options)
c906108c 970{
db04efe6 971 struct sim_inferior_data *sim_data;
a40805d4 972 static sighandler_t prev_sigint;
c906108c
SS
973 int sigrc = 0;
974 enum sim_stop reason = sim_running;
975
db04efe6
KB
976 /* This target isn't able to (yet) resume more than one inferior at a time.
977 When ptid is minus_one_ptid, just use the current inferior. If we're
978 given an explicit pid, we'll try to find it and use that instead. */
979 if (ptid_equal (ptid, minus_one_ptid))
0df8b418
MS
980 sim_data = get_sim_inferior_data (current_inferior (),
981 SIM_INSTANCE_NEEDED);
db04efe6
KB
982 else
983 {
984 sim_data = get_sim_inferior_data_by_ptid (ptid, SIM_INSTANCE_NEEDED);
985 if (sim_data == NULL)
986 error (_("Unable to wait for pid %d. Inferior not found."),
987 ptid_get_pid (ptid));
988 inferior_ptid = ptid;
989 }
990
ea35711c 991 if (remote_debug)
1385f66c 992 fprintf_unfiltered (gdb_stdlog, "gdbsim_wait\n");
c906108c
SS
993
994#if defined (HAVE_SIGACTION) && defined (SA_RESTART)
995 {
996 struct sigaction sa, osa;
997 sa.sa_handler = gdbsim_cntrl_c;
998 sigemptyset (&sa.sa_mask);
999 sa.sa_flags = 0;
1000 sigaction (SIGINT, &sa, &osa);
1001 prev_sigint = osa.sa_handler;
1002 }
1003#else
1004 prev_sigint = signal (SIGINT, gdbsim_cntrl_c);
1005#endif
db04efe6 1006 sim_resume (sim_data->gdbsim_desc, sim_data->resume_step,
74228e77 1007 sim_data->resume_siggnal);
db04efe6 1008
c906108c 1009 signal (SIGINT, prev_sigint);
db04efe6 1010 sim_data->resume_step = 0;
c906108c 1011
db04efe6 1012 sim_stop_reason (sim_data->gdbsim_desc, &reason, &sigrc);
c906108c
SS
1013
1014 switch (reason)
1015 {
1016 case sim_exited:
1017 status->kind = TARGET_WAITKIND_EXITED;
1018 status->value.integer = sigrc;
1019 break;
1020 case sim_stopped:
1021 switch (sigrc)
1022 {
a493e3e2 1023 case GDB_SIGNAL_ABRT:
c906108c
SS
1024 quit ();
1025 break;
a493e3e2
PA
1026 case GDB_SIGNAL_INT:
1027 case GDB_SIGNAL_TRAP:
c906108c
SS
1028 default:
1029 status->kind = TARGET_WAITKIND_STOPPED;
653090d3 1030 status->value.sig = (enum gdb_signal) sigrc;
c906108c
SS
1031 break;
1032 }
1033 break;
1034 case sim_signalled:
1035 status->kind = TARGET_WAITKIND_SIGNALLED;
653090d3 1036 status->value.sig = (enum gdb_signal) sigrc;
c906108c
SS
1037 break;
1038 case sim_running:
1039 case sim_polling:
0df8b418 1040 /* FIXME: Is this correct? */
c906108c
SS
1041 break;
1042 }
1043
39f77062 1044 return inferior_ptid;
c906108c
SS
1045}
1046
1047/* Get ready to modify the registers array. On machines which store
1048 individual registers, this doesn't need to do anything. On machines
1049 which store all the registers in one fell swoop, this makes sure
1050 that registers contains all the registers from the program being
1051 debugged. */
1052
1053static void
f32dbf8c 1054gdbsim_prepare_to_store (struct target_ops *self, struct regcache *regcache)
c906108c 1055{
0df8b418 1056 /* Do nothing, since we can store individual regs. */
c906108c
SS
1057}
1058
146ec4db
PA
1059/* Helper for gdbsim_xfer_partial that handles memory transfers.
1060 Arguments are like target_xfer_partial. */
d93bce06 1061
9b409511 1062static enum target_xfer_status
146ec4db
PA
1063gdbsim_xfer_memory (struct target_ops *target,
1064 gdb_byte *readbuf, const gdb_byte *writebuf,
9b409511 1065 ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
c906108c 1066{
db04efe6
KB
1067 struct sim_inferior_data *sim_data
1068 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
b55e14c7 1069 int l;
db04efe6 1070
0c012db1
KB
1071 /* If this target doesn't have memory yet, return 0 causing the
1072 request to be passed to a lower target, hopefully an exec
1073 file. */
1074 if (!target->to_has_memory (target))
9b409511 1075 return TARGET_XFER_EOF;
52bb452f 1076
db04efe6 1077 if (!sim_data->program_loaded)
8a3fe4f8 1078 error (_("No program loaded."));
c906108c 1079
db04efe6
KB
1080 /* Note that we obtained the sim_data pointer above using
1081 SIM_INSTANCE_NOT_NEEDED. We do this so that we don't needlessly
1082 allocate a sim instance prior to loading a program. If we
1083 get to this point in the code though, gdbsim_desc should be
1084 non-NULL. (Note that a sim instance is needed in order to load
1085 the program...) */
1086 gdb_assert (sim_data->gdbsim_desc != NULL);
1087
ea35711c 1088 if (remote_debug)
fcde0081 1089 fprintf_unfiltered (gdb_stdlog,
146ec4db
PA
1090 "gdbsim_xfer_memory: readbuf %s, writebuf %s, "
1091 "memaddr %s, len %s\n",
1092 host_address_to_string (readbuf),
1093 host_address_to_string (writebuf),
fcde0081 1094 paddress (target_gdbarch (), memaddr),
b55e14c7 1095 pulongest (len));
c906108c 1096
146ec4db 1097 if (writebuf)
c906108c 1098 {
fcde0081 1099 if (remote_debug && len > 0)
146ec4db 1100 dump_mem (writebuf, len);
b55e14c7 1101 l = sim_write (sim_data->gdbsim_desc, memaddr, writebuf, len);
c906108c 1102 }
c5aa993b 1103 else
c906108c 1104 {
b55e14c7 1105 l = sim_read (sim_data->gdbsim_desc, memaddr, readbuf, len);
ea35711c 1106 if (remote_debug && len > 0)
146ec4db 1107 dump_mem (readbuf, len);
c5aa993b 1108 }
9b409511
YQ
1109 if (l > 0)
1110 {
1111 *xfered_len = (ULONGEST) l;
1112 return TARGET_XFER_OK;
1113 }
1114 else if (l == 0)
1115 return TARGET_XFER_EOF;
1116 else
1117 return TARGET_XFER_E_IO;
c906108c
SS
1118}
1119
146ec4db
PA
1120/* Target to_xfer_partial implementation. */
1121
9b409511 1122static enum target_xfer_status
146ec4db
PA
1123gdbsim_xfer_partial (struct target_ops *ops, enum target_object object,
1124 const char *annex, gdb_byte *readbuf,
9b409511
YQ
1125 const gdb_byte *writebuf, ULONGEST offset, ULONGEST len,
1126 ULONGEST *xfered_len)
146ec4db
PA
1127{
1128 switch (object)
1129 {
1130 case TARGET_OBJECT_MEMORY:
9b409511
YQ
1131 return gdbsim_xfer_memory (ops, readbuf, writebuf, offset, len,
1132 xfered_len);
146ec4db
PA
1133
1134 default:
2ed4b548 1135 return TARGET_XFER_E_IO;
146ec4db
PA
1136 }
1137}
1138
c906108c 1139static void
fba45db2 1140gdbsim_files_info (struct target_ops *target)
c906108c 1141{
db04efe6
KB
1142 struct sim_inferior_data *sim_data
1143 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
0d18d720 1144 const char *file = "nothing";
c906108c
SS
1145
1146 if (exec_bfd)
1147 file = bfd_get_filename (exec_bfd);
1148
ea35711c 1149 if (remote_debug)
1385f66c 1150 fprintf_unfiltered (gdb_stdlog, "gdbsim_files_info: file \"%s\"\n", file);
c906108c
SS
1151
1152 if (exec_bfd)
1153 {
1385f66c
PA
1154 fprintf_unfiltered (gdb_stdlog, "\tAttached to %s running program %s\n",
1155 target_shortname, file);
db04efe6 1156 sim_info (sim_data->gdbsim_desc, 0);
c906108c
SS
1157 }
1158}
1159
1160/* Clear the simulator's notion of what the break points are. */
1161
1162static void
3c8b2eda 1163gdbsim_mourn_inferior (struct target_ops *target)
c5aa993b 1164{
db04efe6
KB
1165 struct sim_inferior_data *sim_data
1166 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
1167
ea35711c 1168 if (remote_debug)
1385f66c 1169 fprintf_unfiltered (gdb_stdlog, "gdbsim_mourn_inferior:\n");
c906108c
SS
1170
1171 remove_breakpoints ();
1172 generic_mourn_inferior ();
db04efe6 1173 delete_thread_silent (sim_data->remote_sim_ptid);
c906108c
SS
1174}
1175
c906108c
SS
1176/* Pass the command argument through to the simulator verbatim. The
1177 simulator must do any command interpretation work. */
1178
1179void
0b39b52e 1180simulator_command (const char *args, int from_tty)
c906108c 1181{
db04efe6
KB
1182 struct sim_inferior_data *sim_data;
1183
1184 /* We use inferior_data() instead of get_sim_inferior_data() here in
1185 order to avoid attaching a sim_inferior_data struct to an
1186 inferior unnecessarily. The reason we take such care here is due
1187 to the fact that this function, simulator_command(), may be called
1188 even when the sim target is not active. If we were to use
1189 get_sim_inferior_data() here, it is possible that this call would
1190 be made either prior to gdbsim_open() or after gdbsim_close(),
1191 thus allocating memory that would not be garbage collected until
1192 the ultimate destruction of the associated inferior. */
1193
653090d3
SM
1194 sim_data = ((struct sim_inferior_data *)
1195 inferior_data (current_inferior (), sim_inferior_data_key));
db04efe6 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
386535dd
PA
1219static void
1220sim_command_completer (struct cmd_list_element *ignore,
1221 completion_tracker &tracker,
1222 const char *text, const char *word)
56a9aa1d
MF
1223{
1224 struct sim_inferior_data *sim_data;
1225
653090d3
SM
1226 sim_data = ((struct sim_inferior_data *)
1227 inferior_data (current_inferior (), sim_inferior_data_key));
56a9aa1d 1228 if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
386535dd 1229 return;
56a9aa1d 1230
386535dd
PA
1231 /* sim_complete_command returns a NULL-terminated malloc'ed array of
1232 malloc'ed strings. */
1233 struct sim_completions_deleter
1234 {
1235 void operator() (char **ptr) const
1236 {
1237 for (size_t i = 0; ptr[i] != NULL; i++)
1238 xfree (ptr[i]);
1239 xfree (ptr);
1240 }
1241 };
1242
1243 std::unique_ptr<char *[], sim_completions_deleter> sim_completions
1244 (sim_complete_command (sim_data->gdbsim_desc, text, word));
1245 if (sim_completions == NULL)
1246 return;
34370865 1247
386535dd
PA
1248 /* Count the elements and add completions from tail to head because
1249 below we'll swap elements out of the array in case add_completion
1250 throws and the deleter deletes until it finds a NULL element. */
1251 size_t count = 0;
1252 while (sim_completions[count] != NULL)
1253 count++;
34370865 1254
386535dd
PA
1255 for (size_t i = count; i > 0; i--)
1256 {
1257 gdb::unique_xmalloc_ptr<char> match (sim_completions[i - 1]);
1258 sim_completions[i - 1] = NULL;
1259 tracker.add_completion (std::move (match));
1260 }
56a9aa1d
MF
1261}
1262
9de2bdd7
PA
1263/* Check to see if a thread is still alive. */
1264
1265static int
28439f5e 1266gdbsim_thread_alive (struct target_ops *ops, ptid_t ptid)
9de2bdd7 1267{
db04efe6
KB
1268 struct sim_inferior_data *sim_data
1269 = get_sim_inferior_data_by_ptid (ptid, SIM_INSTANCE_NOT_NEEDED);
1270
1271 if (sim_data == NULL)
1272 return 0;
1273
1274 if (ptid_equal (ptid, sim_data->remote_sim_ptid))
9de2bdd7
PA
1275 /* The simulators' task is always alive. */
1276 return 1;
1277
1278 return 0;
1279}
1280
1281/* Convert a thread ID to a string. Returns the string in a static
1282 buffer. */
1283
7a114964 1284static const char *
117de6a9 1285gdbsim_pid_to_str (struct target_ops *ops, ptid_t ptid)
9de2bdd7 1286{
9de2bdd7
PA
1287 return normal_pid_to_str (ptid);
1288}
1289
0c012db1
KB
1290/* Simulator memory may be accessed after the program has been loaded. */
1291
b261e0c5 1292static int
0c012db1
KB
1293gdbsim_has_all_memory (struct target_ops *ops)
1294{
1295 struct sim_inferior_data *sim_data
1296 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
1297
1298 if (!sim_data->program_loaded)
1299 return 0;
1300
1301 return 1;
1302}
1303
b261e0c5 1304static int
0c012db1
KB
1305gdbsim_has_memory (struct target_ops *ops)
1306{
1307 struct sim_inferior_data *sim_data
1308 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
1309
1310 if (!sim_data->program_loaded)
1311 return 0;
1312
1313 return 1;
1314}
1315
0df8b418 1316/* Define the target subroutine names. */
c906108c 1317
c5aa993b
JM
1318struct target_ops gdbsim_ops;
1319
1320static void
1321init_gdbsim_ops (void)
1322{
1323 gdbsim_ops.to_shortname = "sim";
1324 gdbsim_ops.to_longname = "simulator";
1325 gdbsim_ops.to_doc = "Use the compiled-in simulator.";
1326 gdbsim_ops.to_open = gdbsim_open;
1327 gdbsim_ops.to_close = gdbsim_close;
c5aa993b 1328 gdbsim_ops.to_detach = gdbsim_detach;
c5aa993b
JM
1329 gdbsim_ops.to_resume = gdbsim_resume;
1330 gdbsim_ops.to_wait = gdbsim_wait;
c5aa993b
JM
1331 gdbsim_ops.to_fetch_registers = gdbsim_fetch_register;
1332 gdbsim_ops.to_store_registers = gdbsim_store_register;
1333 gdbsim_ops.to_prepare_to_store = gdbsim_prepare_to_store;
146ec4db 1334 gdbsim_ops.to_xfer_partial = gdbsim_xfer_partial;
c5aa993b 1335 gdbsim_ops.to_files_info = gdbsim_files_info;
8181d85f
DJ
1336 gdbsim_ops.to_insert_breakpoint = memory_insert_breakpoint;
1337 gdbsim_ops.to_remove_breakpoint = memory_remove_breakpoint;
c5aa993b
JM
1338 gdbsim_ops.to_kill = gdbsim_kill;
1339 gdbsim_ops.to_load = gdbsim_load;
c5aa993b 1340 gdbsim_ops.to_create_inferior = gdbsim_create_inferior;
c5aa993b 1341 gdbsim_ops.to_mourn_inferior = gdbsim_mourn_inferior;
bfedc46a 1342 gdbsim_ops.to_interrupt = gdbsim_interrupt;
9de2bdd7
PA
1343 gdbsim_ops.to_thread_alive = gdbsim_thread_alive;
1344 gdbsim_ops.to_pid_to_str = gdbsim_pid_to_str;
c5aa993b 1345 gdbsim_ops.to_stratum = process_stratum;
0c012db1
KB
1346 gdbsim_ops.to_has_all_memory = gdbsim_has_all_memory;
1347 gdbsim_ops.to_has_memory = gdbsim_has_memory;
c35b1492
PA
1348 gdbsim_ops.to_has_stack = default_child_has_stack;
1349 gdbsim_ops.to_has_registers = default_child_has_registers;
1350 gdbsim_ops.to_has_execution = default_child_has_execution;
c5aa993b 1351 gdbsim_ops.to_magic = OPS_MAGIC;
c906108c
SS
1352}
1353
1354void
fba45db2 1355_initialize_remote_sim (void)
c906108c 1356{
56a9aa1d
MF
1357 struct cmd_list_element *c;
1358
c5aa993b 1359 init_gdbsim_ops ();
c906108c
SS
1360 add_target (&gdbsim_ops);
1361
56a9aa1d
MF
1362 c = add_com ("sim", class_obscure, simulator_command,
1363 _("Send a command to the simulator."));
1364 set_cmd_completer (c, sim_command_completer);
9de2bdd7 1365
db04efe6 1366 sim_inferior_data_key
c5d9b215 1367 = register_inferior_data_with_cleanup (NULL, sim_inferior_data_cleanup);
c906108c 1368}
This page took 1.83332 seconds and 4 git commands to generate.