aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2020-06-05 20:43:43 +0200
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2020-06-05 20:43:43 +0200
commit13012701334821cf1038a81920eaafff1921268a (patch)
tree15e7a9f51668329ea68a3a1422f0da566b11426f
parentb00d0f815b3996a13ce87a4d9d6d7038353e77e6 (diff)
parent6164039940a3344e53ea5e6fdd3a8e37ec698fc5 (diff)
Merge branch 'breakpoints'
-rw-r--r--gdbstub.c63
-rw-r--r--gdbstub.h2
2 files changed, 62 insertions, 3 deletions
diff --git a/gdbstub.c b/gdbstub.c
index 2d8539b..0a7d9cf 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -33,8 +33,6 @@ typedef int (*dbg_dec_func)(const char *buf, size_t buf_len, char *data, size_t
* Const Data
****************************************************************************/
-const char digits[] = "0123456789abcdef";
-
/*****************************************************************************
* Prototypes
****************************************************************************/
@@ -172,6 +170,7 @@ int dbg_strtol(const char *str, size_t len, int base, const char **endptr)
char dbg_get_digit(int val)
{
if ((val >= 0) && (val <= 0xf)) {
+ static const char digits[] = "0123456789abcdef";
return digits[val];
} else {
return EOF;
@@ -742,7 +741,7 @@ int dbg_read(char *buf, size_t buf_len, size_t len)
int dbg_main(struct dbg_state *state)
{
address addr;
- char pkt_buf[512];
+ char pkt_buf[600];
int status;
size_t length;
size_t pkt_len;
@@ -929,6 +928,7 @@ int dbg_main(struct dbg_state *state)
*/
case 'c':
dbg_continue();
+ state->signum = 0;
return 0;
/*
@@ -937,6 +937,7 @@ int dbg_main(struct dbg_state *state)
*/
case 's':
dbg_step();
+ state->signum = 5;
return 0;
case '?':
@@ -944,6 +945,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