1 /* Main simulator entry points specific to the CRIS. 2 Copyright (C) 2004-2023 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 "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 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 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_bread (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 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 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 338 cris_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 358 /* BFD section iterator to find the highest and lowest allocated and 359 non-allocated section addresses (plus one). */ 360 361 static void 362 get_progbounds_iterator (bfd *abfd ATTRIBUTE_UNUSED, asection *s, void *vp) 363 { 364 struct progbounds *pbp = (struct progbounds *) vp; 365 366 if ((bfd_section_flags (s) & SEC_ALLOC)) 367 { 368 bfd_size_type sec_size = bfd_section_size (s); 369 bfd_size_type sec_start = bfd_section_vma (s); 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; 377 378 if ((bfd_section_flags (s) & SEC_LOAD)) 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 392 static void 393 cris_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. */ 439 static bfd_vma exec_load_addr; 440 static bfd_vma interp_load_addr; 441 static bfd_vma interp_start_addr; 442 443 /* Supposed to mimic Linux' "NEW_AUX_ENT (AT_PHDR, load_addr + exec->e_phoff)". */ 444 445 static USI 446 aux_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 454 static USI 455 aux_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 462 static USI 463 aux_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 470 static USI 471 aux_ent_base (struct bfd *ebfd) 472 { 473 return interp_load_addr; 474 } 475 476 /* Like "NEW_AUX_ENT(AT_ENTRY, exec->e_entry)". */ 477 478 static USI 479 aux_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 488 static int 489 cris_write_interp (SIM_DESC sd, SIM_ADDR mem, const void *buf, int length) 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 499 static bfd_boolean 500 cris_handle_interpreter (SIM_DESC sd, struct bfd *abfd) 501 { 502 int i, n_hdrs; 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 546 /* The interpreter is at least something readable to BFD; make 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. */ 578 sim_do_commandf (sd, "memory region 0x%" PRIx64 ",0x%" PRIx64, 579 (uint64_t) interp_load_addr, (uint64_t) interpsiz); 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; 595 } 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; 616 } 617 618 extern const SIM_MACH * const cris_sim_machs[]; 619 620 /* Create an instance of the simulator. */ 621 622 SIM_DESC 623 sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd, 624 char * const *argv) 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 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 { 641 #define AUX_ENT(a, b) {a, NULL, b} 642 #define AUX_ENTF(a, f) {a, f, 0} 643 AUX_ENT (AT_HWCAP, 0), 644 AUX_ENT (AT_PAGESZ, 8192), 645 AUX_ENT (AT_CLKTCK, 100), 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), 650 AUX_ENT (AT_FLAGS, 0), 651 AUX_ENTF (AT_ENTRY, aux_ent_entry), 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), 658 AUX_ENT (AT_SECURE, 0), 659 AUX_ENT (AT_NULL, 0) 660 }; 661 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 667 /* Set default options before parsing user options. */ 668 STATE_MACHS (sd) = cris_sim_machs; 669 STATE_MODEL_NAME (sd) = "crisv32"; 670 current_target_byte_order = BFD_ENDIAN_LITTLE; 671 672 /* The cpu data is kept in a separately allocated chunk of memory. */ 673 if (sim_cpu_alloc_all (sd, 1) != SIM_RC_OK) 674 { 675 free_state (sd); 676 return 0; 677 } 678 679 if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK) 680 { 681 free_state (sd); 682 return 0; 683 } 684 685 /* Add the CRIS-specific option list to the simulator. */ 686 if (sim_add_option_table (sd, NULL, cris_options) != SIM_RC_OK) 687 { 688 free_state (sd); 689 return 0; 690 } 691 692 /* The parser will print an error message for us, so we silently return. */ 693 if (sim_parse_args (sd, argv) != SIM_RC_OK) 694 { 695 free_state (sd); 696 return 0; 697 } 698 699 /* check for/establish the reference program image */ 700 if (sim_analyze_program (sd, STATE_PROG_FILE (sd), abfd) != SIM_RC_OK) 701 { 702 /* When there's an error, sim_analyze_program has already output 703 a message. Let's just clarify it, as "not an object file" 704 perhaps doesn't ring a bell. */ 705 sim_io_eprintf (sd, "(not a CRIS program)\n"); 706 free_state (sd); 707 return 0; 708 } 709 710 /* We might get called with the caller expecting us to get hold of 711 the bfd for ourselves, which would happen at the 712 sim_analyze_program call above. */ 713 if (abfd == NULL) 714 abfd = STATE_PROG_BFD (sd); 715 716 /* Adjust the addresses of the program at this point. Unfortunately 717 this does not affect ELF program headers, so we have to handle 718 that separately. */ 719 cris_offset_sections (sd, cris_program_offset); 720 721 if (abfd != NULL && bfd_get_arch (abfd) == bfd_arch_unknown) 722 { 723 if (STATE_PROG_FILE (sd) != NULL) 724 sim_io_eprintf (sd, "%s: `%s' is not a CRIS program\n", 725 STATE_MY_NAME (sd), STATE_PROG_FILE (sd)); 726 else 727 sim_io_eprintf (sd, "%s: program to be run is not a CRIS program\n", 728 STATE_MY_NAME (sd)); 729 free_state (sd); 730 return 0; 731 } 732 733 /* For CRIS simulator-specific use, we need to find out the bounds of 734 the program as well, which is not done by sim_analyze_program 735 above. */ 736 if (abfd != NULL) 737 { 738 struct progbounds pb; 739 740 /* The sections should now be accessible using bfd functions. */ 741 cris_get_progbounds (abfd, &pb); 742 743 /* We align the area that the program uses to page boundaries. */ 744 startmem = pb.startmem & ~8191; 745 endbrk = pb.endmem; 746 endmem = (endbrk + 8191) & ~8191; 747 } 748 749 /* Find out how much room is needed for the environment and argv, create 750 that memory and fill it. Only do this when there's a program 751 specified. 752 753 TODO: Move this to sim_create_inferior and use STATE_PROG_ENVP. */ 754 if (abfd != NULL && !cris_bare_iron) 755 { 756 const char *name = bfd_get_filename (abfd); 757 /* We use these maps to give the same behavior as the old xsim 758 simulator. */ 759 USI envtop = 0x40000000; 760 USI stacktop = 0x3e000000; 761 USI envstart; 762 int envc; 763 int len = strlen (name) + 1; 764 USI epp, epp0; 765 USI stacklen; 766 int i; 767 char **prog_argv = STATE_PROG_ARGV (sd); 768 int my_argc = 0; 769 USI csp; 770 bfd_byte buf[4]; 771 772 /* Count in the environment as well. */ 773 for (envc = 0; environ[envc] != NULL; envc++) 774 len += strlen (environ[envc]) + 1; 775 776 for (i = 0; prog_argv[i] != NULL; my_argc++, i++) 777 len += strlen (prog_argv[i]) + 1; 778 779 envstart = (envtop - len) & ~8191; 780 781 /* Create read-only block for the environment strings. */ 782 sim_core_attach (sd, NULL, 0, access_read, 0, 783 envstart, (len + 8191) & ~8191, 784 0, NULL, NULL); 785 786 /* This shouldn't happen. */ 787 if (envstart < stacktop) 788 stacktop = envstart - 64 * 8192; 789 790 csp = stacktop; 791 792 /* Note that the linux kernel does not correctly compute the storage 793 needs for the static-exe AUX vector. */ 794 795 csp -= ARRAY_SIZE (auxv_entries) * 4 * 2; 796 797 csp -= (envc + 1) * 4; 798 csp -= (my_argc + 1) * 4; 799 csp -= 4; 800 801 /* Write the target representation of the start-up-value for the 802 stack-pointer suitable for register initialization below. */ 803 bfd_putl32 (csp, sp_init); 804 805 /* If we make this 1M higher; say 8192*1024, we have to take 806 special precautions for pthreads, because pthreads assumes that 807 the memory that low isn't mmapped, and that it can mmap it 808 without fallback in case of failure (and we fail ungracefully 809 long before *that*: the memory isn't accounted for in our mmap 810 list). */ 811 stack_low = (csp - (7168*1024)) & ~8191; 812 813 stacklen = stacktop - stack_low; 814 815 /* Tee hee, we have an executable stack. Well, it's necessary to 816 test GCC trampolines... */ 817 sim_core_attach (sd, NULL, 0, access_read_write_exec, 0, 818 stack_low, stacklen, 819 0, NULL, NULL); 820 821 epp = epp0 = envstart; 822 823 /* Can't use sim_core_write_unaligned_4 without everything 824 initialized when tracing, and then these writes would get into 825 the trace. */ 826 #define write_dword(addr, data) \ 827 do \ 828 { \ 829 USI data_ = data; \ 830 USI addr_ = addr; \ 831 bfd_putl32 (data_, buf); \ 832 if (sim_core_write_buffer (sd, NULL, NULL_CIA, buf, addr_, 4) != 4)\ 833 goto abandon_chip; \ 834 } \ 835 while (0) 836 837 write_dword (csp, my_argc); 838 csp += 4; 839 840 for (i = 0; i < my_argc; i++, csp += 4) 841 { 842 size_t strln = strlen (prog_argv[i]) + 1; 843 844 if (sim_core_write_buffer (sd, NULL, NULL_CIA, prog_argv[i], epp, 845 strln) 846 != strln) 847 goto abandon_chip; 848 849 write_dword (csp, envstart + epp - epp0); 850 epp += strln; 851 } 852 853 write_dword (csp, 0); 854 csp += 4; 855 856 for (i = 0; i < envc; i++, csp += 4) 857 { 858 unsigned int strln = strlen (environ[i]) + 1; 859 860 if (sim_core_write_buffer (sd, NULL, NULL_CIA, environ[i], epp, strln) 861 != strln) 862 goto abandon_chip; 863 864 write_dword (csp, envstart + epp - epp0); 865 epp += strln; 866 } 867 868 write_dword (csp, 0); 869 csp += 4; 870 871 /* The load address of the executable could presumably be 872 different than the lowest used memory address, but let's 873 stick to simplicity until needed. And 874 cris_handle_interpreter might change startmem and endmem, so 875 let's set it now. */ 876 exec_load_addr = startmem; 877 878 if (!cris_handle_interpreter (sd, abfd)) 879 goto abandon_chip; 880 881 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) 882 for (i = 0; i < ARRAY_SIZE (auxv_entries); i++) 883 { 884 write_dword (csp, auxv_entries[i].id); 885 write_dword (csp + 4, 886 auxv_entries[i].efn != NULL 887 ? (*auxv_entries[i].efn) (abfd) 888 : auxv_entries[i].val); 889 csp += 4 + 4; 890 } 891 } 892 893 /* Allocate core managed memory if none specified by user. */ 894 if (sim_core_read_buffer (sd, NULL, read_map, &c, startmem, 1) == 0) 895 sim_do_commandf (sd, "memory region 0x%" PRIx32 ",0x%" PRIx32, 896 startmem, endmem - startmem); 897 898 /* Allocate simulator I/O managed memory if none specified by user. */ 899 #if WITH_HW 900 if (cris_have_900000xxif) 901 sim_hw_parse (sd, "/core/%s/reg %#x %i", "cris_900000xx", 0x90000000, 0x100); 902 #else 903 /* With the option disabled, nothing should be able to set this variable. 904 We should "use" it, though, and why not assert that it isn't set. */ 905 ASSERT (! cris_have_900000xxif); 906 #endif 907 908 /* Establish any remaining configuration options. */ 909 if (sim_config (sd) != SIM_RC_OK) 910 { 911 abandon_chip: 912 free_state (sd); 913 return 0; 914 } 915 916 if (sim_post_argv_init (sd) != SIM_RC_OK) 917 { 918 free_state (sd); 919 return 0; 920 } 921 922 /* Open a copy of the cpu descriptor table. */ 923 { 924 CGEN_CPU_DESC cd = cris_cgen_cpu_open_1 (STATE_ARCHITECTURE (sd)->printable_name, 925 CGEN_ENDIAN_LITTLE); 926 for (i = 0; i < MAX_NR_PROCESSORS; ++i) 927 { 928 SIM_CPU *cpu = STATE_CPU (sd, i); 929 CPU_CPU_DESC (cpu) = cd; 930 CPU_DISASSEMBLER (cpu) = cris_disassemble_insn; 931 932 /* See cris_option_handler for the reason why this is needed. */ 933 CPU_CRIS_MISC_PROFILE (cpu)->flags = STATE_TRACE_FLAGS (sd)[0]; 934 935 /* Set SP to the stack we allocated above. */ 936 (* CPU_REG_STORE (cpu)) (cpu, H_GR_SP, (const unsigned char *) sp_init, 4); 937 938 /* Set the simulator environment data. */ 939 cpu->highest_mmapped_page = NULL; 940 cpu->endmem = endmem; 941 cpu->endbrk = endbrk; 942 cpu->stack_low = stack_low; 943 cpu->syscalls = 0; 944 cpu->m1threads = 0; 945 cpu->threadno = 0; 946 cpu->max_threadid = 0; 947 cpu->thread_data = NULL; 948 memset (cpu->sighandler, 0, sizeof (cpu->sighandler)); 949 cpu->make_thread_cpu_data = NULL; 950 cpu->thread_cpu_data_size = 0; 951 #if WITH_HW 952 cpu->deliver_interrupt = NULL; 953 #endif 954 } 955 #if WITH_HW 956 /* Always be cycle-accurate and call before/after functions if 957 with-hardware. */ 958 sim_profile_set_option (sd, "-model", PROFILE_MODEL_IDX, "on"); 959 #endif 960 } 961 962 cris_set_callbacks (callback); 963 964 return sd; 965 } 966 967 SIM_RC 968 sim_create_inferior (SIM_DESC sd, struct bfd *abfd, 969 char * const *argv, 970 char * const *env) 971 { 972 SIM_CPU *current_cpu = STATE_CPU (sd, 0); 973 host_callback *cb = STATE_CALLBACK (sd); 974 SIM_ADDR addr; 975 976 if (sd != NULL) 977 addr = cris_start_address != (SIM_ADDR) -1 978 ? cris_start_address 979 : (interp_start_addr != 0 980 ? interp_start_addr 981 : bfd_get_start_address (abfd)); 982 else 983 addr = 0; 984 sim_pc_set (current_cpu, addr); 985 986 /* Standalone mode (i.e. `run`) will take care of the argv for us in 987 sim_open() -> sim_parse_args(). But in debug mode (i.e. 'target sim' 988 with `gdb`), we need to handle it because the user can change the 989 argv on the fly via gdb's 'run'. */ 990 if (STATE_PROG_ARGV (sd) != argv) 991 { 992 freeargv (STATE_PROG_ARGV (sd)); 993 STATE_PROG_ARGV (sd) = dupargv (argv); 994 } 995 996 if (STATE_PROG_ENVP (sd) != env) 997 { 998 freeargv (STATE_PROG_ENVP (sd)); 999 STATE_PROG_ENVP (sd) = dupargv (env); 1000 } 1001 1002 cb->argv = STATE_PROG_ARGV (sd); 1003 cb->envp = STATE_PROG_ENVP (sd); 1004 1005 return SIM_RC_OK; 1006 } 1007 1008 /* Disassemble an instruction. */ 1009 1010 static void 1011 cris_disassemble_insn (SIM_CPU *cpu, 1012 const CGEN_INSN *insn ATTRIBUTE_UNUSED, 1013 const ARGBUF *abuf ATTRIBUTE_UNUSED, 1014 IADDR pc, char *buf) 1015 { 1016 disassembler_ftype pinsn; 1017 struct disassemble_info disasm_info; 1018 SFILE sfile; 1019 SIM_DESC sd = CPU_STATE (cpu); 1020 1021 sfile.buffer = sfile.current = buf; 1022 INIT_DISASSEMBLE_INFO (disasm_info, (FILE *) &sfile, 1023 (fprintf_ftype) sim_disasm_sprintf, 1024 (fprintf_styled_ftype) sim_disasm_styled_sprintf); 1025 disasm_info.endian = BFD_ENDIAN_LITTLE; 1026 disasm_info.read_memory_func = sim_disasm_read_memory; 1027 disasm_info.memory_error_func = sim_disasm_perror_memory; 1028 disasm_info.application_data = cpu; 1029 pinsn = cris_get_disassembler (STATE_PROG_BFD (sd)); 1030 (*pinsn) (pc, &disasm_info); 1031 } 1032