11da177e4SLinus Torvalds #ifndef _LINUX_MODULE_H 21da177e4SLinus Torvalds #define _LINUX_MODULE_H 31da177e4SLinus Torvalds /* 41da177e4SLinus Torvalds * Dynamic loading of modules into the kernel. 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * Rewritten by Richard Henderson <[email protected]> Dec 1996 71da177e4SLinus Torvalds * Rewritten again by Rusty Russell, 2002 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds #include <linux/list.h> 101da177e4SLinus Torvalds #include <linux/stat.h> 111da177e4SLinus Torvalds #include <linux/compiler.h> 121da177e4SLinus Torvalds #include <linux/cache.h> 131da177e4SLinus Torvalds #include <linux/kmod.h> 141da177e4SLinus Torvalds #include <linux/elf.h> 151da177e4SLinus Torvalds #include <linux/stringify.h> 161da177e4SLinus Torvalds #include <linux/kobject.h> 171da177e4SLinus Torvalds #include <linux/moduleparam.h> 1897e1c18eSMathieu Desnoyers #include <linux/tracepoint.h> 19f5016932SPaul Gortmaker #include <linux/export.h> 201da177e4SLinus Torvalds 21e1783a24SChristoph Lameter #include <linux/percpu.h> 221da177e4SLinus Torvalds #include <asm/module.h> 231da177e4SLinus Torvalds 247ead8b83SLi Zefan #include <trace/events/module.h> 257ead8b83SLi Zefan 261da177e4SLinus Torvalds /* Not Yet Implemented */ 271da177e4SLinus Torvalds #define MODULE_SUPPORTED_DEVICE(name) 281da177e4SLinus Torvalds 29730b69d2SRusty Russell #define MODULE_NAME_LEN MAX_PARAM_PREFIX_LEN 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds struct modversion_info 321da177e4SLinus Torvalds { 331da177e4SLinus Torvalds unsigned long crc; 341da177e4SLinus Torvalds char name[MODULE_NAME_LEN]; 351da177e4SLinus Torvalds }; 361da177e4SLinus Torvalds 371da177e4SLinus Torvalds struct module; 381da177e4SLinus Torvalds 394befb026SKay Sievers struct module_kobject { 404befb026SKay Sievers struct kobject kobj; 414befb026SKay Sievers struct module *mod; 424befb026SKay Sievers struct kobject *drivers_dir; 434befb026SKay Sievers struct module_param_attrs *mp; 444befb026SKay Sievers }; 454befb026SKay Sievers 461da177e4SLinus Torvalds struct module_attribute { 471da177e4SLinus Torvalds struct attribute attr; 484befb026SKay Sievers ssize_t (*show)(struct module_attribute *, struct module_kobject *, 494befb026SKay Sievers char *); 504befb026SKay Sievers ssize_t (*store)(struct module_attribute *, struct module_kobject *, 511da177e4SLinus Torvalds const char *, size_t count); 52c988d2b2SMatt Domsch void (*setup)(struct module *, const char *); 53c988d2b2SMatt Domsch int (*test)(struct module *); 54c988d2b2SMatt Domsch void (*free)(struct module *); 551da177e4SLinus Torvalds }; 561da177e4SLinus Torvalds 57e94965edSDmitry Torokhov struct module_version_attribute { 58e94965edSDmitry Torokhov struct module_attribute mattr; 59e94965edSDmitry Torokhov const char *module_name; 60e94965edSDmitry Torokhov const char *version; 6198562ad8SDmitry Torokhov } __attribute__ ((__aligned__(sizeof(void *)))); 62e94965edSDmitry Torokhov 639b73a584SDmitry Torokhov extern ssize_t __modver_version_show(struct module_attribute *, 644befb026SKay Sievers struct module_kobject *, char *); 659b73a584SDmitry Torokhov 6688bfa324SKay Sievers extern struct module_attribute module_uevent; 671da177e4SLinus Torvalds 681da177e4SLinus Torvalds /* These are either module local, or the kernel's dummy ones. */ 691da177e4SLinus Torvalds extern int init_module(void); 701da177e4SLinus Torvalds extern void cleanup_module(void); 711da177e4SLinus Torvalds 721da177e4SLinus Torvalds /* Archs provide a method of finding the correct exception table. */ 731da177e4SLinus Torvalds struct exception_table_entry; 741da177e4SLinus Torvalds 751da177e4SLinus Torvalds const struct exception_table_entry * 761da177e4SLinus Torvalds search_extable(const struct exception_table_entry *first, 771da177e4SLinus Torvalds const struct exception_table_entry *last, 781da177e4SLinus Torvalds unsigned long value); 791da177e4SLinus Torvalds void sort_extable(struct exception_table_entry *start, 801da177e4SLinus Torvalds struct exception_table_entry *finish); 811da177e4SLinus Torvalds void sort_main_extable(void); 82ad6561dfSRusty Russell void trim_init_extable(struct module *m); 831da177e4SLinus Torvalds 841da177e4SLinus Torvalds #ifdef MODULE 851da177e4SLinus Torvalds #define MODULE_GENERIC_TABLE(gtype,name) \ 861da177e4SLinus Torvalds extern const struct gtype##_id __mod_##gtype##_table \ 871da177e4SLinus Torvalds __attribute__ ((unused, alias(__stringify(name)))) 881da177e4SLinus Torvalds 891da177e4SLinus Torvalds #else /* !MODULE */ 901da177e4SLinus Torvalds #define MODULE_GENERIC_TABLE(gtype,name) 911da177e4SLinus Torvalds #endif 921da177e4SLinus Torvalds 931da177e4SLinus Torvalds /* Generic info of form tag = "info" */ 941da177e4SLinus Torvalds #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info) 951da177e4SLinus Torvalds 961da177e4SLinus Torvalds /* For userspace: you can also call me... */ 971da177e4SLinus Torvalds #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias) 981da177e4SLinus Torvalds 991da177e4SLinus Torvalds /* 1001da177e4SLinus Torvalds * The following license idents are currently accepted as indicating free 1011da177e4SLinus Torvalds * software modules 1021da177e4SLinus Torvalds * 1031da177e4SLinus Torvalds * "GPL" [GNU Public License v2 or later] 1041da177e4SLinus Torvalds * "GPL v2" [GNU Public License v2] 1051da177e4SLinus Torvalds * "GPL and additional rights" [GNU Public License v2 rights and more] 1061da177e4SLinus Torvalds * "Dual BSD/GPL" [GNU Public License v2 1071da177e4SLinus Torvalds * or BSD license choice] 1088d27e908SXose Vazquez Perez * "Dual MIT/GPL" [GNU Public License v2 1098d27e908SXose Vazquez Perez * or MIT license choice] 1101da177e4SLinus Torvalds * "Dual MPL/GPL" [GNU Public License v2 1111da177e4SLinus Torvalds * or Mozilla license choice] 1121da177e4SLinus Torvalds * 1131da177e4SLinus Torvalds * The following other idents are available 1141da177e4SLinus Torvalds * 1151da177e4SLinus Torvalds * "Proprietary" [Non free products] 1161da177e4SLinus Torvalds * 1171da177e4SLinus Torvalds * There are dual licensed components, but when running with Linux it is the 1181da177e4SLinus Torvalds * GPL that is relevant so this is a non issue. Similarly LGPL linked with GPL 1191da177e4SLinus Torvalds * is a GPL combined work. 1201da177e4SLinus Torvalds * 1211da177e4SLinus Torvalds * This exists for several reasons 1221da177e4SLinus Torvalds * 1. So modinfo can show license info for users wanting to vet their setup 1231da177e4SLinus Torvalds * is free 1241da177e4SLinus Torvalds * 2. So the community can ignore bug reports including proprietary modules 1251da177e4SLinus Torvalds * 3. So vendors can do likewise based on their own policies 1261da177e4SLinus Torvalds */ 1271da177e4SLinus Torvalds #define MODULE_LICENSE(_license) MODULE_INFO(license, _license) 1281da177e4SLinus Torvalds 1291d7015caSJohannes Berg /* 1301d7015caSJohannes Berg * Author(s), use "Name <email>" or just "Name", for multiple 1311d7015caSJohannes Berg * authors use multiple MODULE_AUTHOR() statements/lines. 1321d7015caSJohannes Berg */ 1331da177e4SLinus Torvalds #define MODULE_AUTHOR(_author) MODULE_INFO(author, _author) 1341da177e4SLinus Torvalds 1351da177e4SLinus Torvalds /* What your module does. */ 1361da177e4SLinus Torvalds #define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description) 1371da177e4SLinus Torvalds 1381da177e4SLinus Torvalds #define MODULE_DEVICE_TABLE(type,name) \ 1391da177e4SLinus Torvalds MODULE_GENERIC_TABLE(type##_device,name) 1401da177e4SLinus Torvalds 1411da177e4SLinus Torvalds /* Version of form [<epoch>:]<version>[-<extra-version>]. 1421da177e4SLinus Torvalds Or for CVS/RCS ID version, everything but the number is stripped. 1431da177e4SLinus Torvalds <epoch>: A (small) unsigned integer which allows you to start versions 1441da177e4SLinus Torvalds anew. If not mentioned, it's zero. eg. "2:1.0" is after 1451da177e4SLinus Torvalds "1:2.0". 1461da177e4SLinus Torvalds <version>: The <version> may contain only alphanumerics and the 1471da177e4SLinus Torvalds character `.'. Ordered by numeric sort for numeric parts, 1481da177e4SLinus Torvalds ascii sort for ascii parts (as per RPM or DEB algorithm). 1491da177e4SLinus Torvalds <extraversion>: Like <version>, but inserted for local 1501da177e4SLinus Torvalds customizations, eg "rh3" or "rusty1". 1511da177e4SLinus Torvalds 1521da177e4SLinus Torvalds Using this automatically adds a checksum of the .c files and the 1531da177e4SLinus Torvalds local headers in "srcversion". 1541da177e4SLinus Torvalds */ 155e94965edSDmitry Torokhov 1563b90a5b2SRusty Russell #if defined(MODULE) || !defined(CONFIG_SYSFS) 1571da177e4SLinus Torvalds #define MODULE_VERSION(_version) MODULE_INFO(version, _version) 158e94965edSDmitry Torokhov #else 159e94965edSDmitry Torokhov #define MODULE_VERSION(_version) \ 160b4bc8428SDmitry Torokhov static struct module_version_attribute ___modver_attr = { \ 161e94965edSDmitry Torokhov .mattr = { \ 162e94965edSDmitry Torokhov .attr = { \ 163e94965edSDmitry Torokhov .name = "version", \ 164e94965edSDmitry Torokhov .mode = S_IRUGO, \ 165e94965edSDmitry Torokhov }, \ 166e94965edSDmitry Torokhov .show = __modver_version_show, \ 167e94965edSDmitry Torokhov }, \ 168e94965edSDmitry Torokhov .module_name = KBUILD_MODNAME, \ 169e94965edSDmitry Torokhov .version = _version, \ 170b4bc8428SDmitry Torokhov }; \ 171b4bc8428SDmitry Torokhov static const struct module_version_attribute \ 172b4bc8428SDmitry Torokhov __used __attribute__ ((__section__ ("__modver"))) \ 173b4bc8428SDmitry Torokhov * __moduleparam_const __modver_attr = &___modver_attr 174e94965edSDmitry Torokhov #endif 1751da177e4SLinus Torvalds 176187afbedSJon Masters /* Optional firmware file (or files) needed by the module 177187afbedSJon Masters * format is simply firmware file name. Multiple firmware 178187afbedSJon Masters * files require multiple MODULE_FIRMWARE() specifiers */ 179187afbedSJon Masters #define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware) 180187afbedSJon Masters 1811da177e4SLinus Torvalds /* Given an address, look for it in the exception tables */ 1821da177e4SLinus Torvalds const struct exception_table_entry *search_exception_tables(unsigned long add); 1831da177e4SLinus Torvalds 1841da177e4SLinus Torvalds struct notifier_block; 1851da177e4SLinus Torvalds 1861da177e4SLinus Torvalds #ifdef CONFIG_MODULES 1871da177e4SLinus Torvalds 1885ed10910SDave Young extern int modules_disabled; /* for sysctl */ 1891da177e4SLinus Torvalds /* Get/put a kernel symbol (calls must be symmetric) */ 1901da177e4SLinus Torvalds void *__symbol_get(const char *symbol); 1911da177e4SLinus Torvalds void *__symbol_get_gpl(const char *symbol); 1921da177e4SLinus Torvalds #define symbol_get(x) ((typeof(&x))(__symbol_get(MODULE_SYMBOL_PREFIX #x))) 1931da177e4SLinus Torvalds 194c8e21cedSRusty Russell /* modules using other modules: kdb wants to see this. */ 195c8e21cedSRusty Russell struct module_use { 196c8e21cedSRusty Russell struct list_head source_list; 197c8e21cedSRusty Russell struct list_head target_list; 198c8e21cedSRusty Russell struct module *source, *target; 199c8e21cedSRusty Russell }; 200c8e21cedSRusty Russell 2011da177e4SLinus Torvalds enum module_state 2021da177e4SLinus Torvalds { 2031da177e4SLinus Torvalds MODULE_STATE_LIVE, 2041da177e4SLinus Torvalds MODULE_STATE_COMING, 2051da177e4SLinus Torvalds MODULE_STATE_GOING, 2061da177e4SLinus Torvalds }; 2071da177e4SLinus Torvalds 208*bd77c047SEric Dumazet /** 209*bd77c047SEric Dumazet * struct module_ref - per cpu module reference counts 210*bd77c047SEric Dumazet * @incs: number of module get on this cpu 211*bd77c047SEric Dumazet * @decs: number of module put on this cpu 212*bd77c047SEric Dumazet * 213*bd77c047SEric Dumazet * We force an alignment on 8 or 16 bytes, so that alloc_percpu() 214*bd77c047SEric Dumazet * put @incs/@decs in same cache line, with no extra memory cost, 215*bd77c047SEric Dumazet * since alloc_percpu() is fine grained. 216*bd77c047SEric Dumazet */ 217*bd77c047SEric Dumazet struct module_ref { 218*bd77c047SEric Dumazet unsigned long incs; 219*bd77c047SEric Dumazet unsigned long decs; 220*bd77c047SEric Dumazet } __attribute((aligned(2 * sizeof(unsigned long)))); 221*bd77c047SEric Dumazet 2221da177e4SLinus Torvalds struct module 2231da177e4SLinus Torvalds { 2241da177e4SLinus Torvalds enum module_state state; 2251da177e4SLinus Torvalds 2261da177e4SLinus Torvalds /* Member of list of modules */ 2271da177e4SLinus Torvalds struct list_head list; 2281da177e4SLinus Torvalds 2291da177e4SLinus Torvalds /* Unique handle for this module */ 2301da177e4SLinus Torvalds char name[MODULE_NAME_LEN]; 2311da177e4SLinus Torvalds 2321da177e4SLinus Torvalds /* Sysfs stuff. */ 2331da177e4SLinus Torvalds struct module_kobject mkobj; 23403e88ae1SGreg Kroah-Hartman struct module_attribute *modinfo_attrs; 235c988d2b2SMatt Domsch const char *version; 236c988d2b2SMatt Domsch const char *srcversion; 237270a6c4cSKay Sievers struct kobject *holders_dir; 2381da177e4SLinus Torvalds 2391da177e4SLinus Torvalds /* Exported symbols */ 2401da177e4SLinus Torvalds const struct kernel_symbol *syms; 2411da177e4SLinus Torvalds const unsigned long *crcs; 242af540689SRichard Kennedy unsigned int num_syms; 2431da177e4SLinus Torvalds 244e180a6b7SRusty Russell /* Kernel parameters. */ 245e180a6b7SRusty Russell struct kernel_param *kp; 246e180a6b7SRusty Russell unsigned int num_kp; 247e180a6b7SRusty Russell 2481da177e4SLinus Torvalds /* GPL-only exported symbols. */ 2491da177e4SLinus Torvalds unsigned int num_gpl_syms; 250af540689SRichard Kennedy const struct kernel_symbol *gpl_syms; 2511da177e4SLinus Torvalds const unsigned long *gpl_crcs; 2521da177e4SLinus Torvalds 253f7f5b675SDenys Vlasenko #ifdef CONFIG_UNUSED_SYMBOLS 254f71d20e9SArjan van de Ven /* unused exported symbols. */ 255f71d20e9SArjan van de Ven const struct kernel_symbol *unused_syms; 256f71d20e9SArjan van de Ven const unsigned long *unused_crcs; 257af540689SRichard Kennedy unsigned int num_unused_syms; 258af540689SRichard Kennedy 259f71d20e9SArjan van de Ven /* GPL-only, unused exported symbols. */ 260f71d20e9SArjan van de Ven unsigned int num_unused_gpl_syms; 261af540689SRichard Kennedy const struct kernel_symbol *unused_gpl_syms; 262f71d20e9SArjan van de Ven const unsigned long *unused_gpl_crcs; 263f7f5b675SDenys Vlasenko #endif 264f71d20e9SArjan van de Ven 2659f28bb7eSGreg Kroah-Hartman /* symbols that will be GPL-only in the near future. */ 2669f28bb7eSGreg Kroah-Hartman const struct kernel_symbol *gpl_future_syms; 2679f28bb7eSGreg Kroah-Hartman const unsigned long *gpl_future_crcs; 268af540689SRichard Kennedy unsigned int num_gpl_future_syms; 2699f28bb7eSGreg Kroah-Hartman 2701da177e4SLinus Torvalds /* Exception table */ 2711da177e4SLinus Torvalds unsigned int num_exentries; 2725e458cc0SRusty Russell struct exception_table_entry *extable; 2731da177e4SLinus Torvalds 2741da177e4SLinus Torvalds /* Startup function. */ 2751da177e4SLinus Torvalds int (*init)(void); 2761da177e4SLinus Torvalds 2771da177e4SLinus Torvalds /* If this is non-NULL, vfree after init() returns */ 2781da177e4SLinus Torvalds void *module_init; 2791da177e4SLinus Torvalds 2801da177e4SLinus Torvalds /* Here is the actual code + data, vfree'd on unload. */ 2811da177e4SLinus Torvalds void *module_core; 2821da177e4SLinus Torvalds 2831da177e4SLinus Torvalds /* Here are the sizes of the init and core sections */ 2842f0f2a33SDenys Vlasenko unsigned int init_size, core_size; 2851da177e4SLinus Torvalds 2861da177e4SLinus Torvalds /* The size of the executable code in each section. */ 2872f0f2a33SDenys Vlasenko unsigned int init_text_size, core_text_size; 2881da177e4SLinus Torvalds 28984e1c6bbSmatthieu castet /* Size of RO sections of the module (text+rodata) */ 29084e1c6bbSmatthieu castet unsigned int init_ro_size, core_ro_size; 29184e1c6bbSmatthieu castet 2921da177e4SLinus Torvalds /* Arch-specific module values */ 2931da177e4SLinus Torvalds struct mod_arch_specific arch; 2941da177e4SLinus Torvalds 2952bc2d61aSRandy Dunlap unsigned int taints; /* same bits as kernel:tainted */ 2962bc2d61aSRandy Dunlap 2977664c5a1SJeremy Fitzhardinge #ifdef CONFIG_GENERIC_BUG 2987664c5a1SJeremy Fitzhardinge /* Support for BUG */ 299af540689SRichard Kennedy unsigned num_bugs; 3007664c5a1SJeremy Fitzhardinge struct list_head bug_list; 3017664c5a1SJeremy Fitzhardinge struct bug_entry *bug_table; 3021da177e4SLinus Torvalds #endif 3031da177e4SLinus Torvalds 3041da177e4SLinus Torvalds #ifdef CONFIG_KALLSYMS 3054a496226SJan Beulich /* 3064a496226SJan Beulich * We keep the symbol and string tables for kallsyms. 3074a496226SJan Beulich * The core_* fields below are temporary, loader-only (they 3084a496226SJan Beulich * could really be discarded after module init). 3094a496226SJan Beulich */ 3104a496226SJan Beulich Elf_Sym *symtab, *core_symtab; 3114a496226SJan Beulich unsigned int num_symtab, core_num_syms; 312554bdfe5SJan Beulich char *strtab, *core_strtab; 3131da177e4SLinus Torvalds 3141da177e4SLinus Torvalds /* Section attributes */ 3151da177e4SLinus Torvalds struct module_sect_attrs *sect_attrs; 3166d760133SRoland McGrath 3176d760133SRoland McGrath /* Notes attributes */ 3186d760133SRoland McGrath struct module_notes_attrs *notes_attrs; 3191da177e4SLinus Torvalds #endif 3201da177e4SLinus Torvalds 321a288bd65SRichard Kennedy /* The command line arguments (may be mangled). People like 322a288bd65SRichard Kennedy keeping pointers to this stuff */ 323a288bd65SRichard Kennedy char *args; 324a288bd65SRichard Kennedy 325259354deSTejun Heo #ifdef CONFIG_SMP 3261da177e4SLinus Torvalds /* Per-cpu data. */ 327259354deSTejun Heo void __percpu *percpu; 328259354deSTejun Heo unsigned int percpu_size; 329259354deSTejun Heo #endif 3301da177e4SLinus Torvalds 33197e1c18eSMathieu Desnoyers #ifdef CONFIG_TRACEPOINTS 33297e1c18eSMathieu Desnoyers unsigned int num_tracepoints; 333a288bd65SRichard Kennedy struct tracepoint * const *tracepoints_ptrs; 33497e1c18eSMathieu Desnoyers #endif 335bf5438fcSJason Baron #ifdef HAVE_JUMP_LABEL 336bf5438fcSJason Baron struct jump_entry *jump_entries; 337bf5438fcSJason Baron unsigned int num_jump_entries; 338bf5438fcSJason Baron #endif 339769b0441SFrederic Weisbecker #ifdef CONFIG_TRACING 3401ba28e02SLai Jiangshan unsigned int num_trace_bprintk_fmt; 341a288bd65SRichard Kennedy const char **trace_bprintk_fmt_start; 3421ba28e02SLai Jiangshan #endif 3436d723736SSteven Rostedt #ifdef CONFIG_EVENT_TRACING 344e4a9ea5eSSteven Rostedt struct ftrace_event_call **trace_events; 3456d723736SSteven Rostedt unsigned int num_trace_events; 3466d723736SSteven Rostedt #endif 34793eb677dSSteven Rostedt #ifdef CONFIG_FTRACE_MCOUNT_RECORD 34893eb677dSSteven Rostedt unsigned int num_ftrace_callsites; 349a288bd65SRichard Kennedy unsigned long *ftrace_callsites; 35093eb677dSSteven Rostedt #endif 3511ba28e02SLai Jiangshan 352af540689SRichard Kennedy #ifdef CONFIG_MODULE_UNLOAD 353af540689SRichard Kennedy /* What modules depend on me? */ 3542c02dfe7SLinus Torvalds struct list_head source_list; 3552c02dfe7SLinus Torvalds /* What modules do I depend on? */ 3562c02dfe7SLinus Torvalds struct list_head target_list; 357af540689SRichard Kennedy 358af540689SRichard Kennedy /* Who is waiting for us to be unloaded */ 359af540689SRichard Kennedy struct task_struct *waiter; 360af540689SRichard Kennedy 361af540689SRichard Kennedy /* Destruction function. */ 362af540689SRichard Kennedy void (*exit)(void); 363af540689SRichard Kennedy 364*bd77c047SEric Dumazet struct module_ref __percpu *refptr; 365af540689SRichard Kennedy #endif 366b99b87f7SPeter Oberparleiter 367b99b87f7SPeter Oberparleiter #ifdef CONFIG_CONSTRUCTORS 368b99b87f7SPeter Oberparleiter /* Constructor functions. */ 369b99b87f7SPeter Oberparleiter ctor_fn_t *ctors; 370b99b87f7SPeter Oberparleiter unsigned int num_ctors; 371b99b87f7SPeter Oberparleiter #endif 3721da177e4SLinus Torvalds }; 373e61a1c1cSRoman Zippel #ifndef MODULE_ARCH_INIT 374e61a1c1cSRoman Zippel #define MODULE_ARCH_INIT {} 375e61a1c1cSRoman Zippel #endif 3761da177e4SLinus Torvalds 377c6b37801STim Abbott extern struct mutex module_mutex; 378c6b37801STim Abbott 3791da177e4SLinus Torvalds /* FIXME: It'd be nice to isolate modules during init, too, so they 3801da177e4SLinus Torvalds aren't used before they (may) fail. But presently too much code 3811da177e4SLinus Torvalds (IDE & SCSI) require entry into the module during init.*/ 3821da177e4SLinus Torvalds static inline int module_is_live(struct module *mod) 3831da177e4SLinus Torvalds { 3841da177e4SLinus Torvalds return mod->state != MODULE_STATE_GOING; 3851da177e4SLinus Torvalds } 3861da177e4SLinus Torvalds 3871da177e4SLinus Torvalds struct module *__module_text_address(unsigned long addr); 388e610499eSRusty Russell struct module *__module_address(unsigned long addr); 389e610499eSRusty Russell bool is_module_address(unsigned long addr); 39010fad5e4STejun Heo bool is_module_percpu_address(unsigned long addr); 391e610499eSRusty Russell bool is_module_text_address(unsigned long addr); 3921da177e4SLinus Torvalds 393a06f6211SMasami Hiramatsu static inline int within_module_core(unsigned long addr, struct module *mod) 394a06f6211SMasami Hiramatsu { 395a06f6211SMasami Hiramatsu return (unsigned long)mod->module_core <= addr && 396a06f6211SMasami Hiramatsu addr < (unsigned long)mod->module_core + mod->core_size; 397a06f6211SMasami Hiramatsu } 398a06f6211SMasami Hiramatsu 399a06f6211SMasami Hiramatsu static inline int within_module_init(unsigned long addr, struct module *mod) 400a06f6211SMasami Hiramatsu { 401a06f6211SMasami Hiramatsu return (unsigned long)mod->module_init <= addr && 402a06f6211SMasami Hiramatsu addr < (unsigned long)mod->module_init + mod->init_size; 403a06f6211SMasami Hiramatsu } 404a06f6211SMasami Hiramatsu 405c6b37801STim Abbott /* Search for module by name: must hold module_mutex. */ 406c6b37801STim Abbott struct module *find_module(const char *name); 407c6b37801STim Abbott 408c6b37801STim Abbott struct symsearch { 409c6b37801STim Abbott const struct kernel_symbol *start, *stop; 410c6b37801STim Abbott const unsigned long *crcs; 411c6b37801STim Abbott enum { 412c6b37801STim Abbott NOT_GPL_ONLY, 413c6b37801STim Abbott GPL_ONLY, 414c6b37801STim Abbott WILL_BE_GPL_ONLY, 415c6b37801STim Abbott } licence; 416c6b37801STim Abbott bool unused; 417c6b37801STim Abbott }; 418c6b37801STim Abbott 419c6b37801STim Abbott /* Search for an exported symbol by name. */ 420c6b37801STim Abbott const struct kernel_symbol *find_symbol(const char *name, 421c6b37801STim Abbott struct module **owner, 422c6b37801STim Abbott const unsigned long **crc, 423c6b37801STim Abbott bool gplok, 424c6b37801STim Abbott bool warn); 425c6b37801STim Abbott 426c6b37801STim Abbott /* Walk the exported symbol table */ 427de4d8d53SRusty Russell bool each_symbol_section(bool (*fn)(const struct symsearch *arr, 428de4d8d53SRusty Russell struct module *owner, 429de4d8d53SRusty Russell void *data), void *data); 430c6b37801STim Abbott 431ea07890aSAlexey Dobriyan /* Returns 0 and fills in value, defined and namebuf, or -ERANGE if 4321da177e4SLinus Torvalds symnum out of range. */ 433ea07890aSAlexey Dobriyan int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type, 434ea07890aSAlexey Dobriyan char *name, char *module_name, int *exported); 4351da177e4SLinus Torvalds 4361da177e4SLinus Torvalds /* Look for this name: can be of form module:name. */ 4371da177e4SLinus Torvalds unsigned long module_kallsyms_lookup_name(const char *name); 4381da177e4SLinus Torvalds 43975a66614SAnders Kaseorg int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, 44075a66614SAnders Kaseorg struct module *, unsigned long), 44175a66614SAnders Kaseorg void *data); 44275a66614SAnders Kaseorg 4431da177e4SLinus Torvalds extern void __module_put_and_exit(struct module *mod, long code) 4441da177e4SLinus Torvalds __attribute__((noreturn)); 4451da177e4SLinus Torvalds #define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code); 4461da177e4SLinus Torvalds 4471da177e4SLinus Torvalds #ifdef CONFIG_MODULE_UNLOAD 448*bd77c047SEric Dumazet unsigned long module_refcount(struct module *mod); 4491da177e4SLinus Torvalds void __symbol_put(const char *symbol); 4501da177e4SLinus Torvalds #define symbol_put(x) __symbol_put(MODULE_SYMBOL_PREFIX #x) 4511da177e4SLinus Torvalds void symbol_put_addr(void *addr); 4521da177e4SLinus Torvalds 4531da177e4SLinus Torvalds /* Sometimes we know we already have a refcount, and it's easier not 4541da177e4SLinus Torvalds to handle the error case (which only happens with rmmod --wait). */ 4551da177e4SLinus Torvalds static inline void __module_get(struct module *module) 4561da177e4SLinus Torvalds { 4571da177e4SLinus Torvalds if (module) { 458e1783a24SChristoph Lameter preempt_disable(); 4595fbfb18dSNick Piggin __this_cpu_inc(module->refptr->incs); 460ae832d1eSLi Zefan trace_module_get(module, _THIS_IP_); 461e1783a24SChristoph Lameter preempt_enable(); 4621da177e4SLinus Torvalds } 4631da177e4SLinus Torvalds } 4641da177e4SLinus Torvalds 4651da177e4SLinus Torvalds static inline int try_module_get(struct module *module) 4661da177e4SLinus Torvalds { 4671da177e4SLinus Torvalds int ret = 1; 4681da177e4SLinus Torvalds 4691da177e4SLinus Torvalds if (module) { 470e1783a24SChristoph Lameter preempt_disable(); 471e1783a24SChristoph Lameter 4727ead8b83SLi Zefan if (likely(module_is_live(module))) { 4735fbfb18dSNick Piggin __this_cpu_inc(module->refptr->incs); 474ae832d1eSLi Zefan trace_module_get(module, _THIS_IP_); 4755fbfb18dSNick Piggin } else 4761da177e4SLinus Torvalds ret = 0; 477e1783a24SChristoph Lameter 478e1783a24SChristoph Lameter preempt_enable(); 4791da177e4SLinus Torvalds } 4801da177e4SLinus Torvalds return ret; 4811da177e4SLinus Torvalds } 4821da177e4SLinus Torvalds 483f6a57033SAl Viro extern void module_put(struct module *module); 4841da177e4SLinus Torvalds 4851da177e4SLinus Torvalds #else /*!CONFIG_MODULE_UNLOAD*/ 4861da177e4SLinus Torvalds static inline int try_module_get(struct module *module) 4871da177e4SLinus Torvalds { 4881da177e4SLinus Torvalds return !module || module_is_live(module); 4891da177e4SLinus Torvalds } 4901da177e4SLinus Torvalds static inline void module_put(struct module *module) 4911da177e4SLinus Torvalds { 4921da177e4SLinus Torvalds } 4931da177e4SLinus Torvalds static inline void __module_get(struct module *module) 4941da177e4SLinus Torvalds { 4951da177e4SLinus Torvalds } 4961da177e4SLinus Torvalds #define symbol_put(x) do { } while(0) 4971da177e4SLinus Torvalds #define symbol_put_addr(p) do { } while(0) 4981da177e4SLinus Torvalds 4991da177e4SLinus Torvalds #endif /* CONFIG_MODULE_UNLOAD */ 500dfd62d1dSAnders Kaseorg int ref_module(struct module *a, struct module *b); 5011da177e4SLinus Torvalds 5021da177e4SLinus Torvalds /* This is a #define so the string doesn't get put in every .o file */ 5031da177e4SLinus Torvalds #define module_name(mod) \ 5041da177e4SLinus Torvalds ({ \ 5051da177e4SLinus Torvalds struct module *__mod = (mod); \ 5061da177e4SLinus Torvalds __mod ? __mod->name : "kernel"; \ 5071da177e4SLinus Torvalds }) 5081da177e4SLinus Torvalds 5096dd06c9fSRusty Russell /* For kallsyms to ask for address resolution. namebuf should be at 5106dd06c9fSRusty Russell * least KSYM_NAME_LEN long: a pointer to namebuf is returned if 5116dd06c9fSRusty Russell * found, otherwise NULL. */ 51292dfc9dcSAndrew Morton const char *module_address_lookup(unsigned long addr, 5131da177e4SLinus Torvalds unsigned long *symbolsize, 5141da177e4SLinus Torvalds unsigned long *offset, 5156dd06c9fSRusty Russell char **modname, 5166dd06c9fSRusty Russell char *namebuf); 5179d65cb4aSAlexey Dobriyan int lookup_module_symbol_name(unsigned long addr, char *symname); 518a5c43daeSAlexey Dobriyan int lookup_module_symbol_attrs(unsigned long addr, unsigned long *size, unsigned long *offset, char *modname, char *name); 5191da177e4SLinus Torvalds 5201da177e4SLinus Torvalds /* For extable.c to search modules' exception tables. */ 5211da177e4SLinus Torvalds const struct exception_table_entry *search_module_extables(unsigned long addr); 5221da177e4SLinus Torvalds 5231da177e4SLinus Torvalds int register_module_notifier(struct notifier_block * nb); 5241da177e4SLinus Torvalds int unregister_module_notifier(struct notifier_block * nb); 5251da177e4SLinus Torvalds 5261da177e4SLinus Torvalds extern void print_modules(void); 5271da177e4SLinus Torvalds 5281da177e4SLinus Torvalds #else /* !CONFIG_MODULES... */ 5291da177e4SLinus Torvalds 5301da177e4SLinus Torvalds /* Given an address, look for it in the exception tables. */ 5311da177e4SLinus Torvalds static inline const struct exception_table_entry * 5321da177e4SLinus Torvalds search_module_extables(unsigned long addr) 5331da177e4SLinus Torvalds { 5341da177e4SLinus Torvalds return NULL; 5351da177e4SLinus Torvalds } 5361da177e4SLinus Torvalds 537e610499eSRusty Russell static inline struct module *__module_address(unsigned long addr) 538e610499eSRusty Russell { 539e610499eSRusty Russell return NULL; 540e610499eSRusty Russell } 541e610499eSRusty Russell 5421da177e4SLinus Torvalds static inline struct module *__module_text_address(unsigned long addr) 5431da177e4SLinus Torvalds { 5441da177e4SLinus Torvalds return NULL; 5451da177e4SLinus Torvalds } 5461da177e4SLinus Torvalds 547e610499eSRusty Russell static inline bool is_module_address(unsigned long addr) 5484d435f9dSIngo Molnar { 549e610499eSRusty Russell return false; 550e610499eSRusty Russell } 551e610499eSRusty Russell 552d5e50dafSRandy Dunlap static inline bool is_module_percpu_address(unsigned long addr) 553d5e50dafSRandy Dunlap { 554d5e50dafSRandy Dunlap return false; 555d5e50dafSRandy Dunlap } 556d5e50dafSRandy Dunlap 557e610499eSRusty Russell static inline bool is_module_text_address(unsigned long addr) 558e610499eSRusty Russell { 559e610499eSRusty Russell return false; 5604d435f9dSIngo Molnar } 5614d435f9dSIngo Molnar 5621da177e4SLinus Torvalds /* Get/put a kernel symbol (calls should be symmetric) */ 5631da177e4SLinus Torvalds #define symbol_get(x) ({ extern typeof(x) x __attribute__((weak)); &(x); }) 5641da177e4SLinus Torvalds #define symbol_put(x) do { } while(0) 5651da177e4SLinus Torvalds #define symbol_put_addr(x) do { } while(0) 5661da177e4SLinus Torvalds 5671da177e4SLinus Torvalds static inline void __module_get(struct module *module) 5681da177e4SLinus Torvalds { 5691da177e4SLinus Torvalds } 5701da177e4SLinus Torvalds 5711da177e4SLinus Torvalds static inline int try_module_get(struct module *module) 5721da177e4SLinus Torvalds { 5731da177e4SLinus Torvalds return 1; 5741da177e4SLinus Torvalds } 5751da177e4SLinus Torvalds 5761da177e4SLinus Torvalds static inline void module_put(struct module *module) 5771da177e4SLinus Torvalds { 5781da177e4SLinus Torvalds } 5791da177e4SLinus Torvalds 5801da177e4SLinus Torvalds #define module_name(mod) "kernel" 5811da177e4SLinus Torvalds 5821da177e4SLinus Torvalds /* For kallsyms to ask for address resolution. NULL means not found. */ 58392dfc9dcSAndrew Morton static inline const char *module_address_lookup(unsigned long addr, 5841da177e4SLinus Torvalds unsigned long *symbolsize, 5851da177e4SLinus Torvalds unsigned long *offset, 5866dd06c9fSRusty Russell char **modname, 5876dd06c9fSRusty Russell char *namebuf) 5881da177e4SLinus Torvalds { 5891da177e4SLinus Torvalds return NULL; 5901da177e4SLinus Torvalds } 5911da177e4SLinus Torvalds 5929d65cb4aSAlexey Dobriyan static inline int lookup_module_symbol_name(unsigned long addr, char *symname) 5939d65cb4aSAlexey Dobriyan { 5949d65cb4aSAlexey Dobriyan return -ERANGE; 5959d65cb4aSAlexey Dobriyan } 5969d65cb4aSAlexey Dobriyan 597a5c43daeSAlexey Dobriyan static inline int lookup_module_symbol_attrs(unsigned long addr, unsigned long *size, unsigned long *offset, char *modname, char *name) 598a5c43daeSAlexey Dobriyan { 599a5c43daeSAlexey Dobriyan return -ERANGE; 600a5c43daeSAlexey Dobriyan } 601a5c43daeSAlexey Dobriyan 602ea07890aSAlexey Dobriyan static inline int module_get_kallsym(unsigned int symnum, unsigned long *value, 603ea07890aSAlexey Dobriyan char *type, char *name, 604ea07890aSAlexey Dobriyan char *module_name, int *exported) 6051da177e4SLinus Torvalds { 606ea07890aSAlexey Dobriyan return -ERANGE; 6071da177e4SLinus Torvalds } 6081da177e4SLinus Torvalds 6091da177e4SLinus Torvalds static inline unsigned long module_kallsyms_lookup_name(const char *name) 6101da177e4SLinus Torvalds { 6111da177e4SLinus Torvalds return 0; 6121da177e4SLinus Torvalds } 6131da177e4SLinus Torvalds 61475a66614SAnders Kaseorg static inline int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, 61575a66614SAnders Kaseorg struct module *, 61675a66614SAnders Kaseorg unsigned long), 61775a66614SAnders Kaseorg void *data) 61875a66614SAnders Kaseorg { 61975a66614SAnders Kaseorg return 0; 62075a66614SAnders Kaseorg } 62175a66614SAnders Kaseorg 6221da177e4SLinus Torvalds static inline int register_module_notifier(struct notifier_block * nb) 6231da177e4SLinus Torvalds { 6241da177e4SLinus Torvalds /* no events will happen anyway, so this can always succeed */ 6251da177e4SLinus Torvalds return 0; 6261da177e4SLinus Torvalds } 6271da177e4SLinus Torvalds 6281da177e4SLinus Torvalds static inline int unregister_module_notifier(struct notifier_block * nb) 6291da177e4SLinus Torvalds { 6301da177e4SLinus Torvalds return 0; 6311da177e4SLinus Torvalds } 6321da177e4SLinus Torvalds 6331da177e4SLinus Torvalds #define module_put_and_exit(code) do_exit(code) 6341da177e4SLinus Torvalds 6351da177e4SLinus Torvalds static inline void print_modules(void) 6361da177e4SLinus Torvalds { 6371da177e4SLinus Torvalds } 638ef665c1aSRandy Dunlap #endif /* CONFIG_MODULES */ 639ef665c1aSRandy Dunlap 640ef665c1aSRandy Dunlap #ifdef CONFIG_SYSFS 6417405c1e1SGreg Kroah-Hartman extern struct kset *module_kset; 6427405c1e1SGreg Kroah-Hartman extern struct kobj_type module_ktype; 6437405c1e1SGreg Kroah-Hartman extern int module_sysfs_initialized; 644ef665c1aSRandy Dunlap #endif /* CONFIG_SYSFS */ 645ef665c1aSRandy Dunlap 6461da177e4SLinus Torvalds #define symbol_request(x) try_then_request_module(symbol_get(x), "symbol:" #x) 6471da177e4SLinus Torvalds 6481da177e4SLinus Torvalds /* BELOW HERE ALL THESE ARE OBSOLETE AND WILL VANISH */ 6491da177e4SLinus Torvalds 6501da177e4SLinus Torvalds #define __MODULE_STRING(x) __stringify(x) 6511da177e4SLinus Torvalds 65284e1c6bbSmatthieu castet #ifdef CONFIG_DEBUG_SET_MODULE_RONX 65384e1c6bbSmatthieu castet extern void set_all_modules_text_rw(void); 65484e1c6bbSmatthieu castet extern void set_all_modules_text_ro(void); 65584e1c6bbSmatthieu castet #else 65684e1c6bbSmatthieu castet static inline void set_all_modules_text_rw(void) { } 65784e1c6bbSmatthieu castet static inline void set_all_modules_text_ro(void) { } 65884e1c6bbSmatthieu castet #endif 6590d9c25ddSAndrew Morton 6600d9c25ddSAndrew Morton #ifdef CONFIG_GENERIC_BUG 6615336377dSLinus Torvalds void module_bug_finalize(const Elf_Ehdr *, const Elf_Shdr *, 6620d9c25ddSAndrew Morton struct module *); 6630d9c25ddSAndrew Morton void module_bug_cleanup(struct module *); 6640d9c25ddSAndrew Morton 6650d9c25ddSAndrew Morton #else /* !CONFIG_GENERIC_BUG */ 6660d9c25ddSAndrew Morton 6675336377dSLinus Torvalds static inline void module_bug_finalize(const Elf_Ehdr *hdr, 6680d9c25ddSAndrew Morton const Elf_Shdr *sechdrs, 6690d9c25ddSAndrew Morton struct module *mod) 6700d9c25ddSAndrew Morton { 6710d9c25ddSAndrew Morton } 6720d9c25ddSAndrew Morton static inline void module_bug_cleanup(struct module *mod) {} 6730d9c25ddSAndrew Morton #endif /* CONFIG_GENERIC_BUG */ 6740d9c25ddSAndrew Morton 6751da177e4SLinus Torvalds #endif /* _LINUX_MODULE_H */ 676