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