diff options
| -rw-r--r-- | arch/powerpc/include/asm/elf.h | 7 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/sections.h | 12 | ||||
| -rw-r--r-- | arch/powerpc/kernel/module_64.c | 19 |
3 files changed, 18 insertions, 20 deletions
diff --git a/arch/powerpc/include/asm/elf.h b/arch/powerpc/include/asm/elf.h index 80d1f399ee51..64c6ee22eefd 100644 --- a/arch/powerpc/include/asm/elf.h +++ b/arch/powerpc/include/asm/elf.h | |||
| @@ -409,6 +409,13 @@ do { \ | |||
| 409 | /* Keep this the last entry. */ | 409 | /* Keep this the last entry. */ |
| 410 | #define R_PPC64_NUM 107 | 410 | #define R_PPC64_NUM 107 |
| 411 | 411 | ||
| 412 | /* There's actually a third entry here, but it's unused */ | ||
| 413 | struct ppc64_opd_entry | ||
| 414 | { | ||
| 415 | unsigned long funcaddr; | ||
| 416 | unsigned long r2; | ||
| 417 | }; | ||
| 418 | |||
| 412 | #ifdef __KERNEL__ | 419 | #ifdef __KERNEL__ |
| 413 | 420 | ||
| 414 | #ifdef CONFIG_SPU_BASE | 421 | #ifdef CONFIG_SPU_BASE |
diff --git a/arch/powerpc/include/asm/sections.h b/arch/powerpc/include/asm/sections.h index 7710e9e6660f..07956f3e7844 100644 --- a/arch/powerpc/include/asm/sections.h +++ b/arch/powerpc/include/asm/sections.h | |||
| @@ -2,6 +2,8 @@ | |||
| 2 | #define _ASM_POWERPC_SECTIONS_H | 2 | #define _ASM_POWERPC_SECTIONS_H |
| 3 | #ifdef __KERNEL__ | 3 | #ifdef __KERNEL__ |
| 4 | 4 | ||
| 5 | #include <linux/elf.h> | ||
| 6 | #include <linux/uaccess.h> | ||
| 5 | #include <asm-generic/sections.h> | 7 | #include <asm-generic/sections.h> |
| 6 | 8 | ||
| 7 | #ifdef __powerpc64__ | 9 | #ifdef __powerpc64__ |
| @@ -17,7 +19,15 @@ static inline int in_kernel_text(unsigned long addr) | |||
| 17 | } | 19 | } |
| 18 | 20 | ||
| 19 | #undef dereference_function_descriptor | 21 | #undef dereference_function_descriptor |
| 20 | void *dereference_function_descriptor(void *); | 22 | static inline void *dereference_function_descriptor(void *ptr) |
| 23 | { | ||
| 24 | struct ppc64_opd_entry *desc = ptr; | ||
| 25 | void *p; | ||
| 26 | |||
| 27 | if (!probe_kernel_address(&desc->funcaddr, p)) | ||
| 28 | ptr = p; | ||
| 29 | return ptr; | ||
| 30 | } | ||
| 21 | 31 | ||
| 22 | #endif | 32 | #endif |
| 23 | 33 | ||
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index ad79de272ff3..1af2377e4992 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c | |||
| @@ -21,9 +21,7 @@ | |||
| 21 | #include <linux/err.h> | 21 | #include <linux/err.h> |
| 22 | #include <linux/vmalloc.h> | 22 | #include <linux/vmalloc.h> |
| 23 | #include <linux/bug.h> | 23 | #include <linux/bug.h> |
| 24 | #include <linux/uaccess.h> | ||
| 25 | #include <asm/module.h> | 24 | #include <asm/module.h> |
| 26 | #include <asm/sections.h> | ||
| 27 | #include <asm/firmware.h> | 25 | #include <asm/firmware.h> |
| 28 | #include <asm/code-patching.h> | 26 | #include <asm/code-patching.h> |
| 29 | #include <linux/sort.h> | 27 | #include <linux/sort.h> |
| @@ -43,13 +41,6 @@ | |||
| 43 | #define DEBUGP(fmt , ...) | 41 | #define DEBUGP(fmt , ...) |
| 44 | #endif | 42 | #endif |
| 45 | 43 | ||
| 46 | /* There's actually a third entry here, but it's unused */ | ||
| 47 | struct ppc64_opd_entry | ||
| 48 | { | ||
| 49 | unsigned long funcaddr; | ||
| 50 | unsigned long r2; | ||
| 51 | }; | ||
| 52 | |||
| 53 | /* Like PPC32, we need little trampolines to do > 24-bit jumps (into | 44 | /* Like PPC32, we need little trampolines to do > 24-bit jumps (into |
| 54 | the kernel itself). But on PPC64, these need to be used for every | 45 | the kernel itself). But on PPC64, these need to be used for every |
| 55 | jump, actually, to reset r2 (TOC+0x8000). */ | 46 | jump, actually, to reset r2 (TOC+0x8000). */ |
| @@ -452,13 +443,3 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
| 452 | 443 | ||
| 453 | return 0; | 444 | return 0; |
| 454 | } | 445 | } |
| 455 | |||
| 456 | void *dereference_function_descriptor(void *ptr) | ||
| 457 | { | ||
| 458 | struct ppc64_opd_entry *desc = ptr; | ||
| 459 | void *p; | ||
| 460 | |||
| 461 | if (!probe_kernel_address(&desc->funcaddr, p)) | ||
| 462 | ptr = p; | ||
| 463 | return ptr; | ||
| 464 | } | ||
