1 /* $NetBSD: conf.c,v 1.36 1996/09/07 12:40:36 mycroft Exp $ */ 2 3 /* 4 * Copyright (c) 1990 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 /*- 36 * Derived a long time ago from 37 * @(#)conf.c 7.9 (Berkeley) 5/28/91 38 */ 39 40 #include <sys/param.h> 41 #include <sys/systm.h> 42 #include <sys/buf.h> 43 #include <sys/ioctl.h> 44 #include <sys/tty.h> 45 #include <sys/conf.h> 46 #include <sys/vnode.h> 47 #include <dev/cons.h> 48 49 bdev_decl(sw); 50 #include "st.h" 51 bdev_decl(st); 52 #include "sd.h" 53 bdev_decl(sd); 54 #include "cd.h" 55 bdev_decl(cd); 56 #include "ch.h" 57 bdev_decl(ch); 58 #include "vnd.h" 59 bdev_decl(vnd); 60 #include "ccd.h" 61 bdev_decl(ccd); 62 #include "rd.h" 63 bdev_decl(rd); 64 /* No cdev for rd */ 65 66 struct bdevsw bdevsw[] = 67 { 68 bdev_notdef(), /* 0 */ 69 bdev_notdef(), /* 1 */ 70 bdev_notdef(), /* 2 */ 71 bdev_swap_init(1,sw), /* 3: swap pseudo-device */ 72 bdev_disk_init(NSD,sd), /* 4: SCSI disk */ 73 bdev_tape_init(NST,st), /* 5: SCSI tape */ 74 bdev_disk_init(NCD,cd), /* 6: SCSI CD-ROM */ 75 bdev_notdef(), /* 7 */ 76 bdev_disk_init(NVND,vnd), /* 8: vnode disk driver */ 77 bdev_disk_init(NCCD,ccd), /* 9: concatenated disk driver */ 78 bdev_notdef(), /* 10 */ 79 bdev_notdef(), /* 11 */ 80 bdev_notdef(), /* 12 */ 81 bdev_disk_init(NRD,rd), /* 13: RAM disk -- for install */ 82 bdev_lkm_dummy(), /* 14 */ 83 bdev_lkm_dummy(), /* 15 */ 84 bdev_lkm_dummy(), /* 16 */ 85 bdev_lkm_dummy(), /* 17 */ 86 bdev_lkm_dummy(), /* 18 */ 87 bdev_lkm_dummy(), /* 19 */ 88 }; 89 int nblkdev = sizeof(bdevsw) / sizeof(bdevsw[0]); 90 91 /* open, close, ioctl, poll, mmap -- XXX should be a map device */ 92 #define cdev_grf_init(c,n) { \ 93 dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) nullop, \ 94 (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 95 (dev_type_stop((*))) enodev, 0, dev_init(c,n,poll), \ 96 dev_init(c,n,mmap) } 97 98 cdev_decl(cn); 99 cdev_decl(ctty); 100 101 #include "ite.h" 102 cdev_decl(ite); 103 #define mmread mmrw 104 #define mmwrite mmrw 105 cdev_decl(mm); 106 cdev_decl(sw); 107 #include "pty.h" 108 #define ptstty ptytty 109 #define ptsioctl ptyioctl 110 cdev_decl(pts); 111 #define ptctty ptytty 112 #define ptcioctl ptyioctl 113 cdev_decl(ptc); 114 cdev_decl(log); 115 cdev_decl(st); 116 cdev_decl(sd); 117 cdev_decl(fd); 118 #include "grf.h" 119 cdev_decl(grf); 120 #define NADB 1 /* #include "adb.h" */ 121 cdev_decl(adb); 122 #include "zsc.h" 123 cdev_decl(zsc); 124 #include "zstty.h" 125 cdev_decl(zs); 126 cdev_decl(vnd); 127 cdev_decl(ccd); 128 #include "bpfilter.h" 129 cdev_decl(bpf); 130 #include "tun.h" 131 cdev_decl(tun); 132 dev_decl(filedesc,open); 133 134 struct cdevsw cdevsw[] = 135 { 136 cdev_cn_init(1,cn), /* 0: virtual console */ 137 cdev_ctty_init(1,ctty), /* 1: controlling terminal */ 138 cdev_mm_init(1,mm), /* 2: /dev/{null,mem,kmem,...} */ 139 cdev_swap_init(1,sw), /* 3: /dev/drum (swap pseudo-device) */ 140 cdev_tty_init(NPTY,pts), /* 4: pseudo-tty slave */ 141 cdev_ptc_init(NPTY,ptc), /* 5: pseudo-tty master */ 142 cdev_log_init(1,log), /* 6: /dev/klog */ 143 cdev_notdef(), /* 7 */ 144 cdev_notdef(), /* 8 */ 145 cdev_notdef(), /* 9 */ 146 cdev_grf_init(1,grf), /* 10: frame buffer */ 147 cdev_tty_init(NITE,ite), /* 11: console terminal emulator */ 148 cdev_tty_init(NZSTTY,zs), /* 12: 2 mac serial ports -- BG*/ 149 cdev_disk_init(NSD,sd), /* 13: SCSI disk */ 150 cdev_tape_init(NST,st), /* 14: SCSI tape */ 151 cdev_disk_init(NCD,cd), /* 15: SCSI CD-ROM */ 152 cdev_notdef(), /* 16 */ 153 /* cdev_disk_init(NCH,ch), 17: SCSI autochanger */ 154 cdev_notdef(), /* 17: until we find chstrategy... */ 155 cdev_notdef(), /* 18 */ 156 cdev_disk_init(NVND,vnd), /* 19: vnode disk driver */ 157 cdev_disk_init(NCCD,ccd), /* 20: concatenated disk driver */ 158 cdev_fd_init(1,filedesc), /* 21: file descriptor pseudo-device */ 159 cdev_bpftun_init(NBPFILTER,bpf),/* 22: Berkeley packet filter */ 160 cdev_mouse_init(NADB,adb), /* 23: ADB event interface */ 161 cdev_bpftun_init(NTUN,tun), /* 24: network tunnel */ 162 cdev_lkm_init(NLKM,lkm), /* 25: loadable module driver */ 163 cdev_lkm_dummy(), /* 26 */ 164 cdev_lkm_dummy(), /* 27 */ 165 cdev_lkm_dummy(), /* 28 */ 166 cdev_lkm_dummy(), /* 29 */ 167 cdev_lkm_dummy(), /* 30 */ 168 cdev_lkm_dummy(), /* 31 */ 169 }; 170 int nchrdev = sizeof(cdevsw) / sizeof(cdevsw[0]); 171 172 int mem_no = 2; /* major device number of memory special file */ 173 174 /* 175 * Swapdev is a fake device implemented 176 * in sw.c used only internally to get to swstrategy. 177 * It cannot be provided to the users, because the 178 * swstrategy routine munches the b_dev and b_blkno entries 179 * before calling the appropriate driver. This would horribly 180 * confuse, e.g. the hashing routines. Instead, /dev/drum is 181 * provided as a character (raw) device. 182 */ 183 dev_t swapdev = makedev(3, 0); 184 185 /* 186 * Returns true if dev is /dev/mem or /dev/kmem. 187 */ 188 int 189 iskmemdev(dev) 190 dev_t dev; 191 { 192 193 return (major(dev) == mem_no && minor(dev) < 2); 194 } 195 196 /* 197 * Returns true if dev is /dev/zero. 198 */ 199 int 200 iszerodev(dev) 201 dev_t dev; 202 { 203 204 return (major(dev) == mem_no && minor(dev) == 12); 205 } 206 207 static int chrtoblktab[] = { 208 /* XXXX This needs to be dynamic for LKMs. */ 209 /*VCHR*/ /*VBLK*/ 210 /* 0 */ NODEV, 211 /* 1 */ NODEV, 212 /* 2 */ NODEV, 213 /* 3 */ 3, 214 /* 4 */ NODEV, 215 /* 5 */ NODEV, 216 /* 6 */ NODEV, 217 /* 7 */ NODEV, 218 /* 8 */ NODEV, 219 /* 9 */ NODEV, 220 /* 10 */ NODEV, 221 /* 11 */ NODEV, 222 /* 12 */ NODEV, 223 /* 13 */ 4, 224 /* 14 */ 5, 225 /* 15 */ 6, 226 /* 16 */ NODEV, 227 /* 17 */ NODEV, 228 /* 18 */ NODEV, 229 /* 19 */ 8, 230 /* 20 */ 9, 231 /* 21 */ NODEV, 232 /* 22 */ NODEV, 233 /* 23 */ NODEV, 234 /* 24 */ NODEV, 235 /* 25 */ NODEV, 236 /* 26 */ NODEV, 237 /* 27 */ NODEV, 238 /* 28 */ NODEV, 239 /* 29 */ NODEV, 240 /* 30 */ NODEV, 241 /* 31 */ NODEV, 242 }; 243 244 dev_t 245 chrtoblk(dev) 246 dev_t dev; 247 { 248 int blkmaj; 249 250 if (major(dev) >= nchrdev) 251 return NODEV; 252 blkmaj = chrtoblktab[major(dev)]; 253 if (blkmaj == NODEV) 254 return NODEV; 255 return (makedev(blkmaj, minor(dev))); 256 } 257 258 #define itecnpollc nullcnpollc 259 cons_decl(ite); 260 #define zscnpollc nullcnpollc 261 cons_decl(zs); 262 263 struct consdev constab[] = { 264 #if NITE > 0 265 cons_init(ite), 266 #endif 267 #if NZSTTY > 0 268 cons_init(zs), 269 #endif 270 { 0 }, 271 }; 272