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