hexdump: Support any rowsize
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>
This commit is contained in:
parent
19edf139e9
commit
5d6d2b8838
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user