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