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

Reply via email to