mirror of https://github.com/ipxe/ipxe.git
				
				
				
			[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
							parent
							
								
									e39cd79a00
								
							
						
					
					
						commit
						d562339fca
					
				| 
						 | 
				
			
			@ -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
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue