rms@WHEATIES.AI.MIT.EDU (Richard Stallman) (02/11/89)
Return-Path: <somewhere!brad@cayman.cayman.com>
Date: Fri, 10 Feb 89 08:25:42 EST
From: brad%cayman@harvard.harvard.edu (Brad Parker)
To: bug-gcc@prep.ai.mit.edu
Subject: gdb 3.x / some diffs to remote.c
I started using the gdb 3.0 "remote" option with a 9600 baud serial line
to a target (the GatorBox). I found some simple bugs - this is so obscure that
no one may use this, but I do! These patches fix a retry checksum bug and
cause the packet code to retry which makes it more robust.
I added the simple fixes from the gdb 3.1 patches.
I also have the "nub" which runs in the remote system. If any one would like
a copy, let me know.
-brad
Brad Parker
Cayman Systems, Inc.
brad@cayman.com
---- cut here ----
*** remote.c.orig Fri Feb 10 08:03:54 1989
--- remote.c Fri Feb 10 08:21:11 1989
***************
*** 94,100 ****
#define TERMINAL struct sgttyb
#endif
! int kiodebug;
int icache;
--- 94,101 ----
#define TERMINAL struct sgttyb
#endif
! static int kiodebug = 0;
! static int timeout = 5;
int icache;
***************
*** 101,107 ****
/* Descriptor for I/O to remote machine. */
int remote_desc;
! #define PBUFSIZ 300
static void remote_send ();
static void putpkt ();
--- 102,108 ----
/* Descriptor for I/O to remote machine. */
int remote_desc;
! #define PBUFSIZ 400
static void remote_send ();
static void putpkt ();
***************
*** 109,114 ****
--- 110,126 ----
static void dcache_flush ();
+ /* called when SIGALRM signal sent due to alarm() timeout */
+
+ void
+ remote_timer()
+ {
+ if (kiodebug)
+ printf("[remote_timer]\n");
+
+ alarm(timeout);
+ }
+
/* Open a connection to a remote debugger.
NAME is the filename used for communication. */
***************
*** 137,142 ****
--- 149,162 ----
if (from_tty)
printf ("Remote debugging using %s\n", name);
remote_debugging = 1;
+
+ /* cause SIGALRM's to make reads fail */
+ if (siginterrupt(SIGALRM, 1) != 0)
+ perror("[remote_open] siginterrupt");
+
+ /* set up read timeout timer */
+ if (signal(SIGALRM, remote_timer) == (void (*))-1)
+ perror("[remote_open] signal");
}
/* Convert hex digit A to a number. */
***************
*** 246,251 ****
--- 266,272 ----
*p++ = tohex (regs[i] & 0xf);
}
+ *p = '\0';
remote_send (buf);
}
***************
*** 312,317 ****
--- 333,339 ----
*p++ = tohex (myaddr[i] & 0xf);
}
+ *p = '\0';
remote_send (buf);
}
***************
*** 371,376 ****
--- 393,416 ----
*/
+ static int
+ readchar ()
+ {
+ char buf[1];
+
+ buf[0] = '\0';
+ alarm(timeout);
+ read (remote_desc, buf, 1);
+ alarm(0);
+
+ /*
+ if (kiodebug > 1)
+ printf("[readchar] got '%c' (0x%x)\n", buf[0] & 0x7f, buf[0] & 0x7f);
+ */
+
+ return buf[0] & 0x7f;
+ }
+
/* Send the command in BUF to the remote machine,
and read the reply into BUF.
Report an error if we get an error reply. */
***************
*** 401,409 ****
int cnt = strlen (buf);
char *p;
- if (kiodebug)
- fprintf (stderr, "Sending packet: %s\n", buf);
-
/* Copy the packet into buffer BUF2, encapsulating it
and giving it a checksum. */
--- 441,446 ----
***************
*** 422,440 ****
/* Send it over and over until we get a positive ack. */
do {
write (remote_desc, buf2, p - buf2);
! read (remote_desc, buf3, 1);
! } while (buf3[0] != '+');
}
- static int
- readchar ()
- {
- char buf[1];
- while (read (remote_desc, buf, 1) != 1) ;
- return buf[0] & 0x7f;
- }
-
/* Read a packet from the remote machine, with error checking,
and store it in BUF. */
--- 459,472 ----
/* Send it over and over until we get a positive ack. */
do {
+ if (kiodebug) {
+ *p = '\0';
+ fprintf (stderr, "Sending packet: %s (%s)\n", buf2, buf);
+ }
write (remote_desc, buf2, p - buf2);
! } while (readchar() != '+');
}
/* Read a packet from the remote machine, with error checking,
and store it in BUF. */
***************
*** 444,450 ****
{
char *bp;
char csum = 0;
! int c, c1, c2;
extern kiodebug;
while (1)
--- 476,483 ----
{
char *bp;
char csum = 0;
! int c;
! unsigned char c1, c2;
extern kiodebug;
while (1)
***************
*** 452,457 ****
--- 485,491 ----
while ((c = readchar()) != '$');
bp = buf;
+ csum = 0;
while (1)
{
c = readchar ();
***************
*** 464,473 ****
c1 = fromhex (readchar ());
c2 = fromhex (readchar ());
! if (csum == (c1 << 4) + c2)
break;
printf ("Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
! (c1 << 4) + c2, csum, buf);
write (remote_desc, "-", 1);
}
--- 498,508 ----
c1 = fromhex (readchar ());
c2 = fromhex (readchar ());
! if ((csum & 0xff) == (c1 << 4) + c2)
break;
printf ("Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
! (c1 << 4) + c2, csum & 0xff, buf);
!
write (remote_desc, "-", 1);
}