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)) { 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])); *FullPath = DuplicateDevicePath (DevicePathFromHandle (Handles[Index]));
break; break;
} }
@ -1625,6 +1633,62 @@ BmMatchHttpBootDevicePath (
return (BOOLEAN) (IsDevicePathEnd (Left) && IsDevicePathEnd (Right)); 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. Get the file buffer from Load File instance.
@ -1712,6 +1776,14 @@ BmGetFileBufferFromLoadFile (
} }
if (!EFI_ERROR (Status)) { 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. // LoadFile () may cause the device path of the Handle be updated.
// //

View File

@ -1,7 +1,7 @@
/** @file /** @file
BDS library definition, include the file and data structure 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> (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -456,4 +456,20 @@ BmCharToUint (
IN CHAR16 Char 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_ #endif // _INTERNAL_BM_H_