Lirong Yuan <yua...@google.com> writes:
> On Fri, Mar 6, 2020 at 5:01 PM Lirong Yuan <yua...@google.com> wrote: > >> This allows gdb to access the target’s auxiliary vector, >> which can be helpful for telling system libraries important details >> about the hardware, operating system, and process. >> >> Signed-off-by: Lirong Yuan <yua...@google.com> >> --- >> gdbstub.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 55 insertions(+) >> >> diff --git a/gdbstub.c b/gdbstub.c >> index 22a2d630cd..a946af7007 100644 >> --- a/gdbstub.c >> +++ b/gdbstub.c >> @@ -2105,6 +2105,12 @@ static void handle_query_supported(GdbCmdContext >> *gdb_ctx, void *user_ctx) >> pstrcat(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), >> ";qXfer:features:read+"); >> } >> +#ifdef CONFIG_USER_ONLY >> + if (gdb_ctx->s->c_cpu->opaque) { >> + pstrcat(gdb_ctx->str_buf, sizeof(gdb_ctx->str_buf), >> + ";qXfer:auxv:read+"); >> + } >> +#endif >> >> if (gdb_ctx->num_params && >> strstr(gdb_ctx->params[0].data, "multiprocess+")) { >> @@ -2166,6 +2172,47 @@ static void >> handle_query_xfer_features(GdbCmdContext *gdb_ctx, void *user_ctx) >> put_packet_binary(gdb_ctx->s, gdb_ctx->str_buf, len + 1, true); >> } >> >> +#ifdef CONFIG_USER_ONLY >> +static void handle_query_xfer_auxv(GdbCmdContext *gdb_ctx, void *user_ctx) >> +{ >> + TaskState *ts; >> + unsigned long offset, len, saved_auxv, auxv_len; >> + const char *mem; >> + >> + if (gdb_ctx->num_params < 2) { >> + put_packet(gdb_ctx->s, "E22"); >> + return; >> + } >> + >> + offset = gdb_ctx->params[0].val_ul; >> + len = gdb_ctx->params[1].val_ul; >> + >> + ts = gdb_ctx->s->c_cpu->opaque; >> + saved_auxv = ts->info->saved_auxv; >> + auxv_len = ts->info->auxv_len; >> + mem = (const char *)(saved_auxv + offset); >> + >> + if (offset >= auxv_len) { >> + put_packet(gdb_ctx->s, "E22"); >> + return; >> + } >> + >> + if (len > (MAX_PACKET_LENGTH - 5) / 2) { >> + len = (MAX_PACKET_LENGTH - 5) / 2; >> + } >> + >> + if (len < auxv_len - offset) { >> + gdb_ctx->str_buf[0] = 'm'; >> + len = memtox(gdb_ctx->str_buf + 1, mem, len); >> + } else { >> + gdb_ctx->str_buf[0] = 'l'; >> + len = memtox(gdb_ctx->str_buf + 1, mem, auxv_len - offset); >> + } >> + >> + put_packet_binary(gdb_ctx->s, gdb_ctx->str_buf, len + 1, true); >> +} >> +#endif >> + >> static void handle_query_attached(GdbCmdContext *gdb_ctx, void *user_ctx) >> { >> put_packet(gdb_ctx->s, GDB_ATTACHED); >> @@ -2271,6 +2318,14 @@ static GdbCmdParseEntry gdb_gen_query_table[] = { >> .cmd_startswith = 1, >> .schema = "s:l,l0" >> }, >> +#ifdef CONFIG_USER_ONLY >> + { >> + .handler = handle_query_xfer_auxv, >> + .cmd = "Xfer:auxv:read:", >> + .cmd_startswith = 1, >> + .schema = "l,l0" >> + }, >> +#endif >> { >> .handler = handle_query_attached, >> .cmd = "Attached:", >> -- >> 2.25.1.481.gfbce0eb801-goog >> >> > Friendly ping~ Sorry I missed this on my radar. There was a minor re-factor of gdbstub that was just merged which will mean this patch needs a re-base to use g_string_* functions to expand stings. Also we have some simple gdbstub tests now - could we come up with a multiarch gdbstub test to verify this is working properly? > > Link to the patchwork page: > http://patchwork.ozlabs.org/patch/1250727/ -- Alex Bennée