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