This one looks good to me.
Reviewed-by: Sunny Wang <[email protected]>

-----Original Message-----
From: edk2-devel [mailto:[email protected]] On Behalf Of Ruiyu Ni
Sent: Wednesday, February 24, 2016 3:40 PM
To: [email protected]
Cc: Ruiyu Ni; Feng Tian; Eric Dong
Subject: [edk2] [Patch 1/4] MdeModulePkg/Bds: Refine the code to load file from 
FV.

Change BmGetFileBufferByMemmapFv to BmGetFileBufferByFvFilePath.
The original function gets the file buffer only from memory mapped FV device 
path and leaves GUIDed FV device path to the code below; The new function gets 
the file buffer from both formats of FV device paths.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <[email protected]>
Cc: Feng Tian <[email protected]>
Cc: Eric Dong <[email protected]>
---
 MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c | 63 +++++++++++++++---------
 1 file changed, 40 insertions(+), 23 deletions(-)

diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c 
b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
index 7297a1d..a6826f6 100644
--- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
+++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
@@ -1,7 +1,7 @@
 /** @file
   Library functions which relates with booting.
 
-Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.<BR>
 (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>  This program 
and the accompanying materials  are licensed and made available under the terms 
and conditions of the BSD License @@ -244,15 +244,15 @@ 
BmFindBootOptionInVariable (
 
   FV address may change across reboot. This routine promises the FV file 
device path is right.
 
-  @param  DevicePath   The Memory Mapped Device Path to get the file buffer.
+  @param  FilePath     The Memory Mapped Device Path to get the file buffer.
   @param  FullPath     Receive the updated FV Device Path pointint to the file.
   @param  FileSize     Receive the file buffer size.
 
   @return  The file buffer.
 **/
 VOID *
-BmGetFileBufferByMemmapFv (
-  IN EFI_DEVICE_PATH_PROTOCOL      *DevicePath,
+BmGetFileBufferByFvFilePath (
+  IN EFI_DEVICE_PATH_PROTOCOL      *FilePath,
   OUT EFI_DEVICE_PATH_PROTOCOL     **FullPath,
   OUT UINTN                        *FileSize
   )
@@ -267,18 +267,28 @@ BmGetFileBufferByMemmapFv (
   EFI_HANDLE                    *FvHandles;
   EFI_DEVICE_PATH_PROTOCOL      *NewDevicePath;
   VOID                          *FileBuffer;
-
-  FvFileNode = DevicePath;
+
+  //
+  // Get the file buffer by using the exactly FilePath.
+  //
+  FvFileNode = FilePath;
   Status = gBS->LocateDevicePath (&gEfiFirmwareVolume2ProtocolGuid, 
&FvFileNode, &FvHandle);
   if (!EFI_ERROR (Status)) {
-    FileBuffer = GetFileBufferByFilePath (TRUE, DevicePath, FileSize, 
&AuthenticationStatus);
+    FileBuffer = GetFileBufferByFilePath (TRUE, FilePath, FileSize, 
+ &AuthenticationStatus);
     if (FileBuffer != NULL) {
-      *FullPath = DuplicateDevicePath (DevicePath);
+      *FullPath = DuplicateDevicePath (FilePath);
     }
     return FileBuffer;
   }
 
-  FvFileNode = NextDevicePathNode (DevicePath);
+  //
+  // Only wide match other FVs if it's a memory mapped FV file path.
+  //
+  if ((DevicePathType (FilePath) != HARDWARE_DEVICE_PATH) || 
(DevicePathSubType (FilePath) != HW_MEMMAP_DP)) {
+    return NULL;
+  }
+
+  FvFileNode = NextDevicePathNode (FilePath);
 
   //
   // Firstly find the FV file in current FV @@ -289,7 +299,7 @@ 
BmGetFileBufferByMemmapFv (
          (VOID **) &LoadedImage
          );
   NewDevicePath = AppendDevicePathNode (DevicePathFromHandle 
(LoadedImage->DeviceHandle), FvFileNode);
-  FileBuffer = BmGetFileBufferByMemmapFv (NewDevicePath, FullPath, FileSize);
+  FileBuffer = BmGetFileBufferByFvFilePath (NewDevicePath, FullPath, 
+ FileSize);
   FreePool (NewDevicePath);
 
   if (FileBuffer != NULL) {
@@ -314,7 +324,7 @@ BmGetFileBufferByMemmapFv (
       continue;
     }
     NewDevicePath = AppendDevicePathNode (DevicePathFromHandle 
(FvHandles[Index]), FvFileNode);
-    FileBuffer = BmGetFileBufferByMemmapFv (NewDevicePath, FullPath, FileSize);
+    FileBuffer = BmGetFileBufferByFvFilePath (NewDevicePath, FullPath, 
+ FileSize);
     FreePool (NewDevicePath);
   }
   
@@ -325,29 +335,36 @@ BmGetFileBufferByMemmapFv (  }
 
 /**
-  Check if it's a Memory Mapped FV Device Path.
+  Check if it's a Device Path pointing to FV file.
   
   The function doesn't garentee the device path points to existing FV file.
 
   @param  DevicePath     Input device path.
 
-  @retval TRUE   The device path is a Memory Mapped FV Device Path.
-  @retval FALSE  The device path is NOT a Memory Mapped FV Device Path.
+  @retval TRUE   The device path is a FV File Device Path.
+  @retval FALSE  The device path is NOT a FV File Device Path.
 **/
 BOOLEAN
-BmIsMemmapFvFilePath (
+BmIsFvFilePath (
   IN EFI_DEVICE_PATH_PROTOCOL    *DevicePath
   )
 {
-  EFI_DEVICE_PATH_PROTOCOL   *FileNode;
+  EFI_STATUS                     Status;
+  EFI_HANDLE                     Handle;
+  EFI_DEVICE_PATH_PROTOCOL       *Node;
+
+  Node = DevicePath;
+  Status = gBS->LocateDevicePath (&gEfiFirmwareVolume2ProtocolGuid, 
+ &Node, &Handle);  if (!EFI_ERROR (Status)) {
+    return TRUE;
+  }
 
   if ((DevicePathType (DevicePath) == HARDWARE_DEVICE_PATH) && 
(DevicePathSubType (DevicePath) == HW_MEMMAP_DP)) {
-    FileNode = NextDevicePathNode (DevicePath);
-    if ((DevicePathType (FileNode) == MEDIA_DEVICE_PATH) && (DevicePathSubType 
(FileNode) == MEDIA_PIWG_FW_FILE_DP)) {
-      return IsDevicePathEnd (NextDevicePathNode (FileNode));
+    DevicePath = NextDevicePathNode (DevicePath);
+    if ((DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) && 
(DevicePathSubType (DevicePath) == MEDIA_PIWG_FW_FILE_DP)) {
+      return IsDevicePathEnd (NextDevicePathNode (DevicePath));
     }
   }
-
   return FALSE;
 }
 
@@ -1598,10 +1615,10 @@ BmGetLoadOptionBuffer (
   }
 
   //
-  // Fix up the boot option path if it points to a FV in memory map style of 
device path
+  // Get file buffer from FV file path.
   //
-  if (BmIsMemmapFvFilePath (FilePath)) {
-    return BmGetFileBufferByMemmapFv (FilePath, FullPath, FileSize);
+  if (BmIsFvFilePath (FilePath)) {
+    return BmGetFileBufferByFvFilePath (FilePath, FullPath, FileSize);
   }
 
   //
--
2.7.0.windows.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to