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

