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.7 (Berkeley) 04/05/93 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 "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 /* open, close, read, write, ioctl, select -- XXX should be a tty */ 117 #define cdev_cn_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_type_stop((*))) nullop, \ 120 (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 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); /* console interface */ 133 134 cdev_decl(ctty); 135 /* open, read, write, ioctl, select -- XXX should be a tty */ 136 #define cdev_ctty_init(c,n) { \ 137 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 138 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 139 (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 140 (dev_type_map((*))) enodev, 0 } 141 142 dev_type_read(mmrw); 143 /* read/write */ 144 #define cdev_mm_init(c,n) { \ 145 (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \ 146 mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \ 147 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 } 148 149 /* read, write, strategy */ 150 #define cdev_swap_init(c,n) { \ 151 (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \ 152 rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 153 (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 154 (dev_type_map((*))) enodev, dev_init(c,n,strategy) } 155 156 #include "pty.h" 157 #define pts_tty pt_tty 158 #define ptsioctl ptyioctl 159 cdev_decl(pts); 160 #define ptc_tty pt_tty 161 #define ptcioctl ptyioctl 162 cdev_decl(ptc); 163 164 /* open, close, read, write, ioctl, tty, select */ 165 #define cdev_ptc_init(c,n) { \ 166 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 167 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 168 (dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \ 169 (dev_type_map((*))) enodev, 0 } 170 171 cdev_decl(log); 172 /* open, close, read, ioctl, select -- XXX should be a generic device */ 173 #define cdev_log_init(c,n) { \ 174 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 175 (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 176 (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 177 dev_init(c,n,select), (dev_type_map((*))) enodev, 0 } 178 179 dev_type_open(fdopen); 180 /* open */ 181 #define cdev_fd_init(c,n) { \ 182 dev_init(c,n,open), (dev_type_close((*))) enodev, \ 183 (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 184 (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 185 (dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \ 186 (dev_type_map((*))) enodev, 0 } 187 188 #include "pm.h" 189 cdev_decl(pm); 190 #define cdev_pm_init(c,n) { \ 191 dev_init(c,n,open), dev_init(c,n,close), \ 192 (dev_type_read((*))) nullop, (dev_type_write((*))) nullop, \ 193 dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 194 (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 195 dev_init(c,n,map), 0 } 196 197 cdev_decl(rz); 198 199 #include "tz.h" 200 cdev_decl(tz); 201 202 cdev_decl(vn); 203 /* open, read, write, ioctl -- XXX should be a disk */ 204 #define cdev_vn_init(c,n) { \ 205 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 206 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 207 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 208 0 } 209 210 #include "bpfilter.h" 211 cdev_decl(bpf); 212 /* open, close, read, write, ioctl, select -- XXX should be generic device */ 213 #define cdev_bpf_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((*))) enodev, 0, dev_init(c,n,select), \ 217 (dev_type_map((*))) enodev, 0 } 218 219 #include "cfb.h" 220 cdev_decl(cfb); 221 222 #include "xcfb.h" 223 cdev_decl(xcfb); 224 225 #include "mfb.h" 226 cdev_decl(mfb); 227 228 #include "dtop.h" 229 cdev_decl(dtop); 230 231 #include "scc.h" 232 cdev_decl(scc); 233 234 #include "dc.h" 235 cdev_decl(dc); 236 237 struct cdevsw cdevsw[] = 238 { 239 cdev_cn_init(1,cn), /* 0: virtual console */ 240 cdev_ctty_init(1,ctty), /* 1: controlling terminal */ 241 cdev_mm_init(1,mm), /* 2: /dev/{null,mem,kmem,...} */ 242 cdev_swap_init(1,sw), /* 3: /dev/drum (swap pseudo-device) */ 243 cdev_tty_init(NPTY,pts), /* 4: pseudo-tty slave */ 244 cdev_ptc_init(NPTY,ptc), /* 5: pseudo-tty master */ 245 cdev_log_init(1,log), /* 6: /dev/klog */ 246 cdev_fd_init(1,fd), /* 7: file descriptor pseudo-dev */ 247 cdev_pm_init(NPM,pm), /* 8: frame buffer */ 248 cdev_disk_init(NRZ,rz), /* 9: SCSI disk */ 249 cdev_tape_init(NTZ,tz), /* 10: SCSI tape */ 250 cdev_vn_init(NVN,vn), /* 11: vnode disk */ 251 cdev_bpf_init(NBPFILTER,bpf), /* 12: berkeley packet filter */ 252 cdev_pm_init(NCFB,cfb), /* 13: color frame buffer */ 253 cdev_pm_init(NXCFB,xcfb), /* 14: maxine color frame buffer */ 254 cdev_tty_init(NDTOP,dtop), /* 15: desktop bus interface */ 255 cdev_tty_init(NDC,dc), /* 16: dc7085 serial interface */ 256 cdev_tty_init(NSCC,scc), /* 17: scc 82530 serial interface */ 257 cdev_pm_init(NMFB,mfb), /* 18: mono frame buffer */ 258 }; 259 260 int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]); 261 262 int mem_no = 2; /* major device number of memory special file */ 263 264 /* 265 * Swapdev is a fake device implemented 266 * in sw.c used only internally to get to swstrategy. 267 * It cannot be provided to the users, because the 268 * swstrategy routine munches the b_dev and b_blkno entries 269 * before calling the appropriate driver. This would horribly 270 * confuse, e.g. the hashing routines. Instead, /dev/drum is 271 * provided as a character (raw) device. 272 */ 273 dev_t swapdev = makedev(1, 0); 274