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

gdbstub: Implement continue with signal (C pkt) with new infra



Signed-off-by: default avatarJon Doron <arilou@gmail.com>
Reviewed-by: default avatarAlex Bennée <alex.bennee@linaro.org>
Message-Id: <20190529064148.19856-6-arilou@gmail.com>
Signed-off-by: default avatarAlex Bennée <alex.bennee@linaro.org>
parent 4d6e3fe2
Loading
Loading
Loading
Loading
+29 −5
Original line number Diff line number Diff line
@@ -1545,6 +1545,25 @@ static void handle_continue(GdbCmdContext *gdb_ctx, void *user_ctx)
    gdb_continue(gdb_ctx->s);
}

static void handle_cont_with_sig(GdbCmdContext *gdb_ctx, void *user_ctx)
{
    unsigned long signal = 0;

    /*
     * Note: C sig;[addr] is currently unsupported and we simply
     *       omit the addr parameter
     */
    if (gdb_ctx->num_params) {
        signal = gdb_ctx->params[0].val_ul;
    }

    gdb_ctx->s->signal = gdb_signal_to_target(signal);
    if (gdb_ctx->s->signal == -1) {
        gdb_ctx->s->signal = 0;
    }
    gdb_continue(gdb_ctx->s);
}

static int gdb_handle_packet(GDBState *s, const char *line_buf)
{
    CPUState *cpu;
@@ -1592,11 +1611,16 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
        }
        break;
    case 'C':
        s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
        if (s->signal == -1)
            s->signal = 0;
        gdb_continue(s);
        return RS_IDLE;
        {
            static const GdbCmdParseEntry cont_with_sig_cmd_desc = {
                .handler = handle_cont_with_sig,
                .cmd = "C",
                .cmd_startswith = 1,
                .schema = "l0"
            };
            cmd_parser = &cont_with_sig_cmd_desc;
        }
        break;
    case 'v':
        if (strncmp(p, "Cont", 4) == 0) {
            p += 4;