RISC-V: Support SUB32 relocation type in kernel module
authorZong Li <zong@andestech.com>
Thu, 15 Mar 2018 08:50:49 +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 73ea36c73d3b19ef5f6937758fc54ccfaa1911e7..5dddba301d0a726ff78e97acca1b051c123a8bb7 100644 (file)
@@ -256,6 +256,13 @@ static int apply_r_riscv_add32_rela(struct module *me, u32 *location,
        return 0;
 }
 
+static int apply_r_riscv_sub32_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,
@@ -275,6 +282,7 @@ static int (*reloc_handlers_rela[]) (struct module *me, u32 *location,
        [R_RISCV_RELAX]                 = apply_r_riscv_relax_rela,
        [R_RISCV_ALIGN]                 = apply_r_riscv_align_rela,
        [R_RISCV_ADD32]                 = apply_r_riscv_add32_rela,
+       [R_RISCV_SUB32]                 = apply_r_riscv_sub32_rela,
 };
 
 int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,