diff options
author | Ingo Molnar <mingo@kernel.org> | 2016-04-19 11:38:52 +0300 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-04-19 11:38:52 +0300 |
commit | 6666ea558b1f4134291c15ac59366f69c2d1f321 (patch) | |
tree | 99e4204b51e69a12721123d3bb1912f6ca0a2726 /arch/mips/kernel/module-rela.c | |
parent | 91ed140d6c1e168b11bbbddac4f6066f40a0c6b5 (diff) | |
parent | c3b46c73264b03000d1e18b22f5caf63332547c9 (diff) | |
download | linux-6666ea558b1f4134291c15ac59366f69c2d1f321.tar.xz |
Merge tag 'v4.6-rc4' into x86/asm, to pick up fixes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/mips/kernel/module-rela.c')
-rw-r--r-- | arch/mips/kernel/module-rela.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/arch/mips/kernel/module-rela.c b/arch/mips/kernel/module-rela.c index 2b70723071c3..9083d63b765c 100644 --- a/arch/mips/kernel/module-rela.c +++ b/arch/mips/kernel/module-rela.c @@ -109,9 +109,10 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, struct module *me) { Elf_Mips_Rela *rel = (void *) sechdrs[relsec].sh_addr; + int (*handler)(struct module *me, u32 *location, Elf_Addr v); Elf_Sym *sym; u32 *location; - unsigned int i; + unsigned int i, type; Elf_Addr v; int res; @@ -134,9 +135,21 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, return -ENOENT; } - v = sym->st_value + rel[i].r_addend; + type = ELF_MIPS_R_TYPE(rel[i]); + + if (type < ARRAY_SIZE(reloc_handlers_rela)) + handler = reloc_handlers_rela[type]; + else + handler = NULL; - res = reloc_handlers_rela[ELF_MIPS_R_TYPE(rel[i])](me, location, v); + if (!handler) { + pr_err("%s: Unknown relocation type %u\n", + me->name, type); + return -EINVAL; + } + + v = sym->st_value + rel[i].r_addend; + res = handler(me, location, v); if (res) return res; } |