Coverage Report

Created: 2017-10-25 09:10

/root/src/xen/xen/include/xen/init.h
Line
Count
Source
1
#ifndef _LINUX_INIT_H
2
#define _LINUX_INIT_H
3
4
#include <asm/init.h>
5
6
/*
7
 * Mark functions and data as being only used at initialization
8
 * or exit time.
9
 */
10
#define __init            __text_section(".init.text")
11
#define __exit            __text_section(".exit.text")
12
#define __initdata        __section(".init.data")
13
#define __initconst       __section(".init.rodata")
14
#define __initconstrel    __section(".init.rodata.rel")
15
#define __exitdata        __used_section(".exit.data")
16
#define __initsetup       __used_section(".init.setup")
17
#define __init_call(lvl)  __used_section(".initcall" lvl ".init")
18
#define __exit_call       __used_section(".exitcall.exit")
19
20
/* These macros are used to mark some functions or 
21
 * initialized data (doesn't apply to uninitialized data)
22
 * as `initialization' functions. The kernel can take this
23
 * as hint that the function is used only during the initialization
24
 * phase and free up used memory resources after
25
 *
26
 * Usage:
27
 * For functions:
28
 * 
29
 * You should add __init immediately before the function name, like:
30
 *
31
 * static void __init initme(int x, int y)
32
 * {
33
 *    extern int z; z = x * y;
34
 * }
35
 *
36
 * If the function has a prototype somewhere, you can also add
37
 * __init between closing brace of the prototype and semicolon:
38
 *
39
 * extern int initialize_foobar_device(int, int, int) __init;
40
 *
41
 * For initialized data:
42
 * You should insert __initdata between the variable name and equal
43
 * sign followed by value, e.g.:
44
 *
45
 * static int init_variable __initdata = 0;
46
 * static char linux_logo[] __initdata = { 0x32, 0x36, ... };
47
 *
48
 * Don't forget to initialize data not at file scope, i.e. within a function,
49
 * as gcc otherwise puts the data into the bss section and not into the init
50
 * section.
51
 * 
52
 * Also note, that this data cannot be "const".
53
 */
54
55
#ifndef __ASSEMBLY__
56
57
/*
58
 * Used for initialization calls..
59
 */
60
typedef int (*initcall_t)(void);
61
typedef void (*exitcall_t)(void);
62
63
#define presmp_initcall(fn) \
64
    const static initcall_t __initcall_##fn __init_call("presmp") = fn
65
#define __initcall(fn) \
66
    const static initcall_t __initcall_##fn __init_call("1") = fn
67
#define __exitcall(fn) \
68
    static exitcall_t __exitcall_##fn __exit_call = fn
69
70
void do_presmp_initcalls(void);
71
void do_initcalls(void);
72
73
/*
74
 * Used for kernel command line parameter setup
75
 */
76
struct kernel_param {
77
    const char *name;
78
    enum {
79
        OPT_STR,
80
        OPT_UINT,
81
        OPT_BOOL,
82
        OPT_SIZE,
83
        OPT_CUSTOM
84
    } type;
85
    unsigned int len;
86
    union {
87
        void *var;
88
        int (*func)(const char *);
89
    } par;
90
};
91
92
extern const struct kernel_param __setup_start[], __setup_end[];
93
extern const struct kernel_param __param_start[], __param_end[];
94
95
#define __dataparam       __used_section(".data.param")
96
97
290
#define __param(att)      static const att \
98
290
    __attribute__((__aligned__(sizeof(void *)))) struct kernel_param
99
100
290
#define __setup_str static const __initconst \
101
290
    __attribute__((__aligned__(1))) char
102
290
#define __kparam          __param(__initsetup)
103
104
#define custom_param(_name, _var) \
105
    __setup_str __setup_str_##_var[] = _name; \
106
    __kparam __setup_##_var = \
107
        { .name = __setup_str_##_var, \
108
          .type = OPT_CUSTOM, \
109
          .par.func = _var }
110
#define boolean_param(_name, _var) \
111
13
    __setup_str __setup_str_##_var[] = _name; \
112
13
    __kparam __setup_##_var = \
113
13
        { .name = __setup_str_##_var, \
114
13
          .type = OPT_BOOL, \
115
13
          .len = sizeof(_var), \
116
13
          .par.var = &_var }
117
#define integer_param(_name, _var) \
118
277
    __setup_str __setup_str_##_var[] = _name; \
119
277
    __kparam __setup_##_var = \
120
277
        { .name = __setup_str_##_var, \
121
277
          .type = OPT_UINT, \
122
277
          .len = sizeof(_var), \
123
277
          .par.var = &_var }
124
#define size_param(_name, _var) \
125
    __setup_str __setup_str_##_var[] = _name; \
126
    __kparam __setup_##_var = \
127
        { .name = __setup_str_##_var, \
128
          .type = OPT_SIZE, \
129
          .len = sizeof(_var), \
130
          .par.var = &_var }
131
#define string_param(_name, _var) \
132
    __setup_str __setup_str_##_var[] = _name; \
133
    __kparam __setup_##_var = \
134
        { .name = __setup_str_##_var, \
135
          .type = OPT_STR, \
136
          .len = sizeof(_var), \
137
          .par.var = &_var }
138
139
#define __rtparam         __param(__dataparam)
140
141
#define custom_runtime_only_param(_name, _var) \
142
    __rtparam __rtpar_##_var = \
143
      { .name = _name, \
144
          .type = OPT_CUSTOM, \
145
          .par.func = _var }
146
#define boolean_runtime_only_param(_name, _var) \
147
    __rtparam __rtpar_##_var = \
148
        { .name = _name, \
149
          .type = OPT_BOOL, \
150
          .len = sizeof(_var), \
151
          .par.var = &_var }
152
#define integer_runtime_only_param(_name, _var) \
153
    __rtparam __rtpar_##_var = \
154
        { .name = _name, \
155
          .type = OPT_UINT, \
156
          .len = sizeof(_var), \
157
          .par.var = &_var }
158
#define size_runtime_only_param(_name, _var) \
159
    __rtparam __rtpar_##_var = \
160
        { .name = _name, \
161
          .type = OPT_SIZE, \
162
          .len = sizeof(_var), \
163
          .par.var = &_var }
164
#define string_runtime_only_param(_name, _var) \
165
    __rtparam __rtpar_##_var = \
166
        { .name = _name, \
167
          .type = OPT_STR, \
168
          .len = sizeof(_var), \
169
          .par.var = &_var }
170
171
#define custom_runtime_param(_name, _var) \
172
    custom_param(_name, _var); \
173
    custom_runtime_only_param(_name, _var)
174
#define boolean_runtime_param(_name, _var) \
175
    boolean_param(_name, _var); \
176
    boolean_runtime_only_param(_name, _var)
177
#define integer_runtime_param(_name, _var) \
178
    integer_param(_name, _var); \
179
    integer_runtime_only_param(_name, _var)
180
#define size_runtime_param(_name, _var) \
181
    size_param(_name, _var); \
182
    size_runtime_only_param(_name, _var)
183
#define string_runtime_param(_name, _var) \
184
    string_param(_name, _var); \
185
    string_runtime_only_param(_name, _var)
186
187
#endif /* __ASSEMBLY__ */
188
189
#ifdef CONFIG_LATE_HWDOM
190
#define __hwdom_init
191
#define __hwdom_initdata  __read_mostly
192
#else
193
#define __hwdom_init      __init
194
#define __hwdom_initdata  __initdata
195
#endif
196
197
#endif /* _LINUX_INIT_H */