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 __nocfi
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
119#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
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[];
136
137
138typedef void (*ctor_fn_t)(void);
139
140struct file_system_type;
141
142
143extern int do_one_initcall(initcall_t fn);
144extern char __initdata boot_command_line[];
145extern char *saved_command_line;
146extern unsigned int reset_devices;
147
148
149void setup_arch(char **);
150void prepare_namespace(void);
151void __init init_rootfs(void);
152extern struct file_system_type rootfs_fs_type;
153
154#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX)
155extern bool rodata_enabled;
156#endif
157#ifdef CONFIG_STRICT_KERNEL_RWX
158void mark_rodata_ro(void);
159#endif
160
161extern void (*late_time_init)(void);
162
163extern 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
188#define __initcall_id(fn) \
189 __PASTE(__KBUILD_MODNAME, \
190 __PASTE(__, \
191 __PASTE(__COUNTER__, \
192 __PASTE(_, \
193 __PASTE(__LINE__, \
194 __PASTE(_, fn))))))
195
196
197#define __initcall_name(prefix, __iid, id) \
198 __PASTE(__, \
199 __PASTE(prefix, \
200 __PASTE(__, \
201 __PASTE(__iid, id))))
202
203#ifdef CONFIG_LTO_CLANG
204
205
206
207
208
209
210#define __initcall_section(__sec, __iid) \
211 #__sec ".init.." #__iid
212
213
214
215
216
217
218
219#define __initcall_stub(fn, __iid, id) \
220 __initcall_name(initstub, __iid, id)
221
222#define __define_initcall_stub(__stub, fn) \
223 int __init __cficanonical __stub(void); \
224 int __init __cficanonical __stub(void) \
225 { \
226 return fn(); \
227 } \
228 __ADDRESSABLE(__stub)
229#else
230#define __initcall_section(__sec, __iid) \
231 #__sec ".init"
232
233#define __initcall_stub(fn, __iid, id) fn
234
235#define __define_initcall_stub(__stub, fn) \
236 __ADDRESSABLE(fn)
237#endif
238
239#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
240#define ____define_initcall(fn, __stub, __name, __sec) \
241 __define_initcall_stub(__stub, fn) \
242 asm(".section \"" __sec "\", \"a\" \n" \
243 __stringify(__name) ": \n" \
244 ".long " __stringify(__stub) " - . \n" \
245 ".previous \n"); \
246 static_assert(__same_type(initcall_t, &fn));
247#else
248#define ____define_initcall(fn, __unused, __name, __sec) \
249 static initcall_t __name __used \
250 __attribute__((__section__(__sec))) = fn;
251#endif
252
253#define __unique_initcall(fn, id, __sec, __iid) \
254 ____define_initcall(fn, \
255 __initcall_stub(fn, __iid, id), \
256 __initcall_name(initcall, __iid, id), \
257 __initcall_section(__sec, __iid))
258
259#define ___define_initcall(fn, id, __sec) \
260 __unique_initcall(fn, id, __sec, __initcall_id(fn))
261
262#define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)
263
264
265
266
267
268
269#define early_initcall(fn) __define_initcall(fn, early)
270
271
272
273
274
275
276
277
278#define pure_initcall(fn) __define_initcall(fn, 0)
279
280#define core_initcall(fn) __define_initcall(fn, 1)
281#define core_initcall_sync(fn) __define_initcall(fn, 1s)
282#define postcore_initcall(fn) __define_initcall(fn, 2)
283#define postcore_initcall_sync(fn) __define_initcall(fn, 2s)
284#define arch_initcall(fn) __define_initcall(fn, 3)
285#define arch_initcall_sync(fn) __define_initcall(fn, 3s)
286#define subsys_initcall(fn) __define_initcall(fn, 4)
287#define subsys_initcall_sync(fn) __define_initcall(fn, 4s)
288#define fs_initcall(fn) __define_initcall(fn, 5)
289#define fs_initcall_sync(fn) __define_initcall(fn, 5s)
290#define rootfs_initcall(fn) __define_initcall(fn, rootfs)
291#define device_initcall(fn) __define_initcall(fn, 6)
292#define device_initcall_sync(fn) __define_initcall(fn, 6s)
293#define late_initcall(fn) __define_initcall(fn, 7)
294#define late_initcall_sync(fn) __define_initcall(fn, 7s)
295
296#define __initcall(fn) device_initcall(fn)
297
298#define __exitcall(fn) \
299 static exitcall_t __exitcall_##fn __exit_call = fn
300
301#define console_initcall(fn) ___define_initcall(fn, con, .con_initcall)
302
303struct obs_kernel_param {
304 const char *str;
305 int (*setup_func)(char *);
306 int early;
307};
308
309
310
311
312
313
314
315#define __setup_param(str, unique_id, fn, early) \
316 static const char __setup_str_##unique_id[] __initconst \
317 __aligned(1) = str; \
318 static struct obs_kernel_param __setup_##unique_id \
319 __used __section(".init.setup") \
320 __aligned(__alignof__(struct obs_kernel_param)) \
321 = { __setup_str_##unique_id, fn, early }
322
323#define __setup(str, fn) \
324 __setup_param(str, fn, fn, 0)
325
326
327
328
329
330#define early_param(str, fn) \
331 __setup_param(str, fn, fn, 1)
332
333#define early_param_on_off(str_on, str_off, var, config) \
334 \
335 int var = IS_ENABLED(config); \
336 \
337 static int __init parse_##var##_on(char *arg) \
338 { \
339 var = 1; \
340 return 0; \
341 } \
342 early_param(str_on, parse_##var##_on); \
343 \
344 static int __init parse_##var##_off(char *arg) \
345 { \
346 var = 0; \
347 return 0; \
348 } \
349 early_param(str_off, parse_##var##_off)
350
351
352void __init parse_early_param(void);
353void __init parse_early_options(char *cmdline);
354#endif
355
356#else
357
358#define __setup_param(str, unique_id, fn)
359#define __setup(str, func)
360#endif
361
362
363#define __nosavedata __section(".data..nosave")
364
365#ifdef MODULE
366#define __exit_p(x) x
367#else
368#define __exit_p(x) NULL
369#endif
370
371#endif
372