/****************************************************************************

		THIS SOFTWARE IS NOT COPYRIGHTED

   HP offers the following for use in the public domain.  HP makes no
   warranty with regard to the software or it's performance and the
   user accepts the software "AS IS" with all faults.

   HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD
   TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES
   OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

****************************************************************************/

/****************************************************************************
 *  Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $
 *
 *  Module name: remcom.c $
 *  Revision: 1.34 $
 *  Date: 91/03/09 12:29:49 $
 *  Contributor:     Lake Stevens Instrument Division$
 *
 *  Description:     low level support for gdb debugger. $
 *
 *  Considerations:  only works on target hardware $
 *
 *  Written by:      Glenn Engel $
 *  ModuleState:     Experimental $
 *
 *  NOTES:           See Below $
 *
 *  Modified for M32R by Michael Snyder, Cygnus Support.
 *
 *  To enable debugger support, two things need to happen.  One, a
 *  call to set_debug_traps() is necessary in order to allow any breakpoints
 *  or error conditions to be properly intercepted and reported to gdb.
 *  Two, a breakpoint needs to be generated to begin communication.  This
 *  is most easily accomplished by a call to breakpoint().  Breakpoint()
 *  simulates a breakpoint by executing a trap #1.
 *
 *  The external function exceptionHandler() is
 *  used to attach a specific handler to a specific M32R vector number.
 *  It should use the same privilege level it runs at.  It should
 *  install it as an interrupt gate so that interrupts are masked
 *  while the handler runs.
 *
 *  Because gdb will sometimes write to the stack area to execute function
 *  calls, this program cannot rely on using the supervisor stack so it
 *  uses its own stack area reserved in the int array remcomStack.
 *
 *************
 *
 *    The following gdb commands are supported:
 *
 * command          function                               Return value
 *
 *    g             return the value of the CPU registers  hex data or ENN
 *    G             set the value of the CPU registers     OK or ENN
 *
 *    mAA..AA,LLLL  Read LLLL bytes at address AA..AA      hex data or ENN
 *    MAA..AA,LLLL: Write LLLL bytes at address AA.AA      OK or ENN
 *    XAA..AA,LLLL: Write LLLL binary bytes at address     OK or ENN
 *                  AA..AA
 *
 *    c             Resume at current address              SNN   ( signal NN)
 *    cAA..AA       Continue at address AA..AA             SNN
 *
 *    s             Step one instruction                   SNN
 *    sAA..AA       Step one instruction from AA..AA       SNN
 *
 *    k             kill
 *
 *    ?             What was the last sigval ?             SNN   (signal NN)
 *
 * All commands and responses are sent with a packet which includes a
 * checksum.  A packet consists of
 *
 * $<packet info>#<checksum>.
 *
 * where
 * <packet info> :: <characters representing the command or response>
 * <checksum>    :: <two hex digits computed as modulo 256 sum of <packetinfo>>
 *
 * When a packet is received, it is first acknowledged with either '+' or '-'.
 * '+' indicates a successful transfer.  '-' indicates a failed transfer.
 *
 * Example:
 *
 * Host:                  Reply:
 * $m0,10#2a               +$00010203040506070809101112131415#42
 *
 ****************************************************************************/


/************************************************************************
 *
 * external low-level support routines
 */
extern void putDebugChar ();	/* write a single character      */
extern int getDebugChar ();	/* read and return a single char */
extern void exceptionHandler ();	/* assign an exception handler   */

/*****************************************************************************
 * BUFMAX defines the maximum number of characters in inbound/outbound buffers
 * at least NUMREGBYTES*2 are needed for register packets 
 */
#define BUFMAX 400

static char initialized;	/* boolean flag. != 0 means we've been initialized */

int remote_debug;
/*  debug >  0 prints ill-formed commands in valid packets & checksum errors */

static const unsigned char hexchars[] = "0123456789abcdef";

#define NUMREGS 24

/* Number of bytes of registers.  */
#define NUMREGBYTES (NUMREGS * 4)
enum regnames
{ R0, R1, R2, R3, R4, R5, R6, R7,
  R8, R9, R10, R11, R12, R13, R14, R15,
  PSW, CBR, SPI, SPU, BPC, PC, ACCL, ACCH
};

enum SYS_calls
{
  SYS_null,
  SYS_exit,
  SYS_open,
  SYS_close,
  SYS_read,
  SYS_write,
  SYS_lseek,
  SYS_unlink,
  SYS_getpid,
  SYS_kill,
  SYS_fstat,
  SYS_sbrk,
  SYS_fork,
  SYS_execve,
  SYS_wait4,
  SYS_link,
  SYS_chdir,
  SYS_stat,
  SYS_utime,
  SYS_chown,
  SYS_chmod,
  SYS_time,
  SYS_pipe
};

static int registers[NUMREGS];

#define STACKSIZE 8096
static unsigned char remcomInBuffer[BUFMAX];
static unsigned char remcomOutBuffer[BUFMAX];
static int remcomStack[STACKSIZE / sizeof (int)];
static int *stackPtr = &remcomStack[STACKSIZE / sizeof (int) - 1];

static unsigned int save_vectors[18];	/* previous exception vectors */

/* Indicate to caller of mem2hex or hex2mem that there has been an error. */
static volatile int mem_err = 0;

/* Store the vector number here (since GDB only gets the signal
   number through the usual means, and that's not very specific).  */
int gdb_m32r_vector = -1;

#if 0
#include "syscall.h"
#endif

/* Global entry points:
 */

extern void handle_exception (int);
extern void set_debug_traps (void);
extern void breakpoint (void);

/* Local functions:
 */

static int computeSignal (int);
static void putpacket (unsigned char *);
static unsigned char *getpacket (void);

static unsigned char *mem2hex (unsigned char *, unsigned char *, int, int);
static unsigned char *hex2mem (unsigned char *, unsigned char *, int, int);
static int hexToInt (unsigned char **, int *);
static unsigned char *bin2mem (unsigned char *, unsigned char *, int, int);
static void stash_registers (void);
static void restore_registers (void);
static int prepare_to_step (int);
static int finish_from_step (void);
static unsigned long crc32 (unsigned char *, int, unsigned long);

static void gdb_error (char *, char *);
static int gdb_putchar (int), gdb_puts (char *), gdb_write (char *, int);

static unsigned char *strcpy (unsigned char *, const unsigned char *);
static int strlen (const unsigned char *);

/*
 * This function does all command procesing for interfacing to gdb.
 */

void
handle_exception (int exceptionVector)
{
  int sigval, stepping;
  int addr, length, i;
  unsigned char *ptr;
  unsigned char buf[16];
  int binary;

  if (!finish_from_step ())
    return;			/* "false step": let the target continue */

  gdb_m32r_vector = exceptionVector;

  if (remote_debug)
    {
      mem2hex ((unsigned char *) &exceptionVector, buf, 4, 0);
      gdb_error ("Handle exception %s, ", buf);
      mem2hex ((unsigned char *) &registers[PC], buf, 4, 0);
      gdb_error ("PC == 0x%s\n", buf);
    }

  /* reply to host that an exception has occurred */
  sigval = computeSignal (exceptionVector);

  ptr = remcomOutBuffer;

  *ptr++ = 'T';			/* notify gdb with signo, PC, FP and SP */
  *ptr++ = hexchars[sigval >> 4];
  *ptr++ = hexchars[sigval & 0xf];

  *ptr++ = hexchars[PC >> 4];
  *ptr++ = hexchars[PC & 0xf];
  *ptr++ = ':';
  ptr = mem2hex ((unsigned char *) &registers[PC], ptr, 4, 0);	/* PC */
  *ptr++ = ';';

  *ptr++ = hexchars[R13 >> 4];
  *ptr++ = hexchars[R13 & 0xf];
  *ptr++ = ':';
  ptr = mem2hex ((unsigned char *) &registers[R13], ptr, 4, 0);	/* FP */
  *ptr++ = ';';

  *ptr++ = hexchars[R15 >> 4];
  *ptr++ = hexchars[R15 & 0xf];
  *ptr++ = ':';
  ptr = mem2hex ((unsigned char *) &registers[R15], ptr, 4, 0);	/* SP */
  *ptr++ = ';';
  *ptr++ = 0;

  if (exceptionVector == 0)	/* simulated SYS call stuff */
    {
      mem2hex ((unsigned char *) &registers[PC], buf, 4, 0);
      switch (registers[R0])
	{
	case SYS_exit:
	  gdb_error ("Target program has exited at %s\n", buf);
	  ptr = remcomOutBuffer;
	  *ptr++ = 'W';
	  sigval = registers[R1] & 0xff;
	  *ptr++ = hexchars[sigval >> 4];
	  *ptr++ = hexchars[sigval & 0xf];
	  *ptr++ = 0;
	  break;
	case SYS_open:
	  gdb_error ("Target attempts SYS_open call at %s\n", buf);
	  break;
	case SYS_close:
	  gdb_error ("Target attempts SYS_close call at %s\n", buf);
	  break;
	case SYS_read:
	  gdb_error ("Target attempts SYS_read call at %s\n", buf);
	  break;
	case SYS_write:
	  if (registers[R1] == 1 ||	/* write to stdout  */
	      registers[R1] == 2)	/* write to stderr  */
	    {			/* (we can do that) */
	      registers[R0] =
		gdb_write ((void *) registers[R2], registers[R3]);
	      return;
	    }
	  else
	    gdb_error ("Target attempts SYS_write call at %s\n", buf);
	  break;
	case SYS_lseek:
	  gdb_error ("Target attempts SYS_lseek call at %s\n", buf);
	  break;
	case SYS_unlink:
	  gdb_error ("Target attempts SYS_unlink call at %s\n", buf);
	  break;
	case SYS_getpid:
	  gdb_error ("Target attempts SYS_getpid call at %s\n", buf);
	  break;
	case SYS_kill:
	  gdb_error ("Target attempts SYS_kill call at %s\n", buf);
	  break;
	case SYS_fstat:
	  gdb_error ("Target attempts SYS_fstat call at %s\n", buf);
	  break;
	default:
	  gdb_error ("Target attempts unknown SYS call at %s\n", buf);
	  break;
	}
    }

  putpacket (remcomOutBuffer);

  stepping = 0;

  while (1 == 1)
    {
      remcomOutBuffer[0] = 0;
      ptr = getpacket ();
      binary = 0;
      switch (*ptr++)
	{
	default:		/* Unknown code.  Return an empty reply message. */
	  break;
	case 'R':
	  if (hexToInt (&ptr, &addr))
	    registers[PC] = addr;
	  strcpy (remcomOutBuffer, "OK");
	  break;
	case '!':
	  strcpy (remcomOutBuffer, "OK");
	  break;
	case 'X':		/* XAA..AA,LLLL:<binary data>#cs */
	  binary = 1;
	case 'M':		/* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
	  /* TRY TO READ '%x,%x:'.  IF SUCCEED, SET PTR = 0 */
	  {
	    if (hexToInt (&ptr, &addr))
	      if (*(ptr++) == ',')
		if (hexToInt (&ptr, &length))
		  if (*(ptr++) == ':')
		    {
		      mem_err = 0;
		      if (binary)
			bin2mem (ptr, (unsigned char *) addr, length, 1);
		      else
			hex2mem (ptr, (unsigned char *) addr, length, 1);
		      if (mem_err)
			{
			  strcpy (remcomOutBuffer, "E03");
			  gdb_error ("memory fault", "");
			}
		      else
			{
			  strcpy (remcomOutBuffer, "OK");
			}
		      ptr = 0;
		    }
	    if (ptr)
	      {
		strcpy (remcomOutBuffer, "E02");
	      }
	  }
	  break;
	case 'm':		/* mAA..AA,LLLL  Read LLLL bytes at address AA..AA */
	  /* TRY TO READ %x,%x.  IF SUCCEED, SET PTR = 0 */
	  if (hexToInt (&ptr, &addr))
	    if (*(ptr++) == ',')
	      if (hexToInt (&ptr, &length))
		{
		  ptr = 0;
		  mem_err = 0;
		  mem2hex ((unsigned char *) addr, remcomOutBuffer, length,
			   1);
		  if (mem_err)
		    {
		      strcpy (remcomOutBuffer, "E03");
		      gdb_error ("memory fault", "");
		    }
		}
	  if (ptr)
	    {
	      strcpy (remcomOutBuffer, "E01");
	    }
	  break;
	case '?':
	  remcomOutBuffer[0] = 'S';
	  remcomOutBuffer[1] = hexchars[sigval >> 4];
	  remcomOutBuffer[2] = hexchars[sigval % 16];
	  remcomOutBuffer[3] = 0;
	  break;
	case 'd':
	  remote_debug = !(remote_debug);	/* toggle debug flag */
	  break;
	case 'g':		/* return the value of the CPU registers */
	  mem2hex ((unsigned char *) registers, remcomOutBuffer, NUMREGBYTES,
		   0);
	  break;
	case 'P':		/* set the value of a single CPU register - return OK */
	  {
	    int regno;

	    if (hexToInt (&ptr, &regno) && *ptr++ == '=')
	      if (regno >= 0 && regno < NUMREGS)
		{
		  int stackmode;

		  hex2mem (ptr, (unsigned char *) &registers[regno], 4, 0);
		  /*
		   * Since we just changed a single CPU register, let's
		   * make sure to keep the several stack pointers consistent.
		   */
		  stackmode = registers[PSW] & 0x80;
		  if (regno == R15)	/* stack pointer changed */
		    {		/* need to change SPI or SPU */
		      if (stackmode == 0)
			registers[SPI] = registers[R15];
		      else
			registers[SPU] = registers[R15];
		    }
		  else if (regno == SPU)	/* "user" stack pointer changed */
		    {
		      if (stackmode != 0)	/* stack in user mode: copy SP */
			registers[R15] = registers[SPU];
		    }
		  else if (regno == SPI)	/* "interrupt" stack pointer changed */
		    {
		      if (stackmode == 0)	/* stack in interrupt mode: copy SP */
			registers[R15] = registers[SPI];
		    }
		  else if (regno == PSW)	/* stack mode may have changed! */
		    {		/* force SP to either SPU or SPI */
		      if (stackmode == 0)	/* stack in user mode */
			registers[R15] = registers[SPI];
		      else	/* stack in interrupt mode */
			registers[R15] = registers[SPU];
		    }
		  strcpy (remcomOutBuffer, "OK");
		  break;
		}
	    strcpy (remcomOutBuffer, "E01");
	    break;
	  }
	case 'G':		/* set the value of the CPU registers - return OK */
	  hex2mem (ptr, (unsigned char *) registers, NUMREGBYTES, 0);
	  strcpy (remcomOutBuffer, "OK");
	  break;
	case 's':		/* sAA..AA      Step one instruction from AA..AA(optional) */
	  stepping = 1;
	case 'c':		/* cAA..AA      Continue from address AA..AA(optional) */
	  /* try to read optional parameter, pc unchanged if no parm */
	  if (hexToInt (&ptr, &addr))
	    registers[PC] = addr;

	  if (stepping)		/* single-stepping */
	    {
	      if (!prepare_to_step (0))	/* set up for single-step */
		{
		  /* prepare_to_step has already emulated the target insn:
		     Send SIGTRAP to gdb, don't resume the target at all.  */
		  ptr = remcomOutBuffer;
		  *ptr++ = 'T';	/* Simulate stopping with SIGTRAP */
		  *ptr++ = '0';
		  *ptr++ = '5';

		  *ptr++ = hexchars[PC >> 4];	/* send PC */
		  *ptr++ = hexchars[PC & 0xf];
		  *ptr++ = ':';
		  ptr = mem2hex ((unsigned char *) &registers[PC], ptr, 4, 0);
		  *ptr++ = ';';

		  *ptr++ = hexchars[R13 >> 4];	/* send FP */
		  *ptr++ = hexchars[R13 & 0xf];
		  *ptr++ = ':';
		  ptr =
		    mem2hex ((unsigned char *) &registers[R13], ptr, 4, 0);
		  *ptr++ = ';';

		  *ptr++ = hexchars[R15 >> 4];	/* send SP */
		  *ptr++ = hexchars[R15 & 0xf];
		  *ptr++ = ':';
		  ptr =
		    mem2hex ((unsigned char *) &registers[R15], ptr, 4, 0);
		  *ptr++ = ';';
		  *ptr++ = 0;

		  break;
		}
	    }
	  else			/* continuing, not single-stepping */
	    {
	      /* OK, about to do a "continue".  First check to see if the 
		 target pc is on an odd boundary (second instruction in the 
		 word).  If so, we must do a single-step first, because 
		 ya can't jump or return back to an odd boundary!  */
	      if ((registers[PC] & 2) != 0)
		prepare_to_step (1);
	    }

	  return;

	case 'D':		/* Detach */
#if 0
	  /* I am interpreting this to mean, release the board from control 
	     by the remote stub.  To do this, I am restoring the original
	     (or at least previous) exception vectors.
	   */
	  for (i = 0; i < 18; i++)
	    exceptionHandler (i, save_vectors[i]);
	  putpacket ("OK");
	  return;		/* continue the inferior */
#else
	  strcpy (remcomOutBuffer, "OK");
	  break;
#endif
	case 'q':
	  if (*ptr++ == 'C' &&
	      *ptr++ == 'R' && *ptr++ == 'C' && *ptr++ == ':')
	    {
	      unsigned long start, len, our_crc;

	      if (hexToInt (&ptr, (int *) &start) &&
		  *ptr++ == ',' && hexToInt (&ptr, (int *) &len))
		{
		  remcomOutBuffer[0] = 'C';
		  our_crc = crc32 ((unsigned char *) start, len, 0xffffffff);
		  mem2hex ((char *) &our_crc,
			   &remcomOutBuffer[1], sizeof (long), 0);
		}		/* else do nothing */
	    }			/* else do nothing */
	  break;

	case 'k':		/* kill the program */
	  continue;
	}			/* switch */

      /* reply to the request */
      putpacket (remcomOutBuffer);
    }
}

/* qCRC support */

/* Table used by the crc32 function to calculate the checksum.  */
static unsigned long crc32_table[256] = { 0, 0 };

static unsigned long
crc32 (unsigned char *buf, int len, unsigned long crc)
{
  if (!crc32_table[1])
    {
      /* Initialize the CRC table and the decoding table. */
      int i, j;
      unsigned long c;

      for (i = 0; i < 256; i++)
	{
	  for (c = i << 24, j = 8; j > 0; --j)
	    c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
	  crc32_table[i] = c;
	}
    }

  while (len--)
    {
      crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
      buf++;
    }
  return crc;
}

static int
hex (unsigned char ch)
{
  if ((ch >= 'a') && (ch <= 'f'))
    return (ch - 'a' + 10);
  if ((ch >= '0') && (ch <= '9'))
    return (ch - '0');
  if ((ch >= 'A') && (ch <= 'F'))
    return (ch - 'A' + 10);
  return (-1);
}

/* scan for the sequence $<data>#<checksum>     */

unsigned char *
getpacket (void)
{
  unsigned char *buffer = &remcomInBuffer[0];
  unsigned char checksum;
  unsigned char xmitcsum;
  int count;
  char ch;

  while (1)
    {
      /* wait around for the start character, ignore all other characters */
      while ((ch = getDebugChar ()) != '$')
	;

    retry:
      checksum = 0;
      xmitcsum = -1;
      count = 0;

      /* now, read until a # or end of buffer is found */
      while (count < BUFMAX - 1)
	{
	  ch = getDebugChar ();
	  if (ch == '$')
	    goto retry;
	  if (ch == '#')
	    break;
	  checksum = checksum + ch;
	  buffer[count] = ch;
	  count = count + 1;
	}
      buffer[count] = 0;

      if (ch == '#')
	{
	  ch = getDebugChar ();
	  xmitcsum = hex (ch) << 4;
	  ch = getDebugChar ();
	  xmitcsum += hex (ch);

	  if (checksum != xmitcsum)
	    {
	      if (remote_debug)
		{
		  unsigned char buf[16];

		  mem2hex ((unsigned char *) &checksum, buf, 4, 0);
		  gdb_error ("Bad checksum: my count = %s, ", buf);
		  mem2hex ((unsigned char *) &xmitcsum, buf, 4, 0);
		  gdb_error ("sent count = %s\n", buf);
		  gdb_error (" -- Bad buffer: \"%s\"\n", buffer);
		}
	      putDebugChar ('-');	/* failed checksum */
	    }
	  else
	    {
	      putDebugChar ('+');	/* successful transfer */

	      /* if a sequence char is present, reply the sequence ID */
	      if (buffer[2] == ':')
		{
		  putDebugChar (buffer[0]);
		  putDebugChar (buffer[1]);

		  return &buffer[3];
		}

	      return &buffer[0];
	    }
	}
    }
}

/* send the packet in buffer.  */

static void
putpacket (unsigned char *buffer)
{
  unsigned char checksum;
  int count;
  char ch;

  /*  $<packet info>#<checksum>. */
  do
    {
      putDebugChar ('$');
      checksum = 0;
      count = 0;

      while (ch = buffer[count])
	{
	  putDebugChar (ch);
	  checksum += ch;
	  count += 1;
	}
      putDebugChar ('#');
      putDebugChar (hexchars[checksum >> 4]);
      putDebugChar (hexchars[checksum % 16]);
    }
  while (getDebugChar () != '+');
}

/* Address of a routine to RTE to if we get a memory fault.  */

static void (*volatile mem_fault_routine) () = 0;

static void
set_mem_err (void)
{
  mem_err = 1;
}

/* Check the address for safe access ranges.  As currently defined,
   this routine will reject the "expansion bus" address range(s).
   To make those ranges useable, someone must implement code to detect
   whether there's anything connected to the expansion bus. */

static int
mem_safe (unsigned char *addr)
{
#define BAD_RANGE_ONE_START	((unsigned char *) 0x600000)
#define BAD_RANGE_ONE_END	((unsigned char *) 0xa00000)
#define BAD_RANGE_TWO_START	((unsigned char *) 0xff680000)
#define BAD_RANGE_TWO_END	((unsigned char *) 0xff800000)

  if (addr < BAD_RANGE_ONE_START)
    return 1;			/* safe */
  if (addr < BAD_RANGE_ONE_END)
    return 0;			/* unsafe */
  if (addr < BAD_RANGE_TWO_START)
    return 1;			/* safe */
  if (addr < BAD_RANGE_TWO_END)
    return 0;			/* unsafe */
}

/* These are separate functions so that they are so short and sweet
   that the compiler won't save any registers (if there is a fault
   to mem_fault, they won't get restored, so there better not be any
   saved).  */
static int
get_char (unsigned char *addr)
{
#if 1
  if (mem_fault_routine && !mem_safe (addr))
    {
      mem_fault_routine ();
      return 0;
    }
#endif
  return *addr;
}

static void
set_char (unsigned char *addr, unsigned char val)
{
#if 1
  if (mem_fault_routine && !mem_safe (addr))
    {
      mem_fault_routine ();
      return;
    }
#endif
  *addr = val;
}

/* Convert the memory pointed to by mem into hex, placing result in buf.
   Return a pointer to the last char put in buf (null).
   If MAY_FAULT is non-zero, then we should set mem_err in response to
   a fault; if zero treat a fault like any other fault in the stub.  */

static unsigned char *
mem2hex (unsigned char *mem, unsigned char *buf, int count, int may_fault)
{
  int i;
  unsigned char ch;

  if (may_fault)
    mem_fault_routine = set_mem_err;
  for (i = 0; i < count; i++)
    {
      ch = get_char (mem++);
      if (may_fault && mem_err)
	return (buf);
      *buf++ = hexchars[ch >> 4];
      *buf++ = hexchars[ch % 16];
    }
  *buf = 0;
  if (may_fault)
    mem_fault_routine = 0;
  return (buf);
}

/* Convert the hex array pointed to by buf into binary to be placed in mem.
   Return a pointer to the character AFTER the last byte written. */

static unsigned char *
hex2mem (unsigned char *buf, unsigned char *mem, int count, int may_fault)
{
  int i;
  unsigned char ch;

  if (may_fault)
    mem_fault_routine = set_mem_err;
  for (i = 0; i < count; i++)
    {
      ch = hex (*buf++) << 4;
      ch = ch + hex (*buf++);
      set_char (mem++, ch);
      if (may_fault && mem_err)
	return (mem);
    }
  if (may_fault)
    mem_fault_routine = 0;
  return (mem);
}

/* Convert the binary stream in BUF to memory.

   Gdb will escape $, #, and the escape char (0x7d).
   COUNT is the total number of bytes to write into
   memory. */
static unsigned char *
bin2mem (unsigned char *buf, unsigned char *mem, int count, int may_fault)
{
  int i;
  unsigned char ch;

  if (may_fault)
    mem_fault_routine = set_mem_err;
  for (i = 0; i < count; i++)
    {
      /* Check for any escaped characters. Be paranoid and
	 only unescape chars that should be escaped. */
      if (*buf == 0x7d)
	{
	  switch (*(buf + 1))
	    {
	    case 0x3:		/* # */
	    case 0x4:		/* $ */
	    case 0x5d:		/* escape char */
	      buf++;
	      *buf |= 0x20;
	      break;
	    default:
	      /* nothing */
	      break;
	    }
	}

      set_char (mem++, *buf++);

      if (may_fault && mem_err)
	return mem;
    }

  if (may_fault)
    mem_fault_routine = 0;
  return mem;
}

/* this function takes the m32r exception vector and attempts to
   translate this number into a unix compatible signal value */

static int
computeSignal (int exceptionVector)
{
  int sigval;
  switch (exceptionVector)
    {
    case 0:
      sigval = 23;
      break;			/* I/O trap                    */
    case 1:
      sigval = 5;
      break;			/* breakpoint                  */
    case 2:
      sigval = 5;
      break;			/* breakpoint                  */
    case 3:
      sigval = 5;
      break;			/* breakpoint                  */
    case 4:
      sigval = 5;
      break;			/* breakpoint                  */
    case 5:
      sigval = 5;
      break;			/* breakpoint                  */
    case 6:
      sigval = 5;
      break;			/* breakpoint                  */
    case 7:
      sigval = 5;
      break;			/* breakpoint                  */
    case 8:
      sigval = 5;
      break;			/* breakpoint                  */
    case 9:
      sigval = 5;
      break;			/* breakpoint                  */
    case 10:
      sigval = 5;
      break;			/* breakpoint                  */
    case 11:
      sigval = 5;
      break;			/* breakpoint                  */
    case 12:
      sigval = 5;
      break;			/* breakpoint                  */
    case 13:
      sigval = 5;
      break;			/* breakpoint                  */
    case 14:
      sigval = 5;
      break;			/* breakpoint                  */
    case 15:
      sigval = 5;
      break;			/* breakpoint                  */
    case 16:
      sigval = 10;
      break;			/* BUS ERROR (alignment)       */
    case 17:
      sigval = 2;
      break;			/* INTerrupt                   */
    default:
      sigval = 7;
      break;			/* "software generated"        */
    }
  return (sigval);
}

/**********************************************/
/* WHILE WE FIND NICE HEX CHARS, BUILD AN INT */
/* RETURN NUMBER OF CHARS PROCESSED           */
/**********************************************/
static int
hexToInt (unsigned char **ptr, int *intValue)
{
  int numChars = 0;
  int hexValue;

  *intValue = 0;
  while (**ptr)
    {
      hexValue = hex (**ptr);
      if (hexValue >= 0)
	{
	  *intValue = (*intValue << 4) | hexValue;
	  numChars++;
	}
      else
	break;
      (*ptr)++;
    }
  return (numChars);
}

/*
  Table of branch instructions:
  
  10B6		RTE	return from trap or exception
  1FCr		JMP	jump
  1ECr		JL	jump and link
  7Fxx		BRA	branch
  FFxxxxxx	BRA	branch (long)
  B09rxxxx	BNEZ	branch not-equal-zero
  Br1rxxxx	BNE	branch not-equal
  7Dxx		BNC	branch not-condition
  FDxxxxxx	BNC	branch not-condition (long)
  B0Arxxxx	BLTZ	branch less-than-zero
  B0Crxxxx	BLEZ	branch less-equal-zero
  7Exx		BL	branch and link
  FExxxxxx	BL	branch and link (long)
  B0Drxxxx	BGTZ	branch greater-than-zero
  B0Brxxxx	BGEZ	branch greater-equal-zero
  B08rxxxx	BEQZ	branch equal-zero
  Br0rxxxx	BEQ	branch equal
  7Cxx		BC	branch condition
  FCxxxxxx	BC	branch condition (long)
  */

static int
isShortBranch (unsigned char *instr)
{
  unsigned char instr0 = instr[0] & 0x7F;	/* mask off high bit */

  if (instr0 == 0x10 && instr[1] == 0xB6)	/* RTE */
    return 1;			/* return from trap or exception */

  if (instr0 == 0x1E || instr0 == 0x1F)	/* JL or JMP */
    if ((instr[1] & 0xF0) == 0xC0)
      return 2;			/* jump through a register.  */

  if (instr0 == 0x7C || instr0 == 0x7D ||	/* BC, BNC, BL, BRA */
      instr0 == 0x7E || instr0 == 0x7F)
    return 3;			/* eight bit PC offset */

  return 0;
}

static int
isLongBranch (unsigned char *instr)
{
  if (instr[0] == 0xFC || instr[0] == 0xFD ||	/* BRA, BNC, BL, BC */
      instr[0] == 0xFE || instr[0] == 0xFF)	/* 24 bit relative */
    return 4;
  if ((instr[0] & 0xF0) == 0xB0)	/* 16 bit relative */
    {
      if ((instr[1] & 0xF0) == 0x00 ||	/* BNE, BEQ */
	  (instr[1] & 0xF0) == 0x10)
	return 5;
      if (instr[0] == 0xB0)	/* BNEZ, BLTZ, BLEZ, BGTZ, BGEZ, BEQZ */
	if ((instr[1] & 0xF0) == 0x80 || (instr[1] & 0xF0) == 0x90 ||
	    (instr[1] & 0xF0) == 0xA0 || (instr[1] & 0xF0) == 0xB0 ||
	    (instr[1] & 0xF0) == 0xC0 || (instr[1] & 0xF0) == 0xD0)
	  return 6;
    }
  return 0;
}

/* if address is NOT on a 4-byte boundary, or high-bit of instr is zero, 
   then it's a 2-byte instruction, else it's a 4-byte instruction.  */

#define INSTRUCTION_SIZE(addr) \
    ((((int) addr & 2) || (((unsigned char *) addr)[0] & 0x80) == 0) ? 2 : 4)

static int
isBranch (unsigned char *instr)
{
  if (INSTRUCTION_SIZE (instr) == 2)
    return isShortBranch (instr);
  else
    return isLongBranch (instr);
}

static int
willBranch (unsigned char *instr, int branchCode)
{
  switch (branchCode)
    {
    case 0:
      return 0;			/* not a branch */
    case 1:
      return 1;			/* RTE */
    case 2:
      return 1;			/* JL or JMP    */
    case 3:			/* BC, BNC, BL, BRA (short) */
    case 4:			/* BC, BNC, BL, BRA (long) */
      switch (instr[0] & 0x0F)
	{
	case 0xC:		/* Branch if Condition Register */
	  return (registers[CBR] != 0);
	case 0xD:		/* Branch if NOT Condition Register */
	  return (registers[CBR] == 0);
	case 0xE:		/* Branch and Link */
	case 0xF:		/* Branch (unconditional) */
	  return 1;
	default:		/* oops? */
	  return 0;
	}
    case 5:			/* BNE, BEQ */
      switch (instr[1] & 0xF0)
	{
	case 0x00:		/* Branch if r1 equal to r2 */
	  return (registers[instr[0] & 0x0F] == registers[instr[1] & 0x0F]);
	case 0x10:		/* Branch if r1 NOT equal to r2 */
	  return (registers[instr[0] & 0x0F] != registers[instr[1] & 0x0F]);
	default:		/* oops? */
	  return 0;
	}
    case 6:			/* BNEZ, BLTZ, BLEZ, BGTZ, BGEZ ,BEQZ */
      switch (instr[1] & 0xF0)
	{
	case 0x80:		/* Branch if reg equal to zero */
	  return (registers[instr[1] & 0x0F] == 0);
	case 0x90:		/* Branch if reg NOT equal to zero */
	  return (registers[instr[1] & 0x0F] != 0);
	case 0xA0:		/* Branch if reg less than zero */
	  return (registers[instr[1] & 0x0F] < 0);
	case 0xB0:		/* Branch if reg greater or equal to zero */
	  return (registers[instr[1] & 0x0F] >= 0);
	case 0xC0:		/* Branch if reg less than or equal to zero */
	  return (registers[instr[1] & 0x0F] <= 0);
	case 0xD0:		/* Branch if reg greater than zero */
	  return (registers[instr[1] & 0x0F] > 0);
	default:		/* oops? */
	  return 0;
	}
    default:			/* oops? */
      return 0;
    }
}

static int
branchDestination (unsigned char *instr, int branchCode)
{
  switch (branchCode)
    {
    default:
    case 0:			/* not a branch */
      return 0;
    case 1:			/* RTE */
      return registers[BPC] & ~3;	/* pop BPC into PC */
    case 2:			/* JL or JMP */
      return registers[instr[1] & 0x0F] & ~3;	/* jump through a register.  */
    case 3:			/* BC, BNC, BL, BRA (short, 8-bit relative offset) */
      return (((int) instr) & ~3) + ((char) instr[1] << 2);
    case 4:			/* BC, BNC, BL, BRA (long, 24-bit relative offset) */
      return ((int) instr +
	      ((((char) instr[1] << 16) | (instr[2] << 8) | (instr[3])) <<
	       2));
    case 5:			/* BNE, BEQ (16-bit relative offset) */
    case 6:			/* BNEZ, BLTZ, BLEZ, BGTZ, BGEZ ,BEQZ (ditto) */
      return ((int) instr + ((((char) instr[2] << 8) | (instr[3])) << 2));
    }

  /* An explanatory note: in the last three return expressions, I have
     cast the most-significant byte of the return offset to char.
     What this accomplishes is sign extension.  If the other
     less-significant bytes were signed as well, they would get sign
     extended too and, if negative, their leading bits would clobber
     the bits of the more-significant bytes ahead of them.  There are
     other ways I could have done this, but sign extension from
     odd-sized integers is always a pain. */
}

static void
branchSideEffects (unsigned char *instr, int branchCode)
{
  switch (branchCode)
    {
    case 1:			/* RTE */
      return;			/* I <THINK> this is already handled... */
    case 2:			/* JL (or JMP) */
    case 3:			/* BL (or BC, BNC, BRA) */
    case 4:
      if ((instr[0] & 0x0F) == 0x0E)	/* branch/jump and link */
	registers[R14] = (registers[PC] & ~3) + 4;
      return;
    default:			/* any other branch has no side effects */
      return;
    }
}

static struct STEPPING_CONTEXT
{
  int stepping;			/* true when we've started a single-step */
  unsigned long target_addr;	/* the instr we're trying to execute */
  unsigned long target_size;	/* the size of the target instr */
  unsigned long noop_addr;	/* where we've inserted a no-op, if any */
  unsigned long trap1_addr;	/* the trap following the target instr */
  unsigned long trap2_addr;	/* the trap at a branch destination, if any */
  unsigned short noop_save;	/* instruction overwritten by our no-op */
  unsigned short trap1_save;	/* instruction overwritten by trap1 */
  unsigned short trap2_save;	/* instruction overwritten by trap2 */
  unsigned short continue_p;	/* true if NOT returning to gdb after step */
} stepping;

/* Function: prepare_to_step
   Called from handle_exception to prepare the user program to single-step.
   Places a trap instruction after the target instruction, with special 
   extra handling for branch instructions and for instructions in the 
   second half-word of a word.  

   Returns: True  if we should actually execute the instruction; 
	    False if we are going to emulate executing the instruction,
	    in which case we simply report to GDB that the instruction 
	    has already been executed.  */

#define TRAP1  0x10f1;		/* trap #1 instruction */
#define NOOP   0x7000;		/* noop    instruction */

static unsigned short trap1 = TRAP1;
static unsigned short noop = NOOP;

static int
prepare_to_step (continue_p)
     int continue_p;		/* if this isn't REALLY a single-step (see below) */
{
  unsigned long pc = registers[PC];
  int branchCode = isBranch ((unsigned char *) pc);
  unsigned char *p;

  /* zero out the stepping context 
     (paranoia -- it should already be zeroed) */
  for (p = (unsigned char *) &stepping;
       p < ((unsigned char *) &stepping) + sizeof (stepping); p++)
    *p = 0;

  if (branchCode != 0)		/* next instruction is a branch */
    {
      branchSideEffects ((unsigned char *) pc, branchCode);
      if (willBranch ((unsigned char *) pc, branchCode))
	registers[PC] = branchDestination ((unsigned char *) pc, branchCode);
      else
	registers[PC] = pc + INSTRUCTION_SIZE (pc);
      return 0;			/* branch "executed" -- just notify GDB */
    }
  else if (((int) pc & 2) != 0)	/* "second-slot" instruction */
    {
      /* insert no-op before pc */
      stepping.noop_addr = pc - 2;
      stepping.noop_save = *(unsigned short *) stepping.noop_addr;
      *(unsigned short *) stepping.noop_addr = noop;
      /* insert trap  after  pc */
      stepping.trap1_addr = pc + 2;
      stepping.trap1_save = *(unsigned short *) stepping.trap1_addr;
      *(unsigned short *) stepping.trap1_addr = trap1;
    }
  else				/* "first-slot" instruction */
    {
      /* insert trap  after  pc */
      stepping.trap1_addr = pc + INSTRUCTION_SIZE (pc);
      stepping.trap1_save = *(unsigned short *) stepping.trap1_addr;
      *(unsigned short *) stepping.trap1_addr = trap1;
    }
  /* "continue_p" means that we are actually doing a continue, and not 
     being requested to single-step by GDB.  Sometimes we have to do
     one single-step before continuing, because the PC is on a half-word
     boundary.  There's no way to simply resume at such an address.  */
  stepping.continue_p = continue_p;
  stepping.stepping = 1;	/* starting a single-step */
  return 1;
}

/* Function: finish_from_step
   Called from handle_exception to finish up when the user program 
   returns from a single-step.  Replaces the instructions that had
   been overwritten by traps or no-ops, 

   Returns: True  if we should notify GDB that the target stopped.
	    False if we only single-stepped because we had to before we
	    could continue (ie. we were trying to continue at a 
	    half-word boundary).  In that case don't notify GDB:
	    just "continue continuing".  */

static int
finish_from_step (void)
{
  if (stepping.stepping)	/* anything to do? */
    {
      int continue_p = stepping.continue_p;
      unsigned char *p;

      if (stepping.noop_addr)	/* replace instr "under" our no-op */
	*(unsigned short *) stepping.noop_addr = stepping.noop_save;
      if (stepping.trap1_addr)	/* replace instr "under" our trap  */
	*(unsigned short *) stepping.trap1_addr = stepping.trap1_save;
      if (stepping.trap2_addr)	/* ditto our other trap, if any    */
	*(unsigned short *) stepping.trap2_addr = stepping.trap2_save;

      for (p = (unsigned char *) &stepping;	/* zero out the stepping context */
	   p < ((unsigned char *) &stepping) + sizeof (stepping); p++)
	*p = 0;

      return !(continue_p);
    }
  else				/* we didn't single-step, therefore this must be a legitimate stop */
    return 1;
}

struct PSWreg
{				/* separate out the bit flags in the PSW register */
  int pad1:16;
  int bsm:1;
  int bie:1;
  int pad2:5;
  int bc:1;
  int sm:1;
  int ie:1;
  int pad3:5;
  int c:1;
} *psw;

/* Upon entry the value for LR to save has been pushed.
   We unpush that so that the value for the stack pointer saved is correct.
   Upon entry, all other registers are assumed to have not been modified
   since the interrupt/trap occurred.  */

asm ("\n\
stash_registers:\n\
	push r0\n\
	push r1\n\
	seth r1, #shigh(registers)\n\
	add3 r1, r1, #low(registers)\n\
	pop r0		; r1\n\
	st r0, @(4,r1)\n\
	pop r0		; r0\n\
	st r0, @r1\n\
	addi r1, #4	; only add 4 as subsequent saves are `pre inc'\n\
	st r2, @+r1\n\
	st r3, @+r1\n\
	st r4, @+r1\n\
	st r5, @+r1\n\
	st r6, @+r1\n\
	st r7, @+r1\n\
	st r8, @+r1\n\
	st r9, @+r1\n\
	st r10, @+r1\n\
	st r11, @+r1\n\
	st r12, @+r1\n\
	st r13, @+r1    ; fp\n\
	pop r0		; lr (r14)\n\
	st r0, @+r1\n\
	st sp, @+r1	; sp contains right value at this point\n\
	mvfc r0, cr0\n\
	st r0, @+r1	; cr0 == PSW\n\
	mvfc r0, cr1\n\
	st r0, @+r1	; cr1 == CBR\n\
	mvfc r0, cr2\n\
	st r0, @+r1	; cr2 == SPI\n\
	mvfc r0, cr3\n\
	st r0, @+r1	; cr3 == SPU\n\
	mvfc r0, cr6\n\
	st r0, @+r1	; cr6 == BPC\n\
	st r0, @+r1	; PC  == BPC\n\
	mvfaclo r0\n\
	st r0, @+r1	; ACCL\n\
	mvfachi r0\n\
	st r0, @+r1	; ACCH\n\
	jmp lr");

/* C routine to clean up what stash_registers did.
   It is called after calling stash_registers.
   This is separate from stash_registers as we want to do this in C
   but doing stash_registers in C isn't straightforward.  */

static void
cleanup_stash (void)
{
  psw = (struct PSWreg *) &registers[PSW];	/* fields of PSW register */
  psw->sm = psw->bsm;		/* fix up pre-trap values of psw fields */
  psw->ie = psw->bie;
  psw->c = psw->bc;
  registers[CBR] = psw->bc;	/* fix up pre-trap "C" register */

#if 0				/* FIXME: Was in previous version.  Necessary?
				   (Remember that we use the "rte" insn to return from the
				   trap/interrupt so the values of bsm, bie, bc are important.  */
  psw->bsm = psw->bie = psw->bc = 0;	/* zero post-trap values */
#endif

  /* FIXME: Copied from previous version.  This can probably be deleted
     since methinks stash_registers has already done this.  */
  registers[PC] = registers[BPC];	/* pre-trap PC */

  /* FIXME: Copied from previous version.  Necessary?  */
  if (psw->sm)			/* copy R15 into (psw->sm ? SPU : SPI) */
    registers[SPU] = registers[R15];
  else
    registers[SPI] = registers[R15];
}

asm ("\n\
restore_and_return:\n\
	seth r0, #shigh(registers+8)\n\
	add3 r0, r0, #low(registers+8)\n\
	ld r2, @r0+	; restore r2\n\
	ld r3, @r0+	; restore r3\n\
	ld r4, @r0+	; restore r4\n\
	ld r5, @r0+	; restore r5\n\
	ld r6, @r0+	; restore r6\n\
	ld r7, @r0+	; restore r7\n\
	ld r8, @r0+	; restore r8\n\
	ld r9, @r0+	; restore r9\n\
	ld r10, @r0+	; restore r10\n\
	ld r11, @r0+	; restore r11\n\
	ld r12, @r0+	; restore r12\n\
	ld r13, @r0+	; restore r13\n\
	ld r14, @r0+	; restore r14\n\
	ld r15, @r0+	; restore r15\n\
	ld r1, @r0+	; restore cr0 == PSW\n\
	mvtc r1, cr0\n\
	ld r1, @r0+	; restore cr1 == CBR (no-op, because it's read only)\n\
	mvtc r1, cr1\n\
	ld r1, @r0+	; restore cr2 == SPI\n\
	mvtc r1, cr2\n\
	ld r1, @r0+	; restore cr3 == SPU\n\
	mvtc r1, cr3\n\
	addi r0, #4	; skip BPC\n\
	ld r1, @r0+	; restore cr6 (BPC) == PC\n\
	mvtc r1, cr6\n\
	ld r1, @r0+	; restore ACCL\n\
	mvtaclo r1\n\
	ld r1, @r0+	; restore ACCH\n\
	mvtachi r1\n\
	seth r0, #shigh(registers)\n\
	add3 r0, r0, #low(registers)\n\
	ld r1, @(4,r0)	; restore r1\n\
	ld r0, @r0	; restore r0\n\
	rte");

/* General trap handler, called after the registers have been stashed.
   NUM is the trap/exception number.  */

static void
process_exception (int num)
{
  cleanup_stash ();
  asm volatile ("\n\
	seth r1, #shigh(stackPtr)\n\
	add3 r1, r1, #low(stackPtr)\n\
	ld r15, @r1		; setup local stack (protect user stack)\n\
	mv r0, %0\n\
	bl handle_exception\n\
	bl restore_and_return"::"r" (num):"r0", "r1");
}

void _catchException0 ();

asm ("\n\
_catchException0:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #0\n\
	bl process_exception");

void _catchException1 ();

asm ("\n\
_catchException1:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	bl cleanup_stash\n\
	seth r1, #shigh(stackPtr)\n\
	add3 r1, r1, #low(stackPtr)\n\
	ld r15, @r1		; setup local stack (protect user stack)\n\
	seth r1, #shigh(registers + 21*4) ; PC\n\
	add3 r1, r1, #low(registers + 21*4)\n\
	ld r0, @r1\n\
	addi r0, #-4		; back up PC for breakpoint trap.\n\
	st r0, @r1		; FIXME: what about bp in right slot?\n\
	ldi r0, #1\n\
	bl handle_exception\n\
	bl restore_and_return");

void _catchException2 ();

asm ("\n\
_catchException2:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #2\n\
	bl process_exception");

void _catchException3 ();

asm ("\n\
_catchException3:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #3\n\
	bl process_exception");

void _catchException4 ();

asm ("\n\
_catchException4:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #4\n\
	bl process_exception");

void _catchException5 ();

asm ("\n\
_catchException5:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #5\n\
	bl process_exception");

void _catchException6 ();

asm ("\n\
_catchException6:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #6\n\
	bl process_exception");

void _catchException7 ();

asm ("\n\
_catchException7:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #7\n\
	bl process_exception");

void _catchException8 ();

asm ("\n\
_catchException8:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #8\n\
	bl process_exception");

void _catchException9 ();

asm ("\n\
_catchException9:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #9\n\
	bl process_exception");

void _catchException10 ();

asm ("\n\
_catchException10:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #10\n\
	bl process_exception");

void _catchException11 ();

asm ("\n\
_catchException11:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #11\n\
	bl process_exception");

void _catchException12 ();

asm ("\n\
_catchException12:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #12\n\
	bl process_exception");

void _catchException13 ();

asm ("\n\
_catchException13:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #13\n\
	bl process_exception");

void _catchException14 ();

asm ("\n\
_catchException14:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #14\n\
	bl process_exception");

void _catchException15 ();

asm ("\n\
_catchException15:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #15\n\
	bl process_exception");

void _catchException16 ();

asm ("\n\
_catchException16:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #16\n\
	bl process_exception");

void _catchException17 ();

asm ("\n\
_catchException17:\n\
	push lr\n\
	bl stash_registers\n\
	; Note that at this point the pushed value of `lr' has been popped\n\
	ldi r0, #17\n\
	bl process_exception");


/* this function is used to set up exception handlers for tracing and
   breakpoints */
void
set_debug_traps (void)
{
  /*  extern void remcomHandler(); */
  int i;

  for (i = 0; i < 18; i++)	/* keep a copy of old vectors */
    if (save_vectors[i] == 0)	/* only copy them the first time */
      save_vectors[i] = getExceptionHandler (i);

  stackPtr = &remcomStack[STACKSIZE / sizeof (int) - 1];

  exceptionHandler (0, _catchException0);
  exceptionHandler (1, _catchException1);
  exceptionHandler (2, _catchException2);
  exceptionHandler (3, _catchException3);
  exceptionHandler (4, _catchException4);
  exceptionHandler (5, _catchException5);
  exceptionHandler (6, _catchException6);
  exceptionHandler (7, _catchException7);
  exceptionHandler (8, _catchException8);
  exceptionHandler (9, _catchException9);
  exceptionHandler (10, _catchException10);
  exceptionHandler (11, _catchException11);
  exceptionHandler (12, _catchException12);
  exceptionHandler (13, _catchException13);
  exceptionHandler (14, _catchException14);
  exceptionHandler (15, _catchException15);
  exceptionHandler (16, _catchException16);
  /*  exceptionHandler (17, _catchException17); */

  initialized = 1;
}

/* This function will generate a breakpoint exception.  It is used at the
   beginning of a program to sync up with a debugger and can be used
   otherwise as a quick means to stop program execution and "break" into
   the debugger. */

#define BREAKPOINT() asm volatile ("	trap #2");

void
breakpoint (void)
{
  if (initialized)
    BREAKPOINT ();
}

/* STDOUT section:
   Stuff pertaining to simulating stdout by sending chars to gdb to be echoed.
   Functions: gdb_putchar(char ch)
	      gdb_puts(char *str)
	      gdb_write(char *str, int len)
	      gdb_error(char *format, char *parm)
	      */

/* Function: gdb_putchar(int)
   Make gdb write a char to stdout.
   Returns: the char */

static int
gdb_putchar (int ch)
{
  char buf[4];

  buf[0] = 'O';
  buf[1] = hexchars[ch >> 4];
  buf[2] = hexchars[ch & 0x0F];
  buf[3] = 0;
  putpacket (buf);
  return ch;
}

/* Function: gdb_write(char *, int)
   Make gdb write n bytes to stdout (not assumed to be null-terminated).
   Returns: number of bytes written */

static int
gdb_write (char *data, int len)
{
  char *buf, *cpy;
  int i;

  buf = remcomOutBuffer;
  buf[0] = 'O';
  i = 0;
  while (i < len)
    {
      for (cpy = buf + 1;
	   i < len && cpy < buf + sizeof (remcomOutBuffer) - 3; i++)
	{
	  *cpy++ = hexchars[data[i] >> 4];
	  *cpy++ = hexchars[data[i] & 0x0F];
	}
      *cpy = 0;
      putpacket (buf);
    }
  return len;
}

/* Function: gdb_puts(char *)
   Make gdb write a null-terminated string to stdout.
   Returns: the length of the string */

static int
gdb_puts (char *str)
{
  return gdb_write (str, strlen (str));
}

/* Function: gdb_error(char *, char *)
   Send an error message to gdb's stdout.
   First string may have 1 (one) optional "%s" in it, which
   will cause the optional second string to be inserted.  */

static void
gdb_error (char *format, char *parm)
{
  char buf[400], *cpy;
  int len;

  if (remote_debug)
    {
      if (format && *format)
	len = strlen (format);
      else
	return;			/* empty input */

      if (parm && *parm)
	len += strlen (parm);

      for (cpy = buf; *format;)
	{
	  if (format[0] == '%' && format[1] == 's')	/* include second string */
	    {
	      format += 2;	/* advance two chars instead of just one */
	      while (parm && *parm)
		*cpy++ = *parm++;
	    }
	  else
	    *cpy++ = *format++;
	}
      *cpy = '\0';
      gdb_puts (buf);
    }
}

static unsigned char *
strcpy (unsigned char *dest, const unsigned char *src)
{
  unsigned char *ret = dest;

  if (dest && src)
    {
      while (*src)
	*dest++ = *src++;
      *dest = 0;
    }
  return ret;
}

static int
strlen (const unsigned char *src)
{
  int ret;

  for (ret = 0; *src; src++)
    ret++;

  return ret;
}

#if 0
void
exit (code)
     int code;
{
  _exit (code);
}

int
atexit (void *p)
{
  return 0;
}

void
abort (void)
{
  _exit (1);
}
#endif
