aboutsummaryrefslogtreecommitdiffstats
path: root/init/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'init/main.c')
-rw-r--r--init/main.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/init/main.c b/init/main.c
index 4e88bddfbeb..4e9e92bb2b8 100644
--- a/init/main.c
+++ b/init/main.c
@@ -121,8 +121,12 @@ extern void time_init(void);
121void (*late_time_init)(void); 121void (*late_time_init)(void);
122extern void softirq_init(void); 122extern void softirq_init(void);
123 123
124/* Untouched command line (eg. for /proc) saved by arch-specific code. */ 124/* Untouched command line saved by arch-specific code. */
125char saved_command_line[COMMAND_LINE_SIZE]; 125char __initdata boot_command_line[COMMAND_LINE_SIZE];
126/* Untouched saved command line (eg. for /proc) */
127char *saved_command_line;
128/* Command line for parameter parsing */
129static char *static_command_line;
126 130
127static char *execute_command; 131static char *execute_command;
128static char *ramdisk_execute_command; 132static char *ramdisk_execute_command;
@@ -400,6 +404,20 @@ static void __init smp_init(void)
400#endif 404#endif
401 405
402/* 406/*
407 * We need to store the untouched command line for future reference.
408 * We also need to store the touched command line since the parameter
409 * parsing is performed in place, and we should allow a component to
410 * store reference of name/value for future reference.
411 */
412static void __init setup_command_line(char *command_line)
413{
414 saved_command_line = alloc_bootmem(strlen (boot_command_line)+1);
415 static_command_line = alloc_bootmem(strlen (command_line)+1);
416 strcpy (saved_command_line, boot_command_line);
417 strcpy (static_command_line, command_line);
418}
419
420/*
403 * We need to finalize in a non-__init function or else race conditions 421 * We need to finalize in a non-__init function or else race conditions
404 * between the root thread and the init thread may cause start_kernel to 422 * between the root thread and the init thread may cause start_kernel to
405 * be reaped by free_initmem before the root thread has proceeded to 423 * be reaped by free_initmem before the root thread has proceeded to
@@ -453,7 +471,7 @@ void __init parse_early_param(void)
453 return; 471 return;
454 472
455 /* All fall through to do_early_param. */ 473 /* All fall through to do_early_param. */
456 strlcpy(tmp_cmdline, saved_command_line, COMMAND_LINE_SIZE); 474 strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
457 parse_args("early options", tmp_cmdline, NULL, 0, do_early_param); 475 parse_args("early options", tmp_cmdline, NULL, 0, do_early_param);
458 done = 1; 476 done = 1;
459} 477}
@@ -503,6 +521,7 @@ asmlinkage void __init start_kernel(void)
503 printk(KERN_NOTICE); 521 printk(KERN_NOTICE);
504 printk(linux_banner); 522 printk(linux_banner);
505 setup_arch(&command_line); 523 setup_arch(&command_line);
524 setup_command_line(command_line);
506 unwind_setup(); 525 unwind_setup();
507 setup_per_cpu_areas(); 526 setup_per_cpu_areas();
508 smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ 527 smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
@@ -520,9 +539,9 @@ asmlinkage void __init start_kernel(void)
520 preempt_disable(); 539 preempt_disable();
521 build_all_zonelists(); 540 build_all_zonelists();
522 page_alloc_init(); 541 page_alloc_init();
523 printk(KERN_NOTICE "Kernel command line: %s\n", saved_command_line); 542 printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line);
524 parse_early_param(); 543 parse_early_param();
525 parse_args("Booting kernel", command_line, __start___param, 544 parse_args("Booting kernel", static_command_line, __start___param,
526 __stop___param - __start___param, 545 __stop___param - __start___param,
527 &unknown_bootoption); 546 &unknown_bootoption);
528 if (!irqs_disabled()) { 547 if (!irqs_disabled()) {