Tom Rini <trini@kernel.crashing.org>

- Remove saved_command_line (and saving of the command line).
- Call parse_early_options
- Convert parse_cmdline into an __early_param for mem= (based on arm).


---

 25-akpm/arch/arm26/kernel/setup.c |   75 ++++++++++++++------------------------
 1 files changed, 29 insertions(+), 46 deletions(-)

diff -puN arch/arm26/kernel/setup.c~early-param-arm26 arch/arm26/kernel/setup.c
--- 25/arch/arm26/kernel/setup.c~early-param-arm26	2004-03-30 19:49:06.872893744 -0800
+++ 25-akpm/arch/arm26/kernel/setup.c	2004-03-30 19:49:06.875893288 -0800
@@ -76,7 +76,6 @@ struct processor processor;
 
 unsigned char aux_device_present;
 char elf_platform[ELF_PLATFORM_SIZE];
-char saved_command_line[COMMAND_LINE_SIZE];
 
 unsigned long phys_initrd_start __initdata = 0;
 unsigned long phys_initrd_size __initdata = 0;
@@ -154,53 +153,38 @@ static void __init setup_processor(void)
 }
 
 /*
- * Initial parsing of the command line.  We need to pick out the
- * memory size.  We look for mem=size@start, where start and size
- * are "size[KkMm]"
+ * Pick out the memory size.  We look for mem=size@start,
+ * where start and size are "size[KkMm]"
  */
-static void __init
-parse_cmdline(struct meminfo *mi, char **cmdline_p, char *from)
+static int __init early_mem(char *p)
 {
-	char c = ' ', *to = command_line;
-	int usermem = 0, len = 0;
+	static int usermem __initdata = 0;
+	unsigned long size, start;
 
-	for (;;) {
-		if (c == ' ' && !memcmp(from, "mem=", 4)) {
-			unsigned long size, start;
-
-			if (to != command_line)
-				to -= 1;
-
-			/*
-			 * If the user specifies memory size, we
-			 * blow away any automatically generated
-			 * size.
-			 */
-			if (usermem == 0) {
-				usermem = 1;
-				mi->nr_banks = 0;
-			}
-
-			start = PHYS_OFFSET;
-			size  = memparse(from + 4, &from);
-			if (*from == '@')
-				start = memparse(from + 1, &from);
-
-			mi->bank[mi->nr_banks].start = start;
-			mi->bank[mi->nr_banks].size  = size;
-			mi->bank[mi->nr_banks].node  = PHYS_TO_NID(start);
-			mi->nr_banks += 1;
-		}
-		c = *from++;
-		if (!c)
-			break;
-		if (COMMAND_LINE_SIZE <= ++len)
-			break;
-		*to++ = c;
+	/*
+	 * The user has specified the memory size for the first time,
+	 * so we blow away any automatically generated size.
+	 */
+	if (usermem == 0) {
+		usermem = 1;
+		mi->nr_banks = 0;
 	}
-	*to = '\0';
-	*cmdline_p = command_line;
+
+	unsigned long size, start;
+
+	start = PHYS_OFFSET;
+	size  = memparse(p, &p);
+	if (*p == '@')
+		start = memparse(p + 1, &p);
+
+	mi->bank[mi->nr_banks].start = start;
+	mi->bank[mi->nr_banks].size  = size;
+	mi->bank[mi->nr_banks].node  = PHYS_TO_NID(start);
+	mi->nr_banks += 1;
+
+	return 0;
 }
+__early_param("mem=", early_mem);
 
 static void __init
 setup_ramdisk(int doload, int prompt, int image_start, unsigned int rd_sz)
@@ -495,9 +479,8 @@ void __init setup_arch(char **cmdline_p)
 	init_mm.end_data   = (unsigned long) &_edata;
 	init_mm.brk	   = (unsigned long) &_end;
 
-	memcpy(saved_command_line, from, COMMAND_LINE_SIZE);
-	saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
-	parse_cmdline(&meminfo, cmdline_p, from);
+	*cmdline_p = from;
+	parse_early_options(cmdline_p);
 	bootmem_init(&meminfo);
 	paging_init(&meminfo);
 	request_standard_resources(&meminfo);

_