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