Reviewed-by: Fu Siyuan <[email protected]>

> -----Original Message-----
> From: Ni, Ruiyu
> Sent: Wednesday, February 24, 2016 3:40 PM
> To: [email protected]
> Cc: Ni, Ruiyu <[email protected]>; Fu, Siyuan <[email protected]>
> Subject: [Patch 4/4] MdeModulePkg/Bds: Support booting from remote file
> system.
> 
> Enhance BDS to support booting from a remote file system exposed
> by a HTTP boot option.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ruiyu Ni <[email protected]>
> Cc: Siyuan Fu <[email protected]>
> ---
>  MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c   | 72
> ++++++++++++++++++++++
>  .../Library/UefiBootManagerLib/InternalBm.h        | 18 +++++-
>  2 files changed, 89 insertions(+), 1 deletion(-)
> 
> diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
> b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
> index 9ce841e..12868df 100644
> --- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
> +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
> @@ -1231,6 +1231,14 @@ BmExpandUriDevicePath (
>      }
> 
>      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;
>      }
> @@ -1626,6 +1634,62 @@ BmMatchHttpBootDevicePath (
>  }
> 
>  /**
> +  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
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  EFI_HANDLE                      Handle;
> +  EFI_HANDLE                      *Handles;
> +  UINTN                           HandleCount;
> +  UINTN                           Index;
> +  EFI_DEVICE_PATH_PROTOCOL        *Node;
> +
> +  Status = gBS->LocateHandleBuffer (
> +                  ByProtocol,
> +                  &gEfiBlockIoProtocolGuid,
> +                  NULL,
> +                  &HandleCount,
> +                  &Handles
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    Handles = NULL;
> +    HandleCount = 0;
> +  }
> +  for (Index = 0; Index < HandleCount; Index++) {
> +    Node = DevicePathFromHandle (Handles[Index]);
> +    Status = gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &Node,
> &Handle);
> +    if (!EFI_ERROR (Status) &&
> +        (Handle == LoadFileHandle) &&
> +        (DevicePathType (Node) == MEDIA_DEVICE_PATH) &&
> (DevicePathSubType (Node) == MEDIA_RAM_DISK_DP)) {
> +      Handle = Handles[Index];
> +      break;
> +    }
> +  }
> +
> +  if (Handles != NULL) {
> +    FreePool (Handles);
> +  }
> +
> +  if (Index != HandleCount) {
> +    return BmExpandMediaDevicePath (DevicePathFromHandle (Handle),
> FullPath, FileSize);
> +  } else {
> +    return NULL;
> +  }
> +}
> +
> +/**
>    Get the file buffer from Load File instance.
> 
>    @param FilePath    The media device path pointing to a LoadFile instance.
> @@ -1713,6 +1777,14 @@ BmGetFileBufferFromLoadFile (
> 
>    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));
> diff --git a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
> b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
> index fa4d5af..cfaeefe 100644
> --- a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
> +++ b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h
> @@ -1,7 +1,7 @@
>  /** @file
>    BDS library definition, include the file and data structure
> 
> -Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2004 - 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
> @@ -456,4 +456,20 @@ 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
> +  );
>  #endif // _INTERNAL_BM_H_
> --
> 2.7.0.windows.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to