Research V6 development
authorKen Thompson <ken@research.uucp>
Fri, 18 Jul 1975 09:11:29 +0000 (04:11 -0500)
committerKen Thompson <ken@research.uucp>
Fri, 18 Jul 1975 09:11:29 +0000 (04:11 -0500)
Work on file usr/sys/ken/prf.c

Synthesized-from: v6

usr/sys/ken/prf.c [new file with mode: 0644]

diff --git a/usr/sys/ken/prf.c b/usr/sys/ken/prf.c
new file mode 100644 (file)
index 0000000..71d661c
--- /dev/null
@@ -0,0 +1,150 @@
+#
+/*
+ */
+
+#include "../param.h"
+#include "../seg.h"
+#include "../buf.h"
+#include "../conf.h"
+
+/*
+ * Address and structure of the
+ * KL-11 console device registers.
+ */
+struct
+{
+       int     rsr;
+       int     rbr;
+       int     xsr;
+       int     xbr;
+};
+
+/*
+ * In case console is off,
+ * panicstr contains argument to last
+ * call to panic.
+ */
+
+char   *panicstr;
+
+/*
+ * Scaled down version of C Library printf.
+ * Only %s %l %d (==%l) %o are recognized.
+ * Used to print diagnostic information
+ * directly on console tty.
+ * Since it is not interrupt driven,
+ * all system activities are pretty much
+ * suspended.
+ * Printf should not be used for chit-chat.
+ */
+printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9,xa,xb,xc)
+char fmt[];
+{
+       register char *s;
+       register *adx, c;
+
+       adx = &x1;
+loop:
+       while((c = *fmt++) != '%') {
+               if(c == '\0')
+                       return;
+               putchar(c);
+       }
+       c = *fmt++;
+       if(c == 'd' || c == 'l' || c == 'o')
+               printn(*adx, c=='o'? 8: 10);
+       if(c == 's') {
+               s = *adx;
+               while(c = *s++)
+                       putchar(c);
+       }
+       adx++;
+       goto loop;
+}
+
+/*
+ * Print an unsigned integer in base b.
+ */
+printn(n, b)
+{
+       register a;
+
+       if(a = ldiv(n, b))
+               printn(a, b);
+       putchar(lrem(n, b) + '0');
+}
+
+/*
+ * Print a character on console.
+ * Attempts to save and restore device
+ * status.
+ * If the switches are 0, all
+ * printing is inhibited.
+ */
+putchar(c)
+{
+       register rc, s;
+
+       rc = c;
+       if(SW->integ == 0)
+               return;
+       while((KL->xsr&0200) == 0)
+               ;
+       if(rc == 0)
+               return;
+       s = KL->xsr;
+       KL->xsr = 0;
+       KL->xbr = rc;
+       if(rc == '\n') {
+               putchar('\r');
+               putchar(0177);
+               putchar(0177);
+       }
+       putchar(0);
+       KL->xsr = s;
+}
+
+/*
+ * Panic is called on unresolvable
+ * fatal errors.
+ * It syncs, prints "panic: mesg" and
+ * then loops.
+ */
+panic(s)
+char *s;
+{
+       panicstr = s;
+       update();
+       printf("panic: %s\n", s);
+       for(;;)
+               idle();
+}
+
+/*
+ * prdev prints a warning message of the
+ * form "mesg on dev x/y".
+ * x and y are the major and minor parts of
+ * the device argument.
+ */
+prdev(str, dev)
+{
+
+       printf("%s on dev %l/%l\n", str, dev.d_major, dev.d_minor);
+}
+
+/*
+ * deverr prints a diagnostic from
+ * a device driver.
+ * It prints the device, block number,
+ * and an octal word (usually some error
+ * status register) passed as argument.
+ */
+deverror(bp, o1, o2)
+int *bp;
+{
+       register *rbp;
+
+       rbp = bp;
+       prdev("err", rbp->b_dev);
+       printf("bn%l er%o %o\n", rbp->b_blkno, o1, o2);
+}