aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdbstub.c56
-rw-r--r--gdbstub.h2
2 files changed, 58 insertions, 0 deletions
diff --git a/gdbstub.c b/gdbstub.c
index 155b37c..a14db06 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -944,6 +944,62 @@ int dbg_main(struct dbg_state *state)
break;
/*
+ * Breakpoint
+ * Command Format: Z0,[addr],[type]
+ */
+ case 'Z': {
+ int zero;
+ size_t brk_sz;
+
+ ptr_next += 1;
+ token_expect_integer_arg(zero);
+ token_expect_seperator(',');
+ token_expect_integer_arg(addr);
+ token_expect_seperator(',');
+ token_expect_integer_arg(brk_sz);
+
+ if (zero) {
+ goto error;
+ }
+
+ /* Set breakpoint */
+ if (dbg_sys_breakpoint(addr)) {
+ goto error;
+ }
+
+ dbg_send_ok_packet(pkt_buf, sizeof(pkt_buf));
+ }
+ break;
+
+ /*
+ * Remove Breakpoint
+ * Command Format: Z0,[addr],[type]
+ */
+ case 'z': {
+ int zero;
+ size_t brk_sz;
+
+ ptr_next += 1;
+ token_expect_integer_arg(zero);
+ token_expect_seperator(',');
+ token_expect_integer_arg(addr);
+ token_expect_seperator(',');
+ token_expect_integer_arg(brk_sz);
+
+ if (zero) {
+ goto error;
+ }
+
+ /* Set breakpoint */
+ if (dbg_sys_del_breakpoint(addr)) {
+ goto error;
+ }
+
+ dbg_send_ok_packet(pkt_buf, sizeof(pkt_buf));
+ }
+ break;
+
+ /*
* Unsupported Command
*/
default:
diff --git a/gdbstub.h b/gdbstub.h
index e72635d..da1c05b 100644
--- a/gdbstub.h
+++ b/gdbstub.h
@@ -82,5 +82,7 @@ int dbg_sys_mem_readb(address addr, char *val);
int dbg_sys_mem_writeb(address addr, char val);
int dbg_sys_continue(void);
int dbg_sys_step(void);
+int dbg_sys_breakpoint(address addr);
+int dbg_sys_del_breakpoint(address addr);
#endif