xref: /csrg-svn/sys/hp/dev/cons.c (revision 68159)
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