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