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 * 12*53923Shibler * from: Utah $Hdr: cons.c 1.7 92/01/21$ 1341475Smckusick * 14*53923Shibler * @(#)cons.c 7.7 (Berkeley) 06/05/92 1541475Smckusick */ 1641475Smckusick 1745788Sbostic #include "sys/param.h" 1849126Skarels #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 28*53923Shibler struct tty *constty; /* virtual console output device */ 2941475Smckusick struct consdev *cn_tab; /* physical console device info */ 3041475Smckusick struct tty *cn_tty; /* XXX: console tty struct for tprintf */ 3141475Smckusick 3241475Smckusick cninit() 3341475Smckusick { 3441475Smckusick register struct consdev *cp; 3541475Smckusick 3641475Smckusick /* 3741475Smckusick * Collect information about all possible consoles 3841475Smckusick * and find the one with highest priority 3941475Smckusick */ 4041475Smckusick for (cp = constab; cp->cn_probe; cp++) { 4141475Smckusick (*cp->cn_probe)(cp); 4241475Smckusick if (cp->cn_pri > CN_DEAD && 4341475Smckusick (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri)) 4441475Smckusick cn_tab = cp; 4541475Smckusick } 4641475Smckusick /* 4741475Smckusick * No console, we can handle it 4841475Smckusick */ 4941475Smckusick if ((cp = cn_tab) == NULL) 5041475Smckusick return; 5141475Smckusick /* 5241475Smckusick * Turn on console 5341475Smckusick */ 5441475Smckusick cn_tty = cp->cn_tp; 5541475Smckusick (*cp->cn_init)(cp); 5641475Smckusick } 5741475Smckusick 5849126Skarels cnopen(dev, flag, mode, p) 5941475Smckusick dev_t dev; 6049126Skarels int flag, mode; 6149126Skarels struct proc *p; 6241475Smckusick { 6341475Smckusick if (cn_tab == NULL) 6449126Skarels return (0); 6541475Smckusick dev = cn_tab->cn_dev; 6649126Skarels return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p)); 6741475Smckusick } 6841475Smckusick 6949126Skarels cnclose(dev, flag, mode, p) 7041475Smckusick dev_t dev; 7149126Skarels int flag, mode; 7249126Skarels struct proc *p; 7341475Smckusick { 7441475Smckusick if (cn_tab == NULL) 7549126Skarels return (0); 7641475Smckusick dev = cn_tab->cn_dev; 7749126Skarels return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, p)); 7841475Smckusick } 7941475Smckusick 8042942Smckusick cnread(dev, uio, flag) 8141475Smckusick dev_t dev; 8241475Smckusick struct uio *uio; 8341475Smckusick { 8441475Smckusick if (cn_tab == NULL) 8549126Skarels return (0); 8641475Smckusick dev = cn_tab->cn_dev; 8742942Smckusick return ((*cdevsw[major(dev)].d_read)(dev, uio, flag)); 8841475Smckusick } 8941475Smckusick 9042942Smckusick cnwrite(dev, uio, flag) 9141475Smckusick dev_t dev; 9241475Smckusick struct uio *uio; 9341475Smckusick { 9441475Smckusick if (cn_tab == NULL) 9549126Skarels return (0); 9641475Smckusick dev = cn_tab->cn_dev; 9742942Smckusick return ((*cdevsw[major(dev)].d_write)(dev, uio, flag)); 9841475Smckusick } 9941475Smckusick 10049126Skarels cnioctl(dev, cmd, data, flag, p) 10141475Smckusick dev_t dev; 10241475Smckusick caddr_t data; 10349126Skarels struct proc *p; 10441475Smckusick { 10541475Smckusick int error; 10641475Smckusick 10741475Smckusick if (cn_tab == NULL) 10849126Skarels return (0); 10941475Smckusick /* 11041475Smckusick * Superuser can always use this to wrest control of console 11141475Smckusick * output from the "virtual" console. 11241475Smckusick */ 11341475Smckusick if (cmd == TIOCCONS && constty) { 11449126Skarels error = suser(p->p_ucred, (u_short *) NULL); 11541475Smckusick if (error) 11641475Smckusick return (error); 11741475Smckusick constty = NULL; 11841475Smckusick return (0); 11941475Smckusick } 12041475Smckusick dev = cn_tab->cn_dev; 12149126Skarels return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p)); 12241475Smckusick } 12341475Smckusick 12441475Smckusick /*ARGSUSED*/ 12549126Skarels cnselect(dev, rw, p) 12641475Smckusick dev_t dev; 12741475Smckusick int rw; 12849126Skarels struct proc *p; 12941475Smckusick { 13041475Smckusick if (cn_tab == NULL) 13149126Skarels return (1); 13249126Skarels return (ttselect(cn_tab->cn_dev, rw, p)); 13341475Smckusick } 13441475Smckusick 13541475Smckusick cngetc() 13641475Smckusick { 13741475Smckusick if (cn_tab == NULL) 13849126Skarels return (0); 13949126Skarels return ((*cn_tab->cn_getc)(cn_tab->cn_dev)); 14041475Smckusick } 14141475Smckusick 14241475Smckusick cnputc(c) 14341475Smckusick register int c; 14441475Smckusick { 14541475Smckusick if (cn_tab == NULL) 14641475Smckusick return; 14741475Smckusick if (c) { 14841475Smckusick (*cn_tab->cn_putc)(cn_tab->cn_dev, c); 14941475Smckusick if (c == '\n') 15041475Smckusick (*cn_tab->cn_putc)(cn_tab->cn_dev, '\r'); 15141475Smckusick } 15241475Smckusick } 153