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 <ruiyu.ni@intel.com>
Reviewed-by: Sunny Wang <sunnywang@hpe.com>
This commit is contained in:
Ruiyu Ni 2016-02-24 15:15:02 +08:00
parent 4a285ec18d
commit f5c12172f1
2 changed files with 89 additions and 1 deletions

View File

@ -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.
//

View File

@ -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_