X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsparcl-stub.c;h=3fcdc0ad7c1d3e156595bf4238ff6a2bb9b239bc;hb=fe97fe9cf073cd11ec93971a88f27b005c145d2a;hp=c7994fe5d52084659cf2d7a3837ac0f8e135d02d;hpb=4930f0a7f4f3e9269b1c03d4bd1167198c55f269;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/sparcl-stub.c b/gdb/sparcl-stub.c index c7994fe5d5..3fcdc0ad7c 100644 --- a/gdb/sparcl-stub.c +++ b/gdb/sparcl-stub.c @@ -50,6 +50,7 @@ * * g return the value of the CPU registers hex data or ENN * G set the value of the CPU registers OK or ENN + * P set the value of a single CPU register OK or ENN * * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN @@ -64,9 +65,6 @@ * * ? What was the last sigval ? SNN (signal NN) * - * bBB..BB Set baud rate to BB..BB OK or BNN, then sets - * baud rate - * * All commands and responses are sent with a packet which includes a * checksum. A packet consists of * @@ -136,16 +134,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) { @@ -378,8 +366,7 @@ no_fpreload: /* Convert ch from a hex digit to an int */ static int -hex(ch) - unsigned char ch; +hex (unsigned char ch) { if (ch >= 'a' && ch <= 'f') return ch-'a'+10; @@ -390,79 +377,79 @@ hex(ch) return -1; } +static char remcomInBuffer[BUFMAX]; +static char remcomOutBuffer[BUFMAX]; + /* scan for the sequence $# */ -static void -getpacket(buffer) - char *buffer; +unsigned char * +getpacket (void) { + unsigned char *buffer = &remcomInBuffer[0]; 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. */ static void -putpacket(buffer) - unsigned char *buffer; +putpacket (unsigned char *buffer) { unsigned char checksum; int count; @@ -487,12 +474,9 @@ putpacket(buffer) putDebugChar(hexchars[checksum & 0xf]); } - while ((getDebugChar() & 0x7f) != '+'); + while (getDebugChar() != '+'); } -static char remcomInBuffer[BUFMAX]; -static char remcomOutBuffer[BUFMAX]; - /* Indicate to caller of mem2hex or hex2mem that there has been an error. */ static volatile int mem_err = 0; @@ -505,11 +489,7 @@ static volatile int mem_err = 0; */ static unsigned char * -mem2hex(mem, buf, count, may_fault) - unsigned char *mem; - unsigned char *buf; - int count; - int may_fault; +mem2hex (unsigned char *mem, unsigned char *buf, int count, int may_fault) { unsigned char ch; @@ -535,11 +515,7 @@ mem2hex(mem, buf, count, may_fault) * return a pointer to the character AFTER the last byte written */ static char * -hex2mem(buf, mem, count, may_fault) - unsigned char *buf; - unsigned char *mem; - int count; - int may_fault; +hex2mem (unsigned char *buf, unsigned char *mem, int count, int may_fault) { int i; unsigned char ch; @@ -590,7 +566,7 @@ static struct hard_trap_info /* Set up exception handlers for tracing and breakpoints */ void -set_debug_traps() +set_debug_traps (void) { struct hard_trap_info *ht; @@ -602,11 +578,6 @@ set_debug_traps() if (ht->tt != 4 || ! (read_psr () & 0x1000)) exceptionHandler(ht->tt, trap_low); - /* In case GDB is started before us, ack any packets (presumably - "$?#xx") sitting there. */ - - putDebugChar ('+'); - initialized = 1; } @@ -627,8 +598,7 @@ _fltr_set_mem_err: "); static void -set_mem_fault_trap(enable) - int enable; +set_mem_fault_trap (int enable) { extern void fltr_set_mem_err(); mem_err = 0; @@ -651,7 +621,7 @@ _dummy_hw_breakpoint: "); static void -get_in_break_mode() +get_in_break_mode (void) { extern void dummy_hw_breakpoint(); @@ -665,8 +635,7 @@ get_in_break_mode() /* Convert the SPARC hardware trap type code to a unix signal number. */ static int -computeSignal(tt) - int tt; +computeSignal (int tt) { struct hard_trap_info *ht; @@ -712,8 +681,7 @@ hexToInt(char **ptr, int *intValue) */ static void -handle_exception (registers) - unsigned long *registers; +handle_exception (unsigned long *registers) { int tt; /* Trap type */ int sigval; @@ -813,8 +781,8 @@ handle_exception (registers) { remcomOutBuffer[0] = 0; - getpacket(remcomInBuffer); - switch (remcomInBuffer[0]) + ptr = getpacket(); + switch (*ptr++) { case '?': remcomOutBuffer[0] = 'S'; @@ -839,9 +807,7 @@ handle_exception (registers) psr = registers[PSR]; - ptr = &remcomInBuffer[1]; - - if (remcomInBuffer[0] == 'P') + if (ptr[-1] == 'P') { int regno; @@ -853,7 +819,7 @@ handle_exception (registers) hex2mem (ptr, (char *)®isters[regno], 4, 0); else { - strcpy (remcomOutBuffer, "P01"); + strcpy (remcomOutBuffer, "E01"); break; } } @@ -883,8 +849,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)) @@ -901,8 +865,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) @@ -919,8 +881,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; @@ -961,44 +921,6 @@ handle_exception (registers) asm ("call 0 nop "); break; - -#if 0 -Disabled until we can unscrew this properly - - case 'b': /* bBB... Set baud rate to BB... */ - { - int baudrate; - extern void set_timer_3(); - - ptr = &remcomInBuffer[1]; - if (!hexToInt(&ptr, &baudrate)) - { - strcpy(remcomOutBuffer,"B01"); - break; - } - - /* Convert baud rate to uart clock divider */ - switch (baudrate) - { - case 38400: - baudrate = 16; - break; - case 19200: - baudrate = 33; - break; - case 9600: - baudrate = 65; - break; - default: - strcpy(remcomOutBuffer,"B02"); - goto x1; - } - - putpacket("OK"); /* Ack before changing speed */ - set_timer_3(baudrate); /* Set it */ - } -x1: break; -#endif } /* switch */ /* reply to the request */ @@ -1012,7 +934,7 @@ x1: break; the debugger. */ void -breakpoint() +breakpoint (void) { if (!initialized) return;