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