2300: #
2301: /*
2302: */
2303:
2304: #include "../param.h"
2305: #include "../seg.h"
2306: #include "../buf.h"
2307: #include "../conf.h"
2308:
2309: /*
2310: * Address and structure of the
2311: * KL-11 console device registers.
2312: */
2313: struct
2314: {
2315: int rsr;
2316: int rbr;
2317: int xsr;
2318: int xbr;
2319: };
2320: /* --------------------------- */
2321:
2322: /*
2323: * In case console is off,
2324: * panicstr contains argument to last
2325: * call to panic.
2326: */
2327:
2328: char *panicstr;
2329:
2330: /*
2331: * Scaled down version of C Library printf.
2332: * Only %s %l %d (==%l) %o are recognized.
2333: * Used to print diagnostic information
2334: * directly on console tty.
2335: * Since it is not interrupt driven,
2336: * all system activities are pretty much
2337: * suspended.
2338: * Printf should not be used for chit-chat.
2339: */
2340: printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9,xa,xb,xc)
2341: char fmt[];
2342: {
2343: register char *s;
2344: register *adx, c;
2345:
2346: adx = &x1;
2347: loop:
2348: while((c = *fmt++) != '%') {
2349: if(c == '\0')
2350: return;
2351: putchar(c);
2352: }
2353: c = *fmt++;
2354: if(c == 'd' || c == 'l' || c == 'o')
2355: printn(*adx, c=='o'? 8: 10);
2356: if(c == 's') {
2357: s = *adx;
2358: while(c = *s++)
2359: putchar(c);
2360: }
2361: adx++;
2362: goto loop;
2363: }
2364: /* --------------------------- */
2365:
2366: /*
2367: * Print an unsigned integer in base b.
2368: */
2369: printn(n, b)
2370: {
2371: register a;
2372:
2373: if(a = ldiv(n, b))
2374: printn(a, b);
2375: putchar(lrem(n, b) + '0');
2376: }
2377: /* --------------------------- */
2378:
2379: /*
2380: * Print a character on console.
2381: * Attempts to save and restore device
2382: * status.
2383: * If the switches are 0, all
2384: * printing is inhibited.
2385: */
2386: putchar(c)
2387: {
2388: register rc, s;
2389:
2390: rc = c;
2391: if(SW->integ == 0)
2392: return;
2393: while((KL->xsr&0200) == 0)
2394: ;
2395: if(rc == 0)
2396: return;
2397: s = KL->xsr;
2398: KL->xsr = 0;
2399: KL->xbr = rc;
2400: if(rc == '\n') {
2401: putchar('\r');
2402: putchar(0177);
2403: putchar(0177);
2404: }
2405: putchar(0);
2406: KL->xsr = s;
2407: }
2408: /* --------------------------- */
2409:
2410: /*
2411: * Panic is called on unresolvable
2412: * fatal errors.
2413: * It syncs, prints "panic: mesg" and
2414: * then loops.
2415: */
2416: panic(s)
2417: char *s;
2418: {
2419: panicstr = s;
2420: update();
2421: printf("panic: %s\n", s);
2422: for(;;)
2423: idle();
2424: }
2425: /* --------------------------- */
2426:
2427: /*
2428: * prdev prints a warning message of the
2429: * form "mesg on dev x/y".
2430: * x and y are the major and minor parts of
2431: * the device argument.
2432: */
2433: prdev(str, dev)
2434: {
2435:
2436: printf("%s on dev %l/%l\n", str, dev.d_major, dev.d_minor);
2437: }
2438: /* --------------------------- */
2439:
2440: /*
2441: * deverr prints a diagnostic from
2442: * a device driver.
2443: * It prints the device, block number,
2444: * and an octal word (usually some error
2445: * status register) passed as argument.
2446: */
2447: deverror(bp, o1, o2)
2448: int *bp;
2449: {
2450: register *rbp;
2451:
2452: rbp = bp;
2453: prdev("err", rbp->b_dev);
2454: printf("bn%l er%o %o\n", rbp->b_blkno, o1, o2);
2455: }
2456: /* --------------------------- */