Thanks for your explanation which makes sense to me.  I agree that if we don't 
have a need to support loading file buffer from a HTTP Boot driver mounted 
RAMDISK for non-BDS core module, this implementation is good and clearer. 

Reviewed-by: Sunny Wang <[email protected]>

-----Original Message-----
From: Ni, Ruiyu [mailto:[email protected]] 
Sent: Friday, February 26, 2016 8:25 PM
To: Wang, Sunny (HPS SW)
Cc: Fu, Siyuan; [email protected]
Subject: RE: [edk2] [Patch 2/4] MdeModulePkg/Bds: Wide match HTTP boot option.
Importance: High

Comments below.

Regards,
Ray


>-----Original Message-----
>From: edk2-devel [mailto:[email protected]] On Behalf Of 
>Wang, Sunny (HPS SW)
>Sent: Friday, February 26, 2016 5:18 PM
>To: Ni, Ruiyu <[email protected]>
>Cc: Fu, Siyuan <[email protected]>; [email protected]
>Subject: Re: [edk2] [Patch 2/4] MdeModulePkg/Bds: Wide match HTTP boot option.
>
>Hi Ray,
>       It looks like you replace GetFileBufferByFilePath function call with 
>both gEfiSimpleFileSystemProtocolGuid handling code block and 
>BmGetFileBufferFromLoadFile in BmGetLoadOptionBuffer, and the 
>BmGetFileBufferFromLoadFile is for replacing  gEfiLoadFileProtocolGuid related 
>code block in GetFileBufferByFilePath with the additional code for wide 
>matching HTTP boot option. Based on the changes I mentioned, I have two 
>questions below:
>       1. Why don't we just add the additional code for wide matching HTTP 
>boot option into GetFileBufferByFilePath to continue using 
>GetFileBufferByFilePath? This way seems easier and simpler.

GetFileBufferByFilePath() is a core library function. And even we enhance it, 
it still cannot support the ram disk boot (implemented in Patch 4/4). So I 
chose to not make the GetFileBufferByFilePath complex.

>       2. The GetFileBufferByFilePath function includes a code block for 
>gEfiLoadFile2ProtocolGuid, but the replacement in your code change 
>(BmGetFileBufferFromLoadFile) doesn't have code to handle 
>gEfiLoadFile2ProtocolGuid. Is it an issue or something I overlooked?

Per UFEI spec, boot option only maps to LoadFile protocol. LoadFile2 protocol 
is for PCI option rom loading, not for booting.

>
>Regards,
>Sunny Wang
>
>-----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; Siyuan Fu
>Subject: [edk2] [Patch 2/4] MdeModulePkg/Bds: Wide match HTTP boot option.
>
>Enhance BDS to wide match the HTTP boot option without matching the 
>specific device path data in IP device path and URI device path node.
>It's to follow UEFI Spec 2.6.
>
>Contributed-under: TianoCore Contribution Agreement 1.0
>Signed-off-by: Ruiyu Ni <[email protected]>
>Cc: Siyuan Fu <[email protected]>
>---
> MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c | 149 
>+++++++++++++++++++++--
> 1 file changed, 137 insertions(+), 12 deletions(-)
>
>diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
>b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
>index a6826f6..35234ba 100644
>--- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
>+++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
>@@ -1528,6 +1528,136 @@ BmExpandMediaDevicePath (  }
>
> /**
>+  Check whether Left and Right are the same without matching the 
>+ specific  device path data in IP device path and URI device path node.
>+
>+  @retval TRUE  Left and Right are the same.
>+  @retval FALSE Left and Right are the different.
>+**/
>+BOOLEAN
>+BmMatchHttpBootDevicePath (
>+  IN EFI_DEVICE_PATH_PROTOCOL *Left,
>+  IN EFI_DEVICE_PATH_PROTOCOL *Right
>+  )
>+{
>+  for (;  !IsDevicePathEnd (Left) && !IsDevicePathEnd (Right)
>+       ;  Left = NextDevicePathNode (Left), Right = NextDevicePathNode (Right)
>+       ) {
>+    if (CompareMem (Left, Right, DevicePathNodeLength (Left)) != 0) {
>+      if ((DevicePathType (Left) != MESSAGING_DEVICE_PATH) || 
>+(DevicePathType (Right) != MESSAGING_DEVICE_PATH))
>{
>+        return FALSE;
>+      }
>+
>+      if (((DevicePathSubType (Left) != MSG_IPv4_DP) || (DevicePathSubType 
>(Right) != MSG_IPv4_DP)) &&
>+          ((DevicePathSubType (Left) != MSG_IPv6_DP) || (DevicePathSubType 
>(Right) != MSG_IPv6_DP)) &&
>+          ((DevicePathSubType (Left) != MSG_URI_DP)  || (DevicePathSubType 
>(Right) != MSG_URI_DP))
>+          ) {
>+        return FALSE;
>+      }
>+    }
>+  }
>+  return (BOOLEAN) (IsDevicePathEnd (Left) && IsDevicePathEnd 
>+(Right)); }
>+
>+/**
>+  Get the file buffer from Load File instance.
>+
>+  @param FilePath    The media device path pointing to a LoadFile instance.
>+  @param FullPath    Return the full device path pointing to the load option.
>+  @param FileSize    Return the size of the load option.
>+
>+  @return  The load option buffer.
>+**/
>+VOID *
>+BmGetFileBufferFromLoadFile (
>+  IN  EFI_DEVICE_PATH_PROTOCOL        *FilePath,
>+  OUT EFI_DEVICE_PATH_PROTOCOL        **FullPath,
>+  OUT UINTN                           *FileSize
>+  )
>+{
>+  EFI_STATUS                      Status;
>+  EFI_HANDLE                      Handle;
>+  VOID                            *FileBuffer;
>+  EFI_HANDLE                      *Handles;
>+  UINTN                           HandleCount;
>+  UINTN                           Index;
>+  EFI_DEVICE_PATH_PROTOCOL        *Node;
>+  EFI_LOAD_FILE_PROTOCOL          *LoadFile;
>+  UINTN                           BufferSize;
>+
>+  //
>+  // Get file buffer from load file instance.
>+  //
>+  Node = FilePath;
>+  Status = gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &Node, 
>+ &Handle);  if (!EFI_ERROR (Status) && IsDevicePathEnd (Node)) {
>+    //
>+    // When wide match happens, pass full device path to LoadFile (),
>+    // otherwise, pass remaining device path to LoadFile ().
>+    //
>+    FilePath = Node;
>+  } else {
>+    Handle = NULL;
>+    //
>+    // Use wide match algorithm to find one when
>+    //  cannot find a LoadFile instance to exactly match the FilePath
>+    //
>+    Status = gBS->LocateHandleBuffer (
>+                    ByProtocol,
>+                    &gEfiLoadFileProtocolGuid,
>+                    NULL,
>+                    &HandleCount,
>+                    &Handles
>+                    );
>+    if (EFI_ERROR (Status)) {
>+      Handles = NULL;
>+      HandleCount = 0;
>+    }
>+    for (Index = 0; Index < HandleCount; Index++) {
>+      if (BmMatchHttpBootDevicePath (DevicePathFromHandle (Handles[Index]), 
>FilePath)) {
>+        Handle = Handles[Index];
>+        break;
>+      }
>+    }
>+    if (Handles != NULL) {
>+      FreePool (Handles);
>+    }
>+  }
>+
>+  if (Handle == NULL) {
>+    return NULL;
>+  }
>+
>+  Status = gBS->HandleProtocol (Handle, &gEfiLoadFileProtocolGuid, 
>+ (VOID **) &LoadFile);  ASSERT_EFI_ERROR (Status);
>+
>+  BufferSize = 0;
>+  FileBuffer = NULL;
>+  Status = LoadFile->LoadFile (LoadFile, FilePath, TRUE, &BufferSize, 
>+ FileBuffer);  if (Status == EFI_BUFFER_TOO_SMALL) {
>+    FileBuffer = AllocatePool (BufferSize);
>+    if (FileBuffer != NULL) {
>+      Status = EFI_SUCCESS;
>+    }
>+  }
>+
>+  if (!EFI_ERROR (Status)) {
>+    Status = LoadFile->LoadFile (LoadFile, FilePath, TRUE, 
>+ &BufferSize, FileBuffer);  }
>+
>+  if (!EFI_ERROR (Status)) {
>+    //
>+    // LoadFile () may cause the device path of the Handle be updated.
>+    //
>+    *FullPath = DuplicateDevicePath (DevicePathFromHandle (Handle));
>+    *FileSize = BufferSize;
>+    return FileBuffer;
>+  } else {
>+    return NULL;
>+  }
>+}
>+
>+/**
>   Get the load option by its device path.
>
>   @param FilePath  The device path pointing to a load option.
>@@ -1622,24 +1752,19 @@ BmGetLoadOptionBuffer (
>   }
>
>   //
>-  // Directly reads the load option when it doesn't reside in simple file 
>system instance (LoadFile/LoadFile2),
>-  //   or it directly points to a file in simple file system instance.
>+  // Get file buffer from simple file system.
>   //
>   Node   = FilePath;
>-  Status = gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &Node, 
>&Handle);
>-  FileBuffer = GetFileBufferByFilePath (TRUE, FilePath, FileSize, 
>&AuthenticationStatus);
>-  if (FileBuffer != NULL) {
>-    if (EFI_ERROR (Status)) {
>+  Status = gBS->LocateDevicePath (&gEfiSimpleFileSystemProtocolGuid,
>+ &Node, &Handle);  if (!EFI_ERROR (Status)) {
>+    FileBuffer = GetFileBufferByFilePath (TRUE, FilePath, FileSize, 
>&AuthenticationStatus);
>+    if (FileBuffer != NULL) {
>       *FullPath = DuplicateDevicePath (FilePath);
>-    } else {
>-      //
>-      // LoadFile () may cause the device path of the Handle be updated.
>-      //
>-      *FullPath = AppendDevicePath (DevicePathFromHandle (Handle), Node);
>     }
>+    return FileBuffer;
>   }
>
>-  return FileBuffer;
>+  return BmGetFileBufferFromLoadFile (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
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to