Re: [PATCHv3 5/7] parisc64: Add .opd based function descriptor dereference
flat view
From: Petr Mladek <pmladek@suse.com>
Date: 2017-10-04 10:40:23
Also in:
lkml
On Sat 2017-09-30 11:53:17, Sergey Senozhatsky wrote:
We are moving towards separate kernel and module function descriptor dereference callbacks. This patch enables it for parisc64. For pointers that belong to the kernel - Added __start_opd and __end_opd pointers, to track the kernel .opd section address range; - Added dereference_kernel_function_descriptor(). Now we will dereference only function pointers that are within [__start_opd, __end_opd]; For pointers that belong to a module - Added dereference_module_function_descriptor() to handle module function descriptor dereference. Now we will dereference only pointers that are within [module->opd.start, module->opd.end].
quoted hunk ↗ jump to hunk
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c index f1a76935a314..28f89b3dcc11 100644 --- a/arch/parisc/kernel/module.c +++ b/arch/parisc/kernel/module.c@@ -954,3 +955,19 @@ void module_arch_cleanup(struct module *mod) { deregister_unwind_table(mod); } + +#ifdef CONFIG_64BIT +unsigned long dereference_module_function_descriptor(struct module *mod, + unsigned long addr) +{ + unsigned long start_opd = (Elf64_Addr)mod->core_layout.base + + mod->arch.fdesc_offset; + unsigned long end_opd = start_opd + + mod->arch.fdesc_count * sizeof(Elf64_Fdesc);
I know that this is used in rather slow paths. But it still might make sense to have these section borders pre-computed and stored in struct mod_arch_specific. I mean to do similar thing that we do on powerpc. Well, we could do this in a followup patch if parisc people wanted it.
quoted hunk ↗ jump to hunk
+ if (addr < start_opd || addr >= end_opd) + return addr; + + return dereference_function_descriptor(addr); +} +#endif
Otherwise the patch looks fine to me. Reviewed-by: Petr Mladek <pmladek@suse.com> Best Regards, Petr