[efi] Defer autoboot link-layer address and autoexec script probing

The code to detect the autoboot link-layer address and to load the
autoexec script currently runs before the call to initialise() and so
has to function without a working heap.

This requirement can be relaxed by deferring this code to run via an
initialisation function.  This gives the code a normal runtime
environment, but still invokes it early enough to guarantee that the
original loaded image device handle has not yet been invalidated.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/265/head
Michael Brown 2021-02-17 17:07:12 +00:00
parent e39cd79a00
commit d562339fca
1 changed files with 20 additions and 6 deletions

View File

@ -22,6 +22,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <stdlib.h>
#include <errno.h>
#include <ipxe/device.h>
#include <ipxe/init.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/efi_driver.h>
#include <ipxe/efi/efi_snp.h>
@ -49,12 +50,6 @@ EFI_STATUS EFIAPI _efi_start ( EFI_HANDLE image_handle,
if ( ( efirc = efi_init ( image_handle, systab ) ) != 0 )
goto err_init;
/* Identify autoboot device, if any */
efi_set_autoboot_ll_addr ( efi_loaded_image->DeviceHandle );
/* Load autoexec script, if any */
efi_autoexec_load ( efi_loaded_image->DeviceHandle );
/* Claim SNP devices for use by iPXE */
efi_snp_claim();
@ -76,6 +71,25 @@ EFI_STATUS EFIAPI _efi_start ( EFI_HANDLE image_handle,
return efirc;
}
/**
* Initialise EFI application
*
*/
static void efi_init_application ( void ) {
EFI_HANDLE device = efi_loaded_image->DeviceHandle;
/* Identify autoboot device, if any */
efi_set_autoboot_ll_addr ( device );
/* Load autoexec script, if any */
efi_autoexec_load ( device );
}
/** EFI application initialisation function */
struct init_fn efi_init_application_fn __init_fn ( INIT_NORMAL ) = {
.initialise = efi_init_application,
};
/**
* Probe EFI root bus
*