Avoid producing broken non-native core files
[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{
1385f66c 274 fputs_unfiltered ("\t", gdb_stdlog);
3d468296
AB
275
276 if (len == 8 || len == 4)
c906108c 277 {
3d468296 278 uint32_t l[2];
123f5f96 279
3d468296 280 memcpy (l, buf, len);
1385f66c 281 fprintf_unfiltered (gdb_stdlog, "0x%08x", l[0]);
3d468296 282 if (len == 8)
1385f66c 283 fprintf_unfiltered (gdb_stdlog, " 0x%08x", l[1]);
3d468296
AB
284 }
285 else
286 {
287 int i;
123f5f96 288
3d468296 289 for (i = 0; i < len; i++)
1385f66c 290 fprintf_unfiltered (gdb_stdlog, "0x%02x ", buf[i]);
c906108c 291 }
3d468296 292
1385f66c 293 fputs_unfiltered ("\n", gdb_stdlog);
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 488 {
1385f66c
PA
489 fprintf_unfiltered (gdb_stdlog,
490 "gdbsim_fetch_register: %d", regno);
8238d0bf 491 /* FIXME: We could print something more intelligible. */
40a6adc1 492 dump_mem (buf, register_size (gdbarch, regno));
8238d0bf
AC
493 }
494 break;
495 }
c906108c
SS
496 }
497}
498
499
500static void
28439f5e
PA
501gdbsim_store_register (struct target_ops *ops,
502 struct regcache *regcache, int regno)
c906108c 503{
40a6adc1 504 struct gdbarch *gdbarch = get_regcache_arch (regcache);
db04efe6
KB
505 struct sim_inferior_data *sim_data
506 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
507
c5aa993b 508 if (regno == -1)
c906108c 509 {
40a6adc1 510 for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
28439f5e 511 gdbsim_store_register (ops, regcache, regno);
8238d0bf 512 return;
c906108c 513 }
40a6adc1 514 else if (gdbarch_register_sim_regno (gdbarch, regno) >= 0)
c906108c 515 {
5fda2332 516 gdb_byte tmp[MAX_REGISTER_SIZE];
c906108c 517 int nr_bytes;
123f5f96 518
56be3814 519 regcache_cooked_read (regcache, regno, tmp);
db04efe6 520 nr_bytes = sim_store_register (sim_data->gdbsim_desc,
474c1661 521 gdbarch_register_sim_regno
40a6adc1
MD
522 (gdbarch, regno),
523 tmp, register_size (gdbarch, regno));
524 if (nr_bytes > 0 && nr_bytes != register_size (gdbarch, regno))
8e65ff28 525 internal_error (__FILE__, __LINE__,
e2e0b3e5 526 _("Register size different to expected"));
dae477fe
AB
527 if (nr_bytes < 0)
528 internal_error (__FILE__, __LINE__,
529 _("Register %d not updated"), regno);
530 if (nr_bytes == 0)
531 warning (_("Register %s not updated"),
532 gdbarch_register_name (gdbarch, regno));
533
ea35711c 534 if (remote_debug)
c906108c 535 {
1385f66c 536 fprintf_unfiltered (gdb_stdlog, "gdbsim_store_register: %d", regno);
c906108c 537 /* FIXME: We could print something more intelligible. */
40a6adc1 538 dump_mem (tmp, register_size (gdbarch, regno));
c906108c
SS
539 }
540 }
541}
542
543/* Kill the running program. This may involve closing any open files
544 and releasing other resources acquired by the simulated program. */
545
546static void
7d85a9c0 547gdbsim_kill (struct target_ops *ops)
c906108c 548{
ea35711c 549 if (remote_debug)
1385f66c 550 fprintf_unfiltered (gdb_stdlog, "gdbsim_kill\n");
c906108c
SS
551
552 /* There is no need to `kill' running simulator - the simulator is
52bb452f
DJ
553 not running. Mourning it is enough. */
554 target_mourn_inferior ();
c906108c
SS
555}
556
557/* Load an executable file into the target process. This is expected to
558 not only bring new code into the target process, but also to update
559 GDB's symbol tables to match. */
560
561static void
1986bccd 562gdbsim_load (char *args, int fromtty)
c906108c 563{
d1a41061 564 char **argv;
1986bccd 565 char *prog;
db04efe6
KB
566 struct sim_inferior_data *sim_data
567 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
1986bccd 568
d1a41061
PP
569 if (args == NULL)
570 error_no_arg (_("program to load"));
1986bccd 571
d1a41061 572 argv = gdb_buildargv (args);
1986bccd
AS
573 make_cleanup_freeargv (argv);
574
575 prog = tilde_expand (argv[0]);
576
577 if (argv[1] != NULL)
578 error (_("GDB sim does not yet support a load offset."));
579
ea35711c 580 if (remote_debug)
1385f66c 581 fprintf_unfiltered (gdb_stdlog, "gdbsim_load: prog \"%s\"\n", prog);
c906108c 582
c906108c
SS
583 /* FIXME: We will print two messages on error.
584 Need error to either not print anything if passed NULL or need
585 another routine that doesn't take any arguments. */
db04efe6 586 if (sim_load (sim_data->gdbsim_desc, prog, NULL, fromtty) == SIM_RC_FAIL)
8a3fe4f8 587 error (_("unable to load program"));
c906108c
SS
588
589 /* FIXME: If a load command should reset the targets registers then
0df8b418 590 a call to sim_create_inferior() should go here. */
c906108c 591
db04efe6 592 sim_data->program_loaded = 1;
c906108c
SS
593}
594
595
39f77062 596/* Start an inferior process and set inferior_ptid to its pid.
c906108c
SS
597 EXEC_FILE is the file to run.
598 ARGS is a string containing the arguments to the program.
599 ENV is the environment vector to pass. Errors reported with error().
600 On VxWorks and various standalone systems, we ignore exec_file. */
601/* This is called not only when we first attach, but also when the
602 user types "run" after having attached. */
603
604static void
3c8b2eda
TJB
605gdbsim_create_inferior (struct target_ops *target, char *exec_file, char *args,
606 char **env, int from_tty)
c906108c 607{
db04efe6
KB
608 struct sim_inferior_data *sim_data
609 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
c906108c 610 int len;
c5aa993b 611 char *arg_buf, **argv;
c906108c
SS
612
613 if (exec_file == 0 || exec_bfd == 0)
8a3fe4f8 614 warning (_("No executable file specified."));
db04efe6 615 if (!sim_data->program_loaded)
8a3fe4f8 616 warning (_("No program loaded."));
c906108c 617
ea35711c 618 if (remote_debug)
1385f66c
PA
619 fprintf_unfiltered (gdb_stdlog,
620 "gdbsim_create_inferior: exec_file \"%s\", args \"%s\"\n",
621 (exec_file ? exec_file : "(NULL)"),
622 args);
c906108c 623
db04efe6 624 if (ptid_equal (inferior_ptid, sim_data->remote_sim_ptid))
7d85a9c0 625 gdbsim_kill (target);
c906108c
SS
626 remove_breakpoints ();
627 init_wait_for_inferior ();
628
629 if (exec_file != NULL)
630 {
c5aa993b 631 len = strlen (exec_file) + 1 + strlen (args) + 1 + /*slop */ 10;
c906108c
SS
632 arg_buf = (char *) alloca (len);
633 arg_buf[0] = '\0';
634 strcat (arg_buf, exec_file);
635 strcat (arg_buf, " ");
636 strcat (arg_buf, args);
d1a41061 637 argv = gdb_buildargv (arg_buf);
7a292a7a 638 make_cleanup_freeargv (argv);
c906108c
SS
639 }
640 else
641 argv = NULL;
ddd60447 642
2a7c8fd5
AB
643 if (!have_inferiors ())
644 init_thread_list ();
645
ddd60447
MF
646 if (sim_create_inferior (sim_data->gdbsim_desc, exec_bfd, argv, env)
647 != SIM_RC_OK)
648 error (_("Unable to create sim inferior."));
c906108c 649
db04efe6 650 inferior_ptid = sim_data->remote_sim_ptid;
20176d8f 651 inferior_appeared (current_inferior (), ptid_get_pid (inferior_ptid));
9de2bdd7
PA
652 add_thread_silent (inferior_ptid);
653
0df8b418
MS
654 insert_breakpoints (); /* Needed to get correct instruction
655 in cache. */
c906108c
SS
656
657 clear_proceed_status ();
c906108c
SS
658}
659
660/* The open routine takes the rest of the parameters from the command,
661 and (if successful) pushes a new target onto the stack.
662 Targets should supply this routine, if only to provide an error message. */
0df8b418 663/* Called when selecting the simulator. E.g. (gdb) target sim name. */
c906108c
SS
664
665static void
fba45db2 666gdbsim_open (char *args, int from_tty)
c906108c
SS
667{
668 int len;
669 char *arg_buf;
db04efe6
KB
670 struct sim_inferior_data *sim_data;
671 SIM_DESC gdbsim_desc;
c906108c 672
ea35711c 673 if (remote_debug)
1385f66c
PA
674 fprintf_unfiltered (gdb_stdlog,
675 "gdbsim_open: args \"%s\"\n", args ? args : "(null)");
c906108c 676
db04efe6
KB
677 /* Ensure that the sim target is not on the target stack. This is
678 necessary, because if it is on the target stack, the call to
679 push_target below will invoke sim_close(), thus freeing various
680 state (including a sim instance) that we allocate prior to
681 invoking push_target(). We want to delay the push_target()
682 operation until after we complete those operations which could
683 error out. */
684 if (gdbsim_is_open)
c906108c
SS
685 unpush_target (&gdbsim_ops);
686
c5aa993b 687 len = (7 + 1 /* gdbsim */
c906108c
SS
688 + strlen (" -E little")
689 + strlen (" --architecture=xxxxxxxxxx")
f4b8c29b 690 + strlen (" --sysroot=") + strlen (gdb_sysroot) +
c906108c 691 + (args ? strlen (args) : 0)
c5aa993b 692 + 50) /* slack */ ;
c906108c 693 arg_buf = (char *) alloca (len);
c5aa993b 694 strcpy (arg_buf, "gdbsim"); /* 7 */
b6d373df 695 /* Specify the byte order for the target when it is explicitly
0df8b418 696 specified by the user (not auto detected). */
b6d373df 697 switch (selected_byte_order ())
c906108c 698 {
a8cf2722
AC
699 case BFD_ENDIAN_BIG:
700 strcat (arg_buf, " -E big");
701 break;
702 case BFD_ENDIAN_LITTLE:
703 strcat (arg_buf, " -E little");
704 break;
705 case BFD_ENDIAN_UNKNOWN:
706 break;
c906108c
SS
707 }
708 /* Specify the architecture of the target when it has been
709 explicitly specified */
a8cf2722 710 if (selected_architecture_name () != NULL)
c906108c
SS
711 {
712 strcat (arg_buf, " --architecture=");
a8cf2722 713 strcat (arg_buf, selected_architecture_name ());
c906108c 714 }
f4b8c29b
MF
715 /* Pass along gdb's concept of the sysroot. */
716 strcat (arg_buf, " --sysroot=");
717 strcat (arg_buf, gdb_sysroot);
c906108c
SS
718 /* finally, any explicit args */
719 if (args)
720 {
c5aa993b 721 strcat (arg_buf, " "); /* 1 */
c906108c
SS
722 strcat (arg_buf, args);
723 }
db04efe6 724 sim_argv = gdb_buildargv (arg_buf);
c906108c
SS
725
726 init_callbacks ();
db04efe6 727 gdbsim_desc = sim_open (SIM_OPEN_DEBUG, &gdb_callback, exec_bfd, sim_argv);
c906108c
SS
728
729 if (gdbsim_desc == 0)
db04efe6
KB
730 {
731 freeargv (sim_argv);
732 sim_argv = NULL;
733 error (_("unable to create simulator instance"));
734 }
735
736 /* Reset the pid numberings for this batch of sim instances. */
737 next_pid = INITIAL_PID;
738
739 /* Allocate the inferior data, but do not allocate a sim instance
740 since we've already just done that. */
0df8b418
MS
741 sim_data = get_sim_inferior_data (current_inferior (),
742 SIM_INSTANCE_NOT_NEEDED);
db04efe6
KB
743
744 sim_data->gdbsim_desc = gdbsim_desc;
c906108c
SS
745
746 push_target (&gdbsim_ops);
c906108c 747 printf_filtered ("Connected to the simulator.\n");
52bb452f
DJ
748
749 /* There's nothing running after "target sim" or "load"; not until
750 "run". */
751 inferior_ptid = null_ptid;
db04efe6
KB
752
753 gdbsim_is_open = 1;
754}
755
756/* Callback for iterate_over_inferiors. Called (indirectly) by
757 gdbsim_close(). */
758
759static int
760gdbsim_close_inferior (struct inferior *inf, void *arg)
761{
762 struct sim_inferior_data *sim_data = inferior_data (inf,
763 sim_inferior_data_key);
764 if (sim_data != NULL)
765 {
766 ptid_t ptid = sim_data->remote_sim_ptid;
767
768 sim_inferior_data_cleanup (inf, sim_data);
769 set_inferior_data (inf, sim_inferior_data_key, NULL);
770
771 /* Having a ptid allocated and stored in remote_sim_ptid does
0df8b418 772 not mean that a corresponding inferior was ever created.
db04efe6
KB
773 Thus we need to verify the existence of an inferior using the
774 pid in question before setting inferior_ptid via
775 switch_to_thread() or mourning the inferior. */
776 if (find_inferior_pid (ptid_get_pid (ptid)) != NULL)
777 {
778 switch_to_thread (ptid);
779 generic_mourn_inferior ();
780 }
781 }
782
783 return 0;
c906108c
SS
784}
785
0df8b418 786/* Close out all files and local state before this target loses control. */
c906108c
SS
787
788static void
460014f5 789gdbsim_close (void)
c906108c 790{
db04efe6
KB
791 struct sim_inferior_data *sim_data
792 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
793
ea35711c 794 if (remote_debug)
1385f66c 795 fprintf_unfiltered (gdb_stdlog, "gdbsim_close\n");
c906108c 796
db04efe6 797 iterate_over_inferiors (gdbsim_close_inferior, NULL);
c906108c 798
db04efe6 799 if (sim_argv != NULL)
c906108c 800 {
db04efe6
KB
801 freeargv (sim_argv);
802 sim_argv = NULL;
c906108c
SS
803 }
804
805 end_callbacks ();
db04efe6
KB
806
807 gdbsim_is_open = 0;
c906108c
SS
808}
809
810/* Takes a program previously attached to and detaches it.
811 The program may resume execution (some targets do, some don't) and will
812 no longer stop on signals, etc. We better not have left any breakpoints
813 in the program or it'll die when it hits one. ARGS is arguments
814 typed by the user (e.g. a signal to send the process). FROM_TTY
815 says whether to be verbose or not. */
816/* Terminate the open connection to the remote debugger.
817 Use this when you want to detach and do something else with your gdb. */
818
819static void
136d6dae 820gdbsim_detach (struct target_ops *ops, char *args, int from_tty)
c906108c 821{
ea35711c 822 if (remote_debug)
1385f66c 823 fprintf_unfiltered (gdb_stdlog, "gdbsim_detach: args \"%s\"\n", args);
c906108c 824
7fdc1521 825 unpush_target (ops); /* calls gdbsim_close to do the real work */
c906108c
SS
826 if (from_tty)
827 printf_filtered ("Ending simulator %s debugging\n", target_shortname);
828}
c5aa993b 829
c906108c
SS
830/* Resume execution of the target process. STEP says whether to single-step
831 or to run free; SIGGNAL is the signal value (e.g. SIGINT) to be given
832 to the target, or zero for no signal. */
833
db04efe6
KB
834struct resume_data
835{
2ea28649 836 enum gdb_signal siggnal;
db04efe6
KB
837 int step;
838};
839
840static int
841gdbsim_resume_inferior (struct inferior *inf, void *arg)
842{
843 struct sim_inferior_data *sim_data
844 = get_sim_inferior_data (inf, SIM_INSTANCE_NOT_NEEDED);
845 struct resume_data *rd = arg;
846
847 if (sim_data)
848 {
849 sim_data->resume_siggnal = rd->siggnal;
850 sim_data->resume_step = rd->step;
851
852 if (remote_debug)
1385f66c
PA
853 fprintf_unfiltered (gdb_stdlog,
854 _("gdbsim_resume: pid %d, step %d, signal %d\n"),
855 inf->pid, rd->step, rd->siggnal);
db04efe6
KB
856 }
857
858 /* When called from iterate_over_inferiors, a zero return causes the
859 iteration process to proceed until there are no more inferiors to
860 consider. */
861 return 0;
862}
c906108c
SS
863
864static void
2fb89e62 865gdbsim_resume (struct target_ops *ops,
2ea28649 866 ptid_t ptid, int step, enum gdb_signal siggnal)
c906108c 867{
db04efe6
KB
868 struct resume_data rd;
869 struct sim_inferior_data *sim_data
870 = get_sim_inferior_data_by_ptid (ptid, SIM_INSTANCE_NOT_NEEDED);
871
872 rd.siggnal = siggnal;
873 rd.step = step;
874
0df8b418 875 /* We don't access any sim_data members within this function.
db04efe6
KB
876 What's of interest is whether or not the call to
877 get_sim_inferior_data_by_ptid(), above, is able to obtain a
878 non-NULL pointer. If it managed to obtain a non-NULL pointer, we
879 know we have a single inferior to consider. If it's NULL, we
880 either have multiple inferiors to resume or an error condition. */
881
882 if (sim_data)
883 gdbsim_resume_inferior (find_inferior_pid (ptid_get_pid (ptid)), &rd);
884 else if (ptid_equal (ptid, minus_one_ptid))
885 iterate_over_inferiors (gdbsim_resume_inferior, &rd);
886 else
8a3fe4f8 887 error (_("The program is not being run."));
c906108c
SS
888}
889
890/* Notify the simulator of an asynchronous request to stop.
c5aa993b 891
c906108c
SS
892 The simulator shall ensure that the stop request is eventually
893 delivered to the simulator. If the call is made while the
894 simulator is not running then the stop request is processed when
895 the simulator is next resumed.
896
db04efe6
KB
897 For simulators that do not support this operation, just abort. */
898
899static int
900gdbsim_stop_inferior (struct inferior *inf, void *arg)
901{
902 struct sim_inferior_data *sim_data
903 = get_sim_inferior_data (inf, SIM_INSTANCE_NEEDED);
904
905 if (sim_data)
906 {
907 if (!sim_stop (sim_data->gdbsim_desc))
908 {
909 quit ();
910 }
911 }
912
913 /* When called from iterate_over_inferiors, a zero return causes the
914 iteration process to proceed until there are no more inferiors to
915 consider. */
916 return 0;
917}
c906108c
SS
918
919static void
f9c72d52 920gdbsim_stop (ptid_t ptid)
c906108c 921{
db04efe6
KB
922 struct sim_inferior_data *sim_data;
923
924 if (ptid_equal (ptid, minus_one_ptid))
c906108c 925 {
db04efe6
KB
926 iterate_over_inferiors (gdbsim_stop_inferior, NULL);
927 }
928 else
929 {
930 struct inferior *inf = find_inferior_pid (ptid_get_pid (ptid));
931
932 if (inf == NULL)
0df8b418
MS
933 error (_("Can't stop pid %d. No inferior found."),
934 ptid_get_pid (ptid));
db04efe6
KB
935
936 gdbsim_stop_inferior (inf, NULL);
c906108c
SS
937 }
938}
939
940/* GDB version of os_poll_quit callback.
8a0ce09a 941 Taken from gdb/util.c - should be in a library. */
c906108c
SS
942
943static int
fba45db2 944gdb_os_poll_quit (host_callback *p)
c906108c 945{
98bbd631
AC
946 if (deprecated_ui_loop_hook != NULL)
947 deprecated_ui_loop_hook (0);
7a292a7a 948
522002f9 949 if (check_quit_flag ()) /* gdb's idea of quit */
c906108c 950 {
522002f9 951 clear_quit_flag (); /* we've stolen it */
c906108c
SS
952 return 1;
953 }
c906108c
SS
954 return 0;
955}
956
957/* Wait for inferior process to do something. Return pid of child,
958 or -1 in case of error; store status through argument pointer STATUS,
0df8b418 959 just as `wait' would. */
c906108c
SS
960
961static void
fba45db2 962gdbsim_cntrl_c (int signo)
c906108c 963{
db04efe6 964 gdbsim_stop (minus_one_ptid);
c906108c
SS
965}
966
39f77062 967static ptid_t
117de6a9 968gdbsim_wait (struct target_ops *ops,
47608cb1 969 ptid_t ptid, struct target_waitstatus *status, int options)
c906108c 970{
db04efe6 971 struct sim_inferior_data *sim_data;
c906108c
SS
972 static RETSIGTYPE (*prev_sigint) ();
973 int sigrc = 0;
974 enum sim_stop reason = sim_running;
975
db04efe6
KB
976 /* This target isn't able to (yet) resume more than one inferior at a time.
977 When ptid is minus_one_ptid, just use the current inferior. If we're
978 given an explicit pid, we'll try to find it and use that instead. */
979 if (ptid_equal (ptid, minus_one_ptid))
0df8b418
MS
980 sim_data = get_sim_inferior_data (current_inferior (),
981 SIM_INSTANCE_NEEDED);
db04efe6
KB
982 else
983 {
984 sim_data = get_sim_inferior_data_by_ptid (ptid, SIM_INSTANCE_NEEDED);
985 if (sim_data == NULL)
986 error (_("Unable to wait for pid %d. Inferior not found."),
987 ptid_get_pid (ptid));
988 inferior_ptid = ptid;
989 }
990
ea35711c 991 if (remote_debug)
1385f66c 992 fprintf_unfiltered (gdb_stdlog, "gdbsim_wait\n");
c906108c
SS
993
994#if defined (HAVE_SIGACTION) && defined (SA_RESTART)
995 {
996 struct sigaction sa, osa;
997 sa.sa_handler = gdbsim_cntrl_c;
998 sigemptyset (&sa.sa_mask);
999 sa.sa_flags = 0;
1000 sigaction (SIGINT, &sa, &osa);
1001 prev_sigint = osa.sa_handler;
1002 }
1003#else
1004 prev_sigint = signal (SIGINT, gdbsim_cntrl_c);
1005#endif
db04efe6
KB
1006 sim_resume (sim_data->gdbsim_desc, sim_data->resume_step,
1007 sim_data->resume_siggnal);
1008
c906108c 1009 signal (SIGINT, prev_sigint);
db04efe6 1010 sim_data->resume_step = 0;
c906108c 1011
db04efe6 1012 sim_stop_reason (sim_data->gdbsim_desc, &reason, &sigrc);
c906108c
SS
1013
1014 switch (reason)
1015 {
1016 case sim_exited:
1017 status->kind = TARGET_WAITKIND_EXITED;
1018 status->value.integer = sigrc;
1019 break;
1020 case sim_stopped:
1021 switch (sigrc)
1022 {
a493e3e2 1023 case GDB_SIGNAL_ABRT:
c906108c
SS
1024 quit ();
1025 break;
a493e3e2
PA
1026 case GDB_SIGNAL_INT:
1027 case GDB_SIGNAL_TRAP:
c906108c
SS
1028 default:
1029 status->kind = TARGET_WAITKIND_STOPPED;
aba6488e 1030 status->value.sig = sigrc;
c906108c
SS
1031 break;
1032 }
1033 break;
1034 case sim_signalled:
1035 status->kind = TARGET_WAITKIND_SIGNALLED;
aba6488e 1036 status->value.sig = sigrc;
c906108c
SS
1037 break;
1038 case sim_running:
1039 case sim_polling:
0df8b418 1040 /* FIXME: Is this correct? */
c906108c
SS
1041 break;
1042 }
1043
39f77062 1044 return inferior_ptid;
c906108c
SS
1045}
1046
1047/* Get ready to modify the registers array. On machines which store
1048 individual registers, this doesn't need to do anything. On machines
1049 which store all the registers in one fell swoop, this makes sure
1050 that registers contains all the registers from the program being
1051 debugged. */
1052
1053static void
316f2060 1054gdbsim_prepare_to_store (struct regcache *regcache)
c906108c 1055{
0df8b418 1056 /* Do nothing, since we can store individual regs. */
c906108c
SS
1057}
1058
146ec4db
PA
1059/* Helper for gdbsim_xfer_partial that handles memory transfers.
1060 Arguments are like target_xfer_partial. */
d93bce06 1061
146ec4db
PA
1062static LONGEST
1063gdbsim_xfer_memory (struct target_ops *target,
1064 gdb_byte *readbuf, const gdb_byte *writebuf,
1065 ULONGEST memaddr, LONGEST len)
c906108c 1066{
db04efe6
KB
1067 struct sim_inferior_data *sim_data
1068 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
1069
0c012db1
KB
1070 /* If this target doesn't have memory yet, return 0 causing the
1071 request to be passed to a lower target, hopefully an exec
1072 file. */
1073 if (!target->to_has_memory (target))
52bb452f
DJ
1074 return 0;
1075
db04efe6 1076 if (!sim_data->program_loaded)
8a3fe4f8 1077 error (_("No program loaded."));
c906108c 1078
db04efe6
KB
1079 /* Note that we obtained the sim_data pointer above using
1080 SIM_INSTANCE_NOT_NEEDED. We do this so that we don't needlessly
1081 allocate a sim instance prior to loading a program. If we
1082 get to this point in the code though, gdbsim_desc should be
1083 non-NULL. (Note that a sim instance is needed in order to load
1084 the program...) */
1085 gdb_assert (sim_data->gdbsim_desc != NULL);
1086
ea35711c 1087 if (remote_debug)
fcde0081 1088 fprintf_unfiltered (gdb_stdlog,
146ec4db
PA
1089 "gdbsim_xfer_memory: readbuf %s, writebuf %s, "
1090 "memaddr %s, len %s\n",
1091 host_address_to_string (readbuf),
1092 host_address_to_string (writebuf),
fcde0081 1093 paddress (target_gdbarch (), memaddr),
146ec4db 1094 plongest (len));
c906108c 1095
146ec4db 1096 if (writebuf)
c906108c 1097 {
fcde0081 1098 if (remote_debug && len > 0)
146ec4db
PA
1099 dump_mem (writebuf, len);
1100 len = sim_write (sim_data->gdbsim_desc, memaddr, writebuf, len);
c906108c 1101 }
c5aa993b 1102 else
c906108c 1103 {
146ec4db 1104 len = sim_read (sim_data->gdbsim_desc, memaddr, readbuf, len);
ea35711c 1105 if (remote_debug && len > 0)
146ec4db 1106 dump_mem (readbuf, len);
c5aa993b 1107 }
c906108c
SS
1108 return len;
1109}
1110
146ec4db
PA
1111/* Target to_xfer_partial implementation. */
1112
1113static LONGEST
1114gdbsim_xfer_partial (struct target_ops *ops, enum target_object object,
1115 const char *annex, gdb_byte *readbuf,
1116 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
1117{
1118 switch (object)
1119 {
1120 case TARGET_OBJECT_MEMORY:
1121 return gdbsim_xfer_memory (ops, readbuf, writebuf, offset, len);
1122
1123 default:
1124 return -1;
1125 }
1126}
1127
c906108c 1128static void
fba45db2 1129gdbsim_files_info (struct target_ops *target)
c906108c 1130{
db04efe6
KB
1131 struct sim_inferior_data *sim_data
1132 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
0d18d720 1133 const char *file = "nothing";
c906108c
SS
1134
1135 if (exec_bfd)
1136 file = bfd_get_filename (exec_bfd);
1137
ea35711c 1138 if (remote_debug)
1385f66c 1139 fprintf_unfiltered (gdb_stdlog, "gdbsim_files_info: file \"%s\"\n", file);
c906108c
SS
1140
1141 if (exec_bfd)
1142 {
1385f66c
PA
1143 fprintf_unfiltered (gdb_stdlog, "\tAttached to %s running program %s\n",
1144 target_shortname, file);
db04efe6 1145 sim_info (sim_data->gdbsim_desc, 0);
c906108c
SS
1146 }
1147}
1148
1149/* Clear the simulator's notion of what the break points are. */
1150
1151static void
3c8b2eda 1152gdbsim_mourn_inferior (struct target_ops *target)
c5aa993b 1153{
db04efe6
KB
1154 struct sim_inferior_data *sim_data
1155 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
1156
ea35711c 1157 if (remote_debug)
1385f66c 1158 fprintf_unfiltered (gdb_stdlog, "gdbsim_mourn_inferior:\n");
c906108c
SS
1159
1160 remove_breakpoints ();
1161 generic_mourn_inferior ();
db04efe6 1162 delete_thread_silent (sim_data->remote_sim_ptid);
c906108c
SS
1163}
1164
c906108c
SS
1165/* Pass the command argument through to the simulator verbatim. The
1166 simulator must do any command interpretation work. */
1167
1168void
fba45db2 1169simulator_command (char *args, int from_tty)
c906108c 1170{
db04efe6
KB
1171 struct sim_inferior_data *sim_data;
1172
1173 /* We use inferior_data() instead of get_sim_inferior_data() here in
1174 order to avoid attaching a sim_inferior_data struct to an
1175 inferior unnecessarily. The reason we take such care here is due
1176 to the fact that this function, simulator_command(), may be called
1177 even when the sim target is not active. If we were to use
1178 get_sim_inferior_data() here, it is possible that this call would
1179 be made either prior to gdbsim_open() or after gdbsim_close(),
1180 thus allocating memory that would not be garbage collected until
1181 the ultimate destruction of the associated inferior. */
1182
1183 sim_data = inferior_data (current_inferior (), sim_inferior_data_key);
1184 if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
c906108c
SS
1185 {
1186
1187 /* PREVIOUSLY: The user may give a command before the simulator
1188 is opened. [...] (??? assuming of course one wishes to
1189 continue to allow commands to be sent to unopened simulators,
0df8b418 1190 which isn't entirely unreasonable). */
c906108c
SS
1191
1192 /* The simulator is a builtin abstraction of a remote target.
1193 Consistent with that model, access to the simulator, via sim
1194 commands, is restricted to the period when the channel to the
0df8b418 1195 simulator is open. */
c906108c 1196
8a3fe4f8 1197 error (_("Not connected to the simulator target"));
c906108c
SS
1198 }
1199
db04efe6 1200 sim_do_command (sim_data->gdbsim_desc, args);
c906108c
SS
1201
1202 /* Invalidate the register cache, in case the simulator command does
0df8b418 1203 something funny. */
c5aa993b 1204 registers_changed ();
c906108c
SS
1205}
1206
34370865 1207static VEC (char_ptr) *
3cb2ab1a
SE
1208sim_command_completer (struct cmd_list_element *ignore, const char *text,
1209 const char *word)
56a9aa1d
MF
1210{
1211 struct sim_inferior_data *sim_data;
34370865
JB
1212 char **tmp;
1213 int i;
09d5912c 1214 VEC (char_ptr) *result = NULL;
56a9aa1d
MF
1215
1216 sim_data = inferior_data (current_inferior (), sim_inferior_data_key);
1217 if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
1218 return NULL;
1219
34370865
JB
1220 tmp = sim_complete_command (sim_data->gdbsim_desc, text, word);
1221 if (tmp == NULL)
1222 return NULL;
1223
1224 /* Transform the array into a VEC, and then free the array. */
1225 for (i = 0; tmp[i] != NULL; i++)
1226 VEC_safe_push (char_ptr, result, tmp[i]);
1227 xfree (tmp);
1228
1229 return result;
56a9aa1d
MF
1230}
1231
9de2bdd7
PA
1232/* Check to see if a thread is still alive. */
1233
1234static int
28439f5e 1235gdbsim_thread_alive (struct target_ops *ops, ptid_t ptid)
9de2bdd7 1236{
db04efe6
KB
1237 struct sim_inferior_data *sim_data
1238 = get_sim_inferior_data_by_ptid (ptid, SIM_INSTANCE_NOT_NEEDED);
1239
1240 if (sim_data == NULL)
1241 return 0;
1242
1243 if (ptid_equal (ptid, sim_data->remote_sim_ptid))
9de2bdd7
PA
1244 /* The simulators' task is always alive. */
1245 return 1;
1246
1247 return 0;
1248}
1249
1250/* Convert a thread ID to a string. Returns the string in a static
1251 buffer. */
1252
1253static char *
117de6a9 1254gdbsim_pid_to_str (struct target_ops *ops, ptid_t ptid)
9de2bdd7 1255{
9de2bdd7
PA
1256 return normal_pid_to_str (ptid);
1257}
1258
0c012db1
KB
1259/* Simulator memory may be accessed after the program has been loaded. */
1260
b261e0c5 1261static int
0c012db1
KB
1262gdbsim_has_all_memory (struct target_ops *ops)
1263{
1264 struct sim_inferior_data *sim_data
1265 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
1266
1267 if (!sim_data->program_loaded)
1268 return 0;
1269
1270 return 1;
1271}
1272
b261e0c5 1273static int
0c012db1
KB
1274gdbsim_has_memory (struct target_ops *ops)
1275{
1276 struct sim_inferior_data *sim_data
1277 = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED);
1278
1279 if (!sim_data->program_loaded)
1280 return 0;
1281
1282 return 1;
1283}
1284
0df8b418 1285/* Define the target subroutine names. */
c906108c 1286
c5aa993b
JM
1287struct target_ops gdbsim_ops;
1288
1289static void
1290init_gdbsim_ops (void)
1291{
1292 gdbsim_ops.to_shortname = "sim";
1293 gdbsim_ops.to_longname = "simulator";
1294 gdbsim_ops.to_doc = "Use the compiled-in simulator.";
1295 gdbsim_ops.to_open = gdbsim_open;
1296 gdbsim_ops.to_close = gdbsim_close;
c5aa993b 1297 gdbsim_ops.to_detach = gdbsim_detach;
c5aa993b
JM
1298 gdbsim_ops.to_resume = gdbsim_resume;
1299 gdbsim_ops.to_wait = gdbsim_wait;
c5aa993b
JM
1300 gdbsim_ops.to_fetch_registers = gdbsim_fetch_register;
1301 gdbsim_ops.to_store_registers = gdbsim_store_register;
1302 gdbsim_ops.to_prepare_to_store = gdbsim_prepare_to_store;
146ec4db 1303 gdbsim_ops.to_xfer_partial = gdbsim_xfer_partial;
c5aa993b 1304 gdbsim_ops.to_files_info = gdbsim_files_info;
8181d85f
DJ
1305 gdbsim_ops.to_insert_breakpoint = memory_insert_breakpoint;
1306 gdbsim_ops.to_remove_breakpoint = memory_remove_breakpoint;
c5aa993b
JM
1307 gdbsim_ops.to_kill = gdbsim_kill;
1308 gdbsim_ops.to_load = gdbsim_load;
c5aa993b 1309 gdbsim_ops.to_create_inferior = gdbsim_create_inferior;
c5aa993b 1310 gdbsim_ops.to_mourn_inferior = gdbsim_mourn_inferior;
c5aa993b 1311 gdbsim_ops.to_stop = gdbsim_stop;
9de2bdd7
PA
1312 gdbsim_ops.to_thread_alive = gdbsim_thread_alive;
1313 gdbsim_ops.to_pid_to_str = gdbsim_pid_to_str;
c5aa993b 1314 gdbsim_ops.to_stratum = process_stratum;
0c012db1
KB
1315 gdbsim_ops.to_has_all_memory = gdbsim_has_all_memory;
1316 gdbsim_ops.to_has_memory = gdbsim_has_memory;
c35b1492
PA
1317 gdbsim_ops.to_has_stack = default_child_has_stack;
1318 gdbsim_ops.to_has_registers = default_child_has_registers;
1319 gdbsim_ops.to_has_execution = default_child_has_execution;
c5aa993b 1320 gdbsim_ops.to_magic = OPS_MAGIC;
c906108c
SS
1321}
1322
1323void
fba45db2 1324_initialize_remote_sim (void)
c906108c 1325{
56a9aa1d
MF
1326 struct cmd_list_element *c;
1327
c5aa993b 1328 init_gdbsim_ops ();
c906108c
SS
1329 add_target (&gdbsim_ops);
1330
56a9aa1d
MF
1331 c = add_com ("sim", class_obscure, simulator_command,
1332 _("Send a command to the simulator."));
1333 set_cmd_completer (c, sim_command_completer);
9de2bdd7 1334
db04efe6 1335 sim_inferior_data_key
c5d9b215 1336 = register_inferior_data_with_cleanup (NULL, sim_inferior_data_cleanup);
c906108c 1337}
This page took 1.392659 seconds and 4 git commands to generate.