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*68159Scgd * @(#)cons.c 8.3 (Berkeley) 01/09/95
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
cninit()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
cnopen(dev,flag,mode,p)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
cnclose(dev,flag,mode,p)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
cnread(dev,uio,flag)8042942Smckusick cnread(dev, uio, flag)
8141475Smckusick dev_t dev;
8241475Smckusick struct uio *uio;
8365640Sbostic 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
cnwrite(dev,uio,flag)9142942Smckusick cnwrite(dev, uio, flag)
9241475Smckusick dev_t dev;
9341475Smckusick struct uio *uio;
9465640Sbostic 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
cnioctl(dev,cmd,data,flag,p)10249126Skarels cnioctl(dev, cmd, data, flag, p)
10341475Smckusick dev_t dev;
104*68159Scgd u_long cmd;
10541475Smckusick caddr_t data;
106*68159Scgd int flag;
10749126Skarels struct proc *p;
10841475Smckusick {
10941475Smckusick int error;
11041475Smckusick
11141475Smckusick if (cn_tab == NULL)
11249126Skarels return (0);
11341475Smckusick /*
11441475Smckusick * Superuser can always use this to wrest control of console
11541475Smckusick * output from the "virtual" console.
11641475Smckusick */
11741475Smckusick if (cmd == TIOCCONS && constty) {
11849126Skarels error = suser(p->p_ucred, (u_short *) NULL);
11941475Smckusick if (error)
12041475Smckusick return (error);
12141475Smckusick constty = NULL;
12241475Smckusick return (0);
12341475Smckusick }
12441475Smckusick dev = cn_tab->cn_dev;
12549126Skarels return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p));
12641475Smckusick }
12741475Smckusick
12841475Smckusick /*ARGSUSED*/
cnselect(dev,rw,p)12949126Skarels cnselect(dev, rw, p)
13041475Smckusick dev_t dev;
13141475Smckusick int rw;
13249126Skarels struct proc *p;
13341475Smckusick {
13441475Smckusick if (cn_tab == NULL)
13549126Skarels return (1);
13649126Skarels return (ttselect(cn_tab->cn_dev, rw, p));
13741475Smckusick }
13841475Smckusick
cngetc()13941475Smckusick cngetc()
14041475Smckusick {
14141475Smckusick if (cn_tab == NULL)
14249126Skarels return (0);
14349126Skarels return ((*cn_tab->cn_getc)(cn_tab->cn_dev));
14441475Smckusick }
14541475Smckusick
cnputc(c)14641475Smckusick cnputc(c)
14741475Smckusick register int c;
14841475Smckusick {
14941475Smckusick if (cn_tab == NULL)
15041475Smckusick return;
15141475Smckusick if (c) {
15241475Smckusick (*cn_tab->cn_putc)(cn_tab->cn_dev, c);
15341475Smckusick if (c == '\n')
15441475Smckusick (*cn_tab->cn_putc)(cn_tab->cn_dev, '\r');
15541475Smckusick }
15641475Smckusick }
157