module.h revision 91520
1/*- 2 * Copyright (c) 1997 Doug Rabson 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD: head/sys/sys/module.h 91520 2002-03-01 07:05:45Z obrien $ 27 */ 28 29#ifndef _SYS_MODULE_H_ 30#define _SYS_MODULE_H_ 31 32/* 33 * Module metadata types 34 */ 35#define MDT_DEPEND 1 /* argument is a module name */ 36#define MDT_MODULE 2 /* module declaration */ 37#define MDT_VERSION 3 /* module version(s) */ 38 39#define MDT_STRUCT_VERSION 1 /* version of metadata structure */ 40#define MDT_SETNAME "modmetadata_set" 41 42typedef enum modeventtype { 43 MOD_LOAD, 44 MOD_UNLOAD, 45 MOD_SHUTDOWN 46} modeventtype_t; 47 48typedef struct module *module_t; 49typedef int (*modeventhand_t)(module_t, int /* modeventtype_t */, void *); 50 51/* 52 * Struct for registering modules statically via SYSINIT. 53 */ 54typedef struct moduledata { 55 const char *name; /* module name */ 56 modeventhand_t evhand; /* event handler */ 57 void *priv; /* extra data */ 58} moduledata_t; 59 60/* 61 * A module can use this to report module specific data to the user via 62 * kldstat(2). 63 */ 64typedef union modspecific { 65 int intval; 66 u_int uintval; 67 long longval; 68 u_long ulongval; 69} modspecific_t; 70 71/* 72 * Module dependency declarartion 73 */ 74struct mod_depend { 75 int md_ver_minimum; 76 int md_ver_preferred; 77 int md_ver_maximum; 78}; 79 80/* 81 * Module version declaration 82 */ 83struct mod_version { 84 int mv_version; 85}; 86 87struct mod_metadata { 88 int md_version; /* structure version MDTV_* */ 89 int md_type; /* type of entry MDT_* */ 90 void *md_data; /* specific data */ 91 const char *md_cval; /* common string label */ 92}; 93 94#ifdef _KERNEL 95 96#include <sys/linker_set.h> 97 98#define MODULE_METADATA(uniquifier, type, data, cval) \ 99 static struct mod_metadata _mod_metadata##uniquifier = { \ 100 MDT_STRUCT_VERSION, \ 101 type, \ 102 data, \ 103 cval \ 104 }; \ 105 DATA_SET(modmetadata_set, _mod_metadata##uniquifier) 106 107#define MODULE_DEPEND(module, mdepend, vmin, vpref, vmax) \ 108 static struct mod_depend _##module##_depend_on_##mdepend = { \ 109 vmin, \ 110 vpref, \ 111 vmax \ 112 }; \ 113 MODULE_METADATA(_md_##module##_on_##mdepend, MDT_DEPEND, \ 114 &_##module##_depend_on_##mdepend, #mdepend) 115 116#define DECLARE_MODULE(name, data, sub, order) \ 117 MODULE_METADATA(_md_##name, MDT_MODULE, &data, #name); \ 118 SYSINIT(name##module, sub, order, module_register_init, &data) \ 119 struct __hack 120 121#define MODULE_VERSION(module, version) \ 122 static struct mod_version _##module##_version = { \ 123 version \ 124 }; \ 125 MODULE_METADATA(_##module##_version, MDT_VERSION, \ 126 &_##module##_version, #module) 127 128struct linker_file; 129 130void module_register_init(const void *); 131int module_register(const struct moduledata *, struct linker_file *); 132module_t module_lookupbyname(const char *); 133module_t module_lookupbyid(int); 134void module_reference(module_t); 135void module_release(module_t); 136int module_unload(module_t); 137int module_getid(module_t); 138module_t module_getfnext(module_t); 139void module_setspecific(module_t, modspecific_t *); 140 141#ifdef MOD_DEBUG 142extern int mod_debug; 143#define MOD_DEBUG_REFS 1 144 145#define MOD_DPF(cat, args) do { \ 146 if (mod_debug & MOD_DEBUG_##cat) \ 147 printf(args); \ 148} while (0) 149 150#else /* !MOD_DEBUG */ 151 152#define MOD_DPF(cat, args) 153#endif 154#endif /* _KERNEL */ 155 156#define MAXMODNAME 32 157 158struct module_stat { 159 int version; /* set to sizeof(struct module_stat) */ 160 char name[MAXMODNAME]; 161 int refs; 162 int id; 163 modspecific_t data; 164}; 165 166#ifndef _KERNEL 167 168#include <sys/cdefs.h> 169 170__BEGIN_DECLS 171int modnext(int _modid); 172int modfnext(int _modid); 173int modstat(int _modid, struct module_stat *_stat); 174int modfind(const char *_name); 175__END_DECLS 176 177#endif 178 179#endif /* !_SYS_MODULE_H_ */ 180