diff options
Diffstat (limited to 'gdb/i386-stub.c')
-rw-r--r-- | gdb/i386-stub.c | 135 |
1 files changed, 75 insertions, 60 deletions
diff --git a/gdb/i386-stub.c b/gdb/i386-stub.c index b05170b..d453fca 100644 --- a/gdb/i386-stub.c +++ b/gdb/i386-stub.c @@ -456,65 +456,82 @@ char ch; return (-1); } - /* scan for the sequence $<data>#<checksum> */ -void getpacket(buffer) -char * buffer; + +unsigned char * +getpacket (buffer) + unsigned char *buffer; { unsigned char checksum; unsigned char xmitcsum; - int i; - int count; + int count; char ch; - do { - /* wait around for the start character, ignore all other characters */ - while ((ch = (getDebugChar() & 0x7f)) != '$'); - checksum = 0; - xmitcsum = -1; - - count = 0; - - /* now, read until a # or end of buffer is found */ - while (count < BUFMAX) { - ch = getDebugChar() & 0x7f; - if (ch == '#') break; - checksum = checksum + ch; - buffer[count] = ch; - count = count + 1; - } - buffer[count] = 0; - - if (ch == '#') { - xmitcsum = hex(getDebugChar() & 0x7f) << 4; - xmitcsum += hex(getDebugChar() & 0x7f); - if ((remote_debug ) && (checksum != xmitcsum)) { - fprintf (stderr ,"bad checksum. My count = 0x%x, sent=0x%x. buf=%s\n", - checksum,xmitcsum,buffer); - } - - if (checksum != xmitcsum) putDebugChar('-'); /* failed checksum */ - else { - 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]; - } - } + while (1) + { + /* wait around for the start character, ignore all other characters */ + 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 (); + if (ch == '$') + goto retry; + if (ch == '#') + break; + checksum = checksum + ch; + buffer[count] = ch; + count = count + 1; + } + buffer[count] = 0; + + if (ch == '#') + { + ch = getDebugChar (); + xmitcsum = hex (ch) << 4; + ch = getDebugChar (); + xmitcsum += hex (ch); + + if (checksum != xmitcsum) + { + if (remote_debug) + { + fprintf (stderr, + "bad checksum. My count = 0x%x, sent=0x%x. buf=%s\n", + checksum, xmitcsum, buffer); + } + putDebugChar ('-'); /* failed checksum */ + } + else + { + putDebugChar ('+'); /* successful transfer */ + + /* if a sequence char is present, reply the sequence ID */ + if (buffer[2] == ':') + { + putDebugChar (buffer[0]); + putDebugChar (buffer[1]); + + return &buffer[3]; + } + + return &buffer[0]; + } + } } - } while (checksum != xmitcsum); - } /* send the packet in buffer. */ - void putpacket(buffer) -char * buffer; + unsigned char *buffer; { unsigned char checksum; int count; @@ -536,7 +553,7 @@ char * buffer; putDebugChar(hexchars[checksum >> 4]); putDebugChar(hexchars[checksum % 16]); - } while ((getDebugChar() & 0x7f) != '+'); + } while (getDebugChar() != '+'); } @@ -698,7 +715,7 @@ int hexToInt(char **ptr, int *intValue) */ void handle_exception(int exceptionVector) { - int sigval; + int sigval, stepping; int addr, length; char * ptr; int newPC; @@ -719,11 +736,14 @@ void handle_exception(int exceptionVector) putpacket(remcomOutBuffer); + stepping = 0; + while (1==1) { error = 0; remcomOutBuffer[0] = 0; - getpacket(remcomInBuffer); - switch (remcomInBuffer[0]) { + ptr = getpacket(remcomInBuffer); + + switch (*ptr++) { case '?' : remcomOutBuffer[0] = 'S'; remcomOutBuffer[1] = hexchars[sigval >> 4]; remcomOutBuffer[2] = hexchars[sigval % 16]; @@ -735,14 +755,13 @@ void handle_exception(int exceptionVector) mem2hex((char*) registers, remcomOutBuffer, NUMREGBYTES, 0); break; case 'G' : /* set the value of the CPU registers - return OK */ - hex2mem(&remcomInBuffer[1], (char*) registers, NUMREGBYTES, 0); + hex2mem(ptr, (char*) registers, NUMREGBYTES, 0); strcpy(remcomOutBuffer,"OK"); break; case 'P' : /* set the value of a single CPU register - return OK */ { int regno; - ptr = &remcomInBuffer[1]; if (hexToInt (&ptr, ®no) && *ptr++ == '=') if (regno >= 0 && regno < NUMREGS) { @@ -758,7 +777,6 @@ void handle_exception(int exceptionVector) /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */ case 'm' : /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */ - ptr = &remcomInBuffer[1]; if (hexToInt(&ptr,&addr)) if (*(ptr++) == ',') if (hexToInt(&ptr,&length)) @@ -775,14 +793,12 @@ void handle_exception(int exceptionVector) if (ptr) { strcpy(remcomOutBuffer,"E01"); - debug_error("malformed read memory command: %s",remcomInBuffer); } break; /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */ case 'M' : /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */ - ptr = &remcomInBuffer[1]; if (hexToInt(&ptr,&addr)) if (*(ptr++) == ',') if (hexToInt(&ptr,&length)) @@ -803,16 +819,15 @@ void handle_exception(int exceptionVector) if (ptr) { strcpy(remcomOutBuffer,"E02"); - debug_error("malformed write memory command: %s",remcomInBuffer); } break; /* cAA..AA Continue at address AA..AA(optional) */ /* sAA..AA Step one instruction from AA..AA(optional) */ - case 'c' : case 's' : + stepping = 1; + case 'c' : /* try to read optional parameter, pc unchanged if no parm */ - ptr = &remcomInBuffer[1]; if (hexToInt(&ptr,&addr)) registers[ PC ] = addr; @@ -822,7 +837,7 @@ void handle_exception(int exceptionVector) registers[ PS ] &= 0xfffffeff; /* set the trace bit if we're stepping */ - if (remcomInBuffer[0] == 's') registers[ PS ] |= 0x100; + if (stepping) registers[ PS ] |= 0x100; /* * If we found a match for the PC AND we are not returning |