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.kuba...@intel.com>
Cc: Chasel Chiu <chasel.c...@intel.com>
Cc: Nate DeSimone <nathaniel.l.desim...@intel.com>

Signed-off-by: Prince Agyeman <prince.agye...@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/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to