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