#include <string.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/Protocol/LoadedImage.h>
+#include <ipxe/efi/Protocol/DevicePath.h>
#include <ipxe/uuid.h>
#include <ipxe/init.h>
/** Loaded image protocol for this image */
EFI_LOADED_IMAGE_PROTOCOL *efi_loaded_image;
+/** Loaded image protocol device path for this image */
+EFI_DEVICE_PATH_PROTOCOL *efi_loaded_image_path;
+
/** System table passed to entry point */
EFI_SYSTEM_TABLE *efi_systab;
static EFI_GUID efi_loaded_image_protocol_guid
= EFI_LOADED_IMAGE_PROTOCOL_GUID;
+/** EFI loaded image device path protocol GUID */
+static EFI_GUID efi_loaded_image_device_path_protocol_guid
+ = EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL_GUID;
+
/** Event used to signal shutdown */
static EFI_EVENT efi_shutdown_event;
EFI_BOOT_SERVICES *bs;
struct efi_protocol *prot;
struct efi_config_table *tab;
- EFI_STATUS efirc;
void *loaded_image;
+ void *loaded_image_path;
+ EFI_STATUS efirc;
/* Store image handle and system table pointer for future use */
efi_image_handle = image_handle;
return EFI_NOT_AVAILABLE_YET;
}
DBGC ( systab, "EFI handle %p systab %p\n", image_handle, systab );
-
bs = systab->BootServices;
- efirc = bs->OpenProtocol ( image_handle,
- &efi_loaded_image_protocol_guid,
- &loaded_image, image_handle, NULL,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL );
- if ( efirc ) {
- DBGC ( systab, "Could not get loaded image protocol" );
- return efirc;
- }
-
- efi_loaded_image = loaded_image;
- DBG ( "Image base address = %p\n", efi_loaded_image->ImageBase );
/* Look up used protocols */
for_each_table_entry ( prot, EFI_PROTOCOLS ) {
}
}
+ /* Get loaded image protocol */
+ if ( ( efirc = bs->OpenProtocol ( image_handle,
+ &efi_loaded_image_protocol_guid,
+ &loaded_image, image_handle, NULL,
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL ) ) != 0 ) {
+ DBGC ( systab, "EFI could not get loaded image protocol: %s",
+ efi_strerror ( efirc ) );
+ return efirc;
+ }
+ efi_loaded_image = loaded_image;
+ DBGC ( systab, "EFI image base address %p\n",
+ efi_loaded_image->ImageBase );
+
+ /* Get loaded image device path protocol */
+ if ( ( efirc = bs->OpenProtocol ( image_handle,
+ &efi_loaded_image_device_path_protocol_guid,
+ &loaded_image_path, image_handle, NULL,
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL ) ) != 0 ) {
+ DBGC ( systab, "EFI could not get loaded image device path "
+ "protocol: %s", efi_strerror ( efirc ) );
+ return efirc;
+ }
+ efi_loaded_image_path = loaded_image_path;
+ DBGC ( systab, "EFI image device path " );
+ DBGC_EFI_DEVPATH ( systab, efi_loaded_image_path );
+ DBGC ( systab, "\n" );
+
/* EFI is perfectly capable of gracefully shutting down any
* loaded devices if it decides to fall back to a legacy boot.
* For no particularly comprehensible reason, it doesn't