|
|
1.1 root 1: /*
2: * File: putchar.c
3: *
4: * $Log: putchar.c,v $
5: * Revision 1.5 93/04/14 10:12:14 root
6: * r75
7: *
8: * Revision 1.4 92/06/15 13:06:59 root
9: * Use putchar_init on (2,0) as well as async.
10: *
11: * Revision 1.3 92/06/11 21:05:27 root
12: * *** empty log message ***
13: *
14: */
15: #include <sys/coherent.h>
16: #include <sys/inode.h>
17: #include <sys/stat.h>
18: #include <sys/con.h>
19: #include <sys/io.h>
20: #include <sys/devices.h>
21:
22: #define P_LEN 1024
23: /*
24: * Stash messages in p_buf[] until we can print them.
25: * Note that p_buf[] can not be safely kalloc()'d because even
26: * those routines could generate printf()'s.
27: */
28: static char p_buf[P_LEN];
29: static int p_off; /* Offset into p_buff. */
30: int ok_to_use_dev = 0; /* Can we use the console device yet? */
31:
32: int coninit = 0;
33: dev_t condev = makedev(2,0);
34:
35: putchar(c)
36: int c;
37: {
38: #if SERIAL_CONSOLE || GORT || KLAATU
39: __putchar(c);
40: #else
41: IO iob;
42:
43: /*
44: * If we get a printf before the devices have been initialized,
45: * keep as many characters as we can until we can print them.
46: */
47: if (!ok_to_use_dev) {
48: if (p_off == P_LEN) {
49: p_buf[P_LEN-1] = '*'; /* Mark an overrun. */
50: } else {
51: p_buf[p_off++] = c; /* Stash the character. */
52: }
53: return;
54: }
55:
56: if (coninit == 0) {
57: ++coninit;
58: dopen(condev, IPW, DFCHR);
59: }
60:
61: if (c == '\n')
62: putchar('\r');
63:
64: iob.io_seg = IOSYS;
65: iob.io_ioc = 1;
66: #ifdef _I386
67: iob.io.vbase = &c;
68: #else
69: iob.io_base = &c;
70: #endif
71: iob.io_flag = 0;
72: dwrite(condev, &iob);
73: #endif
74: } /* putchar() */
75:
76: /*
77: * putchar_init() is called from main() once devices have been
78: * initialized. It marks the condev as usable, and then prints
79: * anything that has been stored away.
80: */
81: putchar_init()
82: {
83: int i;
84:
85: /* Mark condev as usable. */
86: ok_to_use_dev = 1;
87:
88: /* Dump everything we've stored away. */
89: for (i = 0; i < p_off; ++i)
90: putchar(p_buf[i]);
91:
92: if ('*' == p_buf[P_LEN-1])
93: printf("\npb buffer overrun detected.\n");
94: } /* putchar_init() */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.