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@intel.com>
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D20308
This commit is contained in:
John Baldwin 2019-05-24 22:11:37 +00:00
parent 65417f5e27
commit 07e007e1ca
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=348253

View File

@ -992,6 +992,66 @@ command_equals(const uint8_t *data, size_t len, const char *cmd)
return (memcmp(data, cmd, strlen(cmd)) == 0);
}
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)
{
@ -999,7 +1059,6 @@ 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;