summaryrefslogtreecommitdiff
path: root/hexdump.h
diff options
context:
space:
mode:
authorMathieu Trudel-Lapierre <cyphermox@ubuntu.com>2017-08-04 12:10:50 -0400
committerMathieu Trudel-Lapierre <cyphermox@ubuntu.com>2017-08-04 12:10:50 -0400
commitbbfd2ab18f52600aa41f061b2da9a2afe2a9d6ac (patch)
tree56132d617fff7c4f05e67024ec872d88fcafa92d /hexdump.h
downloadefi-boot-shim-upstream/0.9+1474479173.6c180c6.tar.gz
efi-boot-shim-upstream/0.9+1474479173.6c180c6.zip
Import Upstream version 0.9+1474479173.6c180c6upstream/0.9+1474479173.6c180c6
Diffstat (limited to 'hexdump.h')
-rw-r--r--hexdump.h104
1 files changed, 104 insertions, 0 deletions
diff --git a/hexdump.h b/hexdump.h
new file mode 100644
index 00000000..d5ece4dd
--- /dev/null
+++ b/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