function results (void)'ed for minor lint
[unix-history] / usr / src / sys / kern / subr_prf.c
index 42e0ed6..bc54241 100644 (file)
@@ -1,10 +1,20 @@
-/*     subr_prf.c      3.1     %H%     */
+/*     subr_prf.c      4.3     %G%     */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 #include "../h/seg.h"
 #include "../h/buf.h"
 #include "../h/conf.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
 #include "../h/seg.h"
 #include "../h/buf.h"
 #include "../h/conf.h"
+#include "../h/mtpr.h"
+#include "../h/reboot.h"
+
+#ifdef TRACE
+#define        TRCBUFS 4096
+char   trcbuf[TRCBUFS];
+char   *trcbufp = trcbuf;
+int    trcwrap;
+int    trcprt = TRCBUFS;
+#endif
 
 /*
  * In case console is off,
 
 /*
  * In case console is off,
@@ -28,76 +38,99 @@ char        *panicstr;
 printf(fmt, x1)
 register char *fmt;
 unsigned x1;
 printf(fmt, x1)
 register char *fmt;
 unsigned x1;
+{
+
+       prf(fmt, &x1, 0);
+}
+
+#ifdef TRACE
+trace(fmt, x1)
+register char *fmt;
+unsigned x1;
+{
+
+       prf(fmt, &x1, 1);
+}
+
+#endif
+
+prf(fmt, adx, trace)
+register char *fmt;
+register unsigned int *adx;
 {
        register c;
 {
        register c;
-       register unsigned int *adx;
        char *s;
 
        char *s;
 
-       adx = &x1;
 loop:
        while((c = *fmt++) != '%') {
                if(c == '\0')
                        return;
 loop:
        while((c = *fmt++) != '%') {
                if(c == '\0')
                        return;
-               putchar(c);
+               putchar(c, trace);
        }
        c = *fmt++;
        }
        c = *fmt++;
-       if(c == 'X')
-               printx((long)*adx);
-       else if(c == 'd' || c == 'u' || c == 'o' || c == 'x')
-               printn((long)*adx, c=='o'? 8: (c=='x'? 16:10));
-       else if(c == 's') {
+       if (c == 'X')
+               printx((long)*adx, trace);
+       else if (c == 'd' || c == 'u' || c == 'o' || c == 'x')
+               printn((long)*adx, c=='o'? 8: (c=='x'? 16:10), trace);
+       else if (c == 's') {
                s = (char *)*adx;
                s = (char *)*adx;
-               while(c = *s++)
-                       putchar(c);
+               while (c = *s++)
+#ifdef TRACE
+                       if (trace) {
+                               *trcbufp++ = c;
+                               if (trcbufp >= &trcbuf[TRCBUFS]) {
+                                       trcbufp = trcbuf;
+                                       trcwrap = 1;
+                               }
+                       } else
+#endif
+                               putchar(c, trace);
        } else if (c == 'D') {
        } else if (c == 'D') {
-               printn(*(long *)adx, 10);
+               printn(*(long *)adx, 10, trace);
                adx += (sizeof(long) / sizeof(int)) - 1;
        }
        adx++;
        goto loop;
 }
 
                adx += (sizeof(long) / sizeof(int)) - 1;
        }
        adx++;
        goto loop;
 }
 
-printx(x)
+printx(x, trace)
 long x;
 {
        int i;
 
        for (i = 0; i < 8; i++)
 long x;
 {
        int i;
 
        for (i = 0; i < 8; i++)
-               putchar("0123456789ABCDEF"[(x>>((7-i)*4))&0xf]);
+               putchar("0123456789ABCDEF"[(x>>((7-i)*4))&0xf], trace);
 }
 
 /*
  * Print an unsigned integer in base b.
  */
 }
 
 /*
  * Print an unsigned integer in base b.
  */
-printn(n, b)
+printn(n, b, trace)
 long n;
 {
        register long a;
 
        if (n<0) {      /* shouldn't happen */
 long n;
 {
        register long a;
 
        if (n<0) {      /* shouldn't happen */
-               putchar('-');
+               putchar('-', trace);
                n = -n;
        }
        if(a = n/b)
                n = -n;
        }
        if(a = n/b)
-               printn(a, b);
-       putchar("0123456789ABCDEF"[(int)(n%b)]);
+               printn(a, b, trace);
+       putchar("0123456789ABCDEF"[(int)(n%b)], trace);
 }
 
 /*
 }
 
 /*
- * Panic is called on unresolvable
- * fatal errors.
- * It syncs, prints "panic: mesg" and
- * then loops.
+ * Panic is called on unresolvable fatal errors.
+ * It syncs, prints "panic: mesg", and then reboots.
  */
 panic(s)
 char *s;
 {
        panicstr = s;
  */
 panic(s)
 char *s;
 {
        panicstr = s;
-       update();
        printf("panic: %s\n", s);
        printf("panic: %s\n", s);
-       spl0();
+       (void) spl0();
        for(;;)
        for(;;)
-               ;
+               boot(RB_PANIC, RB_AUTOBOOT);
 }
 
 /*
 }
 
 /*
@@ -128,3 +161,66 @@ register struct buf *bp;
        prdev("err", bp->b_dev);
        printf("bn=%d er=%x,%x\n", bp->b_blkno, o1,o2);
 }
        prdev("err", bp->b_dev);
        printf("bn=%d er=%x,%x\n", bp->b_blkno, o1,o2);
 }
+
+#ifdef TRACE
+dumptrc()
+{
+       register char *cp;
+       register int pos, nch;
+
+       nch = trcprt;
+       if (nch < 0 || nch > TRCBUFS)
+               nch = TRCBUFS;
+       pos = (trcbufp - trcbuf) - nch;
+       if (pos < 0)
+               if (trcwrap)
+                       pos += TRCBUFS;
+               else {
+                       nch += pos;
+                       pos = 0;
+               }
+       for (cp = &trcbuf[pos]; nch > 0; nch--) {
+               putchar(*cp++, 0);
+               if (cp >= &trcbuf[TRCBUFS])
+                       cp = trcbuf;
+       }
+}
+#else
+/*ARGSUSED*/
+dumptrc(nch)
+       int nch;
+{
+
+}
+#endif
+
+char   *msgbufp = msgbuf;      /* Next saved printf character */
+/*
+ * Print a character on console or in internal trace buffer.
+ * If destination is console then the last MSGBUFS characters
+ * are saved in msgbuf for inspection later.
+ */
+/*ARGSUSED*/
+putchar(c, trace)
+register c;
+{
+
+#ifdef TRACE
+       if (trace) {
+               *trcbufp++ = c;
+               if (trcbufp >= &trcbuf[TRCBUFS]) {
+                       trcbufp = trcbuf;
+                       trcwrap = 1;
+               }
+               return;
+       }
+#endif
+       if (c != '\0' && c != '\r' && c != 0177) {
+               *msgbufp++ = c;
+               if (msgbufp >= &msgbuf[MSGBUFS])
+                       msgbufp = msgbuf;
+       }
+       if (c == 0)
+               return;
+       cnputc(c);
+}