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 * from: @(#)cons.c 7.2 (Berkeley) 5/9/91 39 * $Id: cons.c,v 1.7 1993/06/27 06:02:49 andrew Exp $ 40 */ 41 42 43 #include "param.h" 44 #include "proc.h" 45 #include "user.h" 46 #include "systm.h" 47 #include "buf.h" 48 #include "ioctl.h" 49 #include "tty.h" 50 #include "file.h" 51 #include "conf.h" 52 53 #include "cons.h" 54 55 /* XXX - all this could be autoconfig()ed */ 56 #include "pc.h" 57 #if NPC > 0 58 int pccnprobe(), pccninit(), pccngetc(), pccnputc(); 59 #endif 60 #include "com.h" 61 #if NCOM > 0 62 int comcnprobe(), comcninit(), comcngetc(), comcnputc(); 63 #endif 64 65 struct consdev constab[] = { 66 #if NPC > 0 67 { pccnprobe, pccninit, pccngetc, pccnputc }, 68 #endif 69 #if NCOM > 0 70 { comcnprobe, comcninit, comcngetc, comcnputc }, 71 #endif 72 { 0 }, 73 }; 74 /* end XXX */ 75 76 struct tty *constty = 0; /* virtual console output device */ 77 struct consdev *cn_tab; /* physical console device info */ 78 struct tty *cn_tty; /* XXX: console tty struct for tprintf */ 79 80 void 81 consinit() 82 { 83 } 84 85 void 86 cninit() 87 { 88 register struct consdev *cp; 89 90 /* 91 * Collect information about all possible consoles 92 * and find the one with highest priority 93 */ 94 for (cp = constab; cp->cn_probe; cp++) { 95 (*cp->cn_probe)(cp); 96 if (cp->cn_pri > CN_DEAD && 97 (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri)) 98 cn_tab = cp; 99 } 100 /* 101 * No console, we can handle it 102 */ 103 if ((cp = cn_tab) == NULL) 104 return; 105 /* 106 * Turn on console 107 */ 108 cn_tty = cp->cn_tp; 109 (*cp->cn_init)(cp); 110 } 111 112 int 113 cnopen(dev, flag, mode, p) 114 dev_t dev; 115 int flag, mode; 116 struct proc *p; 117 { 118 if (cn_tab == NULL) 119 return (0); 120 dev = cn_tab->cn_dev; 121 return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p)); 122 } 123 124 int 125 cnclose(dev, flag, mode, p) 126 dev_t dev; 127 int flag, mode; 128 struct proc *p; 129 { 130 if (cn_tab == NULL) 131 return (0); 132 dev = cn_tab->cn_dev; 133 return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, p)); 134 } 135 136 int 137 cnread(dev, uio, flag) 138 dev_t dev; 139 struct uio *uio; 140 { 141 if (cn_tab == NULL) 142 return (0); 143 dev = cn_tab->cn_dev; 144 return ((*cdevsw[major(dev)].d_read)(dev, uio, flag)); 145 } 146 147 int 148 cnwrite(dev, uio, flag) 149 dev_t dev; 150 struct uio *uio; 151 { 152 if (cn_tab == NULL) 153 return (0); 154 if (constty) /* 16 Aug 92*/ 155 dev = constty->t_dev; 156 else 157 dev = cn_tab->cn_dev; 158 return ((*cdevsw[major(dev)].d_write)(dev, uio, flag)); 159 } 160 161 int 162 cnioctl(dev, cmd, data, flag, p) 163 dev_t dev; 164 caddr_t data; 165 struct proc *p; 166 { 167 int error; 168 169 if (cn_tab == NULL) 170 return (0); 171 /* 172 * Superuser can always use this to wrest control of console 173 * output from the "virtual" console. 174 */ 175 if (cmd == TIOCCONS && constty) { 176 error = suser(p->p_ucred, (u_short *) NULL); 177 if (error) 178 return (error); 179 constty = NULL; 180 return (0); 181 } 182 dev = cn_tab->cn_dev; 183 return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p)); 184 } 185 186 /*ARGSUSED*/ 187 int 188 cnselect(dev, rw, p) 189 dev_t dev; 190 int rw; 191 struct proc *p; 192 { 193 if (cn_tab == NULL) 194 return (1); 195 return (ttselect(cn_tab->cn_dev, rw, p)); 196 } 197 198 int 199 cngetc() 200 { 201 if (cn_tab == NULL) 202 return (0); 203 return ((*cn_tab->cn_getc)(cn_tab->cn_dev)); 204 } 205 206 int 207 cnputc(c) 208 register int c; 209 { 210 if (cn_tab == NULL) 211 return; 212 if (c) { 213 (*cn_tab->cn_putc)(cn_tab->cn_dev, c); 214 if (c == '\n') 215 (*cn_tab->cn_putc)(cn_tab->cn_dev, '\r'); 216 } 217 } 218 219 int pg_wait = 0; 220 pg(p,q,r,s,t,u,v,w,x,y,z) char *p; { 221 printf(p,q,r,s,t,u,v,w,x,y,z); 222 if (pg_wait) { 223 printf("\n>"); 224 return(cngetc()); 225 } else 226 return 0; 227 } 228