From nobody Tue Nov 26 15:20:36 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+52228+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52228+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1576287161; cv=none; d=zohomail.com; s=zohoarc; b=ZllnUcrwXOHwAvlsutsM0n72P+15XkzHiC0WckUWi1jFyhwTJcS3z2QDMPD+sSXh+hfjFVqYhlnfKOOgb+naUqnvZjgHgRAUj3Q8JUXOUiwh9GVo4Raf2DhDnCSpwrtASTOlOXd1JOkb9DxvVKWaj3MbbfWEZ5buqQfyNS9hdqs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1576287161; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=5Kmh7Q4YVWAO8uaUuaEzGO7fVFc2KL7v8bktvnxzBMo=; b=D5uW+MkvP9W4I0zLyh8aSU15Hw2zqVOTHArtBof7yE6Q7ga+B/ewfsyJNByLPIdVeLL8rysYpVyX5elrEwOZnraqUWSJ8bAsvZVPY8I7/OSs8jqSHkAYVMRduTrnaTK+TJamZF3DMRxSHVkpV7ZrxfAZiBT7GmYMf413yaQfJcI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+52228+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1576287161959183.97421082751896; Fri, 13 Dec 2019 17:32:41 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id AsDmYY1788612xjPUuhmBVwS; Fri, 13 Dec 2019 17:32:40 -0800 X-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 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-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" X-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-devel] [edk2-platforms] [PATCH 05/11] MinPlatformPkg: Add BDS Hook Points Date: Fri, 13 Dec 2019 17:32:31 -0800 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,prince.agyeman@intel.com X-Gm-Message-State: aQNYECkAyrDhDmKfnZA1hlMox1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1576287160; bh=uxVHK1Ahdhjk+gM/KDlfh3JIFgm7JkSDrGDT+T5Hyt8=; h=Cc:Date:From:Reply-To:Subject:To; b=LPBks/LHt2Yn7+wUJs1rQwjezyT/5dMJQI5nZzFMAtuR2ENEFJX+T0uMvRfsEAd/2es +6EVhSj+qw0vjVUn/nyqL26aKQvhP9ELqd8ejp8rQtHV/Fl+7jifhCs1Jd1Mo7qoFcG/M 09NYzS052tcsju6WT9skC0coSykmHVQ3hqA= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2336 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 Reviewed-by: Chasel Chiu Reviewed-by: Michael Kubacki Reviewed-by: Nate DeSimone --- .../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/DxePlatformBo= otManagerLib/MemoryTest.c delete mode 100644 Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBo= otManagerLib/PlatformBootOption.c diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManag= erLib/BdsPlatform.c b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatform= BootManagerLib/BdsPlatform.c index 491fb0f26f..31a9ef4a07 100644 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/B= dsPlatform.c +++ b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/B= dsPlatform.c @@ -1,130 +1,14 @@ /** @file This file include all platform action which can be customized by IBV/OEM. =20 -Copyright (c) 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ =20 #include "BdsPlatform.h" -#include -#include -#include -#include =20 -#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 gUsbClassKeyboa= rdDevicePath =3D { - { - { - 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 =3D sizeof (MorControl); - Status =3D gRT->GetVariable ( - MEMORY_OVERWRITE_REQUEST_VARIABLE_NAME, - &gEfiMemoryOverwriteControlDataGuid, - NULL, - &DataSize, - &MorControl - ); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_INFO, " PlatformBootMangerLib: gEfiMemoryOverwriteContro= lDataGuid doesn't exist!!***\n")); - MorControl =3D 0; - } else { - DEBUG ((DEBUG_INFO, " PlatformBootMangerLib: Get the gEfiMemoryOverwri= teControlDataGuid =3D %x!!***\n", MorControl)); - } - - return (BOOLEAN) (MorControl & 0x01); -} - -VOID -DumpDevicePath ( - IN CHAR16 *Name, - IN EFI_DEVICE_PATH *DevicePath - ) -{ - CHAR16 *Str; - - Str =3D ConvertDevicePathToText(DevicePath, TRUE, TRUE); - DEBUG ((DEBUG_INFO, "%s: %s\n", Name, Str)); - if (Str !=3D 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; =20 VOID ExitPmAuth ( @@ -145,7 +29,7 @@ ExitPmAuth ( Status =3D gBS->CreateEventEx ( EVT_NOTIFY_SIGNAL, TPL_CALLBACK, - InternalBdsEmptyCallbackFuntion, + EfiEventEmptyFunction, NULL, &gEfiEndOfDxeEventGroupGuid, &EndOfDxeEvent @@ -172,918 +56,134 @@ ExitPmAuth ( DEBUG((DEBUG_INFO,"ExitPmAuth ()- End\n")); } =20 -VOID -ConnectRootBridge ( - BOOLEAN Recursive - ) -{ - UINTN RootBridgeHandleCount; - EFI_HANDLE *RootBridgeHandleBuffer; - UINTN RootBridgeIndex; - - RootBridgeHandleCount =3D 0; - gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiPciRootBridgeIoProtocolGuid, - NULL, - &RootBridgeHandleCount, - &RootBridgeHandleBuffer - ); - for (RootBridgeIndex =3D 0; RootBridgeIndex < RootBridgeHandleCount; Roo= tBridgeIndex++) { - gBS->ConnectController (RootBridgeHandleBuffer[RootBridgeIndex], NULL,= NULL, Recursive); - } -} - =20 /** - 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 =3D=3D NULL) { - return FALSE; - } - - ConsoleDevice =3D DuplicateDevicePath(Device); - - TrustedConsoleDevicepath =3D NULL; - - switch (ConsoleType) { - case ConIn: - TrustedConsoleDevicepath =3D PcdGetPtr (PcdTrustedConsoleInputDevicePa= th); - break; - case ConOut: - // - // Check GOP and remove last node - // - TempDevicePath =3D ConsoleDevice; - while (!IsDevicePathEndType (TempDevicePath)) { - if (DevicePathType (TempDevicePath) =3D=3D ACPI_DEVICE_PATH && - DevicePathSubType (TempDevicePath) =3D=3D ACPI_ADR_DP) { - SetDevicePathEndNode (TempDevicePath); - break; - } - TempDevicePath =3D NextDevicePathNode (TempDevicePath); - } - - TrustedConsoleDevicepath =3D PcdGetPtr (PcdTrustedConsoleOutputDeviceP= ath); - break; - default: - ASSERT(FALSE); - break; - } - - TempDevicePath =3D TrustedConsoleDevicepath; - do { - Instance =3D GetNextDevicePathInstance (&TempDevicePath, &Size); - if (Instance =3D=3D NULL) { - break; - } - - if (CompareMem (ConsoleDevice, Instance, Size - END_DEVICE_PATH_LENGTH= ) =3D=3D 0) { - FreePool (Instance); - FreePool (ConsoleDevice); - return TRUE; - } - - FreePool (Instance); - } while (TempDevicePath !=3D NULL); - - FreePool (ConsoleDevice); + Creates an EFI event in the BDS Event Group. =20 - return FALSE; -} - -BOOLEAN -IsUsbShortForm ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath - ) -{ - if ((DevicePathType (DevicePath) =3D=3D MESSAGING_DEVICE_PATH) && - ((DevicePathSubType (DevicePath) =3D=3D MSG_USB_CLASS_DP) || (Device= PathSubType (DevicePath) =3D=3D 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->Creat= eEvent(Ex). =20 - return FALSE; -} - -/** - Connect the USB short form device path. + @retval EFI_SUCCESS Event was created. + @retval Other Event was not created. =20 - @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; =20 - // - // Check the passed in parameters - // - if (DevicePath =3D=3D NULL) { - return EFI_INVALID_PARAMETER; - } - - if (!IsUsbShortForm (DevicePath)) { - return EFI_INVALID_PARAMETER; - } + ASSERT (BdsConsoleEvent !=3D NULL); =20 - // - // Find the usb host controller firstly, then connect with the remaining= device path - // - AtLeastOneConnected =3D FALSE; - Status =3D gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiPciIoProtocolGuid, + Status =3D gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + NotifyTpl, + EfiEventEmptyFunction, NULL, - &HandleCount, - &Handles - ); - for (Index =3D 0; Index < HandleCount; Index++) { - Status =3D gBS->HandleProtocol ( - Handles[Index], - &gEfiPciIoProtocolGuid, - (VOID **) &PciIo - ); - if (!EFI_ERROR (Status)) { - // - // Check whether the Pci device is the wanted usb host controller - // - Status =3D PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Cla= ss); - if (!EFI_ERROR (Status) && - ((PCI_CLASS_SERIAL =3D=3D Class[2]) && (PCI_CLASS_SERIAL_USB =3D= =3D Class[1])) - ) { - Status =3D gBS->ConnectController ( - Handles[Index], - NULL, - DevicePath, - FALSE - ); - if (!EFI_ERROR(Status)) { - AtLeastOneConnected =3D TRUE; - } - } - } - } - - return AtLeastOneConnected ? EFI_SUCCESS : EFI_NOT_FOUND; -} - -/** - Update the ConIn variable with USB Keyboard device path,if its not alrea= dy exists in ConIn -**/ -VOID -EnumUsbKeyboard ( - VOID - ) -{ - DEBUG ((DEBUG_INFO, "[EnumUsbKeyboard]\n")); - EfiBootManagerUpdateConsoleVariable (ConIn, (EFI_DEVICE_PATH_PROTOCOL *)= &gUsbClassKeyboardDevicePath, NULL); - =20 - // - // 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 =3D gBS->HandleProtocol ( - Handle, - &gEfiPciIoProtocolGuid, - (VOID **)&PciIo - ); - if (!EFI_ERROR (Status)) { - Status =3D 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 =3D DuplicateDevicePath (DevicePath); - ASSERT (DupDevicePath !=3D NULL); - if (DupDevicePath =3D=3D NULL) { - return NULL; - } - - TempDevicePath =3D DupDevicePath; - Status =3D 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) =3D=3D ACPI_DEVICE_PATH && - DevicePathSubType (DevicePath) =3D=3D ACPI_ADR_DP) { - return TRUE; - } - DevicePath =3D NextDevicePathNode (DevicePath); - } - return FALSE; -} - -/** - Remove all GOP device path instance from DevicePath and add the Gop to t= he 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 =3D FALSE; - Return =3D NULL; - GopSize =3D GetDevicePathSize (Gop); - do { - Instance =3D GetNextDevicePathInstance (&DevicePath, &Size); - if (Instance =3D=3D NULL) { - break; - } - if (!IsGopDevicePath (Instance) || - (Size =3D=3D GopSize && CompareMem (Instance, Gop, GopSize) =3D=3D= 0) - ) { - if (Size =3D=3D GopSize && CompareMem (Instance, Gop, GopSize) =3D= =3D 0) { - Exist =3D TRUE; - } - Temp =3D Return; - Return =3D AppendDevicePathInstance (Return, Instance); - if (Temp !=3D NULL) { - FreePool (Temp); - } - } - FreePool (Instance); - } while (DevicePath !=3D NULL); =20 - if (!Exist) { - Temp =3D Return; - Return =3D AppendDevicePathInstance (Return, Gop); - if (Temp !=3D NULL) { - FreePool (Temp); - } - } - return Return; + return Status; } =20 /** - 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 =3D gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiPciIoProtocolGuid, - NULL, - &PciHandlesSize, - &PciHandles - ); - if (EFI_ERROR (Status)) { - return NULL; - } - - for (Index =3D 0; Index < PciHandlesSize; Index++) { - Status =3D 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(). =20 - // - // Update ConOut variable - // - GraphicsControllerHandle =3D GetGraphicsController (NeedTrustedConsole); - if (GraphicsControllerHandle !=3D 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 =3D EfiBootManagerGetGopDevicePath (GraphicsControllerHa= ndle); - if (GopDevicePath !=3D NULL) { - GetEfiGlobalVariable2 (L"ConOut", (VOID **)&ConOutDevicePath, NULL); - UpdatedConOutDevicePath =3D UpdateGopDevicePath (ConOutDevicePath, G= opDevicePath); - if (ConOutDevicePath !=3D NULL) { - FreePool (ConOutDevicePath); - } - FreePool (GopDevicePath); - gRT->SetVariable ( - L"ConOut", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACC= ESS | 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 =3D ConsoleDevicePath; - do { - Instance =3D GetNextDevicePathInstance (&TempDevicePath, &Size); - if (Instance =3D=3D NULL) { - break; - } - =20 - 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 =3D IsVideoController (Instance); - if (GraphicsControllerHandle =3D=3D 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 =3D EfiBootManagerGetGopDevicePath (GraphicsControll= erHandle); - if (GopDevicePath !=3D NULL) { - EfiBootManagerUpdateConsoleVariable (ConsoleType, GopDevicePath,= NULL); - } - } - break; - default: - ASSERT(FALSE); - break; - } - - FreePool (Instance); - } while (TempDevicePath !=3D 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[] =3D {L"ConIn", L"ConOut"}; - VOID *TrustedConsoleDevicepath; + EFI_STATUS Status; + EFI_EVENT BdsConsoleEvent; =20 - TrustedConsoleDevicepath =3D PcdGetPtr (PcdTrustedConsoleInputDevicePath= ); - DumpDevicePath (L"TrustedConsoleIn", TrustedConsoleDevicepath); - TrustedConsoleDevicepath =3D PcdGetPtr (PcdTrustedConsoleOutputDevicePat= h); - DumpDevicePath (L"TrustedConsoleOut", TrustedConsoleDevicepath); + DEBUG ((DEBUG_INFO, "%a \n", __FUNCTION__)); =20 - for (Index =3D 0; Index < sizeof (ConsoleVar) / sizeof (ConsoleVar[0]); = Index++) { - - GetEfiGlobalVariable2 (ConsoleVar[Index], (VOID **)&Consoles, NULL); + Status =3D CreateBdsEvent ( + TPL_CALLBACK, + &gBdsEventBeforeConsoleAfterTrustedConsoleGuid, + &BdsConsoleEvent + ); =20 - TempDevicePath =3D Consoles; - do { - Instance =3D GetNextDevicePathInstance (&TempDevicePath, &Size); - if (Instance =3D=3D NULL) { - break; - } - if (IsTrustedConsole (Index, Instance)) { - if (IsUsbShortForm (Instance)) { - ConnectUsbShortFormDevicePath (Instance); - } else { - for (Next =3D Instance; !IsDevicePathEnd (Next); Next =3D NextDe= vicePathNode (Next)) { - if (DevicePathType (Next) =3D=3D ACPI_DEVICE_PATH && DevicePat= hSubType (Next) =3D=3D ACPI_ADR_DP) { - break; - } else if (DevicePathType (Next) =3D=3D HARDWARE_DEVICE_PATH && - DevicePathSubType (Next) =3D=3D HW_CONTROLLER_DP && - DevicePathType (NextDevicePathNode (Next)) =3D=3D A= CPI_DEVICE_PATH && - DevicePathSubType (NextDevicePathNode (Next)) =3D= =3D ACPI_ADR_DP - ) { - break; - } - } - if (!IsDevicePathEnd (Next)) { - SetDevicePathEndNode (Next); - Status =3D EfiBootManagerConnectDevicePath (Instance, &Handle); - if (!EFI_ERROR (Status)) { - gBS->ConnectController (Handle, NULL, NULL, TRUE); - } - } else { - EfiBootManagerConnectDevicePath (Instance, NULL); - } - } - } - FreePool (Instance); - } while (TempDevicePath !=3D NULL); + ASSERT_EFI_ERROR (Status); =20 - if (Consoles !=3D NULL) { - FreePool (Consoles); - } + if (!EFI_ERROR (Status)) { + gBS->SignalEvent (BdsConsoleEvent); + gBS->CloseEvent (BdsConsoleEvent); + DEBUG ((DEBUG_INFO,"All EventBeforeConsoleAfterTrustedConsole callback= s have returned successfully\n")); } } =20 -/** - 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 =3D PcdGetPtr (PcdTrustedStorageDevicePath); - DumpDevicePath (L"TrustedStorage", TrustedStorageDevicepath); - - TempDevicePath =3D TrustedStorageDevicepath; - do { - Instance =3D GetNextDevicePathInstance (&TempDevicePath, &Size); - if (Instance =3D=3D NULL) { - break; - } - - EfiBootManagerConnectDevicePath (Instance, NULL); - - TempStorageDevicePath =3D Instance; - - Status =3D gBS->LocateDevicePath ( - &gEfiDevicePathProtocolGuid, - &TempStorageDevicePath, - &DeviceHandle - ); - if (!EFI_ERROR (Status)) { - gBS->ConnectController (DeviceHandle, NULL, NULL, FALSE); - } - - FreePool (Instance); - } while (TempDevicePath !=3D NULL); -} - -/** - The function connects the trusted consoles and then call the PP processi= ng library interface. -**/ -VOID -ProcessTcgPp ( - VOID - ) -{ - gPPRequireUIConfirm |=3D Tcg2PhysicalPresenceLibNeedUserConfirm(); - - if (gPPRequireUIConfirm) { - ConnectTrustedConsole (); - } - - Tcg2PhysicalPresenceLibProcessRequest (NULL); -} =20 /** - 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 =3D NULL; - Result =3D FALSE; - - // - // Get BootCurrent variable - // - VarSize =3D sizeof (UINT16); - Status =3D gRT->GetVariable ( - L"BootCurrent", - &gEfiGlobalVariableGuid, - NULL, - &VarSize, - &BootCurrent - ); - if (EFI_ERROR (Status)) { - return FALSE; - } + EFI_STATUS Status; + EFI_EVENT BdsConsoleEvent; =20 - // - // Create boot option Bootxxxx from BootCurrent - // - UnicodeSPrint (BootOptionName, sizeof(BootOptionName), L"Boot%04X", Boot= Current); + DEBUG ((DEBUG_INFO, "%a \n", __FUNCTION__)); =20 - GetEfiGlobalVariable2 (BootOptionName, (VOID **) &BootOption, &VarSize); - if (BootOption =3D=3D NULL || VarSize =3D=3D 0) { - return FALSE; - } + Status =3D CreateBdsEvent ( + TPL_CALLBACK, + &gBdsEventBeforeConsoleBeforeEndOfDxeGuid, + &BdsConsoleEvent + ); =20 - Ptr =3D BootOption; - Ptr +=3D sizeof (UINT32); - Ptr +=3D sizeof (UINT16); - Ptr +=3D StrSize ((CHAR16 *) Ptr); - TempDevicePath =3D (EFI_DEVICE_PATH_PROTOCOL *) Ptr; - LastDeviceNode =3D TempDevicePath; - while (!IsDevicePathEnd (TempDevicePath)) { - LastDeviceNode =3D TempDevicePath; - TempDevicePath =3D NextDevicePathNode (TempDevicePath); - } - GuidPoint =3D EfiGetNameGuidFromFwVolDevicePathNode ( - (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode - ); - if ((GuidPoint !=3D NULL) && - ((CompareGuid (GuidPoint, &gUefiShellFileGuid))) - ) { - // - // if this option is internal shell, return TRUE - // - Result =3D TRUE; - } + ASSERT_EFI_ERROR (Status); =20 - if (BootOption !=3D NULL) { - FreePool (BootOption); - BootOption =3D NULL; + if (!EFI_ERROR (Status)) { + gBS->SignalEvent (BdsConsoleEvent); + gBS->CloseEvent (BdsConsoleEvent); + DEBUG ((DEBUG_INFO,"All BeforeConsoleBeforeEndOfDxe callbacks have ret= urned successfully\n")); } - - return Result; } =20 /** - 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 =3D gBS->HandleProtocol ( - gST->ConsoleOutHandle, - &gEfiGraphicsOutputProtocolGuid, - (VOID**)&GraphicsOutput - ); - if (EFI_ERROR (Status)) { - GraphicsOutput =3D NULL; - } - - Status =3D gBS->HandleProtocol ( - gST->ConsoleOutHandle, - &gEfiSimpleTextOutProtocolGuid, - (VOID**)&SimpleTextOut - ); - if (EFI_ERROR (Status)) { - SimpleTextOut =3D NULL; - } + EFI_STATUS Status; + EFI_EVENT BdsConsoleEvent; =20 - if ((GraphicsOutput =3D=3D NULL) || (SimpleTextOut =3D=3D NULL)) { - return EFI_UNSUPPORTED; - } - - MaxGopMode =3D GraphicsOutput->Mode->MaxMode; - MaxTextMode =3D 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 ne= ed not be change. - // 1.2. If current text mode is different with new text mode, text mo= de 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 =3D 0; ModeNumber < MaxGopMode; ModeNumber++) { - Status =3D GraphicsOutput->QueryMode ( - GraphicsOutput, - ModeNumber, - &SizeOfInfo, - &Info - ); - if (!EFI_ERROR (Status)) { - if ((Info->HorizontalResolution =3D=3D mShellHorizontalResolution) && - (Info->VerticalResolution =3D=3D mShellVerticalResolution)) { - if ((GraphicsOutput->Mode->Info->HorizontalResolution =3D=3D mShel= lHorizontalResolution) && - (GraphicsOutput->Mode->Info->VerticalResolution =3D=3D mShellV= erticalResolution)) { - // - // If current video resolution is same with new resolution, - // then check if current text mode is same with new text mode. - // - Status =3D SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOu= t->Mode->Mode, &CurrentColumn, &CurrentRow); - ASSERT_EFI_ERROR (Status); - if (CurrentColumn =3D=3D mShellModeColumn && CurrentRow =3D=3D m= ShellModeRow) { - // - // Current text mode is same with new text mode, text mode nee= d not be change. - // - FreePool (Info); - return EFI_SUCCESS; - } else { - // - // Current text mode is different with new text mode, text mod= e need be change to new text mode. - // - for (Index =3D 0; Index < MaxTextMode; Index++) { - Status =3D SimpleTextOut->QueryMode (SimpleTextOut, Index, &= CurrentColumn, &CurrentRow); - if (!EFI_ERROR(Status)) { - if ((CurrentColumn =3D=3D mShellModeColumn) && (CurrentRow= =3D=3D mShellModeRow)) { - // - // New text mode is supported, set it. - // - Status =3D SimpleTextOut->SetMode (SimpleTextOut, Index); - ASSERT_EFI_ERROR (Status); - // - // Update text mode PCD. - // - Status =3D PcdSet32S (PcdConOutColumn, mShellModeColumn); - ASSERT_EFI_ERROR (Status); + DEBUG ((DEBUG_INFO, "%a \n", __FUNCTION__)); =20 - Status =3D PcdSet32S (PcdConOutRow, mShellModeRow); - ASSERT_EFI_ERROR (Status); - - FreePool (Info); - return EFI_SUCCESS; - } - } - } - if (Index =3D=3D 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 =3D GraphicsOutput->SetMode (GraphicsOutput, ModeNumber); - if (!EFI_ERROR (Status)) { - // - // Set PCD to restart GraphicsConsole and Consplitter to chang= e video resolution - // and produce new text mode based on new resolution. - // - Status =3D PcdSet32S (PcdVideoHorizontalResolution, mShellHori= zontalResolution); - ASSERT_EFI_ERROR (Status); - - Status =3D PcdSet32S (PcdVideoVerticalResolution, mShellVertic= alResolution); - ASSERT_EFI_ERROR (Status); - - Status =3D PcdSet32S (PcdConOutColumn, mShellModeColumn); - ASSERT_EFI_ERROR (Status); - - Status =3D PcdSet32S (PcdConOutRow, mShellModeRow); - ASSERT_EFI_ERROR (Status); + Status =3D CreateBdsEvent ( + TPL_CALLBACK, + &gBdsEventAfterConsoleReadyBeforeBootOptionGuid, + &BdsConsoleEvent + ); =20 - Status =3D gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiSimpleTextOutProtocolGuid, - NULL, - &HandleCount, - &HandleBuffer - ); - if (!EFI_ERROR (Status)) { - for (Index =3D 0; Index < HandleCount; Index++) { - gBS->DisconnectController (HandleBuffer[Index], NULL, NULL= ); - } - for (Index =3D 0; Index < HandleCount; Index++) { - gBS->ConnectController (HandleBuffer[Index], NULL, NULL, T= RUE); - } - if (HandleBuffer !=3D NULL) { - FreePool (HandleBuffer); - } - break; - } - } - } - } - FreePool (Info); - } - } + ASSERT_EFI_ERROR (Status); =20 - if (ModeNumber =3D=3D 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 ha= ve returned successfully\n")); } - - return EFI_SUCCESS; } =20 -/** - 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 behav= ior, 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 (); - } -} =20 /** 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; =20 DEBUG ((EFI_D_INFO, "PlatformBootManagerBeforeConsole\n")); =20 - Status =3D EFI_SUCCESS; - - // - // Get user defined text mode for internal shell only once. - // - mShellHorizontalResolution =3D PcdGet32 (PcdSetupVideoHorizontalResoluti= on); - mShellVerticalResolution =3D PcdGet32 (PcdSetupVideoVerticalResolution= ); - mShellModeColumn =3D PcdGet32 (PcdSetupConOutColumn); - mShellModeRow =3D PcdGet32 (PcdSetupConOutRow); - - // - // Create event to set proper video resolution and text mode for interna= l shell. - // - Status =3D 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 =3D=3D BOOT_WITH_FULL_CONFIGURATION || - gBootMode =3D=3D BOOT_WITH_DEFAULT_SETTINGS || - gBootMode =3D=3D BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS || - gBootMode =3D=3D BOOT_IN_RECOVERY_MODE) { - - GetEfiGlobalVariable2 (L"ConOut", (VOID **)&VarConOut, NULL); if (Va= rConOut !=3D NULL) { FreePool (VarConOut); } - GetEfiGlobalVariable2 (L"ConIn", (VOID **)&VarConIn, NULL); if (Var= ConIn !=3D NULL) { FreePool (VarConIn); } - - // - // Only fill ConIn/ConOut when ConIn/ConOut is empty because we may dr= op to Full Configuration boot mode in non-first boot - // - if (VarConOut =3D=3D NULL || VarConIn =3D=3D NULL) { - if (PcdGetSize (PcdTrustedConsoleOutputDevicePath) >=3D sizeof(EFI_D= EVICE_PATH_PROTOCOL)) { - AddConsoleVariable (ConOut, PcdGetPtr (PcdTrustedConsoleOutputDevi= cePath)); - } - if (PcdGetSize (PcdTrustedConsoleInputDevicePath) >=3D sizeof(EFI_DE= VICE_PATH_PROTOCOL)) { - AddConsoleVariable (ConIn, PcdGetPtr (PcdTrustedConsoleInputDevice= Path)); - } - } - } =20 - EnumUsbKeyboard (); // - // For trusted console it must be handled here. + // Signal Before Console, after Trusted console Event // - UpdateGraphicConOut (TRUE); + BdsSignalEventBeforeConsoleAfterTrustedConsole (); =20 // - // 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 (); =20 // - // We should make all UEFI memory and GCD information populated before E= xitPmAuth. - // SMM may consume these information. + // Signal End Of Dxe Event // - MemoryTest((EXTENDMEM_COVERAGE_LEVEL) PcdGet32 (PcdPlatformMemoryCheckLe= vel)); - PERF_START_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7020); ExitPmAuth (); PERF_END_EX(NULL,"EventRec", NULL, AsmReadTsc(), 0x7021); =20 // - // 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); } =20 =20 -/** - 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 expectati= on. - 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 =3D EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOpti= onTypeBoot); - - // - // If setup is the first priority in boot option, we need to sort boot o= ption. - // - if ((BootOptionCount > 1) && - (((StrnCmp (BootOptions->Description, L"Enter Setup", StrLen (L"Ente= r Setup"))) =3D=3D 0) || - ((StrnCmp (BootOptions->Description, L"BootManagerMenuApp", StrLen = (L"BootManagerMenuApp"))) =3D=3D 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 specif= ic @@ -1254,65 +242,9 @@ PlatformBootManagerAfterConsole ( VOID ) { - EFI_BOOT_MODE LocalBootMode; - DEBUG ((EFI_D_INFO, "PlatformBootManagerAfterConsole\n")); =20 - // - // Get current Boot Mode - // - LocalBootMode =3D 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 Int13T= hunk driver is there. - // - EfiBootManagerRefreshAllBootOption (); - - if (IsNeedSortBootOption()) { - EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareBoo= tOption); - } - // - // PXE boot option may appear after boot option enumeration - // - - break; - } - - Print (L"Press F7 for BootMenu!\n"); - - EfiBootManagerRefreshAllBootOption (); - EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, CompareBootOpt= ion); + BdsSignalEventAfterConsoleReadyBeforeBootOption (); } =20 /** @@ -1328,19 +260,19 @@ PlatformBootManagerUnableToBoot ( VOID ) { - EFI_STATUS Status; - EFI_BOOT_MANAGER_LOAD_OPTION BootDeviceList; - CHAR16 OptionName[sizeof ("Boot####")]; + BoardBootManagerUnableToBoot (); +} =20 - if (mBootMenuOptionNumber =3D=3D LoadOptionNumberUnassigned) { - return; - } - UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", mBootMenuOp= tionNumber); - Status =3D EfiBootManagerVariableToLoadOption (OptionName, &BootDeviceLi= st); - if (EFI_ERROR (Status)) { - return; - } - for (;;) { - EfiBootManagerBoot (&BootDeviceList); - } +/** + This function is called each second during the boot manager waits the ti= meout. + + @param TimeoutRemain The remaining timeout. +**/ +VOID +EFIAPI +PlatformBootManagerWaitCallback ( + UINT16 TimeoutRemain + ) +{ + BoardBootManagerWaitCallback (TimeoutRemain); } diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManag= erLib/BdsPlatform.h b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatform= BootManagerLib/BdsPlatform.h index 360a00d7d7..031676cdc3 100644 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/B= dsPlatform.h +++ b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/B= dsPlatform.h @@ -1,7 +1,7 @@ /** @file Header file for BDS Platform specific code =20 -Copyright (c) 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ @@ -9,176 +9,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #ifndef _BDS_PLATFORM_H #define _BDS_PLATFORM_H =20 -#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_PAT= H_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 gUsbClassKeyboardDevicePa= th; - -// -// 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 =20 #endif diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManag= erLib/DxePlatformBootManagerLib.inf b/Platform/Intel/MinPlatformPkg/Bds/Lib= rary/DxePlatformBootManagerLib/DxePlatformBootManagerLib.inf index 388ffd808b..4f7299f1df 100644 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/D= xePlatformBootManagerLib.inf +++ b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/D= xePlatformBootManagerLib.inf @@ -23,23 +23,13 @@ =20 [LibraryClasses] BaseLib - MemoryAllocationLib UefiBootServicesTableLib - UefiRuntimeServicesTableLib - BaseMemoryLib DebugLib - PcdLib - PrintLib - DevicePathLib UefiLib HobLib - DxeServicesLib - DxeServicesTableLib - HiiLib UefiBootManagerLib PerformanceLib - TimerLib - Tcg2PhysicalPresenceLib + BoardBootManagerLib =20 [Packages] MdePkg/MdePkg.dec @@ -47,47 +37,18 @@ SecurityPkg/SecurityPkg.dec MinPlatformPkg/MinPlatformPkg.dec =20 -[Pcd] - gMinPlatformPkgTokenSpaceGuid.PcdTpm2Enable ## CONSUM= ES - gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut ## PRO= DUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution ## PRO= DUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution ## PRO= DUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow ## PRO= DUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn ## PRO= DUCES - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutColumn ## CON= SUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow ## CON= SUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution ## CON= SUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution ## CON= SUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdConInConnectOnDemand ## PRO= DUCES - gMinPlatformPkgTokenSpaceGuid.PcdPlatformMemoryCheckLevel ## CONSUM= ES - gMinPlatformPkgTokenSpaceGuid.PcdBootToShellOnly ## CONSUM= ES - gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleInputDevicePath ## CONSU= MES - gMinPlatformPkgTokenSpaceGuid.PcdTrustedConsoleOutputDevicePath ## CONSU= MES - gMinPlatformPkgTokenSpaceGuid.PcdTrustedStorageDevicePath ## CONSU= MES - [Sources] BdsPlatform.c BdsPlatform.h - PlatformBootOption.c - MemoryTest.c =20 [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 =20 [Guids] - gEfiGlobalVariableGuid ## PRODUCES - gEfiMemoryOverwriteControlDataGuid ## PRODUCES - gEfiEndOfDxeEventGroupGuid ## CONSUMES + gEfiEndOfDxeEventGroupGuid ## CONSUMES + gBdsEventBeforeConsoleAfterTrustedConsoleGuid + gBdsEventBeforeConsoleBeforeEndOfDxeGuid + gBdsEventAfterConsoleReadyBeforeBootOptionGuid =20 [Depex.common.DXE_DRIVER] gEfiVariableArchProtocolGuid diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManag= erLib/MemoryTest.c b/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformB= ootManagerLib/MemoryTest.c deleted file mode 100644 index 654845349a..0000000000 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/M= emoryTest.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 =3D 0; - TotalMemorySize =3D 0; - ErrorOut =3D FALSE; - TestAbort =3D FALSE; - - RequireSoftECCInit =3D FALSE; - - Status =3D gBS->LocateProtocol ( - &gEfiGenericMemTestProtocolGuid, - NULL, - (VOID **) &GenMemoryTest - ); - if (EFI_ERROR (Status)) { - return EFI_SUCCESS; - } - - Status =3D GenMemoryTest->MemoryTestInit ( - GenMemoryTest, - Level, - &RequireSoftECCInit - ); - if (Status =3D=3D 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 P= EI code - // checks all the memory, this BDS memory test will has no not-test me= mory 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 re= turn. - // - return EFI_SUCCESS; - } - - do { - Status =3D GenMemoryTest->PerformMemoryTest ( - GenMemoryTest, - &TestedMemorySize, - &TotalMemorySize, - &ErrorOut, - TestAbort - ); - if (ErrorOut && (Status =3D=3D EFI_DEVICE_ERROR)) { - ASSERT (0); - } - } while (Status !=3D EFI_NOT_FOUND); - - Status =3D GenMemoryTest->Finished (GenMemoryTest); - - return EFI_SUCCESS; -} diff --git a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManag= erLib/PlatformBootOption.c b/Platform/Intel/MinPlatformPkg/Bds/Library/DxeP= latformBootManagerLib/PlatformBootOption.c deleted file mode 100644 index 84aa097d58..0000000000 --- a/Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/P= latformBootOption.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 =3D FALSE; -BOOLEAN mBootMenuBoot =3D FALSE; -BOOLEAN mPxeBoot =3D FALSE; -BOOLEAN mHotKeypressed =3D FALSE; -EFI_EVENT HotKeyEvent =3D 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 =3D NULL; - Status =3D EFI_SUCCESS; - - DEBUG ((DEBUG_INFO, "BdsCreateShellDevicePath\n")); - gBS->LocateHandleBuffer ( - ByProtocol, - &gEfiFirmwareVolume2ProtocolGuid, - NULL, - &FvHandleCount, - &FvHandleBuffer - ); - - for (Index =3D 0; Index < FvHandleCount; Index++) { - gBS->HandleProtocol ( - FvHandleBuffer[Index], - &gEfiFirmwareVolume2ProtocolGuid, - (VOID **) &Fv - ); - - Buffer =3D NULL; - Size =3D 0; - Status =3D 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 =3D 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 =3D=3D NULL) || (FileGuid =3D=3D NULL) || (Description = =3D=3D NULL)) { - return EFI_INVALID_PARAMETER; - } - - EfiInitializeFwVolDevicepathNode (&FileNode, FileGuid); - - if (!CompareGuid (&gUefiShellFileGuid, FileGuid)) { - Status =3D gBS->HandleProtocol ( - gImageHandle, - &gEfiLoadedImageProtocolGuid, - (VOID **) &LoadedImage - ); - if (!EFI_ERROR (Status)) { - Status =3D gBS->HandleProtocol ( - LoadedImage->DeviceHandle, - &gEfiFirmwareVolume2ProtocolGuid, - (VOID **) &Fv - ); - if (!EFI_ERROR (Status)) { - Buffer =3D NULL; - Size =3D 0; - Status =3D Fv->ReadSection ( - Fv, - FileGuid, - EFI_SECTION_PE32, - 0, - &Buffer, - &Size, - &AuthenticationStatus - ); - if (Buffer !=3D NULL) { - FreePool (Buffer); - } - } - } - if (EFI_ERROR (Status)) { - return EFI_NOT_FOUND; - } - - DevicePath =3D AppendDevicePathNode ( - DevicePathFromHandle (LoadedImage->DeviceHandle), - (EFI_DEVICE_PATH_PROTOCOL *) &FileNode - ); - } else { - DevicePath =3D AppendDevicePathNode ( - BdsCreateShellDevicePath (), - (EFI_DEVICE_PATH_PROTOCOL *) &FileNode - ); - } - - Status =3D EfiBootManagerInitializeLoadOption ( - BootOption, - LoadOptionNumberUnassigned, - LoadOptionTypeBoot, - Attributes, - Description, - DevicePath, - OptionalData, - OptionalDataSize - ); - FreePool (DevicePath); - return Status; -} - -EFI_GUID mUiFile =3D { - 0x462CAA21, 0x7614, 0x4503, { 0x83, 0x6E, 0x8A, 0xB6, 0xF4, 0x66, 0x23, = 0x31 } -}; -EFI_GUID mBootMenuFile =3D { - 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 =3D 0; Index < Count; Index++) { - if ((Key->OptionType =3D=3D Array[Index].OptionType) && - (Key->Attributes =3D=3D Array[Index].Attributes) && - (StrCmp (Key->Description, Array[Index].Description) =3D=3D 0) && - (CompareMem (Key->FilePath, Array[Index].FilePath, GetDevicePathSi= ze (Key->FilePath)) =3D=3D 0) && - (Key->OptionalDataSize =3D=3D Array[Index].OptionalDataSize) && - (CompareMem (Key->OptionalData, Array[Index].OptionalData, Key->Op= tionalDataSize) =3D=3D 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 =3D LoadOptionNumberUnassigned; - Status =3D CreateFvBootOption (FileGuid, Description, &NewOption, Attrib= utes, OptionalData, OptionalDataSize); - if (!EFI_ERROR (Status)) { - BootOptions =3D EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOp= tionTypeBoot); - - OptionIndex =3D PlatformFindLoadOption (&NewOption, BootOptions, BootO= ptionCount); - - if (OptionIndex =3D=3D -1) { - Status =3D EfiBootManagerAddLoadOptionVariable (&NewOption, Position= ); - ASSERT_EFI_ERROR (Status); - } else { - NewOption.OptionNumber =3D 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 =3D gBS->HandleProtocol (gST->ConsoleInHandle, &gEfiSimpleTextInp= utExProtocolGuid, (VOID **) &TxtInEx); - ASSERT_EFI_ERROR (Status); - - PausePressed =3D FALSE; - - while (TRUE) { - Status =3D TxtInEx->ReadKeyStrokeEx (TxtInEx, &KeyData); - if (EFI_ERROR (Status)) { - break; - } - - if (KeyData.Key.ScanCode =3D=3D SCAN_PAUSE) { - PausePressed =3D TRUE; - break; - } - } - - // - // Loop until non-PAUSE key pressed - // - while (PausePressed) { - Status =3D 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 =3D (BOOLEAN) (KeyData.Key.ScanCode =3D=3D SCAN_PAUSE); - } - } -} - - -EFI_GUID gUefiShellFileGuid =3D { 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 =3D NULL; - ShellDataSize =3D 0; - RegisterFvBootOption (&gUefiShellFileGuid, INTERNAL_UEFI_SHELL_NA= ME, (UINTN) -1, LOAD_OPTION_ACTIVE, (UINT8 *)ShellData, ShellDataSize); - - // - // Boot Menu - // - mBootMenuOptionNumber =3D RegisterFvBootOption (&mBootMenuFile, L"Boot D= evice List", (UINTN) -1, LOAD_OPTION_CATEGORY_APP | LOAD_OPTION_ACTIVE | = LOAD_OPTION_HIDDEN, NULL, 0); - - if (mBootMenuOptionNumber =3D=3D LoadOptionNumberUnassigned) { - DEBUG ((DEBUG_INFO, "BootMenuOptionNumber (%d) should not be same to L= oadOptionNumberUnassigned(%d).\n", mBootMenuOptionNumber, LoadOptionNumberU= nassigned)); - } -#if 0 - // - // Boot Manager Menu - // - EfiInitializeFwVolDevicepathNode (&FileNode, &mUiFile); - - gBS->HandleProtocol ( - gImageHandle, - &gEfiLoadedImageProtocolGuid, - (VOID **) &LoadedImage - ); - DevicePath =3D 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 =3D EfiBootManagerDeleteKeyOptionVariable (NULL, 0, Key, NULL); - ASSERT (Status =3D=3D EFI_SUCCESS || Status =3D=3D EFI_NOT_FOUND); - } else { - // - // Register enter hotkey for the first boot option - // - Status =3D EfiBootManagerAddKeyOptionVariable (NULL, OptionNumber, 0, = Key,NULL); - ASSERT (Status =3D=3D EFI_SUCCESS || Status =3D=3D EFI_ALREADY_STARTED= ); - } -} - -EFI_STATUS -EFIAPI -DetectKeypressCallback ( - IN EFI_KEY_DATA *KeyData -) -{ - mHotKeypressed =3D TRUE; - - if (HotKeyEvent !=3D NULL) { - gBS->SignalEvent(HotKeyEvent); - } - - return EFI_SUCCESS; -} - -/** - This function is called after all the boot options are enumerated and or= dered 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 =3D FALSE; - - // - // [Enter] - // - mContinueBoot =3D !EnterSetup; - if (mContinueBoot) { - Enter.ScanCode =3D SCAN_NULL; - Enter.UnicodeChar =3D CHAR_CARRIAGE_RETURN; - EfiBootManagerRegisterContinueKeyOption (0, &Enter, NULL); - } - - - // - // [F2]/[F7] - // - F2.Key.ScanCode =3D SCAN_F2; - F2.Key.UnicodeChar =3D CHAR_NULL; - F2.KeyState.KeyShiftState =3D EFI_SHIFT_STATE_VALID; - F2.KeyState.KeyToggleState =3D 0; - Status =3D EfiBootManagerGetBootManagerMenu (&BootOption); - ASSERT_EFI_ERROR (Status); - RegisterBootOptionHotkey ((UINT16) BootOption.OptionNumber, &F2.Key, TRU= E); - EfiBootManagerFreeLoadOption (&BootOption); - - F7.Key.ScanCode =3D SCAN_F7; - F7.Key.UnicodeChar =3D CHAR_NULL; - F7.KeyState.KeyShiftState =3D EFI_SHIFT_STATE_VALID; - F7.KeyState.KeyToggleState =3D 0; - mBootMenuBoot =3D !EnterSetup; - RegisterBootOptionHotkey ((UINT16) mBootMenuOptionNumber, &F7.Key, mBoot= MenuBoot); - -} - -UINT8 -BootOptionType ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath - ) -{ - EFI_DEVICE_PATH_PROTOCOL *Node; - EFI_DEVICE_PATH_PROTOCOL *NextNode; - - for (Node =3D DevicePath; !IsDevicePathEndType (Node); Node =3D NextDevi= cePathNode (Node)) { - if (DevicePathType (Node) =3D=3D MESSAGING_DEVICE_PATH) { - // - // Make sure the device path points to the driver device. - // - NextNode =3D NextDevicePathNode (Node); - if (DevicePathSubType(NextNode) =3D=3D MSG_DEVICE_LOGICAL_UNIT_DP) { - // - // if the next node type is Device Logical Unit, which specify the= Logical Unit Number (LUN), - // skip it - // - NextNode =3D NextDevicePathNode (NextNode); - } - if (IsDevicePathEndType (NextNode)) { - if ((DevicePathType (Node) =3D=3D 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) =3D=3D = 0) { - if (PcdGetBool (PcdBootToShellOnly)) { - return 0; - } - return 9; - } - if (StrCmp (BootOption->Description, UEFI_HARD_DRIVE_NAME) =3D=3D 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); -} - --=20 2.19.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#52228): https://edk2.groups.io/g/devel/message/52228 Mute This Topic: https://groups.io/mt/68590734/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-