lkm.h

来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 395 行

H
395
字号
/* * Header file used by loadable kernel modules and loadable kernel module * utilities. * * 23 Jan 93	Terry Lambert		Original * * Copyright (c) 1992 Terrence R. Lambert. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *      This product includes software developed by Terrence R. Lambert. * 4. The name Terrence R. Lambert may not be used to endorse or promote *    products derived from this software without specific prior written *    permission. * * THIS SOFTWARE IS PROVIDED BY TERRENCE R. LAMBERT ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE TERRENCE R. LAMBERT BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: lkm.h,v 1.18 1998/07/04 22:30:26 julian Exp $ */#ifndef _SYS_LKM_H_#define _SYS_LKM_H_/* * Supported module types */typedef enum loadmod {	LM_SYSCALL,	LM_VFS,	LM_DEV,	LM_STRMOD,	LM_EXEC,	LM_MISC} MODTYPE;#define	LKM_VERSION	1		/* version of module loader */#define	MAXLKMNAME	32/****************************************************************************/#ifdef KERNEL/* * Loadable system call */struct lkm_syscall {	MODTYPE	lkm_type;	int	lkm_ver;	const char	*lkm_name;	u_long	lkm_offset;		/* save/assign area */	struct sysent	*lkm_sysent;	struct sysent	lkm_oldent;	/* save area for unload */};/* * Loadable file system */struct lkm_vfs {	MODTYPE	lkm_type;	int	lkm_ver;	const char	*lkm_name;	u_long	lkm_offset;	struct  linker_set *lkm_vnodeops;	struct	vfsconf *lkm_vfsconf;};/* * Supported device module types */typedef enum devtype {	LM_DT_BLOCK,	LM_DT_CHAR} DEVTYPE;/* * Loadable device driver */struct lkm_dev {	MODTYPE	lkm_type;	int	lkm_ver;	const char	*lkm_name;	u_long	lkm_offset;	DEVTYPE	lkm_devtype;	union {		void	*anon;		struct cdevsw	*bdev;		struct cdevsw	*cdev;	} lkm_dev;	union {		struct cdevsw	*bdev;		struct cdevsw	*cdev;	} lkm_olddev;};/* * Loadable streams module */struct lkm_strmod {	MODTYPE	lkm_type;	int	lkm_ver;	const char	*lkm_name;	u_long	lkm_offset;	/*	 * Removed: future release	 */};/* * Exec loader */struct lkm_exec {	MODTYPE	lkm_type;	int	lkm_ver;	const char	*lkm_name;	u_long	lkm_offset;	const struct execsw	*lkm_exec;	struct execsw	lkm_oldexec;};/* * Miscellaneous module (complex load/unload, potentially complex stat */struct lkm_misc {	MODTYPE	lkm_type;	int	lkm_ver;	const char	*lkm_name;	u_long	lkm_offset;};/* * Any module (to get type and name info without knowing type) */struct lkm_any {	MODTYPE	lkm_type;	int	lkm_ver;	const char	*lkm_name;	u_long	lkm_offset;};/* * Generic reference ala XEvent to allow single entry point in the xxxinit() * routine. */union lkm_generic {	struct lkm_any		*lkm_any;	struct lkm_syscall	*lkm_syscall;	struct lkm_vfs		*lkm_vfs;	struct lkm_dev		*lkm_dev;	struct lkm_strmod	*lkm_strmod;	struct lkm_exec		*lkm_exec;	struct lkm_misc		*lkm_misc;};union lkm_all {	struct lkm_any		lkm_any;	struct lkm_syscall	lkm_syscall;	struct lkm_vfs		lkm_vfs;	struct lkm_dev		lkm_dev;	struct lkm_strmod	lkm_strmod;	struct lkm_exec		lkm_exec;	struct lkm_misc		lkm_misc;};/* * Per module information structure */struct lkm_table {	int	type;	u_long	size;	u_long	offset;	u_long	area;	char	used;	int	ver;		/* version (INIT) */	int	refcnt;		/* reference count (INIT) */	int	depcnt;		/* dependency count (INIT) */	int	id;		/* identifier (INIT) */	int	(*entry) __P((struct lkm_table *, int, int));				/* entry function */	union lkm_generic	private;	/* module private data */};#define	LKM_E_LOAD	1#define	LKM_E_UNLOAD	2#define	LKM_E_STAT	3/* Flag to indicate that LKM should select the slot, etc. Supported by: *  devslot in MOD_DEV */#define LKM_ANON ((u_long)-1)/* XXX wcd.c pokes around in the lkm private structure, so until that * is fixed here is a way to export the structure name. */#define MOD_PRIVATE(name) name ## _mod_struct#define	MOD_DECL(name)							    \	static int name ## _load __P((struct lkm_table *lkmtp, int cmd));   \	static int name ## _unload __P((struct lkm_table *lkmtp, int cmd)); \	int name ## _mod __P((struct lkm_table *lkmtp, int cmd,	int ver))#define	MOD_SYSCALL(name,callslot,sysentp)	\	static struct lkm_syscall MOD_PRIVATE(name) = {	\		LM_SYSCALL,			\		LKM_VERSION,			\		#name,				\		callslot,			\		sysentp				\	}#define	MOD_VFS(name,vnodeops,vfsconf)	\	static struct lkm_vfs MOD_PRIVATE(name) = {	\		LM_VFS,				\		LKM_VERSION,			\		#name,				\		0,				\		vnodeops,			\		vfsconf				\	}#define	MOD_DEV(name,devtype,devslot,devp)	\	MOD_DECL(name);				\	static struct lkm_dev MOD_PRIVATE(name) = {	\		LM_DEV,				\		LKM_VERSION,			\		#name ## "_mod",		\		devslot,			\		devtype,			\		{ (void *)devp }		\	}#define	MOD_EXEC(name,execslot,execsw)		\	MOD_DECL(name);				\	static struct lkm_exec MOD_PRIVATE(name) = {	\		LM_EXEC,			\		LKM_VERSION,			\		#name ## "_mod",		\		execslot,			\		execsw				\	}#define	MOD_MISC(name)				\	MOD_DECL(name);				\	static struct lkm_misc MOD_PRIVATE(name) = {	\		LM_MISC,			\		LKM_VERSION,			\		#name ## "_mod"			\	}/* * MOD_DISPATCH -- body function for use in module entry point function; * generally, the function body will consist entirely of a single * MOD_DISPATCH line. * * Call load/unload/stat on each corresponding entry instance.  "cmd" is * passed to each function so that a single function can be used if desired. * */#define	MOD_DISPATCH(name,lkmtp,cmd,ver,load,unload,stat)		\	if (ver != LKM_VERSION)						\		return EINVAL;	/* version mismatch */			\	switch (cmd) {							\	int	error;							\	case LKM_E_LOAD:						\		lkmtp->private.lkm_any =				\			(struct lkm_any *)& MOD_PRIVATE(name) ;		\		if (lkmexists(lkmtp)) /* !!! */				\			return EEXIST;					\		if ((error = load(lkmtp, cmd)))				\			return error;					\		break;							\	case LKM_E_UNLOAD:						\		if ((error = unload(lkmtp, cmd)))			\			return error;					\		break;							\	case LKM_E_STAT:						\		if ((error = stat(lkmtp, cmd)))				\			return error;					\		break;							\	}								\	return lkmdispatch(lkmtp, cmd);/* Provide a backward compatible stub that will generate compile time errors. * When fixing, prefer MOD_DISPATCH to be consistent with the others. */#define	DISPATCH(name,lkmtp,cmd,ver,load,unload,stat)			\	MOD_DISPATCH(name,lkmtp,cmd,ver,load,unload,stat)int lkmdispatch __P((struct lkm_table *lkmtp, int cmd));int lkmexists	__P((struct lkm_table *lkmtp));int lkm_nullcmd __P((struct lkm_table *lkmtp, int cmd));#endif /* KERNEL *//****************************************************************************//* * IOCTL's recognized by /dev/lkm */#define	LMRESERV	_IOWR('K', 0, struct lmc_resrv)#define	LMLOADBUF	_IOW('K', 1, struct lmc_loadbuf)#define	LMUNRESRV	_IO('K', 2)#define	LMREADY		_IOW('K', 3, int)#define	LMLOAD		_IOW('K', 9, struct lmc_load)#define	LMUNLOAD	_IOWR('K', 10, struct lmc_unload)#define	LMSTAT		_IOWR('K', 11, struct lmc_stat)#define	MODIOBUF	512		/* # of bytes at a time to loadbuf *//* * IOCTL arguments *//* * Reserve a page-aligned block of kernel memory for the module */struct lmc_resrv {	u_long	size;		/* IN: size of module to reserve */	const char	*name;		/* IN: name (must be provided */	int	slot;		/* OUT: allocated slot (module ID) */	u_long	addr;		/* OUT: Link-to address */};/* * Copy a buffer at a time into the allocated area in the kernel; writes * are assumed to occur contiguously. */struct lmc_loadbuf {	int	cnt;		/* IN: # of chars pointed to by data */	char	*data;		/* IN: pointer to data buffer */};/* * Load a module (assumes it's been mmapped to address before call) */struct lmc_load {	caddr_t	address;	/* IN: user space mmap address */	int	status;		/* OUT: status of operation */	int	id;		/* OUT: module ID if loaded */};/* * Unload a module (by name/id) */struct lmc_unload {	int	id;		/* IN: module ID to unload */	const char	*name;	/* IN: module name to unload if id -1 */	int	status;		/* OUT: status of operation */};/* * Get module information for a given id (or name if id == -1). */struct lmc_stat {	int	id;			/* IN: module ID to unload */	char	name[MAXLKMNAME];	/* IN/OUT: name of module */	u_long	offset;			/* OUT: target table offset */	MODTYPE	type;			/* OUT: type of module */	u_long	area;			/* OUT: kernel load addr */	u_long	size;			/* OUT: module size (pages) */	u_long	private;		/* OUT: module private data */	int	ver;			/* OUT: lkm compile version */};#endif	/* !_SYS_LKM_H_ */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?