diff options
author | Benno Rice <benno@FreeBSD.org> | 2014-09-05 16:40:47 +0000 |
---|---|---|
committer | Benno Rice <benno@FreeBSD.org> | 2014-09-05 16:40:47 +0000 |
commit | 27ecc2adbc0b52765d647326836e7314264bcc59 (patch) | |
tree | 9c65549c84dd3404b6d357698cfa4a416e414b44 /sys/gdb/gdb_packet.c | |
parent | a5f9f526bd6f4cd2c56ec242da67b739c452f51d (diff) | |
download | src-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.c | 44 |
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); +} |