This source file includes following definitions.
- initcall_from_entry
- initcall_from_entry
1
2 #ifndef _LINUX_INIT_H
3 #define _LINUX_INIT_H
4
5 #include <linux/compiler.h>
6 #include <linux/types.h>
7
8
9 #if defined(__noretpoline) && !defined(MODULE)
10 #define __noinitretpoline __noretpoline
11 #else
12 #define __noinitretpoline
13 #endif
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 #define __init __section(.init.text) __cold __latent_entropy __noinitretpoline
51 #define __initdata __section(.init.data)
52 #define __initconst __section(.init.rodata)
53 #define __exitdata __section(.exit.data)
54 #define __exit_call __used __section(.exitcall.exit)
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 #define __ref __section(.ref.text) noinline
74 #define __refdata __section(.ref.data)
75 #define __refconst __section(.ref.rodata)
76
77 #ifdef MODULE
78 #define __exitused
79 #else
80 #define __exitused __used
81 #endif
82
83 #define __exit __section(.exit.text) __exitused __cold notrace
84
85
86 #define __meminit __section(.meminit.text) __cold notrace \
87 __latent_entropy
88 #define __meminitdata __section(.meminit.data)
89 #define __meminitconst __section(.meminit.rodata)
90 #define __memexit __section(.memexit.text) __exitused __cold notrace
91 #define __memexitdata __section(.memexit.data)
92 #define __memexitconst __section(.memexit.rodata)
93
94
95 #define __HEAD .section ".head.text","ax"
96 #define __INIT .section ".init.text","ax"
97 #define __FINIT .previous
98
99 #define __INITDATA .section ".init.data","aw",%progbits
100 #define __INITRODATA .section ".init.rodata","a",%progbits
101 #define __FINITDATA .previous
102
103 #define __MEMINIT .section ".meminit.text", "ax"
104 #define __MEMINITDATA .section ".meminit.data", "aw"
105 #define __MEMINITRODATA .section ".meminit.rodata", "a"
106
107
108 #define __REF .section ".ref.text", "ax"
109 #define __REFDATA .section ".ref.data", "aw"
110 #define __REFCONST .section ".ref.rodata", "a"
111
112 #ifndef __ASSEMBLY__
113
114
115
116 typedef int (*initcall_t)(void);
117 typedef void (*exitcall_t)(void);
118
119 #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
120 typedef int initcall_entry_t;
121
122 static inline initcall_t initcall_from_entry(initcall_entry_t *entry)
123 {
124 return offset_to_ptr(entry);
125 }
126 #else
127 typedef initcall_t initcall_entry_t;
128
129 static inline initcall_t initcall_from_entry(initcall_entry_t *entry)
130 {
131 return *entry;
132 }
133 #endif
134
135 extern initcall_entry_t __con_initcall_start[], __con_initcall_end[];
136
137
138 typedef void (*ctor_fn_t)(void);
139
140 struct file_system_type;
141
142
143 extern int do_one_initcall(initcall_t fn);
144 extern char __initdata boot_command_line[];
145 extern char *saved_command_line;
146 extern unsigned int reset_devices;
147
148
149 void setup_arch(char **);
150 void prepare_namespace(void);
151 void __init init_rootfs(void);
152 extern struct file_system_type rootfs_fs_type;
153
154 #if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX)
155 extern bool rodata_enabled;
156 #endif
157 #ifdef CONFIG_STRICT_KERNEL_RWX
158 void mark_rodata_ro(void);
159 #endif
160
161 extern void (*late_time_init)(void);
162
163 extern bool initcall_debug;
164
165 #endif
166
167 #ifndef MODULE
168
169 #ifndef __ASSEMBLY__
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187 #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
188 #define ___define_initcall(fn, id, __sec) \
189 __ADDRESSABLE(fn) \
190 asm(".section \"" #__sec ".init\", \"a\" \n" \
191 "__initcall_" #fn #id ": \n" \
192 ".long " #fn " - . \n" \
193 ".previous \n");
194 #else
195 #define ___define_initcall(fn, id, __sec) \
196 static initcall_t __initcall_##fn##id __used \
197 __attribute__((__section__(#__sec ".init"))) = fn;
198 #endif
199
200 #define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)
201
202
203
204
205
206
207 #define early_initcall(fn) __define_initcall(fn, early)
208
209
210
211
212
213
214
215
216 #define pure_initcall(fn) __define_initcall(fn, 0)
217
218 #define core_initcall(fn) __define_initcall(fn, 1)
219 #define core_initcall_sync(fn) __define_initcall(fn, 1s)
220 #define postcore_initcall(fn) __define_initcall(fn, 2)
221 #define postcore_initcall_sync(fn) __define_initcall(fn, 2s)
222 #define arch_initcall(fn) __define_initcall(fn, 3)
223 #define arch_initcall_sync(fn) __define_initcall(fn, 3s)
224 #define subsys_initcall(fn) __define_initcall(fn, 4)
225 #define subsys_initcall_sync(fn) __define_initcall(fn, 4s)
226 #define fs_initcall(fn) __define_initcall(fn, 5)
227 #define fs_initcall_sync(fn) __define_initcall(fn, 5s)
228 #define rootfs_initcall(fn) __define_initcall(fn, rootfs)
229 #define device_initcall(fn) __define_initcall(fn, 6)
230 #define device_initcall_sync(fn) __define_initcall(fn, 6s)
231 #define late_initcall(fn) __define_initcall(fn, 7)
232 #define late_initcall_sync(fn) __define_initcall(fn, 7s)
233
234 #define __initcall(fn) device_initcall(fn)
235
236 #define __exitcall(fn) \
237 static exitcall_t __exitcall_##fn __exit_call = fn
238
239 #define console_initcall(fn) ___define_initcall(fn,, .con_initcall)
240
241 struct obs_kernel_param {
242 const char *str;
243 int (*setup_func)(char *);
244 int early;
245 };
246
247
248
249
250
251
252
253 #define __setup_param(str, unique_id, fn, early) \
254 static const char __setup_str_##unique_id[] __initconst \
255 __aligned(1) = str; \
256 static struct obs_kernel_param __setup_##unique_id \
257 __used __section(.init.setup) \
258 __attribute__((aligned((sizeof(long))))) \
259 = { __setup_str_##unique_id, fn, early }
260
261 #define __setup(str, fn) \
262 __setup_param(str, fn, fn, 0)
263
264
265
266
267
268 #define early_param(str, fn) \
269 __setup_param(str, fn, fn, 1)
270
271 #define early_param_on_off(str_on, str_off, var, config) \
272 \
273 int var = IS_ENABLED(config); \
274 \
275 static int __init parse_##var##_on(char *arg) \
276 { \
277 var = 1; \
278 return 0; \
279 } \
280 __setup_param(str_on, parse_##var##_on, parse_##var##_on, 1); \
281 \
282 static int __init parse_##var##_off(char *arg) \
283 { \
284 var = 0; \
285 return 0; \
286 } \
287 __setup_param(str_off, parse_##var##_off, parse_##var##_off, 1)
288
289
290 void __init parse_early_param(void);
291 void __init parse_early_options(char *cmdline);
292 #endif
293
294 #else
295
296 #define __setup_param(str, unique_id, fn)
297 #define __setup(str, func)
298 #endif
299
300
301 #define __nosavedata __section(.data..nosave)
302
303 #ifdef MODULE
304 #define __exit_p(x) x
305 #else
306 #define __exit_p(x) NULL
307 #endif
308
309 #endif