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