cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

moduleparam.h (22879B)


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