riscv: Support R_RISCV_ADD64 and R_RISCV_SUB64 relocs
authorEmil Renner Berthing <kernel@esmil.dk>
Tue, 14 Jul 2020 07:40:43 +0000 (09:40 +0200)
committerPalmer Dabbelt <palmerdabbelt@google.com>
Thu, 30 Jul 2020 18:37:41 +0000 (11:37 -0700)
These are needed for the __jump_table in modules using
static keys/jump-labels with the layout from
HAVE_ARCH_JUMP_LABEL_RELATIVE on 64bit kernels.

Signed-off-by: Emil Renner Berthing <kernel@esmil.dk>
Reviewed-by: Björn Töpel <bjorn.topel@gmail.com>
Tested-by: Björn Töpel <bjorn.topel@gmail.com>
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
arch/riscv/kernel/module.c

index 7191342c54da91316cb59525321fed508dfefe36..104fba889cf767cb159840954de99f985f7f0929 100644 (file)
@@ -263,6 +263,13 @@ static int apply_r_riscv_add32_rela(struct module *me, u32 *location,
        return 0;
 }
 
+static int apply_r_riscv_add64_rela(struct module *me, u32 *location,
+                                   Elf_Addr v)
+{
+       *(u64 *)location += (u64)v;
+       return 0;
+}
+
 static int apply_r_riscv_sub32_rela(struct module *me, u32 *location,
                                    Elf_Addr v)
 {
@@ -270,6 +277,13 @@ static int apply_r_riscv_sub32_rela(struct module *me, u32 *location,
        return 0;
 }
 
+static int apply_r_riscv_sub64_rela(struct module *me, u32 *location,
+                                   Elf_Addr v)
+{
+       *(u64 *)location -= (u64)v;
+       return 0;
+}
+
 static int (*reloc_handlers_rela[]) (struct module *me, u32 *location,
                                Elf_Addr v) = {
        [R_RISCV_32]                    = apply_r_riscv_32_rela,
@@ -290,7 +304,9 @@ 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_ADD64]                 = apply_r_riscv_add64_rela,
        [R_RISCV_SUB32]                 = apply_r_riscv_sub32_rela,
+       [R_RISCV_SUB64]                 = apply_r_riscv_sub64_rela,
 };
 
 int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,