|
|
1.1 root 1: /* $Header: /src386/kernel/io.386/RCS/console.c,v 1.3 92/08/28 09:02:49 bin Exp Locker: bin $ */
2: /*
3: * Tiny console driver.
4: * 8086/8088 Coherent, IBM PC.
5: *
6: * $Log: console.c,v $
7: * Revision 1.3 92/08/28 09:02:49 bin
8: * update by hal for kernel 61
9: *
10: * Revision 1.2 92/01/06 12:26:44 hal
11: * Compile with cc.mwc.
12: *
13: * Revision 2.1 88/09/03 13:03:39 src
14: * *** empty log message ***
15: *
16: * Revision 1.1 88/03/24 17:04:25 src
17: * Initial revision
18: *
19: * 86/11/19 Allan Cornish /usr/src/sys/i8086/drv/console.c
20: * putchar() initializes the (new) (IO).io_flag field to 0.
21: */
22: #include <sys/coherent.h>
23: #include <sys/inode.h>
24: #include <sys/stat.h>
25: #include <sys/con.h>
26: #include <sys/io.h>
27:
28: #define P_LEN 512 /* Keep about six full lines of characters. */
29: /*
30: * Stash messages in p_buf[] until we can print them.
31: * Note that p_buf[] can not be safely kalloc()'d because even
32: * those routines could generate printf()'s.
33: */
34: static char p_buf[P_LEN];
35: static int p_off; /* Offset into p_buff. */
36: int ok_to_use_dev = 0; /* Can we use the console device yet? */
37:
38: int coninit = 0;
39: dev_t condev = makedev(2,0);
40:
41: putchar(c)
42: int c;
43: {
44: IO iob;
45:
46:
47: /*
48: * If we get a printf before the devices have been initialized,
49: * keep as many characters as we can until we can print them.
50: */
51: if (condev != makedev(2,0) && !ok_to_use_dev) {
52: if (p_off == P_LEN) {
53: p_buf[P_LEN-1] = '*'; /* Mark an overrun. */
54: } else {
55: p_buf[p_off++] = c; /* Stash the character. */
56: }
57: return;
58: }
59:
60: if (coninit == 0) {
61: ++coninit;
62: dopen( condev, IPW, DFCHR );
63: }
64:
65: if (c == '\n')
66: putchar('\r');
67:
68: iob.io_seg = IOSYS;
69: iob.io_ioc = 1;
70: iob.io.vbase = &c;
71: iob.io_flag = 0;
72: dwrite( condev, &iob );
73: } /* putchar() */
74:
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: /* nothing to do if CRT is console device */
89: if (condev == makedev(2,0))
90: return;
91:
92: /* Dump everything we've stored away. */
93: for (i = 0; i < p_off; ++i) {
94: putchar(p_buf[i]);
95: }
96:
97: printf("\n-\n");
98: if ('*' == p_buf[P_LEN-1]) {
99: printf("\npb buffer overrun detected.\n");
100: }
101: } /* putchar_init() */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.