/* run front end support for arm Copyright (C) 1995, 1996, 1997 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 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). All simulator interaction should go through this file. */ #include #include #include #include #include "callback.h" #include "remote-sim.h" #include "armdefs.h" #include "armemu.h" #include "dbg_rdi.h" 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; /* Memory size in bytes. */ static int mem_size = (1 << 21); /* Non-zero to display start up banner, and maybe other things. */ static int verbosity; static void init () { static int done; if (!done) { ARMul_EmulateInit(); state = ARMul_NewState (); ARMul_MemoryInit(state, mem_size); ARMul_OSInit(state); ARMul_CoProInit(state); state->verbose = verbosity; 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,...) { va_list ap; if (state->verbose) { va_start (ap, format); vprintf (format, ap); va_end (ap); } } ARMword ARMul_Debug (ARMul_State * state, ARMword pc, ARMword instr) { } int sim_write (sd, addr, buffer, size) SIM_DESC sd; 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 (sd, addr, buffer, size) SIM_DESC sd; 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; } int sim_trace (sd) SIM_DESC sd; { (*sim_callback->printf_filtered) (sim_callback, "This simulator does not support tracing\n"); return 1; } int sim_stop (sd) SIM_DESC sd; { return 0; } void sim_resume (sd, step, siggnal) SIM_DESC sd; int step, siggnal; { state->EndCondition = 0; if (step) { state->Reg[15] = ARMul_DoInstr (state); if (state->EndCondition == 0) state->EndCondition = RDIError_BreakpointReached; } else { state->Reg[15] = ARMul_DoProg (state); } FLUSHPIPE; } SIM_RC sim_create_inferior (sd, argv, env) SIM_DESC sd; char **argv; char **env; { return SIM_RC_OK; } void sim_info (sd, verbose) SIM_DESC sd; int 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); } else { return (memory[3] << 24) | (memory[2] << 16) | (memory[1] << 8) | (memory[0] << 0); } } static 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 (sd, rn, memory) SIM_DESC sd; int rn; unsigned char *memory; { init (); ARMul_SetReg(state, state->Mode, rn, frommem (state, memory)); } void sim_fetch_register (sd, rn, memory) SIM_DESC sd; int rn; unsigned char *memory; { init (); tomem (state, memory, ARMul_GetReg(state, state->Mode, rn)); } SIM_DESC sim_open (kind, ptr, abfd, argv) SIM_OPEN_KIND kind; host_callback *ptr; struct _bfd *abfd; char **argv; { sim_kind = kind; myname = argv[0]; sim_callback = ptr; return (SIM_DESC) 1; } void sim_close (sd, quitting) SIM_DESC sd; int quitting; { /* nothing to do */ } SIM_RC sim_load (sd, prog, abfd, from_tty) SIM_DESC sd; char *prog; bfd *abfd; int from_tty; { 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_kind == SIM_OPEN_DEBUG); 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; enum sim_stop *reason; int *sigrc; { if (state->EndCondition == 0) { *reason = sim_exited; *sigrc = state->Reg[0] & 255; } else { *reason = sim_stopped; if (state->EndCondition == RDIError_BreakpointReached) *sigrc = SIGTRAP; else *sigrc = 0; } } void sim_do_command (sd, cmd) SIM_DESC sd; char *cmd; { (*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; }