.. | .. |
---|
1 | | -#ifndef _LINUX_MODULE_H |
---|
2 | | -#define _LINUX_MODULE_H |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
---|
3 | 2 | /* |
---|
4 | 3 | * Dynamic loading of modules into the kernel. |
---|
5 | 4 | * |
---|
6 | 5 | * Rewritten by Richard Henderson <rth@tamu.edu> Dec 1996 |
---|
7 | 6 | * Rewritten again by Rusty Russell, 2002 |
---|
8 | 7 | */ |
---|
| 8 | + |
---|
| 9 | +#ifndef _LINUX_MODULE_H |
---|
| 10 | +#define _LINUX_MODULE_H |
---|
| 11 | + |
---|
9 | 12 | #include <linux/list.h> |
---|
10 | 13 | #include <linux/stat.h> |
---|
11 | 14 | #include <linux/compiler.h> |
---|
.. | .. |
---|
21 | 24 | #include <linux/rbtree_latch.h> |
---|
22 | 25 | #include <linux/error-injection.h> |
---|
23 | 26 | #include <linux/tracepoint-defs.h> |
---|
| 27 | +#include <linux/srcu.h> |
---|
| 28 | +#include <linux/static_call_types.h> |
---|
24 | 29 | #include <linux/cfi.h> |
---|
25 | 30 | #include <linux/android_kabi.h> |
---|
26 | 31 | |
---|
27 | 32 | #include <linux/percpu.h> |
---|
28 | 33 | #include <asm/module.h> |
---|
29 | | - |
---|
30 | | -/* In stripped ARM and x86-64 modules, ~ is surprisingly rare. */ |
---|
31 | | -#define MODULE_SIG_STRING "~Module signature appended~\n" |
---|
32 | 34 | |
---|
33 | 35 | /* Not Yet Implemented */ |
---|
34 | 36 | #define MODULE_SUPPORTED_DEVICE(name) |
---|
.. | .. |
---|
126 | 128 | #define late_initcall_sync(fn) module_init(fn) |
---|
127 | 129 | |
---|
128 | 130 | #define console_initcall(fn) module_init(fn) |
---|
129 | | -#define security_initcall(fn) module_init(fn) |
---|
130 | 131 | |
---|
131 | 132 | /* Each module must use one module_init(). */ |
---|
132 | 133 | #define module_init(initfn) \ |
---|
133 | 134 | static inline initcall_t __maybe_unused __inittest(void) \ |
---|
134 | 135 | { return initfn; } \ |
---|
135 | | - int init_module(void) __copy(initfn) __attribute__((alias(#initfn))); |
---|
| 136 | + int init_module(void) __copy(initfn) \ |
---|
| 137 | + __attribute__((alias(#initfn))); \ |
---|
| 138 | + __CFI_ADDRESSABLE(init_module) |
---|
136 | 139 | |
---|
137 | 140 | /* This is only required if you want to be unloadable. */ |
---|
138 | 141 | #define module_exit(exitfn) \ |
---|
139 | 142 | static inline exitcall_t __maybe_unused __exittest(void) \ |
---|
140 | 143 | { return exitfn; } \ |
---|
141 | | - void cleanup_module(void) __copy(exitfn) __attribute__((alias(#exitfn))); |
---|
| 144 | + void cleanup_module(void) __copy(exitfn) \ |
---|
| 145 | + __attribute__((alias(#exitfn))); \ |
---|
| 146 | + __CFI_ADDRESSABLE(cleanup_module) |
---|
142 | 147 | |
---|
143 | 148 | #endif |
---|
144 | 149 | |
---|
.. | .. |
---|
172 | 177 | #define MODULE_SOFTDEP(_softdep) MODULE_INFO(softdep, _softdep) |
---|
173 | 178 | |
---|
174 | 179 | /* |
---|
| 180 | + * MODULE_FILE is used for generating modules.builtin |
---|
| 181 | + * So, make it no-op when this is being built as a module |
---|
| 182 | + */ |
---|
| 183 | +#ifdef MODULE |
---|
| 184 | +#define MODULE_FILE |
---|
| 185 | +#else |
---|
| 186 | +#define MODULE_FILE MODULE_INFO(file, KBUILD_MODFILE); |
---|
| 187 | +#endif |
---|
| 188 | + |
---|
| 189 | +/* |
---|
175 | 190 | * The following license idents are currently accepted as indicating free |
---|
176 | 191 | * software modules |
---|
177 | 192 | * |
---|
178 | | - * "GPL" [GNU Public License v2 or later] |
---|
| 193 | + * "GPL" [GNU Public License v2] |
---|
179 | 194 | * "GPL v2" [GNU Public License v2] |
---|
180 | 195 | * "GPL and additional rights" [GNU Public License v2 rights and more] |
---|
181 | 196 | * "Dual BSD/GPL" [GNU Public License v2 |
---|
.. | .. |
---|
189 | 204 | * |
---|
190 | 205 | * "Proprietary" [Non free products] |
---|
191 | 206 | * |
---|
| 207 | + * Both "GPL v2" and "GPL" (the latter also in dual licensed strings) are |
---|
| 208 | + * merely stating that the module is licensed under the GPL v2, but are not |
---|
| 209 | + * telling whether "GPL v2 only" or "GPL v2 or later". The reason why there |
---|
| 210 | + * are two variants is a historic and failed attempt to convey more |
---|
| 211 | + * information in the MODULE_LICENSE string. For module loading the |
---|
| 212 | + * "only/or later" distinction is completely irrelevant and does neither |
---|
| 213 | + * replace the proper license identifiers in the corresponding source file |
---|
| 214 | + * nor amends them in any way. The sole purpose is to make the |
---|
| 215 | + * 'Proprietary' flagging work and to refuse to bind symbols which are |
---|
| 216 | + * exported with EXPORT_SYMBOL_GPL when a non free module is loaded. |
---|
| 217 | + * |
---|
| 218 | + * In the same way "BSD" is not a clear license information. It merely |
---|
| 219 | + * states, that the module is licensed under one of the compatible BSD |
---|
| 220 | + * license variants. The detailed and correct license information is again |
---|
| 221 | + * to be found in the corresponding source files. |
---|
| 222 | + * |
---|
192 | 223 | * There are dual licensed components, but when running with Linux it is the |
---|
193 | 224 | * GPL that is relevant so this is a non issue. Similarly LGPL linked with GPL |
---|
194 | 225 | * is a GPL combined work. |
---|
.. | .. |
---|
199 | 230 | * 2. So the community can ignore bug reports including proprietary modules |
---|
200 | 231 | * 3. So vendors can do likewise based on their own policies |
---|
201 | 232 | */ |
---|
202 | | -#define MODULE_LICENSE(_license) MODULE_INFO(license, _license) |
---|
| 233 | +#define MODULE_LICENSE(_license) MODULE_FILE MODULE_INFO(license, _license) |
---|
203 | 234 | |
---|
204 | 235 | /* |
---|
205 | 236 | * Author(s), use "Name <email>" or just "Name", for multiple |
---|
.. | .. |
---|
240 | 271 | #define MODULE_VERSION(_version) MODULE_INFO(version, _version) |
---|
241 | 272 | #else |
---|
242 | 273 | #define MODULE_VERSION(_version) \ |
---|
| 274 | + MODULE_INFO(version, _version); \ |
---|
243 | 275 | static struct module_version_attribute ___modver_attr = { \ |
---|
244 | 276 | .mattr = { \ |
---|
245 | 277 | .attr = { \ |
---|
.. | .. |
---|
252 | 284 | .version = _version, \ |
---|
253 | 285 | }; \ |
---|
254 | 286 | static const struct module_version_attribute \ |
---|
255 | | - __used __attribute__ ((__section__ ("__modver"))) \ |
---|
| 287 | + __used __section("__modver") \ |
---|
256 | 288 | * __moduleparam_const __modver_attr = &___modver_attr |
---|
257 | 289 | #endif |
---|
258 | 290 | |
---|
.. | .. |
---|
260 | 292 | * format is simply firmware file name. Multiple firmware |
---|
261 | 293 | * files require multiple MODULE_FIRMWARE() specifiers */ |
---|
262 | 294 | #define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware) |
---|
| 295 | + |
---|
| 296 | +#define MODULE_IMPORT_NS(ns) MODULE_INFO(import_ns, __stringify(ns)) |
---|
263 | 297 | |
---|
264 | 298 | struct notifier_block; |
---|
265 | 299 | |
---|
.. | .. |
---|
318 | 352 | Elf_Sym *symtab; |
---|
319 | 353 | unsigned int num_symtab; |
---|
320 | 354 | char *strtab; |
---|
| 355 | + char *typetab; |
---|
321 | 356 | }; |
---|
322 | 357 | |
---|
323 | 358 | #ifdef CONFIG_LIVEPATCH |
---|
.. | .. |
---|
343 | 378 | struct module_attribute *modinfo_attrs; |
---|
344 | 379 | const char *version; |
---|
345 | 380 | const char *srcversion; |
---|
| 381 | + const char *scmversion; |
---|
346 | 382 | struct kobject *holders_dir; |
---|
347 | 383 | |
---|
348 | 384 | /* Exported symbols */ |
---|
.. | .. |
---|
365 | 401 | unsigned int num_gpl_syms; |
---|
366 | 402 | const struct kernel_symbol *gpl_syms; |
---|
367 | 403 | const s32 *gpl_crcs; |
---|
| 404 | + bool using_gplonly_symbols; |
---|
368 | 405 | |
---|
369 | 406 | #ifdef CONFIG_UNUSED_SYMBOLS |
---|
370 | 407 | /* unused exported symbols. */ |
---|
.. | .. |
---|
417 | 454 | |
---|
418 | 455 | #ifdef CONFIG_KALLSYMS |
---|
419 | 456 | /* Protected by RCU and/or module_mutex: use rcu_dereference() */ |
---|
420 | | - struct mod_kallsyms *kallsyms; |
---|
| 457 | + struct mod_kallsyms __rcu *kallsyms; |
---|
421 | 458 | struct mod_kallsyms core_kallsyms; |
---|
422 | 459 | |
---|
423 | 460 | /* Section attributes */ |
---|
.. | .. |
---|
436 | 473 | void __percpu *percpu; |
---|
437 | 474 | unsigned int percpu_size; |
---|
438 | 475 | #endif |
---|
| 476 | + void *noinstr_text_start; |
---|
| 477 | + unsigned int noinstr_text_size; |
---|
439 | 478 | |
---|
440 | 479 | #ifdef CONFIG_TRACEPOINTS |
---|
441 | 480 | unsigned int num_tracepoints; |
---|
442 | 481 | tracepoint_ptr_t *tracepoints_ptrs; |
---|
| 482 | +#endif |
---|
| 483 | +#ifdef CONFIG_TREE_SRCU |
---|
| 484 | + unsigned int num_srcu_structs; |
---|
| 485 | + struct srcu_struct **srcu_struct_ptrs; |
---|
| 486 | +#endif |
---|
| 487 | +#ifdef CONFIG_BPF_EVENTS |
---|
| 488 | + unsigned int num_bpf_raw_events; |
---|
| 489 | + struct bpf_raw_event_map *bpf_raw_events; |
---|
443 | 490 | #endif |
---|
444 | 491 | #ifdef CONFIG_JUMP_LABEL |
---|
445 | 492 | struct jump_entry *jump_entries; |
---|
.. | .. |
---|
458 | 505 | #ifdef CONFIG_FTRACE_MCOUNT_RECORD |
---|
459 | 506 | unsigned int num_ftrace_callsites; |
---|
460 | 507 | unsigned long *ftrace_callsites; |
---|
| 508 | +#endif |
---|
| 509 | +#ifdef CONFIG_KPROBES |
---|
| 510 | + void *kprobes_text_start; |
---|
| 511 | + unsigned int kprobes_text_size; |
---|
| 512 | + unsigned long *kprobe_blacklist; |
---|
| 513 | + unsigned int num_kprobe_blacklist; |
---|
| 514 | +#endif |
---|
| 515 | +#ifdef CONFIG_HAVE_STATIC_CALL_INLINE |
---|
| 516 | + int num_static_call_sites; |
---|
| 517 | + struct static_call_site *static_call_sites; |
---|
461 | 518 | #endif |
---|
462 | 519 | |
---|
463 | 520 | #ifdef CONFIG_LIVEPATCH |
---|
.. | .. |
---|
497 | 554 | } ____cacheline_aligned __randomize_layout; |
---|
498 | 555 | #ifndef MODULE_ARCH_INIT |
---|
499 | 556 | #define MODULE_ARCH_INIT {} |
---|
| 557 | +#endif |
---|
| 558 | + |
---|
| 559 | +#ifndef HAVE_ARCH_KALLSYMS_SYMBOL_VALUE |
---|
| 560 | +static inline unsigned long kallsyms_symbol_value(const Elf_Sym *sym) |
---|
| 561 | +{ |
---|
| 562 | + return sym->st_value; |
---|
| 563 | +} |
---|
500 | 564 | #endif |
---|
501 | 565 | |
---|
502 | 566 | extern struct mutex module_mutex; |
---|
.. | .. |
---|
641 | 705 | #endif /* CONFIG_LIVEPATCH */ |
---|
642 | 706 | |
---|
643 | 707 | bool is_module_sig_enforced(void); |
---|
| 708 | +void set_module_sig_enforced(void); |
---|
644 | 709 | |
---|
645 | 710 | #else /* !CONFIG_MODULES... */ |
---|
646 | 711 | |
---|
.. | .. |
---|
692 | 757 | } |
---|
693 | 758 | |
---|
694 | 759 | /* Get/put a kernel symbol (calls should be symmetric) */ |
---|
695 | | -#define symbol_get(x) ({ extern typeof(x) x __attribute__((weak)); &(x); }) |
---|
| 760 | +#define symbol_get(x) ({ extern typeof(x) x __attribute__((weak,visibility("hidden"))); &(x); }) |
---|
696 | 761 | #define symbol_put(x) do { } while (0) |
---|
697 | 762 | #define symbol_put_addr(x) do { } while (0) |
---|
698 | 763 | |
---|
.. | .. |
---|
778 | 843 | return false; |
---|
779 | 844 | } |
---|
780 | 845 | |
---|
| 846 | +static inline void set_module_sig_enforced(void) |
---|
| 847 | +{ |
---|
| 848 | +} |
---|
| 849 | + |
---|
781 | 850 | /* Dereference module function descriptor */ |
---|
782 | 851 | static inline |
---|
783 | 852 | void *dereference_module_function_descriptor(struct module *mod, void *ptr) |
---|
.. | .. |
---|
798 | 867 | /* BELOW HERE ALL THESE ARE OBSOLETE AND WILL VANISH */ |
---|
799 | 868 | |
---|
800 | 869 | #define __MODULE_STRING(x) __stringify(x) |
---|
801 | | - |
---|
802 | | -#ifdef CONFIG_STRICT_MODULE_RWX |
---|
803 | | -extern void set_all_modules_text_rw(void); |
---|
804 | | -extern void set_all_modules_text_ro(void); |
---|
805 | | -extern void module_enable_ro(const struct module *mod, bool after_init); |
---|
806 | | -extern void module_disable_ro(const struct module *mod); |
---|
807 | | -#else |
---|
808 | | -static inline void set_all_modules_text_rw(void) { } |
---|
809 | | -static inline void set_all_modules_text_ro(void) { } |
---|
810 | | -static inline void module_enable_ro(const struct module *mod, bool after_init) { } |
---|
811 | | -static inline void module_disable_ro(const struct module *mod) { } |
---|
812 | | -#endif |
---|
813 | 870 | |
---|
814 | 871 | #ifdef CONFIG_GENERIC_BUG |
---|
815 | 872 | void module_bug_finalize(const Elf_Ehdr *, const Elf_Shdr *, |
---|