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