Hi Ray,
        I saw the following checks in  BmExpandFileDevicePath.

+      if ((MediaType == 0 && BlockIo != NULL && 
BlockIo->Media->RemovableMedia) ||
+          (MediaType == 1 && BlockIo != NULL && 
!BlockIo->Media->RemovableMedia) ||
+          (MediaType == 2 && BlockIo == NULL)

        Does it mean launching PlatformRecovery option will try to find default 
boot file from all kinds of media (all simple SimpleFileSystem handles) rather 
than only removable media?
        According to UEFI 2.5 section 3.4.3 Boot Option Variables Default Boot 
Behavior, It seems we should try to find out default boot file only from 
removable media. Could you check this? 

Regards,
Sunny Wang

-----Original Message-----
From: edk2-devel [mailto:[email protected]] On Behalf Of Ruiyu Ni
Sent: Monday, November 02, 2015 7:34 PM
To: [email protected]
Cc: Ruiyu Ni; Eric Dong
Subject: [edk2] [Patch 06/11] MdeModulePkg: Support to expand File device path

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

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <[email protected]>
Cc: Eric Dong <[email protected]>
---
 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 8f14cf6..8b7c7c2 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
[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