Skip to content

Commit f61900f

Browse files
nivedita76ardbiesheuvel
authored andcommitted
efi/libstub: Unify initrd loading across architectures
Factor out the initrd loading into a common function that can be called both from the generic efi-stub.c and the x86-specific x86-stub.c. Signed-off-by: Arvind Sankar <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Ard Biesheuvel <[email protected]>
1 parent 987053a commit f61900f

File tree

4 files changed

+52
-40
lines changed

4 files changed

+52
-40
lines changed

drivers/firmware/efi/libstub/efi-stub-helper.c

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ static const struct {
331331
* %EFI_OUT_OF_RESOURCES if memory allocation failed
332332
* %EFI_LOAD_ERROR in all other cases
333333
*/
334+
static
334335
efi_status_t efi_load_initrd_dev_path(unsigned long *load_addr,
335336
unsigned long *load_size,
336337
unsigned long max)
@@ -343,9 +344,6 @@ efi_status_t efi_load_initrd_dev_path(unsigned long *load_addr,
343344
efi_handle_t handle;
344345
efi_status_t status;
345346

346-
if (!load_addr || !load_size)
347-
return EFI_INVALID_PARAMETER;
348-
349347
dp = (efi_device_path_protocol_t *)&initrd_dev_path;
350348
status = efi_bs_call(locate_device_path, &lf2_proto_guid, &dp, &handle);
351349
if (status != EFI_SUCCESS)
@@ -375,3 +373,45 @@ efi_status_t efi_load_initrd_dev_path(unsigned long *load_addr,
375373
*load_size = initrd_size;
376374
return EFI_SUCCESS;
377375
}
376+
377+
static
378+
efi_status_t efi_load_initrd_cmdline(efi_loaded_image_t *image,
379+
unsigned long *load_addr,
380+
unsigned long *load_size,
381+
unsigned long soft_limit,
382+
unsigned long hard_limit)
383+
{
384+
if (!IS_ENABLED(CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER) ||
385+
(IS_ENABLED(CONFIG_X86) && (!efi_is_native() || image == NULL))) {
386+
*load_addr = *load_size = 0;
387+
return EFI_SUCCESS;
388+
}
389+
390+
return handle_cmdline_files(image, L"initrd=", sizeof(L"initrd=") - 2,
391+
soft_limit, hard_limit,
392+
load_addr, load_size);
393+
}
394+
395+
efi_status_t efi_load_initrd(efi_loaded_image_t *image,
396+
unsigned long *load_addr,
397+
unsigned long *load_size,
398+
unsigned long soft_limit,
399+
unsigned long hard_limit)
400+
{
401+
efi_status_t status;
402+
403+
if (!load_addr || !load_size)
404+
return EFI_INVALID_PARAMETER;
405+
406+
status = efi_load_initrd_dev_path(load_addr, load_size, hard_limit);
407+
if (status == EFI_SUCCESS) {
408+
efi_info("Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device path\n");
409+
} else if (status == EFI_NOT_FOUND) {
410+
status = efi_load_initrd_cmdline(image, load_addr, load_size,
411+
soft_limit, hard_limit);
412+
if (status == EFI_SUCCESS && *load_size > 0)
413+
efi_info("Loaded initrd from command line option\n");
414+
}
415+
416+
return status;
417+
}

drivers/firmware/efi/libstub/efi-stub.c

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -265,16 +265,8 @@ efi_status_t efi_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg)
265265

266266
if (!efi_noinitrd) {
267267
max_addr = efi_get_max_initrd_addr(dram_base, image_addr);
268-
status = efi_load_initrd_dev_path(&initrd_addr, &initrd_size,
269-
max_addr);
270-
if (status == EFI_SUCCESS) {
271-
efi_info("Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device path\n");
272-
} else if (status == EFI_NOT_FOUND) {
273-
status = efi_load_initrd(image, &initrd_addr, &initrd_size,
274-
ULONG_MAX, max_addr);
275-
if (status == EFI_SUCCESS && initrd_size > 0)
276-
efi_info("Loaded initrd from command line option\n");
277-
}
268+
status = efi_load_initrd(image, &initrd_addr, &initrd_size,
269+
ULONG_MAX, max_addr);
278270
if (status != EFI_SUCCESS)
279271
efi_err("Failed to load initrd!\n");
280272
}

drivers/firmware/efi/libstub/efistub.h

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -677,21 +677,10 @@ static inline efi_status_t efi_load_dtb(efi_loaded_image_t *image,
677677
ULONG_MAX, ULONG_MAX, load_addr, load_size);
678678
}
679679

680-
static inline efi_status_t efi_load_initrd(efi_loaded_image_t *image,
681-
unsigned long *load_addr,
682-
unsigned long *load_size,
683-
unsigned long soft_limit,
684-
unsigned long hard_limit)
685-
{
686-
if (!IS_ENABLED(CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER))
687-
return EFI_SUCCESS;
688-
689-
return handle_cmdline_files(image, L"initrd=", sizeof(L"initrd=") - 2,
690-
soft_limit, hard_limit, load_addr, load_size);
691-
}
692-
693-
efi_status_t efi_load_initrd_dev_path(unsigned long *load_addr,
694-
unsigned long *load_size,
695-
unsigned long max);
680+
efi_status_t efi_load_initrd(efi_loaded_image_t *image,
681+
unsigned long *load_addr,
682+
unsigned long *load_size,
683+
unsigned long soft_limit,
684+
unsigned long hard_limit);
696685

697686
#endif

drivers/firmware/efi/libstub/x86-stub.c

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -755,17 +755,8 @@ unsigned long efi_main(efi_handle_t handle,
755755
if (!efi_noinitrd) {
756756
unsigned long addr, size;
757757

758-
status = efi_load_initrd_dev_path(&addr, &size, ULONG_MAX);
759-
if (status == EFI_NOT_FOUND) {
760-
if (efi_is_native() && image != NULL) {
761-
status = efi_load_initrd(image, &addr, &size,
762-
hdr->initrd_addr_max,
763-
ULONG_MAX);
764-
} else {
765-
addr = size = 0;
766-
status = EFI_SUCCESS;
767-
}
768-
}
758+
status = efi_load_initrd(image, &addr, &size,
759+
hdr->initrd_addr_max, ULONG_MAX);
769760

770761
if (status != EFI_SUCCESS) {
771762
efi_err("Failed to load initrd!\n");

0 commit comments

Comments
 (0)