To support platform recovery, File device path expanding capability
is added.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <ruiyu...@intel.com>
Cc: Sunny Wang <sunnyw...@hpe.com>
---
 MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c | 76 ++++++++++++++++++++++++
 1 file changed, 76 insertions(+)

diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c 
b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
index aef2e7b..70ec216 100644
--- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
+++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
@@ -1073,6 +1073,76 @@ BmExpandUsbDevicePath (
 }
 
 /**
+  Expand File-path device path node to be full device path in platform.
+
+  @param FilePath      The device path pointing to a load option.
+                       It could be a short-form device path.
+  @param FullPath      Return the full device path of the load option after
+                       short-form device path expanding.
+                       Caller is responsible to free it.
+  @param FileSize      Return the load option size.
+
+  @return The load option buffer. Caller is responsible to free the memory.
+**/
+VOID *
+BmExpandFileDevicePath (
+  IN  EFI_DEVICE_PATH_PROTOCOL    *FilePath,
+  OUT EFI_DEVICE_PATH_PROTOCOL    **FullPath,
+  OUT UINTN                       *FileSize
+  )
+{
+  EFI_STATUS                      Status;
+  UINTN                           Index;
+  UINTN                           HandleCount;
+  EFI_HANDLE                      *Handles;
+  EFI_BLOCK_IO_PROTOCOL           *BlockIo;
+  UINTN                           MediaType;
+  EFI_DEVICE_PATH_PROTOCOL        *FullDevicePath;
+  VOID                            *FileBuffer;
+  UINT32                          AuthenticationStatus;
+  
+  EfiBootManagerConnectAll ();
+  Status = gBS->LocateHandleBuffer (ByProtocol, 
&gEfiSimpleFileSystemProtocolGuid, NULL, &HandleCount, &Handles);
+  if (EFI_ERROR (Status)) {
+    HandleCount = 0;
+    Handles = NULL;
+  }
+
+  //
+  // Enumerate all removable media devices followed by all fixed media devices,
+  //   followed by media devices which don't layer on block io.
+  //
+  for (MediaType = 0; MediaType < 3; MediaType++) {
+    for (Index = 0; Index < HandleCount; Index++) {
+      Status = gBS->HandleProtocol (Handles[Index], &gEfiBlockIoProtocolGuid, 
(VOID *) &BlockIo);
+      if (EFI_ERROR (Status)) {
+        BlockIo = NULL;
+      }
+      if ((MediaType == 0 && BlockIo != NULL && 
BlockIo->Media->RemovableMedia) ||
+          (MediaType == 1 && BlockIo != NULL && 
!BlockIo->Media->RemovableMedia) ||
+          (MediaType == 2 && BlockIo == NULL)
+          ) {
+        FullDevicePath = AppendDevicePath (DevicePathFromHandle 
(Handles[Index]), FilePath);
+        FileBuffer = GetFileBufferByFilePath (TRUE, FullDevicePath, FileSize, 
&AuthenticationStatus);
+        if (FileBuffer != NULL) {
+          *FullPath = FullDevicePath;
+          FreePool (Handles);
+          return FileBuffer;
+        }
+        FreePool (FullDevicePath);
+      }
+    }
+  }
+
+  if (Handles != NULL) {
+    FreePool (Handles);
+  }
+
+  *FullPath = NULL;
+  return NULL;
+}
+
+/**
   Save the partition DevicePath to the CachedDevicePath as the first instance.
 
   @param CachedDevicePath  The device path cache.
@@ -1473,6 +1543,12 @@ BmGetLoadOptionBuffer (
     // Expand the Harddrive device path
     //
     return BmExpandPartitionDevicePath (FilePath, FullPath, FileSize);
+  } else if ((DevicePathType (FilePath) == MEDIA_DEVICE_PATH) &&
+             (DevicePathSubType (FilePath) == MEDIA_FILEPATH_DP)) {
+    //
+    // Expand the File-path device path
+    //
+    return BmExpandFileDevicePath (FilePath, FullPath, FileSize);
   } else {
     for (Node = FilePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode 
(Node)) {
       if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) &&
-- 
1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to