3.5.1.2 Non-removable Media Boot Behavior
If a system does not support boot option recovery, then default boot processing
will consist of the
boot manager searching non-removable media that supports the
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL or EFI_BLOCK_IO_PROTOCOL. In general the
boot manager will search all candidate media but platform policy may optionally
limit the search to
a subset of all possible devices connected to a given system; choices for such
policy limits are
implementation specific. If the device supports the
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
layered on an EFI system partition, then the system firmware will attempt to
boot from the media by
executing a default file name in the form \EFI\BOOT\BOOT{machine type
short-name}.EFI.
3.4.3 Boot Option Variables Default Boot Behavior
If system firmware supports boot option recovery as described in Section 3.4,
system firmware must
include a PlatformRecovery#### variable specifying a short-form File Path Media
Device
Path (see Table 3.1.2) containing the platform default file path for removable
media (see Table 12).
It is recommended for maximal compatibility with prior versions of this
specification that this entry
be the first such variable, though it may be at any position within the list.
Sunny,
I guess the wording in 3.4.3 may cause you confused.
3.4.1.2 (Non removable Media Boot Behavior) also says that
\EFI\BOOT\BOOTIA32.efi should be tried.
So for "maximal compatibility with prior versions", we need to try both
non-removable and removable medias.
Regards,
Ray
-----Original Message-----
From: Wang, Sunny (HPS SW) [mailto:[email protected]]
Sent: Tuesday, November 3, 2015 5:56 PM
To: Ni, Ruiyu <[email protected]>; [email protected]
Cc: Dong, Eric <[email protected]>; Wang, Sunny (HPS SW) <[email protected]>;
El-Haj-Mahmoud, Samer <[email protected]>
Subject: RE: [edk2] [Patch 06/11] MdeModulePkg: Support to expand File device
path
Hi Ray,
I saw the following checks in BmExpandFileDevicePath.
+ if ((MediaType == 0 && BlockIo != NULL &&
BlockIo->Media->RemovableMedia) ||
+ (MediaType == 1 && BlockIo != NULL &&
!BlockIo->Media->RemovableMedia) ||
+ (MediaType == 2 && BlockIo == NULL)
Does it mean launching PlatformRecovery option will try to find default
boot file from all kinds of media (all simple SimpleFileSystem handles) rather
than only removable media?
According to UEFI 2.5 section 3.4.3 Boot Option Variables Default Boot
Behavior, It seems we should try to find out default boot file only from
removable media. Could you check this?
Regards,
Sunny Wang
-----Original Message-----
From: edk2-devel [mailto:[email protected]] On Behalf Of Ruiyu Ni
Sent: Monday, November 02, 2015 7:34 PM
To: [email protected]
Cc: Ruiyu Ni; Eric Dong
Subject: [edk2] [Patch 06/11] MdeModulePkg: Support to expand File device path
To support platform recovery, File device path expanding capability is added.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <[email protected]>
Cc: Eric Dong <[email protected]>
---
MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c | 76 ++++++++++++++++++++++++
1 file changed, 76 insertions(+)
diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
index 8f14cf6..8b7c7c2 100644
--- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
+++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c
@@ -1073,6 +1073,76 @@ BmExpandUsbDevicePath ( }
/**
+ Expand File-path device path node to be full device path in platform.
+
+ @param FilePath The device path pointing to a load option.
+ It could be a short-form device path.
+ @param FullPath Return the full device path of the load option after
+ short-form device path expanding.
+ Caller is responsible to free it.
+ @param FileSize Return the load option size.
+
+ @return The load option buffer. Caller is responsible to free the memory.
+**/
+VOID *
+BmExpandFileDevicePath (
+ IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
+ OUT EFI_DEVICE_PATH_PROTOCOL **FullPath,
+ OUT UINTN *FileSize
+ )
+{
+ EFI_STATUS Status;
+ UINTN Index;
+ UINTN HandleCount;
+ EFI_HANDLE *Handles;
+ EFI_BLOCK_IO_PROTOCOL *BlockIo;
+ UINTN MediaType;
+ EFI_DEVICE_PATH_PROTOCOL *FullDevicePath;
+ VOID *FileBuffer;
+ UINT32 AuthenticationStatus;
+
+ EfiBootManagerConnectAll ();
+ Status = gBS->LocateHandleBuffer (ByProtocol,
+ &gEfiSimpleFileSystemProtocolGuid, NULL, &HandleCount, &Handles); if
(EFI_ERROR (Status)) {
+ HandleCount = 0;
+ Handles = NULL;
+ }
+
+ //
+ // Enumerate all removable media devices followed by all fixed media devices,
+ // followed by media devices which don't layer on block io.
+ //
+ for (MediaType = 0; MediaType < 3; MediaType++) {
+ for (Index = 0; Index < HandleCount; Index++) {
+ Status = gBS->HandleProtocol (Handles[Index], &gEfiBlockIoProtocolGuid,
(VOID *) &BlockIo);
+ if (EFI_ERROR (Status)) {
+ BlockIo = NULL;
+ }
+ if ((MediaType == 0 && BlockIo != NULL &&
BlockIo->Media->RemovableMedia) ||
+ (MediaType == 1 && BlockIo != NULL &&
!BlockIo->Media->RemovableMedia) ||
+ (MediaType == 2 && BlockIo == NULL)
+ ) {
+ FullDevicePath = AppendDevicePath (DevicePathFromHandle
(Handles[Index]), FilePath);
+ FileBuffer = GetFileBufferByFilePath (TRUE, FullDevicePath, FileSize,
&AuthenticationStatus);
+ if (FileBuffer != NULL) {
+ *FullPath = FullDevicePath;
+ FreePool (Handles);
+ return FileBuffer;
+ }
+ FreePool (FullDevicePath);
+ }
+ }
+ }
+
+ if (Handles != NULL) {
+ FreePool (Handles);
+ }
+
+ *FullPath = NULL;
+ return NULL;
+}
+
+/**
Save the partition DevicePath to the CachedDevicePath as the first instance.
@param CachedDevicePath The device path cache.
@@ -1473,6 +1543,12 @@ BmGetLoadOptionBuffer (
// Expand the Harddrive device path
//
return BmExpandPartitionDevicePath (FilePath, FullPath, FileSize);
+ } else if ((DevicePathType (FilePath) == MEDIA_DEVICE_PATH) &&
+ (DevicePathSubType (FilePath) == MEDIA_FILEPATH_DP)) {
+ //
+ // Expand the File-path device path
+ //
+ return BmExpandFileDevicePath (FilePath, FullPath, FileSize);
} else {
for (Node = FilePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode
(Node)) {
if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) &&
--
1.9.5.msysgit.1
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel