[edk2-devel] [edk2-platforms] [PATCH 05/11] MinPlatformPkg: Add BDS Hook Points

Agyeman, Prince posted 11 patches 4 years, 11 months ago
[edk2-devel] [edk2-platforms] [PATCH 05/11] MinPlatformPkg: Add BDS Hook Points
Posted by Agyeman, Prince 4 years, 11 months ago
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]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [edk2-platforms] [PATCH 05/11] MinPlatformPkg: Add BDS Hook Points
Posted by Chiu, Chasel 4 years, 11 months ago
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]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [edk2-platforms] [PATCH 05/11] MinPlatformPkg: Add BDS Hook Points
Posted by Nate DeSimone 4 years, 11 months ago
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]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [edk2-platforms] [PATCH 05/11] MinPlatformPkg: Add BDS Hook Points
Posted by Kubacki, Michael A 4 years, 11 months ago
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]
-=-=-=-=-=-=-=-=-=-=-=-