svn commit: r348253 - head/usr.sbin/bhyve
John Baldwin
jhb at FreeBSD.org
Fri May 24 22:11:38 UTC 2019
Author: jhb
Date: Fri May 24 22:11:37 2019
New Revision: 348253
URL: https://svnweb.freebsd.org/changeset/base/348253
Log:
Add initial support for 'qSupported' to the debug server.
This doesn't recognize any features yet, but does parse the features
string. It advertises an arbitrary packet size of 4k.
Reviewed by: markj, Scott Phillips <d.scott.phillips at intel.com>
MFC after: 2 weeks
Differential Revision: https://reviews.freebsd.org/D20308
Modified:
head/usr.sbin/bhyve/gdb.c
Modified: head/usr.sbin/bhyve/gdb.c
==============================================================================
--- head/usr.sbin/bhyve/gdb.c Fri May 24 20:36:07 2019 (r348252)
+++ head/usr.sbin/bhyve/gdb.c Fri May 24 22:11:37 2019 (r348253)
@@ -993,13 +993,72 @@ command_equals(const uint8_t *data, size_t len, const
}
static void
+check_features(const uint8_t *data, size_t len)
+{
+ char *feature, *next_feature, *str, *value;
+ bool supported;
+
+ str = malloc(len + 1);
+ memcpy(str, data, len);
+ str[len] = '\0';
+ next_feature = str;
+
+ while ((feature = strsep(&next_feature, ";")) != NULL) {
+ /*
+ * Null features shouldn't exist, but skip if they
+ * do.
+ */
+ if (strcmp(feature, "") == 0)
+ continue;
+
+ /*
+ * Look for the value or supported / not supported
+ * flag.
+ */
+ value = strchr(feature, '=');
+ if (value != NULL) {
+ *value = '\0';
+ value++;
+ supported = true;
+ } else {
+ value = feature + strlen(feature) - 1;
+ switch (*value) {
+ case '+':
+ supported = true;
+ break;
+ case '-':
+ supported = false;
+ break;
+ default:
+ /*
+ * This is really a protocol error,
+ * but we just ignore malformed
+ * features for ease of
+ * implementation.
+ */
+ continue;
+ }
+ value = NULL;
+ }
+
+ /* No currently supported features. */
+ }
+ free(str);
+
+ start_packet();
+
+ /* This is an arbitrary limit. */
+ append_string("PacketSize=4096");
+ finish_packet();
+}
+
+static void
gdb_query(const uint8_t *data, size_t len)
{
/*
* TODO:
* - qSearch
- * - qSupported
*/
if (command_equals(data, len, "qAttached")) {
start_packet();
@@ -1037,6 +1096,10 @@ gdb_query(const uint8_t *data, size_t len)
start_packet();
append_char('l');
finish_packet();
+ } else if (command_equals(data, len, "qSupported")) {
+ data += strlen("qSupported");
+ len -= strlen("qSupported");
+ check_features(data, len);
} else if (command_equals(data, len, "qThreadExtraInfo")) {
char buf[16];
int tid;
More information about the svn-src-all
mailing list