summaryrefslogtreecommitdiff
path: root/arch/arm/kernel/module-plts.c
diff options
context:
space:
mode:
authorAlex Sverdlin <alexander.sverdlin@nokia.com>2022-09-27 13:08:37 +0100
committerRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2022-11-07 14:18:59 +0000
commit4ab07fd3fbe6b6fe5f28e0e2987eb02bedc2b495 (patch)
treebb709a7e4a21ba562f8b63652c2a5bd21ce4d6e2 /arch/arm/kernel/module-plts.c
parente66372ecb80dc5179c7abb880229c7452e813d15 (diff)
ARM: 9252/1: module: Teach unwinder about PLTs
"unwind: Index not found eef26358" warnings keep popping up on CONFIG_ARM_MODULE_PLTS-enabled systems if the PC points to a PLT veneer. Teach the unwinder how to deal with them, taking into account they don't change state of the stack or register file except loading PC. Link: https://lore.kernel.org/linux-arm-kernel/20200402153845.30985-1-kursad.oney@broadcom.com/ Tested-by: Kursad Oney <kursad.oney@broadcom.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Diffstat (limited to 'arch/arm/kernel/module-plts.c')
-rw-r--r--arch/arm/kernel/module-plts.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/arch/arm/kernel/module-plts.c b/arch/arm/kernel/module-plts.c
index 1fc309b41f94..af7c322ebed6 100644
--- a/arch/arm/kernel/module-plts.c
+++ b/arch/arm/kernel/module-plts.c
@@ -284,3 +284,17 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
mod->arch.core.plt->sh_size, mod->arch.init.plt->sh_size);
return 0;
}
+
+bool in_module_plt(unsigned long loc)
+{
+ struct module *mod;
+ bool ret;
+
+ preempt_disable();
+ mod = __module_text_address(loc);
+ ret = mod && (loc - (u32)mod->arch.core.plt_ent < mod->arch.core.plt_count * PLT_ENT_SIZE ||
+ loc - (u32)mod->arch.init.plt_ent < mod->arch.init.plt_count * PLT_ENT_SIZE);
+ preempt_enable();
+
+ return ret;
+}