RISC-V: Support ADD32 relocation type in kernel module
authorZong Li <zong@andestech.com>
Thu, 15 Mar 2018 08:50:48 +0000 (16:50 +0800)
committerPalmer Dabbelt <palmer@sifive.com>
Tue, 3 Apr 2018 03:00:55 +0000 (20:00 -0700)
Signed-off-by: Zong Li <zong@andestech.com>
Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
arch/riscv/kernel/module.c

index 957933e..73ea36c 100644 (file)
@@ -249,6 +249,13 @@ static int apply_r_riscv_align_rela(struct module *me, u32 *location,
        return -EINVAL;
 }
 
+static int apply_r_riscv_add32_rela(struct module *me, u32 *location,
+                                   Elf_Addr v)
+{
+       *(u32 *)location += (*(u32 *)v);
+       return 0;
+}
+
 static int (*reloc_handlers_rela[]) (struct module *me, u32 *location,
                                Elf_Addr v) = {
        [R_RISCV_64]                    = apply_r_riscv_64_rela,
@@ -267,6 +274,7 @@ static int (*reloc_handlers_rela[]) (struct module *me, u32 *location,
        [R_RISCV_CALL]                  = apply_r_riscv_call_rela,
        [R_RISCV_RELAX]                 = apply_r_riscv_relax_rela,
        [R_RISCV_ALIGN]                 = apply_r_riscv_align_rela,
+       [R_RISCV_ADD32]                 = apply_r_riscv_add32_rela,
 };
 
 int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,