/* * The maximum module name length, including the NUL byte. * Chosen so that structs with an unsigned long line up, specifically * modversion_info.
*/ #define __MODULE_NAME_LEN (64 - sizeof(unsignedlong))
/* You can override this manually, but generally this should match the
module name. */ #ifdef MODULE #define MODULE_PARAM_PREFIX /* empty */ #define __MODULE_INFO_PREFIX /* empty */ #else #define MODULE_PARAM_PREFIX KBUILD_MODNAME "." /* We cannot use MODULE_PARAM_PREFIX because some modules override it. */ #define __MODULE_INFO_PREFIX KBUILD_MODNAME "." #endif
/* Generic info of form tag = "info" */ #define MODULE_INFO(tag, info) \ staticconstchar __UNIQUE_ID(modinfo)[] \
__used __section(".modinfo") __aligned(1) \
= __MODULE_INFO_PREFIX __stringify(tag) "=" info
/* One for each parameter, describing how to use it. Some files do
multiple of these per line, so can't just use MODULE_INFO. */ #define MODULE_PARM_DESC(_parm, desc) \
MODULE_INFO(parm, #_parm ":" desc)
struct kernel_param;
/* * Flags available for kernel_param_ops * * NOARG - the parameter allows for no argument (foo instead of foo=1)
*/ enum {
KERNEL_PARAM_OPS_FL_NOARG = (1 << 0)
};
struct kernel_param_ops { /* How the ops should behave */ unsignedint flags; /* Returns 0, or -errno. arg is in kp->arg. */ int (*set)(constchar *val, conststruct kernel_param *kp); /* Returns length written or -errno. Buffer is 4k (ie. be short!) */ int (*get)(char *buffer, conststruct kernel_param *kp); /* Optional function to free kp->arg when module unloaded. */ void (*free)(void *arg);
};
/* * Flags available for kernel_param * * UNSAFE - the parameter is dangerous and setting it will taint the kernel * HWPARAM - Hardware param not permitted in lockdown mode
*/ enum {
KERNEL_PARAM_FL_UNSAFE = (1 << 0),
KERNEL_PARAM_FL_HWPARAM = (1 << 1),
};
/* Special one for strings we want to copy into */ struct kparam_string { unsignedint maxlen; char *string;
};
/* Special one for arrays */ struct kparam_array
{ unsignedint max; unsignedint elemsize; unsignedint *num; conststruct kernel_param_ops *ops; void *elem;
};
/** * module_param - typesafe helper for a module/cmdline parameter * @name: the variable to alter, and exposed parameter name. * @type: the type of the parameter * @perm: visibility in sysfs. * * @name becomes the module parameter, or (prefixed by KBUILD_MODNAME and a * ".") the kernel commandline parameter. Note that - is changed to _, so * the user can use "foo-bar=1" even for variable "foo_bar". * * @perm is 0 if the variable is not to appear in sysfs, or 0444 * for world-readable, 0644 for root-writable, etc. Note that if it * is writable, you may need to use kernel_param_lock() around * accesses (esp. charp, which can be kfreed when it changes). * * The @type is simply pasted to refer to a param_ops_##type and a * param_check_##type: for convenience many standard types are provided but * you can create your own by defining those variables. * * Standard types are: * byte, hexint, short, ushort, int, uint, long, ulong * charp: a character pointer * bool: a bool, values 0/1, y/n, Y/N. * invbool: the above, only sense-reversed (N = true).
*/ #define module_param(name, type, perm) \
module_param_named(name, name, type, perm)
/** * module_param_unsafe - same as module_param but taints kernel * @name: the variable to alter, and exposed parameter name. * @type: the type of the parameter * @perm: visibility in sysfs.
*/ #define module_param_unsafe(name, type, perm) \
module_param_named_unsafe(name, name, type, perm)
/** * module_param_named - typesafe helper for a renamed module/cmdline parameter * @name: a valid C identifier which is the parameter name. * @value: the actual lvalue to alter. * @type: the type of the parameter * @perm: visibility in sysfs. * * Usually it's a good idea to have variable names and user-exposed names the * same, but that's harder if the variable must be non-static or is inside a * structure. This allows exposure under a different name.
*/ #define module_param_named(name, value, type, perm) \
param_check_##type(name, &(value)); \
module_param_cb(name, ¶m_ops_##type, &value, perm); \
__MODULE_PARM_TYPE(name, #type)
/** * module_param_named_unsafe - same as module_param_named but taints kernel * @name: a valid C identifier which is the parameter name. * @value: the actual lvalue to alter. * @type: the type of the parameter * @perm: visibility in sysfs.
*/ #define module_param_named_unsafe(name, value, type, perm) \
param_check_##type(name, &(value)); \
module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
__MODULE_PARM_TYPE(name, #type)
/** * module_param_cb - general callback for a module/cmdline parameter * @name: a valid C identifier which is the parameter name. * @ops: the set & get operations for this parameter. * @arg: args for @ops * @perm: visibility in sysfs. * * The ops can have NULL set or get functions.
*/ #define module_param_cb(name, ops, arg, perm) \
__module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1, 0)
#define __level_param_cb(name, ops, arg, perm, level) \
__module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, level, 0) /** * core_param_cb - general callback for a module/cmdline parameter * to be evaluated before core initcall level * @name: a valid C identifier which is the parameter name. * @ops: the set & get operations for this parameter. * @arg: args for @ops * @perm: visibility in sysfs. * * The ops can have NULL set or get functions.
*/ #define core_param_cb(name, ops, arg, perm) \
__level_param_cb(name, ops, arg, perm, 1)
/** * postcore_param_cb - general callback for a module/cmdline parameter * to be evaluated before postcore initcall level * @name: a valid C identifier which is the parameter name. * @ops: the set & get operations for this parameter. * @arg: args for @ops * @perm: visibility in sysfs. * * The ops can have NULL set or get functions.
*/ #define postcore_param_cb(name, ops, arg, perm) \
__level_param_cb(name, ops, arg, perm, 2)
/** * arch_param_cb - general callback for a module/cmdline parameter * to be evaluated before arch initcall level * @name: a valid C identifier which is the parameter name. * @ops: the set & get operations for this parameter. * @arg: args for @ops * @perm: visibility in sysfs. * * The ops can have NULL set or get functions.
*/ #define arch_param_cb(name, ops, arg, perm) \
__level_param_cb(name, ops, arg, perm, 3)
/** * subsys_param_cb - general callback for a module/cmdline parameter * to be evaluated before subsys initcall level * @name: a valid C identifier which is the parameter name. * @ops: the set & get operations for this parameter. * @arg: args for @ops * @perm: visibility in sysfs. * * The ops can have NULL set or get functions.
*/ #define subsys_param_cb(name, ops, arg, perm) \
__level_param_cb(name, ops, arg, perm, 4)
/** * fs_param_cb - general callback for a module/cmdline parameter * to be evaluated before fs initcall level * @name: a valid C identifier which is the parameter name. * @ops: the set & get operations for this parameter. * @arg: args for @ops * @perm: visibility in sysfs. * * The ops can have NULL set or get functions.
*/ #define fs_param_cb(name, ops, arg, perm) \
__level_param_cb(name, ops, arg, perm, 5)
/** * device_param_cb - general callback for a module/cmdline parameter * to be evaluated before device initcall level * @name: a valid C identifier which is the parameter name. * @ops: the set & get operations for this parameter. * @arg: args for @ops * @perm: visibility in sysfs. * * The ops can have NULL set or get functions.
*/ #define device_param_cb(name, ops, arg, perm) \
__level_param_cb(name, ops, arg, perm, 6)
/** * late_param_cb - general callback for a module/cmdline parameter * to be evaluated before late initcall level * @name: a valid C identifier which is the parameter name. * @ops: the set & get operations for this parameter. * @arg: args for @ops * @perm: visibility in sysfs. * * The ops can have NULL set or get functions.
*/ #define late_param_cb(name, ops, arg, perm) \
__level_param_cb(name, ops, arg, perm, 7)
/* On alpha, ia64 and ppc64 relocations to global data cannot go into read-only sections (which is part of respective UNIX ABI on these platforms). So 'const' makes no sense and even causes compile failures
with some compilers. */ #ifdefined(CONFIG_ALPHA) || defined(CONFIG_PPC64) #define __moduleparam_const #else #define __moduleparam_const const #endif
/* This is the fundamental function for registering boot/module parameters. */ #define __module_param_call(prefix, name, ops, arg, perm, level, flags) \
static_assert(sizeof(""prefix) - 1 <= __MODULE_NAME_LEN); \ staticconstchar __param_str_##name[] = prefix #name; \ staticstruct kernel_param __moduleparam_const __param_##name \
__used __section("__param") \
__aligned(__alignof__(struct kernel_param)) \
= { __param_str_##name, THIS_MODULE, ops, \
VERIFY_OCTAL_PERMISSIONS(perm), level, flags, { arg } }
/* * Useful for describing a set/get pair used only once (i.e. for this * parameter). For repeated set/get pairs (i.e. the same struct * kernel_param_ops), use module_param_cb() instead.
*/ #define module_param_call(name, _set, _get, arg, perm) \ staticconststruct kernel_param_ops __param_ops_##name = \
{ .flags = 0, .set = _set, .get = _get }; \
__module_param_call(MODULE_PARAM_PREFIX, \
name, &__param_ops_##name, arg, perm, -1, 0)
#ifndef MODULE /** * core_param - define a historical core kernel parameter. * @name: the name of the cmdline and sysfs parameter (often the same as var) * @var: the variable * @type: the type of the parameter * @perm: visibility in sysfs * * core_param is just like module_param(), but cannot be modular and * doesn't add a prefix (such as "printk."). This is for compatibility * with __setup(), and it makes sense as truly core parameters aren't * tied to the particular file they're in.
*/ #define core_param(name, var, type, perm) \
param_check_##type(name, &(var)); \
__module_param_call("", name, ¶m_ops_##type, &var, perm, -1, 0)
/** * core_param_unsafe - same as core_param but taints kernel * @name: the name of the cmdline and sysfs parameter (often the same as var) * @var: the variable * @type: the type of the parameter * @perm: visibility in sysfs
*/ #define core_param_unsafe(name, var, type, perm) \
param_check_##type(name, &(var)); \
__module_param_call("", name, ¶m_ops_##type, &var, perm, \
-1, KERNEL_PARAM_FL_UNSAFE)
#endif/* !MODULE */
/** * module_param_string - a char array parameter * @name: the name of the parameter * @string: the string variable * @len: the maximum length of the string, incl. terminator * @perm: visibility in sysfs. * * This actually copies the string when it's set (unlike type charp). * @len is usually just sizeof(string).
*/ #define module_param_string(name, string, len, perm) \ staticconststruct kparam_string __param_string_##name \
= { len, string }; \
__module_param_call(MODULE_PARAM_PREFIX, name, \
¶m_ops_string, \
.str = &__param_string_##name, perm, -1, 0);\
__MODULE_PARM_TYPE(name, "string")
/** * parameq - checks if two parameter names match * @name1: parameter name 1 * @name2: parameter name 2 * * Returns true if the two parameter names are equal. * Dashes (-) are considered equal to underscores (_).
*/ externbool parameq(constchar *name1, constchar *name2);
/** * parameqn - checks if two parameter names match * @name1: parameter name 1 * @name2: parameter name 2 * @n: the length to compare * * Similar to parameq(), except it compares @n characters.
*/ externbool parameqn(constchar *name1, constchar *name2, size_t n);
/* All the helper functions */ /* The macros to do compile-time type checking stolen from Jakub
Jelinek, who IIRC came up with this idea for the 2.4 module init code. */ #define __param_check(name, p, type) \ staticinline type __always_unused *__check_##name(void) { return(p); }
/* We used to allow int as well as bool. We're taking that away! */ externconststruct kernel_param_ops param_ops_bool; externint param_set_bool(constchar *val, conststruct kernel_param *kp); externint param_get_bool(char *buffer, conststruct kernel_param *kp); #define param_check_bool(name, p) __param_check(name, p, bool)
externconststruct kernel_param_ops param_ops_bool_enable_only; externint param_set_bool_enable_only(constchar *val, conststruct kernel_param *kp); /* getter is the same as for the regular bool */ #define param_check_bool_enable_only param_check_bool
/* An int, which can only be set like a bool (though it shows as an int). */ externconststruct kernel_param_ops param_ops_bint; externint param_set_bint(constchar *val, conststruct kernel_param *kp); #define param_get_bint param_get_int #define param_check_bint param_check_int
/** * module_param_array - a parameter which is an array of some type * @name: the name of the array variable * @type: the type, as per module_param() * @nump: optional pointer filled in with the number written * @perm: visibility in sysfs * * Input and output are as comma-separated values. Commas inside values * don't work properly (eg. an array of charp). * * ARRAY_SIZE(@name) is used to determine the number of elements in the * array, so the definition must be visible.
*/ #define module_param_array(name, type, nump, perm) \
module_param_array_named(name, name, type, nump, perm)
/** * module_param_array_named - renamed parameter which is an array of some type * @name: a valid C identifier which is the parameter name * @array: the name of the array variable * @type: the type, as per module_param() * @nump: optional pointer filled in with the number written * @perm: visibility in sysfs * * This exposes a different name than the actual variable name. See * module_param_named() for why this might be necessary.
*/ #define module_param_array_named(name, array, type, nump, perm) \
param_check_##type(name, &(array)[0]); \ staticconststruct kparam_array __param_arr_##name \
= { .max = ARRAY_SIZE(array), .num = nump, \
.ops = ¶m_ops_##type, \
.elemsize = sizeof(array[0]), .elem = array }; \
__module_param_call(MODULE_PARAM_PREFIX, name, \
¶m_array_ops, \
.arr = &__param_arr_##name, \
perm, -1, 0); \
__MODULE_PARM_TYPE(name, "array of "#type)
enum hwparam_type {
hwparam_ioport, /* Module parameter configures an I/O port */
hwparam_iomem, /* Module parameter configures an I/O mem address */
hwparam_ioport_or_iomem, /* Module parameter could be either, depending on other option */
hwparam_irq, /* Module parameter configures an IRQ */
hwparam_dma, /* Module parameter configures a DMA channel */
hwparam_dma_addr, /* Module parameter configures a DMA buffer address */
hwparam_other, /* Module parameter configures some other value */
};
/** * module_param_hw_named - A parameter representing a hw parameters * @name: a valid C identifier which is the parameter name. * @value: the actual lvalue to alter. * @type: the type of the parameter * @hwtype: what the value represents (enum hwparam_type) * @perm: visibility in sysfs. * * Usually it's a good idea to have variable names and user-exposed names the * same, but that's harder if the variable must be non-static or is inside a * structure. This allows exposure under a different name.
*/ #define module_param_hw_named(name, value, type, hwtype, perm) \
param_check_##type(name, &(value)); \
__module_param_call(MODULE_PARAM_PREFIX, name, \
¶m_ops_##type, &value, \
perm, -1, \
KERNEL_PARAM_FL_HWPARAM | (hwparam_##hwtype & 0)); \
__MODULE_PARM_TYPE(name, #type)
/** * module_param_hw_array - A parameter representing an array of hw parameters * @name: the name of the array variable * @type: the type, as per module_param() * @hwtype: what the value represents (enum hwparam_type) * @nump: optional pointer filled in with the number written * @perm: visibility in sysfs * * Input and output are as comma-separated values. Commas inside values * don't work properly (eg. an array of charp). * * ARRAY_SIZE(@name) is used to determine the number of elements in the * array, so the definition must be visible.
*/ #define module_param_hw_array(name, type, hwtype, nump, perm) \
param_check_##type(name, &(name)[0]); \ staticconststruct kparam_array __param_arr_##name \
= { .max = ARRAY_SIZE(name), .num = nump, \
.ops = ¶m_ops_##type, \
.elemsize = sizeof(name[0]), .elem = name }; \
__module_param_call(MODULE_PARAM_PREFIX, name, \
¶m_array_ops, \
.arr = &__param_arr_##name, \
perm, -1, \
KERNEL_PARAM_FL_HWPARAM | (hwparam_##hwtype & 0)); \
__MODULE_PARM_TYPE(name, "array of "#type)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.