From 6730c52cfdb1441d577dbad207423effa5b804b0 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 2 Jun 1999 07:00:13 +0000 Subject: 1999-06-02 Roland McGrath * kern/bootstrap.c (build_args_and_stack): If kernel_cmdline is nonempty, give the bootstrap task an environment variable of "MULTIBOOT_CMDLINE=kernel command line" on its stack. --- kern/bootstrap.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) (limited to 'kern') diff --git a/kern/bootstrap.c b/kern/bootstrap.c index 3643a5c..c3c971d 100644 --- a/kern/bootstrap.c +++ b/kern/bootstrap.c @@ -316,8 +316,8 @@ static void copy_bootstrap(void *e, struct exec_info *boot_exec_info) while (i < lenp) { - vm_fault(user_map, text_page_start +i, - load_protect_text ? + vm_fault(user_map, text_page_start +i, + load_protect_text ? VM_PROT_READ|VM_PROT_EXECUTE : VM_PROT_READ|VM_PROT_EXECUTE | VM_PROT_WRITE, 0,0,0); @@ -351,6 +351,7 @@ static build_args_and_stack(boot_exec_info, va_alist) int arg_item_len; char * string_pos; char * zero = (char *)0; + static const char cmdline_var[] = "MULTIBOOT_CMDLINE="; #define STACK_SIZE (64*1024) @@ -369,6 +370,9 @@ static build_args_and_stack(boot_exec_info, va_alist) } va_end(argv_ptr); + if (kernel_cmdline[0] != '\0') + arg_len += sizeof cmdline_var + strlen (kernel_cmdline); + /* * Add space for: * arg count @@ -378,7 +382,7 @@ static build_args_and_stack(boot_exec_info, va_alist) * and align to integer boundary */ arg_len += sizeof(integer_t) - + (2 + arg_count) * sizeof(char *); + + (3 + arg_count) * sizeof(char *); arg_len = (arg_len + sizeof(integer_t) - 1) & ~(sizeof(integer_t)-1); /* @@ -400,7 +404,7 @@ static build_args_and_stack(boot_exec_info, va_alist) string_pos = arg_pos + sizeof(integer_t) + arg_count * sizeof(char *) - + 2 * sizeof(char *); + + 3 * sizeof(char *); /* * first the argument count @@ -431,10 +435,36 @@ static build_args_and_stack(boot_exec_info, va_alist) va_end(argv_ptr); /* - * last, the trailing 0 argument and a null environment pointer. + * Null terminator for argv. */ (void) copyout((char *)&zero, arg_pos, sizeof(char *)); arg_pos += sizeof(char *); + + /* + * If we have a command line, put it in an environment variable. + */ + if (kernel_cmdline[0] != '\0') { + /* set string pointer */ + (void) copyout((char *)&string_pos, + arg_pos, + sizeof (char *)); + arg_pos += sizeof(char *); + + /* copy string */ + arg_ptr = (char *) cmdline_var; + arg_item_len = sizeof cmdline_var - 1; + (void) copyout(arg_ptr, string_pos, arg_item_len); + string_pos += arg_item_len; + + /* copy string */ + arg_ptr = kernel_cmdline; + arg_item_len = strlen(kernel_cmdline) + 1; + (void) copyout(arg_ptr, string_pos, arg_item_len); + string_pos += arg_item_len; + } + /* + * Null terminator for envp. + */ (void) copyout((char *)&zero, arg_pos, sizeof(char *)); } @@ -483,4 +513,3 @@ static void user_bootstrap() thread_bootstrap_return(); /*NOTREACHED*/ } - -- cgit v1.2.3