commit ed31c687145f67db2812ba4209d3cf31d6ac6ccc
parent e9c16becb9194b91b806518f90a0a37905117cdf
Author: Brian Swetland <swetland@frotz.net>
Date: Sun, 21 Jun 2015 20:48:17 -0700
gdb-bridge: support no-ack mode (wow, that speeds stuff up)
Diffstat:
1 file changed, 22 insertions(+), 8 deletions(-)
diff --git a/tools/gdb-bridge.c b/tools/gdb-bridge.c
@@ -243,10 +243,7 @@ static const char *target_xml =
"</feature>"
"</target>";
-void handle_ext_command(struct gdbcnxn *gc, char *cmd, char *args) {
- if (gc->flags & F_TRACE) {
- zprintf("EXT: <%s> <%s>\n", cmd, args);
- }
+static void handle_query(struct gdbcnxn *gc, char *cmd, char *args) {
if (!strcmp(cmd,"Rcmd")) {
char *p = args;
cmd = p;
@@ -259,6 +256,7 @@ void handle_ext_command(struct gdbcnxn *gc, char *cmd, char *args) {
} else if(!strcmp(cmd, "Supported")) {
gdb_puts(gc,
"qXfer:features:read+"
+ ";QStartNoAckMode+"
";PacketSize=2000"
);
} else if(!strcmp(cmd, "Xfer")) {
@@ -268,7 +266,16 @@ void handle_ext_command(struct gdbcnxn *gc, char *cmd, char *args) {
gdb_puts(gc, target_xml);
}
} else {
- zprintf("GDB: unknown command: q%s:%s\n", cmd, args);
+ zprintf("GDB: unsupported: q%s:%s\n", cmd, args);
+ }
+}
+
+static void handle_set(struct gdbcnxn *gc, char *cmd, char *args) {
+ if(!strcmp(cmd, "StartNoAckMode")) {
+ gc->flags &= ~F_ACK;
+ gdb_puts(gc, "OK");
+ } else {
+ zprintf("GDB: unsupported: Q%s:%s\n", cmd, args);
}
}
@@ -322,8 +329,9 @@ void handle_command(struct gdbcnxn *gc, unsigned char *cmd) {
swdp_core_step();
gdb_puts(gc, "S00");
break;
- case 'q': {
- char *args = (char*) ++cmd;
+ case 'q':
+ case 'Q': {
+ char *args = (char*) (cmd + 1);
while (*args) {
if ((*args == ':') || (*args == ',')) {
*args++ = 0;
@@ -331,7 +339,11 @@ void handle_command(struct gdbcnxn *gc, unsigned char *cmd) {
}
args++;
}
- handle_ext_command(gc, (char*) cmd, args);
+ if (cmd[0] == 'q') {
+ handle_query(gc, (char*) (cmd + 1), args);
+ } else {
+ handle_set(gc, (char*) (cmd + 1), args);
+ }
break;
}
@@ -349,6 +361,8 @@ void gdb_server(int fd) {
gdb_init(&gc, fd);
+ gc.flags |= F_TRACE;
+
for (;;) {
r = read(fd, iobuf, sizeof(iobuf));
if (r < 0) {