X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/bd10af3f4dd595f9bc23efaf7184a664ad09537f..7bf304e65beb1e282cd098ed53ab9f4999b78280:/usr/src/sys/kern/subr_prf.c diff --git a/usr/src/sys/kern/subr_prf.c b/usr/src/sys/kern/subr_prf.c index ec4ce9702d..b2e04feebe 100644 --- a/usr/src/sys/kern/subr_prf.c +++ b/usr/src/sys/kern/subr_prf.c @@ -1,4 +1,10 @@ -/* subr_prf.c 6.6 85/03/18 */ +/* + * Copyright (c) 1982, 1986, 1988 Regents of the University of California. + * All rights reserved. The Berkeley software License Agreement + * specifies the terms and conditions for redistribution. + * + * @(#)subr_prf.c 7.14 (Berkeley) %G% + */ #include "param.h" #include "systm.h" @@ -8,15 +14,15 @@ #include "reboot.h" #include "vm.h" #include "msgbuf.h" -#include "dir.h" #include "user.h" #include "proc.h" #include "ioctl.h" #include "tty.h" #include "syslog.h" -#ifdef vax -#include "../vax/mtpr.h" +#include "machine/mtpr.h" +#ifdef KADB +#include "machine/kdbparam.h" #endif #define TOCONS 0x1 @@ -30,6 +36,16 @@ */ char *panicstr; +extern cnputc(); /* standard console putc */ +extern struct tty cons; /* standard console tty */ +struct tty *constty; /* pointer to console "window" tty */ +int (*v_putc)() = cnputc; /* routine to putc on virtual console */ + +extern cnputc(); /* standard console putc */ +extern struct tty cons; /* standard console tty */ +struct tty *constty; /* pointer to console "window" tty */ +int (*v_console)() = cnputc; /* routine to putc on virtual console */ + /* * Scaled down version of C Library printf. * Used to print diagnostic information directly on console tty. @@ -47,43 +63,90 @@ char *panicstr; * printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n"); * would produce output: * reg=3 + * + * Another additional format: %r is used to pass an additional format string + * and argument list recursively. Usage is typically: + * + * fn(otherstuff, fmt [, arg1, ... ] ) + * char *fmt; + * u_int arg1, ...; + * + * printf("prefix: %r, other stuff\n", fmt, &arg1); */ +#if defined(tahoe) +int consintr; +#endif + /*VARARGS1*/ printf(fmt, x1) char *fmt; unsigned x1; { +#if defined(tahoe) + register int savintr; + savintr = consintr, consintr = 0; /* disable interrupts */ +#endif prf(fmt, &x1, TOCONS | TOLOG, (struct tty *)0); logwakeup(); +#if defined(tahoe) + consintr = savintr; /* reenable interrupts */ +#endif } /* - * Uprintf prints to the current user's terminal - * and does no watermark checking - (so no verbose messages). + * Uprintf prints to the current user's terminal. + * It may block if the tty queue is overfull. + * No message is printed if the queue does not clear + * in a reasonable time. + * Should determine whether current terminal user is related + * to this process. */ /*VARARGS1*/ uprintf(fmt, x1) char *fmt; unsigned x1; { +#ifdef notdef + register struct proc *p; +#endif + register struct tty *tp; - prf(fmt, &x1, TOTTY, u.u_ttyp); + if ((tp = u.u_ttyp) == NULL) + return; +#ifdef notdef + if (tp->t_pgrp && (p = pfind(tp->t_pgrp))) + if (p->p_uid != u.u_uid) /* doesn't account for setuid */ + return; +#endif + if (ttycheckoutq(tp, 1)) + prf(fmt, &x1, TOTTY, tp); } /* * tprintf prints on the specified terminal (console if none) * and logs the message. It is designed for error messages from - * single-open devices, and may be called from interrupt level. + * single-open devices, and may be called from interrupt level + * (does not sleep). */ /*VARARGS2*/ -tprintf(ttyp, fmt, x1) - struct tty *ttyp; +tprintf(tp, fmt, x1) + register struct tty *tp; char *fmt; unsigned x1; { + int flags = TOTTY | TOLOG; - prf(fmt, &x1, TOTTY | TOLOG, ttyp); + logpri(LOG_INFO); + if (tp == (struct tty *)NULL) { + tp = constty; + if (tp == (struct tty *)NULL) + tp = &cons; + } + if (ttycheckoutq(tp, 0) == 0) + flags = TOLOG; + prf(fmt, &x1, flags, tp); + logwakeup(); } /* @@ -99,9 +162,30 @@ log(level, fmt, x1) register s = splhigh(); extern int log_open; + logpri(level); + prf(fmt, &x1, TOLOG, (struct tty *)0); + splx(s); + if (!log_open) + prf(fmt, &x1, TOCONS, (struct tty *)0); + logwakeup(); +} + +logpri(level) + int level; +{ + putchar('<', TOLOG, (struct tty *)0); - printn(level, 10, TOLOG, (struct tty *)0); + printn((u_long)level, 10, TOLOG, (struct tty *)0); putchar('>', TOLOG, (struct tty *)0); +} + +/*VARARGS1*/ +addlog(fmt, x1) + char *fmt; + unsigned x1; +{ + register s = splhigh(); + prf(fmt, &x1, TOLOG, (struct tty *)0); splx(s); if (!log_open) @@ -126,7 +210,7 @@ loop: } again: c = *fmt++; - /* THIS CODE IS VAX DEPENDENT IN HANDLING %l? AND %c */ + /* THIS CODE IS MACHINE DEPENDENT IN HANDLING %l? AND %c */ switch (c) { case 'l': @@ -135,7 +219,9 @@ again: b = 16; goto number; case 'd': case 'D': - case 'u': /* what a joke */ + b = -10; + goto number; + case 'u': b = 10; goto number; case 'o': case 'O': @@ -145,9 +231,15 @@ number: break; case 'c': b = *adx; +#if BYTE_ORDER == LITTLE_ENDIAN for (i = 24; i >= 0; i -= 8) if (c = (b >> i) & 0x7f) putchar(c, flags, ttyp); +#endif +#if BYTE_ORDER == BIG_ENDIAN + if (c = (b & 0x7f)) + putchar(c, flags, ttyp); +#endif break; case 'b': b = *adx++; @@ -157,7 +249,7 @@ number: if (b) { while (i = *s++) { if (b & (1 << (i-1))) { - putchar(any? ',' : '<', flags, ttyp); + putchar(any ? ',' : '<', flags, ttyp); any = 1; for (; (c = *s) > 32; s++) putchar(c, flags, ttyp); @@ -176,6 +268,11 @@ number: putchar(c, flags, ttyp); break; + case 'r': + s = (char *)*adx++; + prf(s, (u_int *)*adx, flags, ttyp); + break; + case '%': putchar('%', flags, ttyp); break; @@ -195,9 +292,12 @@ printn(n, b, flags, ttyp) char prbuf[11]; register char *cp; - if (b == 10 && (int)n < 0) { - putchar('-', flags, ttyp); - n = (unsigned)(-(int)n); + if (b == -10) { + if ((int)n < 0) { + putchar('-', flags, ttyp); + n = (unsigned)(-(int)n); + } + b = -b; } cp = prbuf; do { @@ -218,7 +318,7 @@ printn(n, b, flags, ttyp) panic(s) char *s; { - int bootopt = RB_AUTOBOOT; + int bootopt = RB_AUTOBOOT | RB_DUMP; if (panicstr) bootopt |= RB_NOSYNC; @@ -226,7 +326,15 @@ panic(s) panicstr = s; } printf("panic: %s\n", s); - boot(RB_PANIC, bootopt); +#ifdef KADB + if (boothowto & RB_KDB) { + int x = splnet(); /* below kdb pri */ + + setsoftkdb(); + splx(x); + } +#endif + boot(bootopt); } /* @@ -236,20 +344,7 @@ tablefull(tab) char *tab; { - log(KERN_FAIL, "%s: table is full\n", tab); -} - -/* - * Hard error is the preface to plaintive error messages - * about failing disk transfers. - */ -harderr(bp, cp) - struct buf *bp; - char *cp; -{ - - printf("%s%d%c: hard error sn%d ", cp, - dkunit(bp), 'a'+(minor(bp->b_dev)&07), bp->b_blkno); + log(LOG_ERR, "%s: table is full\n", tab); } /* @@ -262,25 +357,34 @@ putchar(c, flags, tp) register int c; struct tty *tp; { - extern struct tty cons; + extern int msgbufmapped; + if (panicstr) + constty = 0; + if ((flags & TOCONS) && tp == 0 && constty) { + tp = constty; + flags |= TOTTY; + } + if ((flags & TOCONS) && panicstr == 0 && tp == 0 && constty) { + tp = constty; + flags |= TOTTY; + } if (flags & TOTTY) { - if (tp == (struct tty *)NULL && (flags & TOCONS) == 0) - tp = &cons; - if (tp && (tp->t_state & TS_CARR_ON)) { - register s = spl6(); + register s = spltty(); + + if (tp && (tp->t_state & (TS_CARR_ON | TS_ISOPEN)) == + (TS_CARR_ON | TS_ISOPEN)) { if (c == '\n') (void) ttyoutput('\r', tp); (void) ttyoutput(c, tp); ttstart(tp); - splx(s); - } + flags &= ~TOCONS; + } else if ((flags & TOCONS) && tp == constty) + constty = 0; + splx(s); } - if ((flags & TOLOG) && c != '\0' && c != '\r' && c != 0177 -#ifdef vax - && mfpr(MAPEN) -#endif - ) { + if ((flags & TOLOG) && c != '\0' && c != '\r' && c != 0177 && + msgbufmapped) { if (msgbuf.msg_magic != MSG_MAGIC) { register int i; @@ -289,10 +393,9 @@ putchar(c, flags, tp) for (i=0; i < MSG_BSIZE; i++) msgbuf.msg_bufc[i] = 0; } + msgbuf.msg_bufc[msgbuf.msg_bufx++] = c; if (msgbuf.msg_bufx < 0 || msgbuf.msg_bufx >= MSG_BSIZE) msgbuf.msg_bufx = 0; - msgbuf.msg_bufc[msgbuf.msg_bufx++] = c; } - if ((flags & TOCONS) && c != '\0') - cnputc(c); + (*v_console)(c); }