141475Smckusick /* 241475Smckusick * Copyright (c) 1988 University of Utah. 363146Sbostic * Copyright (c) 1990, 1993 463146Sbostic * The Regents of the University of California. 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 * 1253923Shibler * from: Utah $Hdr: cons.c 1.7 92/01/21$ 1341475Smckusick * 14*65640Sbostic * @(#)cons.c 8.2 (Berkeley) 01/12/94 1541475Smckusick */ 1641475Smckusick 1756504Sbostic #include <sys/param.h> 1856504Sbostic #include <sys/proc.h> 1956504Sbostic #include <sys/systm.h> 2056504Sbostic #include <sys/buf.h> 2156504Sbostic #include <sys/ioctl.h> 2256504Sbostic #include <sys/tty.h> 2356504Sbostic #include <sys/file.h> 2456504Sbostic #include <sys/conf.h> 2541475Smckusick 2656504Sbostic #include <hp/dev/cons.h> 2741475Smckusick 2853923Shibler 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; 83*65640Sbostic int flag; 8441475Smckusick { 8541475Smckusick if (cn_tab == NULL) 8649126Skarels return (0); 8741475Smckusick dev = cn_tab->cn_dev; 8842942Smckusick return ((*cdevsw[major(dev)].d_read)(dev, uio, flag)); 8941475Smckusick } 9041475Smckusick 9142942Smckusick cnwrite(dev, uio, flag) 9241475Smckusick dev_t dev; 9341475Smckusick struct uio *uio; 94*65640Sbostic int flag; 9541475Smckusick { 9641475Smckusick if (cn_tab == NULL) 9749126Skarels return (0); 9841475Smckusick dev = cn_tab->cn_dev; 9942942Smckusick return ((*cdevsw[major(dev)].d_write)(dev, uio, flag)); 10041475Smckusick } 10141475Smckusick 10249126Skarels cnioctl(dev, cmd, data, flag, p) 10341475Smckusick dev_t dev; 104*65640Sbostic int cmd, flag; 10541475Smckusick caddr_t data; 10649126Skarels struct proc *p; 10741475Smckusick { 10841475Smckusick int error; 10941475Smckusick 11041475Smckusick if (cn_tab == NULL) 11149126Skarels return (0); 11241475Smckusick /* 11341475Smckusick * Superuser can always use this to wrest control of console 11441475Smckusick * output from the "virtual" console. 11541475Smckusick */ 11641475Smckusick if (cmd == TIOCCONS && constty) { 11749126Skarels error = suser(p->p_ucred, (u_short *) NULL); 11841475Smckusick if (error) 11941475Smckusick return (error); 12041475Smckusick constty = NULL; 12141475Smckusick return (0); 12241475Smckusick } 12341475Smckusick dev = cn_tab->cn_dev; 12449126Skarels return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p)); 12541475Smckusick } 12641475Smckusick 12741475Smckusick /*ARGSUSED*/ 12849126Skarels cnselect(dev, rw, p) 12941475Smckusick dev_t dev; 13041475Smckusick int rw; 13149126Skarels struct proc *p; 13241475Smckusick { 13341475Smckusick if (cn_tab == NULL) 13449126Skarels return (1); 13549126Skarels return (ttselect(cn_tab->cn_dev, rw, p)); 13641475Smckusick } 13741475Smckusick 13841475Smckusick cngetc() 13941475Smckusick { 14041475Smckusick if (cn_tab == NULL) 14149126Skarels return (0); 14249126Skarels return ((*cn_tab->cn_getc)(cn_tab->cn_dev)); 14341475Smckusick } 14441475Smckusick 14541475Smckusick cnputc(c) 14641475Smckusick register int c; 14741475Smckusick { 14841475Smckusick if (cn_tab == NULL) 14941475Smckusick return; 15041475Smckusick if (c) { 15141475Smckusick (*cn_tab->cn_putc)(cn_tab->cn_dev, c); 15241475Smckusick if (c == '\n') 15341475Smckusick (*cn_tab->cn_putc)(cn_tab->cn_dev, '\r'); 15441475Smckusick } 15541475Smckusick } 156