move some rsp bits into rsp-low.h

This moves various low-level remote serial protocol bits into
common/rsp-low.[ch].

This is as close to a pure move as possible.  There are some
redundancies remaining but those will be dealt with in a subsequent
patch.

Note that the two variants of remote_escape_output disagreed on the
treatment of "*".  On the theory that quoting cannot hurt but the
absence possibly can, I chose the gdbserver variant to be the
canonical one.

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>

	* 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.
This commit is contained in:
Tom Tromey 2014-01-18 14:32:47 -07:00
parent 01fd3ea573
commit 9c3d65319a
15 changed files with 400 additions and 447 deletions

View file

@ -1,3 +1,18 @@
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> 2014-02-12 Tom Tromey <tromey@redhat.com>
* utils.h: Include print-utils.h. * utils.h: Include print-utils.h.

View file

@ -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/gdb_vecs.c common/common-utils.c common/xml-utils.c \
common/ptid.c common/buffer.c gdb-dlfcn.c common/agent.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 \ 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 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 \ 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 \ 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 \ 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. # 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 \ gdb_vecs.o jit.o progspace.o skip.o probe.o \
common-utils.o buffer.o ptid.o gdb-dlfcn.o common-agent.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 \ format.o registry.o btrace.o record-btrace.o waitstatus.o \
print-utils.o print-utils.o rsp-low.o
TSOBS = inflow.o TSOBS = inflow.o
@ -2146,6 +2146,10 @@ print-utils.o: ${srcdir}/common/print-utils.c
$(COMPILE) $(srcdir)/common/print-utils.c $(COMPILE) $(srcdir)/common/print-utils.c
$(POSTCOMPILE) $(POSTCOMPILE)
rsp-low.o: ${srcdir}/common/rsp-low.c
$(COMPILE) $(srcdir)/common/rsp-low.c
$(POSTCOMPILE)
# #
# gdb/target/ dependencies # gdb/target/ dependencies
# #

277
gdb/common/rsp-low.c Normal file
View file

@ -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;
}

70
gdb/common/rsp-low.h Normal file
View file

@ -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 */

View file

@ -1,3 +1,21 @@
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> 2014-02-12 Tom Tromey <tromey@redhat.com>
* utils.h (pulongest, plongest, phex_nz): Don't declare. * utils.h (pulongest, plongest, phex_nz): Don't declare.

View file

@ -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/linux-osdata.c $(srcdir)/common/ptid.c \
$(srcdir)/common/buffer.c $(srcdir)/common/linux-btrace.c \ $(srcdir)/common/buffer.c $(srcdir)/common/linux-btrace.c \
$(srcdir)/common/filestuff.c $(srcdir)/target/waitstatus.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@ 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 \ 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 \ 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 \ 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 GDBREPLAY_OBS = gdbreplay.o version.o
GDBSERVER_LIBS = @GDBSERVER_LIBS@ GDBSERVER_LIBS = @GDBSERVER_LIBS@
XM_CLIBS = @LIBS@ XM_CLIBS = @LIBS@
@ -485,6 +486,9 @@ signals.o: ../common/signals.c
print-utils.o: ../common/print-utils.c print-utils.o: ../common/print-utils.c
$(COMPILE) $< $(COMPILE) $<
$(POSTCOMPILE) $(POSTCOMPILE)
rsp-low.o: ../common/rsp-low.c
$(COMPILE) $<
$(POSTCOMPILE)
linux-procfs.o: ../common/linux-procfs.c linux-procfs.o: ../common/linux-procfs.c
$(COMPILE) $< $(COMPILE) $<
$(POSTCOMPILE) $(POSTCOMPILE)

View file

@ -20,6 +20,7 @@
#include "ax.h" #include "ax.h"
#include "format.h" #include "format.h"
#include "tracepoint.h" #include "tracepoint.h"
#include "rsp-low.h"
static void ax_vdebug (const char *, ...) ATTRIBUTE_PRINTF (1, 2); static void ax_vdebug (const char *, ...) ATTRIBUTE_PRINTF (1, 2);

View file

@ -20,6 +20,7 @@
#include "regdef.h" #include "regdef.h"
#include "gdbthread.h" #include "gdbthread.h"
#include "tdesc.h" #include "tdesc.h"
#include "rsp-low.h"
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>

View file

@ -22,6 +22,7 @@
#include "gdbthread.h" #include "gdbthread.h"
#include "tdesc.h" #include "tdesc.h"
#include "dll.h" #include "dll.h"
#include "rsp-low.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -417,66 +418,10 @@ remote_close (void)
reset_readchar (); 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 #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 #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 void
decode_address (CORE_ADDR *addrp, const char *start, int len) 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 #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 #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. /* Look for a sequence of characters which can be run-length encoded.
If there are any, update *CSUM and *P. Otherwise, output the If there are any, update *CSUM and *P. Otherwise, output the
single character. Return the number of characters consumed. */ single character. Return the number of characters consumed. */
@ -670,23 +505,6 @@ try_rle (char *buf, int remaining, unsigned char *csum, char **p)
#endif #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 #ifndef IN_PROCESS_AGENT
/* Write a PTID to BUF. Returns BUF+CHARACTERS_WRITTEN. */ /* Write a PTID to BUF. Returns BUF+CHARACTERS_WRITTEN. */
@ -1230,36 +1048,8 @@ write_enn (char *buf)
#endif #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 #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 * static char *
outreg (struct regcache *regcache, int regno, char *buf) outreg (struct regcache *regcache, int regno, char *buf)
{ {

View file

@ -44,8 +44,6 @@ void initialize_async_io (void);
void enable_async_io (void); void enable_async_io (void);
void disable_async_io (void); void disable_async_io (void);
void check_remote_input_interrupt_request (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 new_thread_notify (int id);
void dead_thread_notify (int id); void dead_thread_notify (int id);
void prepare_resume_reply (char *buf, ptid_t ptid, 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, gdb_byte *pattern,
unsigned int *pattern_lenp); 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); void clear_symbol_cache (struct sym_cache **symcache_p);
int look_up_one_symbol (const char *name, CORE_ADDR *addrp, int may_ask_gdb); int look_up_one_symbol (const char *name, CORE_ADDR *addrp, int may_ask_gdb);

View file

@ -21,6 +21,7 @@
#include "agent.h" #include "agent.h"
#include "notif.h" #include "notif.h"
#include "tdesc.h" #include "tdesc.h"
#include "rsp-low.h"
#include <ctype.h> #include <ctype.h>
#include <unistd.h> #include <unistd.h>

View file

@ -20,6 +20,7 @@
#include "tracepoint.h" #include "tracepoint.h"
#include "gdbthread.h" #include "gdbthread.h"
#include "agent.h" #include "agent.h"
#include "rsp-low.h"
#include <ctype.h> #include <ctype.h>
#include <fcntl.h> #include <fcntl.h>

View file

@ -45,6 +45,7 @@
#include "target-descriptions.h" #include "target-descriptions.h"
#include "gdb_bfd.h" #include "gdb_bfd.h"
#include "filestuff.h" #include "filestuff.h"
#include "rsp-low.h"
#include <sys/time.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 void remote_kill (struct target_ops *ops);
static int tohex (int nib);
static int remote_can_async_p (void); static int remote_can_async_p (void);
static int remote_is_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 void remote_stop (ptid_t);
static int ishex (int ch, int *val);
static int stubhex (int ch); static int stubhex (int ch);
static int hexnumstr (char *, ULONGEST); 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 void remote_find_new_threads (void);
static int fromhex (int a);
static int putpkt_binary (char *buf, int cnt); static int putpkt_binary (char *buf, int cnt);
static void check_binary_download (CORE_ADDR addr); static void check_binary_download (CORE_ADDR addr);
@ -1937,14 +1932,8 @@ struct gdb_ext_thread_info
#define BUF_THREAD_ID_SIZE (OPAQUETHREADBYTES * 2) #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 *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 *unpack_byte (char *buf, int *value);
static char *pack_int (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); 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 static int
stubhex (int ch) stubhex (int ch)
{ {
@ -2125,23 +2089,6 @@ stub_unpack_int (char *buff, int fieldlength)
return retval; 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 * static char *
unpack_nibble (char *buf, int *val) unpack_nibble (char *buf, int *val)
{ {
@ -2149,21 +2096,6 @@ unpack_nibble (char *buf, int *val)
return buf; return buf;
} }
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 * static char *
unpack_byte (char *buf, int *value) unpack_byte (char *buf, int *value)
{ {
@ -4665,68 +4597,6 @@ extended_remote_attach (struct target_ops *ops, char *args, int from_tty)
extended_remote_attach_1 (ops, args, 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 /* Check for the availability of vCont. This function should also check
the response. */ the response. */
@ -6679,91 +6549,6 @@ remote_address_masked (CORE_ADDR addr)
return 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. /* Determine whether the remote target supports binary downloading.
This is accomplished by sending a no-op memory write of zero length 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 to the target at the specified address. It does not suffice to send

View file

@ -39,12 +39,6 @@ extern void getpkt (char **buf, long *sizeof_buf, int forever);
extern int putpkt (char *buf); 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, void register_remote_g_packet_guess (struct gdbarch *gdbarch, int bytes,
const struct target_desc *tdesc); const struct target_desc *tdesc);
void register_remote_support_xml (const char *); void register_remote_support_xml (const char *);

View file

@ -55,6 +55,7 @@
#include "probe.h" #include "probe.h"
#include "ctf.h" #include "ctf.h"
#include "filestuff.h" #include "filestuff.h"
#include "rsp-low.h"
/* readline include files */ /* readline include files */
#include "readline/readline.h" #include "readline/readline.h"