* remote.c (remote_write_bytes): Chop up large transfers.

This commit is contained in:
Steve Chamberlain 1995-08-15 14:53:24 +00:00
parent 8513c9536d
commit ec10503a73
2 changed files with 40 additions and 26 deletions

View 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> Mon Aug 14 17:56:36 1995 Stan Shebs <shebs@andros.cygnus.com>
* gcc.patch: Remove, relevant only to long-ago versions of GCC. * gcc.patch: Remove, relevant only to long-ago versions of GCC.

View File

@ -135,8 +135,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
running and the debugger should running and the debugger should
continue to wait for 'W', 'T', etc. continue to wait for 'W', 'T', etc.
or... Otext Send text to stdout.
thread alive TXX Find out if the thread XX is alive. thread alive TXX Find out if the thread XX is alive.
reply OK thread is still alive reply OK thread is still alive
ENN thread is dead ENN thread is dead
@ -594,7 +592,7 @@ fromhex (a)
return a - '0'; return a - '0';
else if (a >= 'a' && a <= 'f') else if (a >= 'a' && a <= 'f')
return a - 'a' + 10; return a - 'a' + 10;
else else
error ("Reply contains invalid hex digit %d", a); error ("Reply contains invalid hex digit %d", a);
} }
@ -1054,33 +1052,45 @@ remote_write_bytes (memaddr, myaddr, len)
char buf[PBUFSIZ]; char buf[PBUFSIZ];
int i; int i;
char *p; char *p;
int done;
/* Chop the transfer down if necessary */
/* FIXME-32x64: Need a version of print_address_numeric which puts the done = 0;
result in a buffer like sprintf. */ while (done < len)
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++)
{ {
*p++ = tohex ((myaddr[i] >> 4) & 0xf); int todo = len - done;
*p++ = tohex (myaddr[i] & 0xf); int cando = PBUFSIZ /2 - 32; /* number of bytes that will fit. */
} if (todo > cando)
*p = '\0'; todo = cando;
putpkt (buf); /* FIXME-32x64: Need a version of print_address_numeric which puts the
getpkt (buf, 0); result in a buffer like sprintf. */
sprintf (buf, "M%lx,%x:", (unsigned long) memaddr + done, todo);
if (buf[0] == 'E') /* We send target system values byte by byte, in increasing byte addresses,
{ each byte encoded as two hex characters. */
/* There is no correspondance between what the remote protocol uses
for errors and errno codes. We would like a cleaner way of p = buf + strlen (buf);
representing errors (big enough to include errno codes, bfd_error for (i = 0; i < todo; i++)
codes, and others). But for now just return EIO. */ {
errno = EIO; *p++ = tohex ((myaddr[i + done] >> 4) & 0xf);
return 0; *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; return len;
} }