diff options
Diffstat (limited to 'gdb/remote.c')
-rw-r--r-- | gdb/remote.c | 72 |
1 files changed, 41 insertions, 31 deletions
diff --git a/gdb/remote.c b/gdb/remote.c index c335784..d9183ad 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -1,5 +1,5 @@ /* Remote target communications for serial-line targets in custom GDB protocol - Copyright 1988, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. + Copyright 1988, 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. This file is part of GDB. @@ -182,7 +182,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "symfile.h" #include "target.h" #include "wait.h" -#include "terminal.h" +/*#include "terminal.h"*/ #include "gdbcmd.h" #include "objfiles.h" #include "gdb-stabs.h" @@ -741,7 +741,6 @@ remote_wait (pid, status) { unsigned char *p1; char *p_temp; - unsigned LONGEST val; regno = strtol ((const char *) p, &p_temp, 16); /* Read the register number */ p1 = (unsigned char *)p_temp; @@ -773,16 +772,13 @@ Packet: '%s'\n", Packet: '%s'\n", regno, p, buf); - val = 0L; for (i = 0; i < REGISTER_RAW_SIZE (regno); i++) { if (p[0] == 0 || p[1] == 0) warning ("Remote reply is too short: %s", buf); - val = val * 256 + fromhex (p[0]) * 16 + fromhex (p[1]); + regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]); p += 2; - } - store_unsigned_integer (regs, REGISTER_RAW_SIZE (regno), val); supply_register (regno, regs); } @@ -1112,40 +1108,54 @@ remote_read_bytes (memaddr, myaddr, len) char buf[PBUFSIZ]; int i; char *p; + int done; + /* Chop transfer down if neccessary */ +#if 0 + /* FIXME: This is wrong for larger packets */ if (len > PBUFSIZ / 2 - 1) abort (); +#endif + 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; - /* 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); - 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, todo); + 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; - } + 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; + } /* Reply describes memory byte by byte, each byte encoded as two hex characters. */ - p = buf; - for (i = 0; i < len; i++) - { - if (p[0] == 0 || p[1] == 0) - /* Reply is short. This means that we were able to read only part - of what we wanted to. */ - break; - myaddr[i] = fromhex (p[0]) * 16 + fromhex (p[1]); - p += 2; + p = buf; + for (i = 0; i < todo; i++) + { + if (p[0] == 0 || p[1] == 0) + /* Reply is short. This means that we were able to read only part + of what we wanted to. */ + break; + myaddr[i + done] = fromhex (p[0]) * 16 + fromhex (p[1]); + p += 2; + } + done += todo; } - return i; + return len; } /* Read or write LEN bytes from inferior memory at MEMADDR, transferring |