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.13 (Berkeley) 7/9/92 9 * 10 * @(#)conf.c 7.7 (Berkeley) 12/26/92 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 #define bdev_disk_init(c,n) { \ 48 dev_init(c,n,open), (dev_type_close((*))) nullop, \ 49 dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 50 dev_init(c,n,dump), dev_size_init(c,n), 0 } 51 52 #define bdev_tape_init(c,n) { \ 53 dev_init(c,n,open), dev_init(c,n,close), \ 54 dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 55 dev_init(c,n,dump), 0, B_TAPE } 56 57 #define bdev_swap_init() { \ 58 (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 59 swstrategy, (dev_type_ioctl((*))) enodev, \ 60 (dev_type_dump((*))) enodev, 0, 0 } 61 62 #define bdev_notdef() bdev_tape_init(0,no) 63 64 bdev_decl(no); /* dummy declarations */ 65 66 #include "st.h" 67 #include "sd.h" 68 #include "vn.h" 69 70 bdev_decl(st); 71 bdev_decl(sd); 72 bdev_decl(vn); 73 74 struct bdevsw bdevsw[] = 75 { 76 bdev_notdef(), /* 0 */ 77 bdev_notdef(), /* 1 */ 78 bdev_notdef(), /* 2: ram disk */ 79 bdev_swap_init(), /* 3: swap pseudo-device */ 80 bdev_disk_init(NSD,sd), /* 4: scsi disk */ 81 bdev_notdef(), /* 5 */ 82 bdev_disk_init(NVN,vn), /* 6: vnode disk driver (swap to files) */ 83 bdev_tape_init(NST,st), /* 7: scsi tape */ 84 }; 85 86 int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]); 87 88 /* cdevsw-specific types */ 89 #define dev_type_read(n) int n __P((dev_t, struct uio *, int)) 90 #define dev_type_write(n) int n __P((dev_t, struct uio *, int)) 91 #define dev_type_stop(n) int n __P((struct tty *, int)) 92 #define dev_type_reset(n) int n __P((int)) 93 #define dev_type_select(n) int n __P((dev_t, int, struct proc *)) 94 #define dev_type_map(n) int n __P(()) 95 96 #define cdev_decl(n) \ 97 dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \ 98 dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \ 99 dev_decl(n,reset); dev_decl(n,select); dev_decl(n,map); \ 100 dev_decl(n,strategy); extern struct tty __CONCAT(n,_tty)[] 101 102 #define dev_tty_init(c,n) (c > 0 ? __CONCAT(n,_tty) : 0) 103 104 /* open, read, write, ioctl, strategy */ 105 #define cdev_disk_init(c,n) { \ 106 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 107 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 108 (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 109 dev_init(c,n,strategy) } 110 111 /* open, close, read, write, ioctl, strategy */ 112 #define cdev_tape_init(c,n) { \ 113 dev_init(c,n,open), dev_init(c,n,close), 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, stop, tty */ 119 #define cdev_tty_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_init(c,n,stop), \ 122 (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 123 (dev_type_map((*))) enodev, 0 } 124 125 #define cdev_notdef() { \ 126 (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 127 (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 128 (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 129 (dev_type_reset((*))) nullop, 0, seltrue, \ 130 (dev_type_map((*))) enodev, 0 } 131 132 cdev_decl(no); /* dummy declarations */ 133 134 cdev_decl(cn); 135 /* open, close, read, write, ioctl, select -- XXX should be a tty */ 136 #define cdev_cn_init(c,n) { \ 137 dev_init(c,n,open), dev_init(c,n,close), 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 cdev_decl(ctty); 143 /* open, read, write, ioctl, select -- XXX should be a tty */ 144 #define cdev_ctty_init(c,n) { \ 145 dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 146 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 147 (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 148 (dev_type_map((*))) enodev, 0 } 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 /* read, write, strategy */ 158 #define cdev_swap_init(c,n) { \ 159 (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \ 160 rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 161 (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 162 (dev_type_map((*))) enodev, dev_init(c,n,strategy) } 163 164 #include "pty.h" 165 #define pts_tty pt_tty 166 #define ptsioctl ptyioctl 167 cdev_decl(pts); 168 #define ptc_tty pt_tty 169 #define ptcioctl ptyioctl 170 cdev_decl(ptc); 171 172 /* open, close, read, write, ioctl, tty, select */ 173 #define cdev_ptc_init(c,n) { \ 174 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 175 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 176 (dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \ 177 (dev_type_map((*))) enodev, 0 } 178 179 cdev_decl(log); 180 /* open, close, read, ioctl, select -- XXX should be a generic device */ 181 #define cdev_log_init(c,n) { \ 182 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 183 (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 184 (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 185 dev_init(c,n,select), (dev_type_map((*))) enodev, 0 } 186 187 cdev_decl(st); 188 cdev_decl(sd); 189 190 cdev_decl(fb); 191 /* open, close, ioctl, mmap */ 192 #define cdev_fb_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 "sio.h" 199 cdev_decl(sio); 200 201 #include "bmc.h" 202 cdev_decl(bmc); 203 204 cdev_decl(kbd); 205 /* open, close, read, ioctl, select, map -- XXX should be a map device */ 206 #define cdev_kbd_init(c,n) { \ 207 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 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_type_map((*))) nullop, 0 } 211 212 cdev_decl(cd); 213 214 cdev_decl(vn); 215 /* open, read, write, ioctl -- XXX should be a disk */ 216 #define cdev_vn_init(c,n) { \ 217 dev_init(c,n,open), (dev_type_close((*))) nullop, 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 dev_type_open(fdopen); 223 /* open */ 224 #define cdev_fd_init(c,n) { \ 225 dev_init(c,n,open), (dev_type_close((*))) enodev, \ 226 (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 227 (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 228 (dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \ 229 (dev_type_map((*))) enodev, 0 } 230 231 #include "bpfilter.h" 232 cdev_decl(bpf); 233 /* open, close, read, write, ioctl, select -- XXX should be generic device */ 234 #define cdev_bpf_init(c,n) { \ 235 dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 236 dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 237 (dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \ 238 (dev_type_map((*))) enodev, 0 } 239 240 struct cdevsw cdevsw[] = 241 { 242 cdev_cn_init(1,cn), /* 0: virtual console */ 243 cdev_ctty_init(1,ctty), /* 1: controlling terminal */ 244 cdev_mm_init(1,mm), /* 2: /dev/{null,mem,kmem,...} */ 245 cdev_swap_init(1,sw), /* 3: /dev/drum (swap pseudo-device) */ 246 cdev_tty_init(NPTY,pts), /* 4: pseudo-tty slave */ 247 cdev_ptc_init(NPTY,ptc), /* 5: pseudo-tty master */ 248 cdev_log_init(1,log), /* 6: /dev/klog */ 249 cdev_notdef(), /* 7 */ 250 cdev_disk_init(NSD,sd), /* 8: scsi disk */ 251 cdev_notdef(), /* 9 */ 252 cdev_fb_init(1,fb), /* 10: frame buffer */ 253 cdev_notdef(), /* 11 */ 254 cdev_tty_init(NSIO,sio), /* 12: built-in single-port serial */ 255 cdev_tty_init(NBMC,bmc), /* 13: console terminal emulator */ 256 cdev_kbd_init(2,kbd), /* 14: kyeboard */ 257 cdev_notdef(), /* 15 */ 258 cdev_notdef(), /* 16 */ 259 cdev_notdef(), /* 17 */ 260 cdev_notdef(), /* 18 */ 261 cdev_vn_init(NVN,vn), /* 19: vnode disk */ 262 cdev_tape_init(NST,st), /* 20: scsi tape */ 263 cdev_fd_init(1,fd), /* 21: file descriptor pseudo-dev */ 264 cdev_bpf_init(NBPFILTER,bpf), /* 22: berkeley packet filter */ 265 }; 266 267 int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]); 268 269 int mem_no = 2; /* major device number of memory special file */ 270 271 /* 272 * Swapdev is a fake device implemented 273 * in sw.c used only internally to get to swstrategy. 274 * It cannot be provided to the users, because the 275 * swstrategy routine munches the b_dev and b_blkno entries 276 * before calling the appropriate driver. This would horribly 277 * confuse, e.g. the hashing routines. Instead, /dev/drum is 278 * provided as a character (raw) device. 279 */ 280 dev_t swapdev = makedev(3, 0); 281