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