Commit 77f6ce50 authored by Jon Doron's avatar Jon Doron Committed by Alex Bennée
Browse files

gdbstub: Implement breakpoint commands (Z/z pkt) with new infra



Signed-off-by: default avatarJon Doron <arilou@gmail.com>
Message-Id: <20190529064148.19856-8-arilou@gmail.com>
Signed-off-by: default avatarAlex Bennée <alex.bennee@linaro.org>
parent 3a9651d6
Loading
Loading
Loading
Loading
+67 −19
Original line number Diff line number Diff line
@@ -954,7 +954,7 @@ static inline int xlat_gdb_type(CPUState *cpu, int gdbtype)
}
#endif

static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
static int gdb_breakpoint_insert(int type, target_ulong addr, target_ulong len)
{
    CPUState *cpu;
    int err = 0;
@@ -991,7 +991,7 @@ static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
    }
}

static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
static int gdb_breakpoint_remove(int type, target_ulong addr, target_ulong len)
{
    CPUState *cpu;
    int err = 0;
@@ -1609,6 +1609,52 @@ static void handle_set_thread(GdbCmdContext *gdb_ctx, void *user_ctx)
    }
}

static void handle_insert_bp(GdbCmdContext *gdb_ctx, void *user_ctx)
{
    int res;

    if (gdb_ctx->num_params != 3) {
        put_packet(gdb_ctx->s, "E22");
        return;
    }

    res = gdb_breakpoint_insert(gdb_ctx->params[0].val_ul,
                                gdb_ctx->params[1].val_ull,
                                gdb_ctx->params[2].val_ull);
    if (res >= 0) {
        put_packet(gdb_ctx->s, "OK");
        return;
    } else if (res == -ENOSYS) {
        put_packet(gdb_ctx->s, "");
        return;
    }

    put_packet(gdb_ctx->s, "E22");
}

static void handle_remove_bp(GdbCmdContext *gdb_ctx, void *user_ctx)
{
    int res;

    if (gdb_ctx->num_params != 3) {
        put_packet(gdb_ctx->s, "E22");
        return;
    }

    res = gdb_breakpoint_remove(gdb_ctx->params[0].val_ul,
                                gdb_ctx->params[1].val_ull,
                                gdb_ctx->params[2].val_ull);
    if (res >= 0) {
        put_packet(gdb_ctx->s, "OK");
        return;
    } else if (res == -ENOSYS) {
        put_packet(gdb_ctx->s, "");
        return;
    }

    put_packet(gdb_ctx->s, "E22");
}

static int gdb_handle_packet(GDBState *s, const char *line_buf)
{
    CPUState *cpu;
@@ -1864,24 +1910,26 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
        put_packet(s, "OK");
        break;
    case 'Z':
        {
            static const GdbCmdParseEntry insert_bp_cmd_desc = {
                .handler = handle_insert_bp,
                .cmd = "Z",
                .cmd_startswith = 1,
                .schema = "l?L?L0"
            };
            cmd_parser = &insert_bp_cmd_desc;
        }
        break;
    case 'z':
        type = strtoul(p, (char **)&p, 16);
        if (*p == ',')
            p++;
        addr = strtoull(p, (char **)&p, 16);
        if (*p == ',')
            p++;
        len = strtoull(p, (char **)&p, 16);
        if (ch == 'Z')
            res = gdb_breakpoint_insert(addr, len, type);
        else
            res = gdb_breakpoint_remove(addr, len, type);
        if (res >= 0)
             put_packet(s, "OK");
        else if (res == -ENOSYS)
            put_packet(s, "");
        else
            put_packet(s, "E22");
        {
            static const GdbCmdParseEntry remove_bp_cmd_desc = {
                .handler = handle_remove_bp,
                .cmd = "z",
                .cmd_startswith = 1,
                .schema = "l?L?L0"
            };
            cmd_parser = &remove_bp_cmd_desc;
        }
        break;
    case 'H':
        {