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 __attribute__ ((__section__ (".init.text"))) __cold
44#define __initdata __attribute__ ((__section__ (".init.data")))
45#define __exitdata __attribute__ ((__section__(".exit.data")))
46#define __exit_call __attribute_used__ __attribute__ ((__section__ (".exitcall.exit")))
47
48
49
50
51
52
53
54
55
56
57
58#define __init_refok noinline __attribute__ ((__section__ (".text.init.refok")))
59#define __initdata_refok __attribute__ ((__section__ (".data.init.refok")))
60
61#ifdef MODULE
62#define __exit __attribute__ ((__section__(".exit.text"))) __cold
63#else
64#define __exit __attribute_used__ __attribute__ ((__section__(".exit.text"))) __cold
65#endif
66
67
68#define __INIT .section ".init.text","ax"
69#define __FINIT .previous
70#define __INITDATA .section ".init.data","aw"
71
72#ifndef __ASSEMBLY__
73
74
75
76typedef int (*initcall_t)(void);
77typedef void (*exitcall_t)(void);
78
79extern initcall_t __con_initcall_start[], __con_initcall_end[];
80extern initcall_t __security_initcall_start[], __security_initcall_end[];
81
82
83extern char __initdata boot_command_line[];
84extern char *saved_command_line;
85extern unsigned int reset_devices;
86
87
88void setup_arch(char **);
89void prepare_namespace(void);
90
91#endif
92
93#ifndef MODULE
94
95#ifndef __ASSEMBLY__
96
97
98
99
100
101
102
103
104
105
106
107#define __define_initcall(level,fn,id) \
108 static initcall_t __initcall_##fn##id __attribute_used__ \
109 __attribute__((__section__(".initcall" level ".init"))) = fn
110
111
112
113
114
115
116
117#define pure_initcall(fn) __define_initcall("0",fn,0)
118
119#define core_initcall(fn) __define_initcall("1",fn,1)
120#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)
121#define postcore_initcall(fn) __define_initcall("2",fn,2)
122#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)
123#define arch_initcall(fn) __define_initcall("3",fn,3)
124#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)
125#define subsys_initcall(fn) __define_initcall("4",fn,4)
126#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
127#define fs_initcall(fn) __define_initcall("5",fn,5)
128#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)
129#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)
130#define device_initcall(fn) __define_initcall("6",fn,6)
131#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
132#define late_initcall(fn) __define_initcall("7",fn,7)
133#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)
134
135#define __initcall(fn) device_initcall(fn)
136
137#define __exitcall(fn) \
138 static exitcall_t __exitcall_##fn __exit_call = fn
139
140#define console_initcall(fn) \
141 static initcall_t __initcall_##fn \
142 __attribute_used__ __attribute__((__section__(".con_initcall.init")))=fn
143
144#define security_initcall(fn) \
145 static initcall_t __initcall_##fn \
146 __attribute_used__ __attribute__((__section__(".security_initcall.init"))) = fn
147
148struct obs_kernel_param {
149 const char *str;
150 int (*setup_func)(char *);
151 int early;
152};
153
154
155
156
157
158
159
160#define __setup_param(str, unique_id, fn, early) \
161 static char __setup_str_##unique_id[] __initdata = str; \
162 static struct obs_kernel_param __setup_##unique_id \
163 __attribute_used__ \
164 __attribute__((__section__(".init.setup"))) \
165 __attribute__((aligned((sizeof(long))))) \
166 = { __setup_str_##unique_id, fn, early }
167
168#define __setup_null_param(str, unique_id) \
169 __setup_param(str, unique_id, NULL, 0)
170
171#define __setup(str, fn) \
172 __setup_param(str, fn, fn, 0)
173
174
175
176#define early_param(str, fn) \
177 __setup_param(str, fn, fn, 1)
178
179
180void __init parse_early_param(void);
181#endif
182
183
184
185
186
187
188
189
190
191#define module_init(x) __initcall(x);
192
193
194
195
196
197
198
199
200
201
202
203#define module_exit(x) __exitcall(x);
204
205#else
206
207
208#define core_initcall(fn) module_init(fn)
209#define postcore_initcall(fn) module_init(fn)
210#define arch_initcall(fn) module_init(fn)
211#define subsys_initcall(fn) module_init(fn)
212#define fs_initcall(fn) module_init(fn)
213#define device_initcall(fn) module_init(fn)
214#define late_initcall(fn) module_init(fn)
215
216#define security_initcall(fn) module_init(fn)
217
218
219
220
221
222
223
224
225#define module_init(initfn) \
226 static inline initcall_t __inittest(void) \
227 { return initfn; } \
228 int init_module(void) __attribute__((alias(#initfn)));
229
230
231#define module_exit(exitfn) \
232 static inline exitcall_t __exittest(void) \
233 { return exitfn; } \
234 void cleanup_module(void) __attribute__((alias(#exitfn)));
235
236#define __setup_param(str, unique_id, fn)
237#define __setup_null_param(str, unique_id)
238#define __setup(str, func)
239#endif
240
241
242#define __nosavedata __attribute__ ((__section__ (".data.nosave")))
243
244
245
246#ifdef CONFIG_MODULES
247#define __init_or_module
248#define __initdata_or_module
249#else
250#define __init_or_module __init
251#define __initdata_or_module __initdata
252#endif
253
254#ifdef CONFIG_HOTPLUG
255#define __devinit
256#define __devinitdata
257#define __devexit
258#define __devexitdata
259#else
260#define __devinit __init
261#define __devinitdata __initdata
262#define __devexit __exit
263#define __devexitdata __exitdata
264#endif
265
266#ifdef CONFIG_HOTPLUG_CPU
267#define __cpuinit
268#define __cpuinitdata
269#define __cpuexit
270#define __cpuexitdata
271#else
272#define __cpuinit __init
273#define __cpuinitdata __initdata
274#define __cpuexit __exit
275#define __cpuexitdata __exitdata
276#endif
277
278#if defined(CONFIG_MEMORY_HOTPLUG) || defined(CONFIG_ACPI_HOTPLUG_MEMORY) \
279 || defined(CONFIG_ACPI_HOTPLUG_MEMORY_MODULE)
280#define __meminit
281#define __meminitdata
282#define __memexit
283#define __memexitdata
284#else
285#define __meminit __init
286#define __meminitdata __initdata
287#define __memexit __exit
288#define __memexitdata __exitdata
289#endif
290
291
292
293
294
295
296
297#if defined(MODULE) || defined(CONFIG_HOTPLUG)
298#define __devexit_p(x) x
299#else
300#define __devexit_p(x) NULL
301#endif
302
303#ifdef MODULE
304#define __exit_p(x) x
305#else
306#define __exit_p(x) NULL
307#endif
308
309#endif
310