1 /* Main simulator entry points specific to the IQ2000. 2 Copyright (C) 2000-2017 Free Software Foundation, Inc. 3 Contributed by Cygnus Solutions. 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 #include "sim-main.h" 21 #ifdef HAVE_STDLIB_H 22 #include <stdlib.h> 23 #endif 24 #include "sim-options.h" 25 #include "libiberty.h" 26 #include "bfd.h" 27 28 static void free_state (SIM_DESC); 29 30 /* Cover function for sim_cgen_disassemble_insn. */ 31 32 void 33 iq2000bf_disassemble_insn (SIM_CPU *cpu, const CGEN_INSN *insn, 34 const ARGBUF *abuf, IADDR pc, char *buf) 35 { 36 sim_cgen_disassemble_insn(cpu, insn, abuf, pc, buf); 37 } 38 39 /* Cover function of sim_state_free to free the cpu buffers as well. */ 40 41 static void 42 free_state (SIM_DESC sd) 43 { 44 if (STATE_MODULES (sd) != NULL) 45 sim_module_uninstall (sd); 46 sim_cpu_free_all (sd); 47 sim_state_free (sd); 48 } 49 50 /* Create an instance of the simulator. */ 51 52 SIM_DESC 53 sim_open (kind, callback, abfd, argv) 54 SIM_OPEN_KIND kind; 55 host_callback *callback; 56 struct bfd *abfd; 57 char * const *argv; 58 { 59 char c; 60 int i; 61 SIM_DESC sd = sim_state_alloc (kind, callback); 62 63 /* The cpu data is kept in a separately allocated chunk of memory. */ 64 if (sim_cpu_alloc_all (sd, 1, cgen_cpu_max_extra_bytes ()) != SIM_RC_OK) 65 { 66 free_state (sd); 67 return 0; 68 } 69 70 #if 0 /* FIXME: pc is in mach-specific struct */ 71 /* FIXME: watchpoints code shouldn't need this */ 72 { 73 SIM_CPU *current_cpu = STATE_CPU (sd, 0); 74 STATE_WATCHPOINTS (sd)->pc = &(PC); 75 STATE_WATCHPOINTS (sd)->sizeof_pc = sizeof (PC); 76 } 77 #endif 78 79 if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK) 80 { 81 free_state (sd); 82 return 0; 83 } 84 85 /* The parser will print an error message for us, so we silently return. */ 86 if (sim_parse_args (sd, argv) != SIM_RC_OK) 87 { 88 free_state (sd); 89 return 0; 90 } 91 92 /* Allocate core managed memory. */ 93 sim_do_commandf (sd, "memory region 0x%lx,0x%lx", IQ2000_INSN_VALUE, IQ2000_INSN_MEM_SIZE); 94 sim_do_commandf (sd, "memory region 0x%lx,0x%lx", IQ2000_DATA_VALUE, IQ2000_DATA_MEM_SIZE); 95 96 /* check for/establish the reference program image */ 97 if (sim_analyze_program (sd, 98 (STATE_PROG_ARGV (sd) != NULL 99 ? *STATE_PROG_ARGV (sd) 100 : NULL), 101 abfd) != SIM_RC_OK) 102 { 103 free_state (sd); 104 return 0; 105 } 106 107 /* Establish any remaining configuration options. */ 108 if (sim_config (sd) != SIM_RC_OK) 109 { 110 free_state (sd); 111 return 0; 112 } 113 114 if (sim_post_argv_init (sd) != SIM_RC_OK) 115 { 116 free_state (sd); 117 return 0; 118 } 119 120 /* Open a copy of the cpu descriptor table. */ 121 { 122 CGEN_CPU_DESC cd = iq2000_cgen_cpu_open_1 (STATE_ARCHITECTURE (sd)->printable_name, 123 CGEN_ENDIAN_BIG); 124 125 for (i = 0; i < MAX_NR_PROCESSORS; ++i) 126 { 127 SIM_CPU *cpu = STATE_CPU (sd, i); 128 CPU_CPU_DESC (cpu) = cd; 129 CPU_DISASSEMBLER (cpu) = iq2000bf_disassemble_insn; 130 } 131 iq2000_cgen_init_dis (cd); 132 } 133 134 /* Initialize various cgen things not done by common framework. 135 Must be done after iq2000_cgen_cpu_open. */ 136 cgen_init (sd); 137 138 return sd; 139 } 140 141 SIM_RC 142 sim_create_inferior (sd, abfd, argv, envp) 143 SIM_DESC sd; 144 struct bfd *abfd; 145 char * const *argv; 146 char * const *envp; 147 { 148 SIM_CPU *current_cpu = STATE_CPU (sd, 0); 149 SIM_ADDR addr; 150 151 if (abfd != NULL) 152 addr = bfd_get_start_address (abfd); 153 else 154 addr = CPU2INSN(0); 155 sim_pc_set (current_cpu, addr); 156 157 /* Standalone mode (i.e. `run`) will take care of the argv for us in 158 sim_open() -> sim_parse_args(). But in debug mode (i.e. 'target sim' 159 with `gdb`), we need to handle it because the user can change the 160 argv on the fly via gdb's 'run'. */ 161 if (STATE_PROG_ARGV (sd) != argv) 162 { 163 freeargv (STATE_PROG_ARGV (sd)); 164 STATE_PROG_ARGV (sd) = dupargv (argv); 165 } 166 167 return SIM_RC_OK; 168 } 169