]> git.proxmox.com Git - efi-boot-shim.git/blobdiff - include/hexdump.h
New upstream version 15.3
[efi-boot-shim.git] / include / hexdump.h
index d337b571d8d690bf23ce72c470dcb5ef9d0e22c7..381e1a685e20c51f8829cfda40b82e6928d24033 100644 (file)
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+
 #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;
-}
+#include "shim.h"
+#include "include/console.h"
 
-static UINTN
-__attribute__((__unused__))
-format_hex(UINT8 *data, UINTN size, CHAR16 *buf)
+static inline unsigned long UNUSED
+prepare_hex(const void *data, size_t size, char *buf, unsigned int position)
 {
-       UINTN sz = (UINTN)data % 16;
-       CHAR16 hexchars[] = L"0123456789abcdef";
+       char hexchars[] = "0123456789abcdef";
        int offset = 0;
-       UINTN i;
-       UINTN j;
+       unsigned long i;
+       unsigned long j;
+       unsigned long ret;
 
-       for (i = 0; i < sz; i++) {
-               buf[offset++] = L' ';
-               buf[offset++] = L' ';
-               buf[offset++] = L' ';
+       unsigned long before = (position % 16);
+       unsigned long after = (before+size >= 16) ? 0 : 16 - (before+size);
+
+       for (i = 0; i < before; i++) {
+               buf[offset++] = 'X';
+               buf[offset++] = 'X';
+               buf[offset++] = ' ';
                if (i == 7)
-                       buf[offset++] = L' ';
+                       buf[offset++] = ' ';
        }
-       for (j = sz; j < 16 && j < size; j++) {
-               UINT8 d = data[j-sz];
+       for (j = 0; j < 16 - after - before; j++) {
+               uint8_t d = ((uint8_t *)data)[j];
                buf[offset++] = hexchars[(d & 0xf0) >> 4];
                buf[offset++] = hexchars[(d & 0x0f)];
-               if (j != 15)
-                       buf[offset++] = L' ';
-               if (j == 7)
-                       buf[offset++] = L' ';
+               if (i+j != 15)
+                       buf[offset++] = ' ';
+               if (i+j == 7)
+                       buf[offset++] = ' ';
        }
-       for (i = j; i < 16; i++) {
-               buf[offset++] = L' ';
-               buf[offset++] = L' ';
-               if (i != 15)
-                       buf[offset++] = L' ';
-               if (i == 7)
-                       buf[offset++] = L' ';
+       ret = 16 - after - before;
+       j += i;
+       for (i = 0; i < after; i++) {
+               buf[offset++] = 'X';
+               buf[offset++] = 'X';
+               if (i+j != 15)
+                       buf[offset++] = ' ';
+               if (i+j == 7)
+                       buf[offset++] = ' ';
        }
-       buf[offset] = L'\0';
-       return j - sz;
+       buf[offset] = '\0';
+       return ret;
 }
 
-static void
-__attribute__((__unused__))
-format_text(UINT8 *data, UINTN size, CHAR16 *buf)
+static inline void UNUSED
+prepare_text(const void *data, size_t size, char *buf, unsigned int position)
 {
-       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];
+       unsigned long i;
+       unsigned long j;
+
+       unsigned long before = position % 16;
+       unsigned long after = (before+size > 16) ? 0 : 16 - (before+size);
+
+       if (size == 0) {
+               buf[0] = '\0';
+               return;
+       }
+       for (i = 0; i < before; i++)
+               buf[offset++] = 'X';
+       buf[offset++] = '|';
+       for (j = 0; j < 16 - after - before; j++) {
+               if (isprint(((uint8_t *)data)[j]))
+                       buf[offset++] = ((uint8_t *)data)[j];
                else
-                       buf[offset++] = L'.';
+                       buf[offset++] = '.';
        }
-       buf[offset++] = L'|';
-       for (i = j; i < 16; i++)
-               buf[offset++] = L' ';
-       buf[offset] = L'\0';
+       buf[offset++] = size > 0 ? '|' : 'X';
+       buf[offset] = '\0';
 }
 
-static void
-__attribute__((__unused__))
-hexdump(UINT8 *data, UINTN size)
+/*
+ * variadic hexdump formatted
+ * think of it as: printf("%s%s\n", vformat(fmt, ap), hexdump(data,size));
+ */
+static inline void UNUSED EFIAPI
+vhexdumpf(const char *file, int line, const char *func, const CHAR16 *const fmt,
+          const void *data, unsigned long size, size_t at, ms_va_list ap)
 {
-       UINTN display_offset = (UINTN)data & 0xffffffff;
-       UINTN offset = 0;
-       //console_print(L"hexdump: data=0x%016x size=0x%x\n", data, size);
+       unsigned long display_offset = at;
+       unsigned long offset = 0;
+
+       if (verbose == 0)
+               return;
 
        while (offset < size) {
-               CHAR16 hexbuf[49];
-               CHAR16 txtbuf[19];
-               UINTN sz;
+               char hexbuf[49];
+               char txtbuf[19];
+               unsigned long sz;
 
-               sz = format_hex(data+offset, size-offset, hexbuf);
+               sz = prepare_hex(data+offset, size-offset, hexbuf,
+                                (unsigned long)data+offset);
                if (sz == 0)
                        return;
-               msleep(200000);
 
-               format_text(data+offset, size-offset, txtbuf);
-               console_print(L"%08x  %s  %s\n", display_offset, hexbuf, txtbuf);
-               msleep(200000);
+               prepare_text(data+offset, size-offset, txtbuf,
+                            (unsigned long)data+offset);
+               if (fmt && fmt[0] != 0)
+                       vdprint_(fmt, file, line, func, ap);
+               dprint_(L"%a:%d:%a() %08lx  %a  %a\n", file, line, func, display_offset, hexbuf, txtbuf);
 
                display_offset += sz;
                offset += sz;
        }
 }
 
+/*
+ * hexdump formatted
+ * think of it as: printf("%s%s", format(fmt, ...), hexdump(data,size)[lineN]);
+ */
+static inline void UNUSED EFIAPI
+hexdumpf(const char *file, int line, const char *func, const CHAR16 *const fmt,
+         const void *data, unsigned long size, size_t at, ...)
+{
+       ms_va_list ap;
+
+       ms_va_start(ap, at);
+       vhexdumpf(file, line, func, fmt, data, size, at, ap);
+       ms_va_end(ap);
+}
+
+static inline void UNUSED
+hexdump(const char *file, int line, const char *func, const void *data, unsigned long size)
+{
+       hexdumpf(file, line, func, L"", data, size, (intptr_t)data);
+}
+
+static inline void UNUSED
+hexdumpat(const char *file, int line, const char *func, const void *data, unsigned long size, size_t at)
+{
+       hexdumpf(file, line, func, L"", data, size, at);
+}
+
+#define LogHexdump(data, sz) LogHexdump_(__FILE__, __LINE__, __func__, data, sz)
+#define dhexdump(data, sz)   hexdump(__FILE__, __LINE__, __func__, data, sz)
+#define dhexdumpat(data, sz, at) \
+       hexdumpat(__FILE__, __LINE__ - 1, __func__, data, sz, at)
+#define dhexdumpf(fmt, data, sz, at, ...) \
+       hexdumpf(__FILE__, __LINE__ - 1, __func__, fmt, data, sz, at, ##__VA_ARGS__)
+
 #endif /* STATIC_HEXDUMP_H */
+// vim:fenc=utf-8:tw=75:noet