efi/libstub: consolidate initrd handling across architectures
Before adding TPM measurement of the initrd contents, refactor the initrd handling slightly to be more self-contained and consistent. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Link: https://lore.kernel.org/r/20211119114745.1560453-4-ilias.apalodimas@linaro.org Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
Родитель
44f155b4b0
Коммит
20287d56f5
|
@ -20,10 +20,10 @@
|
|||
|
||||
bool efi_nochunk;
|
||||
bool efi_nokaslr = !IS_ENABLED(CONFIG_RANDOMIZE_BASE);
|
||||
bool efi_noinitrd;
|
||||
int efi_loglevel = CONSOLE_LOGLEVEL_DEFAULT;
|
||||
bool efi_novamap;
|
||||
|
||||
static bool efi_noinitrd;
|
||||
static bool efi_nosoftreserve;
|
||||
static bool efi_disable_pci_dma = IS_ENABLED(CONFIG_EFI_DISABLE_PCI_DMA);
|
||||
|
||||
|
@ -643,8 +643,10 @@ efi_status_t efi_load_initrd(efi_loaded_image_t *image,
|
|||
{
|
||||
efi_status_t status;
|
||||
|
||||
if (!load_addr || !load_size)
|
||||
return EFI_INVALID_PARAMETER;
|
||||
if (efi_noinitrd) {
|
||||
*load_addr = *load_size = 0;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
status = efi_load_initrd_dev_path(load_addr, load_size, hard_limit);
|
||||
if (status == EFI_SUCCESS) {
|
||||
|
@ -655,7 +657,10 @@ efi_status_t efi_load_initrd(efi_loaded_image_t *image,
|
|||
if (status == EFI_SUCCESS && *load_size > 0)
|
||||
efi_info("Loaded initrd from command line option\n");
|
||||
}
|
||||
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_err("Failed to load initrd: 0x%lx\n", status);
|
||||
*load_addr = *load_size = 0;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
|
@ -134,7 +134,6 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
|
|||
enum efi_secureboot_mode secure_boot;
|
||||
struct screen_info *si;
|
||||
efi_properties_table_t *prop_tbl;
|
||||
unsigned long max_addr;
|
||||
|
||||
efi_system_table = sys_table_arg;
|
||||
|
||||
|
@ -240,13 +239,8 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
|
|||
if (!fdt_addr)
|
||||
efi_info("Generating empty DTB\n");
|
||||
|
||||
if (!efi_noinitrd) {
|
||||
max_addr = efi_get_max_initrd_addr(image_addr);
|
||||
status = efi_load_initrd(image, &initrd_addr, &initrd_size,
|
||||
ULONG_MAX, max_addr);
|
||||
if (status != EFI_SUCCESS)
|
||||
efi_err("Failed to load initrd!\n");
|
||||
}
|
||||
efi_load_initrd(image, &initrd_addr, &initrd_size, ULONG_MAX,
|
||||
efi_get_max_initrd_addr(image_addr));
|
||||
|
||||
efi_random_get_seed();
|
||||
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
|
||||
extern bool efi_nochunk;
|
||||
extern bool efi_nokaslr;
|
||||
extern bool efi_noinitrd;
|
||||
extern int efi_loglevel;
|
||||
extern bool efi_novamap;
|
||||
|
||||
|
|
|
@ -673,6 +673,7 @@ unsigned long efi_main(efi_handle_t handle,
|
|||
unsigned long bzimage_addr = (unsigned long)startup_32;
|
||||
unsigned long buffer_start, buffer_end;
|
||||
struct setup_header *hdr = &boot_params->hdr;
|
||||
unsigned long addr, size;
|
||||
efi_status_t status;
|
||||
|
||||
efi_system_table = sys_table_arg;
|
||||
|
@ -761,23 +762,16 @@ unsigned long efi_main(efi_handle_t handle,
|
|||
* arguments will be processed only if image is not NULL, which will be
|
||||
* the case only if we were loaded via the PE entry point.
|
||||
*/
|
||||
if (!efi_noinitrd) {
|
||||
unsigned long addr, size;
|
||||
|
||||
status = efi_load_initrd(image, &addr, &size,
|
||||
hdr->initrd_addr_max, ULONG_MAX);
|
||||
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_err("Failed to load initrd!\n");
|
||||
status = efi_load_initrd(image, &addr, &size, hdr->initrd_addr_max,
|
||||
ULONG_MAX);
|
||||
if (status != EFI_SUCCESS)
|
||||
goto fail;
|
||||
}
|
||||
if (size > 0) {
|
||||
efi_set_u64_split(addr, &hdr->ramdisk_image,
|
||||
&boot_params->ext_ramdisk_image);
|
||||
efi_set_u64_split(size, &hdr->ramdisk_size,
|
||||
&boot_params->ext_ramdisk_size);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If the boot loader gave us a value for secure_boot then we use that,
|
||||
|
|
Загрузка…
Ссылка в новой задаче