/* Remote target communications for serial-line targets using SDS' protocol.

   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2006 Free Software
   Foundation, Inc.

   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., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301, USA.  */

/* This interface was written by studying the behavior of the SDS
   monitor on an ADS 821/860 board, and by consulting the
   documentation of the monitor that is available on Motorola's web
   site.  -sts 8/13/97 */

#include "defs.h"
#include "gdb_string.h"
#include <fcntl.h>
#include "frame.h"
#include "inferior.h"
#include "exceptions.h"
#include "bfd.h"
#include "symfile.h"
#include "target.h"
#include "gdbcmd.h"
#include "objfiles.h"
#include "gdb-stabs.h"
#include "gdbthread.h"
#include "gdbcore.h"
#include "regcache.h"

#include <signal.h>
#include "serial.h"

extern void _initialize_remote_sds (void);

/* Declarations of local functions. */

static int sds_write_bytes (CORE_ADDR, char *, int);

static int sds_read_bytes (CORE_ADDR, char *, int);

static void sds_files_info (struct target_ops *ignore);

static int sds_xfer_memory (CORE_ADDR, char *, int, int, 
			    struct mem_attrib *, struct target_ops *);

static void sds_prepare_to_store (void);

static void sds_fetch_registers (int);

static void sds_resume (ptid_t, int, enum target_signal);

static int sds_start_remote (void *);

static void sds_open (char *, int);

static void sds_close (int);

static void sds_store_registers (int);

static void sds_mourn (void);

static void sds_load (char *, int);

static int getmessage (unsigned char *, int);

static int putmessage (unsigned char *, int);

static int sds_send (unsigned char *, int);

static int readchar (int);

static ptid_t sds_wait (ptid_t, struct target_waitstatus *);

static void sds_kill (void);

static int fromhex (int);

static void sds_detach (char *, int);

static void sds_interrupt (int);

static void sds_interrupt_twice (int);

static void interrupt_query (void);

static int read_frame (char *);

static int sds_insert_breakpoint (CORE_ADDR, char *);

static int sds_remove_breakpoint (CORE_ADDR, char *);

static void init_sds_ops (void);

static void sds_command (char *args, int from_tty);

/* Define the target operations vector. */

static struct target_ops sds_ops;

/* This was 5 seconds, which is a long time to sit and wait.
   Unless this is going though some terminal server or multiplexer or
   other form of hairy serial connection, I would think 2 seconds would
   be plenty.  */

static int sds_timeout = 2;

/* Descriptor for I/O to remote machine.  Initialize it to NULL so
   that sds_open knows that we don't have a file open when the program
   starts.  */

static struct serial *sds_desc = NULL;

/* This limit comes from the monitor.  */

#define	PBUFSIZ	250

/* Maximum number of bytes to read/write at once.  The value here
   is chosen to fill up a packet (the headers account for the 32).  */
#define MAXBUFBYTES ((PBUFSIZ-32)/2)

static int next_msg_id;

static int just_started;

static int message_pending;


/* Clean up connection to a remote debugger.  */

static void
sds_close (int quitting)
{
  if (sds_desc)
    serial_close (sds_desc);
  sds_desc = NULL;
}

/* Stub for catch_errors.  */

static int
sds_start_remote (void *dummy)
{
  int c;
  unsigned char buf[200];

  immediate_quit++;		/* Allow user to interrupt it */

  /* Ack any packet which the remote side has already sent.  */
  serial_write (sds_desc, "{#*\r\n", 5);
  serial_write (sds_desc, "{#}\r\n", 5);

  while ((c = readchar (1)) >= 0)
    printf_unfiltered ("%c", c);
  printf_unfiltered ("\n");

  next_msg_id = 251;

  buf[0] = 26;
  sds_send (buf, 1);

  buf[0] = 0;
  sds_send (buf, 1);

  immediate_quit--;

  start_remote ();		/* Initialize gdb process mechanisms */
  return 1;
}

/* Open a connection to a remote debugger.
   NAME is the filename used for communication.  */

static void
sds_open (char *name, int from_tty)
{
  if (name == 0)
    error ("To open a remote debug connection, you need to specify what serial\n\
device is attached to the remote system (e.g. /dev/ttya).");

  target_preopen (from_tty);

  unpush_target (&sds_ops);

  sds_desc = serial_open (name);
  if (!sds_desc)
    perror_with_name (name);

  if (baud_rate != -1)
    {
      if (serial_setbaudrate (sds_desc, baud_rate))
	{
	  serial_close (sds_desc);
	  perror_with_name (name);
	}
    }


  serial_raw (sds_desc);

  /* If there is something sitting in the buffer we might take it as a
     response to a command, which would be bad.  */
  serial_flush_input (sds_desc);

  if (from_tty)
    {
      puts_filtered ("Remote debugging using ");
      puts_filtered (name);
      puts_filtered ("\n");
    }
  push_target (&sds_ops);	/* Switch to using remote target now */

  just_started = 1;

  /* Start the remote connection; if error (0), discard this target.
     In particular, if the user quits, be sure to discard it (we'd be
     in an inconsistent state otherwise).  */
  if (!catch_errors (sds_start_remote, NULL,
		     "Couldn't establish connection to remote target\n",
		     RETURN_MASK_ALL))
    pop_target ();
}

/* This takes a program previously attached to and detaches it.  After
   this is done, GDB can be used to debug some other program.  We
   better not have left any breakpoints in the target program or it'll
   die when it hits one.  */

static void
sds_detach (char *args, int from_tty)
{
  char buf[PBUFSIZ];

  if (args)
    error ("Argument given to \"detach\" when remotely debugging.");

#if 0
  /* Tell the remote target to detach.  */
  strcpy (buf, "D");
  sds_send (buf, 1);
#endif

  pop_target ();
  if (from_tty)
    puts_filtered ("Ending remote debugging.\n");
}

/* Convert hex digit A to a number.  */

static int
fromhex (int a)
{
  if (a >= '0' && a <= '9')
    return a - '0';
  else if (a >= 'a' && a <= 'f')
    return a - 'a' + 10;
  else
    error ("Reply contains invalid hex digit %d", a);
}

static int
tob64 (unsigned char *inbuf, char *outbuf, int len)
{
  int i, sum;
  char *p;

  if (len % 3 != 0)
    error ("bad length");

  p = outbuf;
  for (i = 0; i < len; i += 3)
    {
      /* Collect the next three bytes into a number.  */
      sum = ((long) *inbuf++) << 16;
      sum |= ((long) *inbuf++) << 8;
      sum |= ((long) *inbuf++);

      /* Spit out 4 6-bit encodings.  */
      *p++ = ((sum >> 18) & 0x3f) + '0';
      *p++ = ((sum >> 12) & 0x3f) + '0';
      *p++ = ((sum >> 6) & 0x3f) + '0';
      *p++ = (sum & 0x3f) + '0';
    }
  return (p - outbuf);
}

static int
fromb64 (char *inbuf, char *outbuf, int len)
{
  int i, sum;

  if (len % 4 != 0)
    error ("bad length");

  for (i = 0; i < len; i += 4)
    {
      /* Collect 4 6-bit digits.  */
      sum = (*inbuf++ - '0') << 18;
      sum |= (*inbuf++ - '0') << 12;
      sum |= (*inbuf++ - '0') << 6;
      sum |= (*inbuf++ - '0');

      /* Now take the resulting 24-bit number and get three bytes out
         of it.  */
      *outbuf++ = (sum >> 16) & 0xff;
      *outbuf++ = (sum >> 8) & 0xff;
      *outbuf++ = sum & 0xff;
    }

  return (len / 4) * 3;
}


/* Tell the remote machine to resume.  */

static enum target_signal last_sent_signal = TARGET_SIGNAL_0;
int last_sent_step;

static void
sds_resume (ptid_t ptid, int step, enum target_signal siggnal)
{
  unsigned char buf[PBUFSIZ];

  last_sent_signal = siggnal;
  last_sent_step = step;

  buf[0] = (step ? 21 : 20);
  buf[1] = 0;			/* (should be signal?) */

  sds_send (buf, 2);
}

/* Send a message to target to halt it.  Target will respond, and send
   us a message pending notice.  */

static void
sds_interrupt (int signo)
{
  unsigned char buf[PBUFSIZ];

  /* If this doesn't work, try more severe steps.  */
  signal (signo, sds_interrupt_twice);

  if (remote_debug)
    fprintf_unfiltered (gdb_stdlog, "sds_interrupt called\n");

  buf[0] = 25;
  sds_send (buf, 1);
}

static void (*ofunc) ();

/* The user typed ^C twice.  */

static void
sds_interrupt_twice (int signo)
{
  signal (signo, ofunc);

  interrupt_query ();

  signal (signo, sds_interrupt);
}

/* Ask the user what to do when an interrupt is received.  */

static void
interrupt_query (void)
{
  target_terminal_ours ();

  if (query ("Interrupted while waiting for the program.\n\
Give up (and stop debugging it)? "))
    {
      target_mourn_inferior ();
      deprecated_throw_reason (RETURN_QUIT);
    }

  target_terminal_inferior ();
}

/* If nonzero, ignore the next kill.  */
int kill_kludge;

/* Wait until the remote machine stops, then return, storing status in
   STATUS just as `wait' would.  Returns "pid" (though it's not clear
   what, if anything, that means in the case of this target).  */

static ptid_t
sds_wait (ptid_t ptid, struct target_waitstatus *status)
{
  unsigned char buf[PBUFSIZ];
  int retlen;

  status->kind = TARGET_WAITKIND_EXITED;
  status->value.integer = 0;

  ofunc = (void (*)()) signal (SIGINT, sds_interrupt);

  signal (SIGINT, ofunc);

  if (just_started)
    {
      just_started = 0;
      status->kind = TARGET_WAITKIND_STOPPED;
      return inferior_ptid;
    }

  while (1)
    {
      getmessage (buf, 1);

      if (message_pending)
	{
	  buf[0] = 26;
	  retlen = sds_send (buf, 1);
	  if (remote_debug)
	    {
	      fprintf_unfiltered (gdb_stdlog, "Signals: %02x%02x %02x %02x\n",
				  buf[0], buf[1],
				  buf[2], buf[3]);
	    }
	  message_pending = 0;
	  status->kind = TARGET_WAITKIND_STOPPED;
	  status->value.sig = TARGET_SIGNAL_TRAP;
	  goto got_status;
	}
    }
got_status:
  return inferior_ptid;
}

static unsigned char sprs[16];

/* Read the remote registers into the block REGS.  */
/* Currently we just read all the registers, so we don't use regno.  */

static void
sds_fetch_registers (int regno)
{
  unsigned char buf[PBUFSIZ];
  int i, retlen;
  char *regs = alloca (deprecated_register_bytes ());

  /* Unimplemented registers read as all bits zero.  */
  memset (regs, 0, deprecated_register_bytes ());

  buf[0] = 18;
  buf[1] = 1;
  buf[2] = 0;
  retlen = sds_send (buf, 3);

  for (i = 0; i < 4 * 6; ++i)
    regs[i + 4 * 32 + 8 * 32] = buf[i];
  for (i = 0; i < 4 * 4; ++i)
    sprs[i] = buf[i + 4 * 7];

  buf[0] = 18;
  buf[1] = 2;
  buf[2] = 0;
  retlen = sds_send (buf, 3);

  for (i = 0; i < retlen; i++)
    regs[i] = buf[i];

  /* (should warn about reply too short) */

  for (i = 0; i < NUM_REGS; i++)
    regcache_raw_supply (current_regcache, i,
			 &regs[DEPRECATED_REGISTER_BYTE (i)]);
}

/* Prepare to store registers.  Since we may send them all, we have to
   read out the ones we don't want to change first.  */

static void
sds_prepare_to_store (void)
{
  /* Make sure the entire registers array is valid.  */
  deprecated_read_register_bytes (0, (char *) NULL, deprecated_register_bytes ());
}

/* Store register REGNO, or all registers if REGNO == -1, from the contents
   of REGISTERS.  FIXME: ignores errors.  */

static void
sds_store_registers (int regno)
{
  unsigned char *p, buf[PBUFSIZ];
  int i;

  /* Store all the special-purpose registers.  */
  p = buf;
  *p++ = 19;
  *p++ = 1;
  *p++ = 0;
  *p++ = 0;
  for (i = 0; i < 4 * 6; i++)
    *p++ = deprecated_registers[i + 4 * 32 + 8 * 32];
  for (i = 0; i < 4 * 1; i++)
    *p++ = 0;
  for (i = 0; i < 4 * 4; i++)
    *p++ = sprs[i];

  sds_send (buf, p - buf);

  /* Store all the general-purpose registers.  */
  p = buf;
  *p++ = 19;
  *p++ = 2;
  *p++ = 0;
  *p++ = 0;
  for (i = 0; i < 4 * 32; i++)
    *p++ = deprecated_registers[i];

  sds_send (buf, p - buf);

}

/* Write memory data directly to the remote machine.  This does not
   inform the data cache; the data cache uses this.  MEMADDR is the
   address in the remote memory space.  MYADDR is the address of the
   buffer in our space.  LEN is the number of bytes.

   Returns number of bytes transferred, or 0 for error.  */

static int
sds_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
{
  int max_buf_size;		/* Max size of packet output buffer */
  int origlen;
  unsigned char buf[PBUFSIZ];
  int todo;
  int i;

  /* Chop the transfer down if necessary */

  max_buf_size = 150;

  origlen = len;
  while (len > 0)
    {
      todo = min (len, max_buf_size);

      buf[0] = 13;
      buf[1] = 0;
      buf[2] = (int) (memaddr >> 24) & 0xff;
      buf[3] = (int) (memaddr >> 16) & 0xff;
      buf[4] = (int) (memaddr >> 8) & 0xff;
      buf[5] = (int) (memaddr) & 0xff;
      buf[6] = 1;
      buf[7] = 0;

      for (i = 0; i < todo; i++)
	buf[i + 8] = myaddr[i];

      sds_send (buf, 8 + todo);

      /* (should look at result) */

      myaddr += todo;
      memaddr += todo;
      len -= todo;
    }
  return origlen;
}

/* Read memory data directly from the remote machine.  This does not
   use the data cache; the data cache uses this.  MEMADDR is the
   address in the remote memory space.  MYADDR is the address of the
   buffer in our space.  LEN is the number of bytes.

   Returns number of bytes transferred, or 0 for error.  */

static int
sds_read_bytes (CORE_ADDR memaddr, char *myaddr, int len)
{
  int max_buf_size;		/* Max size of packet output buffer */
  int origlen, retlen;
  unsigned char buf[PBUFSIZ];
  int todo;
  int i;

  /* Chop the transfer down if necessary */

  max_buf_size = 150;

  origlen = len;
  while (len > 0)
    {
      todo = min (len, max_buf_size);

      buf[0] = 12;
      buf[1] = 0;
      buf[2] = (int) (memaddr >> 24) & 0xff;
      buf[3] = (int) (memaddr >> 16) & 0xff;
      buf[4] = (int) (memaddr >> 8) & 0xff;
      buf[5] = (int) (memaddr) & 0xff;
      buf[6] = (int) (todo >> 8) & 0xff;
      buf[7] = (int) (todo) & 0xff;
      buf[8] = 1;

      retlen = sds_send (buf, 9);

      if (retlen - 2 != todo)
	{
	  return 0;
	}

      /* Reply describes memory byte by byte. */

      for (i = 0; i < todo; i++)
	myaddr[i] = buf[i + 2];

      myaddr += todo;
      memaddr += todo;
      len -= todo;
    }

  return origlen;
}

/* Read or write LEN bytes from inferior memory at MEMADDR,
   transferring to or from debugger address MYADDR.  Write to inferior
   if SHOULD_WRITE is nonzero.  Returns length of data written or
   read; 0 for error.  TARGET is unused.  */

static int
sds_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int should_write,
		 struct mem_attrib *attrib, struct target_ops *target)
{
  int res;

  if (should_write)
    res = sds_write_bytes (memaddr, myaddr, len);
  else
    res = sds_read_bytes (memaddr, myaddr, len);
  
  return res;
}


static void
sds_files_info (struct target_ops *ignore)
{
  puts_filtered ("Debugging over a serial connection, using SDS protocol.\n");
}

/* Stuff for dealing with the packets which are part of this protocol.
   See comment at top of file for details.  */

/* Read a single character from the remote end, masking it down to 7 bits. */

static int
readchar (int timeout)
{
  int ch;

  ch = serial_readchar (sds_desc, timeout);

  if (remote_debug > 1 && ch >= 0)
    fprintf_unfiltered (gdb_stdlog, "%c(%x)", ch, ch);

  switch (ch)
    {
    case SERIAL_EOF:
      error ("Remote connection closed");
    case SERIAL_ERROR:
      perror_with_name ("Remote communication error");
    case SERIAL_TIMEOUT:
      return ch;
    default:
      return ch & 0x7f;
    }
}

/* An SDS-style checksum is a sum of the bytes modulo 253.  (Presumably
   because 253, 254, and 255 are special flags in the protocol.)  */

static int
compute_checksum (int csum, char *buf, int len)
{
  int i;

  for (i = 0; i < len; ++i)
    csum += (unsigned char) buf[i];

  csum %= 253;
  return csum;
}

/* Send the command in BUF to the remote machine, and read the reply
   into BUF also.  */

static int
sds_send (unsigned char *buf, int len)
{
  putmessage (buf, len);

  return getmessage (buf, 0);
}

/* Send a message to the remote machine.  */

static int
putmessage (unsigned char *buf, int len)
{
  int i, enclen;
  unsigned char csum = 0;
  char buf2[PBUFSIZ], buf3[PBUFSIZ];
  unsigned char header[3];
  char *p;

  /* Copy the packet into buffer BUF2, encapsulating it
     and giving it a checksum.  */

  if (len > 170)		/* Prosanity check */
    internal_error (__FILE__, __LINE__, _("failed internal consistency check"));

  if (remote_debug)
    {
      fprintf_unfiltered (gdb_stdlog, "Message to send: \"");
      for (i = 0; i < len; ++i)
	fprintf_unfiltered (gdb_stdlog, "%02x", buf[i]);
      fprintf_unfiltered (gdb_stdlog, "\"\n");
    }

  p = buf2;
  *p++ = '$';

  if (len % 3 != 0)
    {
      buf[len] = '\0';
      buf[len + 1] = '\0';
    }

  header[1] = next_msg_id;

  header[2] = len;

  csum = compute_checksum (csum, buf, len);
  csum = compute_checksum (csum, header + 1, 2);

  header[0] = csum;

  tob64 (header, p, 3);
  p += 4;
  enclen = tob64 (buf, buf3, ((len + 2) / 3) * 3);

  for (i = 0; i < enclen; ++i)
    *p++ = buf3[i];
  *p++ = '\r';
  *p++ = '\n';

  next_msg_id = (next_msg_id + 3) % 245;

  /* Send it over and over until we get a positive ack.  */

  while (1)
    {
      if (remote_debug)
	{
	  *p = '\0';
	  fprintf_unfiltered (gdb_stdlog, "Sending encoded: \"%s\"", buf2);
	  fprintf_unfiltered (gdb_stdlog,
			      "  (Checksum %d, id %d, length %d)\n",
			      header[0], header[1], header[2]);
	  gdb_flush (gdb_stdlog);
	}
      if (serial_write (sds_desc, buf2, p - buf2))
	perror_with_name ("putmessage: write failed");

      return 1;
    }
}

/* Come here after finding the start of the frame.  Collect the rest
   into BUF.  Returns 0 on any error, 1 on success.  */

static int
read_frame (char *buf)
{
  char *bp;
  int c;

  bp = buf;

  while (1)
    {
      c = readchar (sds_timeout);

      switch (c)
	{
	case SERIAL_TIMEOUT:
	  if (remote_debug)
	    fputs_filtered ("Timeout in mid-message, retrying\n", gdb_stdlog);
	  return 0;
	case '$':
	  if (remote_debug)
	    fputs_filtered ("Saw new packet start in middle of old one\n",
			    gdb_stdlog);
	  return 0;		/* Start a new packet, count retries */
	case '\r':
	  break;

	case '\n':
	  {
	    *bp = '\000';
	    if (remote_debug)
	      fprintf_unfiltered (gdb_stdlog, "Received encoded: \"%s\"\n",
				  buf);
	    return 1;
	  }

	default:
	  if (bp < buf + PBUFSIZ - 1)
	    {
	      *bp++ = c;
	      continue;
	    }

	  *bp = '\0';
	  puts_filtered ("Message too long: ");
	  puts_filtered (buf);
	  puts_filtered ("\n");

	  return 0;
	}
    }
}

/* Read a packet from the remote machine, with error checking,
   and store it in BUF.  BUF is expected to be of size PBUFSIZ.
   If FOREVER, wait forever rather than timing out; this is used
   while the target is executing user code.  */

static int
getmessage (unsigned char *buf, int forever)
{
  int c, c2, c3;
  int tries;
  int timeout;
  int val, i, len, csum;
  unsigned char header[3];
  unsigned char inbuf[500];

  strcpy (buf, "timeout");

  if (forever)
    {
      timeout = watchdog > 0 ? watchdog : -1;
    }

  else
    timeout = sds_timeout;

#define MAX_TRIES 3

  for (tries = 1; tries <= MAX_TRIES; tries++)
    {
      /* This can loop forever if the remote side sends us characters
         continuously, but if it pauses, we'll get a zero from readchar
         because of timeout.  Then we'll count that as a retry.  */

      /* Note that we will only wait forever prior to the start of a packet.
         After that, we expect characters to arrive at a brisk pace.  They
         should show up within sds_timeout intervals.  */

      do
	{
	  c = readchar (timeout);

	  if (c == SERIAL_TIMEOUT)
	    {
	      if (forever)	/* Watchdog went off.  Kill the target. */
		{
		  target_mourn_inferior ();
		  error ("Watchdog has expired.  Target detached.\n");
		}
	      if (remote_debug)
		fputs_filtered ("Timed out.\n", gdb_stdlog);
	      goto retry;
	    }
	}
      while (c != '$' && c != '{');

      /* We might have seen a "trigraph", a sequence of three characters
         that indicate various sorts of communication state.  */

      if (c == '{')
	{
	  /* Read the other two chars of the trigraph. */
	  c2 = readchar (timeout);
	  c3 = readchar (timeout);
	  if (remote_debug)
	    fprintf_unfiltered (gdb_stdlog, "Trigraph %c%c%c received\n",
				c, c2, c3);
	  if (c3 == '+')
	    {
	      message_pending = 1;
	      return 0;		/*???? */
	    }
	  continue;
	}

      val = read_frame (inbuf);

      if (val == 1)
	{
	  fromb64 (inbuf, header, 4);
	  /* (should check out other bits) */
	  fromb64 (inbuf + 4, buf, strlen (inbuf) - 4);

	  len = header[2];

	  csum = 0;
	  csum = compute_checksum (csum, buf, len);
	  csum = compute_checksum (csum, header + 1, 2);

	  if (csum != header[0])
	    fprintf_unfiltered (gdb_stderr,
			    "Checksum mismatch: computed %d, received %d\n",
				csum, header[0]);

	  if (header[2] == 0xff)
	    fprintf_unfiltered (gdb_stderr, "Requesting resend...\n");

	  if (remote_debug)
	    {
	      fprintf_unfiltered (gdb_stdlog,
				"... (Got checksum %d, id %d, length %d)\n",
				  header[0], header[1], header[2]);
	      fprintf_unfiltered (gdb_stdlog, "Message received: \"");
	      for (i = 0; i < len; ++i)
		{
		  fprintf_unfiltered (gdb_stdlog, "%02x", (unsigned char) buf[i]);
		}
	      fprintf_unfiltered (gdb_stdlog, "\"\n");
	    }

	  /* no ack required? */
	  return len;
	}

      /* Try the whole thing again.  */
    retry:
      /* need to do something here */
      ;
    }

  /* We have tried hard enough, and just can't receive the packet.  Give up. */

  printf_unfiltered ("Ignoring packet error, continuing...\n");
  return 0;
}

static void
sds_kill (void)
{
  /* Don't try to do anything to the target.  */
}

static void
sds_mourn (void)
{
  unpush_target (&sds_ops);
  generic_mourn_inferior ();
}

static void
sds_create_inferior (char *exec_file, char *args, char **env, int from_tty)
{
  inferior_ptid = pid_to_ptid (42000);

  /* Clean up from the last time we were running.  */
  clear_proceed_status ();

  write_pc (bfd_get_start_address (exec_bfd));
}

static void
sds_load (char *filename, int from_tty)
{
  generic_load (filename, from_tty);

  inferior_ptid = null_ptid;
}

/* The SDS monitor has commands for breakpoint insertion, although it
   it doesn't actually manage the breakpoints, it just returns the
   replaced instruction back to the debugger.  */

static int
sds_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
{
  int i, retlen;
  unsigned char *p, buf[PBUFSIZ];

  p = buf;
  *p++ = 16;
  *p++ = 0;
  *p++ = (int) (addr >> 24) & 0xff;
  *p++ = (int) (addr >> 16) & 0xff;
  *p++ = (int) (addr >> 8) & 0xff;
  *p++ = (int) (addr) & 0xff;

  retlen = sds_send (buf, p - buf);

  for (i = 0; i < 4; ++i)
    contents_cache[i] = buf[i + 2];

  return 0;
}

static int
sds_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
{
  int i, retlen;
  unsigned char *p, buf[PBUFSIZ];

  p = buf;
  *p++ = 17;
  *p++ = 0;
  *p++ = (int) (addr >> 24) & 0xff;
  *p++ = (int) (addr >> 16) & 0xff;
  *p++ = (int) (addr >> 8) & 0xff;
  *p++ = (int) (addr) & 0xff;
  for (i = 0; i < 4; ++i)
    *p++ = contents_cache[i];

  retlen = sds_send (buf, p - buf);

  return 0;
}

static void
init_sds_ops (void)
{
  sds_ops.to_shortname = "sds";
  sds_ops.to_longname = "Remote serial target with SDS protocol";
  sds_ops.to_doc = "Use a remote computer via a serial line; using the SDS protocol.\n\
Specify the serial device it is connected to (e.g. /dev/ttya).";
  sds_ops.to_open = sds_open;
  sds_ops.to_close = sds_close;
  sds_ops.to_detach = sds_detach;
  sds_ops.to_resume = sds_resume;
  sds_ops.to_wait = sds_wait;
  sds_ops.to_fetch_registers = sds_fetch_registers;
  sds_ops.to_store_registers = sds_store_registers;
  sds_ops.to_prepare_to_store = sds_prepare_to_store;
  sds_ops.deprecated_xfer_memory = sds_xfer_memory;
  sds_ops.to_files_info = sds_files_info;
  sds_ops.to_insert_breakpoint = sds_insert_breakpoint;
  sds_ops.to_remove_breakpoint = sds_remove_breakpoint;
  sds_ops.to_kill = sds_kill;
  sds_ops.to_load = sds_load;
  sds_ops.to_create_inferior = sds_create_inferior;
  sds_ops.to_mourn_inferior = sds_mourn;
  sds_ops.to_stratum = process_stratum;
  sds_ops.to_has_all_memory = 1;
  sds_ops.to_has_memory = 1;
  sds_ops.to_has_stack = 1;
  sds_ops.to_has_registers = 1;
  sds_ops.to_has_execution = 1;
  sds_ops.to_magic = OPS_MAGIC;
}

/* Put a command string, in args, out to the monitor and display the
   reply message.  */

static void
sds_command (char *args, int from_tty)
{
  char *p;
  int i, len, retlen;
  unsigned char buf[1000];

  /* Convert hexadecimal chars into a byte buffer.  */
  p = args;
  len = 0;
  while (*p != '\0')
    {
      buf[len++] = fromhex (p[0]) * 16 + fromhex (p[1]);
      if (p[1] == '\0')
	break;
      p += 2;
    }

  retlen = sds_send (buf, len);

  printf_filtered ("Reply is ");
  for (i = 0; i < retlen; ++i)
    {
      printf_filtered ("%02x", buf[i]);
    }
  printf_filtered ("\n");
}

void
_initialize_remote_sds (void)
{
  init_sds_ops ();
  add_target (&sds_ops);

  add_setshow_integer_cmd ("sdstimeout", no_class, &sds_timeout, _("\
Set timeout value for sds read."), _("\
Show timeout value for sds read."), NULL,
			   NULL,
			   NULL, /* FIXME: i18n: */
			   &setlist, &showlist);

  add_com ("sds", class_obscure, sds_command,
	   _("Send a command to the SDS monitor."));
}
