31#include <Protocol/PlatformBootManager.h>
40#define DP_NODE_LEN(Type) { (UINT8)sizeof (Type), (UINT8)(sizeof (Type) >> 8) }
57 EDKII_SERIAL_PORT_LIB_VENDOR_GUID
89 END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
121 END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
184 Status =
gBS->LocateHandleBuffer (
191 if (EFI_ERROR (Status)) {
205 ASSERT (NoHandles > 0);
206 for (Idx = 0; Idx < NoHandles; ++Idx) {
207 CHAR16 *DevicePathText;
208 STATIC CHAR16 Fallback[] = L
"<device path unavailable>";
218 if (DevicePathText ==
NULL) {
219 DevicePathText = Fallback;
222 if ((Filter ==
NULL) || Filter (Handles[Idx], DevicePathText)) {
223 Process (Handles[Idx], DevicePathText);
226 if (DevicePathText != Fallback) {
231 gBS->FreePool (Handles);
249 Status =
gBS->HandleProtocol (
251 &gEfiPciIoProtocolGuid,
254 if (EFI_ERROR (Status)) {
261 Status = PciIo->Pci.
Read (
265 sizeof Pci /
sizeof (UINT32),
268 if (EFI_ERROR (Status)) {
269 DEBUG ((DEBUG_ERROR,
"%a: %s: %r\n", __func__, ReportText, Status));
291 Status =
gBS->HandleProtocol (
293 &gEdkiiNonDiscoverableDeviceProtocolGuid,
296 if (EFI_ERROR (Status)) {
300 if (
CompareGuid (Device->Type, &gEdkiiNonDiscoverableUhciDeviceGuid) ||
301 CompareGuid (Device->Type, &gEdkiiNonDiscoverableEhciDeviceGuid) ||
302 CompareGuid (Device->Type, &gEdkiiNonDiscoverableXhciDeviceGuid))
324 Status =
gBS->ConnectController (
331 EFI_ERROR (Status) ? DEBUG_ERROR : DEBUG_VERBOSE,
355 if (DevicePath ==
NULL) {
358 "%a: %s: handle %p: device path not found\n",
367 if (EFI_ERROR (Status)) {
370 "%a: %s: adding to ConOut: %r\n",
379 if (EFI_ERROR (Status)) {
382 "%a: %s: adding to ErrOut: %r\n",
392 "%a: %s: added to ConOut and ErrOut\n",
411 UINTN BootOptionCount;
416 Status =
gBS->HandleProtocol (
418 &gEfiLoadedImageProtocolGuid,
419 (
VOID **)&LoadedImage
425 ASSERT (DevicePath !=
NULL);
430 ASSERT (DevicePath !=
NULL);
434 LoadOptionNumberUnassigned,
456 if (OptionIndex == -1) {
461 (UINT16)NewOption.OptionNumber,
466 ASSERT (Status ==
EFI_SUCCESS || Status == EFI_ALREADY_STARTED);
486 IN CHAR16 *Description
495 Status =
gBS->HandleProtocol (
497 &gEfiLoadedImageProtocolGuid,
498 (
VOID **)&LoadedImage
508 ASSERT (DevicePath !=
NULL);
513 ASSERT (DevicePath !=
NULL);
517 LoadOptionNumberUnassigned,
542 UINTN CurrentBootOptionCount;
546 Status =
gBS->LocateProtocol (
547 &gPlatformBootManagerProtocolGuid,
549 (
VOID **)&PlatformBootManager
551 if (EFI_ERROR (Status)) {
555 Status = PlatformBootManager->GetPlatformBootOptionsAndKeys (
560 if (EFI_ERROR (Status)) {
569 &CurrentBootOptionCount,
575 for (Index = 0; Index < BootCount; Index++) {
577 UINTN BootOptionNumber;
589 CurrentBootOptionCount
592 BootOptionNumber = CurrentBootOptions[
Match].OptionNumber;
604 if (EFI_ERROR (Status)) {
607 "%a: failed to register \"%s\": %r\n",
609 BootOptions[Index].Description,
615 BootOptionNumber = BootOptions[Index].OptionNumber;
621 if (BootKeys[Index].UnicodeChar == L
'\0') {
632 if (EFI_ERROR (Status)) {
635 "%a: failed to register hotkey for \"%s\": %r\n",
637 BootOptions[Index].Description,
650PlatformRegisterOptionsAndKeys (
660 GetPlatformOptions ();
665 Enter.ScanCode = SCAN_NULL;
666 Enter.UnicodeChar = CHAR_CARRIAGE_RETURN;
673 F2.ScanCode = SCAN_F2;
674 F2.UnicodeChar = CHAR_NULL;
675 Esc.ScanCode = SCAN_ESC;
676 Esc.UnicodeChar = CHAR_NULL;
681 (UINT16)BootOption.OptionNumber,
686 ASSERT (Status ==
EFI_SUCCESS || Status == EFI_ALREADY_STARTED);
689 (UINT16)BootOption.OptionNumber,
694 ASSERT (Status ==
EFI_SUCCESS || Status == EFI_ALREADY_STARTED);
771 "PcdDefaultTerminalType must be TTYTERM"
775 "PcdUartDefaultParity must be set to an actual value, not 'default'"
779 "PcdUartDefaultStopBits must be set to an actual value, not 'default'"
782 CopyGuid (&mSerialConsole.TermType.
Guid, &gEfiTtyTermGuid);
803 PlatformRegisterOptionsAndKeys ();
818 DEBUG ((DEBUG_INFO,
"%a: processing capsules ...\n", __func__));
820 Status =
gBS->LocateProtocol (
821 &gEsrtManagementProtocolGuid,
823 (
VOID **)&EsrtManagement
825 if (!EFI_ERROR (Status)) {
826 EsrtManagement->SyncEsrtFmp ();
835 EFI_HOB_TYPE_UEFI_CAPSULE,
842 if (EFI_ERROR (Status)) {
845 "%a: failed to process capsule %p - %r\n",
854 HobPointer.Raw = GET_NEXT_HOB (HobPointer);
860 "%a: capsule update successful, resetting ...\n",
869#define VERSION_STRING_PREFIX L"Tianocore/EDK2 firmware version "
888 UINT32 DiscoveryPolicy;
889 UINT32 DiscoveryPolicyOld;
894 Size =
sizeof (DiscoveryPolicy);
895 Status =
gRT->GetVariable (
896 BOOT_DISCOVERY_POLICY_VAR,
897 &gBootDiscoveryPolicyMgrFormsetGuid,
902 if (Status == EFI_NOT_FOUND) {
903 DiscoveryPolicy =
PcdGet32 (PcdBootDiscoveryPolicy);
904 Status =
PcdSet32S (PcdBootDiscoveryPolicy, DiscoveryPolicy);
905 if (Status == EFI_NOT_FOUND) {
907 }
else if (EFI_ERROR (Status)) {
910 }
else if (EFI_ERROR (Status)) {
914 if (DiscoveryPolicy == BDP_CONNECT_MINIMAL) {
918 switch (DiscoveryPolicy) {
919 case BDP_CONNECT_NET:
920 Class = &gEfiBootManagerPolicyNetworkGuid;
922 case BDP_CONNECT_ALL:
923 Class = &gEfiBootManagerPolicyConnectAllGuid;
928 "%a - Unexpected DiscoveryPolicy (0x%x). Run Minimal Discovery Policy\n",
935 Status =
gBS->LocateProtocol (
936 &gEfiBootManagerPolicyProtocolGuid,
940 if (EFI_ERROR (Status)) {
943 "%a - Failed to locate gEfiBootManagerPolicyProtocolGuid."
944 "Driver connect will be skipped.\n",
950 Status = BMPolicy->ConnectDeviceClass (BMPolicy, Class);
951 if (EFI_ERROR (Status)) {
952 DEBUG ((DEBUG_ERROR,
"%a - ConnectDeviceClass returns - %r\n", __func__, Status));
959 Size =
sizeof (DiscoveryPolicyOld);
960 Status =
gRT->GetVariable (
961 BOOT_DISCOVERY_POLICY_OLD_VAR,
962 &gBootDiscoveryPolicyMgrFormsetGuid,
967 if ((Status == EFI_NOT_FOUND) || (DiscoveryPolicyOld != DiscoveryPolicy)) {
970 Status =
gRT->SetVariable (
971 BOOT_DISCOVERY_POLICY_OLD_VAR,
972 &gBootDiscoveryPolicyMgrFormsetGuid,
974 sizeof (DiscoveryPolicyOld),
1001 UINTN FirmwareVerLength;
1012 if (EFI_ERROR (Status)) {
1013 if (FirmwareVerLength > 0) {
1015 VERSION_STRING_PREFIX L
"%s\n",
1020 Print (L
"Press ESCAPE for boot options ");
1021 }
else if (FirmwareVerLength > 0) {
1022 Status =
gBS->HandleProtocol (
1024 &gEfiGraphicsOutputProtocolGuid,
1025 (
VOID **)&GraphicsOutput
1027 if (!EFI_ERROR (Status)) {
1028 PosX = (GraphicsOutput->Mode->Info->HorizontalResolution -
1029 (
StrLen (VERSION_STRING_PREFIX) + FirmwareVerLength) *
1030 EFI_GLYPH_WIDTH) / 2;
1038 VERSION_STRING_PREFIX L
"%s",
1062 Key.ScanCode = SCAN_NULL;
1063 Key.UnicodeChar = L
's';
1076 UINT16 TimeoutRemain
1084 Timeout =
PcdGet16 (PcdPlatformBootTimeOut);
1086 Black.Raw = 0x00000000;
1087 White.Raw = 0x00FFFFFF;
1092 L
"Press ESCAPE for boot options",
1094 (Timeout - TimeoutRemain) * 100 / Timeout,
1097 if (EFI_ERROR (Status)) {
1118 UINTN OldBootOptionCount;
1119 UINTN NewBootOptionCount;
1125 &OldBootOptionCount,
1143 &gUefiShellFileGuid,
1144 L
"UEFI Shell (default)"
1152 &NewBootOptionCount,
1164 if (!
PcdGetBool (PcdEmuVariableNvModeEnable)) {
1165 if (NewBootOptionCount != OldBootOptionCount) {
1168 "%a: rebooting after refreshing all boot options\n",
1176 if (EFI_ERROR (Status)) {
VOID *EFIAPI GetNextHob(IN UINT16 Type, IN CONST VOID *HobStart)
VOID *EFIAPI GetHobList(VOID)
VOID EFIAPI CpuDeadLoop(VOID)
UINTN EFIAPI StrLen(IN CONST CHAR16 *String)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
GUID *EFIAPI CopyGuid(OUT GUID *DestinationGuid, IN CONST GUID *SourceGuid)
EFI_STATUS EFIAPI BootLogoUpdateProgress(IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleForeground, IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL TitleBackground, IN CHAR16 *Title, IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL ProgressColor, IN UINTN Progress, IN UINTN PreviousValue)
EFI_STATUS EFIAPI BootLogoEnableLogo(VOID)
EFI_STATUS EFIAPI ProcessCapsuleImage(IN EFI_CAPSULE_HEADER *CapsuleHeader)
#define HARDWARE_DEVICE_PATH
#define MESSAGING_DEVICE_PATH
EFI_DEVICE_PATH_PROTOCOL *EFIAPI AppendDevicePathNode(IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL, IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathNode OPTIONAL)
EFI_DEVICE_PATH_PROTOCOL *EFIAPI DevicePathFromHandle(IN EFI_HANDLE Handle)
CHAR16 *EFIAPI ConvertDevicePathToText(IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN BOOLEAN DisplayOnly, IN BOOLEAN AllowShortcuts)
VOID EFIAPI FreePool(IN VOID *Buffer)
STATIC VOID PlatformRegisterFvBootOption(CONST EFI_GUID *FileGuid, CHAR16 *Description, UINT32 Attributes)
EFI_RUNTIME_SERVICES * gRT
#define ASSERT_EFI_ERROR(StatusParameter)
#define DEBUG(Expression)
#define PcdGet16(TokenName)
#define FixedPcdGet64(TokenName)
#define FixedPcdGetBool(TokenName)
#define PcdGet32(TokenName)
#define PcdGetBool(TokenName)
#define FixedPcdGet8(TokenName)
#define PcdSet32S(TokenName, Value)
#define PcdGetPtr(TokenName)
#define IS_PCI_DISPLAY(_p)
STATIC BOOLEAN Match(IN CONST CHAR16 *Translated, IN UINTN TranslatedLength, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
EFI_STATUS EFIAPI EfiBootManagerDispatchDeferredImages(VOID)
VOID EFIAPI EfiBootManagerBoot(IN EFI_BOOT_MANAGER_LOAD_OPTION *BootOption)
EFI_STATUS EFIAPI EfiBootManagerFreeLoadOption(IN EFI_BOOT_MANAGER_LOAD_OPTION *LoadOption)
EFI_STATUS EFIAPI EfiBootManagerRegisterContinueKeyOption(IN UINT32 Modifier,...)
EFI_STATUS EFIAPI EfiBootManagerUpdateConsoleVariable(IN CONSOLE_TYPE ConsoleType, IN EFI_DEVICE_PATH_PROTOCOL *CustomizedConDevicePath, IN EFI_DEVICE_PATH_PROTOCOL *ExclusiveDevicePath)
EFI_BOOT_MANAGER_LOAD_OPTION *EFIAPI EfiBootManagerGetLoadOptions(OUT UINTN *LoadOptionCount, IN EFI_BOOT_MANAGER_LOAD_OPTION_TYPE LoadOptionType)
VOID EFIAPI EfiBootManagerRefreshAllBootOption(VOID)
EFI_STATUS EFIAPI EfiBootManagerAddLoadOptionVariable(IN OUT EFI_BOOT_MANAGER_LOAD_OPTION *Option, IN UINTN Position)
EFI_STATUS EFIAPI EfiBootManagerFreeLoadOptions(IN EFI_BOOT_MANAGER_LOAD_OPTION *LoadOptions, IN UINTN LoadOptionCount)
INTN EFIAPI EfiBootManagerFindLoadOption(IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Key, IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Array, IN UINTN Count)
VOID EFIAPI EfiBootManagerConnectAll(VOID)
EFI_STATUS EFIAPI EfiBootManagerGetBootManagerMenu(EFI_BOOT_MANAGER_LOAD_OPTION *BootOption)
EFI_STATUS EFIAPI EfiBootManagerInitializeLoadOption(IN OUT EFI_BOOT_MANAGER_LOAD_OPTION *Option, IN UINTN OptionNumber, IN EFI_BOOT_MANAGER_LOAD_OPTION_TYPE OptionType, IN UINT32 Attributes, IN CHAR16 *Description, IN EFI_DEVICE_PATH_PROTOCOL *FilePath, IN UINT8 *OptionalData, IN UINT32 OptionalDataSize)
EFI_STATUS EFIAPI EfiBootManagerAddKeyOptionVariable(OUT EFI_BOOT_MANAGER_KEY_OPTION *AddedOption OPTIONAL, IN UINT16 BootOptionNumber, IN UINT32 Modifier,...)
UINTN EFIAPI PrintXY(IN UINTN PointX, IN UINTN PointY, IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *ForeGround OPTIONAL, IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackGround OPTIONAL, IN CONST CHAR16 *Format,...)
EFI_STATUS EFIAPI EfiEventGroupSignal(IN CONST EFI_GUID *EventGroup)
VOID EFIAPI EfiInitializeFwVolDevicepathNode(IN OUT MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvDevicePathNode, IN CONST EFI_GUID *NameGuid)
UINTN EFIAPI Print(IN CONST CHAR16 *Format,...)
#define EFI_VARIABLE_NON_VOLATILE
EFI_PHYSICAL_ADDRESS BaseAddress
EFI_HANDLE DeviceHandle
The device handle that the EFI Image was loaded from.
EFI_PCI_IO_PROTOCOL_CONFIG Read
EFI_HANDLE ConsoleOutHandle