diff options
Diffstat (limited to 'MdeModulePkg/Universal/BdsDxe/BdsEntry.c')
-rw-r--r-- | MdeModulePkg/Universal/BdsDxe/BdsEntry.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c index ac5f908..a6fe617 100644 --- a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c +++ b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c @@ -808,7 +808,8 @@ BdsEntry ( ASSERT_EFI_ERROR (Status);
//
- // Cache and remove the "BootNext" NV variable.
+ // Cache the "BootNext" NV variable before calling any PlatformBootManagerLib APIs
+ // This could avoid the "BootNext" set by PlatformBootManagerLib be consumed in this boot.
//
GetEfiGlobalVariable2 (EFI_BOOT_NEXT_VARIABLE_NAME, (VOID **) &BootNext, &DataSize);
if (DataSize != sizeof (UINT16)) {
@@ -817,17 +818,6 @@ BdsEntry ( }
BootNext = NULL;
}
- Status = gRT->SetVariable (
- EFI_BOOT_NEXT_VARIABLE_NAME,
- &gEfiGlobalVariableGuid,
- 0,
- 0,
- NULL
- );
- //
- // Deleting NV variable shouldn't fail unless it doesn't exist.
- //
- ASSERT (Status == EFI_SUCCESS || Status == EFI_NOT_FOUND);
//
// Initialize the platform language variables
@@ -1052,10 +1042,25 @@ BdsEntry ( EfiBootManagerHotkeyBoot ();
- //
- // Boot to "BootNext"
- //
if (BootNext != NULL) {
+ //
+ // Delete "BootNext" NV variable before transferring control to it to prevent loops.
+ //
+ Status = gRT->SetVariable (
+ EFI_BOOT_NEXT_VARIABLE_NAME,
+ &gEfiGlobalVariableGuid,
+ 0,
+ 0,
+ NULL
+ );
+ //
+ // Deleting NV variable shouldn't fail unless it doesn't exist.
+ //
+ ASSERT (Status == EFI_SUCCESS || Status == EFI_NOT_FOUND);
+
+ //
+ // Boot to "BootNext"
+ //
UnicodeSPrint (BootNextVariableName, sizeof (BootNextVariableName), L"Boot%04x", *BootNext);
Status = EfiBootManagerVariableToLoadOption (BootNextVariableName, &LoadOption);
if (!EFI_ERROR (Status)) {
|