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

Kubacki, Michael A michael.a.kubacki at intel.com
Sat Dec 21 02:36:41 UTC 2019


Reviewed-by: Michael Kubacki <michael.a.kubacki at intel.com>

> -----Original Message-----
> From: Agyeman, Prince <prince.agyeman at intel.com>
> Sent: Friday, December 13, 2019 5:33 PM
> To: devel at edk2.groups.io
> Cc: Kubacki, Michael A <michael.a.kubacki at intel.com>; Chiu, Chasel
> <chasel.chiu at intel.com>; Desimone, Nathaniel L
> <nathaniel.l.desimone at 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 at intel.com>
> Cc: Chasel Chiu <chasel.chiu at intel.com>
> Cc: Nate DeSimone <nathaniel.l.desimone at intel.com>
> 
> Signed-off-by: Prince Agyeman <prince.agyeman at 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/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list