Annotation of Gnu-Mach/chips/serial_console.c, revision 1.1

1.1     ! root        1: /* 
        !             2:  * Mach Operating System
        !             3:  * Copyright (c) 1991,1990,1989 Carnegie Mellon University
        !             4:  * All Rights Reserved.
        !             5:  * 
        !             6:  * Permission to use, copy, modify and distribute this software and its
        !             7:  * documentation is hereby granted, provided that both the copyright
        !             8:  * notice and this permission notice appear in all copies of the
        !             9:  * software, derivative works or modified versions, and any portions
        !            10:  * thereof, and that both notices appear in supporting documentation.
        !            11:  * 
        !            12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !            14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            15:  * 
        !            16:  * Carnegie Mellon requests users of this software to return to
        !            17:  * 
        !            18:  *  Software Distribution Coordinator  or  [email protected]
        !            19:  *  School of Computer Science
        !            20:  *  Carnegie Mellon University
        !            21:  *  Pittsburgh PA 15213-3890
        !            22:  * 
        !            23:  * any improvements or extensions that they make and grant Carnegie Mellon
        !            24:  * the rights to redistribute these changes.
        !            25:  */
        !            26: /*
        !            27:  *     File: serial_console.c
        !            28:  *     Author: Alessandro Forin, Carnegie Mellon University
        !            29:  *     Date:   7/91
        !            30:  *
        !            31:  *     Console driver for serial-line based consoles.
        !            32:  */
        !            33: 
        !            34: #include <constty.h>
        !            35: #if    NCONSTTY > 0
        !            36: #include <bm.h>
        !            37: #include <platforms.h>
        !            38: 
        !            39: #include <mach_kdb.h>
        !            40: 
        !            41: #include <machine/machspl.h>           /* spl definitions */
        !            42: #include <device/io_req.h>
        !            43: #include <device/tty.h>
        !            44: #include <sys/syslog.h>
        !            45: 
        !            46: #include <chips/busses.h>
        !            47: #include <chips/screen_defs.h>
        !            48: #include <chips/serial_defs.h>
        !            49: 
        !            50: #ifdef DECSTATION
        !            51: #include <mips/prom_interface.h>
        !            52: #define        find_rconsole(p)        dec_check_rcline(p)
        !            53: #define        CONSOLE_SERIAL_LINE_NO  3
        !            54: #endif /*DECSTATION*/
        !            55: 
        !            56: #ifdef VAXSTATION
        !            57: #define        find_rconsole(p)
        !            58: #define cnputc ser_putc
        !            59: #define cngetc ser_getc
        !            60: #define cnpollc ser_pollc
        !            61: #define cnmaygetc ser_maygetc
        !            62: #define        CONSOLE_SERIAL_LINE_NO  3
        !            63: #endif /*VAXSTATION*/
        !            64: 
        !            65: #ifdef FLAMINGO
        !            66: #define        CONSOLE_SERIAL_LINE_NO  3
        !            67: #endif
        !            68: 
        !            69: #ifndef        CONSOLE_SERIAL_LINE_NO
        !            70: #define        CONSOLE_SERIAL_LINE_NO  0
        !            71: #endif
        !            72: 
        !            73: /* Size this as max possible number of lines in any serial chip we might use */
        !            74: static struct tty      console_tty_data[NCONSTTY];
        !            75: struct tty             *console_tty[NCONSTTY]; /* exported */
        !            76: 
        !            77: #define        DEFAULT_SPEED   B9600
        !            78: #define        DEFAULT_FLAGS   (TF_EVENP|TF_ODDP|TF_ECHO)
        !            79: 
        !            80: 
        !            81: /*
        !            82:  * A machine MUST have a console.  In our case
        !            83:  * things are a little complicated by the graphic
        !            84:  * display: people expect it to be their "console",
        !            85:  * but we'd like to be able to live without it.
        !            86:  * This is not to be confused with the "rconsole" thing:
        !            87:  * that just duplicates the console I/O to
        !            88:  * another place (for debugging/logging purposes).
        !            89:  *
        !            90:  * There is then another historical kludge: if
        !            91:  * there is a graphic display it is assumed that
        !            92:  * the minor "1" is the mouse, with some more
        !            93:  * magic attached to it.  And again, one might like to
        !            94:  * use the serial line 1 as a regular one.
        !            95:  *
        !            96:  */
        !            97: #define        user_console    0
        !            98: 
        !            99: int    console = 0;
        !           100: 
        !           101: int    (*console_probe)() = 0,
        !           102:        (*console_param)() = 0,
        !           103:        (*console_start)() = 0,
        !           104:        (*console_putc)() = 0,
        !           105:        (*console_getc)() = 0,
        !           106:        (*console_pollc)() = 0,
        !           107:        (*console_mctl)() = 0,
        !           108:        (*console_softCAR)() = 0;
        !           109: 
        !           110: /*
        !           111:  * Lower-level (internal) interfaces, for printf and gets
        !           112:  */
        !           113: int cnunit = 0;                /* which unit owns the 'console' */
        !           114: int cnline = 0;                /* which line of that unit */
        !           115: int rcline = 3;                /* alternate, "remote console" line */
        !           116: 
        !           117: rcoff()
        !           118: {
        !           119:        spl_t s = splhigh();
        !           120:        cnpollc(FALSE);
        !           121:        rcline = 0;
        !           122:        cnpollc(TRUE);
        !           123:        splx(s);
        !           124: }
        !           125: 
        !           126: rcputc(c)
        !           127: {
        !           128:        if (rcline)
        !           129:                (*console_putc)( cnunit, rcline, c);
        !           130: }
        !           131: 
        !           132: cnputc(c)
        !           133: {
        !           134: #if    NBM > 0
        !           135:        if (SCREEN_ISA_CONSOLE()) {
        !           136:                /* this does its own rcputc */
        !           137:                screen_blitc(SCREEN_CONS_UNIT(), c);
        !           138:        } else
        !           139: #endif NBM > 0
        !           140:               {
        !           141:                rcputc(c);
        !           142:                (*console_putc)( cnunit, cnline, c);/* insist on a console still */
        !           143:        }
        !           144:        if (c == '\n')
        !           145:                cnputc('\r');
        !           146: }
        !           147: 
        !           148: cngetc()
        !           149: {
        !           150:        return (*console_getc)( cnunit, cnline, TRUE, FALSE);
        !           151: }
        !           152: 
        !           153: cnpollc(bool)
        !           154: {
        !           155:        (*console_pollc)(cnunit, bool);
        !           156: }
        !           157: 
        !           158:  
        !           159: /* Debugger support */
        !           160: cnmaygetc()
        !           161: {
        !           162:        return (*console_getc)( cnunit, cnline, FALSE, FALSE);
        !           163: }
        !           164: 
        !           165: 
        !           166: #if    NBM > 0
        !           167: boolean_t
        !           168: screen_captures(line)
        !           169:        register int    line;
        !           170: {
        !           171:        return (SCREEN_ISA_CONSOLE() &&
        !           172:                ((line == SCREEN_LINE_KEYBOARD) ||
        !           173:                 (line == SCREEN_LINE_POINTER)));
        !           174: }
        !           175: #endif
        !           176: 
        !           177: /*
        !           178:  * Higher level (external) interface, for GP use
        !           179:  */
        !           180: 
        !           181: 
        !           182: /*
        !           183:  * This is basically a special form of autoconf,
        !           184:  * to get printf() going before true autoconf.
        !           185:  */
        !           186: cons_find(tube)
        !           187:        boolean_t tube;
        !           188: {
        !           189:        static struct bus_device d;
        !           190:        register int             i;
        !           191:        struct tty              *tp;
        !           192: 
        !           193:        for (i = 0; i < NCONSTTY; i++)
        !           194:                console_tty[i] = &console_tty_data[i];
        !           195:        /* the hardware device will set tp->t_addr for valid ttys */
        !           196: 
        !           197:        d.unit = 0;
        !           198: 
        !           199:        if ((console_probe == 0) ||
        !           200:            ((*console_probe)(0, &d) == 0)) {
        !           201:                /* we have no console, but maybe that's ok */
        !           202: #if    defined(DECSTATION) || defined(FLAMINGO)
        !           203:                /* no, it is not */
        !           204:                dprintf("%s", "no console!\n");
        !           205:                halt();
        !           206: #endif
        !           207:                return 0;
        !           208:        }
        !           209: 
        !           210:        /*
        !           211:         * Remote console line
        !           212:         */
        !           213:        find_rconsole(&rcline);
        !           214: 
        !           215:        /*
        !           216:         * Console always on unit 0. Fix if you need to
        !           217:         */
        !           218:        cnunit = 0;
        !           219: 
        !           220: #if    NBM > 0
        !           221:        if (tube && screen_probe(0)) {
        !           222: 
        !           223:                /* associate screen to console iff */
        !           224:                if (console == user_console)
        !           225:                        screen_console = cnunit | SCREEN_CONS_ENBL;
        !           226:                cnline = SCREEN_LINE_KEYBOARD;
        !           227: 
        !           228:                /* mouse and keybd */
        !           229:                tp = console_tty[SCREEN_LINE_KEYBOARD];
        !           230:                tp->t_ispeed = B4800;
        !           231:                tp->t_ospeed = B4800;
        !           232:                tp->t_flags = TF_LITOUT|TF_EVENP|TF_ECHO|TF_XTABS|TF_CRMOD;
        !           233:                tp->t_dev = SCREEN_LINE_KEYBOARD;
        !           234:                (*console_param)(tp, SCREEN_LINE_KEYBOARD);
        !           235: 
        !           236:                tp = console_tty[SCREEN_LINE_POINTER];
        !           237:                tp->t_ispeed = B4800;
        !           238:                tp->t_ospeed = B4800;
        !           239:                tp->t_flags = TF_LITOUT|TF_ODDP;
        !           240:                tp->t_dev = SCREEN_LINE_POINTER;
        !           241:                (*console_param)(tp, SCREEN_LINE_POINTER);
        !           242:                /* console_scan will turn on carrier */
        !           243: 
        !           244:        } else {
        !           245: #endif NBM > 0
        !           246:                /* use non-graphic console as console */
        !           247:                cnline = CONSOLE_SERIAL_LINE_NO;
        !           248: 
        !           249:                tp = console_tty[cnline];
        !           250:                tp->t_ispeed = B9600;
        !           251:                tp->t_ospeed = B9600;
        !           252:                tp->t_flags = TF_LITOUT|TF_EVENP|TF_ECHO|TF_XTABS|TF_CRMOD;
        !           253:                (*console_softCAR)(cnunit, cnline, TRUE);
        !           254:                console = cnline;
        !           255:                tp->t_dev = console;
        !           256:                (*console_param)(tp, SCREEN_LINE_OTHER);
        !           257: #if    NBM > 0
        !           258:        }
        !           259: 
        !           260:        /*
        !           261:         * Enable rconsole interrupts for KDB
        !           262:         */
        !           263:        if (tube && rcline != cnline) {
        !           264:                tp = console_tty[rcline];
        !           265:                tp->t_ispeed = B9600;
        !           266:                tp->t_ospeed = B9600;
        !           267:                tp->t_flags = TF_LITOUT|TF_EVENP|TF_ECHO|TF_XTABS|TF_CRMOD;
        !           268:                tp->t_dev = rcline;
        !           269:                (*console_softCAR)(cnunit, rcline, TRUE);
        !           270:                (*console_param)(tp, SCREEN_LINE_OTHER);
        !           271:        } else
        !           272:                rcline = 0;
        !           273: #endif NBM > 0
        !           274: }
        !           275: 
        !           276: /*
        !           277:  * Open routine
        !           278:  */
        !           279: extern int
        !           280:        cons_start(struct tty *),
        !           281:        cons_stop(struct tty *, int),
        !           282:        cons_mctl(struct tty *, int, int);
        !           283: 
        !           284: cons_open(dev, flag, ior)
        !           285:        int     dev;
        !           286:        int     flag;
        !           287:        io_req_t ior;
        !           288: {
        !           289:        register struct tty     *tp;
        !           290:        register int            ttyno;
        !           291:  
        !           292:        if (dev == user_console)
        !           293:                dev = console;
        !           294: 
        !           295:        ttyno = dev;
        !           296:        if (ttyno >= NCONSTTY)
        !           297:                return D_NO_SUCH_DEVICE;
        !           298:        tp = console_tty[ttyno];
        !           299: 
        !           300:        /* But was it there at probe time */
        !           301:        if (tp->t_addr == 0)
        !           302:                return D_NO_SUCH_DEVICE;
        !           303: 
        !           304:        tp->t_start     = cons_start;
        !           305:        tp->t_stop      = cons_stop;
        !           306:        tp->t_mctl      = cons_mctl;
        !           307: 
        !           308: #if    NBM > 0
        !           309:        if (screen_captures(ttyno))
        !           310:                screen_open(SCREEN_CONS_UNIT(), ttyno==SCREEN_LINE_KEYBOARD);
        !           311: #endif NBM > 0
        !           312: 
        !           313:        if ((tp->t_state & TS_ISOPEN) == 0) {
        !           314:                if (tp->t_ispeed == 0) {
        !           315:                        tp->t_ispeed = DEFAULT_SPEED;
        !           316:                        tp->t_ospeed = DEFAULT_SPEED;
        !           317:                        tp->t_flags = DEFAULT_FLAGS;
        !           318:                }
        !           319:                tp->t_dev = dev;
        !           320:                (*console_param)(tp, ttyno);
        !           321:        }
        !           322: 
        !           323:        return (char_open(dev, tp, flag, ior));
        !           324: }
        !           325: 
        !           326: 
        !           327: /*
        !           328:  * Close routine
        !           329:  */
        !           330: cons_close(dev, flag)
        !           331:        int dev;
        !           332: {
        !           333:        register struct tty     *tp;
        !           334:        register int            ttyno;
        !           335:        spl_t s;
        !           336:  
        !           337:        if (dev == user_console)
        !           338:                dev = console;
        !           339: 
        !           340:        ttyno = dev;
        !           341: 
        !           342: #if    NBM > 0
        !           343:        if (screen_captures(ttyno))
        !           344:                screen_close(SCREEN_CONS_UNIT(), ttyno==SCREEN_LINE_KEYBOARD);
        !           345: #endif NBM > 0
        !           346: 
        !           347:        tp = console_tty[ttyno];
        !           348: 
        !           349:        s = spltty();
        !           350:        simple_lock(&tp->t_lock);
        !           351: 
        !           352:        ttyclose(tp);
        !           353: 
        !           354:        simple_unlock(&tp->t_lock);
        !           355:        splx(s);
        !           356: }
        !           357: 
        !           358: cons_read(dev, ior)
        !           359:        int                     dev;
        !           360:        register io_req_t       ior;
        !           361: {
        !           362:        register struct tty     *tp;
        !           363:        register                ttyno;
        !           364:  
        !           365:        if (dev == user_console)
        !           366:                dev = console;
        !           367: 
        !           368:        ttyno = dev;
        !           369: #if    NBM > 0
        !           370:        if (SCREEN_ISA_CONSOLE() && (ttyno == SCREEN_LINE_POINTER))
        !           371:                return screen_read(SCREEN_CONS_UNIT(), ior);
        !           372: #endif NBM > 0
        !           373: 
        !           374:        tp = console_tty[ttyno];
        !           375:        return char_read(tp, ior);
        !           376: }
        !           377:  
        !           378: 
        !           379: cons_write(dev, ior)
        !           380:        int                     dev;
        !           381:        register io_req_t       ior;
        !           382: {
        !           383:        register struct tty     *tp;
        !           384:        register                ttyno;
        !           385: 
        !           386:        if (dev == user_console)
        !           387:                dev = console;
        !           388: 
        !           389:        ttyno = dev;
        !           390: #if    NBM > 0
        !           391:        if (screen_captures(ttyno))
        !           392:                return screen_write(SCREEN_CONS_UNIT(), ior);
        !           393: #endif NBM > 0
        !           394: 
        !           395:        tp = console_tty[ttyno];
        !           396:        return char_write(tp, ior);
        !           397: }
        !           398: 
        !           399: /*
        !           400:  * Start output on a line
        !           401:  */
        !           402: cons_start(tp)
        !           403:        register struct tty *tp;
        !           404: {
        !           405:        spl_t                   s;
        !           406:  
        !           407:        s = spltty();
        !           408:        if (tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP))
        !           409:                goto out;
        !           410: 
        !           411:        if (tp->t_outq.c_cc == 0)
        !           412:                goto out;
        !           413: 
        !           414:        tp->t_state |= TS_BUSY;
        !           415: 
        !           416:        (*console_start)(tp);
        !           417: 
        !           418: out:
        !           419:        splx(s);
        !           420: }
        !           421: 
        !           422: /*
        !           423:  * Stop output on a line.
        !           424:  */
        !           425: cons_stop(tp, flag)
        !           426:        register struct tty *tp;
        !           427: {
        !           428:        register spl_t s;
        !           429: 
        !           430:        s = spltty();
        !           431:        if (tp->t_state & TS_BUSY) {
        !           432:                if ((tp->t_state&TS_TTSTOP)==0)
        !           433:                        tp->t_state |= TS_FLUSH;
        !           434:        }
        !           435:        splx(s);
        !           436: }
        !           437:  
        !           438: 
        !           439: /*
        !           440:  * Modem control
        !           441:  */
        !           442: cons_mctl(
        !           443:        struct tty      *tp,
        !           444:        int             bits,
        !           445:        int             how)
        !           446: {
        !           447:        return (*console_mctl)(tp->t_dev, bits, how);
        !           448: }
        !           449: 
        !           450: /*
        !           451:  * Abnormal close
        !           452:  */
        !           453: cons_portdeath(dev, port)
        !           454:        int     dev;
        !           455:        mach_port_t port;
        !           456: {
        !           457:        if (dev == user_console)
        !           458:                dev = console;
        !           459:        return (tty_portdeath(console_tty[dev], port));
        !           460: }
        !           461: 
        !           462: /*
        !           463:  * Get/Set status rotuines
        !           464:  */
        !           465: io_return_t
        !           466: cons_get_status(dev, flavor, data, status_count)
        !           467:        int             dev;
        !           468:        dev_flavor_t    flavor;
        !           469:        int *           data;           /* pointer to OUT array */
        !           470:        unsigned int    *status_count;          /* out */
        !           471: {
        !           472:        register struct tty *tp;
        !           473:        register int    ttyno;
        !           474: 
        !           475:        if (dev == user_console)
        !           476:                dev = console;
        !           477: 
        !           478:        ttyno = dev;
        !           479: 
        !           480: #if    NBM > 0
        !           481:        if (screen_captures(ttyno) &&
        !           482:            (screen_get_status(SCREEN_CONS_UNIT(),
        !           483:                        flavor, data, status_count) == D_SUCCESS))
        !           484:                return D_SUCCESS;
        !           485: #endif NBM > 0
        !           486: 
        !           487:        tp = console_tty[ttyno];
        !           488: 
        !           489:        switch (flavor) {
        !           490:            case TTY_MODEM:
        !           491:                /* Take all bits */
        !           492:                *data = (*console_mctl)(dev, -1, DMGET);
        !           493:                *status_count = 1;
        !           494:                break;
        !           495:            default:
        !           496:                return (tty_get_status(tp, flavor, data, status_count));
        !           497:        }
        !           498:        return (D_SUCCESS);
        !           499: }
        !           500: 
        !           501: io_return_t
        !           502: cons_set_status(dev, flavor, data, status_count)
        !           503:        int             dev;
        !           504:        dev_flavor_t    flavor;
        !           505:        int *           data;
        !           506:        unsigned int    status_count;
        !           507: {
        !           508:        register struct tty *tp;
        !           509:        register int    ttyno;
        !           510: 
        !           511:        if (dev == user_console)
        !           512:                dev = console;
        !           513: 
        !           514:        ttyno = dev;
        !           515: 
        !           516: #if    NBM > 0
        !           517:        if (screen_captures(ttyno) &&
        !           518:            (screen_set_status(SCREEN_CONS_UNIT(),
        !           519:                        flavor, data, status_count) == D_SUCCESS))
        !           520:                return D_SUCCESS;
        !           521: #endif NBM > 0
        !           522: 
        !           523:        tp  = console_tty[ttyno];
        !           524: 
        !           525:        switch (flavor) {
        !           526:            case TTY_MODEM:
        !           527:                if (status_count < TTY_MODEM_COUNT)
        !           528:                    return (D_INVALID_OPERATION);
        !           529:                (void) (*console_mctl)(dev, *data, DMSET);
        !           530:                break;
        !           531: 
        !           532:            case TTY_SET_BREAK:
        !           533:                (void) (*console_mctl)(dev, TM_BRK, DMBIS);
        !           534:                break;
        !           535: 
        !           536:            case TTY_CLEAR_BREAK:
        !           537:                (void) (*console_mctl)(dev, TM_BRK, DMBIC);
        !           538:                break;
        !           539: 
        !           540:            case TTY_STATUS:
        !           541:            {
        !           542:                register int error = D_SUCCESS;
        !           543:                struct tty_status *tsp;
        !           544: 
        !           545:                /*
        !           546:                 * Defend from noise. The cshell...
        !           547:                 */
        !           548:                tsp = (struct tty_status *)data;
        !           549:                if ((tsp->tt_ispeed != tp->t_ispeed) ||
        !           550:                    (tsp->tt_ospeed != tp->t_ospeed) ||
        !           551:                    (tsp->tt_breakc != tp->t_breakc) ||
        !           552:                    ((tsp->tt_flags & ~TF_HUPCLS) != tp->t_flags)) {
        !           553: 
        !           554:                        error = tty_set_status(tp, flavor, data, status_count);
        !           555:                        if (error == 0) {
        !           556:                            spl_t s = spltty();
        !           557:                            tp->t_state &= ~(TS_BUSY|TS_FLUSH);
        !           558:                            (*console_param)(tp, ttyno);
        !           559:                            splx(s);
        !           560:                        }
        !           561:                } else
        !           562:                if (tsp->tt_flags & TF_HUPCLS)
        !           563:                        tp->t_state |= TS_HUPCLS;
        !           564:                return (error);
        !           565:            }
        !           566:            default:
        !           567:                return (tty_set_status(tp, flavor, data, status_count));
        !           568:        }
        !           569:        return (D_SUCCESS);
        !           570: }
        !           571: 
        !           572: 
        !           573: /*
        !           574:  * A simple scheme to dispatch interrupts.
        !           575:  *
        !           576:  * This deals with the fairly common case where we get an
        !           577:  * interrupt on each rx/tx character.  A more elaborate
        !           578:  * scheme [someday here too..] would handle instead many
        !           579:  * characters per interrupt, perhaps using a DMA controller
        !           580:  * or a large SILO.  Note that it is also possible to simulate
        !           581:  * a DMA chip with 'pseudo-dma' code that runs directly down
        !           582:  * in the interrupt routine.
        !           583:  */
        !           584:  
        !           585: /*
        !           586:  * We just received a character, ship it up for further processing.
        !           587:  * Arguments are the tty number for which it is meant, a flag that
        !           588:  * indicates a keyboard or mouse is potentially attached to that
        !           589:  * tty (-1 if not), the character proper stripped down to 8 bits,
        !           590:  * and an indication of any error conditions associated with the
        !           591:  * receipt of the character.
        !           592:  * We deal here with rconsole input handling and dispatching to
        !           593:  * mouse or keyboard translation routines. cons_input() does
        !           594:  * the rest.
        !           595:  */
        !           596: #if    MACH_KDB
        !           597: int    l3break = 0x10;         /* dear old ^P, we miss you so bad. */
        !           598: #endif MACH_KDB
        !           599: 
        !           600: cons_simple_rint(ttyno, line, c, err)
        !           601:        int             line;
        !           602:        int             c;
        !           603: {
        !           604:        /*
        !           605:         * Rconsole. Drop in the debugger on break or ^P.
        !           606:         * Otherwise pretend input came from keyboard.
        !           607:         */
        !           608:        if (rcline && ttyno == rcline) {
        !           609: #if    MACH_KDB
        !           610:                if ((err & CONS_ERR_BREAK) ||
        !           611:                    ((c & 0x7f) == l3break))
        !           612:                        return gimmeabreak();
        !           613: #endif /* MACH_KDB */
        !           614:                ttyno = console;
        !           615:                goto process_it;
        !           616:        }
        !           617: 
        !           618: #if    NBM > 0
        !           619:        if (screen_captures(line)) {
        !           620:                if (line == SCREEN_LINE_POINTER)
        !           621:                        return mouse_input(SCREEN_CONS_UNIT(), c);
        !           622:                if (line == SCREEN_LINE_KEYBOARD) {
        !           623:                        c = lk201_rint(SCREEN_CONS_UNIT(), c, FALSE, FALSE);
        !           624:                        if (c == -1)
        !           625:                                return; /* shift or bad char */
        !           626:                }
        !           627:        }
        !           628: #endif NBM > 0
        !           629: process_it:
        !           630:        cons_input(ttyno, c, err);
        !           631: }
        !           632: 
        !           633: /*
        !           634:  * Send along a character on a tty.  If we were waiting for
        !           635:  * this char to complete the open procedure do so; check
        !           636:  * for errors; if all is well proceed to ttyinput().
        !           637:  */
        !           638: cons_input(ttyno, c, err)
        !           639: {
        !           640:        register struct tty *tp;
        !           641: 
        !           642:        tp  = console_tty[ttyno];
        !           643: 
        !           644:        if ((tp->t_state & TS_ISOPEN) == 0) {
        !           645:                tt_open_wakeup(tp);
        !           646:                return;
        !           647:        }
        !           648:        if (err) {
        !           649:                if (err & CONS_ERR_OVERRUN)
        !           650:                        log(LOG_WARNING, "sl%d: silo overflow\n", ttyno);
        !           651: 
        !           652:                if (err & CONS_ERR_PARITY)      
        !           653:                        if (((tp->t_flags & (TF_EVENP|TF_ODDP)) == TF_EVENP)
        !           654:                          || ((tp->t_flags & (TF_EVENP|TF_ODDP)) == TF_ODDP))
        !           655:                                return;
        !           656:                if (err & CONS_ERR_BREAK)       /* XXX autobaud XXX */
        !           657:                        c = tp->t_breakc;
        !           658:        }
        !           659:        ttyinput(c, tp);
        !           660: }
        !           661:  
        !           662: /*
        !           663:  * Transmission of a character is complete.
        !           664:  * Return the next character or -1 if none.
        !           665:  */
        !           666: cons_simple_tint(ttyno, all_sent)
        !           667:        boolean_t       all_sent;
        !           668: {
        !           669:        register struct tty *tp;
        !           670:  
        !           671:        tp = console_tty[ttyno];
        !           672:        if ((tp->t_addr == 0) || /* not probed --> stray */
        !           673:            (tp->t_state & TS_TTSTOP))
        !           674:                return -1;
        !           675: 
        !           676:        if (all_sent) {
        !           677:                tp->t_state &= ~TS_BUSY;
        !           678:                if (tp->t_state & TS_FLUSH)
        !           679:                        tp->t_state &= ~TS_FLUSH;
        !           680: 
        !           681:                cons_start(tp);
        !           682:        }
        !           683: 
        !           684:        if (tp->t_outq.c_cc == 0 || (tp->t_state&TS_BUSY)==0)
        !           685:                return -1;
        !           686: 
        !           687:        return getc(&tp->t_outq);
        !           688: }
        !           689: 
        !           690:  
        !           691: 
        !           692: 
        !           693: 
        !           694: #endif /*NCONSTTY > 0*/

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.