Message ID | 20190221000851.10704-2-amitay@ozlabs.org |
---|---|
State | Superseded |
Headers | show |
Series | hexdump bytes from getmem | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | warning | master/apply_patch Patch failed to apply |
snowpatch_ozlabs/apply_patch | fail | Failed to apply to any branch |
On Thu, 21 Feb 2019 at 10:39, Amitay Isaacs <amitay@ozlabs.org> wrote: > > Signed-off-by: Amitay Isaacs <amitay@ozlabs.org> Reviewed-by: Joel Stanley <joel@jms.id.au> This would make a handy ccan module. > --- > Makefile.am | 5 ++++- > src/tests/hexdump_test.c | 26 ++++++++++++++++++++++++++ > src/util.c | 35 +++++++++++++++++++++++++++++++++++ > src/util.h | 15 +++++++++++++++ > 4 files changed, 80 insertions(+), 1 deletion(-) > create mode 100644 src/tests/hexdump_test.c > > diff --git a/Makefile.am b/Makefile.am > index f1e06f6..6258405 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -9,7 +9,7 @@ libpdbg_tests = libpdbg_target_test \ > libpdbg_probe_test3 > > bin_PROGRAMS = pdbg > -check_PROGRAMS = $(libpdbg_tests) optcmd_test > +check_PROGRAMS = $(libpdbg_tests) optcmd_test hexdump_test > > PDBG_TESTS = \ > tests/test_selection.sh \ > @@ -67,6 +67,9 @@ DT_headers = $(DT:.dts=.dt.h) > optcmd_test_SOURCES = src/optcmd.c src/parsers.c src/tests/optcmd_test.c > optcmd_test_CFLAGS = -Wall -g > > +hexdump_test_SOURCES = src/util.c src/tests/hexdump_test.c > +hexdump_test_CFLAGS = -Wall -g > + > pdbg_SOURCES = \ > src/cfam.c \ > src/htm.c \ > diff --git a/src/tests/hexdump_test.c b/src/tests/hexdump_test.c > new file mode 100644 > index 0000000..35a43fa > --- /dev/null > +++ b/src/tests/hexdump_test.c > @@ -0,0 +1,26 @@ > +#include <stdio.h> > +#include <stdlib.h> > + > +#include "../util.h" > + > +int main(int argc, const char **argv) > +{ > + uint8_t bytes[1000]; > + int size, i; > + > + size = 0; > + if (argc == 2) > + size = atoi(argv[1]); > + if (size <= 0 || size > 1000) > + size = 1000; > + > + for (i=0; i<1000; i++) > + bytes[i] = i % 0xff; > + > + hexdump(0, bytes, size, 1); > + hexdump(0, bytes, size, 2); > + hexdump(0, bytes, size, 4); > + hexdump(0, bytes, size, 8); > + > + return 0; > +} > diff --git a/src/util.c b/src/util.c > index 3a4520d..3093e36 100644 > --- a/src/util.c > +++ b/src/util.c > @@ -19,6 +19,9 @@ > #include <stdbool.h> > #include <limits.h> > #include <assert.h> > +#include <inttypes.h> > + > +#include "util.h" > > /* Parse argument of the form 0-5,7,9-11,15,17 */ > bool parse_list(const char *arg, int max, int *list, int *count) > @@ -93,3 +96,35 @@ bool parse_list(const char *arg, int max, int *list, int *count) > return true; > } > > +void hexdump(uint64_t addr, uint8_t *buf, uint64_t size, uint8_t group_size) > +{ > + uint64_t i; > + int j, k; > + > + if (group_size == 0) > + group_size = 1; > + > + assert(group_size == 1 || group_size == 2 || group_size == 4 || group_size == 8); > + > + printf("\n"); > + for (i = 0; i < size + 15; i += 16) { > + bool do_prefix = true; > + > + for (j = 0; j < 16; j += group_size) { > + for (k = j; k < j+group_size; k++) { > + if (i + k >= size) { > + printf("\n"); > + return; > + } > + > + if (do_prefix) { > + printf("0x%016"PRIx64": ", addr + i); > + do_prefix = false; > + } > + printf("%02x", buf[i + k]); > + } > + printf(" "); > + } > + printf("\n"); > + } > +} > diff --git a/src/util.h b/src/util.h > index b246e15..7bc6bb1 100644 > --- a/src/util.h > +++ b/src/util.h > @@ -16,6 +16,9 @@ > #ifndef __UTIL_H > #define __UTIL_H > > +#include <stdbool.h> > +#include <stdint.h> > + > #define PPC_BIT(bit) (0x8000000000000000 >> (bit)) > > /** > @@ -33,4 +36,16 @@ > */ > bool parse_list(const char *arg, int max, int *list, int *count); > > +/** > + * @brief Dump bytes in hex similar to hexdump format > + * > + * Prints 16 bytes per line in the specified groups. > + * > + * @param[in] addr Address > + * @param[in] buf Data to print > + * @param[in] size Number of bytes to print > + * @param[in] group_size How to group bytes (valid values 1, 2, 4, 8) > + */ > +void hexdump(uint64_t addr, uint8_t *buf, uint64_t size, uint8_t group_size); > + > #endif > -- > 2.20.1 > > -- > Pdbg mailing list > Pdbg@lists.ozlabs.org > https://lists.ozlabs.org/listinfo/pdbg
diff --git a/Makefile.am b/Makefile.am index f1e06f6..6258405 100644 --- a/Makefile.am +++ b/Makefile.am @@ -9,7 +9,7 @@ libpdbg_tests = libpdbg_target_test \ libpdbg_probe_test3 bin_PROGRAMS = pdbg -check_PROGRAMS = $(libpdbg_tests) optcmd_test +check_PROGRAMS = $(libpdbg_tests) optcmd_test hexdump_test PDBG_TESTS = \ tests/test_selection.sh \ @@ -67,6 +67,9 @@ DT_headers = $(DT:.dts=.dt.h) optcmd_test_SOURCES = src/optcmd.c src/parsers.c src/tests/optcmd_test.c optcmd_test_CFLAGS = -Wall -g +hexdump_test_SOURCES = src/util.c src/tests/hexdump_test.c +hexdump_test_CFLAGS = -Wall -g + pdbg_SOURCES = \ src/cfam.c \ src/htm.c \ diff --git a/src/tests/hexdump_test.c b/src/tests/hexdump_test.c new file mode 100644 index 0000000..35a43fa --- /dev/null +++ b/src/tests/hexdump_test.c @@ -0,0 +1,26 @@ +#include <stdio.h> +#include <stdlib.h> + +#include "../util.h" + +int main(int argc, const char **argv) +{ + uint8_t bytes[1000]; + int size, i; + + size = 0; + if (argc == 2) + size = atoi(argv[1]); + if (size <= 0 || size > 1000) + size = 1000; + + for (i=0; i<1000; i++) + bytes[i] = i % 0xff; + + hexdump(0, bytes, size, 1); + hexdump(0, bytes, size, 2); + hexdump(0, bytes, size, 4); + hexdump(0, bytes, size, 8); + + return 0; +} diff --git a/src/util.c b/src/util.c index 3a4520d..3093e36 100644 --- a/src/util.c +++ b/src/util.c @@ -19,6 +19,9 @@ #include <stdbool.h> #include <limits.h> #include <assert.h> +#include <inttypes.h> + +#include "util.h" /* Parse argument of the form 0-5,7,9-11,15,17 */ bool parse_list(const char *arg, int max, int *list, int *count) @@ -93,3 +96,35 @@ bool parse_list(const char *arg, int max, int *list, int *count) return true; } +void hexdump(uint64_t addr, uint8_t *buf, uint64_t size, uint8_t group_size) +{ + uint64_t i; + int j, k; + + if (group_size == 0) + group_size = 1; + + assert(group_size == 1 || group_size == 2 || group_size == 4 || group_size == 8); + + printf("\n"); + for (i = 0; i < size + 15; i += 16) { + bool do_prefix = true; + + for (j = 0; j < 16; j += group_size) { + for (k = j; k < j+group_size; k++) { + if (i + k >= size) { + printf("\n"); + return; + } + + if (do_prefix) { + printf("0x%016"PRIx64": ", addr + i); + do_prefix = false; + } + printf("%02x", buf[i + k]); + } + printf(" "); + } + printf("\n"); + } +} diff --git a/src/util.h b/src/util.h index b246e15..7bc6bb1 100644 --- a/src/util.h +++ b/src/util.h @@ -16,6 +16,9 @@ #ifndef __UTIL_H #define __UTIL_H +#include <stdbool.h> +#include <stdint.h> + #define PPC_BIT(bit) (0x8000000000000000 >> (bit)) /** @@ -33,4 +36,16 @@ */ bool parse_list(const char *arg, int max, int *list, int *count); +/** + * @brief Dump bytes in hex similar to hexdump format + * + * Prints 16 bytes per line in the specified groups. + * + * @param[in] addr Address + * @param[in] buf Data to print + * @param[in] size Number of bytes to print + * @param[in] group_size How to group bytes (valid values 1, 2, 4, 8) + */ +void hexdump(uint64_t addr, uint8_t *buf, uint64_t size, uint8_t group_size); + #endif
Signed-off-by: Amitay Isaacs <amitay@ozlabs.org> --- Makefile.am | 5 ++++- src/tests/hexdump_test.c | 26 ++++++++++++++++++++++++++ src/util.c | 35 +++++++++++++++++++++++++++++++++++ src/util.h | 15 +++++++++++++++ 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/tests/hexdump_test.c