xref: /csrg-svn/sys/kern/subr_prf.c (revision 31)
1 /*	subr_prf.c	3.1	10/14/12	*/
2 
3 #include "../h/param.h"
4 #include "../h/systm.h"
5 #include "../h/seg.h"
6 #include "../h/buf.h"
7 #include "../h/conf.h"
8 
9 /*
10  * In case console is off,
11  * panicstr contains argument to last
12  * call to panic.
13  */
14 
15 char	*panicstr;
16 
17 /*
18  * Scaled down version of C Library printf.
19  * Only %s %u %d (==%u) %o %x %D are recognized.
20  * Used to print diagnostic information
21  * directly on console tty.
22  * Since it is not interrupt driven,
23  * all system activities are pretty much
24  * suspended.
25  * Printf should not be used for chit-chat.
26  */
27 /*VARARGS1*/
28 printf(fmt, x1)
29 register char *fmt;
30 unsigned x1;
31 {
32 	register c;
33 	register unsigned int *adx;
34 	char *s;
35 
36 	adx = &x1;
37 loop:
38 	while((c = *fmt++) != '%') {
39 		if(c == '\0')
40 			return;
41 		putchar(c);
42 	}
43 	c = *fmt++;
44 	if(c == 'X')
45 		printx((long)*adx);
46 	else if(c == 'd' || c == 'u' || c == 'o' || c == 'x')
47 		printn((long)*adx, c=='o'? 8: (c=='x'? 16:10));
48 	else if(c == 's') {
49 		s = (char *)*adx;
50 		while(c = *s++)
51 			putchar(c);
52 	} else if (c == 'D') {
53 		printn(*(long *)adx, 10);
54 		adx += (sizeof(long) / sizeof(int)) - 1;
55 	}
56 	adx++;
57 	goto loop;
58 }
59 
60 printx(x)
61 long x;
62 {
63 	int i;
64 
65 	for (i = 0; i < 8; i++)
66 		putchar("0123456789ABCDEF"[(x>>((7-i)*4))&0xf]);
67 }
68 
69 /*
70  * Print an unsigned integer in base b.
71  */
72 printn(n, b)
73 long n;
74 {
75 	register long a;
76 
77 	if (n<0) {	/* shouldn't happen */
78 		putchar('-');
79 		n = -n;
80 	}
81 	if(a = n/b)
82 		printn(a, b);
83 	putchar("0123456789ABCDEF"[(int)(n%b)]);
84 }
85 
86 /*
87  * Panic is called on unresolvable
88  * fatal errors.
89  * It syncs, prints "panic: mesg" and
90  * then loops.
91  */
92 panic(s)
93 char *s;
94 {
95 	panicstr = s;
96 	update();
97 	printf("panic: %s\n", s);
98 	spl0();
99 	for(;;)
100 		;
101 }
102 
103 /*
104  * prdev prints a warning message of the
105  * form "mesg on dev x/y".
106  * x and y are the major and minor parts of
107  * the device argument.
108  */
109 prdev(str, dev)
110 char *str;
111 dev_t dev;
112 {
113 
114 	printf("%s on dev %u/%u\n", str, major(dev), minor(dev));
115 }
116 
117 /*
118  * deverr prints a diagnostic from
119  * a device driver.
120  * It prints the device, block number,
121  * and an octal word (usually some error
122  * status register) passed as argument.
123  */
124 deverror(bp, o1, o2)
125 register struct buf *bp;
126 {
127 
128 	prdev("err", bp->b_dev);
129 	printf("bn=%d er=%x,%x\n", bp->b_blkno, o1,o2);
130 }
131