aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/kernel-parameters.txt5
-rw-r--r--init/main.c31
2 files changed, 32 insertions, 4 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 3d5cd7a09b2f..d2f0c67ba1fb 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -1174,6 +1174,11 @@ running once the system is up.
1174 New name for the ramdisk parameter. 1174 New name for the ramdisk parameter.
1175 See Documentation/ramdisk.txt. 1175 See Documentation/ramdisk.txt.
1176 1176
1177 rdinit= [KNL]
1178 Format: <full_path>
1179 Run specified binary instead of /init from the ramdisk,
1180 used for early userspace startup. See initrd.
1181
1177 reboot= [BUGS=IA-32,BUGS=ARM,BUGS=IA-64] Rebooting mode 1182 reboot= [BUGS=IA-32,BUGS=ARM,BUGS=IA-64] Rebooting mode
1178 Format: <reboot_mode>[,<reboot_mode2>[,...]] 1183 Format: <reboot_mode>[,<reboot_mode2>[,...]]
1179 See arch/*/kernel/reboot.c. 1184 See arch/*/kernel/reboot.c.
diff --git a/init/main.c b/init/main.c
index e4dbcbcd26cf..f142d4035341 100644
--- a/init/main.c
+++ b/init/main.c
@@ -123,6 +123,7 @@ extern void softirq_init(void);
123char saved_command_line[COMMAND_LINE_SIZE]; 123char saved_command_line[COMMAND_LINE_SIZE];
124 124
125static char *execute_command; 125static char *execute_command;
126static char *ramdisk_execute_command;
126 127
127/* Setup configured maximum number of CPUs to activate */ 128/* Setup configured maximum number of CPUs to activate */
128static unsigned int max_cpus = NR_CPUS; 129static unsigned int max_cpus = NR_CPUS;
@@ -297,6 +298,18 @@ static int __init init_setup(char *str)
297} 298}
298__setup("init=", init_setup); 299__setup("init=", init_setup);
299 300
301static int __init rdinit_setup(char *str)
302{
303 unsigned int i;
304
305 ramdisk_execute_command = str;
306 /* See "auto" comment in init_setup */
307 for (i = 1; i < MAX_INIT_ARGS; i++)
308 argv_init[i] = NULL;
309 return 1;
310}
311__setup("rdinit=", rdinit_setup);
312
300extern void setup_arch(char **); 313extern void setup_arch(char **);
301 314
302#ifndef CONFIG_SMP 315#ifndef CONFIG_SMP
@@ -681,10 +694,14 @@ static int init(void * unused)
681 * check if there is an early userspace init. If yes, let it do all 694 * check if there is an early userspace init. If yes, let it do all
682 * the work 695 * the work
683 */ 696 */
684 if (sys_access((const char __user *) "/init", 0) == 0) 697
685 execute_command = "/init"; 698 if (!ramdisk_execute_command)
686 else 699 ramdisk_execute_command = "/init";
700
701 if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {
702 ramdisk_execute_command = NULL;
687 prepare_namespace(); 703 prepare_namespace();
704 }
688 705
689 /* 706 /*
690 * Ok, we have completed the initial bootup, and 707 * Ok, we have completed the initial bootup, and
@@ -701,7 +718,13 @@ static int init(void * unused)
701 718
702 (void) sys_dup(0); 719 (void) sys_dup(0);
703 (void) sys_dup(0); 720 (void) sys_dup(0);
704 721
722 if (ramdisk_execute_command) {
723 run_init_process(ramdisk_execute_command);
724 printk(KERN_WARNING "Failed to execute %s\n",
725 ramdisk_execute_command);
726 }
727
705 /* 728 /*
706 * We try each of these until one succeeds. 729 * We try each of these until one succeeds.
707 * 730 *