1bf49d9ddSMasahiro Yamada /* SPDX-License-Identifier: GPL-2.0-only */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds * Dynamic loading of modules into the kernel.
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds * Rewritten by Richard Henderson <[email protected]> Dec 1996
61da177e4SLinus Torvalds * Rewritten again by Rusty Russell, 2002
71da177e4SLinus Torvalds */
8bf49d9ddSMasahiro Yamada
9bf49d9ddSMasahiro Yamada #ifndef _LINUX_MODULE_H
10bf49d9ddSMasahiro Yamada #define _LINUX_MODULE_H
11bf49d9ddSMasahiro Yamada
121da177e4SLinus Torvalds #include <linux/list.h>
131da177e4SLinus Torvalds #include <linux/stat.h>
149294523eSStephen Boyd #include <linux/buildid.h>
151da177e4SLinus Torvalds #include <linux/compiler.h>
161da177e4SLinus Torvalds #include <linux/cache.h>
171da177e4SLinus Torvalds #include <linux/kmod.h>
180fd972a7SPaul Gortmaker #include <linux/init.h>
191da177e4SLinus Torvalds #include <linux/elf.h>
201da177e4SLinus Torvalds #include <linux/stringify.h>
211da177e4SLinus Torvalds #include <linux/kobject.h>
221da177e4SLinus Torvalds #include <linux/moduleparam.h>
23b2e285fcSSteven Rostedt (Red Hat) #include <linux/jump_label.h>
24f5016932SPaul Gortmaker #include <linux/export.h>
2593c2e105SPeter Zijlstra #include <linux/rbtree_latch.h>
26663faf9fSMasami Hiramatsu #include <linux/error-injection.h>
279c0be3f6SMathieu Desnoyers #include <linux/tracepoint-defs.h>
28fe15b50cSPaul E. McKenney #include <linux/srcu.h>
299183c3f9SJosh Poimboeuf #include <linux/static_call_types.h>
307deabd67SJason Baron #include <linux/dynamic_debug.h>
311da177e4SLinus Torvalds
32e1783a24SChristoph Lameter #include <linux/percpu.h>
331da177e4SLinus Torvalds #include <asm/module.h>
341da177e4SLinus Torvalds
35730b69d2SRusty Russell #define MODULE_NAME_LEN MAX_PARAM_PREFIX_LEN
361da177e4SLinus Torvalds
37e865d06bSSeunghun Lee struct modversion_info {
381da177e4SLinus Torvalds unsigned long crc;
391da177e4SLinus Torvalds char name[MODULE_NAME_LEN];
401da177e4SLinus Torvalds };
411da177e4SLinus Torvalds
421da177e4SLinus Torvalds struct module;
430ef76537SPaul Gortmaker struct exception_table_entry;
441da177e4SLinus Torvalds
454befb026SKay Sievers struct module_kobject {
464befb026SKay Sievers struct kobject kobj;
474befb026SKay Sievers struct module *mod;
484befb026SKay Sievers struct kobject *drivers_dir;
494befb026SKay Sievers struct module_param_attrs *mp;
50942e4431SLi Zhong struct completion *kobj_completion;
513859a271SKees Cook } __randomize_layout;
524befb026SKay Sievers
531da177e4SLinus Torvalds struct module_attribute {
541da177e4SLinus Torvalds struct attribute attr;
55f3227ffdSThomas Weißschuh ssize_t (*show)(const struct module_attribute *, struct module_kobject *,
564befb026SKay Sievers char *);
57f3227ffdSThomas Weißschuh ssize_t (*store)(const struct module_attribute *, struct module_kobject *,
581da177e4SLinus Torvalds const char *, size_t count);
59c988d2b2SMatt Domsch void (*setup)(struct module *, const char *);
60c988d2b2SMatt Domsch int (*test)(struct module *);
61c988d2b2SMatt Domsch void (*free)(struct module *);
621da177e4SLinus Torvalds };
631da177e4SLinus Torvalds
64e94965edSDmitry Torokhov struct module_version_attribute {
65e94965edSDmitry Torokhov struct module_attribute mattr;
66e94965edSDmitry Torokhov const char *module_name;
67e94965edSDmitry Torokhov const char *version;
680801a007SJohan Hovold };
69e94965edSDmitry Torokhov
70f3227ffdSThomas Weißschuh extern ssize_t __modver_version_show(const struct module_attribute *,
714befb026SKay Sievers struct module_kobject *, char *);
729b73a584SDmitry Torokhov
73f3227ffdSThomas Weißschuh extern const struct module_attribute module_uevent;
741da177e4SLinus Torvalds
751da177e4SLinus Torvalds /* These are either module local, or the kernel's dummy ones. */
761da177e4SLinus Torvalds extern int init_module(void);
771da177e4SLinus Torvalds extern void cleanup_module(void);
781da177e4SLinus Torvalds
790fd972a7SPaul Gortmaker #ifndef MODULE
800fd972a7SPaul Gortmaker /**
810fd972a7SPaul Gortmaker * module_init() - driver initialization entry point
820fd972a7SPaul Gortmaker * @x: function to be run at kernel boot time or module insertion
830fd972a7SPaul Gortmaker *
840fd972a7SPaul Gortmaker * module_init() will either be called during do_initcalls() (if
850fd972a7SPaul Gortmaker * builtin) or at module insertion time (if a module). There can only
860fd972a7SPaul Gortmaker * be one per module.
870fd972a7SPaul Gortmaker */
880fd972a7SPaul Gortmaker #define module_init(x) __initcall(x);
890fd972a7SPaul Gortmaker
900fd972a7SPaul Gortmaker /**
910fd972a7SPaul Gortmaker * module_exit() - driver exit entry point
920fd972a7SPaul Gortmaker * @x: function to be run when driver is removed
930fd972a7SPaul Gortmaker *
940fd972a7SPaul Gortmaker * module_exit() will wrap the driver clean-up code
950fd972a7SPaul Gortmaker * with cleanup_module() when used with rmmod when
960fd972a7SPaul Gortmaker * the driver is a module. If the driver is statically
970fd972a7SPaul Gortmaker * compiled into the kernel, module_exit() has no effect.
980fd972a7SPaul Gortmaker * There can only be one per module.
990fd972a7SPaul Gortmaker */
1000fd972a7SPaul Gortmaker #define module_exit(x) __exitcall(x);
1010fd972a7SPaul Gortmaker
1020fd972a7SPaul Gortmaker #else /* MODULE */
1030fd972a7SPaul Gortmaker
1040fd972a7SPaul Gortmaker /*
1050fd972a7SPaul Gortmaker * In most cases loadable modules do not need custom
1060fd972a7SPaul Gortmaker * initcall levels. There are still some valid cases where
1070fd972a7SPaul Gortmaker * a driver may be needed early if built in, and does not
1080fd972a7SPaul Gortmaker * matter when built as a loadable module. Like bus
1090fd972a7SPaul Gortmaker * snooping debug drivers.
1100fd972a7SPaul Gortmaker */
1110fd972a7SPaul Gortmaker #define early_initcall(fn) module_init(fn)
1120fd972a7SPaul Gortmaker #define core_initcall(fn) module_init(fn)
1130fd972a7SPaul Gortmaker #define core_initcall_sync(fn) module_init(fn)
1140fd972a7SPaul Gortmaker #define postcore_initcall(fn) module_init(fn)
1150fd972a7SPaul Gortmaker #define postcore_initcall_sync(fn) module_init(fn)
1160fd972a7SPaul Gortmaker #define arch_initcall(fn) module_init(fn)
1170fd972a7SPaul Gortmaker #define subsys_initcall(fn) module_init(fn)
1180fd972a7SPaul Gortmaker #define subsys_initcall_sync(fn) module_init(fn)
1190fd972a7SPaul Gortmaker #define fs_initcall(fn) module_init(fn)
1200fd972a7SPaul Gortmaker #define fs_initcall_sync(fn) module_init(fn)
1210fd972a7SPaul Gortmaker #define rootfs_initcall(fn) module_init(fn)
1220fd972a7SPaul Gortmaker #define device_initcall(fn) module_init(fn)
1230fd972a7SPaul Gortmaker #define device_initcall_sync(fn) module_init(fn)
1240fd972a7SPaul Gortmaker #define late_initcall(fn) module_init(fn)
1250fd972a7SPaul Gortmaker #define late_initcall_sync(fn) module_init(fn)
1260fd972a7SPaul Gortmaker
1270fd972a7SPaul Gortmaker #define console_initcall(fn) module_init(fn)
1280fd972a7SPaul Gortmaker
1290fd972a7SPaul Gortmaker /* Each module must use one module_init(). */
1300fd972a7SPaul Gortmaker #define module_init(initfn) \
1311f318a8bSArnd Bergmann static inline initcall_t __maybe_unused __inittest(void) \
1320fd972a7SPaul Gortmaker { return initfn; } \
133cf68fffbSSami Tolvanen int init_module(void) __copy(initfn) \
134cf68fffbSSami Tolvanen __attribute__((alias(#initfn))); \
13592efda8eSSami Tolvanen ___ADDRESSABLE(init_module, __initdata);
1360fd972a7SPaul Gortmaker
1370fd972a7SPaul Gortmaker /* This is only required if you want to be unloadable. */
1380fd972a7SPaul Gortmaker #define module_exit(exitfn) \
1391f318a8bSArnd Bergmann static inline exitcall_t __maybe_unused __exittest(void) \
1400fd972a7SPaul Gortmaker { return exitfn; } \
141cf68fffbSSami Tolvanen void cleanup_module(void) __copy(exitfn) \
142cf68fffbSSami Tolvanen __attribute__((alias(#exitfn))); \
14392efda8eSSami Tolvanen ___ADDRESSABLE(cleanup_module, __exitdata);
1440fd972a7SPaul Gortmaker
1450fd972a7SPaul Gortmaker #endif
1460fd972a7SPaul Gortmaker
1470fd972a7SPaul Gortmaker /* This means "can be init if no module support, otherwise module load
1480fd972a7SPaul Gortmaker may call it." */
1490fd972a7SPaul Gortmaker #ifdef CONFIG_MODULES
1500fd972a7SPaul Gortmaker #define __init_or_module
1510fd972a7SPaul Gortmaker #define __initdata_or_module
1520fd972a7SPaul Gortmaker #define __initconst_or_module
1530fd972a7SPaul Gortmaker #define __INIT_OR_MODULE .text
1540fd972a7SPaul Gortmaker #define __INITDATA_OR_MODULE .data
1550fd972a7SPaul Gortmaker #define __INITRODATA_OR_MODULE .section ".rodata","a",%progbits
1560fd972a7SPaul Gortmaker #else
1570fd972a7SPaul Gortmaker #define __init_or_module __init
1580fd972a7SPaul Gortmaker #define __initdata_or_module __initdata
1590fd972a7SPaul Gortmaker #define __initconst_or_module __initconst
1600fd972a7SPaul Gortmaker #define __INIT_OR_MODULE __INIT
1610fd972a7SPaul Gortmaker #define __INITDATA_OR_MODULE __INITDATA
1620fd972a7SPaul Gortmaker #define __INITRODATA_OR_MODULE __INITRODATA
1630fd972a7SPaul Gortmaker #endif /*CONFIG_MODULES*/
1640fd972a7SPaul Gortmaker
1657c76c813SShyam Saini struct module_kobject *lookup_or_create_module_kobject(const char *name);
1667c76c813SShyam Saini
1671da177e4SLinus Torvalds /* Generic info of form tag = "info" */
1681da177e4SLinus Torvalds #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)
1691da177e4SLinus Torvalds
1701da177e4SLinus Torvalds /* For userspace: you can also call me... */
1711da177e4SLinus Torvalds #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias)
1721da177e4SLinus Torvalds
1737cb14ba7SAndreas Robinson /* Soft module dependencies. See man modprobe.d for details.
1747cb14ba7SAndreas Robinson * Example: MODULE_SOFTDEP("pre: module-foo module-bar post: module-baz")
1757cb14ba7SAndreas Robinson */
1767cb14ba7SAndreas Robinson #define MODULE_SOFTDEP(_softdep) MODULE_INFO(softdep, _softdep)
1777cb14ba7SAndreas Robinson
1781da177e4SLinus Torvalds /*
17961842868SJose Ignacio Tornos Martinez * Weak module dependencies. See man modprobe.d for details.
18061842868SJose Ignacio Tornos Martinez * Example: MODULE_WEAKDEP("module-foo")
18161842868SJose Ignacio Tornos Martinez */
18261842868SJose Ignacio Tornos Martinez #define MODULE_WEAKDEP(_weakdep) MODULE_INFO(weakdep, _weakdep)
18361842868SJose Ignacio Tornos Martinez
18461842868SJose Ignacio Tornos Martinez /*
1858b41fc44SMasahiro Yamada * MODULE_FILE is used for generating modules.builtin
1868b41fc44SMasahiro Yamada * So, make it no-op when this is being built as a module
1878b41fc44SMasahiro Yamada */
1888b41fc44SMasahiro Yamada #ifdef MODULE
1898b41fc44SMasahiro Yamada #define MODULE_FILE
1908b41fc44SMasahiro Yamada #else
1918b41fc44SMasahiro Yamada #define MODULE_FILE MODULE_INFO(file, KBUILD_MODFILE);
1928b41fc44SMasahiro Yamada #endif
1938b41fc44SMasahiro Yamada
1948b41fc44SMasahiro Yamada /*
1951da177e4SLinus Torvalds * The following license idents are currently accepted as indicating free
1961da177e4SLinus Torvalds * software modules
1971da177e4SLinus Torvalds *
198bf7fbeeaSThomas Gleixner * "GPL" [GNU Public License v2]
1991da177e4SLinus Torvalds * "GPL v2" [GNU Public License v2]
2001da177e4SLinus Torvalds * "GPL and additional rights" [GNU Public License v2 rights and more]
2011da177e4SLinus Torvalds * "Dual BSD/GPL" [GNU Public License v2
2021da177e4SLinus Torvalds * or BSD license choice]
2038d27e908SXose Vazquez Perez * "Dual MIT/GPL" [GNU Public License v2
2048d27e908SXose Vazquez Perez * or MIT license choice]
2051da177e4SLinus Torvalds * "Dual MPL/GPL" [GNU Public License v2
2061da177e4SLinus Torvalds * or Mozilla license choice]
2071da177e4SLinus Torvalds *
2081da177e4SLinus Torvalds * The following other idents are available
2091da177e4SLinus Torvalds *
2101da177e4SLinus Torvalds * "Proprietary" [Non free products]
2111da177e4SLinus Torvalds *
212bf7fbeeaSThomas Gleixner * Both "GPL v2" and "GPL" (the latter also in dual licensed strings) are
213bf7fbeeaSThomas Gleixner * merely stating that the module is licensed under the GPL v2, but are not
214bf7fbeeaSThomas Gleixner * telling whether "GPL v2 only" or "GPL v2 or later". The reason why there
215bf7fbeeaSThomas Gleixner * are two variants is a historic and failed attempt to convey more
216bf7fbeeaSThomas Gleixner * information in the MODULE_LICENSE string. For module loading the
217bf7fbeeaSThomas Gleixner * "only/or later" distinction is completely irrelevant and does neither
218bf7fbeeaSThomas Gleixner * replace the proper license identifiers in the corresponding source file
219bf7fbeeaSThomas Gleixner * nor amends them in any way. The sole purpose is to make the
220bf7fbeeaSThomas Gleixner * 'Proprietary' flagging work and to refuse to bind symbols which are
221bf7fbeeaSThomas Gleixner * exported with EXPORT_SYMBOL_GPL when a non free module is loaded.
222bf7fbeeaSThomas Gleixner *
223bf7fbeeaSThomas Gleixner * In the same way "BSD" is not a clear license information. It merely
224bf7fbeeaSThomas Gleixner * states, that the module is licensed under one of the compatible BSD
225bf7fbeeaSThomas Gleixner * license variants. The detailed and correct license information is again
226bf7fbeeaSThomas Gleixner * to be found in the corresponding source files.
227bf7fbeeaSThomas Gleixner *
2281da177e4SLinus Torvalds * There are dual licensed components, but when running with Linux it is the
2291da177e4SLinus Torvalds * GPL that is relevant so this is a non issue. Similarly LGPL linked with GPL
2301da177e4SLinus Torvalds * is a GPL combined work.
2311da177e4SLinus Torvalds *
2321da177e4SLinus Torvalds * This exists for several reasons
2331da177e4SLinus Torvalds * 1. So modinfo can show license info for users wanting to vet their setup
2341da177e4SLinus Torvalds * is free
2351da177e4SLinus Torvalds * 2. So the community can ignore bug reports including proprietary modules
2361da177e4SLinus Torvalds * 3. So vendors can do likewise based on their own policies
2371da177e4SLinus Torvalds */
2388b41fc44SMasahiro Yamada #define MODULE_LICENSE(_license) MODULE_FILE MODULE_INFO(license, _license)
2391da177e4SLinus Torvalds
2401d7015caSJohannes Berg /*
2411d7015caSJohannes Berg * Author(s), use "Name <email>" or just "Name", for multiple
2421d7015caSJohannes Berg * authors use multiple MODULE_AUTHOR() statements/lines.
2431d7015caSJohannes Berg */
2441da177e4SLinus Torvalds #define MODULE_AUTHOR(_author) MODULE_INFO(author, _author)
2451da177e4SLinus Torvalds
2461da177e4SLinus Torvalds /* What your module does. */
2471da177e4SLinus Torvalds #define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)
2481da177e4SLinus Torvalds
249cff26a51SRusty Russell #ifdef MODULE
250cff26a51SRusty Russell /* Creates an alias so file2alias.c can find device table. */
2511da177e4SLinus Torvalds #define MODULE_DEVICE_TABLE(type, name) \
252054a9cd3SMasahiro Yamada extern typeof(name) __mod_device_table__##type##__##name \
253cff26a51SRusty Russell __attribute__ ((unused, alias(__stringify(name))))
254cff26a51SRusty Russell #else /* !MODULE */
255cff26a51SRusty Russell #define MODULE_DEVICE_TABLE(type, name)
256cff26a51SRusty Russell #endif
2571da177e4SLinus Torvalds
2581da177e4SLinus Torvalds /* Version of form [<epoch>:]<version>[-<extra-version>].
259e865d06bSSeunghun Lee * Or for CVS/RCS ID version, everything but the number is stripped.
260e865d06bSSeunghun Lee * <epoch>: A (small) unsigned integer which allows you to start versions
261e865d06bSSeunghun Lee * anew. If not mentioned, it's zero. eg. "2:1.0" is after
262e865d06bSSeunghun Lee * "1:2.0".
2631da177e4SLinus Torvalds
264e865d06bSSeunghun Lee * <version>: The <version> may contain only alphanumerics and the
265e865d06bSSeunghun Lee * character `.'. Ordered by numeric sort for numeric parts,
266e865d06bSSeunghun Lee * ascii sort for ascii parts (as per RPM or DEB algorithm).
267e865d06bSSeunghun Lee
268e865d06bSSeunghun Lee * <extraversion>: Like <version>, but inserted for local
269e865d06bSSeunghun Lee * customizations, eg "rh3" or "rusty1".
270e865d06bSSeunghun Lee
271e865d06bSSeunghun Lee * Using this automatically adds a checksum of the .c files and the
272e865d06bSSeunghun Lee * local headers in "srcversion".
2731da177e4SLinus Torvalds */
274e94965edSDmitry Torokhov
2753b90a5b2SRusty Russell #if defined(MODULE) || !defined(CONFIG_SYSFS)
2761da177e4SLinus Torvalds #define MODULE_VERSION(_version) MODULE_INFO(version, _version)
277e94965edSDmitry Torokhov #else
278e94965edSDmitry Torokhov #define MODULE_VERSION(_version) \
279898490c0SAlexey Gladkov MODULE_INFO(version, _version); \
28038e3fe65SThomas Weißschuh static const struct module_version_attribute __modver_attr \
281b112082cSJohan Hovold __used __section("__modver") \
282b112082cSJohan Hovold __aligned(__alignof__(struct module_version_attribute)) \
283b112082cSJohan Hovold = { \
284e94965edSDmitry Torokhov .mattr = { \
285e94965edSDmitry Torokhov .attr = { \
286e94965edSDmitry Torokhov .name = "version", \
287e94965edSDmitry Torokhov .mode = S_IRUGO, \
288e94965edSDmitry Torokhov }, \
289e94965edSDmitry Torokhov .show = __modver_version_show, \
290e94965edSDmitry Torokhov }, \
291e94965edSDmitry Torokhov .module_name = KBUILD_MODNAME, \
292e94965edSDmitry Torokhov .version = _version, \
2932d26c716SJohan Hovold }
294e94965edSDmitry Torokhov #endif
2951da177e4SLinus Torvalds
296187afbedSJon Masters /* Optional firmware file (or files) needed by the module
297187afbedSJon Masters * format is simply firmware file name. Multiple firmware
298187afbedSJon Masters * files require multiple MODULE_FIRMWARE() specifiers */
299187afbedSJon Masters #define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware)
300187afbedSJon Masters
301cdd30ebbSPeter Zijlstra #define MODULE_IMPORT_NS(ns) MODULE_INFO(import_ns, ns)
3023e4d890aSLinus Torvalds
3031da177e4SLinus Torvalds struct notifier_block;
3041da177e4SLinus Torvalds
3051da177e4SLinus Torvalds #ifdef CONFIG_MODULES
3061da177e4SLinus Torvalds
3075ed10910SDave Young extern int modules_disabled; /* for sysctl */
3081da177e4SLinus Torvalds /* Get/put a kernel symbol (calls must be symmetric) */
3091da177e4SLinus Torvalds void *__symbol_get(const char *symbol);
3101da177e4SLinus Torvalds void *__symbol_get_gpl(const char *symbol);
3114c56eb33SMasahiro Yamada #define symbol_get(x) ({ \
3124c56eb33SMasahiro Yamada static const char __notrim[] \
3134c56eb33SMasahiro Yamada __used __section(".no_trim_symbol") = __stringify(x); \
3144c56eb33SMasahiro Yamada (typeof(&x))(__symbol_get(__stringify(x))); })
3151da177e4SLinus Torvalds
316c8e21cedSRusty Russell /* modules using other modules: kdb wants to see this. */
317c8e21cedSRusty Russell struct module_use {
318c8e21cedSRusty Russell struct list_head source_list;
319c8e21cedSRusty Russell struct list_head target_list;
320c8e21cedSRusty Russell struct module *source, *target;
321c8e21cedSRusty Russell };
322c8e21cedSRusty Russell
3230d21b0e3SRusty Russell enum module_state {
3240d21b0e3SRusty Russell MODULE_STATE_LIVE, /* Normal state. */
3250d21b0e3SRusty Russell MODULE_STATE_COMING, /* Full formed, running module_init. */
3260d21b0e3SRusty Russell MODULE_STATE_GOING, /* Going away. */
3270d21b0e3SRusty Russell MODULE_STATE_UNFORMED, /* Still setting it up. */
3281da177e4SLinus Torvalds };
3291da177e4SLinus Torvalds
33093c2e105SPeter Zijlstra struct mod_tree_node {
33193c2e105SPeter Zijlstra struct module *mod;
33293c2e105SPeter Zijlstra struct latch_tree_node node;
33393c2e105SPeter Zijlstra };
33493c2e105SPeter Zijlstra
335ac3b4328SSong Liu enum mod_mem_type {
336ac3b4328SSong Liu MOD_TEXT = 0,
337ac3b4328SSong Liu MOD_DATA,
338ac3b4328SSong Liu MOD_RODATA,
339ac3b4328SSong Liu MOD_RO_AFTER_INIT,
340ac3b4328SSong Liu MOD_INIT_TEXT,
341ac3b4328SSong Liu MOD_INIT_DATA,
342ac3b4328SSong Liu MOD_INIT_RODATA,
343ac3b4328SSong Liu
344ac3b4328SSong Liu MOD_MEM_NUM_TYPES,
345ac3b4328SSong Liu MOD_INVALID = -1,
346ac3b4328SSong Liu };
347ac3b4328SSong Liu
348ac3b4328SSong Liu #define mod_mem_type_is_init(type) \
349ac3b4328SSong Liu ((type) == MOD_INIT_TEXT || \
350ac3b4328SSong Liu (type) == MOD_INIT_DATA || \
351ac3b4328SSong Liu (type) == MOD_INIT_RODATA)
352ac3b4328SSong Liu
353ac3b4328SSong Liu #define mod_mem_type_is_core(type) (!mod_mem_type_is_init(type))
354ac3b4328SSong Liu
355ac3b4328SSong Liu #define mod_mem_type_is_text(type) \
356ac3b4328SSong Liu ((type) == MOD_TEXT || \
357ac3b4328SSong Liu (type) == MOD_INIT_TEXT)
358ac3b4328SSong Liu
359ac3b4328SSong Liu #define mod_mem_type_is_data(type) (!mod_mem_type_is_text(type))
360ac3b4328SSong Liu
361ac3b4328SSong Liu #define mod_mem_type_is_core_data(type) \
362ac3b4328SSong Liu (mod_mem_type_is_core(type) && \
363ac3b4328SSong Liu mod_mem_type_is_data(type))
364ac3b4328SSong Liu
365ac3b4328SSong Liu #define for_each_mod_mem_type(type) \
366ac3b4328SSong Liu for (enum mod_mem_type (type) = 0; \
367ac3b4328SSong Liu (type) < MOD_MEM_NUM_TYPES; (type)++)
368ac3b4328SSong Liu
369ac3b4328SSong Liu #define for_class_mod_mem_type(type, class) \
370ac3b4328SSong Liu for_each_mod_mem_type(type) \
371ac3b4328SSong Liu if (mod_mem_type_is_##class(type))
372ac3b4328SSong Liu
373ac3b4328SSong Liu struct module_memory {
3747523e4dcSRusty Russell void *base;
3750c133b1eSMike Rapoport (Microsoft) bool is_rox;
3767523e4dcSRusty Russell unsigned int size;
3777523e4dcSRusty Russell
3787523e4dcSRusty Russell #ifdef CONFIG_MODULES_TREE_LOOKUP
3797523e4dcSRusty Russell struct mod_tree_node mtn;
3807523e4dcSRusty Russell #endif
3817523e4dcSRusty Russell };
3827523e4dcSRusty Russell
3837523e4dcSRusty Russell #ifdef CONFIG_MODULES_TREE_LOOKUP
3847523e4dcSRusty Russell /* Only touch one cacheline for common rbtree-for-core-layout case. */
385ac3b4328SSong Liu #define __module_memory_align ____cacheline_aligned
3867523e4dcSRusty Russell #else
387ac3b4328SSong Liu #define __module_memory_align
3887523e4dcSRusty Russell #endif
3897523e4dcSRusty Russell
3908244062eSRusty Russell struct mod_kallsyms {
3918244062eSRusty Russell Elf_Sym *symtab;
3928244062eSRusty Russell unsigned int num_symtab;
3938244062eSRusty Russell char *strtab;
3941c7651f4SEugene Loh char *typetab;
3958244062eSRusty Russell };
3968244062eSRusty Russell
3971ce15ef4SJessica Yu #ifdef CONFIG_LIVEPATCH
398eca0edafSMarcos Paulo de Souza /**
3996486a57fSAlexey Dobriyan * struct klp_modinfo - ELF information preserved from the livepatch module
400eca0edafSMarcos Paulo de Souza *
4016486a57fSAlexey Dobriyan * @hdr: ELF header
402eca0edafSMarcos Paulo de Souza * @sechdrs: Section header table
403eca0edafSMarcos Paulo de Souza * @secstrings: String table for the section headers
404eca0edafSMarcos Paulo de Souza * @symndx: The symbol table section index
405eca0edafSMarcos Paulo de Souza */
4061ce15ef4SJessica Yu struct klp_modinfo {
4071ce15ef4SJessica Yu Elf_Ehdr hdr;
4081ce15ef4SJessica Yu Elf_Shdr *sechdrs;
4091ce15ef4SJessica Yu char *secstrings;
4101ce15ef4SJessica Yu unsigned int symndx;
4111ce15ef4SJessica Yu };
4121ce15ef4SJessica Yu #endif
4131ce15ef4SJessica Yu
414e865d06bSSeunghun Lee struct module {
4151da177e4SLinus Torvalds enum module_state state;
4161da177e4SLinus Torvalds
4171da177e4SLinus Torvalds /* Member of list of modules */
4181da177e4SLinus Torvalds struct list_head list;
4191da177e4SLinus Torvalds
4201da177e4SLinus Torvalds /* Unique handle for this module */
4211da177e4SLinus Torvalds char name[MODULE_NAME_LEN];
4221da177e4SLinus Torvalds
4239294523eSStephen Boyd #ifdef CONFIG_STACKTRACE_BUILD_ID
4249294523eSStephen Boyd /* Module build ID */
4259294523eSStephen Boyd unsigned char build_id[BUILD_ID_SIZE_MAX];
4269294523eSStephen Boyd #endif
4279294523eSStephen Boyd
4281da177e4SLinus Torvalds /* Sysfs stuff. */
4291da177e4SLinus Torvalds struct module_kobject mkobj;
43003e88ae1SGreg Kroah-Hartman struct module_attribute *modinfo_attrs;
431c988d2b2SMatt Domsch const char *version;
432c988d2b2SMatt Domsch const char *srcversion;
433270a6c4cSKay Sievers struct kobject *holders_dir;
4341da177e4SLinus Torvalds
4351da177e4SLinus Torvalds /* Exported symbols */
4361da177e4SLinus Torvalds const struct kernel_symbol *syms;
4371cd9502eSMasahiro Yamada const u32 *crcs;
438af540689SRichard Kennedy unsigned int num_syms;
4391da177e4SLinus Torvalds
44089245600SSami Tolvanen #ifdef CONFIG_ARCH_USES_CFI_TRAPS
44189245600SSami Tolvanen s32 *kcfi_traps;
44289245600SSami Tolvanen s32 *kcfi_traps_end;
443cf68fffbSSami Tolvanen #endif
444cf68fffbSSami Tolvanen
445e180a6b7SRusty Russell /* Kernel parameters. */
446cf2fde7bSRusty Russell #ifdef CONFIG_SYSFS
447b51d23e4SDan Streetman struct mutex param_lock;
448cf2fde7bSRusty Russell #endif
449e180a6b7SRusty Russell struct kernel_param *kp;
450e180a6b7SRusty Russell unsigned int num_kp;
451e180a6b7SRusty Russell
4521da177e4SLinus Torvalds /* GPL-only exported symbols. */
4531da177e4SLinus Torvalds unsigned int num_gpl_syms;
454af540689SRichard Kennedy const struct kernel_symbol *gpl_syms;
4551cd9502eSMasahiro Yamada const u32 *gpl_crcs;
456262e6ae7SChristoph Hellwig bool using_gplonly_symbols;
4571da177e4SLinus Torvalds
458106a4ee2SRusty Russell #ifdef CONFIG_MODULE_SIG
459106a4ee2SRusty Russell /* Signature was verified. */
460106a4ee2SRusty Russell bool sig_ok;
461106a4ee2SRusty Russell #endif
462106a4ee2SRusty Russell
463f2411da7SLuis R. Rodriguez bool async_probe_requested;
464f2411da7SLuis R. Rodriguez
4651da177e4SLinus Torvalds /* Exception table */
4661da177e4SLinus Torvalds unsigned int num_exentries;
4675e458cc0SRusty Russell struct exception_table_entry *extable;
4681da177e4SLinus Torvalds
4691da177e4SLinus Torvalds /* Startup function. */
4701da177e4SLinus Torvalds int (*init)(void);
4711da177e4SLinus Torvalds
472ac3b4328SSong Liu struct module_memory mem[MOD_MEM_NUM_TYPES] __module_memory_align;
47384e1c6bbSmatthieu castet
4741da177e4SLinus Torvalds /* Arch-specific module values */
4751da177e4SLinus Torvalds struct mod_arch_specific arch;
4761da177e4SLinus Torvalds
4777fd8329bSPetr Mladek unsigned long taints; /* same bits as kernel:taint_flags */
4782bc2d61aSRandy Dunlap
4797664c5a1SJeremy Fitzhardinge #ifdef CONFIG_GENERIC_BUG
4807664c5a1SJeremy Fitzhardinge /* Support for BUG */
481af540689SRichard Kennedy unsigned num_bugs;
4827664c5a1SJeremy Fitzhardinge struct list_head bug_list;
4837664c5a1SJeremy Fitzhardinge struct bug_entry *bug_table;
4841da177e4SLinus Torvalds #endif
4851da177e4SLinus Torvalds
4861da177e4SLinus Torvalds #ifdef CONFIG_KALLSYMS
4878244062eSRusty Russell /* Protected by RCU and/or module_mutex: use rcu_dereference() */
4886080d608SMadhuparna Bhowmik struct mod_kallsyms __rcu *kallsyms;
4898244062eSRusty Russell struct mod_kallsyms core_kallsyms;
4901da177e4SLinus Torvalds
4911da177e4SLinus Torvalds /* Section attributes */
4921da177e4SLinus Torvalds struct module_sect_attrs *sect_attrs;
4936d760133SRoland McGrath
4946d760133SRoland McGrath /* Notes attributes */
4956d760133SRoland McGrath struct module_notes_attrs *notes_attrs;
4961da177e4SLinus Torvalds #endif
4971da177e4SLinus Torvalds
498a288bd65SRichard Kennedy /* The command line arguments (may be mangled). People like
499a288bd65SRichard Kennedy keeping pointers to this stuff */
500a288bd65SRichard Kennedy char *args;
501a288bd65SRichard Kennedy
502259354deSTejun Heo #ifdef CONFIG_SMP
5031da177e4SLinus Torvalds /* Per-cpu data. */
504259354deSTejun Heo void __percpu *percpu;
505259354deSTejun Heo unsigned int percpu_size;
506259354deSTejun Heo #endif
50766e9b071SThomas Gleixner void *noinstr_text_start;
50866e9b071SThomas Gleixner unsigned int noinstr_text_size;
5091da177e4SLinus Torvalds
51097e1c18eSMathieu Desnoyers #ifdef CONFIG_TRACEPOINTS
51197e1c18eSMathieu Desnoyers unsigned int num_tracepoints;
5129c0be3f6SMathieu Desnoyers tracepoint_ptr_t *tracepoints_ptrs;
51397e1c18eSMathieu Desnoyers #endif
514fe15b50cSPaul E. McKenney #ifdef CONFIG_TREE_SRCU
515fe15b50cSPaul E. McKenney unsigned int num_srcu_structs;
516fe15b50cSPaul E. McKenney struct srcu_struct **srcu_struct_ptrs;
517fe15b50cSPaul E. McKenney #endif
518a38d1107SMatt Mullins #ifdef CONFIG_BPF_EVENTS
519a38d1107SMatt Mullins unsigned int num_bpf_raw_events;
520a38d1107SMatt Mullins struct bpf_raw_event_map *bpf_raw_events;
521a38d1107SMatt Mullins #endif
52236e68442SAndrii Nakryiko #ifdef CONFIG_DEBUG_INFO_BTF_MODULES
52336e68442SAndrii Nakryiko unsigned int btf_data_size;
524d4e48e3dSAlan Maguire unsigned int btf_base_data_size;
52536e68442SAndrii Nakryiko void *btf_data;
526d4e48e3dSAlan Maguire void *btf_base_data;
52736e68442SAndrii Nakryiko #endif
528e9666d10SMasahiro Yamada #ifdef CONFIG_JUMP_LABEL
529bf5438fcSJason Baron struct jump_entry *jump_entries;
530bf5438fcSJason Baron unsigned int num_jump_entries;
531bf5438fcSJason Baron #endif
532769b0441SFrederic Weisbecker #ifdef CONFIG_TRACING
5331ba28e02SLai Jiangshan unsigned int num_trace_bprintk_fmt;
534a288bd65SRichard Kennedy const char **trace_bprintk_fmt_start;
5351ba28e02SLai Jiangshan #endif
5366d723736SSteven Rostedt #ifdef CONFIG_EVENT_TRACING
5372425bcb9SSteven Rostedt (Red Hat) struct trace_event_call **trace_events;
5386d723736SSteven Rostedt unsigned int num_trace_events;
53999be647cSJeremy Linton struct trace_eval_map **trace_evals;
54099be647cSJeremy Linton unsigned int num_trace_evals;
5416d723736SSteven Rostedt #endif
54293eb677dSSteven Rostedt #ifdef CONFIG_FTRACE_MCOUNT_RECORD
54393eb677dSSteven Rostedt unsigned int num_ftrace_callsites;
544a288bd65SRichard Kennedy unsigned long *ftrace_callsites;
54593eb677dSSteven Rostedt #endif
5461e6769b0SMasami Hiramatsu #ifdef CONFIG_KPROBES
5471e6769b0SMasami Hiramatsu void *kprobes_text_start;
5481e6769b0SMasami Hiramatsu unsigned int kprobes_text_size;
54916db6264SMasami Hiramatsu unsigned long *kprobe_blacklist;
55016db6264SMasami Hiramatsu unsigned int num_kprobe_blacklist;
5511e6769b0SMasami Hiramatsu #endif
5529183c3f9SJosh Poimboeuf #ifdef CONFIG_HAVE_STATIC_CALL_INLINE
5539183c3f9SJosh Poimboeuf int num_static_call_sites;
5549183c3f9SJosh Poimboeuf struct static_call_site *static_call_sites;
5559183c3f9SJosh Poimboeuf #endif
5563d6e4462SJeremy Kerr #if IS_ENABLED(CONFIG_KUNIT)
557d81f0d7bSRae Moar int num_kunit_init_suites;
558d81f0d7bSRae Moar struct kunit_suite **kunit_init_suites;
5593d6e4462SJeremy Kerr int num_kunit_suites;
560e5857d39SDaniel Latypov struct kunit_suite **kunit_suites;
5613d6e4462SJeremy Kerr #endif
5623d6e4462SJeremy Kerr
5631ba28e02SLai Jiangshan
5648cb2c2dcSPetr Mladek #ifdef CONFIG_LIVEPATCH
5651ce15ef4SJessica Yu bool klp; /* Is this a livepatch module? */
5668cb2c2dcSPetr Mladek bool klp_alive;
5671ce15ef4SJessica Yu
5686486a57fSAlexey Dobriyan /* ELF information */
5691ce15ef4SJessica Yu struct klp_modinfo *klp_info;
5708cb2c2dcSPetr Mladek #endif
5718cb2c2dcSPetr Mladek
57233701557SChris Down #ifdef CONFIG_PRINTK_INDEX
57333701557SChris Down unsigned int printk_index_size;
57433701557SChris Down struct pi_entry **printk_index_start;
57533701557SChris Down #endif
57633701557SChris Down
577af540689SRichard Kennedy #ifdef CONFIG_MODULE_UNLOAD
578af540689SRichard Kennedy /* What modules depend on me? */
5792c02dfe7SLinus Torvalds struct list_head source_list;
5802c02dfe7SLinus Torvalds /* What modules do I depend on? */
5812c02dfe7SLinus Torvalds struct list_head target_list;
582af540689SRichard Kennedy
583af540689SRichard Kennedy /* Destruction function. */
584af540689SRichard Kennedy void (*exit)(void);
585af540689SRichard Kennedy
5862f35c41fSMasami Hiramatsu atomic_t refcnt;
587af540689SRichard Kennedy #endif
588b99b87f7SPeter Oberparleiter
589*872df34dSPeter Zijlstra #ifdef CONFIG_MITIGATION_ITS
590*872df34dSPeter Zijlstra int its_num_pages;
591*872df34dSPeter Zijlstra void **its_page_array;
592*872df34dSPeter Zijlstra #endif
593*872df34dSPeter Zijlstra
594b99b87f7SPeter Oberparleiter #ifdef CONFIG_CONSTRUCTORS
595b99b87f7SPeter Oberparleiter /* Constructor functions. */
596b99b87f7SPeter Oberparleiter ctor_fn_t *ctors;
597b99b87f7SPeter Oberparleiter unsigned int num_ctors;
598b99b87f7SPeter Oberparleiter #endif
59992ace999SJosef Bacik
600540adea3SMasami Hiramatsu #ifdef CONFIG_FUNCTION_ERROR_INJECTION
601663faf9fSMasami Hiramatsu struct error_injection_entry *ei_funcs;
602540adea3SMasami Hiramatsu unsigned int num_ei_funcs;
60392ace999SJosef Bacik #endif
6047deabd67SJason Baron #ifdef CONFIG_DYNAMIC_DEBUG_CORE
6057deabd67SJason Baron struct _ddebug_info dyndbg_info;
6067deabd67SJason Baron #endif
6073859a271SKees Cook } ____cacheline_aligned __randomize_layout;
608e61a1c1cSRoman Zippel #ifndef MODULE_ARCH_INIT
609e61a1c1cSRoman Zippel #define MODULE_ARCH_INIT {}
610e61a1c1cSRoman Zippel #endif
6111da177e4SLinus Torvalds
61293d77e7fSVincent Whitchurch #ifndef HAVE_ARCH_KALLSYMS_SYMBOL_VALUE
kallsyms_symbol_value(const Elf_Sym * sym)61393d77e7fSVincent Whitchurch static inline unsigned long kallsyms_symbol_value(const Elf_Sym *sym)
61493d77e7fSVincent Whitchurch {
61593d77e7fSVincent Whitchurch return sym->st_value;
61693d77e7fSVincent Whitchurch }
61793d77e7fSVincent Whitchurch #endif
61893d77e7fSVincent Whitchurch
6191da177e4SLinus Torvalds /* FIXME: It'd be nice to isolate modules during init, too, so they
6201da177e4SLinus Torvalds aren't used before they (may) fail. But presently too much code
6211da177e4SLinus Torvalds (IDE & SCSI) require entry into the module during init.*/
module_is_live(struct module * mod)622171d864eSYaowei Bai static inline bool module_is_live(struct module *mod)
6231da177e4SLinus Torvalds {
6241da177e4SLinus Torvalds return mod->state != MODULE_STATE_GOING;
6251da177e4SLinus Torvalds }
6261da177e4SLinus Torvalds
module_is_coming(struct module * mod)6277582b7beSMike Rapoport (IBM) static inline bool module_is_coming(struct module *mod)
6287582b7beSMike Rapoport (IBM) {
6297582b7beSMike Rapoport (IBM) return mod->state == MODULE_STATE_COMING;
6307582b7beSMike Rapoport (IBM) }
6317582b7beSMike Rapoport (IBM)
6321da177e4SLinus Torvalds struct module *__module_text_address(unsigned long addr);
633e610499eSRusty Russell struct module *__module_address(unsigned long addr);
634e610499eSRusty Russell bool is_module_address(unsigned long addr);
635383776faSThomas Gleixner bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr);
63610fad5e4STejun Heo bool is_module_percpu_address(unsigned long addr);
637e610499eSRusty Russell bool is_module_text_address(unsigned long addr);
6381da177e4SLinus Torvalds
within_module_mem_type(unsigned long addr,const struct module * mod,enum mod_mem_type type)639ac3b4328SSong Liu static inline bool within_module_mem_type(unsigned long addr,
640ac3b4328SSong Liu const struct module *mod,
641ac3b4328SSong Liu enum mod_mem_type type)
642ac3b4328SSong Liu {
643ac3b4328SSong Liu unsigned long base, size;
644ac3b4328SSong Liu
645ac3b4328SSong Liu base = (unsigned long)mod->mem[type].base;
646ac3b4328SSong Liu size = mod->mem[type].size;
647ac3b4328SSong Liu return addr - base < size;
648ac3b4328SSong Liu }
649ac3b4328SSong Liu
within_module_core(unsigned long addr,const struct module * mod)65076681c8fSPetr Mladek static inline bool within_module_core(unsigned long addr,
65176681c8fSPetr Mladek const struct module *mod)
652a06f6211SMasami Hiramatsu {
653ac3b4328SSong Liu for_class_mod_mem_type(type, core) {
654ac3b4328SSong Liu if (within_module_mem_type(addr, mod, type))
65501dc0386SChristophe Leroy return true;
656ac3b4328SSong Liu }
657ac3b4328SSong Liu return false;
658a06f6211SMasami Hiramatsu }
659a06f6211SMasami Hiramatsu
within_module_init(unsigned long addr,const struct module * mod)66076681c8fSPetr Mladek static inline bool within_module_init(unsigned long addr,
66176681c8fSPetr Mladek const struct module *mod)
662a06f6211SMasami Hiramatsu {
663ac3b4328SSong Liu for_class_mod_mem_type(type, init) {
664ac3b4328SSong Liu if (within_module_mem_type(addr, mod, type))
665ac3b4328SSong Liu return true;
666ac3b4328SSong Liu }
667ac3b4328SSong Liu return false;
668a06f6211SMasami Hiramatsu }
669a06f6211SMasami Hiramatsu
within_module(unsigned long addr,const struct module * mod)67076681c8fSPetr Mladek static inline bool within_module(unsigned long addr, const struct module *mod)
6719b20a352SPetr Mladek {
6729b20a352SPetr Mladek return within_module_init(addr, mod) || within_module_core(addr, mod);
6739b20a352SPetr Mladek }
6749b20a352SPetr Mladek
675febaa65cSSebastian Andrzej Siewior /* Search for module by name: must be in a RCU critical section. */
676c6b37801STim Abbott struct module *find_module(const char *name);
677c6b37801STim Abbott
678ca3574bdSEric W. Biederman extern void __noreturn __module_put_and_kthread_exit(struct module *mod,
679bf262dceSJiri Kosina long code);
680ca3574bdSEric W. Biederman #define module_put_and_kthread_exit(code) __module_put_and_kthread_exit(THIS_MODULE, code)
6811da177e4SLinus Torvalds
6821da177e4SLinus Torvalds #ifdef CONFIG_MODULE_UNLOAD
683d5db139aSRusty Russell int module_refcount(struct module *mod);
6841da177e4SLinus Torvalds void __symbol_put(const char *symbol);
685996302c5SMasahiro Yamada #define symbol_put(x) __symbol_put(__stringify(x))
6861da177e4SLinus Torvalds void symbol_put_addr(void *addr);
6871da177e4SLinus Torvalds
6881da177e4SLinus Torvalds /* Sometimes we know we already have a refcount, and it's easier not
6891da177e4SLinus Torvalds to handle the error case (which only happens with rmmod --wait). */
690d53799beSSteven Rostedt extern void __module_get(struct module *module);
6911da177e4SLinus Torvalds
692557aafacSLuis Chamberlain /**
693557aafacSLuis Chamberlain * try_module_get() - take module refcount unless module is being removed
694557aafacSLuis Chamberlain * @module: the module we should check for
695557aafacSLuis Chamberlain *
696557aafacSLuis Chamberlain * Only try to get a module reference count if the module is not being removed.
6974515d08aSMarco Pagani * This call will fail if the module is in the process of being removed.
698557aafacSLuis Chamberlain *
699557aafacSLuis Chamberlain * Care must also be taken to ensure the module exists and is alive prior to
700557aafacSLuis Chamberlain * usage of this call. This can be gauranteed through two means:
701557aafacSLuis Chamberlain *
702557aafacSLuis Chamberlain * 1) Direct protection: you know an earlier caller must have increased the
703557aafacSLuis Chamberlain * module reference through __module_get(). This can typically be achieved
704557aafacSLuis Chamberlain * by having another entity other than the module itself increment the
705557aafacSLuis Chamberlain * module reference count.
706557aafacSLuis Chamberlain *
707557aafacSLuis Chamberlain * 2) Implied protection: there is an implied protection against module
708557aafacSLuis Chamberlain * removal. An example of this is the implied protection used by kernfs /
709557aafacSLuis Chamberlain * sysfs. The sysfs store / read file operations are guaranteed to exist
710557aafacSLuis Chamberlain * through the use of kernfs's active reference (see kernfs_active()) and a
711557aafacSLuis Chamberlain * sysfs / kernfs file removal cannot happen unless the same file is not
712557aafacSLuis Chamberlain * active. Therefore, if a sysfs file is being read or written to the module
713557aafacSLuis Chamberlain * which created it must still exist. It is therefore safe to use
714557aafacSLuis Chamberlain * try_module_get() on module sysfs store / read ops.
715557aafacSLuis Chamberlain *
716557aafacSLuis Chamberlain * One of the real values to try_module_get() is the module_is_live() check
717557aafacSLuis Chamberlain * which ensures that the caller of try_module_get() can yield to userspace
718557aafacSLuis Chamberlain * module removal requests and gracefully fail if the module is on its way out.
719557aafacSLuis Chamberlain *
720557aafacSLuis Chamberlain * Returns true if the reference count was successfully incremented.
721557aafacSLuis Chamberlain */
722d53799beSSteven Rostedt extern bool try_module_get(struct module *module);
7231da177e4SLinus Torvalds
724557aafacSLuis Chamberlain /**
725557aafacSLuis Chamberlain * module_put() - release a reference count to a module
726557aafacSLuis Chamberlain * @module: the module we should release a reference count for
727557aafacSLuis Chamberlain *
728557aafacSLuis Chamberlain * If you successfully bump a reference count to a module with try_module_get(),
729557aafacSLuis Chamberlain * when you are finished you must call module_put() to release that reference
730557aafacSLuis Chamberlain * count.
731557aafacSLuis Chamberlain */
732f6a57033SAl Viro extern void module_put(struct module *module);
7331da177e4SLinus Torvalds
7341da177e4SLinus Torvalds #else /*!CONFIG_MODULE_UNLOAD*/
try_module_get(struct module * module)7358ba4fcdfSGao Feng static inline bool try_module_get(struct module *module)
7361da177e4SLinus Torvalds {
7371da177e4SLinus Torvalds return !module || module_is_live(module);
7381da177e4SLinus Torvalds }
module_put(struct module * module)7391da177e4SLinus Torvalds static inline void module_put(struct module *module)
7401da177e4SLinus Torvalds {
7411da177e4SLinus Torvalds }
__module_get(struct module * module)7421da177e4SLinus Torvalds static inline void __module_get(struct module *module)
7431da177e4SLinus Torvalds {
7441da177e4SLinus Torvalds }
7451da177e4SLinus Torvalds #define symbol_put(x) do { } while (0)
7461da177e4SLinus Torvalds #define symbol_put_addr(p) do { } while (0)
7471da177e4SLinus Torvalds
7481da177e4SLinus Torvalds #endif /* CONFIG_MODULE_UNLOAD */
7491da177e4SLinus Torvalds
7501da177e4SLinus Torvalds /* This is a #define so the string doesn't get put in every .o file */
7511da177e4SLinus Torvalds #define module_name(mod) \
7521da177e4SLinus Torvalds ({ \
7531da177e4SLinus Torvalds struct module *__mod = (mod); \
7541da177e4SLinus Torvalds __mod ? __mod->name : "kernel"; \
7551da177e4SLinus Torvalds })
7561da177e4SLinus Torvalds
757b865ea64SSergey Senozhatsky /* Dereference module function descriptor */
758b865ea64SSergey Senozhatsky void *dereference_module_function_descriptor(struct module *mod, void *ptr);
759b865ea64SSergey Senozhatsky
7601da177e4SLinus Torvalds int register_module_notifier(struct notifier_block *nb);
7611da177e4SLinus Torvalds int unregister_module_notifier(struct notifier_block *nb);
7621da177e4SLinus Torvalds
7631da177e4SLinus Torvalds extern void print_modules(void);
7641da177e4SLinus Torvalds
module_requested_async_probing(struct module * module)76580c6e146SDmitry Torokhov static inline bool module_requested_async_probing(struct module *module)
76680c6e146SDmitry Torokhov {
76780c6e146SDmitry Torokhov return module && module->async_probe_requested;
76880c6e146SDmitry Torokhov }
76980c6e146SDmitry Torokhov
is_livepatch_module(struct module * mod)7701be9473eSAaron Tomlin static inline bool is_livepatch_module(struct module *mod)
7711be9473eSAaron Tomlin {
7721ce15ef4SJessica Yu #ifdef CONFIG_LIVEPATCH
7731ce15ef4SJessica Yu return mod->klp;
7741be9473eSAaron Tomlin #else
7751ce15ef4SJessica Yu return false;
7761be9473eSAaron Tomlin #endif
7771ce15ef4SJessica Yu }
7781ce15ef4SJessica Yu
7798db5da0bSMimi Zohar void set_module_sig_enforced(void);
780fda784e5SBruno E. O. Meneguele
781966b7d0eSSteven Rostedt void module_for_each_mod(int(*func)(struct module *mod, void *data), void *data);
782966b7d0eSSteven Rostedt
7831da177e4SLinus Torvalds #else /* !CONFIG_MODULES... */
7841da177e4SLinus Torvalds
__module_address(unsigned long addr)785e610499eSRusty Russell static inline struct module *__module_address(unsigned long addr)
786e610499eSRusty Russell {
787e610499eSRusty Russell return NULL;
788e610499eSRusty Russell }
789e610499eSRusty Russell
__module_text_address(unsigned long addr)7901da177e4SLinus Torvalds static inline struct module *__module_text_address(unsigned long addr)
7911da177e4SLinus Torvalds {
7921da177e4SLinus Torvalds return NULL;
7931da177e4SLinus Torvalds }
7941da177e4SLinus Torvalds
is_module_address(unsigned long addr)795e610499eSRusty Russell static inline bool is_module_address(unsigned long addr)
7964d435f9dSIngo Molnar {
797e610499eSRusty Russell return false;
798e610499eSRusty Russell }
799e610499eSRusty Russell
is_module_percpu_address(unsigned long addr)800d5e50dafSRandy Dunlap static inline bool is_module_percpu_address(unsigned long addr)
801d5e50dafSRandy Dunlap {
802d5e50dafSRandy Dunlap return false;
803d5e50dafSRandy Dunlap }
804d5e50dafSRandy Dunlap
__is_module_percpu_address(unsigned long addr,unsigned long * can_addr)805383776faSThomas Gleixner static inline bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr)
806383776faSThomas Gleixner {
807383776faSThomas Gleixner return false;
808383776faSThomas Gleixner }
809383776faSThomas Gleixner
is_module_text_address(unsigned long addr)810e610499eSRusty Russell static inline bool is_module_text_address(unsigned long addr)
811e610499eSRusty Russell {
812e610499eSRusty Russell return false;
8134d435f9dSIngo Molnar }
8144d435f9dSIngo Molnar
within_module_core(unsigned long addr,const struct module * mod)815007ec26cSDavid Howells static inline bool within_module_core(unsigned long addr,
816007ec26cSDavid Howells const struct module *mod)
817007ec26cSDavid Howells {
818007ec26cSDavid Howells return false;
819007ec26cSDavid Howells }
820007ec26cSDavid Howells
within_module_init(unsigned long addr,const struct module * mod)821dadec066STri Vo static inline bool within_module_init(unsigned long addr,
822dadec066STri Vo const struct module *mod)
823dadec066STri Vo {
824dadec066STri Vo return false;
825dadec066STri Vo }
826dadec066STri Vo
within_module(unsigned long addr,const struct module * mod)827dadec066STri Vo static inline bool within_module(unsigned long addr, const struct module *mod)
828dadec066STri Vo {
829dadec066STri Vo return false;
830dadec066STri Vo }
831dadec066STri Vo
8321da177e4SLinus Torvalds /* Get/put a kernel symbol (calls should be symmetric) */
83313150bc5SArd Biesheuvel #define symbol_get(x) ({ extern typeof(x) x __attribute__((weak,visibility("hidden"))); &(x); })
8341da177e4SLinus Torvalds #define symbol_put(x) do { } while (0)
8351da177e4SLinus Torvalds #define symbol_put_addr(x) do { } while (0)
8361da177e4SLinus Torvalds
__module_get(struct module * module)8371da177e4SLinus Torvalds static inline void __module_get(struct module *module)
8381da177e4SLinus Torvalds {
8391da177e4SLinus Torvalds }
8401da177e4SLinus Torvalds
try_module_get(struct module * module)8418ba4fcdfSGao Feng static inline bool try_module_get(struct module *module)
8421da177e4SLinus Torvalds {
8438ba4fcdfSGao Feng return true;
8441da177e4SLinus Torvalds }
8451da177e4SLinus Torvalds
module_put(struct module * module)8461da177e4SLinus Torvalds static inline void module_put(struct module *module)
8471da177e4SLinus Torvalds {
8481da177e4SLinus Torvalds }
8491da177e4SLinus Torvalds
8501da177e4SLinus Torvalds #define module_name(mod) "kernel"
8511da177e4SLinus Torvalds
register_module_notifier(struct notifier_block * nb)8521da177e4SLinus Torvalds static inline int register_module_notifier(struct notifier_block *nb)
8531da177e4SLinus Torvalds {
8541da177e4SLinus Torvalds /* no events will happen anyway, so this can always succeed */
8551da177e4SLinus Torvalds return 0;
8561da177e4SLinus Torvalds }
8571da177e4SLinus Torvalds
unregister_module_notifier(struct notifier_block * nb)8581da177e4SLinus Torvalds static inline int unregister_module_notifier(struct notifier_block *nb)
8591da177e4SLinus Torvalds {
8601da177e4SLinus Torvalds return 0;
8611da177e4SLinus Torvalds }
8621da177e4SLinus Torvalds
863ca3574bdSEric W. Biederman #define module_put_and_kthread_exit(code) kthread_exit(code)
8641da177e4SLinus Torvalds
print_modules(void)8651da177e4SLinus Torvalds static inline void print_modules(void)
8661da177e4SLinus Torvalds {
8671da177e4SLinus Torvalds }
86880c6e146SDmitry Torokhov
module_requested_async_probing(struct module * module)86980c6e146SDmitry Torokhov static inline bool module_requested_async_probing(struct module *module)
87080c6e146SDmitry Torokhov {
87180c6e146SDmitry Torokhov return false;
87280c6e146SDmitry Torokhov }
87380c6e146SDmitry Torokhov
874fda784e5SBruno E. O. Meneguele
set_module_sig_enforced(void)8758db5da0bSMimi Zohar static inline void set_module_sig_enforced(void)
8768db5da0bSMimi Zohar {
8778db5da0bSMimi Zohar }
8788db5da0bSMimi Zohar
879b865ea64SSergey Senozhatsky /* Dereference module function descriptor */
880b865ea64SSergey Senozhatsky static inline
dereference_module_function_descriptor(struct module * mod,void * ptr)881b865ea64SSergey Senozhatsky void *dereference_module_function_descriptor(struct module *mod, void *ptr)
882b865ea64SSergey Senozhatsky {
883b865ea64SSergey Senozhatsky return ptr;
884b865ea64SSergey Senozhatsky }
885b865ea64SSergey Senozhatsky
module_is_coming(struct module * mod)8867582b7beSMike Rapoport (IBM) static inline bool module_is_coming(struct module *mod)
8877582b7beSMike Rapoport (IBM) {
8887582b7beSMike Rapoport (IBM) return false;
8897582b7beSMike Rapoport (IBM) }
8900c133b1eSMike Rapoport (Microsoft)
module_for_each_mod(int (* func)(struct module * mod,void * data),void * data)891966b7d0eSSteven Rostedt static inline void module_for_each_mod(int(*func)(struct module *mod, void *data), void *data)
892966b7d0eSSteven Rostedt {
893966b7d0eSSteven Rostedt }
894ef665c1aSRandy Dunlap #endif /* CONFIG_MODULES */
895ef665c1aSRandy Dunlap
896ef665c1aSRandy Dunlap #ifdef CONFIG_SYSFS
8977405c1e1SGreg Kroah-Hartman extern struct kset *module_kset;
898042edf1eSThomas Weißschuh extern const struct kobj_type module_ktype;
899ef665c1aSRandy Dunlap #endif /* CONFIG_SYSFS */
900ef665c1aSRandy Dunlap
9011da177e4SLinus Torvalds #define symbol_request(x) try_then_request_module(symbol_get(x), "symbol:" #x)
9021da177e4SLinus Torvalds
9031da177e4SLinus Torvalds /* BELOW HERE ALL THESE ARE OBSOLETE AND WILL VANISH */
9041da177e4SLinus Torvalds
9051da177e4SLinus Torvalds #define __MODULE_STRING(x) __stringify(x)
9061da177e4SLinus Torvalds
9070d9c25ddSAndrew Morton #ifdef CONFIG_GENERIC_BUG
9085336377dSLinus Torvalds void module_bug_finalize(const Elf_Ehdr *, const Elf_Shdr *,
9090d9c25ddSAndrew Morton struct module *);
9100d9c25ddSAndrew Morton void module_bug_cleanup(struct module *);
9110d9c25ddSAndrew Morton
9120d9c25ddSAndrew Morton #else /* !CONFIG_GENERIC_BUG */
9130d9c25ddSAndrew Morton
module_bug_finalize(const Elf_Ehdr * hdr,const Elf_Shdr * sechdrs,struct module * mod)9145336377dSLinus Torvalds static inline void module_bug_finalize(const Elf_Ehdr *hdr,
9150d9c25ddSAndrew Morton const Elf_Shdr *sechdrs,
9160d9c25ddSAndrew Morton struct module *mod)
9170d9c25ddSAndrew Morton {
9180d9c25ddSAndrew Morton }
module_bug_cleanup(struct module * mod)9190d9c25ddSAndrew Morton static inline void module_bug_cleanup(struct module *mod) {}
9200d9c25ddSAndrew Morton #endif /* CONFIG_GENERIC_BUG */
9210d9c25ddSAndrew Morton
922aefb2f2eSBreno Leitao #ifdef CONFIG_MITIGATION_RETPOLINE
923caf7501aSAndi Kleen extern bool retpoline_module_ok(bool has_retpoline);
924caf7501aSAndi Kleen #else
retpoline_module_ok(bool has_retpoline)925caf7501aSAndi Kleen static inline bool retpoline_module_ok(bool has_retpoline)
926caf7501aSAndi Kleen {
927caf7501aSAndi Kleen return true;
928caf7501aSAndi Kleen }
929caf7501aSAndi Kleen #endif
930caf7501aSAndi Kleen
93159afdc7bSHerbert Xu #ifdef CONFIG_MODULE_SIG
9320c1e4280SAaron Tomlin bool is_module_sig_enforced(void);
9330c1e4280SAaron Tomlin
module_sig_ok(struct module * module)93459afdc7bSHerbert Xu static inline bool module_sig_ok(struct module *module)
93559afdc7bSHerbert Xu {
93659afdc7bSHerbert Xu return module->sig_ok;
93759afdc7bSHerbert Xu }
93859afdc7bSHerbert Xu #else /* !CONFIG_MODULE_SIG */
is_module_sig_enforced(void)9390c1e4280SAaron Tomlin static inline bool is_module_sig_enforced(void)
9400c1e4280SAaron Tomlin {
9410c1e4280SAaron Tomlin return false;
9420c1e4280SAaron Tomlin }
9430c1e4280SAaron Tomlin
module_sig_ok(struct module * module)94459afdc7bSHerbert Xu static inline bool module_sig_ok(struct module *module)
94559afdc7bSHerbert Xu {
94659afdc7bSHerbert Xu return true;
94759afdc7bSHerbert Xu }
94859afdc7bSHerbert Xu #endif /* CONFIG_MODULE_SIG */
94959afdc7bSHerbert Xu
95073feb8d5SJiri Olsa #if defined(CONFIG_MODULES) && defined(CONFIG_KALLSYMS)
95107cc2c93SZhen Lei int module_kallsyms_on_each_symbol(const char *modname,
9523703bd54SZhen Lei int (*fn)(void *, const char *, unsigned long),
9533e355205SChristoph Hellwig void *data);
95434bf9347SViktor Malik
95534bf9347SViktor Malik /* For kallsyms to ask for address resolution. namebuf should be at
95634bf9347SViktor Malik * least KSYM_NAME_LEN long: a pointer to namebuf is returned if
95734bf9347SViktor Malik * found, otherwise NULL.
95834bf9347SViktor Malik */
9597e1f4eb9SArnd Bergmann int module_address_lookup(unsigned long addr,
96034bf9347SViktor Malik unsigned long *symbolsize,
96134bf9347SViktor Malik unsigned long *offset,
96234bf9347SViktor Malik char **modname, const unsigned char **modbuildid,
96334bf9347SViktor Malik char *namebuf);
96434bf9347SViktor Malik int lookup_module_symbol_name(unsigned long addr, char *symname);
96534bf9347SViktor Malik int lookup_module_symbol_attrs(unsigned long addr,
96634bf9347SViktor Malik unsigned long *size,
96734bf9347SViktor Malik unsigned long *offset,
96834bf9347SViktor Malik char *modname,
96934bf9347SViktor Malik char *name);
97034bf9347SViktor Malik
97134bf9347SViktor Malik /* Returns 0 and fills in value, defined and namebuf, or -ERANGE if
97234bf9347SViktor Malik * symnum out of range.
97334bf9347SViktor Malik */
97434bf9347SViktor Malik int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
97534bf9347SViktor Malik char *name, char *module_name, int *exported);
97634bf9347SViktor Malik
97734bf9347SViktor Malik /* Look for this name: can be of form module:name. */
97834bf9347SViktor Malik unsigned long module_kallsyms_lookup_name(const char *name);
97934bf9347SViktor Malik
98034bf9347SViktor Malik unsigned long find_kallsyms_symbol_value(struct module *mod, const char *name);
98134bf9347SViktor Malik
98234bf9347SViktor Malik #else /* CONFIG_MODULES && CONFIG_KALLSYMS */
98334bf9347SViktor Malik
module_kallsyms_on_each_symbol(const char * modname,int (* fn)(void *,const char *,unsigned long),void * data)98407cc2c93SZhen Lei static inline int module_kallsyms_on_each_symbol(const char *modname,
9853703bd54SZhen Lei int (*fn)(void *, const char *, unsigned long),
98673feb8d5SJiri Olsa void *data)
98773feb8d5SJiri Olsa {
98873feb8d5SJiri Olsa return -EOPNOTSUPP;
98973feb8d5SJiri Olsa }
99034bf9347SViktor Malik
99134bf9347SViktor Malik /* For kallsyms to ask for address resolution. NULL means not found. */
module_address_lookup(unsigned long addr,unsigned long * symbolsize,unsigned long * offset,char ** modname,const unsigned char ** modbuildid,char * namebuf)9927e1f4eb9SArnd Bergmann static inline int module_address_lookup(unsigned long addr,
99334bf9347SViktor Malik unsigned long *symbolsize,
99434bf9347SViktor Malik unsigned long *offset,
99534bf9347SViktor Malik char **modname,
99634bf9347SViktor Malik const unsigned char **modbuildid,
99734bf9347SViktor Malik char *namebuf)
99834bf9347SViktor Malik {
9997e1f4eb9SArnd Bergmann return 0;
100034bf9347SViktor Malik }
100134bf9347SViktor Malik
lookup_module_symbol_name(unsigned long addr,char * symname)100234bf9347SViktor Malik static inline int lookup_module_symbol_name(unsigned long addr, char *symname)
100334bf9347SViktor Malik {
100434bf9347SViktor Malik return -ERANGE;
100534bf9347SViktor Malik }
100634bf9347SViktor Malik
module_get_kallsym(unsigned int symnum,unsigned long * value,char * type,char * name,char * module_name,int * exported)100734bf9347SViktor Malik static inline int module_get_kallsym(unsigned int symnum, unsigned long *value,
100834bf9347SViktor Malik char *type, char *name,
100934bf9347SViktor Malik char *module_name, int *exported)
101034bf9347SViktor Malik {
101134bf9347SViktor Malik return -ERANGE;
101234bf9347SViktor Malik }
101334bf9347SViktor Malik
module_kallsyms_lookup_name(const char * name)101434bf9347SViktor Malik static inline unsigned long module_kallsyms_lookup_name(const char *name)
101534bf9347SViktor Malik {
101634bf9347SViktor Malik return 0;
101734bf9347SViktor Malik }
101834bf9347SViktor Malik
find_kallsyms_symbol_value(struct module * mod,const char * name)101934bf9347SViktor Malik static inline unsigned long find_kallsyms_symbol_value(struct module *mod,
102034bf9347SViktor Malik const char *name)
102134bf9347SViktor Malik {
102234bf9347SViktor Malik return 0;
102334bf9347SViktor Malik }
102434bf9347SViktor Malik
102573feb8d5SJiri Olsa #endif /* CONFIG_MODULES && CONFIG_KALLSYMS */
10263e355205SChristoph Hellwig
10271da177e4SLinus Torvalds #endif /* _LINUX_MODULE_H */
1028