Eliminate target_ops::to_xclose
[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
6e1e1966 80static void gdbsim_detach (struct target_ops *ops, inferior *inf, 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
f6cfb427 89static void gdbsim_interrupt (struct target_ops *self);
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
7104e59b
SM
379static void ATTRIBUTE_PRINTF (2, 3)
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
7104e59b 391static void ATTRIBUTE_PRINTF (2, 0)
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
7104e59b 399static void ATTRIBUTE_PRINTF (2, 0)
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
7104e59b 407static void ATTRIBUTE_PRINTF (2, 3)
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
6e1e1966 823gdbsim_detach (struct target_ops *ops, inferior *inf, 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
f6cfb427 923gdbsim_interrupt (struct target_ops *self)
c906108c 924{
f6cfb427 925 iterate_over_inferiors (gdbsim_interrupt_inferior, NULL);
c906108c
SS
926}
927
928/* GDB version of os_poll_quit callback.
8a0ce09a 929 Taken from gdb/util.c - should be in a library. */
c906108c
SS
930
931static int
fba45db2 932gdb_os_poll_quit (host_callback *p)
c906108c 933{
98bbd631
AC
934 if (deprecated_ui_loop_hook != NULL)
935 deprecated_ui_loop_hook (0);
7a292a7a 936
522002f9 937 if (check_quit_flag ()) /* gdb's idea of quit */
abf009ef 938 return 1;
c906108c
SS
939 return 0;
940}
941
942/* Wait for inferior process to do something. Return pid of child,
943 or -1 in case of error; store status through argument pointer STATUS,
0df8b418 944 just as `wait' would. */
c906108c
SS
945
946static void
fba45db2 947gdbsim_cntrl_c (int signo)
c906108c 948{
f6cfb427 949 gdbsim_interrupt (NULL);
c906108c
SS
950}
951
39f77062 952static ptid_t
117de6a9 953gdbsim_wait (struct target_ops *ops,
47608cb1 954 ptid_t ptid, struct target_waitstatus *status, int options)
c906108c 955{
db04efe6 956 struct sim_inferior_data *sim_data;
a40805d4 957 static sighandler_t prev_sigint;
c906108c
SS
958 int sigrc = 0;
959 enum sim_stop reason = sim_running;
960
db04efe6
KB
961 /* This target isn't able to (yet) resume more than one inferior at a time.
962 When ptid is minus_one_ptid, just use the current inferior. If we're
963 given an explicit pid, we'll try to find it and use that instead. */
964 if (ptid_equal (ptid, minus_one_ptid))
0df8b418
MS
965 sim_data = get_sim_inferior_data (current_inferior (),
966 SIM_INSTANCE_NEEDED);
db04efe6
KB
967 else
968 {
969 sim_data = get_sim_inferior_data_by_ptid (ptid, SIM_INSTANCE_NEEDED);
970 if (sim_data == NULL)
971 error (_("Unable to wait for pid %d. Inferior not found."),
972 ptid_get_pid (ptid));
973 inferior_ptid = ptid;
974 }
975
ea35711c 976 if (remote_debug)
1385f66c 977 fprintf_unfiltered (gdb_stdlog, "gdbsim_wait\n");
c906108c
SS
978
979#if defined (HAVE_SIGACTION) && defined (SA_RESTART)
980 {
981 struct sigaction sa, osa;
982 sa.sa_handler = gdbsim_cntrl_c;
983 sigemptyset (&sa.sa_mask);
984 sa.sa_flags = 0;
985 sigaction (SIGINT, &sa, &osa);
986 prev_sigint = osa.sa_handler;
987 }
988#else
989 prev_sigint = signal (SIGINT, gdbsim_cntrl_c);
990#endif
db04efe6 991 sim_resume (sim_data->gdbsim_desc, sim_data->resume_step,
74228e77 992 sim_data->resume_siggnal);
db04efe6 993
c906108c 994 signal (SIGINT, prev_sigint);
db04efe6 995 sim_data->resume_step = 0;
c906108c 996
db04efe6 997 sim_stop_reason (sim_data->gdbsim_desc, &reason, &sigrc);
c906108c
SS
998
999 switch (reason)
1000 {
1001 case sim_exited:
1002 status->kind = TARGET_WAITKIND_EXITED;
1003 status->value.integer = sigrc;
1004 break;
1005 case sim_stopped:
1006 switch (sigrc)
1007 {
a493e3e2 1008 case GDB_SIGNAL_ABRT:
c906108c
SS
1009 quit ();
1010 break;
a493e3e2
PA
1011 case GDB_SIGNAL_INT:
1012 case GDB_SIGNAL_TRAP:
c906108c
SS
1013 default:
1014 status->kind = TARGET_WAITKIND_STOPPED;
653090d3 1015 status->value.sig = (enum gdb_signal) sigrc;
c906108c
SS
1016 break;
1017 }
1018 break;
1019 case sim_signalled:
1020 status->kind = TARGET_WAITKIND_SIGNALLED;
653090d3 1021 status->value.sig = (enum gdb_signal) sigrc;
c906108c
SS
1022 break;
1023 case sim_running:
1024 case sim_polling:
0df8b418 1025 /* FIXME: Is this correct? */
c906108c
SS
1026 break;
1027 }
1028
39f77062 1029 return inferior_ptid;
c906108c
SS
1030}
1031
1032/* Get ready to modify the registers array. On machines which store
1033 individual registers, this doesn't need to do anything. On machines
1034 which store all the registers in one fell swoop, this makes sure
1035 that registers contains all the registers from the program being
1036 debugged. */
1037
1038static void
f32dbf8c 1039gdbsim_prepare_to_store (struct target_ops *self, struct regcache *regcache)
c906108c 1040{
0df8b418 1041 /* Do nothing, since we can store individual regs. */
c906108c
SS
1042}
1043
146ec4db
PA
1044/* Helper for gdbsim_xfer_partial that handles memory transfers.
1045 Arguments are like target_xfer_partial. */
d93bce06 1046
9b409511 1047static enum target_xfer_status
146ec4db
PA
1048gdbsim_xfer_memory (struct target_ops *target,
1049 gdb_byte *readbuf, const gdb_byte *writebuf,
9b409511 1050 ULONGEST memaddr, ULONGEST len, ULONGEST *xfered_len)
c906108c 1051{
db04efe6
KB
1052 struct sim_inferior_data *sim_data
1053 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
b55e14c7 1054 int l;
db04efe6 1055
0c012db1
KB
1056 /* If this target doesn't have memory yet, return 0 causing the
1057 request to be passed to a lower target, hopefully an exec
1058 file. */
1059 if (!target->to_has_memory (target))
9b409511 1060 return TARGET_XFER_EOF;
52bb452f 1061
db04efe6 1062 if (!sim_data->program_loaded)
8a3fe4f8 1063 error (_("No program loaded."));
c906108c 1064
db04efe6
KB
1065 /* Note that we obtained the sim_data pointer above using
1066 SIM_INSTANCE_NOT_NEEDED. We do this so that we don't needlessly
1067 allocate a sim instance prior to loading a program. If we
1068 get to this point in the code though, gdbsim_desc should be
1069 non-NULL. (Note that a sim instance is needed in order to load
1070 the program...) */
1071 gdb_assert (sim_data->gdbsim_desc != NULL);
1072
ea35711c 1073 if (remote_debug)
fcde0081 1074 fprintf_unfiltered (gdb_stdlog,
146ec4db
PA
1075 "gdbsim_xfer_memory: readbuf %s, writebuf %s, "
1076 "memaddr %s, len %s\n",
1077 host_address_to_string (readbuf),
1078 host_address_to_string (writebuf),
fcde0081 1079 paddress (target_gdbarch (), memaddr),
b55e14c7 1080 pulongest (len));
c906108c 1081
146ec4db 1082 if (writebuf)
c906108c 1083 {
fcde0081 1084 if (remote_debug && len > 0)
146ec4db 1085 dump_mem (writebuf, len);
b55e14c7 1086 l = sim_write (sim_data->gdbsim_desc, memaddr, writebuf, len);
c906108c 1087 }
c5aa993b 1088 else
c906108c 1089 {
b55e14c7 1090 l = sim_read (sim_data->gdbsim_desc, memaddr, readbuf, len);
ea35711c 1091 if (remote_debug && len > 0)
146ec4db 1092 dump_mem (readbuf, len);
c5aa993b 1093 }
9b409511
YQ
1094 if (l > 0)
1095 {
1096 *xfered_len = (ULONGEST) l;
1097 return TARGET_XFER_OK;
1098 }
1099 else if (l == 0)
1100 return TARGET_XFER_EOF;
1101 else
1102 return TARGET_XFER_E_IO;
c906108c
SS
1103}
1104
146ec4db
PA
1105/* Target to_xfer_partial implementation. */
1106
9b409511 1107static enum target_xfer_status
146ec4db
PA
1108gdbsim_xfer_partial (struct target_ops *ops, enum target_object object,
1109 const char *annex, gdb_byte *readbuf,
9b409511
YQ
1110 const gdb_byte *writebuf, ULONGEST offset, ULONGEST len,
1111 ULONGEST *xfered_len)
146ec4db
PA
1112{
1113 switch (object)
1114 {
1115 case TARGET_OBJECT_MEMORY:
9b409511
YQ
1116 return gdbsim_xfer_memory (ops, readbuf, writebuf, offset, len,
1117 xfered_len);
146ec4db
PA
1118
1119 default:
2ed4b548 1120 return TARGET_XFER_E_IO;
146ec4db
PA
1121 }
1122}
1123
c906108c 1124static void
fba45db2 1125gdbsim_files_info (struct target_ops *target)
c906108c 1126{
db04efe6
KB
1127 struct sim_inferior_data *sim_data
1128 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
0d18d720 1129 const char *file = "nothing";
c906108c
SS
1130
1131 if (exec_bfd)
1132 file = bfd_get_filename (exec_bfd);
1133
ea35711c 1134 if (remote_debug)
1385f66c 1135 fprintf_unfiltered (gdb_stdlog, "gdbsim_files_info: file \"%s\"\n", file);
c906108c
SS
1136
1137 if (exec_bfd)
1138 {
1385f66c
PA
1139 fprintf_unfiltered (gdb_stdlog, "\tAttached to %s running program %s\n",
1140 target_shortname, file);
db04efe6 1141 sim_info (sim_data->gdbsim_desc, 0);
c906108c
SS
1142 }
1143}
1144
1145/* Clear the simulator's notion of what the break points are. */
1146
1147static void
3c8b2eda 1148gdbsim_mourn_inferior (struct target_ops *target)
c5aa993b 1149{
db04efe6
KB
1150 struct sim_inferior_data *sim_data
1151 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
1152
ea35711c 1153 if (remote_debug)
1385f66c 1154 fprintf_unfiltered (gdb_stdlog, "gdbsim_mourn_inferior:\n");
c906108c
SS
1155
1156 remove_breakpoints ();
1157 generic_mourn_inferior ();
db04efe6 1158 delete_thread_silent (sim_data->remote_sim_ptid);
c906108c
SS
1159}
1160
c906108c
SS
1161/* Pass the command argument through to the simulator verbatim. The
1162 simulator must do any command interpretation work. */
1163
1164void
0b39b52e 1165simulator_command (const char *args, int from_tty)
c906108c 1166{
db04efe6
KB
1167 struct sim_inferior_data *sim_data;
1168
1169 /* We use inferior_data() instead of get_sim_inferior_data() here in
1170 order to avoid attaching a sim_inferior_data struct to an
1171 inferior unnecessarily. The reason we take such care here is due
1172 to the fact that this function, simulator_command(), may be called
1173 even when the sim target is not active. If we were to use
1174 get_sim_inferior_data() here, it is possible that this call would
1175 be made either prior to gdbsim_open() or after gdbsim_close(),
1176 thus allocating memory that would not be garbage collected until
1177 the ultimate destruction of the associated inferior. */
1178
653090d3
SM
1179 sim_data = ((struct sim_inferior_data *)
1180 inferior_data (current_inferior (), sim_inferior_data_key));
db04efe6 1181 if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
c906108c
SS
1182 {
1183
1184 /* PREVIOUSLY: The user may give a command before the simulator
74228e77
RM
1185 is opened. [...] (??? assuming of course one wishes to
1186 continue to allow commands to be sent to unopened simulators,
1187 which isn't entirely unreasonable). */
c906108c
SS
1188
1189 /* The simulator is a builtin abstraction of a remote target.
74228e77
RM
1190 Consistent with that model, access to the simulator, via sim
1191 commands, is restricted to the period when the channel to the
1192 simulator is open. */
c906108c 1193
8a3fe4f8 1194 error (_("Not connected to the simulator target"));
c906108c
SS
1195 }
1196
db04efe6 1197 sim_do_command (sim_data->gdbsim_desc, args);
c906108c
SS
1198
1199 /* Invalidate the register cache, in case the simulator command does
0df8b418 1200 something funny. */
c5aa993b 1201 registers_changed ();
c906108c
SS
1202}
1203
386535dd
PA
1204static void
1205sim_command_completer (struct cmd_list_element *ignore,
1206 completion_tracker &tracker,
1207 const char *text, const char *word)
56a9aa1d
MF
1208{
1209 struct sim_inferior_data *sim_data;
1210
653090d3
SM
1211 sim_data = ((struct sim_inferior_data *)
1212 inferior_data (current_inferior (), sim_inferior_data_key));
56a9aa1d 1213 if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
386535dd 1214 return;
56a9aa1d 1215
386535dd
PA
1216 /* sim_complete_command returns a NULL-terminated malloc'ed array of
1217 malloc'ed strings. */
1218 struct sim_completions_deleter
1219 {
1220 void operator() (char **ptr) const
1221 {
1222 for (size_t i = 0; ptr[i] != NULL; i++)
1223 xfree (ptr[i]);
1224 xfree (ptr);
1225 }
1226 };
1227
1228 std::unique_ptr<char *[], sim_completions_deleter> sim_completions
1229 (sim_complete_command (sim_data->gdbsim_desc, text, word));
1230 if (sim_completions == NULL)
1231 return;
34370865 1232
386535dd
PA
1233 /* Count the elements and add completions from tail to head because
1234 below we'll swap elements out of the array in case add_completion
1235 throws and the deleter deletes until it finds a NULL element. */
1236 size_t count = 0;
1237 while (sim_completions[count] != NULL)
1238 count++;
34370865 1239
386535dd
PA
1240 for (size_t i = count; i > 0; i--)
1241 {
1242 gdb::unique_xmalloc_ptr<char> match (sim_completions[i - 1]);
1243 sim_completions[i - 1] = NULL;
1244 tracker.add_completion (std::move (match));
1245 }
56a9aa1d
MF
1246}
1247
9de2bdd7
PA
1248/* Check to see if a thread is still alive. */
1249
1250static int
28439f5e 1251gdbsim_thread_alive (struct target_ops *ops, ptid_t ptid)
9de2bdd7 1252{
db04efe6
KB
1253 struct sim_inferior_data *sim_data
1254 = get_sim_inferior_data_by_ptid (ptid, SIM_INSTANCE_NOT_NEEDED);
1255
1256 if (sim_data == NULL)
1257 return 0;
1258
1259 if (ptid_equal (ptid, sim_data->remote_sim_ptid))
9de2bdd7
PA
1260 /* The simulators' task is always alive. */
1261 return 1;
1262
1263 return 0;
1264}
1265
1266/* Convert a thread ID to a string. Returns the string in a static
1267 buffer. */
1268
7a114964 1269static const char *
117de6a9 1270gdbsim_pid_to_str (struct target_ops *ops, ptid_t ptid)
9de2bdd7 1271{
9de2bdd7
PA
1272 return normal_pid_to_str (ptid);
1273}
1274
0c012db1
KB
1275/* Simulator memory may be accessed after the program has been loaded. */
1276
b261e0c5 1277static int
0c012db1
KB
1278gdbsim_has_all_memory (struct target_ops *ops)
1279{
1280 struct sim_inferior_data *sim_data
1281 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
1282
1283 if (!sim_data->program_loaded)
1284 return 0;
1285
1286 return 1;
1287}
1288
b261e0c5 1289static int
0c012db1
KB
1290gdbsim_has_memory (struct target_ops *ops)
1291{
1292 struct sim_inferior_data *sim_data
1293 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
1294
1295 if (!sim_data->program_loaded)
1296 return 0;
1297
1298 return 1;
1299}
1300
0df8b418 1301/* Define the target subroutine names. */
c906108c 1302
c5aa993b
JM
1303struct target_ops gdbsim_ops;
1304
1305static void
1306init_gdbsim_ops (void)
1307{
1308 gdbsim_ops.to_shortname = "sim";
1309 gdbsim_ops.to_longname = "simulator";
1310 gdbsim_ops.to_doc = "Use the compiled-in simulator.";
1311 gdbsim_ops.to_open = gdbsim_open;
1312 gdbsim_ops.to_close = gdbsim_close;
c5aa993b 1313 gdbsim_ops.to_detach = gdbsim_detach;
c5aa993b
JM
1314 gdbsim_ops.to_resume = gdbsim_resume;
1315 gdbsim_ops.to_wait = gdbsim_wait;
c5aa993b
JM
1316 gdbsim_ops.to_fetch_registers = gdbsim_fetch_register;
1317 gdbsim_ops.to_store_registers = gdbsim_store_register;
1318 gdbsim_ops.to_prepare_to_store = gdbsim_prepare_to_store;
146ec4db 1319 gdbsim_ops.to_xfer_partial = gdbsim_xfer_partial;
c5aa993b 1320 gdbsim_ops.to_files_info = gdbsim_files_info;
8181d85f
DJ
1321 gdbsim_ops.to_insert_breakpoint = memory_insert_breakpoint;
1322 gdbsim_ops.to_remove_breakpoint = memory_remove_breakpoint;
c5aa993b
JM
1323 gdbsim_ops.to_kill = gdbsim_kill;
1324 gdbsim_ops.to_load = gdbsim_load;
c5aa993b 1325 gdbsim_ops.to_create_inferior = gdbsim_create_inferior;
c5aa993b 1326 gdbsim_ops.to_mourn_inferior = gdbsim_mourn_inferior;
bfedc46a 1327 gdbsim_ops.to_interrupt = gdbsim_interrupt;
9de2bdd7
PA
1328 gdbsim_ops.to_thread_alive = gdbsim_thread_alive;
1329 gdbsim_ops.to_pid_to_str = gdbsim_pid_to_str;
c5aa993b 1330 gdbsim_ops.to_stratum = process_stratum;
0c012db1
KB
1331 gdbsim_ops.to_has_all_memory = gdbsim_has_all_memory;
1332 gdbsim_ops.to_has_memory = gdbsim_has_memory;
c35b1492
PA
1333 gdbsim_ops.to_has_stack = default_child_has_stack;
1334 gdbsim_ops.to_has_registers = default_child_has_registers;
1335 gdbsim_ops.to_has_execution = default_child_has_execution;
c5aa993b 1336 gdbsim_ops.to_magic = OPS_MAGIC;
c906108c
SS
1337}
1338
1339void
fba45db2 1340_initialize_remote_sim (void)
c906108c 1341{
56a9aa1d
MF
1342 struct cmd_list_element *c;
1343
c5aa993b 1344 init_gdbsim_ops ();
c906108c
SS
1345 add_target (&gdbsim_ops);
1346
56a9aa1d
MF
1347 c = add_com ("sim", class_obscure, simulator_command,
1348 _("Send a command to the simulator."));
1349 set_cmd_completer (c, sim_command_completer);
9de2bdd7 1350
db04efe6 1351 sim_inferior_data_key
c5d9b215 1352 = register_inferior_data_with_cleanup (NULL, sim_inferior_data_cleanup);
c906108c 1353}
This page took 1.953021 seconds and 4 git commands to generate.