diff options
author | Mike Frysinger <vapier@gentoo.org> | 2015-03-30 03:05:57 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2015-03-30 12:58:24 -0400 |
commit | 49d62f892578dab739391b7309bc60ea2baeafc4 (patch) | |
tree | 5520688d7704c2cbae7644b0fe1f85254c10136a | |
parent | dbf8e8afcdf6bbec4ecaf911481b7fc9a4a01e87 (diff) | |
download | gdb-49d62f892578dab739391b7309bc60ea2baeafc4.zip gdb-49d62f892578dab739391b7309bc60ea2baeafc4.tar.gz gdb-49d62f892578dab739391b7309bc60ea2baeafc4.tar.bz2 |
sim: arm: convert to nrun
A lot of cpu state is stored in global variables, as is memory handling.
The sim_size support needs unwinding at some point. But at least this
is an improvement on the status quo.
-rw-r--r-- | sim/arm/ChangeLog | 20 | ||||
-rw-r--r-- | sim/arm/Makefile.in | 17 | ||||
-rw-r--r-- | sim/arm/sim-main.h | 56 | ||||
-rw-r--r-- | sim/arm/wrapper.c | 220 |
4 files changed, 160 insertions, 153 deletions
diff --git a/sim/arm/ChangeLog b/sim/arm/ChangeLog index 99a5d50..d12df6c 100644 --- a/sim/arm/ChangeLog +++ b/sim/arm/ChangeLog @@ -1,5 +1,25 @@ 2015-03-30 Mike Frysinger <vapier@gentoo.org> + * Makefile.in (SIM_RUN_OBJS): Delete. + (SIM_EXTRA_CFLAGS): Delete -DSIM_TARGET_SWITCHES and + -DSIM_USE_DEPRECATED_RUN_FRONTEND. + (SIM_OBJS): Change to $(SIM_NEW_COMMON_OBJS). + * sim-main.h: New file. + * wrapper.c: Delete armdefs.h, sim-utils.h, and run-sim.h includes. + Add sim-main.h and sim-options.h includes. + (sim_callback, mem_size, trace): Add TODO comments. + (state): Delete static and add TODO comment. + (sim_kind, myname, big_endian): Delete. + (init): Change big_endian to CURRENT_TARGET_BYTE_ORDER check. + (sim_size, sim_trace, sim_info, sim_target_display_usage, sim_load, + sim_do_command, sim_set_callbacks, sim_complete_command): Delete. + (sim_target_parse_command_line): Mark static. + (free_state): New function. + (sim_open): Rewrite to use new common logic. + (sim_close): Delete body. + +2015-03-30 Mike Frysinger <vapier@gentoo.org> + * Makefile.in (SIM_EXTRA_CFLAGS): Delete -DNEED_UI_LOOP_HOOK. * interp.c [NEED_UI_LOOP_HOOK] (UI_LOOP_POLL_INTERVAL, ui_loop_hook_counter, deprecated_ui_loop_hook): Delete. diff --git a/sim/arm/Makefile.in b/sim/arm/Makefile.in index 1b2ed6a..241911b 100644 --- a/sim/arm/Makefile.in +++ b/sim/arm/Makefile.in @@ -17,14 +17,15 @@ ## COMMON_PRE_CONFIG_FRAG -SIM_EXTRA_CFLAGS = -DMODET -DSIM_TARGET_SWITCHES \ - -DSIM_USE_DEPRECATED_RUN_FRONTEND - -# Use the deprecated run frontend until we migrate to nrun.o -SIM_RUN_OBJS = run.o - -SIM_OBJS = armemu26.o armemu32.o arminit.o armos.o armsupp.o \ - armvirt.o bag.o thumbemu.o wrapper.o sim-load.o \ +SIM_EXTRA_CFLAGS = -DMODET + +SIM_OBJS = \ + $(SIM_NEW_COMMON_OBJS) \ + sim-cpu.o \ + sim-engine.o \ + sim-hload.o \ + armemu26.o armemu32.o arminit.o armos.o armsupp.o \ + armvirt.o bag.o thumbemu.o wrapper.o \ armcopro.o maverick.o iwmmxt.o ## COMMON_POST_CONFIG_FRAG diff --git a/sim/arm/sim-main.h b/sim/arm/sim-main.h new file mode 100644 index 0000000..d020972 --- /dev/null +++ b/sim/arm/sim-main.h @@ -0,0 +1,56 @@ +/* Simulation code for the ARM processor. + Copyright (C) 2009-2015 Free Software Foundation, Inc. + + This file is part of simulators. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef SIM_MAIN_H +#define SIM_MAIN_H + +#include "sim-basics.h" + +typedef address_word sim_cia; + +typedef struct _sim_cpu SIM_CPU; + +#include "sim-base.h" +#include "bfd.h" + +#undef BIT +#include "armdefs.h" + +extern struct ARMul_State *state; + +#define CIA_GET(cpu) PC +#define CIA_SET(cpu,val) ARMul_SetPC (state, (val)) + +struct _sim_cpu { + + sim_cpu_base base; +}; + +struct sim_state { + + sim_cpu *cpu[MAX_NR_PROCESSORS]; +#if (WITH_SMP) +#define STATE_CPU(sd,n) ((sd)->cpu[n]) +#else +#define STATE_CPU(sd,n) ((sd)->cpu[0]) +#endif + + sim_state_base base; +}; + +#endif diff --git a/sim/arm/wrapper.c b/sim/arm/wrapper.c index c1b5321..dd3cfe2 100644 --- a/sim/arm/wrapper.c +++ b/sim/arm/wrapper.c @@ -28,37 +28,31 @@ #include <signal.h> #include "gdb/callback.h" #include "gdb/remote-sim.h" -#include "armdefs.h" +#include "sim-main.h" +#include "sim-options.h" #include "armemu.h" #include "dbg_rdi.h" #include "ansidecl.h" -#include "sim-utils.h" -#include "run-sim.h" #include "gdb/sim-arm.h" #include "gdb/signals.h" #include "libiberty.h" #include "iwmmxt.h" +/* TODO: This should get pulled from the SIM_DESC. */ host_callback *sim_callback; -static struct ARMul_State *state; - -/* Who is using the simulator. */ -static SIM_OPEN_KIND sim_kind; - -/* argv[0] */ -static char *myname; +/* TODO: This should get merged into sim_cpu. */ +struct ARMul_State *state; /* Memory size in bytes. */ +/* TODO: Memory should be converted to the common memory module. */ static int mem_size = (1 << 21); -/* Non-zero to set big endian mode. */ -static int big_endian; - int stop_simulator; #include "dis-asm.h" +/* TODO: Tracing should be converted to common tracing module. */ int trace = 0; int disas = 0; int trace_funcs = 0; @@ -146,7 +140,7 @@ init (void) { ARMul_EmulateInit (); state = ARMul_NewState (); - state->bigendSig = (big_endian ? HIGH : LOW); + state->bigendSig = (CURRENT_TARGET_BYTE_ORDER == BIG_ENDIAN ? HIGH : LOW); ARMul_MemoryInit (state, mem_size); ARMul_OSInit (state); state->verbose = 0; @@ -154,16 +148,6 @@ init (void) } } -/* Set the memory size to SIZE bytes. - Must be called before initializing simulator. */ -/* FIXME: Rename to sim_set_mem_size. */ - -void -sim_size (int size) -{ - mem_size = size; -} - void ARMul_ConsolePrint (ARMul_State * state, const char * format, @@ -220,14 +204,6 @@ sim_read (SIM_DESC sd ATTRIBUTE_UNUSED, } int -sim_trace (SIM_DESC sd ATTRIBUTE_UNUSED) -{ - trace = 1; - sim_resume (sd, 0, 0); - return 1; -} - -int sim_stop (SIM_DESC sd ATTRIBUTE_UNUSED) { state->Emulate = STOP; @@ -437,12 +413,6 @@ sim_create_inferior (SIM_DESC sd ATTRIBUTE_UNUSED, return SIM_RC_OK; } -void -sim_info (SIM_DESC sd ATTRIBUTE_UNUSED, - int verbose ATTRIBUTE_UNUSED) -{ -} - static int frommem (struct ARMul_State *state, unsigned char *memory) { @@ -728,7 +698,7 @@ static swi_options options[] = }; -int +static int sim_target_parse_command_line (int argc, char ** argv) { int i; @@ -830,88 +800,89 @@ sim_target_parse_arg_array (char ** argv) sim_target_parse_command_line (i, argv); } -void -sim_target_display_usage (int help) +static void +free_state (SIM_DESC sd) { - FILE *stream = help ? stdout : stderr; - - fprintf (stream, "%s=<list> Comma seperated list of SWI protocols to supoport.\n\ - This list can contain: NONE, DEMON, ANGEL, REDBOOT and/or ALL.\n", - SWI_SWITCH); - fprintf (stream, "-d\t\tEnable disassembly of instructions during tracing.\n"); - fprintf (stream, "-z\t\tTrace entering and leaving functions.\n\n"); + if (STATE_MODULES (sd) != NULL) + sim_module_uninstall (sd); + sim_cpu_free_all (sd); + sim_state_free (sd); } SIM_DESC -sim_open (SIM_OPEN_KIND kind, - host_callback * ptr, - struct bfd * abfd, - char ** argv) +sim_open (SIM_OPEN_KIND kind, + host_callback *cb, + struct bfd *abfd, + char **argv) { - sim_kind = kind; + SIM_DESC sd = sim_state_alloc (kind, cb); + SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); - if (myname) - free (myname); - myname = (char *) xstrdup (argv[0]); + /* The cpu data is kept in a separately allocated chunk of memory. */ + if (sim_cpu_alloc_all (sd, 1, /*cgen_cpu_max_extra_bytes ()*/0) != SIM_RC_OK) + { + free_state (sd); + return 0; + } - sim_callback = ptr; + if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK) + { + free_state (sd); + return 0; + } -#ifdef SIM_TARGET_SWITCHES - sim_target_parse_arg_array (argv); -#endif - - /* Decide upon the endian-ness of the processor. - If we can, get the information from the bfd itself. - Otherwise look to see if we have been given a command - line switch that tells us. Otherwise default to little endian. */ - if (abfd != NULL) - big_endian = bfd_big_endian (abfd); - else if (argv[1] != NULL) + /* getopt will print the error message so we just have to exit if this fails. + FIXME: Hmmm... in the case of gdb we need getopt to call + print_filtered. */ + if (sim_parse_args (sd, argv) != SIM_RC_OK) { - int i; + free_state (sd); + return 0; + } - /* Scan for endian-ness and memory-size switches. */ - for (i = 0; (argv[i] != NULL) && (argv[i][0] != 0); i++) - if (argv[i][0] == '-' && argv[i][1] == 'E') - { - char c; + /* Check for/establish the a reference program image. */ + if (sim_analyze_program (sd, + (STATE_PROG_ARGV (sd) != NULL + ? *STATE_PROG_ARGV (sd) + : NULL), abfd) != SIM_RC_OK) + { + free_state (sd); + return 0; + } - if ((c = argv[i][2]) == 0) - { - ++i; - c = argv[i][0]; - } + /* Configure/verify the target byte order and other runtime + configuration options. */ + if (sim_config (sd) != SIM_RC_OK) + { + sim_module_uninstall (sd); + return 0; + } - switch (c) - { - case 0: - sim_callback->printf_filtered - (sim_callback, "No argument to -E option provided\n"); - break; + if (sim_post_argv_init (sd) != SIM_RC_OK) + { + /* Uninstall the modules to avoid memory leaks, + file descriptor leaks, etc. */ + sim_module_uninstall (sd); + return 0; + } - case 'b': - case 'B': - big_endian = 1; - break; + sim_callback = cb; - case 'l': - case 'L': - big_endian = 0; - break; + sim_target_parse_arg_array (argv); - default: - sim_callback->printf_filtered - (sim_callback, "Unrecognised argument to -E option\n"); - break; - } - } - else if (argv[i][0] == '-' && argv[i][1] == 'm') + if (argv[1] != NULL) + { + int i; + + /* Scan for memory-size switches. */ + for (i = 0; (argv[i] != NULL) && (argv[i][0] != 0); i++) + if (argv[i][0] == '-' && argv[i][1] == 'm') { if (argv[i][2] != '\0') - sim_size (atoi (&argv[i][2])); + mem_size = atoi (&argv[i][2]); else if (argv[i + 1] != NULL) { - sim_size (atoi (argv[i + 1])); + mem_size = atoi (argv[i + 1]); i++; } else @@ -924,34 +895,14 @@ sim_open (SIM_OPEN_KIND kind, } } - return (SIM_DESC) 1; + return sd; } void sim_close (SIM_DESC sd ATTRIBUTE_UNUSED, int quitting ATTRIBUTE_UNUSED) { - if (myname) - free (myname); - myname = NULL; -} - -SIM_RC -sim_load (SIM_DESC sd, - const char *prog, - bfd *abfd, - int from_tty ATTRIBUTE_UNUSED) -{ - bfd *prog_bfd; - - prog_bfd = sim_load_file (sd, myname, sim_callback, prog, abfd, - sim_kind == SIM_OPEN_DEBUG, 0, sim_write); - if (prog_bfd == NULL) - return SIM_RC_FAIL; - ARMul_SetPC (state, bfd_get_start_address (prog_bfd)); - if (abfd == NULL) - bfd_close (prog_bfd); - return SIM_RC_OK; + /* Nothing to do. */ } void @@ -981,24 +932,3 @@ sim_stop_reason (SIM_DESC sd ATTRIBUTE_UNUSED, *sigrc = 0; } } - -void -sim_do_command (SIM_DESC sd ATTRIBUTE_UNUSED, - const char *cmd ATTRIBUTE_UNUSED) -{ - (*sim_callback->printf_filtered) - (sim_callback, - "This simulator does not accept any commands.\n"); -} - -void -sim_set_callbacks (host_callback *ptr) -{ - sim_callback = ptr; -} - -char ** -sim_complete_command (SIM_DESC sd, const char *text, const char *word) -{ - return NULL; -} |