[PATCH] Module rewrite 11/20: Parameter Support for Modules

From: Rusty Russell (rusty@rustcorp.com.au)
Date: Tue Sep 24 2002 - 22:02:45 EST


[ Linus, I chose to not to leave a "#define __setup()" stub in init.h
  to break compile on unconverted code. You might want to add it. ]

Name: Parameter __setup Removal Stage 1
Author: Rusty Russell
Status: Tested on 2.5.38
Depends: Module/param.patch.gz

D: This patch replaces some of the __setup calls (it is not
D: exhaustive), so my kernel compiles again. It heavily uses
D: __PARAM_CALL where I thought backwards compatibility was vital, but
D: some of these places really need a big renaming (esp. where module
D: parameters are different).
D:
D: This patch is reasonably large because the PARAM_CALL callbacks have
D: a slightly different prototype, and return 0 on success or -errno

diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/arch/i386/kernel/apm.c .26895-linux-2.5.38.updated/arch/i386/kernel/apm.c
--- .26895-linux-2.5.38/arch/i386/kernel/apm.c 2002-08-28 09:29:40.000000000 +1000
+++ .26895-linux-2.5.38.updated/arch/i386/kernel/apm.c 2002-09-25 07:17:08.000000000 +1000
@@ -1792,53 +1792,6 @@ static int apm(void *unused)
         return 0;
 }
 
-#ifndef MODULE
-static int __init apm_setup(char *str)
-{
- int invert;
-
- while ((str != NULL) && (*str != '\0')) {
- if (strncmp(str, "off", 3) == 0)
- apm_disabled = 1;
- if (strncmp(str, "on", 2) == 0)
- apm_disabled = 0;
- if ((strncmp(str, "bounce-interval=", 16) == 0) ||
- (strncmp(str, "bounce_interval=", 16) == 0))
- bounce_interval = simple_strtol(str + 16, NULL, 0);
- if ((strncmp(str, "idle-threshold=", 15) == 0) ||
- (strncmp(str, "idle_threshold=", 15) == 0))
- idle_threshold = simple_strtol(str + 15, NULL, 0);
- if ((strncmp(str, "idle-period=", 12) == 0) ||
- (strncmp(str, "idle_period=", 12) == 0))
- idle_period = simple_strtol(str + 12, NULL, 0);
- invert = (strncmp(str, "no-", 3) == 0) ||
- (strncmp(str, "no_", 3) == 0);
- if (invert)
- str += 3;
- if (strncmp(str, "debug", 5) == 0)
- debug = !invert;
- if ((strncmp(str, "power-off", 9) == 0) ||
- (strncmp(str, "power_off", 9) == 0))
- power_off = !invert;
- if ((strncmp(str, "allow-ints", 10) == 0) ||
- (strncmp(str, "allow_ints", 10) == 0))
- apm_info.allow_ints = !invert;
- if ((strncmp(str, "broken-psr", 10) == 0) ||
- (strncmp(str, "broken_psr", 10) == 0))
- apm_info.get_power_status_broken = !invert;
- if ((strncmp(str, "realmode-power-off", 18) == 0) ||
- (strncmp(str, "realmode_power_off", 18) == 0))
- apm_info.realmode_power_off = !invert;
- str = strchr(str, ',');
- if (str != NULL)
- str += strspn(str, ", \t");
- }
- return 1;
-}
-
-__setup("apm=", apm_setup);
-#endif
-
 static struct file_operations apm_bios_fops = {
         .owner = THIS_MODULE,
         .read = do_read,
@@ -2029,23 +1982,22 @@ module_exit(apm_exit);
 MODULE_AUTHOR("Stephen Rothwell");
 MODULE_DESCRIPTION("Advanced Power Management");
 MODULE_LICENSE("GPL");
-MODULE_PARM(debug, "i");
+PARAM(debug, bool, S_IWUSR|S_IRUGO);
 MODULE_PARM_DESC(debug, "Enable debug mode");
-MODULE_PARM(power_off, "i");
+PARAM(power_off, bool, S_IWUSR|S_IRUGO);
 MODULE_PARM_DESC(power_off, "Enable power off");
-MODULE_PARM(bounce_interval, "i");
-MODULE_PARM_DESC(bounce_interval,
- "Set the number of ticks to ignore suspend bounces");
-MODULE_PARM(allow_ints, "i");
+PARAM(bounce_interval, int, S_IWUSR|S_IRUGO);
+MODULE_PARM_DESC(bounce_interval, "Set the number of ticks to ignore suspend bounces");
+PARAM(allow_ints, bool, S_IWUSR|S_IRUGO);
 MODULE_PARM_DESC(allow_ints, "Allow interrupts during BIOS calls");
-MODULE_PARM(broken_psr, "i");
+PARAM(broken_psr, bool, S_IWUSR|S_IRUGO);
 MODULE_PARM_DESC(broken_psr, "BIOS has a broken GetPowerStatus call");
-MODULE_PARM(realmode_power_off, "i");
+PARAM(realmode_power_off, bool, S_IWUSR|S_IRUGO);
 MODULE_PARM_DESC(realmode_power_off,
                 "Switch to real mode before powering off");
-MODULE_PARM(idle_threshold, "i");
+PARAM(idle_threshold, int, S_IWUSR|S_IRUGO);
 MODULE_PARM_DESC(idle_threshold,
         "System idle percentage above which to make APM BIOS idle calls");
-MODULE_PARM(idle_period, "i");
+PARAM(idle_period, int, S_IWUSR|S_IRUGO);
 MODULE_PARM_DESC(idle_period,
         "Period (in sec/100) over which to caculate the idle percentage");
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/arch/i386/kernel/bluesmoke.c .26895-linux-2.5.38.updated/arch/i386/kernel/bluesmoke.c
--- .26895-linux-2.5.38/arch/i386/kernel/bluesmoke.c 2002-08-28 09:29:40.000000000 +1000
+++ .26895-linux-2.5.38.updated/arch/i386/kernel/bluesmoke.c 2002-09-25 07:17:08.000000000 +1000
@@ -11,6 +11,7 @@
 #include <linux/irq.h>
 #include <linux/tqueue.h>
 #include <linux/interrupt.h>
+#include <linux/params.h>
 
 #include <asm/processor.h>
 #include <asm/system.h>
@@ -488,20 +489,17 @@ void __init mcheck_init(struct cpuinfo_x
         }
 }
 
-static int __init mcheck_disable(char *str)
-{
- mce_disabled = 1;
- return 0;
-}
-
-static int __init mcheck_enable(char *str)
+static int __init mcheck_enable(const char *str, struct kernel_param *kp)
 {
         mce_disabled = -1;
         return 0;
 }
 
-__setup("nomce", mcheck_disable);
-__setup("mce", mcheck_enable);
+#undef PARAM_PREFIX
+#define PARAM_PREFIX ""
+
+PARAM_NAMED(nomce, mce_disabled, bool, 000);
+PARAM_CALL(mce, mcheck_enable, NULL, NULL, 000);
 
 #else
 asmlinkage void do_machine_check(struct pt_regs * regs, long error_code) {}
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/arch/i386/kernel/cpu/common.c .26895-linux-2.5.38.updated/arch/i386/kernel/cpu/common.c
--- .26895-linux-2.5.38/arch/i386/kernel/cpu/common.c 2002-09-18 16:04:37.000000000 +1000
+++ .26895-linux-2.5.38.updated/arch/i386/kernel/cpu/common.c 2002-09-25 07:17:08.000000000 +1000
@@ -2,6 +2,7 @@
 #include <linux/string.h>
 #include <linux/delay.h>
 #include <linux/smp.h>
+#include <linux/params.h>
 #include <asm/semaphore.h>
 #include <asm/processor.h>
 #include <asm/msr.h>
@@ -10,6 +11,9 @@
 
 #include "cpu.h"
 
+#undef PARAM_PREFIX
+#define PARAM_PREFIX ""
+
 static int cachesize_override __initdata = -1;
 static int disable_x86_fxsr __initdata = 0;
 
@@ -35,23 +39,12 @@ static struct cpu_dev default_cpu = {
 };
 static struct cpu_dev * this_cpu = &default_cpu;
 
-static int __init cachesize_setup(char *str)
-{
- get_option (&str, &cachesize_override);
- return 1;
-}
-__setup("cachesize=", cachesize_setup);
+PARAM_NAMED(cachesize, cachesize_override, int, 000);
 
 #ifndef CONFIG_X86_TSC
 static int tsc_disable __initdata = 0;
 
-static int __init tsc_setup(char *str)
-{
- tsc_disable = 1;
- return 1;
-}
-
-__setup("notsc", tsc_setup);
+PARAM_NAMED(notsc, tsc_disable, bool, 000);
 #endif
 
 int __init get_model_name(struct cpuinfo_x86 *c)
@@ -165,14 +158,7 @@ void __init get_cpu_vendor(struct cpuinf
         }
 }
 
-
-static int __init x86_fxsr_setup(char * s)
-{
- disable_x86_fxsr = 1;
- return 1;
-}
-__setup("nofxsr", x86_fxsr_setup);
-
+PARAM_NAMED(nofxsr, disable_x86_fxsr, bool, 000);
 
 /* Standard macro to see if a specific flag is changeable */
 static inline int flag_is_changeable_p(u32 flag)
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/arch/i386/kernel/cpu/intel.c .26895-linux-2.5.38.updated/arch/i386/kernel/cpu/intel.c
--- .26895-linux-2.5.38/arch/i386/kernel/cpu/intel.c 2002-09-21 13:55:07.000000000 +1000
+++ .26895-linux-2.5.38.updated/arch/i386/kernel/cpu/intel.c 2002-09-25 07:17:08.000000000 +1000
@@ -3,6 +3,7 @@
 #include <linux/string.h>
 #include <linux/bitops.h>
 #include <linux/smp.h>
+#include <linux/params.h>
 #include <asm/processor.h>
 #include <asm/thread_info.h>
 #include <asm/msr.h>
@@ -77,19 +78,8 @@ static void __init squash_the_stupid_ser
         }
 }
 
-static int __init x86_serial_nr_setup(char *s)
-{
- disable_x86_serial_nr = 0;
- return 1;
-}
-__setup("serialnumber", x86_serial_nr_setup);
-
-static int __init P4_disable_ht(char *s)
-{
- disable_P4_HT = 1;
- return 1;
-}
-__setup("noht", P4_disable_ht);
+PARAM_NAMED(serialnumber, disable_x86_serial_nr, invbool, 000);
+PARAM_NAMED(noht, disable_P4_HT, bool, 000);
 
 #define LVL_1_INST 1
 #define LVL_1_DATA 2
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/arch/i386/kernel/io_apic.c .26895-linux-2.5.38.updated/arch/i386/kernel/io_apic.c
--- .26895-linux-2.5.38/arch/i386/kernel/io_apic.c 2002-09-21 13:55:07.000000000 +1000
+++ .26895-linux-2.5.38.updated/arch/i386/kernel/io_apic.c 2002-09-25 07:17:08.000000000 +1000
@@ -31,6 +31,7 @@
 #include <linux/mc146818rtc.h>
 #include <linux/compiler.h>
 #include <linux/acpi.h>
+#include <linux/params.h>
 
 #include <asm/io.h>
 #include <asm/smp.h>
@@ -288,15 +289,9 @@ int pirq_entries [MAX_PIRQS];
 int pirqs_enabled;
 int skip_ioapic_setup;
 
-static int __init ioapic_setup(char *str)
-{
- skip_ioapic_setup = 1;
- return 1;
-}
-
-__setup("noapic", ioapic_setup);
+PARAM_NAMED(noapic, skip_ioapic_setup, bool, 000);
 
-static int __init ioapic_pirq_setup(char *str)
+static int __init ioapic_pirq_setup(const char *str, struct kernel_param *kp)
 {
         int i, max;
         int ints[MAX_PIRQS+1];
@@ -319,10 +314,10 @@ static int __init ioapic_pirq_setup(char
                  */
                 pirq_entries[MAX_PIRQS-i-1] = ints[i+1];
         }
- return 1;
+ return 0;
 }
 
-__setup("pirq=", ioapic_pirq_setup);
+PARAM_CALL(pirq, ioapic_pirq_setup, NULL, NULL, 000);
 
 /*
  * Find the IRQ entry number of a certain pin.
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/arch/i386/kernel/nmi.c .26895-linux-2.5.38.updated/arch/i386/kernel/nmi.c
--- .26895-linux-2.5.38/arch/i386/kernel/nmi.c 2002-07-27 15:24:35.000000000 +1000
+++ .26895-linux-2.5.38.updated/arch/i386/kernel/nmi.c 2002-09-25 07:17:08.000000000 +1000
@@ -20,6 +20,7 @@
 #include <linux/interrupt.h>
 #include <linux/mc146818rtc.h>
 #include <linux/kernel_stat.h>
+#include <linux/params.h>
 
 #include <asm/smp.h>
 #include <asm/mtrr.h>
@@ -102,7 +103,7 @@ int __init check_nmi_watchdog (void)
         return 0;
 }
 
-static int __init setup_nmi_watchdog(char *str)
+static int __init setup_nmi_watchdog(const char *str, struct kernel_param *kp)
 {
         int nmi;
 
@@ -131,10 +132,10 @@ static int __init setup_nmi_watchdog(cha
          */
         if (nmi == NMI_IO_APIC)
                 nmi_watchdog = nmi;
- return 1;
+ return 0;
 }
 
-__setup("nmi_watchdog=", setup_nmi_watchdog);
+PARAM_CALL(nmi_watchdog, setup_nmi_watchdog, NULL, NULL, 000);
 
 #ifdef CONFIG_PM
 
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/arch/i386/kernel/process.c .26895-linux-2.5.38.updated/arch/i386/kernel/process.c
--- .26895-linux-2.5.38/arch/i386/kernel/process.c 2002-09-21 13:55:07.000000000 +1000
+++ .26895-linux-2.5.38.updated/arch/i386/kernel/process.c 2002-09-25 07:17:08.000000000 +1000
@@ -33,6 +33,7 @@
 #include <linux/reboot.h>
 #include <linux/init.h>
 #include <linux/mc146818rtc.h>
+#include <linux/params.h>
 
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
@@ -143,17 +144,17 @@ void cpu_idle (void)
         }
 }
 
-static int __init idle_setup (char *str)
+static int __init idle_setup (const char *str, struct kernel_param *kp)
 {
         if (!strncmp(str, "poll", 4)) {
                 printk("using polling idle threads.\n");
                 pm_idle = poll_idle;
         }
 
- return 1;
+ return 0;
 }
 
-__setup("idle=", idle_setup);
+__PARAM_CALL("", idle, idle_setup, NULL, NULL, 000);
 
 extern void show_trace(unsigned long* esp);
 
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/arch/i386/kernel/reboot.c .26895-linux-2.5.38.updated/arch/i386/kernel/reboot.c
--- .26895-linux-2.5.38/arch/i386/kernel/reboot.c 2002-09-21 13:55:07.000000000 +1000
+++ .26895-linux-2.5.38.updated/arch/i386/kernel/reboot.c 2002-09-25 07:17:08.000000000 +1000
@@ -25,6 +25,7 @@
 #include <linux/reboot.h>
 #include <linux/init.h>
 #include <linux/mc146818rtc.h>
+#include <linux/params.h>
 
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
@@ -56,7 +57,7 @@ static int reboot_cpu = -1;
 /* shamelessly grabbed from lib/vsprintf.c for readability */
 #define is_digit(c) ((c) >= '0' && (c) <= '9')
 #endif
-static int __init reboot_setup(char *str)
+static int __init reboot_setup(const char *str, struct kernel_param *kp)
 {
         while(1) {
                 switch (*str) {
@@ -91,10 +92,10 @@ static int __init reboot_setup(char *str
                 else
                         break;
         }
- return 1;
+ return 0;
 }
 
-__setup("reboot=", reboot_setup);
+__PARAM_CALL("", reboot, reboot_setup, NULL, NULL, 000);
 
 /* The following code and data reboots the machine by switching to real
    mode and jumping to the BIOS reset entry point, as if the CPU has
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/arch/i386/kernel/setup.c .26895-linux-2.5.38.updated/arch/i386/kernel/setup.c
--- .26895-linux-2.5.38/arch/i386/kernel/setup.c 2002-09-21 13:55:07.000000000 +1000
+++ .26895-linux-2.5.38.updated/arch/i386/kernel/setup.c 2002-09-25 07:17:08.000000000 +1000
@@ -34,6 +34,7 @@
 #include <linux/console.h>
 #include <linux/root_dev.h>
 #include <linux/highmem.h>
+#include <linux/params.h>
 #include <asm/e820.h>
 #include <asm/mpspec.h>
 #include <asm/setup.h>
@@ -893,13 +894,14 @@ void __init setup_arch(char **cmdline_p)
         dmi_scan_machine();
 }
 
-static int __init highio_setup(char *str)
+static int __init highio_setup(const char *str, struct kernel_param *kp)
 {
         printk("i386: disabling HIGHMEM block I/O\n");
         blk_nohighio = 1;
- return 1;
+ return 0;
 }
-__setup("nohighio", highio_setup);
+
+__PARAM_CALL("", nohighio, highio_setup, NULL, NULL, 000);
  
 
 #include "setup_arch_post.h"
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/arch/i386/pci/common.c .26895-linux-2.5.38.updated/arch/i386/pci/common.c
--- .26895-linux-2.5.38/arch/i386/pci/common.c 2002-09-18 16:03:55.000000000 +1000
+++ .26895-linux-2.5.38.updated/arch/i386/pci/common.c 2002-09-25 07:17:08.000000000 +1000
@@ -138,7 +138,7 @@ static int __init pcibios_init(void)
 
 subsys_initcall(pcibios_init);
 
-char * __devinit pcibios_setup(char *str)
+char * __devinit pcibios_setup(const char *str)
 {
         if (!strcmp(str, "off")) {
                 pci_probe = 0;
@@ -191,7 +191,7 @@ char * __devinit pcibios_setup(char *st
                 pcibios_last_bus = simple_strtol(str+8, NULL, 0);
                 return NULL;
         }
- return str;
+ return (char *)str;
 }
 
 unsigned int pcibios_assign_all_busses(void)
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/drivers/block/loop.c .26895-linux-2.5.38.updated/drivers/block/loop.c
--- .26895-linux-2.5.38/drivers/block/loop.c 2002-09-23 08:54:51.000000000 +1000
+++ .26895-linux-2.5.38.updated/drivers/block/loop.c 2002-09-25 07:17:08.000000000 +1000
@@ -76,6 +76,7 @@
 #include <linux/suspend.h>
 #include <linux/writeback.h>
 #include <linux/buffer_head.h> /* for invalidate_bdev() */
+#include <linux/params.h>
 
 #include <asm/uaccess.h>
 
@@ -964,9 +965,6 @@ static struct block_device_operations lo
 /*
  * And now the modules code and kernel interface.
  */
-MODULE_PARM(max_loop, "i");
-MODULE_PARM_DESC(max_loop, "Maximum number of loop devices (1-256)");
-MODULE_LICENSE("GPL");
 
 int loop_register_transfer(struct loop_func_table *funcs)
 {
@@ -1078,12 +1076,6 @@ void loop_exit(void)
 module_init(loop_init);
 module_exit(loop_exit);
 
-#ifndef MODULE
-static int __init max_loop_setup(char *str)
-{
- max_loop = simple_strtol(str, NULL, 0);
- return 1;
-}
-
-__setup("max_loop=", max_loop_setup);
-#endif
+PARAM(max_loop, int, 000);
+MODULE_PARM_DESC(max_loop, "Maximum number of loop devices (1-256)");
+MODULE_LICENSE("GPL");
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/drivers/char/lp.c .26895-linux-2.5.38.updated/drivers/char/lp.c
--- .26895-linux-2.5.38/drivers/char/lp.c 2002-09-18 16:03:59.000000000 +1000
+++ .26895-linux-2.5.38.updated/drivers/char/lp.c 2002-09-25 07:17:08.000000000 +1000
@@ -126,6 +126,7 @@
 #include <linux/delay.h>
 #include <linux/poll.h>
 #include <linux/console.h>
+#include <linux/params.h>
 
 #include <linux/parport.h>
 #undef LP_STATS
@@ -759,7 +760,7 @@ MODULE_PARM(parport, "1-" __MODULE_STRIN
 MODULE_PARM(reset, "i");
 
 #ifndef MODULE
-static int __init lp_setup (char *str)
+static int __init lp_setup (const char *str, struct kernel_param *kp)
 {
         static int parport_ptr; // initially zero
         int x;
@@ -770,7 +771,7 @@ static int __init lp_setup (char *str)
                         parport_nr[0] = LP_PARPORT_OFF;
                 } else {
                         printk(KERN_WARNING "warning: 'lp=0x%x' is deprecated, ignored\n", x);
- return 0;
+ return -EINVAL;
                 }
         } else if (!strncmp(str, "parport", 7)) {
                 int n = simple_strtoul(str+7, NULL, 10);
@@ -786,8 +787,11 @@ static int __init lp_setup (char *str)
         } else if (!strcmp(str, "reset")) {
                 reset = 1;
         }
- return 1;
+ return 0;
 }
+
+/* just "lp=" for backwards compat. */
+__PARAM_CALL("", lp, lp_setup, NULL, NULL, 000);
 #endif
 
 static int lp_register(int nr, struct parport *port)
@@ -973,7 +977,6 @@ static void lp_cleanup_module (void)
         }
 }
 
-__setup("lp=", lp_setup);
 module_init(lp_init_module);
 module_exit(lp_cleanup_module);
 
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/drivers/ide/ide.c .26895-linux-2.5.38.updated/drivers/ide/ide.c
--- .26895-linux-2.5.38/drivers/ide/ide.c 2002-09-23 08:54:52.000000000 +1000
+++ .26895-linux-2.5.38.updated/drivers/ide/ide.c 2002-09-25 07:17:08.000000000 +1000
@@ -153,6 +153,7 @@
 #include <linux/cdrom.h>
 #include <linux/seq_file.h>
 #include <linux/device.h>
+#include <linux/params.h>
 
 #include <asm/byteorder.h>
 #include <asm/irq.h>
@@ -2673,54 +2674,51 @@ static int __init stridx (const char *s,
 /*
  * match_parm() does parsing for ide_setup():
  *
- * 1. the first char of s must be '='.
- * 2. if the remainder matches one of the supplied keywords,
+ * 1. if the string matches one of the supplied keywords,
  * the index (1 based) of the keyword is negated and returned.
- * 3. if the remainder is a series of no more than max_vals numbers
+ * 2. if the string is a series of no more than max_vals numbers
  * separated by commas, the numbers are saved in vals[] and a
  * count of how many were saved is returned. Base10 is assumed,
  * and base16 is allowed when prefixed with "0x".
- * 4. otherwise, zero is returned.
+ * 3. otherwise, zero is returned.
  */
-static int __init match_parm (char *s, const char *keywords[], int vals[], int max_vals)
+static int __init match_parm (const char *s, const char *keywords[], int vals[], int max_vals)
 {
         static const char *decimal = "0123456789";
         static const char *hex = "0123456789abcdef";
         int i, n;
 
- if (*s++ == '=') {
- /*
- * Try matching against the supplied keywords,
- * and return -(index+1) if we match one
- */
- if (keywords != NULL) {
- for (i = 0; *keywords != NULL; ++i) {
- if (!strcmp(s, *keywords++))
- return -(i+1);
- }
+ /*
+ * Try matching against the supplied keywords,
+ * and return -(index+1) if we match one
+ */
+ if (keywords != NULL) {
+ for (i = 0; *keywords != NULL; ++i) {
+ if (!strcmp(s, *keywords++))
+ return -(i+1);
                 }
- /*
- * Look for a series of no more than "max_vals"
- * numeric values separated by commas, in base10,
- * or base16 when prefixed with "0x".
- * Return a count of how many were found.
- */
- for (n = 0; (i = stridx(decimal, *s)) >= 0;) {
- vals[n] = i;
- while ((i = stridx(decimal, *++s)) >= 0)
- vals[n] = (vals[n] * 10) + i;
- if (*s == 'x' && !vals[n]) {
- while ((i = stridx(hex, *++s)) >= 0)
- vals[n] = (vals[n] * 0x10) + i;
- }
- if (++n == max_vals)
- break;
- if (*s == ',' || *s == ';')
- ++s;
+ }
+ /*
+ * Look for a series of no more than "max_vals"
+ * numeric values separated by commas, in base10,
+ * or base16 when prefixed with "0x".
+ * Return a count of how many were found.
+ */
+ for (n = 0; (i = stridx(decimal, *s)) >= 0;) {
+ vals[n] = i;
+ while ((i = stridx(decimal, *++s)) >= 0)
+ vals[n] = (vals[n] * 10) + i;
+ if (*s == 'x' && !vals[n]) {
+ while ((i = stridx(hex, *++s)) >= 0)
+ vals[n] = (vals[n] * 0x10) + i;
                 }
- if (!*s)
- return n;
+ if (++n == max_vals)
+ break;
+ if (*s == ',' || *s == ';')
+ ++s;
         }
+ if (!*s)
+ return n;
         return 0; /* zero = nothing matched */
 }
 
@@ -2804,7 +2802,7 @@ static int __init match_parm (char *s, c
  * "idex=dc4030" : probe/support Promise DC4030VL interface
  * "ide=doubler" : probe/support IDE doublers on Amiga
  */
-int __init ide_setup (char *s)
+int __init ide_setup (const char *s, struct kernel_param *kp)
 {
         int i, vals[3];
         ide_hwif_t *hwif;
@@ -2813,64 +2811,59 @@ int __init ide_setup (char *s)
         const char max_drive = 'a' + ((MAX_HWIFS * MAX_DRIVES) - 1);
         const char max_hwif = '0' + (MAX_HWIFS - 1);
 
-
- if (strncmp(s,"hd",2) == 0 && s[2] == '=') /* hd= is for hd.c */
- return 0; /* driver and not us */
-
- if (strncmp(s,"ide",3) &&
- strncmp(s,"idebus",6) &&
- strncmp(s,"hd",2)) /* hdx= & hdxlun= */
- return 0;
+ if (!s)
+ return -EINVAL;
 
         printk("ide_setup: %s", s);
         init_ide_data ();
 
 #ifdef CONFIG_BLK_DEV_IDEDOUBLER
- if (!strcmp(s, "ide=doubler")) {
+ if (!strcmp(kp->name, "ide") && !strcmp(s, "doubler")) {
                 extern int ide_doubler;
 
                 printk(" : Enabled support for IDE doublers\n");
                 ide_doubler = 1;
- return 1;
+ return 0;
         }
 #endif /* CONFIG_BLK_DEV_IDEDOUBLER */
 
- if (!strcmp(s, "ide=nodma")) {
+ if (!strcmp(kp->name, "ide") && !strcmp(s, "nodma")) {
                 printk("IDE: Prevented DMA\n");
                 noautodma = 1;
- return 1;
+ return 0;
         }
 
 #ifdef CONFIG_BLK_DEV_IDEPCI
- if (!strcmp(s, "ide=reverse")) {
+ if (!strcmp(kp->name, "ide") && !strcmp(s, "reverse")) {
                 ide_scan_direction = 1;
                 printk(" : Enabled support for IDE inverse scan order.\n");
- return 1;
+ return 0;
         }
 #endif /* CONFIG_BLK_DEV_IDEPCI */
 
         /*
          * Look for drive options: "hdx="
          */
- if (s[0] == 'h' && s[1] == 'd' && s[2] >= 'a' && s[2] <= max_drive) {
+ if (kp->name[0] == 'h' && kp->name[1] == 'd'
+ && kp->name[2] >= 'a' && kp->name[2] <= max_drive) {
                 const char *hd_words[] = {"none", "noprobe", "nowerr", "cdrom",
                                 "serialize", "autotune", "noautotune",
                                 "slow", "swapdata", "bswap", "flash",
                                 "remap", "noremap", "scsi", NULL};
- unit = s[2] - 'a';
+ unit = kp->name[2] - 'a';
                 hw = unit / MAX_DRIVES;
                 unit = unit % MAX_DRIVES;
                 hwif = &ide_hwifs[hw];
                 drive = &hwif->drives[unit];
- if (strncmp(s + 4, "ide-", 4) == 0) {
- strncpy(drive->driver_req, s + 4, 9);
+ if (strncmp(s, "ide-", 4) == 0) {
+ strncpy(drive->driver_req, s, 9);
                         goto done;
                 }
                 /*
                  * Look for last lun option: "hdxlun="
                  */
- if (s[3] == 'l' && s[4] == 'u' && s[5] == 'n') {
- if (match_parm(&s[6], NULL, vals, 1) != 1)
+ if (!strcmp(kp->name, "hdxlun")) {
+ if (match_parm(s, NULL, vals, 1) != 1)
                                 goto bad_option;
                         if (vals[0] >= 0 && vals[0] <= 7) {
                                 drive->last_lun = vals[0];
@@ -2879,7 +2872,7 @@ int __init ide_setup (char *s)
                                 printk(" -- BAD LAST LUN! Expected value from 0 to 7");
                         goto done;
                 }
- switch (match_parm(&s[3], hd_words, vals, 3)) {
+ switch (match_parm(s, hd_words, vals, 3)) {
                         case -1: /* "none" */
                                 drive->nobios = 1; /* drop into "noprobe" */
                         case -2: /* "noprobe" */
@@ -2941,13 +2934,13 @@ int __init ide_setup (char *s)
                 }
         }
 
- if (s[0] != 'i' || s[1] != 'd' || s[2] != 'e')
+ if (kp->name[0] != 'i' || kp->name[1] != 'd' || kp->name[2] != 'e')
                 goto bad_option;
         /*
          * Look for bus speed option: "idebus="
          */
- if (s[3] == 'b' && s[4] == 'u' && s[5] == 's') {
- if (match_parm(&s[6], NULL, vals, 1) != 1)
+ if (!strcmp(kp->name, "idebus")) {
+ if (match_parm(s, NULL, vals, 1) != 1)
                         goto bad_option;
                 if (vals[0] >= 20 && vals[0] <= 66) {
                         idebus_parameter = vals[0];
@@ -2958,7 +2951,7 @@ int __init ide_setup (char *s)
         /*
          * Look for interface options: "idex="
          */
- if (s[3] >= '0' && s[3] <= max_hwif) {
+ if (kp->name[3] >= '0' && kp->name[3] <= max_hwif) {
                 /*
                  * Be VERY CAREFUL changing this: note hardcoded indexes below
                  * -8,-9,-10 : are reserved for future idex calls to ease the hardcoding.
@@ -2967,9 +2960,9 @@ int __init ide_setup (char *s)
                         "noprobe", "serialize", "autotune", "noautotune", "reset", "dma", "ata66",
                         "minus8", "minus9", "minus10",
                         "four", "qd65xx", "ht6560b", "cmd640_vlb", "dtc2278", "umc8672", "ali14xx", "dc4030", NULL };
- hw = s[3] - '0';
+ hw = kp->name[3] - '0';
                 hwif = &ide_hwifs[hw];
- i = match_parm(&s[4], ide_words, vals, 3);
+ i = match_parm(s, ide_words, vals, 3);
 
                 /*
                  * Cryptic check to ensure chipset not already set for hwif:
@@ -3106,17 +3099,17 @@ int __init ide_setup (char *s)
                         case 0: goto bad_option;
                         default:
                                 printk(" -- SUPPORT NOT CONFIGURED IN THIS KERNEL\n");
- return 1;
+ return -ENOSYS;
                 }
         }
 bad_option:
         printk(" -- BAD OPTION\n");
- return 1;
+ return -EINVAL;
 bad_hwif:
         printk("-- NOT SUPPORTED ON ide%d", hw);
 done:
         printk("\n");
- return 1;
+ return -ENOSYS;
 }
 
 /*
@@ -3557,27 +3550,10 @@ int __init ide_init (void)
 module_init(ide_init);
 
 #ifdef MODULE
-char *options = NULL;
-MODULE_PARM(options,"s");
 MODULE_LICENSE("GPL");
 
-static void __init parse_options (char *line)
-{
- char *next = line;
-
- if (line == NULL || !*line)
- return;
- while ((line = next) != NULL) {
- if ((next = strchr(line,' ')) != NULL)
- *next++ = 0;
- if (!ide_setup(line))
- printk ("Unknown option '%s'\n", line);
- }
-}
-
 int init_module (void)
 {
- parse_options(options);
         return ide_init();
 }
 
@@ -3601,9 +3577,22 @@ void cleanup_module (void)
 
         bus_unregister(&ide_bus_type);
 }
+#endif /* !MODULE */
 
-#else /* !MODULE */
-
-__setup("", ide_setup);
-
-#endif /* MODULE */
+/* Messy, but explicit */
+#undef PARAM_PREFIX
+#define PARAM_PREFIX ""
+PARAM_CALL(hda, ide_setup, NULL, NULL, 000);
+PARAM_CALL(hdb, ide_setup, NULL, NULL, 000);
+PARAM_CALL(hdc, ide_setup, NULL, NULL, 000);
+PARAM_CALL(hdd, ide_setup, NULL, NULL, 000);
+PARAM_CALL(hde, ide_setup, NULL, NULL, 000);
+PARAM_CALL(hdf, ide_setup, NULL, NULL, 000);
+PARAM_CALL(hdg, ide_setup, NULL, NULL, 000);
+PARAM_CALL(hdh, ide_setup, NULL, NULL, 000);
+PARAM_CALL(ide0, ide_setup, NULL, NULL, 000);
+PARAM_CALL(ide1, ide_setup, NULL, NULL, 000);
+PARAM_CALL(ide2, ide_setup, NULL, NULL, 000);
+PARAM_CALL(ide3, ide_setup, NULL, NULL, 000);
+PARAM_CALL(ide, ide_setup, NULL, NULL, 000);
+PARAM_CALL(idebus, ide_setup, NULL, NULL, 000);
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/drivers/parport/init.c .26895-linux-2.5.38.updated/drivers/parport/init.c
--- .26895-linux-2.5.38/drivers/parport/init.c 2002-07-25 10:13:08.000000000 +1000
+++ .26895-linux-2.5.38.updated/drivers/parport/init.c 2002-09-25 07:17:08.000000000 +1000
@@ -17,6 +17,7 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/init.h>
+#include <linux/params.h>
 
 #ifndef MODULE
 static int io[PARPORT_MAX+1] __initdata = { [0 ... PARPORT_MAX] = 0 };
@@ -44,7 +45,7 @@ static int parport_setup_ptr __initdata
  *
  * IRQ/DMA may be numeric or 'auto' or 'none'
  */
-static int __init parport_setup (char *str)
+static int __init parport_setup(const char *str, struct kernel_param *kp)
 {
         char *endptr;
         char *sep;
@@ -53,24 +54,24 @@ static int __init parport_setup (char *s
         if (!str || !*str || (*str == '0' && !*(str+1))) {
                 /* Disable parport if "parport=0" in cmdline */
                 io[0] = PARPORT_DISABLE;
- return 1;
+ return 0;
         }
 
         if (!strncmp (str, "auto", 4)) {
                 irq[0] = PARPORT_IRQ_AUTO;
                 dma[0] = PARPORT_DMA_AUTO;
- return 1;
+ return 0;
         }
 
         val = simple_strtoul (str, &endptr, 0);
         if (endptr == str) {
                 printk (KERN_WARNING "parport=%s not understood\n", str);
- return 1;
+ return 0;
         }
 
         if (parport_setup_ptr == PARPORT_MAX) {
                 printk(KERN_ERR "parport=%s ignored, too many ports\n", str);
- return 1;
+ return 0;
         }
         
         io[parport_setup_ptr] = val;
@@ -87,7 +88,7 @@ static int __init parport_setup (char *s
                                 printk (KERN_WARNING
                                         "parport=%s: irq not understood\n",
                                         str);
- return 1;
+ return 0;
                         }
                         irq[parport_setup_ptr] = val;
                 }
@@ -105,17 +106,17 @@ static int __init parport_setup (char *s
                                 printk (KERN_WARNING
                                         "parport=%s: dma not understood\n",
                                         str);
- return 1;
+ return -EINVAL;
                         }
                         dma[parport_setup_ptr] = val;
                 }
         }
 
         parport_setup_ptr++;
- return 1;
+ return 0;
 }
 
-__setup ("parport=", parport_setup);
+PARAM_CALL(parport, parport_setup, NULL, NULL, 0);
 
 #endif
 
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/drivers/pci/pci.c .26895-linux-2.5.38.updated/drivers/pci/pci.c
--- .26895-linux-2.5.38/drivers/pci/pci.c 2002-09-18 16:04:01.000000000 +1000
+++ .26895-linux-2.5.38.updated/drivers/pci/pci.c 2002-09-25 07:17:08.000000000 +1000
@@ -14,6 +14,7 @@
 #include <linux/pci.h>
 #include <linux/module.h>
 #include <linux/spinlock.h>
+#include <linux/params.h>
 #include <asm/dma.h> /* isa_dma_bridge_buggy */
 
 #undef DEBUG
@@ -623,7 +624,7 @@ static int __devinit pci_init(void)
         return 0;
 }
 
-static int __devinit pci_setup(char *str)
+static int __devinit pci_setup(const char *str, struct kernel_param *kp)
 {
         while (str) {
                 char *k = strchr(str, ',');
@@ -635,12 +636,12 @@ static int __devinit pci_setup(char *str
                 }
                 str = k;
         }
- return 1;
+ return 0;
 }
 
 device_initcall(pci_init);
 
-__setup("pci=", pci_setup);
+__PARAM_CALL("", pci, pci_setup, NULL, NULL, 000);
 
 EXPORT_SYMBOL(pci_enable_device);
 EXPORT_SYMBOL(pci_disable_device);
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/drivers/video/vgacon.c .26895-linux-2.5.38.updated/drivers/video/vgacon.c
--- .26895-linux-2.5.38/drivers/video/vgacon.c 2002-08-28 09:29:49.000000000 +1000
+++ .26895-linux-2.5.38.updated/drivers/video/vgacon.c 2002-09-25 07:17:08.000000000 +1000
@@ -50,6 +50,7 @@
 #include <linux/spinlock.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
+#include <linux/params.h>
 
 #include <asm/io.h>
 
@@ -119,18 +120,18 @@ static int vga_video_font_height;
 static unsigned int vga_rolled_over = 0;
 
 
-static int __init no_scroll(char *str)
+static int __init no_scroll(const char *str, struct kernel_param *kp)
 {
         /*
          * Disabling scrollback is required for the Braillex ib80-piezo
          * Braille reader made by F.H. Papenmeier (Germany).
- * Use the "no-scroll" bootflag.
+ * Use the "vgacon.no-scroll" bootflag.
          */
         vga_hardscroll_user_enable = vga_hardscroll_enabled = 0;
- return 1;
+ return 0;
 }
 
-__setup("no-scroll", no_scroll);
+PARAM_CALL(no_scroll, no_scroll, NULL, NULL, 000);
 
 /*
  * By replacing the four outb_p with two back to back outw, we can reduce
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/fs/devfs/base.c .26895-linux-2.5.38.updated/fs/devfs/base.c
--- .26895-linux-2.5.38/fs/devfs/base.c 2002-09-01 12:23:04.000000000 +1000
+++ .26895-linux-2.5.38.updated/fs/devfs/base.c 2002-09-25 07:17:08.000000000 +1000
@@ -671,6 +671,7 @@
 #include <linux/smp.h>
 #include <linux/version.h>
 #include <linux/rwsem.h>
+#include <linux/params.h>
 
 #include <asm/uaccess.h>
 #include <asm/io.h>
@@ -2247,7 +2248,7 @@ int devfs_only (void)
  * @str: The boot options after the "devfs=".
  */
 
-static int __init devfs_setup (char *str)
+static int __init devfs_setup (const char *str, struct kernel_param *kp)
 {
     static struct
     {
@@ -2303,10 +2304,10 @@ static int __init devfs_setup (char *str
         if (*str != ',') return 0; /* No more options */
         ++str;
     }
- return 1;
+ return 0;
 } /* End Function devfs_setup */
 
-__setup("devfs=", devfs_setup);
+__PARAM_CALL("", devfs, devfs_setup, NULL, NULL, 000);
 
 EXPORT_SYMBOL(devfs_put);
 EXPORT_SYMBOL(devfs_register);
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/fs/lockd/svc.c .26895-linux-2.5.38.updated/fs/lockd/svc.c
--- .26895-linux-2.5.38/fs/lockd/svc.c 2002-09-18 16:04:02.000000000 +1000
+++ .26895-linux-2.5.38.updated/fs/lockd/svc.c 2002-09-25 07:17:08.000000000 +1000
@@ -332,22 +332,9 @@ cleanup_module(void)
         nlm_shutdown_hosts();
 }
 #else
-/* not a module, so process bootargs
- * lockd.udpport and lockd.tcpport
- */
 
-static int __init udpport_set(char *str)
-{
- nlm_udpport = simple_strtoul(str, NULL, 0);
- return 1;
-}
-static int __init tcpport_set(char *str)
-{
- nlm_tcpport = simple_strtoul(str, NULL, 0);
- return 1;
-}
-__setup("lockd.udpport=", udpport_set);
-__setup("lockd.tcpport=", tcpport_set);
+PARAM_NAMED(udpport, nlm_udpport, long, 000);
+PARAM_NAMED(tcpport, nlm_tcpport, long, 000);
 
 #endif
 
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/fs/nfs/nfsroot.c .26895-linux-2.5.38.updated/fs/nfs/nfsroot.c
--- .26895-linux-2.5.38/fs/nfs/nfsroot.c 2002-06-12 22:38:32.000000000 +1000
+++ .26895-linux-2.5.38.updated/fs/nfs/nfsroot.c 2002-09-25 07:17:08.000000000 +1000
@@ -334,7 +334,7 @@ int __init root_nfs_init(void)
  * Parse NFS server and directory information passed on the kernel
  * command line.
  */
-int __init nfs_root_setup(char *line)
+int __init nfs_root_setup(char *line, struct kernel_param *kp)
 {
         ROOT_DEV = Root_NFS;
         if (line[0] == '/' || line[0] == ',' || (line[0] >= '0' && line[0] <= '9')) {
@@ -347,10 +347,10 @@ int __init nfs_root_setup(char *line)
                 sprintf(nfs_root_name, NFS_ROOT, line);
         }
         root_nfs_parse_addr(nfs_root_name);
- return 1;
+ return 0;
 }
 
-__setup("nfsroot=", nfs_root_setup);
+__PARAM_CALL("", nfsroot, nfs_root_setup, NULL, NULL, 000);
 
 /***************************************************************************
 
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/fs/partitions/efi.c .26895-linux-2.5.38.updated/fs/partitions/efi.c
--- .26895-linux-2.5.38/fs/partitions/efi.c 2002-07-25 10:13:15.000000000 +1000
+++ .26895-linux-2.5.38.updated/fs/partitions/efi.c 2002-09-25 07:17:08.000000000 +1000
@@ -113,14 +113,7 @@
  * the partition tables happens after init too.
  */
 static int force_gpt;
-static int __init
-force_gpt_fn(char *str)
-{
- force_gpt = 1;
- return 1;
-}
-__setup("gpt", force_gpt_fn);
-
+PARAM_NAMED(gpt, force_gpt, bool, 000);
 
 /**
  * efi_crc32() - EFI version of crc32 function
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/include/asm-i386/bugs.h .26895-linux-2.5.38.updated/include/asm-i386/bugs.h
--- .26895-linux-2.5.38/include/asm-i386/bugs.h 2002-06-06 12:33:24.000000000 +1000
+++ .26895-linux-2.5.38.updated/include/asm-i386/bugs.h 2002-09-25 07:17:08.000000000 +1000
@@ -22,34 +22,30 @@
 
 #include <linux/config.h>
 #include <linux/init.h>
+#include <linux/params.h>
 #include <asm/processor.h>
 #include <asm/i387.h>
 #include <asm/msr.h>
 
-static int __init no_halt(char *s)
+/* We want top level for backwards compat. */
+#undef PARAM_PREFIX
+#define PARAM_PREFIX ""
+static int __init no_halt(const char *s, struct kernel_param *kp)
 {
         boot_cpu_data.hlt_works_ok = 0;
- return 1;
-}
-
-__setup("no-hlt", no_halt);
-
-static int __init mca_pentium(char *s)
-{
- mca_pentium_flag = 1;
- return 1;
+ return 0;
 }
+PARAM_CALL(no_hlt, no_halt, NULL, NULL, 000);
+PARAM_NAMED(mca_pentium, mca_pentium_flag, bool, 000);
 
-__setup("mca-pentium", mca_pentium);
-
-static int __init no_387(char *s)
+static int __init no_387(const char *s, struct kernel_param *kp)
 {
         boot_cpu_data.hard_math = 0;
         write_cr0(0xE | read_cr0());
- return 1;
+ return 0;
 }
 
-__setup("no387", no_387);
+PARAM_CALL(no387, no_387, NULL, NULL, 000);
 
 static double __initdata x = 4195835.0;
 static double __initdata y = 3145727.0;
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/include/linux/init.h .26895-linux-2.5.38.updated/include/linux/init.h
--- .26895-linux-2.5.38/include/linux/init.h 2002-09-25 07:16:46.000000000 +1000
+++ .26895-linux-2.5.38.updated/include/linux/init.h 2002-09-25 07:17:08.000000000 +1000
@@ -73,20 +73,6 @@ extern initcall_t __initcall_start, __in
 #define __exitcall(fn) \
         static exitcall_t __exitcall_##fn __exit_call = fn
 
-/*
- * Used for kernel command line parameter setup
- */
-struct kernel_param {
- const char *str;
- int (*setup_func)(char *);
-};
-
-extern struct kernel_param __setup_start, __setup_end;
-
-#define __setup(str, fn) \
- static char __setup_str_##fn[] __initdata = str; \
- static struct kernel_param __setup_##fn __attribute__((unused)) __initsetup = { __setup_str_##fn, fn }
-
 #endif /* __ASSEMBLY__ */
 
 /*
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/include/linux/netdevice.h .26895-linux-2.5.38.updated/include/linux/netdevice.h
--- .26895-linux-2.5.38/include/linux/netdevice.h 2002-09-21 13:55:19.000000000 +1000
+++ .26895-linux-2.5.38.updated/include/linux/netdevice.h 2002-09-25 07:17:08.000000000 +1000
@@ -458,7 +458,7 @@ extern struct net_device loopback_dev;
 extern struct net_device *dev_base; /* All devices */
 extern rwlock_t dev_base_lock; /* Device list lock */
 
-extern int netdev_boot_setup_add(char *name, struct ifmap *map);
+extern int netdev_boot_setup_add(const char *name, struct ifmap *map);
 extern int netdev_boot_setup_check(struct net_device *dev);
 extern struct net_device *dev_getbyhwaddr(unsigned short type, char *hwaddr);
 extern void dev_add_pack(struct packet_type *pt);
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/include/linux/pci.h .26895-linux-2.5.38.updated/include/linux/pci.h
--- .26895-linux-2.5.38/include/linux/pci.h 2002-09-18 16:04:06.000000000 +1000
+++ .26895-linux-2.5.38.updated/include/linux/pci.h 2002-09-25 07:17:08.000000000 +1000
@@ -508,7 +508,7 @@ struct pci_driver {
 
 void pcibios_fixup_bus(struct pci_bus *);
 int pcibios_enable_device(struct pci_dev *, int mask);
-char *pcibios_setup (char *str);
+char *pcibios_setup (const char *str);
 
 /* Used only when drivers/pci/setup.c is used */
 void pcibios_align_resource(void *, struct resource *,
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/include/linux/security.h .26895-linux-2.5.38.updated/include/linux/security.h
--- .26895-linux-2.5.38/include/linux/security.h 2002-08-02 11:15:10.000000000 +1000
+++ .26895-linux-2.5.38.updated/include/linux/security.h 2002-09-25 07:17:08.000000000 +1000
@@ -655,6 +655,7 @@ struct swap_info_struct;
  * This is the main security structure.
  */
 struct security_operations {
+ struct module *owner;
         int (*ptrace) (struct task_struct * parent, struct task_struct * child);
         int (*capget) (struct task_struct * target,
                        kernel_cap_t * effective,
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/init/do_mounts.c .26895-linux-2.5.38.updated/init/do_mounts.c
--- .26895-linux-2.5.38/init/do_mounts.c 2002-09-18 16:03:31.000000000 +1000
+++ .26895-linux-2.5.38.updated/init/do_mounts.c 2002-09-25 07:17:08.000000000 +1000
@@ -19,6 +19,7 @@
 #include <linux/minix_fs.h>
 #include <linux/ext2_fs.h>
 #include <linux/romfs_fs.h>
+#include <linux/params.h>
 
 #define BUILD_CRAMDISK
 
@@ -36,17 +37,14 @@ extern asmlinkage long sys_mknod(const c
 extern asmlinkage long sys_umount(char *name, int flags);
 extern asmlinkage long sys_ioctl(int fd, int cmd, unsigned long arg);
 
+/* We want top level for backwards compatibility. */
+#undef PARAM_PREFIX
+#define PARAM_PREFIX ""
+
 #ifdef CONFIG_BLK_DEV_INITRD
 unsigned int real_root_dev; /* do_proc_dointvec cannot handle kdev_t */
 static int __initdata mount_initrd = 1;
-
-static int __init no_initrd(char *str)
-{
- mount_initrd = 0;
- return 1;
-}
-
-__setup("noinitrd", no_initrd);
+PARAM_NAMED(noinitrd, mount_initrd, invbool, 000);
 #else
 static int __initdata mount_initrd = 0;
 #endif
@@ -61,31 +59,29 @@ dev_t ROOT_DEV;
 
 static int do_devfs = 0;
 
-static int __init load_ramdisk(char *str)
+static int __init load_ramdisk(const char *str, struct kernel_param *kp)
 {
         rd_doload = simple_strtol(str,NULL,0) & 3;
- return 1;
+ return 0;
 }
-__setup("load_ramdisk=", load_ramdisk);
+PARAM_CALL(load_ramdisk, load_ramdisk, NULL, NULL, 000);
 
-static int __init readonly(char *str)
+static int __init readonly(const char *str, struct kernel_param *kp)
 {
- if (*str)
- return 0;
+ if (str) return -EINVAL;
         root_mountflags |= MS_RDONLY;
- return 1;
+ return 0;
 }
 
-static int __init readwrite(char *str)
+static int __init readwrite(const char *str, struct kernel_param *kp)
 {
- if (*str)
- return 0;
+ if (str) return -EINVAL;
         root_mountflags &= ~MS_RDONLY;
- return 1;
+ return 0;
 }
 
-__setup("ro", readonly);
-__setup("rw", readwrite);
+PARAM_CALL(ro, readonly, NULL, NULL, 000);
+PARAM_CALL(rw, readwrite, NULL, NULL, 000);
 
 static struct dev_name_struct {
         const char *name;
@@ -236,7 +232,7 @@ kdev_t __init name_to_kdev_t(char *line)
         return to_kdev_t(base + simple_strtoul(line,NULL,base?10:16));
 }
 
-static int __init root_dev_setup(char *line)
+static int __init root_dev_setup(const char *line, struct kernel_param *kp)
 {
         int i;
         char ch;
@@ -250,27 +246,17 @@ static int __init root_dev_setup(char *l
             if ( isspace (ch) || (ch == ',') || (ch == '\0') ) break;
             root_device_name[i] = ch;
         }
- return 1;
+ return 0;
 }
 
-__setup("root=", root_dev_setup);
-
 static char * __initdata root_mount_data;
-static int __init root_data_setup(char *str)
-{
- root_mount_data = str;
- return 1;
-}
-
 static char * __initdata root_fs_names;
-static int __init fs_names_setup(char *str)
-{
- root_fs_names = str;
- return 1;
-}
 
-__setup("rootflags=", root_data_setup);
-__setup("rootfstype=", fs_names_setup);
+#undef PARAM_PREFIX
+#define PARAM_PREFIX ""
+PARAM_CALL(root, root_dev_setup, NULL, NULL, 000);
+PARAM_NAMED(rootflags, root_mount_data, charp, 000);
+PARAM_NAMED(rootfstype, root_fs_names, charp, 000);
 
 static void __init get_fs_names(char *page)
 {
@@ -402,21 +388,11 @@ static void __init change_floppy(char *f
 
 int __initdata rd_prompt = 1; /* 1 = prompt for RAM disk, 0 = don't prompt */
 
-static int __init prompt_ramdisk(char *str)
-{
- rd_prompt = simple_strtol(str,NULL,0) & 1;
- return 1;
-}
-__setup("prompt_ramdisk=", prompt_ramdisk);
+PARAM_NAMED(prompt_ramdisk, rd_prompt, bool, 000);
 
 int __initdata rd_image_start; /* starting block # of image */
 
-static int __init ramdisk_start_setup(char *str)
-{
- rd_image_start = simple_strtol(str,NULL,0);
- return 1;
-}
-__setup("ramdisk_start=", ramdisk_start_setup);
+PARAM_NAMED(ramdisk_start, rd_image_start, int, 000);
 
 static int __init crd_load(int in_fd, int out_fd);
 
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/init/main.c .26895-linux-2.5.38.updated/init/main.c
--- .26895-linux-2.5.38/init/main.c 2002-09-25 07:16:46.000000000 +1000
+++ .26895-linux-2.5.38.updated/init/main.c 2002-09-25 07:17:08.000000000 +1000
@@ -43,6 +43,10 @@
 #include <asm/smp.h>
 #endif
 
+/* We don't want prefix for this file (our args are special) */
+#undef PARAM_PREFIX
+#define PARAM_PREFIX ""
+
 /*
  * Versions of gcc older than that listed below may actually compile
  * and link okay, but the end product can have subtle run time bugs.
@@ -112,50 +116,21 @@ static unsigned int max_cpus = UINT_MAX;
  * greater than 0, limits the maximum number of CPUs activated in
  * SMP mode to <NUM>.
  */
-static int __init nosmp(char *str)
+static int __init nosmp(const char *str, struct kernel_param *kp)
 {
         max_cpus = 0;
- return 1;
-}
-
-__setup("nosmp", nosmp);
-
-static int __init maxcpus(char *str)
-{
- get_option(&str, &max_cpus);
- return 1;
+ return 0;
 }
-
-__setup("maxcpus=", maxcpus);
+PARAM_CALL(nosmp, nosmp, NULL, NULL, 000);
+PARAM_NAMED(maxcpus, max_cpus, uint, 000);
+PARAM_NAMED(profile, prof_shift, ulong, 000);
 
 static char * argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
 char * envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };
 
-static int __init profile_setup(char *str)
-{
- int par;
- if (get_option(&str,&par)) prof_shift = par;
- return 1;
-}
-
-__setup("profile=", profile_setup);
-
-static int __init checksetup(char *line)
-{
- struct kernel_param *p;
-
- p = &__setup_start;
- do {
- int n = strlen(p->str);
- if (!strncmp(line,p->str,n)) {
- if (p->setup_func(line+n))
- return 1;
- }
- p++;
- } while (p < &__setup_end);
- return 0;
-}
-
+/* Created by linker magic */
+extern struct kernel_param __setup_start, __setup_end;
+
 /* this should be approx 2 Bo*oMips to start (note initial shift), and will
    still work even if initially too large, it will just take slightly longer */
 unsigned long loops_per_jiffy = (1<<12);
@@ -206,24 +181,21 @@ void __init calibrate_delay(void)
                 (loops_per_jiffy/(5000/HZ)) % 100);
 }
 
-static int __init debug_kernel(char *str)
+static int __init debug_kernel(const char *str, struct kernel_param *kp)
 {
- if (*str)
- return 0;
         console_loglevel = 10;
- return 1;
+ return 0;
 }
 
-static int __init quiet_kernel(char *str)
+static int __init quiet_kernel(const char *str, struct kernel_param *kp)
 {
- if (*str)
- return 0;
         console_loglevel = 4;
- return 1;
+ return 0;
 }
 
-__setup("debug", debug_kernel);
-__setup("quiet", quiet_kernel);
+PARAM_CALL(debug, debug_kernel, NULL, NULL, 000);
+PARAM_CALL(quiet, quiet_kernel, NULL, NULL, 000);
+PARAM_NAMED(init, execute_command, charp, 000);
 
 /* Unknown boot options get handed to init, unless they look like
    failed parameters */
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/kernel/panic.c .26895-linux-2.5.38.updated/kernel/panic.c
--- .26895-linux-2.5.38/kernel/panic.c 2002-08-11 15:31:43.000000000 +1000
+++ .26895-linux-2.5.38.updated/kernel/panic.c 2002-09-25 07:17:08.000000000 +1000
@@ -16,6 +16,7 @@
 #include <linux/init.h>
 #include <linux/sysrq.h>
 #include <linux/interrupt.h>
+#include <linux/params.h>
 
 asmlinkage void sys_sync(void); /* it's really int */
 
@@ -23,13 +24,7 @@ int panic_timeout;
 
 struct notifier_block *panic_notifier_list;
 
-static int __init panic_setup(char *str)
-{
- panic_timeout = simple_strtoul(str, NULL, 0);
- return 1;
-}
-
-__setup("panic=", panic_setup);
+PARAM_NAMED(timeout, panic_timeout, int, 0640);
 
 /**
  * panic - halt the system
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/kernel/printk.c .26895-linux-2.5.38.updated/kernel/printk.c
--- .26895-linux-2.5.38/kernel/printk.c 2002-09-21 13:55:19.000000000 +1000
+++ .26895-linux-2.5.38.updated/kernel/printk.c 2002-09-25 07:17:08.000000000 +1000
@@ -27,6 +27,7 @@
 #include <linux/config.h>
 #include <linux/slab.h>
 #include <linux/delay.h>
+#include <linux/params.h>
 
 #include <asm/uaccess.h>
 
@@ -99,7 +100,7 @@ static int console_may_schedule;
 /*
  * Setup a list of consoles. Called from init/main.c
  */
-static int __init console_setup(char *str)
+static int __init console_setup(const char *str, struct kernel_param *kp)
 {
         struct console_cmdline *c;
         char name[sizeof(c->name)];
@@ -140,16 +141,16 @@ static int __init console_setup(char *st
                                 return 1;
                 }
         if (i == MAX_CMDLINECONSOLES)
- return 1;
+ return 0;
         preferred_console = i;
         c = &console_cmdline[i];
         memcpy(c->name, name, sizeof(c->name));
         c->options = options;
         c->index = idx;
- return 1;
+ return 0;
 }
 
-__setup("console=", console_setup);
+__PARAM_CALL("", console, console_setup, NULL, NULL, 000);
 
 /*
  * Commands to do_syslog:
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/kernel/resource.c .26895-linux-2.5.38.updated/kernel/resource.c
--- .26895-linux-2.5.38/kernel/resource.c 2002-08-11 15:31:43.000000000 +1000
+++ .26895-linux-2.5.38.updated/kernel/resource.c 2002-09-25 07:17:08.000000000 +1000
@@ -13,6 +13,7 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
+#include <linux/params.h>
 #include <asm/io.h>
 
 struct resource ioport_resource = { "PCI IO", 0x0000, IO_SPACE_LIMIT, IORESOURCE_IO };
@@ -297,7 +298,7 @@ void __release_region(struct resource *p
  * Called from init/main.c to reserve IO ports.
  */
 #define MAXRESERVE 4
-static int __init reserve_setup(char *str)
+static int __init reserve_setup(const char *str, struct kernel_param *kp)
 {
         static int reserved = 0;
         static struct resource reserve[MAXRESERVE];
@@ -321,7 +322,9 @@ static int __init reserve_setup(char *st
                                 reserved = x+1;
                 }
         }
- return 1;
+ return 0;
 }
 
-__setup("reserve=", reserve_setup);
+#undef PARAM_PREFIX
+#define PARAM_PREFIX ""
+PARAM_CALL(reserve, reserve_setup, NULL, NULL, 000);
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/kernel/suspend.c .26895-linux-2.5.38.updated/kernel/suspend.c
--- .26895-linux-2.5.38/kernel/suspend.c 2002-09-21 13:55:19.000000000 +1000
+++ .26895-linux-2.5.38.updated/kernel/suspend.c 2002-09-25 07:17:08.000000000 +1000
@@ -1221,28 +1221,28 @@ read_failure:
         return;
 }
 
-static int __init resume_setup(char *str)
+static int __init resume_setup(char *str, struct kernel_param *kp)
 {
         if(resume_status)
- return 1;
+ return 0;
 
         strncpy( resume_file, str, 255 );
         resume_status = RESUME_SPECIFIED;
 
- return 1;
+ return 0;
 }
 
-static int __init software_noresume(char *str)
+static int __init software_noresume(char *str, struct kernel_param *kp)
 {
         if(!resume_status)
                 printk(KERN_WARNING "noresume option lacks a resume= option\n");
         resume_status = NORESUME;
         
- return 1;
+ return 0;
 }
 
-__setup("noresume", software_noresume);
-__setup("resume=", resume_setup);
+PARAM_CALL(noresume, software_noresume, NULL, NULL, 000);
+PARAM_CALL(resume, resume_setup, NULL, NULL, 000);
 
 EXPORT_SYMBOL(software_suspend);
 EXPORT_SYMBOL(software_suspend_enabled);
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/mm/page_alloc.c .26895-linux-2.5.38.updated/mm/page_alloc.c
--- .26895-linux-2.5.38/mm/page_alloc.c 2002-09-21 13:55:19.000000000 +1000
+++ .26895-linux-2.5.38.updated/mm/page_alloc.c 2002-09-25 07:17:08.000000000 +1000
@@ -24,6 +24,7 @@
 #include <linux/suspend.h>
 #include <linux/pagevec.h>
 #include <linux/blkdev.h>
+#include <linux/params.h>
 
 unsigned long totalram_pages;
 unsigned long totalhigh_pages;
@@ -949,7 +950,7 @@ void __init free_area_init(unsigned long
 }
 #endif
 
-static int __init setup_mem_frac(char *str)
+static int __init setup_mem_frac(const char *str, struct kernel_param *kp)
 {
         int j = 0;
 
@@ -957,7 +958,7 @@ static int __init setup_mem_frac(char *s
         printk("setup_mem_frac: ");
         for (j = 0; j < MAX_NR_ZONES; j++) printk("%d ", zone_balance_ratio[j]);
         printk("\n");
- return 1;
+ return 0;
 }
 
-__setup("memfrac=", setup_mem_frac);
+__PARAM_CALL("", memfrac, setup_mem_frac, NULL, NULL, 000);
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/net/core/dev.c .26895-linux-2.5.38.updated/net/core/dev.c
--- .26895-linux-2.5.38/net/core/dev.c 2002-09-21 13:55:20.000000000 +1000
+++ .26895-linux-2.5.38.updated/net/core/dev.c 2002-09-25 07:17:08.000000000 +1000
@@ -105,6 +105,7 @@
 #include <linux/init.h>
 #include <linux/kmod.h>
 #include <linux/module.h>
+#include <linux/params.h>
 #if defined(CONFIG_NET_RADIO) || defined(CONFIG_NET_PCMCIA_RADIO)
 #include <linux/wireless.h> /* Note : will define WIRELESS_EXT */
 #include <net/iw_handler.h>
@@ -316,7 +317,7 @@ static struct netdev_boot_setup dev_boot
  * returns 0 on error and 1 on success. This is a generic routine to
  * all netdevices.
  */
-int netdev_boot_setup_add(char *name, struct ifmap *map)
+int netdev_boot_setup_add(const char *name, struct ifmap *map)
 {
         struct netdev_boot_setup *s;
         int i;
@@ -331,7 +332,7 @@ int netdev_boot_setup_add(char *name, st
                 }
         }
 
- return i >= NETDEV_BOOT_SETUP_MAX ? 0 : 1;
+ return i >= NETDEV_BOOT_SETUP_MAX ? -ENOSPC : 0;
 }
 
 /**
@@ -364,7 +365,7 @@ int netdev_boot_setup_check(struct net_d
 /*
  * Saves at boot time configured settings for any netdevice.
  */
-int __init netdev_boot_setup(char *str)
+int __init netdev_boot_setup(const char *str, struct kernel_param *kp)
 {
         int ints[5];
         struct ifmap map;
@@ -388,7 +389,8 @@ int __init netdev_boot_setup(char *str)
         return netdev_boot_setup_add(str, &map);
 }
 
-__setup("netdev=", netdev_boot_setup);
+/* We want top level for backwards compat. */
+__PARAM_CALL("", netdev, netdev_boot_setup, NULL, NULL, 000);
 
 /*******************************************************************************
 
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/net/ethernet/eth.c .26895-linux-2.5.38.updated/net/ethernet/eth.c
--- .26895-linux-2.5.38/net/ethernet/eth.c 2001-03-03 11:02:48.000000000 +1100
+++ .26895-linux-2.5.38.updated/net/ethernet/eth.c 2002-09-25 07:17:08.000000000 +1000
@@ -52,6 +52,7 @@
 #include <linux/errno.h>
 #include <linux/config.h>
 #include <linux/init.h>
+#include <linux/params.h>
 #include <net/dst.h>
 #include <net/arp.h>
 #include <net/sock.h>
@@ -61,9 +62,10 @@
 #include <asm/system.h>
 #include <asm/checksum.h>
 
-extern int __init netdev_boot_setup(char *str);
+extern int __init netdev_boot_setup(const char *str, struct kernel_param *kp);
 
-__setup("ether=", netdev_boot_setup);
+/* We want top level for backwards compat. */
+__PARAM_CALL("", ether, netdev_boot_setup, NULL, NULL, 000);
 
 /*
  * Create the Ethernet MAC header for an arbitrary protocol layer
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .26895-linux-2.5.38/net/ipv4/ipconfig.c .26895-linux-2.5.38.updated/net/ipv4/ipconfig.c
--- .26895-linux-2.5.38/net/ipv4/ipconfig.c 2002-08-28 09:29:54.000000000 +1000
+++ .26895-linux-2.5.38.updated/net/ipv4/ipconfig.c 2002-09-25 07:17:08.000000000 +1000
@@ -1320,7 +1320,7 @@ static int __init ic_proto_name(char *na
         return 0;
 }
 
-static int __init ip_auto_config_setup(char *addrs)
+static int __init ip_auto_config_setup(char *addrs, struct kernel_param *kp)
 {
         char *cp, *ip, *dp;
         int num = 0;
@@ -1331,10 +1331,10 @@ static int __init ip_auto_config_setup(c
                 (strcmp(addrs, "off") != 0) &&
                 (strcmp(addrs, "none") != 0));
         if (!ic_enable)
- return 1;
+ return 0;
 
         if (ic_proto_name(addrs))
- return 1;
+ return 0;
 
         /* Parse the whole string */
         ip = addrs;
@@ -1383,7 +1383,7 @@ static int __init ip_auto_config_setup(c
                 num++;
         }
 
- return 1;
+ return 0;
 }
 
 static int __init nfsaddrs_config_setup(char *addrs)
@@ -1391,5 +1391,9 @@ static int __init nfsaddrs_config_setup(
         return ip_auto_config_setup(addrs);
 }
 
-__setup("ip=", ip_auto_config_setup);
-__setup("nfsaddrs=", nfsaddrs_config_setup);
+/* We want top level for backwards compat. */
+#undef PARAM_PREFIX
+#define PARAM_PREFIX ""
+
+PARAM_CALL(ip, ip_auto_config_setup, NULL, NULL, 000);
+PARAM_CALL(nfsaddrs, nfsaddrs_config_setup, NULL, NULL, 000);

--
  Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Sep 30 2002 - 22:00:21 EST