Skip to content

Commit bf51432

Browse files
bp3tk0vKAGA-KOKO
authored andcommitted
x86/setup: Parse the builtin command line before merging
Commit in Fixes was added as a catch-all for cases where the cmdline is parsed before being merged with the builtin one. And promptly one issue appeared, see Link below. The microcode loader really needs to parse it that early, but the merging happens later. Reshuffling the early boot nightmare^W code to handle that properly would be a painful exercise for another day so do the chicken thing and parse the builtin cmdline too before it has been merged. Fixes: 0c40b1c ("x86/setup: Warn when option parsing is done too early") Reported-by: Mike Lothian <mike@fireburn.co.uk> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/all/20240730152108.GAZqkE5Dfi9AuKllRw@fat_crate.local Link: https://lore.kernel.org/r/20240722152330.GCZp55ck8E_FT4kPnC@fat_crate.local
1 parent bf5641e commit bf51432

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

arch/x86/include/asm/cmdline.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
#ifndef _ASM_X86_CMDLINE_H
33
#define _ASM_X86_CMDLINE_H
44

5+
#include <asm/setup.h>
6+
7+
extern char builtin_cmdline[COMMAND_LINE_SIZE];
8+
59
int cmdline_find_option_bool(const char *cmdline_ptr, const char *option);
610
int cmdline_find_option(const char *cmdline_ptr, const char *option,
711
char *buffer, int bufsize);

arch/x86/kernel/setup.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ unsigned long saved_video_mode;
164164

165165
static char __initdata command_line[COMMAND_LINE_SIZE];
166166
#ifdef CONFIG_CMDLINE_BOOL
167-
static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE;
167+
char builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE;
168168
bool builtin_cmdline_added __ro_after_init;
169169
#endif
170170

arch/x86/lib/cmdline.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -207,18 +207,29 @@ __cmdline_find_option(const char *cmdline, int max_cmdline_size,
207207

208208
int cmdline_find_option_bool(const char *cmdline, const char *option)
209209
{
210-
if (IS_ENABLED(CONFIG_CMDLINE_BOOL))
211-
WARN_ON_ONCE(!builtin_cmdline_added);
210+
int ret;
212211

213-
return __cmdline_find_option_bool(cmdline, COMMAND_LINE_SIZE, option);
212+
ret = __cmdline_find_option_bool(cmdline, COMMAND_LINE_SIZE, option);
213+
if (ret > 0)
214+
return ret;
215+
216+
if (IS_ENABLED(CONFIG_CMDLINE_BOOL) && !builtin_cmdline_added)
217+
return __cmdline_find_option_bool(builtin_cmdline, COMMAND_LINE_SIZE, option);
218+
219+
return ret;
214220
}
215221

216222
int cmdline_find_option(const char *cmdline, const char *option, char *buffer,
217223
int bufsize)
218224
{
219-
if (IS_ENABLED(CONFIG_CMDLINE_BOOL))
220-
WARN_ON_ONCE(!builtin_cmdline_added);
225+
int ret;
226+
227+
ret = __cmdline_find_option(cmdline, COMMAND_LINE_SIZE, option, buffer, bufsize);
228+
if (ret > 0)
229+
return ret;
230+
231+
if (IS_ENABLED(CONFIG_CMDLINE_BOOL) && !builtin_cmdline_added)
232+
return __cmdline_find_option(builtin_cmdline, COMMAND_LINE_SIZE, option, buffer, bufsize);
221233

222-
return __cmdline_find_option(cmdline, COMMAND_LINE_SIZE, option,
223-
buffer, bufsize);
234+
return ret;
224235
}

0 commit comments

Comments
 (0)