]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/BdsDxe/BdsEntry.c
MdeModulePkg/ResetSystemRuntimeDxe: Add platform filter and handler
[mirror_edk2.git] / MdeModulePkg / Universal / BdsDxe / BdsEntry.c
index a6fe617b56939ea169a86e113fb6d52e9b5d3a13..2b24755ac368696f7fd57c7917dcd64614d225ac 100644 (file)
@@ -685,6 +685,55 @@ BdsAllocateMemoryForPerformanceData (
   }\r
 }\r
 \r
+/**\r
+  Enter an infinite loop of calling the Boot Manager Menu.\r
+\r
+  This is a last resort alternative to BdsEntry() giving up for good. This\r
+  function never returns.\r
+\r
+  @param[in] BootManagerMenu  The EFI_BOOT_MANAGER_LOAD_OPTION located and/or\r
+                              created by the EfiBootManagerGetBootManagerMenu()\r
+                              call in BdsEntry().\r
+**/\r
+VOID\r
+BdsBootManagerMenuLoop (\r
+  IN EFI_BOOT_MANAGER_LOAD_OPTION *BootManagerMenu\r
+  )\r
+{\r
+  EFI_INPUT_KEY Key;\r
+\r
+  //\r
+  // Normally BdsDxe does not print anything to the system console, but this is\r
+  // a last resort -- the end-user will likely not see any DEBUG messages\r
+  // logged in this situation.\r
+  //\r
+  // AsciiPrint() will NULL-check gST->ConOut internally. We check gST->ConIn\r
+  // here to see if it makes sense to request and wait for a keypress.\r
+  //\r
+  if (gST->ConIn != NULL) {\r
+    AsciiPrint (\r
+      "%a: No bootable option or device was found.\n"\r
+      "%a: Press any key to enter the Boot Manager Menu.\n",\r
+      gEfiCallerBaseName,\r
+      gEfiCallerBaseName\r
+      );\r
+    BdsWaitForSingleEvent (gST->ConIn->WaitForKey, 0);\r
+\r
+    //\r
+    // Drain any queued keys.\r
+    //\r
+    while (!EFI_ERROR (gST->ConIn->ReadKeyStroke (gST->ConIn, &Key))) {\r
+      //\r
+      // just throw away Key\r
+      //\r
+    }\r
+  }\r
+\r
+  for (;;) {\r
+    EfiBootManagerBoot (BootManagerMenu);\r
+  }\r
+}\r
+\r
 /**\r
 \r
   Service routine for BdsInstance->Entry(). Devices are connected, the\r
@@ -1088,16 +1137,19 @@ BdsEntry (
     } while (BootSuccess);\r
   }\r
 \r
-  if (BootManagerMenuStatus != EFI_NOT_FOUND) {\r
-    EfiBootManagerFreeLoadOption (&BootManagerMenu);\r
-  }\r
-\r
   if (!BootSuccess) {\r
     LoadOptions = EfiBootManagerGetLoadOptions (&LoadOptionCount, LoadOptionTypePlatformRecovery);\r
     ProcessLoadOptions (LoadOptions, LoadOptionCount);\r
     EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount);\r
   }\r
 \r
+  //\r
+  // If BootManagerMenu is available, fall back to it indefinitely.\r
+  //\r
+  if (BootManagerMenuStatus != EFI_NOT_FOUND) {\r
+    BdsBootManagerMenuLoop (&BootManagerMenu);\r
+  }\r
+\r
   DEBUG ((EFI_D_ERROR, "[Bds] Unable to boot!\n"));\r
   CpuDeadLoop ();\r
 }\r
@@ -1112,8 +1164,7 @@ BdsEntry (
   @param  VendorGuid             A unique identifier for the vendor.\r
   @param  Attributes             Attributes bitmask to set for the variable.\r
   @param  DataSize               The size in bytes of the Data buffer. Unless the EFI_VARIABLE_APPEND_WRITE, \r
-                                 EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS, or \r
-                                 EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS attribute is set, a size of zero \r
+                                 or EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS attribute is set, a size of zero\r
                                  causes the variable to be deleted. When the EFI_VARIABLE_APPEND_WRITE attribute is \r
                                  set, then a SetVariable() call with a DataSize of zero will not cause any change to \r
                                  the variable value (the timestamp associated with the variable may be updated however \r
@@ -1131,9 +1182,8 @@ BdsEntry (
   @retval EFI_DEVICE_ERROR       The variable could not be retrieved due to a hardware error.\r
   @retval EFI_WRITE_PROTECTED    The variable in question is read-only.\r
   @retval EFI_WRITE_PROTECTED    The variable in question cannot be deleted.\r
-  @retval EFI_SECURITY_VIOLATION The variable could not be written due to EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS \r
-                                 or EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACESS being set, but the AuthInfo \r
-                                 does NOT pass the validation check carried out by the firmware.\r
+  @retval EFI_SECURITY_VIOLATION The variable could not be written due to EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACESS\r
+                                 being set, but the AuthInfo does NOT pass the validation check carried out by the firmware.\r
 \r
   @retval EFI_NOT_FOUND          The variable trying to be updated or deleted was not found.\r
 **/\r