summaryrefslogtreecommitdiff
path: root/include/hexdump.h
diff options
context:
space:
mode:
authorPeter Jones <pjones@redhat.com>2017-10-19 15:44:12 -0400
committerPeter Jones <pmjones@gmail.com>2018-03-12 16:21:43 -0400
commitdc62a3c4dc3dd590fbba32c46b717088a132eb5e (patch)
tree71993be00c4695abd13d139346346bfb4c791d8d /include/hexdump.h
parent1a44dbb8be12ef2a06d73b8eec07ac0acff27e68 (diff)
downloadefi-boot-shim-dc62a3c4dc3dd590fbba32c46b717088a132eb5e.tar.gz
efi-boot-shim-dc62a3c4dc3dd590fbba32c46b717088a132eb5e.zip
Move includes around to clean the source tree up a bit.
Signed-off-by: Peter Jones <pjones@redhat.com>
Diffstat (limited to 'include/hexdump.h')
-rw-r--r--include/hexdump.h104
1 files changed, 104 insertions, 0 deletions
diff --git a/include/hexdump.h b/include/hexdump.h
new file mode 100644
index 00000000..d5ece4dd
--- /dev/null
+++ b/include/hexdump.h
@@ -0,0 +1,104 @@
+#ifndef STATIC_HEXDUMP_H
+#define STATIC_HEXDUMP_H
+
+static int
+__attribute__((__unused__))
+isprint(char c)
+{
+ if (c < 0x20)
+ return 0;
+ if (c > 0x7e)
+ return 0;
+ return 1;
+}
+
+static UINTN
+__attribute__((__unused__))
+format_hex(UINT8 *data, UINTN size, CHAR16 *buf)
+{
+ UINTN sz = (UINTN)data % 16;
+ CHAR16 hexchars[] = L"0123456789abcdef";
+ int offset = 0;
+ UINTN i;
+ UINTN j;
+
+ for (i = 0; i < sz; i++) {
+ buf[offset++] = L' ';
+ buf[offset++] = L' ';
+ buf[offset++] = L' ';
+ if (i == 7)
+ buf[offset++] = L' ';
+ }
+ for (j = sz; j < 16 && j < size; j++) {
+ UINT8 d = data[j-sz];
+ buf[offset++] = hexchars[(d & 0xf0) >> 4];
+ buf[offset++] = hexchars[(d & 0x0f)];
+ if (j != 15)
+ buf[offset++] = L' ';
+ if (j == 7)
+ buf[offset++] = L' ';
+ }
+ for (i = j; i < 16; i++) {
+ buf[offset++] = L' ';
+ buf[offset++] = L' ';
+ if (i != 15)
+ buf[offset++] = L' ';
+ if (i == 7)
+ buf[offset++] = L' ';
+ }
+ buf[offset] = L'\0';
+ return j - sz;
+}
+
+static void
+__attribute__((__unused__))
+format_text(UINT8 *data, UINTN size, CHAR16 *buf)
+{
+ UINTN sz = (UINTN)data % 16;
+ int offset = 0;
+ UINTN i;
+ UINTN j;
+
+ for (i = 0; i < sz; i++)
+ buf[offset++] = L' ';
+ buf[offset++] = L'|';
+ for (j = sz; j < 16 && j < size; j++) {
+ if (isprint(data[j-sz]))
+ buf[offset++] = data[j-sz];
+ else
+ buf[offset++] = L'.';
+ }
+ buf[offset++] = L'|';
+ for (i = j; i < 16; i++)
+ buf[offset++] = L' ';
+ buf[offset] = L'\0';
+}
+
+static void
+__attribute__((__unused__))
+hexdump(UINT8 *data, UINTN size)
+{
+ UINTN display_offset = (UINTN)data & 0xffffffff;
+ UINTN offset = 0;
+ //Print(L"hexdump: data=0x%016x size=0x%x\n", data, size);
+
+ while (offset < size) {
+ CHAR16 hexbuf[49];
+ CHAR16 txtbuf[19];
+ UINTN sz;
+
+ sz = format_hex(data+offset, size-offset, hexbuf);
+ if (sz == 0)
+ return;
+ uefi_call_wrapper(BS->Stall, 1, 200000);
+
+ format_text(data+offset, size-offset, txtbuf);
+ Print(L"%08x %s %s\n", display_offset, hexbuf, txtbuf);
+ uefi_call_wrapper(BS->Stall, 1, 200000);
+
+ display_offset += sz;
+ offset += sz;
+ }
+}
+
+#endif