#include "gdb-stabs.h"
#include "dcache.h"
+#include "remote-utils.h"
#if !defined(DONT_USE_REMOTE)
#ifdef USG
if (!remote_desc)
perror_with_name (name);
- if (baud_rate)
+ if (SERIAL_SETBAUDRATE (remote_desc, sr_get_baud_rate()))
{
- int rate;
-
- if (sscanf (baud_rate, "%d", &rate) == 1)
- if (SERIAL_SETBAUDRATE (remote_desc, rate))
- {
- SERIAL_CLOSE (remote_desc);
- perror_with_name (name);
- }
+ SERIAL_CLOSE (remote_desc);
+ perror_with_name (name);
}
SERIAL_RAW (remote_desc);
+ /* If there is something sitting in the buffer we might take it as a
+ response to a command, which would be bad. */
+ SERIAL_FLUSH_INPUT (remote_desc);
+
if (from_tty)
{
puts_filtered ("Remote debugging using ");
/* If this doesn't work, try more severe steps. */
signal (signo, remote_interrupt_twice);
- if (remote_debug)
+ if (sr_get_debug ())
printf ("remote_interrupt called\n");
SERIAL_WRITE (remote_desc, "\003", 1); /* Send a ^C */
{
struct section_offsets *offs;
+ /* FIXME: This code assumes gdb-stabs.h is being used;
+ it's broken for xcoff, dwarf, sdb-coff, etc. But
+ there is no simple canonical representation for this
+ stuff. (Just what does "text" as seen by the stub
+ mean, anyway?). */
+
/* FIXME: Why don't the various symfile_offsets routines
- in the sym_fns vectors set this? */
+ in the sym_fns vectors set this?
+ (no good reason -kingdon). */
if (symfile_objfile->num_sections == 0)
symfile_objfile->num_sections = SECT_OFF_MAX;
return 0;
}
+/* Number of bytes of registers this stub implements. */
+static int register_bytes_found;
+
/* Read the remote registers into the block REGS. */
/* Currently we just read all the registers, so we don't use regno. */
/* ARGSUSED */
sprintf (buf, "g");
remote_send (buf);
+ /* Unimplemented registers read as all bits zero. */
+ memset (regs, 0, REGISTER_BYTES);
+
/* Reply describes registers byte by byte, each byte encoded as two
hex characters. Suck them all up, then supply them to the
register cacheing/storage mechanism. */
p = buf;
for (i = 0; i < REGISTER_BYTES; i++)
{
- if (p[0] == 0 || p[1] == 0)
- error ("Remote reply is too short: %s", buf);
+ if (p[0] == 0)
+ break;
+ if (p[1] == 0)
+ {
+ warning ("Remote reply is of odd length: %s", buf);
+ /* Don't change register_bytes_found in this case, and don't
+ print a second warning. */
+ goto supply_them;
+ }
regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]);
p += 2;
}
+
+ if (i != register_bytes_found)
+ {
+ register_bytes_found = i;
+#ifdef REGISTER_BYTES_OK
+ if (!REGISTER_BYTES_OK (i))
+ warning ("Remote reply is too short: %s", buf);
+#endif
+ }
+
+ supply_them:
for (i = 0; i < NUM_REGS; i++)
supply_register (i, ®s[REGISTER_BYTE(i)]);
}
each byte encoded as two hex characters. */
p = buf + 1;
- for (i = 0; i < REGISTER_BYTES; i++)
+ /* remote_prepare_to_store insures that register_bytes_found gets set. */
+ for (i = 0; i < register_bytes_found; i++)
{
*p++ = tohex ((registers[i] >> 4) & 0xf);
*p++ = tohex (registers[i] & 0xf);
while (1)
{
- if (remote_debug)
+ if (sr_get_debug ())
{
*p = '\0';
printf ("Sending packet: %s...", buf2); fflush(stdout);
switch (ch)
{
case '+':
- if (remote_debug)
+ if (sr_get_debug ())
printf("Ack\n");
return;
case SERIAL_TIMEOUT:
case SERIAL_EOF:
error ("putpkt: EOF while trying to read ACK");
default:
- if (remote_debug)
+ if (sr_get_debug ())
printf ("%02X %c ", ch&0xFF, ch);
continue;
}
if (forever)
continue;
if (++retries >= MAX_RETRIES)
- if (remote_debug) puts_filtered ("Timed out.\n");
+ if (sr_get_debug ()) puts_filtered ("Timed out.\n");
goto out;
}
c = readchar ();
if (c == SERIAL_TIMEOUT)
{
- if (remote_debug)
+ if (sr_get_debug ())
puts_filtered ("Timeout in mid-packet, retrying\n");
goto whole; /* Start a new packet, count retries */
}
if (c == '$')
{
- if (remote_debug)
+ if (sr_get_debug ())
puts_filtered ("Saw new packet start in middle of old one\n");
goto whole; /* Start a new packet, count retries */
}
SERIAL_WRITE (remote_desc, "+", 1);
- if (remote_debug)
+ if (sr_get_debug ())
fprintf (stderr,"Packet received: %s\n", buf);
}
\f