Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | /* * Dynamic loading of modules into the kernel. * * Rewritten by Richard Henderson <rth@tamu.edu> Dec 1996 */ #ifndef _LINUX_MODULE_H #define _LINUX_MODULE_H #ifdef __GENKSYMS__ # undef MODVERSIONS # define MODVERSIONS #else /* ! __GENKSYMS__ */ # if defined(MODVERSIONS) && !defined(MODULE) && defined(EXPORT_SYMTAB) # include <linux/modversions.h> # endif #endif /* __GENKSYMS__ */ /* Don't need to bring in all of uaccess.h just for this decl. */ struct exception_table_entry; /* Used by get_kernel_syms, which is depreciated. */ struct kernel_sym { unsigned long value; char name[60]; /* should have been 64-sizeof(long); oh well */ }; struct module_symbol { unsigned long value; const char *name; }; struct module_ref { struct module *dep; /* "parent" pointer */ struct module *ref; /* "child" pointer */ struct module_ref *next_ref; }; struct module { unsigned long size_of_struct; /* == sizeof(module) */ struct module *next; const char *name; unsigned long size; long usecount; unsigned long flags; /* AUTOCLEAN et al */ unsigned nsyms; unsigned ndeps; struct module_symbol *syms; struct module_ref *deps; struct module_ref *refs; int (*init)(void); void (*cleanup)(void); const struct exception_table_entry *ex_table_start; const struct exception_table_entry *ex_table_end; #ifdef __alpha__ unsigned long gp; #endif }; struct module_info { unsigned long addr; unsigned long size; unsigned long flags; }; /* Bits of module.flags. */ #define MOD_UNINITIALIZED 0 #define MOD_RUNNING 1 #define MOD_DELETED 2 #define MOD_AUTOCLEAN 4 #define MOD_VISITED 8 /* Values for query_module's which. */ #define QM_MODULES 1 #define QM_DEPS 2 #define QM_REFS 3 #define QM_SYMBOLS 4 #define QM_INFO 5 /* Backwards compatibility definition. */ #define GET_USE_COUNT(module) ((module)->usecount) /* Indirect stringification. */ #define __MODULE_STRING_1(x) #x #define __MODULE_STRING(x) __MODULE_STRING_1(x) #ifdef MODULE /* Embedded module documentation macros. */ /* For documentation purposes only. */ #define MODULE_AUTHOR(name) \ const char __module_author[] __attribute__((section(".modinfo"))) = \ "author=" name /* Could potentially be used by kerneld... */ #define MODULE_SUPPORTED_DEVICE(dev) \ const char __module_device[] __attribute__((section(".modinfo"))) = \ "device=" dev /* Used to verify parameters given to the module. The TYPE arg should be a string in the following format: [min[-max]]{b,h,i,l,s} The MIN and MAX specifiers delimit the length of the array. If MAX is omitted, it defaults to MIN; if both are omitted, the default is 1. The final character is a type specifier: b byte h short i int l long s string */ #define MODULE_PARM(var,type) \ const char __module_parm_##var[] \ __attribute__((section(".modinfo"))) = \ "parm_" __MODULE_STRING(var) "=" type /* The attributes of a section are set the first time the section is seen; we want .modinfo to not be allocated. This header should be included before any functions or variables are defined. */ __asm__(".section .modinfo\n\t.text"); /* Define the module variable, and usage macros. */ extern struct module __this_module; #define MOD_INC_USE_COUNT \ (__this_module.usecount++, __this_module.flags |= MOD_VISITED) #define MOD_DEC_USE_COUNT \ (__this_module.usecount--, __this_module.flags |= MOD_VISITED) #define MOD_IN_USE \ (__this_module.usecount != 0) #ifndef __NO_VERSION__ #include <linux/version.h> const char __module_kernel_version[] __attribute__((section(".modinfo"))) = "kernel_version=" UTS_RELEASE; #if defined(MODVERSIONS) && !defined(__GENKSYMS__) const char __module_using_checksums[] __attribute__((section(".modinfo"))) = "using_checksums=1"; #endif #endif #else /* MODULE */ #define MODULE_AUTHOR(name) #define MODULE_SUPPORTED_DEVICE(name) #define MODULE_PARM(var,type) #define MOD_INC_USE_COUNT do { } while (0) #define MOD_DEC_USE_COUNT do { } while (0) #define MOD_IN_USE 1 extern struct module *module_list; #endif /* MODULE */ /* Export a symbol either from the kernel or a module. In the kernel, the symbol is added to the kernel's global symbol table. In a module, it controls which variables are exported. If no variables are explicitly exported, the action is controled by the insmod -[xX] flags. Otherwise, only the variables listed are exported. This obviates the need for the old register_symtab() function. */ #if defined(__GENKSYMS__) /* We want the EXPORT_SYMBOL tag left intact for recognition. */ #elif !defined(CONFIG_MODULES) #define EXPORT_SYMBOL(var) #define EXPORT_SYMBOL_NOVERS(var) #define EXPORT_NO_SYMBOLS #else #define EXPORT_SYMBOL(var) \ const struct module_symbol __export_##var \ __attribute__((section("__ksymtab"))) = { \ (unsigned long)&var, __MODULE_STRING(var) \ } \ #define EXPORT_SYMBOL_NOVERS(var) EXPORT_SYMBOL(var) #ifdef MODULE /* Force a module to export no symbols. */ #define EXPORT_NO_SYMBOLS \ __asm__(".section __ksymtab\n.text") #else #define EXPORT_NO_SYMBOLS #endif /* MODULE */ #endif #endif /* _LINUX_MODULE_H */ |