|
@@ -123,6 +123,7 @@ extern void softirq_init(void);
|
|
|
char saved_command_line[COMMAND_LINE_SIZE];
|
|
|
|
|
|
static char *execute_command;
|
|
|
+static char *ramdisk_execute_command;
|
|
|
|
|
|
/* Setup configured maximum number of CPUs to activate */
|
|
|
static unsigned int max_cpus = NR_CPUS;
|
|
@@ -297,6 +298,18 @@ static int __init init_setup(char *str)
|
|
|
}
|
|
|
__setup("init=", init_setup);
|
|
|
|
|
|
+static int __init rdinit_setup(char *str)
|
|
|
+{
|
|
|
+ unsigned int i;
|
|
|
+
|
|
|
+ ramdisk_execute_command = str;
|
|
|
+ /* See "auto" comment in init_setup */
|
|
|
+ for (i = 1; i < MAX_INIT_ARGS; i++)
|
|
|
+ argv_init[i] = NULL;
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+__setup("rdinit=", rdinit_setup);
|
|
|
+
|
|
|
extern void setup_arch(char **);
|
|
|
|
|
|
#ifndef CONFIG_SMP
|
|
@@ -681,10 +694,14 @@ static int init(void * unused)
|
|
|
* check if there is an early userspace init. If yes, let it do all
|
|
|
* the work
|
|
|
*/
|
|
|
- if (sys_access((const char __user *) "/init", 0) == 0)
|
|
|
- execute_command = "/init";
|
|
|
- else
|
|
|
+
|
|
|
+ if (!ramdisk_execute_command)
|
|
|
+ ramdisk_execute_command = "/init";
|
|
|
+
|
|
|
+ if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {
|
|
|
+ ramdisk_execute_command = NULL;
|
|
|
prepare_namespace();
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Ok, we have completed the initial bootup, and
|
|
@@ -701,7 +718,13 @@ static int init(void * unused)
|
|
|
|
|
|
(void) sys_dup(0);
|
|
|
(void) sys_dup(0);
|
|
|
-
|
|
|
+
|
|
|
+ if (ramdisk_execute_command) {
|
|
|
+ run_init_process(ramdisk_execute_command);
|
|
|
+ printk(KERN_WARNING "Failed to execute %s\n",
|
|
|
+ ramdisk_execute_command);
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* We try each of these until one succeeds.
|
|
|
*
|