gdbserver: Add mechanism to prevent sending T stop packets
authorAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 28 Feb 2020 21:33:26 +0000 (21:33 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Mon, 2 Mar 2020 15:06:35 +0000 (15:06 +0000)
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.

gdbserver/ChangeLog
gdbserver/remote-utils.cc
gdbserver/server.cc
gdbserver/server.h

index dc8964b463b1ea1f37a5cd88c72720271e90bb3c..7a5a3b7a0371937a4ba84c04b02f4b28aba97740 100644 (file)
@@ -1,3 +1,11 @@
+2020-03-02  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * 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.
+
 2020-02-21  Tom Tromey  <tom@tromey.com>
 
        * Makefile.in (mostlyclean): New target.
index 6b547493a71a91ab02318fa8ad475c0387a26d04..1c211e2572096eae4df94a37e22f54672f87f981 100644 (file)
@@ -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;
index a4cb1eb41819956b4272001b2745143b652d0add..43962adc86c456c72a7a57aa8afe68cb8e5ff4ce 100644 (file)
@@ -130,6 +130,7 @@ bool disable_packet_vCont;
 bool disable_packet_Tthread;
 bool disable_packet_qC;
 bool disable_packet_qfThreadInfo;
+bool disable_packet_T;
 
 static unsigned char *mem_buf;
 
@@ -3649,6 +3650,8 @@ captured_main (int argc, char *argv[])
                disable_packet_qC = true;
              else if (strcmp ("qfThreadInfo", tok) == 0)
                disable_packet_qfThreadInfo = true;
+             else if (strcmp ("T", tok) == 0)
+               disable_packet_T = true;
              else if (strcmp ("threads", tok) == 0)
                {
                  disable_packet_vCont = true;
index 3c286862349a53cfbc70d9aad6925cff88e188f8..5ef48b62c623c0f81350cf3cf1fac34889d4216e 100644 (file)
@@ -76,6 +76,7 @@ extern bool disable_packet_vCont;
 extern bool disable_packet_Tthread;
 extern bool disable_packet_qC;
 extern bool disable_packet_qfThreadInfo;
+extern bool disable_packet_T;
 
 extern bool run_once;
 extern bool non_stop;