diff options
-rw-r--r-- | gdb/ChangeLog | 15 | ||||
-rw-r--r-- | gdb/Makefile.in | 10 | ||||
-rw-r--r-- | gdb/common/rsp-low.c | 277 | ||||
-rw-r--r-- | gdb/common/rsp-low.h | 70 | ||||
-rw-r--r-- | gdb/gdbserver/ChangeLog | 18 | ||||
-rw-r--r-- | gdb/gdbserver/Makefile.in | 8 | ||||
-rw-r--r-- | gdb/gdbserver/ax.c | 1 | ||||
-rw-r--r-- | gdb/gdbserver/regcache.c | 1 | ||||
-rw-r--r-- | gdb/gdbserver/remote-utils.c | 212 | ||||
-rw-r--r-- | gdb/gdbserver/remote-utils.h | 9 | ||||
-rw-r--r-- | gdb/gdbserver/server.c | 1 | ||||
-rw-r--r-- | gdb/gdbserver/tracepoint.c | 1 | ||||
-rw-r--r-- | gdb/remote.c | 217 | ||||
-rw-r--r-- | gdb/remote.h | 6 | ||||
-rw-r--r-- | gdb/tracepoint.c | 1 |
15 files changed, 400 insertions, 447 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ebb334b..034e488 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,20 @@ 2014-02-12 Tom Tromey <tromey@redhat.com> + * tracepoint.c: Include rsp-low.h. + * remote.h (hex2bin, bin2hex, unpack_varlen_hex): Don't declare. + * remote.c: Include rsp-low.h. + (hexchars, ishex, unpack_varlen_hex, pack_nibble, pack_hex_byte) + (fromhex, hex2bin, tohex, bin2hex, remote_escape_output) + (remote_unescape_input): Move to common/rsp-low.c. + * common/rsp-low.h: New file. + * common/rsp-low.c: New file. + * Makefile.in (SFILES): Add common/rsp-low.c. + (HFILES_NO_SRCDIR): Add common/rsp-low.h. + (COMMON_OBS): Add rsp-low.o. + (rsp-low.o): New target. + +2014-02-12 Tom Tromey <tromey@redhat.com> + * utils.h: Include print-utils.h. (host_address_to_string, plongest, pulongest, phex, phex_nz) (int_string, core_addr_to_string, core_addr_to_string_nz) diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 21124f1..ea56854 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -839,7 +839,7 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \ common/gdb_vecs.c common/common-utils.c common/xml-utils.c \ common/ptid.c common/buffer.c gdb-dlfcn.c common/agent.c \ common/format.c common/filestuff.c btrace.c record-btrace.c ctf.c \ - target/waitstatus.c common/print-utils.c + target/waitstatus.c common/print-utils.c common/rsp-low.c LINTFILES = $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c @@ -922,7 +922,7 @@ common/linux-osdata.h gdb-dlfcn.h auto-load.h probe.h stap-probe.h \ gdb_bfd.h sparc-ravenscar-thread.h ppc-ravenscar-thread.h common/linux-btrace.h \ ctf.h common/i386-cpuid.h common/i386-gcc-cpuid.h target/resume.h \ target/wait.h target/waitstatus.h nat/linux-nat.h nat/linux-waitpid.h \ -common/print-utils.h +common/print-utils.h common/rsp-low.h # Header files that already have srcdir in them, or which are in objdir. @@ -1021,7 +1021,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \ gdb_vecs.o jit.o progspace.o skip.o probe.o \ common-utils.o buffer.o ptid.o gdb-dlfcn.o common-agent.o \ format.o registry.o btrace.o record-btrace.o waitstatus.o \ - print-utils.o + print-utils.o rsp-low.o TSOBS = inflow.o @@ -2146,6 +2146,10 @@ print-utils.o: ${srcdir}/common/print-utils.c $(COMPILE) $(srcdir)/common/print-utils.c $(POSTCOMPILE) +rsp-low.o: ${srcdir}/common/rsp-low.c + $(COMPILE) $(srcdir)/common/rsp-low.c + $(POSTCOMPILE) + # # gdb/target/ dependencies # diff --git a/gdb/common/rsp-low.c b/gdb/common/rsp-low.c new file mode 100644 index 0000000..07e7ddb --- /dev/null +++ b/gdb/common/rsp-low.c @@ -0,0 +1,277 @@ +/* Low-level RSP routines for GDB, the GNU debugger. + + Copyright (C) 1988-2014 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifdef GDBSERVER +#include "server.h" +#else +#include "defs.h" +#endif + +#include <string.h> + +#include "rsp-low.h" + +/* Convert hex digit A to a number. */ + +int +fromhex (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 (_("Reply contains invalid hex digit %d"), a); +} + +int +tohex (int nib) +{ + if (nib < 10) + return '0' + nib; + else + return 'a' + nib - 10; +} + +/* Encode 64 bits in 16 chars of hex. */ + +static const char hexchars[] = "0123456789abcdef"; + +static int +ishex (int ch, int *val) +{ + if ((ch >= 'a') && (ch <= 'f')) + { + *val = ch - 'a' + 10; + return 1; + } + if ((ch >= 'A') && (ch <= 'F')) + { + *val = ch - 'A' + 10; + return 1; + } + if ((ch >= '0') && (ch <= '9')) + { + *val = ch - '0'; + return 1; + } + return 0; +} + +char * +pack_nibble (char *buf, int nibble) +{ + *buf++ = hexchars[(nibble & 0x0f)]; + return buf; +} + +char * +pack_hex_byte (char *pkt, int byte) +{ + *pkt++ = hexchars[(byte >> 4) & 0xf]; + *pkt++ = hexchars[(byte & 0xf)]; + return pkt; +} + +char * +unpack_varlen_hex (char *buff, /* packet to parse */ + ULONGEST *result) +{ + int nibble; + ULONGEST retval = 0; + + while (ishex (*buff, &nibble)) + { + buff++; + retval = retval << 4; + retval |= nibble & 0x0f; + } + *result = retval; + return buff; +} + +int +hex2bin (const char *hex, gdb_byte *bin, int count) +{ + int i; + + for (i = 0; i < count; i++) + { + if (hex[0] == 0 || hex[1] == 0) + { + /* Hex string is short, or of uneven length. + Return the count that has been converted so far. */ + return i; + } + *bin++ = fromhex (hex[0]) * 16 + fromhex (hex[1]); + hex += 2; + } + return i; +} + +int +unhexify (char *bin, const char *hex, int count) +{ + int i; + + for (i = 0; i < count; i++) + { + if (hex[0] == 0 || hex[1] == 0) + { + /* Hex string is short, or of uneven length. + Return the count that has been converted so far. */ + return i; + } + *bin++ = fromhex (hex[0]) * 16 + fromhex (hex[1]); + hex += 2; + } + return i; +} + +void +convert_ascii_to_int (const char *from, unsigned char *to, int n) +{ + int nib1, nib2; + while (n--) + { + nib1 = fromhex (*from++); + nib2 = fromhex (*from++); + *to++ = (((nib1 & 0x0f) << 4) & 0xf0) | (nib2 & 0x0f); + } +} + +int +bin2hex (const gdb_byte *bin, char *hex, int count) +{ + int i; + + /* May use a length, or a nul-terminated string as input. */ + if (count == 0) + count = strlen ((char *) bin); + + for (i = 0; i < count; i++) + { + *hex++ = tohex ((*bin >> 4) & 0xf); + *hex++ = tohex (*bin++ & 0xf); + } + *hex = 0; + return i; +} + +int +hexify (char *hex, const char *bin, int count) +{ + int i; + + /* May use a length, or a nul-terminated string as input. */ + if (count == 0) + count = strlen (bin); + + for (i = 0; i < count; i++) + { + *hex++ = tohex ((*bin >> 4) & 0xf); + *hex++ = tohex (*bin++ & 0xf); + } + *hex = 0; + return i; +} + +void +convert_int_to_ascii (const unsigned char *from, char *to, int n) +{ + int nib; + int ch; + while (n--) + { + ch = *from++; + nib = ((ch & 0xf0) >> 4) & 0x0f; + *to++ = tohex (nib); + nib = ch & 0x0f; + *to++ = tohex (nib); + } + *to++ = 0; +} + +int +remote_escape_output (const gdb_byte *buffer, int len, + gdb_byte *out_buf, int *out_len, + int out_maxlen) +{ + int input_index, output_index; + + output_index = 0; + for (input_index = 0; input_index < len; input_index++) + { + gdb_byte b = buffer[input_index]; + + if (b == '$' || b == '#' || b == '}' || b == '*') + { + /* These must be escaped. */ + if (output_index + 2 > out_maxlen) + break; + out_buf[output_index++] = '}'; + out_buf[output_index++] = b ^ 0x20; + } + else + { + if (output_index + 1 > out_maxlen) + break; + out_buf[output_index++] = b; + } + } + + *out_len = input_index; + return output_index; +} + +int +remote_unescape_input (const gdb_byte *buffer, int len, + gdb_byte *out_buf, int out_maxlen) +{ + int input_index, output_index; + int escaped; + + output_index = 0; + escaped = 0; + for (input_index = 0; input_index < len; input_index++) + { + gdb_byte b = buffer[input_index]; + + if (output_index + 1 > out_maxlen) + error (_("Received too much data from the target.")); + + if (escaped) + { + out_buf[output_index++] = b ^ 0x20; + escaped = 0; + } + else if (b == '}') + escaped = 1; + else + out_buf[output_index++] = b; + } + + if (escaped) + error (_("Unmatched escape character in target response.")); + + return output_index; +} + diff --git a/gdb/common/rsp-low.h b/gdb/common/rsp-low.h new file mode 100644 index 0000000..161c4a2 --- /dev/null +++ b/gdb/common/rsp-low.h @@ -0,0 +1,70 @@ +/* Low-level RSP routines for GDB, the GNU debugger. + + Copyright (C) 1988-2014 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef COMMON_RSP_LOW_H +#define COMMON_RSP_LOW_H + +/* Convert hex digit A to a number, or throw an exception. */ + +extern int fromhex (int a); + +/* Convert number NIB to a hex digit. */ + +extern int tohex (int nib); + +extern char *pack_nibble (char *buf, int nibble); + +extern char *pack_hex_byte (char *pkt, int byte); + +extern char *unpack_varlen_hex (char *buff, ULONGEST *result); + +extern int hex2bin (const char *hex, gdb_byte *bin, int count); + +extern int unhexify (char *bin, const char *hex, int count); + +extern void convert_ascii_to_int (const char *from, unsigned char *to, int n); + +extern int bin2hex (const gdb_byte *bin, char *hex, int count); + +extern int hexify (char *hex, const char *bin, int count); + +extern void convert_int_to_ascii (const unsigned char *from, char *to, int n); + +/* Convert BUFFER, binary data at least LEN bytes long, into escaped + binary data in OUT_BUF. Set *OUT_LEN to the length of the data + encoded in OUT_BUF, and return the number of bytes in OUT_BUF + (which may be more than *OUT_LEN due to escape characters). The + total number of bytes in the output buffer will be at most + OUT_MAXLEN. This function properly escapes '*', and so is suitable + for the server side as well as the client. */ + +extern int remote_escape_output (const gdb_byte *buffer, int len, + gdb_byte *out_buf, int *out_len, + int out_maxlen); + +/* Convert BUFFER, escaped data LEN bytes long, into binary data + in OUT_BUF. Return the number of bytes written to OUT_BUF. + Raise an error if the total number of bytes exceeds OUT_MAXLEN. + + This function reverses remote_escape_output. */ + +extern int remote_unescape_input (const gdb_byte *buffer, int len, + gdb_byte *out_buf, int out_maxlen); + +#endif /* COMMON_RSP_LOW_H */ diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 9cbd5ee..7bf4a0f 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,23 @@ 2014-02-12 Tom Tromey <tromey@redhat.com> + * tracepoint.c: Include rsp-low.h. + * server.c: Include rsp-low.h. + * remote-utils.h (convert_ascii_to_int, convert_int_to_ascii) + (unhexify, hexify, remote_escape_output, unpack_varlen_hex): Don't + declare. + * remote-utils.c: Include rsp-low.h. + (fromhex, hexchars, ishex, unhexify, tohex, hexify) + (remote_escape_output, remote_unescape_input, unpack_varlen_hex) + (convert_int_to_ascii, convert_ascii_to_int): Move to + common/rsp-low.c. + * regcache.c: Include rsp-low.h. + * ax.c: Include rsp-low.h. + * Makefile.in (SFILES): Add common/rsp-low.c. + (OBS): Add rsp-low.o. + (rsp-low.o): New target. + +2014-02-12 Tom Tromey <tromey@redhat.com> + * utils.h (pulongest, plongest, phex_nz): Don't declare. Include print-utils.h. * utils.c (NUMCELLS, CELLSIZE, get_cell, decimal2str, pulongest) diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index 654dfca..5f69ddb 100644 --- a/gdb/gdbserver/Makefile.in +++ b/gdb/gdbserver/Makefile.in @@ -163,7 +163,8 @@ SFILES= $(srcdir)/gdbreplay.c $(srcdir)/inferiors.c $(srcdir)/dll.c \ $(srcdir)/common/linux-osdata.c $(srcdir)/common/ptid.c \ $(srcdir)/common/buffer.c $(srcdir)/common/linux-btrace.c \ $(srcdir)/common/filestuff.c $(srcdir)/target/waitstatus.c \ - $(srcdir)/common/mips-linux-watch.c $(srcdir)/common/print-utils.c + $(srcdir)/common/mips-linux-watch.c $(srcdir)/common/print-utils.c \ + $(srcdir)/common/rsp-low.c DEPFILES = @GDBSERVER_DEPFILES@ @@ -176,7 +177,7 @@ OBS = agent.o ax.o inferiors.o regcache.o remote-utils.o server.o signals.o \ target.o waitstatus.o utils.o debug.o version.o vec.o gdb_vecs.o \ mem-break.o hostio.o event-loop.o tracepoint.o xml-utils.o \ common-utils.o ptid.o buffer.o format.o filestuff.o dll.o notif.o \ - tdesc.o print-utils.o $(XML_BUILTIN) $(DEPFILES) $(LIBOBJS) + tdesc.o print-utils.o rsp-low.o $(XML_BUILTIN) $(DEPFILES) $(LIBOBJS) GDBREPLAY_OBS = gdbreplay.o version.o GDBSERVER_LIBS = @GDBSERVER_LIBS@ XM_CLIBS = @LIBS@ @@ -485,6 +486,9 @@ signals.o: ../common/signals.c print-utils.o: ../common/print-utils.c $(COMPILE) $< $(POSTCOMPILE) +rsp-low.o: ../common/rsp-low.c + $(COMPILE) $< + $(POSTCOMPILE) linux-procfs.o: ../common/linux-procfs.c $(COMPILE) $< $(POSTCOMPILE) diff --git a/gdb/gdbserver/ax.c b/gdb/gdbserver/ax.c index d0f5b30..f62a613 100644 --- a/gdb/gdbserver/ax.c +++ b/gdb/gdbserver/ax.c @@ -20,6 +20,7 @@ #include "ax.h" #include "format.h" #include "tracepoint.h" +#include "rsp-low.h" static void ax_vdebug (const char *, ...) ATTRIBUTE_PRINTF (1, 2); diff --git a/gdb/gdbserver/regcache.c b/gdb/gdbserver/regcache.c index ee4e2a8..f51e498 100644 --- a/gdb/gdbserver/regcache.c +++ b/gdb/gdbserver/regcache.c @@ -20,6 +20,7 @@ #include "regdef.h" #include "gdbthread.h" #include "tdesc.h" +#include "rsp-low.h" #include <stdlib.h> #include <string.h> diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c index 3b88995..b835175 100644 --- a/gdb/gdbserver/remote-utils.c +++ b/gdb/gdbserver/remote-utils.c @@ -22,6 +22,7 @@ #include "gdbthread.h" #include "tdesc.h" #include "dll.h" +#include "rsp-low.h" #include <stdio.h> #include <string.h> @@ -417,66 +418,10 @@ remote_close (void) reset_readchar (); } -/* Convert hex digit A to a number. */ - -static int -fromhex (int a) -{ - if (a >= '0' && a <= '9') - return a - '0'; - else if (a >= 'a' && a <= 'f') - return a - 'a' + 10; - else - error ("Reply contains invalid hex digit"); - return 0; -} - #endif -static const char hexchars[] = "0123456789abcdef"; - -static int -ishex (int ch, int *val) -{ - if ((ch >= 'a') && (ch <= 'f')) - { - *val = ch - 'a' + 10; - return 1; - } - if ((ch >= 'A') && (ch <= 'F')) - { - *val = ch - 'A' + 10; - return 1; - } - if ((ch >= '0') && (ch <= '9')) - { - *val = ch - '0'; - return 1; - } - return 0; -} - #ifndef IN_PROCESS_AGENT -int -unhexify (char *bin, const char *hex, int count) -{ - int i; - - for (i = 0; i < count; i++) - { - if (hex[0] == 0 || hex[1] == 0) - { - /* Hex string is short, or of uneven length. - Return the count that has been converted so far. */ - return i; - } - *bin++ = fromhex (hex[0]) * 16 + fromhex (hex[1]); - hex += 2; - } - return i; -} - void decode_address (CORE_ADDR *addrp, const char *start, int len) { @@ -512,118 +457,8 @@ decode_address_to_semicolon (CORE_ADDR *addrp, const char *start) #endif -/* Convert number NIB to a hex digit. */ - -static int -tohex (int nib) -{ - if (nib < 10) - return '0' + nib; - else - return 'a' + nib - 10; -} - #ifndef IN_PROCESS_AGENT -int -hexify (char *hex, const char *bin, int count) -{ - int i; - - /* May use a length, or a nul-terminated string as input. */ - if (count == 0) - count = strlen (bin); - - for (i = 0; i < count; i++) - { - *hex++ = tohex ((*bin >> 4) & 0xf); - *hex++ = tohex (*bin++ & 0xf); - } - *hex = 0; - return i; -} - -/* Convert BUFFER, binary data at least LEN bytes long, into escaped - binary data in OUT_BUF. Set *OUT_LEN to the length of the data - encoded in OUT_BUF, and return the number of bytes in OUT_BUF - (which may be more than *OUT_LEN due to escape characters). The - total number of bytes in the output buffer will be at most - OUT_MAXLEN. */ - -int -remote_escape_output (const gdb_byte *buffer, int len, - gdb_byte *out_buf, int *out_len, - int out_maxlen) -{ - int input_index, output_index; - - output_index = 0; - for (input_index = 0; input_index < len; input_index++) - { - gdb_byte b = buffer[input_index]; - - if (b == '$' || b == '#' || b == '}' || b == '*') - { - /* These must be escaped. */ - if (output_index + 2 > out_maxlen) - break; - out_buf[output_index++] = '}'; - out_buf[output_index++] = b ^ 0x20; - } - else - { - if (output_index + 1 > out_maxlen) - break; - out_buf[output_index++] = b; - } - } - - *out_len = input_index; - return output_index; -} - -/* Convert BUFFER, escaped data LEN bytes long, into binary data - in OUT_BUF. Return the number of bytes written to OUT_BUF. - Raise an error if the total number of bytes exceeds OUT_MAXLEN. - - This function reverses remote_escape_output. It allows more - escaped characters than that function does, in particular because - '*' must be escaped to avoid the run-length encoding processing - in reading packets. */ - -static int -remote_unescape_input (const gdb_byte *buffer, int len, - gdb_byte *out_buf, int out_maxlen) -{ - int input_index, output_index; - int escaped; - - output_index = 0; - escaped = 0; - for (input_index = 0; input_index < len; input_index++) - { - gdb_byte b = buffer[input_index]; - - if (output_index + 1 > out_maxlen) - error ("Received too much data from the target."); - - if (escaped) - { - out_buf[output_index++] = b ^ 0x20; - escaped = 0; - } - else if (b == '}') - escaped = 1; - else - out_buf[output_index++] = b; - } - - if (escaped) - error ("Unmatched escape character in target response."); - - return output_index; -} - /* Look for a sequence of characters which can be run-length encoded. If there are any, update *CSUM and *P. Otherwise, output the single character. Return the number of characters consumed. */ @@ -670,23 +505,6 @@ try_rle (char *buf, int remaining, unsigned char *csum, char **p) #endif -char * -unpack_varlen_hex (char *buff, /* packet to parse */ - ULONGEST *result) -{ - int nibble; - ULONGEST retval = 0; - - while (ishex (*buff, &nibble)) - { - buff++; - retval = retval << 4; - retval |= nibble & 0x0f; - } - *result = retval; - return buff; -} - #ifndef IN_PROCESS_AGENT /* Write a PTID to BUF. Returns BUF+CHARACTERS_WRITTEN. */ @@ -1230,36 +1048,8 @@ write_enn (char *buf) #endif -void -convert_int_to_ascii (const unsigned char *from, char *to, int n) -{ - int nib; - int ch; - while (n--) - { - ch = *from++; - nib = ((ch & 0xf0) >> 4) & 0x0f; - *to++ = tohex (nib); - nib = ch & 0x0f; - *to++ = tohex (nib); - } - *to++ = 0; -} - #ifndef IN_PROCESS_AGENT -void -convert_ascii_to_int (const char *from, unsigned char *to, int n) -{ - int nib1, nib2; - while (n--) - { - nib1 = fromhex (*from++); - nib2 = fromhex (*from++); - *to++ = (((nib1 & 0x0f) << 4) & 0xf0) | (nib2 & 0x0f); - } -} - static char * outreg (struct regcache *regcache, int regno, char *buf) { diff --git a/gdb/gdbserver/remote-utils.h b/gdb/gdbserver/remote-utils.h index f2f1aa3..a79a35f 100644 --- a/gdb/gdbserver/remote-utils.h +++ b/gdb/gdbserver/remote-utils.h @@ -44,8 +44,6 @@ void initialize_async_io (void); void enable_async_io (void); void disable_async_io (void); void check_remote_input_interrupt_request (void); -void convert_ascii_to_int (const char *from, unsigned char *to, int n); -void convert_int_to_ascii (const unsigned char *from, char *to, int n); void new_thread_notify (int id); void dead_thread_notify (int id); void prepare_resume_reply (char *buf, ptid_t ptid, @@ -68,13 +66,6 @@ int decode_search_memory_packet (const char *buf, int packet_len, gdb_byte *pattern, unsigned int *pattern_lenp); -int unhexify (char *bin, const char *hex, int count); -int hexify (char *hex, const char *bin, int count); -int remote_escape_output (const gdb_byte *buffer, int len, - gdb_byte *out_buf, int *out_len, - int out_maxlen); -char *unpack_varlen_hex (char *buff, ULONGEST *result); - void clear_symbol_cache (struct sym_cache **symcache_p); int look_up_one_symbol (const char *name, CORE_ADDR *addrp, int may_ask_gdb); diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 88354be..e09f2d5 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -21,6 +21,7 @@ #include "agent.h" #include "notif.h" #include "tdesc.h" +#include "rsp-low.h" #include <ctype.h> #include <unistd.h> diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c index 3706577..c61f1d5 100644 --- a/gdb/gdbserver/tracepoint.c +++ b/gdb/gdbserver/tracepoint.c @@ -20,6 +20,7 @@ #include "tracepoint.h" #include "gdbthread.h" #include "agent.h" +#include "rsp-low.h" #include <ctype.h> #include <fcntl.h> diff --git a/gdb/remote.c b/gdb/remote.c index eff4c44..eaaeb74 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -45,6 +45,7 @@ #include "target-descriptions.h" #include "gdb_bfd.h" #include "filestuff.h" +#include "rsp-low.h" #include <sys/time.h> @@ -124,8 +125,6 @@ static void remote_serial_write (const char *str, int len); static void remote_kill (struct target_ops *ops); -static int tohex (int nib); - static int remote_can_async_p (void); static int remote_is_async_p (void); @@ -154,8 +153,6 @@ static void init_extended_remote_ops (void); static void remote_stop (ptid_t); -static int ishex (int ch, int *val); - static int stubhex (int ch); static int hexnumstr (char *, ULONGEST); @@ -176,8 +173,6 @@ static ptid_t remote_current_thread (ptid_t oldptid); static void remote_find_new_threads (void); -static int fromhex (int a); - static int putpkt_binary (char *buf, int cnt); static void check_binary_download (CORE_ADDR addr); @@ -1937,14 +1932,8 @@ struct gdb_ext_thread_info #define BUF_THREAD_ID_SIZE (OPAQUETHREADBYTES * 2) -char *unpack_varlen_hex (char *buff, ULONGEST *result); - static char *unpack_nibble (char *buf, int *val); -static char *pack_nibble (char *buf, int nibble); - -static char *pack_hex_byte (char *pkt, int /* unsigned char */ byte); - static char *unpack_byte (char *buf, int *value); static char *pack_int (char *buf, int value); @@ -2071,31 +2060,6 @@ read_ptid (char *buf, char **obuf) return ptid_build (pid, 0, tid); } -/* Encode 64 bits in 16 chars of hex. */ - -static const char hexchars[] = "0123456789abcdef"; - -static int -ishex (int ch, int *val) -{ - if ((ch >= 'a') && (ch <= 'f')) - { - *val = ch - 'a' + 10; - return 1; - } - if ((ch >= 'A') && (ch <= 'F')) - { - *val = ch - 'A' + 10; - return 1; - } - if ((ch >= '0') && (ch <= '9')) - { - *val = ch - '0'; - return 1; - } - return 0; -} - static int stubhex (int ch) { @@ -2125,23 +2089,6 @@ stub_unpack_int (char *buff, int fieldlength) return retval; } -char * -unpack_varlen_hex (char *buff, /* packet to parse */ - ULONGEST *result) -{ - int nibble; - ULONGEST retval = 0; - - while (ishex (*buff, &nibble)) - { - buff++; - retval = retval << 4; - retval |= nibble & 0x0f; - } - *result = retval; - return buff; -} - static char * unpack_nibble (char *buf, int *val) { @@ -2150,21 +2097,6 @@ unpack_nibble (char *buf, int *val) } static char * -pack_nibble (char *buf, int nibble) -{ - *buf++ = hexchars[(nibble & 0x0f)]; - return buf; -} - -static char * -pack_hex_byte (char *pkt, int byte) -{ - *pkt++ = hexchars[(byte >> 4) & 0xf]; - *pkt++ = hexchars[(byte & 0xf)]; - return pkt; -} - -static char * unpack_byte (char *buf, int *value) { *value = stub_unpack_int (buf, 2); @@ -4665,68 +4597,6 @@ extended_remote_attach (struct target_ops *ops, char *args, int from_tty) extended_remote_attach_1 (ops, args, from_tty); } -/* Convert hex digit A to a number. */ - -static int -fromhex (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 (_("Reply contains invalid hex digit %d"), a); -} - -int -hex2bin (const char *hex, gdb_byte *bin, int count) -{ - int i; - - for (i = 0; i < count; i++) - { - if (hex[0] == 0 || hex[1] == 0) - { - /* Hex string is short, or of uneven length. - Return the count that has been converted so far. */ - return i; - } - *bin++ = fromhex (hex[0]) * 16 + fromhex (hex[1]); - hex += 2; - } - return i; -} - -/* Convert number NIB to a hex digit. */ - -static int -tohex (int nib) -{ - if (nib < 10) - return '0' + nib; - else - return 'a' + nib - 10; -} - -int -bin2hex (const gdb_byte *bin, char *hex, int count) -{ - int i; - - /* May use a length, or a nul-terminated string as input. */ - if (count == 0) - count = strlen ((char *) bin); - - for (i = 0; i < count; i++) - { - *hex++ = tohex ((*bin >> 4) & 0xf); - *hex++ = tohex (*bin++ & 0xf); - } - *hex = 0; - return i; -} /* Check for the availability of vCont. This function should also check the response. */ @@ -6679,91 +6549,6 @@ remote_address_masked (CORE_ADDR addr) return addr; } -/* Convert BUFFER, binary data at least LEN bytes long, into escaped - binary data in OUT_BUF. Set *OUT_LEN to the length of the data - encoded in OUT_BUF, and return the number of bytes in OUT_BUF - (which may be more than *OUT_LEN due to escape characters). The - total number of bytes in the output buffer will be at most - OUT_MAXLEN. */ - -static int -remote_escape_output (const gdb_byte *buffer, int len, - gdb_byte *out_buf, int *out_len, - int out_maxlen) -{ - int input_index, output_index; - - output_index = 0; - for (input_index = 0; input_index < len; input_index++) - { - gdb_byte b = buffer[input_index]; - - if (b == '$' || b == '#' || b == '}') - { - /* These must be escaped. */ - if (output_index + 2 > out_maxlen) - break; - out_buf[output_index++] = '}'; - out_buf[output_index++] = b ^ 0x20; - } - else - { - if (output_index + 1 > out_maxlen) - break; - out_buf[output_index++] = b; - } - } - - *out_len = input_index; - return output_index; -} - -/* Convert BUFFER, escaped data LEN bytes long, into binary data - in OUT_BUF. Return the number of bytes written to OUT_BUF. - Raise an error if the total number of bytes exceeds OUT_MAXLEN. - - This function reverses remote_escape_output. It allows more - escaped characters than that function does, in particular because - '*' must be escaped to avoid the run-length encoding processing - in reading packets. */ - -static int -remote_unescape_input (const gdb_byte *buffer, int len, - gdb_byte *out_buf, int out_maxlen) -{ - int input_index, output_index; - int escaped; - - output_index = 0; - escaped = 0; - for (input_index = 0; input_index < len; input_index++) - { - gdb_byte b = buffer[input_index]; - - if (output_index + 1 > out_maxlen) - { - warning (_("Received too much data from remote target;" - " ignoring overflow.")); - return output_index; - } - - if (escaped) - { - out_buf[output_index++] = b ^ 0x20; - escaped = 0; - } - else if (b == '}') - escaped = 1; - else - out_buf[output_index++] = b; - } - - if (escaped) - error (_("Unmatched escape character in target response.")); - - return output_index; -} - /* Determine whether the remote target supports binary downloading. This is accomplished by sending a no-op memory write of zero length to the target at the specified address. It does not suffice to send diff --git a/gdb/remote.h b/gdb/remote.h index 98c47b1..46b73d9 100644 --- a/gdb/remote.h +++ b/gdb/remote.h @@ -39,12 +39,6 @@ extern void getpkt (char **buf, long *sizeof_buf, int forever); extern int putpkt (char *buf); -extern int hex2bin (const char *hex, gdb_byte *bin, int count); - -extern int bin2hex (const gdb_byte *bin, char *hex, int count); - -extern char *unpack_varlen_hex (char *buff, ULONGEST *result); - void register_remote_g_packet_guess (struct gdbarch *gdbarch, int bytes, const struct target_desc *tdesc); void register_remote_support_xml (const char *); diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 2cb7442..b013d88 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -55,6 +55,7 @@ #include "probe.h" #include "ctf.h" #include "filestuff.h" +#include "rsp-low.h" /* readline include files */ #include "readline/readline.h" |