Automatic Copyright Year update after running gdb/copyright.py
[deliverable/binutils-gdb.git] / sim / cris / sim-if.c
CommitLineData
f6bcefef 1/* Main simulator entry points specific to the CRIS.
88b9d363 2 Copyright (C) 2004-2022 Free Software Foundation, Inc.
f6bcefef
HPN
3 Contributed by Axis Communications.
4
5This file is part of the GNU simulators.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
4744ac1b
JB
9the Free Software Foundation; either version 3 of the License, or
10(at your option) any later version.
f6bcefef
HPN
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
4744ac1b
JB
17You should have received a copy of the GNU General Public License
18along with this program. If not, see <http://www.gnu.org/licenses/>. */
f6bcefef
HPN
19
20/* Based on the fr30 file, mixing in bits from the i960 and pruning of
21 dead code. */
22
6df01ab8
MF
23/* This must come before any other includes. */
24#include "defs.h"
25
f6bcefef
HPN
26#include "libiberty.h"
27#include "bfd.h"
80e5c09e 28#include "elf-bfd.h"
f6bcefef
HPN
29
30#include "sim-main.h"
f6bcefef 31#include <stdlib.h>
c10b3605 32#include <errno.h>
e82a36be 33#include <unistd.h>
f6bcefef 34#include "sim-options.h"
072d63a8 35#include "sim-hw.h"
f6bcefef 36#include "dis-asm.h"
c5a2e012 37#include "environ.h"
f6bcefef 38
f6bcefef
HPN
39/* Used with get_progbounds to find out how much memory is needed for the
40 program. We don't want to allocate more, since that could mask
41 invalid memory accesses program bugs. */
42struct progbounds {
43 USI startmem;
44 USI endmem;
80e5c09e
HPN
45 USI end_loadmem;
46 USI start_nonloadmem;
f6bcefef
HPN
47};
48
49static void free_state (SIM_DESC);
80e5c09e 50static void get_progbounds_iterator (bfd *, asection *, void *);
f6bcefef
HPN
51static SIM_RC cris_option_handler (SIM_DESC, sim_cpu *, int, char *, int);
52
53/* Since we don't build the cgen-opcode table, we use the old
54 disassembler. */
55static CGEN_DISASSEMBLER cris_disassemble_insn;
56
57/* By default, we set up stack and environment variables like the Linux
58 kernel. */
59static char cris_bare_iron = 0;
60
61/* Whether 0x9000000xx have simulator-specific meanings. */
aad3b3cb 62char cris_have_900000xxif = 0;
f6bcefef 63
c10b3605
HPN
64/* Used to optionally override the default start address of the
65 simulation. */
66static USI cris_start_address = 0xffffffffu;
67
68/* Used to optionally add offsets to the loaded image and its start
69 address. (Not used for the interpreter of dynamically loaded
70 programs or the DSO:s.) */
71static int cris_program_offset = 0;
72
466b1d33
HPN
73/* What to do when we face a more or less unknown syscall. */
74enum cris_unknown_syscall_action_type cris_unknown_syscall_action
75 = CRIS_USYSC_MSG_STOP;
76
f6bcefef
HPN
77/* CRIS-specific options. */
78typedef enum {
79 OPTION_CRIS_STATS = OPTION_START,
80 OPTION_CRIS_TRACE,
81 OPTION_CRIS_NAKED,
c10b3605
HPN
82 OPTION_CRIS_PROGRAM_OFFSET,
83 OPTION_CRIS_STARTADDR,
f6bcefef 84 OPTION_CRIS_900000XXIF,
466b1d33 85 OPTION_CRIS_UNKNOWN_SYSCALL
f6bcefef
HPN
86} CRIS_OPTIONS;
87
88static const OPTION cris_options[] =
89{
90 { {"cris-cycles", required_argument, NULL, OPTION_CRIS_STATS},
91 '\0', "basic|unaligned|schedulable|all",
92 "Dump execution statistics",
93 cris_option_handler, NULL },
94 { {"cris-trace", required_argument, NULL, OPTION_CRIS_TRACE},
95 '\0', "basic",
96 "Emit trace information while running",
97 cris_option_handler, NULL },
98 { {"cris-naked", no_argument, NULL, OPTION_CRIS_NAKED},
99 '\0', NULL, "Don't set up stack and environment",
100 cris_option_handler, NULL },
101 { {"cris-900000xx", no_argument, NULL, OPTION_CRIS_900000XXIF},
102 '\0', NULL, "Define addresses at 0x900000xx with simulator semantics",
103 cris_option_handler, NULL },
466b1d33
HPN
104 { {"cris-unknown-syscall", required_argument, NULL,
105 OPTION_CRIS_UNKNOWN_SYSCALL},
106 '\0', "stop|enosys|enosys-quiet", "Action at an unknown system call",
107 cris_option_handler, NULL },
c10b3605
HPN
108 { {"cris-program-offset", required_argument, NULL,
109 OPTION_CRIS_PROGRAM_OFFSET},
110 '\0', "OFFSET",
111 "Offset image addresses and default start address of a program",
112 cris_option_handler },
113 { {"cris-start-address", required_argument, NULL, OPTION_CRIS_STARTADDR},
114 '\0', "ADDRESS", "Set start address",
115 cris_option_handler },
f6bcefef
HPN
116 { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL, NULL }
117};
118\f
f6bcefef
HPN
119/* Handle CRIS-specific options. */
120
121static SIM_RC
122cris_option_handler (SIM_DESC sd, sim_cpu *cpu ATTRIBUTE_UNUSED, int opt,
123 char *arg, int is_command ATTRIBUTE_UNUSED)
124{
125 /* The options are CRIS-specific, but cpu-specific option-handling is
126 broken; required to being with "--cpu0-". We store the flags in an
127 unused field in the global state structure and move the flags over
128 to the module-specific CPU data when we store things in the
129 cpu-specific structure. */
130 char *tracefp = STATE_TRACE_FLAGS (sd);
c10b3605 131 char *chp = arg;
f6bcefef
HPN
132
133 switch ((CRIS_OPTIONS) opt)
134 {
135 case OPTION_CRIS_STATS:
136 if (strcmp (arg, "basic") == 0)
137 *tracefp = FLAG_CRIS_MISC_PROFILE_SIMPLE;
138 else if (strcmp (arg, "unaligned") == 0)
139 *tracefp
140 = (FLAG_CRIS_MISC_PROFILE_UNALIGNED
141 | FLAG_CRIS_MISC_PROFILE_SIMPLE);
142 else if (strcmp (arg, "schedulable") == 0)
143 *tracefp
144 = (FLAG_CRIS_MISC_PROFILE_SCHEDULABLE
145 | FLAG_CRIS_MISC_PROFILE_SIMPLE);
146 else if (strcmp (arg, "all") == 0)
147 *tracefp = FLAG_CRIS_MISC_PROFILE_ALL;
148 else
149 {
466b1d33
HPN
150 /* Beware; the framework does not handle the error case;
151 we have to do it ourselves. */
152 sim_io_eprintf (sd, "Unknown option `--cris-cycles=%s'\n", arg);
f6bcefef
HPN
153 return SIM_RC_FAIL;
154 }
155 break;
156
157 case OPTION_CRIS_TRACE:
158 if (strcmp (arg, "basic") == 0)
159 *tracefp |= FLAG_CRIS_MISC_PROFILE_XSIM_TRACE;
160 else
161 {
162 sim_io_eprintf (sd, "Unknown option `--cris-trace=%s'\n", arg);
163 return SIM_RC_FAIL;
164 }
165 break;
166
167 case OPTION_CRIS_NAKED:
168 cris_bare_iron = 1;
169 break;
170
171 case OPTION_CRIS_900000XXIF:
172 cris_have_900000xxif = 1;
173 break;
174
c10b3605
HPN
175 case OPTION_CRIS_STARTADDR:
176 errno = 0;
177 cris_start_address = (USI) strtoul (chp, &chp, 0);
178
179 if (errno != 0 || *chp != 0)
180 {
181 sim_io_eprintf (sd, "Invalid option `--cris-start-address=%s'\n",
182 arg);
183 return SIM_RC_FAIL;
184 }
185 break;
186
187 case OPTION_CRIS_PROGRAM_OFFSET:
188 errno = 0;
189 cris_program_offset = (int) strtol (chp, &chp, 0);
190
191 if (errno != 0 || *chp != 0)
192 {
193 sim_io_eprintf (sd, "Invalid option `--cris-program-offset=%s'\n",
194 arg);
195 return SIM_RC_FAIL;
196 }
197 break;
198
466b1d33
HPN
199 case OPTION_CRIS_UNKNOWN_SYSCALL:
200 if (strcmp (arg, "enosys") == 0)
201 cris_unknown_syscall_action = CRIS_USYSC_MSG_ENOSYS;
202 else if (strcmp (arg, "enosys-quiet") == 0)
203 cris_unknown_syscall_action = CRIS_USYSC_QUIET_ENOSYS;
204 else if (strcmp (arg, "stop") == 0)
205 cris_unknown_syscall_action = CRIS_USYSC_MSG_STOP;
206 else
207 {
208 sim_io_eprintf (sd, "Unknown option `--cris-unknown-syscall=%s'\n",
209 arg);
210 return SIM_RC_FAIL;
211 }
212 break;
213
f6bcefef
HPN
214 default:
215 /* We'll actually never get here; the caller handles the error
216 case. */
217 sim_io_eprintf (sd, "Unknown option `%s'\n", arg);
218 return SIM_RC_FAIL;
219 }
220
221 /* Imply --profile-model=on. */
222 return sim_profile_set_option (sd, "-model", PROFILE_MODEL_IDX, "on");
223}
224
80e5c09e
HPN
225/* An ELF-specific simplified ../common/sim-load.c:sim_load_file,
226 using the program headers, not sections, in order to make sure that
227 the program headers themeselves are also loaded. The caller is
228 responsible for asserting that ABFD is an ELF file. */
229
230static bfd_boolean
231cris_load_elf_file (SIM_DESC sd, struct bfd *abfd, sim_write_fn do_write)
232{
233 Elf_Internal_Phdr *phdr;
234 int n_hdrs;
235 int i;
236 bfd_boolean verbose = STATE_OPEN_KIND (sd) == SIM_OPEN_DEBUG;
80e5c09e
HPN
237
238 phdr = elf_tdata (abfd)->phdr;
239 n_hdrs = elf_elfheader (abfd)->e_phnum;
240
241 /* We're only interested in PT_LOAD; all necessary information
242 should be covered by that. */
243 for (i = 0; i < n_hdrs; i++)
244 {
245 bfd_byte *buf;
246 bfd_vma lma = STATE_LOAD_AT_LMA_P (sd)
247 ? phdr[i].p_paddr : phdr[i].p_vaddr;
248
249 if (phdr[i].p_type != PT_LOAD)
250 continue;
251
252 buf = xmalloc (phdr[i].p_filesz);
253
254 if (verbose)
5ee0bc23
MF
255 sim_io_printf (sd,
256 "Loading segment at 0x%" BFD_VMA_FMT "x, size 0x%lx\n",
b3fbb288 257 lma, phdr[i].p_filesz);
80e5c09e
HPN
258
259 if (bfd_seek (abfd, phdr[i].p_offset, SEEK_SET) != 0
260 || (bfd_bread (buf, phdr[i].p_filesz, abfd) != phdr[i].p_filesz))
261 {
b3fbb288 262 sim_io_eprintf (sd,
5ee0bc23
MF
263 "%s: could not read segment at 0x%" BFD_VMA_FMT "x, "
264 "size 0x%lx\n",
b3fbb288 265 STATE_MY_NAME (sd), lma, phdr[i].p_filesz);
80e5c09e
HPN
266 free (buf);
267 return FALSE;
268 }
269
270 if (do_write (sd, lma, buf, phdr[i].p_filesz) != phdr[i].p_filesz)
271 {
b3fbb288 272 sim_io_eprintf (sd,
5ee0bc23
MF
273 "%s: could not load segment at 0x%" BFD_VMA_FMT "x, "
274 "size 0x%lx\n",
b3fbb288 275 STATE_MY_NAME (sd), lma, phdr[i].p_filesz);
80e5c09e
HPN
276 free (buf);
277 return FALSE;
278 }
279
280 free (buf);
281 }
282
283 return TRUE;
284}
285
f6bcefef
HPN
286/* Cover function of sim_state_free to free the cpu buffers as well. */
287
288static void
289free_state (SIM_DESC sd)
290{
291 if (STATE_MODULES (sd) != NULL)
292 sim_module_uninstall (sd);
293 sim_cpu_free_all (sd);
294 sim_state_free (sd);
295}
296
c10b3605
HPN
297/* Helper struct for cris_set_section_offset_iterator. */
298
299struct offsetinfo
300{
301 SIM_DESC sd;
302 int offset;
303};
304
305/* BFD section iterator to offset the LMA and VMA. */
306
307static void
308cris_set_section_offset_iterator (bfd *abfd, asection *s, void *vp)
309{
310 struct offsetinfo *p = (struct offsetinfo *) vp;
311 SIM_DESC sd = p->sd;
312 int offset = p->offset;
313
fd361982 314 if ((bfd_section_flags (s) & SEC_ALLOC))
c10b3605 315 {
fd361982 316 bfd_vma vma = bfd_section_vma (s);
c10b3605 317
fd361982 318 bfd_set_section_vma (s, vma + offset);
c10b3605
HPN
319 }
320
321 /* This seems clumsy and inaccurate, but let's stick to doing it the
322 same way as sim_analyze_program for consistency. */
fd361982
AM
323 if (strcmp (bfd_section_name (s), ".text") == 0)
324 STATE_TEXT_START (sd) = bfd_section_vma (s);
c10b3605
HPN
325}
326
327/* Adjust the start-address, LMA and VMA of a SD. Must be called
328 after sim_analyze_program. */
329
330static void
331cris_offset_sections (SIM_DESC sd, int offset)
332{
333 bfd_boolean ret;
334 struct bfd *abfd = STATE_PROG_BFD (sd);
335 asection *text;
336 struct offsetinfo oi;
337
338 /* Only happens for usage error. */
339 if (abfd == NULL)
340 return;
341
342 oi.sd = sd;
343 oi.offset = offset;
344
345 bfd_map_over_sections (abfd, cris_set_section_offset_iterator, &oi);
346 ret = bfd_set_start_address (abfd, bfd_get_start_address (abfd) + offset);
347
348 STATE_START_ADDR (sd) = bfd_get_start_address (abfd);
349}
350
80e5c09e
HPN
351/* BFD section iterator to find the highest and lowest allocated and
352 non-allocated section addresses (plus one). */
f6bcefef 353
80e5c09e
HPN
354static void
355get_progbounds_iterator (bfd *abfd ATTRIBUTE_UNUSED, asection *s, void *vp)
f6bcefef
HPN
356{
357 struct progbounds *pbp = (struct progbounds *) vp;
358
fd361982 359 if ((bfd_section_flags (s) & SEC_ALLOC))
f6bcefef 360 {
fd361982
AM
361 bfd_size_type sec_size = bfd_section_size (s);
362 bfd_size_type sec_start = bfd_section_vma (s);
f6bcefef
HPN
363 bfd_size_type sec_end = sec_start + sec_size;
364
365 if (sec_end > pbp->endmem)
366 pbp->endmem = sec_end;
367
368 if (sec_start < pbp->startmem)
369 pbp->startmem = sec_start;
80e5c09e 370
fd361982 371 if ((bfd_section_flags (s) & SEC_LOAD))
80e5c09e
HPN
372 {
373 if (sec_end > pbp->end_loadmem)
374 pbp->end_loadmem = sec_end;
375 }
376 else if (sec_start < pbp->start_nonloadmem)
377 pbp->start_nonloadmem = sec_start;
378 }
379}
380
381/* Get the program boundaries. Because not everything is covered by
382 sections in ELF, notably the program headers, we use the program
383 headers instead. */
384
385static void
386cris_get_progbounds (struct bfd *abfd, struct progbounds *pbp)
387{
388 Elf_Internal_Phdr *phdr;
389 int n_hdrs;
390 int i;
391
392 pbp->startmem = 0xffffffff;
393 pbp->endmem = 0;
394 pbp->end_loadmem = 0;
395 pbp->start_nonloadmem = 0xffffffff;
396
397 /* In case we're ever used for something other than ELF, use the
398 generic method. */
399 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
400 {
401 bfd_map_over_sections (abfd, get_progbounds_iterator, pbp);
402 return;
403 }
404
405 phdr = elf_tdata (abfd)->phdr;
406 n_hdrs = elf_elfheader (abfd)->e_phnum;
407
408 /* We're only interested in PT_LOAD; all necessary information
409 should be covered by that. */
410 for (i = 0; i < n_hdrs; i++)
411 {
412 if (phdr[i].p_type != PT_LOAD)
413 continue;
414
415 if (phdr[i].p_paddr < pbp->startmem)
416 pbp->startmem = phdr[i].p_paddr;
417
418 if (phdr[i].p_paddr + phdr[i].p_memsz > pbp->endmem)
419 pbp->endmem = phdr[i].p_paddr + phdr[i].p_memsz;
420
421 if (phdr[i].p_paddr + phdr[i].p_filesz > pbp->end_loadmem)
422 pbp->end_loadmem = phdr[i].p_paddr + phdr[i].p_filesz;
423
424 if (phdr[i].p_memsz > phdr[i].p_filesz
425 && phdr[i].p_paddr + phdr[i].p_filesz < pbp->start_nonloadmem)
426 pbp->start_nonloadmem = phdr[i].p_paddr + phdr[i].p_filesz;
427 }
428}
429
430/* Parameter communication by static variables, hmm... Oh well, for
431 simplicity. */
432static bfd_vma exec_load_addr;
433static bfd_vma interp_load_addr;
434static bfd_vma interp_start_addr;
435
436/* Supposed to mimic Linux' "NEW_AUX_ENT (AT_PHDR, load_addr + exec->e_phoff)". */
437
438static USI
439aux_ent_phdr (struct bfd *ebfd)
440{
441 return elf_elfheader (ebfd)->e_phoff + exec_load_addr;
442}
443
444/* We just pass on the header info; we don't have our own idea of the
445 program header entry size. */
446
447static USI
448aux_ent_phent (struct bfd *ebfd)
449{
450 return elf_elfheader (ebfd)->e_phentsize;
451}
452
453/* Like "NEW_AUX_ENT(AT_PHNUM, exec->e_phnum)". */
454
455static USI
456aux_ent_phnum (struct bfd *ebfd)
457{
458 return elf_elfheader (ebfd)->e_phnum;
459}
460
461/* Like "NEW_AUX_ENT(AT_BASE, interp_load_addr)". */
462
463static USI
464aux_ent_base (struct bfd *ebfd)
465{
466 return interp_load_addr;
467}
468
469/* Like "NEW_AUX_ENT(AT_ENTRY, exec->e_entry)". */
470
471static USI
472aux_ent_entry (struct bfd *ebfd)
473{
474 ASSERT (elf_elfheader (ebfd)->e_entry == bfd_get_start_address (ebfd));
475 return elf_elfheader (ebfd)->e_entry;
476}
477
478/* Helper for cris_handle_interpreter: like sim_write, but load at
479 interp_load_addr offset. */
480
481static int
072d63a8 482cris_write_interp (SIM_DESC sd, SIM_ADDR mem, const unsigned char *buf, int length)
80e5c09e
HPN
483{
484 return sim_write (sd, mem + interp_load_addr, buf, length);
485}
486
487/* Cater to the presence of an interpreter: load it and set
488 interp_start_addr. Return FALSE if there was an error, TRUE if
489 everything went fine, including an interpreter being absent and
490 the program being in a non-ELF format. */
491
492static bfd_boolean
493cris_handle_interpreter (SIM_DESC sd, struct bfd *abfd)
494{
495 int i, n_hdrs;
80e5c09e
HPN
496 bfd_byte buf[4];
497 char *interp = NULL;
498 struct bfd *ibfd;
499 bfd_boolean ok = FALSE;
500 Elf_Internal_Phdr *phdr;
501
502 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
503 return TRUE;
504
505 phdr = elf_tdata (abfd)->phdr;
506 n_hdrs = aux_ent_phnum (abfd);
507
508 /* Check the program headers for presence of an interpreter. */
509 for (i = 0; i < n_hdrs; i++)
510 {
511 int interplen;
512 bfd_size_type interpsiz, interp_filesiz;
513 struct progbounds interp_bounds;
514
515 if (phdr[i].p_type != PT_INTERP)
516 continue;
517
518 /* Get the name of the interpreter, prepended with the sysroot
519 (empty if absent). */
520 interplen = phdr[i].p_filesz;
521 interp = xmalloc (interplen + strlen (simulator_sysroot));
522 strcpy (interp, simulator_sysroot);
523
524 /* Read in the name. */
525 if (bfd_seek (abfd, phdr[i].p_offset, SEEK_SET) != 0
526 || (bfd_bread (interp + strlen (simulator_sysroot), interplen, abfd)
527 != interplen))
528 goto interpname_failed;
529
530 /* Like Linux, require the string to be 0-terminated. */
531 if (interp[interplen + strlen (simulator_sysroot) - 1] != 0)
532 goto interpname_failed;
533
534 /* Inspect the interpreter. */
535 ibfd = bfd_openr (interp, STATE_TARGET (sd));
536 if (ibfd == NULL)
537 goto interpname_failed;
538
c10b3605 539 /* The interpreter is at least something readable to BFD; make
80e5c09e
HPN
540 sure it's an ELF non-archive file. */
541 if (!bfd_check_format (ibfd, bfd_object)
542 || bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
543 goto interp_failed;
544
545 /* Check the layout of the interpreter. */
546 cris_get_progbounds (ibfd, &interp_bounds);
547
548 /* Round down to pagesize the start page and up the endpage.
549 Don't round the *load and *nonload members. */
550 interp_bounds.startmem &= ~8191;
551 interp_bounds.endmem = (interp_bounds.endmem + 8191) & ~8191;
552
553 /* Until we need a more dynamic solution, assume we can put the
554 interpreter at this fixed location. NB: this is not what
555 happens for Linux 2008-12-28, but it could and might and
556 perhaps should. */
557 interp_load_addr = 0x40000;
558 interpsiz = interp_bounds.endmem - interp_bounds.startmem;
559 interp_filesiz = interp_bounds.end_loadmem - interp_bounds.startmem;
560
561 /* If we have a non-DSO or interpreter starting at the wrong
562 address, bail. */
563 if (interp_bounds.startmem != 0
564 || interpsiz + interp_load_addr >= exec_load_addr)
565 goto interp_failed;
566
567 /* We don't have the API to get the address of a simulator
568 memory area, so we go via a temporary area. Luckily, the
569 interpreter is supposed to be small, less than 0x40000
570 bytes. */
5ee0bc23 571 sim_do_commandf (sd, "memory region 0x%" BFD_VMA_FMT "x,0x%lx",
80e5c09e
HPN
572 interp_load_addr, interpsiz);
573
574 /* Now that memory for the interpreter is defined, load it. */
575 if (!cris_load_elf_file (sd, ibfd, cris_write_interp))
576 goto interp_failed;
577
578 /* It's no use setting STATE_START_ADDR, because it gets
579 overwritten by a sim_analyze_program call in sim_load. Let's
580 just store it locally. */
581 interp_start_addr
582 = (bfd_get_start_address (ibfd)
583 - interp_bounds.startmem + interp_load_addr);
584
585 /* Linux cares only about the first PT_INTERP, so let's ignore
586 the rest. */
587 goto all_done;
f6bcefef 588 }
80e5c09e
HPN
589
590 /* Register R10 should hold 0 at static start (no finifunc), but
591 that's the default, so don't bother. */
592 return TRUE;
593
594 all_done:
595 ok = TRUE;
596
597 interp_failed:
598 bfd_close (ibfd);
599
600 interpname_failed:
601 if (!ok)
602 sim_io_eprintf (sd,
603 "%s: could not load ELF interpreter `%s' for program `%s'\n",
604 STATE_MY_NAME (sd),
605 interp == NULL ? "(what's-its-name)" : interp,
606 bfd_get_filename (abfd));
607 free (interp);
608 return ok;
f6bcefef
HPN
609}
610
1c636da0
MF
611extern const SIM_MACH * const cris_sim_machs[];
612
f6bcefef
HPN
613/* Create an instance of the simulator. */
614
615SIM_DESC
616sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
2e3d4f4d 617 char * const *argv)
f6bcefef
HPN
618{
619 char c;
620 int i;
621 USI startmem = 0;
622 USI endmem = CRIS_DEFAULT_MEM_SIZE;
623 USI endbrk = endmem;
624 USI stack_low = 0;
625 SIM_DESC sd = sim_state_alloc (kind, callback);
626
80e5c09e
HPN
627 static const struct auxv_entries_s
628 {
629 bfd_byte id;
630 USI (*efn) (struct bfd *ebfd);
631 USI val;
632 } auxv_entries[] =
633 {
a3d4b83b
HPN
634#define AUX_ENT(a, b) {a, NULL, b}
635#define AUX_ENTF(a, f) {a, f, 0}
80e5c09e
HPN
636 AUX_ENT (AT_HWCAP, 0),
637 AUX_ENT (AT_PAGESZ, 8192),
638 AUX_ENT (AT_CLKTCK, 100),
a3d4b83b
HPN
639 AUX_ENTF (AT_PHDR, aux_ent_phdr),
640 AUX_ENTF (AT_PHENT, aux_ent_phent),
641 AUX_ENTF (AT_PHNUM, aux_ent_phnum),
642 AUX_ENTF (AT_BASE, aux_ent_base),
80e5c09e 643 AUX_ENT (AT_FLAGS, 0),
a3d4b83b 644 AUX_ENTF (AT_ENTRY, aux_ent_entry),
80e5c09e
HPN
645
646 /* Or is root better? Maybe have it settable? */
647 AUX_ENT (AT_UID, 500),
648 AUX_ENT (AT_EUID, 500),
649 AUX_ENT (AT_GID, 500),
650 AUX_ENT (AT_EGID, 500),
a3d4b83b 651 AUX_ENT (AT_SECURE, 0),
80e5c09e
HPN
652 AUX_ENT (AT_NULL, 0)
653 };
654
f6bcefef
HPN
655 /* Can't initialize to "" below. It's either a GCC bug in old
656 releases (up to and including 2.95.3 (.4 in debian) or a bug in the
657 standard ;-) that the rest of the elements won't be initialized. */
658 bfd_byte sp_init[4] = {0, 0, 0, 0};
659
f9a4d543 660 /* Set default options before parsing user options. */
1c636da0 661 STATE_MACHS (sd) = cris_sim_machs;
d414eb3e 662 STATE_MODEL_NAME (sd) = "crisv32";
f9a4d543
MF
663 current_target_byte_order = BFD_ENDIAN_LITTLE;
664
f6bcefef 665 /* The cpu data is kept in a separately allocated chunk of memory. */
d5a71b11 666 if (sim_cpu_alloc_all (sd, 1) != SIM_RC_OK)
f6bcefef
HPN
667 {
668 free_state (sd);
669 return 0;
670 }
671
672 if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
673 {
674 free_state (sd);
675 return 0;
676 }
677
9db2b719
MF
678 /* Add the CRIS-specific option list to the simulator. */
679 if (sim_add_option_table (sd, NULL, cris_options) != SIM_RC_OK)
680 {
681 free_state (sd);
682 return 0;
683 }
684
77cf2ef5 685 /* The parser will print an error message for us, so we silently return. */
f6bcefef
HPN
686 if (sim_parse_args (sd, argv) != SIM_RC_OK)
687 {
688 free_state (sd);
689 return 0;
690 }
691
f6bcefef
HPN
692 /* check for/establish the reference program image */
693 if (sim_analyze_program (sd,
694 (STATE_PROG_ARGV (sd) != NULL
695 ? *STATE_PROG_ARGV (sd)
696 : NULL),
697 abfd) != SIM_RC_OK)
698 {
a0956358
HPN
699 /* When there's an error, sim_analyze_program has already output
700 a message. Let's just clarify it, as "not an object file"
701 perhaps doesn't ring a bell. */
702 sim_io_eprintf (sd, "(not a CRIS program)\n");
80e5c09e
HPN
703 free_state (sd);
704 return 0;
705 }
706
707 /* We might get called with the caller expecting us to get hold of
708 the bfd for ourselves, which would happen at the
709 sim_analyze_program call above. */
710 if (abfd == NULL)
711 abfd = STATE_PROG_BFD (sd);
712
c10b3605
HPN
713 /* Adjust the addresses of the program at this point. Unfortunately
714 this does not affect ELF program headers, so we have to handle
715 that separately. */
716 cris_offset_sections (sd, cris_program_offset);
717
718 if (abfd != NULL && bfd_get_arch (abfd) == bfd_arch_unknown)
80e5c09e
HPN
719 {
720 if (STATE_PROG_ARGV (sd) != NULL)
a0956358 721 sim_io_eprintf (sd, "%s: `%s' is not a CRIS program\n",
80e5c09e
HPN
722 STATE_MY_NAME (sd), *STATE_PROG_ARGV (sd));
723 else
724 sim_io_eprintf (sd, "%s: program to be run is not a CRIS program\n",
725 STATE_MY_NAME (sd));
f6bcefef
HPN
726 free_state (sd);
727 return 0;
728 }
729
730 /* For CRIS simulator-specific use, we need to find out the bounds of
731 the program as well, which is not done by sim_analyze_program
732 above. */
80e5c09e 733 if (abfd != NULL)
f6bcefef
HPN
734 {
735 struct progbounds pb;
736
737 /* The sections should now be accessible using bfd functions. */
80e5c09e 738 cris_get_progbounds (abfd, &pb);
f6bcefef
HPN
739
740 /* We align the area that the program uses to page boundaries. */
741 startmem = pb.startmem & ~8191;
742 endbrk = pb.endmem;
743 endmem = (endbrk + 8191) & ~8191;
744 }
745
746 /* Find out how much room is needed for the environment and argv, create
747 that memory and fill it. Only do this when there's a program
748 specified. */
80e5c09e 749 if (abfd != NULL && !cris_bare_iron)
f6bcefef 750 {
b16c44de 751 const char *name = bfd_get_filename (abfd);
f6bcefef
HPN
752 /* We use these maps to give the same behavior as the old xsim
753 simulator. */
754 USI envtop = 0x40000000;
755 USI stacktop = 0x3e000000;
756 USI envstart;
757 int envc;
758 int len = strlen (name) + 1;
759 USI epp, epp0;
760 USI stacklen;
761 int i;
762 char **prog_argv = STATE_PROG_ARGV (sd);
763 int my_argc = 0;
f6bcefef
HPN
764 USI csp;
765 bfd_byte buf[4];
766
767 /* Count in the environment as well. */
c5a2e012
MF
768 for (envc = 0; environ[envc] != NULL; envc++)
769 len += strlen (environ[envc]) + 1;
f6bcefef
HPN
770
771 for (i = 0; prog_argv[i] != NULL; my_argc++, i++)
772 len += strlen (prog_argv[i]) + 1;
773
774 envstart = (envtop - len) & ~8191;
775
776 /* Create read-only block for the environment strings. */
777 sim_core_attach (sd, NULL, 0, access_read, 0,
778 envstart, (len + 8191) & ~8191,
779 0, NULL, NULL);
780
781 /* This shouldn't happen. */
782 if (envstart < stacktop)
783 stacktop = envstart - 64 * 8192;
784
785 csp = stacktop;
786
787 /* Note that the linux kernel does not correctly compute the storage
788 needs for the static-exe AUX vector. */
80e5c09e 789
13a590ca 790 csp -= ARRAY_SIZE (auxv_entries) * 4 * 2;
f6bcefef
HPN
791
792 csp -= (envc + 1) * 4;
793 csp -= (my_argc + 1) * 4;
794 csp -= 4;
795
796 /* Write the target representation of the start-up-value for the
797 stack-pointer suitable for register initialization below. */
798 bfd_putl32 (csp, sp_init);
799
800 /* If we make this 1M higher; say 8192*1024, we have to take
801 special precautions for pthreads, because pthreads assumes that
802 the memory that low isn't mmapped, and that it can mmap it
803 without fallback in case of failure (and we fail ungracefully
804 long before *that*: the memory isn't accounted for in our mmap
805 list). */
806 stack_low = (csp - (7168*1024)) & ~8191;
807
808 stacklen = stacktop - stack_low;
809
810 /* Tee hee, we have an executable stack. Well, it's necessary to
811 test GCC trampolines... */
812 sim_core_attach (sd, NULL, 0, access_read_write_exec, 0,
813 stack_low, stacklen,
814 0, NULL, NULL);
815
816 epp = epp0 = envstart;
817
818 /* Can't use sim_core_write_unaligned_4 without everything
819 initialized when tracing, and then these writes would get into
820 the trace. */
821#define write_dword(addr, data) \
822 do \
823 { \
824 USI data_ = data; \
825 USI addr_ = addr; \
826 bfd_putl32 (data_, buf); \
8b494522 827 if (sim_core_write_buffer (sd, NULL, NULL_CIA, buf, addr_, 4) != 4)\
f6bcefef
HPN
828 goto abandon_chip; \
829 } \
830 while (0)
831
832 write_dword (csp, my_argc);
833 csp += 4;
834
835 for (i = 0; i < my_argc; i++, csp += 4)
836 {
837 size_t strln = strlen (prog_argv[i]) + 1;
838
8b494522
MF
839 if (sim_core_write_buffer (sd, NULL, NULL_CIA, prog_argv[i], epp,
840 strln)
f6bcefef
HPN
841 != strln)
842 goto abandon_chip;
843
844 write_dword (csp, envstart + epp - epp0);
845 epp += strln;
846 }
847
848 write_dword (csp, 0);
849 csp += 4;
850
851 for (i = 0; i < envc; i++, csp += 4)
852 {
c5a2e012 853 unsigned int strln = strlen (environ[i]) + 1;
f6bcefef 854
c5a2e012 855 if (sim_core_write_buffer (sd, NULL, NULL_CIA, environ[i], epp, strln)
f6bcefef
HPN
856 != strln)
857 goto abandon_chip;
858
859 write_dword (csp, envstart + epp - epp0);
860 epp += strln;
861 }
862
863 write_dword (csp, 0);
864 csp += 4;
865
80e5c09e
HPN
866 /* The load address of the executable could presumably be
867 different than the lowest used memory address, but let's
868 stick to simplicity until needed. And
869 cris_handle_interpreter might change startmem and endmem, so
870 let's set it now. */
871 exec_load_addr = startmem;
f6bcefef 872
80e5c09e
HPN
873 if (!cris_handle_interpreter (sd, abfd))
874 goto abandon_chip;
f6bcefef 875
80e5c09e 876 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
13a590ca 877 for (i = 0; i < ARRAY_SIZE (auxv_entries); i++)
80e5c09e
HPN
878 {
879 write_dword (csp, auxv_entries[i].id);
880 write_dword (csp + 4,
881 auxv_entries[i].efn != NULL
882 ? (*auxv_entries[i].efn) (abfd)
883 : auxv_entries[i].val);
884 csp += 4 + 4;
885 }
f6bcefef
HPN
886 }
887
888 /* Allocate core managed memory if none specified by user. */
889 if (sim_core_read_buffer (sd, NULL, read_map, &c, startmem, 1) == 0)
d16ce6e4 890 sim_do_commandf (sd, "memory region 0x%" PRIx32 ",0x%" PRIu32,
5ee0bc23 891 startmem, endmem - startmem);
f6bcefef
HPN
892
893 /* Allocate simulator I/O managed memory if none specified by user. */
894 if (cris_have_900000xxif)
34cf5112 895 sim_hw_parse (sd, "/core/%s/reg %#x %i", "cris_900000xx", 0x90000000, 0x100);
f6bcefef
HPN
896
897 /* Establish any remaining configuration options. */
898 if (sim_config (sd) != SIM_RC_OK)
899 {
900 abandon_chip:
901 free_state (sd);
902 return 0;
903 }
904
905 if (sim_post_argv_init (sd) != SIM_RC_OK)
906 {
907 free_state (sd);
908 return 0;
909 }
910
911 /* Open a copy of the cpu descriptor table. */
912 {
913 CGEN_CPU_DESC cd = cris_cgen_cpu_open_1 (STATE_ARCHITECTURE (sd)->printable_name,
914 CGEN_ENDIAN_LITTLE);
915 for (i = 0; i < MAX_NR_PROCESSORS; ++i)
916 {
917 SIM_CPU *cpu = STATE_CPU (sd, i);
918 CPU_CPU_DESC (cpu) = cd;
919 CPU_DISASSEMBLER (cpu) = cris_disassemble_insn;
920
921 /* See cris_option_handler for the reason why this is needed. */
922 CPU_CRIS_MISC_PROFILE (cpu)->flags = STATE_TRACE_FLAGS (sd)[0];
923
924 /* Set SP to the stack we allocated above. */
072d63a8 925 (* CPU_REG_STORE (cpu)) (cpu, H_GR_SP, (unsigned char *) sp_init, 4);
f6bcefef
HPN
926
927 /* Set the simulator environment data. */
928 cpu->highest_mmapped_page = NULL;
929 cpu->endmem = endmem;
930 cpu->endbrk = endbrk;
931 cpu->stack_low = stack_low;
932 cpu->syscalls = 0;
933 cpu->m1threads = 0;
934 cpu->threadno = 0;
935 cpu->max_threadid = 0;
936 cpu->thread_data = NULL;
937 memset (cpu->sighandler, 0, sizeof (cpu->sighandler));
938 cpu->make_thread_cpu_data = NULL;
939 cpu->thread_cpu_data_size = 0;
aad3b3cb
HPN
940#if WITH_HW
941 cpu->deliver_interrupt = NULL;
942#endif
f6bcefef 943 }
aad3b3cb
HPN
944#if WITH_HW
945 /* Always be cycle-accurate and call before/after functions if
946 with-hardware. */
947 sim_profile_set_option (sd, "-model", PROFILE_MODEL_IDX, "on");
948#endif
f6bcefef
HPN
949 }
950
f6bcefef
HPN
951 cris_set_callbacks (callback);
952
953 return sd;
954}
f6bcefef
HPN
955\f
956SIM_RC
957sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
2e3d4f4d
MF
958 char * const *argv ATTRIBUTE_UNUSED,
959 char * const *envp ATTRIBUTE_UNUSED)
f6bcefef
HPN
960{
961 SIM_CPU *current_cpu = STATE_CPU (sd, 0);
962 SIM_ADDR addr;
963
80e5c09e 964 if (sd != NULL)
c10b3605
HPN
965 addr = cris_start_address != (SIM_ADDR) -1
966 ? cris_start_address
967 : (interp_start_addr != 0
968 ? interp_start_addr
969 : bfd_get_start_address (abfd));
f6bcefef
HPN
970 else
971 addr = 0;
972 sim_pc_set (current_cpu, addr);
973
0e967299
MF
974 /* Standalone mode (i.e. `run`) will take care of the argv for us in
975 sim_open() -> sim_parse_args(). But in debug mode (i.e. 'target sim'
976 with `gdb`), we need to handle it because the user can change the
977 argv on the fly via gdb's 'run'. */
978 if (STATE_PROG_ARGV (sd) != argv)
979 {
980 freeargv (STATE_PROG_ARGV (sd));
981 STATE_PROG_ARGV (sd) = dupargv (argv);
982 }
f6bcefef
HPN
983
984 return SIM_RC_OK;
985}
f6bcefef
HPN
986\f
987/* Disassemble an instruction. */
988
989static void
990cris_disassemble_insn (SIM_CPU *cpu,
991 const CGEN_INSN *insn ATTRIBUTE_UNUSED,
992 const ARGBUF *abuf ATTRIBUTE_UNUSED,
993 IADDR pc, char *buf)
994{
995 disassembler_ftype pinsn;
996 struct disassemble_info disasm_info;
997 SFILE sfile;
998 SIM_DESC sd = CPU_STATE (cpu);
999
1000 sfile.buffer = sfile.current = buf;
1001 INIT_DISASSEMBLE_INFO (disasm_info, (FILE *) &sfile,
1002 (fprintf_ftype) sim_disasm_sprintf);
80e5c09e
HPN
1003 disasm_info.endian = BFD_ENDIAN_LITTLE;
1004 disasm_info.read_memory_func = sim_disasm_read_memory;
f6bcefef
HPN
1005 disasm_info.memory_error_func = sim_disasm_perror_memory;
1006 disasm_info.application_data = (PTR) cpu;
1007 pinsn = cris_get_disassembler (STATE_PROG_BFD (sd));
1008 (*pinsn) (pc, &disasm_info);
1009}
This page took 0.779869 seconds and 4 git commands to generate.