gdb: Workaround bad gdbserver qSupported:xmlRegisters=i386;UnknwnFeat+ handling
authorPedro Alves <palves@redhat.com>
Thu, 19 Nov 2015 18:31:49 +0000 (18:31 +0000)
committerPedro Alves <palves@redhat.com>
Thu, 19 Nov 2015 18:31:49 +0000 (18:31 +0000)
gdbserver's target_process_qsupported is called for each feature that
the gdbserver common code does not recognize.  The only current
implementation, for x86 Linux, does this:

  static void
  x86_linux_process_qsupported (const char *query)
  {
    /* Return if gdb doesn't support XML.  If gdb sends "xmlRegisters="
       with "i386" in qSupported query, it supports x86 XML target
       descriptions.  */
    use_xml = 0;
    if (query != NULL && startswith (query, "xmlRegisters="))
      {
char *copy = xstrdup (query + 13);
char *p;

for (p = strtok (copy, ","); p != NULL; p = strtok (NULL, ","))
  {
    if (strcmp (p, "i386") == 0)
      {
use_xml = 1;
break;
      }
  }

free (copy);
      }

    x86_linux_update_xmltarget ();
  }

Notice that this clears use_xml and calls x86_linux_update_xmltarget
each time target_process_qsupported is called.  So if gdb sends in any
unknown feature after "xmlRegisters=i386", like e.g.,
"xmlRegisters=i386;UnknownFeature+" gdbserver ends up not reporting a
XML description...

Work around this by having GDB send the "xmlRegisters=" feature last.

gdb/ChangeLog:
2015-11-19  Pedro Alves  <palves@redhat.com>

* remote.c (remote_query_supported): Send the "xmlRegisters="
feature last.

gdb/ChangeLog
gdb/remote.c

index 94721a01639a0aff4315d69f4667fdaa5b02d833..ee1b6ad5263c7b7cca251313d391764a90be52d6 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-19  Pedro Alves  <palves@redhat.com>
+
+       * remote.c (remote_query_supported): Send the "xmlRegisters="
+       feature last.
+
 2015-11-19  Simon Marchi  <simon.marchi@ericsson.com>
 
        * nat/aarch64-linux-hw-point.c (aarch64_linux_set_debug_regs): Change
index 6c86ab2224b50288e84a601779b27a607acd3766..2bbab624b25de95e2446dc0be258a147602d48a6 100644 (file)
@@ -4467,9 +4467,6 @@ remote_query_supported (void)
       if (packet_set_cmd_state (PACKET_hwbreak_feature) != AUTO_BOOLEAN_FALSE)
        q = remote_query_supported_append (q, "hwbreak+");
 
-      if (remote_support_xml)
-       q = remote_query_supported_append (q, remote_support_xml);
-
       q = remote_query_supported_append (q, "qRelocInsn+");
 
       if (rs->extended)
@@ -4488,6 +4485,11 @@ remote_query_supported (void)
       if (packet_set_cmd_state (PACKET_vContSupported) != AUTO_BOOLEAN_FALSE)
        q = remote_query_supported_append (q, "vContSupported+");
 
+      /* Keep this one last to work around a gdbserver <= 7.10 bug in
+        the qSupported:xmlRegisters=i386 handling.  */
+      if (remote_support_xml != NULL)
+       q = remote_query_supported_append (q, remote_support_xml);
+
       q = reconcat (q, "qSupported:", q, (char *) NULL);
       putpkt (q);