• Akira Takeuchi's avatar
    mn10300: Use early_param() to parse "mem=" parameter · e3f12a53
    Akira Takeuchi authored
    This fixes the problem that "init=" options may not be passed to kernel
    correctly.
    
    parse_mem_cmdline() of mn10300 arch gets rid of "mem=" string from
    redboot_command_line. Then init_setup() parses the "init=" options from
    static_command_line, which is a copy of redboot_command_line, and keeps
    the pointer to the init options in execute_command variable.
    
    Since the commit 026cee00 upstream (params: <level>_initcall-like kernel
    parameters), static_command_line becomes overwritten by saved_command_line at
    do_initcall_level(). Notice that saved_command_line is a command line
    which includes "mem=" string.
    
    As a result, execute_command may point to weird string by the length of
    "mem=" parameter.
    I noticed this problem when using the command line like this:
    
        mem=128M console=ttyS0,115200 init=/bin/sh
    
    Here is the processing flow of command line parameters.
        start_kernel()
          setup_arch(&command_line)
             parse_mem_cmdline(cmdline_p)
               * strcpy(boot_command_line, redboot_command_line);
               * Remove "mem=xxx" from redboot_command_line.
               * *cmdline_p = redboot_command_line;
          setup_command_line(command_line) <-- command_line is redboot_command_line
            * strcpy(saved_command_line, boot_command_line)
            * strcpy(static_command_line, command_line)
          parse_early_param()
            strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
            parse_early_options(tmp_cmdline);
              parse_args("early options", cmdline, NULL, 0, 0, 0, do_early_param);
          parse_args("Booting ..", static_command_line, ...);
            init_setup() <-- save the pointer in execute_command
          rest_init()
            kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
    
    At this point, execute_command points to "/bin/sh" string.
    
        kernel_init()
          kernel_init_freeable()
            do_basic_setup()
              do_initcalls()
                do_initcall_level()
                  (*) strcpy(static_command_line, saved_command_line);
    
    Here, execute_command gets to point to "200" string !!
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    e3f12a53
setup.c 6.74 KB