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.1 (Berkeley) 06/04/92 11 */ 12 13 #include "param.h" 14 #include "systm.h" 15 #include "buf.h" 16 #include "ioctl.h" 17 #include "tty.h" 18 #include "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 cdev_decl(cn); 149 150 dev_type_read(mmrw); 151 /* read/write */ 152 #define cdev_mm_init(c,n) { \ 153 (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \ 154 mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \ 155 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 } 156 157 #include "sd.h" 158 #define sd_c_read sdread 159 #define sd_c_write sdwrite 160 #define sd_c_ioctl sdioctl 161 #define sd_c_reset sdreset 162 #define sd_c_strategy sdstrategy 163 #define sd_c_dump sddump 164 #define sd_c_size sdsize 165 cdev_decl(sd_c_); 166 167 #include "fd.h" 168 #define fd_c_read fdread 169 #define fd_c_write fdwrite 170 #define fd_c_ioctl fdioctl 171 #define fd_c_reset fdreset 172 #define fd_c_strategy fdstrategy 173 #define fd_c_dump fddump 174 #define fd_c_size fdsize 175 cdev_decl(fd_c_); 176 177 #include "lp.h" 178 cdev_decl(lp); 179 180 /* read, write, strategy */ 181 #define cdev_swap_init(c,n) { \ 182 (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \ 183 rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 184 (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 185 (dev_type_map((*))) enodev, dev_init(c,n,strategy) } 186 187 #include "pty.h" 188 #define pts_tty pt_tty 189 #define ptsioctl ptyioctl 190 cdev_decl(pts); 191 #define ptc_tty pt_tty 192 #define ptcioctl ptyioctl 193 cdev_decl(ptc); 194 195 /* open, close, read, write, ioctl, tty, select */ 196 #define cdev_ptc_init(c,n) { \ 197 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 198 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 199 (dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \ 200 (dev_type_map((*))) enodev, 0 } 201 202 #include "kb.h" 203 cdev_decl(kb); 204 /* open, close, write, ioctl */ 205 #define cdev_kb_init(c,n) { \ 206 dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \ 207 dev_init(c,n,write), dev_init(c,n,ioctl), \ 208 (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 209 seltrue, (dev_type_map((*))) enodev, \ 210 0 } 211 212 #include "ms.h" 213 #define msmap msmmap 214 cdev_decl(ms); 215 /* open, close, read, write, ioctl, select */ 216 #define cdev_ms_init(c,n) { \ 217 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 218 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 219 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 220 0 } 221 222 #include "fb.h" 223 cdev_decl(fb); 224 /* open, close, ioctl, mmap */ 225 #define cdev_fb_init(c,n) { \ 226 dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \ 227 (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 228 (dev_type_stop((*))) enodev, \ 229 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 } 230 /* 231 (dev_type_reset((*))) nullop, 0, seltrue, dev_init(c,n,map), 0 } 232 */ 233 234 #include "st.h" 235 cdev_decl(st); 236 237 #include "lb.h" 238 cdev_decl(lbp); 239 240 #include "ir.h" 241 cdev_decl(ir); 242 /* open, close, read, ioctl */ 243 #define cdev_ir_init(c,n) { \ 244 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 245 (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 246 (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 247 seltrue, (dev_type_map((*))) enodev, 0 } 248 249 cdev_decl(log); 250 /* open, close, read, ioctl, select -- XXX should be a generic device */ 251 #define cdev_log_init(c,n) { \ 252 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 253 (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 254 (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 255 dev_init(c,n,select), (dev_type_map((*))) enodev, 0 } 256 257 dev_type_open(fdopen); 258 /* open */ 259 #define cdev_fd_init(c,n) { \ 260 dev_init(c,n,open), (dev_type_close((*))) enodev, \ 261 (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 262 (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 263 (dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \ 264 (dev_type_map((*))) enodev, 0 } 265 266 cdev_decl(vn); 267 /* open, read, write, ioctl -- XXX should be a disk */ 268 #define cdev_vn_init(c,n) { \ 269 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 270 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 271 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 272 0 } 273 274 #include "bpfilter.h" 275 cdev_decl(bpf); 276 /* open, close, read, write, ioctl, select -- XXX should be generic device */ 277 #define cdev_bpf_init(c,n) { \ 278 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 279 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 280 (dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \ 281 (dev_type_map((*))) enodev, 0 } 282 283 struct cdevsw cdevsw[] = 284 { 285 cdev_vc_init(1,vc), /* 0: virtual console */ 286 cdev_tty_init(NRS,rs), /* 1: rs232c */ 287 cdev_notdef(), /* 2: sy? */ 288 cdev_mm_init(1,mm), /* 3: /dev/{null,mem,kmem,...} */ 289 cdev_disk_init(NSD,sd_c_), /* 4: scsi disk */ 290 cdev_disk_init(NFD,fd_c_), /* 5: floppy disk */ 291 cdev_disk_init(NLP,lp), /* 6: printer */ 292 cdev_swap_init(1,sw), /* 7: /dev/drum (swap pseudo-device) */ 293 cdev_tty_init(NPTY,pts), /* 8: pseudo-tty slave */ 294 cdev_ptc_init(NPTY,ptc), /* 9: pseudo-tty master */ 295 cdev_notdef(), /* 10: md (sony memory disk) */ 296 cdev_kb_init(NKB,kb), /* 11: keyboard */ 297 cdev_ms_init(NMS,ms), /* 12: mouse */ 298 #ifdef notdef 299 cdev_fd_init(1,fd), /* 13: file descriptor pseudo-dev */ 300 #else 301 cdev_notdef(), /* 13 */ 302 #endif 303 cdev_fb_init(NFB,fb), /* 14: frame buffer */ 304 cdev_vn_init(NVN,vn), /* 15: vnode disk */ 305 cdev_tape_init(NST,st), /* 16: scsi tape */ 306 cdev_kb_init(NLB,lbp), /* 17: lbp */ 307 cdev_ir_init(NIR,ir), /* 18: image reader */ 308 cdev_notdef(), /* 19: vme */ 309 cdev_notdef(), /* 20: gpib */ 310 cdev_notdef(), /* 21: rd */ 311 cdev_tty_init(1,cn), /* 22: console display device*/ 312 cdev_notdef(), /* 23: ether */ 313 cdev_bpf_init(NBPFILTER,bpf), /* 24: berkeley packet filter */ 314 cdev_notdef(), /* 25 */ 315 cdev_notdef(), /* 26 */ 316 cdev_notdef(), /* 27 */ 317 cdev_notdef(), /* 28: scsi */ 318 cdev_notdef(), /* 29: sony shm */ 319 cdev_notdef(), /* 30: sony semaphoe? */ 320 cdev_notdef(), /* 31: vvcrs */ 321 cdev_notdef(), /* 32: fddi */ 322 cdev_log_init(1,log), /* 33: /dev/klog */ 323 cdev_notdef(), /* 34: image board */ 324 cdev_notdef(), /* 35: sb? */ 325 cdev_notdef(), /* 36: sbe? */ 326 cdev_notdef(), /* 37: vd (safs) */ 327 cdev_notdef(), /* 38: xd (safs) */ 328 cdev_notdef(), /* 39: isdn */ 329 cdev_notdef(), /* 40: rb */ 330 cdev_notdef(), /* 41: gs */ 331 cdev_notdef(), /* 42: rx */ 332 }; 333 334 int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]); 335 336 int mem_no = 2; /* major device number of memory special file */ 337 338 /* 339 * Swapdev is a fake device implemented 340 * in sw.c used only internally to get to swstrategy. 341 * It cannot be provided to the users, because the 342 * swstrategy routine munches the b_dev and b_blkno entries 343 * before calling the appropriate driver. This would horribly 344 * confuse, e.g. the hashing routines. Instead, /dev/drum is 345 * provided as a character (raw) device. 346 */ 347 dev_t swapdev = makedev(1, 0); 348