aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/init.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/init.h')
-rw-r--r--include/linux/init.h44
1 files changed, 33 insertions, 11 deletions
diff --git a/include/linux/init.h b/include/linux/init.h
index bc27cf03c41e..2538d176dd1f 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -116,8 +116,24 @@
116typedef int (*initcall_t)(void); 116typedef int (*initcall_t)(void);
117typedef void (*exitcall_t)(void); 117typedef void (*exitcall_t)(void);
118 118
119extern initcall_t __con_initcall_start[], __con_initcall_end[]; 119#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
120extern initcall_t __security_initcall_start[], __security_initcall_end[]; 120typedef int initcall_entry_t;
121
122static inline initcall_t initcall_from_entry(initcall_entry_t *entry)
123{
124 return offset_to_ptr(entry);
125}
126#else
127typedef initcall_t initcall_entry_t;
128
129static inline initcall_t initcall_from_entry(initcall_entry_t *entry)
130{
131 return *entry;
132}
133#endif
134
135extern initcall_entry_t __con_initcall_start[], __con_initcall_end[];
136extern initcall_entry_t __security_initcall_start[], __security_initcall_end[];
121 137
122/* Used for contructor calls. */ 138/* Used for contructor calls. */
123typedef void (*ctor_fn_t)(void); 139typedef void (*ctor_fn_t)(void);
@@ -167,9 +183,20 @@ extern bool initcall_debug;
167 * as KEEP() in the linker script. 183 * as KEEP() in the linker script.
168 */ 184 */
169 185
170#define __define_initcall(fn, id) \ 186#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
187#define ___define_initcall(fn, id, __sec) \
188 __ADDRESSABLE(fn) \
189 asm(".section \"" #__sec ".init\", \"a\" \n" \
190 "__initcall_" #fn #id ": \n" \
191 ".long " #fn " - . \n" \
192 ".previous \n");
193#else
194#define ___define_initcall(fn, id, __sec) \
171 static initcall_t __initcall_##fn##id __used \ 195 static initcall_t __initcall_##fn##id __used \
172 __attribute__((__section__(".initcall" #id ".init"))) = fn; 196 __attribute__((__section__(#__sec ".init"))) = fn;
197#endif
198
199#define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)
173 200
174/* 201/*
175 * Early initcalls run before initializing SMP. 202 * Early initcalls run before initializing SMP.
@@ -208,13 +235,8 @@ extern bool initcall_debug;
208#define __exitcall(fn) \ 235#define __exitcall(fn) \
209 static exitcall_t __exitcall_##fn __exit_call = fn 236 static exitcall_t __exitcall_##fn __exit_call = fn
210 237
211#define console_initcall(fn) \ 238#define console_initcall(fn) ___define_initcall(fn,, .con_initcall)
212 static initcall_t __initcall_##fn \ 239#define security_initcall(fn) ___define_initcall(fn,, .security_initcall)
213 __used __section(.con_initcall.init) = fn
214
215#define security_initcall(fn) \
216 static initcall_t __initcall_##fn \
217 __used __section(.security_initcall.init) = fn
218 240
219struct obs_kernel_param { 241struct obs_kernel_param {
220 const char *str; 242 const char *str;