/* Remote debugging interface for AMD 29000 EBMON on IBM PC, for GDB.
   Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
   Contributed by Cygnus Support.  Written by Jim Kingdon for Cygnus.

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

/* This is like remote.c but is for an esoteric situation--
   having a a29k board in a PC hooked up to a unix machine with
   a serial line, and running ctty com1 on the PC, through which
   the unix machine can run ebmon.  Not to mention that the PC
   has PC/NFS, so it can access the same executables that gdb can,
   over the net in real time.  */

#include "defs.h"
#include "gdb_string.h"

#include "inferior.h"
#include "bfd.h"
#include "symfile.h"
#include "wait.h"
#include "value.h"
#include <ctype.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include "terminal.h"
#include "target.h"
#include "gdbcore.h"

extern struct target_ops eb_ops;	/* Forward declaration */

static void eb_close ();

#define LOG_FILE "eb.log"
#if defined (LOG_FILE)
FILE *log_file;
#endif

static int timeout = 24;

/* Descriptor for I/O to remote machine.  Initialize it to -1 so that
   eb_open knows that we don't have a file open when the program
   starts.  */
int eb_desc = -1;

/* stream which is fdopen'd from eb_desc.  Only valid when
   eb_desc != -1.  */
FILE *eb_stream;

/* Read a character from the remote system, doing all the fancy
   timeout stuff.  */
static int
readchar ()
{
  char buf;

  buf = '\0';
#ifdef HAVE_TERMIO
  /* termio does the timeout for us.  */
  read (eb_desc, &buf, 1);
#else
  alarm (timeout);
  if (read (eb_desc, &buf, 1) < 0)
    {
      if (errno == EINTR)
	error ("Timeout reading from remote system.");
      else
	perror_with_name ("remote");
    }
  alarm (0);
#endif

  if (buf == '\0')
    error ("Timeout reading from remote system.");
#if defined (LOG_FILE)
  putc (buf & 0x7f, log_file);
#endif
  return buf & 0x7f;
}

/* Keep discarding input from the remote system, until STRING is found. 
   Let the user break out immediately.  */
static void
expect (string)
     char *string;
{
  char *p = string;

  immediate_quit = 1;
  while (1)
    {
      if (readchar () == *p)
	{
	  p++;
	  if (*p == '\0')
	    {
	      immediate_quit = 0;
	      return;
	    }
	}
      else
	p = string;
    }
}

/* Keep discarding input until we see the ebmon prompt.

   The convention for dealing with the prompt is that you
   o give your command
   o *then* wait for the prompt.

   Thus the last thing that a procedure does with the serial line
   will be an expect_prompt().  Exception:  eb_resume does not
   wait for the prompt, because the terminal is being handed over
   to the inferior.  However, the next thing which happens after that
   is a eb_wait which does wait for the prompt.
   Note that this includes abnormal exit, e.g. error().  This is
   necessary to prevent getting into states from which we can't
   recover.  */
static void
expect_prompt ()
{
#if defined (LOG_FILE)
  /* This is a convenient place to do this.  The idea is to do it often
     enough that we never lose much data if we terminate abnormally.  */
  fflush (log_file);
#endif
  expect ("\n# ");
}

/* Get a hex digit from the remote system & return its value.
   If ignore_space is nonzero, ignore spaces (not newline, tab, etc).  */
static int
get_hex_digit (ignore_space)
     int ignore_space;
{
  int ch;
  while (1)
    {
      ch = readchar ();
      if (ch >= '0' && ch <= '9')
	return ch - '0';
      else if (ch >= 'A' && ch <= 'F')
	return ch - 'A' + 10;
      else if (ch >= 'a' && ch <= 'f')
	return ch - 'a' + 10;
      else if (ch == ' ' && ignore_space)
	;
      else
	{
	  expect_prompt ();
	  error ("Invalid hex digit from remote system.");
	}
    }
}

/* Get a byte from eb_desc and put it in *BYT.  Accept any number
   leading spaces.  */
static void
get_hex_byte (byt)
     char *byt;
{
  int val;

  val = get_hex_digit (1) << 4;
  val |= get_hex_digit (0);
  *byt = val;
}

/* Get N 32-bit words from remote, each preceded by a space,
   and put them in registers starting at REGNO.  */
static void
get_hex_regs (n, regno)
     int n;
     int regno;
{
  long val;
  int i;

  for (i = 0; i < n; i++)
    {
      int j;

      val = 0;
      for (j = 0; j < 8; j++)
	val = (val << 4) + get_hex_digit (j == 0);
      supply_register (regno++, (char *) &val);
    }
}

/* Called when SIGALRM signal sent due to alarm() timeout.  */
#ifndef HAVE_TERMIO

#ifndef __STDC__
#define volatile
/**/
#endif
volatile int n_alarms;

void
eb_timer ()
{
#if 0
  if (kiodebug)
    printf ("eb_timer called\n");
#endif
  n_alarms++;
}
#endif

/* malloc'd name of the program on the remote system.  */
static char *prog_name = NULL;

/* Nonzero if we have loaded the file ("yc") and not yet issued a "gi"
   command.  "gi" is supposed to happen exactly once for each "yc".  */
static int need_gi = 0;

/* Number of SIGTRAPs we need to simulate.  That is, the next
   NEED_ARTIFICIAL_TRAP calls to eb_wait should just return
   SIGTRAP without actually waiting for anything.  */

static int need_artificial_trap = 0;

/* This is called not only when we first attach, but also when the
   user types "run" after having attached.  */
static void
eb_create_inferior (execfile, args, env)
     char *execfile;
     char *args;
     char **env;
{
  int entry_pt;

  if (args && *args)
    error ("Can't pass arguments to remote EBMON process");

  if (execfile == 0 || exec_bfd == 0)
    error ("No executable file specified");

  entry_pt = (int) bfd_get_start_address (exec_bfd);

  {
    /* OK, now read in the file.  Y=read, C=COFF, D=no symbols
       0=start address, %s=filename.  */

    fprintf (eb_stream, "YC D,0:%s", prog_name);

    if (args != NULL)
      fprintf (eb_stream, " %s", args);

    fprintf (eb_stream, "\n");
    fflush (eb_stream);

    expect_prompt ();

    need_gi = 1;
  }

/* The "process" (board) is already stopped awaiting our commands, and
   the program is already downloaded.  We just set its PC and go.  */

  clear_proceed_status ();

  /* Tell wait_for_inferior that we've started a new process.  */
  init_wait_for_inferior ();

  /* Set up the "saved terminal modes" of the inferior
     based on what modes we are starting it with.  */
  target_terminal_init ();

  /* Install inferior's terminal modes.  */
  target_terminal_inferior ();

  /* insert_step_breakpoint ();  FIXME, do we need this?  */
  proceed ((CORE_ADDR) entry_pt, TARGET_SIGNAL_DEFAULT, 0);	/* Let 'er rip... */
}

/* Translate baud rates from integers to damn B_codes.  Unix should
   have outgrown this crap years ago, but even POSIX wouldn't buck it.  */

#ifndef B19200
#define B19200 EXTA
#endif
#ifndef B38400
#define B38400 EXTB
#endif

struct
{
  int rate, damn_b;
}
baudtab[] =
{
  {
    0, B0
  }
  ,
  {
    50, B50
  }
  ,
  {
    75, B75
  }
  ,
  {
    110, B110
  }
  ,
  {
    134, B134
  }
  ,
  {
    150, B150
  }
  ,
  {
    200, B200
  }
  ,
  {
    300, B300
  }
  ,
  {
    600, B600
  }
  ,
  {
    1200, B1200
  }
  ,
  {
    1800, B1800
  }
  ,
  {
    2400, B2400
  }
  ,
  {
    4800, B4800
  }
  ,
  {
    9600, B9600
  }
  ,
  {
    19200, B19200
  }
  ,
  {
    38400, B38400
  }
  ,
  {
    -1, -1
  }
  ,
};

int
damn_b (rate)
     int rate;
{
  int i;

  for (i = 0; baudtab[i].rate != -1; i++)
    if (rate == baudtab[i].rate)
      return baudtab[i].damn_b;
  return B38400;		/* Random */
}


/* Open a connection to a remote debugger.
   NAME is the filename used for communication, then a space,
   then the name of the program as we should name it to EBMON.  */

static int baudrate = 9600;
static char *dev_name;
void
eb_open (name, from_tty)
     char *name;
     int from_tty;
{
  TERMINAL sg;

  char *p;

  target_preopen (from_tty);

  /* Find the first whitespace character, it separates dev_name from
     prog_name.  */
  if (name == 0)
    goto erroid;

  for (p = name;
       *p != '\0' && !isspace (*p); p++)
    ;
  if (*p == '\0')
  erroid:
    error ("\
Please include the name of the device for the serial port,\n\
the baud rate, and the name of the program to run on the remote system.");
  dev_name = alloca (p - name + 1);
  strncpy (dev_name, name, p - name);
  dev_name[p - name] = '\0';

  /* Skip over the whitespace after dev_name */
  for (; isspace (*p); p++)
    /*EMPTY */ ;

  if (1 != sscanf (p, "%d ", &baudrate))
    goto erroid;

  /* Skip the number and then the spaces */
  for (; isdigit (*p); p++)
    /*EMPTY */ ;
  for (; isspace (*p); p++)
    /*EMPTY */ ;

  if (prog_name != NULL)
    free (prog_name);
  prog_name = savestring (p, strlen (p));

  eb_close (0);

  eb_desc = open (dev_name, O_RDWR);
  if (eb_desc < 0)
    perror_with_name (dev_name);
  ioctl (eb_desc, TIOCGETP, &sg);
#ifdef HAVE_TERMIO
  sg.c_cc[VMIN] = 0;		/* read with timeout.  */
  sg.c_cc[VTIME] = timeout * 10;
  sg.c_lflag &= ~(ICANON | ECHO);
  sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate);
#else
  sg.sg_ispeed = damn_b (baudrate);
  sg.sg_ospeed = damn_b (baudrate);
  sg.sg_flags |= RAW | ANYP;
  sg.sg_flags &= ~ECHO;
#endif

  ioctl (eb_desc, TIOCSETP, &sg);
  eb_stream = fdopen (eb_desc, "r+");

  push_target (&eb_ops);
  if (from_tty)
    printf ("Remote %s debugging %s using %s\n", target_shortname,
	    prog_name, dev_name);

#ifndef HAVE_TERMIO
#ifndef NO_SIGINTERRUPT
  /* Cause SIGALRM's to make reads fail with EINTR instead of resuming
     the read.  */
  if (siginterrupt (SIGALRM, 1) != 0)
    perror ("eb_open: error in siginterrupt");
#endif

  /* Set up read timeout timer.  */
  if ((void (*)) signal (SIGALRM, eb_timer) == (void (*)) -1)
    perror ("eb_open: error in signal");
#endif

#if defined (LOG_FILE)
  log_file = fopen (LOG_FILE, "w");
  if (log_file == NULL)
    perror_with_name (LOG_FILE);
#endif

  /* Hello?  Are you there?  */
  write (eb_desc, "\n", 1);

  expect_prompt ();
}

/* Close out all files and local state before this target loses control. */

static void
eb_close (quitting)
     int quitting;
{

  /* Due to a bug in Unix, fclose closes not only the stdio stream,
     but also the file descriptor.  So we don't actually close
     eb_desc.  */
  if (eb_stream)
    fclose (eb_stream);		/* This also closes eb_desc */
  if (eb_desc >= 0)
    /* close (eb_desc); */

    /* Do not try to close eb_desc again, later in the program.  */
    eb_stream = NULL;
  eb_desc = -1;

#if defined (LOG_FILE)
  if (log_file)
    {
      if (ferror (log_file))
	printf ("Error writing log file.\n");
      if (fclose (log_file) != 0)
	printf ("Error closing log file.\n");
    }
#endif
}

/* Terminate the open connection to the remote debugger.
   Use this when you want to detach and do something else
   with your gdb.  */
void
eb_detach (from_tty)
     int from_tty;
{
  pop_target ();		/* calls eb_close to do the real work */
  if (from_tty)
    printf ("Ending remote %s debugging\n", target_shortname);
}

/* Tell the remote machine to resume.  */

void
eb_resume (pid, step, sig)
     int pid, step;
     enum target_signal sig;
{
  if (step)
    {
      write (eb_desc, "t 1,s\n", 6);
      /* Wait for the echo.  */
      expect ("t 1,s\r");
      /* Then comes a line containing the instruction we stepped to.  */
      expect ("\n@");
      /* Then we get the prompt.  */
      expect_prompt ();

      /* Force the next eb_wait to return a trap.  Not doing anything
         about I/O from the target means that the user has to type
         "continue" to see any.  This should be fixed.  */
      need_artificial_trap = 1;
    }
  else
    {
      if (need_gi)
	{
	  need_gi = 0;
	  write (eb_desc, "gi\n", 3);

	  /* Swallow the echo of "gi".  */
	  expect ("gi\r");
	}
      else
	{
	  write (eb_desc, "GR\n", 3);
	  /* Swallow the echo.  */
	  expect ("GR\r");
	}
    }
}

/* Wait until the remote machine stops, then return,
   storing status in STATUS just as `wait' would.  */

int
eb_wait (status)
     struct target_waitstatus *status;
{
  /* Strings to look for.  '?' means match any single character.  
     Note that with the algorithm we use, the initial character
     of the string cannot recur in the string, or we will not
     find some cases of the string in the input.  */

  static char bpt[] = "Invalid interrupt taken - #0x50 - ";
  /* It would be tempting to look for "\n[__exit + 0x8]\n"
     but that requires loading symbols with "yc i" and even if
     we did do that we don't know that the file has symbols.  */
  static char exitmsg[] = "\n@????????I    JMPTI     GR121,LR0";
  char *bp = bpt;
  char *ep = exitmsg;

  /* Large enough for either sizeof (bpt) or sizeof (exitmsg) chars.  */
  char swallowed[50];
  /* Current position in swallowed.  */
  char *swallowed_p = swallowed;

  int ch;
  int ch_handled;

  int old_timeout = timeout;

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

  if (need_artificial_trap != 0)
    {
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_TRAP;
      need_artificial_trap--;
      return 0;
    }

  timeout = 0;			/* Don't time out -- user program is running. */
  while (1)
    {
      ch_handled = 0;
      ch = readchar ();
      if (ch == *bp)
	{
	  bp++;
	  if (*bp == '\0')
	    break;
	  ch_handled = 1;

	  *swallowed_p++ = ch;
	}
      else
	bp = bpt;

      if (ch == *ep || *ep == '?')
	{
	  ep++;
	  if (*ep == '\0')
	    break;

	  if (!ch_handled)
	    *swallowed_p++ = ch;
	  ch_handled = 1;
	}
      else
	ep = exitmsg;

      if (!ch_handled)
	{
	  char *p;

	  /* Print out any characters which have been swallowed.  */
	  for (p = swallowed; p < swallowed_p; ++p)
	    putc (*p, stdout);
	  swallowed_p = swallowed;

	  putc (ch, stdout);
	}
    }
  expect_prompt ();
  if (*bp == '\0')
    {
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_TRAP;
    }
  else
    {
      status->kind = TARGET_WAITKIND_EXITED;
      status->value.integer = 0;
    }
  timeout = old_timeout;

  return 0;
}

/* Return the name of register number REGNO
   in the form input and output by EBMON.

   Returns a pointer to a static buffer containing the answer.  */
static char *
get_reg_name (regno)
     int regno;
{
  static char buf[80];
  if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
    sprintf (buf, "GR%03d", regno - GR96_REGNUM + 96);
  else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
    sprintf (buf, "LR%03d", regno - LR0_REGNUM);
  else if (regno == Q_REGNUM)
    strcpy (buf, "SR131");
  else if (regno >= BP_REGNUM && regno <= CR_REGNUM)
    sprintf (buf, "SR%03d", regno - BP_REGNUM + 133);
  else if (regno == ALU_REGNUM)
    strcpy (buf, "SR132");
  else if (regno >= IPC_REGNUM && regno <= IPB_REGNUM)
    sprintf (buf, "SR%03d", regno - IPC_REGNUM + 128);
  else if (regno >= VAB_REGNUM && regno <= LRU_REGNUM)
    sprintf (buf, "SR%03d", regno - VAB_REGNUM);
  else if (regno == GR1_REGNUM)
    strcpy (buf, "GR001");
  return buf;
}

/* Read the remote registers into the block REGS.  */

static void
eb_fetch_registers ()
{
  int reg_index;
  int regnum_index;
  char tempbuf[10];
  int i;

#if 0
  /* This should not be necessary, because one is supposed to read the
     registers only when the inferior is stopped (at least with
     ptrace() and why not make it the same for remote?).  */
  /* ^A is the "normal character" used to make sure we are talking to EBMON
     and not to the program being debugged.  */
  write (eb_desc, "\001\n");
  expect_prompt ();
#endif

  write (eb_desc, "dw gr96,gr127\n", 14);
  for (reg_index = 96, regnum_index = GR96_REGNUM;
       reg_index < 128;
       reg_index += 4, regnum_index += 4)
    {
      sprintf (tempbuf, "GR%03d ", reg_index);
      expect (tempbuf);
      get_hex_regs (4, regnum_index);
      expect ("\n");
    }

  for (i = 0; i < 128; i += 32)
    {
      /* The PC has a tendency to hang if we get these
         all in one fell swoop ("dw lr0,lr127").  */
      sprintf (tempbuf, "dw lr%d\n", i);
      write (eb_desc, tempbuf, strlen (tempbuf));
      for (reg_index = i, regnum_index = LR0_REGNUM + i;
	   reg_index < i + 32;
	   reg_index += 4, regnum_index += 4)
	{
	  sprintf (tempbuf, "LR%03d ", reg_index);
	  expect (tempbuf);
	  get_hex_regs (4, regnum_index);
	  expect ("\n");
	}
    }

  write (eb_desc, "dw sr133,sr133\n", 15);
  expect ("SR133          ");
  get_hex_regs (1, BP_REGNUM);
  expect ("\n");

  write (eb_desc, "dw sr134,sr134\n", 15);
  expect ("SR134                   ");
  get_hex_regs (1, FC_REGNUM);
  expect ("\n");

  write (eb_desc, "dw sr135,sr135\n", 15);
  expect ("SR135                            ");
  get_hex_regs (1, CR_REGNUM);
  expect ("\n");

  write (eb_desc, "dw sr131,sr131\n", 15);
  expect ("SR131                            ");
  get_hex_regs (1, Q_REGNUM);
  expect ("\n");

  write (eb_desc, "dw sr0,sr14\n", 12);
  for (reg_index = 0, regnum_index = VAB_REGNUM;
       regnum_index <= LRU_REGNUM;
       regnum_index += 4, reg_index += 4)
    {
      sprintf (tempbuf, "SR%03d ", reg_index);
      expect (tempbuf);
      get_hex_regs (reg_index == 12 ? 3 : 4, regnum_index);
      expect ("\n");
    }

  /* There doesn't seem to be any way to get these.  */
  {
    int val = -1;
    supply_register (FPE_REGNUM, (char *) &val);
    supply_register (INTE_REGNUM, (char *) &val);
    supply_register (FPS_REGNUM, (char *) &val);
    supply_register (EXO_REGNUM, (char *) &val);
  }

  write (eb_desc, "dw gr1,gr1\n", 11);
  expect ("GR001 ");
  get_hex_regs (1, GR1_REGNUM);
  expect_prompt ();
}

/* Fetch register REGNO, or all registers if REGNO is -1.
   Returns errno value.  */
void
eb_fetch_register (regno)
     int regno;
{
  if (regno == -1)
    eb_fetch_registers ();
  else
    {
      char *name = get_reg_name (regno);
      fprintf (eb_stream, "dw %s,%s\n", name, name);
      expect (name);
      expect (" ");
      get_hex_regs (1, regno);
      expect_prompt ();
    }
  return;
}

/* Store the remote registers from the contents of the block REGS.  */

static void
eb_store_registers ()
{
  int i, j;
  fprintf (eb_stream, "s gr1,%x\n", read_register (GR1_REGNUM));
  expect_prompt ();

  for (j = 0; j < 32; j += 16)
    {
      fprintf (eb_stream, "s gr%d,", j + 96);
      for (i = 0; i < 15; ++i)
	fprintf (eb_stream, "%x,", read_register (GR96_REGNUM + j + i));
      fprintf (eb_stream, "%x\n", read_register (GR96_REGNUM + j + 15));
      expect_prompt ();
    }

  for (j = 0; j < 128; j += 16)
    {
      fprintf (eb_stream, "s lr%d,", j);
      for (i = 0; i < 15; ++i)
	fprintf (eb_stream, "%x,", read_register (LR0_REGNUM + j + i));
      fprintf (eb_stream, "%x\n", read_register (LR0_REGNUM + j + 15));
      expect_prompt ();
    }

  fprintf (eb_stream, "s sr133,%x,%x,%x\n", read_register (BP_REGNUM),
	   read_register (FC_REGNUM), read_register (CR_REGNUM));
  expect_prompt ();
  fprintf (eb_stream, "s sr131,%x\n", read_register (Q_REGNUM));
  expect_prompt ();
  fprintf (eb_stream, "s sr0,");
  for (i = 0; i < 11; ++i)
    fprintf (eb_stream, "%x,", read_register (VAB_REGNUM + i));
  fprintf (eb_stream, "%x\n", read_register (VAB_REGNUM + 11));
  expect_prompt ();
}

/* Store register REGNO, or all if REGNO == 0.
   Return errno value.  */
void
eb_store_register (regno)
     int regno;
{
  if (regno == -1)
    eb_store_registers ();
  else
    {
      char *name = get_reg_name (regno);
      fprintf (eb_stream, "s %s,%x\n", name, read_register (regno));
      /* Setting GR1 changes the numbers of all the locals, so
         invalidate the register cache.  Do this *after* calling
         read_register, because we want read_register to return the
         value that write_register has just stuffed into the registers
         array, not the value of the register fetched from the
         inferior.  */
      if (regno == GR1_REGNUM)
	registers_changed ();
      expect_prompt ();
    }
}

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

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


/* FIXME-someday!  Merge these two.  */
int
eb_xfer_inferior_memory (memaddr, myaddr, len, write, target)
     CORE_ADDR memaddr;
     char *myaddr;
     int len;
     int write;
     struct target_ops *target;	/* ignored */
{
  if (write)
    return eb_write_inferior_memory (memaddr, myaddr, len);
  else
    return eb_read_inferior_memory (memaddr, myaddr, len);
}

void
eb_files_info ()
{
  printf ("\tAttached to %s at %d baud and running program %s.\n",
	  dev_name, baudrate, prog_name);
}

/* Copy LEN bytes of data from debugger memory at MYADDR
   to inferior's memory at MEMADDR.  Returns length moved.  */
int
eb_write_inferior_memory (memaddr, myaddr, len)
     CORE_ADDR memaddr;
     char *myaddr;
     int len;
{
  int i;

  for (i = 0; i < len; i++)
    {
      if ((i % 16) == 0)
	fprintf (eb_stream, "sb %x,", memaddr + i);
      if ((i % 16) == 15 || i == len - 1)
	{
	  fprintf (eb_stream, "%x\n", ((unsigned char *) myaddr)[i]);
	  expect_prompt ();
	}
      else
	fprintf (eb_stream, "%x,", ((unsigned char *) myaddr)[i]);
    }
  return len;
}

/* Read LEN bytes from inferior memory at MEMADDR.  Put the result
   at debugger address MYADDR.  Returns length moved.  */
int
eb_read_inferior_memory (memaddr, myaddr, len)
     CORE_ADDR memaddr;
     char *myaddr;
     int len;
{
  int i;

  /* Number of bytes read so far.  */
  int count;

  /* Starting address of this pass.  */
  unsigned long startaddr;

  /* Number of bytes to read in this pass.  */
  int len_this_pass;

  /* Note that this code works correctly if startaddr is just less
     than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
     thing).  That is, something like
     eb_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
     works--it never adds len to memaddr and gets 0.  */
  /* However, something like
     eb_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
     doesn't need to work.  Detect it and give up if there's an attempt
     to do that.  */
  if (((memaddr - 1) + len) < memaddr)
    {
      errno = EIO;
      return 0;
    }

  startaddr = memaddr;
  count = 0;
  while (count < len)
    {
      len_this_pass = 16;
      if ((startaddr % 16) != 0)
	len_this_pass -= startaddr % 16;
      if (len_this_pass > (len - count))
	len_this_pass = (len - count);

      fprintf (eb_stream, "db %x,%x\n", startaddr,
	       (startaddr - 1) + len_this_pass);
      expect ("\n");

      /* Look for 8 hex digits.  */
      i = 0;
      while (1)
	{
	  if (isxdigit (readchar ()))
	    ++i;
	  else
	    {
	      expect_prompt ();
	      error ("Hex digit expected from remote system.");
	    }
	  if (i >= 8)
	    break;
	}

      expect ("  ");

      for (i = 0; i < len_this_pass; i++)
	get_hex_byte (&myaddr[count++]);

      expect_prompt ();

      startaddr += len_this_pass;
    }
  return len;
}

static void
eb_kill (args, from_tty)
     char *args;
     int from_tty;
{
  return;			/* Ignore attempts to kill target system */
}

/* Clean up when a program exits.

   The program actually lives on in the remote processor's RAM, and may be
   run again without a download.  Don't leave it full of breakpoint
   instructions.  */

void
eb_mourn_inferior ()
{
  remove_breakpoints ();
  unpush_target (&eb_ops);
  generic_mourn_inferior ();	/* Do all the proper things now */
}
/* Define the target subroutine names */

struct target_ops eb_ops;

static void
init_eb_ops (void)
{
  eb_ops.to_shortname = "amd-eb";
  eb_ops.to_longname = "Remote serial AMD EBMON target";
  eb_ops.to_doc = "Use a remote computer running EBMON connected by a serial line.\n\
Arguments are the name of the device for the serial line,\n\
the speed to connect at in bits per second, and the filename of the\n\
executable as it exists on the remote computer.  For example,\n\
target amd-eb /dev/ttya 9600 demo",
    eb_ops.to_open = eb_open;
  eb_ops.to_close = eb_close;
  eb_ops.to_attach = 0;
  eb_ops.to_post_attach = NULL;
  eb_ops.to_require_attach = NULL;
  eb_ops.to_detach = eb_detach;
  eb_ops.to_require_detach = NULL;
  eb_ops.to_resume = eb_resume;
  eb_ops.to_wait = eb_wait;
  eb_ops.to_post_wait = NULL;
  eb_ops.to_fetch_registers = eb_fetch_register;
  eb_ops.to_store_registers = eb_store_register;
  eb_ops.to_prepare_to_store = eb_prepare_to_store;
  eb_ops.to_xfer_memory = eb_xfer_inferior_memory;
  eb_ops.to_files_info = eb_files_info;
  eb_ops.to_insert_breakpoint = 0;
  eb_ops.to_remove_breakpoint = 0;	/* Breakpoints */
  eb_ops.to_terminal_init = 0;
  eb_ops.to_terminal_inferior = 0;
  eb_ops.to_terminal_ours_for_output = 0;
  eb_ops.to_terminal_ours = 0;
  eb_ops.to_terminal_info = 0;	/* Terminal handling */
  eb_ops.to_kill = eb_kill;
  eb_ops.to_load = generic_load;	/* load */
  eb_ops.to_lookup_symbol = 0;	/* lookup_symbol */
  eb_ops.to_create_inferior = eb_create_inferior;
  eb_ops.to_post_startup_inferior = NULL;
  eb_ops.to_acknowledge_created_inferior = NULL;
  eb_ops.to_clone_and_follow_inferior = NULL;
  eb_ops.to_post_follow_inferior_by_clone = NULL;
  eb_ops.to_insert_fork_catchpoint = NULL;
  eb_ops.to_remove_fork_catchpoint = NULL;
  eb_ops.to_insert_vfork_catchpoint = NULL;
  eb_ops.to_remove_vfork_catchpoint = NULL;
  eb_ops.to_has_forked = NULL;
  eb_ops.to_has_vforked = NULL;
  eb_ops.to_can_follow_vfork_prior_to_exec = NULL;
  eb_ops.to_post_follow_vfork = NULL;
  eb_ops.to_insert_exec_catchpoint = NULL;
  eb_ops.to_remove_exec_catchpoint = NULL;
  eb_ops.to_has_execd = NULL;
  eb_ops.to_reported_exec_events_per_exec_call = NULL;
  eb_ops.to_has_exited = NULL;
  eb_ops.to_mourn_inferior = eb_mourn_inferior;
  eb_ops.to_can_run = 0;	/* can_run */
  eb_ops.to_notice_signals = 0;	/* notice_signals */
  eb_ops.to_thread_alive = 0;	/* thread-alive */
  eb_ops.to_stop = 0;		/* to_stop */
  eb_ops.to_pid_to_exec_file = NULL;
  eb_ops.to_core_file_to_sym_file = NULL;
  eb_ops.to_stratum = process_stratum;
  eb_ops.DONT_USE = 0;		/* next */
  eb_ops.to_has_all_memory = 1;
  eb_ops.to_has_memory = 1;
  eb_ops.to_has_stack = 1;
  eb_ops.to_has_registers = 1;
  eb_ops.to_has_execution = 1;	/* all mem, mem, stack, regs, exec */
  eb_ops.to_sections = 0;	/* sections */
  eb_ops.to_sections_end = 0;	/* sections end */
  eb_ops.to_magic = OPS_MAGIC;	/* Always the last thing */
};

void
_initialize_remote_eb ()
{
  init_eb_ops ();
  add_target (&eb_ops);
}
