xref: /netbsd/sys/arch/vax/vax/conf.c (revision bf9ec67e)
1 /*	$NetBSD: conf.c,v 1.57 2002/01/12 15:17:17 manu Exp $	*/
2 
3 /*-
4  * Copyright (c) 1982, 1986 The Regents of the University of California.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *	This product includes software developed by the University of
18  *	California, Berkeley and its contributors.
19  * 4. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  *
35  *	@(#)conf.c	7.18 (Berkeley) 5/9/91
36  */
37 
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/buf.h>
41 #include <sys/ioctl.h>
42 #include <sys/tty.h>
43 #include <sys/conf.h>
44 #include <sys/vnode.h>
45 #include <machine/cpu.h>
46 
47 #include "opt_cputype.h"
48 
49 #include "hp.h" /* 0 */
50 bdev_decl(hp);
51 
52 #include "ht.h"
53 bdev_decl(ht);
54 
55 #include "rk.h"
56 bdev_decl(rk);
57 
58 bdev_decl(sw);
59 
60 #include "te.h"
61 bdev_decl(tm);
62 
63 #include "mt.h"
64 bdev_decl(mt);
65 
66 #include "ts.h"
67 bdev_decl(ts);
68 
69 #include "mu.h"
70 bdev_decl(mu);
71 
72 #if VAX750 || VAXANY
73 #define NCTU	1
74 #else
75 #define NCTU	0
76 #endif
77 bdev_decl(ctu);
78 
79 #include "ra.h"
80 bdev_decl(ra);
81 bdev_decl(rx);
82 
83 #include "up.h"
84 bdev_decl(up);
85 
86 #include "tj.h"
87 bdev_decl(ut);
88 
89 #include "rb.h"
90 bdev_decl(idc);
91 
92 #include "uu.h"
93 bdev_decl(uu);
94 
95 #include "rl.h"
96 bdev_decl(rl);
97 
98 #include "ccd.h"
99 bdev_decl(ccd);
100 
101 #include "raid.h"
102 bdev_decl(raid);
103 
104 #include "vnd.h"
105 bdev_decl(vnd);
106 
107 #include "ry.h"
108 bdev_decl(rd);
109 bdev_decl(ry);
110 
111 #include "sd.h"
112 bdev_decl(sd);
113 
114 #include "st.h"
115 bdev_decl(st);
116 
117 #include "cd.h"
118 bdev_decl(cd);
119 
120 #include "md.h"
121 bdev_decl(md);
122 
123 struct bdevsw	bdevsw[] =
124 {
125 	bdev_disk_init(NHP,hp),		/* 0: RP0?/RM0? */
126 	bdev_tape_init(NHT,ht),		/* 1: TU77 w/ TM03 */
127 	bdev_disk_init(NUP,up),		/* 2: SC-21/SC-31 */
128 	bdev_disk_init(NRK,rk),		/* 3: RK06/07 */
129 	bdev_swap_init(1,sw),		/* 4: swap pseudo-device */
130 	bdev_tape_init(NTE,tm),		/* 5: TM11/TE10 */
131 	bdev_tape_init(NTS,ts),		/* 6: TS11 */
132 	bdev_tape_init(NMU,mu),		/* 7: TU78 */
133 	bdev_tape_init(NCTU,ctu),	/* 8: Console TU58 on 730/750 */
134 	bdev_disk_init(NRA,ra),		/* 9: MSCP disk */
135 	bdev_tape_init(NTJ,ut),		/* 10: TU45 */
136 	bdev_disk_init(NRB,idc),	/* 11: IDC (RB730) */
137 	bdev_disk_init(NRX,rx),		/* 12: RX?? on MSCP */
138 	bdev_disk_init(NUU,uu),		/* 13: TU58 on DL11 */
139 	bdev_disk_init(NRL,rl),		/* 14: RL01/02 */
140 	bdev_tape_init(NMT,mt),		/* 15: MSCP tape */
141 	bdev_notdef(),			/* 16: was: KDB50/RA?? */
142 	bdev_disk_init(NCCD,ccd),	/* 17: concatenated disk driver */
143 	bdev_disk_init(NVND,vnd),	/* 18: vnode disk driver */
144 	bdev_disk_init(NRD,rd),		/* 19: VS3100 ST506 disk */
145 	bdev_disk_init(NSD,sd),		/* 20: SCSI disk */
146 	bdev_tape_init(NST,st),		/* 21: SCSI tape */
147 	bdev_disk_init(NCD,cd),		/* 22: SCSI CD-ROM */
148 	bdev_disk_init(NMD,md),		/* 23: memory disk driver */
149 	bdev_disk_init(NRY,ry),		/* 24: VS3100 floppy */
150 	bdev_disk_init(NRAID,raid),	/* 25: RAIDframe disk driver */
151 };
152 int	nblkdev = sizeof(bdevsw) / sizeof(bdevsw[0]);
153 
154 /*
155  * Console routines for VAX console.
156  */
157 #include <dev/cons.h>
158 
159 #include "smg.h"
160 #include "wskbd.h"
161 #if NSMG > 0
162 #if NWSKBD > 0
163 #define smgcngetc wskbd_cngetc
164 #else
165 static int
166 smgcngetc(dev_t dev)
167 {
168 	return 0;
169 }
170 #endif
171 
172 #define smgcnputc wsdisplay_cnputc
173 #define	smgcnpollc nullcnpollc
174 #endif
175 
176 cons_decl(gen);
177 cons_decl(dz);
178 cons_decl(qd);
179 cons_decl(smg);
180 #include "qv.h"
181 #include "qd.h"
182 
183 struct	consdev constab[]={
184 #if VAX8600 || VAX8200 || VAX780 || VAX750 || VAX650 || VAX630 || VAX660 || \
185 	VAX670 || VAX680 || VAX8800 || VAXANY
186 #define NGEN	1
187 	cons_init(gen), /* Generic console type; mtpr/mfpr */
188 #else
189 #define NGEN	0
190 #endif
191 #if VAX410 || VAX43 || VAX46 || VAX48 || VAX49 || VAX53 || VAXANY
192 	cons_init(dz),	/* DZ11-like serial console on VAXstations */
193 #endif
194 #if VAX650 || VAX630 || VAXANY
195 #if NQV
196 	cons_init(qv),	/* QVSS/QDSS bit-mapped console driver */
197 #endif
198 #if NQD
199 	cons_init(qd),
200 #endif
201 #endif
202 #if NSMG
203 	cons_init(smg),
204 #endif
205 
206 #ifdef notyet
207 /* We may not always use builtin console, sometimes RD */
208 	{ rdcnprobe, rdcninit, rdcngetc, rdcnputc },
209 #endif
210 	{ 0 }
211 };
212 
213 /* Special for console storage */
214 #define dev_type_rw(n)	int n __P((dev_t, int, int, struct proc *))
215 
216 /* plotters */
217 /* open, close, write, ioctl, poll */
218 #define cdev_plotter_init(c,n) { \
219 	dev_init(c,n,open), dev_init(c,n,close), dev_noimpl(read,enodev), \
220 	dev_init(c,n,write), dev_init(c,n,ioctl), dev_noimpl(stop,enodev), \
221 	0, dev_init(c,n,poll), dev_noimpl(mmap,enodev) }
222 
223 /* console mass storage */
224 /* open, close, read, write */
225 #define cdev_cnstore_init(c,n) { \
226 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
227 	dev_init(c,n,write), dev_noimpl(ioctl,enodev), \
228 	dev_noimpl(stop,enodev), 0, seltrue, dev_noimpl(mmap,enodev) }
229 
230 /* open, close, write */
231 #define cdev_lp_init(c,n) { \
232 	dev_init(c,n,open), dev_init(c,n,close), dev_noimpl(read,enodev), \
233 	dev_init(c,n,write), dev_noimpl(ioctl,enodev), \
234 	dev_noimpl(stop,enodev), 0, seltrue, dev_noimpl(mmap,enodev) }
235 
236 /* graphic display adapters */
237 /* open, close, read, write, ioctl, stop, poll */
238 #define cdev_graph_init(c,n)	cdev__ocrwisp_init(c,n)
239 
240 /* Ingres */
241 /* open, close, (read), (write), ioctl */
242 #define cdev_ingres_init(c,n) { \
243 	dev_init(c,n,open), dev_init(c,n,close), dev_noimpl(read,nullop), \
244 	dev_noimpl(write,nullop), dev_init(c,n,ioctl), \
245 	dev_noimpl(stop,enodev), 0, seltrue, dev_noimpl(mmap,enodev) }
246 
247 
248 
249 cdev_decl(cn);
250 cdev_decl(ctty);
251 #define mmread	mmrw
252 #define mmwrite mmrw
253 cdev_decl(mm);
254 cdev_decl(sw);
255 #include "pty.h"
256 #define ptstty		ptytty
257 #define ptsioctl	ptyioctl
258 cdev_decl(pts);
259 #define ptctty		ptytty
260 #define ptcioctl	ptyioctl
261 cdev_decl(ptc);
262 cdev_decl(log);
263 
264 cdev_decl(hp);
265 cdev_decl(rk);
266 cdev_decl(tm);
267 cdev_decl(mt);
268 cdev_decl(ts);
269 cdev_decl(mu);
270 cdev_decl(ra);
271 cdev_decl(up);
272 cdev_decl(ut);
273 cdev_decl(idc);
274 cdev_decl(fd);
275 cdev_decl(gencn);
276 cdev_decl(rx);
277 cdev_decl(rl);
278 cdev_decl(ccd);
279 cdev_decl(raid);
280 cdev_decl(rd);
281 cdev_decl(ry);
282 cdev_decl(sd);
283 cdev_decl(st);
284 
285 #include "ct.h"
286 cdev_decl(ct);
287 #include "dh.h"
288 cdev_decl(dh);
289 #include "dmf.h"
290 cdev_decl(dmf);
291 
292 #if VAX8600 || VAXANY
293 #define NCRL 1
294 #else
295 #define NCRL 0
296 #endif
297 #define crlread crlrw
298 #define crlwrite crlrw
299 cdev_decl(crl);
300 
301 #if VAX8200 || VAXANY
302 #define NCRX 1
303 #else
304 #define NCRX 0
305 #endif
306 #define crxread crxrw
307 #define crxwrite crxrw
308 cdev_decl(crx);
309 
310 #if VAX780 || VAXANY
311 #define NCFL 1
312 #else
313 #define NCFL 0
314 #endif
315 #define cflread cflrw
316 #define cflwrite cflrw
317 cdev_decl(cfl);
318 
319 #include "dz.h"
320 cdev_decl(dz);
321 
322 #include "vp.h"
323 cdev_decl(vp);
324 
325 #include "lp.h"
326 cdev_decl(lp);
327 
328 #include "va.h"
329 cdev_decl(va);
330 
331 #include "lpa.h"
332 cdev_decl(lpa);
333 
334 #include "dn.h"
335 cdev_decl(dn);
336 
337 #include "ik.h"
338 cdev_decl(ik);
339 
340 #include "ps.h"
341 cdev_decl(ps);
342 
343 #include "ad.h"
344 cdev_decl(ad);
345 
346 #include "dhu.h"
347 cdev_decl(dhu);
348 
349 #include "dmz.h"
350 cdev_decl(dmz);
351 
352 cdev_decl(qv);
353 cdev_decl(qd);
354 
355 #include "ipfilter.h"
356 cdev_decl(ipl);
357 
358 #include "dl.h"
359 cdev_decl(dl);
360 
361 #if defined(INGRES)
362 #define NII 1
363 #else
364 #define NII 0
365 #endif
366 cdev_decl(ii);
367 
368 cdev_decl(vnd);
369 
370 #include "bpfilter.h"
371 cdev_decl(bpf);
372 
373 #include "tun.h"
374 cdev_decl(tun);
375 cdev_decl(cd);
376 #include "ch.h"
377 cdev_decl(ch);
378 cdev_decl(md);
379 #include "ss.h"
380 cdev_decl(ss);
381 #include "uk.h"
382 cdev_decl(uk);
383 
384 #include "rnd.h"
385 
386 dev_decl(filedesc,open);
387 
388 #include "wsdisplay.h"
389 cdev_decl(wsdisplay);
390 #include "wskbd.h"
391 cdev_decl(wskbd);
392 #include "wsmouse.h"
393 cdev_decl(wsmouse);
394 #include "wsmux.h"
395 cdev_decl(wsmux);
396 
397 #include "scsibus.h"
398 cdev_decl(scsibus);
399 
400 #include "clockctl.h"
401 cdev_decl(clockctl);
402 
403 struct cdevsw	cdevsw[] =
404 {
405 	cdev_cn_init(1,cn),		/* 0: virtual console */
406 	cdev_tty_init(NDZ,dz),		/* 1: DZ11 */
407 	cdev_ctty_init(1,ctty),		/* 2: controlling terminal */
408 	cdev_mm_init(1,mm),		/* 3: /dev/{null,mem,kmem,...} */
409 	cdev_disk_init(NHP,hp),		/* 4: Massbuss disk */
410 	cdev_notdef(),			/* 5 */
411 	cdev_plotter_init(NVP,vp),	/* 6: Versatec plotter */
412 	cdev_swap_init(1,sw),		/* 7 */
413 	cdev_cnstore_init(NCFL,cfl),	/* 8: 11/780 console floppy */
414 	cdev_disk_init(NRA,ra),		/* 9: MSCP disk interface */
415 	cdev_plotter_init(NVA,va),	/* 10: Benson-Varian plotter */
416 	cdev_disk_init(NRK,rk),		/* 11: RK06/07 */
417 	cdev_tty_init(NDH,dh),		/* 12: DH-11/DM-11 */
418 	cdev_disk_init(NUP,up),		/* 13: SC-21/SC-31 */
419 	cdev_tape_init(NTE,tm),		/* 14: TM11/TE10 */
420 	cdev_lp_init(NLP,lp),		/* 15: LP-11 line printer */
421 	cdev_tape_init(NTS,ts),		/* 16: TS11 */
422 	cdev_tape_init(NTJ,ut),		/* 17: TU45 */
423 	cdev_lp_init(NCT,ct),		/* 18: phototypesetter interface */
424 	cdev_tape_init(NMU,mu),		/* 19: TU78 */
425 	cdev_tty_init(NPTY,pts),	/* 20: pseudo-tty slave */
426 	cdev_ptc_init(NPTY,ptc),	/* 21: pseudo-tty master */
427 	cdev_tty_init(NDMF,dmf),	/* 22: DMF32 */
428 	cdev_disk_init(NRB,idc),	/* 23: IDC (RB730) */
429 	cdev_lp_init(NDN,dn),		/* 24: DN-11 autocall unit */
430 	cdev_tty_init(NGEN,gencn),	/* 25: Generic console (mtpr...) */
431 	cdev_audio_init(NLPA,lpa),	/* 26 ??? */
432 	cdev_graph_init(NPS,ps),	/* 27: E/S graphics device */
433 	cdev_lkm_init(NLKM,lkm),	/* 28: loadable module driver */
434 	cdev_ch_init(NAD,ad),		/* 29: DT A/D converter */
435 	cdev_disk_init(NRX,rx),		/* 30: RX?? on MSCP */
436 	cdev_graph_init(NIK,ik),	/* 31: Ikonas frame buffer */
437 	cdev_disk_init(NRL,rl),		/* 32: RL01/02 on unibus */
438 	cdev_log_init(1,log),		/* 33: /dev/klog */
439 	cdev_tty_init(NDHU,dhu),	/* 34: DHU-11 */
440 	cdev_cnstore_init(NCRL,crl),	/* 35: Console RL02 on 8600 */
441 	cdev_notdef(),			/* 36 */
442 	cdev_tty_init(NDMZ,dmz),	/* 37: DMZ32 */
443 	cdev_tape_init(NMT,mt),		/* 38: MSCP tape */
444 	cdev_notdef(),			/* 39  was NP Intelligent Board */
445 	cdev_graph_init(NQV,qv),	/* 40: QVSS graphic display */
446 	cdev_graph_init(NQD,qd),	/* 41: QDSS graphic display */
447 	cdev_ipf_init(NIPFILTER,ipl),	/* 42: Packet filter */
448 	cdev_ingres_init(NII,ii),	/* 43: Ingres device */
449 	cdev_notdef(),			/* 44  was Datakit */
450 	cdev_notdef(),			/* 45  was Datakit */
451 	cdev_notdef(),			/* 46  was Datakit */
452 	cdev_notdef(),			/* 47 */
453 	cdev_notdef(),			/* 48 */
454 	cdev_notdef(),			/* 49 */
455 	cdev_notdef(),			/* 50 */
456 	cdev_cnstore_init(NCRX,crx),	/* 51: Console RX50 at 8200 */
457 	cdev_notdef(),			/* 52: was: KDB50/RA?? */
458 	cdev_fd_init(1,filedesc),	/* 53: file descriptor pseudo-device */
459 	cdev_disk_init(NCCD,ccd),	/* 54: concatenated disk driver */
460 	cdev_disk_init(NVND,vnd),	/* 55: vnode disk driver */
461 	cdev_bpftun_init(NBPFILTER,bpf),/* 56: berkeley packet filter */
462 	cdev_bpftun_init(NTUN,tun),	/* 57: tunnel filter */
463 	cdev_disk_init(NRD,rd),		/* 58: HDC9224/RD?? */
464 	cdev_disk_init(NSD,sd),		/* 59: SCSI disk */
465 	cdev_tape_init(NST,st),		/* 60: SCSI tape */
466 	cdev_disk_init(NCD,cd),		/* 61: SCSI CD-ROM */
467 	cdev_disk_init(NMD,md),		/* 62: memory disk driver */
468 	cdev_ch_init(NCH,ch),		/* 63: SCSI autochanger */
469 	cdev_scanner_init(NSS,ss),	/* 64: SCSI scanner */
470 	cdev_uk_init(NUK,uk),		/* 65: SCSI unknown */
471 	cdev_tty_init(NDL,dl),		/* 66: DL11 */
472 	cdev_rnd_init(NRND,rnd),	/* 67: random source pseudo-device */
473 	cdev_wsdisplay_init(NWSDISPLAY,
474 			wsdisplay),	/* 68: frame buffers, etc. */
475 
476 	cdev_mouse_init(NWSKBD, wskbd),	/* 69: keyboards */
477 	cdev_mouse_init(NWSMOUSE,
478 			wsmouse),	/* 70: mice */
479 	cdev_disk_init(NRY,ry),		/* 71: VS floppy */
480 	cdev_scsibus_init(NSCSIBUS,scsibus), /* 72: SCSI bus */
481 	cdev_disk_init(NRAID,raid),	/* 73: RAIDframe disk driver */
482 	cdev_mouse_init(NWSMUX, wsmux),	/* 74: ws multiplexor */
483 	cdev_clockctl_init(NCLOCKCTL, clockctl),/* 75: clockctl pseudo device */
484 };
485 int	nchrdev = sizeof(cdevsw) / sizeof(cdevsw[0]);
486 
487 int	mem_no = 3;	/* major device number of memory special file */
488 
489 /*
490  * Swapdev is a fake device implemented
491  * in sw.c used only internally to get to swstrategy.
492  * It cannot be provided to the users, because the
493  * swstrategy routine munches the b_dev and b_blkno entries
494  * before calling the appropriate driver.  This would horribly
495  * confuse, e.g. the hashing routines. Instead, /dev/drum is
496  * provided as a character (raw) device.
497  */
498 dev_t	swapdev = makedev(4, 0);
499 
500 int	chrtoblktbl[] = {
501 	NODEV,	/* 0 */
502 	NODEV,	/* 1 */
503 	NODEV,	/* 2 */
504 	NODEV,	/* 3 */
505 	0,	/* 4 */
506 	1,	/* 5 */
507 	NODEV,	/* 6 */
508 	NODEV,	/* 7 */
509 	NODEV,	/* 8 */
510 	9,	/* 9 */
511 	NODEV,	/* 10 */
512 	3,	/* 11 */
513 	NODEV,	/* 12 */
514 	2,	/* 13 */
515 	5,	/* 14 */
516 	NODEV,	/* 15 */
517 	6,	/* 16 */
518 	10,	/* 17 */
519 	NODEV,	/* 18 */
520 	7,	/* 19 */
521 	NODEV,	/* 20 */
522 	NODEV,	/* 21 */
523 	NODEV,	/* 22 */
524 	11,	/* 23 */
525 	NODEV,	/* 24 */
526 	NODEV,	/* 25 */
527 	NODEV,	/* 26 */
528 	NODEV,	/* 27 */
529 	NODEV,	/* 28 */
530 	NODEV,	/* 29 */
531 	12,	/* 30 */
532 	NODEV,	/* 31 */
533 	14,	/* 32 */
534 	NODEV,	/* 33 */
535 	NODEV,	/* 34 */
536 	NODEV,	/* 35 */
537 	NODEV,	/* 36 */
538 	NODEV,	/* 37 */
539 	15,	/* 38 */
540 	NODEV,	/* 39 */
541 	NODEV,	/* 40 */
542 	NODEV,	/* 41 */
543 	NODEV,	/* 42 */
544 	NODEV,	/* 43 */
545 	NODEV,	/* 44 */
546 	NODEV,	/* 45 */
547 	NODEV,	/* 46 */
548 	NODEV,	/* 47 */
549 	NODEV,	/* 48 */
550 	NODEV,	/* 49 */
551 	NODEV,	/* 50 */
552 	NODEV,	/* 51 */
553 	16,	/* 52 */
554 	NODEV,	/* 53 */
555 	17,	/* 54 */
556 	18,	/* 55 */
557 	NODEV,	/* 56 */
558 	NODEV,	/* 57 */
559 	19,	/* 58 */
560 	20,	/* 59 */
561 	21,	/* 60 */
562 	22,	/* 61 */
563 	23,	/* 62 */
564 	NODEV,	/* 63 */
565 	NODEV,	/* 64 */
566 	NODEV,	/* 65 */
567 	NODEV,	/* 66 */
568 	NODEV,	/* 67 */
569 	NODEV,	/* 68 */
570 	NODEV,	/* 69 */
571 	NODEV,	/* 70 */
572 	NODEV,	/* 71 */
573 	NODEV,	/* 72 */
574 	25,	/* 73 */
575 	NODEV,	/* 74 */
576 	NODEV,	/* 75 */
577 };
578 
579 dev_t
580 chrtoblk(dev)
581 	dev_t dev;
582 {
583 	if(major(dev)>=nchrdev) return(NODEV);
584 	return chrtoblktbl[major(dev)]==NODEV?NODEV:
585 		makedev(chrtoblktbl[major(dev)],minor(dev));
586 }
587 
588 /*
589  * Returns true if dev is /dev/mem or /dev/kmem.
590  */
591 int
592 iskmemdev(dev)
593 	dev_t dev;
594 {
595 
596 	return (major(dev) == 3 && minor(dev) < 2);
597 }
598 
599 /*
600  * Returns true if dev is /dev/zero.
601  * ?? Shall I use 12 as /dev/zero?
602  */
603 int
604 iszerodev(dev)
605 	dev_t dev;
606 {
607 
608 	return (major(dev) == 3 && minor(dev) == 12);
609 }
610 
611 int
612 getmajor(void *ptr)
613 {
614 	int i;
615 
616 	for (i = 0; i < nchrdev; i++)
617 		if (cdevsw[i].d_open == ptr)
618 			return i;
619 	panic("getmajor");
620 }
621