* doc/binutils.texi (addr2line <man synopsis>): Correct brackets.
[binutils-gdb.git] / gdb / m32r-stub.c
index 60c828ffbe25a81f5a54a4d5768e459ab3bb54f9..cb956264d67533216f6a834dbe5f92d845e5ca25 100644 (file)
@@ -179,7 +179,7 @@ extern void breakpoint(void);
 
 static int  computeSignal(int);
 static void putpacket(unsigned char *);
-static void getpacket(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);
@@ -189,6 +189,7 @@ 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);
@@ -203,7 +204,7 @@ static int   strlen (const unsigned char *);
 void 
 handle_exception(int exceptionVector)
 {
-  int    sigval;
+  int    sigval, stepping;
   int    addr, length, i;
   unsigned char * ptr;
   unsigned char   buf[16];
@@ -305,15 +306,16 @@ handle_exception(int exceptionVector)
 
   putpacket(remcomOutBuffer);
 
+  stepping = 0;
+
   while (1==1) {
     remcomOutBuffer[0] = 0;
-    getpacket(remcomInBuffer);
+    ptr = getpacket();
     binary = 0;
-    switch (remcomInBuffer[0]) {
+    switch (*ptr++) {
       default: /* Unknown code.  Return an empty reply message. */
        break;
       case 'R':
-       ptr = &remcomInBuffer[1];
        if (hexToInt (&ptr, &addr))
          registers[PC] = addr;
        strcpy(remcomOutBuffer, "OK");
@@ -326,7 +328,6 @@ handle_exception(int exceptionVector)
     case 'M': /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
       /* TRY TO READ '%x,%x:'.  IF SUCCEED, SET PTR = 0 */
       {
-        ptr = &remcomInBuffer[1];
         if (hexToInt(&ptr,&addr))
           if (*(ptr++) == ',')
             if (hexToInt(&ptr,&length))
@@ -348,14 +349,11 @@ handle_exception(int exceptionVector)
         if (ptr)
           {
             strcpy(remcomOutBuffer,"E02");
-            gdb_error("malformed write memory command: %s",
-                      remcomInBuffer);
           }
       }
        break;
       case 'm': /* mAA..AA,LLLL  Read LLLL bytes at address AA..AA */
                /* TRY TO READ %x,%x.  IF SUCCEED, SET PTR = 0 */
-       ptr = &remcomInBuffer[1];
        if (hexToInt(&ptr,&addr))
          if (*(ptr++) == ',')
            if (hexToInt(&ptr,&length))
@@ -371,8 +369,6 @@ handle_exception(int exceptionVector)
        if (ptr)
          {
            strcpy(remcomOutBuffer,"E01");
-           gdb_error("malformed read memory command: %s",
-                       remcomInBuffer);
          }
        break;
       case '?': 
@@ -391,7 +387,6 @@ handle_exception(int exceptionVector)
        {
          int regno;
 
-         ptr = &remcomInBuffer[1];
          if (hexToInt (&ptr, &regno) && *ptr++ == '=')
            if (regno >= 0 && regno < NUMREGS)
              {
@@ -430,21 +425,21 @@ handle_exception(int exceptionVector)
                strcpy (remcomOutBuffer, "OK");
                break;
              }
-         strcpy (remcomOutBuffer, "P01");
+         strcpy (remcomOutBuffer, "E01");
          break;
        }
       case 'G': /* set the value of the CPU registers - return OK */
-       hex2mem(&remcomInBuffer[1], (unsigned char*) registers, NUMREGBYTES, 0);
+       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 */
-       ptr = &remcomInBuffer[1];
        if (hexToInt(&ptr,&addr))
          registers[ PC ] = addr;
        
-       if (remcomInBuffer[0] == 's')   /* single-stepping */
+       if (stepping)   /* single-stepping */
          {
            if (!prepare_to_step(0))    /* set up for single-step */
              {
@@ -486,9 +481,11 @@ handle_exception(int exceptionVector)
            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.
@@ -497,6 +494,31 @@ handle_exception(int exceptionVector)
          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;
@@ -507,9 +529,38 @@ handle_exception(int exceptionVector)
   }
 }
 
+/* qCRC support */
+
+/* Table used by the crc32 function to calcuate 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(ch)
-     unsigned char ch;
+hex (unsigned char ch)
 {
   if ((ch >= 'a') && (ch <= 'f')) return (ch-'a'+10);
   if ((ch >= '0') && (ch <= '9')) return (ch-'0');
@@ -519,72 +570,84 @@ hex(ch)
 
 /* scan for the sequence $<data>#<checksum>     */
 
-static void 
-getpacket(buffer)
-     unsigned char * buffer;
+unsigned char *
+getpacket (void)
 {
+  unsigned char *buffer = &remcomInBuffer[0];
   unsigned char checksum;
   unsigned char xmitcsum;
-  int  i;
-  int  count;
-  unsigned char ch;
+  int count;
+  char ch;
 
-  do {
-    /* wait around for the start character, ignore all other characters */
-    while ((ch = getDebugChar()) != '$');
-    checksum = 0;
-    xmitcsum = -1;
+  while (1)
+    {
+      /* wait around for the start character, ignore all other characters */
+      while ((ch = getDebugChar ()) != '$')
+       ;
 
-    count = 0;
+retry:
+      checksum = 0;
+      xmitcsum = -1;
+      count = 0;
 
-    /* now, read until a # or end of buffer is found */
-    while (count < BUFMAX) {
-      ch = getDebugChar();
-      
-      if (ch == '#' && (count == 0 || buffer[count-1] != 0x7d))
-        break;
+      /* now, read until a # or end of buffer is found */
+      while (count < BUFMAX)
+       {
+         ch = getDebugChar ();
+          if (ch == '$')
+           goto retry;
+         if (ch == '#')
+           break;
+         checksum = checksum + ch;
+         buffer[count] = ch;
+         count = count + 1;
+       }
+      buffer[count] = 0;
 
-      checksum = checksum + ch;
-      buffer[count] = ch;
-      count = count + 1;
-      }
-    buffer[count] = 0;
-
-    if (ch == '#') {
-      xmitcsum = hex(getDebugChar()) << 4;
-      xmitcsum += hex(getDebugChar());
-      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); 
-        }
+      if (ch == '#')
+       {
+         ch = getDebugChar ();
+         xmitcsum = hex (ch) << 4;
+         ch = getDebugChar ();
+         xmitcsum += hex (ch);
 
-        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] );
-         /* remove sequence chars from buffer */
-         count = strlen(buffer);
-         for (i=3; i <= count; i++) buffer[i-3] = buffer[i];
+         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];
+           }
        }
-      }
     }
-  } while (checksum != xmitcsum);
 }
 
 /* send the packet in buffer.  */
 
 static void 
-putpacket(buffer)
-     unsigned char *buffer;
+putpacket (unsigned char *buffer)
 {
   unsigned char checksum;
   int  count;
@@ -612,7 +675,7 @@ putpacket(buffer)
 static void (*volatile mem_fault_routine)() = 0;
 
 static void
-set_mem_err ()
+set_mem_err (void)
 {
   mem_err = 1;
 }
@@ -623,8 +686,7 @@ set_mem_err ()
    whether there's anything connected to the expansion bus. */
 
 static int
-mem_safe (addr)
-     unsigned char *addr;
+mem_safe (unsigned char *addr)
 {
 #define BAD_RANGE_ONE_START    ((unsigned char *) 0x600000)
 #define BAD_RANGE_ONE_END      ((unsigned char *) 0xa00000)
@@ -642,8 +704,7 @@ mem_safe (addr)
    to mem_fault, they won't get restored, so there better not be any
    saved).  */
 static int
-get_char (addr)
-     unsigned char *addr;
+get_char (unsigned char *addr)
 {
 #if 1
   if (mem_fault_routine && !mem_safe(addr))
@@ -656,9 +717,7 @@ get_char (addr)
 }
 
 static void
-set_char (addr, val)
-     unsigned char *addr;
-     unsigned char val;
+set_char (unsigned char *addr, unsigned char val)
 {
 #if 1
   if (mem_fault_routine && !mem_safe (addr))
@@ -676,11 +735,7 @@ set_char (addr, val)
    a fault; if zero treat a fault like any other fault in the stub.  */
 
 static unsigned char *
-mem2hex(mem, buf, count, may_fault)
-     unsigned char* mem;
-     unsigned char* buf;
-     int   count;
-     int   may_fault;
+mem2hex (unsigned char *mem, unsigned char *buf, int count, int may_fault)
 {
   int i;
   unsigned char ch;
@@ -704,11 +759,7 @@ mem2hex(mem, buf, count, may_fault)
    Return a pointer to the character AFTER the last byte written. */
 
 static unsigned char* 
-hex2mem(buf, mem, count, may_fault)
-     unsigned char* buf;
-     unsigned char* mem;
-     int   count;
-     int   may_fault;
+hex2mem (unsigned char *buf, unsigned char *mem, int count, int may_fault)
 {
   int i;
   unsigned char ch;
@@ -733,11 +784,7 @@ hex2mem(buf, mem, count, may_fault)
    COUNT is the total number of bytes to write into
    memory. */
 static unsigned char *
-bin2mem (buf, mem, count, may_fault)
-     unsigned char *buf;
-     unsigned char *mem;
-     int   count;
-     int   may_fault;
+bin2mem (unsigned char *buf, unsigned char *mem, int count, int may_fault)
 {
   int i;
   unsigned char ch;
@@ -756,7 +803,7 @@ bin2mem (buf, mem, count, may_fault)
             case 0x4:  /* $ */
             case 0x5d: /* escape char */
               buf++;
-              *buf += 0x20;
+              *buf |= 0x20;
               break;
             default:
               /* nothing */
@@ -779,8 +826,7 @@ bin2mem (buf, mem, count, may_fault)
    translate this number into a unix compatible signal value */
 
 static int 
-computeSignal(exceptionVector)
-     int exceptionVector;
+computeSignal (int exceptionVector)
 {
   int sigval;
   switch (exceptionVector) {
@@ -812,9 +858,7 @@ computeSignal(exceptionVector)
 /* RETURN NUMBER OF CHARS PROCESSED           */
 /**********************************************/
 static int 
-hexToInt(ptr, intValue)
-     unsigned char **ptr;
-     int *intValue;
+hexToInt (unsigned char **ptr, int *intValue)
 {
   int numChars = 0;
   int hexValue;
@@ -860,8 +904,7 @@ hexToInt(ptr, intValue)
   */
 
 static int 
-isShortBranch(instr)
-     unsigned char *instr;
+isShortBranch (unsigned char *instr)
 {
   unsigned char instr0 = instr[0] & 0x7F;              /* mask off high bit */
 
@@ -880,8 +923,7 @@ isShortBranch(instr)
 }
 
 static int
-isLongBranch(instr)
-     unsigned char *instr;
+isLongBranch (unsigned char *instr)
 {
   if (instr[0] == 0xFC || instr[0] == 0xFD ||  /* BRA, BNC, BL, BC */
       instr[0] == 0xFE || instr[0] == 0xFF)    /* 24 bit relative */
@@ -907,8 +949,7 @@ isLongBranch(instr)
     ((((int) addr & 2) || (((unsigned char *) addr)[0] & 0x80) == 0) ? 2 : 4)
 
 static int
-isBranch(instr)
-     unsigned char *instr;
+isBranch (unsigned char *instr)
 {
   if (INSTRUCTION_SIZE(instr) == 2)
     return isShortBranch(instr);
@@ -917,8 +958,7 @@ isBranch(instr)
 }
 
 static int
-willBranch(instr, branchCode)
-     unsigned char *instr;
+willBranch (unsigned char *instr, int branchCode)
 {
   switch (branchCode) 
     {
@@ -973,8 +1013,7 @@ willBranch(instr, branchCode)
 }
 
 static int 
-branchDestination(instr, branchCode) 
-     unsigned char *instr;
+branchDestination (unsigned char *instr, int branchCode)
 { 
   switch (branchCode) { 
   default: 
@@ -985,13 +1024,13 @@ branchDestination(instr, branchCode)
   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) + ((unsigned char) instr[1] << 2);
+    return (((int) instr) & ~3) + ((char) instr[1] << 2);
   case 4:              /* BC, BNC, BL, BRA (long, 24-bit relative offset) */ 
     return ((int) instr + 
-           ((((unsigned char) instr[1] << 16) | (instr[2] << 8) | (instr[3])) << 2)); 
+           ((((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 + ((((unsigned char) instr[2] << 8) | (instr[3])) << 2)); 
+    return ((int) instr + ((((char) instr[2] << 8) | (instr[3])) << 2)); 
   }
 
   /* An explanatory note: in the last three return expressions, I have
@@ -1005,9 +1044,7 @@ branchDestination(instr, branchCode)
 }
 
 static void
-branchSideEffects(instr, branchCode)
-     unsigned char *instr;
-     int branchCode;
+branchSideEffects (unsigned char *instr, int branchCode)
 {
   switch (branchCode)
     {
@@ -1117,7 +1154,7 @@ prepare_to_step(continue_p)
            just "continue continuing".  */
 
 static int
-finish_from_step()
+finish_from_step (void)
 {
   if (stepping.stepping)       /* anything to do? */
     {
@@ -1208,7 +1245,7 @@ stash_registers:
    but doing stash_registers in C isn't straightforward.  */
 
 static void
-cleanup_stash ()
+cleanup_stash (void)
 {
   psw = (struct PSWreg *) &registers[PSW];     /* fields of PSW register */
   psw->sm = psw->bsm;          /* fix up pre-trap values of psw fields */
@@ -1276,8 +1313,7 @@ restore_and_return:
    NUM is the trap/exception number.  */
 
 static void
-process_exception (num)
-     int num;
+process_exception (int num)
 {
   cleanup_stash ();
   asm volatile ("
@@ -1484,7 +1520,7 @@ _catchException17:
 /* this function is used to set up exception handlers for tracing and
    breakpoints */
 void 
-set_debug_traps()
+set_debug_traps (void)
 {
   /*  extern void remcomHandler(); */
   int i;
@@ -1514,10 +1550,6 @@ set_debug_traps()
   exceptionHandler (16, _catchException16);
   /*  exceptionHandler (17, _catchException17); */
 
-  /* In case GDB is started before us, ack any packets (presumably
-     "$?#xx") sitting there.  */
-  putDebugChar ('+');
-
   initialized = 1;
 }
 
@@ -1529,7 +1561,7 @@ set_debug_traps()
 #define BREAKPOINT() asm volatile ("   trap #2");
 
 void 
-breakpoint()
+breakpoint (void)
 {
   if (initialized)
     BREAKPOINT();
@@ -1548,8 +1580,7 @@ breakpoint()
    Returns: the char */
  
 static int
-gdb_putchar(ch)
-     int ch;
+gdb_putchar (int ch)
 {
   char buf[4];
  
@@ -1566,9 +1597,7 @@ gdb_putchar(ch)
    Returns: number of bytes written */
  
 static int
-gdb_write(data, len)
-     char *data;
-     int len;
+gdb_write (char *data, int len)
 {
   char *buf, *cpy;
   int i;
@@ -1596,8 +1625,7 @@ gdb_write(data, len)
    Returns: the length of the string */
  
 static int
-gdb_puts(str)
-     char *str;
+gdb_puts (char *str)
 {
   return gdb_write(str, strlen(str));
 }
@@ -1608,9 +1636,7 @@ gdb_puts(str)
    will cause the optional second string to be inserted.  */
  
 static void
-gdb_error(format, parm)
-     char * format;
-     char * parm;
+gdb_error (char *format, char *parm)
 {
   char buf[400], *cpy;
   int len;