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