]> git.saurik.com Git - apple/xnu.git/blob - bsd/dev/i386/conf.c
xnu-792.6.56.tar.gz
[apple/xnu.git] / bsd / dev / i386 / conf.c
1 /*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23 /*
24 * Copyright (c) 1997 by Apple Computer, Inc., all rights reserved
25 * Copyright (c) 1993 NeXT Computer, Inc.
26 *
27 * UNIX Device switch tables.
28 *
29 * HISTORY
30 *
31 * 30 July 1997 Umesh Vaishampayan (umeshv@apple.com)
32 * enabled file descriptor pseudo-device.
33 * 18 June 1993 ? at NeXT
34 * Cleaned up a lot of stuff in this file.
35 */
36
37 #include <sys/param.h>
38 #include <sys/systm.h>
39 #include <sys/ioctl.h>
40 #include <sys/tty.h>
41 #include <sys/conf.h>
42
43 /* Prototypes that should be elsewhere: */
44 extern int isdisk(dev_t dev, int type);
45 extern dev_t chrtoblk(dev_t dev);
46 extern int chrtoblk_set(int cdev, int bdev);
47 extern int iskmemdev(dev_t dev);
48
49 struct bdevsw bdevsw[] =
50 {
51 /*
52 * For block devices, every other block of 8 slots is
53 * reserved to NeXT. The other slots are available for
54 * the user. This way we can both add new entries without
55 * running into each other. Be sure to fill in NeXT's
56 * 8 reserved slots when you jump over us -- we'll do the
57 * same for you.
58 */
59
60 /* 0 - 7 are reserved to NeXT */
61
62 NO_BDEVICE, /* 0*/
63 NO_BDEVICE, /* 1*/
64 NO_BDEVICE, /* 2*/
65 NO_BDEVICE, /* 3*/
66 NO_BDEVICE, /* 4*/
67 NO_BDEVICE, /* 5*/
68 NO_BDEVICE, /* 6*/
69 NO_BDEVICE, /* 7*/
70
71 /* 8 - 15 are reserved to the user */
72 NO_BDEVICE, /* 8*/
73 NO_BDEVICE, /* 9*/
74 NO_BDEVICE, /*10*/
75 NO_BDEVICE, /*11*/
76 NO_BDEVICE, /*12*/
77 NO_BDEVICE, /*13*/
78 NO_BDEVICE, /*14*/
79 NO_BDEVICE, /*15*/
80
81 /* 16 - 23 are reserved to NeXT */
82 NO_BDEVICE, /*16*/
83 NO_BDEVICE, /*17*/
84 NO_BDEVICE, /*18*/
85 NO_BDEVICE, /*18*/
86 NO_BDEVICE, /*20*/
87 NO_BDEVICE, /*21*/
88 NO_BDEVICE, /*22*/
89 NO_BDEVICE, /*23*/
90 };
91
92 int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]);
93
94 extern struct tty *km_tty[];
95 extern d_open_t cnopen;
96 extern d_close_t cnclose;
97 extern d_read_t cnread;
98 extern d_write_t cnwrite;
99 extern d_ioctl_t cnioctl;
100 extern d_select_t cnselect;
101 extern d_getc_t cngetc;
102 extern d_putc_t cnputc;
103 extern d_open_t kmopen;
104 extern d_close_t kmclose;
105 extern d_read_t kmread;
106 extern d_write_t kmwrite;
107 extern d_ioctl_t kmioctl;
108 extern d_getc_t kmgetc;
109 extern d_putc_t kmputc;
110 extern d_open_t sgopen;
111 extern d_close_t sgclose;
112 extern d_ioctl_t sgioctl;
113
114 #if NVOL > 0
115 extern d_open_t volopen;
116 extern d_close_t volclose;
117 extern d_ioctl_t volioctl;
118 #else
119 #define volopen eno_opcl
120 #define volclose eno_opcl
121 #define volioctl eno_ioctl
122 #endif
123
124 extern d_open_t cttyopen;
125 extern d_read_t cttyread;
126 extern d_write_t cttywrite;
127 extern d_ioctl_t cttyioctl;
128 extern d_select_t cttyselect;
129
130 extern d_read_t mmread;
131 extern d_write_t mmwrite;
132 extern d_ioctl_t mmioctl;
133 #define mmselect (select_fcn_t *)seltrue
134 #define mmmmap eno_mmap
135
136 #include <pty.h>
137 #if NPTY > 0
138 extern struct tty *pt_tty[];
139 extern d_open_t ptsopen;
140 extern d_close_t ptsclose;
141 extern d_read_t ptsread;
142 extern d_write_t ptswrite;
143 extern d_stop_t ptsstop;
144 extern d_putc_t ptsputc;
145 extern d_open_t ptcopen;
146 extern d_close_t ptcclose;
147 extern d_read_t ptcread;
148 extern d_write_t ptcwrite;
149 extern d_select_t ptcselect;
150 extern d_ioctl_t ptyioctl;
151 #else
152 #define ptsopen eno_opcl
153 #define ptsclose eno_opcl
154 #define ptsread eno_rdwrt
155 #define ptswrite eno_rdwrt
156 #define ptsstop nulldev
157 #define ptsputc nulldev
158
159 #define ptcopen eno_opcl
160 #define ptcclose eno_opcl
161 #define ptcread eno_rdwrt
162 #define ptcwrite eno_rdwrt
163 #define ptcselect eno_select
164 #define ptyioctl eno_ioctl
165 #endif
166
167 extern d_open_t logopen;
168 extern d_close_t logclose;
169 extern d_read_t logread;
170 extern d_ioctl_t logioctl;
171 extern d_select_t logselect;
172 extern d_open_t fdesc_open;
173 extern d_read_t fdesc_read;
174 extern d_write_t fdesc_write;
175 extern d_ioctl_t fdesc_ioctl;
176 extern d_select_t fdesc_select;
177
178 #define nullopen (d_open_t *)&nulldev
179 #define nullclose (d_close_t *)&nulldev
180 #define nullread (d_read_t *)&nulldev
181 #define nullwrite (d_write_t *)&nulldev
182 #define nullioctl (d_ioctl_t *)&nulldev
183 #define nullselect (d_select_t *)&nulldev
184 #define nullstop (d_stop_t *)&nulldev
185 #define nullreset (d_reset_t *)&nulldev
186
187 struct cdevsw cdevsw[] =
188 {
189 /*
190 * For character devices, every other block of 16 slots is
191 * reserved to NeXT. The other slots are available for
192 * the user. This way we can both add new entries without
193 * running into each other. Be sure to fill in NeXT's
194 * 16 reserved slots when you jump over us -- we'll do the
195 * same for you.
196 */
197
198 /* 0 - 15 are reserved to NeXT */
199
200 {
201 cnopen, cnclose, cnread, cnwrite, /* 0*/
202 cnioctl, nullstop, nullreset, 0, cnselect,
203 eno_mmap, eno_strat, cngetc, cnputc, D_TTY
204 },
205 NO_CDEVICE, /* 1*/
206 {
207 cttyopen, nullclose, cttyread, cttywrite, /* 2*/
208 cttyioctl, nullstop, nullreset, 0, cttyselect,
209 eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
210 },
211 {
212 nullopen, nullclose, mmread, mmwrite, /* 3*/
213 mmioctl, nullstop, nullreset, 0, mmselect,
214 mmmmap, eno_strat, eno_getc, eno_putc, D_DISK
215 },
216 {
217 ptsopen, ptsclose, ptsread, ptswrite, /* 4*/
218 ptyioctl, ptsstop, nullreset, pt_tty, ttselect,
219 eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
220 },
221 {
222 ptcopen, ptcclose, ptcread, ptcwrite, /* 5*/
223 ptyioctl, nullstop, nullreset, 0, ptcselect,
224 eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
225 },
226 {
227 logopen, logclose, logread, eno_rdwrt, /* 6*/
228 logioctl, eno_stop, nullreset, 0, logselect,
229 eno_mmap, eno_strat, eno_getc, eno_putc, 0
230 },
231 NO_CDEVICE, /* 7*/
232 NO_CDEVICE, /* 8*/
233 NO_CDEVICE, /* 9*/
234 NO_CDEVICE, /*10*/
235 NO_CDEVICE, /*11*/
236 {
237 kmopen, kmclose, kmread, kmwrite, /*12*/
238 kmioctl, nullstop, nullreset, km_tty, ttselect,
239 eno_mmap, eno_strat, kmgetc, kmputc, 0
240 },
241 NO_CDEVICE, /*13*/
242 NO_CDEVICE, /*14*/
243 NO_CDEVICE, /*15*/
244
245 /* 16 - 31 are reserved to the user */
246 NO_CDEVICE, /*16*/
247 NO_CDEVICE, /*17*/
248 NO_CDEVICE, /*18*/
249 NO_CDEVICE, /*19*/
250 NO_CDEVICE, /*20*/
251 NO_CDEVICE, /*21*/
252 NO_CDEVICE, /*22*/
253 NO_CDEVICE, /*23*/
254 NO_CDEVICE, /*24*/
255 NO_CDEVICE, /*25*/
256 NO_CDEVICE, /*26*/
257 NO_CDEVICE, /*27*/
258 NO_CDEVICE, /*28*/
259 NO_CDEVICE, /*29*/
260 NO_CDEVICE, /*30*/
261 NO_CDEVICE, /*31*/
262
263 /* 32 - 47 are reserved to NeXT */
264 {
265 fdesc_open, eno_opcl, fdesc_read, fdesc_write, /*32*/
266 fdesc_ioctl, eno_stop, eno_reset, 0, fdesc_select,
267 eno_mmap, eno_strat, eno_getc, eno_putc, 0
268 },
269 #if 1
270 NO_CDEVICE,
271 #else
272 {
273 sgopen, sgclose, eno_rdwrt, eno_rdwrt, /*33*/
274 sgioctl, eno_stop, eno_reset, 0, eno_select,
275 eno_mmap, eno_strat, eno_getc, eno_putc, D_TAPE
276 },
277 #endif
278 NO_CDEVICE, /*34*/
279 NO_CDEVICE, /*35*/
280 NO_CDEVICE, /*36*/
281 NO_CDEVICE, /*37*/
282 NO_CDEVICE, /*38*/
283 NO_CDEVICE, /*39*/
284 NO_CDEVICE, /*40*/
285 NO_CDEVICE, /*41*/
286 {
287 volopen, volclose, eno_rdwrt, eno_rdwrt, /*42*/
288 volioctl, eno_stop, eno_reset, 0, (select_fcn_t *)seltrue,
289 eno_mmap, eno_strat, eno_getc, eno_putc, 0
290 },
291 };
292 int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]);
293
294
295 #include <sys/vnode.h> /* for VCHR and VBLK */
296 /*
297 * return true if a disk
298 */
299 int
300 isdisk(dev_t dev, int type)
301 {
302 dev_t maj = major(dev);
303
304 switch (type) {
305 case VCHR:
306 maj = chrtoblk(maj);
307 if (maj == NODEV) {
308 break;
309 }
310 /* FALL THROUGH */
311 case VBLK:
312 if (bdevsw[maj].d_type == D_DISK) {
313 return (1);
314 }
315 break;
316 }
317 return(0);
318 }
319
320 static int chrtoblktab[] = {
321 /* CHR*/ /* BLK*/ /* CHR*/ /* BLK*/
322 /* 0 */ NODEV, /* 1 */ NODEV,
323 /* 2 */ NODEV, /* 3 */ NODEV,
324 /* 4 */ NODEV, /* 5 */ NODEV,
325 /* 6 */ NODEV, /* 7 */ NODEV,
326 /* 8 */ NODEV, /* 9 */ NODEV,
327 /* 10 */ NODEV, /* 11 */ NODEV,
328 /* 12 */ NODEV, /* 13 */ NODEV,
329 /* 14 */ 6, /* 15 */ NODEV,
330 /* 16 */ NODEV, /* 17 */ NODEV,
331 /* 18 */ NODEV, /* 19 */ NODEV,
332 /* 20 */ NODEV, /* 21 */ NODEV,
333 /* 22 */ NODEV, /* 23 */ NODEV,
334 /* 24 */ NODEV, /* 25 */ NODEV,
335 /* 26 */ NODEV, /* 27 */ NODEV,
336 /* 28 */ NODEV, /* 29 */ NODEV,
337 /* 30 */ NODEV, /* 31 */ NODEV,
338 /* 32 */ NODEV, /* 33 */ NODEV,
339 /* 34 */ NODEV, /* 35 */ NODEV,
340 /* 36 */ NODEV, /* 37 */ NODEV,
341 /* 38 */ NODEV, /* 39 */ NODEV,
342 /* 40 */ NODEV, /* 41 */ 1,
343 /* 42 */ NODEV, /* 43 */ NODEV,
344 /* 44 */ NODEV,
345 };
346
347 /*
348 * convert chr dev to blk dev
349 */
350 dev_t
351 chrtoblk(dev_t dev)
352 {
353 int blkmaj;
354
355 if (major(dev) >= nchrdev)
356 return(NODEV);
357 blkmaj = chrtoblktab[major(dev)];
358 if (blkmaj == NODEV)
359 return(NODEV);
360 return(makedev(blkmaj, minor(dev)));
361 }
362
363 int
364 chrtoblk_set(int cdev, int bdev)
365 {
366 if (cdev >= nchrdev)
367 return (-1);
368 if (bdev != NODEV && bdev >= nblkdev)
369 return (-1);
370 chrtoblktab[cdev] = bdev;
371 return 0;
372 }
373
374 /*
375 * Returns true if dev is /dev/mem or /dev/kmem.
376 */
377 int iskmemdev(dev_t dev)
378 {
379 return (major(dev) == 3 && minor(dev) < 2);
380 }