- Add a check to warn when cmdline parsing happens before the final cmdline
string has been built and thus arguments can get lost - Code cleanups and simplifications -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEzv7L6UO9uDPlPSfHEsHwGGHeVUoFAmaVAgQACgkQEsHwGGHe VUrXsxAAsnJiihOXaU/VPfuRx5d/URufo1HxLPjR5D0YXuzCEbFUS3/9UleAsg0Z h/hKBPtC4o9OJWqo1EIbpmCaIqMxuYZgLEQ1n2tx60FGFVfY/9H8PmqPSgMdeoPC HBseXzLzNy6BWeIbRIc3FCk1MF1HR83hs1aiaCJVBm19kmz4n4aZ4zRr4CNIug+0 6kNtLWiNYW2kw6J/2zoIStVkScIzxIFcMVz7KgA4S6RIOPLaints9Nf4jNl2mp5n UEZy9OQEgf8h+3KI5dB5uUhckuteQSSeL6K0YJ869pRN63hOtU7MCc8PSgMpPAbX 4s/wKYRp2l4EfEOVCJimFs/yJKeIDjOW0ivuKJ/5DvqtyXG5PMBdt8HCBlpUb/cr Qi4dd4/u1pUk/vJpykZq/5H6zDWym2Q2WDjOCE8K2DOi3YBY+Ia7HrBXSyQyYAJ6 Rq8Xu6Lq+Lqgg9/7HZizoc8y6wRyzhuYpkqJWvLN57rJ5dNNKKuJyuwCyAupw4o1 b4gfQ5KgUyG8VAs7dSqhEBzL8zrXZlbOhkeDXUUHtKw6AxS9p4LDIzKVwc6QHdAe 0V2soGoAYv24RoAEUeVEeaIHMkKdq600W/9yNFzogNvRvFyXp+jXCR3kCtNz6TJ2 VvioFlJw4y99UPguKi/nzyTA1EdAVVhYYgl39wTnMDOQHxSv2o0= =GWkn -----END PGP SIGNATURE----- Merge tag 'x86_boot_for_v6.11_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull x86 boot updates from Borislav Petkov: - Add a check to warn when cmdline parsing happens before the final cmdline string has been built and thus arguments can get lost - Code cleanups and simplifications * tag 'x86_boot_for_v6.11_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/setup: Warn when option parsing is done too early x86/boot: Clean up the arch/x86/boot/main.c code a bit x86/boot: Use current_stack_pointer to avoid asm() in init_heap()
This commit is contained in:
commit
4578d072fa
@ -27,34 +27,32 @@ char *heap_end = _end; /* Default end of heap = no heap */
|
||||
* screws up the old-style command line protocol, adjust by
|
||||
* filling in the new-style command line pointer instead.
|
||||
*/
|
||||
|
||||
static void copy_boot_params(void)
|
||||
{
|
||||
struct old_cmdline {
|
||||
u16 cl_magic;
|
||||
u16 cl_offset;
|
||||
};
|
||||
const struct old_cmdline * const oldcmd =
|
||||
absolute_pointer(OLD_CL_ADDRESS);
|
||||
const struct old_cmdline * const oldcmd = absolute_pointer(OLD_CL_ADDRESS);
|
||||
|
||||
BUILD_BUG_ON(sizeof(boot_params) != 4096);
|
||||
memcpy(&boot_params.hdr, &hdr, sizeof(hdr));
|
||||
|
||||
if (!boot_params.hdr.cmd_line_ptr &&
|
||||
oldcmd->cl_magic == OLD_CL_MAGIC) {
|
||||
/* Old-style command line protocol. */
|
||||
if (!boot_params.hdr.cmd_line_ptr && oldcmd->cl_magic == OLD_CL_MAGIC) {
|
||||
/* Old-style command line protocol */
|
||||
u16 cmdline_seg;
|
||||
|
||||
/* Figure out if the command line falls in the region
|
||||
of memory that an old kernel would have copied up
|
||||
to 0x90000... */
|
||||
/*
|
||||
* Figure out if the command line falls in the region
|
||||
* of memory that an old kernel would have copied up
|
||||
* to 0x90000...
|
||||
*/
|
||||
if (oldcmd->cl_offset < boot_params.hdr.setup_move_size)
|
||||
cmdline_seg = ds();
|
||||
else
|
||||
cmdline_seg = 0x9000;
|
||||
|
||||
boot_params.hdr.cmd_line_ptr =
|
||||
(cmdline_seg << 4) + oldcmd->cl_offset;
|
||||
boot_params.hdr.cmd_line_ptr = (cmdline_seg << 4) + oldcmd->cl_offset;
|
||||
}
|
||||
}
|
||||
|
||||
@ -66,6 +64,7 @@ static void copy_boot_params(void)
|
||||
static void keyboard_init(void)
|
||||
{
|
||||
struct biosregs ireg, oreg;
|
||||
|
||||
initregs(&ireg);
|
||||
|
||||
ireg.ah = 0x02; /* Get keyboard status */
|
||||
@ -83,8 +82,10 @@ static void query_ist(void)
|
||||
{
|
||||
struct biosregs ireg, oreg;
|
||||
|
||||
/* Some older BIOSes apparently crash on this call, so filter
|
||||
it from machines too old to have SpeedStep at all. */
|
||||
/*
|
||||
* Some older BIOSes apparently crash on this call, so filter
|
||||
* it from machines too old to have SpeedStep at all.
|
||||
*/
|
||||
if (cpu.level < 6)
|
||||
return;
|
||||
|
||||
@ -119,17 +120,13 @@ static void init_heap(void)
|
||||
char *stack_end;
|
||||
|
||||
if (boot_params.hdr.loadflags & CAN_USE_HEAP) {
|
||||
asm("leal %n1(%%esp),%0"
|
||||
: "=r" (stack_end) : "i" (STACK_SIZE));
|
||||
|
||||
heap_end = (char *)
|
||||
((size_t)boot_params.hdr.heap_end_ptr + 0x200);
|
||||
stack_end = (char *) (current_stack_pointer - STACK_SIZE);
|
||||
heap_end = (char *) ((size_t)boot_params.hdr.heap_end_ptr + 0x200);
|
||||
if (heap_end > stack_end)
|
||||
heap_end = stack_end;
|
||||
} else {
|
||||
/* Boot protocol 2.00 only, no heap available */
|
||||
puts("WARNING: Ancient bootloader, some functionality "
|
||||
"may be limited!\n");
|
||||
puts("WARNING: Ancient bootloader, some functionality may be limited!\n");
|
||||
}
|
||||
}
|
||||
|
||||
@ -150,12 +147,11 @@ void main(void)
|
||||
|
||||
/* Make sure we have all the proper CPU support */
|
||||
if (validate_cpu()) {
|
||||
puts("Unable to boot - please use a kernel appropriate "
|
||||
"for your CPU.\n");
|
||||
puts("Unable to boot - please use a kernel appropriate for your CPU.\n");
|
||||
die();
|
||||
}
|
||||
|
||||
/* Tell the BIOS what CPU mode we intend to run in. */
|
||||
/* Tell the BIOS what CPU mode we intend to run in */
|
||||
set_bios_mode();
|
||||
|
||||
/* Detect memory layout */
|
||||
|
@ -28,6 +28,8 @@
|
||||
#define NEW_CL_POINTER 0x228 /* Relative to real mode data */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/cache.h>
|
||||
|
||||
#include <asm/bootparam.h>
|
||||
#include <asm/x86_init.h>
|
||||
|
||||
@ -133,6 +135,12 @@ asmlinkage void __init __noreturn x86_64_start_reservations(char *real_mode_data
|
||||
#endif /* __i386__ */
|
||||
#endif /* _SETUP */
|
||||
|
||||
#ifdef CONFIG_CMDLINE_BOOL
|
||||
extern bool builtin_cmdline_added __ro_after_init;
|
||||
#else
|
||||
#define builtin_cmdline_added 0
|
||||
#endif
|
||||
|
||||
#else /* __ASSEMBLY */
|
||||
|
||||
.macro __RESERVE_BRK name, size
|
||||
|
@ -165,6 +165,7 @@ unsigned long saved_video_mode;
|
||||
static char __initdata command_line[COMMAND_LINE_SIZE];
|
||||
#ifdef CONFIG_CMDLINE_BOOL
|
||||
static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE;
|
||||
bool builtin_cmdline_added __ro_after_init;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
|
||||
@ -765,6 +766,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
strscpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
|
||||
}
|
||||
#endif
|
||||
builtin_cmdline_added = true;
|
||||
#endif
|
||||
|
||||
strscpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
|
||||
|
@ -6,8 +6,10 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ctype.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/cmdline.h>
|
||||
#include <asm/bug.h>
|
||||
|
||||
static inline int myisspace(u8 c)
|
||||
{
|
||||
@ -205,12 +207,18 @@ __cmdline_find_option(const char *cmdline, int max_cmdline_size,
|
||||
|
||||
int cmdline_find_option_bool(const char *cmdline, const char *option)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_CMDLINE_BOOL))
|
||||
WARN_ON_ONCE(!builtin_cmdline_added);
|
||||
|
||||
return __cmdline_find_option_bool(cmdline, COMMAND_LINE_SIZE, option);
|
||||
}
|
||||
|
||||
int cmdline_find_option(const char *cmdline, const char *option, char *buffer,
|
||||
int bufsize)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_CMDLINE_BOOL))
|
||||
WARN_ON_ONCE(!builtin_cmdline_added);
|
||||
|
||||
return __cmdline_find_option(cmdline, COMMAND_LINE_SIZE, option,
|
||||
buffer, bufsize);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user