]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPlatformPkg/Bds: Fixed 'BootNext' support
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 9 Feb 2012 15:30:19 +0000 (15:30 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 9 Feb 2012 15:30:19 +0000 (15:30 +0000)
The 'BootNext' environment variable should only contain the index of the 'next' boot entry.
It was containing a complete Boot Option.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12998 6f19259b-4bc3-4df7-8a09-765794883524

ArmPlatformPkg/Bds/Bds.c

index 8f7f9fdf7ced1541b067caa2590e2712ecf6ece1..c5246a0f0b7c4d84580cf96a19bccb11a8e88c87 100644 (file)
@@ -390,6 +390,9 @@ BdsEntry (
 {\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
@@ -404,16 +407,38 @@ BdsEntry (
   }\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