Skip to content

Commit

Permalink
[efi] Fetch device path for loaded image during initialisation
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Mar 27, 2013
1 parent 8a49782 commit 6979b7a
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 13 deletions.
1 change: 1 addition & 0 deletions src/include/ipxe/efi/efi.h
Expand Up @@ -127,6 +127,7 @@ struct efi_config_table {

extern EFI_HANDLE efi_image_handle;
extern EFI_LOADED_IMAGE_PROTOCOL *efi_loaded_image;
extern EFI_DEVICE_PATH_PROTOCOL *efi_loaded_image_path;
extern EFI_SYSTEM_TABLE *efi_systab;

extern const char * efi_strerror ( EFI_STATUS efirc );
Expand Down
50 changes: 37 additions & 13 deletions src/interface/efi/efi_init.c
Expand Up @@ -22,6 +22,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#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>

Expand All @@ -31,13 +32,20 @@ EFI_HANDLE efi_image_handle;
/** 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;

/** EFI loaded image protocol GUID */
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;

Expand Down Expand Up @@ -83,8 +91,9 @@ EFI_STATUS efi_init ( EFI_HANDLE image_handle,
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;
Expand All @@ -105,19 +114,7 @@ EFI_STATUS efi_init ( EFI_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 ) {
Expand Down Expand Up @@ -147,6 +144,33 @@ EFI_STATUS efi_init ( EFI_HANDLE image_handle,
}
}

/* 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
Expand Down

0 comments on commit 6979b7a

Please sign in to comment.