Commit 5d0e57bd authored by Jon Doron's avatar Jon Doron Committed by Alex Bennée
Browse files

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



Signed-off-by: default avatarJon Doron <arilou@gmail.com>
Message-Id: <20190529064148.19856-10-arilou@gmail.com>
Signed-off-by: default avatarAlex Bennée <alex.bennee@linaro.org>
parent 62b3320b
Loading
Loading
Loading
Loading
+38 −12
Original line number Diff line number Diff line
@@ -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':