static int sim_prepare_for_program (SIM_DESC sd, bfd* abfd) { sim_cpu *cpu; int elf_flags = 0; cpu = STATE_CPU (sd, 0); if (abfd != NULL) { asection *s; if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) elf_flags = elf_elfheader (abfd)->e_flags; cpu->cpu_elf_start = bfd_get_start_address (abfd); /* See if any section sets the reset address */ cpu->cpu_use_elf_start = 1; for (s = abfd->sections; s && cpu->cpu_use_elf_start; s = s->next) { if (s->flags & SEC_LOAD) { bfd_size_type size; size = bfd_get_section_size (s); if (size > 0) { bfd_vma lma; if (STATE_LOAD_AT_LMA_P (sd)) lma = bfd_section_lma (abfd, s); else lma = bfd_section_vma (abfd, s); if (lma <= 0xFFFE && lma+size >= 0x10000) cpu->cpu_use_elf_start = 0; } } } if (elf_flags & E_M68HC12_BANKS) { if (sim_get_bank_parameters (sd, abfd) != 0) sim_io_eprintf (sd, "Memory bank parameters are not initialized\n"); } } if (!sim_hw_configure (sd)) return SIM_RC_FAIL; /* reset all state information */ sim_board_reset (sd); return SIM_RC_OK; }
static SIM_RC cpu_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt, char *arg, int is_command) { int val; cpu = STATE_CPU (sd, 0); switch (opt) { case OPTION_CPU_RESET: sim_board_reset (sd); break; case OPTION_EMUL_OS: cpu->cpu_emul_syscall = 1; break; case OPTION_CPU_CONFIG: if (sscanf(arg, "0x%x", &val) == 1 || sscanf(arg, "%d", &val) == 1) { cpu->cpu_config = val; cpu->cpu_use_local_config = 1; } else cpu->cpu_use_local_config = 0; break; case OPTION_CPU_BOOTSTRAP: cpu->cpu_start_mode = "bootstrap"; break; case OPTION_CPU_MODE: break; } return SIM_RC_OK; }