1#ifndef _LINUX_MODULE_PARAMS_H
2#define _LINUX_MODULE_PARAMS_H
3
4#include <linux/init.h>
5#include <linux/stringify.h>
6#include <linux/kernel.h>
7
8
9
10#ifdef MODULE
11#define MODULE_PARAM_PREFIX
12#else
13#define MODULE_PARAM_PREFIX KBUILD_MODNAME "."
14#endif
15
16
17#define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
18
19#define ___module_cat(a,b) __mod_ ## a ## b
20#define __module_cat(a,b) ___module_cat(a,b)
21#ifdef MODULE
22#define __MODULE_INFO(tag, name, info) \
23static const char __module_cat(name,__LINE__)[] \
24 __used __attribute__((section(".modinfo"), unused, aligned(1))) \
25 = __stringify(tag) "=" info
26#else
27
28#define __MODULE_INFO(tag, name, info) \
29 struct __module_cat(name,__LINE__) {}
30#endif
31#define __MODULE_PARM_TYPE(name, _type) \
32 __MODULE_INFO(parmtype, name##type, #name ":" _type)
33
34
35
36#define MODULE_PARM_DESC(_parm, desc) \
37 __MODULE_INFO(parm, _parm, #_parm ":" desc)
38
39struct kernel_param;
40
41struct kernel_param_ops {
42
43 int (*set)(const char *val, const struct kernel_param *kp);
44
45 int (*get)(char *buffer, const struct kernel_param *kp);
46
47 void (*free)(void *arg);
48};
49
50struct kernel_param {
51 const char *name;
52 const struct kernel_param_ops *ops;
53 u16 perm;
54 s16 level;
55 union {
56 void *arg;
57 const struct kparam_string *str;
58 const struct kparam_array *arr;
59 };
60};
61
62
63struct kparam_string {
64 unsigned int maxlen;
65 char *string;
66};
67
68
69struct kparam_array
70{
71 unsigned int max;
72 unsigned int elemsize;
73 unsigned int *num;
74 const struct kernel_param_ops *ops;
75 void *elem;
76};
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103#define module_param(name, type, perm) \
104 module_param_named(name, name, type, perm)
105
106
107
108
109
110
111
112
113
114
115
116
117#define module_param_named(name, value, type, perm) \
118 param_check_##type(name, &(value)); \
119 module_param_cb(name, ¶m_ops_##type, &value, perm); \
120 __MODULE_PARM_TYPE(name, #type)
121
122
123
124
125
126
127
128
129
130#define module_param_cb(name, ops, arg, perm) \
131 __module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1)
132
133
134
135
136
137
138
139
140
141
142#define __level_param_cb(name, ops, arg, perm, level) \
143 __module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, level)
144
145#define core_param_cb(name, ops, arg, perm) \
146 __level_param_cb(name, ops, arg, perm, 1)
147
148#define postcore_param_cb(name, ops, arg, perm) \
149 __level_param_cb(name, ops, arg, perm, 2)
150
151#define arch_param_cb(name, ops, arg, perm) \
152 __level_param_cb(name, ops, arg, perm, 3)
153
154#define subsys_param_cb(name, ops, arg, perm) \
155 __level_param_cb(name, ops, arg, perm, 4)
156
157#define fs_param_cb(name, ops, arg, perm) \
158 __level_param_cb(name, ops, arg, perm, 5)
159
160#define device_param_cb(name, ops, arg, perm) \
161 __level_param_cb(name, ops, arg, perm, 6)
162
163#define late_param_cb(name, ops, arg, perm) \
164 __level_param_cb(name, ops, arg, perm, 7)
165
166
167
168
169
170#if defined(CONFIG_ALPHA) || defined(CONFIG_IA64) || defined(CONFIG_PPC64)
171#define __moduleparam_const
172#else
173#define __moduleparam_const const
174#endif
175
176
177
178#define __module_param_call(prefix, name, ops, arg, perm, level) \
179 \
180 static int __param_perm_check_##name __attribute__((unused)) = \
181 BUILD_BUG_ON_ZERO((perm) < 0 || (perm) > 0777 || ((perm) & 2)) \
182 + BUILD_BUG_ON_ZERO(sizeof(""prefix) > MAX_PARAM_PREFIX_LEN); \
183 static const char __param_str_##name[] = prefix #name; \
184 static struct kernel_param __moduleparam_const __param_##name \
185 __used \
186 __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \
187 = { __param_str_##name, ops, perm, level, { arg } }
188
189
190#define module_param_call(name, set, get, arg, perm) \
191 static struct kernel_param_ops __param_ops_##name = \
192 { (void *)set, (void *)get }; \
193 __module_param_call(MODULE_PARAM_PREFIX, \
194 name, &__param_ops_##name, arg, \
195 (perm) + sizeof(__check_old_set_param(set))*0, -1)
196
197
198static inline int
199__check_old_set_param(int (*oldset)(const char *, struct kernel_param *))
200{
201 return 0;
202}
203
204
205
206
207
208
209
210#define kparam_block_sysfs_write(name) \
211 do { \
212 BUG_ON(!(__param_##name.perm & 0222)); \
213 __kernel_param_lock(); \
214 } while (0)
215
216
217
218
219
220#define kparam_unblock_sysfs_write(name) \
221 do { \
222 BUG_ON(!(__param_##name.perm & 0222)); \
223 __kernel_param_unlock(); \
224 } while (0)
225
226
227
228
229
230
231
232#define kparam_block_sysfs_read(name) \
233 do { \
234 BUG_ON(!(__param_##name.perm & 0444)); \
235 __kernel_param_lock(); \
236 } while (0)
237
238
239
240
241
242#define kparam_unblock_sysfs_read(name) \
243 do { \
244 BUG_ON(!(__param_##name.perm & 0444)); \
245 __kernel_param_unlock(); \
246 } while (0)
247
248#ifdef CONFIG_SYSFS
249extern void __kernel_param_lock(void);
250extern void __kernel_param_unlock(void);
251#else
252static inline void __kernel_param_lock(void)
253{
254}
255static inline void __kernel_param_unlock(void)
256{
257}
258#endif
259
260#ifndef MODULE
261
262
263
264
265
266
267
268
269
270
271
272
273#define core_param(name, var, type, perm) \
274 param_check_##type(name, &(var)); \
275 __module_param_call("", name, ¶m_ops_##type, &var, perm, -1)
276#endif
277
278
279
280
281
282
283
284
285
286
287
288#define module_param_string(name, string, len, perm) \
289 static const struct kparam_string __param_string_##name \
290 = { len, string }; \
291 __module_param_call(MODULE_PARAM_PREFIX, name, \
292 ¶m_ops_string, \
293 .str = &__param_string_##name, perm, -1); \
294 __MODULE_PARM_TYPE(name, "string")
295
296
297
298
299
300
301
302
303
304extern bool parameq(const char *name1, const char *name2);
305
306
307
308
309
310
311
312
313
314extern bool parameqn(const char *name1, const char *name2, size_t n);
315
316
317extern int parse_args(const char *name,
318 char *args,
319 const struct kernel_param *params,
320 unsigned num,
321 s16 level_min,
322 s16 level_max,
323 int (*unknown)(char *param, char *val,
324 const char *doing));
325
326
327#ifdef CONFIG_SYSFS
328extern void destroy_params(const struct kernel_param *params, unsigned num);
329#else
330static inline void destroy_params(const struct kernel_param *params,
331 unsigned num)
332{
333}
334#endif
335
336
337
338
339#define __param_check(name, p, type) \
340 static inline type *__check_##name(void) { return(p); }
341
342extern struct kernel_param_ops param_ops_byte;
343extern int param_set_byte(const char *val, const struct kernel_param *kp);
344extern int param_get_byte(char *buffer, const struct kernel_param *kp);
345#define param_check_byte(name, p) __param_check(name, p, unsigned char)
346
347extern struct kernel_param_ops param_ops_short;
348extern int param_set_short(const char *val, const struct kernel_param *kp);
349extern int param_get_short(char *buffer, const struct kernel_param *kp);
350#define param_check_short(name, p) __param_check(name, p, short)
351
352extern struct kernel_param_ops param_ops_ushort;
353extern int param_set_ushort(const char *val, const struct kernel_param *kp);
354extern int param_get_ushort(char *buffer, const struct kernel_param *kp);
355#define param_check_ushort(name, p) __param_check(name, p, unsigned short)
356
357extern struct kernel_param_ops param_ops_int;
358extern int param_set_int(const char *val, const struct kernel_param *kp);
359extern int param_get_int(char *buffer, const struct kernel_param *kp);
360#define param_check_int(name, p) __param_check(name, p, int)
361
362extern struct kernel_param_ops param_ops_uint;
363extern int param_set_uint(const char *val, const struct kernel_param *kp);
364extern int param_get_uint(char *buffer, const struct kernel_param *kp);
365#define param_check_uint(name, p) __param_check(name, p, unsigned int)
366
367extern struct kernel_param_ops param_ops_long;
368extern int param_set_long(const char *val, const struct kernel_param *kp);
369extern int param_get_long(char *buffer, const struct kernel_param *kp);
370#define param_check_long(name, p) __param_check(name, p, long)
371
372extern struct kernel_param_ops param_ops_ulong;
373extern int param_set_ulong(const char *val, const struct kernel_param *kp);
374extern int param_get_ulong(char *buffer, const struct kernel_param *kp);
375#define param_check_ulong(name, p) __param_check(name, p, unsigned long)
376
377extern struct kernel_param_ops param_ops_charp;
378extern int param_set_charp(const char *val, const struct kernel_param *kp);
379extern int param_get_charp(char *buffer, const struct kernel_param *kp);
380#define param_check_charp(name, p) __param_check(name, p, char *)
381
382
383extern struct kernel_param_ops param_ops_bool;
384extern int param_set_bool(const char *val, const struct kernel_param *kp);
385extern int param_get_bool(char *buffer, const struct kernel_param *kp);
386#define param_check_bool(name, p) __param_check(name, p, bool)
387
388extern struct kernel_param_ops param_ops_invbool;
389extern int param_set_invbool(const char *val, const struct kernel_param *kp);
390extern int param_get_invbool(char *buffer, const struct kernel_param *kp);
391#define param_check_invbool(name, p) __param_check(name, p, bool)
392
393
394extern struct kernel_param_ops param_ops_bint;
395extern int param_set_bint(const char *val, const struct kernel_param *kp);
396#define param_get_bint param_get_int
397#define param_check_bint param_check_int
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412#define module_param_array(name, type, nump, perm) \
413 module_param_array_named(name, name, type, nump, perm)
414
415
416
417
418
419
420
421
422
423
424
425
426#define module_param_array_named(name, array, type, nump, perm) \
427 param_check_##type(name, &(array)[0]); \
428 static const struct kparam_array __param_arr_##name \
429 = { .max = ARRAY_SIZE(array), .num = nump, \
430 .ops = ¶m_ops_##type, \
431 .elemsize = sizeof(array[0]), .elem = array }; \
432 __module_param_call(MODULE_PARAM_PREFIX, name, \
433 ¶m_array_ops, \
434 .arr = &__param_arr_##name, \
435 perm, -1); \
436 __MODULE_PARM_TYPE(name, "array of " #type)
437
438extern struct kernel_param_ops param_array_ops;
439
440extern struct kernel_param_ops param_ops_string;
441extern int param_set_copystring(const char *val, const struct kernel_param *);
442extern int param_get_string(char *buffer, const struct kernel_param *kp);
443
444
445
446struct module;
447
448#if defined(CONFIG_SYSFS) && defined(CONFIG_MODULES)
449extern int module_param_sysfs_setup(struct module *mod,
450 const struct kernel_param *kparam,
451 unsigned int num_params);
452
453extern void module_param_sysfs_remove(struct module *mod);
454#else
455static inline int module_param_sysfs_setup(struct module *mod,
456 const struct kernel_param *kparam,
457 unsigned int num_params)
458{
459 return 0;
460}
461
462static inline void module_param_sysfs_remove(struct module *mod)
463{ }
464#endif
465
466#endif
467