linux/arch/mn10300
Akira Takeuchi e3f12a5304 mn10300: Use early_param() to parse "mem=" parameter
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 026cee0 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: David Howells <dhowells@redhat.com>
2013-06-28 16:53:03 +01:00
..
boot MN10300: And Panasonic AM34 subarch and implement SMP 2010-10-27 17:28:55 +01:00
configs cgroup: remove the ns_cgroup 2011-05-26 17:12:34 -07:00
include mn10300: Allow to pass array name to get_user() 2013-06-28 16:53:01 +01:00
kernel mn10300: Use early_param() to parse "mem=" parameter 2013-06-28 16:53:03 +01:00
lib Disintegrate asm/system.h for MN10300 2012-03-28 18:30:02 +01:00
mm mm/mn10300: use common help functions to free reserved pages 2013-04-29 15:54:30 -07:00
oprofile MN10300: Kill MN10300's own profiling Kconfig 2009-04-09 10:53:16 -07:00
proc-mn2ws0050 Disintegrate asm/system.h for MN10300 2012-03-28 18:30:02 +01:00
proc-mn103e010 MN10300: Create general kernel debugger cache flushing 2011-03-18 16:54:30 +00:00
unit-asb2303 mn10300: move setup_jiffies_interrupt() to cevt-mn10300.c 2012-07-11 16:04:41 -07:00
unit-asb2305 MN10300: ASB2305's PCI code needs the definition of XIRQ1 2013-05-30 13:38:48 +09:00
unit-asb2364 mn10300: move setup_jiffies_interrupt() to cevt-mn10300.c 2012-07-11 16:04:41 -07:00
Kconfig idle: Remove GENERIC_IDLE_LOOP config switch 2013-04-17 10:39:38 +02:00
Kconfig.debug MN10300: Deprecate gdbstub 2011-03-18 16:54:32 +00:00
Makefile mn10300: only add -mmem-funcs to KBUILD_CFLAGS if gcc supports it 2012-10-06 03:04:36 +09:00