From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mx.groups.io with SMTP id smtpd.web10.2431.1576287159626860661 for ; Fri, 13 Dec 2019 17:32:39 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.88, mailfrom: prince.agyeman@intel.com) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Dec 2019 17:32:38 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,311,1571727600"; d="scan'208";a="297091520" Received: from paagyema-desk2.amr.corp.intel.com ([10.24.15.84]) by orsmga001.jf.intel.com with ESMTP; 13 Dec 2019 17:32:38 -0800 From: "Agyeman, Prince" To: devel@edk2.groups.io Cc: Michael Kubacki , Chasel Chiu , Nate DeSimone Subject: [edk2-platforms] [PATCH 05/11] MinPlatformPkg: Add BDS Hook Points Date: Fri, 13 Dec 2019 17:32:31 -0800 Message-Id: X-Mailer: git-send-email 2.19.1.windows.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2336 Added BDS hook points to the Minplatform boot manager library as defined in the Minimum Platfrom specifcations. Changes made: * Added functions to signal three BDS event groups. These event groups are BeforeConsoleAfterTrustedConsole, BeforeConsoleBeforeEndOfDxe and AfterConsoleReadyBeforeBootOption. * Removed BDS functionalities from the boot manager library. These functionalities will be added to callbacks a module in BoardModule, which will then register/hook to the BDS hook points See https://edk2-docs.gitbooks.io/edk-ii-minimum-platform-specification, under Appendix A.3 BDS Hook Points, for more details. Cc: Michael Kubacki Cc: Chasel Chiu Cc: Nate DeSimone Signed-off-by: Prince Agyeman --- .../DxePlatformBootManagerLib/BdsPlatform.c | 1262 ++--------------- .../DxePlatformBootManagerLib/BdsPlatform.h | 181 +-- .../DxePlatformBootManagerLib.inf | 51 +- .../DxePlatformBootManagerLib/MemoryTest.c | 83 -- .../PlatformBootOption.c | 559 -------- 5 files changed, 112 insertions(+), 2024 deletions(-) delete mode 100644 Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/MemoryTest.c delete mode 100644 Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/PlatformBootOption.c diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c index 491fb0f26f..31a9ef4a07 100644 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c +++ b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.c @@ -1,130 +1,14 @@ /** @file This file include all platform action which can be customized by IBV/OEM. -Copyright (c) 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "BdsPlatform.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -#include - -GLOBAL_REMOVE_IF_UNREFERENCED EFI_BOOT_MODE gBootMode; - -BOOLEAN gPPRequireUIConfirm; - -extern UINTN mBootMenuOptionNumber; - -GLOBAL_REMOVE_IF_UNREFERENCED USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboardDevicePath = { - { - { - MESSAGING_DEVICE_PATH, - MSG_USB_CLASS_DP, - { - (UINT8) (sizeof (USB_CLASS_DEVICE_PATH)), - (UINT8) ((sizeof (USB_CLASS_DEVICE_PATH)) >> 8) - } - }, - 0xffff, // VendorId - 0xffff, // ProductId - CLASS_HID, // DeviceClass - SUBCLASS_BOOT, // DeviceSubClass - PROTOCOL_KEYBOARD // DeviceProtocol - }, - gEndEntire -}; - -// -// Internal shell mode -// -GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mShellModeColumn; -GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mShellModeRow; -GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mShellHorizontalResolution; -GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mShellVerticalResolution; -// -// BDS Platform Functions -// - -BOOLEAN -IsMorBitSet ( - VOID - ) -{ - UINTN MorControl; - EFI_STATUS Status; - UINTN DataSize; - - // - // Check if the MOR bit is set. - // - DataSize = sizeof (MorControl); - Status = gRT->GetVariable ( - MEMORY_OVERWRITE_REQUEST_VARIABLE_NAME, - &gEfiMemoryOverwriteControlDataGuid, - NULL, - &DataSize, - &MorControl - ); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_INFO, " PlatformBootMangerLib: gEfiMemoryOverwriteControlDataGuid doesn't exist!!***\n")); - MorControl = 0; - } else { - DEBUG ((DEBUG_INFO, " PlatformBootMangerLib: Get the gEfiMemoryOverwriteControlDataGuid = %x!!***\n", MorControl)); - } - - return (BOOLEAN) (MorControl & 0x01); -} - -VOID -DumpDevicePath ( - IN CHAR16 *Name, - IN EFI_DEVICE_PATH *DevicePath - ) -{ - CHAR16 *Str; - - Str = ConvertDevicePathToText(DevicePath, TRUE, TRUE); - DEBUG ((DEBUG_INFO, "%s: %s\n", Name, Str)); - if (Str != NULL) { - FreePool (Str); - } -} - -/** - An empty function to pass error checking of CreateEventEx (). - - This empty function ensures that EVT_NOTIFY_SIGNAL_ALL is error - checked correctly since it is now mapped into CreateEventEx() in UEFI 2.0. - - @param Event Event whose notification function is being invoked. - @param Context The pointer to the notification function's context, - which is implementation-dependent. -**/ -VOID -EFIAPI -InternalBdsEmptyCallbackFuntion ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - return; -} +extern UINTN mBootMenuOptionNumber; VOID ExitPmAuth ( @@ -145,7 +29,7 @@ ExitPmAuth ( Status = gBS->CreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_CALLBACK, - InternalBdsEmptyCallbackFuntion, + EfiEventEmptyFunction, NULL, &gEfiEndOfDxeEventGroupGuid, &EndOfDxeEvent @@ -172,918 +56,134 @@ ExitPmAuth ( DEBUG((DEBUG_INFO,"ExitPmAuth ()- End\n")); } -VOID -ConnectRootBridge ( - BOOLEAN Recursive - ) -{ - UINTN RootBridgeHandleCount; - EFI_HANDLE *RootBridgeHandleBuffer; - UINTN RootBridgeIndex; - - RootBridgeHandleCount = 0; - gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiPciRootBridgeIoProtocolGuid, - NULL, - &RootBridgeHandleCount, - &RootBridgeHandleBuffer - ); - for (RootBridgeIndex = 0; RootBridgeIndex < RootBridgeHandleCount; RootBridgeIndex++) { - gBS->ConnectController (RootBridgeHandleBuffer[RootBridgeIndex], NULL, NULL, Recursive); - } -} - /** - Return whether the device is trusted console. - - @param Device The device to be tested. - - @retval TRUE The device can be trusted. - @retval FALSE The device cannot be trusted. -**/ -BOOLEAN -IsTrustedConsole ( - IN CONSOLE_TYPE ConsoleType, - IN EFI_DEVICE_PATH_PROTOCOL *Device - ) -{ - VOID *TrustedConsoleDevicepath; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - EFI_DEVICE_PATH_PROTOCOL *Instance; - UINTN Size; - EFI_DEVICE_PATH_PROTOCOL *ConsoleDevice; - - if (Device == NULL) { - return FALSE; - } - - ConsoleDevice = DuplicateDevicePath(Device); - - TrustedConsoleDevicepath = NULL; - - switch (ConsoleType) { - case ConIn: - TrustedConsoleDevicepath = PcdGetPtr (PcdTrustedConsoleInputDevicePath); - break; - case ConOut: - // - // Check GOP and remove last node - // - TempDevicePath = ConsoleDevice; - while (!IsDevicePathEndType (TempDevicePath)) { - if (DevicePathType (TempDevicePath) == ACPI_DEVICE_PATH && - DevicePathSubType (TempDevicePath) == ACPI_ADR_DP) { - SetDevicePathEndNode (TempDevicePath); - break; - } - TempDevicePath = NextDevicePathNode (TempDevicePath); - } - - TrustedConsoleDevicepath = PcdGetPtr (PcdTrustedConsoleOutputDevicePath); - break; - default: - ASSERT(FALSE); - break; - } - - TempDevicePath = TrustedConsoleDevicepath; - do { - Instance = GetNextDevicePathInstance (&TempDevicePath, &Size); - if (Instance == NULL) { - break; - } - - if (CompareMem (ConsoleDevice, Instance, Size - END_DEVICE_PATH_LENGTH) == 0) { - FreePool (Instance); - FreePool (ConsoleDevice); - return TRUE; - } - - FreePool (Instance); - } while (TempDevicePath != NULL); - - FreePool (ConsoleDevice); + Creates an EFI event in the BDS Event Group. - return FALSE; -} - -BOOLEAN -IsUsbShortForm ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath - ) -{ - if ((DevicePathType (DevicePath) == MESSAGING_DEVICE_PATH) && - ((DevicePathSubType (DevicePath) == MSG_USB_CLASS_DP) || (DevicePathSubType (DevicePath) == MSG_USB_WWID_DP)) ) { - return TRUE; - } + @param NotifyTpl The task priority level of the event. + @param gEfiEventGuid The GUID of the event group to signal. + @param BdsConsoleEvent Returns the EFI event returned from gBS->CreateEvent(Ex). - return FALSE; -} - -/** - Connect the USB short form device path. + @retval EFI_SUCCESS Event was created. + @retval Other Event was not created. - @param DevicePath USB short form device path - - @retval EFI_SUCCESS Successfully connected the USB device - @retval EFI_NOT_FOUND Cannot connect the USB device - @retval EFI_INVALID_PARAMETER The device path is invalid. **/ EFI_STATUS -ConnectUsbShortFormDevicePath ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath +EFIAPI +CreateBdsEvent ( + IN EFI_TPL NotifyTpl, + IN EFI_GUID *gEfiEventGuid, + OUT EFI_EVENT *BdsConsoleEvent ) { - EFI_STATUS Status; - EFI_HANDLE *Handles; - UINTN HandleCount; - UINTN Index; - EFI_PCI_IO_PROTOCOL *PciIo; - UINT8 Class[3]; - BOOLEAN AtLeastOneConnected; + EFI_STATUS Status; - // - // Check the passed in parameters - // - if (DevicePath == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (!IsUsbShortForm (DevicePath)) { - return EFI_INVALID_PARAMETER; - } + ASSERT (BdsConsoleEvent != NULL); - // - // Find the usb host controller firstly, then connect with the remaining device path - // - AtLeastOneConnected = FALSE; - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiPciIoProtocolGuid, + Status = gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + NotifyTpl, + EfiEventEmptyFunction, NULL, - &HandleCount, - &Handles - ); - for (Index = 0; Index < HandleCount; Index++) { - Status = gBS->HandleProtocol ( - Handles[Index], - &gEfiPciIoProtocolGuid, - (VOID **) &PciIo - ); - if (!EFI_ERROR (Status)) { - // - // Check whether the Pci device is the wanted usb host controller - // - Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Class); - if (!EFI_ERROR (Status) && - ((PCI_CLASS_SERIAL == Class[2]) && (PCI_CLASS_SERIAL_USB == Class[1])) - ) { - Status = gBS->ConnectController ( - Handles[Index], - NULL, - DevicePath, - FALSE - ); - if (!EFI_ERROR(Status)) { - AtLeastOneConnected = TRUE; - } - } - } - } - - return AtLeastOneConnected ? EFI_SUCCESS : EFI_NOT_FOUND; -} - -/** - Update the ConIn variable with USB Keyboard device path,if its not already exists in ConIn -**/ -VOID -EnumUsbKeyboard ( - VOID - ) -{ - DEBUG ((DEBUG_INFO, "[EnumUsbKeyboard]\n")); - EfiBootManagerUpdateConsoleVariable (ConIn, (EFI_DEVICE_PATH_PROTOCOL *) &gUsbClassKeyboardDevicePath, NULL); - - // - // Append Usb Keyboard short form DevicePath into "ConInDev" - // - EfiBootManagerUpdateConsoleVariable (ConInDev, (EFI_DEVICE_PATH_PROTOCOL *) &gUsbClassKeyboardDevicePath, NULL); -} - -BOOLEAN -IsVgaHandle ( - IN EFI_HANDLE Handle - ) -{ - EFI_PCI_IO_PROTOCOL *PciIo; - PCI_TYPE00 Pci; - EFI_STATUS Status; - - Status = gBS->HandleProtocol ( - Handle, - &gEfiPciIoProtocolGuid, - (VOID **)&PciIo - ); - if (!EFI_ERROR (Status)) { - Status = PciIo->Pci.Read ( - PciIo, - EfiPciIoWidthUint32, - 0, - sizeof (Pci) / sizeof (UINT32), - &Pci - ); - if (!EFI_ERROR (Status)) { - if (IS_PCI_VGA (&Pci) || IS_PCI_OLD_VGA (&Pci)) { - return TRUE; - } - } - } - return FALSE; -} - -EFI_HANDLE -IsVideoController ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath - ) -{ - EFI_DEVICE_PATH_PROTOCOL *DupDevicePath; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - EFI_STATUS Status; - EFI_HANDLE DeviceHandle; - - DupDevicePath = DuplicateDevicePath (DevicePath); - ASSERT (DupDevicePath != NULL); - if (DupDevicePath == NULL) { - return NULL; - } - - TempDevicePath = DupDevicePath; - Status = gBS->LocateDevicePath ( - &gEfiDevicePathProtocolGuid, - &TempDevicePath, - &DeviceHandle + gEfiEventGuid, + BdsConsoleEvent ); - FreePool (DupDevicePath); - if (EFI_ERROR (Status)) { - return NULL; - } - - if (IsVgaHandle (DeviceHandle)) { - return DeviceHandle; - } else { - return NULL; - } -} - -BOOLEAN -IsGopDevicePath ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath - ) -{ - while (!IsDevicePathEndType (DevicePath)) { - if (DevicePathType (DevicePath) == ACPI_DEVICE_PATH && - DevicePathSubType (DevicePath) == ACPI_ADR_DP) { - return TRUE; - } - DevicePath = NextDevicePathNode (DevicePath); - } - return FALSE; -} - -/** - Remove all GOP device path instance from DevicePath and add the Gop to the DevicePath. -**/ -EFI_DEVICE_PATH_PROTOCOL * -UpdateGopDevicePath ( - EFI_DEVICE_PATH_PROTOCOL *DevicePath, - EFI_DEVICE_PATH_PROTOCOL *Gop - ) -{ - UINTN Size; - UINTN GopSize; - EFI_DEVICE_PATH_PROTOCOL *Temp; - EFI_DEVICE_PATH_PROTOCOL *Return; - EFI_DEVICE_PATH_PROTOCOL *Instance; - BOOLEAN Exist; - - Exist = FALSE; - Return = NULL; - GopSize = GetDevicePathSize (Gop); - do { - Instance = GetNextDevicePathInstance (&DevicePath, &Size); - if (Instance == NULL) { - break; - } - if (!IsGopDevicePath (Instance) || - (Size == GopSize && CompareMem (Instance, Gop, GopSize) == 0) - ) { - if (Size == GopSize && CompareMem (Instance, Gop, GopSize) == 0) { - Exist = TRUE; - } - Temp = Return; - Return = AppendDevicePathInstance (Return, Instance); - if (Temp != NULL) { - FreePool (Temp); - } - } - FreePool (Instance); - } while (DevicePath != NULL); - if (!Exist) { - Temp = Return; - Return = AppendDevicePathInstance (Return, Gop); - if (Temp != NULL) { - FreePool (Temp); - } - } - return Return; + return Status; } /** - Get Graphics Controller Handle. - - @retval GraphicsController Successfully located - @retval NULL Failed to locate -**/ -EFI_HANDLE -EFIAPI -GetGraphicsController ( - IN BOOLEAN NeedTrustedConsole - ) -{ - EFI_STATUS Status; - UINTN Index; - EFI_HANDLE *PciHandles; - UINTN PciHandlesSize; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiPciIoProtocolGuid, - NULL, - &PciHandlesSize, - &PciHandles - ); - if (EFI_ERROR (Status)) { - return NULL; - } - - for (Index = 0; Index < PciHandlesSize; Index++) { - Status = gBS->HandleProtocol ( - PciHandles[Index], - &gEfiDevicePathProtocolGuid, - (VOID **) &DevicePath - ); - if (EFI_ERROR(Status)) { - continue; - } - if (!IsVgaHandle (PciHandles[Index])) { - continue; - } - if ((NeedTrustedConsole && IsTrustedConsole (ConOut, DevicePath)) || - ((!NeedTrustedConsole) && (!IsTrustedConsole (ConOut, DevicePath)))) { - return PciHandles[Index]; - } - } - - return NULL; -} - -VOID -UpdateGraphicConOut ( - IN BOOLEAN NeedTrustedConsole - ) -{ - EFI_HANDLE GraphicsControllerHandle; - EFI_DEVICE_PATH_PROTOCOL *GopDevicePath; - EFI_DEVICE_PATH_PROTOCOL *ConOutDevicePath; - EFI_DEVICE_PATH_PROTOCOL *UpdatedConOutDevicePath; + Create, Signal, and Close the Bds Event Before Console After + Trusted Console event using CreateBdsEvent(). - // - // Update ConOut variable - // - GraphicsControllerHandle = GetGraphicsController (NeedTrustedConsole); - if (GraphicsControllerHandle != NULL) { - // - // Connect the GOP driver - // - gBS->ConnectController (GraphicsControllerHandle, NULL, NULL, TRUE); - - // - // Get the GOP device path - // NOTE: We may get a device path that contains Controller node in it. - // - GopDevicePath = EfiBootManagerGetGopDevicePath (GraphicsControllerHandle); - if (GopDevicePath != NULL) { - GetEfiGlobalVariable2 (L"ConOut", (VOID **)&ConOutDevicePath, NULL); - UpdatedConOutDevicePath = UpdateGopDevicePath (ConOutDevicePath, GopDevicePath); - if (ConOutDevicePath != NULL) { - FreePool (ConOutDevicePath); - } - FreePool (GopDevicePath); - gRT->SetVariable ( - L"ConOut", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS, - GetDevicePathSize (UpdatedConOutDevicePath), - UpdatedConOutDevicePath - ); - } - } -} - -VOID -AddConsoleVariable ( - IN CONSOLE_TYPE ConsoleType, - IN EFI_DEVICE_PATH *ConsoleDevicePath - ) -{ - EFI_DEVICE_PATH *TempDevicePath; - EFI_DEVICE_PATH *Instance; - UINTN Size; - EFI_HANDLE GraphicsControllerHandle; - EFI_DEVICE_PATH *GopDevicePath; - - TempDevicePath = ConsoleDevicePath; - do { - Instance = GetNextDevicePathInstance (&TempDevicePath, &Size); - if (Instance == NULL) { - break; - } - - switch (ConsoleType) { - case ConIn: - if (IsUsbShortForm (Instance)) { - // - // Append Usb Keyboard short form DevicePath into "ConInDev" - // - EfiBootManagerUpdateConsoleVariable (ConInDev, Instance, NULL); - } - EfiBootManagerUpdateConsoleVariable (ConsoleType, Instance, NULL); - break; - case ConOut: - GraphicsControllerHandle = IsVideoController (Instance); - if (GraphicsControllerHandle == NULL) { - EfiBootManagerUpdateConsoleVariable (ConsoleType, Instance, NULL); - } else { - // - // Connect the GOP driver - // - gBS->ConnectController (GraphicsControllerHandle, NULL, NULL, TRUE); - // - // Get the GOP device path - // NOTE: We may get a device path that contains Controller node in it. - // - GopDevicePath = EfiBootManagerGetGopDevicePath (GraphicsControllerHandle); - if (GopDevicePath != NULL) { - EfiBootManagerUpdateConsoleVariable (ConsoleType, GopDevicePath, NULL); - } - } - break; - default: - ASSERT(FALSE); - break; - } - - FreePool (Instance); - } while (TempDevicePath != NULL); -} - -/** - The function connects the trusted consoles. **/ VOID -ConnectTrustedConsole ( +EFIAPI +BdsSignalEventBeforeConsoleAfterTrustedConsole ( VOID ) { - EFI_DEVICE_PATH_PROTOCOL *Consoles; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - EFI_DEVICE_PATH_PROTOCOL *Instance; - EFI_DEVICE_PATH_PROTOCOL *Next; - UINTN Size; - UINTN Index; - EFI_HANDLE Handle; - EFI_STATUS Status; - CHAR16 *ConsoleVar[] = {L"ConIn", L"ConOut"}; - VOID *TrustedConsoleDevicepath; + EFI_STATUS Status; + EFI_EVENT BdsConsoleEvent; - TrustedConsoleDevicepath = PcdGetPtr (PcdTrustedConsoleInputDevicePath); - DumpDevicePath (L"TrustedConsoleIn", TrustedConsoleDevicepath); - TrustedConsoleDevicepath = PcdGetPtr (PcdTrustedConsoleOutputDevicePath); - DumpDevicePath (L"TrustedConsoleOut", TrustedConsoleDevicepath); + DEBUG ((DEBUG_INFO, "%a \n", __FUNCTION__)); - for (Index = 0; Index < sizeof (ConsoleVar) / sizeof (ConsoleVar[0]); Index++) { - - GetEfiGlobalVariable2 (ConsoleVar[Index], (VOID **)&Consoles, NULL); + Status = CreateBdsEvent ( + TPL_CALLBACK, + &gBdsEventBeforeConsoleAfterTrustedConsoleGuid, + &BdsConsoleEvent + ); - TempDevicePath = Consoles; - do { - Instance = GetNextDevicePathInstance (&TempDevicePath, &Size); - if (Instance == NULL) { - break; - } - if (IsTrustedConsole (Index, Instance)) { - if (IsUsbShortForm (Instance)) { - ConnectUsbShortFormDevicePath (Instance); - } else { - for (Next = Instance; !IsDevicePathEnd (Next); Next = NextDevicePathNode (Next)) { - if (DevicePathType (Next) == ACPI_DEVICE_PATH && DevicePathSubType (Next) == ACPI_ADR_DP) { - break; - } else if (DevicePathType (Next) == HARDWARE_DEVICE_PATH && - DevicePathSubType (Next) == HW_CONTROLLER_DP && - DevicePathType (NextDevicePathNode (Next)) == ACPI_DEVICE_PATH && - DevicePathSubType (NextDevicePathNode (Next)) == ACPI_ADR_DP - ) { - break; - } - } - if (!IsDevicePathEnd (Next)) { - SetDevicePathEndNode (Next); - Status = EfiBootManagerConnectDevicePath (Instance, &Handle); - if (!EFI_ERROR (Status)) { - gBS->ConnectController (Handle, NULL, NULL, TRUE); - } - } else { - EfiBootManagerConnectDevicePath (Instance, NULL); - } - } - } - FreePool (Instance); - } while (TempDevicePath != NULL); + ASSERT_EFI_ERROR (Status); - if (Consoles != NULL) { - FreePool (Consoles); - } + if (!EFI_ERROR (Status)) { + gBS->SignalEvent (BdsConsoleEvent); + gBS->CloseEvent (BdsConsoleEvent); + DEBUG ((DEBUG_INFO,"All EventBeforeConsoleAfterTrustedConsole callbacks have returned successfully\n")); } } -/** - The function connects the trusted Storages. -**/ -VOID -ConnectTrustedStorage ( - VOID - ) -{ - VOID *TrustedStorageDevicepath; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - EFI_DEVICE_PATH_PROTOCOL *Instance; - UINTN Size; - EFI_DEVICE_PATH_PROTOCOL *TempStorageDevicePath; - EFI_STATUS Status; - EFI_HANDLE DeviceHandle; - - TrustedStorageDevicepath = PcdGetPtr (PcdTrustedStorageDevicePath); - DumpDevicePath (L"TrustedStorage", TrustedStorageDevicepath); - - TempDevicePath = TrustedStorageDevicepath; - do { - Instance = GetNextDevicePathInstance (&TempDevicePath, &Size); - if (Instance == NULL) { - break; - } - - EfiBootManagerConnectDevicePath (Instance, NULL); - - TempStorageDevicePath = Instance; - - Status = gBS->LocateDevicePath ( - &gEfiDevicePathProtocolGuid, - &TempStorageDevicePath, - &DeviceHandle - ); - if (!EFI_ERROR (Status)) { - gBS->ConnectController (DeviceHandle, NULL, NULL, FALSE); - } - - FreePool (Instance); - } while (TempDevicePath != NULL); -} - -/** - The function connects the trusted consoles and then call the PP processing library interface. -**/ -VOID -ProcessTcgPp ( - VOID - ) -{ - gPPRequireUIConfirm |= Tcg2PhysicalPresenceLibNeedUserConfirm(); - - if (gPPRequireUIConfirm) { - ConnectTrustedConsole (); - } - - Tcg2PhysicalPresenceLibProcessRequest (NULL); -} /** - The function connects the trusted storage to perform TPerReset. + Create, Signal, and Close the Bds Before Console Before End Of Dxe + event using CreateBdsEvent(). **/ VOID -ProcessTcgMor ( - VOID - ) -{ - if (IsMorBitSet ()) { - ConnectTrustedConsole(); - ConnectTrustedStorage(); - } -} - -/** - Check if current BootCurrent variable is internal shell boot option. - - @retval TRUE BootCurrent is internal shell. - @retval FALSE BootCurrent is not internal shell. -**/ -BOOLEAN -BootCurrentIsInternalShell ( +EFIAPI +BdsSignalEventBeforeConsoleBeforeEndOfDxe ( VOID ) { - UINTN VarSize; - UINT16 BootCurrent; - CHAR16 BootOptionName[16]; - UINT8 *BootOption; - UINT8 *Ptr; - BOOLEAN Result; - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; - EFI_DEVICE_PATH_PROTOCOL *LastDeviceNode; - EFI_GUID *GuidPoint; - - BootOption = NULL; - Result = FALSE; - - // - // Get BootCurrent variable - // - VarSize = sizeof (UINT16); - Status = gRT->GetVariable ( - L"BootCurrent", - &gEfiGlobalVariableGuid, - NULL, - &VarSize, - &BootCurrent - ); - if (EFI_ERROR (Status)) { - return FALSE; - } + EFI_STATUS Status; + EFI_EVENT BdsConsoleEvent; - // - // Create boot option Bootxxxx from BootCurrent - // - UnicodeSPrint (BootOptionName, sizeof(BootOptionName), L"Boot%04X", BootCurrent); + DEBUG ((DEBUG_INFO, "%a \n", __FUNCTION__)); - GetEfiGlobalVariable2 (BootOptionName, (VOID **) &BootOption, &VarSize); - if (BootOption == NULL || VarSize == 0) { - return FALSE; - } + Status = CreateBdsEvent ( + TPL_CALLBACK, + &gBdsEventBeforeConsoleBeforeEndOfDxeGuid, + &BdsConsoleEvent + ); - Ptr = BootOption; - Ptr += sizeof (UINT32); - Ptr += sizeof (UINT16); - Ptr += StrSize ((CHAR16 *) Ptr); - TempDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr; - LastDeviceNode = TempDevicePath; - while (!IsDevicePathEnd (TempDevicePath)) { - LastDeviceNode = TempDevicePath; - TempDevicePath = NextDevicePathNode (TempDevicePath); - } - GuidPoint = EfiGetNameGuidFromFwVolDevicePathNode ( - (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode - ); - if ((GuidPoint != NULL) && - ((CompareGuid (GuidPoint, &gUefiShellFileGuid))) - ) { - // - // if this option is internal shell, return TRUE - // - Result = TRUE; - } + ASSERT_EFI_ERROR (Status); - if (BootOption != NULL) { - FreePool (BootOption); - BootOption = NULL; + if (!EFI_ERROR (Status)) { + gBS->SignalEvent (BdsConsoleEvent); + gBS->CloseEvent (BdsConsoleEvent); + DEBUG ((DEBUG_INFO,"All BeforeConsoleBeforeEndOfDxe callbacks have returned successfully\n")); } - - return Result; } /** - This function will change video resolution and text mode - for internl shell when internal shell is launched. - - @param None. - - @retval EFI_SUCCESS Mode is changed successfully. - @retval Others Mode failed to changed. + Create, Signal, and Close the Bds After Console Ready Before Boot Option + using CreateBdsEvent(). **/ -EFI_STATUS +VOID EFIAPI -ChangeModeForInternalShell ( +BdsSignalEventAfterConsoleReadyBeforeBootOption ( VOID ) { - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut; - UINTN SizeOfInfo; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; - UINT32 MaxGopMode; - UINT32 MaxTextMode; - UINT32 ModeNumber; - UINTN HandleCount; - EFI_HANDLE *HandleBuffer; - EFI_STATUS Status; - UINTN Index; - UINTN CurrentColumn; - UINTN CurrentRow; - - Status = gBS->HandleProtocol ( - gST->ConsoleOutHandle, - &gEfiGraphicsOutputProtocolGuid, - (VOID**)&GraphicsOutput - ); - if (EFI_ERROR (Status)) { - GraphicsOutput = NULL; - } - - Status = gBS->HandleProtocol ( - gST->ConsoleOutHandle, - &gEfiSimpleTextOutProtocolGuid, - (VOID**)&SimpleTextOut - ); - if (EFI_ERROR (Status)) { - SimpleTextOut = NULL; - } + EFI_STATUS Status; + EFI_EVENT BdsConsoleEvent; - if ((GraphicsOutput == NULL) || (SimpleTextOut == NULL)) { - return EFI_UNSUPPORTED; - } - - MaxGopMode = GraphicsOutput->Mode->MaxMode; - MaxTextMode = SimpleTextOut->Mode->MaxMode; - - // - // 1. If current video resolution is same with new video resolution, - // video resolution need not be changed. - // 1.1. If current text mode is same with new text mode, text mode need not be change. - // 1.2. If current text mode is different with new text mode, text mode need be change to new text mode. - // 2. If current video resolution is different with new video resolution, we need restart whole console drivers. - // - for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) { - Status = GraphicsOutput->QueryMode ( - GraphicsOutput, - ModeNumber, - &SizeOfInfo, - &Info - ); - if (!EFI_ERROR (Status)) { - if ((Info->HorizontalResolution == mShellHorizontalResolution) && - (Info->VerticalResolution == mShellVerticalResolution)) { - if ((GraphicsOutput->Mode->Info->HorizontalResolution == mShellHorizontalResolution) && - (GraphicsOutput->Mode->Info->VerticalResolution == mShellVerticalResolution)) { - // - // If current video resolution is same with new resolution, - // then check if current text mode is same with new text mode. - // - Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow); - ASSERT_EFI_ERROR (Status); - if (CurrentColumn == mShellModeColumn && CurrentRow == mShellModeRow) { - // - // Current text mode is same with new text mode, text mode need not be change. - // - FreePool (Info); - return EFI_SUCCESS; - } else { - // - // Current text mode is different with new text mode, text mode need be change to new text mode. - // - for (Index = 0; Index < MaxTextMode; Index++) { - Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow); - if (!EFI_ERROR(Status)) { - if ((CurrentColumn == mShellModeColumn) && (CurrentRow == mShellModeRow)) { - // - // New text mode is supported, set it. - // - Status = SimpleTextOut->SetMode (SimpleTextOut, Index); - ASSERT_EFI_ERROR (Status); - // - // Update text mode PCD. - // - Status = PcdSet32S (PcdConOutColumn, mShellModeColumn); - ASSERT_EFI_ERROR (Status); + DEBUG ((DEBUG_INFO, "%a \n", __FUNCTION__)); - Status = PcdSet32S (PcdConOutRow, mShellModeRow); - ASSERT_EFI_ERROR (Status); - - FreePool (Info); - return EFI_SUCCESS; - } - } - } - if (Index == MaxTextMode) { - // - // If new text mode is not supported, return error. - // - FreePool (Info); - return EFI_UNSUPPORTED; - } - } - } else { - FreePool (Info); - // - // If current video resolution is not same with the new one, set new video resolution. - // In this case, the driver which produces simple text out need be restarted. - // - Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber); - if (!EFI_ERROR (Status)) { - // - // Set PCD to restart GraphicsConsole and Consplitter to change video resolution - // and produce new text mode based on new resolution. - // - Status = PcdSet32S (PcdVideoHorizontalResolution, mShellHorizontalResolution); - ASSERT_EFI_ERROR (Status); - - Status = PcdSet32S (PcdVideoVerticalResolution, mShellVerticalResolution); - ASSERT_EFI_ERROR (Status); - - Status = PcdSet32S (PcdConOutColumn, mShellModeColumn); - ASSERT_EFI_ERROR (Status); - - Status = PcdSet32S (PcdConOutRow, mShellModeRow); - ASSERT_EFI_ERROR (Status); + Status = CreateBdsEvent ( + TPL_CALLBACK, + &gBdsEventAfterConsoleReadyBeforeBootOptionGuid, + &BdsConsoleEvent + ); - Status = gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiSimpleTextOutProtocolGuid, - NULL, - &HandleCount, - &HandleBuffer - ); - if (!EFI_ERROR (Status)) { - for (Index = 0; Index < HandleCount; Index++) { - gBS->DisconnectController (HandleBuffer[Index], NULL, NULL); - } - for (Index = 0; Index < HandleCount; Index++) { - gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE); - } - if (HandleBuffer != NULL) { - FreePool (HandleBuffer); - } - break; - } - } - } - } - FreePool (Info); - } - } + ASSERT_EFI_ERROR (Status); - if (ModeNumber == MaxGopMode) { - // - // If the new resolution is not supported, return error. - // - return EFI_UNSUPPORTED; + if (!EFI_ERROR (Status)) { + gBS->SignalEvent (BdsConsoleEvent); + gBS->CloseEvent (BdsConsoleEvent); + DEBUG ((DEBUG_INFO,"All AfterConsoleReadyBeforeBootOption callbacks have returned successfully\n")); } - - return EFI_SUCCESS; } -/** - ReadyToBoot callback to set video and text mode for internal shell boot. - That will not connect USB controller while CSM and FastBoot are disabled, we need to connect them - before booting to Shell for showing USB devices in Shell. - - When FastBoot is enabled and Windows Console is the chosen Console behavior, input devices will not be connected - by default. Hence, when booting to EFI shell, connecting input consoles are required. - - @param Event Pointer to this event - @param Context Event hanlder private data - - @retval None. -**/ -VOID -EFIAPI -OnReadyToBootCallBack ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - DEBUG ((EFI_D_INFO, "OnReadyToBootCallBack\n")); - - if (BootCurrentIsInternalShell ()) { - - ChangeModeForInternalShell (); - EfiBootManagerConnectAllDefaultConsoles(); - gDS->Dispatch (); - } -} /** Platform Bds init. Incude the platform firmware vendor, revision @@ -1095,149 +195,37 @@ PlatformBootManagerBeforeConsole ( VOID ) { - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *VarConOut; - EFI_DEVICE_PATH_PROTOCOL *VarConIn; - EFI_EVENT Event; DEBUG ((EFI_D_INFO, "PlatformBootManagerBeforeConsole\n")); - Status = EFI_SUCCESS; - - // - // Get user defined text mode for internal shell only once. - // - mShellHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution); - mShellVerticalResolution = PcdGet32 (PcdSetupVideoVerticalResolution); - mShellModeColumn = PcdGet32 (PcdSetupConOutColumn); - mShellModeRow = PcdGet32 (PcdSetupConOutRow); - - // - // Create event to set proper video resolution and text mode for internal shell. - // - Status = EfiCreateEventReadyToBootEx ( - TPL_CALLBACK, - OnReadyToBootCallBack, - NULL, - &Event - ); - ASSERT_EFI_ERROR (Status); - - // - // Connect Root Bridge to make PCI BAR resource allocated and all PciIo created - // - ConnectRootBridge (FALSE); - // - // Fill ConIn/ConOut in Full Configuration boot mode + // Trusted console can be added in a PciEnumComplete callback // - DEBUG ((DEBUG_INFO, "PlatformBootManagerInit - %x\n", gBootMode)); - - if (gBootMode == BOOT_WITH_FULL_CONFIGURATION || - gBootMode == BOOT_WITH_DEFAULT_SETTINGS || - gBootMode == BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS || - gBootMode == BOOT_IN_RECOVERY_MODE) { - - GetEfiGlobalVariable2 (L"ConOut", (VOID **)&VarConOut, NULL); if (VarConOut != NULL) { FreePool (VarConOut); } - GetEfiGlobalVariable2 (L"ConIn", (VOID **)&VarConIn, NULL); if (VarConIn != NULL) { FreePool (VarConIn); } - - // - // Only fill ConIn/ConOut when ConIn/ConOut is empty because we may drop to Full Configuration boot mode in non-first boot - // - if (VarConOut == NULL || VarConIn == NULL) { - if (PcdGetSize (PcdTrustedConsoleOutputDevicePath) >= sizeof(EFI_DEVICE_PATH_PROTOCOL)) { - AddConsoleVariable (ConOut, PcdGetPtr (PcdTrustedConsoleOutputDevicePath)); - } - if (PcdGetSize (PcdTrustedConsoleInputDevicePath) >= sizeof(EFI_DEVICE_PATH_PROTOCOL)) { - AddConsoleVariable (ConIn, PcdGetPtr (PcdTrustedConsoleInputDevicePath)); - } - } - } - EnumUsbKeyboard (); // - // For trusted console it must be handled here. + // Signal Before Console, after Trusted console Event // - UpdateGraphicConOut (TRUE); + BdsSignalEventBeforeConsoleAfterTrustedConsole (); // - // Dynamically register hot key: F2/F7/Enter + // Signal Before Console, before End of Dxe // - RegisterDefaultBootOption (); - RegisterStaticHotkey (); - - PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7010); - if (PcdGetBool (PcdTpm2Enable)) { - ProcessTcgPp (); - ProcessTcgMor (); - } - PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7011); + BdsSignalEventBeforeConsoleBeforeEndOfDxe (); // - // We should make all UEFI memory and GCD information populated before ExitPmAuth. - // SMM may consume these information. + // Signal End Of Dxe Event // - MemoryTest((EXTENDMEM_COVERAGE_LEVEL) PcdGet32 (PcdPlatformMemoryCheckLevel)); - PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7020); ExitPmAuth (); PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7021); // - // Dispatch the deferred 3rd party images. - // - EfiBootManagerDispatchDeferredImages (); - - // - // For non-trusted console it must be handled here. + // Deferred 3rd party images can be dispatched in + // an SmmReadyToLock callback // - UpdateGraphicConOut (FALSE); } -/** - Connect with predeined platform connect sequence, - the OEM/IBV can customize with their own connect sequence. - - @param[in] BootMode Boot mode of this boot. -**/ -VOID -ConnectSequence ( - IN EFI_BOOT_MODE BootMode - ) -{ - EfiBootManagerConnectAll (); -} - -/** - The function is to consider the boot order which is not in our expectation. - In the case that we need to re-sort the boot option. - - @retval TRUE Need to sort Boot Option. - @retval FALSE Don't need to sort Boot Option. -**/ -BOOLEAN -IsNeedSortBootOption ( - VOID - ) -{ - EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; - UINTN BootOptionCount; - - BootOptions = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot); - - // - // If setup is the first priority in boot option, we need to sort boot option. - // - if ((BootOptionCount > 1) && - (((StrnCmp (BootOptions->Description, L"Enter Setup", StrLen (L"Enter Setup"))) == 0) || - ((StrnCmp (BootOptions->Description, L"BootManagerMenuApp", StrLen (L"BootManagerMenuApp"))) == 0))) { - return TRUE; - } - - return FALSE; -} - /** The function will excute with as the platform policy, current policy is driven by boot mode. IBV/OEM can customize this code for their specific @@ -1254,65 +242,9 @@ PlatformBootManagerAfterConsole ( VOID ) { - EFI_BOOT_MODE LocalBootMode; - DEBUG ((EFI_D_INFO, "PlatformBootManagerAfterConsole\n")); - // - // Get current Boot Mode - // - LocalBootMode = gBootMode; - DEBUG ((DEBUG_INFO, "Current local bootmode - %x\n", LocalBootMode)); - - // - // Go the different platform policy with different boot mode - // Notes: this part code can be change with the table policy - // - switch (LocalBootMode) { - - case BOOT_ASSUMING_NO_CONFIGURATION_CHANGES: - case BOOT_WITH_MINIMAL_CONFIGURATION: - case BOOT_ON_S4_RESUME: - // - // Perform some platform specific connect sequence - // - PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7050); - ConnectSequence (LocalBootMode); - PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7051); - - break; - - case BOOT_WITH_FULL_CONFIGURATION: - case BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS: - case BOOT_WITH_DEFAULT_SETTINGS: - default: - // - // Perform some platform specific connect sequence - // - ConnectSequence (LocalBootMode); - - // - // Only in Full Configuration boot mode we do the enumeration of boot device - // - // - // Dispatch all but Storage Oprom explicitly, because we assume Int13Thunk driver is there. - // - EfiBootManagerRefreshAllBootOption (); - - if (IsNeedSortBootOption()) { - EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareBootOption); - } - // - // PXE boot option may appear after boot option enumeration - // - - break; - } - - Print (L"Press F7 for BootMenu!\n"); - - EfiBootManagerRefreshAllBootOption (); - EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareBootOption); + BdsSignalEventAfterConsoleReadyBeforeBootOption (); } /** @@ -1328,19 +260,19 @@ PlatformBootManagerUnableToBoot ( VOID ) { - EFI_STATUS Status; - EFI_BOOT_MANAGER_LOAD_OPTION BootDeviceList; - CHAR16 OptionName[sizeof ("Boot####")]; + BoardBootManagerUnableToBoot (); +} - if (mBootMenuOptionNumber == LoadOptionNumberUnassigned) { - return; - } - UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", mBootMenuOptionNumber); - Status = EfiBootManagerVariableToLoadOption (OptionName, &BootDeviceList); - if (EFI_ERROR (Status)) { - return; - } - for (;;) { - EfiBootManagerBoot (&BootDeviceList); - } +/** + This function is called each second during the boot manager waits the timeout. + + @param TimeoutRemain The remaining timeout. +**/ +VOID +EFIAPI +PlatformBootManagerWaitCallback ( + UINT16 TimeoutRemain + ) +{ + BoardBootManagerWaitCallback (TimeoutRemain); } diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.h b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.h index 360a00d7d7..031676cdc3 100644 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.h +++ b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/BdsPlatform.h @@ -1,7 +1,7 @@ /** @file Header file for BDS Platform specific code -Copyright (c) 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -9,176 +9,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #ifndef _BDS_PLATFORM_H #define _BDS_PLATFORM_H -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -/// -/// ConnectType -/// -#define CONSOLE_OUT 0x00000001 -#define STD_ERROR 0x00000002 -#define CONSOLE_IN 0x00000004 -#define CONSOLE_ALL (CONSOLE_OUT | CONSOLE_IN | STD_ERROR) - -extern EFI_GUID gUefiShellFileGuid; -extern EFI_BOOT_MODE gBootMode; - -#define gPciRootBridge \ - { \ - { \ - ACPI_DEVICE_PATH, \ - ACPI_DP, \ - { \ - (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)), \ - (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) \ - }, \ - }, \ - EISA_PNP_ID (0x0A03), \ - 0 \ - } - -#define gEndEntire \ - { \ - END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { END_DEVICE_PATH_LENGTH, 0 } \ - } - -typedef struct { - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - UINTN ConnectType; -} BDS_CONSOLE_CONNECT_ENTRY; - -// -// Platform Root Bridge -// -typedef struct { - ACPI_HID_DEVICE_PATH PciRootBridge; - EFI_DEVICE_PATH_PROTOCOL End; -} PLATFORM_ROOT_BRIDGE_DEVICE_PATH; - -// -// Below is the platform console device path -// -typedef struct { - ACPI_HID_DEVICE_PATH PciRootBridge; - PCI_DEVICE_PATH IsaBridge; - ACPI_HID_DEVICE_PATH Keyboard; - EFI_DEVICE_PATH_PROTOCOL End; -} PLATFORM_KEYBOARD_DEVICE_PATH; - -typedef struct { - ACPI_HID_DEVICE_PATH PciRootBridge; - PCI_DEVICE_PATH PciDevice; - EFI_DEVICE_PATH_PROTOCOL End; -} PLATFORM_ONBOARD_CONTROLLER_DEVICE_PATH; - -typedef struct { - ACPI_HID_DEVICE_PATH PciRootBridge; - PCI_DEVICE_PATH Pci0Device; - EFI_DEVICE_PATH_PROTOCOL End; -} PLATFORM_PEG_ROOT_CONTROLLER_DEVICE_PATH; - -typedef struct { - ACPI_HID_DEVICE_PATH PciRootBridge; - PCI_DEVICE_PATH PciBridge; - PCI_DEVICE_PATH PciDevice; - EFI_DEVICE_PATH_PROTOCOL End; -} PLATFORM_PCI_CONTROLLER_DEVICE_PATH; - -// -// Below is the boot option device path -// - -#define CLASS_HID 3 -#define SUBCLASS_BOOT 1 -#define PROTOCOL_KEYBOARD 1 - -typedef struct { - USB_CLASS_DEVICE_PATH UsbClass; - EFI_DEVICE_PATH_PROTOCOL End; -} USB_CLASS_FORMAT_DEVICE_PATH; - -extern USB_CLASS_FORMAT_DEVICE_PATH gUsbClassKeyboardDevicePath; - -// -// Platform BDS Functions -// - - -/** - Perform the memory test base on the memory test intensive level, - and update the memory resource. - - @param Level The memory test intensive level. - - @retval EFI_STATUS Success test all the system memory and update - the memory resource - -**/ -EFI_STATUS -MemoryTest ( - IN EXTENDMEM_COVERAGE_LEVEL Level - ); - -VOID -ConnectSequence ( - IN EFI_BOOT_MODE BootMode - ); - - -INTN -EFIAPI -CompareBootOption ( - CONST VOID *Left, - CONST VOID *Right - ); - - -VOID -RegisterStaticHotkey ( - VOID - ); -VOID -RegisterDefaultBootOption ( - VOID - ); + #include + #include + #include + #include + #include + #include + #include + #include #endif diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf index 388ffd808b..4f7299f1df 100644 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf +++ b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf @@ -23,23 +23,13 @@ [LibraryClasses] BaseLib - MemoryAllocationLib UefiBootServicesTableLib - UefiRuntimeServicesTableLib - BaseMemoryLib DebugLib - PcdLib - PrintLib - DevicePathLib UefiLib HobLib - DxeServicesLib - DxeServicesTableLib - HiiLib UefiBootManagerLib PerformanceLib - TimerLib - Tcg2PhysicalPresenceLib + BoardBootManagerLib [Packages] MdePkg/MdePkg.dec @@ -47,47 +37,18 @@ SecurityPkg/SecurityPkg.dec MinPlatformPkg/MinPlatformPkg.dec -[Pcd] - gMinPlatformPkgTokenSpaceGuid.PcdTpm2Enable ## CONSUMES - gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut ## PRODUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution ## PRODUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution ## PRODUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow ## PRODUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn ## PRODUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutColumn ## CONSUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow ## CONSUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution ## CONSUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution ## CONSUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdConInConnectOnDemand ## PRODUCES - gMinPlatformPkgTokenSpaceGuid.PcdPlatformMemoryCheckLevel ## CONSUMES - gMinPlatformPkgTokenSpaceGuid.PcdBootToShellOnly ## CONSUMES - gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleInputDevicePath ## CONSUMES - gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleOutputDevicePath ## CONSUMES - gMinPlatformPkgTokenSpaceGuid.PcdTrustedStorageDevicePath ## CONSUMES - [Sources] BdsPlatform.c BdsPlatform.h - PlatformBootOption.c - MemoryTest.c [Protocols] - gEfiPciRootBridgeIoProtocolGuid ## CONSUMES - gEfiPciIoProtocolGuid ## CONSUMES - gEfiCpuIo2ProtocolGuid ## CONSUMES - gEfiDxeSmmReadyToLockProtocolGuid ## PRODUCES - gEfiGenericMemTestProtocolGuid ## CONSUMES - gEfiDiskInfoProtocolGuid ## CONSUMES - gEfiDevicePathToTextProtocolGuid ## CONSUMES - gEfiSimpleTextInputExProtocolGuid ## CONSUMES - gEfiFirmwareVolume2ProtocolGuid ## CONSUMES - gEfiFormBrowser2ProtocolGuid ## CONSUMES - gEfiGenericMemTestProtocolGuid ## CONSUMES + gEfiDxeSmmReadyToLockProtocolGuid ## PRODUCES [Guids] - gEfiGlobalVariableGuid ## PRODUCES - gEfiMemoryOverwriteControlDataGuid ## PRODUCES - gEfiEndOfDxeEventGroupGuid ## CONSUMES + gEfiEndOfDxeEventGroupGuid ## CONSUMES + gBdsEventBeforeConsoleAfterTrustedConsoleGuid + gBdsEventBeforeConsoleBeforeEndOfDxeGuid + gBdsEventAfterConsoleReadyBeforeBootOptionGuid [Depex.common.DXE_DRIVER] gEfiVariableArchProtocolGuid diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/MemoryTest.c b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/MemoryTest.c deleted file mode 100644 index 654845349a..0000000000 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/MemoryTest.c +++ /dev/null @@ -1,83 +0,0 @@ -/** @file - Perform the platform memory test - -Copyright (c) 2017, Intel Corporation. All rights reserved.
-SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "BdsPlatform.h" -#include - -/** - Perform the memory test base on the memory test intensive level, - and update the memory resource. - - @param Level The memory test intensive level. - - @retval EFI_STATUS Success test all the system memory and update - the memory resource - -**/ -EFI_STATUS -MemoryTest ( - IN EXTENDMEM_COVERAGE_LEVEL Level - ) -{ - EFI_STATUS Status; - BOOLEAN RequireSoftECCInit; - EFI_GENERIC_MEMORY_TEST_PROTOCOL *GenMemoryTest; - UINT64 TestedMemorySize; - UINT64 TotalMemorySize; - BOOLEAN ErrorOut; - BOOLEAN TestAbort; - - TestedMemorySize = 0; - TotalMemorySize = 0; - ErrorOut = FALSE; - TestAbort = FALSE; - - RequireSoftECCInit = FALSE; - - Status = gBS->LocateProtocol ( - &gEfiGenericMemTestProtocolGuid, - NULL, - (VOID **) &GenMemoryTest - ); - if (EFI_ERROR (Status)) { - return EFI_SUCCESS; - } - - Status = GenMemoryTest->MemoryTestInit ( - GenMemoryTest, - Level, - &RequireSoftECCInit - ); - if (Status == EFI_NO_MEDIA) { - // - // The PEI codes also have the relevant memory test code to check the memory, - // it can select to test some range of the memory or all of them. If PEI code - // checks all the memory, this BDS memory test will has no not-test memory to - // do the test, and then the status of EFI_NO_MEDIA will be returned by - // "MemoryTestInit". So it does not need to test memory again, just return. - // - return EFI_SUCCESS; - } - - do { - Status = GenMemoryTest->PerformMemoryTest ( - GenMemoryTest, - &TestedMemorySize, - &TotalMemorySize, - &ErrorOut, - TestAbort - ); - if (ErrorOut && (Status == EFI_DEVICE_ERROR)) { - ASSERT (0); - } - } while (Status != EFI_NOT_FOUND); - - Status = GenMemoryTest->Finished (GenMemoryTest); - - return EFI_SUCCESS; -} diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/PlatformBootOption.c b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/PlatformBootOption.c deleted file mode 100644 index 84aa097d58..0000000000 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/PlatformBootOption.c +++ /dev/null @@ -1,559 +0,0 @@ -/** @file - Driver for Platform Boot Options support. - -Copyright (c) 2017, Intel Corporation. All rights reserved.
-SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "BdsPlatform.h" - -#include - -BOOLEAN mContinueBoot = FALSE; -BOOLEAN mBootMenuBoot = FALSE; -BOOLEAN mPxeBoot = FALSE; -BOOLEAN mHotKeypressed = FALSE; -EFI_EVENT HotKeyEvent = NULL; - -UINTN mBootMenuOptionNumber; - -EFI_DEVICE_PATH_PROTOCOL * -BdsCreateShellDevicePath ( - VOID - ) -/*++ - -Routine Description: - - This function will create a SHELL BootOption to boot. - -Arguments: - - None. - -Returns: - - Shell Device path for booting. - ---*/ -{ - UINTN FvHandleCount; - EFI_HANDLE *FvHandleBuffer; - UINTN Index; - EFI_STATUS Status; - EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; - UINTN Size; - UINT32 AuthenticationStatus; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - VOID *Buffer; - - DevicePath = NULL; - Status = EFI_SUCCESS; - - DEBUG ((DEBUG_INFO, "BdsCreateShellDevicePath\n")); - gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiFirmwareVolume2ProtocolGuid, - NULL, - &FvHandleCount, - &FvHandleBuffer - ); - - for (Index = 0; Index < FvHandleCount; Index++) { - gBS->HandleProtocol ( - FvHandleBuffer[Index], - &gEfiFirmwareVolume2ProtocolGuid, - (VOID **) &Fv - ); - - Buffer = NULL; - Size = 0; - Status = Fv->ReadSection ( - Fv, - &gUefiShellFileGuid, - EFI_SECTION_PE32, - 0, - &Buffer, - &Size, - &AuthenticationStatus - ); - if (EFI_ERROR (Status)) { - // - // Skip if no shell file in the FV - // - continue; - } else { - // - // Found the shell - // - break; - } - } - - if (EFI_ERROR (Status)) { - // - // No shell present - // - if (FvHandleCount) { - FreePool (FvHandleBuffer); - } - return NULL; - } - // - // Build the shell boot option - // - DevicePath = DevicePathFromHandle (FvHandleBuffer[Index]); - - if (FvHandleCount) { - FreePool (FvHandleBuffer); - } - - return DevicePath; -} - - -EFI_STATUS -CreateFvBootOption ( - EFI_GUID *FileGuid, - CHAR16 *Description, - EFI_BOOT_MANAGER_LOAD_OPTION *BootOption, - UINT32 Attributes, - UINT8 *OptionalData, OPTIONAL - UINT32 OptionalDataSize - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; - MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode; - EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; - UINT32 AuthenticationStatus; - VOID *Buffer; - UINTN Size; - - if ((BootOption == NULL) || (FileGuid == NULL) || (Description == NULL)) { - return EFI_INVALID_PARAMETER; - } - - EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid); - - if (!CompareGuid (&gUefiShellFileGuid, FileGuid)) { - Status = gBS->HandleProtocol ( - gImageHandle, - &gEfiLoadedImageProtocolGuid, - (VOID **) &LoadedImage - ); - if (!EFI_ERROR (Status)) { - Status = gBS->HandleProtocol ( - LoadedImage->DeviceHandle, - &gEfiFirmwareVolume2ProtocolGuid, - (VOID **) &Fv - ); - if (!EFI_ERROR (Status)) { - Buffer = NULL; - Size = 0; - Status = Fv->ReadSection ( - Fv, - FileGuid, - EFI_SECTION_PE32, - 0, - &Buffer, - &Size, - &AuthenticationStatus - ); - if (Buffer != NULL) { - FreePool (Buffer); - } - } - } - if (EFI_ERROR (Status)) { - return EFI_NOT_FOUND; - } - - DevicePath = AppendDevicePathNode ( - DevicePathFromHandle (LoadedImage->DeviceHandle), - (EFI_DEVICE_PATH_PROTOCOL *) &FileNode - ); - } else { - DevicePath = AppendDevicePathNode ( - BdsCreateShellDevicePath (), - (EFI_DEVICE_PATH_PROTOCOL *) &FileNode - ); - } - - Status = EfiBootManagerInitializeLoadOption ( - BootOption, - LoadOptionNumberUnassigned, - LoadOptionTypeBoot, - Attributes, - Description, - DevicePath, - OptionalData, - OptionalDataSize - ); - FreePool (DevicePath); - return Status; -} - -EFI_GUID mUiFile = { - 0x462CAA21, 0x7614, 0x4503, { 0x83, 0x6E, 0x8A, 0xB6, 0xF4, 0x66, 0x23, 0x31 } -}; -EFI_GUID mBootMenuFile = { - 0xEEC25BDC, 0x67F2, 0x4D95, { 0xB1, 0xD5, 0xF8, 0x1B, 0x20, 0x39, 0xD1, 0x1D } -}; - - -/** - Return the index of the load option in the load option array. - - The function consider two load options are equal when the - OptionType, Attributes, Description, FilePath and OptionalData are equal. - - @param Key Pointer to the load option to be found. - @param Array Pointer to the array of load options to be found. - @param Count Number of entries in the Array. - - @retval -1 Key wasn't found in the Array. - @retval 0 ~ Count-1 The index of the Key in the Array. -**/ -INTN -PlatformFindLoadOption ( - IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Key, - IN CONST EFI_BOOT_MANAGER_LOAD_OPTION *Array, - IN UINTN Count - ) -{ - UINTN Index; - - for (Index = 0; Index < Count; Index++) { - if ((Key->OptionType == Array[Index].OptionType) && - (Key->Attributes == Array[Index].Attributes) && - (StrCmp (Key->Description, Array[Index].Description) == 0) && - (CompareMem (Key->FilePath, Array[Index].FilePath, GetDevicePathSize (Key->FilePath)) == 0) && - (Key->OptionalDataSize == Array[Index].OptionalDataSize) && - (CompareMem (Key->OptionalData, Array[Index].OptionalData, Key->OptionalDataSize) == 0)) { - return (INTN) Index; - } - } - - return -1; -} - -UINTN -RegisterFvBootOption ( - EFI_GUID *FileGuid, - CHAR16 *Description, - UINTN Position, - UINT32 Attributes, - UINT8 *OptionalData, OPTIONAL - UINT32 OptionalDataSize - ) -{ - EFI_STATUS Status; - UINTN OptionIndex; - EFI_BOOT_MANAGER_LOAD_OPTION NewOption; - EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions; - UINTN BootOptionCount; - - NewOption.OptionNumber = LoadOptionNumberUnassigned; - Status = CreateFvBootOption (FileGuid, Description, &NewOption, Attributes, OptionalData, OptionalDataSize); - if (!EFI_ERROR (Status)) { - BootOptions = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot); - - OptionIndex = PlatformFindLoadOption (&NewOption, BootOptions, BootOptionCount); - - if (OptionIndex == -1) { - Status = EfiBootManagerAddLoadOptionVariable (&NewOption, Position); - ASSERT_EFI_ERROR (Status); - } else { - NewOption.OptionNumber = BootOptions[OptionIndex].OptionNumber; - } - EfiBootManagerFreeLoadOption (&NewOption); - EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount); - } - - return NewOption.OptionNumber; -} - - - -VOID -EFIAPI -PlatformBootManagerWaitCallback ( - UINT16 TimeoutRemain - ) -{ - EFI_STATUS Status; - EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TxtInEx; - EFI_KEY_DATA KeyData; - BOOLEAN PausePressed; - - // - // Pause on PAUSE key - // - Status = gBS->HandleProtocol (gST->ConsoleInHandle, &gEfiSimpleTextInputExProtocolGuid, (VOID **) &TxtInEx); - ASSERT_EFI_ERROR (Status); - - PausePressed = FALSE; - - while (TRUE) { - Status = TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData); - if (EFI_ERROR (Status)) { - break; - } - - if (KeyData.Key.ScanCode == SCAN_PAUSE) { - PausePressed = TRUE; - break; - } - } - - // - // Loop until non-PAUSE key pressed - // - while (PausePressed) { - Status = TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData); - if (!EFI_ERROR (Status)) { - DEBUG (( - DEBUG_INFO, "[PauseCallback] %x/%x %x/%x\n", - KeyData.Key.ScanCode, KeyData.Key.UnicodeChar, - KeyData.KeyState.KeyShiftState, KeyData.KeyState.KeyToggleState - )); - PausePressed = (BOOLEAN) (KeyData.Key.ScanCode == SCAN_PAUSE); - } - } -} - - -EFI_GUID gUefiShellFileGuid = { 0x7C04A583, 0x9E3E, 0x4f1c, { 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 } }; - -#define INTERNAL_UEFI_SHELL_NAME L"Internal UEFI Shell 2.0" -#define UEFI_HARD_DRIVE_NAME L"UEFI Hard Drive" - -VOID -RegisterDefaultBootOption ( - VOID - ) -{ -#if 0 - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; - MEDIA_FW_VOL_FILEPATH_DEVICE_PATH FileNode; -#endif - UINT16 *ShellData; - UINT32 ShellDataSize; - - ShellData = NULL; - ShellDataSize = 0; - RegisterFvBootOption (&gUefiShellFileGuid, INTERNAL_UEFI_SHELL_NAME, (UINTN) -1, LOAD_OPTION_ACTIVE, (UINT8 *)ShellData, ShellDataSize); - - // - // Boot Menu - // - mBootMenuOptionNumber = RegisterFvBootOption (&mBootMenuFile, L"Boot Device List", (UINTN) -1, LOAD_OPTION_CATEGORY_APP | LOAD_OPTION_ACTIVE | LOAD_OPTION_HIDDEN, NULL, 0); - - if (mBootMenuOptionNumber == LoadOptionNumberUnassigned) { - DEBUG ((DEBUG_INFO, "BootMenuOptionNumber (%d) should not be same to LoadOptionNumberUnassigned(%d).\n", mBootMenuOptionNumber, LoadOptionNumberUnassigned)); - } -#if 0 - // - // Boot Manager Menu - // - EfiInitializeFwVolDevicepathNode (&FileNode, &mUiFile); - - gBS->HandleProtocol ( - gImageHandle, - &gEfiLoadedImageProtocolGuid, - (VOID **) &LoadedImage - ); - DevicePath = AppendDevicePathNode (DevicePathFromHandle (LoadedImage->DeviceHandle), (EFI_DEVICE_PATH_PROTOCOL *) &FileNode); -#endif - -} - -VOID -RegisterBootOptionHotkey ( - UINT16 OptionNumber, - EFI_INPUT_KEY *Key, - BOOLEAN Add - ) -{ - EFI_STATUS Status; - - if (!Add) { - // - // No enter hotkey when force to setup or there is no boot option - // - Status = EfiBootManagerDeleteKeyOptionVariable (NULL, 0, Key, NULL); - ASSERT (Status == EFI_SUCCESS || Status == EFI_NOT_FOUND); - } else { - // - // Register enter hotkey for the first boot option - // - Status = EfiBootManagerAddKeyOptionVariable (NULL, OptionNumber, 0, Key,NULL); - ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED); - } -} - -EFI_STATUS -EFIAPI -DetectKeypressCallback ( - IN EFI_KEY_DATA *KeyData -) -{ - mHotKeypressed = TRUE; - - if (HotKeyEvent != NULL) { - gBS->SignalEvent(HotKeyEvent); - } - - return EFI_SUCCESS; -} - -/** - This function is called after all the boot options are enumerated and ordered properly. -**/ -VOID -RegisterStaticHotkey ( - VOID - ) -{ - - EFI_INPUT_KEY Enter; - EFI_KEY_DATA F2; - EFI_KEY_DATA F7; - BOOLEAN EnterSetup; - EFI_STATUS Status; - EFI_BOOT_MANAGER_LOAD_OPTION BootOption; - - EnterSetup = FALSE; - - // - // [Enter] - // - mContinueBoot = !EnterSetup; - if (mContinueBoot) { - Enter.ScanCode = SCAN_NULL; - Enter.UnicodeChar = CHAR_CARRIAGE_RETURN; - EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL); - } - - - // - // [F2]/[F7] - // - F2.Key.ScanCode = SCAN_F2; - F2.Key.UnicodeChar = CHAR_NULL; - F2.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID; - F2.KeyState.KeyToggleState = 0; - Status = EfiBootManagerGetBootManagerMenu (&BootOption); - ASSERT_EFI_ERROR (Status); - RegisterBootOptionHotkey ((UINT16) BootOption.OptionNumber, &F2.Key, TRUE); - EfiBootManagerFreeLoadOption (&BootOption); - - F7.Key.ScanCode = SCAN_F7; - F7.Key.UnicodeChar = CHAR_NULL; - F7.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID; - F7.KeyState.KeyToggleState = 0; - mBootMenuBoot = !EnterSetup; - RegisterBootOptionHotkey ((UINT16) mBootMenuOptionNumber, &F7.Key, mBootMenuBoot); - -} - -UINT8 -BootOptionType ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath - ) -{ - EFI_DEVICE_PATH_PROTOCOL *Node; - EFI_DEVICE_PATH_PROTOCOL *NextNode; - - for (Node = DevicePath; !IsDevicePathEndType (Node); Node = NextDevicePathNode (Node)) { - if (DevicePathType (Node) == MESSAGING_DEVICE_PATH) { - // - // Make sure the device path points to the driver device. - // - NextNode = NextDevicePathNode (Node); - if (DevicePathSubType(NextNode) == MSG_DEVICE_LOGICAL_UNIT_DP) { - // - // if the next node type is Device Logical Unit, which specify the Logical Unit Number (LUN), - // skip it - // - NextNode = NextDevicePathNode (NextNode); - } - if (IsDevicePathEndType (NextNode)) { - if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH)) { - return DevicePathSubType (Node); - } else { - return MSG_SATA_DP; - } - } - } - } - - return (UINT8) -1; -} - -/** - Returns the priority number. - OptionType EFI - ------------------------------------ - PXE 2 - DVD 4 - USB 6 - NVME 7 - HDD 8 - EFI Shell 9 - Others 100 - - @param BootOption -**/ -UINTN -BootOptionPriority ( - CONST EFI_BOOT_MANAGER_LOAD_OPTION *BootOption - ) -{ - // - // EFI boot options - // - switch (BootOptionType (BootOption->FilePath)) { - case MSG_MAC_ADDR_DP: - case MSG_VLAN_DP: - case MSG_IPv4_DP: - case MSG_IPv6_DP: - return 2; - - case MSG_SATA_DP: - case MSG_ATAPI_DP: - case MSG_UFS_DP: - case MSG_NVME_NAMESPACE_DP: - return 4; - - case MSG_USB_DP: - return 6; - - } - if (StrCmp (BootOption->Description, INTERNAL_UEFI_SHELL_NAME) == 0) { - if (PcdGetBool (PcdBootToShellOnly)) { - return 0; - } - return 9; - } - if (StrCmp (BootOption->Description, UEFI_HARD_DRIVE_NAME) == 0) { - return 8; - } - return 100; -} - -INTN -EFIAPI -CompareBootOption ( - CONST VOID *Left, - CONST VOID *Right - ) -{ - return BootOptionPriority ((EFI_BOOT_MANAGER_LOAD_OPTION *) Left) - - BootOptionPriority ((EFI_BOOT_MANAGER_LOAD_OPTION *) Right); -} - -- 2.19.1.windows.1