aboutsummaryrefslogtreecommitdiff
path: root/sim/arm/wrapper.c
diff options
context:
space:
mode:
Diffstat (limited to 'sim/arm/wrapper.c')
-rw-r--r--sim/arm/wrapper.c259
1 files changed, 259 insertions, 0 deletions
diff --git a/sim/arm/wrapper.c b/sim/arm/wrapper.c
new file mode 100644
index 0000000..fdbff86
--- /dev/null
+++ b/sim/arm/wrapper.c
@@ -0,0 +1,259 @@
+/* run front end support for arm
+ Copyright (C) 1995 Free Software Foundation, Inc.
+
+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.
+
+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.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <armdefs.h>
+#include <bfd.h>
+#include <signal.h>
+#include "callback.h"
+#include "remote-sim.h"
+static struct ARMul_State *state;
+
+static void
+init ()
+{
+ static int done;
+ if (!done)
+ {
+ ARMul_EmulateInit();
+ state = ARMul_NewState ();
+ ARMul_MemoryInit(state, 1<<21);
+ ARMul_OSInit(state);
+ ARMul_CoProInit(state);
+ done = 1;
+ }
+
+}
+void
+ARMul_ConsolePrint (ARMul_State * state, const char *format,...)
+{
+ va_list ap;
+ va_start (ap, format);
+ vprintf (format, ap);
+ va_end (ap);
+}
+
+ARMword
+ARMul_Debug (ARMul_State * state, ARMword pc, ARMword instr)
+{
+
+}
+
+void
+sim_size (size)
+ int size;
+{
+ init ();
+ ARMul_MemoryInit (state, 1 << size);
+}
+
+
+void
+sim_set_profile ()
+{
+}
+void
+sim_set_profile_size ()
+{
+}
+
+int
+sim_write (addr, buffer, size)
+ SIM_ADDR addr;
+ unsigned char *buffer;
+ int size;
+{
+ int i;
+ init ();
+ for (i = 0; i < size; i++)
+ {
+ ARMul_WriteByte (state, addr+i, buffer[i]);
+ }
+ return size;
+}
+
+int
+sim_read (addr, buffer, size)
+ SIM_ADDR addr;
+ unsigned char *buffer;
+ int size;
+{
+ int i;
+ init ();
+ for (i = 0; i < size; i++)
+ {
+ buffer[i] = ARMul_ReadByte (state, addr + i);
+ }
+ return size;
+}
+
+void
+sim_trace ()
+{
+}
+
+static int rc;
+void
+sim_resume (step, siggnal)
+ int step, siggnal;
+{
+ if (step)
+ {
+ rc = SIGTRAP;
+ state->Reg[15] = ARMul_DoInstr (state);
+ }
+ else
+ {
+ state->Reg[15] = ARMul_DoProg (state);
+ }
+}
+
+void
+sim_create_inferior (start_address, argv, env)
+ SIM_ADDR start_address;
+ char **argv;
+ char **env;
+{
+ ARMul_SetPC(state, start_address);
+}
+
+void
+sim_info (verbose)
+ int verbose;
+{
+}
+
+
+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);
+ }
+ else
+ {
+ return (memory[3] << 24)
+ | (memory[2] << 16)
+ | (memory[1] << 8)
+ | (memory[0] << 0);
+ }
+}
+
+
+void
+tomem (state, memory, val)
+ struct ARMul_State *state;
+ unsigned char *memory;
+ int val;
+{
+ if (state->bigendSig == HIGH)
+ {
+ memory[0] = val >> 24;
+ memory[1] = val >> 16;
+ memory[2] = val >> 8;
+ memory[3] = val >> 0;
+ }
+ else
+ {
+ memory[3] = val >> 24;
+ memory[2] = val >> 16;
+ memory[1] = val >> 8;
+ memory[0] = val >> 0;
+ }
+}
+
+void
+sim_store_register (rn, memory)
+ int rn;
+ unsigned char *memory;
+{
+ init ();
+ ARMul_SetReg(state, state->Mode, rn, frommem (state, memory));
+}
+
+void
+sim_fetch_register (rn, memory)
+ int rn;
+ unsigned char *memory;
+{
+ init ();
+ tomem (state, memory, ARMul_GetReg(state, state->Mode, rn));
+}
+
+
+
+
+void
+sim_open (name)
+ char *name;
+{
+ /* nothing to do */
+}
+
+void
+sim_close (quitting)
+ int quitting;
+{
+ /* nothing to do */
+}
+
+int
+sim_load (prog, from_tty)
+ char *prog;
+ int from_tty;
+{
+ /* Return nonzero so GDB will handle it. */
+ return 1;
+}
+
+void
+sim_stop_reason (reason, sigrc)
+ enum sim_stop *reason;
+ int *sigrc;
+{
+ *reason = sim_stopped;
+ *sigrc = rc;
+}
+void
+sim_kill ()
+{
+ /* nothing to do */
+}
+
+void
+sim_do_command (cmd)
+ char *cmd;
+{
+ printf_filtered ("This simulator does not accept any commands.\n");
+}
+
+
+void
+sim_set_callbacks (ptr)
+struct host_callback_struct *ptr;
+{
+
+}