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~ Link to the patchwork page: http://patchwork.ozlabs.org/patch/1250727/