From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jim Blandy To: gdb-patches@sources.redhat.com Subject: RFA: Correctly parse registers from ROM68k Date: Wed, 05 Sep 2001 10:42:00 -0000 Message-id: <20010905174312.5AC495E9D8@zwingli.cygnus.com> X-SW-Source: 2001-09/msg00039.html 2001-08-29 Jim Blandy Correctly parse register values provided by the monitor. * rom68k-rom.c: #include "value.h". (is_hex_digit, hex_digit_value, is_whitespace, rom68k_supply_one_register): New static functions. (rom68k_supply_register): Call rom68k_supply_one_register, instead of monitor_supply_register; the latter was incorrectly parsing the values. * Makefile.in (rom68k-rom.o): Note that this now #includes value.h. Index: gdb/Makefile.in =================================================================== RCS file: /cvs/cvsfiles/devo/gdb/Makefile.in,v retrieving revision 1.789.2.2.4.1 diff -c -r1.789.2.2.4.1 Makefile.in *** gdb/Makefile.in 2001/02/07 02:08:52 1.789.2.2.4.1 --- gdb/Makefile.in 2001/08/30 05:04:58 *************** *** 1777,1783 **** $(inferior_h) $(remote_utils_h) symfile.h terminal.h rom68k-rom.o: rom68k-rom.c monitor.h $(bfd_h) gdb_wait.h $(defs_h) $(gdbcmd_h) \ ! $(inferior_h) target.h serial.h terminal.h rs6000-nat.o: rs6000-nat.c $(bfd_h) $(defs_h) $(inferior_h) target.h \ xcoffsolib.h --- 1777,1783 ---- $(inferior_h) $(remote_utils_h) symfile.h terminal.h rom68k-rom.o: rom68k-rom.c monitor.h $(bfd_h) gdb_wait.h $(defs_h) $(gdbcmd_h) \ ! $(inferior_h) $(value_h) target.h serial.h terminal.h rs6000-nat.o: rs6000-nat.c $(bfd_h) $(defs_h) $(inferior_h) target.h \ xcoffsolib.h Index: gdb/rom68k-rom.c =================================================================== RCS file: /cvs/cvsfiles/devo/gdb/rom68k-rom.c,v retrieving revision 2.24.66.1 diff -c -r2.24.66.1 rom68k-rom.c *** gdb/rom68k-rom.c 2001/08/09 01:19:45 2.24.66.1 --- gdb/rom68k-rom.c 2001/08/30 05:05:02 *************** *** 23,31 **** --- 23,110 ---- #include "target.h" #include "monitor.h" #include "serial.h" + #include "value.h" /* for supply_register */ + static void rom68k_open (char *args, int from_tty); + /* Return true if C is a hex digit. + We can't use isxdigit here: that is affected by the current locale; + ROM68K is not. */ + static int + is_hex_digit (int c) + { + return (('0' <= c && c <= '9') + || ('a' <= c && c <= 'f') + || ('A' <= c && c <= 'F')); + } + + + /* Convert hex digit A to a number. */ + static int + hex_digit_value (int a) + { + if (a >= '0' && a <= '9') + return a - '0'; + else if (a >= 'a' && a <= 'f') + return a - 'a' + 10; + else if (a >= 'A' && a <= 'F') + return a - 'A' + 10; + else + error ("Invalid hex digit %d", a); + } + + + /* Return true iff C is a whitespace character. + We can't use isspace here: that is affected by the current locale; + ROM68K is not. */ + static int + is_whitespace (int c) + { + return (c == ' ' + || c == '\r' + || c == '\n' + || c == '\t' + || c == '\f'); + } + + + /* Parse a string of hex digits starting at HEX, supply them as the + value of register REGNO, skip any whitespace, and return a pointer + to the next character. + + There is a function in monitor.c, monitor_supply_register, which is + supposed to do this job. However, there is some rather odd stuff + in there (whitespace characters don't terminate numbers, for + example) that is incorrect for ROM68k. It's basically impossible + to safely tweak monitor_supply_register --- it's used by a zillion + other monitors; who knows what behaviors they're depending on. So + instead, we'll just use our own function, which can behave exactly + the way we want it to. */ + static char * + rom68k_supply_one_register (int regno, unsigned char *hex) + { + ULONGEST value; + unsigned char regbuf[MAX_REGISTER_RAW_SIZE]; + + value = 0; + while (*hex != '\0') + if (is_hex_digit (*hex)) + value = (value * 16) + hex_digit_value (*hex++); + else + break; + + /* Skip any whitespace. */ + while (is_whitespace (*hex)) + hex++; + + store_unsigned_integer (regbuf, REGISTER_RAW_SIZE (regno), value); + supply_register (regno, regbuf); + + return hex; + } + + static void rom68k_supply_register (char *regname, int regnamelen, char *val, int vallen) { *************** *** 69,75 **** if (regno >= 0) while (numregs-- > 0) ! val = monitor_supply_register (regno++, val); } /* This array of registers need to match the indexes used by GDB. --- 148,154 ---- if (regno >= 0) while (numregs-- > 0) ! val = rom68k_supply_one_register (regno++, val); } /* This array of registers need to match the indexes used by GDB.