Linux Audio

Check our new training course

Loading...
v4.10.11
  1#ifndef _LINUX_MODULE_PARAMS_H
  2#define _LINUX_MODULE_PARAMS_H
  3/* (C) Copyright 2001, 2002 Rusty Russell IBM Corporation */
  4#include <linux/init.h>
  5#include <linux/stringify.h>
  6#include <linux/kernel.h>
  7
  8/* You can override this manually, but generally this should match the
  9   module name. */
 10#ifdef MODULE
 11#define MODULE_PARAM_PREFIX /* empty */
 12#else
 13#define MODULE_PARAM_PREFIX KBUILD_MODNAME "."
 14#endif
 15
 16/* Chosen so that structs with an unsigned long line up. */
 17#define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
 18
 19#ifdef MODULE
 20#define __MODULE_INFO(tag, name, info)					  \
 21static const char __UNIQUE_ID(name)[]					  \
 22  __used __attribute__((section(".modinfo"), unused, aligned(1)))	  \
 23  = __stringify(tag) "=" info
 24#else  /* !MODULE */
 25/* This struct is here for syntactic coherency, it is not used */
 26#define __MODULE_INFO(tag, name, info)					  \
 27  struct __UNIQUE_ID(name) {}
 28#endif
 29#define __MODULE_PARM_TYPE(name, _type)					  \
 30  __MODULE_INFO(parmtype, name##type, #name ":" _type)
 31
 32/* One for each parameter, describing how to use it.  Some files do
 33   multiple of these per line, so can't just use MODULE_INFO. */
 34#define MODULE_PARM_DESC(_parm, desc) \
 35	__MODULE_INFO(parm, _parm, #_parm ":" desc)
 36
 37struct kernel_param;
 38
 39/*
 40 * Flags available for kernel_param_ops
 41 *
 42 * NOARG - the parameter allows for no argument (foo instead of foo=1)
 43 */
 44enum {
 45	KERNEL_PARAM_OPS_FL_NOARG = (1 << 0)
 46};
 47
 48struct kernel_param_ops {
 49	/* How the ops should behave */
 50	unsigned int flags;
 51	/* Returns 0, or -errno.  arg is in kp->arg. */
 52	int (*set)(const char *val, const struct kernel_param *kp);
 53	/* Returns length written or -errno.  Buffer is 4k (ie. be short!) */
 54	int (*get)(char *buffer, const struct kernel_param *kp);
 55	/* Optional function to free kp->arg when module unloaded. */
 56	void (*free)(void *arg);
 57};
 58
 59/*
 60 * Flags available for kernel_param
 61 *
 62 * UNSAFE - the parameter is dangerous and setting it will taint the kernel
 63 */
 64enum {
 65	KERNEL_PARAM_FL_UNSAFE = (1 << 0)
 66};
 67
 68struct kernel_param {
 69	const char *name;
 70	struct module *mod;
 71	const struct kernel_param_ops *ops;
 72	const u16 perm;
 73	s8 level;
 74	u8 flags;
 75	union {
 76		void *arg;
 77		const struct kparam_string *str;
 78		const struct kparam_array *arr;
 79	};
 80};
 81
 82extern const struct kernel_param __start___param[], __stop___param[];
 83
 84/* Special one for strings we want to copy into */
 85struct kparam_string {
 86	unsigned int maxlen;
 87	char *string;
 88};
 89
 90/* Special one for arrays */
 91struct kparam_array
 92{
 93	unsigned int max;
 94	unsigned int elemsize;
 95	unsigned int *num;
 96	const struct kernel_param_ops *ops;
 97	void *elem;
 98};
 99
100/**
101 * module_param - typesafe helper for a module/cmdline parameter
102 * @value: the variable to alter, and exposed parameter name.
103 * @type: the type of the parameter
104 * @perm: visibility in sysfs.
105 *
106 * @value becomes the module parameter, or (prefixed by KBUILD_MODNAME and a
107 * ".") the kernel commandline parameter.  Note that - is changed to _, so
108 * the user can use "foo-bar=1" even for variable "foo_bar".
109 *
110 * @perm is 0 if the the variable is not to appear in sysfs, or 0444
111 * for world-readable, 0644 for root-writable, etc.  Note that if it
112 * is writable, you may need to use kernel_param_lock() around
113 * accesses (esp. charp, which can be kfreed when it changes).
114 *
115 * The @type is simply pasted to refer to a param_ops_##type and a
116 * param_check_##type: for convenience many standard types are provided but
117 * you can create your own by defining those variables.
118 *
119 * Standard types are:
120 *	byte, short, ushort, int, uint, long, ulong
121 *	charp: a character pointer
122 *	bool: a bool, values 0/1, y/n, Y/N.
123 *	invbool: the above, only sense-reversed (N = true).
124 */
125#define module_param(name, type, perm)				\
126	module_param_named(name, name, type, perm)
127
128/**
129 * module_param_unsafe - same as module_param but taints kernel
130 */
131#define module_param_unsafe(name, type, perm)			\
132	module_param_named_unsafe(name, name, type, perm)
133
134/**
135 * module_param_named - typesafe helper for a renamed module/cmdline parameter
136 * @name: a valid C identifier which is the parameter name.
137 * @value: the actual lvalue to alter.
138 * @type: the type of the parameter
139 * @perm: visibility in sysfs.
140 *
141 * Usually it's a good idea to have variable names and user-exposed names the
142 * same, but that's harder if the variable must be non-static or is inside a
143 * structure.  This allows exposure under a different name.
144 */
145#define module_param_named(name, value, type, perm)			   \
146	param_check_##type(name, &(value));				   \
147	module_param_cb(name, &param_ops_##type, &value, perm);		   \
148	__MODULE_PARM_TYPE(name, #type)
149
150/**
151 * module_param_named_unsafe - same as module_param_named but taints kernel
152 */
153#define module_param_named_unsafe(name, value, type, perm)		\
154	param_check_##type(name, &(value));				\
155	module_param_cb_unsafe(name, &param_ops_##type, &value, perm);	\
156	__MODULE_PARM_TYPE(name, #type)
157
158/**
159 * module_param_cb - general callback for a module/cmdline parameter
160 * @name: a valid C identifier which is the parameter name.
161 * @ops: the set & get operations for this parameter.
162 * @perm: visibility in sysfs.
163 *
164 * The ops can have NULL set or get functions.
165 */
166#define module_param_cb(name, ops, arg, perm)				      \
167	__module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1, 0)
168
169#define module_param_cb_unsafe(name, ops, arg, perm)			      \
170	__module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1,    \
171			    KERNEL_PARAM_FL_UNSAFE)
172
173/**
174 * <level>_param_cb - general callback for a module/cmdline parameter
175 *                    to be evaluated before certain initcall level
176 * @name: a valid C identifier which is the parameter name.
177 * @ops: the set & get operations for this parameter.
178 * @perm: visibility in sysfs.
179 *
180 * The ops can have NULL set or get functions.
181 */
182#define __level_param_cb(name, ops, arg, perm, level)			\
183	__module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, level, 0)
184
185#define core_param_cb(name, ops, arg, perm)		\
186	__level_param_cb(name, ops, arg, perm, 1)
187
188#define postcore_param_cb(name, ops, arg, perm)		\
189	__level_param_cb(name, ops, arg, perm, 2)
190
191#define arch_param_cb(name, ops, arg, perm)		\
192	__level_param_cb(name, ops, arg, perm, 3)
193
194#define subsys_param_cb(name, ops, arg, perm)		\
195	__level_param_cb(name, ops, arg, perm, 4)
196
197#define fs_param_cb(name, ops, arg, perm)		\
198	__level_param_cb(name, ops, arg, perm, 5)
199
200#define device_param_cb(name, ops, arg, perm)		\
201	__level_param_cb(name, ops, arg, perm, 6)
202
203#define late_param_cb(name, ops, arg, perm)		\
204	__level_param_cb(name, ops, arg, perm, 7)
205
206/* On alpha, ia64 and ppc64 relocations to global data cannot go into
207   read-only sections (which is part of respective UNIX ABI on these
208   platforms). So 'const' makes no sense and even causes compile failures
209   with some compilers. */
210#if defined(CONFIG_ALPHA) || defined(CONFIG_IA64) || defined(CONFIG_PPC64)
211#define __moduleparam_const
212#else
213#define __moduleparam_const const
214#endif
215
216/* This is the fundamental function for registering boot/module
217   parameters. */
218#define __module_param_call(prefix, name, ops, arg, perm, level, flags)	\
219	/* Default value instead of permissions? */			\
220	static const char __param_str_##name[] = prefix #name;		\
221	static struct kernel_param __moduleparam_const __param_##name	\
222	__used								\
223    __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \
224	= { __param_str_##name, THIS_MODULE, ops,			\
225	    VERIFY_OCTAL_PERMISSIONS(perm), level, flags, { arg } }
226
227/* Obsolete - use module_param_cb() */
228#define module_param_call(name, set, get, arg, perm)			\
229	static const struct kernel_param_ops __param_ops_##name =		\
230		{ .flags = 0, (void *)set, (void *)get };		\
231	__module_param_call(MODULE_PARAM_PREFIX,			\
232			    name, &__param_ops_##name, arg,		\
233			    (perm) + sizeof(__check_old_set_param(set))*0, -1, 0)
234
235/* We don't get oldget: it's often a new-style param_get_uint, etc. */
236static inline int
237__check_old_set_param(int (*oldset)(const char *, struct kernel_param *))
238{
239	return 0;
240}
241
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
242#ifdef CONFIG_SYSFS
243extern void kernel_param_lock(struct module *mod);
244extern void kernel_param_unlock(struct module *mod);
245#else
246static inline void kernel_param_lock(struct module *mod)
247{
248}
249static inline void kernel_param_unlock(struct module *mod)
250{
251}
252#endif
253
254#ifndef MODULE
255/**
256 * core_param - define a historical core kernel parameter.
257 * @name: the name of the cmdline and sysfs parameter (often the same as var)
258 * @var: the variable
259 * @type: the type of the parameter
260 * @perm: visibility in sysfs
261 *
262 * core_param is just like module_param(), but cannot be modular and
263 * doesn't add a prefix (such as "printk.").  This is for compatibility
264 * with __setup(), and it makes sense as truly core parameters aren't
265 * tied to the particular file they're in.
266 */
267#define core_param(name, var, type, perm)				\
268	param_check_##type(name, &(var));				\
269	__module_param_call("", name, &param_ops_##type, &var, perm, -1, 0)
270
271/**
272 * core_param_unsafe - same as core_param but taints kernel
273 */
274#define core_param_unsafe(name, var, type, perm)		\
275	param_check_##type(name, &(var));				\
276	__module_param_call("", name, &param_ops_##type, &var, perm,	\
277			    -1, KERNEL_PARAM_FL_UNSAFE)
278
279#endif /* !MODULE */
280
281/**
282 * module_param_string - a char array parameter
283 * @name: the name of the parameter
284 * @string: the string variable
285 * @len: the maximum length of the string, incl. terminator
286 * @perm: visibility in sysfs.
287 *
288 * This actually copies the string when it's set (unlike type charp).
289 * @len is usually just sizeof(string).
290 */
291#define module_param_string(name, string, len, perm)			\
292	static const struct kparam_string __param_string_##name		\
293		= { len, string };					\
294	__module_param_call(MODULE_PARAM_PREFIX, name,			\
295			    &param_ops_string,				\
296			    .str = &__param_string_##name, perm, -1, 0);\
297	__MODULE_PARM_TYPE(name, "string")
298
299/**
300 * parameq - checks if two parameter names match
301 * @name1: parameter name 1
302 * @name2: parameter name 2
303 *
304 * Returns true if the two parameter names are equal.
305 * Dashes (-) are considered equal to underscores (_).
306 */
307extern bool parameq(const char *name1, const char *name2);
308
309/**
310 * parameqn - checks if two parameter names match
311 * @name1: parameter name 1
312 * @name2: parameter name 2
313 * @n: the length to compare
314 *
315 * Similar to parameq(), except it compares @n characters.
316 */
317extern bool parameqn(const char *name1, const char *name2, size_t n);
318
319/* Called on module insert or kernel boot */
320extern char *parse_args(const char *name,
321		      char *args,
322		      const struct kernel_param *params,
323		      unsigned num,
324		      s16 level_min,
325		      s16 level_max,
326		      void *arg,
327		      int (*unknown)(char *param, char *val,
328				     const char *doing, void *arg));
329
330/* Called by module remove. */
331#ifdef CONFIG_SYSFS
332extern void destroy_params(const struct kernel_param *params, unsigned num);
333#else
334static inline void destroy_params(const struct kernel_param *params,
335				  unsigned num)
336{
337}
338#endif /* !CONFIG_SYSFS */
339
340/* All the helper functions */
341/* The macros to do compile-time type checking stolen from Jakub
342   Jelinek, who IIRC came up with this idea for the 2.4 module init code. */
343#define __param_check(name, p, type) \
344	static inline type __always_unused *__check_##name(void) { return(p); }
345
346extern const struct kernel_param_ops param_ops_byte;
347extern int param_set_byte(const char *val, const struct kernel_param *kp);
348extern int param_get_byte(char *buffer, const struct kernel_param *kp);
349#define param_check_byte(name, p) __param_check(name, p, unsigned char)
350
351extern const struct kernel_param_ops param_ops_short;
352extern int param_set_short(const char *val, const struct kernel_param *kp);
353extern int param_get_short(char *buffer, const struct kernel_param *kp);
354#define param_check_short(name, p) __param_check(name, p, short)
355
356extern const struct kernel_param_ops param_ops_ushort;
357extern int param_set_ushort(const char *val, const struct kernel_param *kp);
358extern int param_get_ushort(char *buffer, const struct kernel_param *kp);
359#define param_check_ushort(name, p) __param_check(name, p, unsigned short)
360
361extern const struct kernel_param_ops param_ops_int;
362extern int param_set_int(const char *val, const struct kernel_param *kp);
363extern int param_get_int(char *buffer, const struct kernel_param *kp);
364#define param_check_int(name, p) __param_check(name, p, int)
365
366extern const struct kernel_param_ops param_ops_uint;
367extern int param_set_uint(const char *val, const struct kernel_param *kp);
368extern int param_get_uint(char *buffer, const struct kernel_param *kp);
369#define param_check_uint(name, p) __param_check(name, p, unsigned int)
370
371extern const struct kernel_param_ops param_ops_long;
372extern int param_set_long(const char *val, const struct kernel_param *kp);
373extern int param_get_long(char *buffer, const struct kernel_param *kp);
374#define param_check_long(name, p) __param_check(name, p, long)
375
376extern const struct kernel_param_ops param_ops_ulong;
377extern int param_set_ulong(const char *val, const struct kernel_param *kp);
378extern int param_get_ulong(char *buffer, const struct kernel_param *kp);
379#define param_check_ulong(name, p) __param_check(name, p, unsigned long)
380
381extern const struct kernel_param_ops param_ops_ullong;
382extern int param_set_ullong(const char *val, const struct kernel_param *kp);
383extern int param_get_ullong(char *buffer, const struct kernel_param *kp);
384#define param_check_ullong(name, p) __param_check(name, p, unsigned long long)
385
386extern const struct kernel_param_ops param_ops_charp;
387extern int param_set_charp(const char *val, const struct kernel_param *kp);
388extern int param_get_charp(char *buffer, const struct kernel_param *kp);
389extern void param_free_charp(void *arg);
390#define param_check_charp(name, p) __param_check(name, p, char *)
391
392/* We used to allow int as well as bool.  We're taking that away! */
393extern const struct kernel_param_ops param_ops_bool;
394extern int param_set_bool(const char *val, const struct kernel_param *kp);
395extern int param_get_bool(char *buffer, const struct kernel_param *kp);
396#define param_check_bool(name, p) __param_check(name, p, bool)
397
398extern const struct kernel_param_ops param_ops_bool_enable_only;
399extern int param_set_bool_enable_only(const char *val,
400				      const struct kernel_param *kp);
401/* getter is the same as for the regular bool */
402#define param_check_bool_enable_only param_check_bool
403
404extern const struct kernel_param_ops param_ops_invbool;
405extern int param_set_invbool(const char *val, const struct kernel_param *kp);
406extern int param_get_invbool(char *buffer, const struct kernel_param *kp);
407#define param_check_invbool(name, p) __param_check(name, p, bool)
408
409/* An int, which can only be set like a bool (though it shows as an int). */
410extern const struct kernel_param_ops param_ops_bint;
411extern int param_set_bint(const char *val, const struct kernel_param *kp);
412#define param_get_bint param_get_int
413#define param_check_bint param_check_int
414
415/**
416 * module_param_array - a parameter which is an array of some type
417 * @name: the name of the array variable
418 * @type: the type, as per module_param()
419 * @nump: optional pointer filled in with the number written
420 * @perm: visibility in sysfs
421 *
422 * Input and output are as comma-separated values.  Commas inside values
423 * don't work properly (eg. an array of charp).
424 *
425 * ARRAY_SIZE(@name) is used to determine the number of elements in the
426 * array, so the definition must be visible.
427 */
428#define module_param_array(name, type, nump, perm)		\
429	module_param_array_named(name, name, type, nump, perm)
430
431/**
432 * module_param_array_named - renamed parameter which is an array of some type
433 * @name: a valid C identifier which is the parameter name
434 * @array: the name of the array variable
435 * @type: the type, as per module_param()
436 * @nump: optional pointer filled in with the number written
437 * @perm: visibility in sysfs
438 *
439 * This exposes a different name than the actual variable name.  See
440 * module_param_named() for why this might be necessary.
441 */
442#define module_param_array_named(name, array, type, nump, perm)		\
443	param_check_##type(name, &(array)[0]);				\
444	static const struct kparam_array __param_arr_##name		\
445	= { .max = ARRAY_SIZE(array), .num = nump,                      \
446	    .ops = &param_ops_##type,					\
447	    .elemsize = sizeof(array[0]), .elem = array };		\
448	__module_param_call(MODULE_PARAM_PREFIX, name,			\
449			    &param_array_ops,				\
450			    .arr = &__param_arr_##name,			\
451			    perm, -1, 0);				\
452	__MODULE_PARM_TYPE(name, "array of " #type)
453
454extern const struct kernel_param_ops param_array_ops;
455
456extern const struct kernel_param_ops param_ops_string;
457extern int param_set_copystring(const char *val, const struct kernel_param *);
458extern int param_get_string(char *buffer, const struct kernel_param *kp);
459
460/* for exporting parameters in /sys/module/.../parameters */
461
462struct module;
463
464#if defined(CONFIG_SYSFS) && defined(CONFIG_MODULES)
465extern int module_param_sysfs_setup(struct module *mod,
466				    const struct kernel_param *kparam,
467				    unsigned int num_params);
468
469extern void module_param_sysfs_remove(struct module *mod);
470#else
471static inline int module_param_sysfs_setup(struct module *mod,
472			     const struct kernel_param *kparam,
473			     unsigned int num_params)
474{
475	return 0;
476}
477
478static inline void module_param_sysfs_remove(struct module *mod)
479{ }
480#endif
481
482#endif /* _LINUX_MODULE_PARAMS_H */
v3.15
  1#ifndef _LINUX_MODULE_PARAMS_H
  2#define _LINUX_MODULE_PARAMS_H
  3/* (C) Copyright 2001, 2002 Rusty Russell IBM Corporation */
  4#include <linux/init.h>
  5#include <linux/stringify.h>
  6#include <linux/kernel.h>
  7
  8/* You can override this manually, but generally this should match the
  9   module name. */
 10#ifdef MODULE
 11#define MODULE_PARAM_PREFIX /* empty */
 12#else
 13#define MODULE_PARAM_PREFIX KBUILD_MODNAME "."
 14#endif
 15
 16/* Chosen so that structs with an unsigned long line up. */
 17#define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
 18
 19#ifdef MODULE
 20#define __MODULE_INFO(tag, name, info)					  \
 21static const char __UNIQUE_ID(name)[]					  \
 22  __used __attribute__((section(".modinfo"), unused, aligned(1)))	  \
 23  = __stringify(tag) "=" info
 24#else  /* !MODULE */
 25/* This struct is here for syntactic coherency, it is not used */
 26#define __MODULE_INFO(tag, name, info)					  \
 27  struct __UNIQUE_ID(name) {}
 28#endif
 29#define __MODULE_PARM_TYPE(name, _type)					  \
 30  __MODULE_INFO(parmtype, name##type, #name ":" _type)
 31
 32/* One for each parameter, describing how to use it.  Some files do
 33   multiple of these per line, so can't just use MODULE_INFO. */
 34#define MODULE_PARM_DESC(_parm, desc) \
 35	__MODULE_INFO(parm, _parm, #_parm ":" desc)
 36
 37struct kernel_param;
 38
 39/*
 40 * Flags available for kernel_param_ops
 41 *
 42 * NOARG - the parameter allows for no argument (foo instead of foo=1)
 43 */
 44enum {
 45	KERNEL_PARAM_FL_NOARG = (1 << 0)
 46};
 47
 48struct kernel_param_ops {
 49	/* How the ops should behave */
 50	unsigned int flags;
 51	/* Returns 0, or -errno.  arg is in kp->arg. */
 52	int (*set)(const char *val, const struct kernel_param *kp);
 53	/* Returns length written or -errno.  Buffer is 4k (ie. be short!) */
 54	int (*get)(char *buffer, const struct kernel_param *kp);
 55	/* Optional function to free kp->arg when module unloaded. */
 56	void (*free)(void *arg);
 57};
 58
 
 
 
 
 
 
 
 
 
 59struct kernel_param {
 60	const char *name;
 
 61	const struct kernel_param_ops *ops;
 62	u16 perm;
 63	s16 level;
 
 64	union {
 65		void *arg;
 66		const struct kparam_string *str;
 67		const struct kparam_array *arr;
 68	};
 69};
 70
 
 
 71/* Special one for strings we want to copy into */
 72struct kparam_string {
 73	unsigned int maxlen;
 74	char *string;
 75};
 76
 77/* Special one for arrays */
 78struct kparam_array
 79{
 80	unsigned int max;
 81	unsigned int elemsize;
 82	unsigned int *num;
 83	const struct kernel_param_ops *ops;
 84	void *elem;
 85};
 86
 87/**
 88 * module_param - typesafe helper for a module/cmdline parameter
 89 * @value: the variable to alter, and exposed parameter name.
 90 * @type: the type of the parameter
 91 * @perm: visibility in sysfs.
 92 *
 93 * @value becomes the module parameter, or (prefixed by KBUILD_MODNAME and a
 94 * ".") the kernel commandline parameter.  Note that - is changed to _, so
 95 * the user can use "foo-bar=1" even for variable "foo_bar".
 96 *
 97 * @perm is 0 if the the variable is not to appear in sysfs, or 0444
 98 * for world-readable, 0644 for root-writable, etc.  Note that if it
 99 * is writable, you may need to use kparam_block_sysfs_write() around
100 * accesses (esp. charp, which can be kfreed when it changes).
101 *
102 * The @type is simply pasted to refer to a param_ops_##type and a
103 * param_check_##type: for convenience many standard types are provided but
104 * you can create your own by defining those variables.
105 *
106 * Standard types are:
107 *	byte, short, ushort, int, uint, long, ulong
108 *	charp: a character pointer
109 *	bool: a bool, values 0/1, y/n, Y/N.
110 *	invbool: the above, only sense-reversed (N = true).
111 */
112#define module_param(name, type, perm)				\
113	module_param_named(name, name, type, perm)
114
115/**
 
 
 
 
 
 
116 * module_param_named - typesafe helper for a renamed module/cmdline parameter
117 * @name: a valid C identifier which is the parameter name.
118 * @value: the actual lvalue to alter.
119 * @type: the type of the parameter
120 * @perm: visibility in sysfs.
121 *
122 * Usually it's a good idea to have variable names and user-exposed names the
123 * same, but that's harder if the variable must be non-static or is inside a
124 * structure.  This allows exposure under a different name.
125 */
126#define module_param_named(name, value, type, perm)			   \
127	param_check_##type(name, &(value));				   \
128	module_param_cb(name, &param_ops_##type, &value, perm);		   \
129	__MODULE_PARM_TYPE(name, #type)
130
131/**
 
 
 
 
 
 
 
 
132 * module_param_cb - general callback for a module/cmdline parameter
133 * @name: a valid C identifier which is the parameter name.
134 * @ops: the set & get operations for this parameter.
135 * @perm: visibility in sysfs.
136 *
137 * The ops can have NULL set or get functions.
138 */
139#define module_param_cb(name, ops, arg, perm)				      \
140	__module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1)
 
 
 
 
141
142/**
143 * <level>_param_cb - general callback for a module/cmdline parameter
144 *                    to be evaluated before certain initcall level
145 * @name: a valid C identifier which is the parameter name.
146 * @ops: the set & get operations for this parameter.
147 * @perm: visibility in sysfs.
148 *
149 * The ops can have NULL set or get functions.
150 */
151#define __level_param_cb(name, ops, arg, perm, level)			\
152	__module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, level)
153
154#define core_param_cb(name, ops, arg, perm)		\
155	__level_param_cb(name, ops, arg, perm, 1)
156
157#define postcore_param_cb(name, ops, arg, perm)		\
158	__level_param_cb(name, ops, arg, perm, 2)
159
160#define arch_param_cb(name, ops, arg, perm)		\
161	__level_param_cb(name, ops, arg, perm, 3)
162
163#define subsys_param_cb(name, ops, arg, perm)		\
164	__level_param_cb(name, ops, arg, perm, 4)
165
166#define fs_param_cb(name, ops, arg, perm)		\
167	__level_param_cb(name, ops, arg, perm, 5)
168
169#define device_param_cb(name, ops, arg, perm)		\
170	__level_param_cb(name, ops, arg, perm, 6)
171
172#define late_param_cb(name, ops, arg, perm)		\
173	__level_param_cb(name, ops, arg, perm, 7)
174
175/* On alpha, ia64 and ppc64 relocations to global data cannot go into
176   read-only sections (which is part of respective UNIX ABI on these
177   platforms). So 'const' makes no sense and even causes compile failures
178   with some compilers. */
179#if defined(CONFIG_ALPHA) || defined(CONFIG_IA64) || defined(CONFIG_PPC64)
180#define __moduleparam_const
181#else
182#define __moduleparam_const const
183#endif
184
185/* This is the fundamental function for registering boot/module
186   parameters. */
187#define __module_param_call(prefix, name, ops, arg, perm, level)	\
188	/* Default value instead of permissions? */			\
189	static const char __param_str_##name[] = prefix #name; \
190	static struct kernel_param __moduleparam_const __param_##name	\
191	__used								\
192    __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \
193	= { __param_str_##name, ops, VERIFY_OCTAL_PERMISSIONS(perm),	\
194	    level, { arg } }
195
196/* Obsolete - use module_param_cb() */
197#define module_param_call(name, set, get, arg, perm)			\
198	static struct kernel_param_ops __param_ops_##name =		\
199		{ 0, (void *)set, (void *)get };			\
200	__module_param_call(MODULE_PARAM_PREFIX,			\
201			    name, &__param_ops_##name, arg,		\
202			    (perm) + sizeof(__check_old_set_param(set))*0, -1)
203
204/* We don't get oldget: it's often a new-style param_get_uint, etc. */
205static inline int
206__check_old_set_param(int (*oldset)(const char *, struct kernel_param *))
207{
208	return 0;
209}
210
211/**
212 * kparam_block_sysfs_write - make sure a parameter isn't written via sysfs.
213 * @name: the name of the parameter
214 *
215 * There's no point blocking write on a paramter that isn't writable via sysfs!
216 */
217#define kparam_block_sysfs_write(name)			\
218	do {						\
219		BUG_ON(!(__param_##name.perm & 0222));	\
220		__kernel_param_lock();			\
221	} while (0)
222
223/**
224 * kparam_unblock_sysfs_write - allows sysfs to write to a parameter again.
225 * @name: the name of the parameter
226 */
227#define kparam_unblock_sysfs_write(name)		\
228	do {						\
229		BUG_ON(!(__param_##name.perm & 0222));	\
230		__kernel_param_unlock();		\
231	} while (0)
232
233/**
234 * kparam_block_sysfs_read - make sure a parameter isn't read via sysfs.
235 * @name: the name of the parameter
236 *
237 * This also blocks sysfs writes.
238 */
239#define kparam_block_sysfs_read(name)			\
240	do {						\
241		BUG_ON(!(__param_##name.perm & 0444));	\
242		__kernel_param_lock();			\
243	} while (0)
244
245/**
246 * kparam_unblock_sysfs_read - allows sysfs to read a parameter again.
247 * @name: the name of the parameter
248 */
249#define kparam_unblock_sysfs_read(name)			\
250	do {						\
251		BUG_ON(!(__param_##name.perm & 0444));	\
252		__kernel_param_unlock();		\
253	} while (0)
254
255#ifdef CONFIG_SYSFS
256extern void __kernel_param_lock(void);
257extern void __kernel_param_unlock(void);
258#else
259static inline void __kernel_param_lock(void)
260{
261}
262static inline void __kernel_param_unlock(void)
263{
264}
265#endif
266
267#ifndef MODULE
268/**
269 * core_param - define a historical core kernel parameter.
270 * @name: the name of the cmdline and sysfs parameter (often the same as var)
271 * @var: the variable
272 * @type: the type of the parameter
273 * @perm: visibility in sysfs
274 *
275 * core_param is just like module_param(), but cannot be modular and
276 * doesn't add a prefix (such as "printk.").  This is for compatibility
277 * with __setup(), and it makes sense as truly core parameters aren't
278 * tied to the particular file they're in.
279 */
280#define core_param(name, var, type, perm)				\
281	param_check_##type(name, &(var));				\
282	__module_param_call("", name, &param_ops_##type, &var, perm, -1)
 
 
 
 
 
 
 
 
 
283#endif /* !MODULE */
284
285/**
286 * module_param_string - a char array parameter
287 * @name: the name of the parameter
288 * @string: the string variable
289 * @len: the maximum length of the string, incl. terminator
290 * @perm: visibility in sysfs.
291 *
292 * This actually copies the string when it's set (unlike type charp).
293 * @len is usually just sizeof(string).
294 */
295#define module_param_string(name, string, len, perm)			\
296	static const struct kparam_string __param_string_##name		\
297		= { len, string };					\
298	__module_param_call(MODULE_PARAM_PREFIX, name,			\
299			    &param_ops_string,				\
300			    .str = &__param_string_##name, perm, -1);	\
301	__MODULE_PARM_TYPE(name, "string")
302
303/**
304 * parameq - checks if two parameter names match
305 * @name1: parameter name 1
306 * @name2: parameter name 2
307 *
308 * Returns true if the two parameter names are equal.
309 * Dashes (-) are considered equal to underscores (_).
310 */
311extern bool parameq(const char *name1, const char *name2);
312
313/**
314 * parameqn - checks if two parameter names match
315 * @name1: parameter name 1
316 * @name2: parameter name 2
317 * @n: the length to compare
318 *
319 * Similar to parameq(), except it compares @n characters.
320 */
321extern bool parameqn(const char *name1, const char *name2, size_t n);
322
323/* Called on module insert or kernel boot */
324extern int parse_args(const char *name,
325		      char *args,
326		      const struct kernel_param *params,
327		      unsigned num,
328		      s16 level_min,
329		      s16 level_max,
 
330		      int (*unknown)(char *param, char *val,
331			      const char *doing));
332
333/* Called by module remove. */
334#ifdef CONFIG_SYSFS
335extern void destroy_params(const struct kernel_param *params, unsigned num);
336#else
337static inline void destroy_params(const struct kernel_param *params,
338				  unsigned num)
339{
340}
341#endif /* !CONFIG_SYSFS */
342
343/* All the helper functions */
344/* The macros to do compile-time type checking stolen from Jakub
345   Jelinek, who IIRC came up with this idea for the 2.4 module init code. */
346#define __param_check(name, p, type) \
347	static inline type __always_unused *__check_##name(void) { return(p); }
348
349extern struct kernel_param_ops param_ops_byte;
350extern int param_set_byte(const char *val, const struct kernel_param *kp);
351extern int param_get_byte(char *buffer, const struct kernel_param *kp);
352#define param_check_byte(name, p) __param_check(name, p, unsigned char)
353
354extern struct kernel_param_ops param_ops_short;
355extern int param_set_short(const char *val, const struct kernel_param *kp);
356extern int param_get_short(char *buffer, const struct kernel_param *kp);
357#define param_check_short(name, p) __param_check(name, p, short)
358
359extern struct kernel_param_ops param_ops_ushort;
360extern int param_set_ushort(const char *val, const struct kernel_param *kp);
361extern int param_get_ushort(char *buffer, const struct kernel_param *kp);
362#define param_check_ushort(name, p) __param_check(name, p, unsigned short)
363
364extern struct kernel_param_ops param_ops_int;
365extern int param_set_int(const char *val, const struct kernel_param *kp);
366extern int param_get_int(char *buffer, const struct kernel_param *kp);
367#define param_check_int(name, p) __param_check(name, p, int)
368
369extern struct kernel_param_ops param_ops_uint;
370extern int param_set_uint(const char *val, const struct kernel_param *kp);
371extern int param_get_uint(char *buffer, const struct kernel_param *kp);
372#define param_check_uint(name, p) __param_check(name, p, unsigned int)
373
374extern struct kernel_param_ops param_ops_long;
375extern int param_set_long(const char *val, const struct kernel_param *kp);
376extern int param_get_long(char *buffer, const struct kernel_param *kp);
377#define param_check_long(name, p) __param_check(name, p, long)
378
379extern struct kernel_param_ops param_ops_ulong;
380extern int param_set_ulong(const char *val, const struct kernel_param *kp);
381extern int param_get_ulong(char *buffer, const struct kernel_param *kp);
382#define param_check_ulong(name, p) __param_check(name, p, unsigned long)
383
384extern struct kernel_param_ops param_ops_charp;
 
 
 
 
 
385extern int param_set_charp(const char *val, const struct kernel_param *kp);
386extern int param_get_charp(char *buffer, const struct kernel_param *kp);
 
387#define param_check_charp(name, p) __param_check(name, p, char *)
388
389/* We used to allow int as well as bool.  We're taking that away! */
390extern struct kernel_param_ops param_ops_bool;
391extern int param_set_bool(const char *val, const struct kernel_param *kp);
392extern int param_get_bool(char *buffer, const struct kernel_param *kp);
393#define param_check_bool(name, p) __param_check(name, p, bool)
394
395extern struct kernel_param_ops param_ops_invbool;
 
 
 
 
 
 
396extern int param_set_invbool(const char *val, const struct kernel_param *kp);
397extern int param_get_invbool(char *buffer, const struct kernel_param *kp);
398#define param_check_invbool(name, p) __param_check(name, p, bool)
399
400/* An int, which can only be set like a bool (though it shows as an int). */
401extern struct kernel_param_ops param_ops_bint;
402extern int param_set_bint(const char *val, const struct kernel_param *kp);
403#define param_get_bint param_get_int
404#define param_check_bint param_check_int
405
406/**
407 * module_param_array - a parameter which is an array of some type
408 * @name: the name of the array variable
409 * @type: the type, as per module_param()
410 * @nump: optional pointer filled in with the number written
411 * @perm: visibility in sysfs
412 *
413 * Input and output are as comma-separated values.  Commas inside values
414 * don't work properly (eg. an array of charp).
415 *
416 * ARRAY_SIZE(@name) is used to determine the number of elements in the
417 * array, so the definition must be visible.
418 */
419#define module_param_array(name, type, nump, perm)		\
420	module_param_array_named(name, name, type, nump, perm)
421
422/**
423 * module_param_array_named - renamed parameter which is an array of some type
424 * @name: a valid C identifier which is the parameter name
425 * @array: the name of the array variable
426 * @type: the type, as per module_param()
427 * @nump: optional pointer filled in with the number written
428 * @perm: visibility in sysfs
429 *
430 * This exposes a different name than the actual variable name.  See
431 * module_param_named() for why this might be necessary.
432 */
433#define module_param_array_named(name, array, type, nump, perm)		\
434	param_check_##type(name, &(array)[0]);				\
435	static const struct kparam_array __param_arr_##name		\
436	= { .max = ARRAY_SIZE(array), .num = nump,                      \
437	    .ops = &param_ops_##type,					\
438	    .elemsize = sizeof(array[0]), .elem = array };		\
439	__module_param_call(MODULE_PARAM_PREFIX, name,			\
440			    &param_array_ops,				\
441			    .arr = &__param_arr_##name,			\
442			    perm, -1);					\
443	__MODULE_PARM_TYPE(name, "array of " #type)
444
445extern struct kernel_param_ops param_array_ops;
446
447extern struct kernel_param_ops param_ops_string;
448extern int param_set_copystring(const char *val, const struct kernel_param *);
449extern int param_get_string(char *buffer, const struct kernel_param *kp);
450
451/* for exporting parameters in /sys/module/.../parameters */
452
453struct module;
454
455#if defined(CONFIG_SYSFS) && defined(CONFIG_MODULES)
456extern int module_param_sysfs_setup(struct module *mod,
457				    const struct kernel_param *kparam,
458				    unsigned int num_params);
459
460extern void module_param_sysfs_remove(struct module *mod);
461#else
462static inline int module_param_sysfs_setup(struct module *mod,
463			     const struct kernel_param *kparam,
464			     unsigned int num_params)
465{
466	return 0;
467}
468
469static inline void module_param_sysfs_remove(struct module *mod)
470{ }
471#endif
472
473#endif /* _LINUX_MODULE_PARAMS_H */