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:
parent
6798617f6d
commit
3b83b74a2c
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user