module_param() primitive (1/3)
Subsystems (2)
PATCH 1/1 module_param() primitive (1/3)
Linus, please apply.
This version uses __param for the section name: ld generates __start___param and __stop___param automatically this way (unless the sections don't exist, so the declarations have to be in ld scripts anyway for now).
Thanks,
Rusty.
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
Name: Parameter Core Patch
Author: Rusty Russell
Status: Tested on 2.5.51
D: This patch is a rewrite of the insmod and boot parameter handling,
D: to unify them.
D:
D: The new format is fairly simple: built on top of __module_param_call there
D: are several helpers, eg "module_param(foo, int, 000)". The final argument
D: is the permissions bits, for exposing parameters in sysfs (if
D: non-zero) at a later stage.
arch/i386/vmlinux.lds.S +3 -0
@@ -67,6 +67,9 @@ SECTIONS __setup_start = .; .init.setup : { *(.init.setup) } __setup_end = .; + __start___param = .; + __param : { *(__param) } + __stop___param = .; __initcall_start = .; .initcall.init : { *(.initcall1.init)
arch/ia64/vmlinux.lds.S +4 -0
@@ -102,6 +102,10 @@ SECTIONS .init.setup : AT(ADDR(.init.setup) - PAGE_OFFSET) { *(.init.setup) } __setup_end = .; + __start___param = .; + __param : AT(ADDR(__param) - PAGE_OFFSET) + { *(__param) } + __stop___param = .; __initcall_start = .; .initcall.init : AT(ADDR(.initcall.init) - PAGE_OFFSET) {
arch/ppc/vmlinux.lds.S +3 -0
@@ -103,6 +103,9 @@ SECTIONS __setup_start = .; .init.setup : { *(.init.setup) } __setup_end = .; + __start___param = .; + __param : { *(__param) } + __stop___param = .; __initcall_start = .; .initcall.init : { *(.initcall1.init)
arch/ppc64/vmlinux.lds.S +3 -0
@@ -91,6 +91,9 @@ SECTIONS __setup_start = .; .init.setup : { *(.init.setup) } __setup_end = .; + __start___param = .; + __param : { *(__param) } + __stop___param = .; __initcall_start = .; .initcall.init : { *(.initcall1.init)
arch/sparc64/vmlinux.lds.S +3 -0
@@ -51,6 +51,9 @@ SECTIONS __setup_start = .; .init.setup : { *(.init.setup) } __setup_end = .; + __start___param = .; + __param : { *(__param) } + __stop___param = .; __initcall_start = .; .initcall.init : { *(.initcall1.init)
include/linux/init.h +13 -7
@@ -86,19 +86,15 @@ typedef void (*exitcall_t)(void);#define __exitcall (fn) \ static exitcall_t __exitcall_##fn __exit_call = fn -/* -* Used for kernel command line parameter setup -*/ -struct kernel_param { +struct obs_kernel_param {const char *str;int (*setup_func)(char *); }; -extern struct kernel_param __setup_start, __setup_end; - +/* OBSOLETE: see moduleparam.h for the right way. */ #define __setup (str, fn) \ static char __setup_str_##fn[] __initdata = str; \ - static struct kernel_param __setup_##fn \ + static struct obs_kernel_param __setup_##fn \ __attribute__((unused,__section__ (".init.setup"))) \ = { __setup_str_##fn, fn }
@@ -161,6 +157,16 @@ extern struct kernel_param __setup_start/* Data marked not to be saved by software_suspend() */ #define __nosavedata __attribute__ ((__section__ (".data.nosave"))) +/* This means "can be init if no module support, otherwise module load +may call it." */ +#ifdef CONFIG_MODULES +#define __init_or_module +#define __initdata_or_module +#else +#define __init_or_module __init +#define __initdata_or_module __initdata +#endif /*CONFIG_MODULES*/ +#ifdef CONFIG_HOTPLUG #define __devinit#define __devinitdata
include/linux/kernel.h +1 -1
@@ -71,7 +71,7 @@ extern int sscanf(const char *, const chextern int vsscanf (const char *,const char *,va_list );extern int get_option (char **str,int *pint); -extern char *get_options (char *str,int nints,int *ints); +extern char *get_options (const char *str,int nints,int *ints);extern unsigned long long memparse (char *ptr,char **retptr);extern void dev_probe_lock (void );extern void dev_probe_unlock (void );
include/linux/moduleparam.h +127 -0
127 lines not on this page · raw message
init/main.c +40 -64
142 lines not on this page · raw message
kernel/Makefile +2 -2
@@ -4,13 +4,13 @@ export-objs = signal.o sys.o kmod.o workqueue.o ksyms.o pm.o exec_domain.o \ printk.o platform.o suspend.o dma.o module.o cpufreq.o \ - profile.o rcupdate.o intermodule.o + profile.o rcupdate.o intermodule.o params.o obj-y = sched.o fork.o exec_domain.o panic.o printk.o profile.o \ exit.o itimer.o time.o softirq.o resource.o \ sysctl.o capability.o ptrace.o timer.o user.o \ signal.o sys.o kmod.o workqueue.o futex.o platform.o pid.o \ - rcupdate.o intermodule.o extable.o + rcupdate.o intermodule.o extable.o params.o obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o obj-$(CONFIG_SMP) += cpu.o
kernel/params.c +338 -0
338 lines not on this page · raw message
lib/cmdline.c +3 -3
@@ -64,12 +64,12 @@ int get_option (char **str, int *pint)* completely parseable). */ -char *get_options (char *str,int nints,int *ints) +char *get_options (const char *str,int nints,int *ints) {int res, i =1 ;while (i < nints) { - res =get_option (&str, ints + i); + res =get_option ((char **)&str, ints + i);if (res ==0 )break ; i++;
@@ -77,7 +77,7 @@ char *get_options (char *str, int nints,break ; } ints[0 ] = i -1 ; -return (str); +return (char *)str; }/**