This one looks good to me. Reviewed-by: Sunny Wang <[email protected]>
-----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 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 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

