summaryrefslogtreecommitdiff
path: root/debian/patches/upstreamme0002-kern-make-printf-handle-long-long-integers.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/upstreamme0002-kern-make-printf-handle-long-long-integers.patch')
-rw-r--r--debian/patches/upstreamme0002-kern-make-printf-handle-long-long-integers.patch121
1 files changed, 121 insertions, 0 deletions
diff --git a/debian/patches/upstreamme0002-kern-make-printf-handle-long-long-integers.patch b/debian/patches/upstreamme0002-kern-make-printf-handle-long-long-integers.patch
new file mode 100644
index 0000000..76fa0eb
--- /dev/null
+++ b/debian/patches/upstreamme0002-kern-make-printf-handle-long-long-integers.patch
@@ -0,0 +1,121 @@
+From 81a3958304581ade78069d850261e74a9a58a014 Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Sat, 4 Jul 2015 11:59:48 +0200
+Subject: [PATCH gnumach 2/5] kern: make printf handle long long integers
+
+* Makefile.am (clib_routines): Steal `__umoddi3'.
+* kern/printf.c (MAXBUF): Increase size.
+(printnum, _doprnt): Handle long long integers.
+* kern/printf.h (printnum): Adjust declaration.
+---
+ Makefile.am | 2 +-
+ kern/printf.c | 28 +++++++++++++++++++++-------
+ kern/printf.h | 2 +-
+ 3 files changed, 23 insertions(+), 9 deletions(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index 913db55..76a192b 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -159,7 +159,7 @@ noinst_PROGRAMS += \
+ clib_routines := memcmp memcpy memmove \
+ strchr strstr strsep strtok \
+ htonl htons ntohl ntohs \
+- udivdi3 __udivdi3 \
++ udivdi3 __udivdi3 __umoddi3 \
+ __rel_iplt_start __rel_iplt_end \
+ __ffsdi2 \
+ _START _start etext _edata end _end # actually ld magic, not libc.
+diff --git a/kern/printf.c b/kern/printf.c
+index 1db0d08..e060b9d 100644
+--- a/kern/printf.c
++++ b/kern/printf.c
+@@ -126,11 +126,11 @@
+ #define isdigit(d) ((d) >= '0' && (d) <= '9')
+ #define Ctod(c) ((c) - '0')
+
+-#define MAXBUF (sizeof(long int) * 8) /* enough for binary */
++#define MAXBUF (sizeof(long long int) * 8) /* enough for binary */
+
+
+ void printnum(
+- unsigned long u,
++ unsigned long long u,
+ int base,
+ void (*putc)( char, vm_offset_t ),
+ vm_offset_t putc_arg)
+@@ -178,8 +178,9 @@ void _doprnt(
+ int prec;
+ boolean_t ladjust;
+ char padc;
+- long n;
+- unsigned long u;
++ long long n;
++ unsigned long long u;
++ int have_long_long = 0;
+ int plus_sign;
+ int sign_char;
+ boolean_t altfmt, truncate;
+@@ -276,6 +277,10 @@ void _doprnt(
+
+ if (c == 'l')
+ c = *++fmt; /* need it if sizeof(int) < sizeof(long) */
++ if (c == 'l') {
++ c = *++fmt; /* handle `long long' */
++ have_long_long = 1;
++ }
+
+ truncate = FALSE;
+
+@@ -287,7 +292,10 @@ void _doprnt(
+ boolean_t any;
+ int i;
+
+- u = va_arg(argp, unsigned long);
++ if (! have_long_long)
++ u = va_arg(argp, unsigned long);
++ else
++ u = va_arg(argp, unsigned long long);
+ p = va_arg(argp, char *);
+ base = *p++;
+ printnum(u, base, putc, putc_arg);
+@@ -431,7 +439,10 @@ void _doprnt(
+ goto print_unsigned;
+
+ print_signed:
+- n = va_arg(argp, long);
++ if (! have_long_long)
++ n = va_arg(argp, long);
++ else
++ n = va_arg(argp, long long);
+ if (n >= 0) {
+ u = n;
+ sign_char = plus_sign;
+@@ -443,7 +454,10 @@ void _doprnt(
+ goto print_num;
+
+ print_unsigned:
+- u = va_arg(argp, unsigned long);
++ if (! have_long_long)
++ u = va_arg(argp, unsigned long);
++ else
++ u = va_arg(argp, unsigned long long);
+ goto print_num;
+
+ print_num:
+diff --git a/kern/printf.h b/kern/printf.h
+index 86857d3..76047f0 100644
+--- a/kern/printf.h
++++ b/kern/printf.h
+@@ -35,7 +35,7 @@ extern void _doprnt (const char *fmt,
+ int radix,
+ vm_offset_t putc_arg);
+
+-extern void printnum (unsigned long u, int base,
++extern void printnum (unsigned long long u, int base,
+ void (*putc)(char, vm_offset_t),
+ vm_offset_t putc_arg);
+
+--
+2.1.4
+