aboutsummaryrefslogtreecommitdiffstats
path: root/init/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'init/main.c')
-rw-r--r--init/main.c65
1 files changed, 59 insertions, 6 deletions
diff --git a/init/main.c b/init/main.c
index c24805c824b9..439715858ba0 100644
--- a/init/main.c
+++ b/init/main.c
@@ -400,7 +400,7 @@ static int __init do_early_param(char *param, char *val)
400 400
401void __init parse_early_options(char *cmdline) 401void __init parse_early_options(char *cmdline)
402{ 402{
403 parse_args("early options", cmdline, NULL, 0, do_early_param); 403 parse_args("early options", cmdline, NULL, 0, 0, 0, do_early_param);
404} 404}
405 405
406/* Arch code calls this early on, or if not, just before other parsing. */ 406/* Arch code calls this early on, or if not, just before other parsing. */
@@ -503,7 +503,7 @@ asmlinkage void __init start_kernel(void)
503 parse_early_param(); 503 parse_early_param();
504 parse_args("Booting kernel", static_command_line, __start___param, 504 parse_args("Booting kernel", static_command_line, __start___param,
505 __stop___param - __start___param, 505 __stop___param - __start___param,
506 &unknown_bootoption); 506 0, 0, &unknown_bootoption);
507 507
508 jump_label_init(); 508 jump_label_init();
509 509
@@ -699,16 +699,69 @@ int __init_or_module do_one_initcall(initcall_t fn)
699} 699}
700 700
701 701
702extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[]; 702extern initcall_t __initcall_start[];
703extern initcall_t __initcall0_start[];
704extern initcall_t __initcall1_start[];
705extern initcall_t __initcall2_start[];
706extern initcall_t __initcall3_start[];
707extern initcall_t __initcall4_start[];
708extern initcall_t __initcall5_start[];
709extern initcall_t __initcall6_start[];
710extern initcall_t __initcall7_start[];
711extern initcall_t __initcall_end[];
712
713static initcall_t *initcall_levels[] __initdata = {
714 __initcall0_start,
715 __initcall1_start,
716 __initcall2_start,
717 __initcall3_start,
718 __initcall4_start,
719 __initcall5_start,
720 __initcall6_start,
721 __initcall7_start,
722 __initcall_end,
723};
724
725static char *initcall_level_names[] __initdata = {
726 "early parameters",
727 "core parameters",
728 "postcore parameters",
729 "arch parameters",
730 "subsys parameters",
731 "fs parameters",
732 "device parameters",
733 "late parameters",
734};
735
736static int __init ignore_unknown_bootoption(char *param, char *val)
737{
738 return 0;
739}
703 740
704static void __init do_initcalls(void) 741static void __init do_initcall_level(int level)
705{ 742{
743 extern const struct kernel_param __start___param[], __stop___param[];
706 initcall_t *fn; 744 initcall_t *fn;
707 745
708 for (fn = __early_initcall_end; fn < __initcall_end; fn++) 746 strcpy(static_command_line, saved_command_line);
747 parse_args(initcall_level_names[level],
748 static_command_line, __start___param,
749 __stop___param - __start___param,
750 level, level,
751 ignore_unknown_bootoption);
752
753 for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
709 do_one_initcall(*fn); 754 do_one_initcall(*fn);
710} 755}
711 756
757static void __init do_initcalls(void)
758{
759 int level;
760
761 for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++)
762 do_initcall_level(level);
763}
764
712/* 765/*
713 * Ok, the machine is now initialized. None of the devices 766 * Ok, the machine is now initialized. None of the devices
714 * have been touched yet, but the CPU subsystem is up and 767 * have been touched yet, but the CPU subsystem is up and
@@ -732,7 +785,7 @@ static void __init do_pre_smp_initcalls(void)
732{ 785{
733 initcall_t *fn; 786 initcall_t *fn;
734 787
735 for (fn = __initcall_start; fn < __early_initcall_end; fn++) 788 for (fn = __initcall_start; fn < __initcall0_start; fn++)
736 do_one_initcall(*fn); 789 do_one_initcall(*fn);
737} 790}
738 791