Index: subr_prf.c
===================================================================
RCS file: /cvsroot/src/sys/lib/libsa/subr_prf.c,v
retrieving revision 1.16
diff -u -r1.16 subr_prf.c
--- subr_prf.c	24 Nov 2007 13:20:57 -0000	1.16
+++ subr_prf.c	10 Jan 2010 15:27:19 -0000
@@ -43,6 +43,7 @@
 #include "stand.h"
 
 static void kprintn(void (*)(int), u_long, int);
+static void kprintq(void (*)(int), u_longlong_t, int);
 static void sputchar(int);
 static void kdoprnt(void (*)(int), const char *, va_list);
 
@@ -82,7 +83,8 @@
 {
 	char *p;
 	int ch;
-	unsigned long ul;
+	u_long ul;
+	u_longlong_t ull;
 	int lflag;
 
 	for (;;) {
@@ -95,45 +97,66 @@
 reswitch:
 		switch (ch = *fmt++) {
 		case 'l':
-			lflag = 1;
+			if (*fmt == 'l') {
+				++fmt;
+				lflag = 2;
+			} else {
+				lflag = 1;
+			}
 			goto reswitch;
 		case 't':
 #if 0 /* XXX: abuse intptr_t until the situation with ptrdiff_t is clear */
-			lflag = (sizeof(ptrdiff_t) == sizeof(long));
+			lflag = !!(sizeof(ptrdiff_t) == sizeof(long));
 #else
-			lflag = (sizeof(intptr_t) == sizeof(long));
+			lflag = !!(sizeof(intptr_t) == sizeof(long));
 #endif
 			goto reswitch;
 		case 'z':
-			lflag = (sizeof(size_t) == sizeof(unsigned long));
+			lflag = !!(sizeof(size_t) == sizeof(u_long));
 			goto reswitch;
 		case 'c':
 			ch = va_arg(ap, int);
-				put(ch & 0x7f);
+			put(ch & 0xFF);
 			break;
 		case 's':
 			p = va_arg(ap, char *);
-			while ((ch = *p++))
+			while ((ch = (unsigned char)*p++))
 				put(ch);
 			break;
 		case 'd':
-			ul = lflag ?
-			    va_arg(ap, long) : va_arg(ap, int);
-			if ((long)ul < 0) {
-				put('-');
-				ul = -(long)ul;
+			if (lflag == 1) {
+				ull = va_arg(ap, longlong_t);
+				if ((longlong_t)ull < 0) {
+					put('-');
+					ull = -(longlong_t)ull;
+				}
+				kprintq(put, ull, 10);
+			} else {
+				ul = lflag ?
+				    va_arg(ap, long) : va_arg(ap, int);
+				if ((long)ul < 0) {
+					put('-');
+					ul = -(long)ul;
+				}
+				kprintn(put, ul, 10);
 			}
-			kprintn(put, ul, 10);
 			break;
 		case 'o':
-			ul = lflag ?
-			    va_arg(ap, u_long) : va_arg(ap, u_int);
-			kprintn(put, ul, 8);
+#define KPRINT(base)						\
+do {								\
+	if (lflag == 2) {					\
+		ull = va_arg(ap, u_longlong_t);			\
+		kprintq(put, ull, base);			\
+	} else {						\
+		ul = lflag ?					\
+		    va_arg(ap, u_long) : va_arg(ap, u_int);	\
+		kprintn(put, ul, base);				\
+	}							\
+} while (/*CONSTCOND*/0)
+			KPRINT(8);
 			break;
 		case 'u':
-			ul = lflag ?
-			    va_arg(ap, u_long) : va_arg(ap, u_int);
-			kprintn(put, ul, 10);
+			KPRINT(10);
 			break;
 		case 'p':
 			put('0');
@@ -141,9 +164,7 @@
 			lflag = 1;
 			/* FALLTHROUGH */
 		case 'x':
-			ul = lflag ?
-			    va_arg(ap, u_long) : va_arg(ap, u_int);
-			kprintn(put, ul, 16);
+			KPRINT(16);
 			break;
 		default:
 			put('%');
@@ -158,7 +179,7 @@
 }
 
 static void
-kprintn(void (*put)(int), unsigned long ul, int base)
+kprintn(void (*put)(int), u_long ul, int base)
 {
 					/* hold a long in base 8 */
 	char *p, buf[(sizeof(long) * NBBY / 3) + 1];
@@ -171,3 +192,18 @@
 		put(*--p);
 	} while (p > buf);
 }
+
+static void
+kprintq(void (*put)(int), u_longlong_t ull, int base)
+{
+					/* hold a long long in base 8 */
+	char *p, buf[(sizeof(longlong_t) * NBBY / 3) + 1];
+
+	p = buf;
+	do {
+		*p++ = hexdigits[ull % base];
+	} while (ull /= base);
+	do {
+		put(*--p);
+	} while (p > buf);
+}

