{\r
UINTN Size;\r
EFI_STATUS Status;\r
+ UINT16 *BootNext;\r
+ UINTN BootNextSize;\r
+ CHAR16 BootVariableName[9];\r
\r
PERF_END (NULL, "DXE", NULL, 0);\r
\r
}\r
\r
// If BootNext environment variable is defined then we just load it !\r
- Status = BdsStartBootOption (L"BootNext");\r
- if (Status != EFI_NOT_FOUND) {\r
- // BootNext has not been succeeded launched\r
- if (EFI_ERROR(Status)) {\r
- Print(L"Fail to start BootNext.\n");\r
+ BootNextSize = sizeof(UINT16);\r
+ Status = GetEnvironmentVariable (L"BootNext", NULL, &BootNextSize, (VOID**)&BootNext);\r
+ if (!EFI_ERROR(Status)) {\r
+ ASSERT(BootNextSize == sizeof(UINT16));\r
+\r
+ // Generate the requested Boot Entry variable name\r
+ UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", *BootNext);\r
+\r
+ // Set BootCurrent variable\r
+ gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+ BootNextSize, BootNext);\r
+\r
+ FreePool (BootNext);\r
+\r
+ // Start the requested Boot Entry\r
+ Status = BdsStartBootOption (BootVariableName);\r
+ if (Status != EFI_NOT_FOUND) {\r
+ // BootNext has not been succeeded launched\r
+ if (EFI_ERROR(Status)) {\r
+ Print(L"Fail to start BootNext.\n");\r
+ }\r
+\r
+ // Delete the BootNext environment variable\r
+ gRT->SetVariable (L"BootNext", &gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+ 0, NULL);\r
}\r
\r
- // Delete the BootNext environment variable\r
- gRT->SetVariable (L"BootNext", &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+ // Clear BootCurrent variable\r
+ gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
0, NULL);\r
}\r
\r