1#ifndef _LINUX_INIT_H
2#define _LINUX_INIT_H
3
4#include <linux/compiler.h>
5
6
7
8
9
10
11
12
13
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#define __init __section(.init.text) __cold notrace
44#define __initdata __section(.init.data)
45#define __initconst __section(.init.rodata)
46#define __exitdata __section(.exit.data)
47#define __exit_call __used __section(.exitcall.exit)
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66#define __ref __section(.ref.text) noinline
67#define __refdata __section(.ref.data)
68#define __refconst __section(.ref.rodata)
69
70
71#define __init_refok __ref
72#define __initdata_refok __refdata
73#define __exit_refok __ref
74
75
76#ifdef MODULE
77#define __exitused
78#else
79#define __exitused __used
80#endif
81
82#define __exit __section(.exit.text) __exitused __cold
83
84
85#define __devinit __section(.devinit.text) __cold
86#define __devinitdata __section(.devinit.data)
87#define __devinitconst __section(.devinit.rodata)
88#define __devexit __section(.devexit.text) __exitused __cold
89#define __devexitdata __section(.devexit.data)
90#define __devexitconst __section(.devexit.rodata)
91
92
93#define __cpuinit __section(.cpuinit.text) __cold
94#define __cpuinitdata __section(.cpuinit.data)
95#define __cpuinitconst __section(.cpuinit.rodata)
96#define __cpuexit __section(.cpuexit.text) __exitused __cold
97#define __cpuexitdata __section(.cpuexit.data)
98#define __cpuexitconst __section(.cpuexit.rodata)
99
100
101#define __meminit __section(.meminit.text) __cold
102#define __meminitdata __section(.meminit.data)
103#define __meminitconst __section(.meminit.rodata)
104#define __memexit __section(.memexit.text) __exitused __cold
105#define __memexitdata __section(.memexit.data)
106#define __memexitconst __section(.memexit.rodata)
107
108
109#define __HEAD .section ".head.text","ax"
110#define __INIT .section ".init.text","ax"
111#define __FINIT .previous
112
113#define __INITDATA .section ".init.data","aw",%progbits
114#define __INITRODATA .section ".init.rodata","a",%progbits
115#define __FINITDATA .previous
116
117#define __DEVINIT .section ".devinit.text", "ax"
118#define __DEVINITDATA .section ".devinit.data", "aw"
119#define __DEVINITRODATA .section ".devinit.rodata", "a"
120
121#define __CPUINIT .section ".cpuinit.text", "ax"
122#define __CPUINITDATA .section ".cpuinit.data", "aw"
123#define __CPUINITRODATA .section ".cpuinit.rodata", "a"
124
125#define __MEMINIT .section ".meminit.text", "ax"
126#define __MEMINITDATA .section ".meminit.data", "aw"
127#define __MEMINITRODATA .section ".meminit.rodata", "a"
128
129
130#define __REF .section ".ref.text", "ax"
131#define __REFDATA .section ".ref.data", "aw"
132#define __REFCONST .section ".ref.rodata", "a"
133
134#ifndef __ASSEMBLY__
135
136
137
138typedef int (*initcall_t)(void);
139typedef void (*exitcall_t)(void);
140
141extern initcall_t __con_initcall_start[], __con_initcall_end[];
142extern initcall_t __security_initcall_start[], __security_initcall_end[];
143
144
145typedef void (*ctor_fn_t)(void);
146
147
148extern int do_one_initcall(initcall_t fn);
149extern char __initdata boot_command_line[];
150extern char *saved_command_line;
151extern unsigned int reset_devices;
152
153
154void setup_arch(char **);
155void prepare_namespace(void);
156
157extern void (*late_time_init)(void);
158
159extern int initcall_debug;
160
161#endif
162
163#ifndef MODULE
164
165#ifndef __ASSEMBLY__
166
167
168
169
170
171
172
173
174
175
176
177#define __define_initcall(level,fn,id) \
178 static initcall_t __initcall_##fn##id __used \
179 __attribute__((__section__(".initcall" level ".init"))) = fn
180
181
182
183
184
185
186#define early_initcall(fn) __define_initcall("early",fn,early)
187
188
189
190
191
192
193
194#define pure_initcall(fn) __define_initcall("0",fn,0)
195
196#define core_initcall(fn) __define_initcall("1",fn,1)
197#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)
198#define postcore_initcall(fn) __define_initcall("2",fn,2)
199#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)
200#define arch_initcall(fn) __define_initcall("3",fn,3)
201#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)
202#define subsys_initcall(fn) __define_initcall("4",fn,4)
203#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
204#define fs_initcall(fn) __define_initcall("5",fn,5)
205#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)
206#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)
207#define device_initcall(fn) __define_initcall("6",fn,6)
208#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
209#define late_initcall(fn) __define_initcall("7",fn,7)
210#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)
211
212#define __initcall(fn) device_initcall(fn)
213
214#define __exitcall(fn) \
215 static exitcall_t __exitcall_##fn __exit_call = fn
216
217#define console_initcall(fn) \
218 static initcall_t __initcall_##fn \
219 __used __section(.con_initcall.init) = fn
220
221#define security_initcall(fn) \
222 static initcall_t __initcall_##fn \
223 __used __section(.security_initcall.init) = fn
224
225struct obs_kernel_param {
226 const char *str;
227 int (*setup_func)(char *);
228 int early;
229};
230
231
232
233
234
235
236
237#define __setup_param(str, unique_id, fn, early) \
238 static const char __setup_str_##unique_id[] __initconst \
239 __aligned(1) = str; \
240 static struct obs_kernel_param __setup_##unique_id \
241 __used __section(.init.setup) \
242 __attribute__((aligned((sizeof(long))))) \
243 = { __setup_str_##unique_id, fn, early }
244
245#define __setup(str, fn) \
246 __setup_param(str, fn, fn, 0)
247
248
249
250#define early_param(str, fn) \
251 __setup_param(str, fn, fn, 1)
252
253
254void __init parse_early_param(void);
255void __init parse_early_options(char *cmdline);
256#endif
257
258
259
260
261
262
263
264
265
266#define module_init(x) __initcall(x);
267
268
269
270
271
272
273
274
275
276
277
278#define module_exit(x) __exitcall(x);
279
280#else
281
282
283#define early_initcall(fn) module_init(fn)
284#define core_initcall(fn) module_init(fn)
285#define postcore_initcall(fn) module_init(fn)
286#define arch_initcall(fn) module_init(fn)
287#define subsys_initcall(fn) module_init(fn)
288#define fs_initcall(fn) module_init(fn)
289#define device_initcall(fn) module_init(fn)
290#define late_initcall(fn) module_init(fn)
291
292#define security_initcall(fn) module_init(fn)
293
294
295#define module_init(initfn) \
296 static inline initcall_t __inittest(void) \
297 { return initfn; } \
298 int init_module(void) __attribute__((alias(#initfn)));
299
300
301#define module_exit(exitfn) \
302 static inline exitcall_t __exittest(void) \
303 { return exitfn; } \
304 void cleanup_module(void) __attribute__((alias(#exitfn)));
305
306#define __setup_param(str, unique_id, fn)
307#define __setup(str, func)
308#endif
309
310
311#define __nosavedata __section(.data..nosave)
312
313
314
315#ifdef CONFIG_MODULES
316#define __init_or_module
317#define __initdata_or_module
318#define __initconst_or_module
319#define __INIT_OR_MODULE .text
320#define __INITDATA_OR_MODULE .data
321#define __INITRODATA_OR_MODULE .section ".rodata","a",%progbits
322#else
323#define __init_or_module __init
324#define __initdata_or_module __initdata
325#define __initconst_or_module __initconst
326#define __INIT_OR_MODULE __INIT
327#define __INITDATA_OR_MODULE __INITDATA
328#define __INITRODATA_OR_MODULE __INITRODATA
329#endif
330
331
332
333
334
335
336
337#if defined(MODULE) || defined(CONFIG_HOTPLUG)
338#define __devexit_p(x) x
339#else
340#define __devexit_p(x) NULL
341#endif
342
343#ifdef MODULE
344#define __exit_p(x) x
345#else
346#define __exit_p(x) NULL
347#endif
348
349#endif
350