aboutsummaryrefslogtreecommitdiff
path: root/gdbserver/remote-utils.cc
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2020-02-28 21:33:26 +0000
committerAndrew Burgess <andrew.burgess@embecosm.com>2020-03-02 15:06:35 +0000
commit442131c1bec1a2ff0b3a5e5d1d91a116ce869dee (patch)
treec3d01004ab2a2a458b61a1c7e0b8379a741ce9c4 /gdbserver/remote-utils.cc
parent590003dc0ea7653ead62899d850fba0a5c4a595e (diff)
downloadfsf-binutils-gdb-442131c1bec1a2ff0b3a5e5d1d91a116ce869dee.zip
fsf-binutils-gdb-442131c1bec1a2ff0b3a5e5d1d91a116ce869dee.tar.gz
fsf-binutils-gdb-442131c1bec1a2ff0b3a5e5d1d91a116ce869dee.tar.bz2
gdbserver: Add mechanism to prevent sending T stop packets
There is a developer only feature in gdbserver that provides a command line option --disable-packet that prevents some packets from being sent, which is used to increase test coverage within GDB. This commit extends this mechanism to prevent GDBserver from sending the T stop reply packets, instead limiting GDBserver to only send the S stop reply packets. The S stop reply packet is part of the older target control mechanism, which has design flaws that were worked around with the introduction of the newer target control mechanism, which uses the T stop reply packet. Limiting GDBserver to use S stop packets instead of T stop packets will, inevitably, mean that GDBserver doesn't function correctly in many cases involving multiple threads, however, I don't think this is too important, this is a developer only feature, intended to allow us to test GDB. A new test that makes use of this feature will be added in the next commit. gdbserver/ChangeLog: * remote-utils.cc (prepare_resume_reply): Add ability to convert T reply into an S reply. * server.cc (disable_packet_T): New global. (captured_main): Set new global when appropriate. * server.h (disable_packet_T): Declare.
Diffstat (limited to 'gdbserver/remote-utils.cc')
-rw-r--r--gdbserver/remote-utils.cc20
1 files changed, 20 insertions, 0 deletions
diff --git a/gdbserver/remote-utils.cc b/gdbserver/remote-utils.cc
index 6b54749..1c211e2 100644
--- a/gdbserver/remote-utils.cc
+++ b/gdbserver/remote-utils.cc
@@ -1204,6 +1204,26 @@ prepare_resume_reply (char *buf, ptid_t ptid,
else
sprintf (buf, "T%02x", status->value.sig);
+ if (disable_packet_T)
+ {
+ /* This is a bit (OK, a lot) of a kludge, however, this isn't
+ really a user feature, but exists only so GDB can use the
+ gdbserver to test handling of the 'S' stop reply packet, so
+ we would rather this code be as simple as possible.
+
+ By this point we've started to build the 'T' stop packet,
+ and it should look like 'Txx....' where 'x' is a hex digit.
+ An 'S' stop packet always looks like 'Sxx', so all we do
+ here is convert the buffer from a T packet to an S packet
+ and the avoid adding any extra content by breaking out. */
+ gdb_assert (*buf == 'T');
+ gdb_assert (isxdigit (*(buf + 1)));
+ gdb_assert (isxdigit (*(buf + 2)));
+ *buf = 'S';
+ *(buf + 3) = '\0';
+ break;
+ }
+
buf += strlen (buf);
saved_thread = current_thread;