MdeModulePkg/BdsDxe: Avoid overwriting PlatformRecovery####

Current implementation always creates PlatformRecovery0000
pointing to \EFI\BOOT\BOOT$(ARCH).efi but it may overwrite
PlatformRecovery#### created before (maybe by a DXE driver).

The patch only uses the smallest unused option number for
the \EFI\BOOT\BOOT$(ARCH).efi PlatformRecovery#### to avoid
overwriting already-created PlatformRecovery####.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Jie Lin <jie.lin@intel.com>
Reviewed-by: Sunny Wang <sunnywang@hpe.com>
This commit is contained in:
Ruiyu Ni 2016-11-15 18:02:32 +08:00
parent de67c35c8a
commit 0dc3fb06b2
1 changed files with 17 additions and 2 deletions

View File

@ -837,7 +837,7 @@ BdsEntry (
FilePath = FileDevicePath (NULL, EFI_REMOVABLE_MEDIA_FILE_NAME);
Status = EfiBootManagerInitializeLoadOption (
&LoadOption,
0,
LoadOptionNumberUnassigned,
LoadOptionTypePlatformRecovery,
LOAD_OPTION_ACTIVE,
L"Default PlatformRecovery",
@ -846,9 +846,24 @@ BdsEntry (
0
);
ASSERT_EFI_ERROR (Status);
EfiBootManagerLoadOptionToVariable (&LoadOption);
LoadOptions = EfiBootManagerGetLoadOptions (&LoadOptionCount, LoadOptionTypePlatformRecovery);
if (EfiBootManagerFindLoadOption (&LoadOption, LoadOptions, LoadOptionCount) == -1) {
for (Index = 0; Index < LoadOptionCount; Index++) {
//
// The PlatformRecovery#### options are sorted by OptionNumber.
// Find the the smallest unused number as the new OptionNumber.
//
if (LoadOptions[Index].OptionNumber != Index) {
break;
}
}
LoadOption.OptionNumber = Index;
Status = EfiBootManagerLoadOptionToVariable (&LoadOption);
ASSERT_EFI_ERROR (Status);
}
EfiBootManagerFreeLoadOption (&LoadOption);
FreePool (FilePath);
EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount);
//
// Report Status Code to indicate connecting drivers will happen