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

		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 it's 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"		/* for SYS_exit, SYS_write etc. */
#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 consistant.
		   */
		  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 thru 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 thru 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 occured.  */

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
