Message ID | 20190524160118.31134-8-arilou@gmail.com |
---|---|
State | New |
Headers | show |
Series | gdbstub: Refactor command packets handler | expand |
Jon Doron <arilou@gmail.com> writes: > Signed-off-by: Jon Doron <arilou@gmail.com> With the fix to avoid double responses this commit still regresses: 10:46 alex@zen/x86_64 [linux.git/master@origin] >gdb ./builds/arm64/vmlinux -x ~/lsrc/qemu.git/tests/guest-debug/test-gdbstub.py GNU gdb (GDB) 8.3.50.20190424-git Copyright (C) 2019 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Executed .gdbinit Reading symbols from ./builds/arm64/vmlinux... Traceback (most recent call last): File "/home/alex/lsrc/linux.git/builds/arm64/vmlinux-gdb.py", line 30, in <module> import linux.config ImportError: No module named config Connecting to remote 0x0000000040000000 in ?? () Checking we can step the first few instructions 0x0000000040000004 in ?? () 0x0000000040000008 in ?? () 0x000000004000000c in ?? () PASS: single step in boot code Checking HW breakpoint works Hardware assisted breakpoint 1 at 0xffffff8010778f0c: file /home/alex/lsrc/linux.git/init/main.c, line 1068. Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. Thread 1 hit Breakpoint 1, kernel_init (unused=0x0) at /home/alex/lsrc/linux.git/init/main.c:1068 warning: Source file is more recent than executable. 1068 } else 0xffffff8010778f0c <kernel_init> == {int (void *)} 0xffffff8010778f0c <kernel_init> warning: Error removing breakpoint 1 PASS: hbreak @ kernel_init Something might be broken here due to the BP type? Setup catch-all for run_init_process Breakpoint 2 at 0xffffff8010083dc4: file /home/alex/lsrc/linux.git/init/main.c, line 1009. Breakpoint 3 at 0xffffff8010083e10: file /home/alex/lsrc/linux.git/init/main.c, line 1020. Checking Normal breakpoint works Breakpoint 4 at 0xffffff801077b300: file /home/alex/lsrc/linux.git/kernel/sched/completion.c, line 136. Thread 1 received signal SIGTRAP, Trace/breakpoint trap. Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. kernel_init (unused=0x0) at /home/alex/lsrc/linux.git/init/main.c:1068 1068 } else 0xffffff8010778f0c <kernel_init> == {void (struct completion *)} 0xffffff801077b300 <wait_for_completion> 0 warning: Error removing breakpoint 4 FAIL: break @ wait_for_completion Checking watchpoint works Hardware access (read/write) watchpoint 5: *(enum system_states *)(&system_state) Thread 1 received signal SIGTRAP, Trace/breakpoint trap. Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. kernel_init (unused=0x0) at /home/alex/lsrc/linux.git/init/main.c:1068 1068 } else FAIL: awatch for system_state (SYSTEM_BOOTING) Hardware read watchpoint 6: *(enum system_states *)(&system_state) Thread 1 received signal SIGTRAP, Trace/breakpoint trap. Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. kernel_init (unused=0x0) at /home/alex/lsrc/linux.git/init/main.c:1068 1068 } else FAIL: rwatch for system_state (SYSTEM_BOOTING) Hardware watchpoint 7: *(enum system_states *)(&system_state) Thread 1 received signal SIGTRAP, Trace/breakpoint trap. Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. kernel_init (unused=0x0) at /home/alex/lsrc/linux.git/init/main.c:1068 1068 } else FAIL: watch for system_state (SYSTEM_BOOTING) [Inferior 1 (process 1) killed] > --- > gdbstub.c | 84 +++++++++++++++++++++++++++++++++++++++++++------------ > 1 file changed, 66 insertions(+), 18 deletions(-) > > diff --git a/gdbstub.c b/gdbstub.c > index 129a47230f..c59a6765cd 100644 > --- a/gdbstub.c > +++ b/gdbstub.c > @@ -950,7 +950,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; > @@ -1591,6 +1591,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; > @@ -1846,24 +1892,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': > { -- Alex Bennée
diff --git a/gdbstub.c b/gdbstub.c index 129a47230f..c59a6765cd 100644 --- a/gdbstub.c +++ b/gdbstub.c @@ -950,7 +950,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; @@ -1591,6 +1591,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; @@ -1846,24 +1892,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': {
Signed-off-by: Jon Doron <arilou@gmail.com> --- gdbstub.c | 84 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 18 deletions(-)