kern_cons.c revision 4
1/* 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1991 The Regents of the University of California. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the University of 21 * California, Berkeley and its contributors. 22 * 4. Neither the name of the University nor the names of its contributors 23 * may be used to endorse or promote products derived from this software 24 * without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)cons.c 7.2 (Berkeley) 5/9/91 39 * 40 * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE 41 * -------------------- ----- ---------------------- 42 * CURRENT PATCH LEVEL: 1 00083 43 * -------------------- ----- ---------------------- 44 * 45 * 16 Aug 92 Pace Willisson /dev/console redirect (xterm -C, etc.) 46 * 14 Mar 93 Chris G. Demetriou Moved pg() here from isa/pccons.c 47 */ 48 49 50#include "sys/param.h" 51#include "sys/proc.h" 52#include "sys/user.h" 53#include "sys/systm.h" 54#include "sys/buf.h" 55#include "sys/ioctl.h" 56#include "sys/tty.h" 57#include "sys/file.h" 58#include "sys/conf.h" 59 60#include "cons.h" 61 62/* XXX - all this could be autoconfig()ed */ 63int pccnprobe(), pccninit(), pccngetc(), pccnputc(); 64#include "com.h" 65#if NCOM > 0 66int comcnprobe(), comcninit(), comcngetc(), comcnputc(); 67#endif 68 69struct consdev constab[] = { 70 { pccnprobe, pccninit, pccngetc, pccnputc }, 71#if NCOM > 0 72 { comcnprobe, comcninit, comcngetc, comcnputc }, 73#endif 74 { 0 }, 75}; 76/* end XXX */ 77 78struct tty *constty = 0; /* virtual console output device */ 79struct consdev *cn_tab; /* physical console device info */ 80struct tty *cn_tty; /* XXX: console tty struct for tprintf */ 81 82cninit() 83{ 84 register struct consdev *cp; 85 86 /* 87 * Collect information about all possible consoles 88 * and find the one with highest priority 89 */ 90 for (cp = constab; cp->cn_probe; cp++) { 91 (*cp->cn_probe)(cp); 92 if (cp->cn_pri > CN_DEAD && 93 (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri)) 94 cn_tab = cp; 95 } 96 /* 97 * No console, we can handle it 98 */ 99 if ((cp = cn_tab) == NULL) 100 return; 101 /* 102 * Turn on console 103 */ 104 cn_tty = cp->cn_tp; 105 (*cp->cn_init)(cp); 106} 107 108cnopen(dev, flag, mode, p) 109 dev_t dev; 110 int flag, mode; 111 struct proc *p; 112{ 113 if (cn_tab == NULL) 114 return (0); 115 dev = cn_tab->cn_dev; 116 return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p)); 117} 118 119cnclose(dev, flag, mode, p) 120 dev_t dev; 121 int flag, mode; 122 struct proc *p; 123{ 124 if (cn_tab == NULL) 125 return (0); 126 dev = cn_tab->cn_dev; 127 return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, p)); 128} 129 130cnread(dev, uio, flag) 131 dev_t dev; 132 struct uio *uio; 133{ 134 if (cn_tab == NULL) 135 return (0); 136 dev = cn_tab->cn_dev; 137 return ((*cdevsw[major(dev)].d_read)(dev, uio, flag)); 138} 139 140cnwrite(dev, uio, flag) 141 dev_t dev; 142 struct uio *uio; 143{ 144 if (cn_tab == NULL) 145 return (0); 146 if (constty) /* 16 Aug 92*/ 147 dev = constty->t_dev; 148 else 149 dev = cn_tab->cn_dev; 150 return ((*cdevsw[major(dev)].d_write)(dev, uio, flag)); 151} 152 153cnioctl(dev, cmd, data, flag, p) 154 dev_t dev; 155 caddr_t data; 156 struct proc *p; 157{ 158 int error; 159 160 if (cn_tab == NULL) 161 return (0); 162 /* 163 * Superuser can always use this to wrest control of console 164 * output from the "virtual" console. 165 */ 166 if (cmd == TIOCCONS && constty) { 167 error = suser(p->p_ucred, (u_short *) NULL); 168 if (error) 169 return (error); 170 constty = NULL; 171 return (0); 172 } 173 dev = cn_tab->cn_dev; 174 return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p)); 175} 176 177/*ARGSUSED*/ 178cnselect(dev, rw, p) 179 dev_t dev; 180 int rw; 181 struct proc *p; 182{ 183 if (cn_tab == NULL) 184 return (1); 185 return (ttselect(cn_tab->cn_dev, rw, p)); 186} 187 188cngetc() 189{ 190 if (cn_tab == NULL) 191 return (0); 192 return ((*cn_tab->cn_getc)(cn_tab->cn_dev)); 193} 194 195cnputc(c) 196 register int c; 197{ 198 if (cn_tab == NULL) 199 return; 200 if (c) { 201 (*cn_tab->cn_putc)(cn_tab->cn_dev, c); 202 if (c == '\n') 203 (*cn_tab->cn_putc)(cn_tab->cn_dev, '\r'); 204 } 205} 206 207pg(p,q,r,s,t,u,v,w,x,y,z) char *p; { 208 printf(p,q,r,s,t,u,v,w,x,y,z); 209 printf("\n>"); 210 return(cngetc()); 211} 212 213 214