/* run front end support for arm
- Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, 2000, 2001, 2002
+ Free Software Foundation, Inc.
-This file is part of ARM SIM.
+ This file is part of ARM SIM.
-GNU CC 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.
+ 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.
-GNU CC 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.
+ 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.
-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, write to the Free
+ Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
-/* This file provides the interface between the simulator and run.c and gdb
- (when the simulator is linked with gdb).
+/* 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 <stdio.h>
#include "armemu.h"
#include "dbg_rdi.h"
#include "ansidecl.h"
+#include "sim-utils.h"
host_callback *sim_callback;
static char *myname;
/* Memory size in bytes. */
-static int mem_size = (1 << 21);
+static int mem_size = (1 << 23);
/* Non-zero to display start up banner, and maybe other things. */
static int verbosity;
}
void
-ARMul_ConsolePrint (ARMul_State * state, const char *format, ...)
+ARMul_ConsolePrint VPARAMS ((ARMul_State * state,
+ const char * format,
+ ...))
{
va_list ap;
}
ARMword
-ARMul_Debug (ARMul_State * state ATTRIBUTE_UNUSED, ARMword pc ATTRIBUTE_UNUSED, ARMword instr ATTRIBUTE_UNUSED)
+ARMul_Debug (state, pc, instr)
+ ARMul_State * state ATTRIBUTE_UNUSED;
+ ARMword pc ATTRIBUTE_UNUSED;
+ ARMword instr ATTRIBUTE_UNUSED;
{
return 0;
}
sim_write (sd, addr, buffer, size)
SIM_DESC sd ATTRIBUTE_UNUSED;
SIM_ADDR addr;
- unsigned char *buffer;
+ unsigned char * buffer;
int size;
{
int i;
init ();
for (i = 0; i < size; i++)
- ARMul_WriteByte (state, addr + i, buffer[i]);
+ ARMul_SafeWriteByte (state, addr + i, buffer[i]);
return size;
}
sim_read (sd, addr, buffer, size)
SIM_DESC sd ATTRIBUTE_UNUSED;
SIM_ADDR addr;
- unsigned char *buffer;
+ unsigned char * buffer;
int size;
{
int i;
+
init ();
+
for (i = 0; i < size; i++)
- {
- buffer[i] = ARMul_ReadByte (state, addr + i);
- }
+ buffer[i] = ARMul_SafeReadByte (state, addr + i);
+
return size;
}
sim_trace (sd)
SIM_DESC sd ATTRIBUTE_UNUSED;
{
- (*sim_callback->printf_filtered) (sim_callback,
- "This simulator does not support tracing\n");
+ (*sim_callback->printf_filtered)
+ (sim_callback,
+ "This simulator does not support tracing\n");
return 1;
}
}
else
{
-#if 1 /* JGS */
state->NextInstr = RESUME; /* treat as PC change */
-#endif
state->Reg[15] = ARMul_DoProg (state);
}
SIM_RC
sim_create_inferior (sd, abfd, argv, env)
SIM_DESC sd ATTRIBUTE_UNUSED;
- struct _bfd *abfd;
- char **argv;
- char **env;
+ struct _bfd * abfd;
+ char ** argv;
+ char ** env;
{
int argvlen = 0;
int mach;
switch (mach)
{
default:
- (*sim_callback->printf_filtered) (sim_callback,
- "Unknown machine type; please update sim_create_inferior.\n");
+ (*sim_callback->printf_filtered)
+ (sim_callback,
+ "Unknown machine type; please update sim_create_inferior.\n");
/* fall through */
- case 0: /* arm */
+ case 0:
/* We wouldn't set the machine type with earlier toolchains, so we
- explicitly select a processor capable of supporting all ARM
- 32bit mode. */
- /* fall through */
+ explicitly select a processor capable of supporting all ARMs in
+ 32bit mode. */
+ case bfd_mach_arm_XScale:
+ ARMul_SelectProcessor (state, ARM_v5_Prop | ARM_v5e_Prop | ARM_XScale_Prop);
+ break;
- case 5: /* armv4 */
- case 6: /* armv4t */
- case 7: /* armv5 */
- case 8: /* armv5t */
- if (mach == 7 || mach == 8)
- ARMul_SelectProcessor (state, ARM_v5_Prop);
- else
- ARMul_SelectProcessor (state, ARM_v4_Prop);
- /* 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, USER32MODE);
+ case bfd_mach_arm_5:
+ if (bfd_family_coff (abfd))
+ {
+ /* This is a special case in order to support COFF based ARM toolchains.
+ The COFF header does not have enough room to store all the different
+ kinds of ARM cpu, so the XScale, v5T and v5TE architectures all default
+ to v5. (See coff_set_flags() in bdf/coffcode.h). So if we see a v5
+ machine type here, we assume it could be any of the above architectures
+ and so select the most feature-full. */
+ ARMul_SelectProcessor (state, ARM_v5_Prop | ARM_v5e_Prop | ARM_XScale_Prop);
+ break;
+ }
+ /* Otherwise drop through. */
+
+ case bfd_mach_arm_5T:
+ ARMul_SelectProcessor (state, ARM_v5_Prop);
break;
- case 3: /* armv3 */
- case 4: /* armv3m */
+ case bfd_mach_arm_5TE:
+ ARMul_SelectProcessor (state, ARM_v5_Prop | ARM_v5e_Prop);
+ break;
+
+ case bfd_mach_arm_4:
+ case bfd_mach_arm_4T:
+ ARMul_SelectProcessor (state, ARM_v4_Prop);
+ break;
+
+ case bfd_mach_arm_3:
+ case bfd_mach_arm_3M:
ARMul_SelectProcessor (state, ARM_Lock_Prop);
break;
- case 1: /* armv2 */
- case 2: /* armv2a */
+ case bfd_mach_arm_2:
+ case bfd_mach_arm_2a:
ARMul_SelectProcessor (state, ARM_Fix26_Prop);
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);
+ }
+
if (argv != NULL)
{
- /*
- ** Set up the command line (by laboriously stringing together the
- ** environment carefully picked apart by our caller...)
- */
- /* Free any old stuff */
+ /* Set up the command line by laboriously stringing together
+ the environment carefully picked apart by our caller. */
+
+ /* Free any old stuff. */
if (state->CommandLine != NULL)
{
free (state->CommandLine);
state->CommandLine = NULL;
}
- /* See how much we need */
+ /* See how much we need. */
for (arg = argv; *arg != NULL; arg++)
argvlen += strlen (*arg) + 1;
- /* allocate it... */
+ /* Allocate it. */
state->CommandLine = malloc (argvlen + 1);
if (state->CommandLine != NULL)
{
arg = argv;
state->CommandLine[0] = '\0';
+
for (arg = argv; *arg != NULL; arg++)
{
strcat (state->CommandLine, *arg);
if (env != NULL)
{
- /* Now see if there's a MEMSIZE spec in the environment */
+ /* Now see if there's a MEMSIZE spec in the environment. */
while (*env)
{
if (strncmp (*env, "MEMSIZE=", sizeof ("MEMSIZE=") - 1) == 0)
{
char *end_of_num;
- /* Set up memory limit */
+ /* Set up memory limit. */
state->MemSize =
strtoul (*env + sizeof ("MEMSIZE=") - 1, &end_of_num, 0);
}
{
}
-
static int
frommem (state, memory)
struct ARMul_State *state;
unsigned char *memory;
{
if (state->bigendSig == HIGH)
- {
- return (memory[0] << 24)
- | (memory[1] << 16) | (memory[2] << 8) | (memory[3] << 0);
- }
+ return (memory[0] << 24) | (memory[1] << 16)
+ | (memory[2] << 8) | (memory[3] << 0);
else
- {
- return (memory[3] << 24)
- | (memory[2] << 16) | (memory[1] << 8) | (memory[0] << 0);
- }
+ return (memory[3] << 24) | (memory[2] << 16)
+ | (memory[1] << 8) | (memory[0] << 0);
}
-
static void
tomem (state, memory, val)
struct ARMul_State *state;
int length ATTRIBUTE_UNUSED;
{
init ();
+
if (rn == 25)
{
state->Cpsr = frommem (state, memory);
ARMword regval;
init ();
+
if (rn < 16)
regval = ARMul_GetReg (state, state->Mode, rn);
- else if (rn == 25) /* FIXME: use PS_REGNUM from gdb/config/arm/tm-arm.h */
+ else if (rn == 25)
+ /* FIXME: use PS_REGNUM from gdb/config/arm/tm-arm.h. */
regval = ARMul_GetCPSR (state);
else
- regval = 0; /* FIXME: should report an error */
- tomem (state, memory, regval);
+ /* FIXME: should report an error. */
+ regval = 0;
+
+ while (length)
+ {
+ tomem (state, memory, regval);
+
+ length -= 4;
+ memory += 4;
+ regval = 0;
+ }
+
return -1;
}
SIM_DESC sd ATTRIBUTE_UNUSED;
int quitting ATTRIBUTE_UNUSED;
{
- if (myname) free (myname);
+ if (myname)
+ free (myname);
myname = NULL;
}
bfd *abfd;
int from_tty ATTRIBUTE_UNUSED;
{
- extern bfd *sim_load_file (); /* ??? Don't know where this should live. */
bfd *prog_bfd;
prog_bfd = sim_load_file (sd, myname, sim_callback, prog, abfd,
SIM_DESC sd ATTRIBUTE_UNUSED;
char *cmd ATTRIBUTE_UNUSED;
{
- (*sim_callback->printf_filtered) (sim_callback,
- "This simulator does not accept any commands.\n");
+ (*sim_callback->printf_filtered)
+ (sim_callback,
+ "This simulator does not accept any commands.\n");
}
-
void
sim_set_callbacks (ptr)
host_callback *ptr;