efi_selftest: enable printing hexadecimal numbers
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 3 Oct 2020 11:12:03 +0000 (13:12 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Tue, 6 Oct 2020 05:43:56 +0000 (07:43 +0200)
Add code to use %x in efi_st_print().

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_selftest/efi_selftest_console.c

index 13f3ee6..0219bd7 100644 (file)
@@ -44,25 +44,28 @@ static void mac(void *pointer, u16 **buf)
 }
 
 /*
- * Print a pointer to an u16 string
+ * printx() - print hexadecimal number to an u16 string
  *
- * @pointer: pointer
- * @buf: pointer to buffer address
- * on return position of terminating zero word
+ * @pointer:   pointer
+ * @prec:      minimum number of digits to print
+ * @buf:       pointer to buffer address,
+ *             on return position of terminating zero word
+ * @size:      size of value to be printed in bytes
  */
-static void pointer(void *pointer, u16 **buf)
+static void printx(u64 p, int prec, u16 **buf)
 {
        int i;
        u16 c;
-       uintptr_t p = (uintptr_t)pointer;
        u16 *pos = *buf;
 
-       for (i = 8 * sizeof(p) - 4; i >= 0; i -= 4) {
-               c = (p >> i) & 0x0f;
-               c += '0';
-               if (c > '9')
-                       c += 'a' - '9' - 1;
-               *pos++ = c;
+       for (i = 2 * sizeof(p) - 1; i >= 0; --i) {
+               c = (p >> (4 * i)) & 0x0f;
+               if (c || pos != *buf || !i || i < prec) {
+                       c += '0';
+                       if (c > '9')
+                               c += 'a' - '9' - 1;
+                       *pos++ = c;
+               }
        }
        *pos = 0;
        *buf = pos;
@@ -212,7 +215,9 @@ void efi_st_printc(int color, const char *fmt, ...)
                                        break;
                                default:
                                        --c;
-                                       pointer(va_arg(args, void*), &pos);
+                                       printx((uintptr_t)va_arg(args, void *),
+                                              2 * sizeof(void *), &pos);
+                                       break;
                                }
                                break;
                        case 's':
@@ -223,6 +228,10 @@ void efi_st_printc(int color, const char *fmt, ...)
                        case 'u':
                                uint2dec(va_arg(args, u32), prec, &pos);
                                break;
+                       case 'x':
+                               printx((u64)va_arg(args, unsigned int),
+                                      prec, &pos);
+                               break;
                        default:
                                break;
                        }