1 /* Main simulator entry points specific to the IQ2000. 2 Copyright (C) 2000, 2007, 2008, 2009, 2010, 2011 3 Free Software Foundation, Inc. 4 Contributed by Cygnus Solutions. 5 6 This file is part of the GNU simulators. 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 20 21 #include "sim-main.h" 22 #ifdef HAVE_STDLIB_H 23 #include <stdlib.h> 24 #endif 25 #include "sim-options.h" 26 #include "libiberty.h" 27 #include "bfd.h" 28 29 static void free_state (SIM_DESC); 30 31 /* Records simulator descriptor so utilities like iq2000_dump_regs can be 32 called from gdb. */ 33 SIM_DESC current_state; 34 35 /* Cover function for sim_cgen_disassemble_insn. */ 36 37 void 38 iq2000bf_disassemble_insn (SIM_CPU *cpu, const CGEN_INSN *insn, 39 const ARGBUF *abuf, IADDR pc, char *buf) 40 { 41 sim_cgen_disassemble_insn(cpu, insn, abuf, pc, buf); 42 } 43 44 /* Cover function of sim_state_free to free the cpu buffers as well. */ 45 46 static void 47 free_state (SIM_DESC sd) 48 { 49 if (STATE_MODULES (sd) != NULL) 50 sim_module_uninstall (sd); 51 sim_cpu_free_all (sd); 52 sim_state_free (sd); 53 } 54 55 /* Create an instance of the simulator. */ 56 57 SIM_DESC 58 sim_open (kind, callback, abfd, argv) 59 SIM_OPEN_KIND kind; 60 host_callback *callback; 61 struct bfd *abfd; 62 char **argv; 63 { 64 char c; 65 int i; 66 SIM_DESC sd = sim_state_alloc (kind, callback); 67 68 /* The cpu data is kept in a separately allocated chunk of memory. */ 69 if (sim_cpu_alloc_all (sd, 1, cgen_cpu_max_extra_bytes ()) != SIM_RC_OK) 70 { 71 free_state (sd); 72 return 0; 73 } 74 75 #if 0 /* FIXME: pc is in mach-specific struct */ 76 /* FIXME: watchpoints code shouldn't need this */ 77 { 78 SIM_CPU *current_cpu = STATE_CPU (sd, 0); 79 STATE_WATCHPOINTS (sd)->pc = &(PC); 80 STATE_WATCHPOINTS (sd)->sizeof_pc = sizeof (PC); 81 } 82 #endif 83 84 if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK) 85 { 86 free_state (sd); 87 return 0; 88 } 89 90 #if 0 /* FIXME: 'twould be nice if we could do this */ 91 /* These options override any module options. 92 Obviously ambiguity should be avoided, however the caller may wish to 93 augment the meaning of an option. */ 94 if (extra_options != NULL) 95 sim_add_option_table (sd, extra_options); 96 #endif 97 98 /* getopt will print the error message so we just have to exit if this fails. 99 FIXME: Hmmm... in the case of gdb we need getopt to call 100 print_filtered. */ 101 if (sim_parse_args (sd, argv) != SIM_RC_OK) 102 { 103 free_state (sd); 104 return 0; 105 } 106 107 /* Allocate core managed memory. */ 108 sim_do_commandf (sd, "memory region 0x%lx,0x%lx", IQ2000_INSN_VALUE, IQ2000_INSN_MEM_SIZE); 109 sim_do_commandf (sd, "memory region 0x%lx,0x%lx", IQ2000_DATA_VALUE, IQ2000_DATA_MEM_SIZE); 110 111 /* check for/establish the reference program image */ 112 if (sim_analyze_program (sd, 113 (STATE_PROG_ARGV (sd) != NULL 114 ? *STATE_PROG_ARGV (sd) 115 : NULL), 116 abfd) != SIM_RC_OK) 117 { 118 free_state (sd); 119 return 0; 120 } 121 122 /* Establish any remaining configuration options. */ 123 if (sim_config (sd) != SIM_RC_OK) 124 { 125 free_state (sd); 126 return 0; 127 } 128 129 if (sim_post_argv_init (sd) != SIM_RC_OK) 130 { 131 free_state (sd); 132 return 0; 133 } 134 135 /* Open a copy of the cpu descriptor table. */ 136 { 137 CGEN_CPU_DESC cd = iq2000_cgen_cpu_open_1 (STATE_ARCHITECTURE (sd)->printable_name, 138 CGEN_ENDIAN_BIG); 139 140 for (i = 0; i < MAX_NR_PROCESSORS; ++i) 141 { 142 SIM_CPU *cpu = STATE_CPU (sd, i); 143 CPU_CPU_DESC (cpu) = cd; 144 CPU_DISASSEMBLER (cpu) = iq2000bf_disassemble_insn; 145 } 146 iq2000_cgen_init_dis (cd); 147 } 148 149 /* Initialize various cgen things not done by common framework. 150 Must be done after iq2000_cgen_cpu_open. */ 151 cgen_init (sd); 152 153 /* Store in a global so things like sparc32_dump_regs can be invoked 154 from the gdb command line. */ 155 current_state = sd; 156 157 return sd; 158 } 159 160 void 161 sim_close (sd, quitting) 162 SIM_DESC sd; 163 int quitting; 164 { 165 iq2000_cgen_cpu_close (CPU_CPU_DESC (STATE_CPU (sd, 0))); 166 sim_module_uninstall (sd); 167 } 168 169 SIM_RC 170 sim_create_inferior (sd, abfd, argv, envp) 171 SIM_DESC sd; 172 struct bfd *abfd; 173 char **argv; 174 char **envp; 175 { 176 SIM_CPU *current_cpu = STATE_CPU (sd, 0); 177 SIM_ADDR addr; 178 179 if (abfd != NULL) 180 addr = bfd_get_start_address (abfd); 181 else 182 addr = CPU2INSN(0); 183 sim_pc_set (current_cpu, addr); 184 185 #if 0 186 STATE_ARGV (sd) = sim_copy_argv (argv); 187 STATE_ENVP (sd) = sim_copy_argv (envp); 188 #endif 189 190 return SIM_RC_OK; 191 } 192 193 void 194 sim_do_command (sd, cmd) 195 SIM_DESC sd; 196 char *cmd; 197 { 198 if (sim_args_command (sd, cmd) != SIM_RC_OK) 199 sim_io_eprintf (sd, "Unknown command `%s'\n", cmd); 200 } 201 202 203 204