Message ID | 20191029165832.33606-4-mark.rutland@arm.com (mailing list archive) |
---|---|
State | Awaiting Upstream |
Headers | show |
Series | arm64: ftrace cleanup + FTRACE_WITH_REGS | expand |
On Tue, 29 Oct 2019, Mark Rutland wrote: > When we load a module, we have to perform some special work for a couple > of named sections. To do this, we iterate over all of the module's > sections, and perform work for each section we recognize. > > To make it easier to handle the unexpected absence of a section, and to > make the section-specific logic easer to read, let's factor the section s/easer/easier/ > search into a helper. Similar is already done in the core module loader, > and other architectures (and ideally we'd unify these in future). > > If we expect a module to have an ftrace trampoline section, but it > doesn't have one, we'll now reject loading the module. When > ARM64_MODULE_PLTS is selected, any correctly built module should have > one (and this is assumed by arm64's ftrace PLT code) and the absence of > such a section implies something has gone wrong at build time. > > Subsequent patches will make use of the new helper. > > Signed-off-by: Mark Rutland <mark.rutland@arm.com> > Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > Cc: Catalin Marinas <catalin.marinas@arm.com> > Cc: James Morse <james.morse@arm.com> > Cc: Will Deacon <will@kernel.org> Reviewed-by: Miroslav Benes <mbenes@suse.cz> M
diff --git a/arch/arm64/kernel/module.c b/arch/arm64/kernel/module.c index 03ff15bffbb6..763a86d52fef 100644 --- a/arch/arm64/kernel/module.c +++ b/arch/arm64/kernel/module.c @@ -470,22 +470,39 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, return -ENOEXEC; } -int module_finalize(const Elf_Ehdr *hdr, - const Elf_Shdr *sechdrs, - struct module *me) +static const Elf_Shdr *find_section(const Elf_Ehdr *hdr, + const Elf_Shdr *sechdrs, + const char *name) { const Elf_Shdr *s, *se; const char *secstrs = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; for (s = sechdrs, se = sechdrs + hdr->e_shnum; s < se; s++) { - if (strcmp(".altinstructions", secstrs + s->sh_name) == 0) - apply_alternatives_module((void *)s->sh_addr, s->sh_size); + if (strcmp(name, secstrs + s->sh_name) == 0) + return s; + } + + return NULL; +} + +int module_finalize(const Elf_Ehdr *hdr, + const Elf_Shdr *sechdrs, + struct module *me) +{ + const Elf_Shdr *s; + + s = find_section(hdr, sechdrs, ".altinstructions"); + if (s) + apply_alternatives_module((void *)s->sh_addr, s->sh_size); + #ifdef CONFIG_ARM64_MODULE_PLTS - if (IS_ENABLED(CONFIG_DYNAMIC_FTRACE) && - !strcmp(".text.ftrace_trampoline", secstrs + s->sh_name)) - me->arch.ftrace_trampoline = (void *)s->sh_addr; -#endif + if (IS_ENABLED(CONFIG_DYNAMIC_FTRACE)) { + s = find_section(hdr, sechdrs, ".text.ftrace_trampoline"); + if (!s) + return -ENOEXEC; + me->arch.ftrace_trampoline = (void *)s->sh_addr; } +#endif return 0; }