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-head mailing list