1 /*- 2 * Copyright (c) 1991 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 * 7 * @(#)conf.c 7.15 (Berkeley) 12/27/92 8 */ 9 10 #include <sys/param.h> 11 #include <sys/systm.h> 12 #include <sys/buf.h> 13 #include <sys/ioctl.h> 14 #include <sys/proc.h> 15 #include <sys/tty.h> 16 #include <sys/conf.h> 17 18 int rawread __P((dev_t, struct uio *, int)); 19 int rawwrite __P((dev_t, struct uio *, int)); 20 int swstrategy __P((struct buf *)); 21 int ttselect __P((dev_t, int, struct proc *)); 22 23 #define dev_type_open(n) int n __P((dev_t, int, int, struct proc *)) 24 #define dev_type_close(n) int n __P((dev_t, int, int, struct proc *)) 25 #define dev_type_strategy(n) int n __P((struct buf *)) 26 #define dev_type_ioctl(n) \ 27 int n __P((dev_t, int, caddr_t, int, struct proc *)) 28 29 /* bdevsw-specific types */ 30 #define dev_type_dump(n) int n __P(()) 31 #define dev_type_size(n) int n __P((dev_t)) 32 33 #define dev_decl(n,t) __CONCAT(dev_type_,t)(__CONCAT(n,t)) 34 #define dev_init(c,n,t) \ 35 (c > 0 ? __CONCAT(n,t) : (__CONCAT(dev_type_,t)((*))) enxio) 36 37 /* bdevsw-specific initializations */ 38 #define dev_size_init(c,n) (c > 0 ? __CONCAT(n,size) : 0) 39 40 #define bdev_decl(n) \ 41 dev_decl(n,open); dev_decl(n,close); dev_decl(n,strategy); \ 42 dev_decl(n,ioctl); dev_decl(n,dump); dev_decl(n,size) 43 44 /* disk without close routine */ 45 #define bdev_disk_init(c,n) { \ 46 dev_init(c,n,open), (dev_type_close((*))) nullop, \ 47 dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 48 dev_init(c,n,dump), dev_size_init(c,n), 0 } 49 50 /* disk with close routine */ 51 #define bdev_ldisk_init(c,n) { \ 52 dev_init(c,n,open), dev_init(c,n,close), \ 53 dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 54 dev_init(c,n,dump), dev_size_init(c,n), 0 } 55 56 #define bdev_tape_init(c,n) { \ 57 dev_init(c,n,open), dev_init(c,n,close), \ 58 dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 59 dev_init(c,n,dump), 0, B_TAPE } 60 61 #define bdev_swap_init() { \ 62 (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 63 swstrategy, (dev_type_ioctl((*))) enodev, \ 64 (dev_type_dump((*))) enodev, 0, 0 } 65 66 #define bdev_notdef() bdev_tape_init(0,no) 67 bdev_decl(no); /* dummy declarations */ 68 69 #include "ct.h" 70 #include "st.h" 71 #include "rd.h" 72 #include "sd.h" 73 #include "cd.h" 74 #include "vn.h" 75 76 bdev_decl(ct); 77 bdev_decl(st); 78 bdev_decl(rd); 79 bdev_decl(sd); 80 bdev_decl(cd); 81 bdev_decl(vn); 82 83 struct bdevsw bdevsw[] = 84 { 85 bdev_tape_init(NCT,ct), /* 0: cs80 cartridge tape */ 86 bdev_notdef(), /* 1 */ 87 bdev_ldisk_init(NRD,rd),/* 2: hpib disk */ 88 bdev_swap_init(), /* 3: swap pseudo-device */ 89 bdev_ldisk_init(NSD,sd),/* 4: scsi disk */ 90 bdev_disk_init(NCD,cd), /* 5: concatenated disk driver */ 91 bdev_disk_init(NVN,vn), /* 6: vnode disk driver (swap to files) */ 92 bdev_tape_init(NST,st), /* 7: exabyte tape */ 93 }; 94 95 int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]); 96 97 /* cdevsw-specific types */ 98 #define dev_type_read(n) int n __P((dev_t, struct uio *, int)) 99 #define dev_type_write(n) int n __P((dev_t, struct uio *, int)) 100 #define dev_type_stop(n) int n __P((struct tty *, int)) 101 #define dev_type_reset(n) int n __P((int)) 102 #define dev_type_select(n) int n __P((dev_t, int, struct proc *)) 103 #define dev_type_map(n) int n __P(()) 104 105 #define cdev_decl(n) \ 106 dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \ 107 dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \ 108 dev_decl(n,reset); dev_decl(n,select); dev_decl(n,map); \ 109 dev_decl(n,strategy); extern struct tty __CONCAT(n,_tty)[] 110 111 #define dev_tty_init(c,n) (c > 0 ? __CONCAT(n,_tty) : 0) 112 113 /* open, read, write, ioctl, strategy */ 114 #define cdev_disk_init(c,n) { \ 115 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 116 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 117 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 118 dev_init(c,n,strategy) } 119 120 /* open, close, read, write, ioctl, strategy */ 121 #define cdev_ldisk_init(c,n) { \ 122 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 123 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 124 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 125 dev_init(c,n,strategy) } 126 127 /* open, close, read, write, ioctl, strategy */ 128 #define cdev_tape_init(c,n) { \ 129 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 130 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 131 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 132 dev_init(c,n,strategy) } 133 134 /* open, close, read, write, ioctl, stop, tty */ 135 #define cdev_tty_init(c,n) { \ 136 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 137 dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \ 138 (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 139 (dev_type_map((*))) enodev, 0 } 140 141 #define cdev_notdef() { \ 142 (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 143 (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 144 (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 145 (dev_type_reset((*))) nullop, 0, seltrue, \ 146 (dev_type_map((*))) enodev, 0 } 147 148 cdev_decl(no); /* dummy declarations */ 149 150 cdev_decl(cn); 151 /* open, close, read, write, ioctl, select -- XXX should be a tty */ 152 #define cdev_cn_init(c,n) { \ 153 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 154 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 155 (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 156 (dev_type_map((*))) enodev, 0 } 157 158 cdev_decl(ctty); 159 /* open, read, write, ioctl, select -- XXX should be a tty */ 160 #define cdev_ctty_init(c,n) { \ 161 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 162 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 163 (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 164 (dev_type_map((*))) enodev, 0 } 165 166 dev_type_read(mmrw); 167 /* read/write */ 168 #define cdev_mm_init(c,n) { \ 169 (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \ 170 mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \ 171 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 } 172 173 /* read, write, strategy */ 174 #define cdev_swap_init(c,n) { \ 175 (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \ 176 rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 177 (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 178 (dev_type_map((*))) enodev, dev_init(c,n,strategy) } 179 180 #include "pty.h" 181 #define pts_tty pt_tty 182 #define ptsioctl ptyioctl 183 cdev_decl(pts); 184 #define ptc_tty pt_tty 185 #define ptcioctl ptyioctl 186 cdev_decl(ptc); 187 188 /* open, close, read, write, ioctl, tty, select */ 189 #define cdev_ptc_init(c,n) { \ 190 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 191 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 192 (dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \ 193 (dev_type_map((*))) enodev, 0 } 194 195 cdev_decl(log); 196 /* open, close, read, ioctl, select -- XXX should be a generic device */ 197 #define cdev_log_init(c,n) { \ 198 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 199 (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 200 (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 201 dev_init(c,n,select), (dev_type_map((*))) enodev, 0 } 202 203 cdev_decl(ct); 204 cdev_decl(st); 205 cdev_decl(sd); 206 cdev_decl(rd); 207 208 #include "grf.h" 209 cdev_decl(grf); 210 /* open, close, ioctl, select, map -- XXX should be a map device */ 211 #define cdev_grf_init(c,n) { \ 212 dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) nullop, \ 213 (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 214 (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 215 dev_init(c,n,select), dev_init(c,n,map), 0 } 216 217 #include "ppi.h" 218 cdev_decl(ppi); 219 /* open, close, read, write, ioctl -- XXX should be a generic device */ 220 #define cdev_ppi_init(c,n) { \ 221 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 222 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 223 (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 224 (dev_type_map((*))) enodev, 0 } 225 226 #include "dca.h" 227 cdev_decl(dca); 228 229 #include "ite.h" 230 cdev_decl(ite); 231 /* open, close, read, write, ioctl, tty -- XXX should be a tty! */ 232 #define cdev_ite_init(c,n) { \ 233 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 234 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 235 (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 236 (dev_type_map((*))) enodev, 0 } 237 238 /* XXX shouldn't this be optional? */ 239 cdev_decl(hil); 240 /* open, close, read, ioctl, select, map -- XXX should be a map device */ 241 #define cdev_hil_init(c,n) { \ 242 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 243 (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 244 (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 245 dev_init(c,n,select), dev_init(c,n,map), 0 } 246 247 #include "dcm.h" 248 cdev_decl(dcm); 249 250 cdev_decl(cd); 251 252 cdev_decl(vn); 253 /* open, read, write, ioctl -- XXX should be a disk */ 254 #define cdev_vn_init(c,n) { \ 255 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 256 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 257 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 258 0 } 259 260 dev_type_open(fdopen); 261 /* open */ 262 #define cdev_fd_init(c,n) { \ 263 dev_init(c,n,open), (dev_type_close((*))) enodev, \ 264 (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 265 (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 266 (dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \ 267 (dev_type_map((*))) enodev, 0 } 268 269 #include "bpfilter.h" 270 cdev_decl(bpf); 271 /* open, close, read, write, ioctl, select -- XXX should be generic device */ 272 #define cdev_bpf_init(c,n) { \ 273 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 274 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 275 (dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \ 276 (dev_type_map((*))) enodev, 0 } 277 278 struct cdevsw cdevsw[] = 279 { 280 cdev_cn_init(1,cn), /* 0: virtual console */ 281 cdev_ctty_init(1,ctty), /* 1: controlling terminal */ 282 cdev_mm_init(1,mm), /* 2: /dev/{null,mem,kmem,...} */ 283 cdev_swap_init(1,sw), /* 3: /dev/drum (swap pseudo-device) */ 284 cdev_tty_init(NPTY,pts), /* 4: pseudo-tty slave */ 285 cdev_ptc_init(NPTY,ptc), /* 5: pseudo-tty master */ 286 cdev_log_init(1,log), /* 6: /dev/klog */ 287 cdev_tape_init(NCT,ct), /* 7: cs80 cartridge tape */ 288 cdev_ldisk_init(NSD,sd), /* 8: scsi disk */ 289 cdev_ldisk_init(NRD,rd), /* 9: hpib disk */ 290 cdev_grf_init(NGRF,grf), /* 10: frame buffer */ 291 cdev_ppi_init(NPPI,ppi), /* 11: printer/plotter interface */ 292 cdev_tty_init(NDCA,dca), /* 12: built-in single-port serial */ 293 cdev_ite_init(NITE,ite), /* 13: console terminal emulator */ 294 cdev_hil_init(1,hil), /* 14: human interface loop */ 295 cdev_tty_init(NDCM,dcm), /* 15: 4-port serial */ 296 cdev_notdef(), /* 16 */ 297 cdev_disk_init(NCD,cd), /* 17: concatenated disk */ 298 cdev_notdef(), /* 18 */ 299 cdev_vn_init(NVN,vn), /* 19: vnode disk */ 300 cdev_tape_init(NST,st), /* 20: exabyte tape */ 301 cdev_fd_init(1,fd), /* 21: file descriptor pseudo-dev */ 302 cdev_bpf_init(NBPFILTER,bpf), /* 22: berkeley packet filter */ 303 }; 304 305 int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]); 306 307 int mem_no = 2; /* major device number of memory special file */ 308 309 /* 310 * Swapdev is a fake device implemented 311 * in sw.c used only internally to get to swstrategy. 312 * It cannot be provided to the users, because the 313 * swstrategy routine munches the b_dev and b_blkno entries 314 * before calling the appropriate driver. This would horribly 315 * confuse, e.g. the hashing routines. Instead, /dev/drum is 316 * provided as a character (raw) device. 317 */ 318 dev_t swapdev = makedev(3, 0); 319