x86/boot: Add error_putdec() helper
authorH. Peter Anvin <hpa@zytor.com>
Fri, 2 Feb 2024 03:51:43 +0000 (03:51 +0000)
committerBorislav Petkov (AMD) <bp@alien8.de>
Tue, 6 Feb 2024 09:50:21 +0000 (10:50 +0100)
Add a helper to print decimal numbers to early console.

Suggested-by: Borislav Petkov (AMD) <bp@alien8.de>
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Signed-off-by: Jun'ichi Nomura <junichi.nomura@nec.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/lkml/20240123112624.GBZa-iYP1l9SSYtr-V@fat_crate.local/
Link: https://lore.kernel.org/r/20240202035052.17963-1-junichi.nomura@nec.com
arch/x86/boot/compressed/misc.c
arch/x86/boot/compressed/misc.h

index b99e08e6815b1a84ecb016fc53c18d5490e8a96d..bf2aac4f195edcfbdf6ad0237d55aa052f04e0ea 100644 (file)
@@ -164,21 +164,34 @@ void __putstr(const char *s)
        outb(0xff & (pos >> 1), vidport+1);
 }
 
-void __puthex(unsigned long value)
+static noinline void __putnum(unsigned long value, unsigned int base,
+                             int mindig)
 {
-       char alpha[2] = "0";
-       int bits;
+       char buf[8*sizeof(value)+1];
+       char *p;
 
-       for (bits = sizeof(value) * 8 - 4; bits >= 0; bits -= 4) {
-               unsigned long digit = (value >> bits) & 0xf;
+       p = buf + sizeof(buf);
+       *--p = '\0';
 
-               if (digit < 0xA)
-                       alpha[0] = '0' + digit;
-               else
-                       alpha[0] = 'a' + (digit - 0xA);
+       while (mindig-- > 0 || value) {
+               unsigned char digit = value % base;
+               digit += (digit >= 10) ? ('a'-10) : '0';
+               *--p = digit;
 
-               __putstr(alpha);
+               value /= base;
        }
+
+       __putstr(p);
+}
+
+void __puthex(unsigned long value)
+{
+       __putnum(value, 16, sizeof(value)*2);
+}
+
+void __putdec(unsigned long value)
+{
+       __putnum(value, 10, 1);
 }
 
 #ifdef CONFIG_X86_NEED_RELOCS
index bc2f0f17fb90ec35f6e694ad38971e02a80c5fae..6502bc69d1b86d76afedb7984cf492c13594756a 100644 (file)
@@ -63,8 +63,10 @@ void *malloc(int size);
 void free(void *where);
 void __putstr(const char *s);
 void __puthex(unsigned long value);
+void __putdec(unsigned long value);
 #define error_putstr(__x)  __putstr(__x)
 #define error_puthex(__x)  __puthex(__x)
+#define error_putdec(__x)  __putdec(__x)
 
 #ifdef CONFIG_X86_VERBOSE_BOOTUP