xref: /linux-6.15/kernel/module/internal.h (revision 5aff4dfd)
1cfc1d277SAaron Tomlin /* SPDX-License-Identifier: GPL-2.0-or-later */
2cfc1d277SAaron Tomlin /* Module internals
3cfc1d277SAaron Tomlin  *
4cfc1d277SAaron Tomlin  * Copyright (C) 2012 Red Hat, Inc. All Rights Reserved.
5cfc1d277SAaron Tomlin  * Written by David Howells ([email protected])
6cfc1d277SAaron Tomlin  */
7cfc1d277SAaron Tomlin 
8cfc1d277SAaron Tomlin #include <linux/elf.h>
9*5aff4dfdSAaron Tomlin #include <linux/compiler.h>
10*5aff4dfdSAaron Tomlin #include <linux/module.h>
118ab4ed08SAaron Tomlin #include <linux/mutex.h>
128ab4ed08SAaron Tomlin 
138ab4ed08SAaron Tomlin #ifndef ARCH_SHF_SMALL
148ab4ed08SAaron Tomlin #define ARCH_SHF_SMALL 0
158ab4ed08SAaron Tomlin #endif
168ab4ed08SAaron Tomlin 
178ab4ed08SAaron Tomlin /* If this is set, the section belongs in the init part of the module */
188ab4ed08SAaron Tomlin #define INIT_OFFSET_MASK (1UL << (BITS_PER_LONG - 1))
198ab4ed08SAaron Tomlin /* Maximum number of characters written by module_flags() */
208ab4ed08SAaron Tomlin #define MODULE_FLAGS_BUF_SIZE (TAINT_FLAGS_COUNT + 4)
218ab4ed08SAaron Tomlin 
228ab4ed08SAaron Tomlin extern struct mutex module_mutex;
238ab4ed08SAaron Tomlin extern struct list_head modules;
248ab4ed08SAaron Tomlin 
258ab4ed08SAaron Tomlin /* Provided by the linker */
268ab4ed08SAaron Tomlin extern const struct kernel_symbol __start___ksymtab[];
278ab4ed08SAaron Tomlin extern const struct kernel_symbol __stop___ksymtab[];
288ab4ed08SAaron Tomlin extern const struct kernel_symbol __start___ksymtab_gpl[];
298ab4ed08SAaron Tomlin extern const struct kernel_symbol __stop___ksymtab_gpl[];
308ab4ed08SAaron Tomlin extern const s32 __start___kcrctab[];
318ab4ed08SAaron Tomlin extern const s32 __start___kcrctab_gpl[];
32cfc1d277SAaron Tomlin 
33cfc1d277SAaron Tomlin struct load_info {
34cfc1d277SAaron Tomlin 	const char *name;
35cfc1d277SAaron Tomlin 	/* pointer to module in temporary copy, freed at end of load_module() */
36cfc1d277SAaron Tomlin 	struct module *mod;
37cfc1d277SAaron Tomlin 	Elf_Ehdr *hdr;
38cfc1d277SAaron Tomlin 	unsigned long len;
39cfc1d277SAaron Tomlin 	Elf_Shdr *sechdrs;
40cfc1d277SAaron Tomlin 	char *secstrings, *strtab;
41cfc1d277SAaron Tomlin 	unsigned long symoffs, stroffs, init_typeoffs, core_typeoffs;
42cfc1d277SAaron Tomlin 	struct _ddebug *debug;
43cfc1d277SAaron Tomlin 	unsigned int num_debug;
44cfc1d277SAaron Tomlin 	bool sig_ok;
45cfc1d277SAaron Tomlin #ifdef CONFIG_KALLSYMS
46cfc1d277SAaron Tomlin 	unsigned long mod_kallsyms_init_off;
47cfc1d277SAaron Tomlin #endif
48cfc1d277SAaron Tomlin #ifdef CONFIG_MODULE_DECOMPRESS
49cfc1d277SAaron Tomlin 	struct page **pages;
50cfc1d277SAaron Tomlin 	unsigned int max_pages;
51cfc1d277SAaron Tomlin 	unsigned int used_pages;
52cfc1d277SAaron Tomlin #endif
53cfc1d277SAaron Tomlin 	struct {
54cfc1d277SAaron Tomlin 		unsigned int sym, str, mod, vers, info, pcpu;
55cfc1d277SAaron Tomlin 	} index;
56cfc1d277SAaron Tomlin };
57cfc1d277SAaron Tomlin 
58*5aff4dfdSAaron Tomlin int mod_verify_sig(const void *mod, struct load_info *info);
59cfc1d277SAaron Tomlin 
60cfc1d277SAaron Tomlin #ifdef CONFIG_MODULE_DECOMPRESS
61cfc1d277SAaron Tomlin int module_decompress(struct load_info *info, const void *buf, size_t size);
62cfc1d277SAaron Tomlin void module_decompress_cleanup(struct load_info *info);
63cfc1d277SAaron Tomlin #else
64cfc1d277SAaron Tomlin static inline int module_decompress(struct load_info *info,
65cfc1d277SAaron Tomlin 				    const void *buf, size_t size)
66cfc1d277SAaron Tomlin {
67cfc1d277SAaron Tomlin 	return -EOPNOTSUPP;
68cfc1d277SAaron Tomlin }
69*5aff4dfdSAaron Tomlin 
70cfc1d277SAaron Tomlin static inline void module_decompress_cleanup(struct load_info *info)
71cfc1d277SAaron Tomlin {
72cfc1d277SAaron Tomlin }
73cfc1d277SAaron Tomlin #endif
74