|
|
1.1 ! root 1: /* kprintf.c - kprintf, kputc, savestate, rststate */ ! 2: ! 3: #include <conf.h> ! 4: #include <kernel.h> ! 5: #include <io.h> ! 6: #include <slu.h> ! 7: #include <tty.h> ! 8: #include <procreg.h> ! 9: ! 10: /*------------------------------------------------------------------------ ! 11: * kprintf -- kernel printf: formatted, unbuffered output to CONSOLE ! 12: *------------------------------------------------------------------------ ! 13: */ ! 14: kprintf(fmt, args) /* Derived by Bob Brown, Purdue U. */ ! 15: char *fmt; /* Flow control added by Steve Munson */ ! 16: { ! 17: int kputc(); ! 18: savestate(); ! 19: _doprnt(fmt, &args, kputc, CONSOLE); ! 20: rststate(); ! 21: return(OK); ! 22: } ! 23: ! 24: /*------------------------------------------------------------------------ ! 25: * kputc -- write a character on the non memory-mapped console device ! 26: * using polled I/O ! 27: *------------------------------------------------------------------------ ! 28: */ ! 29: LOCAL kputc(device ,c) ! 30: int device; ! 31: register char c; /* character to print from _doprnt */ ! 32: { ! 33: register int crstat, crbuf, ctstat; ! 34: register struct tty *ttyptr; ! 35: ! 36: if ( device != CONSOLE || c == 0 ) ! 37: return; ! 38: if ( c == NEWLINE ) ! 39: kputc( device, RETURN ); ! 40: ttyptr = (struct tty *)devtab[device].dvioblk; /* control block*/ ! 41: if (ttyptr) { ! 42: crstat = mfpr(RXCS); /* get recv. stat */ ! 43: crbuf = mfpr(RXDB); /* get content of receiver buffer */ ! 44: if ((crstat&SLUREADY) && ! 45: (ttyptr->oheld || (ttyptr->oflow && ! 46: (crbuf & SLUCHMASK) == ttyptr->ostop))) ! 47: do { ! 48: crstat = mfpr(RXCS); /* get recv stat */ ! 49: while (!(crstat&SLUREADY)) /* wait til ready */ ! 50: crstat = mfpr(RXCS);/* get recv stat */ ! 51: crbuf = mfpr(RXDB); /* get rec buffer */ ! 52: } while ((crbuf&SLUCHMASK) == ttyptr->ostop); ! 53: ttyptr->oheld = FALSE; ! 54: } ! 55: ctstat = mfpr(TXCS); /* get transmit status */ ! 56: while (!(ctstat & SLUREADY)) /* not ready to transmit yet */ ! 57: ctstat = mfpr(TXCS); /* poll for idle*/ ! 58: mtpr(c & SLUCHMASK, TXDB); /* transmit character */ ! 59: ctstat = mfpr(TXCS); /* get transmit status */ ! 60: while (!(ctstat & SLUREADY)) ! 61: ctstat = mfpr(TXCS); /* get transmit status */ ! 62: } ! 63: ! 64: LOCAL int savecrstat, savectstat; ! 65: LOCAL PStype ps; ! 66: /*------------------------------------------------------------------------------ ! 67: * savestate -- save the state of the non-memory mapped CONSOLE device ! 68: *------------------------------------------------------------------------------ ! 69: */ ! 70: LOCAL savestate() ! 71: { ! 72: disable(ps); ! 73: savecrstat = mfpr(RXCS) & SLUENABLE; ! 74: savectstat = mfpr(TXCS) & SLUENABLE; ! 75: mtpr(SLUDISABLE, RXCS); /* disable receive intpts */ ! 76: mtpr(SLUDISABLE, TXCS); /* disable transmit intpts */ ! 77: } ! 78: ! 79: /*-------------------------------------------------------------------------- ! 80: * rststate -- restore the state of the non-memory mapped CONSOLE device ! 81: *-------------------------------------------------------------------------- ! 82: */ ! 83: LOCAL rststate() ! 84: { ! 85: mtpr(savecrstat, RXCS); ! 86: mtpr(savectstat, TXCS); ! 87: restore(ps); ! 88: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.