From f5c12172f1e23b8906dc12702de31078d44c023e Mon Sep 17 00:00:00 2001 From: Ruiyu Ni Date: Wed, 24 Feb 2016 15:15:02 +0800 Subject: [PATCH] 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 Reviewed-by: Sunny Wang --- .../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 0b7b43b9ea..18f835a9a9 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; } @@ -1625,6 +1633,62 @@ BmMatchHttpBootDevicePath ( return (BOOLEAN) (IsDevicePathEnd (Left) && IsDevicePathEnd (Right)); } +/** + 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. @@ -1712,6 +1776,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. // diff --git a/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h b/MdeModulePkg/Library/UefiBootManagerLib/InternalBm.h index fa4d5af004..cfaeefe181 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.
+Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.
(C) Copyright 2015 Hewlett Packard Enterprise Development LP
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.39.2