diff options
-rw-r--r-- | Documentation/kernel-parameters.txt | 5 | ||||
-rw-r--r-- | init/main.c | 31 |
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); | |||
123 | char saved_command_line[COMMAND_LINE_SIZE]; | 123 | char saved_command_line[COMMAND_LINE_SIZE]; |
124 | 124 | ||
125 | static char *execute_command; | 125 | static char *execute_command; |
126 | static char *ramdisk_execute_command; | ||
126 | 127 | ||
127 | /* Setup configured maximum number of CPUs to activate */ | 128 | /* Setup configured maximum number of CPUs to activate */ |
128 | static unsigned int max_cpus = NR_CPUS; | 129 | static 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 | ||
301 | static 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 | |||
300 | extern void setup_arch(char **); | 313 | extern 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 | * |