All of lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Glass <sjg@chromium.org>
To: u-boot@lists.denx.de
Subject: [PATCH v2 08/12] hexdump: Support any rowsize
Date: Sat,  8 May 2021 07:00:03 -0600	[thread overview]
Message-ID: <20210508130007.1708527-7-sjg@chromium.org> (raw)
In-Reply-To: <20210508130007.1708527-1-sjg@chromium.org>

At present print_hex_dump() only supports either 16- or 32-byte lines.
With U-Boot we want to support any line length up to a maximum of 64.
Update the function to support this, with 0 defaulting to 16, as with
print_buffer().

Signed-off-by: Simon Glass <sjg@chromium.org>
---

(no changes since v1)

 include/hexdump.h |  4 ++--
 lib/hexdump.c     | 12 +++++++++---
 test/print_ut.c   | 23 ++++++++++++++++++++---
 3 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/include/hexdump.h b/include/hexdump.h
index 62fce7ae7b4..b75e26025a4 100644
--- a/include/hexdump.h
+++ b/include/hexdump.h
@@ -85,7 +85,7 @@ static inline char *bin2hex(char *dst, const void *src, size_t count)
  * hex_dump_to_buffer - convert a blob of data to "hex ASCII" in memory
  * @buf: data blob to dump
  * @len: number of bytes in the @buf
- * @rowsize: number of bytes to print per line; must be 16 or 32
+ * @rowsize: number of bytes to print per line; max 64
  * @groupsize: number of bytes to print at a time (1, 2, 4, 8; default = 1)
  * @linebuf: where to put the converted data
  * @linebuflen: total size of @linebuf, including space for terminating NUL
@@ -120,7 +120,7 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize,
  *  caller supplies trailing spaces for alignment if desired
  * @prefix_type: controls whether prefix of an offset, address, or none
  *  is printed (see enum dump_prefix_t)
- * @rowsize: number of bytes to print per line; must be 16 or 32
+ * @rowsize: number of bytes to print per line; max 64
  * @groupsize: number of bytes to print at a time (1, 2, 4, 8; default = 1)
  * @buf: data blob to dump
  * @len: number of bytes in the @buf
diff --git a/lib/hexdump.c b/lib/hexdump.c
index a76ea707b69..a56e108164d 100644
--- a/lib/hexdump.c
+++ b/lib/hexdump.c
@@ -16,6 +16,8 @@
 #include <linux/log2.h>
 #include <asm/unaligned.h>
 
+#define MAX_LINE_LENGTH_BYTES	64
+
 const char hex_asc[] = "0123456789abcdef";
 const char hex_asc_upper[] = "0123456789ABCDEF";
 
@@ -30,8 +32,10 @@ int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize,
 	int ascii_column;
 	int ret;
 
-	if (rowsize != 16 && rowsize != 32)
+	if (!rowsize)
 		rowsize = 16;
+	else
+		rowsize = min(rowsize, MAX_LINE_LENGTH_BYTES);
 
 	if (len > rowsize)		/* limit to one line at a time */
 		len = rowsize;
@@ -126,10 +130,12 @@ void print_hex_dump(const char *prefix_str, int prefix_type, int rowsize,
 {
 	const u8 *ptr = buf;
 	int i, linelen, remaining = len;
-	char linebuf[32 * 3 + 2 + 32 + 1];
+	char linebuf[MAX_LINE_LENGTH_BYTES * 3 + 2 + MAX_LINE_LENGTH_BYTES + 1];
 
-	if (rowsize != 16 && rowsize != 32)
+	if (!rowsize)
 		rowsize = 16;
+	else
+		rowsize = min(rowsize, MAX_LINE_LENGTH_BYTES);
 
 	for (i = 0; i < len; i += rowsize) {
 		linelen = min(remaining, rowsize);
diff --git a/test/print_ut.c b/test/print_ut.c
index b9c4b1142c2..86b1a5477e8 100644
--- a/test/print_ut.c
+++ b/test/print_ut.c
@@ -244,9 +244,26 @@ static int print_do_hex_dump(struct unit_test_state *uts)
 	ut_assert_nextline("00000010: 10 00                                            ..");
 	ut_assert_console_end();
 
+	/* line length */
+	console_record_reset();
+	print_hex_dump("", DUMP_PREFIX_ADDRESS, 8, 1, buf, 0x12, true);
+	ut_assert_nextline("00000000: 00 11 22 33 44 55 66 77  ..\"3DUfw");
+	ut_assert_nextline("00000008: 88 99 aa bb cc dd ee ff  ........");
+	ut_assert_nextline("00000010: 10 00                    ..");
+	ut_assert_console_end();
+	unmap_sysmem(buf);
+
+	/* long line */
+	console_record_reset();
+	buf[0x41] = 0x41;
+	print_hex_dump("", DUMP_PREFIX_ADDRESS, 0x40, 1, buf, 0x42, true);
+	ut_assert_nextline("00000000: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ..\"3DUfw........................................................");
+	ut_assert_nextline("00000040: 00 41                                                                                                                                                                                            .A");
+	ut_assert_console_end();
+
 	/* 16-bit */
 	console_record_reset();
-	print_hex_dump("", DUMP_PREFIX_ADDRESS, 16, 2, buf, 0x12, true);
+	print_hex_dump("", DUMP_PREFIX_ADDRESS, 0, 2, buf, 0x12, true);
 	ut_assert_nextline("00000000: 1100 3322 5544 7766 9988 bbaa ddcc ffee  ..\"3DUfw........");
 	ut_assert_nextline("00000010: 0010                                     ..");
 	ut_assert_console_end();
@@ -254,7 +271,7 @@ static int print_do_hex_dump(struct unit_test_state *uts)
 
 	/* 32-bit */
 	console_record_reset();
-	print_hex_dump("", DUMP_PREFIX_ADDRESS, 16, 4, buf, 0x14, true);
+	print_hex_dump("", DUMP_PREFIX_ADDRESS, 0, 4, buf, 0x14, true);
 	ut_assert_nextline("00000000: 33221100 77665544 bbaa9988 ffeeddcc  ..\"3DUfw........");
 	ut_assert_nextline("00000010: 00000010                             ....");
 	ut_assert_console_end();
@@ -276,7 +293,7 @@ static int print_do_hex_dump(struct unit_test_state *uts)
 	for (i = 0; i < 4; i++)
 		buf[4 + i] = 126 + i;
 	buf[8] = 255;
-	print_hex_dump("", DUMP_PREFIX_ADDRESS, 16, 1, buf, 10, true);
+	print_hex_dump("", DUMP_PREFIX_ADDRESS, 0, 1, buf, 10, true);
 	ut_assert_nextline("00000000: 00 1f 20 21 7e 7f 80 81 ff 99                    .. !~.....");
 	ut_assert_console_end();
 	unmap_sysmem(buf);
-- 
2.31.1.607.g51e8a6a459-goog

  parent reply	other threads:[~2021-05-08 13:00 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-08 12:59 [PATCH v2 00/12] display_options: Start to unify print_buffer() and hexdump Simon Glass
2021-05-08 12:59 ` [PATCH v2 01/12] console: Report an error when output buffer is exhausted Simon Glass
2021-05-08 12:59 ` [PATCH v2 02/12] test: Detect when expect_str is too small Simon Glass
2021-05-08 12:59 ` [PATCH v2 03/12] test: Convert print tests to use ut framework Simon Glass
2021-05-08 12:59 ` [PATCH v2 04/12] test: Add a test for print_buffer() Simon Glass
2021-05-08 13:00 ` [PATCH v2 05/12] display_options: Drop two spaces before the ASCII column Simon Glass
2021-05-08 13:00 ` [PATCH v2 06/12] hexdump: Move API to header file Simon Glass
2021-05-08 13:00 ` [PATCH v2 07/12] hexdump: Add support for sandbox Simon Glass
2021-05-08 13:00 ` Simon Glass [this message]
2021-05-08 13:00 ` [PATCH v2 09/12] hexdump: Allow ctrl-c to interrupt output Simon Glass
2021-05-08 13:00 ` [PATCH v2 10/12] display_options: Split print_buffer() into two functions Simon Glass
2021-05-08 13:00 ` [PATCH v2 11/12] log: Add support for logging a buffer Simon Glass
2021-05-08 13:00 ` [PATCH v2 12/12] RFC: display_options: Use print_hex_dump() for print_buffer() Simon Glass
2021-06-08 21:43 ` [PATCH v2 00/12] display_options: Start to unify print_buffer() and hexdump Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210508130007.1708527-7-sjg@chromium.org \
    --to=sjg@chromium.org \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.