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