[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