lib: sbi: Fix printf handling of long long

Read long long arguments directly using va_arg. Remove original hack for
RV32 that read a long long arg as two long args.

This un-breaks the case on RV64 where e.g. the long long is followed by
an odd number of ints:

    sbi_printf("%d %lld", (int) 1, (long long) 2LL);

Also remove the acnt variable, which is now unused.

Signed-off-by: dramforever <dramforever@live.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
dramforever
2022-07-28 00:30:05 +08:00
committed by Anup Patel
parent f27203525a
commit b9edf49b67

View File

@@ -183,7 +183,7 @@ static int printi(char **out, u32 *out_len, long long i, int b, int sg,
static int print(char **out, u32 *out_len, const char *format, va_list args) static int print(char **out, u32 *out_len, const char *format, va_list args)
{ {
int width, flags, acnt = 0; int width, flags;
int pc = 0; int pc = 0;
char scr[2]; char scr[2];
unsigned long long tmp; unsigned long long tmp;
@@ -216,7 +216,6 @@ static int print(char **out, u32 *out_len, const char *format, va_list args)
} }
if (*format == 's') { if (*format == 's') {
char *s = va_arg(args, char *); char *s = va_arg(args, char *);
acnt += sizeof(char *);
pc += prints(out, out_len, s ? s : "(null)", pc += prints(out, out_len, s ? s : "(null)",
width, flags); width, flags);
continue; continue;
@@ -224,61 +223,40 @@ static int print(char **out, u32 *out_len, const char *format, va_list args)
if ((*format == 'd') || (*format == 'i')) { if ((*format == 'd') || (*format == 'i')) {
pc += printi(out, out_len, va_arg(args, int), pc += printi(out, out_len, va_arg(args, int),
10, 1, width, flags, '0'); 10, 1, width, flags, '0');
acnt += sizeof(int);
continue; continue;
} }
if (*format == 'x') { if (*format == 'x') {
pc += printi(out, out_len, pc += printi(out, out_len,
va_arg(args, unsigned int), 16, 0, va_arg(args, unsigned int), 16, 0,
width, flags, 'a'); width, flags, 'a');
acnt += sizeof(unsigned int);
continue; continue;
} }
if (*format == 'X') { if (*format == 'X') {
pc += printi(out, out_len, pc += printi(out, out_len,
va_arg(args, unsigned int), 16, 0, va_arg(args, unsigned int), 16, 0,
width, flags, 'A'); width, flags, 'A');
acnt += sizeof(unsigned int);
continue; continue;
} }
if (*format == 'u') { if (*format == 'u') {
pc += printi(out, out_len, pc += printi(out, out_len,
va_arg(args, unsigned int), 10, 0, va_arg(args, unsigned int), 10, 0,
width, flags, 'a'); width, flags, 'a');
acnt += sizeof(unsigned int);
continue; continue;
} }
if (*format == 'p') { if (*format == 'p') {
pc += printi(out, out_len, pc += printi(out, out_len,
va_arg(args, unsigned long), 16, 0, va_arg(args, unsigned long), 16, 0,
width, flags, 'a'); width, flags, 'a');
acnt += sizeof(unsigned long);
continue; continue;
} }
if (*format == 'P') { if (*format == 'P') {
pc += printi(out, out_len, pc += printi(out, out_len,
va_arg(args, unsigned long), 16, 0, va_arg(args, unsigned long), 16, 0,
width, flags, 'A'); width, flags, 'A');
acnt += sizeof(unsigned long);
continue; continue;
} }
if (*format == 'l' && *(format + 1) == 'l') { if (*format == 'l' && *(format + 1) == 'l') {
while (acnt &
(sizeof(unsigned long long) - 1)) {
va_arg(args, int);
acnt += sizeof(int);
}
if (sizeof(unsigned long long) ==
sizeof(unsigned long)) {
tmp = va_arg(args, unsigned long long); tmp = va_arg(args, unsigned long long);
acnt += sizeof(unsigned long long);
} else {
((unsigned long *)&tmp)[0] =
va_arg(args, unsigned long);
((unsigned long *)&tmp)[1] =
va_arg(args, unsigned long);
acnt += 2 * sizeof(unsigned long);
}
if (*(format + 2) == 'u') { if (*(format + 2) == 'u') {
format += 2; format += 2;
pc += printi(out, out_len, tmp, 10, 0, pc += printi(out, out_len, tmp, 10, 0,
@@ -310,19 +288,16 @@ static int print(char **out, u32 *out_len, const char *format, va_list args)
out, out_len, out, out_len,
va_arg(args, unsigned long), 16, va_arg(args, unsigned long), 16,
0, width, flags, 'a'); 0, width, flags, 'a');
acnt += sizeof(unsigned long);
} else if (*(format + 1) == 'X') { } else if (*(format + 1) == 'X') {
format += 1; format += 1;
pc += printi( pc += printi(
out, out_len, out, out_len,
va_arg(args, unsigned long), 16, va_arg(args, unsigned long), 16,
0, width, flags, 'A'); 0, width, flags, 'A');
acnt += sizeof(unsigned long);
} else { } else {
pc += printi(out, out_len, pc += printi(out, out_len,
va_arg(args, long), 10, 1, va_arg(args, long), 10, 1,
width, flags, '0'); width, flags, '0');
acnt += sizeof(long);
} }
} }
if (*format == 'c') { if (*format == 'c') {
@@ -330,7 +305,6 @@ static int print(char **out, u32 *out_len, const char *format, va_list args)
scr[0] = va_arg(args, int); scr[0] = va_arg(args, int);
scr[1] = '\0'; scr[1] = '\0';
pc += prints(out, out_len, scr, width, flags); pc += prints(out, out_len, scr, width, flags);
acnt += sizeof(int);
continue; continue;
} }
} else { } else {