aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZong Li <zong@andestech.com>2018-03-15 04:50:47 -0400
committerPalmer Dabbelt <palmer@sifive.com>2018-04-02 23:00:55 -0400
commit29e405cd88c373ddcb3399687311aa869a7c8ee7 (patch)
treed3c60f4aa52ca648f52fa0e19b63f3d90452927a
parent56ea45ae239206d79d776a43bf32cbd8fa4e069d (diff)
RISC-V: Support ALIGN relocation type in kernel module
Just fail on align type. Kernel modules loader didn't do relax like linker, it is difficult to remove or migrate the code, but the remnant nop instructions harm the performaace of module. We expect the building module with the no-relax option. Signed-off-by: Zong Li <zong@andestech.com> Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
-rw-r--r--arch/riscv/kernel/module.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/arch/riscv/kernel/module.c b/arch/riscv/kernel/module.c
index 7ab6a9b72384..957933e669b1 100644
--- a/arch/riscv/kernel/module.c
+++ b/arch/riscv/kernel/module.c
@@ -240,6 +240,15 @@ static int apply_r_riscv_relax_rela(struct module *me, u32 *location,
240 return 0; 240 return 0;
241} 241}
242 242
243static int apply_r_riscv_align_rela(struct module *me, u32 *location,
244 Elf_Addr v)
245{
246 pr_err(
247 "%s: The unexpected relocation type 'R_RISCV_ALIGN' from PC = %p\n",
248 me->name, location);
249 return -EINVAL;
250}
251
243static int (*reloc_handlers_rela[]) (struct module *me, u32 *location, 252static int (*reloc_handlers_rela[]) (struct module *me, u32 *location,
244 Elf_Addr v) = { 253 Elf_Addr v) = {
245 [R_RISCV_64] = apply_r_riscv_64_rela, 254 [R_RISCV_64] = apply_r_riscv_64_rela,
@@ -257,6 +266,7 @@ static int (*reloc_handlers_rela[]) (struct module *me, u32 *location,
257 [R_RISCV_CALL_PLT] = apply_r_riscv_call_plt_rela, 266 [R_RISCV_CALL_PLT] = apply_r_riscv_call_plt_rela,
258 [R_RISCV_CALL] = apply_r_riscv_call_rela, 267 [R_RISCV_CALL] = apply_r_riscv_call_rela,
259 [R_RISCV_RELAX] = apply_r_riscv_relax_rela, 268 [R_RISCV_RELAX] = apply_r_riscv_relax_rela,
269 [R_RISCV_ALIGN] = apply_r_riscv_align_rela,
260}; 270};
261 271
262int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, 272int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,