]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/boot: Move kernel cmdline setup earlier in the boot process (again)
authorJulian Stecklina <julian.stecklina@cyberus-technology.de>
Thu, 28 Mar 2024 15:42:12 +0000 (16:42 +0100)
committerIngo Molnar <mingo@kernel.org>
Fri, 29 Mar 2024 07:19:12 +0000 (08:19 +0100)
When split_lock_detect=off (or similar) is specified in
CONFIG_CMDLINE, its effect is lost. The flow is currently this:

setup_arch():
  -> early_cpu_init()
    -> early_identify_cpu()
      -> sld_setup()
-> sld_state_setup()
  -> Looks for split_lock_detect in boot_command_line

  -> e820__memory_setup()

  -> Assemble final command line:
     boot_command_line = builtin_cmdline + boot_cmdline

  -> parse_early_param()

There were earlier attempts at fixing this in:

  8d48bf8206f7 ("x86/boot: Pull up cmdline preparation and early param parsing")

later reverted in:

  fbe618399854 ("Revert "x86/boot: Pull up cmdline preparation and early param parsing"")

... because parse_early_param() can't be called before
e820__memory_setup().

In this patch, we just move the command line concatenation to the
beginning of early_cpu_init(). This should fix sld_state_setup(), while
not running in the same issues as the earlier attempt.

The order is now:

setup_arch():
  -> Assemble final command line:
     boot_command_line = builtin_cmdline + boot_cmdline

  -> early_cpu_init()
    -> early_identify_cpu()
      -> sld_setup()
-> sld_state_setup()
  -> Looks for split_lock_detect in boot_command_line

  -> e820__memory_setup()

  -> parse_early_param()

Signed-off-by: Julian Stecklina <julian.stecklina@cyberus-technology.de>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Kees Cook <keescook@chromium.org>
Cc: linux-kernel@vger.kernel.org
arch/x86/kernel/setup.c

index 3e1e96efadfe7ec8fe5a5499529a9d2913e10722..4c35f1b2a0f4d5aac2fb521b26aafe581be52cce 100644 (file)
@@ -753,6 +753,22 @@ void __init setup_arch(char **cmdline_p)
        boot_cpu_data.x86_phys_bits = MAX_PHYSMEM_BITS;
 #endif
 
+#ifdef CONFIG_CMDLINE_BOOL
+#ifdef CONFIG_CMDLINE_OVERRIDE
+       strscpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
+#else
+       if (builtin_cmdline[0]) {
+               /* append boot loader cmdline to builtin */
+               strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
+               strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
+               strscpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
+       }
+#endif
+#endif
+
+       strscpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
+       *cmdline_p = command_line;
+
        /*
         * If we have OLPC OFW, we might end up relocating the fixmap due to
         * reserve_top(), so do this before touching the ioremap area.
@@ -832,22 +848,6 @@ void __init setup_arch(char **cmdline_p)
        bss_resource.start = __pa_symbol(__bss_start);
        bss_resource.end = __pa_symbol(__bss_stop)-1;
 
-#ifdef CONFIG_CMDLINE_BOOL
-#ifdef CONFIG_CMDLINE_OVERRIDE
-       strscpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
-#else
-       if (builtin_cmdline[0]) {
-               /* append boot loader cmdline to builtin */
-               strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
-               strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
-               strscpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
-       }
-#endif
-#endif
-
-       strscpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
-       *cmdline_p = command_line;
-
        /*
         * x86_configure_nx() is called before parse_early_param() to detect
         * whether hardware doesn't support NX (so that the early EHCI debug