diff options
author | Helge Deller <deller@gmx.de> | 2021-02-10 22:37:14 +0100 |
---|---|---|
committer | Helge Deller <deller@gmx.de> | 2021-09-24 11:10:17 +0200 |
commit | 73b7adcfd3f39cf78693375444613a4e4fa02b83 (patch) | |
tree | e4326be8ddcd2fb97e36466dfd067beeaf5e9321 | |
parent | d94196a29ed371abe2f9f381b5bad701062d0e3e (diff) | |
download | seabios-hppa-73b7adcfd3f39cf78693375444613a4e4fa02b83.zip seabios-hppa-73b7adcfd3f39cf78693375444613a4e4fa02b83.tar.gz seabios-hppa-73b7adcfd3f39cf78693375444613a4e4fa02b83.tar.bz2 |
output.c: Make printf() capable to print 64bit int values
On PA-RISC we want to print some numbers as 64-bits, so
fix the bvprintf() function acordingly.
On x86 printing integers was (and still is) limited to 32bit,
probaby to avoid gcc to insert calls to __umoddi3 and __udivdi3
and thus getting undefined reference linker errors.
Signed-off-by: Helge Deller <deller@gmx.de>
-rw-r--r-- | src/output.c | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/src/output.c b/src/output.c index 6141fb6..fcbc3f9 100644 --- a/src/output.c +++ b/src/output.c @@ -151,9 +151,13 @@ puts_cs(struct putcinfo *action, const char *s) // Output an unsigned integer. static void +#if CONFIG_X86 putuint(struct putcinfo *action, u32 val) +#else +putuint(struct putcinfo *action, u64 val) +#endif { - char buf[12]; + char buf[40]; char *d = &buf[sizeof(buf) - 1]; *d-- = '\0'; for (;;) { @@ -197,9 +201,9 @@ puthex(struct putcinfo *action, u32 val, int width, int uc) // Output an integer in hexadecimal with a minimum width. static void -putprettyhex(struct putcinfo *action, u32 val, int width, char padchar, int uc) +putprettyhex(struct putcinfo *action, u64 val, int width, char padchar, int uc) { - u32 tmp = val; + u64 tmp = val; int count = 1; while (tmp >>= 4) count++; @@ -264,26 +268,29 @@ bvprintf(struct putcinfo *action, const char *fmt, va_list args) c = GET_GLOBAL(*(u8*)n); } s32 val; + s64 val64; const char *sarg; switch (c) { case '%': putc(action, '%'); break; case 'd': - val = va_arg(args, s32); if (is64) - va_arg(args, s32); - if (val < 0) { + val64 = va_arg(args, s64); + else + val64 = va_arg(args, s32); + if (val64 < 0) { putc(action, '-'); - val = -val; + val64 = -val64; } - putuint(action, val); + putuint(action, val64); break; case 'u': - val = va_arg(args, s32); if (is64) - va_arg(args, s32); - putuint(action, val); + val64 = va_arg(args, s64); + else + val64 = va_arg(args, s32); + putuint(action, val64); break; case 'p': val = va_arg(args, s32); @@ -300,16 +307,11 @@ bvprintf(struct putcinfo *action, const char *fmt, va_list args) case 'X': case 'x': uc = (c == 'X'); - val = va_arg(args, s32); - if (is64) { - u32 upper = va_arg(args, s32); - if (upper) { - putprettyhex(action, upper, field_width - 8, padchar, uc); - puthex(action, val, 8, uc); - break; - } - } - putprettyhex(action, val, field_width, padchar, uc); + if (is64) + val64 = va_arg(args, s64); + else + val64 = va_arg(args, s32); + putprettyhex(action, val64, field_width, padchar, uc); break; case 'c': val = va_arg(args, int); |