]> git.saurik.com Git - apple/xnu.git/blame_incremental - bsd/dev/i386/cons.c
xnu-792.10.96.tar.gz
[apple/xnu.git] / bsd / dev / i386 / cons.c
... / ...
CommitLineData
1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22/*
23 * Copyright (c) 1987, 1988 NeXT, Inc.
24 *
25 * HISTORY
26 * 7-Jan-93 Mac Gillon (mgillon) at NeXT
27 * Integrated POSIX support
28 *
29 * 12-Aug-87 John Seamons (jks) at NeXT
30 * Ported to NeXT.
31 */
32
33/*
34 * Indirect driver for console.
35 */
36#include <sys/param.h>
37#include <sys/systm.h>
38#include <sys/conf.h>
39#include <sys/ioctl.h>
40#include <sys/tty.h>
41#include <sys/proc.h>
42#include <sys/uio.h>
43
44struct tty cons;
45struct tty *constty; /* current console device */
46
47int cnopen(__unused dev_t dev, int flag, int devtype, struct proc *pp);
48int cnclose(__unused dev_t dev, int flag, int mode, struct proc *pp);
49int cnread(__unused dev_t dev, struct uio *uio, int ioflag);
50int cnwrite(__unused dev_t dev, struct uio *uio, int ioflag);
51int cnioctl(__unused dev_t dev, int cmd, caddr_t addr, int flg, struct proc *p);
52int cnselect(__unused dev_t dev, int flag, void * wql, struct proc *p);
53
54void slave_cnenable(void);
55
56int alert(
57 __unused int width,
58 __unused int height,
59 __unused const char *title,
60 const char *msg,
61 int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8);
62int alert_done(void);
63
64/*ARGSUSED*/
65int
66cnopen(__unused dev_t dev, int flag, int devtype, struct proc *pp)
67{
68 dev_t device;
69 boolean_t funnel_state;
70 int error;
71
72 funnel_state = thread_funnel_set(kernel_flock, TRUE);
73
74 if (constty)
75 device = constty->t_dev;
76 else
77 device = cons.t_dev;
78 error = (*cdevsw[major(device)].d_open)(device, flag, devtype, pp);
79 thread_funnel_set(kernel_flock, funnel_state);
80
81 return(error);
82}
83
84/*ARGSUSED*/
85int
86cnclose(__unused dev_t dev, int flag, int mode, struct proc *pp)
87{
88 dev_t device;
89 boolean_t funnel_state;
90 int error;
91
92 funnel_state = thread_funnel_set(kernel_flock, TRUE);
93 if (constty)
94 device = constty->t_dev;
95 else
96 device = cons.t_dev;
97 error = (*cdevsw[major(device)].d_close)(device, flag, mode, pp);
98 thread_funnel_set(kernel_flock, funnel_state);
99
100 return(error);
101
102
103}
104
105/*ARGSUSED*/
106int
107cnread(__unused dev_t dev, struct uio *uio, int ioflag)
108{
109 dev_t device;
110 boolean_t funnel_state;
111 int error;
112
113 funnel_state = thread_funnel_set(kernel_flock, TRUE);
114 if (constty)
115 device = constty->t_dev;
116 else
117 device = cons.t_dev;
118 error = (*cdevsw[major(device)].d_read)(device, uio, ioflag);
119 thread_funnel_set(kernel_flock, funnel_state);
120
121 return(error);
122}
123
124/*ARGSUSED*/
125int
126cnwrite(__unused dev_t dev, struct uio *uio, int ioflag)
127{
128 dev_t device;
129 boolean_t funnel_state;
130 int error;
131
132 funnel_state = thread_funnel_set(kernel_flock, TRUE);
133 if (constty)
134 device = constty->t_dev;
135 else
136 device = cons.t_dev;
137 error = (*cdevsw[major(device)].d_write)(device, uio, ioflag);
138 thread_funnel_set(kernel_flock, funnel_state);
139
140 return(error);
141}
142
143/*ARGSUSED*/
144int
145cnioctl(__unused dev_t dev, int cmd, caddr_t addr, int flag, struct proc *p)
146{
147 dev_t device;
148 boolean_t funnel_state;
149 int error;
150
151 funnel_state = thread_funnel_set(kernel_flock, TRUE);
152
153 if (constty)
154 device = constty->t_dev;
155 else
156 device = cons.t_dev;
157 /*
158 * Superuser can always use this to wrest control of console
159 * output from the "virtual" console.
160 */
161 if ((unsigned) cmd == TIOCCONS && constty) {
162 error = proc_suser(p);
163 if (error) {
164 goto out;
165 }
166 constty = NULL;
167 error = 0;
168 goto out;
169 }
170 error = (*cdevsw[major(device)].d_ioctl)(device, cmd, addr, flag, p);
171out:
172 thread_funnel_set(kernel_flock, funnel_state);
173
174 return(error);
175}
176
177/*ARGSUSED*/
178/* called with funnel held */
179int
180cnselect(__unused dev_t dev, int flag, void * wql, struct proc *p)
181{
182 dev_t device;
183
184 if (constty)
185 device = constty->t_dev;
186 else
187 device = cons.t_dev;
188 return ((*cdevsw[major(device)].d_select)(device, flag, wql, p));
189}
190
191#if 0 /* FIXME - using OSFMK console driver for the moment */
192int
193cngetc()
194{
195 dev_t device;
196 boolean_t funnel_state;
197 int error;
198
199 funnel_state = thread_funnel_set(kernel_flock, TRUE);
200 if (constty)
201 device = constty->t_dev;
202 else
203 device = cons.t_dev;
204 error = (*cdevsw[major(device)].d_getc)(device);
205 thread_funnel_set(kernel_flock, funnel_state);
206
207 return(error);
208}
209
210/*ARGSUSED*/
211int
212cnputc(c)
213 char c;
214{
215 dev_t device;
216 boolean_t funnel_state;
217 int error;
218
219 funnel_state = thread_funnel_set(kernel_flock, TRUE);
220 if (constty)
221 device = constty->t_dev;
222 else
223 device = cons.t_dev;
224 error = (*cdevsw[major(device)].d_putc)(device, c);
225 thread_funnel_set(kernel_flock, funnel_state);
226
227 return(error);
228}
229#endif
230
231void
232slave_cnenable(void)
233{
234 /* FIXME: what to do here? */
235}
236
237#if 0
238void
239kprintf( const char *format, ...)
240{
241 /* on PPC this outputs to the serial line */
242 /* nop on intel ... umeshv@apple.com */
243
244}
245#endif
246
247/*
248 * Write message to console; create an alert panel if no text-type window
249 * currently exists. Caller must call alert_done() when finished.
250 * The height and width arguments are not used; they are provided for
251 * compatibility with the 68k version of alert().
252 */
253int
254alert(
255 __unused int width,
256 __unused int height,
257 __unused const char *title,
258 const char *msg,
259 int p1,
260 int p2,
261 int p3,
262 int p4,
263 int p5,
264 int p6,
265 int p7,
266 int p8)
267{
268 char smsg[200];
269
270 sprintf(smsg, msg, p1, p2, p3, p4, p5, p6, p7, p8);
271#if FIXME /* [ */
272 /* DoAlert(title, smsg); */
273#else
274 printf("%s\n",smsg);
275#endif /* FIXME ] */
276
277 return 0;
278}
279
280int
281alert_done(void)
282{
283 /* DoRestore(); */
284 return 0;
285}
286