/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _ASM_S390_MODULE_H #define _ASM_S390_MODULE_H #include /* * This file contains the s390 architecture specific module code. */ struct mod_arch_syminfo { unsigned long got_offset; unsigned long plt_offset; int got_initialized; int plt_initialized; }; struct mod_arch_specific { /* Starting offset of got in the module core memory. */ unsigned long got_offset; /* Starting offset of plt in the module core memory. */ unsigned long plt_offset; /* Size of the got. */ unsigned long got_size; /* Size of the plt. */ unsigned long plt_size; /* Number of symbols in syminfo. */ int nsyms; /* Additional symbol information (got and plt offsets). */ struct mod_arch_syminfo *syminfo; #ifdef CONFIG_FUNCTION_TRACER /* Start of memory reserved for ftrace hotpatch trampolines. */ struct ftrace_hotpatch_trampoline *trampolines_start; /* End of memory reserved for ftrace hotpatch trampolines. */ struct ftrace_hotpatch_trampoline *trampolines_end; /* Next unused ftrace hotpatch trampoline slot. */ struct ftrace_hotpatch_trampoline *next_trampoline; #endif /* CONFIG_FUNCTION_TRACER */ }; static inline const Elf_Shdr *find_section(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, const char *name) { const char *secstrs = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; const Elf_Shdr *s, *se; for (s = sechdrs, se = sechdrs + hdr->e_shnum; s < se; s++) { if (strcmp(name, secstrs + s->sh_name) == 0) return s; } return NULL; } #endif /* _ASM_S390_MODULE_H */