Revision: 17799
          http://sourceforge.net/p/edk2/code/17799
Author:   lgao4
Date:     2015-07-02 04:28:21 +0000 (Thu, 02 Jul 2015)
Log Message:
-----------
MdeModulePkg: Update DxeCore to handle LoadFile DevicePath

UEFI Spec HTTP Boot Device Path, after retrieving the boot resource
information, the BootURI device path node will be updated to include
the BootURI information. It means the device path on the child handle
will be updated after the LoadFile() service is called.

To handle this case, DxeCore LoadImage() service is updated as the below:
1) Get Device handle based on Device Path
2) Call LoadFile() service (GetFileBufferByFilePath() API) to get Load File 
Buffer.
3) Retrieve DevicePath from Device handle

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Liming Gao <[email protected]>
Reviewed-by: Ruiyu Ni <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/Core/Dxe/Image/Image.c

Modified: trunk/edk2/MdeModulePkg/Core/Dxe/Image/Image.c
===================================================================
--- trunk/edk2/MdeModulePkg/Core/Dxe/Image/Image.c      2015-07-02 04:27:54 UTC 
(rev 17798)
+++ trunk/edk2/MdeModulePkg/Core/Dxe/Image/Image.c      2015-07-02 04:28:21 UTC 
(rev 17799)
@@ -1055,8 +1055,11 @@
   UINT32                     AuthenticationStatus;
   EFI_DEVICE_PATH_PROTOCOL   *OriginalFilePath;
   EFI_DEVICE_PATH_PROTOCOL   *HandleFilePath;
+  EFI_DEVICE_PATH_PROTOCOL   *InputFilePath;
+  EFI_DEVICE_PATH_PROTOCOL   *Node;
   UINTN                      FilePathSize;
   BOOLEAN                    ImageIsFromFv;
+  BOOLEAN                    ImageIsFromLoadFile;
 
   SecurityStatus = EFI_SUCCESS;
 
@@ -1079,11 +1082,13 @@
   ZeroMem (&FHand, sizeof (IMAGE_FILE_HANDLE));
   FHand.Signature  = IMAGE_FILE_HANDLE_SIGNATURE;
   OriginalFilePath = FilePath;
+  InputFilePath    = FilePath;
   HandleFilePath   = FilePath;
   DeviceHandle     = NULL;
   Status           = EFI_SUCCESS;
   AuthenticationStatus = 0;
-  ImageIsFromFv    = FALSE;
+  ImageIsFromFv        = FALSE;
+  ImageIsFromLoadFile  = FALSE;
 
   //
   // If the caller passed a copy of the file, then just use it
@@ -1104,7 +1109,34 @@
     if (FilePath == NULL) {
       return EFI_INVALID_PARAMETER;
     }
+
     //
+    // Try to get the image device handle by checking the match protocol.
+    //
+    Node   = NULL;
+    Status = CoreLocateDevicePath (&gEfiFirmwareVolume2ProtocolGuid, 
&HandleFilePath, &DeviceHandle);
+    if (!EFI_ERROR (Status)) {
+      ImageIsFromFv = TRUE;
+    } else {
+      HandleFilePath = FilePath;
+      Status = CoreLocateDevicePath (&gEfiSimpleFileSystemProtocolGuid, 
&HandleFilePath, &DeviceHandle);
+      if (EFI_ERROR (Status)) {
+        if (!BootPolicy) {
+          HandleFilePath = FilePath;
+          Status = CoreLocateDevicePath (&gEfiLoadFile2ProtocolGuid, 
&HandleFilePath, &DeviceHandle);
+        }
+        if (EFI_ERROR (Status)) {
+          HandleFilePath = FilePath;
+          Status = CoreLocateDevicePath (&gEfiLoadFileProtocolGuid, 
&HandleFilePath, &DeviceHandle);
+          if (!EFI_ERROR (Status)) {
+            ImageIsFromLoadFile = TRUE;
+            Node = HandleFilePath;
+          }
+        }
+      }
+    }
+
+    //
     // Get the source file buffer by its device path.
     //
     FHand.Source = GetFileBufferByFilePath (
@@ -1116,26 +1148,12 @@
     if (FHand.Source == NULL) {
       Status = EFI_NOT_FOUND;
     } else {
-      //
-      // Try to get the image device handle by checking the match protocol.
-      //
       FHand.FreeBuffer = TRUE;
-      Status = CoreLocateDevicePath (&gEfiFirmwareVolume2ProtocolGuid, 
&HandleFilePath, &DeviceHandle);
-      if (!EFI_ERROR (Status)) {
-        ImageIsFromFv = TRUE;
-      } else {
-        HandleFilePath = FilePath;
-        Status = CoreLocateDevicePath (&gEfiSimpleFileSystemProtocolGuid, 
&HandleFilePath, &DeviceHandle);
-        if (EFI_ERROR (Status)) {
-          if (!BootPolicy) {
-            HandleFilePath = FilePath;
-            Status = CoreLocateDevicePath (&gEfiLoadFile2ProtocolGuid, 
&HandleFilePath, &DeviceHandle);
-          }
-          if (EFI_ERROR (Status)) {
-            HandleFilePath = FilePath;
-            Status = CoreLocateDevicePath (&gEfiLoadFileProtocolGuid, 
&HandleFilePath, &DeviceHandle);
-          }
-        }
+      if (ImageIsFromLoadFile) {
+        //
+        // LoadFile () may cause the device path of the Handle be updated.
+        //
+        OriginalFilePath = AppendDevicePath (DevicePathFromHandle 
(DeviceHandle), Node);
       }
     }
   }
@@ -1337,6 +1355,9 @@
   if (FHand.FreeBuffer) {
     CoreFreePool (FHand.Source);
   }
+  if (OriginalFilePath != InputFilePath) {
+    CoreFreePool (OriginalFilePath);
+  }
 
   //
   // There was an error.  If there's an Image structure, free it


------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to