diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /arch/um/include/init.h |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'arch/um/include/init.h')
-rw-r--r-- | arch/um/include/init.h | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/arch/um/include/init.h b/arch/um/include/init.h new file mode 100644 index 000000000000..55c2693f8778 --- /dev/null +++ b/arch/um/include/init.h | |||
@@ -0,0 +1,132 @@ | |||
1 | #ifndef _LINUX_UML_INIT_H | ||
2 | #define _LINUX_UML_INIT_H | ||
3 | |||
4 | /* These macros are used to mark some functions or | ||
5 | * initialized data (doesn't apply to uninitialized data) | ||
6 | * as `initialization' functions. The kernel can take this | ||
7 | * as hint that the function is used only during the initialization | ||
8 | * phase and free up used memory resources after | ||
9 | * | ||
10 | * Usage: | ||
11 | * For functions: | ||
12 | * | ||
13 | * You should add __init immediately before the function name, like: | ||
14 | * | ||
15 | * static void __init initme(int x, int y) | ||
16 | * { | ||
17 | * extern int z; z = x * y; | ||
18 | * } | ||
19 | * | ||
20 | * If the function has a prototype somewhere, you can also add | ||
21 | * __init between closing brace of the prototype and semicolon: | ||
22 | * | ||
23 | * extern int initialize_foobar_device(int, int, int) __init; | ||
24 | * | ||
25 | * For initialized data: | ||
26 | * You should insert __initdata between the variable name and equal | ||
27 | * sign followed by value, e.g.: | ||
28 | * | ||
29 | * static int init_variable __initdata = 0; | ||
30 | * static char linux_logo[] __initdata = { 0x32, 0x36, ... }; | ||
31 | * | ||
32 | * Don't forget to initialize data not at file scope, i.e. within a function, | ||
33 | * as gcc otherwise puts the data into the bss section and not into the init | ||
34 | * section. | ||
35 | * | ||
36 | * Also note, that this data cannot be "const". | ||
37 | */ | ||
38 | |||
39 | #ifndef _LINUX_INIT_H | ||
40 | typedef int (*initcall_t)(void); | ||
41 | typedef void (*exitcall_t)(void); | ||
42 | |||
43 | /* These are for everybody (although not all archs will actually | ||
44 | discard it in modules) */ | ||
45 | #define __init __attribute__ ((__section__ (".init.text"))) | ||
46 | #define __initdata __attribute__ ((__section__ (".init.data"))) | ||
47 | #define __exitdata __attribute__ ((__section__(".exit.data"))) | ||
48 | #define __exit_call __attribute_used__ __attribute__ ((__section__ (".exitcall.exit"))) | ||
49 | |||
50 | #ifdef MODULE | ||
51 | #define __exit __attribute__ ((__section__(".exit.text"))) | ||
52 | #else | ||
53 | #define __exit __attribute_used__ __attribute__ ((__section__(".exit.text"))) | ||
54 | #endif | ||
55 | |||
56 | #endif | ||
57 | |||
58 | #ifndef MODULE | ||
59 | struct uml_param { | ||
60 | const char *str; | ||
61 | int (*setup_func)(char *, int *); | ||
62 | }; | ||
63 | |||
64 | extern initcall_t __uml_initcall_start, __uml_initcall_end; | ||
65 | extern initcall_t __uml_postsetup_start, __uml_postsetup_end; | ||
66 | extern const char *__uml_help_start, *__uml_help_end; | ||
67 | #endif | ||
68 | |||
69 | #define __uml_initcall(fn) \ | ||
70 | static initcall_t __uml_initcall_##fn __uml_init_call = fn | ||
71 | |||
72 | #define __uml_exitcall(fn) \ | ||
73 | static exitcall_t __uml_exitcall_##fn __uml_exit_call = fn | ||
74 | |||
75 | extern struct uml_param __uml_setup_start, __uml_setup_end; | ||
76 | |||
77 | #define __uml_postsetup(fn) \ | ||
78 | static initcall_t __uml_postsetup_##fn __uml_postsetup_call = fn | ||
79 | |||
80 | #define __non_empty_string(dummyname,string) \ | ||
81 | struct __uml_non_empty_string_struct_##dummyname \ | ||
82 | { \ | ||
83 | char _string[sizeof(string)-2]; \ | ||
84 | } | ||
85 | |||
86 | #ifndef MODULE | ||
87 | #define __uml_setup(str, fn, help...) \ | ||
88 | __non_empty_string(fn ##_setup, str); \ | ||
89 | __uml_help(fn, help); \ | ||
90 | static char __uml_setup_str_##fn[] __initdata = str; \ | ||
91 | static struct uml_param __uml_setup_##fn __uml_init_setup = { __uml_setup_str_##fn, fn } | ||
92 | #else | ||
93 | #define __uml_setup(str, fn, help...) \ | ||
94 | |||
95 | #endif | ||
96 | |||
97 | #define __uml_help(fn, help...) \ | ||
98 | __non_empty_string(fn ##__help, help); \ | ||
99 | static char __uml_help_str_##fn[] __initdata = help; \ | ||
100 | static const char *__uml_help_##fn __uml_setup_help = __uml_help_str_##fn | ||
101 | |||
102 | /* | ||
103 | * Mark functions and data as being only used at initialization | ||
104 | * or exit time. | ||
105 | */ | ||
106 | #define __uml_init_setup __attribute_used__ __attribute__ ((__section__ (".uml.setup.init"))) | ||
107 | #define __uml_setup_help __attribute_used__ __attribute__ ((__section__ (".uml.help.init"))) | ||
108 | #define __uml_init_call __attribute_used__ __attribute__ ((__section__ (".uml.initcall.init"))) | ||
109 | #define __uml_postsetup_call __attribute_used__ __attribute__ ((__section__ (".uml.postsetup.init"))) | ||
110 | #define __uml_exit_call __attribute_used__ __attribute__ ((__section__ (".uml.exitcall.exit"))) | ||
111 | |||
112 | #ifndef __KERNEL__ | ||
113 | |||
114 | #define __initcall(fn) static initcall_t __initcall_##fn __init_call = fn | ||
115 | #define __exitcall(fn) static exitcall_t __exitcall_##fn __exit_call = fn | ||
116 | |||
117 | #define __init_call __attribute__ ((unused,__section__ (".initcall.init"))) | ||
118 | |||
119 | #endif | ||
120 | |||
121 | #endif /* _LINUX_UML_INIT_H */ | ||
122 | |||
123 | /* | ||
124 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
125 | * Emacs will notice this stuff at the end of the file and automatically | ||
126 | * adjust the settings for this buffer only. This must remain at the end | ||
127 | * of the file. | ||
128 | * --------------------------------------------------------------------------- | ||
129 | * Local variables: | ||
130 | * c-file-style: "linux" | ||
131 | * End: | ||
132 | */ | ||