141475Smckusick /* 241475Smckusick * Copyright (c) 1988 University of Utah. 341475Smckusick * Copyright (c) 1990 The Regents of the University of California. 441475Smckusick * All rights reserved. 541475Smckusick * 641475Smckusick * This code is derived from software contributed to Berkeley by 741475Smckusick * the Systems Programming Group of the University of Utah Computer 841475Smckusick * Science Department. 941475Smckusick * 1041475Smckusick * %sccs.include.redist.c% 1141475Smckusick * 1245467Smckusick * from: Utah $Hdr: cons.c 1.1 90/07/09$ 1341475Smckusick * 14*49126Skarels * @(#)cons.c 7.6 (Berkeley) 05/04/91 1541475Smckusick */ 1641475Smckusick 1745788Sbostic #include "sys/param.h" 18*49126Skarels #include "sys/proc.h" 1945788Sbostic #include "sys/systm.h" 2045788Sbostic #include "sys/buf.h" 2145788Sbostic #include "sys/ioctl.h" 2245788Sbostic #include "sys/tty.h" 2345788Sbostic #include "sys/file.h" 2445788Sbostic #include "sys/conf.h" 2541475Smckusick 2641475Smckusick #include "cons.h" 2741475Smckusick 2841475Smckusick /* XXX - all this could be autoconfig()ed */ 2941475Smckusick #include "ite.h" 3041475Smckusick #if NITE > 0 3141475Smckusick int itecnprobe(), itecninit(), itecngetc(), itecnputc(); 3241475Smckusick #endif 3341475Smckusick #include "dca.h" 3441475Smckusick #if NDCA > 0 3541475Smckusick int dcacnprobe(), dcacninit(), dcacngetc(), dcacnputc(); 3641475Smckusick #endif 3742364Smckusick #include "dcm.h" 3842364Smckusick #if NDCM > 0 3942364Smckusick int dcmcnprobe(), dcmcninit(), dcmcngetc(), dcmcnputc(); 4042364Smckusick #endif 4141475Smckusick 4241475Smckusick struct consdev constab[] = { 4341475Smckusick #if NITE > 0 4441475Smckusick { itecnprobe, itecninit, itecngetc, itecnputc }, 4541475Smckusick #endif 4641475Smckusick #if NDCA > 0 4741475Smckusick { dcacnprobe, dcacninit, dcacngetc, dcacnputc }, 4841475Smckusick #endif 4942364Smckusick #if NDCM > 0 5042364Smckusick { dcmcnprobe, dcmcninit, dcmcngetc, dcmcnputc }, 5142364Smckusick #endif 5241475Smckusick { 0 }, 5341475Smckusick }; 5441475Smckusick /* end XXX */ 5541475Smckusick 5641475Smckusick struct tty *constty = 0; /* virtual console output device */ 5741475Smckusick struct consdev *cn_tab; /* physical console device info */ 5841475Smckusick struct tty *cn_tty; /* XXX: console tty struct for tprintf */ 5941475Smckusick 6041475Smckusick cninit() 6141475Smckusick { 6241475Smckusick register struct consdev *cp; 6341475Smckusick 6441475Smckusick /* 6541475Smckusick * Collect information about all possible consoles 6641475Smckusick * and find the one with highest priority 6741475Smckusick */ 6841475Smckusick for (cp = constab; cp->cn_probe; cp++) { 6941475Smckusick (*cp->cn_probe)(cp); 7041475Smckusick if (cp->cn_pri > CN_DEAD && 7141475Smckusick (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri)) 7241475Smckusick cn_tab = cp; 7341475Smckusick } 7441475Smckusick /* 7541475Smckusick * No console, we can handle it 7641475Smckusick */ 7741475Smckusick if ((cp = cn_tab) == NULL) 7841475Smckusick return; 7941475Smckusick /* 8041475Smckusick * Turn on console 8141475Smckusick */ 8241475Smckusick cn_tty = cp->cn_tp; 8341475Smckusick (*cp->cn_init)(cp); 8441475Smckusick } 8541475Smckusick 86*49126Skarels cnopen(dev, flag, mode, p) 8741475Smckusick dev_t dev; 88*49126Skarels int flag, mode; 89*49126Skarels struct proc *p; 9041475Smckusick { 9141475Smckusick if (cn_tab == NULL) 92*49126Skarels return (0); 9341475Smckusick dev = cn_tab->cn_dev; 94*49126Skarels return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p)); 9541475Smckusick } 9641475Smckusick 97*49126Skarels cnclose(dev, flag, mode, p) 9841475Smckusick dev_t dev; 99*49126Skarels int flag, mode; 100*49126Skarels struct proc *p; 10141475Smckusick { 10241475Smckusick if (cn_tab == NULL) 103*49126Skarels return (0); 10441475Smckusick dev = cn_tab->cn_dev; 105*49126Skarels return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, p)); 10641475Smckusick } 10741475Smckusick 10842942Smckusick cnread(dev, uio, flag) 10941475Smckusick dev_t dev; 11041475Smckusick struct uio *uio; 11141475Smckusick { 11241475Smckusick if (cn_tab == NULL) 113*49126Skarels return (0); 11441475Smckusick dev = cn_tab->cn_dev; 11542942Smckusick return ((*cdevsw[major(dev)].d_read)(dev, uio, flag)); 11641475Smckusick } 11741475Smckusick 11842942Smckusick cnwrite(dev, uio, flag) 11941475Smckusick dev_t dev; 12041475Smckusick struct uio *uio; 12141475Smckusick { 12241475Smckusick if (cn_tab == NULL) 123*49126Skarels return (0); 12441475Smckusick dev = cn_tab->cn_dev; 12542942Smckusick return ((*cdevsw[major(dev)].d_write)(dev, uio, flag)); 12641475Smckusick } 12741475Smckusick 128*49126Skarels cnioctl(dev, cmd, data, flag, p) 12941475Smckusick dev_t dev; 13041475Smckusick caddr_t data; 131*49126Skarels struct proc *p; 13241475Smckusick { 13341475Smckusick int error; 13441475Smckusick 13541475Smckusick if (cn_tab == NULL) 136*49126Skarels return (0); 13741475Smckusick /* 13841475Smckusick * Superuser can always use this to wrest control of console 13941475Smckusick * output from the "virtual" console. 14041475Smckusick */ 14141475Smckusick if (cmd == TIOCCONS && constty) { 142*49126Skarels error = suser(p->p_ucred, (u_short *) NULL); 14341475Smckusick if (error) 14441475Smckusick return (error); 14541475Smckusick constty = NULL; 14641475Smckusick return (0); 14741475Smckusick } 14841475Smckusick dev = cn_tab->cn_dev; 149*49126Skarels return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p)); 15041475Smckusick } 15141475Smckusick 15241475Smckusick /*ARGSUSED*/ 153*49126Skarels cnselect(dev, rw, p) 15441475Smckusick dev_t dev; 15541475Smckusick int rw; 156*49126Skarels struct proc *p; 15741475Smckusick { 15841475Smckusick if (cn_tab == NULL) 159*49126Skarels return (1); 160*49126Skarels return (ttselect(cn_tab->cn_dev, rw, p)); 16141475Smckusick } 16241475Smckusick 16341475Smckusick cngetc() 16441475Smckusick { 16541475Smckusick if (cn_tab == NULL) 166*49126Skarels return (0); 167*49126Skarels return ((*cn_tab->cn_getc)(cn_tab->cn_dev)); 16841475Smckusick } 16941475Smckusick 17041475Smckusick cnputc(c) 17141475Smckusick register int c; 17241475Smckusick { 17341475Smckusick if (cn_tab == NULL) 17441475Smckusick return; 17541475Smckusick if (c) { 17641475Smckusick (*cn_tab->cn_putc)(cn_tab->cn_dev, c); 17741475Smckusick if (c == '\n') 17841475Smckusick (*cn_tab->cn_putc)(cn_tab->cn_dev, '\r'); 17941475Smckusick } 18041475Smckusick } 181