aboutsummaryrefslogtreecommitdiff
path: root/sys/gdb/gdb_packet.c
diff options
context:
space:
mode:
authorBenno Rice <benno@FreeBSD.org>2014-09-05 16:40:47 +0000
committerBenno Rice <benno@FreeBSD.org>2014-09-05 16:40:47 +0000
commit27ecc2adbc0b52765d647326836e7314264bcc59 (patch)
tree9c65549c84dd3404b6d357698cfa4a416e414b44 /sys/gdb/gdb_packet.c
parenta5f9f526bd6f4cd2c56ec242da67b739c452f51d (diff)
downloadsrc-27ecc2adbc0b52765d647326836e7314264bcc59.tar.gz
src-27ecc2adbc0b52765d647326836e7314264bcc59.zip
Add support for gdb's memory searching capabilities to our in-kernel gdb
server. Submitted by: Daniel O'Connor <daniel.oconnor@isilon.com> Reviewed by: jhb Sponsored by: EMC Isilon Storage Division
Notes
Notes: svn path=/head/; revision=271173
Diffstat (limited to 'sys/gdb/gdb_packet.c')
-rw-r--r--sys/gdb/gdb_packet.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/sys/gdb/gdb_packet.c b/sys/gdb/gdb_packet.c
index a62cc8d16b36..73ee74f34bd0 100644
--- a/sys/gdb/gdb_packet.c
+++ b/sys/gdb/gdb_packet.c
@@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$");
#include <sys/systm.h>
#include <sys/ctype.h>
#include <sys/kdb.h>
+#include <sys/libkern.h>
#include <sys/ttydefaults.h>
#include <machine/gdb_machdep.h>
@@ -320,3 +321,46 @@ gdb_tx_reg(int regnum)
} else
gdb_tx_mem(regp, regsz);
}
+
+/* Read binary data up until the end of the packet or until we have datalen decoded bytes */
+int
+gdb_rx_bindata(unsigned char *data, size_t datalen, size_t *amt)
+{
+ int c;
+
+ *amt = 0;
+
+ while (*amt < datalen) {
+ c = gdb_rx_char();
+ /* End of packet? */
+ if (c == -1)
+ break;
+ /* Escaped character up next */
+ if (c == '}') {
+ /* Truncated packet? Bail out */
+ if ((c = gdb_rx_char()) == -1)
+ return (1);
+ c ^= 0x20;
+ }
+ *(data++) = c & 0xff;
+ (*amt)++;
+ }
+
+ return (0);
+}
+
+int
+gdb_search_mem(const unsigned char *addr, size_t size, const unsigned char *pat, size_t patlen, const unsigned char **found)
+{
+ void *prev;
+ jmp_buf jb;
+ int ret;
+
+ prev = kdb_jmpbuf(jb);
+ ret = setjmp(jb);
+ if (ret == 0)
+ *found = memmem(addr, size, pat, patlen);
+
+ (void)kdb_jmpbuf(prev);
+ return ((ret == 0) ? 1 : 0);
+}