]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Fetch device path for loaded image during initialisation
authorMichael Brown <mcb30@ipxe.org>
Wed, 27 Mar 2013 21:23:21 +0000 (21:23 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 27 Mar 2013 21:23:21 +0000 (21:23 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/include/ipxe/efi/efi.h
src/interface/efi/efi_init.c

index 46b66690dc607216385efa0aab525baf3080146a..3aaac60eed018309b557f3a98c6f1e966aa54a82 100644 (file)
@@ -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 );
index 48cac538f4f7990223deffb5f6919f8b9731ca38..e40de4dd59ec8ea3770272568932d13f5905fb87 100644 (file)
@@ -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>
 
@@ -31,6 +32,9 @@ 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;
 
@@ -38,6 +42,10 @@ 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;
 
@@ -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;
@@ -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 ) {
@@ -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