Reviewed-by: Fu Siyuan <siyuan...@intel.com>

> -----Original Message-----
> From: Ni, Ruiyu
> Sent: Thursday, March 31, 2016 10:37 AM
> To: edk2-devel@lists.01.org
> Cc: Ni, Ruiyu <ruiyu...@intel.com>; Fu, Siyuan <siyuan...@intel.com>
> Subject: [Patch v3 1/3] MdeModulePkg/Bds: Allocate reserved memory for
> RAM Disk boot media
> 
> Use reserved memory to hold the buffer for the RAM disk to
> follow the ACPI spec requirement.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ruiyu Ni <ruiyu...@intel.com>
> Cc: Siyuan Fu <siyuan...@intel.com>
> ---
>  MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c   | 149
> +++++++++++----------
>  .../Library/UefiBootManagerLib/InternalBm.h        |  35 ++---
>  2 files changed, 95 insertions(+), 89 deletions(-)
> 
> diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
> b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
> index f6c6845..a582b90 100644
> --- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
> +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
> @@ -688,7 +688,6 @@ BmExpandUriDevicePath (
>    UINTN                           Index;
>    UINTN                           HandleCount;
>    EFI_HANDLE                      *Handles;
> -  EFI_LOAD_FILE_PROTOCOL          *LoadFile;
>    VOID                            *FileBuffer;
> 
>    EfiBootManagerConnectAll ();
> @@ -698,37 +697,10 @@ BmExpandUriDevicePath (
>      Handles = NULL;
>    }
> 
> -  FileBuffer = NULL;
> -
>    for (Index = 0; Index < HandleCount; Index++) {
> -    Status = gBS->HandleProtocol (Handles[Index], &gEfiLoadFileProtocolGuid,
> (VOID *) &LoadFile);
> -    ASSERT_EFI_ERROR (Status);
> -
> -    FileBuffer = NULL;
> -    Status = LoadFile->LoadFile (LoadFile, FilePath, TRUE, FileSize, 
> FileBuffer);
> -    if (Status == EFI_BUFFER_TOO_SMALL) {
> -      FileBuffer = AllocatePool (*FileSize);
> -      if (FileBuffer == NULL) {
> -        break;
> -      }
> -      Status = LoadFile->LoadFile (LoadFile, FilePath, TRUE, FileSize, 
> FileBuffer);
> -    }
> -
> -    if (!EFI_ERROR (Status)) {
> -      //
> -      // LoadFile() returns a file buffer mapping to a file system.
> -      //
> -      if (Status == EFI_WARN_FILE_SYSTEM) {
> -        return BmGetFileBufferFromLoadFileFileSystem (Handles[Index],
> FullPath, FileSize);
> -      }
> -
> -      ASSERT (Status == EFI_SUCCESS);
> -      *FullPath = DuplicateDevicePath (DevicePathFromHandle
> (Handles[Index]));
> -      break;
> -    }
> -
> +    FileBuffer = BmGetFileBufferFromLoadFile (Handles[Index], FilePath,
> FullPath, FileSize);
>      if (FileBuffer != NULL) {
> -      FreePool (FileBuffer);
> +      break;
>      }
>    }
> 
> @@ -1127,7 +1099,7 @@ BmMatchHttpBootDevicePath (
>    @return  The load option buffer.
>  **/
>  VOID *
> -BmGetFileBufferFromLoadFileFileSystem (
> +BmGetFileBufferFromLoadFileSystem (
>    IN  EFI_HANDLE                      LoadFileHandle,
>    OUT EFI_DEVICE_PATH_PROTOCOL        **FullPath,
>    OUT UINTN                           *FileSize
> @@ -1175,8 +1147,78 @@ BmGetFileBufferFromLoadFileFileSystem (
>    }
>  }
> 
> +
>  /**
> -  Get the file buffer from Load File instance.
> +  Get the file buffer from the specified Load File instance.
> +
> +  @param LoadFileHandle The specified Load File instance.
> +  @param FilePath       The file path which will pass to LoadFile().
> +  @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 or NULL if fails.
> +**/
> +VOID *
> +BmGetFileBufferFromLoadFile (
> +  EFI_HANDLE                          LoadFileHandle,
> +  IN  EFI_DEVICE_PATH_PROTOCOL        *FilePath,
> +  OUT EFI_DEVICE_PATH_PROTOCOL        **FullPath,
> +  OUT UINTN                           *FileSize
> +  )
> +{
> +  EFI_STATUS                          Status;
> +  EFI_LOAD_FILE_PROTOCOL              *LoadFile;
> +  VOID                                *FileBuffer;
> +  BOOLEAN                             LoadFileSystem;
> +  UINTN                               BufferSize;
> +
> +  *FileSize = 0;
> +
> +  Status = gBS->OpenProtocol (
> +                  LoadFileHandle,
> +                  &gEfiLoadFileProtocolGuid,
> +                  (VOID **) &LoadFile,
> +                  gImageHandle,
> +                  NULL,
> +                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
> +                  );
> +  ASSERT_EFI_ERROR (Status);
> +
> +  FileBuffer = NULL;
> +  BufferSize = 0;
> +  Status = LoadFile->LoadFile (LoadFile, FilePath, TRUE, &BufferSize,
> FileBuffer);
> +  if ((Status != EFI_WARN_FILE_SYSTEM) && (Status !=
> EFI_BUFFER_TOO_SMALL)) {
> +    return NULL;
> +  }
> +
> +  LoadFileSystem = (BOOLEAN) (Status == EFI_WARN_FILE_SYSTEM);
> +  FileBuffer = LoadFileSystem ? AllocateReservedPages (EFI_SIZE_TO_PAGES
> (BufferSize)) : AllocatePool (BufferSize);
> +  if (FileBuffer == NULL) {
> +    return NULL;
> +  }
> +
> +  Status = LoadFile->LoadFile (LoadFile, FilePath, TRUE, &BufferSize,
> FileBuffer);
> +  if (EFI_ERROR (Status)) {
> +    if (LoadFileSystem) {
> +      FreePages (FileBuffer, EFI_SIZE_TO_PAGES (BufferSize));
> +    } else {
> +      FreePool (FileBuffer);
> +    }
> +    return NULL;
> +  }
> +
> +  if (LoadFileSystem) {
> +    FileBuffer = BmGetFileBufferFromLoadFileSystem (LoadFileHandle,
> FullPath, FileSize);
> +  } else {
> +    *FileSize = BufferSize;
> +    *FullPath = DuplicateDevicePath (DevicePathFromHandle
> (LoadFileHandle));
> +  }
> +
> +  return FileBuffer;
> +}
> +
> +/**
> +  Get the file buffer from all the Load File instances.
> 
>    @param FilePath    The media device path pointing to a LoadFile instance.
>    @param FullPath    Return the full device path pointing to the load option.
> @@ -1185,7 +1227,7 @@ BmGetFileBufferFromLoadFileFileSystem (
>    @return  The load option buffer.
>  **/
>  VOID *
> -BmGetFileBufferFromLoadFile (
> +BmGetFileBufferFromLoadFiles (
>    IN  EFI_DEVICE_PATH_PROTOCOL        *FilePath,
>    OUT EFI_DEVICE_PATH_PROTOCOL        **FullPath,
>    OUT UINTN                           *FileSize
> @@ -1193,13 +1235,10 @@ BmGetFileBufferFromLoadFile (
>  {
>    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.
> @@ -1244,41 +1283,7 @@ BmGetFileBufferFromLoadFile (
>      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() returns a file buffer mapping to a file system.
> -    //
> -    if (Status == EFI_WARN_FILE_SYSTEM) {
> -      return BmGetFileBufferFromLoadFileFileSystem (Handle, FullPath,
> FileSize);
> -    }
> -
> -    ASSERT (Status == EFI_SUCCESS);
> -    //
> -    // LoadFile () may cause the device path of the Handle be updated.
> -    //
> -    *FullPath = DuplicateDevicePath (DevicePathFromHandle (Handle));
> -    *FileSize = BufferSize;
> -    return FileBuffer;
> -  } else {
> -    return NULL;
> -  }
> +  return BmGetFileBufferFromLoadFile (Handle, FilePath, FullPath, FileSize);
>  }
> 
>  /**
> @@ -1394,7 +1399,7 @@ BmGetLoadOptionBuffer (
>      return FileBuffer;
>    }
> 
> -  return BmGetFileBufferFromLoadFile (FilePath, FullPath, FileSize);
> +  return BmGetFileBufferFromLoadFiles (FilePath, FullPath, FileSize);
>  }
> 
>  /**
> diff --git a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
> b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
> index b261d76..7b6252a 100644
> --- a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
> +++ b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
> @@ -410,23 +410,6 @@ BmCharToUint (
>    IN CHAR16                           Char
>    );
> 
> -
> -/**
> -  Get the file buffer from the file system produced by Load File instance.
> -
> -  @param LoadFileHandle The handle of 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 *
> -BmGetFileBufferFromLoadFileFileSystem (
> -  IN  EFI_HANDLE                      LoadFileHandle,
> -  OUT EFI_DEVICE_PATH_PROTOCOL        **FullPath,
> -  OUT UINTN                           *FileSize
> -  );
> -
>  /**
>    Return the boot description for the controller.
> 
> @@ -451,4 +434,22 @@ BmMakeBootOptionDescriptionUnique (
>    EFI_BOOT_MANAGER_LOAD_OPTION         *BootOptions,
>    UINTN                                BootOptionCount
>    );
> +
> +/**
> +  Get the file buffer from the specified Load File instance.
> +
> +  @param LoadFileHandle The specified Load File instance.
> +  @param FilePath       The file path which will pass to LoadFile().
> +  @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 or NULL if fails.
> +**/
> +VOID *
> +BmGetFileBufferFromLoadFile (
> +  EFI_HANDLE                          LoadFileHandle,
> +  IN  EFI_DEVICE_PATH_PROTOCOL        *FilePath,
> +  OUT EFI_DEVICE_PATH_PROTOCOL        **FullPath,
> +  OUT UINTN                           *FileSize
> +  );
>  #endif // _INTERNAL_BM_H_
> --
> 2.7.0.windows.1

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

Reply via email to