1*49610Sdonn /*- 2*49610Sdonn * Copyright (c) 1991 The Regents of the University of California. 341475Smckusick * All rights reserved. 441475Smckusick * 541475Smckusick * %sccs.include.redist.c% 641475Smckusick * 7*49610Sdonn * @(#)conf.c 7.7 (Berkeley) 05/09/91 841475Smckusick */ 941475Smckusick 1045788Sbostic #include "sys/param.h" 1145788Sbostic #include "sys/systm.h" 1245788Sbostic #include "sys/buf.h" 1345788Sbostic #include "sys/ioctl.h" 1445788Sbostic #include "sys/tty.h" 1545788Sbostic #include "sys/conf.h" 1641475Smckusick 17*49610Sdonn int rawread __P((dev_t, struct uio *, int)); 18*49610Sdonn int rawwrite __P((dev_t, struct uio *, int)); 19*49610Sdonn int swstrategy __P((struct buf *)); 20*49610Sdonn int ttselect __P((dev_t, int, struct proc *)); 2141475Smckusick 22*49610Sdonn #define dev_type_open(n) int n __P((dev_t, int, int, struct proc *)) 23*49610Sdonn #define dev_type_close(n) int n __P((dev_t, int, int, struct proc *)) 24*49610Sdonn #define dev_type_strategy(n) int n __P((struct buf *)) 25*49610Sdonn #define dev_type_ioctl(n) \ 26*49610Sdonn int n __P((dev_t, int, caddr_t, int, struct proc *)) 27*49610Sdonn 28*49610Sdonn /* bdevsw-specific types */ 29*49610Sdonn #define dev_type_dump(n) int n __P((dev_t)) 30*49610Sdonn #define dev_type_size(n) int n __P((dev_t)) 31*49610Sdonn 32*49610Sdonn #define dev_decl(n,t) \ 33*49610Sdonn __CONCAT(dev_type_,t)(__CONCAT(n,t)) 34*49610Sdonn #define dev_init(c,n,t) \ 35*49610Sdonn (c > 0 ? __CONCAT(n,t) : (__CONCAT(dev_type_,t)((*))) enxio) 36*49610Sdonn 37*49610Sdonn /* bdevsw-specific initializations */ 38*49610Sdonn #define dev_size_init(c,n) \ 39*49610Sdonn (c > 0 ? __CONCAT(n,size) : 0) 40*49610Sdonn 41*49610Sdonn #define bdev_decl(n) \ 42*49610Sdonn dev_decl(n,open); dev_decl(n,close); dev_decl(n,strategy); \ 43*49610Sdonn dev_decl(n,ioctl); dev_decl(n,dump); dev_decl(n,size) 44*49610Sdonn 45*49610Sdonn #define bdev_disk_init(c,n) \ 46*49610Sdonn { dev_init(c,n,open), (dev_type_close((*))) nullop, \ 47*49610Sdonn dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 48*49610Sdonn dev_init(c,n,dump), dev_size_init(c,n), 0 } 49*49610Sdonn 50*49610Sdonn #define bdev_tape_init(c,n) \ 51*49610Sdonn { dev_init(c,n,open), dev_init(c,n,close), \ 52*49610Sdonn dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 53*49610Sdonn dev_init(c,n,dump), 0, B_TAPE } 54*49610Sdonn 55*49610Sdonn #define bdev_swap_init() \ 56*49610Sdonn { (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 57*49610Sdonn swstrategy, (dev_type_ioctl((*))) enodev, \ 58*49610Sdonn (dev_type_dump((*))) enodev, 0, 0 } 59*49610Sdonn 60*49610Sdonn #define bdev_notdef() bdev_tape_init(0,no) 61*49610Sdonn bdev_decl(no); /* dummy declarations */ 62*49610Sdonn 6341475Smckusick #include "ct.h" 6441475Smckusick #include "rd.h" 6541475Smckusick #include "sd.h" 6641475Smckusick #include "cd.h" 6749328Shibler #include "vn.h" 68*49610Sdonn 69*49610Sdonn bdev_decl(ct); 70*49610Sdonn bdev_decl(rd); 71*49610Sdonn bdev_decl(sd); 72*49610Sdonn bdev_decl(cd); 73*49610Sdonn bdev_decl(vn); 74*49610Sdonn 7541475Smckusick struct bdevsw bdevsw[] = 7641475Smckusick { 77*49610Sdonn bdev_tape_init(NCT,ct), /* 0: cs80 cartridge tape */ 78*49610Sdonn bdev_notdef(), /* 1 */ 79*49610Sdonn bdev_disk_init(NRD,rd), /* 2: hpib disk */ 80*49610Sdonn bdev_swap_init(), /* 3: swap pseudo-device */ 81*49610Sdonn bdev_disk_init(NSD,sd), /* 4: scsi disk */ 82*49610Sdonn bdev_disk_init(NCD,cd), /* 5: concatenated disk driver */ 83*49610Sdonn bdev_disk_init(NVN,vn), /* 6: vnode disk driver (swap to files) */ 8441475Smckusick }; 85*49610Sdonn 8641475Smckusick int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]); 8741475Smckusick 88*49610Sdonn /* cdevsw-specific types */ 89*49610Sdonn #define dev_type_read(n) int n __P((dev_t, struct uio *, int)) 90*49610Sdonn #define dev_type_write(n) int n __P((dev_t, struct uio *, int)) 91*49610Sdonn #define dev_type_stop(n) int n __P((struct tty *, int)) 92*49610Sdonn #define dev_type_reset(n) int n __P((int)) 93*49610Sdonn #define dev_type_select(n) int n __P((dev_t, int, struct proc *)) 94*49610Sdonn #define dev_type_map(n) int n __P(()) 9541475Smckusick 96*49610Sdonn #define cdev_decl(n) \ 97*49610Sdonn dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \ 98*49610Sdonn dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \ 99*49610Sdonn dev_decl(n,reset); dev_decl(n,select); dev_decl(n,map); \ 100*49610Sdonn dev_decl(n,strategy); extern struct tty __CONCAT(n,_tty)[] 10141475Smckusick 102*49610Sdonn #define dev_tty_init(c,n) (c > 0 ? __CONCAT(n,_tty) : 0) 10341475Smckusick 104*49610Sdonn /* open, read, write, ioctl, strategy */ 105*49610Sdonn #define cdev_disk_init(c,n) \ 106*49610Sdonn { dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 107*49610Sdonn dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 108*49610Sdonn (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 109*49610Sdonn dev_init(c,n,strategy) } 110*49610Sdonn 111*49610Sdonn /* open, close, read, write, ioctl, strategy */ 112*49610Sdonn #define cdev_tape_init(c,n) \ 113*49610Sdonn { dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 114*49610Sdonn dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 115*49610Sdonn (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 116*49610Sdonn dev_init(c,n,strategy) } 117*49610Sdonn 118*49610Sdonn /* open, close, read, write, ioctl, stop, tty */ 119*49610Sdonn #define cdev_tty_init(c,n) \ 120*49610Sdonn { dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 121*49610Sdonn dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \ 122*49610Sdonn (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 123*49610Sdonn (dev_type_map((*))) enodev, 0 } 124*49610Sdonn 125*49610Sdonn #define cdev_notdef() \ 126*49610Sdonn { (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 127*49610Sdonn (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 128*49610Sdonn (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 129*49610Sdonn (dev_type_reset((*))) nullop, 0, seltrue, \ 130*49610Sdonn (dev_type_map((*))) enodev, 0 } 131*49610Sdonn 132*49610Sdonn cdev_decl(no); /* dummy declarations */ 133*49610Sdonn 134*49610Sdonn cdev_decl(cn); 135*49610Sdonn /* open, close, read, write, ioctl, select -- XXX should be a tty */ 136*49610Sdonn #define cdev_cn_init(c,n) \ 137*49610Sdonn { dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 138*49610Sdonn dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 139*49610Sdonn (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 140*49610Sdonn (dev_type_map((*))) enodev, 0 } 141*49610Sdonn 142*49610Sdonn cdev_decl(ctty); 143*49610Sdonn /* open, read, write, ioctl, select -- XXX should be a tty */ 144*49610Sdonn #define cdev_ctty_init(c,n) \ 145*49610Sdonn { dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 146*49610Sdonn dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 147*49610Sdonn (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 148*49610Sdonn (dev_type_map((*))) enodev, 0 } 149*49610Sdonn 150*49610Sdonn dev_type_read(mmrw); 151*49610Sdonn /* read/write */ 152*49610Sdonn #define cdev_mm_init(c,n) \ 153*49610Sdonn { (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \ 154*49610Sdonn mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \ 155*49610Sdonn (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 } 156*49610Sdonn 157*49610Sdonn /* read, write, strategy */ 158*49610Sdonn #define cdev_swap_init(c,n) \ 159*49610Sdonn { (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \ 160*49610Sdonn rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 161*49610Sdonn (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 162*49610Sdonn (dev_type_map((*))) enodev, dev_init(c,n,strategy) } 163*49610Sdonn 16441475Smckusick #include "pty.h" 165*49610Sdonn #define pts_tty pt_tty 166*49610Sdonn #define ptsioctl ptyioctl 167*49610Sdonn cdev_decl(pts); 168*49610Sdonn #define ptc_tty pt_tty 169*49610Sdonn #define ptcioctl ptyioctl 170*49610Sdonn cdev_decl(ptc); 17141475Smckusick 172*49610Sdonn /* open, close, read, write, ioctl, tty, select */ 173*49610Sdonn #define cdev_ptc_init(c,n) \ 174*49610Sdonn { dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 175*49610Sdonn dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 176*49610Sdonn (dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \ 177*49610Sdonn (dev_type_map((*))) enodev, 0 } 178*49610Sdonn 179*49610Sdonn cdev_decl(log); 180*49610Sdonn /* open, close, read, ioctl, select -- XXX should be a generic device */ 181*49610Sdonn #define cdev_log_init(c,n) \ 182*49610Sdonn { dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 183*49610Sdonn (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 184*49610Sdonn (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 185*49610Sdonn dev_init(c,n,select), (dev_type_map((*))) enodev, 0 } 186*49610Sdonn 187*49610Sdonn cdev_decl(ct); 188*49610Sdonn cdev_decl(sd); 189*49610Sdonn cdev_decl(rd); 190*49610Sdonn 191*49610Sdonn /* XXX shouldn't this be optional? */ 192*49610Sdonn cdev_decl(grf); 193*49610Sdonn /* open, close, ioctl, select, map -- XXX should be a map device */ 194*49610Sdonn #define cdev_grf_init(c,n) \ 195*49610Sdonn { dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) nullop, \ 196*49610Sdonn (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 197*49610Sdonn (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 198*49610Sdonn dev_init(c,n,select), dev_init(c,n,map), 0 } 199*49610Sdonn 20041475Smckusick #include "ppi.h" 201*49610Sdonn cdev_decl(ppi); 202*49610Sdonn /* open, close, read, write, ioctl -- XXX should be a generic device */ 203*49610Sdonn #define cdev_ppi_init(c,n) \ 204*49610Sdonn { dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 205*49610Sdonn dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 206*49610Sdonn (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 207*49610Sdonn (dev_type_map((*))) enodev, 0 } 20841475Smckusick 209*49610Sdonn #include "dca.h" 210*49610Sdonn cdev_decl(dca); 211*49610Sdonn 21241475Smckusick #include "ite.h" 213*49610Sdonn cdev_decl(ite); 214*49610Sdonn /* open, close, read, write, ioctl, tty -- XXX should be a tty! */ 215*49610Sdonn #define cdev_ite_init(c,n) \ 216*49610Sdonn { dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 217*49610Sdonn dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 218*49610Sdonn (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 219*49610Sdonn (dev_type_map((*))) enodev, 0 } 22041475Smckusick 221*49610Sdonn /* XXX shouldn't this be optional? */ 222*49610Sdonn cdev_decl(hil); 223*49610Sdonn /* open, close, read, ioctl, select, map -- XXX should be a map device */ 224*49610Sdonn #define cdev_hil_init(c,n) \ 225*49610Sdonn { dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 226*49610Sdonn (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 227*49610Sdonn (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 228*49610Sdonn dev_init(c,n,select), dev_init(c,n,map), 0 } 22941475Smckusick 23041475Smckusick #include "dcm.h" 231*49610Sdonn cdev_decl(dcm); 23241475Smckusick 233*49610Sdonn cdev_decl(cd); 234*49610Sdonn 23541475Smckusick #include "clock.h" 236*49610Sdonn cdev_decl(clock); 237*49610Sdonn /* open, close, ioctl, map -- XXX should be a map device */ 238*49610Sdonn #define cdev_clock_init(c,n) \ 239*49610Sdonn { dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) nullop, \ 240*49610Sdonn (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 241*49610Sdonn (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 242*49610Sdonn (dev_type_select((*))) nullop, dev_init(c,n,map), 0 } 24341475Smckusick 244*49610Sdonn cdev_decl(vn); 245*49610Sdonn /* open, read, write, ioctl -- XXX should be a disk */ 246*49610Sdonn #define cdev_vn_init(c,n) \ 247*49610Sdonn { dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 248*49610Sdonn dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 249*49610Sdonn (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 250*49610Sdonn 0 } 25147583Smccanne 252*49610Sdonn dev_type_open(fdopen); 253*49610Sdonn /* open */ 254*49610Sdonn #define cdev_fd_init(c,n) \ 255*49610Sdonn { dev_init(c,n,open), (dev_type_close((*))) enodev, \ 256*49610Sdonn (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 257*49610Sdonn (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 258*49610Sdonn (dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \ 259*49610Sdonn (dev_type_map((*))) enodev, 0 } 26041475Smckusick 261*49610Sdonn #include "bpfilter.h" 262*49610Sdonn cdev_decl(bpf); 263*49610Sdonn /* open, close, read, write, ioctl, select -- XXX should be generic device */ 264*49610Sdonn #define cdev_bpf_init(c,n) \ 265*49610Sdonn { dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 266*49610Sdonn dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 267*49610Sdonn (dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \ 268*49610Sdonn (dev_type_map((*))) enodev, 0 } 26947581Skarels 27041475Smckusick struct cdevsw cdevsw[] = 27141475Smckusick { 272*49610Sdonn cdev_cn_init(1,cn), /* 0: virtual console */ 273*49610Sdonn cdev_ctty_init(1,ctty), /* 1: controlling terminal */ 274*49610Sdonn cdev_mm_init(1,mm), /* 2: /dev/{null,mem,kmem,...} */ 275*49610Sdonn cdev_swap_init(1,sw), /* 3: /dev/drum (swap pseudo-device) */ 276*49610Sdonn cdev_tty_init(NPTY,pts), /* 4: pseudo-tty slave */ 277*49610Sdonn cdev_ptc_init(NPTY,ptc), /* 5: pseudo-tty master */ 278*49610Sdonn cdev_log_init(1,log), /* 6: /dev/klog */ 279*49610Sdonn cdev_tape_init(NCT,ct), /* 7: cs80 cartridge tape */ 280*49610Sdonn cdev_disk_init(NSD,sd), /* 8: scsi disk */ 281*49610Sdonn cdev_disk_init(NSD,rd), /* 9: hpib disk */ 282*49610Sdonn cdev_grf_init(1,grf), /* 10: frame buffer */ 283*49610Sdonn cdev_ppi_init(NPPI,ppi), /* 11: printer/plotter interface */ 284*49610Sdonn cdev_tty_init(NDCA,dca), /* 12: built-in single-port serial */ 285*49610Sdonn cdev_ite_init(NITE,ite), /* 13: console terminal emulator */ 286*49610Sdonn cdev_hil_init(1,hil), /* 14: human interface loop */ 287*49610Sdonn cdev_tty_init(NDCM,dcm), /* 15: 4-port serial */ 288*49610Sdonn cdev_notdef(), /* 16 */ 289*49610Sdonn cdev_disk_init(NCD,cd), /* 17: concatenated disk */ 290*49610Sdonn cdev_clock_init(NCLOCK,clock), /* 18: mapped clock */ 291*49610Sdonn cdev_vn_init(NVN,vn), /* 19: vnode disk */ 292*49610Sdonn cdev_notdef(), /* 20 */ 293*49610Sdonn cdev_fd_init(1,fd), /* 21: file descriptor pseudo-dev */ 294*49610Sdonn cdev_bpf_init(NBPFILTER,bpf), /* 22: berkeley packet filter */ 29541475Smckusick }; 296*49610Sdonn 29741475Smckusick int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]); 29841475Smckusick 29941475Smckusick int mem_no = 2; /* major device number of memory special file */ 30041475Smckusick 30141475Smckusick /* 30241475Smckusick * Swapdev is a fake device implemented 30341475Smckusick * in sw.c used only internally to get to swstrategy. 30441475Smckusick * It cannot be provided to the users, because the 30541475Smckusick * swstrategy routine munches the b_dev and b_blkno entries 30641475Smckusick * before calling the appropriate driver. This would horribly 30741475Smckusick * confuse, e.g. the hashing routines. Instead, /dev/drum is 30841475Smckusick * provided as a character (raw) device. 30941475Smckusick */ 31041475Smckusick dev_t swapdev = makedev(3, 0); 311