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 * Ralph Campbell. 7 * 8 * %sccs.include.redist.c% 9 * 10 * @(#)conf.c 7.3 (Berkeley) 03/07/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 "rz.h" 65 #include "vn.h" 66 67 bdev_decl(rz); 68 bdev_decl(vn); 69 70 struct bdevsw bdevsw[] = 71 { 72 bdev_disk_init(NRZ,rz), /* 0: SCSI disk */ 73 bdev_swap_init(), /* 1: swap pseudo-device */ 74 bdev_disk_init(NVN,vn), /* 2: vnode disk driver (swap to files) */ 75 }; 76 77 int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]); 78 79 /* cdevsw-specific types */ 80 #define dev_type_read(n) int n __P((dev_t, struct uio *, int)) 81 #define dev_type_write(n) int n __P((dev_t, struct uio *, int)) 82 #define dev_type_stop(n) int n __P((struct tty *, int)) 83 #define dev_type_reset(n) int n __P((int)) 84 #define dev_type_select(n) int n __P((dev_t, int, struct proc *)) 85 #define dev_type_map(n) int n __P(()) 86 87 #define cdev_decl(n) \ 88 dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \ 89 dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \ 90 dev_decl(n,reset); dev_decl(n,select); dev_decl(n,map); \ 91 dev_decl(n,strategy); extern struct tty __CONCAT(n,_tty)[] 92 93 #define dev_tty_init(c,n) (c > 0 ? __CONCAT(n,_tty) : 0) 94 95 /* open, read, write, ioctl, strategy */ 96 #define cdev_disk_init(c,n) { \ 97 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 98 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 99 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 100 dev_init(c,n,strategy) } 101 102 /* open, close, read, write, ioctl, strategy */ 103 #define cdev_tape_init(c,n) { \ 104 dev_init(c,n,open), dev_init(c,n,close), rawread, \ 105 rawwrite, 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, stop, tty */ 110 #define cdev_tty_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_init(c,n,stop), \ 113 (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 114 (dev_type_map((*))) enodev, 0 } 115 116 #define cdev_notdef() { \ 117 (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 118 (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 119 (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 120 (dev_type_reset((*))) nullop, 0, seltrue, \ 121 (dev_type_map((*))) enodev, 0 } 122 123 cdev_decl(no); /* dummy declarations */ 124 125 cdev_decl(dc); 126 /* open, close, read, write, ioctl, select -- XXX should be a tty */ 127 #define cdev_dc_init(c,n) { \ 128 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 129 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 130 (dev_type_reset((*))) nullop, 0, ttselect, \ 131 (dev_type_map((*))) enodev, 0 } 132 133 cdev_decl(ctty); 134 /* open, read, write, ioctl, select -- XXX should be a tty */ 135 #define cdev_ctty_init(c,n) { \ 136 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 137 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 138 (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 139 (dev_type_map((*))) enodev, 0 } 140 141 dev_type_read(mmrw); 142 /* read/write */ 143 #define cdev_mm_init(c,n) { \ 144 (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \ 145 mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \ 146 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 } 147 148 /* read, write, strategy */ 149 #define cdev_swap_init(c,n) { \ 150 (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \ 151 rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 152 (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 153 (dev_type_map((*))) enodev, dev_init(c,n,strategy) } 154 155 #include "pty.h" 156 #define pts_tty pt_tty 157 #define ptsioctl ptyioctl 158 cdev_decl(pts); 159 #define ptc_tty pt_tty 160 #define ptcioctl ptyioctl 161 cdev_decl(ptc); 162 163 /* open, close, read, write, ioctl, tty, select */ 164 #define cdev_ptc_init(c,n) { \ 165 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 166 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 167 (dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \ 168 (dev_type_map((*))) enodev, 0 } 169 170 cdev_decl(log); 171 /* open, close, read, ioctl, select -- XXX should be a generic device */ 172 #define cdev_log_init(c,n) { \ 173 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 174 (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 175 (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 176 dev_init(c,n,select), (dev_type_map((*))) enodev, 0 } 177 178 dev_type_open(fdopen); 179 /* open */ 180 #define cdev_fd_init(c,n) { \ 181 dev_init(c,n,open), (dev_type_close((*))) enodev, \ 182 (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 183 (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 184 (dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \ 185 (dev_type_map((*))) enodev, 0 } 186 187 #include "pm.h" 188 cdev_decl(pm); 189 #define cdev_pm_init(c,n) { \ 190 dev_init(c,n,open), dev_init(c,n,close), \ 191 (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 192 dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 193 (dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \ 194 (dev_type_map((*))) enodev, 0 } 195 196 cdev_decl(rz); 197 198 #include "tz.h" 199 cdev_decl(tz); 200 201 cdev_decl(vn); 202 /* open, read, write, ioctl -- XXX should be a disk */ 203 #define cdev_vn_init(c,n) { \ 204 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 205 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 206 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 207 0 } 208 209 #include "bpfilter.h" 210 cdev_decl(bpf); 211 /* open, close, read, write, ioctl, select -- XXX should be generic device */ 212 #define cdev_bpf_init(c,n) { \ 213 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 214 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 215 (dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \ 216 (dev_type_map((*))) enodev, 0 } 217 218 #include "cfb.h" 219 cdev_decl(cfb); 220 221 struct cdevsw cdevsw[] = 222 { 223 cdev_dc_init(1,dc), /* 0: virtual console */ 224 cdev_ctty_init(1,ctty), /* 1: controlling terminal */ 225 cdev_mm_init(1,mm), /* 2: /dev/{null,mem,kmem,...} */ 226 cdev_swap_init(1,sw), /* 3: /dev/drum (swap pseudo-device) */ 227 cdev_tty_init(NPTY,pts), /* 4: pseudo-tty slave */ 228 cdev_ptc_init(NPTY,ptc), /* 5: pseudo-tty master */ 229 cdev_log_init(1,log), /* 6: /dev/klog */ 230 cdev_fd_init(1,fd), /* 7: file descriptor pseudo-dev */ 231 cdev_pm_init(NPM,pm), /* 8: frame buffer */ 232 cdev_disk_init(NRZ,rz), /* 9: SCSI disk */ 233 cdev_tape_init(NTZ,tz), /* 10: SCSI tape */ 234 cdev_vn_init(NVN,vn), /* 11: vnode disk */ 235 cdev_bpf_init(NBPFILTER,bpf), /* 12: berkeley packet filter */ 236 cdev_pm_init(NCFB,cfb), /* 13: color frame buffer */ 237 }; 238 239 int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]); 240 241 int mem_no = 2; /* major device number of memory special file */ 242 243 /* 244 * Swapdev is a fake device implemented 245 * in sw.c used only internally to get to swstrategy. 246 * It cannot be provided to the users, because the 247 * swstrategy routine munches the b_dev and b_blkno entries 248 * before calling the appropriate driver. This would horribly 249 * confuse, e.g. the hashing routines. Instead, /dev/drum is 250 * provided as a character (raw) device. 251 */ 252 dev_t swapdev = makedev(1, 0); 253