/* 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;
      if (target_output_hook)
	target_output_hook (b);
      else
	fputs_filtered (b, gdb_stdout);
    }
  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;
      if (target_output_hook)
	target_output_hook (b);
      else
	fputs_filtered (b, gdb_stderr);
    }
  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."); 
}
