Commit cf6b8366 authored by Ard Biesheuvel's avatar Ard Biesheuvel

efi/libstub: Make initrd file loader configurable

Loading an initrd passed via the kernel command line is deprecated: it
is limited to files that reside in the same volume as the one the kernel
itself was loaded from, and we have more flexible ways to achieve the
same. So make it configurable so new architectures can decide not to
enable it.
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
parent 2e0eb483
...@@ -124,6 +124,17 @@ config EFI_ARMSTUB_DTB_LOADER ...@@ -124,6 +124,17 @@ config EFI_ARMSTUB_DTB_LOADER
functionality for bootloaders that do not have such support functionality for bootloaders that do not have such support
this option is necessary. this option is necessary.
config EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER
bool "Enable the command line initrd loader"
depends on EFI_GENERIC_STUB
default y
help
Select this config option to add support for the initrd= command
line parameter, allowing an initrd that resides on the same volume
as the kernel image to be loaded into memory.
This method is deprecated.
config EFI_BOOTLOADER_CONTROL config EFI_BOOTLOADER_CONTROL
tristate "EFI Bootloader Control" tristate "EFI Bootloader Control"
depends on EFI_VARS depends on EFI_VARS
......
...@@ -651,15 +651,35 @@ efi_status_t efi_parse_options(char const *cmdline); ...@@ -651,15 +651,35 @@ efi_status_t efi_parse_options(char const *cmdline);
efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto, efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto,
unsigned long size); unsigned long size);
efi_status_t efi_load_dtb(efi_loaded_image_t *image, efi_status_t handle_cmdline_files(efi_loaded_image_t *image,
unsigned long *load_addr, const efi_char16_t *optstr,
unsigned long *load_size); int optstr_size,
unsigned long soft_limit,
efi_status_t efi_load_initrd(efi_loaded_image_t *image, unsigned long hard_limit,
unsigned long *load_addr, unsigned long *load_addr,
unsigned long *load_size, unsigned long *load_size);
unsigned long soft_limit,
unsigned long hard_limit);
static inline efi_status_t efi_load_dtb(efi_loaded_image_t *image,
unsigned long *load_addr,
unsigned long *load_size)
{
return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2,
ULONG_MAX, ULONG_MAX, load_addr, load_size);
}
static inline efi_status_t efi_load_initrd(efi_loaded_image_t *image,
unsigned long *load_addr,
unsigned long *load_size,
unsigned long soft_limit,
unsigned long hard_limit)
{
if (!IS_ENABLED(CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER))
return EFI_SUCCESS;
return handle_cmdline_files(image, L"initrd=", sizeof(L"initrd=") - 2,
soft_limit, hard_limit, load_addr, load_size);
}
efi_status_t efi_load_initrd_dev_path(unsigned long *load_addr, efi_status_t efi_load_initrd_dev_path(unsigned long *load_addr,
unsigned long *load_size, unsigned long *load_size,
......
...@@ -121,13 +121,13 @@ static int find_file_option(const efi_char16_t *cmdline, int cmdline_len, ...@@ -121,13 +121,13 @@ static int find_file_option(const efi_char16_t *cmdline, int cmdline_len,
* We only support loading a file from the same filesystem as * We only support loading a file from the same filesystem as
* the kernel image. * the kernel image.
*/ */
static efi_status_t handle_cmdline_files(efi_loaded_image_t *image, efi_status_t handle_cmdline_files(efi_loaded_image_t *image,
const efi_char16_t *optstr, const efi_char16_t *optstr,
int optstr_size, int optstr_size,
unsigned long soft_limit, unsigned long soft_limit,
unsigned long hard_limit, unsigned long hard_limit,
unsigned long *load_addr, unsigned long *load_addr,
unsigned long *load_size) unsigned long *load_size)
{ {
const efi_char16_t *cmdline = image->load_options; const efi_char16_t *cmdline = image->load_options;
int cmdline_len = image->load_options_size / 2; int cmdline_len = image->load_options_size / 2;
...@@ -239,21 +239,3 @@ static efi_status_t handle_cmdline_files(efi_loaded_image_t *image, ...@@ -239,21 +239,3 @@ static efi_status_t handle_cmdline_files(efi_loaded_image_t *image,
efi_free(alloc_size, alloc_addr); efi_free(alloc_size, alloc_addr);
return status; return status;
} }
efi_status_t efi_load_dtb(efi_loaded_image_t *image,
unsigned long *load_addr,
unsigned long *load_size)
{
return handle_cmdline_files(image, L"dtb=", sizeof(L"dtb=") - 2,
ULONG_MAX, ULONG_MAX, load_addr, load_size);
}
efi_status_t efi_load_initrd(efi_loaded_image_t *image,
unsigned long *load_addr,
unsigned long *load_size,
unsigned long soft_limit,
unsigned long hard_limit)
{
return handle_cmdline_files(image, L"initrd=", sizeof(L"initrd=") - 2,
soft_limit, hard_limit, load_addr, load_size);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment