On Wed, Jun 24, 2015 at 04:42:12PM +0100, Patrick Welche wrote:
> The reason kgdb wasn't working all this time on amd64 is that GETC()
> returns -1 immediately whether or not a character is available =>
> all of kgdb's checksums fail due to the extra "-1" characters.

The attached gets us that far.
(Next the target suffers a lock panic on receipt of a "m" command)

Cheers,

Patrick
Index: kgdb_stub.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kgdb_stub.c,v
retrieving revision 1.28
diff -u -p -r1.28 kgdb_stub.c
--- kgdb_stub.c 21 Sep 2014 17:17:15 -0000      1.28
+++ kgdb_stub.c 24 Jun 2015 16:37:55 -0000
@@ -244,7 +245,9 @@ kgdb_send(const u_char *bp)
                PUTC(KGDB_END);
                PUTC(i2digit(csum >> 4));
                PUTC(i2digit(csum));
-       } while ((c = GETC() & 0x7f) == KGDB_BADP);
+               while ((c = GETC()) == -1)
+                       ;
+       } while ((c & 0x7f) == KGDB_BADP);
 }
 
 /*
@@ -261,17 +264,25 @@ kgdb_recv(u_char *bp, int maxlen)
        do {
                p = bp;
                csum = len = 0;
-               while ((c = GETC()) != KGDB_START)
+               do {
+                       while ((c = GETC()) == -1)
+                               ;
                        DPRINTF(("%c",c));
+               } while (c != KGDB_START);
+
                DPRINTF(("%c Start ",c));
 
-               while ((c = GETC()) != KGDB_END && len < maxlen) {
+               do {
+                       while ((c = GETC()) == -1)
+                               ;
+                       if (c == KGDB_END)
+                               break;
                        DPRINTF(("%c",c));
                        c &= 0x7f;
                        csum += c;
                        *p++ = c;
                        len++;
-               }
+               } while (len < maxlen);
                csum &= 0xff;
                *p = '\0';
                DPRINTF(("%c End ", c));
@@ -283,10 +294,12 @@ kgdb_recv(u_char *bp, int maxlen)
                }
                tmpcsum = csum;
 
-               c = GETC();
+               while ((c = GETC()) == -1)
+                       ;
                DPRINTF(("%c",c));
                csum -= digit2i(c) * 16;
-               c = GETC();
+               while ((c = GETC()) == -1)
+                       ;
                DPRINTF(("%c",c));
                csum -= digit2i(c);
 
@@ -326,7 +339,7 @@ kgdb_attach(int (*getfn)(void *), void (
  * This function does all command processing for interfacing to
  * a remote gdb.  Note that the error codes are ignored by gdb
  * at present, but might eventually become meaningful. (XXX)
- * It might makes sense to use POSIX errno values, because
+ * It might make sense to use POSIX errno values, because
  * that is what the gdb/remote.c functions want to return.
  */
 int

Reply via email to