X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fm32r-stub.c;h=cb956264d67533216f6a834dbe5f92d845e5ca25;hb=de4112fa387b662c7c7a1dd3e334a1274ca54d28;hp=7055fe013af2736bbf2d338cf78214f9a07baf2e;hpb=8b0b198558d0fc981f129e2e3dcbe00a0f308449;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/m32r-stub.c b/gdb/m32r-stub.c index 7055fe013a..cb956264d6 100644 --- a/gdb/m32r-stub.c +++ b/gdb/m32r-stub.c @@ -179,7 +179,7 @@ extern void breakpoint(void); static int computeSignal(int); static void putpacket(unsigned char *); -static void getpacket(unsigned char *); +static unsigned char *getpacket(void); static unsigned char *mem2hex(unsigned char *, unsigned char *, int, int); static unsigned char *hex2mem(unsigned char *, unsigned char *, int, int); @@ -204,7 +204,7 @@ static int strlen (const unsigned char *); void handle_exception(int exceptionVector) { - int sigval; + int sigval, stepping; int addr, length, i; unsigned char * ptr; unsigned char buf[16]; @@ -306,15 +306,16 @@ handle_exception(int exceptionVector) putpacket(remcomOutBuffer); + stepping = 0; + while (1==1) { remcomOutBuffer[0] = 0; - getpacket(remcomInBuffer); + ptr = getpacket(); binary = 0; - switch (remcomInBuffer[0]) { + switch (*ptr++) { default: /* Unknown code. Return an empty reply message. */ break; case 'R': - ptr = &remcomInBuffer[1]; if (hexToInt (&ptr, &addr)) registers[PC] = addr; strcpy(remcomOutBuffer, "OK"); @@ -327,7 +328,6 @@ handle_exception(int exceptionVector) case 'M': /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */ /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */ { - ptr = &remcomInBuffer[1]; if (hexToInt(&ptr,&addr)) if (*(ptr++) == ',') if (hexToInt(&ptr,&length)) @@ -349,14 +349,11 @@ handle_exception(int exceptionVector) if (ptr) { strcpy(remcomOutBuffer,"E02"); - gdb_error("malformed write memory command: %s", - remcomInBuffer); } } break; case 'm': /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */ /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */ - ptr = &remcomInBuffer[1]; if (hexToInt(&ptr,&addr)) if (*(ptr++) == ',') if (hexToInt(&ptr,&length)) @@ -372,8 +369,6 @@ handle_exception(int exceptionVector) if (ptr) { strcpy(remcomOutBuffer,"E01"); - gdb_error("malformed read memory command: %s", - remcomInBuffer); } break; case '?': @@ -392,7 +387,6 @@ handle_exception(int exceptionVector) { int regno; - ptr = &remcomInBuffer[1]; if (hexToInt (&ptr, ®no) && *ptr++ == '=') if (regno >= 0 && regno < NUMREGS) { @@ -431,21 +425,21 @@ handle_exception(int exceptionVector) strcpy (remcomOutBuffer, "OK"); break; } - strcpy (remcomOutBuffer, "P01"); + strcpy (remcomOutBuffer, "E01"); break; } case 'G': /* set the value of the CPU registers - return OK */ - hex2mem(&remcomInBuffer[1], (unsigned char*) registers, NUMREGBYTES, 0); + hex2mem(ptr, (unsigned char*) registers, NUMREGBYTES, 0); strcpy(remcomOutBuffer,"OK"); break; case 's': /* sAA..AA Step one instruction from AA..AA(optional) */ + stepping = 1; case 'c': /* cAA..AA Continue from address AA..AA(optional) */ /* try to read optional parameter, pc unchanged if no parm */ - ptr = &remcomInBuffer[1]; if (hexToInt(&ptr,&addr)) registers[ PC ] = addr; - if (remcomInBuffer[0] == 's') /* single-stepping */ + if (stepping) /* single-stepping */ { if (!prepare_to_step(0)) /* set up for single-step */ { @@ -505,7 +499,6 @@ handle_exception(int exceptionVector) break; #endif case 'q': - ptr = &remcomInBuffer[1]; if (*ptr++ == 'C' && *ptr++ == 'R' && *ptr++ == 'C' && @@ -542,10 +535,7 @@ handle_exception(int exceptionVector) static unsigned long crc32_table[256] = {0, 0}; static unsigned long -crc32 (buf, len, crc) - unsigned char *buf; - int len; - unsigned long crc; +crc32 (unsigned char *buf, int len, unsigned long crc) { if (! crc32_table[1]) { @@ -570,8 +560,7 @@ crc32 (buf, len, crc) } static int -hex(ch) - unsigned char ch; +hex (unsigned char ch) { if ((ch >= 'a') && (ch <= 'f')) return (ch-'a'+10); if ((ch >= '0') && (ch <= '9')) return (ch-'0'); @@ -581,72 +570,84 @@ hex(ch) /* scan for the sequence $# */ -static void -getpacket(buffer) - unsigned char * buffer; +unsigned char * +getpacket (void) { + unsigned char *buffer = &remcomInBuffer[0]; unsigned char checksum; unsigned char xmitcsum; - int i; - int count; - unsigned char ch; + int count; + char ch; - do { - /* wait around for the start character, ignore all other characters */ - while ((ch = getDebugChar()) != '$'); - checksum = 0; - xmitcsum = -1; + while (1) + { + /* wait around for the start character, ignore all other characters */ + while ((ch = getDebugChar ()) != '$') + ; - count = 0; +retry: + checksum = 0; + xmitcsum = -1; + count = 0; - /* now, read until a # or end of buffer is found */ - while (count < BUFMAX) { - ch = getDebugChar(); - - if (ch == '#' && (count == 0 || buffer[count-1] != 0x7d)) - break; + /* 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; - checksum = checksum + ch; - buffer[count] = ch; - count = count + 1; - } - buffer[count] = 0; - - if (ch == '#') { - xmitcsum = hex(getDebugChar()) << 4; - xmitcsum += hex(getDebugChar()); - if (checksum != xmitcsum) { - if (remote_debug) { - unsigned char buf[16]; - - mem2hex((unsigned char *) &checksum, buf, 4, 0); - gdb_error("Bad checksum: my count = %s, ", buf); - mem2hex((unsigned char *) &xmitcsum, buf, 4, 0); - gdb_error("sent count = %s\n", buf); - gdb_error(" -- Bad buffer: \"%s\"\n", buffer); - } + if (ch == '#') + { + ch = getDebugChar (); + xmitcsum = hex (ch) << 4; + ch = getDebugChar (); + xmitcsum += hex (ch); - 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]; + if (checksum != xmitcsum) + { + if (remote_debug) + { + unsigned char buf[16]; + + mem2hex((unsigned char *) &checksum, buf, 4, 0); + gdb_error("Bad checksum: my count = %s, ", buf); + mem2hex((unsigned char *) &xmitcsum, buf, 4, 0); + gdb_error("sent count = %s\n", buf); + gdb_error(" -- Bad buffer: \"%s\"\n", 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. */ static void -putpacket(buffer) - unsigned char *buffer; +putpacket (unsigned char *buffer) { unsigned char checksum; int count; @@ -674,7 +675,7 @@ putpacket(buffer) static void (*volatile mem_fault_routine)() = 0; static void -set_mem_err () +set_mem_err (void) { mem_err = 1; } @@ -685,8 +686,7 @@ set_mem_err () whether there's anything connected to the expansion bus. */ static int -mem_safe (addr) - unsigned char *addr; +mem_safe (unsigned char *addr) { #define BAD_RANGE_ONE_START ((unsigned char *) 0x600000) #define BAD_RANGE_ONE_END ((unsigned char *) 0xa00000) @@ -704,8 +704,7 @@ mem_safe (addr) to mem_fault, they won't get restored, so there better not be any saved). */ static int -get_char (addr) - unsigned char *addr; +get_char (unsigned char *addr) { #if 1 if (mem_fault_routine && !mem_safe(addr)) @@ -718,9 +717,7 @@ get_char (addr) } static void -set_char (addr, val) - unsigned char *addr; - unsigned char val; +set_char (unsigned char *addr, unsigned char val) { #if 1 if (mem_fault_routine && !mem_safe (addr)) @@ -738,11 +735,7 @@ set_char (addr, val) a fault; if zero treat a fault like any other fault in the stub. */ 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) { int i; unsigned char ch; @@ -766,11 +759,7 @@ mem2hex(mem, buf, count, may_fault) Return a pointer to the character AFTER the last byte written. */ static unsigned 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; @@ -795,11 +784,7 @@ hex2mem(buf, mem, count, may_fault) COUNT is the total number of bytes to write into memory. */ static unsigned char * -bin2mem (buf, mem, count, may_fault) - unsigned char *buf; - unsigned char *mem; - int count; - int may_fault; +bin2mem (unsigned char *buf, unsigned char *mem, int count, int may_fault) { int i; unsigned char ch; @@ -841,8 +826,7 @@ bin2mem (buf, mem, count, may_fault) translate this number into a unix compatible signal value */ static int -computeSignal(exceptionVector) - int exceptionVector; +computeSignal (int exceptionVector) { int sigval; switch (exceptionVector) { @@ -874,9 +858,7 @@ computeSignal(exceptionVector) /* RETURN NUMBER OF CHARS PROCESSED */ /**********************************************/ static int -hexToInt(ptr, intValue) - unsigned char **ptr; - int *intValue; +hexToInt (unsigned char **ptr, int *intValue) { int numChars = 0; int hexValue; @@ -922,8 +904,7 @@ hexToInt(ptr, intValue) */ static int -isShortBranch(instr) - unsigned char *instr; +isShortBranch (unsigned char *instr) { unsigned char instr0 = instr[0] & 0x7F; /* mask off high bit */ @@ -942,8 +923,7 @@ isShortBranch(instr) } static int -isLongBranch(instr) - unsigned char *instr; +isLongBranch (unsigned char *instr) { if (instr[0] == 0xFC || instr[0] == 0xFD || /* BRA, BNC, BL, BC */ instr[0] == 0xFE || instr[0] == 0xFF) /* 24 bit relative */ @@ -969,8 +949,7 @@ isLongBranch(instr) ((((int) addr & 2) || (((unsigned char *) addr)[0] & 0x80) == 0) ? 2 : 4) static int -isBranch(instr) - unsigned char *instr; +isBranch (unsigned char *instr) { if (INSTRUCTION_SIZE(instr) == 2) return isShortBranch(instr); @@ -979,8 +958,7 @@ isBranch(instr) } static int -willBranch(instr, branchCode) - unsigned char *instr; +willBranch (unsigned char *instr, int branchCode) { switch (branchCode) { @@ -1035,8 +1013,7 @@ willBranch(instr, branchCode) } static int -branchDestination(instr, branchCode) - unsigned char *instr; +branchDestination (unsigned char *instr, int branchCode) { switch (branchCode) { default: @@ -1067,9 +1044,7 @@ branchDestination(instr, branchCode) } static void -branchSideEffects(instr, branchCode) - unsigned char *instr; - int branchCode; +branchSideEffects (unsigned char *instr, int branchCode) { switch (branchCode) { @@ -1179,7 +1154,7 @@ prepare_to_step(continue_p) just "continue continuing". */ static int -finish_from_step() +finish_from_step (void) { if (stepping.stepping) /* anything to do? */ { @@ -1270,7 +1245,7 @@ stash_registers: but doing stash_registers in C isn't straightforward. */ static void -cleanup_stash () +cleanup_stash (void) { psw = (struct PSWreg *) ®isters[PSW]; /* fields of PSW register */ psw->sm = psw->bsm; /* fix up pre-trap values of psw fields */ @@ -1338,8 +1313,7 @@ restore_and_return: NUM is the trap/exception number. */ static void -process_exception (num) - int num; +process_exception (int num) { cleanup_stash (); asm volatile (" @@ -1546,7 +1520,7 @@ _catchException17: /* this function is used to set up exception handlers for tracing and breakpoints */ void -set_debug_traps() +set_debug_traps (void) { /* extern void remcomHandler(); */ int i; @@ -1576,10 +1550,6 @@ set_debug_traps() exceptionHandler (16, _catchException16); /* exceptionHandler (17, _catchException17); */ - /* In case GDB is started before us, ack any packets (presumably - "$?#xx") sitting there. */ - putDebugChar ('+'); - initialized = 1; } @@ -1591,7 +1561,7 @@ set_debug_traps() #define BREAKPOINT() asm volatile (" trap #2"); void -breakpoint() +breakpoint (void) { if (initialized) BREAKPOINT(); @@ -1610,8 +1580,7 @@ breakpoint() Returns: the char */ static int -gdb_putchar(ch) - int ch; +gdb_putchar (int ch) { char buf[4]; @@ -1628,9 +1597,7 @@ gdb_putchar(ch) Returns: number of bytes written */ static int -gdb_write(data, len) - char *data; - int len; +gdb_write (char *data, int len) { char *buf, *cpy; int i; @@ -1658,8 +1625,7 @@ gdb_write(data, len) Returns: the length of the string */ static int -gdb_puts(str) - char *str; +gdb_puts (char *str) { return gdb_write(str, strlen(str)); } @@ -1670,9 +1636,7 @@ gdb_puts(str) will cause the optional second string to be inserted. */ static void -gdb_error(format, parm) - char * format; - char * parm; +gdb_error (char *format, char *parm) { char buf[400], *cpy; int len;