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