xref: /xnu-8796.101.5/bsd/dev/i386/conf.c (revision aca3beaa3dfbd42498b42c5e5ce20a938e6554e5)
1*aca3beaaSApple OSS Distributions /*
2*aca3beaaSApple OSS Distributions  * Copyright (c) 1997-2020 Apple Inc. All rights reserved.
3*aca3beaaSApple OSS Distributions  *
4*aca3beaaSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*aca3beaaSApple OSS Distributions  *
6*aca3beaaSApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*aca3beaaSApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*aca3beaaSApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*aca3beaaSApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*aca3beaaSApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*aca3beaaSApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*aca3beaaSApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*aca3beaaSApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*aca3beaaSApple OSS Distributions  *
15*aca3beaaSApple OSS Distributions  * Please obtain a copy of the License at
16*aca3beaaSApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*aca3beaaSApple OSS Distributions  *
18*aca3beaaSApple OSS Distributions  * The Original Code and all software distributed under the License are
19*aca3beaaSApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*aca3beaaSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*aca3beaaSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*aca3beaaSApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*aca3beaaSApple OSS Distributions  * Please see the License for the specific language governing rights and
24*aca3beaaSApple OSS Distributions  * limitations under the License.
25*aca3beaaSApple OSS Distributions  *
26*aca3beaaSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*aca3beaaSApple OSS Distributions  */
28*aca3beaaSApple OSS Distributions /*
29*aca3beaaSApple OSS Distributions  * Copyright (c) 1993 NeXT Computer, Inc.
30*aca3beaaSApple OSS Distributions  *
31*aca3beaaSApple OSS Distributions  * UNIX Device switch tables.
32*aca3beaaSApple OSS Distributions  *
33*aca3beaaSApple OSS Distributions  * HISTORY
34*aca3beaaSApple OSS Distributions  *
35*aca3beaaSApple OSS Distributions  * 30 July 1997 Umesh Vaishampayan ([email protected])
36*aca3beaaSApple OSS Distributions  *      enabled file descriptor pseudo-device.
37*aca3beaaSApple OSS Distributions  * 18 June 1993 ? at NeXT
38*aca3beaaSApple OSS Distributions  *	Cleaned up a lot of stuff in this file.
39*aca3beaaSApple OSS Distributions  */
40*aca3beaaSApple OSS Distributions 
41*aca3beaaSApple OSS Distributions #include <sys/param.h>
42*aca3beaaSApple OSS Distributions #include <sys/systm.h>
43*aca3beaaSApple OSS Distributions #include <sys/ioctl.h>
44*aca3beaaSApple OSS Distributions #include <sys/tty.h>
45*aca3beaaSApple OSS Distributions #include <sys/conf.h>
46*aca3beaaSApple OSS Distributions 
47*aca3beaaSApple OSS Distributions /* Prototypes that should be elsewhere: */
48*aca3beaaSApple OSS Distributions extern dev_t    chrtoblk(dev_t dev);
49*aca3beaaSApple OSS Distributions extern int      chrtoblk_set(int cdev, int bdev);
50*aca3beaaSApple OSS Distributions 
51*aca3beaaSApple OSS Distributions struct bdevsw   bdevsw[] =
52*aca3beaaSApple OSS Distributions {
53*aca3beaaSApple OSS Distributions 	/*
54*aca3beaaSApple OSS Distributions 	 *	For block devices, every other block of 8 slots is
55*aca3beaaSApple OSS Distributions 	 *	reserved for Apple.  The other slots are available for
56*aca3beaaSApple OSS Distributions 	 *	the user.  This way we can both add new entries without
57*aca3beaaSApple OSS Distributions 	 *	running into each other.  Be sure to fill in Apple's
58*aca3beaaSApple OSS Distributions 	 *	8 reserved slots when you jump over us -- we'll do the
59*aca3beaaSApple OSS Distributions 	 *	same for you.
60*aca3beaaSApple OSS Distributions 	 */
61*aca3beaaSApple OSS Distributions 
62*aca3beaaSApple OSS Distributions 	/* 0 - 7 are reserved for Apple */
63*aca3beaaSApple OSS Distributions 
64*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /* 0*/
65*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /* 1*/
66*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /* 2*/
67*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /* 3*/
68*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /* 4*/
69*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /* 5*/
70*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /* 6*/
71*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /* 7*/
72*aca3beaaSApple OSS Distributions 
73*aca3beaaSApple OSS Distributions 	/* 8 - 15 are reserved to the user */
74*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /* 8*/
75*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /* 9*/
76*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*10*/
77*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*11*/
78*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*12*/
79*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*13*/
80*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*14*/
81*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*15*/
82*aca3beaaSApple OSS Distributions 
83*aca3beaaSApple OSS Distributions 	/* 16 - 23 are reserved for Apple */
84*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*16*/
85*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*17*/
86*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*18*/
87*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*18*/
88*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*20*/
89*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*21*/
90*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*22*/
91*aca3beaaSApple OSS Distributions 	NO_BDEVICE,                                                     /*23*/
92*aca3beaaSApple OSS Distributions };
93*aca3beaaSApple OSS Distributions 
94*aca3beaaSApple OSS Distributions const int nblkdev = sizeof(bdevsw) / sizeof(bdevsw[0]);
95*aca3beaaSApple OSS Distributions 
96*aca3beaaSApple OSS Distributions extern struct tty *km_tty[];
97*aca3beaaSApple OSS Distributions extern d_open_t         cnopen;
98*aca3beaaSApple OSS Distributions extern d_close_t        cnclose;
99*aca3beaaSApple OSS Distributions extern d_read_t         cnread;
100*aca3beaaSApple OSS Distributions extern d_write_t        cnwrite;
101*aca3beaaSApple OSS Distributions extern d_ioctl_t        cnioctl;
102*aca3beaaSApple OSS Distributions extern d_select_t       cnselect;
103*aca3beaaSApple OSS Distributions extern d_open_t         kmopen;
104*aca3beaaSApple OSS Distributions extern d_close_t        kmclose;
105*aca3beaaSApple OSS Distributions extern d_read_t         kmread;
106*aca3beaaSApple OSS Distributions extern d_write_t        kmwrite;
107*aca3beaaSApple OSS Distributions extern d_ioctl_t        kmioctl;
108*aca3beaaSApple OSS Distributions extern d_open_t         sgopen;
109*aca3beaaSApple OSS Distributions extern d_close_t        sgclose;
110*aca3beaaSApple OSS Distributions extern d_ioctl_t        sgioctl;
111*aca3beaaSApple OSS Distributions 
112*aca3beaaSApple OSS Distributions #if NVOL > 0
113*aca3beaaSApple OSS Distributions extern d_open_t         volopen;
114*aca3beaaSApple OSS Distributions extern d_close_t        volclose;
115*aca3beaaSApple OSS Distributions extern d_ioctl_t        volioctl;
116*aca3beaaSApple OSS Distributions #else
117*aca3beaaSApple OSS Distributions #define volopen         eno_opcl
118*aca3beaaSApple OSS Distributions #define volclose        eno_opcl
119*aca3beaaSApple OSS Distributions #define volioctl        eno_ioctl
120*aca3beaaSApple OSS Distributions #endif
121*aca3beaaSApple OSS Distributions 
122*aca3beaaSApple OSS Distributions extern d_open_t         cttyopen;
123*aca3beaaSApple OSS Distributions extern d_read_t         cttyread;
124*aca3beaaSApple OSS Distributions extern d_write_t        cttywrite;
125*aca3beaaSApple OSS Distributions extern d_ioctl_t        cttyioctl;
126*aca3beaaSApple OSS Distributions extern d_select_t       cttyselect;
127*aca3beaaSApple OSS Distributions 
128*aca3beaaSApple OSS Distributions extern d_read_t         mmread;
129*aca3beaaSApple OSS Distributions extern d_write_t        mmwrite;
130*aca3beaaSApple OSS Distributions extern d_ioctl_t        mmioctl;
131*aca3beaaSApple OSS Distributions #define mmselect        (select_fcn_t *)(void (*)(void))seltrue
132*aca3beaaSApple OSS Distributions #define mmmmap          eno_mmap
133*aca3beaaSApple OSS Distributions 
134*aca3beaaSApple OSS Distributions #include <pty.h>
135*aca3beaaSApple OSS Distributions #if NPTY > 0
136*aca3beaaSApple OSS Distributions extern d_open_t         ptsopen;
137*aca3beaaSApple OSS Distributions extern d_close_t        ptsclose;
138*aca3beaaSApple OSS Distributions extern d_read_t         ptsread;
139*aca3beaaSApple OSS Distributions extern d_write_t        ptswrite;
140*aca3beaaSApple OSS Distributions extern d_stop_t         ptsstop;
141*aca3beaaSApple OSS Distributions extern d_select_t       ptsselect;
142*aca3beaaSApple OSS Distributions extern d_open_t         ptcopen;
143*aca3beaaSApple OSS Distributions extern d_close_t        ptcclose;
144*aca3beaaSApple OSS Distributions extern d_read_t         ptcread;
145*aca3beaaSApple OSS Distributions extern d_write_t        ptcwrite;
146*aca3beaaSApple OSS Distributions extern d_select_t       ptcselect;
147*aca3beaaSApple OSS Distributions extern d_ioctl_t        ptyioctl;
148*aca3beaaSApple OSS Distributions #else
149*aca3beaaSApple OSS Distributions #define ptsopen         eno_opcl
150*aca3beaaSApple OSS Distributions #define ptsclose        eno_opcl
151*aca3beaaSApple OSS Distributions #define ptsread         eno_rdwrt
152*aca3beaaSApple OSS Distributions #define ptswrite        eno_rdwrt
153*aca3beaaSApple OSS Distributions #define ptsstop         nulldev
154*aca3beaaSApple OSS Distributions 
155*aca3beaaSApple OSS Distributions #define ptcopen         eno_opcl
156*aca3beaaSApple OSS Distributions #define ptcclose        eno_opcl
157*aca3beaaSApple OSS Distributions #define ptcread         eno_rdwrt
158*aca3beaaSApple OSS Distributions #define ptcwrite        eno_rdwrt
159*aca3beaaSApple OSS Distributions #define ptcselect       eno_select
160*aca3beaaSApple OSS Distributions #define ptyioctl        eno_ioctl
161*aca3beaaSApple OSS Distributions #endif
162*aca3beaaSApple OSS Distributions 
163*aca3beaaSApple OSS Distributions extern d_open_t         logopen;
164*aca3beaaSApple OSS Distributions extern d_close_t        logclose;
165*aca3beaaSApple OSS Distributions extern d_read_t         logread;
166*aca3beaaSApple OSS Distributions extern d_ioctl_t        logioctl;
167*aca3beaaSApple OSS Distributions extern d_select_t       logselect;
168*aca3beaaSApple OSS Distributions 
169*aca3beaaSApple OSS Distributions extern d_open_t         oslog_streamopen;
170*aca3beaaSApple OSS Distributions extern d_close_t        oslog_streamclose;
171*aca3beaaSApple OSS Distributions extern d_read_t         oslog_streamread;
172*aca3beaaSApple OSS Distributions extern d_ioctl_t        oslog_streamioctl;
173*aca3beaaSApple OSS Distributions extern d_select_t       oslog_streamselect;
174*aca3beaaSApple OSS Distributions 
175*aca3beaaSApple OSS Distributions extern d_open_t         oslogopen;
176*aca3beaaSApple OSS Distributions extern d_close_t        oslogclose;
177*aca3beaaSApple OSS Distributions extern d_select_t       oslogselect;
178*aca3beaaSApple OSS Distributions extern d_ioctl_t        oslogioctl;
179*aca3beaaSApple OSS Distributions 
180*aca3beaaSApple OSS Distributions #define nulldevfp        (void (*)(void))&nulldev
181*aca3beaaSApple OSS Distributions 
182*aca3beaaSApple OSS Distributions #define nullopen        (d_open_t *)nulldevfp
183*aca3beaaSApple OSS Distributions #define nullclose       (d_close_t *)nulldevfp
184*aca3beaaSApple OSS Distributions #define nullread        (d_read_t *)nulldevfp
185*aca3beaaSApple OSS Distributions #define nullwrite       (d_write_t *)nulldevfp
186*aca3beaaSApple OSS Distributions #define nullioctl       (d_ioctl_t *)nulldevfp
187*aca3beaaSApple OSS Distributions #define nullselect      (d_select_t *)nulldevfp
188*aca3beaaSApple OSS Distributions #define nullstop        (d_stop_t *)nulldevfp
189*aca3beaaSApple OSS Distributions #define nullreset       (d_reset_t *)nulldevfp
190*aca3beaaSApple OSS Distributions 
191*aca3beaaSApple OSS Distributions struct cdevsw cdevsw[] = {
192*aca3beaaSApple OSS Distributions 	/*
193*aca3beaaSApple OSS Distributions 	 * To add character devices to this table dynamically, use cdevsw_add.
194*aca3beaaSApple OSS Distributions 	 */
195*aca3beaaSApple OSS Distributions 
196*aca3beaaSApple OSS Distributions 	[0] = {
197*aca3beaaSApple OSS Distributions 		cnopen, cnclose, cnread, cnwrite,
198*aca3beaaSApple OSS Distributions 		cnioctl, nullstop, nullreset, 0, cnselect,
199*aca3beaaSApple OSS Distributions 		eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
200*aca3beaaSApple OSS Distributions 	},
201*aca3beaaSApple OSS Distributions 	[1] = NO_CDEVICE,
202*aca3beaaSApple OSS Distributions 	[2] = {
203*aca3beaaSApple OSS Distributions 		cttyopen, nullclose, cttyread, cttywrite,
204*aca3beaaSApple OSS Distributions 		cttyioctl, nullstop, nullreset, 0, cttyselect,
205*aca3beaaSApple OSS Distributions 		eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
206*aca3beaaSApple OSS Distributions 	},
207*aca3beaaSApple OSS Distributions 	[3] = {
208*aca3beaaSApple OSS Distributions 		nullopen, nullclose, mmread, mmwrite,
209*aca3beaaSApple OSS Distributions 		mmioctl, nullstop, nullreset, 0, mmselect,
210*aca3beaaSApple OSS Distributions 		mmmmap, eno_strat, eno_getc, eno_putc, D_DISK
211*aca3beaaSApple OSS Distributions 	},
212*aca3beaaSApple OSS Distributions 	[PTC_MAJOR] = {
213*aca3beaaSApple OSS Distributions 		ptsopen, ptsclose, ptsread, ptswrite,
214*aca3beaaSApple OSS Distributions 		ptyioctl, ptsstop, nullreset, 0, ptsselect,
215*aca3beaaSApple OSS Distributions 		eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
216*aca3beaaSApple OSS Distributions 	},
217*aca3beaaSApple OSS Distributions 	[PTS_MAJOR] = {
218*aca3beaaSApple OSS Distributions 		ptcopen, ptcclose, ptcread, ptcwrite,
219*aca3beaaSApple OSS Distributions 		ptyioctl, nullstop, nullreset, 0, ptcselect,
220*aca3beaaSApple OSS Distributions 		eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
221*aca3beaaSApple OSS Distributions 	},
222*aca3beaaSApple OSS Distributions 	[6] = {
223*aca3beaaSApple OSS Distributions 		logopen, logclose, logread, eno_rdwrt,
224*aca3beaaSApple OSS Distributions 		logioctl, eno_stop, nullreset, 0, logselect,
225*aca3beaaSApple OSS Distributions 		eno_mmap, eno_strat, eno_getc, eno_putc, 0
226*aca3beaaSApple OSS Distributions 	},
227*aca3beaaSApple OSS Distributions 	[7] = {
228*aca3beaaSApple OSS Distributions 		oslogopen, oslogclose, eno_rdwrt, eno_rdwrt,
229*aca3beaaSApple OSS Distributions 		oslogioctl, eno_stop, nullreset, 0, oslogselect,
230*aca3beaaSApple OSS Distributions 		eno_mmap, eno_strat, eno_getc, eno_putc, 0
231*aca3beaaSApple OSS Distributions 	},
232*aca3beaaSApple OSS Distributions 	[8] = {
233*aca3beaaSApple OSS Distributions 		oslog_streamopen, oslog_streamclose, oslog_streamread, eno_rdwrt,
234*aca3beaaSApple OSS Distributions 		oslog_streamioctl, eno_stop, nullreset, 0, oslog_streamselect,
235*aca3beaaSApple OSS Distributions 		eno_mmap, eno_strat, eno_getc, eno_putc, 0
236*aca3beaaSApple OSS Distributions 	},
237*aca3beaaSApple OSS Distributions 	[9 ... 11] = NO_CDEVICE,
238*aca3beaaSApple OSS Distributions 	[12] = {
239*aca3beaaSApple OSS Distributions 		kmopen, kmclose, kmread, kmwrite,
240*aca3beaaSApple OSS Distributions 		kmioctl, nullstop, nullreset, km_tty, ttselect,
241*aca3beaaSApple OSS Distributions 		eno_mmap, eno_strat, eno_getc, eno_putc, 0
242*aca3beaaSApple OSS Distributions 	},
243*aca3beaaSApple OSS Distributions 	[13 ... 63] = NO_CDEVICE,
244*aca3beaaSApple OSS Distributions };
245*aca3beaaSApple OSS Distributions const int nchrdev = sizeof(cdevsw) / sizeof(cdevsw[0]);
246*aca3beaaSApple OSS Distributions 
247*aca3beaaSApple OSS Distributions uint64_t cdevsw_flags[sizeof(cdevsw) / sizeof(cdevsw[0])];
248*aca3beaaSApple OSS Distributions 
249*aca3beaaSApple OSS Distributions #include        <sys/vnode.h> /* for VCHR and VBLK */
250*aca3beaaSApple OSS Distributions /*
251*aca3beaaSApple OSS Distributions  * return true if a disk
252*aca3beaaSApple OSS Distributions  */
253*aca3beaaSApple OSS Distributions int
isdisk(dev_t dev,int type)254*aca3beaaSApple OSS Distributions isdisk(dev_t dev, int type)
255*aca3beaaSApple OSS Distributions {
256*aca3beaaSApple OSS Distributions 	dev_t   maj = major(dev);
257*aca3beaaSApple OSS Distributions 
258*aca3beaaSApple OSS Distributions 	switch (type) {
259*aca3beaaSApple OSS Distributions 	case VCHR:
260*aca3beaaSApple OSS Distributions 		maj = chrtoblk(dev);
261*aca3beaaSApple OSS Distributions 		if (maj == NODEV) {
262*aca3beaaSApple OSS Distributions 			break;
263*aca3beaaSApple OSS Distributions 		}
264*aca3beaaSApple OSS Distributions 		OS_FALLTHROUGH;
265*aca3beaaSApple OSS Distributions 	case VBLK:
266*aca3beaaSApple OSS Distributions 		if (bdevsw[maj].d_type == D_DISK) {
267*aca3beaaSApple OSS Distributions 			return 1;
268*aca3beaaSApple OSS Distributions 		}
269*aca3beaaSApple OSS Distributions 		break;
270*aca3beaaSApple OSS Distributions 	}
271*aca3beaaSApple OSS Distributions 	return 0;
272*aca3beaaSApple OSS Distributions }
273*aca3beaaSApple OSS Distributions 
274*aca3beaaSApple OSS Distributions static int chrtoblktab[] = {[0 ... nchrdev] = NODEV };
275*aca3beaaSApple OSS Distributions 
276*aca3beaaSApple OSS Distributions /*
277*aca3beaaSApple OSS Distributions  * convert chr dev to blk dev
278*aca3beaaSApple OSS Distributions  */
279*aca3beaaSApple OSS Distributions dev_t
chrtoblk(dev_t dev)280*aca3beaaSApple OSS Distributions chrtoblk(dev_t dev)
281*aca3beaaSApple OSS Distributions {
282*aca3beaaSApple OSS Distributions 	int blkmaj;
283*aca3beaaSApple OSS Distributions 
284*aca3beaaSApple OSS Distributions 	if (major(dev) >= nchrdev) {
285*aca3beaaSApple OSS Distributions 		return NODEV;
286*aca3beaaSApple OSS Distributions 	}
287*aca3beaaSApple OSS Distributions 	blkmaj = chrtoblktab[major(dev)];
288*aca3beaaSApple OSS Distributions 	if (blkmaj == NODEV) {
289*aca3beaaSApple OSS Distributions 		return NODEV;
290*aca3beaaSApple OSS Distributions 	}
291*aca3beaaSApple OSS Distributions 	return makedev(blkmaj, minor(dev));
292*aca3beaaSApple OSS Distributions }
293*aca3beaaSApple OSS Distributions 
294*aca3beaaSApple OSS Distributions int
chrtoblk_set(int cdev,int bdev)295*aca3beaaSApple OSS Distributions chrtoblk_set(int cdev, int bdev)
296*aca3beaaSApple OSS Distributions {
297*aca3beaaSApple OSS Distributions 	if (cdev >= nchrdev) {
298*aca3beaaSApple OSS Distributions 		return -1;
299*aca3beaaSApple OSS Distributions 	}
300*aca3beaaSApple OSS Distributions 	if (bdev != NODEV && bdev >= nblkdev) {
301*aca3beaaSApple OSS Distributions 		return -1;
302*aca3beaaSApple OSS Distributions 	}
303*aca3beaaSApple OSS Distributions 	chrtoblktab[cdev] = bdev;
304*aca3beaaSApple OSS Distributions 	return 0;
305*aca3beaaSApple OSS Distributions }
306