gdbstub: Implement get register (p pkt) with new infra

Signed-off-by: Jon Doron <arilou@gmail.com>
Message-Id: <20190529064148.19856-10-arilou@gmail.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
This commit is contained in:
Jon Doron 2019-05-29 09:41:37 +03:00 committed by Alex Bennée
parent 62b3320bdd
commit 5d0e57bd68
1 changed files with 38 additions and 12 deletions

View File

@ -1676,6 +1676,36 @@ static void handle_set_reg(GdbCmdContext *gdb_ctx, void *user_ctx)
put_packet(gdb_ctx->s, "OK");
}
static void handle_get_reg(GdbCmdContext *gdb_ctx, void *user_ctx)
{
int reg_size;
/*
* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
* This works, but can be very slow. Anything new enough to
* understand XML also knows how to use this properly.
*/
if (!gdb_has_xml) {
put_packet(gdb_ctx->s, "");
return;
}
if (!gdb_ctx->num_params) {
put_packet(gdb_ctx->s, "E14");
return;
}
reg_size = gdb_read_register(gdb_ctx->s->g_cpu, gdb_ctx->mem_buf,
gdb_ctx->params[0].val_ull);
if (!reg_size) {
put_packet(gdb_ctx->s, "E14");
return;
}
memtohex(gdb_ctx->str_buf, gdb_ctx->mem_buf, reg_size);
put_packet(gdb_ctx->s, gdb_ctx->str_buf);
}
static int gdb_handle_packet(GDBState *s, const char *line_buf)
{
CPUState *cpu;
@ -1905,18 +1935,14 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
}
break;
case 'p':
/* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
This works, but can be very slow. Anything new enough to
understand XML also knows how to use this properly. */
if (!gdb_has_xml)
goto unknown_command;
addr = strtoull(p, (char **)&p, 16);
reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
if (reg_size) {
memtohex(buf, mem_buf, reg_size);
put_packet(s, buf);
} else {
put_packet(s, "E14");
{
static const GdbCmdParseEntry get_reg_cmd_desc = {
.handler = handle_get_reg,
.cmd = "p",
.cmd_startswith = 1,
.schema = "L0"
};
cmd_parser = &get_reg_cmd_desc;
}
break;
case 'P':