/* Remote debugging interface for Densan DVE-R3900 ROM monitor for
   GDB, the GNU debugger.
   Copyright 1997, 1998, 2000, 2001 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., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */

#include "defs.h"
#include "gdbcore.h"
#include "target.h"
#include "monitor.h"
#include "serial.h"
#include "inferior.h"
#include "command.h"
#include "gdb_string.h"
#include <time.h>
#include "regcache.h"

/* Type of function passed to bfd_map_over_sections.  */

typedef void (*section_map_func) (bfd * abfd, asection * sect, void *obj);

/* Packet escape character used by Densan monitor.  */

#define PESC 0xdc

/* Maximum packet size.  This is actually smaller than necessary
   just to be safe.  */

#define MAXPSIZE 1024

/* External functions.  */

extern void report_transfer_performance (unsigned long, time_t, time_t);

/* Certain registers are "bitmapped", in that the monitor can only display
   them or let the user modify them as a series of named bitfields.
   This structure describes a field in a bitmapped register.  */

struct bit_field
  {
    char *prefix;		/* string appearing before the value */
    char *suffix;		/* string appearing after the value */
    char *user_name;		/* name used by human when entering field value */
    int length;			/* number of bits in the field */
    int start;			/* starting (least significant) bit number of field */
  };

/* Local functions for register manipulation.  */

static void r3900_supply_register (char *regname, int regnamelen,
				   char *val, int vallen);
static void fetch_bad_vaddr (void);
static unsigned long fetch_fields (struct bit_field *bf);
static void fetch_bitmapped_register (int regno, struct bit_field *bf);
static void r3900_fetch_registers (int regno);
static void store_bitmapped_register (int regno, struct bit_field *bf);
static void r3900_store_registers (int regno);

/* Local functions for fast binary loading.  */

static void write_long (char *buf, long n);
static void write_long_le (char *buf, long n);
static int debug_readchar (int hex);
static void debug_write (unsigned char *buf, int buflen);
static void ignore_packet (void);
static void send_packet (char type, unsigned char *buf, int buflen, int seq);
static void process_read_request (unsigned char *buf, int buflen);
static void count_section (bfd * abfd, asection * s,
			   unsigned int *section_count);
static void load_section (bfd * abfd, asection * s, unsigned int *data_count);
static void r3900_load (char *filename, int from_tty);

/* Miscellaneous local functions.  */

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


/* Pointers to static functions in monitor.c for fetching and storing
   registers.  We can't use these function in certain cases where the Densan
   monitor acts perversely: for registers that it displays in bit-map
   format, and those that can't be modified at all.  In those cases
   we have to use our own functions to fetch and store their values.  */

static void (*orig_monitor_fetch_registers) (int regno);
static void (*orig_monitor_store_registers) (int regno);

/* Pointer to static function in monitor. for loading programs.
   We use this function for loading S-records via the serial link.  */

static void (*orig_monitor_load) (char *file, int from_tty);

/* This flag is set if a fast ethernet download should be used.  */

static int ethernet = 0;

/* This array of registers needs to match the indexes used by GDB. The
   whole reason this exists is because the various ROM monitors use
   different names than GDB does, and don't support all the registers
   either.  */

static char *r3900_regnames[] =
{
  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
  "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
  "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",

  "S",				/* PS_REGNUM */
  "l",				/* LO_REGNUM */
  "h",				/* HI_REGNUM */
  "B",				/* BADVADDR_REGNUM */
  "Pcause",			/* CAUSE_REGNUM */
  "p"				/* PC_REGNUM */
};


/* Table of register names produced by monitor's register dump command.  */

static struct reg_entry
  {
    char *name;
    int regno;
  }
reg_table[] =
{
  {
    "r0_zero", 0
  }
  ,
  {
    "r1_at", 1
  }
  ,
  {
    "r2_v0", 2
  }
  ,
  {
    "r3_v1", 3
  }
  ,
  {
    "r4_a0", 4
  }
  ,
  {
    "r5_a1", 5
  }
  ,
  {
    "r6_a2", 6
  }
  ,
  {
    "r7_a3", 7
  }
  ,
  {
    "r8_t0", 8
  }
  ,
  {
    "r9_t1", 9
  }
  ,
  {
    "r10_t2", 10
  }
  ,
  {
    "r11_t3", 11
  }
  ,
  {
    "r12_t4", 12
  }
  ,
  {
    "r13_t5", 13
  }
  ,
  {
    "r14_t6", 14
  }
  ,
  {
    "r15_t7", 15
  }
  ,
  {
    "r16_s0", 16
  }
  ,
  {
    "r17_s1", 17
  }
  ,
  {
    "r18_s2", 18
  }
  ,
  {
    "r19_s3", 19
  }
  ,
  {
    "r20_s4", 20
  }
  ,
  {
    "r21_s5", 21
  }
  ,
  {
    "r22_s6", 22
  }
  ,
  {
    "r23_s7", 23
  }
  ,
  {
    "r24_t8", 24
  }
  ,
  {
    "r25_t9", 25
  }
  ,
  {
    "r26_k0", 26
  }
  ,
  {
    "r27_k1", 27
  }
  ,
  {
    "r28_gp", 28
  }
  ,
  {
    "r29_sp", 29
  }
  ,
  {
    "r30_fp", 30
  }
  ,
  {
    "r31_ra", 31
  }
  ,
  {
    "HI", HI_REGNUM
  }
  ,
  {
    "LO", LO_REGNUM
  }
  ,
  {
    "PC", PC_REGNUM
  }
  ,
  {
    "BadV", BADVADDR_REGNUM
  }
  ,
  {
    NULL, 0
  }
};


/* The monitor displays the cache register along with the status register,
   as if they were a single register.  So when we want to fetch the
   status register, parse but otherwise ignore the fields of the
   cache register that the monitor displays.  Register fields that should
   be ignored have a length of zero in the tables below.  */

static struct bit_field status_fields[] =
{
  /* Status register portion */
  {"SR[<CU=", " ", "cu", 4, 28},
  {"RE=", " ", "re", 1, 25},
  {"BEV=", " ", "bev", 1, 22},
  {"TS=", " ", "ts", 1, 21},
  {"Nmi=", " ", "nmi", 1, 20},
  {"INT=", " ", "int", 6, 10},
  {"SW=", ">]", "sw", 2, 8},
  {"[<KUO=", " ", "kuo", 1, 5},
  {"IEO=", " ", "ieo", 1, 4},
  {"KUP=", " ", "kup", 1, 3},
  {"IEP=", " ", "iep", 1, 2},
  {"KUC=", " ", "kuc", 1, 1},
  {"IEC=", ">]", "iec", 1, 0},

  /* Cache register portion (dummy for parsing only) */
  {"CR[<IalO=", " ", "ialo", 0, 13},
  {"DalO=", " ", "dalo", 0, 12},
  {"IalP=", " ", "ialp", 0, 11},
  {"DalP=", " ", "dalp", 0, 10},
  {"IalC=", " ", "ialc", 0, 9},
  {"DalC=", ">] ", "dalc", 0, 8},

  {NULL, NULL, 0, 0}		/* end of table marker */
};


#if 0				/* FIXME: Enable when we add support for modifying cache register.  */
static struct bit_field cache_fields[] =
{
  /* Status register portion (dummy for parsing only) */
  {"SR[<CU=", " ", "cu", 0, 28},
  {"RE=", " ", "re", 0, 25},
  {"BEV=", " ", "bev", 0, 22},
  {"TS=", " ", "ts", 0, 21},
  {"Nmi=", " ", "nmi", 0, 20},
  {"INT=", " ", "int", 0, 10},
  {"SW=", ">]", "sw", 0, 8},
  {"[<KUO=", " ", "kuo", 0, 5},
  {"IEO=", " ", "ieo", 0, 4},
  {"KUP=", " ", "kup", 0, 3},
  {"IEP=", " ", "iep", 0, 2},
  {"KUC=", " ", "kuc", 0, 1},
  {"IEC=", ">]", "iec", 0, 0},

  /* Cache register portion  */
  {"CR[<IalO=", " ", "ialo", 1, 13},
  {"DalO=", " ", "dalo", 1, 12},
  {"IalP=", " ", "ialp", 1, 11},
  {"DalP=", " ", "dalp", 1, 10},
  {"IalC=", " ", "ialc", 1, 9},
  {"DalC=", ">] ", "dalc", 1, 8},

  {NULL, NULL, NULL, 0, 0}	/* end of table marker */
};
#endif


static struct bit_field cause_fields[] =
{
  {"<BD=", " ", "bd", 1, 31},
  {"CE=", " ", "ce", 2, 28},
  {"IP=", " ", "ip", 6, 10},
  {"SW=", " ", "sw", 2, 8},
  {"EC=", ">]", "ec", 5, 2},

  {NULL, NULL, NULL, 0, 0}	/* end of table marker */
};


/* The monitor prints register values in the form

   regname = xxxx xxxx

   We look up the register name in a table, and remove the embedded space in
   the hex value before passing it to monitor_supply_register.  */

static void
r3900_supply_register (char *regname, int regnamelen, char *val, int vallen)
{
  int regno = -1;
  int i;
  char valbuf[10];
  char *p;

  /* Perform some sanity checks on the register name and value.  */
  if (regnamelen < 2 || regnamelen > 7 || vallen != 9)
    return;

  /* Look up the register name.  */
  for (i = 0; reg_table[i].name != NULL; i++)
    {
      int rlen = strlen (reg_table[i].name);
      if (rlen == regnamelen && strncmp (regname, reg_table[i].name, rlen) == 0)
	{
	  regno = reg_table[i].regno;
	  break;
	}
    }
  if (regno == -1)
    return;

  /* Copy the hex value to a buffer and eliminate the embedded space. */
  for (i = 0, p = valbuf; i < vallen; i++)
    if (val[i] != ' ')
      *p++ = val[i];
  *p = '\0';

  monitor_supply_register (regno, valbuf);
}


/* Fetch the BadVaddr register.  Unlike the other registers, this
   one can't be modified, and the monitor won't even prompt to let
   you modify it.  */

static void
fetch_bad_vaddr (void)
{
  char buf[20];

  monitor_printf ("xB\r");
  monitor_expect ("BadV=", NULL, 0);
  monitor_expect_prompt (buf, sizeof (buf));
  monitor_supply_register (BADVADDR_REGNUM, buf);
}


/* Read a series of bit fields from the monitor, and return their
   combined binary value.  */

static unsigned long
fetch_fields (struct bit_field *bf)
{
  char buf[20];
  unsigned long val = 0;
  unsigned long bits;

  for (; bf->prefix != NULL; bf++)
    {
      monitor_expect (bf->prefix, NULL, 0);	/* get prefix */
      monitor_expect (bf->suffix, buf, sizeof (buf));	/* hex value, suffix */
      if (bf->length != 0)
	{
	  bits = strtoul (buf, NULL, 16);	/* get field value */
	  bits &= ((1 << bf->length) - 1);	/* mask out useless bits */
	  val |= bits << bf->start;	/* insert into register */
	}

    }

  return val;
}


static void
fetch_bitmapped_register (int regno, struct bit_field *bf)
{
  unsigned long val;
  unsigned char *regbuf = alloca (max_register_size (current_gdbarch));
  char *regname = NULL;

  if (regno >= sizeof (r3900_regnames) / sizeof (r3900_regnames[0]))
    internal_error (__FILE__, __LINE__,
                    "fetch_bitmapped_register: regno out of bounds");
  else
    regname = r3900_regnames[regno];

  monitor_printf ("x%s\r", regname);
  val = fetch_fields (bf);
  monitor_printf (".\r");
  monitor_expect_prompt (NULL, 0);

  /* supply register stores in target byte order, so swap here */

  store_unsigned_integer (regbuf, REGISTER_RAW_SIZE (regno), val);
  supply_register (regno, regbuf);

}


/* Fetch all registers (if regno is -1), or one register from the
   monitor.  For most registers, we can use the generic monitor_
   monitor_fetch_registers function.  But others are displayed in
   a very unusual fashion by the monitor, and must be handled specially.  */

static void
r3900_fetch_registers (int regno)
{
  switch (regno)
    {
    case BADVADDR_REGNUM:
      fetch_bad_vaddr ();
      return;
    case PS_REGNUM:
      fetch_bitmapped_register (PS_REGNUM, status_fields);
      return;
    case CAUSE_REGNUM:
      fetch_bitmapped_register (CAUSE_REGNUM, cause_fields);
      return;
    default:
      orig_monitor_fetch_registers (regno);
    }
}


/* Write the new value of the bitmapped register to the monitor.  */

static void
store_bitmapped_register (int regno, struct bit_field *bf)
{
  unsigned long oldval, newval;
  char *regname = NULL;

  if (regno >= sizeof (r3900_regnames) / sizeof (r3900_regnames[0]))
    internal_error (__FILE__, __LINE__,
                    "fetch_bitmapped_register: regno out of bounds");
  else
    regname = r3900_regnames[regno];

  /* Fetch the current value of the register.  */
  monitor_printf ("x%s\r", regname);
  oldval = fetch_fields (bf);
  newval = read_register (regno);

  /* To save time, write just the fields that have changed.  */
  for (; bf->prefix != NULL; bf++)
    {
      if (bf->length != 0)
	{
	  unsigned long oldbits, newbits, mask;

	  mask = (1 << bf->length) - 1;
	  oldbits = (oldval >> bf->start) & mask;
	  newbits = (newval >> bf->start) & mask;
	  if (oldbits != newbits)
	    monitor_printf ("%s %lx ", bf->user_name, newbits);
	}
    }

  monitor_printf (".\r");
  monitor_expect_prompt (NULL, 0);
}


static void
r3900_store_registers (int regno)
{
  switch (regno)
    {
    case PS_REGNUM:
      store_bitmapped_register (PS_REGNUM, status_fields);
      return;
    case CAUSE_REGNUM:
      store_bitmapped_register (CAUSE_REGNUM, cause_fields);
      return;
    default:
      orig_monitor_store_registers (regno);
    }
}


/* Write a 4-byte integer to the buffer in big-endian order.  */

static void
write_long (char *buf, long n)
{
  buf[0] = (n >> 24) & 0xff;
  buf[1] = (n >> 16) & 0xff;
  buf[2] = (n >> 8) & 0xff;
  buf[3] = n & 0xff;
}


/* Write a 4-byte integer to the buffer in little-endian order.  */

static void
write_long_le (char *buf, long n)
{
  buf[0] = n & 0xff;
  buf[1] = (n >> 8) & 0xff;
  buf[2] = (n >> 16) & 0xff;
  buf[3] = (n >> 24) & 0xff;
}


/* Read a character from the monitor.  If remote debugging is on,
   print the received character.  If HEX is non-zero, print the
   character in hexadecimal; otherwise, print it in ASCII.  */

static int
debug_readchar (int hex)
{
  char buf[10];
  int c = monitor_readchar ();

  if (remote_debug > 0)
    {
      if (hex)
	sprintf (buf, "[%02x]", c & 0xff);
      else if (c == '\0')
	strcpy (buf, "\\0");
      else
	{
	  buf[0] = c;
	  buf[1] = '\0';
	}
      puts_debug ("Read -->", buf, "<--");
    }
  return c;
}


/* Send a buffer of characters to the monitor.  If remote debugging is on,
   print the sent buffer in hex.  */

static void
debug_write (unsigned char *buf, int buflen)
{
  char s[10];

  monitor_write (buf, buflen);

  if (remote_debug > 0)
    {
      while (buflen-- > 0)
	{
	  sprintf (s, "[%02x]", *buf & 0xff);
	  puts_debug ("Sent -->", s, "<--");
	  buf++;
	}
    }
}


/* Ignore a packet sent to us by the monitor.  It send packets
   when its console is in "communications interface" mode.   A packet
   is of this form:

   start of packet flag (one byte: 0xdc)
   packet type (one byte)
   length (low byte)
   length (high byte)
   data (length bytes)

   The last two bytes of the data field are a checksum, but we don't
   bother to verify it.
 */

static void
ignore_packet (void)
{
  int c;
  int len;

  /* Ignore lots of trash (messages about section addresses, for example)
     until we see the start of a packet.  */
  for (len = 0; len < 256; len++)
    {
      c = debug_readchar (0);
      if (c == PESC)
	break;
    }
  if (len == 8)
    error ("Packet header byte not found; %02x seen instead.", c);

  /* Read the packet type and length.  */
  c = debug_readchar (1);	/* type */

  c = debug_readchar (1);	/* low byte of length */
  len = c & 0xff;

  c = debug_readchar (1);	/* high byte of length */
  len += (c & 0xff) << 8;

  /* Ignore the rest of the packet.  */
  while (len-- > 0)
    c = debug_readchar (1);
}


/* Encapsulate some data into a packet and send it to the monitor.

   The 'p' packet is a special case.  This is a packet we send
   in response to a read ('r') packet from the monitor.  This function
   appends a one-byte sequence number to the data field of such a packet.
 */

static void
send_packet (char type, unsigned char *buf, int buflen, int seq)
{
  unsigned char hdr[4];
  int len = buflen;
  int sum, i;

  /* If this is a 'p' packet, add one byte for a sequence number.  */
  if (type == 'p')
    len++;

  /* If the buffer has a non-zero length, add two bytes for a checksum.  */
  if (len > 0)
    len += 2;

  /* Write the packet header.  */
  hdr[0] = PESC;
  hdr[1] = type;
  hdr[2] = len & 0xff;
  hdr[3] = (len >> 8) & 0xff;
  debug_write (hdr, sizeof (hdr));

  if (len)
    {
      /* Write the packet data.  */
      debug_write (buf, buflen);

      /* Write the sequence number if this is a 'p' packet.  */
      if (type == 'p')
	{
	  hdr[0] = seq;
	  debug_write (hdr, 1);
	}

      /* Write the checksum.  */
      sum = 0;
      for (i = 0; i < buflen; i++)
	{
	  int tmp = (buf[i] & 0xff);
	  if (i & 1)
	    sum += tmp;
	  else
	    sum += tmp << 8;
	}
      if (type == 'p')
	{
	  if (buflen & 1)
	    sum += (seq & 0xff);
	  else
	    sum += (seq & 0xff) << 8;
	}
      sum = (sum & 0xffff) + ((sum >> 16) & 0xffff);
      sum += (sum >> 16) & 1;
      sum = ~sum;

      hdr[0] = (sum >> 8) & 0xff;
      hdr[1] = sum & 0xff;
      debug_write (hdr, 2);
    }
}


/* Respond to an expected read request from the monitor by sending
   data in chunks.  Handle all acknowledgements and handshaking packets.

   The monitor expects a response consisting of a one or more 'p' packets,
   each followed by a portion of the data requested.  The 'p' packet
   contains only a four-byte integer, the value of which is the number
   of bytes of data we are about to send.  Following the 'p' packet,
   the monitor expects the data bytes themselves in raw, unpacketized,
   form, without even a checksum.
 */

static void
process_read_request (unsigned char *buf, int buflen)
{
  unsigned char len[4];
  int i, chunk;
  unsigned char seq;

  /* Discard the read request.  FIXME: we have to hope it's for
     the exact number of bytes we want to send; should check for this.  */
  ignore_packet ();

  for (i = chunk = 0, seq = 0; i < buflen; i += chunk, seq++)
    {
      /* Don't send more than MAXPSIZE bytes at a time.  */
      chunk = buflen - i;
      if (chunk > MAXPSIZE)
	chunk = MAXPSIZE;

      /* Write a packet containing the number of bytes we are sending.  */
      write_long_le (len, chunk);
      send_packet ('p', len, sizeof (len), seq);

      /* Write the data in raw form following the packet.  */
      debug_write (&buf[i], chunk);

      /* Discard the ACK packet.  */
      ignore_packet ();
    }

  /* Send an "end of data" packet.  */
  send_packet ('e', "", 0, 0);
}


/* Count loadable sections (helper function for r3900_load).  */

static void
count_section (bfd *abfd, asection *s, unsigned int *section_count)
{
  if (s->flags & SEC_LOAD && bfd_section_size (abfd, s) != 0)
    (*section_count)++;
}


/* Load a single BFD section (helper function for r3900_load).

   WARNING: this code is filled with assumptions about how
   the Densan monitor loads programs.  The monitor issues
   packets containing read requests, but rather than respond
   to them in an general way, we expect them to following
   a certain pattern.

   For example, we know that the monitor will start loading by
   issuing an 8-byte read request for the binary file header.
   We know this is coming and ignore the actual contents
   of the read request packet.
 */

static void
load_section (bfd *abfd, asection *s, unsigned int *data_count)
{
  if (s->flags & SEC_LOAD)
    {
      bfd_size_type section_size = bfd_section_size (abfd, s);
      bfd_vma section_base = bfd_section_lma (abfd, s);
      unsigned char *buffer;
      unsigned char header[8];

      /* Don't output zero-length sections.  */
      if (section_size == 0)
	return;
      if (data_count)
	*data_count += section_size;

      /* Print some fluff about the section being loaded.  */
      printf_filtered ("Loading section %s, size 0x%lx lma ",
		       bfd_section_name (abfd, s), (long) section_size);
      print_address_numeric (section_base, 1, gdb_stdout);
      printf_filtered ("\n");
      gdb_flush (gdb_stdout);

      /* Write the section header (location and size).  */
      write_long (&header[0], (long) section_base);
      write_long (&header[4], (long) section_size);
      process_read_request (header, sizeof (header));

      /* Read the section contents into a buffer, write it out,
         then free the buffer.  */
      buffer = (unsigned char *) xmalloc (section_size);
      bfd_get_section_contents (abfd, s, buffer, 0, section_size);
      process_read_request (buffer, section_size);
      xfree (buffer);
    }
}


/* When the ethernet is used as the console port on the Densan board,
   we can use the "Rm" command to do a fast binary load.  The format
   of the download data is:

   number of sections (4 bytes)
   starting address (4 bytes)
   repeat for each section:
   location address (4 bytes)
   section size (4 bytes)
   binary data

   The 4-byte fields are all in big-endian order.

   Using this command is tricky because we have to put the monitor
   into a special funky "communications interface" mode, in which
   it sends and receives packets of data along with the normal prompt.
 */

static void
r3900_load (char *filename, int from_tty)
{
  bfd *abfd;
  unsigned int data_count = 0;
  time_t start_time, end_time;	/* for timing of download */
  int section_count = 0;
  unsigned char buffer[8];

  /* If we are not using the ethernet, use the normal monitor load,
     which sends S-records over the serial link.  */
  if (!ethernet)
    {
      orig_monitor_load (filename, from_tty);
      return;
    }

  /* Open the file.  */
  if (filename == NULL || filename[0] == 0)
    filename = get_exec_file (1);
  abfd = bfd_openr (filename, 0);
  if (!abfd)
    error ("Unable to open file %s\n", filename);
  if (bfd_check_format (abfd, bfd_object) == 0)
    error ("File is not an object file\n");

  /* Output the "vconsi" command to get the monitor in the communication
     state where it will accept a load command.  This will cause
     the monitor to emit a packet before each prompt, so ignore the packet.  */
  monitor_printf ("vconsi\r");
  ignore_packet ();
  monitor_expect_prompt (NULL, 0);

  /* Output the "Rm" (load) command and respond to the subsequent "open"
     packet by sending an ACK packet.  */
  monitor_printf ("Rm\r");
  ignore_packet ();
  send_packet ('a', "", 0, 0);

  /* Output the fast load header (number of sections and starting address).  */
  bfd_map_over_sections ((bfd *) abfd, (section_map_func) count_section,
			 &section_count);
  write_long (&buffer[0], (long) section_count);
  if (exec_bfd)
    write_long (&buffer[4], (long) bfd_get_start_address (exec_bfd));
  else
    write_long (&buffer[4], 0);
  process_read_request (buffer, sizeof (buffer));

  /* Output the section data.  */
  start_time = time (NULL);
  bfd_map_over_sections (abfd, (section_map_func) load_section, &data_count);
  end_time = time (NULL);

  /* Acknowledge the close packet and put the monitor back into
     "normal" mode so it won't send packets any more.  */
  ignore_packet ();
  send_packet ('a', "", 0, 0);
  monitor_expect_prompt (NULL, 0);
  monitor_printf ("vconsx\r");
  monitor_expect_prompt (NULL, 0);

  /* Print start address and download performance information.  */
  printf_filtered ("Start address 0x%lx\n", (long) bfd_get_start_address (abfd));
  report_transfer_performance (data_count, start_time, end_time);

  /* Finally, make the PC point at the start address */
  if (exec_bfd)
    write_pc (bfd_get_start_address (exec_bfd));

  inferior_ptid = null_ptid;		/* No process now */

  /* This is necessary because many things were based on the PC at the
     time that we attached to the monitor, which is no longer valid
     now that we have loaded new code (and just changed the PC).
     Another way to do this might be to call normal_stop, except that
     the stack may not be valid, and things would get horribly
     confused... */
  clear_symtab_users ();
}


/* Commands to send to the monitor when first connecting:
   * The bare carriage return forces a prompt from the monitor
   (monitor doesn't prompt immediately after a reset).
   * The "vconsx" switches the monitor back to interactive mode
   in case an aborted download had left it in packet mode.
   * The "Xtr" command causes subsequent "t" (trace) commands to display
   the general registers only.
   * The "Xxr" command does the same thing for the "x" (examine
   registers) command.
   * The "bx" command clears all breakpoints.
 */

static char *r3900_inits[] =
{"\r", "vconsx\r", "Xtr\r", "Xxr\r", "bx\r", NULL};
static char *dummy_inits[] =
{NULL};

static struct target_ops r3900_ops;
static struct monitor_ops r3900_cmds;

static void
r3900_open (char *args, int from_tty)
{
  char buf[64];
  int i;

  monitor_open (args, &r3900_cmds, from_tty);

  /* We have to handle sending the init strings ourselves, because
     the first two strings we send (carriage returns) may not be echoed
     by the monitor, but the rest will be.  */
  monitor_printf_noecho ("\r\r");
  for (i = 0; r3900_inits[i] != NULL; i++)
    {
      monitor_printf (r3900_inits[i]);
      monitor_expect_prompt (NULL, 0);
    }

  /* Attempt to determine whether the console device is ethernet or serial.
     This will tell us which kind of load to use (S-records over a serial
     link, or the Densan fast binary multi-section format over the net).  */

  ethernet = 0;
  monitor_printf ("v\r");
  if (monitor_expect ("console device :", NULL, 0) != -1)
    if (monitor_expect ("\n", buf, sizeof (buf)) != -1)
      if (strstr (buf, "ethernet") != NULL)
	ethernet = 1;
  monitor_expect_prompt (NULL, 0);
}

void
_initialize_r3900_rom (void)
{
  r3900_cmds.flags = MO_NO_ECHO_ON_OPEN |
    MO_ADDR_BITS_REMOVE |
    MO_CLR_BREAK_USES_ADDR |
    MO_GETMEM_READ_SINGLE |
    MO_PRINT_PROGRAM_OUTPUT;

  r3900_cmds.init = dummy_inits;
  r3900_cmds.cont = "g\r";
  r3900_cmds.step = "t\r";
  r3900_cmds.set_break = "b %A\r";	/* COREADDR */
  r3900_cmds.clr_break = "b %A,0\r";	/* COREADDR */
  r3900_cmds.fill = "fx %A s %x %x\r";	/* COREADDR, len, val */

  r3900_cmds.setmem.cmdb = "sx %A %x\r";	/* COREADDR, val */
  r3900_cmds.setmem.cmdw = "sh %A %x\r";	/* COREADDR, val */
  r3900_cmds.setmem.cmdl = "sw %A %x\r";	/* COREADDR, val */

  r3900_cmds.getmem.cmdb = "sx %A\r";	/* COREADDR */
  r3900_cmds.getmem.cmdw = "sh %A\r";	/* COREADDR */
  r3900_cmds.getmem.cmdl = "sw %A\r";	/* COREADDR */
  r3900_cmds.getmem.resp_delim = " : ";
  r3900_cmds.getmem.term = " ";
  r3900_cmds.getmem.term_cmd = ".\r";

  r3900_cmds.setreg.cmd = "x%s %x\r";	/* regname, val */

  r3900_cmds.getreg.cmd = "x%s\r";	/* regname */
  r3900_cmds.getreg.resp_delim = "=";
  r3900_cmds.getreg.term = " ";
  r3900_cmds.getreg.term_cmd = ".\r";

  r3900_cmds.dump_registers = "x\r";
  r3900_cmds.register_pattern =
    "\\([a-zA-Z0-9_]+\\) *=\\([0-9a-f]+ [0-9a-f]+\\b\\)";
  r3900_cmds.supply_register = r3900_supply_register;
  /* S-record download, via "keyboard port".  */
  r3900_cmds.load = "r0\r";
  r3900_cmds.prompt = "#";
  r3900_cmds.line_term = "\r";
  r3900_cmds.target = &r3900_ops;
  r3900_cmds.stopbits = SERIAL_1_STOPBITS;
  r3900_cmds.regnames = r3900_regnames;
  r3900_cmds.magic = MONITOR_OPS_MAGIC;

  init_monitor_ops (&r3900_ops);

  r3900_ops.to_shortname = "r3900";
  r3900_ops.to_longname = "R3900 monitor";
  r3900_ops.to_doc = "Debug using the DVE R3900 monitor.\n\
Specify the serial device it is connected to (e.g. /dev/ttya).";
  r3900_ops.to_open = r3900_open;

  /* Override the functions to fetch and store registers.  But save the
     addresses of the default functions, because we will use those functions
     for "normal" registers.  */

  orig_monitor_fetch_registers = r3900_ops.to_fetch_registers;
  orig_monitor_store_registers = r3900_ops.to_store_registers;
  r3900_ops.to_fetch_registers = r3900_fetch_registers;
  r3900_ops.to_store_registers = r3900_store_registers;

  /* Override the load function, but save the address of the default
     function to use when loading S-records over a serial link.  */
  orig_monitor_load = r3900_ops.to_load;
  r3900_ops.to_load = r3900_load;

  add_target (&r3900_ops);
}
