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