From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by mx.groups.io with SMTP id smtpd.web12.194.1576561477440278771 for ; Mon, 16 Dec 2019 21:44:37 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.93, mailfrom: chasel.chiu@intel.com) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 16 Dec 2019 21:44:36 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,324,1571727600"; d="scan'208";a="365263546" Received: from kmsmsx155.gar.corp.intel.com ([172.21.73.106]) by orsmga004.jf.intel.com with ESMTP; 16 Dec 2019 21:44:34 -0800 Received: from pgsmsx111.gar.corp.intel.com ([169.254.2.106]) by KMSMSX155.gar.corp.intel.com ([169.254.15.24]) with mapi id 14.03.0439.000; Tue, 17 Dec 2019 13:44:33 +0800 From: "Chiu, Chasel" To: "Agyeman, Prince" , "devel@edk2.groups.io" CC: "Kubacki, Michael A" , "Desimone, Nathaniel L" Subject: Re: [edk2-platforms] [PATCH 05/11] MinPlatformPkg: Add BDS Hook Points Thread-Topic: [edk2-platforms] [PATCH 05/11] MinPlatformPkg: Add BDS Hook Points Thread-Index: AQHVsh5kn+h9xCVaWUeNYS2XjUg6mae91cNg Date: Tue, 17 Dec 2019 05:44:32 +0000 Message-ID: <3C3EFB470A303B4AB093197B6777CCEC505D1D13@PGSMSX111.gar.corp.intel.com> References: In-Reply-To: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZjI3MmI4NjItNzg1OS00ZmRlLThhOTktYmYyOTMyOWFjYjIxIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiVHNIQjVlWklneCtiTHFtUFl6bXhvaG5xUnh3ZFwvY1lQckVTQjNFbEZkYVlFZUtqbXY0QVdxcTJhdjNiQ1k0cXEifQ== x-ctpclassification: CTP_NT x-originating-ip: [172.30.20.206] MIME-Version: 1.0 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Chasel Chiu > -----Original Message----- > From: Agyeman, Prince > Sent: Saturday, December 14, 2019 9:33 AM > To: devel@edk2.groups.io > Cc: Kubacki, Michael A ; Chiu, Chasel > ; Desimone, Nathaniel L > > Subject: [edk2-platforms] [PATCH 05/11] MinPlatformPkg: Add BDS Hook > Points >=20 > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2336 >=20 > Added BDS hook points to the Minplatform boot manager library > as defined in the Minimum Platfrom specifcations. >=20 > Changes made: >=20 > * Added functions to signal three BDS event groups. > These event groups are BeforeConsoleAfterTrustedConsole, > BeforeConsoleBeforeEndOfDxe and AfterConsoleReadyBeforeBootOption. >=20 > * 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 >=20 > See https://edk2-docs.gitbooks.io/edk-ii-minimum-platform-specification, > under Appendix A.3 BDS Hook Points, for more details. >=20 > Cc: Michael Kubacki > Cc: Chasel Chiu > Cc: Nate DeSimone >=20 > 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/Me > moryTest.c > delete mode 100644 > Platform/Intel/MinPlatformPkg/Bds/Library/DxePlatformBootManagerLib/Pla > tformBootOption.c >=20 > 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/O= EM. >=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 > gUsbClassKeyboardDevicePath =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: > gEfiMemoryOverwriteControlDataGuid doesn't exist!!***\n")); > - MorControl =3D 0; > - } else { > - DEBUG ((DEBUG_INFO, " PlatformBootMangerLib: Get the > gEfiMemoryOverwriteControlDataGuid =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; > RootBridgeIndex++) { > - 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 > (PcdTrustedConsoleInputDevicePath); > - 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 > (PcdTrustedConsoleOutputDevicePath); > - 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) || > (DevicePathSubType (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->CreateEvent(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 remaini= ng > 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, &C= lass); > - 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 > 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 =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 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 =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 i= t. > - // > - GopDevicePath =3D EfiBootManagerGetGopDevicePath > (GraphicsControllerHandle); > - if (GopDevicePath !=3D NULL) { > - GetEfiGlobalVariable2 (L"ConOut", (VOID **)&ConOutDevicePath, > NULL); > - UpdatedConOutDevicePath =3D UpdateGopDevicePath > (ConOutDevicePath, GopDevicePath); > - if (ConOutDevicePath !=3D 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 =3D ConsoleDevicePath; > - do { > - Instance =3D GetNextDevicePathInstance (&TempDevicePath, &Size); > - if (Instance =3D=3D 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 =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 > (GraphicsControllerHandle); > - 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 > (PcdTrustedConsoleOutputDevicePath); > - 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 > NextDevicePathNode (Next)) { > - if (DevicePathType (Next) =3D=3D ACPI_DEVICE_PATH && > DevicePathSubType (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 > ACPI_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 > callbacks 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 > processing 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", > BootCurrent); > + 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 returned 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 > 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 resoluti= on, 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 > mShellHorizontalResolution) && > - (GraphicsOutput->Mode->Info->VerticalResolution =3D=3D > mShellVerticalResolution)) { > - // > - // 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, > SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow); > - ASSERT_EFI_ERROR (Status); > - if (CurrentColumn =3D=3D mShellModeColumn && CurrentRow =3D=3D > 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 =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, s= et > new video resolution. > - // In this case, the driver which produces simple text out nee= d > be restarted. > - // > - Status =3D 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 =3D PcdSet32S (PcdVideoHorizontalResolution, > mShellHorizontalResolution); > - ASSERT_EFI_ERROR (Status); > - > - Status =3D PcdSet32S (PcdVideoVerticalResolution, > mShellVerticalResolution); > - 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, TRUE); > - } > - 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 have returned successfully\n")); > } > - > - return EFI_SUCCESS; > } >=20 > -/** > - ReadyToBoot callback to set video and text mode for internal shell boo= t. > - 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 console= s > 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 > (PcdSetupVideoHorizontalResolution); > - mShellVerticalResolution =3D PcdGet32 > (PcdSetupVideoVerticalResolution); > - mShellModeColumn =3D PcdGet32 (PcdSetupConOutColumn); > - mShellModeRow =3D PcdGet32 (PcdSetupConOutRow); > - > - // > - // Create event to set proper video resolution and text mode for inter= nal > shell. > - // > - Status =3D EfiCreateEventReadyToBootEx ( > - TPL_CALLBACK, > - OnReadyToBootCallBack, > - NULL, > - &Event > - ); > - ASSERT_EFI_ERROR (Status); > - > - // > - // Connect Root Bridge to make PCI BAR resource allocated and all PciI= o > 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 > (VarConOut !=3D NULL) { FreePool (VarConOut); } > - GetEfiGlobalVariable2 (L"ConIn", (VOID **)&VarConIn, NULL); if > (VarConIn !=3D 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 =3D=3D NULL || VarConIn =3D=3D NULL) { > - if (PcdGetSize (PcdTrustedConsoleOutputDevicePath) >=3D > sizeof(EFI_DEVICE_PATH_PROTOCOL)) { > - AddConsoleVariable (ConOut, PcdGetPtr > (PcdTrustedConsoleOutputDevicePath)); > - } > - if (PcdGetSize (PcdTrustedConsoleInputDevicePath) >=3D > sizeof(EFI_DEVICE_PATH_PROTOCOL)) { > - AddConsoleVariable (ConIn, PcdGetPtr > (PcdTrustedConsoleInputDevicePath)); > - } > - } > - } >=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 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); >=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 > 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 =3D 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"))) =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 > specific > @@ -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 > 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 (); > } >=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", > mBootMenuOptionNumber); > - Status =3D 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 >=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_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 >=20 > #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 @@ >=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 > ## 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 >=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/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 =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 th= e > 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 =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/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 =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 equ= al. > - > - @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, > GetDevicePathSize (Key->FilePath)) =3D=3D 0) && > - (Key->OptionalDataSize =3D=3D Array[Index].OptionalDataSize) && > - (CompareMem (Key->OptionalData, Array[Index].OptionalData, > Key->OptionalDataSize) =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, > Attributes, OptionalData, OptionalDataSize); > - if (!EFI_ERROR (Status)) { > - BootOptions =3D EfiBootManagerGetLoadOptions (&BootOptionCount, > LoadOptionTypeBoot); > - > - OptionIndex =3D PlatformFindLoadOption (&NewOption, BootOptions, > BootOptionCount); > - > - 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, > &gEfiSimpleTextInputExProtocolGuid, (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, 0x= 65, > 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_NAME, (UINTN) -1, LOAD_OPTION_ACTIVE, (UINT8 > *)ShellData, ShellDataSize); > - > - // > - // Boot Menu > - // > - mBootMenuOptionNumber =3D RegisterFvBootOption (&mBootMenuFile, > L"Boot Device 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 LoadOptionNumberUnassigned(%d).\n", mBootMenuOptionNumber, > LoadOptionNumberUnassigned)); > - } > -#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_START= ED); > - } > -} > - > -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 > 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 =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, > TRUE); > - 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, > mBootMenuBoot); > - > -} > - > -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 > NextDevicePathNode (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 t= he > 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); > -} > - > -- > 2.19.1.windows.1