|
@@ -301,6 +301,10 @@ static void __init prom_print(const char *msg)
|
|
|
}
|
|
|
|
|
|
|
|
|
+/*
|
|
|
+ * Both prom_print_hex & prom_print_dec takes an unsigned long as input so that
|
|
|
+ * we do not need __udivdi3 or __umoddi3 on 32bits.
|
|
|
+ */
|
|
|
static void __init prom_print_hex(unsigned long val)
|
|
|
{
|
|
|
int i, nibbles = sizeof(val)*2;
|
|
@@ -341,6 +345,7 @@ static void __init prom_printf(const char *format, ...)
|
|
|
va_list args;
|
|
|
unsigned long v;
|
|
|
long vs;
|
|
|
+ int n = 0;
|
|
|
|
|
|
va_start(args, format);
|
|
|
for (p = format; *p != 0; p = q) {
|
|
@@ -359,6 +364,10 @@ static void __init prom_printf(const char *format, ...)
|
|
|
++q;
|
|
|
if (*q == 0)
|
|
|
break;
|
|
|
+ while (*q == 'l') {
|
|
|
+ ++q;
|
|
|
+ ++n;
|
|
|
+ }
|
|
|
switch (*q) {
|
|
|
case 's':
|
|
|
++q;
|
|
@@ -367,39 +376,55 @@ static void __init prom_printf(const char *format, ...)
|
|
|
break;
|
|
|
case 'x':
|
|
|
++q;
|
|
|
- v = va_arg(args, unsigned long);
|
|
|
+ switch (n) {
|
|
|
+ case 0:
|
|
|
+ v = va_arg(args, unsigned int);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ v = va_arg(args, unsigned long);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ default:
|
|
|
+ v = va_arg(args, unsigned long long);
|
|
|
+ break;
|
|
|
+ }
|
|
|
prom_print_hex(v);
|
|
|
break;
|
|
|
- case 'd':
|
|
|
+ case 'u':
|
|
|
++q;
|
|
|
- vs = va_arg(args, int);
|
|
|
- if (vs < 0) {
|
|
|
- prom_print("-");
|
|
|
- vs = -vs;
|
|
|
+ switch (n) {
|
|
|
+ case 0:
|
|
|
+ v = va_arg(args, unsigned int);
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ v = va_arg(args, unsigned long);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ default:
|
|
|
+ v = va_arg(args, unsigned long long);
|
|
|
+ break;
|
|
|
}
|
|
|
- prom_print_dec(vs);
|
|
|
+ prom_print_dec(v);
|
|
|
break;
|
|
|
- case 'l':
|
|
|
+ case 'd':
|
|
|
++q;
|
|
|
- if (*q == 0)
|
|
|
+ switch (n) {
|
|
|
+ case 0:
|
|
|
+ vs = va_arg(args, int);
|
|
|
break;
|
|
|
- else if (*q == 'x') {
|
|
|
- ++q;
|
|
|
- v = va_arg(args, unsigned long);
|
|
|
- prom_print_hex(v);
|
|
|
- } else if (*q == 'u') { /* '%lu' */
|
|
|
- ++q;
|
|
|
- v = va_arg(args, unsigned long);
|
|
|
- prom_print_dec(v);
|
|
|
- } else if (*q == 'd') { /* %ld */
|
|
|
- ++q;
|
|
|
+ case 1:
|
|
|
vs = va_arg(args, long);
|
|
|
- if (vs < 0) {
|
|
|
- prom_print("-");
|
|
|
- vs = -vs;
|
|
|
- }
|
|
|
- prom_print_dec(vs);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ default:
|
|
|
+ vs = va_arg(args, long long);
|
|
|
+ break;
|
|
|
}
|
|
|
+ if (vs < 0) {
|
|
|
+ prom_print("-");
|
|
|
+ vs = -vs;
|
|
|
+ }
|
|
|
+ prom_print_dec(vs);
|
|
|
break;
|
|
|
}
|
|
|
}
|