}\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
} 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