use remote-utils facilities for baud_rate
[deliverable/binutils-gdb.git] / gdb / remote-mips.c
index 2dc6dd22317eab0b9adf751216132ae7cf4fb422..91d846df5fc739209ecfeecf70455cbb28fcf34f 100644 (file)
@@ -21,8 +21,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include "defs.h"
 #include "inferior.h"
-#include "symfile.h"
 #include "bfd.h"
+#include "symfile.h"
 #include "wait.h"
 #include "gdbcmd.h"
 #include "gdbcore.h"
@@ -71,7 +71,7 @@ static void
 mips_detach PARAMS ((char *args, int from_tty));
 
 static void
-mips_resume PARAMS ((int step, int siggnal));
+mips_resume PARAMS ((int pid, int step, int siggnal));
 
 static int
 mips_wait PARAMS ((WAITTYPE *status));
@@ -276,9 +276,6 @@ static int mips_receive_wait = 5;
    a reply.  */
 static int mips_need_reply = 0;
 
-/* This can be set to get debugging with ``set remotedebug''.  */
-static int mips_debug = 0;
-
 /* Handle used to access serial I/O stream.  */
 static serial_t mips_desc;
 
@@ -309,7 +306,7 @@ mips_readchar (timeout)
     error ("End of file from remote");
   if (ch == SERIAL_ERROR)
     error ("Error reading from remote: %s", safe_strerror (errno));
-  if (mips_debug > 1)
+  if (remote_debug > 1)
     {
       if (ch != SERIAL_TIMEOUT)
        printf_filtered ("Read '%c' %d 0x%x\n", ch, ch, ch);
@@ -326,7 +323,7 @@ mips_readchar (timeout)
       && state == 5
       && ! mips_initializing)
     {
-      if (mips_debug > 0)
+      if (remote_debug > 0)
        printf_filtered ("Reinitializing MIPS debugging mode\n");
       SERIAL_WRITE (mips_desc, "\rdb tty0\r", sizeof "\rdb tty0\r" - 1);
       sleep (1);
@@ -378,7 +375,7 @@ mips_receive_header (hdr, pgarbage, ch, timeout)
                 what the program is outputting, if the debugging is
                 being done on the console port.  FIXME: Perhaps this
                 should be filtered?  */
-             if (! mips_initializing || mips_debug > 0)
+             if (! mips_initializing || remote_debug > 0)
                {
                  putchar (ch);
                  fflush (stdout);
@@ -513,7 +510,7 @@ mips_send_packet (s, get_ack)
       int garbage;
       int ch;
 
-      if (mips_debug > 0)
+      if (remote_debug > 0)
        {
          packet[HDR_LENGTH + len + TRLR_LENGTH] = '\0';
          printf_filtered ("Writing \"%s\"\n", packet + 1);
@@ -569,12 +566,12 @@ mips_send_packet (s, get_ack)
              != TRLR_GET_CKSUM (trlr))
            continue;
 
-         if (mips_debug > 0)
+         if (remote_debug > 0)
            {
              hdr[HDR_LENGTH] = '\0';
              trlr[TRLR_LENGTH] = '\0';
              printf_filtered ("Got ack %d \"%s%s\"\n",
-                              HDR_GET_SEQ (hdr), hdr, trlr);
+                              HDR_GET_SEQ (hdr), hdr + 1, trlr);
            }
 
          /* If this ack is for the current packet, we're done.  */
@@ -630,7 +627,7 @@ mips_receive_packet (buff)
       /* An acknowledgement is probably a duplicate; ignore it.  */
       if (! HDR_IS_DATA (hdr))
        {
-         if (mips_debug > 0)
+         if (remote_debug > 0)
            printf_filtered ("Ignoring unexpected ACK\n");
          continue;
        }
@@ -638,7 +635,7 @@ mips_receive_packet (buff)
       /* If this is the wrong sequence number, ignore it.  */
       if (HDR_GET_SEQ (hdr) != mips_receive_seq)
        {
-         if (mips_debug > 0)
+         if (remote_debug > 0)
            printf_filtered ("Ignoring sequence number %d (want %d)\n",
                             HDR_GET_SEQ (hdr), mips_receive_seq);
          continue;
@@ -663,7 +660,7 @@ mips_receive_packet (buff)
 
       if (i < len)
        {
-         if (mips_debug > 0)
+         if (remote_debug > 0)
            printf_filtered ("Got new SYN after %d chars (wanted %d)\n",
                             i, len);
          continue;
@@ -674,7 +671,7 @@ mips_receive_packet (buff)
        error ("Timed out waiting for packet");
       if (err == -2)
        {
-         if (mips_debug > 0)
+         if (remote_debug > 0)
            printf_filtered ("Got SYN when wanted trailer\n");
          continue;
        }
@@ -682,7 +679,7 @@ mips_receive_packet (buff)
       if (mips_cksum (hdr, buff, len) == TRLR_GET_CKSUM (trlr))
        break;
 
-      if (mips_debug > 0)
+      if (remote_debug > 0)
        printf_filtered ("Bad checksum; data %d, trailer %d\n",
                         mips_cksum (hdr, buff, len),
                         TRLR_GET_CKSUM (trlr));
@@ -700,7 +697,7 @@ mips_receive_packet (buff)
       ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
       ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
 
-      if (mips_debug > 0)
+      if (remote_debug > 0)
        {
          ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
          printf_filtered ("Writing ack %d \"%s\"\n", mips_receive_seq,
@@ -711,7 +708,7 @@ mips_receive_packet (buff)
        error ("write to target failed: %s", safe_strerror (errno));
     }
 
-  if (mips_debug > 0)
+  if (remote_debug > 0)
     {
       buff[len] = '\0';
       printf_filtered ("Got packet \"%s\"\n", buff);
@@ -731,7 +728,7 @@ mips_receive_packet (buff)
   ack[HDR_LENGTH + TRLR_INDX_CSUM2] = TRLR_SET_CSUM2 (cksum);
   ack[HDR_LENGTH + TRLR_INDX_CSUM3] = TRLR_SET_CSUM3 (cksum);
 
-  if (mips_debug > 0)
+  if (remote_debug > 0)
     {
       ack[HDR_LENGTH + TRLR_LENGTH] = '\0';
       printf_filtered ("Writing ack %d \"%s\"\n", mips_receive_seq,
@@ -805,7 +802,6 @@ mips_request (cmd, addr, data, perr)
 
   if (sscanf (buff, "0x%x %c 0x%x 0x%x",
              &rpid, &rcmd, &rerrflg, &rresponse) != 4
-      || rpid != 0
       || (cmd != '\0' && rcmd != cmd))
     error ("Bad response from remote board");
 
@@ -856,7 +852,9 @@ mips_initialize ()
   mips_receive_wait = 3;
 
   tries = 0;
-  while (catch_errors (mips_receive_packet, buff, (char *) NULL) == 0)
+  while (catch_errors (mips_receive_packet, buff, (char *) NULL,
+                      RETURN_MASK_ALL)
+        == 0)
     {
       char cc;
 
@@ -956,8 +954,8 @@ mips_detach (args, from_tty)
    from the board.  */
 
 static void
-mips_resume (step, siggnal)
-     int step, siggnal;
+mips_resume (pid, step, siggnal)
+     int pid, step, siggnal;
 {
   if (siggnal)
     error ("Can't send signals to a remote system.  Try `handle %d ignore'.",
@@ -1060,10 +1058,14 @@ mips_fetch_registers (regno)
   if (err)
     error ("Can't read register %d: %s", regno, safe_strerror (errno));
 
-  /* We got the number the register holds, but gdb expects to see a
-     value in the target byte ordering.  */
-  SWAP_TARGET_AND_HOST (val, sizeof (REGISTER_TYPE));
-  supply_register (regno, (char *) &val);
+  {
+    char buf[MAX_REGISTER_RAW_SIZE];
+
+    /* We got the number the register holds, but gdb expects to see a
+       value in the target byte ordering.  */
+    store_unsigned_integer (buf, REGISTER_RAW_SIZE (regno), val);
+    supply_register (regno, buf);
+  }
 }
 
 /* Prepare to store registers.  The MIPS protocol can store individual
@@ -1156,7 +1158,7 @@ mips_xfer_memory (memaddr, myaddr, len, write, ignore)
   /* Round ending address up; get number of longwords that makes.  */
   register int count = (((memaddr + len) - addr) + 3) / 4;
   /* Allocate buffer of that many longwords.  */
-  register unsigned int *buffer = (unsigned int *) alloca (count * 4);
+  register char *buffer = alloca (count * 4);
 
   if (write)
     {
@@ -1164,14 +1166,15 @@ mips_xfer_memory (memaddr, myaddr, len, write, ignore)
       if (addr != memaddr || len < 4)
        {
          /* Need part of initial word -- fetch it.  */
-         buffer[0] = mips_fetch_word (addr);
-         SWAP_TARGET_AND_HOST (buffer, 4);
+         store_unsigned_integer (&buffer[0], 4, mips_fetch_word (addr));
        }
 
-      if (count > 1)           /* FIXME, avoid if even boundary */
+      if (count > 1)
        {
-         buffer[count - 1] = mips_fetch_word (addr + (count - 1) * 4);
-         SWAP_TARGET_AND_HOST (buffer + (count - 1) * 4, 4);
+         /* Need part of last word -- fetch it.  FIXME: we do this even
+            if we don't need it.  */
+         store_unsigned_integer (&buffer[(count - 1) * 4], 4,
+                                 mips_fetch_word (addr + (count - 1) * 4));
        }
 
       /* Copy data to be written over corresponding part of buffer */
@@ -1182,8 +1185,8 @@ mips_xfer_memory (memaddr, myaddr, len, write, ignore)
 
       for (i = 0; i < count; i++, addr += 4)
        {
-         SWAP_TARGET_AND_HOST (buffer + i, 4);
-         mips_store_word (addr, buffer[i]);
+         mips_store_word (addr, extract_unsigned_integer (&buffer[i*4], 4));
+         /* FIXME: Do we want a QUIT here?  */
        }
     }
   else
@@ -1191,13 +1194,12 @@ mips_xfer_memory (memaddr, myaddr, len, write, ignore)
       /* Read all the longwords */
       for (i = 0; i < count; i++, addr += 4)
        {
-         buffer[i] = mips_fetch_word (addr);
-         SWAP_TARGET_AND_HOST (buffer + i, 4);
+         store_unsigned_integer (&buffer[i*4], 4, mips_fetch_word (addr));
          QUIT;
        }
 
       /* Copy appropriate bytes out of the buffer.  */
-      memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
+      memcpy (myaddr, buffer + (memaddr & 3), len);
     }
   return len;
 }
@@ -1318,9 +1320,17 @@ _initialize_remote_mips ()
   add_target (&mips_ops);
 
   add_show_from_set (
-    add_set_cmd ("remotedebug", no_class, var_zinteger, (char *) &mips_debug,
-                  "Set debugging of remote MIPS serial I/O.\n\
-When non-zero, each packet sent or received with the remote target\n\
-is displayed.  Higher numbers produce more debugging.", &setlist),
+    add_set_cmd ("timeout", no_class, var_zinteger,
+                (char *) &mips_receive_wait,
+                "Set timeout in seconds for remote MIPS serial I/O.",
+                &setlist),
+       &showlist);
+
+  add_show_from_set (
+    add_set_cmd ("retransmit-timeout", no_class, var_zinteger,
+                (char *) &mips_retransmit_wait,
+        "Set retransmit timeout in seconds for remote MIPS serial I/O.\n\
+This is the number of seconds to wait for an acknowledgement to a packet\n\
+before resending the packet.", &setlist),
        &showlist);
 }
This page took 0.027296 seconds and 4 git commands to generate.