Increase default memory size to 8MB.
[deliverable/binutils-gdb.git] / sim / arm / wrapper.c
index 8fca85df14a5a82880b2320fbd98b65e6fe0caa9..773ef354d86a681588a84dc7b98634404e44a1b1 100644 (file)
@@ -1,24 +1,26 @@
 /* run front end support for arm
-   Copyright (C) 1995, 1996, 1997 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>
@@ -32,6 +34,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "armemu.h"
 #include "dbg_rdi.h"
 #include "ansidecl.h"
+#include "sim-utils.h"
 
 host_callback *sim_callback;
 
@@ -44,7 +47,7 @@ static SIM_OPEN_KIND sim_kind;
 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;
@@ -96,7 +99,9 @@ sim_size (size)
 }
 
 void
-ARMul_ConsolePrint (ARMul_State * state, const char *format, ...)
+ARMul_ConsolePrint VPARAMS ((ARMul_State * state,
+                            const char * format,
+                            ...))
 {
   va_list ap;
 
@@ -109,7 +114,10 @@ ARMul_ConsolePrint (ARMul_State * state, const char *format, ...)
 }
 
 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;
 }
@@ -118,15 +126,16 @@ int
 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;
 }
 
@@ -134,15 +143,16 @@ int
 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;
 }
 
@@ -150,8 +160,9 @@ int
 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;
 }
 
@@ -181,9 +192,7 @@ sim_resume (sd, step, siggnal)
     }
   else
     {
-#if 1                          /* JGS */
       state->NextInstr = RESUME;       /* treat as PC change */
-#endif
       state->Reg[15] = ARMul_DoProg (state);
     }
 
@@ -193,11 +202,12 @@ 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;
+     struct _bfd * abfd;
+     char ** argv;
+     char ** env;
 {
   int argvlen = 0;
+  int mach;
   char **arg;
 
   if (abfd != NULL)
@@ -205,35 +215,96 @@ sim_create_inferior (sd, abfd, argv, env)
   else
     ARMul_SetPC (state, 0);    /* ??? */
 
-  /* We explicitly select a processor capable of supporting the ARM
-     32bit mode.  JGS  */
-  ARMul_SelectProcessor (state, ARM600);
-  /* And then we force the simulated CPU into the 32bit User mode.  */
-  ARMul_SetCPSR (state, USER32MODE);
+  mach = bfd_get_mach (abfd);
 
+  switch (mach)
+    {
+    default:
+      (*sim_callback->printf_filtered)
+       (sim_callback,
+        "Unknown machine type; please update sim_create_inferior.\n");
+      /* fall through */
+
+    case 0:
+      /* We wouldn't set the machine type with earlier toolchains, so we
+        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 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 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 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);
@@ -244,14 +315,14 @@ sim_create_inferior (sd, abfd, argv, env)
 
   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);
            }
@@ -269,25 +340,19 @@ sim_info (sd, verbose)
 {
 }
 
-
 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;
@@ -318,6 +383,7 @@ sim_store_register (sd, rn, memory, length)
      int length ATTRIBUTE_UNUSED;
 {
   init ();
+
   if (rn == 25)
     {
       state->Cpsr = frommem (state, memory);
@@ -338,13 +404,25 @@ sim_fetch_register (sd, rn, memory, length)
   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;
 }
 
@@ -415,7 +493,8 @@ sim_close (sd, quitting)
      SIM_DESC sd ATTRIBUTE_UNUSED;
      int quitting ATTRIBUTE_UNUSED;
 {
-  if (myname) free (myname);
+  if (myname)
+    free (myname);
   myname = NULL;
 }
 
@@ -426,7 +505,6 @@ sim_load (sd, prog, abfd, from_tty)
      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,
@@ -470,11 +548,11 @@ 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");
+  (*sim_callback->printf_filtered)
+    (sim_callback,
+     "This simulator does not accept any commands.\n");
 }
 
-
 void
 sim_set_callbacks (ptr)
      host_callback *ptr;
This page took 0.028856 seconds and 4 git commands to generate.