X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=sim%2Farm%2Fwrapper.c;h=9e61ed6cfc656ad19dc816a9cf667ed3c12226c5;hb=77cf2ef5dc9099501529151921a73be904757466;hp=c8361ba9faea2b6b770bd93c48affba2bd286607;hpb=26216b98222fd93bf11128859575552d180d0576;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/arm/wrapper.c b/sim/arm/wrapper.c index c8361ba9fa..9e61ed6cfc 100644 --- a/sim/arm/wrapper.c +++ b/sim/arm/wrapper.c @@ -1,28 +1,26 @@ /* run front end support for arm - Copyright (C) 1995, 1996, 1997, 2000, 2001, 2002 - Free Software Foundation, Inc. + Copyright (C) 1995-2016 Free Software Foundation, Inc. This file is part of ARM SIM. - GCC 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 2, or (at your - option) any later version. + 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. - GCC 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. + 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, write to the Free - Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ /* This file provides the interface between the simulator and run.c and gdb (when the simulator is linked with gdb). All simulator interaction should go through this file. */ +#include "config.h" #include #include #include @@ -30,80 +28,130 @@ #include #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; +/* TODO: This should get merged into sim_cpu. */ +struct ARMul_State *state; -/* Who is using the simulator. */ -static SIM_OPEN_KIND sim_kind; +/* Memory size in bytes. */ +/* TODO: Memory should be converted to the common memory module. */ +static int mem_size = (1 << 21); -/* argv[0] */ -static char *myname; +int stop_simulator; -/* Memory size in bytes. */ -static int mem_size = (1 << 23); +#include "dis-asm.h" -/* Non-zero to display start up banner, and maybe other things. */ -static int verbosity; +/* TODO: Tracing should be converted to common tracing module. */ +int trace = 0; +int disas = 0; +int trace_funcs = 0; -/* Non-zero to set big endian mode. */ -static int big_endian; +static struct disassemble_info info; +static char opbuf[1000]; -int stop_simulator; +static int +op_printf (char *buf, char *fmt, ...) +{ + int ret; + va_list ap; -static void -init () + va_start (ap, fmt); + ret = vsprintf (opbuf + strlen (opbuf), fmt, ap); + va_end (ap); + return ret; +} + +static int +sim_dis_read (bfd_vma memaddr ATTRIBUTE_UNUSED, + bfd_byte * ptr, + unsigned int length, + struct disassemble_info * info) { - static int done; + ARMword val = (ARMword) *((ARMword *) info->application_data); - if (!done) + while (length--) { - ARMul_EmulateInit (); - state = ARMul_NewState (); - state->bigendSig = (big_endian ? HIGH : LOW); - ARMul_MemoryInit (state, mem_size); - ARMul_OSInit (state); - ARMul_CoProInit (state); - state->verbose = verbosity; - done = 1; + * ptr ++ = val & 0xFF; + val >>= 8; } + return 0; } -/* Set verbosity level of simulator. - This is not intended to produce detailed tracing or debugging information. - Just summaries. */ -/* FIXME: common/run.c doesn't do this yet. */ - void -sim_set_verbose (v) - int v; +print_insn (ARMword instr) { - verbosity = v; + int size; + + opbuf[0] = 0; + info.application_data = & instr; + size = print_insn_little_arm (0, & info); + fprintf (stderr, " %*s\n", size, opbuf); } -/* Set the memory size to SIZE bytes. - Must be called before initializing simulator. */ -/* FIXME: Rename to sim_set_mem_size. */ +/* Cirrus DSP registers. -void -sim_size (size) - int size; + We need to define these registers outside of maverick.c because + maverick.c might not be linked in unless --target=arm9e-* in which + case wrapper.c will not compile because it tries to access Cirrus + registers. This should all go away once we get the Cirrus and ARM + Coprocessor to coexist in armcopro.c-- aldyh. */ + +struct maverick_regs +{ + union + { + int i; + float f; + } upper; + + union + { + int i; + float f; + } lower; +}; + +union maverick_acc_regs { - mem_size = size; + long double ld; /* Acc registers are 72-bits. */ +}; + +struct maverick_regs DSPregs[16]; +union maverick_acc_regs DSPacc[4]; +ARMword DSPsc; + +static void +init (void) +{ + static int done; + + if (!done) + { + ARMul_EmulateInit (); + state = ARMul_NewState (); + state->bigendSig = (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? HIGH : LOW); + ARMul_MemoryInit (state, mem_size); + ARMul_OSInit (state); + state->verbose = 0; + done = 1; + } } void -ARMul_ConsolePrint VPARAMS ((ARMul_State * state, - const char * format, - ...)) +ARMul_ConsolePrint (ARMul_State * state, + const char * format, + ...) { va_list ap; @@ -115,21 +163,11 @@ ARMul_ConsolePrint VPARAMS ((ARMul_State * state, } } -ARMword -ARMul_Debug (state, pc, instr) - ARMul_State * state ATTRIBUTE_UNUSED; - ARMword pc ATTRIBUTE_UNUSED; - ARMword instr ATTRIBUTE_UNUSED; -{ - return 0; -} - int -sim_write (sd, addr, buffer, size) - SIM_DESC sd ATTRIBUTE_UNUSED; - SIM_ADDR addr; - unsigned char * buffer; - int size; +sim_write (SIM_DESC sd ATTRIBUTE_UNUSED, + SIM_ADDR addr, + const unsigned char * buffer, + int size) { int i; @@ -142,11 +180,10 @@ sim_write (sd, addr, buffer, size) } int -sim_read (sd, addr, buffer, size) - SIM_DESC sd ATTRIBUTE_UNUSED; - SIM_ADDR addr; - unsigned char * buffer; - int size; +sim_read (SIM_DESC sd ATTRIBUTE_UNUSED, + SIM_ADDR addr, + unsigned char * buffer, + int size) { int i; @@ -159,18 +196,7 @@ sim_read (sd, addr, buffer, size) } int -sim_trace (sd) - SIM_DESC sd ATTRIBUTE_UNUSED; -{ - (*sim_callback->printf_filtered) - (sim_callback, - "This simulator does not support tracing\n"); - return 1; -} - -int -sim_stop (sd) - SIM_DESC sd ATTRIBUTE_UNUSED; +sim_stop (SIM_DESC sd ATTRIBUTE_UNUSED) { state->Emulate = STOP; stop_simulator = 1; @@ -178,10 +204,9 @@ sim_stop (sd) } void -sim_resume (sd, step, siggnal) - SIM_DESC sd ATTRIBUTE_UNUSED; - int step; - int siggnal ATTRIBUTE_UNUSED; +sim_resume (SIM_DESC sd ATTRIBUTE_UNUSED, + int step, + int siggnal ATTRIBUTE_UNUSED) { state->EndCondition = 0; stop_simulator = 0; @@ -202,22 +227,32 @@ sim_resume (sd, step, siggnal) } SIM_RC -sim_create_inferior (sd, abfd, argv, env) - SIM_DESC sd ATTRIBUTE_UNUSED; - struct _bfd * abfd; - char ** argv; - char ** env; +sim_create_inferior (SIM_DESC sd ATTRIBUTE_UNUSED, + struct bfd * abfd, + char ** argv, + char ** env) { int argvlen = 0; int mach; char **arg; + init (); + if (abfd != NULL) - ARMul_SetPC (state, bfd_get_start_address (abfd)); + { + ARMul_SetPC (state, bfd_get_start_address (abfd)); + mach = bfd_get_mach (abfd); + } else - ARMul_SetPC (state, 0); /* ??? */ + { + ARMul_SetPC (state, 0); /* ??? */ + mach = 0; + } - mach = bfd_get_mach (abfd); +#ifdef MODET + if (abfd != NULL && (bfd_get_start_address (abfd) & 1)) + SETT; +#endif switch (mach) { @@ -232,8 +267,37 @@ sim_create_inferior (sd, abfd, argv, env) /* We wouldn't set the machine type with earlier toolchains, so we explicitly select a processor capable of supporting all ARMs in 32bit mode. */ + ARMul_SelectProcessor (state, ARM_v5_Prop | ARM_v5e_Prop | ARM_v6_Prop); + break; + case bfd_mach_arm_XScale: - ARMul_SelectProcessor (state, ARM_v5_Prop | ARM_v5e_Prop | ARM_XScale_Prop); + ARMul_SelectProcessor (state, ARM_v5_Prop | ARM_v5e_Prop | ARM_XScale_Prop | ARM_v6_Prop); + break; + + case bfd_mach_arm_iWMMXt2: + case bfd_mach_arm_iWMMXt: + { + extern int SWI_vector_installed; + ARMword i; + + if (! SWI_vector_installed) + { + /* Intialise the hardware vectors to zero. */ + if (! SWI_vector_installed) + for (i = ARMul_ResetV; i <= ARMFIQV; i += 4) + ARMul_WriteWord (state, i, 0); + + /* ARM_WriteWord will have detected the write to the SWI vector, + but we want SWI_vector_installed to remain at 0 so that thumb + mode breakpoints will work. */ + SWI_vector_installed = 0; + } + } + ARMul_SelectProcessor (state, ARM_v5_Prop | ARM_v5e_Prop | ARM_XScale_Prop | ARM_iWMMXt_Prop); + break; + + case bfd_mach_arm_ep9312: + ARMul_SelectProcessor (state, ARM_v4_Prop | ARM_ep9312_Prop); break; case bfd_mach_arm_5: @@ -274,17 +338,16 @@ sim_create_inferior (sd, abfd, argv, env) break; } - if ( mach != bfd_mach_arm_3 - && mach != bfd_mach_arm_3M - && mach != bfd_mach_arm_2 - && mach != bfd_mach_arm_2a) - { - /* Reset mode to ARM. A gdb user may rerun a program that had entered - THUMB mode from the start and cause the ARM-mode startup code to be - executed in THUMB mode. */ - ARMul_SetCPSR (state, SVC32MODE); - } - + memset (& info, 0, sizeof (info)); + INIT_DISASSEMBLE_INFO (info, stdout, op_printf); + info.read_memory_func = sim_dis_read; + info.arch = bfd_get_arch (abfd); + info.mach = bfd_get_mach (abfd); + info.endian_code = BFD_ENDIAN_LITTLE; + if (info.mach == 0) + info.arch = bfd_arch_arm; + disassemble_init_for_target (& info); + if (argv != NULL) { /* Set up the command line by laboriously stringing together @@ -336,17 +399,8 @@ sim_create_inferior (sd, abfd, argv, env) return SIM_RC_OK; } -void -sim_info (sd, verbose) - SIM_DESC sd ATTRIBUTE_UNUSED; - int verbose ATTRIBUTE_UNUSED; -{ -} - static int -frommem (state, memory) - struct ARMul_State *state; - unsigned char *memory; +frommem (struct ARMul_State *state, unsigned char *memory) { if (state->bigendSig == HIGH) return (memory[0] << 24) | (memory[1] << 16) @@ -357,10 +411,9 @@ frommem (state, memory) } static void -tomem (state, memory, val) - struct ARMul_State *state; - unsigned char *memory; - int val; +tomem (struct ARMul_State *state, + unsigned char *memory, + int val) { if (state->bigendSig == HIGH) { @@ -378,12 +431,8 @@ tomem (state, memory, val) } } -int -sim_store_register (sd, rn, memory, length) - SIM_DESC sd ATTRIBUTE_UNUSED; - int rn; - unsigned char *memory; - int length ATTRIBUTE_UNUSED; +static int +arm_reg_store (SIM_CPU *cpu, int rn, unsigned char *memory, int length) { init (); @@ -422,21 +471,76 @@ sim_store_register (sd, rn, memory, length) ARMul_CPSRAltered (state); break; + case SIM_ARM_MAVERIC_COP0R0_REGNUM: + case SIM_ARM_MAVERIC_COP0R1_REGNUM: + case SIM_ARM_MAVERIC_COP0R2_REGNUM: + case SIM_ARM_MAVERIC_COP0R3_REGNUM: + case SIM_ARM_MAVERIC_COP0R4_REGNUM: + case SIM_ARM_MAVERIC_COP0R5_REGNUM: + case SIM_ARM_MAVERIC_COP0R6_REGNUM: + case SIM_ARM_MAVERIC_COP0R7_REGNUM: + case SIM_ARM_MAVERIC_COP0R8_REGNUM: + case SIM_ARM_MAVERIC_COP0R9_REGNUM: + case SIM_ARM_MAVERIC_COP0R10_REGNUM: + case SIM_ARM_MAVERIC_COP0R11_REGNUM: + case SIM_ARM_MAVERIC_COP0R12_REGNUM: + case SIM_ARM_MAVERIC_COP0R13_REGNUM: + case SIM_ARM_MAVERIC_COP0R14_REGNUM: + case SIM_ARM_MAVERIC_COP0R15_REGNUM: + memcpy (& DSPregs [rn - SIM_ARM_MAVERIC_COP0R0_REGNUM], + memory, sizeof (struct maverick_regs)); + return sizeof (struct maverick_regs); + + case SIM_ARM_MAVERIC_DSPSC_REGNUM: + memcpy (&DSPsc, memory, sizeof DSPsc); + return sizeof DSPsc; + + case SIM_ARM_IWMMXT_COP0R0_REGNUM: + case SIM_ARM_IWMMXT_COP0R1_REGNUM: + case SIM_ARM_IWMMXT_COP0R2_REGNUM: + case SIM_ARM_IWMMXT_COP0R3_REGNUM: + case SIM_ARM_IWMMXT_COP0R4_REGNUM: + case SIM_ARM_IWMMXT_COP0R5_REGNUM: + case SIM_ARM_IWMMXT_COP0R6_REGNUM: + case SIM_ARM_IWMMXT_COP0R7_REGNUM: + case SIM_ARM_IWMMXT_COP0R8_REGNUM: + case SIM_ARM_IWMMXT_COP0R9_REGNUM: + case SIM_ARM_IWMMXT_COP0R10_REGNUM: + case SIM_ARM_IWMMXT_COP0R11_REGNUM: + case SIM_ARM_IWMMXT_COP0R12_REGNUM: + case SIM_ARM_IWMMXT_COP0R13_REGNUM: + case SIM_ARM_IWMMXT_COP0R14_REGNUM: + case SIM_ARM_IWMMXT_COP0R15_REGNUM: + case SIM_ARM_IWMMXT_COP1R0_REGNUM: + case SIM_ARM_IWMMXT_COP1R1_REGNUM: + case SIM_ARM_IWMMXT_COP1R2_REGNUM: + case SIM_ARM_IWMMXT_COP1R3_REGNUM: + case SIM_ARM_IWMMXT_COP1R4_REGNUM: + case SIM_ARM_IWMMXT_COP1R5_REGNUM: + case SIM_ARM_IWMMXT_COP1R6_REGNUM: + case SIM_ARM_IWMMXT_COP1R7_REGNUM: + case SIM_ARM_IWMMXT_COP1R8_REGNUM: + case SIM_ARM_IWMMXT_COP1R9_REGNUM: + case SIM_ARM_IWMMXT_COP1R10_REGNUM: + case SIM_ARM_IWMMXT_COP1R11_REGNUM: + case SIM_ARM_IWMMXT_COP1R12_REGNUM: + case SIM_ARM_IWMMXT_COP1R13_REGNUM: + case SIM_ARM_IWMMXT_COP1R14_REGNUM: + case SIM_ARM_IWMMXT_COP1R15_REGNUM: + return Store_Iwmmxt_Register (rn - SIM_ARM_IWMMXT_COP0R0_REGNUM, memory); + default: return 0; } - return -1; + return length; } -int -sim_fetch_register (sd, rn, memory, length) - SIM_DESC sd ATTRIBUTE_UNUSED; - int rn; - unsigned char *memory; - int length ATTRIBUTE_UNUSED; +static int +arm_reg_fetch (SIM_CPU *cpu, int rn, unsigned char *memory, int length) { ARMword regval; + int len = length; init (); @@ -477,26 +581,80 @@ sim_fetch_register (sd, rn, memory, length) regval = ARMul_GetCPSR (state); break; + case SIM_ARM_MAVERIC_COP0R0_REGNUM: + case SIM_ARM_MAVERIC_COP0R1_REGNUM: + case SIM_ARM_MAVERIC_COP0R2_REGNUM: + case SIM_ARM_MAVERIC_COP0R3_REGNUM: + case SIM_ARM_MAVERIC_COP0R4_REGNUM: + case SIM_ARM_MAVERIC_COP0R5_REGNUM: + case SIM_ARM_MAVERIC_COP0R6_REGNUM: + case SIM_ARM_MAVERIC_COP0R7_REGNUM: + case SIM_ARM_MAVERIC_COP0R8_REGNUM: + case SIM_ARM_MAVERIC_COP0R9_REGNUM: + case SIM_ARM_MAVERIC_COP0R10_REGNUM: + case SIM_ARM_MAVERIC_COP0R11_REGNUM: + case SIM_ARM_MAVERIC_COP0R12_REGNUM: + case SIM_ARM_MAVERIC_COP0R13_REGNUM: + case SIM_ARM_MAVERIC_COP0R14_REGNUM: + case SIM_ARM_MAVERIC_COP0R15_REGNUM: + memcpy (memory, & DSPregs [rn - SIM_ARM_MAVERIC_COP0R0_REGNUM], + sizeof (struct maverick_regs)); + return sizeof (struct maverick_regs); + + case SIM_ARM_MAVERIC_DSPSC_REGNUM: + memcpy (memory, & DSPsc, sizeof DSPsc); + return sizeof DSPsc; + + case SIM_ARM_IWMMXT_COP0R0_REGNUM: + case SIM_ARM_IWMMXT_COP0R1_REGNUM: + case SIM_ARM_IWMMXT_COP0R2_REGNUM: + case SIM_ARM_IWMMXT_COP0R3_REGNUM: + case SIM_ARM_IWMMXT_COP0R4_REGNUM: + case SIM_ARM_IWMMXT_COP0R5_REGNUM: + case SIM_ARM_IWMMXT_COP0R6_REGNUM: + case SIM_ARM_IWMMXT_COP0R7_REGNUM: + case SIM_ARM_IWMMXT_COP0R8_REGNUM: + case SIM_ARM_IWMMXT_COP0R9_REGNUM: + case SIM_ARM_IWMMXT_COP0R10_REGNUM: + case SIM_ARM_IWMMXT_COP0R11_REGNUM: + case SIM_ARM_IWMMXT_COP0R12_REGNUM: + case SIM_ARM_IWMMXT_COP0R13_REGNUM: + case SIM_ARM_IWMMXT_COP0R14_REGNUM: + case SIM_ARM_IWMMXT_COP0R15_REGNUM: + case SIM_ARM_IWMMXT_COP1R0_REGNUM: + case SIM_ARM_IWMMXT_COP1R1_REGNUM: + case SIM_ARM_IWMMXT_COP1R2_REGNUM: + case SIM_ARM_IWMMXT_COP1R3_REGNUM: + case SIM_ARM_IWMMXT_COP1R4_REGNUM: + case SIM_ARM_IWMMXT_COP1R5_REGNUM: + case SIM_ARM_IWMMXT_COP1R6_REGNUM: + case SIM_ARM_IWMMXT_COP1R7_REGNUM: + case SIM_ARM_IWMMXT_COP1R8_REGNUM: + case SIM_ARM_IWMMXT_COP1R9_REGNUM: + case SIM_ARM_IWMMXT_COP1R10_REGNUM: + case SIM_ARM_IWMMXT_COP1R11_REGNUM: + case SIM_ARM_IWMMXT_COP1R12_REGNUM: + case SIM_ARM_IWMMXT_COP1R13_REGNUM: + case SIM_ARM_IWMMXT_COP1R14_REGNUM: + case SIM_ARM_IWMMXT_COP1R15_REGNUM: + return Fetch_Iwmmxt_Register (rn - SIM_ARM_IWMMXT_COP0R0_REGNUM, memory); + default: return 0; } - while (length) + while (len) { tomem (state, memory, regval); - length -= 4; + len -= 4; memory += 4; regval = 0; - } + } - return -1; + return length; } -#ifdef SIM_TARGET_SWITCHES - -static void sim_target_parse_arg_array PARAMS ((char **)); - typedef struct { char * swi_option; @@ -520,10 +678,8 @@ static swi_options options[] = }; -int -sim_target_parse_command_line (argc, argv) - int argc; - char ** argv; +static int +sim_target_parse_command_line (int argc, char ** argv) { int i; @@ -535,6 +691,34 @@ sim_target_parse_command_line (argc, argv) if ((ptr == NULL) || (* ptr != '-')) break; + if (strcmp (ptr, "-t") == 0) + { + trace = 1; + continue; + } + + if (strcmp (ptr, "-z") == 0) + { + /* Remove this option from the argv array. */ + for (arg = i; arg < argc; arg ++) + argv[arg] = argv[arg + 1]; + argc --; + i --; + trace_funcs = 1; + continue; + } + + if (strcmp (ptr, "-d") == 0) + { + /* Remove this option from the argv array. */ + for (arg = i; arg < argc; arg ++) + argv[arg] = argv[arg + 1]; + argc --; + i --; + disas = 1; + continue; + } + if (strncmp (ptr, SWI_SWITCH, sizeof SWI_SWITCH - 1) != 0) continue; @@ -544,14 +728,14 @@ sim_target_parse_command_line (argc, argv) for (arg = i; arg < argc; arg ++) argv[arg] = argv[arg + 1]; argc --; - + ptr = argv[i]; } else ptr += sizeof SWI_SWITCH; swi_mask = 0; - + while (* ptr) { int i; @@ -575,7 +759,7 @@ sim_target_parse_command_line (argc, argv) if (* ptr != 0) fprintf (stderr, "Ignoring swi options: %s\n", ptr); - + /* Remove this option from the argv array. */ for (arg = i; arg < argc; arg ++) argv[arg] = argv[arg + 1]; @@ -586,131 +770,139 @@ sim_target_parse_command_line (argc, argv) } static void -sim_target_parse_arg_array (argv) - char ** argv; +sim_target_parse_arg_array (char ** argv) { - int i; + sim_target_parse_command_line (countargv (argv), argv); +} - for (i = 0; argv[i]; i++) - ; +static sim_cia +arm_pc_get (sim_cpu *cpu) +{ + return PC; +} - return (void) sim_target_parse_command_line (i, argv); +static void +arm_pc_set (sim_cpu *cpu, sim_cia pc) +{ + ARMul_SetPC (state, pc); } -void -sim_target_display_usage () +static void +free_state (SIM_DESC sd) { - fprintf (stderr, "%s= Comma seperated list of SWI protocols to supoport.\n\ - This list can contain: NONE, DEMON, ANGEL, REDBOOT and/or ALL.\n", - SWI_SWITCH); + if (STATE_MODULES (sd) != NULL) + sim_module_uninstall (sd); + sim_cpu_free_all (sd); + sim_state_free (sd); } -#endif SIM_DESC -sim_open (kind, ptr, abfd, argv) - 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; - if (myname) free (myname); - myname = (char *) xstrdup (argv[0]); - sim_callback = ptr; + int i; + SIM_DESC sd = sim_state_alloc (kind, cb); + SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); + + /* 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; + } + + if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK) + { + free_state (sd); + return 0; + } + + /* The parser will print an error message for us, so we silently return. */ + if (sim_parse_args (sd, argv) != SIM_RC_OK) + { + free_state (sd); + return 0; + } + + /* 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; + } + + /* Configure/verify the target byte order and other runtime + configuration options. */ + if (sim_config (sd) != SIM_RC_OK) + { + sim_module_uninstall (sd); + return 0; + } + + 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; + } + + /* CPU specific initialization. */ + for (i = 0; i < MAX_NR_PROCESSORS; ++i) + { + SIM_CPU *cpu = STATE_CPU (sd, i); + + CPU_REG_FETCH (cpu) = arm_reg_fetch; + CPU_REG_STORE (cpu) = arm_reg_store; + CPU_PC_FETCH (cpu) = arm_pc_get; + CPU_PC_STORE (cpu) = arm_pc_set; + } + + sim_callback = cb; -#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) + + if (argv[1] != NULL) { int i; - /* Scan for endian-ness switch. */ + /* Scan for memory-size switches. */ for (i = 0; (argv[i] != NULL) && (argv[i][0] != 0); i++) - if (argv[i][0] == '-' && argv[i][1] == 'E') + if (argv[i][0] == '-' && argv[i][1] == 'm') { - char c; - - if ((c = argv[i][2]) == 0) + if (argv[i][2] != '\0') + mem_size = atoi (&argv[i][2]); + else if (argv[i + 1] != NULL) { - ++i; - c = argv[i][0]; + mem_size = atoi (argv[i + 1]); + i++; } - - switch (c) + else { - case 0: - sim_callback->printf_filtered - (sim_callback, "No argument to -E option provided\n"); - break; - - case 'b': - case 'B': - big_endian = 1; - break; - - case 'l': - case 'L': - big_endian = 0; - break; - - default: - sim_callback->printf_filtered - (sim_callback, "Unrecognised argument to -E option\n"); - break; + sim_callback->printf_filtered (sim_callback, + "Missing argument to -m option\n"); + return NULL; } } } - return (SIM_DESC) 1; + return sd; } void -sim_close (sd, quitting) - SIM_DESC sd ATTRIBUTE_UNUSED; - int quitting ATTRIBUTE_UNUSED; -{ - if (myname) - free (myname); - myname = NULL; -} - -SIM_RC -sim_load (sd, prog, abfd, from_tty) - SIM_DESC sd; - 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; -} - -void -sim_stop_reason (sd, reason, sigrc) - SIM_DESC sd ATTRIBUTE_UNUSED; - enum sim_stop *reason; - int *sigrc; +sim_stop_reason (SIM_DESC sd ATTRIBUTE_UNUSED, + enum sim_stop *reason, + int *sigrc) { if (stop_simulator) { *reason = sim_stopped; - *sigrc = SIGINT; + *sigrc = GDB_SIGNAL_INT; } else if (state->EndCondition == 0) { @@ -721,25 +913,11 @@ sim_stop_reason (sd, reason, sigrc) { *reason = sim_stopped; if (state->EndCondition == RDIError_BreakpointReached) - *sigrc = SIGTRAP; + *sigrc = GDB_SIGNAL_TRAP; + else if ( state->EndCondition == RDIError_DataAbort + || state->EndCondition == RDIError_AddressException) + *sigrc = GDB_SIGNAL_BUS; else *sigrc = 0; } } - -void -sim_do_command (sd, cmd) - SIM_DESC sd ATTRIBUTE_UNUSED; - char *cmd ATTRIBUTE_UNUSED; -{ - (*sim_callback->printf_filtered) - (sim_callback, - "This simulator does not accept any commands.\n"); -} - -void -sim_set_callbacks (ptr) - host_callback *ptr; -{ - sim_callback = ptr; -}