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#define __exit_refok noinline __attribute__ ((__section__ (".exit.text.refok")))
61
62#ifdef MODULE
63#define __exit __attribute__ ((__section__(".exit.text"))) __cold
64#else
65#define __exit __attribute_used__ __attribute__ ((__section__(".exit.text"))) __cold
66#endif
67
68
69#define __INIT .section ".init.text","ax"
70#define __INIT_REFOK .section ".text.init.refok","ax"
71#define __FINIT .previous
72#define __INITDATA .section ".init.data","aw"
73#define __INITDATA_REFOK .section ".data.init.refok","aw"
74
75#ifndef __ASSEMBLY__
76
77
78
79typedef int (*initcall_t)(void);
80typedef void (*exitcall_t)(void);
81
82extern initcall_t __con_initcall_start[], __con_initcall_end[];
83extern initcall_t __security_initcall_start[], __security_initcall_end[];
84
85
86extern char __initdata boot_command_line[];
87extern char *saved_command_line;
88extern unsigned int reset_devices;
89
90
91void setup_arch(char **);
92void prepare_namespace(void);
93
94#endif
95
96#ifndef MODULE
97
98#ifndef __ASSEMBLY__
99
100
101
102
103
104
105
106
107
108
109
110#define __define_initcall(level,fn,id) \
111 static initcall_t __initcall_##fn##id __attribute_used__ \
112 __attribute__((__section__(".initcall" level ".init"))) = fn
113
114
115
116
117
118
119
120#define pure_initcall(fn) __define_initcall("0",fn,0)
121
122#define core_initcall(fn) __define_initcall("1",fn,1)
123#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)
124#define postcore_initcall(fn) __define_initcall("2",fn,2)
125#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)
126#define arch_initcall(fn) __define_initcall("3",fn,3)
127#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)
128#define subsys_initcall(fn) __define_initcall("4",fn,4)
129#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
130#define fs_initcall(fn) __define_initcall("5",fn,5)
131#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)
132#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)
133#define device_initcall(fn) __define_initcall("6",fn,6)
134#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
135#define late_initcall(fn) __define_initcall("7",fn,7)
136#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)
137
138#define __initcall(fn) device_initcall(fn)
139
140#define __exitcall(fn) \
141 static exitcall_t __exitcall_##fn __exit_call = fn
142
143#define console_initcall(fn) \
144 static initcall_t __initcall_##fn \
145 __attribute_used__ __attribute__((__section__(".con_initcall.init")))=fn
146
147#define security_initcall(fn) \
148 static initcall_t __initcall_##fn \
149 __attribute_used__ __attribute__((__section__(".security_initcall.init"))) = fn
150
151struct obs_kernel_param {
152 const char *str;
153 int (*setup_func)(char *);
154 int early;
155};
156
157
158
159
160
161
162
163#define __setup_param(str, unique_id, fn, early) \
164 static char __setup_str_##unique_id[] __initdata __aligned(1) = str; \
165 static struct obs_kernel_param __setup_##unique_id \
166 __attribute_used__ \
167 __attribute__((__section__(".init.setup"))) \
168 __attribute__((aligned((sizeof(long))))) \
169 = { __setup_str_##unique_id, fn, early }
170
171#define __setup_null_param(str, unique_id) \
172 __setup_param(str, unique_id, NULL, 0)
173
174#define __setup(str, fn) \
175 __setup_param(str, fn, fn, 0)
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#endif
243
244
245#define __nosavedata __attribute__ ((__section__ (".data.nosave")))
246
247
248
249#ifdef CONFIG_MODULES
250#define __init_or_module
251#define __initdata_or_module
252#else
253#define __init_or_module __init
254#define __initdata_or_module __initdata
255#endif
256
257#ifdef CONFIG_HOTPLUG
258#define __devinit
259#define __devinitdata
260#define __devexit
261#define __devexitdata
262#else
263#define __devinit __init
264#define __devinitdata __initdata
265#define __devexit __exit
266#define __devexitdata __exitdata
267#endif
268
269#ifdef CONFIG_HOTPLUG_CPU
270#define __cpuinit
271#define __cpuinitdata
272#define __cpuexit
273#define __cpuexitdata
274#else
275#define __cpuinit __init
276#define __cpuinitdata __initdata
277#define __cpuexit __exit
278#define __cpuexitdata __exitdata
279#endif
280
281#if defined(CONFIG_MEMORY_HOTPLUG) || defined(CONFIG_ACPI_HOTPLUG_MEMORY) \
282 || defined(CONFIG_ACPI_HOTPLUG_MEMORY_MODULE)
283#define __meminit
284#define __meminitdata
285#define __memexit
286#define __memexitdata
287#else
288#define __meminit __init
289#define __meminitdata __initdata
290#define __memexit __exit
291#define __memexitdata __exitdata
292#endif
293
294
295
296
297
298
299
300#if defined(MODULE) || defined(CONFIG_HOTPLUG)
301#define __devexit_p(x) x
302#else
303#define __devexit_p(x) NULL
304#endif
305
306#ifdef MODULE
307#define __exit_p(x) x
308#else
309#define __exit_p(x) NULL
310#endif
311
312#endif
313