| 
									
										
										
										
											2005-09-07 15:27:09 -05:00
										 |  |  | #ifndef _ASM_POWERPC_MODULE_H
 | 
					
						
							|  |  |  | #define _ASM_POWERPC_MODULE_H
 | 
					
						
							| 
									
										
										
										
											2005-12-16 22:43:46 +01:00
										 |  |  | #ifdef __KERNEL__
 | 
					
						
							| 
									
										
										
										
											2005-09-01 15:51:52 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version | 
					
						
							|  |  |  |  * 2 of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/list.h>
 | 
					
						
							|  |  |  | #include <asm/bug.h>
 | 
					
						
							| 
									
										
										
										
											2012-09-28 14:31:03 +09:30
										 |  |  | #include <asm-generic/module.h>
 | 
					
						
							| 
									
										
										
										
											2005-09-01 15:51:52 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef __powerpc64__
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Thanks to Paul M for explaining this. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PPC can only do rel jumps += 32MB, and often the kernel and other | 
					
						
							|  |  |  |  * modules are furthur away than this.  So, we jump to a table of | 
					
						
							|  |  |  |  * trampolines attached to the module (the Procedure Linkage Table) | 
					
						
							|  |  |  |  * whenever that happens. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct ppc_plt_entry { | 
					
						
							|  |  |  | 	/* 16 byte jump instruction sequence (4 instructions) */ | 
					
						
							|  |  |  | 	unsigned int jump[4]; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | #endif	/* __powerpc64__ */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct mod_arch_specific { | 
					
						
							|  |  |  | #ifdef __powerpc64__
 | 
					
						
							|  |  |  | 	unsigned int stubs_section;	/* Index of stubs section in module */ | 
					
						
							|  |  |  | 	unsigned int toc_section;	/* What section is the TOC? */ | 
					
						
							| 
									
										
										
										
											2014-03-18 19:59:26 +10:30
										 |  |  | 	bool toc_fixed;			/* Have we fixed up .TOC.? */ | 
					
						
							| 
									
										
										
										
											2008-11-14 20:47:03 -08:00
										 |  |  | #ifdef CONFIG_DYNAMIC_FTRACE
 | 
					
						
							|  |  |  | 	unsigned long toc; | 
					
						
							|  |  |  | 	unsigned long tramp; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-15 02:39:05 -05:00
										 |  |  | #else /* powerpc64 */
 | 
					
						
							| 
									
										
										
										
											2005-09-01 15:51:52 -05:00
										 |  |  | 	/* Indices of PLT sections within module. */ | 
					
						
							|  |  |  | 	unsigned int core_plt_section; | 
					
						
							|  |  |  | 	unsigned int init_plt_section; | 
					
						
							| 
									
										
										
										
											2008-11-15 02:39:05 -05:00
										 |  |  | #ifdef CONFIG_DYNAMIC_FTRACE
 | 
					
						
							|  |  |  | 	unsigned long tramp; | 
					
						
							| 
									
										
										
										
											2005-09-01 15:51:52 -05:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-11-15 02:39:05 -05:00
										 |  |  | #endif /* powerpc64 */
 | 
					
						
							| 
									
										
										
										
											2005-09-01 15:51:52 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* List of BUG addresses, source line numbers and filenames */ | 
					
						
							|  |  |  | 	struct list_head bug_list; | 
					
						
							|  |  |  | 	struct bug_entry *bug_table; | 
					
						
							|  |  |  | 	unsigned int num_bugs; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Select ELF headers. | 
					
						
							|  |  |  |  * Make empty section for module_frob_arch_sections to expand. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __powerpc64__
 | 
					
						
							|  |  |  | #    ifdef MODULE
 | 
					
						
							|  |  |  | 	asm(".section .stubs,\"ax\",@nobits; .align 3; .previous"); | 
					
						
							|  |  |  | #    endif
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #    ifdef MODULE
 | 
					
						
							|  |  |  | 	asm(".section .plt,\"ax\",@nobits; .align 3; .previous"); | 
					
						
							|  |  |  | 	asm(".section .init.plt,\"ax\",@nobits; .align 3; .previous"); | 
					
						
							|  |  |  | #    endif	/* MODULE */
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-14 20:47:03 -08:00
										 |  |  | #ifdef CONFIG_DYNAMIC_FTRACE
 | 
					
						
							|  |  |  | #    ifdef MODULE
 | 
					
						
							|  |  |  | 	asm(".section .ftrace.tramp,\"ax\",@nobits; .align 3; .previous"); | 
					
						
							|  |  |  | #    endif	/* MODULE */
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-03 20:00:43 +11:00
										 |  |  | bool is_module_trampoline(u32 *insns); | 
					
						
							| 
									
										
										
										
											2014-04-04 15:58:42 +11:00
										 |  |  | int module_trampoline_target(struct module *mod, u32 *trampoline, | 
					
						
							|  |  |  | 			     unsigned long *target); | 
					
						
							| 
									
										
										
										
											2005-09-01 15:51:52 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | struct exception_table_entry; | 
					
						
							|  |  |  | void sort_ex_table(struct exception_table_entry *start, | 
					
						
							|  |  |  | 		   struct exception_table_entry *finish); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-15 14:04:50 +10:00
										 |  |  | #if defined(CONFIG_MODVERSIONS) && defined(CONFIG_PPC64)
 | 
					
						
							| 
									
										
										
										
											2009-12-15 16:28:32 -06:00
										 |  |  | #define ARCH_RELOCATES_KCRCTAB
 | 
					
						
							| 
									
										
										
										
											2013-07-15 14:04:50 +10:00
										 |  |  | #define reloc_start PHYSICAL_START
 | 
					
						
							| 
									
										
										
										
											2009-12-15 16:28:32 -06:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-12-16 22:43:46 +01:00
										 |  |  | #endif /* __KERNEL__ */
 | 
					
						
							| 
									
										
										
										
											2005-09-07 15:27:09 -05:00
										 |  |  | #endif	/* _ASM_POWERPC_MODULE_H */
 |