1 /*- 2 * Copyright (c) 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * (c) UNIX System Laboratories, Inc. 5 * All or some portions of this file are derived from material licensed 6 * to the University of California by American Telephone and Telegraph 7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8 * the permission of UNIX System Laboratories, Inc. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the University of 21 * California, Berkeley and its contributors. 22 * 4. Neither the name of the University nor the names of its contributors 23 * may be used to endorse or promote products derived from this software 24 * without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)conf.h 8.5 (Berkeley) 1/9/95 39 * $FreeBSD: src/sys/sys/conf.h,v 1.103.2.6 2002/03/11 01:14:55 dd Exp $ 40 * $DragonFly: src/sys/sys/conf.h,v 1.2 2003/06/17 04:28:58 dillon Exp $ 41 */ 42 43 #ifndef _SYS_CONF_H_ 44 #define _SYS_CONF_H_ 45 46 #include <sys/queue.h> 47 48 #define SPECNAMELEN 15 49 50 struct tty; 51 struct disk; 52 struct vnode; 53 54 struct specinfo { 55 u_int si_flags; 56 #define SI_STASHED 0x0001 /* created in stashed storage */ 57 udev_t si_udev; 58 LIST_ENTRY(specinfo) si_hash; 59 SLIST_HEAD(, vnode) si_hlist; 60 char si_name[SPECNAMELEN + 1]; 61 void *si_drv1, *si_drv2; 62 struct cdevsw *si_devsw; 63 int si_iosize_max; /* maximum I/O size (for physio &al) */ 64 union { 65 struct { 66 struct tty *__sit_tty; 67 } __si_tty; 68 struct { 69 struct disk *__sid_disk; 70 struct mount *__sid_mountpoint; 71 int __sid_bsize_phys; /* min physical block size */ 72 int __sid_bsize_best; /* optimal block size */ 73 } __si_disk; 74 } __si_u; 75 }; 76 77 #define si_tty __si_u.__si_tty.__sit_tty 78 #define si_disk __si_u.__si_disk.__sid_disk 79 #define si_mountpoint __si_u.__si_disk.__sid_mountpoint 80 #define si_bsize_phys __si_u.__si_disk.__sid_bsize_phys 81 #define si_bsize_best __si_u.__si_disk.__sid_bsize_best 82 83 /* 84 * Exported shorthand 85 */ 86 #define v_hashchain v_rdev->si_hlist 87 #define v_specmountpoint v_rdev->si_mountpoint 88 89 /* 90 * Special device management 91 */ 92 #define SPECHSZ 64 93 #define SPECHASH(rdev) (((unsigned)(minor(rdev)))%SPECHSZ) 94 95 /* 96 * Definitions of device driver entry switches 97 */ 98 99 struct buf; 100 struct proc; 101 struct uio; 102 struct knote; 103 104 /* 105 * Note: d_thread_t is provided as a transition aid for those drivers 106 * that treat struct proc/struct thread as an opaque data type and 107 * exist in substantially the same form in both 4.x and 5.x. Writers 108 * of drivers that dips into the d_thread_t structure should use 109 * struct thread or struct proc as appropriate for the version of the 110 * OS they are using. It is provided in lieu of each device driver 111 * inventing its own way of doing this. While it does violate style(9) 112 * in a number of ways, this violation is deemed to be less 113 * important than the benefits that a uniform API between releases 114 * gives. 115 * 116 * Users of struct thread/struct proc that aren't device drivers should 117 * not use d_thread_t. 118 */ 119 120 typedef struct proc d_thread_t; 121 122 typedef int d_open_t __P((dev_t dev, int oflags, int devtype, d_thread_t *p)); 123 typedef int d_close_t __P((dev_t dev, int fflag, int devtype, d_thread_t *p)); 124 typedef void d_strategy_t __P((struct buf *bp)); 125 typedef int d_parms_t __P((dev_t dev, struct specinfo *sinfo, int ctl)); 126 typedef int d_ioctl_t __P((dev_t dev, u_long cmd, caddr_t data, 127 int fflag, d_thread_t *p)); 128 typedef int d_dump_t __P((dev_t dev)); 129 typedef int d_psize_t __P((dev_t dev)); 130 131 typedef int d_read_t __P((dev_t dev, struct uio *uio, int ioflag)); 132 typedef int d_write_t __P((dev_t dev, struct uio *uio, int ioflag)); 133 typedef int d_poll_t __P((dev_t dev, int events, d_thread_t *p)); 134 typedef int d_kqfilter_t __P((dev_t dev, struct knote *kn)); 135 typedef int d_mmap_t __P((dev_t dev, vm_offset_t offset, int nprot)); 136 137 typedef int l_open_t __P((dev_t dev, struct tty *tp)); 138 typedef int l_close_t __P((struct tty *tp, int flag)); 139 typedef int l_read_t __P((struct tty *tp, struct uio *uio, int flag)); 140 typedef int l_write_t __P((struct tty *tp, struct uio *uio, int flag)); 141 typedef int l_ioctl_t __P((struct tty *tp, u_long cmd, caddr_t data, 142 int flag, d_thread_t *p)); 143 typedef int l_rint_t __P((int c, struct tty *tp)); 144 typedef int l_start_t __P((struct tty *tp)); 145 typedef int l_modem_t __P((struct tty *tp, int flag)); 146 147 /* 148 * XXX: The dummy argument can be used to do what strategy1() never 149 * did anywhere: Create a per device flag to lock the device during 150 * label/slice surgery, all calls with a dummy == 0 gets stalled on 151 * a queue somewhere, whereas dummy == 1 are let through. Once out 152 * of surgery, reset the flag and restart all the stuff on the stall 153 * queue. 154 */ 155 #define BUF_STRATEGY(bp, dummy) (*devsw((bp)->b_dev)->d_strategy)(bp) 156 /* 157 * Types for d_flags. 158 */ 159 #define D_TAPE 0x0001 160 #define D_DISK 0x0002 161 #define D_TTY 0x0004 162 #define D_MEM 0x0008 163 164 #define D_TYPEMASK 0xffff 165 166 /* 167 * Flags for d_flags. 168 */ 169 #define D_MEMDISK 0x00010000 /* memory type disk */ 170 #define D_NAGGED 0x00020000 /* nagged about missing make_dev() */ 171 #define D_CANFREE 0x00040000 /* can free blocks */ 172 #define D_TRACKCLOSE 0x00080000 /* track all closes */ 173 #define D_KQFILTER 0x00200000 /* has kqfilter entry */ 174 175 /* 176 * Character device switch table 177 */ 178 struct cdevsw { 179 d_open_t *d_open; 180 d_close_t *d_close; 181 d_read_t *d_read; 182 d_write_t *d_write; 183 d_ioctl_t *d_ioctl; 184 d_poll_t *d_poll; 185 d_mmap_t *d_mmap; 186 d_strategy_t *d_strategy; 187 const char *d_name; /* base device name, e.g. 'vn' */ 188 int d_maj; 189 d_dump_t *d_dump; 190 d_psize_t *d_psize; 191 u_int d_flags; 192 int d_bmaj; 193 /* additions below are not binary compatible with 4.2 and below */ 194 d_kqfilter_t *d_kqfilter; 195 }; 196 197 /* 198 * Line discipline switch table 199 */ 200 struct linesw { 201 l_open_t *l_open; 202 l_close_t *l_close; 203 l_read_t *l_read; 204 l_write_t *l_write; 205 l_ioctl_t *l_ioctl; 206 l_rint_t *l_rint; 207 l_start_t *l_start; 208 l_modem_t *l_modem; 209 u_char l_hotchar; 210 }; 211 212 #ifdef _KERNEL 213 extern struct linesw linesw[]; 214 extern int nlinesw; 215 216 int ldisc_register __P((int , struct linesw *)); 217 void ldisc_deregister __P((int)); 218 #define LDISC_LOAD -1 /* Loadable line discipline */ 219 #endif 220 221 /* 222 * Swap device table 223 */ 224 struct swdevt { 225 udev_t sw_dev; /* For quasibogus swapdev reporting */ 226 int sw_flags; 227 int sw_nblks; 228 struct vnode *sw_vp; 229 dev_t sw_device; 230 }; 231 #define SW_FREED 0x01 232 #define SW_SEQUENTIAL 0x02 233 #define sw_freed sw_flags /* XXX compat */ 234 235 #ifdef _KERNEL 236 d_open_t noopen; 237 d_close_t noclose; 238 d_read_t noread; 239 d_write_t nowrite; 240 d_ioctl_t noioctl; 241 d_mmap_t nommap; 242 d_kqfilter_t nokqfilter; 243 #define nostrategy ((d_strategy_t *)NULL) 244 #define nopoll seltrue 245 246 d_dump_t nodump; 247 248 #define NUMCDEVSW 256 249 250 /* 251 * nopsize is little used, so not worth having dummy functions for. 252 */ 253 #define nopsize ((d_psize_t *)NULL) 254 255 d_open_t nullopen; 256 d_close_t nullclose; 257 258 l_ioctl_t l_nullioctl; 259 l_read_t l_noread; 260 l_write_t l_nowrite; 261 262 struct module; 263 264 struct devsw_module_data { 265 int (*chainevh)(struct module *, int, void *); /* next handler */ 266 void *chainarg; /* arg for next event handler */ 267 /* Do not initialize fields hereafter */ 268 }; 269 270 #define DEV_MODULE(name, evh, arg) \ 271 static moduledata_t name##_mod = { \ 272 #name, \ 273 evh, \ 274 arg \ 275 }; \ 276 DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE) 277 278 279 int cdevsw_add __P((struct cdevsw *new)); 280 int cdevsw_remove __P((struct cdevsw *old)); 281 int count_dev __P((dev_t dev)); 282 void destroy_dev __P((dev_t dev)); 283 struct cdevsw *devsw __P((dev_t dev)); 284 const char *devtoname __P((dev_t dev)); 285 void freedev __P((dev_t dev)); 286 int iszerodev __P((dev_t dev)); 287 dev_t makebdev __P((int maj, int min)); 288 dev_t make_dev __P((struct cdevsw *devsw, int minor, uid_t uid, gid_t gid, int perms, const char *fmt, ...)) __printflike(6, 7); 289 int lminor __P((dev_t dev)); 290 void setconf __P((void)); 291 dev_t getdiskbyname(char *name); 292 293 /* 294 * XXX: This included for when DEVFS resurfaces 295 */ 296 297 #define UID_ROOT 0 298 #define UID_BIN 3 299 #define UID_UUCP 66 300 301 #define GID_WHEEL 0 302 #define GID_KMEM 2 303 #define GID_OPERATOR 5 304 #define GID_BIN 7 305 #define GID_GAMES 13 306 #define GID_DIALER 68 307 308 #endif /* _KERNEL */ 309 310 #endif /* !_SYS_CONF_H_ */ 311