1
2
3
4
5
6
7#ifndef _LINUX_MODULE_H
8#define _LINUX_MODULE_H
9
10#include <linux/config.h>
11#include <linux/compiler.h>
12#include <linux/spinlock.h>
13#include <linux/list.h>
14
15#ifdef __GENKSYMS__
16# define _set_ver(sym) sym
17# undef MODVERSIONS
18# define MODVERSIONS
19#else
20# if !defined(MODVERSIONS) && defined(EXPORT_SYMTAB)
21# define _set_ver(sym) sym
22# include <linux/modversions.h>
23# endif
24#endif
25
26#include <asm/atomic.h>
27
28
29struct exception_table_entry;
30
31
32struct kernel_sym
33{
34 unsigned long value;
35 char name[60];
36};
37
38struct module_symbol
39{
40 unsigned long value;
41 const char *name;
42};
43
44struct module_ref
45{
46 struct module *dep;
47 struct module *ref;
48 struct module_ref *next_ref;
49};
50
51
52struct module_persist;
53
54struct module
55{
56 unsigned long size_of_struct;
57 struct module *next;
58 const char *name;
59 unsigned long size;
60
61 union
62 {
63 atomic_t usecount;
64 long pad;
65 } uc;
66
67 unsigned long flags;
68
69 unsigned nsyms;
70 unsigned ndeps;
71
72 struct module_symbol *syms;
73 struct module_ref *deps;
74 struct module_ref *refs;
75 int (*init)(void);
76 void (*cleanup)(void);
77 const struct exception_table_entry *ex_table_start;
78 const struct exception_table_entry *ex_table_end;
79#ifdef __alpha__
80 unsigned long gp;
81#endif
82
83
84
85 const struct module_persist *persist_start;
86 const struct module_persist *persist_end;
87 int (*can_unload)(void);
88 int runsize;
89 const char *kallsyms_start;
90 const char *kallsyms_end;
91 const char *archdata_start;
92 const char *archdata_end;
93 const char *kernel_data;
94};
95
96struct module_info
97{
98 unsigned long addr;
99 unsigned long size;
100 unsigned long flags;
101 long usecount;
102};
103
104
105
106#define MOD_UNINITIALIZED 0
107#define MOD_RUNNING 1
108#define MOD_DELETED 2
109#define MOD_AUTOCLEAN 4
110#define MOD_VISITED 8
111#define MOD_USED_ONCE 16
112#define MOD_JUST_FREED 32
113#define MOD_INITIALIZING 64
114
115
116
117#define QM_MODULES 1
118#define QM_DEPS 2
119#define QM_REFS 3
120#define QM_SYMBOLS 4
121#define QM_INFO 5
122
123
124#define MOD_CAN_QUERY(mod) (((mod)->flags & (MOD_RUNNING | MOD_INITIALIZING)) && !((mod)->flags & MOD_DELETED))
125
126
127
128
129
130#define mod_member_present(mod,member) \
131 ((unsigned long)(&((struct module *)0L)->member + 1) \
132 <= (mod)->size_of_struct)
133
134
135
136
137
138#define mod_archdata_member_present(mod, type, member) \
139 (((unsigned long)(&((type *)0L)->member) + \
140 sizeof(((type *)0L)->member)) <= \
141 ((mod)->archdata_end - (mod)->archdata_start))
142
143
144
145#define mod_bound(p, n, m) ((unsigned long)(p) >= ((unsigned long)(m) + ((m)->size_of_struct)) && \
146 (unsigned long)((p)+(n)) <= (unsigned long)(m) + (m)->size)
147
148
149
150#define GET_USE_COUNT(module) (atomic_read(&(module)->uc.usecount))
151
152
153
154#define __MOD_INC_USE_COUNT(mod) \
155 (atomic_inc(&(mod)->uc.usecount), (mod)->flags |= MOD_VISITED|MOD_USED_ONCE)
156#define __MOD_DEC_USE_COUNT(mod) \
157 (atomic_dec(&(mod)->uc.usecount), (mod)->flags |= MOD_VISITED)
158#define __MOD_IN_USE(mod) \
159 (mod_member_present((mod), can_unload) && (mod)->can_unload \
160 ? (mod)->can_unload() : atomic_read(&(mod)->uc.usecount))
161
162
163
164#define __MODULE_STRING_1(x) #x
165#define __MODULE_STRING(x) __MODULE_STRING_1(x)
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182#ifdef __KERNEL__
183#define HAVE_INTER_MODULE
184extern void inter_module_register(const char *, struct module *, const void *);
185extern void inter_module_unregister(const char *);
186extern const void *inter_module_get(const char *);
187extern const void *inter_module_get_request(const char *, const char *);
188extern void inter_module_put(const char *);
189
190struct inter_module_entry {
191 struct list_head list;
192 const char *im_name;
193 struct module *owner;
194 const void *userdata;
195};
196
197extern int try_inc_mod_count(struct module *mod);
198#endif
199
200#if defined(MODULE) && !defined(__GENKSYMS__)
201
202
203
204
205
206#define MODULE_AUTHOR(name) \
207const char __module_author[] __attribute__((section(".modinfo"))) = \
208"author=" name
209
210#define MODULE_DESCRIPTION(desc) \
211const char __module_description[] __attribute__((section(".modinfo"))) = \
212"description=" desc
213
214
215
216#define MODULE_SUPPORTED_DEVICE(dev) \
217const char __module_device[] __attribute__((section(".modinfo"))) = \
218"device=" dev
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233#define MODULE_PARM(var,type) \
234const char __module_parm_##var[] \
235__attribute__((section(".modinfo"))) = \
236"parm_" __MODULE_STRING(var) "=" type
237
238#define MODULE_PARM_DESC(var,desc) \
239const char __module_parm_desc_##var[] \
240__attribute__((section(".modinfo"))) = \
241"parm_desc_" __MODULE_STRING(var) "=" desc
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256#define MODULE_GENERIC_TABLE(gtype,name) \
257static const unsigned long __module_##gtype##_size \
258 __attribute_used__ = sizeof(struct gtype##_id); \
259static const struct gtype##_id * __module_##gtype##_table \
260 __attribute_used__ = name
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287#define MODULE_LICENSE(license) \
288static const char __module_license[] __attribute_used__ __attribute__((section(".modinfo"))) = \
289"license=" license
290
291
292extern struct module __this_module;
293
294#define THIS_MODULE (&__this_module)
295#define MOD_INC_USE_COUNT __MOD_INC_USE_COUNT(THIS_MODULE)
296#define MOD_DEC_USE_COUNT __MOD_DEC_USE_COUNT(THIS_MODULE)
297#define MOD_IN_USE __MOD_IN_USE(THIS_MODULE)
298
299#include <linux/version.h>
300static const char __module_kernel_version[] __attribute_used__ __attribute__((section(".modinfo"))) =
301"kernel_version=" UTS_RELEASE;
302#ifdef MODVERSIONS
303static const char __module_using_checksums[] __attribute_used__ __attribute__((section(".modinfo"))) =
304"using_checksums=1";
305#endif
306
307#else
308
309#define MODULE_AUTHOR(name)
310#define MODULE_LICENSE(license)
311#define MODULE_DESCRIPTION(desc)
312#define MODULE_SUPPORTED_DEVICE(name)
313#define MODULE_PARM(var,type)
314#define MODULE_PARM_DESC(var,desc)
315
316
317
318
319
320
321#define MODULE_GENERIC_TABLE(gtype,name) \
322static const struct gtype##_id * __module_##gtype##_table \
323 __attribute_used__ __attribute__ ((__section__(".data.exit"))) = name
324
325#ifndef __GENKSYMS__
326
327#define THIS_MODULE NULL
328#define MOD_INC_USE_COUNT do { } while (0)
329#define MOD_DEC_USE_COUNT do { } while (0)
330#define MOD_IN_USE 1
331
332extern struct module *module_list;
333
334#endif
335
336#endif
337
338#define MODULE_DEVICE_TABLE(type,name) \
339 MODULE_GENERIC_TABLE(type##_device,name)
340
341
342
343
344
345
346
347
348
349
350#if defined(__GENKSYMS__)
351
352
353
354#elif !defined(AUTOCONF_INCLUDED)
355
356#define __EXPORT_SYMBOL(sym,str) error config_must_be_included_before_module
357#define EXPORT_SYMBOL(var) error config_must_be_included_before_module
358#define EXPORT_SYMBOL_NOVERS(var) error config_must_be_included_before_module
359#define EXPORT_SYMBOL_GPL(var) error config_must_be_included_before_module
360
361#elif !defined(CONFIG_MODULES)
362
363#define __EXPORT_SYMBOL(sym,str)
364#define EXPORT_SYMBOL(var)
365#define EXPORT_SYMBOL_NOVERS(var)
366#define EXPORT_SYMBOL_GPL(var)
367
368#elif !defined(EXPORT_SYMTAB)
369
370#define __EXPORT_SYMBOL(sym,str) error this_object_must_be_defined_as_export_objs_in_the_Makefile
371#define EXPORT_SYMBOL(var) error this_object_must_be_defined_as_export_objs_in_the_Makefile
372#define EXPORT_SYMBOL_NOVERS(var) error this_object_must_be_defined_as_export_objs_in_the_Makefile
373#define EXPORT_SYMBOL_GPL(var) error this_object_must_be_defined_as_export_objs_in_the_Makefile
374
375#else
376
377#define __EXPORT_SYMBOL(sym, str) \
378const char __kstrtab_##sym[] \
379__attribute__((section(".kstrtab"))) = str; \
380const struct module_symbol __ksymtab_##sym \
381__attribute__((section("__ksymtab"))) = \
382{ (unsigned long)&sym, __kstrtab_##sym }
383
384#define __EXPORT_SYMBOL_GPL(sym, str) \
385const char __kstrtab_##sym[] \
386__attribute__((section(".kstrtab"))) = "GPLONLY_" str; \
387const struct module_symbol __ksymtab_##sym \
388__attribute__((section("__ksymtab"))) = \
389{ (unsigned long)&sym, __kstrtab_##sym }
390
391#if defined(MODVERSIONS) || !defined(CONFIG_MODVERSIONS)
392#define EXPORT_SYMBOL(var) __EXPORT_SYMBOL(var, __MODULE_STRING(var))
393#define EXPORT_SYMBOL_GPL(var) __EXPORT_SYMBOL_GPL(var, __MODULE_STRING(var))
394#else
395#define EXPORT_SYMBOL(var) __EXPORT_SYMBOL(var, __MODULE_STRING(__VERSIONED_SYMBOL(var)))
396#define EXPORT_SYMBOL_GPL(var) __EXPORT_SYMBOL(var, __MODULE_STRING(__VERSIONED_SYMBOL(var)))
397#endif
398
399#define EXPORT_SYMBOL_NOVERS(var) __EXPORT_SYMBOL(var, __MODULE_STRING(var))
400
401#endif
402
403#ifdef MODULE
404
405#define EXPORT_NO_SYMBOLS __asm__(".section __ksymtab\n.previous")
406#else
407#define EXPORT_NO_SYMBOLS
408#endif
409
410#ifdef CONFIG_MODULES
411#define SET_MODULE_OWNER(some_struct) do { (some_struct)->owner = THIS_MODULE; } while (0)
412#else
413#define SET_MODULE_OWNER(some_struct) do { } while (0)
414#endif
415
416#endif
417