]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Defer autoboot link-layer address and autoexec script probing
authorMichael Brown <mcb30@ipxe.org>
Wed, 17 Feb 2021 17:07:12 +0000 (17:07 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 17 Feb 2021 17:14:19 +0000 (17:14 +0000)
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>
src/interface/efi/efiprefix.c

index 928f41c729f3e42056b758f76d8ddfbee9a9226d..47fbe79aabff779e6973bfadd922211896acc067 100644 (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
  *