|
|
1.1 root 1: /*
2: * File: putchar.c
3: *
4: * $Log: putchar.c,v $
5: * Revision 1.2 92/08/04 12:54:17 bin
6: * upd for ker59
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: IO iob;
39:
40: /*
41: * If we get a printf before the devices have been initialized,
42: * keep as many characters as we can until we can print them.
43: */
44: if (!ok_to_use_dev) {
45: if (p_off == P_LEN) {
46: p_buf[P_LEN-1] = '*'; /* Mark an overrun. */
47: } else {
48: p_buf[p_off++] = c; /* Stash the character. */
49: }
50: return;
51: }
52:
53: if (coninit == 0) {
54: ++coninit;
55: dopen(condev, IPW, DFCHR);
56: }
57:
58: if (c == '\n')
59: putchar('\r');
60:
61: iob.io_seg = IOSYS;
62: iob.io_ioc = 1;
63: #ifdef _I386
64: iob.io.vbase = &c;
65: #else
66: iob.io_base = &c;
67: #endif
68: iob.io_flag = 0;
69: dwrite(condev, &iob);
70: } /* putchar() */
71:
72: /*
73: * putchar_init() is called from main() once devices have been
74: * initialized. It marks the condev as usable, and then prints
75: * anything that has been stored away.
76: */
77: putchar_init()
78: {
79: int i;
80:
81: /* Mark condev as usable. */
82: ok_to_use_dev = 1;
83:
84: /* Dump everything we've stored away. */
85: for (i = 0; i < p_off; ++i)
86: putchar(p_buf[i]);
87:
88: if ('*' == p_buf[P_LEN-1])
89: printf("\npb buffer overrun detected.\n");
90: } /* putchar_init() */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.