149610Sdonn /*- 249610Sdonn * Copyright (c) 1991 The Regents of the University of California. 341475Smckusick * All rights reserved. 441475Smckusick * 541475Smckusick * %sccs.include.redist.c% 641475Smckusick * 7*52773Smckusick * @(#)conf.c 7.11 (Berkeley) 03/01/92 841475Smckusick */ 941475Smckusick 1045788Sbostic #include "sys/param.h" 1145788Sbostic #include "sys/systm.h" 1245788Sbostic #include "sys/buf.h" 1345788Sbostic #include "sys/ioctl.h" 1452520Smckusick #include "sys/proc.h" 1545788Sbostic #include "sys/tty.h" 1645788Sbostic #include "sys/conf.h" 1741475Smckusick 1849623Skarels int rawread __P((dev_t, struct uio *, int)); 1949623Skarels int rawwrite __P((dev_t, struct uio *, int)); 2049623Skarels int swstrategy __P((struct buf *)); 2149623Skarels int ttselect __P((dev_t, int, struct proc *)); 2241475Smckusick 2349623Skarels #define dev_type_open(n) int n __P((dev_t, int, int, struct proc *)) 2449623Skarels #define dev_type_close(n) int n __P((dev_t, int, int, struct proc *)) 2549623Skarels #define dev_type_strategy(n) int n __P((struct buf *)) 2649623Skarels #define dev_type_ioctl(n) \ 2749623Skarels int n __P((dev_t, int, caddr_t, int, struct proc *)) 2849610Sdonn 2949610Sdonn /* bdevsw-specific types */ 3052520Smckusick #define dev_type_dump(n) int n __P(()) 3149623Skarels #define dev_type_size(n) int n __P((dev_t)) 3249610Sdonn 3349623Skarels #define dev_decl(n,t) __CONCAT(dev_type_,t)(__CONCAT(n,t)) 3449610Sdonn #define dev_init(c,n,t) \ 3549623Skarels (c > 0 ? __CONCAT(n,t) : (__CONCAT(dev_type_,t)((*))) enxio) 3649610Sdonn 3749610Sdonn /* bdevsw-specific initializations */ 3849623Skarels #define dev_size_init(c,n) (c > 0 ? __CONCAT(n,size) : 0) 3949610Sdonn 4049623Skarels #define bdev_decl(n) \ 4149623Skarels dev_decl(n,open); dev_decl(n,close); dev_decl(n,strategy); \ 4249623Skarels dev_decl(n,ioctl); dev_decl(n,dump); dev_decl(n,size) 4349610Sdonn 4449623Skarels #define bdev_disk_init(c,n) { \ 4549623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, \ 4649623Skarels dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 4749623Skarels dev_init(c,n,dump), dev_size_init(c,n), 0 } 4849610Sdonn 4949623Skarels #define bdev_tape_init(c,n) { \ 5049623Skarels dev_init(c,n,open), dev_init(c,n,close), \ 5149623Skarels dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 5249623Skarels dev_init(c,n,dump), 0, B_TAPE } 5349610Sdonn 5449623Skarels #define bdev_swap_init() { \ 5549623Skarels (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 5649623Skarels swstrategy, (dev_type_ioctl((*))) enodev, \ 5749623Skarels (dev_type_dump((*))) enodev, 0, 0 } 5849610Sdonn 5949623Skarels #define bdev_notdef() bdev_tape_init(0,no) 6049610Sdonn bdev_decl(no); /* dummy declarations */ 6149610Sdonn 6241475Smckusick #include "ct.h" 6349912Smckusick #include "st.h" 6441475Smckusick #include "rd.h" 6541475Smckusick #include "sd.h" 6641475Smckusick #include "cd.h" 6749328Shibler #include "vn.h" 6849610Sdonn 6949610Sdonn bdev_decl(ct); 7049912Smckusick bdev_decl(st); 7149610Sdonn bdev_decl(rd); 7249610Sdonn bdev_decl(sd); 7349610Sdonn bdev_decl(cd); 7449610Sdonn bdev_decl(vn); 7549610Sdonn 7641475Smckusick struct bdevsw bdevsw[] = 7741475Smckusick { 7849610Sdonn bdev_tape_init(NCT,ct), /* 0: cs80 cartridge tape */ 7949610Sdonn bdev_notdef(), /* 1 */ 8049610Sdonn bdev_disk_init(NRD,rd), /* 2: hpib disk */ 8149610Sdonn bdev_swap_init(), /* 3: swap pseudo-device */ 8249610Sdonn bdev_disk_init(NSD,sd), /* 4: scsi disk */ 8349610Sdonn bdev_disk_init(NCD,cd), /* 5: concatenated disk driver */ 8449610Sdonn bdev_disk_init(NVN,vn), /* 6: vnode disk driver (swap to files) */ 8549912Smckusick bdev_tape_init(NST,st), /* 7: exabyte tape */ 8641475Smckusick }; 8749610Sdonn 8841475Smckusick int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]); 8941475Smckusick 9049610Sdonn /* cdevsw-specific types */ 9149623Skarels #define dev_type_read(n) int n __P((dev_t, struct uio *, int)) 9249623Skarels #define dev_type_write(n) int n __P((dev_t, struct uio *, int)) 9349623Skarels #define dev_type_stop(n) int n __P((struct tty *, int)) 9449623Skarels #define dev_type_reset(n) int n __P((int)) 9549610Sdonn #define dev_type_select(n) int n __P((dev_t, int, struct proc *)) 9649610Sdonn #define dev_type_map(n) int n __P(()) 9741475Smckusick 9849623Skarels #define cdev_decl(n) \ 9949623Skarels dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \ 10049623Skarels dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \ 10149623Skarels dev_decl(n,reset); dev_decl(n,select); dev_decl(n,map); \ 10249623Skarels dev_decl(n,strategy); extern struct tty __CONCAT(n,_tty)[] 10341475Smckusick 10449610Sdonn #define dev_tty_init(c,n) (c > 0 ? __CONCAT(n,_tty) : 0) 10541475Smckusick 10649610Sdonn /* open, read, write, ioctl, strategy */ 10749623Skarels #define cdev_disk_init(c,n) { \ 10849623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 10949623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 11049623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 11149623Skarels dev_init(c,n,strategy) } 11249610Sdonn 11349610Sdonn /* open, close, read, write, ioctl, strategy */ 11449623Skarels #define cdev_tape_init(c,n) { \ 11549623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 11649623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 11749623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 11849623Skarels dev_init(c,n,strategy) } 11949610Sdonn 12049610Sdonn /* open, close, read, write, ioctl, stop, tty */ 12149623Skarels #define cdev_tty_init(c,n) { \ 12249623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 12349623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \ 12449623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 12549623Skarels (dev_type_map((*))) enodev, 0 } 12649610Sdonn 12749623Skarels #define cdev_notdef() { \ 12849623Skarels (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 12949623Skarels (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 13049623Skarels (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 13149623Skarels (dev_type_reset((*))) nullop, 0, seltrue, \ 13249623Skarels (dev_type_map((*))) enodev, 0 } 13349610Sdonn 13449610Sdonn cdev_decl(no); /* dummy declarations */ 13549610Sdonn 13649610Sdonn cdev_decl(cn); 13749610Sdonn /* open, close, read, write, ioctl, select -- XXX should be a tty */ 13849623Skarels #define cdev_cn_init(c,n) { \ 13949623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 14049623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 14149623Skarels (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 14249623Skarels (dev_type_map((*))) enodev, 0 } 14349610Sdonn 14449610Sdonn cdev_decl(ctty); 14549610Sdonn /* open, read, write, ioctl, select -- XXX should be a tty */ 14649623Skarels #define cdev_ctty_init(c,n) { \ 14749623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 14849623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 14949623Skarels (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 15049623Skarels (dev_type_map((*))) enodev, 0 } 15149610Sdonn 15249610Sdonn dev_type_read(mmrw); 15349610Sdonn /* read/write */ 15449623Skarels #define cdev_mm_init(c,n) { \ 15549623Skarels (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \ 15649623Skarels mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \ 15749623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 } 15849610Sdonn 15949610Sdonn /* read, write, strategy */ 16049623Skarels #define cdev_swap_init(c,n) { \ 16149623Skarels (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \ 16249623Skarels rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 16349623Skarels (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 16449623Skarels (dev_type_map((*))) enodev, dev_init(c,n,strategy) } 16549610Sdonn 16641475Smckusick #include "pty.h" 16749610Sdonn #define pts_tty pt_tty 16849610Sdonn #define ptsioctl ptyioctl 16949610Sdonn cdev_decl(pts); 17049610Sdonn #define ptc_tty pt_tty 17149610Sdonn #define ptcioctl ptyioctl 17249610Sdonn cdev_decl(ptc); 17341475Smckusick 17449610Sdonn /* open, close, read, write, ioctl, tty, select */ 17549623Skarels #define cdev_ptc_init(c,n) { \ 17649623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 17749623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 17849623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \ 17949623Skarels (dev_type_map((*))) enodev, 0 } 18049610Sdonn 18149610Sdonn cdev_decl(log); 18249610Sdonn /* open, close, read, ioctl, select -- XXX should be a generic device */ 18349623Skarels #define cdev_log_init(c,n) { \ 18449623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 18549623Skarels (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 18649623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 18749623Skarels dev_init(c,n,select), (dev_type_map((*))) enodev, 0 } 18849610Sdonn 18949610Sdonn cdev_decl(ct); 19049912Smckusick cdev_decl(st); 19149610Sdonn cdev_decl(sd); 19249610Sdonn cdev_decl(rd); 19349610Sdonn 19449610Sdonn /* XXX shouldn't this be optional? */ 19549610Sdonn cdev_decl(grf); 19649610Sdonn /* open, close, ioctl, select, map -- XXX should be a map device */ 19749623Skarels #define cdev_grf_init(c,n) { \ 19849623Skarels dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) nullop, \ 19949623Skarels (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 20049623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 20149623Skarels dev_init(c,n,select), dev_init(c,n,map), 0 } 20249610Sdonn 20341475Smckusick #include "ppi.h" 20449610Sdonn cdev_decl(ppi); 20549610Sdonn /* open, close, read, write, ioctl -- XXX should be a generic device */ 20649623Skarels #define cdev_ppi_init(c,n) { \ 20749623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 20849623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 20949623Skarels (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 21049623Skarels (dev_type_map((*))) enodev, 0 } 21141475Smckusick 21249610Sdonn #include "dca.h" 21349610Sdonn cdev_decl(dca); 21449610Sdonn 21541475Smckusick #include "ite.h" 21649610Sdonn cdev_decl(ite); 21749610Sdonn /* open, close, read, write, ioctl, tty -- XXX should be a tty! */ 21849623Skarels #define cdev_ite_init(c,n) { \ 21949623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 22049623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 22149623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 22249623Skarels (dev_type_map((*))) enodev, 0 } 22341475Smckusick 22449610Sdonn /* XXX shouldn't this be optional? */ 22549610Sdonn cdev_decl(hil); 22649610Sdonn /* open, close, read, ioctl, select, map -- XXX should be a map device */ 22749623Skarels #define cdev_hil_init(c,n) { \ 22849623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 22949623Skarels (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 23049623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 23149623Skarels dev_init(c,n,select), dev_init(c,n,map), 0 } 23241475Smckusick 23341475Smckusick #include "dcm.h" 23449610Sdonn cdev_decl(dcm); 23541475Smckusick 23649610Sdonn cdev_decl(cd); 23749610Sdonn 23841475Smckusick #include "clock.h" 23949610Sdonn cdev_decl(clock); 24049610Sdonn /* open, close, ioctl, map -- XXX should be a map device */ 24149623Skarels #define cdev_clock_init(c,n) { \ 24249623Skarels dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) nullop, \ 24349623Skarels (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 24449623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 24549623Skarels (dev_type_select((*))) nullop, dev_init(c,n,map), 0 } 24641475Smckusick 24749610Sdonn cdev_decl(vn); 24849610Sdonn /* open, read, write, ioctl -- XXX should be a disk */ 24949623Skarels #define cdev_vn_init(c,n) { \ 25049623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 25149623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 25249623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 25349623Skarels 0 } 25447583Smccanne 25549610Sdonn dev_type_open(fdopen); 25649610Sdonn /* open */ 25749623Skarels #define cdev_fd_init(c,n) { \ 25849623Skarels dev_init(c,n,open), (dev_type_close((*))) enodev, \ 25949623Skarels (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 26049623Skarels (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 26149623Skarels (dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \ 26249623Skarels (dev_type_map((*))) enodev, 0 } 26341475Smckusick 26449610Sdonn #include "bpfilter.h" 26549610Sdonn cdev_decl(bpf); 26649610Sdonn /* open, close, read, write, ioctl, select -- XXX should be generic device */ 26749623Skarels #define cdev_bpf_init(c,n) { \ 26849623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 26949623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 27049623Skarels (dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \ 27149623Skarels (dev_type_map((*))) enodev, 0 } 27247581Skarels 27341475Smckusick struct cdevsw cdevsw[] = 27441475Smckusick { 27549610Sdonn cdev_cn_init(1,cn), /* 0: virtual console */ 27649610Sdonn cdev_ctty_init(1,ctty), /* 1: controlling terminal */ 27749610Sdonn cdev_mm_init(1,mm), /* 2: /dev/{null,mem,kmem,...} */ 27849610Sdonn cdev_swap_init(1,sw), /* 3: /dev/drum (swap pseudo-device) */ 27949610Sdonn cdev_tty_init(NPTY,pts), /* 4: pseudo-tty slave */ 28049610Sdonn cdev_ptc_init(NPTY,ptc), /* 5: pseudo-tty master */ 28149610Sdonn cdev_log_init(1,log), /* 6: /dev/klog */ 28249610Sdonn cdev_tape_init(NCT,ct), /* 7: cs80 cartridge tape */ 28349610Sdonn cdev_disk_init(NSD,sd), /* 8: scsi disk */ 284*52773Smckusick cdev_disk_init(NRD,rd), /* 9: hpib disk */ 28549610Sdonn cdev_grf_init(1,grf), /* 10: frame buffer */ 28649610Sdonn cdev_ppi_init(NPPI,ppi), /* 11: printer/plotter interface */ 28749610Sdonn cdev_tty_init(NDCA,dca), /* 12: built-in single-port serial */ 28849610Sdonn cdev_ite_init(NITE,ite), /* 13: console terminal emulator */ 28949610Sdonn cdev_hil_init(1,hil), /* 14: human interface loop */ 29049610Sdonn cdev_tty_init(NDCM,dcm), /* 15: 4-port serial */ 29149610Sdonn cdev_notdef(), /* 16 */ 29249610Sdonn cdev_disk_init(NCD,cd), /* 17: concatenated disk */ 29349610Sdonn cdev_clock_init(NCLOCK,clock), /* 18: mapped clock */ 29449610Sdonn cdev_vn_init(NVN,vn), /* 19: vnode disk */ 29549912Smckusick cdev_tape_init(NST,st), /* 20: exabyte tape */ 29649610Sdonn cdev_fd_init(1,fd), /* 21: file descriptor pseudo-dev */ 29749610Sdonn cdev_bpf_init(NBPFILTER,bpf), /* 22: berkeley packet filter */ 29841475Smckusick }; 29949610Sdonn 30041475Smckusick int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]); 30141475Smckusick 30241475Smckusick int mem_no = 2; /* major device number of memory special file */ 30341475Smckusick 30441475Smckusick /* 30541475Smckusick * Swapdev is a fake device implemented 30641475Smckusick * in sw.c used only internally to get to swstrategy. 30741475Smckusick * It cannot be provided to the users, because the 30841475Smckusick * swstrategy routine munches the b_dev and b_blkno entries 30941475Smckusick * before calling the appropriate driver. This would horribly 31041475Smckusick * confuse, e.g. the hashing routines. Instead, /dev/drum is 31141475Smckusick * provided as a character (raw) device. 31241475Smckusick */ 31341475Smckusick dev_t swapdev = makedev(3, 0); 314