diff options
Diffstat (limited to 'init/main.c')
-rw-r--r-- | init/main.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/init/main.c b/init/main.c index 4e88bddfbebf..4e9e92bb2b89 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -121,8 +121,12 @@ extern void time_init(void); | |||
121 | void (*late_time_init)(void); | 121 | void (*late_time_init)(void); |
122 | extern void softirq_init(void); | 122 | extern 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. */ |
125 | char saved_command_line[COMMAND_LINE_SIZE]; | 125 | char __initdata boot_command_line[COMMAND_LINE_SIZE]; |
126 | /* Untouched saved command line (eg. for /proc) */ | ||
127 | char *saved_command_line; | ||
128 | /* Command line for parameter parsing */ | ||
129 | static char *static_command_line; | ||
126 | 130 | ||
127 | static char *execute_command; | 131 | static char *execute_command; |
128 | static char *ramdisk_execute_command; | 132 | static 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 | */ | ||
412 | static 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()) { |