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
116typedef int (*initcall_t)(void);
117typedef void (*exitcall_t)(void);
118
119extern initcall_t __con_initcall_start[], __con_initcall_end[];
120extern initcall_t __security_initcall_start[], __security_initcall_end[];
121
122
123typedef void (*ctor_fn_t)(void);
124
125
126extern int do_one_initcall(initcall_t fn);
127extern char __initdata boot_command_line[];
128extern char *saved_command_line;
129extern unsigned int reset_devices;
130
131
132void setup_arch(char **);
133void prepare_namespace(void);
134void __init load_default_modules(void);
135int __init init_rootfs(void);
136
137#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX)
138extern bool rodata_enabled;
139#endif
140#ifdef CONFIG_STRICT_KERNEL_RWX
141void mark_rodata_ro(void);
142#endif
143
144extern void (*late_time_init)(void);
145
146extern bool initcall_debug;
147
148#endif
149
150#ifndef MODULE
151
152#ifndef __ASSEMBLY__
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170#define __define_initcall(fn, id) \
171 static initcall_t __initcall_##fn##id __used \
172 __attribute__((__section__(".initcall" #id ".init"))) = fn;
173
174
175
176
177
178
179#define early_initcall(fn) __define_initcall(fn, early)
180
181
182
183
184
185
186
187
188#define pure_initcall(fn) __define_initcall(fn, 0)
189
190#define core_initcall(fn) __define_initcall(fn, 1)
191#define core_initcall_sync(fn) __define_initcall(fn, 1s)
192#define postcore_initcall(fn) __define_initcall(fn, 2)
193#define postcore_initcall_sync(fn) __define_initcall(fn, 2s)
194#define arch_initcall(fn) __define_initcall(fn, 3)
195#define arch_initcall_sync(fn) __define_initcall(fn, 3s)
196#define subsys_initcall(fn) __define_initcall(fn, 4)
197#define subsys_initcall_sync(fn) __define_initcall(fn, 4s)
198#define fs_initcall(fn) __define_initcall(fn, 5)
199#define fs_initcall_sync(fn) __define_initcall(fn, 5s)
200#define rootfs_initcall(fn) __define_initcall(fn, rootfs)
201#define device_initcall(fn) __define_initcall(fn, 6)
202#define device_initcall_sync(fn) __define_initcall(fn, 6s)
203#define late_initcall(fn) __define_initcall(fn, 7)
204#define late_initcall_sync(fn) __define_initcall(fn, 7s)
205
206#define __initcall(fn) device_initcall(fn)
207
208#define __exitcall(fn) \
209 static exitcall_t __exitcall_##fn __exit_call = fn
210
211#define console_initcall(fn) \
212 static initcall_t __initcall_##fn \
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
219struct obs_kernel_param {
220 const char *str;
221 int (*setup_func)(char *);
222 int early;
223};
224
225
226
227
228
229
230
231#define __setup_param(str, unique_id, fn, early) \
232 static const char __setup_str_##unique_id[] __initconst \
233 __aligned(1) = str; \
234 static struct obs_kernel_param __setup_##unique_id \
235 __used __section(.init.setup) \
236 __attribute__((aligned((sizeof(long))))) \
237 = { __setup_str_##unique_id, fn, early }
238
239#define __setup(str, fn) \
240 __setup_param(str, fn, fn, 0)
241
242
243
244
245
246#define early_param(str, fn) \
247 __setup_param(str, fn, fn, 1)
248
249#define early_param_on_off(str_on, str_off, var, config) \
250 \
251 int var = IS_ENABLED(config); \
252 \
253 static int __init parse_##var##_on(char *arg) \
254 { \
255 var = 1; \
256 return 0; \
257 } \
258 __setup_param(str_on, parse_##var##_on, parse_##var##_on, 1); \
259 \
260 static int __init parse_##var##_off(char *arg) \
261 { \
262 var = 0; \
263 return 0; \
264 } \
265 __setup_param(str_off, parse_##var##_off, parse_##var##_off, 1)
266
267
268void __init parse_early_param(void);
269void __init parse_early_options(char *cmdline);
270#endif
271
272#else
273
274#define __setup_param(str, unique_id, fn)
275#define __setup(str, func)
276#endif
277
278
279#define __nosavedata __section(.data..nosave)
280
281#ifdef MODULE
282#define __exit_p(x) x
283#else
284#define __exit_p(x) NULL
285#endif
286
287#endif
288