From ec10503a7307fe3a69ed753951a5d7e5487352bb Mon Sep 17 00:00:00 2001 From: Steve Chamberlain Date: Tue, 15 Aug 1995 14:53:24 +0000 Subject: [PATCH] * remote.c (remote_write_bytes): Chop up large transfers. --- gdb/ChangeLog | 4 ++++ gdb/remote.c | 62 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 59b13bbf16..c5fef4ed72 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +Tue Aug 15 07:51:21 1995 steve chamberlain + + * remote.c (remote_write_bytes): Chop up large transfers. + Mon Aug 14 17:56:36 1995 Stan Shebs * gcc.patch: Remove, relevant only to long-ago versions of GCC. diff --git a/gdb/remote.c b/gdb/remote.c index afd1a28c04..c33578437e 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -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); - - /* We send target system values byte by byte, in increasing byte addresses, - each byte encoded as two hex characters. */ - - p = buf + strlen (buf); - for (i = 0; i < len; i++) + done = 0; + while (done < len) { - *p++ = tohex ((myaddr[i] >> 4) & 0xf); - *p++ = tohex (myaddr[i] & 0xf); - } - *p = '\0'; + int todo = len - done; + int cando = PBUFSIZ /2 - 32; /* number of bytes that will fit. */ + if (todo > cando) + todo = cando; - putpkt (buf); - getpkt (buf, 0); + /* 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); - 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; + /* We send target system values byte by byte, in increasing byte addresses, + each byte encoded as two hex characters. */ + + 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'; + + 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; }