diff options
author | Michael Brown <mcb30@ipxe.org> | 2021-02-17 17:07:12 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2021-02-17 17:14:19 +0000 |
commit | d562339fcaf1bf5fb2e27f7c465e8633804c30b5 (patch) | |
tree | bc0a1335d1b2f8a99a97533e61a453ba58e6b484 | |
parent | e39cd79a00b1b353f47836f1144d28268c541ed6 (diff) | |
download | ipxe-d562339fcaf1bf5fb2e27f7c465e8633804c30b5.tar.gz |
[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>
-rw-r--r-- | src/interface/efi/efiprefix.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/src/interface/efi/efiprefix.c b/src/interface/efi/efiprefix.c index 928f41c72..47fbe79aa 100644 --- a/src/interface/efi/efiprefix.c +++ b/src/interface/efi/efiprefix.c @@ -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(); @@ -77,6 +72,25 @@ EFI_STATUS EFIAPI _efi_start ( EFI_HANDLE image_handle, } /** + * 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 * * @v rootdev EFI root device |