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