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