conf.h revision 171181
11590Srgrimes/*-
21590Srgrimes * Copyright (c) 1990, 1993
31590Srgrimes *	The Regents of the University of California.  All rights reserved.
41590Srgrimes * Copyright (c) 2000
51590Srgrimes *	Poul-Henning Kamp.  All rights reserved.
61590Srgrimes * (c) UNIX System Laboratories, Inc.
71590Srgrimes * All or some portions of this file are derived from material licensed
81590Srgrimes * to the University of California by American Telephone and Telegraph
91590Srgrimes * Co. or Unix System Laboratories, Inc. and are reproduced herein with
101590Srgrimes * the permission of UNIX System Laboratories, Inc.
111590Srgrimes *
121590Srgrimes * Redistribution and use in source and binary forms, with or without
131590Srgrimes * modification, are permitted provided that the following conditions
141590Srgrimes * are met:
151590Srgrimes * 1. Redistributions of source code must retain the above copyright
161590Srgrimes *    notice, this list of conditions and the following disclaimer.
171590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
181590Srgrimes *    notice, this list of conditions and the following disclaimer in the
191590Srgrimes *    documentation and/or other materials provided with the distribution.
201590Srgrimes * 4. Neither the name of the University nor the names of its contributors
211590Srgrimes *    may be used to endorse or promote products derived from this software
221590Srgrimes *    without specific prior written permission.
231590Srgrimes *
241590Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
251590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
261590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
271590Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
281590Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
291590Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
301590Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3174769Smikeh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
321590Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3374769Smikeh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
341590Srgrimes * SUCH DAMAGE.
3599112Sobrien *
3699112Sobrien *	@(#)conf.h	8.5 (Berkeley) 1/9/95
371590Srgrimes * $FreeBSD: head/sys/sys/conf.h 171181 2007-07-03 17:42:37Z kib $
381590Srgrimes */
391590Srgrimes
401590Srgrimes#ifndef _SYS_CONF_H_
411590Srgrimes#define	_SYS_CONF_H_
421590Srgrimes
431590Srgrimes#ifdef _KERNEL
441590Srgrimes#include <sys/eventhandler.h>
451590Srgrimes#else
461590Srgrimes#include <sys/queue.h>
4777274Smikeh#endif
4877274Smikeh
4977274Smikehstruct tty;
5077274Smikehstruct snapdata;
511590Srgrimesstruct devfs_dirent;
521590Srgrimesstruct cdevsw;
531590Srgrimesstruct file;
541590Srgrimes
5577274Smikehstruct cdev {
5677274Smikeh	struct cdev_priv	*si_priv;
5777274Smikeh	u_int		si_flags;
5877274Smikeh#define SI_ALIAS	0x0002	/* carrier of alias name */
5977274Smikeh#define SI_NAMED	0x0004	/* make_dev{_alias} has been called */
601590Srgrimes#define SI_CHEAPCLONE	0x0008	/* can be removed_dev'ed when vnode reclaims */
611590Srgrimes#define SI_CHILD	0x0010	/* child of another struct cdev **/
6292921Simp#define SI_DEVOPEN	0x0020	/* opened by device */
6392921Simp#define SI_CONSOPEN	0x0040	/* opened by console */
6492921Simp#define SI_DUMPDEV	0x0080	/* is kernel dumpdev */
651590Srgrimes#define SI_CANDELETE	0x0100	/* can do BIO_DELETE */
661590Srgrimes#define SI_CLONELIST	0x0200	/* on a clone list */
67216564Scharnier	struct timespec	si_atime;
681590Srgrimes	struct timespec	si_ctime;
691590Srgrimes	struct timespec	si_mtime;
701590Srgrimes	uid_t		si_uid;
7177274Smikeh	gid_t		si_gid;
721590Srgrimes	mode_t		si_mode;
7377274Smikeh	struct ucred	*si_cred;	/* cached clone-time credential */
741590Srgrimes	u_int		si_drv0;
7577274Smikeh	int		si_refcount;
761590Srgrimes	LIST_ENTRY(cdev)	si_list;
771590Srgrimes	LIST_ENTRY(cdev)	si_clone;
781590Srgrimes	LIST_HEAD(, cdev)	si_children;
79216564Scharnier	LIST_ENTRY(cdev)	si_siblings;
801590Srgrimes	struct cdev *si_parent;
811590Srgrimes	char		*si_name;
821590Srgrimes	void		*si_drv1, *si_drv2;
831590Srgrimes	struct cdevsw	*si_devsw;
841590Srgrimes	int		si_iosize_max;	/* maximum I/O size (for physio &al) */
8577274Smikeh	u_long		si_usecount;
861590Srgrimes	u_long		si_threadcount;
8777274Smikeh	union {
881590Srgrimes		struct tty *__sit_tty;
891590Srgrimes		struct snapdata *__sid_snapdata;
901590Srgrimes	} __si_u;
91216564Scharnier	char		__si_namebuf[SPECNAMELEN + 1];
921590Srgrimes};
931590Srgrimes
9477274Smikeh#define si_tty		__si_u.__sit_tty
951590Srgrimes#define si_snapdata	__si_u.__sid_snapdata
961590Srgrimes
971590Srgrimes#ifdef _KERNEL
98216564Scharnier
991590Srgrimes/*
1001590Srgrimes * Definitions of device driver entry switches
1011590Srgrimes */
1021590Srgrimes
10388150Smikehstruct bio;
1041590Srgrimesstruct buf;
1051590Srgrimesstruct thread;
1061590Srgrimesstruct uio;
10777274Smikehstruct knote;
10877274Smikehstruct clonedevs;
10977274Smikehstruct vnode;
1101590Srgrimes
1111590Srgrimes/*
1121590Srgrimes * Note: d_thread_t is provided as a transition aid for those drivers
1131590Srgrimes * that treat struct proc/struct thread as an opaque data type and
1141590Srgrimes * exist in substantially the same form in both 4.x and 5.x.  Writers
1151590Srgrimes * of drivers that dips into the d_thread_t structure should use
1161590Srgrimes * struct thread or struct proc as appropriate for the version of the
1171590Srgrimes * OS they are using.  It is provided in lieu of each device driver
1181590Srgrimes * inventing its own way of doing this.  While it does violate style(9)
11988150Smikeh * in a number of ways, this violation is deemed to be less
12088150Smikeh * important than the benefits that a uniform API between releases
12177274Smikeh * gives.
12277274Smikeh *
12377274Smikeh * Users of struct thread/struct proc that aren't device drivers should
1241590Srgrimes * not use d_thread_t.
12577274Smikeh */
1261590Srgrimes
1271590Srgrimestypedef struct thread d_thread_t;
12877274Smikeh
1291590Srgrimestypedef int d_open_t(struct cdev *dev, int oflags, int devtype, struct thread *td);
1301590Srgrimestypedef int d_fdopen_t(struct cdev *dev, int oflags, struct thread *td, struct file *fp);
1311590Srgrimestypedef int d_close_t(struct cdev *dev, int fflag, int devtype, struct thread *td);
132216564Scharniertypedef void d_strategy_t(struct bio *bp);
1331590Srgrimestypedef int d_ioctl_t(struct cdev *dev, u_long cmd, caddr_t data,
1341590Srgrimes		      int fflag, struct thread *td);
13588150Smikeh
1361590Srgrimestypedef int d_read_t(struct cdev *dev, struct uio *uio, int ioflag);
1371590Srgrimestypedef int d_write_t(struct cdev *dev, struct uio *uio, int ioflag);
1381590Srgrimestypedef int d_poll_t(struct cdev *dev, int events, struct thread *td);
13977274Smikehtypedef int d_kqfilter_t(struct cdev *dev, struct knote *kn);
14088150Smikehtypedef int d_mmap_t(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr,
14188150Smikeh   		     int nprot);
14288150Smikehtypedef void d_purge_t(struct cdev *dev);
14388150Smikeh
1441590Srgrimestypedef int d_spare2_t(struct cdev *dev);
14588150Smikeh
14677274Smikehtypedef int dumper_t(
1471590Srgrimes	void *priv,		/* Private to the driver. */
1481590Srgrimes	void *virtual,		/* Virtual (mapped) address. */
1491590Srgrimes	vm_offset_t physical,	/* Physical address of virtual. */
150216564Scharnier	off_t offset,		/* Byte-offset to write at. */
1511590Srgrimes	size_t length);		/* Number of bytes to dump. */
1521590Srgrimes
15377274Smikeh#endif /* _KERNEL */
1541590Srgrimes
15577274Smikeh/*
1561590Srgrimes * Types for d_flags.
15777274Smikeh */
1581590Srgrimes#define	D_TAPE	0x0001
1591590Srgrimes#define	D_DISK	0x0002
1601590Srgrimes#define	D_TTY	0x0004
161216564Scharnier#define	D_MEM	0x0008
1621590Srgrimes
1631590Srgrimes#ifdef _KERNEL
1641590Srgrimes
16577274Smikeh#define	D_TYPEMASK	0xffff
16674769Smikeh
1671590Srgrimes/*
1681590Srgrimes * Flags for d_flags which the drivers can set.
1691590Srgrimes */
1701590Srgrimes#define	D_TRACKCLOSE	0x00080000	/* track all closes */
1711590Srgrimes#define D_MMAP_ANON	0x00100000	/* special treatment in vm_mmap.c */
1721590Srgrimes#define D_PSEUDO	0x00200000	/* make_dev() can return NULL */
1731590Srgrimes#define D_NEEDGIANT	0x00400000	/* driver want Giant */
1741590Srgrimes
175216564Scharnier/*
1761590Srgrimes * Version numbers.
1771590Srgrimes */
1781590Srgrimes#define D_VERSION_00	0x20011966
17977274Smikeh#define D_VERSION_01	0x17032005	/* Add d_uid,gid,mode & kind */
1801590Srgrimes#define D_VERSION	D_VERSION_01
1811590Srgrimes
18277274Smikeh/*
1831590Srgrimes * Flags used for internal housekeeping
1841590Srgrimes */
18574769Smikeh#define D_INIT		0x80000000	/* cdevsw initialized */
18674769Smikeh
1871590Srgrimes/*
1881590Srgrimes * Character device switch table
18974769Smikeh */
190216564Scharnierstruct cdevsw {
1911590Srgrimes	int			d_version;
1921590Srgrimes	u_int			d_flags;
1931590Srgrimes	const char		*d_name;
19477274Smikeh	d_open_t		*d_open;
1951590Srgrimes	d_fdopen_t		*d_fdopen;
1961590Srgrimes	d_close_t		*d_close;
19774769Smikeh	d_read_t		*d_read;
1981590Srgrimes	d_write_t		*d_write;
1991590Srgrimes	d_ioctl_t		*d_ioctl;
2001590Srgrimes	d_poll_t		*d_poll;
2011590Srgrimes	d_mmap_t		*d_mmap;
2021590Srgrimes	d_strategy_t		*d_strategy;
2031590Srgrimes	dumper_t		*d_dump;
2041590Srgrimes	d_kqfilter_t		*d_kqfilter;
2051590Srgrimes	d_purge_t		*d_purge;
2061590Srgrimes	d_spare2_t		*d_spare2;
2071590Srgrimes	uid_t			d_uid;
2081590Srgrimes	gid_t			d_gid;
2091590Srgrimes	mode_t			d_mode;
210216564Scharnier	const char		*d_kind;
211216564Scharnier
2121590Srgrimes	/* These fields should not be messed with by drivers */
2131590Srgrimes	LIST_ENTRY(cdevsw)	d_list;
2141590Srgrimes	LIST_HEAD(, cdev)	d_devs;
2151590Srgrimes	int			d_spare3;
21677274Smikeh	struct cdevsw		*d_gianttrick;
21777274Smikeh};
2181590Srgrimes
2191590Srgrimes#define NUMCDEVSW 256
2201590Srgrimes
2211590Srgrimes#define MAXMINOR	0xffff00ffU
222216564Scharnier
223216564Scharnierstruct module;
2241590Srgrimes
2251590Srgrimesstruct devsw_module_data {
2261590Srgrimes	int	(*chainevh)(struct module *, int, void *); /* next handler */
22740188Sbde	void	*chainarg;	/* arg for next event handler */
22874769Smikeh	/* Do not initialize fields hereafter */
22977274Smikeh};
2301590Srgrimes
2311590Srgrimes#define DEV_MODULE(name, evh, arg)					\
2321590Srgrimesstatic moduledata_t name##_mod = {					\
23377274Smikeh    #name,								\
2341590Srgrimes    evh,								\
23577274Smikeh    arg									\
23677274Smikeh};									\
23777274SmikehDECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE)
23877274Smikeh
2391590Srgrimes
2401590Srgrimesvoid clone_setup(struct clonedevs **cdp);
24174769Smikehvoid clone_cleanup(struct clonedevs **);
2421590Srgrimes#define CLONE_UNITMASK 0xfffff
2431590Srgrimes#define CLONE_FLAG0 (CLONE_UNITMASK + 1)
24477274Smikehint clone_create(struct clonedevs **, struct cdevsw *, int *unit, struct cdev **dev, int extra);
2451590Srgrimes
2461590Srgrimesint	count_dev(struct cdev *_dev);
2471590Srgrimesvoid	destroy_dev(struct cdev *_dev);
248216564Scharnierint	destroy_dev_sched(struct cdev *dev);
2491590Srgrimesint	destroy_dev_sched_cb(struct cdev *dev, void (*cb)(void *), void *arg);
2501590Srgrimesvoid	destroy_dev_drain(struct cdevsw *csw);
25188150Smikehvoid	drain_dev_clone_events(void);
2521590Srgrimesstruct cdevsw *dev_refthread(struct cdev *_dev);
2531590Srgrimesstruct cdevsw *devvn_refthread(struct vnode *vp, struct cdev **devp);
2541590Srgrimesvoid	dev_relthread(struct cdev *_dev);
2551590Srgrimesvoid	dev_depends(struct cdev *_pdev, struct cdev *_cdev);
2561590Srgrimesvoid	dev_ref(struct cdev *dev);
2571590Srgrimesvoid	dev_refl(struct cdev *dev);
2581590Srgrimesvoid	dev_rel(struct cdev *dev);
2591590Srgrimesvoid	dev_strategy(struct cdev *dev, struct buf *bp);
2601590Srgrimesstruct cdev *make_dev(struct cdevsw *_devsw, int _minor, uid_t _uid, gid_t _gid,
26188150Smikeh		int _perms, const char *_fmt, ...) __printflike(6, 7);
26288150Smikehstruct cdev *make_dev_cred(struct cdevsw *_devsw, int _minor,
26377274Smikeh		struct ucred *_cr, uid_t _uid, gid_t _gid, int _perms,
26488150Smikeh		const char *_fmt, ...) __printflike(7, 8);
26577274Smikeh#define MAKEDEV_REF     0x1
26688150Smikeh#define MAKEDEV_WHTOUT	0x2
26788150Smikehstruct cdev *make_dev_credf(int _flags,
2681590Srgrimes		struct cdevsw *_devsw, int _minornr,
2691590Srgrimes		struct ucred *_cr, uid_t _uid, gid_t _gid, int _mode,
2701590Srgrimes		const char *_fmt, ...) __printflike(8, 9);
271216564Scharnierstruct cdev *make_dev_alias(struct cdev *_pdev, const char *_fmt, ...) __printflike(2, 3);
2721590Srgrimesint	dev2unit(struct cdev *_dev);
2731590Srgrimesvoid	dev_lock(void);
2741590Srgrimesvoid	dev_unlock(void);
2751590Srgrimesint	unit2minor(int _unit);
27677274Smikehu_int	minor2unit(u_int _minor);
2771590Srgrimesvoid	setconf(void);
27877274Smikeh
2791590Srgrimes#define		UID_ROOT	0
2801590Srgrimes#define		UID_BIN		3
2811590Srgrimes#define		UID_UUCP	66
282216564Scharnier
2831590Srgrimes#define		GID_WHEEL	0
28477274Smikeh#define		GID_KMEM	2
2851590Srgrimes#define		GID_OPERATOR	5
2861590Srgrimes#define		GID_BIN		7
28777274Smikeh#define		GID_GAMES	13
2881590Srgrimes#define		GID_DIALER	68
2891590Srgrimes
29077274Smikehtypedef void (*dev_clone_fn)(void *arg, struct ucred *cred, char *name,
29174769Smikeh	    int namelen, struct cdev **result);
29274769Smikeh
2931590Srgrimesint dev_stdclone(char *_name, char **_namep, const char *_stem, int *_unit);
2941590SrgrimesEVENTHANDLER_DECLARE(dev_clone, dev_clone_fn);
2951590Srgrimes
2961590Srgrimes/* Stuff relating to kernel-dump */
29777274Smikeh
2981590Srgrimesstruct dumperinfo {
2991590Srgrimes	dumper_t *dumper;	/* Dumping function. */
3001590Srgrimes	void    *priv;		/* Private parts. */
301216564Scharnier	u_int   blocksize;	/* Size of block in bytes. */
3021590Srgrimes	off_t   mediaoffset;	/* Initial offset in bytes. */
30377274Smikeh	off_t   mediasize;	/* Space available in bytes. */
3041590Srgrimes};
3051590Srgrimes
3061590Srgrimesint set_dumper(struct dumperinfo *);
3071590Srgrimesvoid dumpsys(struct dumperinfo *);
30877274Smikehextern int dumping;		/* system is dumping */
3091590Srgrimes
3101590Srgrimes/* D_TTY related functions */
31177274Smikehd_close_t	 ttyclose;
3121590Srgrimesd_ioctl_t	 ttyioctl;
313216564Scharnierd_kqfilter_t	 ttykqfilter;
3141590Srgrimesd_open_t	 ttyopen;
3151590Srgrimesd_poll_t	 ttypoll;
31674769Smikehd_read_t	 ttyread;
31777274Smikehd_write_t	 ttywrite;
3181590Srgrimes
31974769Smikeh#endif /* _KERNEL */
3201590Srgrimes
3211590Srgrimes#endif /* !_SYS_CONF_H_ */
3221590Srgrimes