]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
parisc64: Add .opd based function descriptor dereference
authorSergey Senozhatsky <sergey.senozhatsky@gmail.com>
Thu, 9 Nov 2017 23:48:28 +0000 (08:48 +0900)
committerPetr Mladek <pmladek@suse.com>
Tue, 9 Jan 2018 09:45:38 +0000 (10:45 +0100)
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).

Link: http://lkml.kernel.org/r/20171109234830.5067-5-sergey.senozhatsky@gmail.com
To: Tony Luck <tony.luck@intel.com>
To: Fenghua Yu <fenghua.yu@intel.com>
To: Helge Deller <deller@gmx.de>
To: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Paul Mackerras <paulus@samba.org>
To: Michael Ellerman <mpe@ellerman.id.au>
To: James Bottomley <jejb@parisc-linux.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jessica Yu <jeyu@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: linux-ia64@vger.kernel.org
Cc: linux-parisc@vger.kernel.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Tested-by: Helge Deller <deller@gmx.de> #parisc64
Signed-off-by: Petr Mladek <pmladek@suse.com>
arch/parisc/boot/compressed/vmlinux.lds.S
arch/parisc/include/asm/sections.h
arch/parisc/kernel/module.c
arch/parisc/kernel/process.c
arch/parisc/kernel/vmlinux.lds.S

index a4ce3314e78e04a1e47ac977234eee5f731248f2..4ebd4e65524cd3cf6347a2948dede9163a4807b9 100644 (file)
@@ -29,7 +29,9 @@ SECTIONS
        . = ALIGN(16);
        /* Linkage tables */
        .opd : {
+               __start_opd = .;
                *(.opd)
+               __end_opd = .;
        } PROVIDE (__gp = .);
        .plt : {
                *(.plt)
index accdf40aa5b7402396a40be069d6c84e04981a69..5a40b51df80ce1f6f5cb331975ca273575db622e 100644 (file)
@@ -6,8 +6,14 @@
 #include <asm-generic/sections.h>
 
 #ifdef CONFIG_64BIT
+
+#define HAVE_DEREFERENCE_FUNCTION_DESCRIPTOR 1
+
 #undef dereference_function_descriptor
 void *dereference_function_descriptor(void *);
+
+#undef dereference_kernel_function_descriptor
+void *dereference_kernel_function_descriptor(void *);
 #endif
 
 #endif
index f1a76935a3149495c8a65faeee8028295c24e559..b5b3cb00f1fb0f4cb2368812c461a9821350c48f 100644 (file)
@@ -66,6 +66,7 @@
 
 #include <asm/pgtable.h>
 #include <asm/unwind.h>
+#include <asm/sections.h>
 
 #if 0
 #define DEBUGP printk
@@ -954,3 +955,18 @@ void module_arch_cleanup(struct module *mod)
 {
        deregister_unwind_table(mod);
 }
+
+#ifdef CONFIG_64BIT
+void *dereference_module_function_descriptor(struct module *mod, void *ptr)
+{
+       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);
+
+       if (ptr < (void *)start_opd || ptr >= (void *)end_opd)
+               return ptr;
+
+       return dereference_function_descriptor(ptr);
+}
+#endif
index 30f92391a93ef6d5a90970b81921a2133d5e2eb0..6c4585103a912e52babe30258f52d2a56223f7b9 100644 (file)
@@ -276,6 +276,15 @@ void *dereference_function_descriptor(void *ptr)
                ptr = p;
        return ptr;
 }
+
+void *dereference_kernel_function_descriptor(void *ptr)
+{
+       if (ptr < (void *)__start_opd ||
+                       ptr >= (void *)__end_opd)
+               return ptr;
+
+       return dereference_function_descriptor(ptr);
+}
 #endif
 
 static inline unsigned long brk_rnd(void)
index 159a2ec0b4e01f148c1ed6e4c5539abb504ac1b6..da2e31190efa1b98f4975c0be5e4c633e4bc6e87 100644 (file)
@@ -100,7 +100,9 @@ SECTIONS
        . = ALIGN(16);
        /* Linkage tables */
        .opd : {
+               __start_opd = .;
                *(.opd)
+               __end_opd = .;
        } PROVIDE (__gp = .);
        .plt : {
                *(.plt)