force new version; tty driver fixes and up MOL patch
[unix-history] / usr / src / sys / kern / subr_prf.c
CommitLineData
96d38f03 1/* subr_prf.c 3.3 %G% */
8cbb423c
BJ
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"
96d38f03
BJ
8#include "../h/mtpr.h"
9
10#ifdef TRACE
11#define TRCBUFS 4096
12char trcbuf[TRCBUFS];
13char *trcbufp = trcbuf;
14int trcwrap;
15int trcprt = TRCBUFS;
16#endif
8cbb423c
BJ
17
18/*
19 * In case console is off,
20 * panicstr contains argument to last
21 * call to panic.
22 */
23
24char *panicstr;
25
26/*
27 * Scaled down version of C Library printf.
28 * Only %s %u %d (==%u) %o %x %D are recognized.
29 * Used to print diagnostic information
30 * directly on console tty.
31 * Since it is not interrupt driven,
32 * all system activities are pretty much
33 * suspended.
34 * Printf should not be used for chit-chat.
35 */
36/*VARARGS1*/
37printf(fmt, x1)
38register char *fmt;
39unsigned x1;
96d38f03
BJ
40{
41
42 prf(fmt, &x1, 0);
43}
44
45#ifdef TRACE
46trace(fmt, x1)
47register char *fmt;
48unsigned x1;
49{
50
51 prf(fmt, &x1, 1);
52}
53
54#endif
55
56prf(fmt, adx, trace)
57register char *fmt;
58register unsigned int *adx;
8cbb423c
BJ
59{
60 register c;
8cbb423c
BJ
61 char *s;
62
8cbb423c
BJ
63loop:
64 while((c = *fmt++) != '%') {
65 if(c == '\0')
66 return;
96d38f03 67 putchar(c, trace);
8cbb423c
BJ
68 }
69 c = *fmt++;
96d38f03
BJ
70 if (c == 'X')
71 printx((long)*adx, trace);
72 else if (c == 'd' || c == 'u' || c == 'o' || c == 'x')
73 printn((long)*adx, c=='o'? 8: (c=='x'? 16:10), trace);
74 else if (c == 's') {
8cbb423c 75 s = (char *)*adx;
96d38f03
BJ
76 while (c = *s++)
77#ifdef TRACE
78 if (trace) {
79 *trcbufp++ = c;
80 if (trcbufp >= &trcbuf[TRCBUFS]) {
81 trcbufp = trcbuf;
82 trcwrap = 1;
83 }
84 } else
85#endif
86 putchar(c, trace);
8cbb423c 87 } else if (c == 'D') {
96d38f03 88 printn(*(long *)adx, 10, trace);
8cbb423c
BJ
89 adx += (sizeof(long) / sizeof(int)) - 1;
90 }
91 adx++;
92 goto loop;
93}
94
96d38f03 95printx(x, trace)
8cbb423c
BJ
96long x;
97{
98 int i;
99
100 for (i = 0; i < 8; i++)
96d38f03 101 putchar("0123456789ABCDEF"[(x>>((7-i)*4))&0xf], trace);
8cbb423c
BJ
102}
103
104/*
105 * Print an unsigned integer in base b.
106 */
96d38f03 107printn(n, b, trace)
8cbb423c
BJ
108long n;
109{
110 register long a;
111
112 if (n<0) { /* shouldn't happen */
96d38f03 113 putchar('-', trace);
8cbb423c
BJ
114 n = -n;
115 }
116 if(a = n/b)
96d38f03
BJ
117 printn(a, b, trace);
118 putchar("0123456789ABCDEF"[(int)(n%b)], trace);
8cbb423c
BJ
119}
120
121/*
122 * Panic is called on unresolvable
123 * fatal errors.
124 * It syncs, prints "panic: mesg" and
125 * then loops.
126 */
127panic(s)
128char *s;
129{
130 panicstr = s;
131 update();
132 printf("panic: %s\n", s);
133 spl0();
134 for(;;)
135 ;
136}
137
138/*
139 * prdev prints a warning message of the
140 * form "mesg on dev x/y".
141 * x and y are the major and minor parts of
142 * the device argument.
143 */
144prdev(str, dev)
145char *str;
146dev_t dev;
147{
148
149 printf("%s on dev %u/%u\n", str, major(dev), minor(dev));
150}
151
152/*
153 * deverr prints a diagnostic from
154 * a device driver.
155 * It prints the device, block number,
156 * and an octal word (usually some error
157 * status register) passed as argument.
158 */
159deverror(bp, o1, o2)
160register struct buf *bp;
161{
162
163 prdev("err", bp->b_dev);
164 printf("bn=%d er=%x,%x\n", bp->b_blkno, o1,o2);
165}
96d38f03
BJ
166
167#ifdef TRACE
168dumptrc()
169{
170 register char *cp;
171 register int pos, nch;
172
173 nch = trcprt;
174 if (nch < 0 || nch > TRCBUFS)
175 nch = TRCBUFS;
176 pos = (trcbufp - trcbuf) - nch;
177 if (pos < 0)
178 if (trcwrap)
179 pos += TRCBUFS;
180 else {
181 nch += pos;
182 pos = 0;
183 }
184 for (cp = &trcbuf[pos]; nch > 0; nch--) {
185 putchar(*cp++, 0);
186 if (cp >= &trcbuf[TRCBUFS])
187 cp = trcbuf;
188 }
189}
190#else
191/*ARGSUSED*/
192dumptrc(nch)
193 int nch;
194{
195
196}
197#endif
198
199char *msgbufp = msgbuf; /* Next saved printf character */
200/*
201 * Print a character on console or in internal trace buffer.
202 * If destination is console then the last MSGBUFS characters
203 * are saved in msgbuf for inspection later.
204 */
205putchar(c, trace)
206register c;
207{
208 register s, timo;
209
210#ifdef TRACE
211 if (trace) {
212 *trcbufp++ = c;
213 if (trcbufp >= &trcbuf[TRCBUFS]) {
214 trcbufp = trcbuf;
215 trcwrap = 1;
216 }
217 return;
218 }
219#endif
220 if (c != '\0' && c != '\r' && c != 0177) {
221 *msgbufp++ = c;
222 if (msgbufp >= &msgbuf[MSGBUFS])
223 msgbufp = msgbuf;
224 }
225 if (c == 0)
226 return;
227 cnputc(c);
228}