]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add in a check to make sure "BootCurrent" is created only when it match a valid ...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 3 Feb 2009 09:52:40 +0000 (09:52 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 3 Feb 2009 09:52:40 +0000 (09:52 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7419 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c

index d273e3f6042ead6f6bdd646fa932a19c4dc44b93..bc0904e84eaba8bf7950bfce1ec5c7ec9c2c8bbd 100644 (file)
@@ -70,7 +70,50 @@ BdsLibDoLegacyBoot (
                       );\r
 }\r
 \r
+/**\r
+  Internal function to check if the input boot option is a valid EFI NV Boot####.\r
+\r
+  @param OptionToCheck  Boot option to be checked.\r
+\r
+  @retval TRUE      This boot option matches a valid EFI NV Boot####.\r
+  @retval FALSE     If not.\r
+  \r
+**/\r
+\r
+BOOLEAN\r
+IsBootOptionValidNVVarialbe (\r
+  IN  BDS_COMMON_OPTION             *OptionToCheck\r
+  )\r
+{\r
+  LIST_ENTRY        TempList;\r
+  BDS_COMMON_OPTION *BootOption;\r
+  BOOLEAN           Valid;\r
+  CHAR16            OptionName[20];\r
+\r
+  Valid = FALSE;\r
+\r
+  InitializeListHead (&TempList);\r
+  UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", OptionToCheck->BootCurrent);\r
 \r
+  BootOption = BdsLibVariableToOption (&TempList, OptionName);\r
+  if (BootOption == NULL) {\r
+    return FALSE;\r
+  }\r
+\r
+  //\r
+  // If the Boot Option Number and Device Path matches, OptionToCheck matches a \r
+  // valid EFI NV Boot####.\r
+  //\r
+  if ((OptionToCheck->BootCurrent == BootOption->BootCurrent) &&\r
+      (CompareMem (OptionToCheck->DevicePath, BootOption->DevicePath, GetDevicePathSize (OptionToCheck->DevicePath)) == 0))\r
+      {\r
+    Valid = TRUE;\r
+  }\r
+\r
+  FreePool (BootOption);\r
+    \r
+  return Valid;\r
+}\r
 /**\r
   Process the boot option follow the UEFI specification and\r
   special treat the legacy boot option with BBS_DEVICE_PATH.\r
@@ -149,13 +192,20 @@ BdsLibBootViaBootOption (
   //\r
   // Set Boot Current\r
   //\r
-  gRT->SetVariable (\r
-        L"BootCurrent",\r
-        &gEfiGlobalVariableGuid,\r
-        EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
-        sizeof (UINT16),\r
-        &Option->BootCurrent\r
-        );\r
+  if (IsBootOptionValidNVVarialbe (Option)) {\r
+    //\r
+    // For a temporary boot (i.e. a boot by selected a EFI Shell using "Boot From File"), Boot Current is actually not valid.\r
+    // In this case, "BootCurrent" is not created.\r
+    // Only create the BootCurrent variable when it points to a valid Boot#### variable.\r
+    //\r
+    gRT->SetVariable (\r
+          L"BootCurrent",\r
+          &gEfiGlobalVariableGuid,\r
+          EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+          sizeof (UINT16),\r
+          &Option->BootCurrent\r
+          );\r
+  }\r
 \r
   ASSERT (Option->DevicePath != NULL);\r
   if ((DevicePathType (Option->DevicePath) == BBS_DEVICE_PATH) &&\r