1 /* Main simulator entry points specific to the FRV.
2 Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
3 Contributed by Red Hat.
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 2, or (at your option)
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 along
18 with this program; if not, write to the Free Software Foundation, Inc.,
19 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 #define WANT_CPU_FRVBF
27 #include "sim-options.h"
28 #include "libiberty.h"
32 static void free_state (SIM_DESC
);
33 static void print_frv_misc_cpu (SIM_CPU
*cpu
, int verbose
);
35 /* Records simulator descriptor so utilities like frv_dump_regs can be
37 SIM_DESC current_state
;
39 /* Cover function of sim_state_free to free the cpu buffers as well. */
42 free_state (SIM_DESC sd
)
44 if (STATE_MODULES (sd
) != NULL
)
45 sim_module_uninstall (sd
);
46 sim_cpu_free_all (sd
);
50 /* Create an instance of the simulator. */
53 sim_open (kind
, callback
, abfd
, argv
)
55 host_callback
*callback
;
61 unsigned long elf_flags
= 0;
62 SIM_DESC sd
= sim_state_alloc (kind
, callback
);
64 /* The cpu data is kept in a separately allocated chunk of memory. */
65 if (sim_cpu_alloc_all (sd
, 1, cgen_cpu_max_extra_bytes ()) != SIM_RC_OK
)
71 #if 0 /* FIXME: pc is in mach-specific struct */
72 /* FIXME: watchpoints code shouldn't need this */
74 SIM_CPU
*current_cpu
= STATE_CPU (sd
, 0);
75 STATE_WATCHPOINTS (sd
)->pc
= &(PC
);
76 STATE_WATCHPOINTS (sd
)->sizeof_pc
= sizeof (PC
);
80 if (sim_pre_argv_init (sd
, argv
[0]) != SIM_RC_OK
)
86 /* These options override any module options.
87 Obviously ambiguity should be avoided, however the caller may wish to
88 augment the meaning of an option. */
89 sim_add_option_table (sd
, NULL
, frv_options
);
91 /* getopt will print the error message so we just have to exit if this fails.
92 FIXME: Hmmm... in the case of gdb we need getopt to call
94 if (sim_parse_args (sd
, argv
) != SIM_RC_OK
)
101 /* Allocate a handler for the control registers and other devices
102 if no memory for that range has been allocated by the user.
103 All are allocated in one chunk to keep things from being
104 unnecessarily complicated. */
105 if (sim_core_read_buffer (sd
, NULL
, read_map
, &c
, FRV_DEVICE_ADDR
, 1) == 0)
106 sim_core_attach (sd
, NULL
,
110 FRV_DEVICE_ADDR
, FRV_DEVICE_LEN
/*nr_bytes*/,
116 /* Allocate core managed memory if none specified by user.
117 Use address 4 here in case the user wanted address 0 unmapped. */
118 if (sim_core_read_buffer (sd
, NULL
, read_map
, &c
, 4, 1) == 0)
119 sim_do_commandf (sd
, "memory region 0,0x%lx", FRV_DEFAULT_MEM_SIZE
);
121 /* check for/establish the reference program image */
122 if (sim_analyze_program (sd
,
123 (STATE_PROG_ARGV (sd
) != NULL
124 ? *STATE_PROG_ARGV (sd
)
132 /* set machine and architecture correctly instead of defaulting to frv */
134 bfd
*prog_bfd
= STATE_PROG_BFD (sd
);
135 if (prog_bfd
!= NULL
)
137 struct elf_backend_data
*backend_data
;
139 if (bfd_get_arch (prog_bfd
) != bfd_arch_frv
)
141 sim_io_eprintf (sd
, "%s: \"%s\" is not a FRV object file\n",
143 bfd_get_filename (prog_bfd
));
148 backend_data
= get_elf_backend_data (prog_bfd
);
150 if (backend_data
!= NULL
)
151 backend_data
->elf_backend_object_p (prog_bfd
);
153 elf_flags
= elf_elfheader (prog_bfd
)->e_flags
;
157 /* Establish any remaining configuration options. */
158 if (sim_config (sd
) != SIM_RC_OK
)
164 if (sim_post_argv_init (sd
) != SIM_RC_OK
)
170 /* Open a copy of the cpu descriptor table. */
172 CGEN_CPU_DESC cd
= frv_cgen_cpu_open_1 (STATE_ARCHITECTURE (sd
)->printable_name
,
174 for (i
= 0; i
< MAX_NR_PROCESSORS
; ++i
)
176 SIM_CPU
*cpu
= STATE_CPU (sd
, i
);
177 CPU_CPU_DESC (cpu
) = cd
;
178 CPU_DISASSEMBLER (cpu
) = sim_cgen_disassemble_insn
;
179 CPU_ELF_FLAGS (cpu
) = elf_flags
;
181 frv_cgen_init_dis (cd
);
184 /* Initialize various cgen things not done by common framework.
185 Must be done after frv_cgen_cpu_open. */
188 /* CPU specific initialization. */
189 for (i
= 0; i
< MAX_NR_PROCESSORS
; ++i
)
191 SIM_CPU
* cpu
= STATE_CPU (sd
, i
);
192 frv_initialize (cpu
, sd
);
195 /* Store in a global so things like sparc32_dump_regs can be invoked
196 from the gdb command line. */
203 sim_close (sd
, quitting
)
208 /* Terminate cache support. */
209 for (i
= 0; i
< MAX_NR_PROCESSORS
; ++i
)
211 SIM_CPU
* cpu
= STATE_CPU (sd
, i
);
212 frv_cache_term (CPU_INSN_CACHE (cpu
));
213 frv_cache_term (CPU_DATA_CACHE (cpu
));
216 frv_cgen_cpu_close (CPU_CPU_DESC (STATE_CPU (sd
, 0)));
217 sim_module_uninstall (sd
);
221 sim_create_inferior (sd
, abfd
, argv
, envp
)
227 SIM_CPU
*current_cpu
= STATE_CPU (sd
, 0);
231 addr
= bfd_get_start_address (abfd
);
234 sim_pc_set (current_cpu
, addr
);
237 STATE_ARGV (sd
) = sim_copy_argv (argv
);
238 STATE_ENVP (sd
) = sim_copy_argv (envp
);
245 sim_do_command (sd
, cmd
)
249 if (sim_args_command (sd
, cmd
) != SIM_RC_OK
)
250 sim_io_eprintf (sd
, "Unknown command `%s'\n", cmd
);