mirror of https://github.com/acidanthera/audk.git
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:
parent
4a285ec18d
commit
f5c12172f1
|
@ -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.
|
||||
//
|
||||
|
|
|
@ -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_
|
||||
|
|
Loading…
Reference in New Issue