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