1*41475Smckusick /* 2*41475Smckusick * Copyright (c) 1988 University of Utah. 3*41475Smckusick * Copyright (c) 1990 The Regents of the University of California. 4*41475Smckusick * All rights reserved. 5*41475Smckusick * 6*41475Smckusick * This code is derived from software contributed to Berkeley by 7*41475Smckusick * the Systems Programming Group of the University of Utah Computer 8*41475Smckusick * Science Department. 9*41475Smckusick * 10*41475Smckusick * %sccs.include.redist.c% 11*41475Smckusick * 12*41475Smckusick * from: Utah $Hdr: cons.c 1.4 88/12/03$ 13*41475Smckusick * 14*41475Smckusick * @(#)cons.c 7.1 (Berkeley) 05/08/90 15*41475Smckusick */ 16*41475Smckusick 17*41475Smckusick #include "param.h" 18*41475Smckusick #include "user.h" 19*41475Smckusick #include "systm.h" 20*41475Smckusick #include "buf.h" 21*41475Smckusick #include "ioctl.h" 22*41475Smckusick #include "tty.h" 23*41475Smckusick #include "file.h" 24*41475Smckusick #include "conf.h" 25*41475Smckusick 26*41475Smckusick #include "cons.h" 27*41475Smckusick 28*41475Smckusick /* XXX - all this could be autoconfig()ed */ 29*41475Smckusick #include "ite.h" 30*41475Smckusick #if NITE > 0 31*41475Smckusick int itecnprobe(), itecninit(), itecngetc(), itecnputc(); 32*41475Smckusick #endif 33*41475Smckusick #include "dca.h" 34*41475Smckusick #if NDCA > 0 35*41475Smckusick int dcacnprobe(), dcacninit(), dcacngetc(), dcacnputc(); 36*41475Smckusick #endif 37*41475Smckusick 38*41475Smckusick struct consdev constab[] = { 39*41475Smckusick #if NITE > 0 40*41475Smckusick { itecnprobe, itecninit, itecngetc, itecnputc }, 41*41475Smckusick #endif 42*41475Smckusick #if NDCA > 0 43*41475Smckusick { dcacnprobe, dcacninit, dcacngetc, dcacnputc }, 44*41475Smckusick #endif 45*41475Smckusick { 0 }, 46*41475Smckusick }; 47*41475Smckusick /* end XXX */ 48*41475Smckusick 49*41475Smckusick extern struct consdev constab[]; 50*41475Smckusick 51*41475Smckusick struct tty *constty = 0; /* virtual console output device */ 52*41475Smckusick struct consdev *cn_tab; /* physical console device info */ 53*41475Smckusick struct tty *cn_tty; /* XXX: console tty struct for tprintf */ 54*41475Smckusick 55*41475Smckusick cninit() 56*41475Smckusick { 57*41475Smckusick register struct consdev *cp; 58*41475Smckusick 59*41475Smckusick /* 60*41475Smckusick * Collect information about all possible consoles 61*41475Smckusick * and find the one with highest priority 62*41475Smckusick */ 63*41475Smckusick for (cp = constab; cp->cn_probe; cp++) { 64*41475Smckusick (*cp->cn_probe)(cp); 65*41475Smckusick if (cp->cn_pri > CN_DEAD && 66*41475Smckusick (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri)) 67*41475Smckusick cn_tab = cp; 68*41475Smckusick } 69*41475Smckusick /* 70*41475Smckusick * No console, we can handle it 71*41475Smckusick */ 72*41475Smckusick if ((cp = cn_tab) == NULL) 73*41475Smckusick return; 74*41475Smckusick /* 75*41475Smckusick * Turn on console 76*41475Smckusick */ 77*41475Smckusick cn_tty = cp->cn_tp; 78*41475Smckusick (*cp->cn_init)(cp); 79*41475Smckusick } 80*41475Smckusick 81*41475Smckusick cnopen(dev, flag) 82*41475Smckusick dev_t dev; 83*41475Smckusick { 84*41475Smckusick if (cn_tab == NULL) 85*41475Smckusick return(0); 86*41475Smckusick dev = cn_tab->cn_dev; 87*41475Smckusick return ((*cdevsw[major(dev)].d_open)(dev, flag)); 88*41475Smckusick } 89*41475Smckusick 90*41475Smckusick cnclose(dev, flag) 91*41475Smckusick dev_t dev; 92*41475Smckusick { 93*41475Smckusick if (cn_tab == NULL) 94*41475Smckusick return(0); 95*41475Smckusick dev = cn_tab->cn_dev; 96*41475Smckusick return ((*cdevsw[major(dev)].d_close)(dev, flag)); 97*41475Smckusick } 98*41475Smckusick 99*41475Smckusick cnread(dev, uio) 100*41475Smckusick dev_t dev; 101*41475Smckusick struct uio *uio; 102*41475Smckusick { 103*41475Smckusick if (cn_tab == NULL) 104*41475Smckusick return(0); 105*41475Smckusick dev = cn_tab->cn_dev; 106*41475Smckusick return ((*cdevsw[major(dev)].d_read)(dev, uio)); 107*41475Smckusick } 108*41475Smckusick 109*41475Smckusick cnwrite(dev, uio) 110*41475Smckusick dev_t dev; 111*41475Smckusick struct uio *uio; 112*41475Smckusick { 113*41475Smckusick if (cn_tab == NULL) 114*41475Smckusick return(0); 115*41475Smckusick dev = cn_tab->cn_dev; 116*41475Smckusick return ((*cdevsw[major(dev)].d_write)(dev, uio)); 117*41475Smckusick } 118*41475Smckusick 119*41475Smckusick cnioctl(dev, cmd, data, flag) 120*41475Smckusick dev_t dev; 121*41475Smckusick caddr_t data; 122*41475Smckusick { 123*41475Smckusick int error; 124*41475Smckusick 125*41475Smckusick if (cn_tab == NULL) 126*41475Smckusick return(0); 127*41475Smckusick /* 128*41475Smckusick * Superuser can always use this to wrest control of console 129*41475Smckusick * output from the "virtual" console. 130*41475Smckusick */ 131*41475Smckusick if (cmd == TIOCCONS && constty) { 132*41475Smckusick error = suser(u.u_cred, &u.u_acflag); 133*41475Smckusick if (error) 134*41475Smckusick return (error); 135*41475Smckusick constty = NULL; 136*41475Smckusick return (0); 137*41475Smckusick } 138*41475Smckusick dev = cn_tab->cn_dev; 139*41475Smckusick return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag)); 140*41475Smckusick } 141*41475Smckusick 142*41475Smckusick /*ARGSUSED*/ 143*41475Smckusick cnselect(dev, rw) 144*41475Smckusick dev_t dev; 145*41475Smckusick int rw; 146*41475Smckusick { 147*41475Smckusick if (cn_tab == NULL) 148*41475Smckusick return(1); 149*41475Smckusick return(ttselect(cn_tab->cn_dev, rw)); 150*41475Smckusick } 151*41475Smckusick 152*41475Smckusick cngetc() 153*41475Smckusick { 154*41475Smckusick if (cn_tab == NULL) 155*41475Smckusick return(0); 156*41475Smckusick return((*cn_tab->cn_getc)(cn_tab->cn_dev)); 157*41475Smckusick } 158*41475Smckusick 159*41475Smckusick cnputc(c) 160*41475Smckusick register int c; 161*41475Smckusick { 162*41475Smckusick if (cn_tab == NULL) 163*41475Smckusick return; 164*41475Smckusick if (c) { 165*41475Smckusick (*cn_tab->cn_putc)(cn_tab->cn_dev, c); 166*41475Smckusick if (c == '\n') 167*41475Smckusick (*cn_tab->cn_putc)(cn_tab->cn_dev, '\r'); 168*41475Smckusick } 169*41475Smckusick } 170