diff --git a/freeldr/freeldr/debug.c b/freeldr/freeldr/debug.c index 9ec15c42a95..8fff6fb42d8 100644 --- a/freeldr/freeldr/debug.c +++ b/freeldr/freeldr/debug.c @@ -234,6 +234,7 @@ VOID DebugPrint(U32 Mask, char *format, ...) { int *dataptr = (int *) &format; char c, *ptr, str[16]; + int ll; // Mask out unwanted debug messages if (!(Mask & DebugPrintMask)) @@ -249,7 +250,7 @@ VOID DebugPrint(U32 Mask, char *format, ...) } dataptr++; - + ll = 0; while ((c = *(format++))) { if (c != '%') @@ -258,11 +259,28 @@ VOID DebugPrint(U32 Mask, char *format, ...) } else { + if (*format == 'I' && *(format+1) == '6' && *(format+2) == '4') + { + ll = 1; + format += 3; + } + else + { + ll = 0; + } switch (c = *(format++)) { case 'd': case 'u': case 'x': - *convert_to_ascii(str, c, *((unsigned long *) dataptr++)) = 0; + if (ll) + { + *convert_i64_to_ascii(str, c, *((unsigned long long*) dataptr)) = 0; + dataptr += 2; + } + else + { + *convert_to_ascii(str, c, *((unsigned long *) dataptr++)) = 0; + } ptr = str; diff --git a/freeldr/freeldr/include/rtl.h b/freeldr/freeldr/include/rtl.h index 7b7c5ed99e5..7ba2a1b62c9 100644 --- a/freeldr/freeldr/include/rtl.h +++ b/freeldr/freeldr/include/rtl.h @@ -70,6 +70,7 @@ int isdigit(int c); int isxdigit(int c); char * convert_to_ascii(char *buf, int c, ...); +char * convert_i64_to_ascii(char *buf, int c, ...); void putchar(int ch); // Implemented in asmcode.S int kbhit(void); // Implemented in asmcode.S diff --git a/freeldr/freeldr/rtl/print.c b/freeldr/freeldr/rtl/print.c index 5ff16e91f15..62c6fcb8406 100644 --- a/freeldr/freeldr/rtl/print.c +++ b/freeldr/freeldr/rtl/print.c @@ -38,6 +38,7 @@ void printf(char *format, ... ) { int *dataptr = (int *) &format; char c, *ptr, str[16]; + int ll; dataptr++; @@ -49,10 +50,26 @@ void printf(char *format, ... ) } else { + if (*format == 'I' && *(format+1) == '6' && *(format+2) == '4') + { + ll = 1; + format += 3; + } + else + { + ll = 0; + } switch (c = *(format++)) { case 'd': case 'u': case 'x': - *convert_to_ascii(str, c, *((unsigned long *) dataptr++)) = 0; + if (ll) + { + *convert_i64_to_ascii(str, c, *((unsigned long long *) dataptr++)) = 0; + } + else + { + *convert_to_ascii(str, c, *((unsigned long *) dataptr++)) = 0; + } ptr = str; @@ -88,6 +105,7 @@ void sprintf(char *buffer, char *format, ... ) int *dataptr = (int *) &format; char c, *ptr, str[16]; char *p = buffer; + int ll; dataptr++; @@ -100,11 +118,27 @@ void sprintf(char *buffer, char *format, ... ) } else { + if (*format == 'I' && *(format+1) == '6' && *(format+2) == '4') + { + ll = 1; + format += 3; + } + else + { + ll = 0; + } switch (c = *(format++)) { case 'd': case 'u': case 'x': - *convert_to_ascii(str, c, *((unsigned long *) dataptr++)) = 0; - + if (ll) + { + *convert_i64_to_ascii(str, c, *((unsigned long long*) dataptr++)) = 0; + } + else + { + *convert_to_ascii(str, c, *((unsigned long *) dataptr++)) = 0; + } + ptr = str; while (*ptr) diff --git a/freeldr/freeldr/rtl/stdlib.c b/freeldr/freeldr/rtl/stdlib.c index 6460efbefcc..0e5551636a2 100644 --- a/freeldr/freeldr/rtl/stdlib.c +++ b/freeldr/freeldr/rtl/stdlib.c @@ -63,6 +63,46 @@ char *convert_to_ascii(char *buf, int c, ...) return ptr; } +char *convert_i64_to_ascii(char *buf, int c, ...) +{ + unsigned long long num = *(long long*)((&c) + 1); + int mult = 10; + char *ptr = buf; + + if (c == 'x') + mult = 16; + + if ((num & 0x8000000000000000uLL) && c == 'd') + { + num = (~num)+1; + *(ptr++) = '-'; + buf++; + } + + do + { + int dig = num % mult; + *(ptr++) = ( (dig > 9) ? dig + 'a' - 10 : '0' + dig ); + } + while (num /= mult); + + /* reorder to correct direction!! */ + { + char *ptr1 = ptr-1; + char *ptr2 = buf; + while (ptr1 > ptr2) + { + int c = *ptr1; + *ptr1 = *ptr2; + *ptr2 = c; + ptr1--; + ptr2++; + } + } + + return ptr; +} + char *itoa(int value, char *string, int radix) { if(radix == 16)