X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=sim%2Farm%2Fwrapper.c;h=9e61ed6cfc656ad19dc816a9cf667ed3c12226c5;hb=77cf2ef5dc9099501529151921a73be904757466;hp=c475962bc42920bd2e65a43da94b67781f007f4a;hpb=b2b255bdf3d29d97c10668b4bb5fceeb886a15f1;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/arm/wrapper.c b/sim/arm/wrapper.c index c475962bc4..9e61ed6cfc 100644 --- a/sim/arm/wrapper.c +++ b/sim/arm/wrapper.c @@ -1,5 +1,5 @@ /* run front end support for arm - Copyright (C) 1995-2014 Free Software Foundation, Inc. + Copyright (C) 1995-2016 Free Software Foundation, Inc. This file is part of ARM SIM. @@ -28,36 +28,76 @@ #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; - -/* 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 display start up banner, and maybe other things. */ -static int verbosity; +int stop_simulator; -/* Non-zero to set big endian mode. */ -static int big_endian; +#include "dis-asm.h" -int stop_simulator; +/* TODO: Tracing should be converted to common tracing module. */ +int trace = 0; +int disas = 0; +int trace_funcs = 0; + +static struct disassemble_info info; +static char opbuf[1000]; + +static int +op_printf (char *buf, char *fmt, ...) +{ + int ret; + va_list ap; + + 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) +{ + ARMword val = (ARMword) *((ARMword *) info->application_data); + + while (length--) + { + * ptr ++ = val & 0xFF; + val >>= 8; + } + return 0; +} + +void +print_insn (ARMword instr) +{ + int size; + + opbuf[0] = 0; + info.application_data = & instr; + size = print_insn_little_arm (0, & info); + fprintf (stderr, " %*s\n", size, opbuf); +} /* Cirrus DSP registers. @@ -74,7 +114,7 @@ struct maverick_regs int i; float f; } upper; - + union { int i; @@ -92,7 +132,7 @@ union maverick_acc_regs DSPacc[4]; ARMword DSPsc; static void -init () +init (void) { static int done; @@ -100,37 +140,14 @@ init () { ARMul_EmulateInit (); state = ARMul_NewState (); - state->bigendSig = (big_endian ? HIGH : LOW); + state->bigendSig = (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? HIGH : LOW); ARMul_MemoryInit (state, mem_size); ARMul_OSInit (state); - state->verbose = verbosity; + state->verbose = 0; done = 1; } } -/* 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; -{ - verbosity = v; -} - -/* Set the memory size to SIZE bytes. - Must be called before initializing simulator. */ -/* FIXME: Rename to sim_set_mem_size. */ - -void -sim_size (size) - int size; -{ - mem_size = size; -} - void ARMul_ConsolePrint (ARMul_State * state, const char * format, @@ -146,21 +163,11 @@ ARMul_ConsolePrint (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; - const unsigned char * buffer; - int size; +sim_write (SIM_DESC sd ATTRIBUTE_UNUSED, + SIM_ADDR addr, + const unsigned char * buffer, + int size) { int i; @@ -173,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; @@ -190,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; @@ -209,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; @@ -233,11 +227,10 @@ 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; @@ -256,6 +249,11 @@ sim_create_inferior (sd, abfd, argv, env) mach = 0; } +#ifdef MODET + if (abfd != NULL && (bfd_get_start_address (abfd) & 1)) + SETT; +#endif + switch (mach) { default: @@ -269,9 +267,9 @@ 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. */ - /* We choose the XScale rather than the iWMMXt, because the iWMMXt - removes the FPE emulator, since it conflicts with its coprocessors. - For the most generic ARM support, we want the FPE emulator in place. */ + 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 | ARM_v6_Prop); break; @@ -340,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 @@ -402,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) @@ -423,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) { @@ -444,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; +static int +arm_reg_store (SIM_CPU *cpu, int rn, unsigned char *memory, int length) { init (); @@ -553,12 +536,8 @@ sim_store_register (sd, rn, memory, length) return length; } -int -sim_fetch_register (sd, rn, memory, length) - SIM_DESC sd ATTRIBUTE_UNUSED; - int rn; - unsigned char *memory; - int length; +static int +arm_reg_fetch (SIM_CPU *cpu, int rn, unsigned char *memory, int length) { ARMword regval; int len = length; @@ -671,15 +650,11 @@ sim_fetch_register (sd, rn, memory, length) len -= 4; memory += 4; regval = 0; - } + } return length; } -#ifdef SIM_TARGET_SWITCHES - -static void sim_target_parse_arg_array (char **); - typedef struct { char * swi_option; @@ -703,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; @@ -718,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; @@ -727,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; @@ -758,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]; @@ -769,97 +770,116 @@ 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; - - for (i = 0; argv[i]; i++) - ; + sim_target_parse_command_line (countargv (argv), argv); +} - sim_target_parse_command_line (i, argv); +static sim_cia +arm_pc_get (sim_cpu *cpu) +{ + return PC; } -void -sim_target_display_usage (help) - int help; +static void +arm_pc_set (sim_cpu *cpu, sim_cia pc) { - FILE *stream = help ? stdout : stderr; + ARMul_SetPC (state, pc); +} - fprintf (stream, "%s= Comma seperated list of SWI protocols to supoport.\n\ - This list can contain: NONE, DEMON, ANGEL, REDBOOT and/or ALL.\n", - SWI_SWITCH); +static void +free_state (SIM_DESC sd) +{ + 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); -#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) + /* 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) { - 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; + if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK) + { + free_state (sd); + return 0; + } - if ((c = argv[i][2]) == 0) - { - ++i; - c = argv[i][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; + } - switch (c) - { - case 0: - sim_callback->printf_filtered - (sim_callback, "No argument to -E option provided\n"); - break; + /* 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; + } - case 'b': - case 'B': - big_endian = 1; - break; + /* Configure/verify the target byte order and other runtime + configuration options. */ + if (sim_config (sd) != SIM_RC_OK) + { + sim_module_uninstall (sd); + return 0; + } - case 'l': - case 'L': - big_endian = 0; - 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; + } - default: - sim_callback->printf_filtered - (sim_callback, "Unrecognised argument to -E option\n"); - break; - } - } - else if (argv[i][0] == '-' && argv[i][1] == 'm') + /* 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; + + sim_target_parse_arg_array (argv); + + 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 @@ -868,47 +888,16 @@ sim_open (kind, ptr, abfd, argv) "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; - 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; -} - -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) { @@ -932,26 +921,3 @@ sim_stop_reason (sd, reason, sigrc) *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; -} - -char ** -sim_complete_command (SIM_DESC sd, const char *text, const char *word) -{ - return NULL; -}