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")))
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")))
63#else
64#define __exit __attribute_used__ __attribute__ ((__section__(".exit.text")))
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,1)
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#define __obsolete_setup(str) \
175 __setup_null_param(str, __LINE__)
176
177
178
179#define early_param(str, fn) \
180 __setup_param(str, fn, fn, 1)
181
182
183void __init parse_early_param(void);
184#endif
185
186
187
188
189
190
191
192
193
194#define module_init(x) __initcall(x);
195
196
197
198
199
200
201
202
203
204
205
206#define module_exit(x) __exitcall(x);
207
208#else
209
210
211#define core_initcall(fn) module_init(fn)
212#define postcore_initcall(fn) module_init(fn)
213#define arch_initcall(fn) module_init(fn)
214#define subsys_initcall(fn) module_init(fn)
215#define fs_initcall(fn) module_init(fn)
216#define device_initcall(fn) module_init(fn)
217#define late_initcall(fn) module_init(fn)
218
219#define security_initcall(fn) module_init(fn)
220
221
222
223
224
225
226
227
228#define module_init(initfn) \
229 static inline initcall_t __inittest(void) \
230 { return initfn; } \
231 int init_module(void) __attribute__((alias(#initfn)));
232
233
234#define module_exit(exitfn) \
235 static inline exitcall_t __exittest(void) \
236 { return exitfn; } \
237 void cleanup_module(void) __attribute__((alias(#exitfn)));
238
239#define __setup_param(str, unique_id, fn)
240#define __setup_null_param(str, unique_id)
241#define __setup(str, func)
242#define __obsolete_setup(str)
243#endif
244
245
246#define __nosavedata __attribute__ ((__section__ (".data.nosave")))
247
248
249
250#ifdef CONFIG_MODULES
251#define __init_or_module
252#define __initdata_or_module
253#else
254#define __init_or_module __init
255#define __initdata_or_module __initdata
256#endif
257
258#ifdef CONFIG_HOTPLUG
259#define __devinit
260#define __devinitdata
261#define __devexit
262#define __devexitdata
263#else
264#define __devinit __init
265#define __devinitdata __initdata
266#define __devexit __exit
267#define __devexitdata __exitdata
268#endif
269
270#ifdef CONFIG_HOTPLUG_CPU
271#define __cpuinit
272#define __cpuinitdata
273#define __cpuexit
274#define __cpuexitdata
275#else
276#define __cpuinit __init
277#define __cpuinitdata __initdata
278#define __cpuexit __exit
279#define __cpuexitdata __exitdata
280#endif
281
282#if defined(CONFIG_MEMORY_HOTPLUG) || defined(CONFIG_ACPI_HOTPLUG_MEMORY) \
283 || defined(CONFIG_ACPI_HOTPLUG_MEMORY_MODULE)
284#define __meminit
285#define __meminitdata
286#define __memexit
287#define __memexitdata
288#else
289#define __meminit __init
290#define __meminitdata __initdata
291#define __memexit __exit
292#define __memexitdata __exitdata
293#endif
294
295
296
297
298
299
300
301#if defined(MODULE) || defined(CONFIG_HOTPLUG)
302#define __devexit_p(x) x
303#else
304#define __devexit_p(x) NULL
305#endif
306
307#ifdef MODULE
308#define __exit_p(x) x
309#else
310#define __exit_p(x) NULL
311#endif
312
313#endif
314