diff options
Diffstat (limited to 'gdb/sparcl-stub.c')
-rw-r--r-- | gdb/sparcl-stub.c | 83 |
1 files changed, 31 insertions, 52 deletions
diff --git a/gdb/sparcl-stub.c b/gdb/sparcl-stub.c index bc508b3..4f04b97 100644 --- a/gdb/sparcl-stub.c +++ b/gdb/sparcl-stub.c @@ -136,16 +136,6 @@ extern void trap_low(); nasty interactions between app code and the stub (for instance if user steps into strlen, etc..) */ -static int -strlen (const char *s) -{ - const char *s1 = s; - - while (*s1++ != '\000'); - - return s1 - s; -} - static char * strcpy (char *dst, const char *src) { @@ -392,70 +382,68 @@ hex(ch) /* scan for the sequence $<data>#<checksum> */ -static void -getpacket(buffer) - char *buffer; +unsigned char * +getpacket (buffer) + unsigned char *buffer; { unsigned char checksum; unsigned char xmitcsum; - int i; int count; - unsigned char ch; + char ch; - do + while (1) { /* wait around for the start character, ignore all other characters */ - while ((ch = (getDebugChar() & 0x7f)) != '$') ; + while ((ch = getDebugChar ()) != '$') + ; +retry: checksum = 0; xmitcsum = -1; - count = 0; /* now, read until a # or end of buffer is found */ while (count < BUFMAX) { - ch = getDebugChar() & 0x7f; + ch = getDebugChar (); + if (ch == '$') + goto retry; if (ch == '#') break; checksum = checksum + ch; buffer[count] = ch; count = count + 1; } - - if (count >= BUFMAX) - continue; - buffer[count] = 0; if (ch == '#') { - xmitcsum = hex(getDebugChar() & 0x7f) << 4; - xmitcsum |= hex(getDebugChar() & 0x7f); -#if 0 - /* Humans shouldn't have to figure out checksums to type to it. */ - putDebugChar ('+'); - return; -#endif + ch = getDebugChar (); + xmitcsum = hex (ch) << 4; + ch = getDebugChar (); + xmitcsum += hex (ch); + if (checksum != xmitcsum) - putDebugChar('-'); /* failed checksum */ + { + putDebugChar ('-'); /* failed checksum */ + } else { - putDebugChar('+'); /* successful transfer */ + putDebugChar ('+'); /* successful transfer */ + /* if a sequence char is present, reply the sequence ID */ if (buffer[2] == ':') { - putDebugChar(buffer[0]); - putDebugChar(buffer[1]); - /* remove sequence chars from buffer */ - count = strlen(buffer); - for (i=3; i <= count; i++) - buffer[i-3] = buffer[i]; + putDebugChar (buffer[0]); + putDebugChar (buffer[1]); + + return &buffer[3]; } + + return &buffer[0]; } } } - while (checksum != xmitcsum); } /* send the packet in buffer. */ @@ -487,7 +475,7 @@ putpacket(buffer) putDebugChar(hexchars[checksum & 0xf]); } - while ((getDebugChar() & 0x7f) != '+'); + while (getDebugChar() != '+'); } static char remcomInBuffer[BUFMAX]; @@ -808,8 +796,8 @@ handle_exception (registers) { remcomOutBuffer[0] = 0; - getpacket(remcomInBuffer); - switch (remcomInBuffer[0]) + ptr = getpacket(remcomInBuffer); + switch (*ptr++) { case '?': remcomOutBuffer[0] = 'S'; @@ -834,9 +822,7 @@ handle_exception (registers) psr = registers[PSR]; - ptr = &remcomInBuffer[1]; - - if (remcomInBuffer[0] == 'P') + if (ptr[-1] == 'P') { int regno; @@ -878,8 +864,6 @@ handle_exception (registers) case 'm': /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */ /* Try to read %x,%x. */ - ptr = &remcomInBuffer[1]; - if (hexToInt(&ptr, &addr) && *ptr++ == ',' && hexToInt(&ptr, &length)) @@ -896,8 +880,6 @@ handle_exception (registers) case 'M': /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */ /* Try to read '%x,%x:'. */ - ptr = &remcomInBuffer[1]; - if (hexToInt(&ptr, &addr) && *ptr++ == ',' && hexToInt(&ptr, &length) @@ -914,8 +896,6 @@ handle_exception (registers) case 'c': /* cAA..AA Continue at address AA..AA(optional) */ /* try to read optional parameter, pc unchanged if no parm */ - - ptr = &remcomInBuffer[1]; if (hexToInt(&ptr, &addr)) { registers[PC] = addr; @@ -965,7 +945,6 @@ Disabled until we can unscrew this properly int baudrate; extern void set_timer_3(); - ptr = &remcomInBuffer[1]; if (!hexToInt(&ptr, &baudrate)) { strcpy(remcomOutBuffer,"B01"); |