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 * 1241475Smckusick * from: Utah $Hdr: cons.c 1.4 88/12/03$ 1341475Smckusick * 14*42364Smckusick * @(#)cons.c 7.2 (Berkeley) 05/25/90 1541475Smckusick */ 1641475Smckusick 1741475Smckusick #include "param.h" 1841475Smckusick #include "user.h" 1941475Smckusick #include "systm.h" 2041475Smckusick #include "buf.h" 2141475Smckusick #include "ioctl.h" 2241475Smckusick #include "tty.h" 2341475Smckusick #include "file.h" 2441475Smckusick #include "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 37*42364Smckusick #include "dcm.h" 38*42364Smckusick #if NDCM > 0 39*42364Smckusick int dcmcnprobe(), dcmcninit(), dcmcngetc(), dcmcnputc(); 40*42364Smckusick #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 49*42364Smckusick #if NDCM > 0 50*42364Smckusick { dcmcnprobe, dcmcninit, dcmcngetc, dcmcnputc }, 51*42364Smckusick #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 8641475Smckusick cnopen(dev, flag) 8741475Smckusick dev_t dev; 8841475Smckusick { 8941475Smckusick if (cn_tab == NULL) 9041475Smckusick return(0); 9141475Smckusick dev = cn_tab->cn_dev; 9241475Smckusick return ((*cdevsw[major(dev)].d_open)(dev, flag)); 9341475Smckusick } 9441475Smckusick 9541475Smckusick cnclose(dev, flag) 9641475Smckusick dev_t dev; 9741475Smckusick { 9841475Smckusick if (cn_tab == NULL) 9941475Smckusick return(0); 10041475Smckusick dev = cn_tab->cn_dev; 10141475Smckusick return ((*cdevsw[major(dev)].d_close)(dev, flag)); 10241475Smckusick } 10341475Smckusick 10441475Smckusick cnread(dev, uio) 10541475Smckusick dev_t dev; 10641475Smckusick struct uio *uio; 10741475Smckusick { 10841475Smckusick if (cn_tab == NULL) 10941475Smckusick return(0); 11041475Smckusick dev = cn_tab->cn_dev; 11141475Smckusick return ((*cdevsw[major(dev)].d_read)(dev, uio)); 11241475Smckusick } 11341475Smckusick 11441475Smckusick cnwrite(dev, uio) 11541475Smckusick dev_t dev; 11641475Smckusick struct uio *uio; 11741475Smckusick { 11841475Smckusick if (cn_tab == NULL) 11941475Smckusick return(0); 12041475Smckusick dev = cn_tab->cn_dev; 12141475Smckusick return ((*cdevsw[major(dev)].d_write)(dev, uio)); 12241475Smckusick } 12341475Smckusick 12441475Smckusick cnioctl(dev, cmd, data, flag) 12541475Smckusick dev_t dev; 12641475Smckusick caddr_t data; 12741475Smckusick { 12841475Smckusick int error; 12941475Smckusick 13041475Smckusick if (cn_tab == NULL) 13141475Smckusick return(0); 13241475Smckusick /* 13341475Smckusick * Superuser can always use this to wrest control of console 13441475Smckusick * output from the "virtual" console. 13541475Smckusick */ 13641475Smckusick if (cmd == TIOCCONS && constty) { 13741475Smckusick error = suser(u.u_cred, &u.u_acflag); 13841475Smckusick if (error) 13941475Smckusick return (error); 14041475Smckusick constty = NULL; 14141475Smckusick return (0); 14241475Smckusick } 14341475Smckusick dev = cn_tab->cn_dev; 14441475Smckusick return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag)); 14541475Smckusick } 14641475Smckusick 14741475Smckusick /*ARGSUSED*/ 14841475Smckusick cnselect(dev, rw) 14941475Smckusick dev_t dev; 15041475Smckusick int rw; 15141475Smckusick { 15241475Smckusick if (cn_tab == NULL) 15341475Smckusick return(1); 15441475Smckusick return(ttselect(cn_tab->cn_dev, rw)); 15541475Smckusick } 15641475Smckusick 15741475Smckusick cngetc() 15841475Smckusick { 15941475Smckusick if (cn_tab == NULL) 16041475Smckusick return(0); 16141475Smckusick return((*cn_tab->cn_getc)(cn_tab->cn_dev)); 16241475Smckusick } 16341475Smckusick 16441475Smckusick cnputc(c) 16541475Smckusick register int c; 16641475Smckusick { 16741475Smckusick if (cn_tab == NULL) 16841475Smckusick return; 16941475Smckusick if (c) { 17041475Smckusick (*cn_tab->cn_putc)(cn_tab->cn_dev, c); 17141475Smckusick if (c == '\n') 17241475Smckusick (*cn_tab->cn_putc)(cn_tab->cn_dev, '\r'); 17341475Smckusick } 17441475Smckusick } 175