diff options
Diffstat (limited to 'init/main.c')
| -rw-r--r-- | init/main.c | 65 | 
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)  void __init parse_early_options(char *cmdline)  { -	parse_args("early options", cmdline, NULL, 0, do_early_param); +	parse_args("early options", cmdline, NULL, 0, 0, 0, do_early_param);  }  /* Arch code calls this early on, or if not, just before other parsing. */ @@ -503,7 +503,7 @@ asmlinkage void __init start_kernel(void)  	parse_early_param();  	parse_args("Booting kernel", static_command_line, __start___param,  		   __stop___param - __start___param, -		   &unknown_bootoption); +		   0, 0, &unknown_bootoption);  	jump_label_init(); @@ -699,16 +699,69 @@ int __init_or_module do_one_initcall(initcall_t fn)  } -extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[]; +extern initcall_t __initcall_start[]; +extern initcall_t __initcall0_start[]; +extern initcall_t __initcall1_start[]; +extern initcall_t __initcall2_start[]; +extern initcall_t __initcall3_start[]; +extern initcall_t __initcall4_start[]; +extern initcall_t __initcall5_start[]; +extern initcall_t __initcall6_start[]; +extern initcall_t __initcall7_start[]; +extern initcall_t __initcall_end[]; + +static initcall_t *initcall_levels[] __initdata = { +	__initcall0_start, +	__initcall1_start, +	__initcall2_start, +	__initcall3_start, +	__initcall4_start, +	__initcall5_start, +	__initcall6_start, +	__initcall7_start, +	__initcall_end, +}; + +static char *initcall_level_names[] __initdata = { +	"early parameters", +	"core parameters", +	"postcore parameters", +	"arch parameters", +	"subsys parameters", +	"fs parameters", +	"device parameters", +	"late parameters", +}; + +static int __init ignore_unknown_bootoption(char *param, char *val) +{ +	return 0; +} -static void __init do_initcalls(void) +static void __init do_initcall_level(int level)  { +	extern const struct kernel_param __start___param[], __stop___param[];  	initcall_t *fn; -	for (fn = __early_initcall_end; fn < __initcall_end; fn++) +	strcpy(static_command_line, saved_command_line); +	parse_args(initcall_level_names[level], +		   static_command_line, __start___param, +		   __stop___param - __start___param, +		   level, level, +		   ignore_unknown_bootoption); + +	for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)  		do_one_initcall(*fn);  } +static void __init do_initcalls(void) +{ +	int level; + +	for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++) +		do_initcall_level(level); +} +  /*   * Ok, the machine is now initialized. None of the devices   * have been touched yet, but the CPU subsystem is up and @@ -732,7 +785,7 @@ static void __init do_pre_smp_initcalls(void)  {  	initcall_t *fn; -	for (fn = __initcall_start; fn < __early_initcall_end; fn++) +	for (fn = __initcall_start; fn < __initcall0_start; fn++)  		do_one_initcall(*fn);  }  |