/* Generic remote debugging interface for simulators.
   Copyright 1993, 1994, 1996, 1997 Free Software Foundation, Inc.
   Contributed by Cygnus Support.
   Steve Chamberlain (sac@cygnus.com).

   This file is part of GDB.

   This program 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 of the License, or
   (at your option) any later version.

   This program 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.  */

#include "defs.h"
#include "inferior.h"
#include "wait.h"
#include "value.h"
#include "gdb_string.h"
#include <ctype.h>
#include <fcntl.h>
#include <signal.h>
#include <setjmp.h>
#include <errno.h>
#include "terminal.h"
#include "target.h"
#include "gdbcore.h"
#include "callback.h"
#include "remote-sim.h"
#include "remote-utils.h"
#include "command.h"

/* Prototypes */

extern void _initialize_remote_sim PARAMS ((void));

extern int (*ui_loop_hook) PARAMS ((int signo));

static void dump_mem PARAMS ((char *buf, int len));

static void init_callbacks PARAMS ((void));

static void end_callbacks PARAMS ((void));

static int gdb_os_write_stdout PARAMS ((host_callback *, const char *, int));

static void gdb_os_flush_stdout PARAMS ((host_callback *));

static int gdb_os_write_stderr PARAMS ((host_callback *, const char *, int));

static void gdb_os_flush_stderr PARAMS ((host_callback *));

static int gdb_os_poll_quit PARAMS ((host_callback *));

/* printf_filtered is depreciated */
static void gdb_os_printf_filtered PARAMS ((host_callback *, const char *,...));

static void gdb_os_vprintf_filtered PARAMS ((host_callback *, const char *, va_list));

static void gdb_os_evprintf_filtered PARAMS ((host_callback *, const char *, va_list));

static void gdb_os_error PARAMS ((host_callback *, const char *,...));

static void gdbsim_fetch_register PARAMS ((int regno));

static void gdbsim_store_register PARAMS ((int regno));

static void gdbsim_kill PARAMS ((void));

static void gdbsim_load PARAMS ((char *prog, int fromtty));

static void gdbsim_create_inferior PARAMS ((char *exec_file, char *args, char **env));

static void gdbsim_open PARAMS ((char *args, int from_tty));

static void gdbsim_close PARAMS ((int quitting));

static void gdbsim_detach PARAMS ((char *args, int from_tty));

static void gdbsim_resume PARAMS ((int pid, int step, enum target_signal siggnal));

static int gdbsim_wait PARAMS ((int pid, struct target_waitstatus * status));

static void gdbsim_prepare_to_store PARAMS ((void));

static int gdbsim_xfer_inferior_memory PARAMS ((CORE_ADDR memaddr,
						char *myaddr, int len,
						int write,
						struct target_ops * target));

static void gdbsim_files_info PARAMS ((struct target_ops * target));

static void gdbsim_mourn_inferior PARAMS ((void));

static void gdbsim_stop PARAMS ((void));

void simulator_command PARAMS ((char *args, int from_tty));

/* Naming convention:

   sim_* are the interface to the simulator (see remote-sim.h).
   gdbsim_* are stuff which is internal to gdb.  */

/* Forward data declarations */
extern struct target_ops gdbsim_ops;

static int program_loaded = 0;

/* We must keep track of whether the simulator has been opened or not because
   GDB can call a target's close routine twice, but sim_close doesn't allow
   this.  We also need to record the result of sim_open so we can pass it
   back to the other sim_foo routines.  */
static SIM_DESC gdbsim_desc = 0;

static void
dump_mem (buf, len)
     char *buf;
     int len;
{
  if (len <= 8)
    {
      if (len == 8 || len == 4)
	{
	  long l[2];
	  memcpy (l, buf, len);
	  printf_filtered ("\t0x%x", l[0]);
	  printf_filtered (len == 8 ? " 0x%x\n" : "\n", l[1]);
	}
      else
	{
	  int i;
	  printf_filtered ("\t");
	  for (i = 0; i < len; i++)
	    printf_filtered ("0x%x ", buf[i]);
	  printf_filtered ("\n");
	}
    }
}

static host_callback gdb_callback;
static int callbacks_initialized = 0;

/* Initialize gdb_callback.  */

static void
init_callbacks ()
{
  if (!callbacks_initialized)
    {
      gdb_callback = default_callback;
      gdb_callback.init (&gdb_callback);
      gdb_callback.write_stdout = gdb_os_write_stdout;
      gdb_callback.flush_stdout = gdb_os_flush_stdout;
      gdb_callback.write_stderr = gdb_os_write_stderr;
      gdb_callback.flush_stderr = gdb_os_flush_stderr;
      gdb_callback.printf_filtered = gdb_os_printf_filtered;
      gdb_callback.vprintf_filtered = gdb_os_vprintf_filtered;
      gdb_callback.evprintf_filtered = gdb_os_evprintf_filtered;
      gdb_callback.error = gdb_os_error;
      gdb_callback.poll_quit = gdb_os_poll_quit;
      gdb_callback.magic = HOST_CALLBACK_MAGIC;
      callbacks_initialized = 1;
    }
}

/* Release callbacks (free resources used by them).  */

static void
end_callbacks ()
{
  if (callbacks_initialized)
    {
      gdb_callback.shutdown (&gdb_callback);
      callbacks_initialized = 0;
    }
}

/* GDB version of os_write_stdout callback.  */

static int
gdb_os_write_stdout (p, buf, len)
     host_callback *p;
     const char *buf;
     int len;
{
  int i;
  char b[2];

  for (i = 0; i < len; i++)
    {
      b[0] = buf[i];
      b[1] = 0;
      fputs_unfiltered (b, gdb_stdtarg);
    }
  return len;
}

/* GDB version of os_flush_stdout callback.  */

static void
gdb_os_flush_stdout (p)
     host_callback *p;
{
  gdb_flush (gdb_stdout);
}

/* GDB version of os_write_stderr callback.  */

static int
gdb_os_write_stderr (p, buf, len)
     host_callback *p;
     const char *buf;
     int len;
{
  int i;
  char b[2];

  for (i = 0; i < len; i++)
    {
      b[0] = buf[i];
      b[1] = 0;
      fputs_unfiltered (b, gdb_stdtarg);
    }
  return len;
}

/* GDB version of os_flush_stderr callback.  */

static void
gdb_os_flush_stderr (p)
     host_callback *p;
{
  gdb_flush (gdb_stderr);
}

/* GDB version of printf_filtered callback.  */

/* VARARGS */
static void
#ifdef ANSI_PROTOTYPES
gdb_os_printf_filtered (host_callback * p, const char *format,...)
#else
gdb_os_printf_filtered (p, va_alist)
     host_callback *p;
     va_dcl
#endif
{
  va_list args;
#ifdef ANSI_PROTOTYPES
  va_start (args, format);
#else
  char *format;

  va_start (args);
  format = va_arg (args, char *);
#endif

  vfprintf_filtered (gdb_stdout, format, args);

  va_end (args);
}

/* GDB version of error vprintf_filtered.  */

/* VARARGS */
static void
#ifdef ANSI_PROTOTYPES
gdb_os_vprintf_filtered (host_callback * p, const char *format, va_list ap)
#else
gdb_os_vprintf_filtered (p, format, ap)
     host_callback *p;
     char *format;
     va_list ap;
#endif
{
  vfprintf_filtered (gdb_stdout, format, ap);
}

/* GDB version of error evprintf_filtered.  */

/* VARARGS */
static void
#ifdef ANSI_PROTOTYPES
gdb_os_evprintf_filtered (host_callback * p, const char *format, va_list ap)
#else
gdb_os_evprintf_filtered (p, format, ap)
     host_callback *p;
     char *format;
     va_list ap;
#endif
{
  vfprintf_filtered (gdb_stderr, format, ap);
}

/* GDB version of error callback.  */

/* VARARGS */
static void
#ifdef ANSI_PROTOTYPES
gdb_os_error (host_callback * p, const char *format,...)
#else
gdb_os_error (p, va_alist)
     host_callback *p;
     va_dcl
#endif
{
  if (error_hook)
    (*error_hook) ();
  else
    {
      va_list args;
#ifdef ANSI_PROTOTYPES
      va_start (args, format);
#else
      char *format;

      va_start (args);
      format = va_arg (args, char *);
#endif

      error_begin ();
      vfprintf_filtered (gdb_stderr, format, args);
      fprintf_filtered (gdb_stderr, "\n");
      va_end (args);
      return_to_top_level (RETURN_ERROR);
    }
}

static void
gdbsim_fetch_register (regno)
     int regno;
{
  static int warn_user = 1;
  if (regno == -1)
    {
      for (regno = 0; regno < NUM_REGS; regno++)
	gdbsim_fetch_register (regno);
    }
  else if (REGISTER_NAME (regno) != NULL && *REGISTER_NAME (regno) != '\0')
    {
      char buf[MAX_REGISTER_RAW_SIZE];
      int nr_bytes = sim_fetch_register (gdbsim_desc, regno, buf, REGISTER_RAW_SIZE (regno));
      if (nr_bytes == 0)
	/* register not applicable, supply zero's */
	memset (buf, 0, MAX_REGISTER_RAW_SIZE);
      else if (nr_bytes > 0 && nr_bytes != REGISTER_RAW_SIZE (regno)
	       && warn_user)
	{
	  printf_unfiltered ("Size of register %s (%d) incorrect (%d instead of %d))",
			     REGISTER_NAME (regno), regno,
			     nr_bytes, REGISTER_RAW_SIZE (regno));
	  warn_user = 0;
	}
      supply_register (regno, buf);
      if (sr_get_debug ())
	{
	  printf_filtered ("gdbsim_fetch_register: %d", regno);
	  /* FIXME: We could print something more intelligible.  */
	  dump_mem (buf, REGISTER_RAW_SIZE (regno));
	}
    }
}


static void
gdbsim_store_register (regno)
     int regno;
{
  if (regno == -1)
    {
      for (regno = 0; regno < NUM_REGS; regno++)
	gdbsim_store_register (regno);
    }
  else if (REGISTER_NAME (regno) != NULL && *REGISTER_NAME (regno) != '\0')
    {
      char tmp[MAX_REGISTER_RAW_SIZE];
      int nr_bytes;
      read_register_gen (regno, tmp);
      nr_bytes = sim_store_register (gdbsim_desc, regno, tmp, REGISTER_RAW_SIZE (regno));
      if (nr_bytes > 0 && nr_bytes != REGISTER_RAW_SIZE (regno))
	fatal ("Register size different to expected");
      if (sr_get_debug ())
	{
	  printf_filtered ("gdbsim_store_register: %d", regno);
	  /* FIXME: We could print something more intelligible.  */
	  dump_mem (tmp, REGISTER_RAW_SIZE (regno));
	}
    }
}

/* Kill the running program.  This may involve closing any open files
   and releasing other resources acquired by the simulated program.  */

static void
gdbsim_kill ()
{
  if (sr_get_debug ())
    printf_filtered ("gdbsim_kill\n");

  /* There is no need to `kill' running simulator - the simulator is
     not running */
  inferior_pid = 0;
}

/* Load an executable file into the target process.  This is expected to
   not only bring new code into the target process, but also to update
   GDB's symbol tables to match.  */

static void
gdbsim_load (prog, fromtty)
     char *prog;
     int fromtty;
{
  if (sr_get_debug ())
    printf_filtered ("gdbsim_load: prog \"%s\"\n", prog);

  inferior_pid = 0;

  /* FIXME: We will print two messages on error.
     Need error to either not print anything if passed NULL or need
     another routine that doesn't take any arguments.  */
  if (sim_load (gdbsim_desc, prog, NULL, fromtty) == SIM_RC_FAIL)
    error ("unable to load program");

  /* FIXME: If a load command should reset the targets registers then
     a call to sim_create_inferior() should go here. */

  program_loaded = 1;
}


/* Start an inferior process and set inferior_pid to its pid.
   EXEC_FILE is the file to run.
   ARGS is a string containing the arguments to the program.
   ENV is the environment vector to pass.  Errors reported with error().
   On VxWorks and various standalone systems, we ignore exec_file.  */
/* This is called not only when we first attach, but also when the
   user types "run" after having attached.  */

static void
gdbsim_create_inferior (exec_file, args, env)
     char *exec_file;
     char *args;
     char **env;
{
  int len;
  char *arg_buf, **argv;

  if (exec_file == 0 || exec_bfd == 0)
    warning ("No executable file specified.");
  if (!program_loaded)
    warning ("No program loaded.");

  if (sr_get_debug ())
    printf_filtered ("gdbsim_create_inferior: exec_file \"%s\", args \"%s\"\n",
		     (exec_file ? exec_file : "(NULL)"),
		     args);

  gdbsim_kill ();
  remove_breakpoints ();
  init_wait_for_inferior ();

  if (exec_file != NULL)
    {
      len = strlen (exec_file) + 1 + strlen (args) + 1 + /*slop */ 10;
      arg_buf = (char *) alloca (len);
      arg_buf[0] = '\0';
      strcat (arg_buf, exec_file);
      strcat (arg_buf, " ");
      strcat (arg_buf, args);
      argv = buildargv (arg_buf);
      make_cleanup_freeargv (argv);
    }
  else
    argv = NULL;
  sim_create_inferior (gdbsim_desc, exec_bfd, argv, env);

  inferior_pid = 42;
  insert_breakpoints ();	/* Needed to get correct instruction in cache */

  clear_proceed_status ();

  /* NB: Entry point already set by sim_create_inferior. */
  proceed ((CORE_ADDR) - 1, TARGET_SIGNAL_DEFAULT, 0);
}

/* The open routine takes the rest of the parameters from the command,
   and (if successful) pushes a new target onto the stack.
   Targets should supply this routine, if only to provide an error message.  */
/* Called when selecting the simulator. EG: (gdb) target sim name.  */

static void
gdbsim_open (args, from_tty)
     char *args;
     int from_tty;
{
  int len;
  char *arg_buf;
  char **argv;

  if (sr_get_debug ())
    printf_filtered ("gdbsim_open: args \"%s\"\n", args ? args : "(null)");

  /* Remove current simulator if one exists.  Only do this if the simulator
     has been opened because sim_close requires it.
     This is important because the call to push_target below will cause
     sim_close to be called if the simulator is already open, but push_target
     is called after sim_open!  We can't move the call to push_target before
     the call to sim_open because sim_open may invoke `error'.  */
  if (gdbsim_desc != NULL)
    unpush_target (&gdbsim_ops);

  len = (7 + 1			/* gdbsim */
	 + strlen (" -E little")
	 + strlen (" --architecture=xxxxxxxxxx")
	 + (args ? strlen (args) : 0)
	 + 50) /* slack */ ;
  arg_buf = (char *) alloca (len);
  strcpy (arg_buf, "gdbsim");	/* 7 */
  /* Specify the byte order for the target when it is both selectable
     and explicitly specified by the user (not auto detected). */
  if (TARGET_BYTE_ORDER_SELECTABLE_P
      && !TARGET_BYTE_ORDER_AUTO)
    {
      switch (TARGET_BYTE_ORDER)
	{
	case BIG_ENDIAN:
	  strcat (arg_buf, " -E big");
	  break;
	case LITTLE_ENDIAN:
	  strcat (arg_buf, " -E little");
	  break;
	default:
	  fatal ("Value of TARGET_BYTE_ORDER unknown");
	}
    }
  /* Specify the architecture of the target when it has been
     explicitly specified */
  if (!TARGET_ARCHITECTURE_AUTO)
    {
      strcat (arg_buf, " --architecture=");
      strcat (arg_buf, TARGET_ARCHITECTURE->printable_name);
    }
  /* finally, any explicit args */
  if (args)
    {
      strcat (arg_buf, " ");	/* 1 */
      strcat (arg_buf, args);
    }
  argv = buildargv (arg_buf);
  if (argv == NULL)
    error ("Insufficient memory available to allocate simulator arg list.");
  make_cleanup_freeargv (argv);

  init_callbacks ();
  gdbsim_desc = sim_open (SIM_OPEN_DEBUG, &gdb_callback, exec_bfd, argv);

  if (gdbsim_desc == 0)
    error ("unable to create simulator instance");

  push_target (&gdbsim_ops);
  target_fetch_registers (-1);
  printf_filtered ("Connected to the simulator.\n");
}

/* Does whatever cleanup is required for a target that we are no longer
   going to be calling.  Argument says whether we are quitting gdb and
   should not get hung in case of errors, or whether we want a clean
   termination even if it takes a while.  This routine is automatically
   always called just before a routine is popped off the target stack.
   Closing file descriptors and freeing memory are typical things it should
   do.  */
/* Close out all files and local state before this target loses control. */

static void
gdbsim_close (quitting)
     int quitting;
{
  if (sr_get_debug ())
    printf_filtered ("gdbsim_close: quitting %d\n", quitting);

  program_loaded = 0;

  if (gdbsim_desc != NULL)
    {
      sim_close (gdbsim_desc, quitting);
      gdbsim_desc = NULL;
    }

  end_callbacks ();
}

/* Takes a program previously attached to and detaches it.
   The program may resume execution (some targets do, some don't) and will
   no longer stop on signals, etc.  We better not have left any breakpoints
   in the program or it'll die when it hits one.  ARGS is arguments
   typed by the user (e.g. a signal to send the process).  FROM_TTY
   says whether to be verbose or not.  */
/* Terminate the open connection to the remote debugger.
   Use this when you want to detach and do something else with your gdb.  */

static void
gdbsim_detach (args, from_tty)
     char *args;
     int from_tty;
{
  if (sr_get_debug ())
    printf_filtered ("gdbsim_detach: args \"%s\"\n", args);

  pop_target ();		/* calls gdbsim_close to do the real work */
  if (from_tty)
    printf_filtered ("Ending simulator %s debugging\n", target_shortname);
}

/* Resume execution of the target process.  STEP says whether to single-step
   or to run free; SIGGNAL is the signal value (e.g. SIGINT) to be given
   to the target, or zero for no signal.  */

static enum target_signal resume_siggnal;
static int resume_step;

static void
gdbsim_resume (pid, step, siggnal)
     int pid, step;
     enum target_signal siggnal;
{
  if (inferior_pid != 42)
    error ("The program is not being run.");

  if (sr_get_debug ())
    printf_filtered ("gdbsim_resume: step %d, signal %d\n", step, siggnal);

  resume_siggnal = siggnal;
  resume_step = step;
}

/* Notify the simulator of an asynchronous request to stop.

   The simulator shall ensure that the stop request is eventually
   delivered to the simulator.  If the call is made while the
   simulator is not running then the stop request is processed when
   the simulator is next resumed.

   For simulators that do not support this operation, just abort */

static void
gdbsim_stop ()
{
  if (!sim_stop (gdbsim_desc))
    {
      quit ();
    }
}

/* GDB version of os_poll_quit callback.
   Taken from gdb/util.c - should be in a library */

static int
gdb_os_poll_quit (p)
     host_callback *p;
{
  if (ui_loop_hook != NULL)
    ui_loop_hook (0);

  notice_quit ();
  if (quit_flag)		/* gdb's idea of quit */
    {
      quit_flag = 0;		/* we've stolen it */
      return 1;
    }
  else if (immediate_quit)
    {
      return 1;
    }
  return 0;
}

/* Wait for inferior process to do something.  Return pid of child,
   or -1 in case of error; store status through argument pointer STATUS,
   just as `wait' would. */

static void
gdbsim_cntrl_c (signo)
     int signo;
{
  gdbsim_stop ();
}

static int
gdbsim_wait (pid, status)
     int pid;
     struct target_waitstatus *status;
{
  static RETSIGTYPE (*prev_sigint) ();
  int sigrc = 0;
  enum sim_stop reason = sim_running;

  if (sr_get_debug ())
    printf_filtered ("gdbsim_wait\n");

#if defined (HAVE_SIGACTION) && defined (SA_RESTART)
  {
    struct sigaction sa, osa;
    sa.sa_handler = gdbsim_cntrl_c;
    sigemptyset (&sa.sa_mask);
    sa.sa_flags = 0;
    sigaction (SIGINT, &sa, &osa);
    prev_sigint = osa.sa_handler;
  }
#else
  prev_sigint = signal (SIGINT, gdbsim_cntrl_c);
#endif
  sim_resume (gdbsim_desc, resume_step,
	      target_signal_to_host (resume_siggnal));
  signal (SIGINT, prev_sigint);
  resume_step = 0;

  sim_stop_reason (gdbsim_desc, &reason, &sigrc);

  switch (reason)
    {
    case sim_exited:
      status->kind = TARGET_WAITKIND_EXITED;
      status->value.integer = sigrc;
      break;
    case sim_stopped:
      switch (sigrc)
	{
	case SIGABRT:
	  quit ();
	  break;
	case SIGINT:
	case SIGTRAP:
	default:
	  status->kind = TARGET_WAITKIND_STOPPED;
	  /* The signal in sigrc is a host signal.  That probably
	     should be fixed.  */
	  status->value.sig = target_signal_from_host (sigrc);
	  break;
	}
      break;
    case sim_signalled:
      status->kind = TARGET_WAITKIND_SIGNALLED;
      /* The signal in sigrc is a host signal.  That probably
         should be fixed.  */
      status->value.sig = target_signal_from_host (sigrc);
      break;
    case sim_running:
    case sim_polling:
      /* FIXME: Is this correct? */
      break;
    }

  return inferior_pid;
}

/* Get ready to modify the registers array.  On machines which store
   individual registers, this doesn't need to do anything.  On machines
   which store all the registers in one fell swoop, this makes sure
   that registers contains all the registers from the program being
   debugged.  */

static void
gdbsim_prepare_to_store ()
{
  /* Do nothing, since we can store individual regs */
}

static int
gdbsim_xfer_inferior_memory (memaddr, myaddr, len, write, target)
     CORE_ADDR memaddr;
     char *myaddr;
     int len;
     int write;
     struct target_ops *target;	/* ignored */
{
  if (!program_loaded)
    error ("No program loaded.");

  if (sr_get_debug ())
    {
      printf_filtered ("gdbsim_xfer_inferior_memory: myaddr 0x%x, memaddr 0x%x, len %d, write %d\n",
		       myaddr, memaddr, len, write);
      if (sr_get_debug () && write)
	dump_mem (myaddr, len);
    }

  if (write)
    {
      len = sim_write (gdbsim_desc, memaddr, myaddr, len);
    }
  else
    {
      len = sim_read (gdbsim_desc, memaddr, myaddr, len);
      if (sr_get_debug () && len > 0)
	dump_mem (myaddr, len);
    }
  return len;
}

static void
gdbsim_files_info (target)
     struct target_ops *target;
{
  char *file = "nothing";

  if (exec_bfd)
    file = bfd_get_filename (exec_bfd);

  if (sr_get_debug ())
    printf_filtered ("gdbsim_files_info: file \"%s\"\n", file);

  if (exec_bfd)
    {
      printf_filtered ("\tAttached to %s running program %s\n",
		       target_shortname, file);
      sim_info (gdbsim_desc, 0);
    }
}

/* Clear the simulator's notion of what the break points are.  */

static void
gdbsim_mourn_inferior ()
{
  if (sr_get_debug ())
    printf_filtered ("gdbsim_mourn_inferior:\n");

  remove_breakpoints ();
  generic_mourn_inferior ();
}

static int
gdbsim_insert_breakpoint (addr, contents_cache)
     CORE_ADDR addr;
     char *contents_cache;
{
#ifdef SIM_HAS_BREAKPOINTS
  SIM_RC retcode;

  retcode = sim_set_breakpoint (gdbsim_desc, addr);

  switch (retcode)
    {
    case SIM_RC_OK:
      return 0;
    case SIM_RC_INSUFFICIENT_RESOURCES:
      return ENOMEM;
    default:
      return EIO;
    }
#else
  return memory_insert_breakpoint (addr, contents_cache);
#endif
}

static int
gdbsim_remove_breakpoint (addr, contents_cache)
     CORE_ADDR addr;
     char *contents_cache;
{
#ifdef SIM_HAS_BREAKPOINTS
  SIM_RC retcode;

  retcode = sim_clear_breakpoint (gdbsim_desc, addr);

  switch (retcode)
    {
    case SIM_RC_OK:
    case SIM_RC_UNKNOWN_BREAKPOINT:
      return 0;
    case SIM_RC_INSUFFICIENT_RESOURCES:
      return ENOMEM;
    default:
      return EIO;
    }
#else
  return memory_remove_breakpoint (addr, contents_cache);
#endif
}

/* Pass the command argument through to the simulator verbatim.  The
   simulator must do any command interpretation work.  */

void
simulator_command (args, from_tty)
     char *args;
     int from_tty;
{
  if (gdbsim_desc == NULL)
    {

      /* PREVIOUSLY: The user may give a command before the simulator
         is opened. [...] (??? assuming of course one wishes to
         continue to allow commands to be sent to unopened simulators,
         which isn't entirely unreasonable). */

      /* The simulator is a builtin abstraction of a remote target.
         Consistent with that model, access to the simulator, via sim
         commands, is restricted to the period when the channel to the
         simulator is open. */

      error ("Not connected to the simulator target");
    }

  sim_do_command (gdbsim_desc, args);

  /* Invalidate the register cache, in case the simulator command does
     something funny. */
  registers_changed ();
}

/* Define the target subroutine names */

struct target_ops gdbsim_ops;

static void
init_gdbsim_ops (void)
{
  gdbsim_ops.to_shortname = "sim";
  gdbsim_ops.to_longname = "simulator";
  gdbsim_ops.to_doc = "Use the compiled-in simulator.";
  gdbsim_ops.to_open = gdbsim_open;
  gdbsim_ops.to_close = gdbsim_close;
  gdbsim_ops.to_attach = NULL;
  gdbsim_ops.to_post_attach = NULL;
  gdbsim_ops.to_require_attach = NULL;
  gdbsim_ops.to_detach = gdbsim_detach;
  gdbsim_ops.to_require_detach = NULL;
  gdbsim_ops.to_resume = gdbsim_resume;
  gdbsim_ops.to_wait = gdbsim_wait;
  gdbsim_ops.to_post_wait = NULL;
  gdbsim_ops.to_fetch_registers = gdbsim_fetch_register;
  gdbsim_ops.to_store_registers = gdbsim_store_register;
  gdbsim_ops.to_prepare_to_store = gdbsim_prepare_to_store;
  gdbsim_ops.to_xfer_memory = gdbsim_xfer_inferior_memory;
  gdbsim_ops.to_files_info = gdbsim_files_info;
  gdbsim_ops.to_insert_breakpoint = gdbsim_insert_breakpoint;
  gdbsim_ops.to_remove_breakpoint = gdbsim_remove_breakpoint;
  gdbsim_ops.to_terminal_init = NULL;
  gdbsim_ops.to_terminal_inferior = NULL;
  gdbsim_ops.to_terminal_ours_for_output = NULL;
  gdbsim_ops.to_terminal_ours = NULL;
  gdbsim_ops.to_terminal_info = NULL;
  gdbsim_ops.to_kill = gdbsim_kill;
  gdbsim_ops.to_load = gdbsim_load;
  gdbsim_ops.to_lookup_symbol = NULL;
  gdbsim_ops.to_create_inferior = gdbsim_create_inferior;
  gdbsim_ops.to_post_startup_inferior = NULL;
  gdbsim_ops.to_acknowledge_created_inferior = NULL;
  gdbsim_ops.to_clone_and_follow_inferior = NULL;
  gdbsim_ops.to_post_follow_inferior_by_clone = NULL;
  gdbsim_ops.to_insert_fork_catchpoint = NULL;
  gdbsim_ops.to_remove_fork_catchpoint = NULL;
  gdbsim_ops.to_insert_vfork_catchpoint = NULL;
  gdbsim_ops.to_remove_vfork_catchpoint = NULL;
  gdbsim_ops.to_has_forked = NULL;
  gdbsim_ops.to_has_vforked = NULL;
  gdbsim_ops.to_can_follow_vfork_prior_to_exec = NULL;
  gdbsim_ops.to_post_follow_vfork = NULL;
  gdbsim_ops.to_insert_exec_catchpoint = NULL;
  gdbsim_ops.to_remove_exec_catchpoint = NULL;
  gdbsim_ops.to_has_execd = NULL;
  gdbsim_ops.to_reported_exec_events_per_exec_call = NULL;
  gdbsim_ops.to_has_exited = NULL;
  gdbsim_ops.to_mourn_inferior = gdbsim_mourn_inferior;
  gdbsim_ops.to_can_run = 0;
  gdbsim_ops.to_notice_signals = 0;
  gdbsim_ops.to_thread_alive = 0;
  gdbsim_ops.to_stop = gdbsim_stop;
  gdbsim_ops.to_pid_to_exec_file = NULL;
  gdbsim_ops.to_core_file_to_sym_file = NULL;
  gdbsim_ops.to_stratum = process_stratum;
  gdbsim_ops.DONT_USE = NULL;
  gdbsim_ops.to_has_all_memory = 1;
  gdbsim_ops.to_has_memory = 1;
  gdbsim_ops.to_has_stack = 1;
  gdbsim_ops.to_has_registers = 1;
  gdbsim_ops.to_has_execution = 1;
  gdbsim_ops.to_sections = NULL;
  gdbsim_ops.to_sections_end = NULL;
  gdbsim_ops.to_magic = OPS_MAGIC;

#ifdef TARGET_REDEFINE_DEFAULT_OPS
  TARGET_REDEFINE_DEFAULT_OPS (&gdbsim_ops);
#endif
}

void
_initialize_remote_sim ()
{
  init_gdbsim_ops ();
  add_target (&gdbsim_ops);

  add_com ("sim <command>", class_obscure, simulator_command,
	   "Send a command to the simulator.");
}
