[Pdbg] [PATCH v2 1/3] main: Add hexdump() function to dump bytes
Amitay Isaacs
amitay at ozlabs.org
Fri Apr 5 19:17:56 AEDT 2019
Signed-off-by: Amitay Isaacs <amitay at ozlabs.org>
Reviewed-by: Joel Stanley <joel at jms.id.au>
---
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 131e3f9..69e7f3b 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>
+
/**
* @brief Parse a range or a list of numbers from a string into an array
*
@@ -31,4 +34,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
More information about the Pdbg
mailing list