summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Universal/BdsDxe/BdsEntry.c
diff options
context:
space:
mode:
Diffstat (limited to 'MdeModulePkg/Universal/BdsDxe/BdsEntry.c')
-rw-r--r--MdeModulePkg/Universal/BdsDxe/BdsEntry.c35
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)) {