1 /* 2 * Copyright (c) 1992 Regents of the University of California. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Kazumasa Utashiro of Software Research Associates, Inc. 7 * 8 * %sccs.include.redist.c% 9 * 10 * @(#)conf.c 7.4 (Berkeley) 12/17/92 11 */ 12 13 #include <sys/param.h> 14 #include <sys/systm.h> 15 #include <sys/buf.h> 16 #include <sys/ioctl.h> 17 #include <sys/tty.h> 18 #include <sys/conf.h> 19 20 int rawread __P((dev_t, struct uio *, int)); 21 int rawwrite __P((dev_t, struct uio *, int)); 22 int swstrategy __P((struct buf *)); 23 int ttselect __P((dev_t, int, struct proc *)); 24 25 #define dev_type_open(n) int n __P((dev_t, int, int, struct proc *)) 26 #define dev_type_close(n) int n __P((dev_t, int, int, struct proc *)) 27 #define dev_type_strategy(n) int n __P((struct buf *)) 28 #define dev_type_ioctl(n) \ 29 int n __P((dev_t, int, caddr_t, int, struct proc *)) 30 31 /* bdevsw-specific types */ 32 #define dev_type_dump(n) int n __P((dev_t)) 33 #define dev_type_size(n) int n __P((dev_t)) 34 35 #define dev_decl(n,t) __CONCAT(dev_type_,t)(__CONCAT(n,t)) 36 #define dev_init(c,n,t) \ 37 (c > 0 ? __CONCAT(n,t) : (__CONCAT(dev_type_,t)((*))) enxio) 38 39 /* bdevsw-specific initializations */ 40 #define dev_size_init(c,n) (c > 0 ? __CONCAT(n,size) : 0) 41 42 #define bdev_decl(n) \ 43 dev_decl(n,open); dev_decl(n,close); dev_decl(n,strategy); \ 44 dev_decl(n,ioctl); dev_decl(n,dump); dev_decl(n,size) 45 46 #define bdev_disk_init(c,n) { \ 47 dev_init(c,n,open), (dev_type_close((*))) nullop, \ 48 dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 49 dev_init(c,n,dump), dev_size_init(c,n), 0 } 50 51 #define bdev_tape_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), 0, B_TAPE } 55 56 #define bdev_swap_init() { \ 57 (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 58 swstrategy, (dev_type_ioctl((*))) enodev, \ 59 (dev_type_dump((*))) enodev, 0, 0 } 60 61 #define bdev_notdef() bdev_tape_init(0,no) 62 bdev_decl(no); /* dummy declarations */ 63 64 #include "sd.h" 65 #define sd_b_ioctl sdioctl 66 #define sd_b_strategy sdstrategy 67 #define sd_b_dump sddump 68 #define sd_b_size sdsize 69 bdev_decl(sd_b_); 70 71 #include "fd.h" 72 #define fd_b_ioctl fdioctl 73 #define fd_b_strategy fdstrategy 74 #define fd_b_dump fddump 75 #define fd_b_size fdsize 76 bdev_decl(fd_b_); 77 78 #include "vn.h" 79 bdev_decl(vn); 80 81 struct bdevsw bdevsw[] = 82 { 83 bdev_disk_init(NSD,sd_b_), /* 0: SCSI disk */ 84 bdev_disk_init(NFD,fd_b_), /* 1: floppy disk */ 85 bdev_notdef(), /* 2 */ 86 bdev_disk_init(NVN,vn), /* 3: vnode disk driver (swap to files) */ 87 bdev_swap_init(), /* 4: swap pseudo-device */ 88 }; 89 90 int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]); 91 92 /* cdevsw-specific types */ 93 #define dev_type_read(n) int n __P((dev_t, struct uio *, int)) 94 #define dev_type_write(n) int n __P((dev_t, struct uio *, int)) 95 #define dev_type_stop(n) int n __P((struct tty *, int)) 96 #define dev_type_reset(n) int n __P((int)) 97 #define dev_type_select(n) int n __P((dev_t, int, struct proc *)) 98 #define dev_type_map(n) int n __P(()) 99 100 #define cdev_decl(n) \ 101 dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \ 102 dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \ 103 dev_decl(n,reset); dev_decl(n,select); dev_decl(n,map); \ 104 dev_decl(n,strategy); extern struct tty __CONCAT(n,_tty)[] 105 106 #define dev_tty_init(c,n) (c > 0 ? __CONCAT(n,_tty) : 0) 107 108 /* open, read, write, ioctl, strategy */ 109 #define cdev_disk_init(c,n) { \ 110 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 111 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 112 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 113 dev_init(c,n,strategy) } 114 115 /* open, close, read, write, ioctl, strategy */ 116 #define cdev_tape_init(c,n) { \ 117 dev_init(c,n,open), dev_init(c,n,close), rawread, \ 118 rawwrite, dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 119 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 120 dev_init(c,n,strategy) } 121 122 /* open, close, read, write, ioctl, stop, tty */ 123 #define cdev_tty_init(c,n) { \ 124 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 125 dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \ 126 (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 127 (dev_type_map((*))) enodev, 0 } 128 129 #define cdev_notdef() { \ 130 (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 131 (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 132 (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 133 (dev_type_reset((*))) nullop, 0, seltrue, \ 134 (dev_type_map((*))) enodev, 0 } 135 136 /* open, close, read, write, ioctl -- XXX should be tty */ 137 #define cdev_vc_init(c,n) { \ 138 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 139 dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \ 140 (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 141 (dev_type_map((*))) enodev, 0 } 142 143 cdev_decl(no); /* dummy declarations */ 144 145 #include "rs.h" 146 cdev_decl(rs); 147 cdev_decl(vc); 148 149 #include "bm.h" 150 cdev_decl(cn); 151 152 cdev_decl(ctty); 153 /* open, read, write, ioctl, select -- XXX should be a tty */ 154 #define cdev_ctty_init(c,n) { \ 155 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 156 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 157 (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 158 (dev_type_map((*))) enodev, 0 } 159 160 dev_type_read(mmrw); 161 /* read/write */ 162 #define cdev_mm_init(c,n) { \ 163 (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \ 164 mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \ 165 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 } 166 167 #include "sd.h" 168 #define sd_c_read sdread 169 #define sd_c_write sdwrite 170 #define sd_c_ioctl sdioctl 171 #define sd_c_reset sdreset 172 #define sd_c_strategy sdstrategy 173 #define sd_c_dump sddump 174 #define sd_c_size sdsize 175 cdev_decl(sd_c_); 176 177 #include "fd.h" 178 #define fd_c_read fdread 179 #define fd_c_write fdwrite 180 #define fd_c_ioctl fdioctl 181 #define fd_c_reset fdreset 182 #define fd_c_strategy fdstrategy 183 #define fd_c_dump fddump 184 #define fd_c_size fdsize 185 cdev_decl(fd_c_); 186 187 #include "lp.h" 188 cdev_decl(lp); 189 190 /* read, write, strategy */ 191 #define cdev_swap_init(c,n) { \ 192 (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \ 193 rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 194 (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 195 (dev_type_map((*))) enodev, dev_init(c,n,strategy) } 196 197 #include "pty.h" 198 #define pts_tty pt_tty 199 #define ptsioctl ptyioctl 200 cdev_decl(pts); 201 #define ptc_tty pt_tty 202 #define ptcioctl ptyioctl 203 cdev_decl(ptc); 204 205 /* open, close, read, write, ioctl, tty, select */ 206 #define cdev_ptc_init(c,n) { \ 207 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 208 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 209 (dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \ 210 (dev_type_map((*))) enodev, 0 } 211 212 #include "kb.h" 213 cdev_decl(kb); 214 /* open, close, write, ioctl */ 215 #define cdev_kb_init(c,n) { \ 216 dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \ 217 dev_init(c,n,write), dev_init(c,n,ioctl), \ 218 (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 219 seltrue, (dev_type_map((*))) enodev, \ 220 0 } 221 222 #include "ms.h" 223 #define msmap msmmap 224 cdev_decl(ms); 225 /* open, close, read, write, ioctl, select */ 226 #define cdev_ms_init(c,n) { \ 227 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 228 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 229 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 230 0 } 231 232 #include "fb.h" 233 cdev_decl(fb); 234 /* open, close, ioctl, mmap */ 235 #define cdev_fb_init(c,n) { \ 236 dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \ 237 (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 238 (dev_type_stop((*))) enodev, \ 239 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 } 240 /* 241 (dev_type_reset((*))) nullop, 0, seltrue, dev_init(c,n,map), 0 } 242 */ 243 244 #include "st.h" 245 cdev_decl(st); 246 247 #include "lb.h" 248 cdev_decl(lbp); 249 250 #include "ir.h" 251 cdev_decl(ir); 252 /* open, close, read, ioctl */ 253 #define cdev_ir_init(c,n) { \ 254 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 255 (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 256 (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 257 seltrue, (dev_type_map((*))) enodev, 0 } 258 259 cdev_decl(log); 260 /* open, close, read, ioctl, select -- XXX should be a generic device */ 261 #define cdev_log_init(c,n) { \ 262 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 263 (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 264 (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 265 dev_init(c,n,select), (dev_type_map((*))) enodev, 0 } 266 267 dev_type_open(fdopen); 268 /* open */ 269 #define cdev_fd_init(c,n) { \ 270 dev_init(c,n,open), (dev_type_close((*))) enodev, \ 271 (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 272 (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 273 (dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \ 274 (dev_type_map((*))) enodev, 0 } 275 276 cdev_decl(vn); 277 /* open, read, write, ioctl -- XXX should be a disk */ 278 #define cdev_vn_init(c,n) { \ 279 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 280 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 281 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 282 0 } 283 284 #include "bpfilter.h" 285 cdev_decl(bpf); 286 /* open, close, read, write, ioctl, select -- XXX should be generic device */ 287 #define cdev_bpf_init(c,n) { \ 288 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 289 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 290 (dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \ 291 (dev_type_map((*))) enodev, 0 } 292 293 struct cdevsw cdevsw[] = 294 { 295 cdev_vc_init(1,vc), /* 0: virtual console */ 296 cdev_tty_init(NRS,rs), /* 1: rs232c */ 297 cdev_ctty_init(1,ctty), /* 2: controlling terminal */ 298 cdev_mm_init(1,mm), /* 3: /dev/{null,mem,kmem,...} */ 299 cdev_disk_init(NSD,sd_c_), /* 4: scsi disk */ 300 cdev_disk_init(NFD,fd_c_), /* 5: floppy disk */ 301 cdev_disk_init(NLP,lp), /* 6: printer */ 302 cdev_swap_init(1,sw), /* 7: /dev/drum (swap pseudo-device) */ 303 cdev_tty_init(NPTY,pts), /* 8: pseudo-tty slave */ 304 cdev_ptc_init(NPTY,ptc), /* 9: pseudo-tty master */ 305 cdev_notdef(), /* 10: md (sony memory disk) */ 306 cdev_kb_init(NKB,kb), /* 11: keyboard */ 307 cdev_ms_init(NMS,ms), /* 12: mouse */ 308 cdev_fd_init(1,fd), /* 13: file descriptor pseudo-dev */ 309 cdev_fb_init(NFB,fb), /* 14: frame buffer */ 310 cdev_vn_init(NVN,vn), /* 15: vnode disk */ 311 cdev_tape_init(NST,st), /* 16: scsi tape */ 312 cdev_kb_init(NLB,lbp), /* 17: lbp */ 313 cdev_ir_init(NIR,ir), /* 18: image reader */ 314 cdev_notdef(), /* 19: vme */ 315 cdev_notdef(), /* 20: gpib */ 316 cdev_notdef(), /* 21: rd */ 317 cdev_tty_init(NBM,cn), /* 22: console display device */ 318 cdev_notdef(), /* 23: ether */ 319 cdev_bpf_init(NBPFILTER,bpf), /* 24: berkeley packet filter */ 320 cdev_notdef(), /* 25 */ 321 cdev_notdef(), /* 26 */ 322 cdev_notdef(), /* 27 */ 323 cdev_notdef(), /* 28: scsi */ 324 cdev_notdef(), /* 29: sony shm */ 325 cdev_notdef(), /* 30: sony semaphoe? */ 326 cdev_notdef(), /* 31: vvcrs */ 327 cdev_notdef(), /* 32: fddi */ 328 cdev_log_init(1,log), /* 33: /dev/klog */ 329 cdev_notdef(), /* 34: image board */ 330 cdev_notdef(), /* 35: sb? */ 331 cdev_notdef(), /* 36: sbe? */ 332 cdev_notdef(), /* 37: vd (safs) */ 333 cdev_notdef(), /* 38: xd (safs) */ 334 cdev_notdef(), /* 39: isdn */ 335 cdev_notdef(), /* 40: rb */ 336 cdev_notdef(), /* 41: gs */ 337 cdev_notdef(), /* 42: rx */ 338 }; 339 340 int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]); 341 342 int mem_no = 2; /* major device number of memory special file */ 343 344 /* 345 * Swapdev is a fake device implemented 346 * in sw.c used only internally to get to swstrategy. 347 * It cannot be provided to the users, because the 348 * swstrategy routine munches the b_dev and b_blkno entries 349 * before calling the appropriate driver. This would horribly 350 * confuse, e.g. the hashing routines. Instead, /dev/drum is 351 * provided as a character (raw) device. 352 */ 353 dev_t swapdev = makedev(1, 0); 354