1 /* Main simulator entry points specific to the IQ2000.
2 Copyright (C) 2000-2021 Free Software Foundation, Inc.
3 Contributed by Cygnus Solutions.
5 This file is part of the GNU simulators.
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.
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.
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/>. */
20 /* This must come before any other includes. */
27 #include "sim-options.h"
28 #include "libiberty.h"
31 static void free_state (SIM_DESC
);
33 /* Cover function for sim_cgen_disassemble_insn. */
36 iq2000bf_disassemble_insn (SIM_CPU
*cpu
, const CGEN_INSN
*insn
,
37 const ARGBUF
*abuf
, IADDR pc
, char *buf
)
39 sim_cgen_disassemble_insn(cpu
, insn
, abuf
, pc
, buf
);
42 /* Cover function of sim_state_free to free the cpu buffers as well. */
45 free_state (SIM_DESC sd
)
47 if (STATE_MODULES (sd
) != NULL
)
48 sim_module_uninstall (sd
);
49 sim_cpu_free_all (sd
);
53 /* Create an instance of the simulator. */
56 sim_open (SIM_OPEN_KIND kind
, host_callback
*callback
, struct bfd
*abfd
,
61 SIM_DESC sd
= sim_state_alloc (kind
, callback
);
63 /* Set default options before parsing user options. */
64 current_alignment
= STRICT_ALIGNMENT
;
65 current_target_byte_order
= BFD_ENDIAN_BIG
;
67 /* The cpu data is kept in a separately allocated chunk of memory. */
68 if (sim_cpu_alloc_all (sd
, 1) != SIM_RC_OK
)
74 if (sim_pre_argv_init (sd
, argv
[0]) != SIM_RC_OK
)
80 /* The parser will print an error message for us, so we silently return. */
81 if (sim_parse_args (sd
, argv
) != SIM_RC_OK
)
87 /* Allocate core managed memory. */
88 sim_do_commandf (sd
, "memory region 0x%lx,0x%lx", IQ2000_INSN_VALUE
, IQ2000_INSN_MEM_SIZE
);
89 sim_do_commandf (sd
, "memory region 0x%lx,0x%lx", IQ2000_DATA_VALUE
, IQ2000_DATA_MEM_SIZE
);
91 /* check for/establish the reference program image */
92 if (sim_analyze_program (sd
,
93 (STATE_PROG_ARGV (sd
) != NULL
94 ? *STATE_PROG_ARGV (sd
)
102 /* Establish any remaining configuration options. */
103 if (sim_config (sd
) != SIM_RC_OK
)
109 if (sim_post_argv_init (sd
) != SIM_RC_OK
)
115 /* Open a copy of the cpu descriptor table. */
117 CGEN_CPU_DESC cd
= iq2000_cgen_cpu_open_1 (STATE_ARCHITECTURE (sd
)->printable_name
,
120 for (i
= 0; i
< MAX_NR_PROCESSORS
; ++i
)
122 SIM_CPU
*cpu
= STATE_CPU (sd
, i
);
123 CPU_CPU_DESC (cpu
) = cd
;
124 CPU_DISASSEMBLER (cpu
) = iq2000bf_disassemble_insn
;
126 iq2000_cgen_init_dis (cd
);
133 sim_create_inferior (SIM_DESC sd
, struct bfd
*abfd
, char * const *argv
,
136 SIM_CPU
*current_cpu
= STATE_CPU (sd
, 0);
140 addr
= bfd_get_start_address (abfd
);
143 sim_pc_set (current_cpu
, addr
);
145 /* Standalone mode (i.e. `run`) will take care of the argv for us in
146 sim_open() -> sim_parse_args(). But in debug mode (i.e. 'target sim'
147 with `gdb`), we need to handle it because the user can change the
148 argv on the fly via gdb's 'run'. */
149 if (STATE_PROG_ARGV (sd
) != argv
)
151 freeargv (STATE_PROG_ARGV (sd
));
152 STATE_PROG_ARGV (sd
) = dupargv (argv
);