* remote.c (remote_write_bytes): Chop up large transfers.
authorSteve Chamberlain <sac@cygnus>
Tue, 15 Aug 1995 14:53:24 +0000 (14:53 +0000)
committerSteve Chamberlain <sac@cygnus>
Tue, 15 Aug 1995 14:53:24 +0000 (14:53 +0000)
gdb/ChangeLog
gdb/remote.c

index 59b13bbf16ab6b2d4ab695247a11e0923814d69c..c5fef4ed723517aead3fbed62764460270c580d7 100644 (file)
@@ -1,3 +1,7 @@
+Tue Aug 15 07:51:21 1995  steve chamberlain  <sac@slash.cygnus.com>
+
+       * remote.c (remote_write_bytes): Chop up large transfers.
+
 Mon Aug 14 17:56:36 1995  Stan Shebs  <shebs@andros.cygnus.com>
 
        * gcc.patch: Remove, relevant only to long-ago versions of GCC.
index afd1a28c046aa73e346c27131c5a9eab7a3a1bcf..c33578437e2976f00e4255d432c30335687c1bdb 100644 (file)
@@ -135,8 +135,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
                                        running and the debugger should
                                        continue to wait for 'W', 'T', etc.
 
-       or...           Otext           Send text to stdout.
-
        thread alive    TXX             Find out if the thread XX is alive.
        reply           OK              thread is still alive
                        ENN             thread is dead
@@ -594,7 +592,7 @@ fromhex (a)
     return a - '0';
   else if (a >= 'a' && a <= 'f')
     return a - 'a' + 10;
-  else
+  else 
     error ("Reply contains invalid hex digit %d", a);
 }
 
@@ -1054,33 +1052,45 @@ remote_write_bytes (memaddr, myaddr, len)
   char buf[PBUFSIZ];
   int i;
   char *p;
+  int done;
+  /* Chop the transfer down if necessary */
 
-  /* FIXME-32x64: Need a version of print_address_numeric which puts the
-     result in a buffer like sprintf.  */
-  sprintf (buf, "M%lx,%x:", (unsigned long) memaddr, len);
+  done = 0;
+  while (done < len)
+    {
+      int todo = len - done;
+      int cando = PBUFSIZ /2 - 32; /* number of bytes that will fit. */
+      if (todo > cando)
+       todo = cando;
 
-  /* We send target system values byte by byte, in increasing byte addresses,
-     each byte encoded as two hex characters.  */
+      /* FIXME-32x64: Need a version of print_address_numeric which puts the
+        result in a buffer like sprintf.  */
+      sprintf (buf, "M%lx,%x:", (unsigned long) memaddr + done, todo);
 
-  p = buf + strlen (buf);
-  for (i = 0; i < len; i++)
-    {
-      *p++ = tohex ((myaddr[i] >> 4) & 0xf);
-      *p++ = tohex (myaddr[i] & 0xf);
-    }
-  *p = '\0';
+      /* We send target system values byte by byte, in increasing byte addresses,
+        each byte encoded as two hex characters.  */
 
-  putpkt (buf);
-  getpkt (buf, 0);
+      p = buf + strlen (buf);
+      for (i = 0; i < todo; i++)
+       {
+         *p++ = tohex ((myaddr[i + done] >> 4) & 0xf);
+         *p++ = tohex (myaddr[i + done] & 0xf);
+       }
+      *p = '\0';
 
-  if (buf[0] == 'E')
-    {
-      /* There is no correspondance between what the remote protocol uses
-        for errors and errno codes.  We would like a cleaner way of
-        representing errors (big enough to include errno codes, bfd_error
-        codes, and others).  But for now just return EIO.  */
-      errno = EIO;
-      return 0;
+      putpkt (buf);
+      getpkt (buf, 0);
+
+      if (buf[0] == 'E')
+       {
+         /* There is no correspondance between what the remote protocol uses
+            for errors and errno codes.  We would like a cleaner way of
+            representing errors (big enough to include errno codes, bfd_error
+            codes, and others).  But for now just return EIO.  */
+         errno = EIO;
+         return 0;
+       }
+      done += todo;
     }
   return len;
 }