Thomas Gleixner | 2874c5f | 2019-05-27 08:55:01 +0200 | [diff] [blame^] | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
jdl@freescale.com | a37c887 | 2005-09-07 15:27:09 -0500 | [diff] [blame] | 2 | #ifndef _ASM_POWERPC_MODULE_H |
| 3 | #define _ASM_POWERPC_MODULE_H |
Arnd Bergmann | 88ced03 | 2005-12-16 22:43:46 +0100 | [diff] [blame] | 4 | #ifdef __KERNEL__ |
Jon Loeliger | 6b9269a | 2005-09-01 15:51:52 -0500 | [diff] [blame] | 5 | |
| 6 | /* |
Jon Loeliger | 6b9269a | 2005-09-01 15:51:52 -0500 | [diff] [blame] | 7 | */ |
| 8 | |
| 9 | #include <linux/list.h> |
| 10 | #include <asm/bug.h> |
David Howells | 786d35d | 2012-09-28 14:31:03 +0930 | [diff] [blame] | 11 | #include <asm-generic/module.h> |
Jon Loeliger | 6b9269a | 2005-09-01 15:51:52 -0500 | [diff] [blame] | 12 | |
| 13 | |
Nicholas Piggin | abba759 | 2018-05-30 22:19:22 +1000 | [diff] [blame] | 14 | #ifdef CONFIG_MPROFILE_KERNEL |
Michael Ellerman | 73aca17 | 2018-03-26 19:27:01 +1100 | [diff] [blame] | 15 | #define MODULE_ARCH_VERMAGIC_FTRACE "mprofile-kernel " |
| 16 | #else |
| 17 | #define MODULE_ARCH_VERMAGIC_FTRACE "" |
Michael Ellerman | 43e24e8 | 2017-05-10 16:57:49 +1000 | [diff] [blame] | 18 | #endif |
| 19 | |
Michael Ellerman | 73aca17 | 2018-03-26 19:27:01 +1100 | [diff] [blame] | 20 | #ifdef CONFIG_RELOCATABLE |
| 21 | #define MODULE_ARCH_VERMAGIC_RELOCATABLE "relocatable " |
| 22 | #else |
| 23 | #define MODULE_ARCH_VERMAGIC_RELOCATABLE "" |
| 24 | #endif |
| 25 | |
| 26 | #define MODULE_ARCH_VERMAGIC MODULE_ARCH_VERMAGIC_FTRACE MODULE_ARCH_VERMAGIC_RELOCATABLE |
| 27 | |
Jon Loeliger | 6b9269a | 2005-09-01 15:51:52 -0500 | [diff] [blame] | 28 | #ifndef __powerpc64__ |
| 29 | /* |
| 30 | * Thanks to Paul M for explaining this. |
| 31 | * |
| 32 | * PPC can only do rel jumps += 32MB, and often the kernel and other |
Adam Buchbinder | 446957b | 2016-02-24 10:51:11 -0800 | [diff] [blame] | 33 | * modules are further away than this. So, we jump to a table of |
Jon Loeliger | 6b9269a | 2005-09-01 15:51:52 -0500 | [diff] [blame] | 34 | * trampolines attached to the module (the Procedure Linkage Table) |
| 35 | * whenever that happens. |
| 36 | */ |
| 37 | |
| 38 | struct ppc_plt_entry { |
| 39 | /* 16 byte jump instruction sequence (4 instructions) */ |
| 40 | unsigned int jump[4]; |
| 41 | }; |
| 42 | #endif /* __powerpc64__ */ |
| 43 | |
| 44 | |
| 45 | struct mod_arch_specific { |
| 46 | #ifdef __powerpc64__ |
| 47 | unsigned int stubs_section; /* Index of stubs section in module */ |
| 48 | unsigned int toc_section; /* What section is the TOC? */ |
Rusty Russell | 4edebbe | 2014-03-18 19:59:26 +1030 | [diff] [blame] | 49 | bool toc_fixed; /* Have we fixed up .TOC.? */ |
Steven Rostedt | f48cb8b | 2008-11-14 20:47:03 -0800 | [diff] [blame] | 50 | |
Sergey Senozhatsky | 5633e85 | 2017-11-10 08:48:27 +0900 | [diff] [blame] | 51 | /* For module function descriptor dereference */ |
| 52 | unsigned long start_opd; |
| 53 | unsigned long end_opd; |
Steven Rostedt | 7cc45e6 | 2008-11-15 02:39:05 -0500 | [diff] [blame] | 54 | #else /* powerpc64 */ |
Jon Loeliger | 6b9269a | 2005-09-01 15:51:52 -0500 | [diff] [blame] | 55 | /* Indices of PLT sections within module. */ |
| 56 | unsigned int core_plt_section; |
| 57 | unsigned int init_plt_section; |
Josh Poimboeuf | 8ce621e1 | 2018-05-24 22:48:34 -0500 | [diff] [blame] | 58 | #endif /* powerpc64 */ |
| 59 | |
Steven Rostedt | 7cc45e6 | 2008-11-15 02:39:05 -0500 | [diff] [blame] | 60 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 61 | unsigned long tramp; |
Josh Poimboeuf | 8ce621e1 | 2018-05-24 22:48:34 -0500 | [diff] [blame] | 62 | #ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS |
| 63 | unsigned long tramp_regs; |
Jon Loeliger | 6b9269a | 2005-09-01 15:51:52 -0500 | [diff] [blame] | 64 | #endif |
Josh Poimboeuf | 8ce621e1 | 2018-05-24 22:48:34 -0500 | [diff] [blame] | 65 | #endif |
Jon Loeliger | 6b9269a | 2005-09-01 15:51:52 -0500 | [diff] [blame] | 66 | |
| 67 | /* List of BUG addresses, source line numbers and filenames */ |
| 68 | struct list_head bug_list; |
| 69 | struct bug_entry *bug_table; |
| 70 | unsigned int num_bugs; |
| 71 | }; |
| 72 | |
Jon Loeliger | 6b9269a | 2005-09-01 15:51:52 -0500 | [diff] [blame] | 73 | /* |
| 74 | * Select ELF headers. |
| 75 | * Make empty section for module_frob_arch_sections to expand. |
| 76 | */ |
| 77 | |
| 78 | #ifdef __powerpc64__ |
Jon Loeliger | 6b9269a | 2005-09-01 15:51:52 -0500 | [diff] [blame] | 79 | # ifdef MODULE |
| 80 | asm(".section .stubs,\"ax\",@nobits; .align 3; .previous"); |
| 81 | # endif |
| 82 | #else |
Jon Loeliger | 6b9269a | 2005-09-01 15:51:52 -0500 | [diff] [blame] | 83 | # ifdef MODULE |
| 84 | asm(".section .plt,\"ax\",@nobits; .align 3; .previous"); |
| 85 | asm(".section .init.plt,\"ax\",@nobits; .align 3; .previous"); |
| 86 | # endif /* MODULE */ |
| 87 | #endif |
| 88 | |
Steven Rostedt | f48cb8b | 2008-11-14 20:47:03 -0800 | [diff] [blame] | 89 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 90 | # ifdef MODULE |
| 91 | asm(".section .ftrace.tramp,\"ax\",@nobits; .align 3; .previous"); |
| 92 | # endif /* MODULE */ |
| 93 | #endif |
| 94 | |
Michael Ellerman | f17c4e0 | 2016-03-03 15:26:55 +1100 | [diff] [blame] | 95 | int module_trampoline_target(struct module *mod, unsigned long trampoline, |
Anton Blanchard | dd9fa16 | 2014-04-04 15:58:42 +1100 | [diff] [blame] | 96 | unsigned long *target); |
Jon Loeliger | 6b9269a | 2005-09-01 15:51:52 -0500 | [diff] [blame] | 97 | |
Michael Ellerman | 136cd34 | 2016-03-03 15:26:54 +1100 | [diff] [blame] | 98 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 99 | int module_finalize_ftrace(struct module *mod, const Elf_Shdr *sechdrs); |
| 100 | #else |
| 101 | static inline int module_finalize_ftrace(struct module *mod, const Elf_Shdr *sechdrs) |
| 102 | { |
| 103 | return 0; |
| 104 | } |
| 105 | #endif |
| 106 | |
Arnd Bergmann | 88ced03 | 2005-12-16 22:43:46 +0100 | [diff] [blame] | 107 | #endif /* __KERNEL__ */ |
jdl@freescale.com | a37c887 | 2005-09-07 15:27:09 -0500 | [diff] [blame] | 108 | #endif /* _ASM_POWERPC_MODULE_H */ |