Merge branch 'vendor/DHCPCD'
[dragonfly.git] / sys / kern / subr_prf.c
1 /*-
2  * Copyright (c) 1986, 1988, 1991, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  * (c) UNIX System Laboratories, Inc.
5  * All or some portions of this file are derived from material licensed
6  * to the University of California by American Telephone and Telegraph
7  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8  * the permission of UNIX System Laboratories, Inc.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. Neither the name of the University nor the names of its contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  *      @(#)subr_prf.c  8.3 (Berkeley) 1/21/94
35  * $FreeBSD: src/sys/kern/subr_prf.c,v 1.61.2.5 2002/08/31 18:22:08 dwmalone Exp $
36  */
37
38 #include "opt_ddb.h"
39
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/kernel.h>
43 #include <sys/msgbuf.h>
44 #include <sys/malloc.h>
45 #include <sys/proc.h>
46 #include <sys/priv.h>
47 #include <sys/tty.h>
48 #include <sys/tprintf.h>
49 #include <sys/stdint.h>
50 #include <sys/syslog.h>
51 #include <sys/cons.h>
52 #include <sys/uio.h>
53 #include <sys/sysctl.h>
54 #include <sys/lock.h>
55 #include <sys/ctype.h>
56 #include <sys/eventhandler.h>
57 #include <sys/kthread.h>
58 #include <sys/cpu_topology.h>
59
60 #include <sys/thread2.h>
61 #include <sys/spinlock2.h>
62
63 #ifdef DDB
64 #include <ddb/ddb.h>
65 #endif
66
67 /*
68  * Note that stdarg.h and the ANSI style va_start macro is used for both
69  * ANSI and traditional C compilers.  We use the __ machine version to stay
70  * within the kernel header file set.
71  */
72 #include <machine/stdarg.h>
73
74 #define TOCONS          0x01
75 #define TOTTY           0x02
76 #define TOLOG           0x04
77 #define TOWAKEUP        0x08
78 #define TONOSPIN        0x10    /* avoid serialization */
79
80 /* Max number conversion buffer length: a u_quad_t in base 2, plus NUL byte. */
81 #define MAXNBUF (sizeof(intmax_t) * NBBY + 1)
82
83 struct putchar_arg {
84         int     flags;
85         int     pri;
86         struct  tty *tty;
87 };
88
89 struct snprintf_arg {
90         char    *str;
91         size_t  remain;
92 };
93
94 extern  int log_open;
95
96 struct  tty *constty;                   /* pointer to console "window" tty */
97
98 static void  msglogchar(int c, int pri);
99 static void  msgaddchar(int c, void *dummy);
100 static void  kputchar (int ch, void *arg);
101 static char *ksprintn (char *nbuf, uintmax_t num, int base, int *lenp,
102                        int upper);
103 static void  snprintf_func (int ch, void *arg);
104
105 static int consintr = 1;                /* Ok to handle console interrupts? */
106 static int msgbufmapped;                /* Set when safe to use msgbuf */
107 static struct spinlock cons_spin = SPINLOCK_INITIALIZER(cons_spin, "cons_spin");
108 static thread_t constty_td = NULL;
109
110 int msgbuftrigger;
111
112 static int      log_console_output = 1;
113 TUNABLE_INT("kern.log_console_output", &log_console_output);
114 SYSCTL_INT(_kern, OID_AUTO, log_console_output, CTLFLAG_RW,
115     &log_console_output, 0, "Duplicate console output to the syslog");
116 static int      kprintf_logging = TOLOG | TOCONS;
117 TUNABLE_INT("kern.kprintf_logging", &kprintf_logging);
118 SYSCTL_INT(_kern, OID_AUTO, kprintf_logging, CTLFLAG_RW,
119     &kprintf_logging, 0, "kprintf() target bitmask: 0x1=console 0x4=dmesg");
120
121 static int ptr_restrict = 0;
122 TUNABLE_INT("security.ptr_restrict", &ptr_restrict);
123 SYSCTL_INT(_security, OID_AUTO, ptr_restrict, CTLFLAG_RW, &ptr_restrict, 0,
124     "Prevent leaking the kernel pointers back to userland");
125
126 static int unprivileged_read_msgbuf = 1;
127 TUNABLE_INT("security.unprivileged_read_msgbuf", &unprivileged_read_msgbuf);
128 SYSCTL_INT(_security, OID_AUTO, unprivileged_read_msgbuf, CTLFLAG_RW,
129     &unprivileged_read_msgbuf, 0,
130     "Unprivileged processes may read the kernel message buffer");
131
132 /*
133  * Warn that a system table is full.
134  */
135 void
136 tablefull(const char *tab)
137 {
138
139         log(LOG_ERR, "%s: table is full\n", tab);
140 }
141
142 /*
143  * Uprintf prints to the controlling terminal for the current process.
144  */
145 int
146 uprintf(const char *fmt, ...)
147 {
148         struct proc *p = curproc;
149         __va_list ap;
150         struct putchar_arg pca;
151         int retval = 0;
152
153         if (p && (p->p_flags & P_CONTROLT) && p->p_session->s_ttyvp) {
154                 __va_start(ap, fmt);
155                 pca.tty = p->p_session->s_ttyp;
156                 pca.flags = TOTTY;
157
158                 retval = kvcprintf(fmt, kputchar, &pca, ap);
159                 __va_end(ap);
160         }
161         return (retval);
162 }
163
164 tpr_t
165 tprintf_open(struct proc *p)
166 {
167         if ((p->p_flags & P_CONTROLT) && p->p_session->s_ttyvp) {
168                 sess_hold(p->p_session);
169                 return ((tpr_t) p->p_session);
170         }
171         return (NULL);
172 }
173
174 void
175 tprintf_close(tpr_t sess)
176 {
177         if (sess)
178                 sess_rele((struct session *) sess);
179 }
180
181 /*
182  * tprintf prints on the controlling terminal associated
183  * with the given session.
184  */
185 int
186 tprintf(tpr_t tpr, const char *fmt, ...)
187 {
188         struct session *sess = (struct session *)tpr;
189         struct tty *tp = NULL;
190         int flags = TOLOG;
191         __va_list ap;
192         struct putchar_arg pca;
193         int retval;
194
195         if (sess && sess->s_ttyvp && ttycheckoutq(sess->s_ttyp, 0)) {
196                 flags |= TOTTY;
197                 tp = sess->s_ttyp;
198         }
199         __va_start(ap, fmt);
200         pca.tty = tp;
201         pca.flags = flags;
202         pca.pri = LOG_INFO;
203         retval = kvcprintf(fmt, kputchar, &pca, ap);
204         __va_end(ap);
205         msgbuftrigger = 1;
206         return (retval);
207 }
208
209 /*
210  * Ttyprintf displays a message on a tty; it should be used only by
211  * the tty driver, or anything that knows the underlying tty will not
212  * be revoke(2)'d away.  Other callers should use tprintf.
213  */
214 int
215 ttyprintf(struct tty *tp, const char *fmt, ...)
216 {
217         __va_list ap;
218         struct putchar_arg pca;
219         int retval;
220
221         __va_start(ap, fmt);
222         pca.tty = tp;
223         pca.flags = TOTTY;
224         retval = kvcprintf(fmt, kputchar, &pca, ap);
225         __va_end(ap);
226         return (retval);
227 }
228
229 /*
230  * Log writes to the log buffer, and guarantees not to sleep (so can be
231  * called by interrupt routines).  If there is no process reading the
232  * log yet, it writes to the console also.
233  */
234 int
235 log(int level, const char *fmt, ...)
236 {
237         __va_list ap;
238         int retval;
239         struct putchar_arg pca;
240
241         pca.tty = NULL;
242         pca.pri = level;
243         if ((kprintf_logging & TOCONS) == 0 || log_open)
244                 pca.flags = TOLOG;
245         else
246                 pca.flags = TOCONS;
247
248         __va_start(ap, fmt);
249         retval = kvcprintf(fmt, kputchar, &pca, ap);
250         __va_end(ap);
251
252         msgbuftrigger = 1;
253         return (retval);
254 }
255
256 #define CONSCHUNK 128
257
258 void
259 log_console(struct uio *uio)
260 {
261         int c, i, error, iovlen, nl;
262         struct uio muio;
263         struct iovec *miov = NULL;
264         char *consbuffer;
265         int pri;
266
267         if (!log_console_output)
268                 return;
269
270         pri = LOG_INFO | LOG_CONSOLE;
271         muio = *uio;
272         iovlen = uio->uio_iovcnt * sizeof (struct iovec);
273         miov = kmalloc(iovlen, M_TEMP, M_WAITOK);
274         consbuffer = kmalloc(CONSCHUNK, M_TEMP, M_WAITOK);
275         bcopy((caddr_t)muio.uio_iov, (caddr_t)miov, iovlen);
276         muio.uio_iov = miov;
277         uio = &muio;
278
279         nl = 0;
280         while (uio->uio_resid > 0) {
281                 c = (int)szmin(uio->uio_resid, CONSCHUNK);
282                 error = uiomove(consbuffer, (size_t)c, uio);
283                 if (error != 0)
284                         break;
285                 for (i = 0; i < c; i++) {
286                         msglogchar(consbuffer[i], pri);
287                         if (consbuffer[i] == '\n')
288                                 nl = 1;
289                         else
290                                 nl = 0;
291                 }
292         }
293         if (!nl)
294                 msglogchar('\n', pri);
295         msgbuftrigger = 1;
296         kfree(miov, M_TEMP);
297         kfree(consbuffer, M_TEMP);
298         return;
299 }
300
301 /*
302  * Output to the console.
303  */
304 int
305 kprintf(const char *fmt, ...)
306 {
307         __va_list ap;
308         int savintr;
309         struct putchar_arg pca;
310         int retval;
311
312         savintr = consintr;             /* disable interrupts */
313         consintr = 0;
314         __va_start(ap, fmt);
315         pca.tty = NULL;
316         pca.flags = kprintf_logging & ~TOTTY;
317         pca.pri = -1;
318         retval = kvcprintf(fmt, kputchar, &pca, ap);
319         __va_end(ap);
320         if (!panicstr)
321                 msgbuftrigger = 1;
322         consintr = savintr;             /* reenable interrupts */
323         return (retval);
324 }
325
326 int
327 kvprintf(const char *fmt, __va_list ap)
328 {
329         int savintr;
330         struct putchar_arg pca;
331         int retval;
332
333         savintr = consintr;             /* disable interrupts */
334         consintr = 0;
335         pca.tty = NULL;
336         pca.flags = kprintf_logging & ~TOTTY;
337         pca.pri = -1;
338         retval = kvcprintf(fmt, kputchar, &pca, ap);
339         if (!panicstr)
340                 msgbuftrigger = 1;
341         consintr = savintr;             /* reenable interrupts */
342         return (retval);
343 }
344
345 /*
346  * Limited rate kprintf.  The passed rate structure must be initialized
347  * with the desired reporting frequency.  A frequency of 0 will result in
348  * no output.
349  *
350  * count may be initialized to a negative number to allow an initial
351  * burst.
352  *
353  * Returns 0 if it did not issue the printf, non-zero if it did.
354  */
355 int
356 krateprintf(struct krate *rate, const char *fmt, ...)
357 {
358         __va_list ap;
359         int res;
360
361         if (rate->ticks != (int)time_uptime) {
362                 rate->ticks = (int)time_uptime;
363                 if (rate->count > 0)
364                         rate->count = 0;
365         }
366         if (rate->count < rate->freq) {
367                 ++rate->count;
368                 __va_start(ap, fmt);
369                 kvprintf(fmt, ap);
370                 __va_end(ap);
371                 res = 1;
372         } else {
373                 res = 0;
374         }
375         return res;
376 }
377
378 /*
379  * Print a character to the dmesg log, the console, and/or the user's
380  * terminal.
381  *
382  * NOTE: TOTTY does not require nonblocking operation, but TOCONS
383  *       and TOLOG do.  When we have a constty we still output to
384  *       the real console but we have a monitoring thread which
385  *       we wakeup which tracks the log.
386  */
387 static void
388 kputchar(int c, void *arg)
389 {
390         struct putchar_arg *ap = (struct putchar_arg*) arg;
391         int flags = ap->flags;
392         struct tty *tp = ap->tty;
393
394         if (panicstr)
395                 constty = NULL;
396         if ((flags & TOCONS) && tp == NULL && constty)
397                 flags |= TOLOG | TOWAKEUP;
398         if ((flags & TOTTY) && tputchar(c, tp) < 0)
399                 ap->flags &= ~TOTTY;
400         if ((flags & TOLOG))
401                 msglogchar(c, ap->pri);
402         if ((flags & TOCONS) && c)
403                 cnputc(c);
404         if (flags & TOWAKEUP)
405                 wakeup(constty_td);
406 }
407
408 /*
409  * Scaled down version of sprintf(3).
410  */
411 int
412 ksprintf(char *buf, const char *cfmt, ...)
413 {
414         int retval;
415         __va_list ap;
416
417         __va_start(ap, cfmt);
418         retval = kvcprintf(cfmt, NULL, buf, ap);
419         buf[retval] = '\0';
420         __va_end(ap);
421         return (retval);
422 }
423
424 /*
425  * Scaled down version of vsprintf(3).
426  */
427 int
428 kvsprintf(char *buf, const char *cfmt, __va_list ap)
429 {
430         int retval;
431
432         retval = kvcprintf(cfmt, NULL, buf, ap);
433         buf[retval] = '\0';
434         return (retval);
435 }
436
437 /*
438  * Scaled down version of snprintf(3).
439  */
440 int
441 ksnprintf(char *str, size_t size, const char *format, ...)
442 {
443         int retval;
444         __va_list ap;
445
446         __va_start(ap, format);
447         retval = kvsnprintf(str, size, format, ap);
448         __va_end(ap);
449         return(retval);
450 }
451
452 /*
453  * Scaled down version of vsnprintf(3).
454  */
455 int
456 kvsnprintf(char *str, size_t size, const char *format, __va_list ap)
457 {
458         struct snprintf_arg info;
459         int retval;
460
461         info.str = str;
462         info.remain = size;
463         retval = kvcprintf(format, snprintf_func, &info, ap);
464         if (info.remain >= 1)
465                 *info.str++ = '\0';
466         return (retval);
467 }
468
469 int
470 kvasnprintf(char **strp, size_t size, const char *format, __va_list ap)
471 {
472         struct snprintf_arg info;
473         int retval;
474
475         *strp = kmalloc(size, M_TEMP, M_WAITOK);
476         info.str = *strp;
477         info.remain = size;
478         retval = kvcprintf(format, snprintf_func, &info, ap);
479         if (info.remain >= 1)
480                 *info.str++ = '\0';
481         return (retval);
482 }
483
484 void
485 kvasfree(char **strp)
486 {
487         if (*strp) {
488                 kfree(*strp, M_TEMP);
489                 *strp = NULL;
490         }
491 }
492
493 static void
494 snprintf_func(int ch, void *arg)
495 {
496         struct snprintf_arg *const info = arg;
497
498         if (info->remain >= 2) {
499                 *info->str++ = ch;
500                 info->remain--;
501         }
502 }
503
504 /*
505  * Put a NUL-terminated ASCII number (base <= 36) in a buffer in reverse
506  * order; return an optional length and a pointer to the last character
507  * written in the buffer (i.e., the first character of the string).
508  * The buffer pointed to by `nbuf' must have length >= MAXNBUF.
509  */
510 static char *
511 ksprintn(char *nbuf, uintmax_t num, int base, int *lenp, int upper)
512 {
513         char *p, c;
514
515         p = nbuf;
516         *p = '\0';
517         do {
518                 c = hex2ascii(num % base);
519                 *++p = upper ? toupper(c) : c;
520         } while (num /= base);
521         if (lenp)
522                 *lenp = p - nbuf;
523         return (p);
524 }
525
526 /*
527  * Scaled down version of printf(3).
528  *
529  * Two additional formats:
530  *
531  * The format %pb%i is supported to decode error registers.
532  * Its usage is:
533  *
534  *      kprintf("reg=%pb%i\n", "<base><arg>*", regval);
535  *
536  * where <base> is the output base expressed as a control character, e.g.
537  * \10 gives octal; \20 gives hex.  Each arg is a sequence of characters,
538  * the first of which gives the bit number to be inspected (origin 1), and
539  * the next characters (up to a control character, i.e. a character <= 32),
540  * give the name of the register.  Thus:
541  *
542  *      kvcprintf("reg=%pb%i\n", "\10\2BITTWO\1BITONE\n", 3);
543  *
544  * would produce output:
545  *
546  *      reg=3<BITTWO,BITONE>
547  */
548
549 #define PCHAR(c) {int cc=(c); if(func) (*func)(cc,arg); else *d++=cc; retval++;}
550
551 int
552 kvcprintf(char const *fmt, void (*func)(int, void*), void *arg, __va_list ap)
553 {
554         char nbuf[MAXNBUF];
555         char *d;
556         const char *p, *percent, *q;
557         int ch, n;
558         uintmax_t num;
559         int base, tmp, width, ladjust, sharpflag, spaceflag, neg, sign, dot;
560         int cflag, hflag, jflag, lflag, qflag, tflag, zflag;
561         int dwidth, upper;
562         char padc;
563         int retval = 0, stop = 0;
564         int usespin;
565         int ddb_active;
566
567         /*
568          * Make a supreme effort to avoid reentrant panics or deadlocks.
569          *
570          * NOTE!  Do nothing that would access mycpu/gd/fs unless the
571          *        function is the normal kputchar(), which allows us to
572          *        use this function for very early debugging with a special
573          *        function.
574          */
575         if (func == kputchar) {
576                 if (mycpu->gd_flags & GDF_KPRINTF)
577                         return(0);
578                 atomic_set_long(&mycpu->gd_flags, GDF_KPRINTF);
579         }
580
581 #ifdef DDB
582         ddb_active = db_active;
583 #else
584         ddb_active = 0;
585 #endif
586
587         num = 0;
588         if (!func)
589                 d = (char *) arg;
590         else
591                 d = NULL;
592
593         if (fmt == NULL)
594                 fmt = "(fmt null)\n";
595
596         usespin = (func == kputchar &&
597                    (kprintf_logging & TONOSPIN) == 0 &&
598                    panic_cpu_gd != mycpu &&
599                    (((struct putchar_arg *)arg)->flags & TOTTY) == 0);
600         if (usespin) {
601                 crit_enter_hard();
602                 spin_lock(&cons_spin);
603         }
604
605         for (;;) {
606                 padc = ' ';
607                 width = 0;
608                 while ((ch = (u_char)*fmt++) != '%' || stop) {
609                         if (ch == '\0')
610                                 goto done;
611                         PCHAR(ch);
612                 }
613                 percent = fmt - 1;
614                 dot = dwidth = ladjust = neg = sharpflag = sign = upper = 0;
615                 spaceflag = 0;
616                 cflag = hflag = jflag = lflag = qflag = tflag = zflag = 0;
617
618 reswitch:
619                 switch (ch = (u_char)*fmt++) {
620                 case ' ':
621                         spaceflag = 1;
622                         goto reswitch;
623                 case '.':
624                         dot = 1;
625                         goto reswitch;
626                 case '#':
627                         sharpflag = 1;
628                         goto reswitch;
629                 case '+':
630                         sign = 1;
631                         goto reswitch;
632                 case '-':
633                         ladjust = 1;
634                         goto reswitch;
635                 case '%':
636                         PCHAR(ch);
637                         break;
638                 case '*':
639                         if (!dot) {
640                                 width = __va_arg(ap, int);
641                                 if (width < 0) {
642                                         ladjust = !ladjust;
643                                         width = -width;
644                                 }
645                         } else {
646                                 dwidth = __va_arg(ap, int);
647                         }
648                         goto reswitch;
649                 case '0':
650                         if (!dot) {
651                                 padc = '0';
652                                 goto reswitch;
653                         }
654                 case '1': case '2': case '3': case '4':
655                 case '5': case '6': case '7': case '8': case '9':
656                                 for (n = 0;; ++fmt) {
657                                         n = n * 10 + ch - '0';
658                                         ch = *fmt;
659                                         if (ch < '0' || ch > '9')
660                                                 break;
661                                 }
662                         if (dot)
663                                 dwidth = n;
664                         else
665                                 width = n;
666                         goto reswitch;
667                 case 'c':
668                         PCHAR(__va_arg(ap, int));
669                         break;
670                 case 'd':
671                 case 'i':
672                         base = 10;
673                         sign = 1;
674                         goto handle_sign;
675                 case 'h':
676                         if (hflag) {
677                                 hflag = 0;
678                                 cflag = 1;
679                         } else
680                                 hflag = 1;
681                         goto reswitch;
682                 case 'j':
683                         jflag = 1;
684                         goto reswitch;
685                 case 'l':
686                         if (lflag) {
687                                 lflag = 0;
688                                 qflag = 1;
689                         } else
690                                 lflag = 1;
691                         goto reswitch;
692                 case 'n':
693                         if (cflag)
694                                 *(__va_arg(ap, char *)) = retval;
695                         else if (hflag)
696                                 *(__va_arg(ap, short *)) = retval;
697                         else if (jflag)
698                                 *(__va_arg(ap, intmax_t *)) = retval;
699                         else if (lflag)
700                                 *(__va_arg(ap, long *)) = retval;
701                         else if (qflag)
702                                 *(__va_arg(ap, quad_t *)) = retval;
703                         else
704                                 *(__va_arg(ap, int *)) = retval;
705                         break;
706                 case 'o':
707                         base = 8;
708                         goto handle_nosign;
709                 case 'p':
710                         /* peek if this is a /b/ hiding as /p/ or not */
711                         if (fmt[0] == 'b' && fmt[1] == '%' && fmt[2] == 'i') {
712                                 fmt += 3; /* consume "b%i" */
713                                 p = __va_arg(ap, char *);
714                                 num = (u_int)__va_arg(ap, int);
715                                 for (q = ksprintn(nbuf, num, *p++, NULL, 0);*q;)
716                                         PCHAR(*q--);
717
718                                 if (num == 0)
719                                         break;
720
721                                 for (tmp = 0; *p;) {
722                                         n = *p++;
723                                         if (num & (1 << (n - 1))) {
724                                                 PCHAR(tmp ? ',' : '<');
725                                                 for (; (n = *p) > ' '; ++p)
726                                                         PCHAR(n);
727                                                 tmp = 1;
728                                         } else {
729                                                 for (; *p > ' '; ++p)
730                                                         continue;
731                                         }
732                                 }
733                                 if (tmp)
734                                         PCHAR('>');
735                                 break;
736                         }
737                         base = 16;
738                         sharpflag = (width == 0);
739                         sign = 0;
740                         num = (uintptr_t)__va_arg(ap, void *);
741                         if (ptr_restrict && fmt[0] != 'x' &&
742                             !(panicstr || dumping || ddb_active)) {
743                                 if (ptr_restrict == 1) {
744                                         /* zero out upper bits */
745                                         num &= 0xffffffUL;
746                                 } else {
747                                         num = 0xc0ffee;
748                                 }
749                         }
750                         goto number;
751                 case 'q':
752                         qflag = 1;
753                         goto reswitch;
754                 case 's':
755                         p = __va_arg(ap, char *);
756                         if (p == NULL)
757                                 p = "(null)";
758                         if (!dot)
759                                 n = strlen (p);
760                         else
761                                 for (n = 0; n < dwidth && p[n]; n++)
762                                         continue;
763
764                         width -= n;
765
766                         if (!ladjust && width > 0)
767                                 while (width--)
768                                         PCHAR(padc);
769                         while (n--)
770                                 PCHAR(*p++);
771                         if (ladjust && width > 0)
772                                 while (width--)
773                                         PCHAR(padc);
774                         break;
775                 case 't':
776                         tflag = 1;
777                         goto reswitch;
778                 case 'u':
779                         base = 10;
780                         goto handle_nosign;
781                 case 'X':
782                         upper = 1;
783                         /* FALLTHROUGH */
784                 case 'x':
785                         base = 16;
786                         goto handle_nosign;
787                 case 'z':
788                         zflag = 1;
789                         goto reswitch;
790 handle_nosign:
791                         sign = 0;
792                         if (cflag)
793                                 num = (u_char)__va_arg(ap, int);
794                         else if (hflag)
795                                 num = (u_short)__va_arg(ap, int);
796                         else if (jflag)
797                                 num = __va_arg(ap, uintmax_t);
798                         else if (lflag)
799                                 num = __va_arg(ap, u_long);
800                         else if (qflag)
801                                 num = __va_arg(ap, u_quad_t);
802                         else if (tflag)
803                                 num = __va_arg(ap, ptrdiff_t);
804                         else if (zflag)
805                                 num = __va_arg(ap, size_t);
806                         else
807                                 num = __va_arg(ap, u_int);
808                         goto number;
809 handle_sign:
810                         if (cflag)
811                                 num = (char)__va_arg(ap, int);
812                         else if (hflag)
813                                 num = (short)__va_arg(ap, int);
814                         else if (jflag)
815                                 num = __va_arg(ap, intmax_t);
816                         else if (lflag)
817                                 num = __va_arg(ap, long);
818                         else if (qflag)
819                                 num = __va_arg(ap, quad_t);
820                         else if (tflag)
821                                 num = __va_arg(ap, ptrdiff_t);
822                         else if (zflag)
823                                 num = __va_arg(ap, ssize_t);
824                         else
825                                 num = __va_arg(ap, int);
826 number:
827                         if (sign && (intmax_t)num < 0) {
828                                 neg = 1;
829                                 num = -(intmax_t)num;
830                         }
831                         p = ksprintn(nbuf, num, base, &n, upper);
832                         tmp = 0;
833                         if (sharpflag && num != 0) {
834                                 if (base == 8)
835                                         tmp++;
836                                 else if (base == 16)
837                                         tmp += 2;
838                         }
839                         if (neg || (sign && spaceflag))
840                                 tmp++;
841
842                         if (!ladjust && padc == '0')
843                                 dwidth = width - tmp;
844                         width -= tmp + imax(dwidth, n);
845                         dwidth -= n;
846                         if (!ladjust)
847                                 while (width-- > 0)
848                                         PCHAR(' ');
849                         if (neg) {
850                                 PCHAR('-');
851                         } else if (sign && spaceflag) {
852                                 PCHAR(' ');
853                         }
854                         if (sharpflag && num != 0) {
855                                 if (base == 8) {
856                                         PCHAR('0');
857                                 } else if (base == 16) {
858                                         PCHAR('0');
859                                         PCHAR('x');
860                                 }
861                         }
862                         while (dwidth-- > 0)
863                                 PCHAR('0');
864
865                         while (*p)
866                                 PCHAR(*p--);
867
868                         if (ladjust)
869                                 while (width-- > 0)
870                                         PCHAR(' ');
871
872                         break;
873                 default:
874                         while (percent < fmt)
875                                 PCHAR(*percent++);
876                         /*
877                          * Since we ignore an formatting argument it is no 
878                          * longer safe to obey the remaining formatting
879                          * arguments as the arguments will no longer match
880                          * the format specs.
881                          */
882                         stop = 1;
883                         break;
884                 }
885         }
886 done:
887         /*
888          * Cleanup reentrancy issues.
889          */
890         if (func == kputchar)
891                 atomic_clear_long(&mycpu->gd_flags, GDF_KPRINTF);
892         if (usespin) {
893                 spin_unlock(&cons_spin);
894                 crit_exit_hard();
895         }
896         return (retval);
897 }
898
899 #undef PCHAR
900
901 /*
902  * Called from the panic code to try to get the console working
903  * again in case we paniced inside a kprintf().
904  */
905 void
906 kvcreinitspin(void)
907 {
908         spin_init(&cons_spin, "kvcre");
909         atomic_clear_long(&mycpu->gd_flags, GDF_KPRINTF);
910 }
911
912 /*
913  * Console support thread for constty intercepts.  This is needed because
914  * console tty intercepts can block.  Instead of having kputchar() attempt
915  * to directly write to the console intercept we just force it to log
916  * and wakeup this baby to track and dump the log to constty.
917  */
918 static void
919 constty_daemon(void)
920 {
921         u_int rindex;
922         u_int xindex;
923         u_int n;
924         struct msgbuf *mbp;
925         struct tty *tp;
926
927         EVENTHANDLER_REGISTER(shutdown_pre_sync, shutdown_kproc,
928                               constty_td, SHUTDOWN_PRI_FIRST);
929         constty_td->td_flags |= TDF_SYSTHREAD;
930
931         mbp = msgbufp;
932         rindex = mbp->msg_bufr;         /* persistent loop variable */
933         xindex = mbp->msg_bufx - 1;     /* anything different than bufx */
934         cpu_ccfence();
935
936         for (;;) {
937                 kproc_suspend_loop();
938
939                 crit_enter();
940                 if (mbp != msgbufp)
941                         mbp = msgbufp;
942                 if (xindex == mbp->msg_bufx ||
943                     mbp == NULL ||
944                     msgbufmapped == 0) {
945                         tsleep(constty_td, 0, "waiting", hz*60);
946                         crit_exit();
947                         continue;
948                 }
949                 crit_exit();
950
951                 /*
952                  * Get message buf FIFO indices.  rindex is tracking.
953                  */
954                 xindex = mbp->msg_bufx;
955                 cpu_ccfence();
956                 if ((tp = constty) == NULL) {
957                         rindex = xindex;
958                         continue;
959                 }
960
961                 /*
962                  * Check if the calculated bytes has rolled the whole
963                  * message buffer.
964                  */
965                 n = xindex - rindex;
966                 if (n > mbp->msg_size - 1024) {
967                         rindex = xindex - mbp->msg_size + 2048;
968                         n = xindex - rindex;
969                 }
970
971                 /*
972                  * And dump it.  If constty gets stuck will give up.
973                  */
974                 while (rindex != xindex) {
975                         u_int ri = rindex % mbp->msg_size;
976                         if (tputchar((uint8_t)mbp->msg_ptr[ri], tp) < 0) {
977                                 constty = NULL;
978                                 rindex = xindex;
979                                 break;
980                         }
981                         if (tp->t_outq.c_cc >= tp->t_ohiwat) {
982                                 tsleep(constty_daemon, 0, "blocked", hz / 10);
983                                 if (tp->t_outq.c_cc >= tp->t_ohiwat) {
984                                         rindex = xindex;
985                                         break;
986                                 }
987                         }
988                         ++rindex;
989                 }
990         }
991 }
992
993 static struct kproc_desc constty_kp = {
994         "consttyd",
995         constty_daemon,
996         &constty_td
997 };
998 SYSINIT(bufdaemon, SI_SUB_KTHREAD_UPDATE, SI_ORDER_ANY,
999         kproc_start, &constty_kp);
1000
1001 /*
1002  * Put character in log buffer with a particular priority.
1003  *
1004  * MPSAFE
1005  */
1006 static void
1007 msglogchar(int c, int pri)
1008 {
1009         static int lastpri = -1;
1010         static int dangling;
1011         char nbuf[MAXNBUF];
1012         char *p;
1013
1014         if (!msgbufmapped)
1015                 return;
1016         if (c == '\0' || c == '\r')
1017                 return;
1018         if (pri != -1 && pri != lastpri) {
1019                 if (dangling) {
1020                         msgaddchar('\n', NULL);
1021                         dangling = 0;
1022                 }
1023                 msgaddchar('<', NULL);
1024                 for (p = ksprintn(nbuf, (uintmax_t)pri, 10, NULL, 0); *p;)
1025                         msgaddchar(*p--, NULL);
1026                 msgaddchar('>', NULL);
1027                 lastpri = pri;
1028         }
1029         msgaddchar(c, NULL);
1030         if (c == '\n') {
1031                 dangling = 0;
1032                 lastpri = -1;
1033         } else {
1034                 dangling = 1;
1035         }
1036 }
1037
1038 /*
1039  * Put char in log buffer.   Make sure nothing blows up beyond repair if
1040  * we have an MP race.
1041  *
1042  * MPSAFE.
1043  */
1044 static void
1045 msgaddchar(int c, void *dummy)
1046 {
1047         struct msgbuf *mbp;
1048         u_int lindex;
1049         u_int rindex;
1050         u_int xindex;
1051         u_int n;
1052
1053         if (!msgbufmapped)
1054                 return;
1055         mbp = msgbufp;
1056         lindex = mbp->msg_bufl;
1057         rindex = mbp->msg_bufr;
1058         xindex = mbp->msg_bufx++;       /* Allow SMP race */
1059         cpu_ccfence();
1060
1061         mbp->msg_ptr[xindex % mbp->msg_size] = c;
1062         n = xindex - lindex;
1063         if (n > mbp->msg_size - 1024) {
1064                 lindex = xindex - mbp->msg_size + 2048;
1065                 cpu_ccfence();
1066                 mbp->msg_bufl = lindex;
1067         }
1068         n = xindex - rindex;
1069         if (n > mbp->msg_size - 1024) {
1070                 rindex = xindex - mbp->msg_size + 2048;
1071                 cpu_ccfence();
1072                 mbp->msg_bufr = rindex;
1073         }
1074 }
1075
1076 static void
1077 msgbufcopy(struct msgbuf *oldp)
1078 {
1079         u_int rindex;
1080         u_int xindex;
1081         u_int n;
1082
1083         rindex = oldp->msg_bufr;
1084         xindex = oldp->msg_bufx;
1085         cpu_ccfence();
1086
1087         n = xindex - rindex;
1088         if (n > oldp->msg_size - 1024)
1089                 rindex = xindex - oldp->msg_size + 2048;
1090         while (rindex != xindex) {
1091                 msglogchar(oldp->msg_ptr[rindex % oldp->msg_size], -1);
1092                 ++rindex;
1093         }
1094 }
1095
1096 void
1097 msgbufinit(void *ptr, size_t size)
1098 {
1099         char *cp;
1100         static struct msgbuf *oldp = NULL;
1101
1102         size -= sizeof(*msgbufp);
1103         cp = (char *)ptr;
1104         msgbufp = (struct msgbuf *) (cp + size);
1105         if (msgbufp->msg_magic != MSG_MAGIC || msgbufp->msg_size != size) {
1106                 bzero(cp, size);
1107                 bzero(msgbufp, sizeof(*msgbufp));
1108                 msgbufp->msg_magic = MSG_MAGIC;
1109                 msgbufp->msg_size = (char *)msgbufp - cp;
1110         }
1111         msgbufp->msg_ptr = cp;
1112         if (msgbufmapped && oldp != msgbufp)
1113                 msgbufcopy(oldp);
1114         cpu_mfence();
1115         msgbufmapped = 1;
1116         oldp = msgbufp;
1117 }
1118
1119 /* Sysctls for accessing/clearing the msgbuf */
1120
1121 static int
1122 sysctl_kern_msgbuf(SYSCTL_HANDLER_ARGS)
1123 {
1124         struct msgbuf *mbp;
1125         struct ucred *cred;
1126         int error;
1127         u_int rindex_modulo;
1128         u_int xindex_modulo;
1129         u_int rindex;
1130         u_int xindex;
1131         u_int n;
1132
1133         /*
1134          * Only wheel or root can access the message log.
1135          */
1136         if (unprivileged_read_msgbuf == 0) {
1137                 KKASSERT(req->td->td_proc);
1138                 cred = req->td->td_proc->p_ucred;
1139
1140                 if ((cred->cr_prison || groupmember(0, cred) == 0) &&
1141                     priv_check(req->td, PRIV_ROOT) != 0
1142                 ) {
1143                         return (EPERM);
1144                 }
1145         }
1146
1147         /*
1148          * Unwind the buffer, so that it's linear (possibly starting with
1149          * some initial nulls).
1150          *
1151          * We don't push the entire buffer like we did before because
1152          * bufr (and bufl) now advance in chunks when the fifo is full,
1153          * rather than one character.
1154          */
1155         mbp = msgbufp;
1156         rindex = mbp->msg_bufr;
1157         xindex = mbp->msg_bufx;
1158         n = xindex - rindex;
1159         if (n > mbp->msg_size - 1024) {
1160                 rindex = xindex - mbp->msg_size + 2048;
1161                 n = xindex - rindex;
1162         }
1163         rindex_modulo = rindex % mbp->msg_size;
1164         xindex_modulo = xindex % mbp->msg_size;
1165
1166         if (rindex_modulo < xindex_modulo) {
1167                 /*
1168                  * Can handle in one linear section.
1169                  */
1170                 error = sysctl_handle_opaque(oidp,
1171                                              mbp->msg_ptr + rindex_modulo,
1172                                              xindex_modulo - rindex_modulo,
1173                                              req);
1174         } else if (rindex_modulo == xindex_modulo) {
1175                 /*
1176                  * Empty buffer, just return a single newline
1177                  */
1178                 error = sysctl_handle_opaque(oidp, "\n", 1, req);
1179         } else if (n <= mbp->msg_size - rindex_modulo) {
1180                 /*
1181                  * Can handle in one linear section.
1182                  */
1183                 error = sysctl_handle_opaque(oidp,
1184                                              mbp->msg_ptr + rindex_modulo,
1185                                              n - rindex_modulo,
1186                                              req);
1187         } else {
1188                 /*
1189                  * Glue together two linear sections into one contiguous
1190                  * output.
1191                  */
1192                 error = sysctl_handle_opaque(oidp,
1193                                              mbp->msg_ptr + rindex_modulo,
1194                                              mbp->msg_size - rindex_modulo,
1195                                              req);
1196                 n -= mbp->msg_size - rindex_modulo;
1197                 if (error == 0)
1198                         error = sysctl_handle_opaque(oidp, mbp->msg_ptr,
1199                                                      n, req);
1200         }
1201         return (error);
1202 }
1203
1204 SYSCTL_PROC(_kern, OID_AUTO, msgbuf, CTLTYPE_STRING | CTLFLAG_RD,
1205     0, 0, sysctl_kern_msgbuf, "A", "Contents of kernel message buffer");
1206
1207 static int msgbuf_clear;
1208
1209 static int
1210 sysctl_kern_msgbuf_clear(SYSCTL_HANDLER_ARGS)
1211 {
1212         int error;
1213         error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req);
1214         if (!error && req->newptr) {
1215                 /* Clear the buffer and reset write pointer */
1216                 msgbufp->msg_bufr = msgbufp->msg_bufx;
1217                 msgbufp->msg_bufl = msgbufp->msg_bufx;
1218                 bzero(msgbufp->msg_ptr, msgbufp->msg_size);
1219                 msgbuf_clear = 0;
1220         }
1221         return (error);
1222 }
1223
1224 SYSCTL_PROC(_kern, OID_AUTO, msgbuf_clear,
1225     CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE, &msgbuf_clear, 0,
1226     sysctl_kern_msgbuf_clear, "I", "Clear kernel message buffer");
1227
1228 #ifdef DDB
1229
1230 DB_SHOW_COMMAND(msgbuf, db_show_msgbuf)
1231 {
1232         u_int rindex;
1233         u_int i;
1234         u_int j;
1235
1236         if (!msgbufmapped) {
1237                 db_printf("msgbuf not mapped yet\n");
1238                 return;
1239         }
1240         db_printf("msgbufp = %p\n", msgbufp);
1241         db_printf("magic = %x, size = %d, r= %d, w = %d, ptr = %p\n",
1242                   msgbufp->msg_magic, msgbufp->msg_size,
1243                   msgbufp->msg_bufr % msgbufp->msg_size,
1244                   msgbufp->msg_bufx % msgbufp->msg_size,
1245                   msgbufp->msg_ptr);
1246
1247         rindex = msgbufp->msg_bufr;
1248         for (i = 0; i < msgbufp->msg_size; i++) {
1249                 j = (i + rindex) % msgbufp->msg_size;
1250                 db_printf("%c", msgbufp->msg_ptr[j]);
1251         }
1252         db_printf("\n");
1253 }
1254
1255 #endif /* DDB */
1256
1257
1258 void
1259 hexdump(const void *ptr, int length, const char *hdr, int flags)
1260 {
1261         int i, j, k;
1262         int cols;
1263         const unsigned char *cp;
1264         char delim;
1265
1266         if ((flags & HD_DELIM_MASK) != 0)
1267                 delim = (flags & HD_DELIM_MASK) >> 8;
1268         else
1269                 delim = ' ';
1270
1271         if ((flags & HD_COLUMN_MASK) != 0)
1272                 cols = flags & HD_COLUMN_MASK;
1273         else
1274                 cols = 16;
1275
1276         cp = ptr;
1277         for (i = 0; i < length; i+= cols) {
1278                 if (hdr != NULL)
1279                         kprintf("%s", hdr);
1280
1281                 if ((flags & HD_OMIT_COUNT) == 0)
1282                         kprintf("%04x  ", i);
1283
1284                 if ((flags & HD_OMIT_HEX) == 0) {
1285                         for (j = 0; j < cols; j++) {
1286                                 k = i + j;
1287                                 if (k < length)
1288                                         kprintf("%c%02x", delim, cp[k]);
1289                                 else
1290                                         kprintf("   ");
1291                         }
1292                 }
1293
1294                 if ((flags & HD_OMIT_CHARS) == 0) {
1295                         kprintf("  |");
1296                         for (j = 0; j < cols; j++) {
1297                                 k = i + j;
1298                                 if (k >= length)
1299                                         kprintf(" ");
1300                                 else if (cp[k] >= ' ' && cp[k] <= '~')
1301                                         kprintf("%c", cp[k]);
1302                                 else
1303                                         kprintf(".");
1304                         }
1305                         kprintf("|");
1306                 }
1307                 kprintf("\n");
1308         }
1309 }
1310
1311 void
1312 kprint_cpuset(cpumask_t *mask)
1313 {
1314         int i;
1315         int b = -1;
1316         int e = -1;
1317         int more = 0;
1318
1319         kprintf("cpus(");
1320         CPUSET_FOREACH(i, *mask) {
1321                 if (b < 0) {
1322                         b = i;
1323                         e = b + 1;
1324                         continue;
1325                 }
1326                 if (e == i) {
1327                         ++e;
1328                         continue;
1329                 }
1330                 if (more)
1331                         kprintf(", ");
1332                 if (b == e - 1) {
1333                         kprintf("%d", b);
1334                 } else {
1335                         kprintf("%d-%d", b, e - 1);
1336                 }
1337                 more = 1;
1338                 b = i;
1339                 e = b + 1;
1340         }
1341         if (more)
1342                 kprintf(", ");
1343         if (b >= 0) {
1344                 if (b == e - 1) {
1345                         kprintf("%d", b);
1346                 } else {
1347                         kprintf("%d-%d", b, e - 1);
1348                 }
1349         }
1350         kprintf(") ");
1351 }