On Wed, 8 Jul 2020 at 23:10, Emil Renner Berthing <kernel@xxxxxxxx> wrote: > > 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@xxxxxxxx> Reviewed-by: Björn Töpel <bjorn.topel@xxxxxxxxx> Tested-by: Björn Töpel <bjorn.topel@xxxxxxxxx> > --- > > Tested on the HiFive Unleashed board. > > This patch is new in v2. It fixes an error loading modules > containing static keys found by Björn Töpel. > > arch/riscv/kernel/module.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/arch/riscv/kernel/module.c b/arch/riscv/kernel/module.c > index 7191342c54da..104fba889cf7 100644 > --- a/arch/riscv/kernel/module.c > +++ b/arch/riscv/kernel/module.c > @@ -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, > -- > 2.27.0 >