vserver 2.0 rc7
[linux-2.6.git] / include / linux / moduleparam.h
index e9d6a16..368ec8e 100644 (file)
 #define MODULE_PARAM_PREFIX __stringify(KBUILD_MODNAME) "."
 #endif
 
+#ifdef MODULE
+#define ___module_cat(a,b) __mod_ ## a ## b
+#define __module_cat(a,b) ___module_cat(a,b)
+#define __MODULE_INFO(tag, name, info)                                   \
+static const char __module_cat(name,__LINE__)[]                                  \
+  __attribute_used__                                                     \
+  __attribute__((section(".modinfo"),unused)) = __stringify(tag) "=" info
+#else  /* !MODULE */
+#define __MODULE_INFO(tag, name, info)
+#endif
+#define __MODULE_PARM_TYPE(name, _type)                                          \
+  __MODULE_INFO(parmtype, name##type, #name ":" _type)
+
 struct kernel_param;
 
 /* Returns 0, or -errno.  arg is in kp->arg. */
@@ -50,7 +63,7 @@ struct kparam_array
    not there, read bits mean it's readable, write bits mean it's
    writable. */
 #define __module_param_call(prefix, name, set, get, arg, perm)         \
-       static char __param_str_##name[] __initdata = prefix #name;     \
+       static char __param_str_##name[] = prefix #name;                \
        static struct kernel_param const __param_##name                 \
        __attribute_used__                                              \
     __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \
@@ -64,17 +77,19 @@ struct kparam_array
    param_set_XXX and param_check_XXX. */
 #define module_param_named(name, value, type, perm)                       \
        param_check_##type(name, &(value));                                \
-       module_param_call(name, param_set_##type, param_get_##type, &value, perm)
+       module_param_call(name, param_set_##type, param_get_##type, &value, perm); \
+       __MODULE_PARM_TYPE(name, #type)
 
 #define module_param(name, type, perm)                         \
        module_param_named(name, name, type, perm)
 
 /* Actually copy string: maxlen param is usually sizeof(string). */
 #define module_param_string(name, string, len, perm)                   \
-       static struct kparam_string __param_string_##name __initdata    \
+       static struct kparam_string __param_string_##name               \
                = { len, string };                                      \
-       module_param_call(name, param_set_copystring, param_get_charp,  \
-                  &__param_string_##name, perm)
+       module_param_call(name, param_set_copystring, param_get_string, \
+                  &__param_string_##name, perm);                       \
+       __MODULE_PARM_TYPE(name, "string")
 
 /* Called on module insert or kernel boot */
 extern int parse_args(const char *name,
@@ -89,6 +104,10 @@ extern int parse_args(const char *name,
 #define __param_check(name, p, type) \
        static inline type *__check_##name(void) { return(p); }
 
+extern int param_set_byte(const char *val, struct kernel_param *kp);
+extern int param_get_byte(char *buffer, struct kernel_param *kp);
+#define param_check_byte(name, p) __param_check(name, p, unsigned char)
+
 extern int param_set_short(const char *val, struct kernel_param *kp);
 extern int param_get_short(char *buffer, struct kernel_param *kp);
 #define param_check_short(name, p) __param_check(name, p, short)
@@ -125,21 +144,23 @@ extern int param_set_invbool(const char *val, struct kernel_param *kp);
 extern int param_get_invbool(char *buffer, struct kernel_param *kp);
 #define param_check_invbool(name, p) __param_check(name, p, int)
 
-/* Comma-separated array: num is set to number they actually specified. */
-#define module_param_array_named(name, array, type, num, perm)         \
+/* Comma-separated array: *nump is set to number they actually specified. */
+#define module_param_array_named(name, array, type, nump, perm)                \
        static struct kparam_array __param_arr_##name                   \
-       = { ARRAY_SIZE(array), &num, param_set_##type, param_get_##type,\
+       = { ARRAY_SIZE(array), nump, param_set_##type, param_get_##type,\
            sizeof(array[0]), array };                                  \
        module_param_call(name, param_array_set, param_array_get,       \
-                         &__param_arr_##name, perm)
+                         &__param_arr_##name, perm);                   \
+       __MODULE_PARM_TYPE(name, "array of " #type)
 
-#define module_param_array(name, type, num, perm)              \
-       module_param_array_named(name, name, type, num, perm)
+#define module_param_array(name, type, nump, perm)             \
+       module_param_array_named(name, name, type, nump, perm)
 
 extern int param_array_set(const char *val, struct kernel_param *kp);
 extern int param_array_get(char *buffer, struct kernel_param *kp);
 
 extern int param_set_copystring(const char *val, struct kernel_param *kp);
+extern int param_get_string(char *buffer, struct kernel_param *kp);
 
 int param_array(const char *name,
                const char *val,
@@ -147,4 +168,15 @@ int param_array(const char *name,
                void *elem, int elemsize,
                int (*set)(const char *, struct kernel_param *kp),
                int *num);
-#endif /* _LINUX_MODULE_PARAM_TYPES_H */
+
+/* for exporting parameters in /sys/parameters */
+
+struct module;
+
+extern int module_param_sysfs_setup(struct module *mod,
+                                   struct kernel_param *kparam,
+                                   unsigned int num_params);
+
+extern void module_param_sysfs_remove(struct module *mod);
+
+#endif /* _LINUX_MODULE_PARAMS_H */