回复: [edk2-devel] [PATCH] MdeModulePkg/FPDT: Lock boot performance table address variable at EndOfDxe

gaoliming gaoliming at byosoft.com.cn
Fri Nov 12 01:21:24 UTC 2021


Dandan and WuHao:
  This patch has reviewed-by before soft feature freeze. Can you help merge
it?

Thanks
Liming
> -----邮件原件-----
> 发件人: devel at edk2.groups.io <devel at edk2.groups.io> 代表 Dandan Bi
> 发送时间: 2021年10月11日 11:49
> 收件人: devel at edk2.groups.io
> 抄送: Dandan Bi <dandan.bi at intel.com>; Liming Gao
> <gaoliming at byosoft.com.cn>; Hao A Wu <hao.a.wu at intel.com>; Jian J Wang
> <jian.j.wang at intel.com>
> 主题: [edk2-devel] [PATCH] MdeModulePkg/FPDT: Lock boot performance
> table address variable at EndOfDxe
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2957
> 
> 1. Allocate performance data table at EndOfDxe and then lock the varible
>    which store the table address at EndOfDxe.
> 
> 2. Enlarge PCD
> gEfiMdeModulePkgTokenSpaceGuid.PcdExtFpdtBootRecordPadSize
>    from 0x20000 to 0x30000 in order to hold the Delta performance data
>    between EndOfDxe and ReadyToBoot.
> 
> 3. SMM performance data is collected by DXE modules through SMM
> communication
>    at ReadyToBoot before.
>    Now to do SMM communication twice, one for allocating the performance
>    size at EndOfDxe, another is at ReadyToBoot to get SMM performance
> data.
> 
> 4. Make SmmCorePerformanceLib rather than FirmwarePerformanceSmm to
> communicate
>    with DxeCorePerformanceLib for SMM performance data and size.
> 
> Cc: Liming Gao <gaoliming at byosoft.com.cn>
> Cc: Hao A Wu <hao.a.wu at intel.com>
> Cc: Jian J Wang <jian.j.wang at intel.com>
> Signed-off-by: Dandan Bi <dandan.bi at intel.com>
> Reviewed-by: Hao A Wu <hao.a.wu at intel.com>
> ---
>  .../DxeCorePerformanceLib.c                   | 132 +++++++++++----
>  .../DxeCorePerformanceLib.inf                 |   3 +-
>  .../SmmCorePerformanceLib.c                   | 142
> +++++++++++++----
>  .../SmmCorePerformanceLib.inf                 |   5 +-
>  MdeModulePkg/MdeModulePkg.dec                 |   4 +-
>  .../FirmwarePerformanceDxe.c                  |  90 +++++++++--
>  .../FirmwarePerformanceDxe.inf                |   6 +-
>  .../FirmwarePerformanceCommon.c               | 150 +-----------------
>  .../FirmwarePerformanceCommon.h               |  17 +-
>  .../FirmwarePerformanceSmm.inf                |   4 +-
>  .../FirmwarePerformanceStandaloneMm.c         |  21 +--
>  .../FirmwarePerformanceStandaloneMm.inf       |   4 +-
>  .../FirmwarePerformanceTraditional.c          |  21 +--
>  13 files changed, 306 insertions(+), 293 deletions(-)
> 
> diff --git
> a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.
> c
> b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.
> c
> index d378c59dd9..532b3f8c90 100644
> ---
> a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.
> c
> +++
> b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.
> c
> @@ -10,7 +10,7 @@
>    This library is mainly used by DxeCore to start performance logging to
> ensure that
>    Performance Protocol is installed at the very beginning of DXE phase.
> 
> -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>
>  (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> @@ -64,7 +64,7 @@ UINT32  mLoadImageCount       = 0;
>  UINT32  mPerformanceLength    = 0;
>  UINT32  mMaxPerformanceLength = 0;
>  UINT32  mBootRecordSize       = 0;
> -UINT32  mBootRecordMaxSize    = 0;
> +UINTN   mBootRecordMaxSize    = 0;
>  UINT32  mCachedLength         = 0;
> 
>  BOOLEAN mFpdtBufferIsReported = FALSE;
> @@ -205,25 +205,26 @@ IsKnownID (
>  }
> 
>  /**
> -  Allocate buffer for Boot Performance table.
> +  This internal function dumps all the SMM performance data and size.
> 
> -  @return Status code.
> +  @param    SmmPerfData        Smm Performance data. The buffer
> contain the SMM perf data is allocated by this function and caller needs
to
> free it.
> +  @param    SmmPerfDataSize    Smm Performance data size.
> +  @param    SkipGetPerfData    Skip to get performance data, just get
> the size.
> 
>  **/
> -EFI_STATUS
> -AllocateBootPerformanceTable (
> +VOID
> +InternalGetSmmPerfData (
> +  OUT VOID      **SmmPerfData,
> +  OUT UINTN     *SmmPerfDataSize,
> +  IN  BOOLEAN   SkipGetPerfData
>    )
>  {
>    EFI_STATUS                              Status;
> -  UINTN                                   Size;
>    UINT8
> *SmmBootRecordCommBuffer;
>    EFI_SMM_COMMUNICATE_HEADER
> *SmmCommBufferHeader;
>    SMM_BOOT_RECORD_COMMUNICATE             *SmmCommData;
>    UINTN                                   CommSize;
> -  UINTN
> BootPerformanceDataSize;
> -  UINT8                                   *BootPerformanceData;
>    EFI_SMM_COMMUNICATION_PROTOCOL          *Communication;
> -  FIRMWARE_PERFORMANCE_VARIABLE
> PerformanceVariable;
>    EDKII_PI_SMM_COMMUNICATION_REGION_TABLE
> *SmmCommRegionTable;
>    EFI_MEMORY_DESCRIPTOR
> *SmmCommMemRegion;
>    UINTN                                   Index;
> @@ -237,7 +238,6 @@ AllocateBootPerformanceTable (
>    SmmBootRecordCommBuffer = NULL;
>    SmmCommData             = NULL;
>    SmmBootRecordData       = NULL;
> -  SmmBootRecordDataSize   = 0;
>    ReservedMemSize         = 0;
>    Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid,
> NULL, (VOID **) &Communication);
>    if (!EFI_ERROR (Status)) {
> @@ -284,6 +284,10 @@ AllocateBootPerformanceTable (
>          Status = Communication->Communicate (Communication,
> SmmBootRecordCommBuffer, &CommSize);
> 
>          if (!EFI_ERROR (Status) && !EFI_ERROR
> (SmmCommData->ReturnStatus) && SmmCommData->BootRecordSize != 0) {
> +          if (SkipGetPerfData) {
> +            *SmmPerfDataSize = SmmCommData->BootRecordSize;
> +            return;
> +          }
>            //
>            // Get all boot records
>            //
> @@ -305,19 +309,45 @@ AllocateBootPerformanceTable (
>              }
>              SmmCommData->BootRecordOffset =
> SmmCommData->BootRecordOffset + SmmCommData->BootRecordSize;
>            }
> +          *SmmPerfData     = SmmBootRecordData;
> +          *SmmPerfDataSize = SmmBootRecordDataSize;
>          }
>        }
>      }
>    }
> +}
> +
> +/**
> +  Allocate buffer for Boot Performance table.
> +
> +  @return Status code.
> +
> +**/
> +EFI_STATUS
> +AllocateBootPerformanceTable (
> +  VOID
> +  )
> +{
> +  EFI_STATUS                              Status;
> +  UINTN                                   Size;
> +  UINTN
> BootPerformanceDataSize;
> +  UINT8
> *BootPerformanceData;
> +  FIRMWARE_PERFORMANCE_VARIABLE
> PerformanceVariable;
> +  UINTN
> SmmBootRecordDataSize;
> +
> +  SmmBootRecordDataSize = 0;
> +
> +  //
> +  // Get SMM performance data size at the point of EndOfDxe in order to
> allocate the boot performance table.
> +  // Will Get all the data at ReadyToBoot.
> +  //
> +  InternalGetSmmPerfData (NULL, &SmmBootRecordDataSize, TRUE);
> 
>    //
>    // Prepare memory for Boot Performance table.
>    // Boot Performance table includes BasicBoot record, and one or more
> appended Boot Records.
>    //
> -  BootPerformanceDataSize = sizeof (BOOT_PERFORMANCE_TABLE) +
> mPerformanceLength + PcdGet32 (PcdExtFpdtBootRecordPadSize);
> -  if (SmmCommData != NULL && SmmBootRecordData != NULL) {
> -    BootPerformanceDataSize += SmmBootRecordDataSize;
> -  }
> +  BootPerformanceDataSize = sizeof (BOOT_PERFORMANCE_TABLE) +
> mPerformanceLength + SmmBootRecordDataSize + PcdGet32
> (PcdExtFpdtBootRecordPadSize);
> 
>    //
>    // Try to allocate the same runtime buffer as last time boot.
> @@ -358,9 +388,6 @@ AllocateBootPerformanceTable (
>    DEBUG ((DEBUG_INFO, "DxeCorePerformanceLib: ACPI Boot Performance
> Table address = 0x%x\n", mAcpiBootPerformanceTable));
> 
>    if (mAcpiBootPerformanceTable == NULL) {
> -    if (SmmCommData != NULL && SmmBootRecordData != NULL) {
> -      FreePool (SmmBootRecordData);
> -    }
>      return EFI_OUT_OF_RESOURCES;
>    }
> 
> @@ -385,19 +412,10 @@ AllocateBootPerformanceTable (
>      mPerformanceLength    = 0;
>      mMaxPerformanceLength = 0;
>    }
> -  if (SmmCommData != NULL && SmmBootRecordData != NULL) {
> -    //
> -    // Fill Boot records from SMM drivers.
> -    //
> -    CopyMem (BootPerformanceData, SmmBootRecordData,
> SmmBootRecordDataSize);
> -    FreePool (SmmBootRecordData);
> -    mAcpiBootPerformanceTable->Header.Length = (UINT32)
> (mAcpiBootPerformanceTable->Header.Length + SmmBootRecordDataSize);
> -    BootPerformanceData = BootPerformanceData +
> SmmBootRecordDataSize;
> -  }
> 
>    mBootRecordBuffer  = (UINT8 *) mAcpiBootPerformanceTable;
>    mBootRecordSize    = mAcpiBootPerformanceTable->Header.Length;
> -  mBootRecordMaxSize = mBootRecordSize + PcdGet32
> (PcdExtFpdtBootRecordPadSize);
> +  mBootRecordMaxSize = BootPerformanceDataSize;
> 
>    return EFI_SUCCESS;
>  }
> @@ -1336,6 +1354,47 @@ ReportFpdtRecordBuffer (
>    }
>  }
> 
> +/**
> +  Update Boot Performance table.
> +
> +  @param  Event    The event of notify protocol.
> +  @param  Context  Notify event context.
> +
> +**/
> +VOID
> +EFIAPI
> +UpdateBootPerformanceTable (
> +  IN EFI_EVENT     Event,
> +  IN VOID          *Context
> +  )
> +{
> +  VOID                             *SmmBootRecordData;
> +  UINTN                            SmmBootRecordDataSize;
> +  UINTN                            AppendSize;
> +  UINT8                            *FirmwarePerformanceTablePtr;
> +
> +  //
> +  // Get SMM performance data.
> +  //
> +  SmmBootRecordData = NULL;
> +  InternalGetSmmPerfData (&SmmBootRecordData,
> &SmmBootRecordDataSize, FALSE);
> +
> +  FirmwarePerformanceTablePtr = (UINT8 *) mAcpiBootPerformanceTable
> + mAcpiBootPerformanceTable->Header.Length;
> +
> +  if (mAcpiBootPerformanceTable->Header.Length +
> SmmBootRecordDataSize > mBootRecordMaxSize) {
> +    DEBUG ((DEBUG_INFO, "DxeCorePerformanceLib: No enough space to
> save all SMM boot performance data\n"));
> +    AppendSize = mBootRecordMaxSize -
> mAcpiBootPerformanceTable->Header.Length;
> +  } else {
> +    AppendSize = SmmBootRecordDataSize;
> +  }
> +  if (SmmBootRecordData != NULL) {
> +    CopyMem (FirmwarePerformanceTablePtr, SmmBootRecordData,
> AppendSize);
> +    mAcpiBootPerformanceTable->Header.Length += (UINT32) AppendSize;
> +    mBootRecordSize +=  (UINT32) AppendSize;
> +    FreePool (SmmBootRecordData);
> +  }
> +}
> +
>  /**
>    The constructor function initializes Performance infrastructure for DXE
> phase.
> 
> @@ -1358,6 +1417,7 @@ DxeCorePerformanceLibConstructor (
>  {
>    EFI_STATUS                Status;
>    EFI_HANDLE                Handle;
> +  EFI_EVENT                 EndOfDxeEvent;
>    EFI_EVENT                 ReadyToBootEvent;
>    PERFORMANCE_PROPERTY      *PerformanceProperty;
> 
> @@ -1386,13 +1446,25 @@ DxeCorePerformanceLibConstructor (
>    ASSERT_EFI_ERROR (Status);
> 
>    //
> -  // Register ReadyToBoot event to report StatusCode data
> +  // Register EndOfDxe event to allocate the boot performance table and
> report the table address through status code.
>    //
>    Status = gBS->CreateEventEx (
>                    EVT_NOTIFY_SIGNAL,
> -                  TPL_CALLBACK,
> +                  TPL_NOTIFY,
>                    ReportFpdtRecordBuffer,
>                    NULL,
> +                  &gEfiEndOfDxeEventGroupGuid,
> +                  &EndOfDxeEvent
> +                  );
> +
> +  //
> +  // Register ReadyToBoot event to update the boot performance table for
> SMM performance data.
> +  //
> +  Status = gBS->CreateEventEx (
> +                  EVT_NOTIFY_SIGNAL,
> +                  TPL_CALLBACK,
> +                  UpdateBootPerformanceTable,
> +                  NULL,
>                    &gEfiEventReadyToBootGuid,
>                    &ReadyToBootEvent
>                    );
> diff --git
> a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.i
> nf
> b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.i
> nf
> index 1c1dcc60a6..599d4dea66 100644
> ---
> a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.i
> nf
> +++
> b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.i
> nf
> @@ -9,7 +9,7 @@
>  #  This library is mainly used by DxeCore to start performance logging to
> ensure that
>  #  Performance and PerformanceEx Protocol are installed at the very
> beginning of DXE phase.
>  #
> -#  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>
>  # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent
>  #
> @@ -67,6 +67,7 @@ [Guids]
>    gZeroGuid                                     ##
> SOMETIMES_CONSUMES ## GUID
>    gEfiFirmwarePerformanceGuid                   ##
> SOMETIMES_PRODUCES ## UNDEFINED # StatusCode Data
>    gEdkiiFpdtExtendedFirmwarePerformanceGuid     ##
> SOMETIMES_CONSUMES ## HOB # StatusCode Data
> +  gEfiEndOfDxeEventGroupGuid                    ## CONSUMES
> ## Event
>    gEfiEventReadyToBootGuid                      ## CONSUMES
> ## Event
>    gEdkiiPiSmmCommunicationRegionTableGuid       ##
> SOMETIMES_CONSUMES    ## SystemTable
>    gEdkiiPerformanceMeasurementProtocolGuid      ## PRODUCES
> ## UNDEFINED # Install protocol
> diff --git
> a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLi
> b.c
> b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLi
> b.c
> index b4f22c14ae..d80f37e520 100644
> ---
> a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLi
> b.c
> +++
> b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLi
> b.c
> @@ -16,7 +16,7 @@
> 
>   SmmPerformanceHandlerEx(), SmmPerformanceHandler() will receive
> untrusted input and do basic validation.
> 
> -Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -48,6 +48,7 @@ CHAR8                *mPlatformLanguage    =
> NULL;
>  SPIN_LOCK            mSmmFpdtLock;
>  PERFORMANCE_PROPERTY  mPerformanceProperty;
>  UINT32               mCachedLength         = 0;
> +UINT32               mBootRecordSize       = 0;
> 
>  //
>  // Interfaces for SMM PerformanceMeasurement Protocol.
> @@ -776,41 +777,116 @@ InsertFpdtRecord (
>  }
> 
>  /**
> -  SmmReadyToBoot protocol notification event handler.
> +  Communication service SMI Handler entry.
> 
> -  @param  Protocol   Points to the protocol's unique identifier
> -  @param  Interface  Points to the interface instance
> -  @param  Handle     The handle on which the interface was installed
> +  This SMI handler provides services for report MM boot records.
> 
> -  @retval EFI_SUCCESS   SmmReadyToBootCallback runs successfully
> +  Caution: This function may receive untrusted input.
> +  Communicate buffer and buffer size are external input, so this function
will
> do basic validation.
> +
> +  @param[in]     DispatchHandle  The unique handle assigned to this
> handler by SmiHandlerRegister().
> +  @param[in]     RegisterContext Points to an optional handler context
> which was specified when the
> +                                 handler was registered.
> +  @param[in, out] CommBuffer     A pointer to a collection of data in
> memory that will
> +                                 be conveyed from a non-MM
> environment into an MM environment.
> +  @param[in, out] CommBufferSize The size of the CommBuffer.
> +
> +  @retval EFI_SUCCESS                         The interrupt was
> handled and quiesced. No other handlers
> +                                              should still be
> called.
> +  @retval EFI_WARN_INTERRUPT_SOURCE_QUIESCED  The interrupt has
> been quiesced but other handlers should
> +                                              still be called.
> +  @retval EFI_WARN_INTERRUPT_SOURCE_PENDING   The interrupt is
> still pending and other handlers should still
> +                                              be called.
> +  @retval EFI_INTERRUPT_PENDING               The interrupt could
> not be quiesced.
> 
>  **/
>  EFI_STATUS
>  EFIAPI
> -SmmReportFpdtRecordData (
> -  IN CONST EFI_GUID                       *Protocol,
> -  IN VOID                                 *Interface,
> -  IN EFI_HANDLE                           Handle
> +FpdtSmiHandler (
> +  IN     EFI_HANDLE                   DispatchHandle,
> +  IN     CONST VOID                   *RegisterContext,
> +  IN OUT VOID                         *CommBuffer,
> +  IN OUT UINTN                        *CommBufferSize
>    )
>  {
> -  UINT64          SmmBPDTddr;
> -
> -  if (!mFpdtDataIsReported && mSmmBootPerformanceTable != NULL) {
> -    SmmBPDTddr = (UINT64)(UINTN)mSmmBootPerformanceTable;
> -    REPORT_STATUS_CODE_EX (
> -        EFI_PROGRESS_CODE,
> -        EFI_SOFTWARE_SMM_DRIVER,
> -        0,
> -        NULL,
> -        &gEdkiiFpdtExtendedFirmwarePerformanceGuid,
> -        &SmmBPDTddr,
> -        sizeof (UINT64)
> +  EFI_STATUS                   Status;
> +  SMM_BOOT_RECORD_COMMUNICATE  *SmmCommData;
> +  UINTN                        BootRecordOffset;
> +  UINTN                        BootRecordSize;
> +  VOID                         *BootRecordData;
> +  UINTN                        TempCommBufferSize;
> +  UINT8                        *BootRecordBuffer;
> +
> +  //
> +  // If input is invalid, stop processing this SMI
> +  //
> +  if (CommBuffer == NULL || CommBufferSize == NULL) {
> +    return EFI_SUCCESS;
> +  }
> +
> +  TempCommBufferSize = *CommBufferSize;
> +
> +  if(TempCommBufferSize < sizeof (SMM_BOOT_RECORD_COMMUNICATE))
> {
> +    return EFI_SUCCESS;
> +  }
> +
> +  if (!SmmIsBufferOutsideSmmValid ((UINTN)CommBuffer,
> TempCommBufferSize)) {
> +    DEBUG ((DEBUG_ERROR, "FpdtSmiHandler: MM communication data
> buffer in MMRAM or overflow!\n"));
> +    return EFI_SUCCESS;
> +  }
> +
> +  SmmCommData = (SMM_BOOT_RECORD_COMMUNICATE*)CommBuffer;
> +
> +  Status = EFI_SUCCESS;
> +
> +  switch (SmmCommData->Function) {
> +    case SMM_FPDT_FUNCTION_GET_BOOT_RECORD_SIZE :
> +      if (mSmmBootPerformanceTable != NULL) {
> +        mBootRecordSize = mSmmBootPerformanceTable->Header.Length
> - sizeof (SMM_BOOT_PERFORMANCE_TABLE);
> +      }
> +      SmmCommData->BootRecordSize = mBootRecordSize;
> +      break;
> +
> +    case SMM_FPDT_FUNCTION_GET_BOOT_RECORD_DATA :
> +      Status = EFI_UNSUPPORTED;
> +      break;
> +
> +    case SMM_FPDT_FUNCTION_GET_BOOT_RECORD_DATA_BY_OFFSET :
> +      BootRecordOffset = SmmCommData->BootRecordOffset;
> +      BootRecordData   = SmmCommData->BootRecordData;
> +      BootRecordSize   = SmmCommData->BootRecordSize;
> +      if (BootRecordData == NULL || BootRecordOffset >=
> mBootRecordSize) {
> +        Status = EFI_INVALID_PARAMETER;
> +        break;
> +      }
> +
> +      //
> +      // Sanity check
> +      //
> +      if (BootRecordSize > mBootRecordSize - BootRecordOffset) {
> +        BootRecordSize = mBootRecordSize - BootRecordOffset;
> +      }
> +      SmmCommData->BootRecordSize = BootRecordSize;
> +      if (!SmmIsBufferOutsideSmmValid ((UINTN)BootRecordData,
> BootRecordSize)) {
> +        DEBUG ((DEBUG_ERROR, "FpdtSmiHandler: MM Data buffer in
> MMRAM or overflow!\n"));
> +        Status = EFI_ACCESS_DENIED;
> +        break;
> +      }
> +      BootRecordBuffer = ((UINT8 *) (mSmmBootPerformanceTable)) +
> sizeof (SMM_BOOT_PERFORMANCE_TABLE);
> +      CopyMem (
> +        (UINT8*)BootRecordData,
> +        BootRecordBuffer + BootRecordOffset,
> +        BootRecordSize
>          );
> -    //
> -    // Set FPDT report state to TRUE.
> -    //
> -    mFpdtDataIsReported = TRUE;
> +      mFpdtDataIsReported = TRUE;
> +      break;
> +
> +    default:
> +      Status = EFI_UNSUPPORTED;
>    }
> +
> +  SmmCommData->ReturnStatus = Status;
> +
>    return EFI_SUCCESS;
>  }
> 
> @@ -830,8 +906,8 @@ InitializeSmmCorePerformanceLib (
>    )
>  {
>    EFI_HANDLE                Handle;
> +  EFI_HANDLE                SmiHandle;
>    EFI_STATUS                Status;
> -  VOID                      *SmmReadyToBootRegistration;
>    PERFORMANCE_PROPERTY      *PerformanceProperty;
> 
>    //
> @@ -851,11 +927,13 @@ InitializeSmmCorePerformanceLib (
>                      );
>    ASSERT_EFI_ERROR (Status);
> 
> -  Status = gSmst->SmmRegisterProtocolNotify (
> -                    &gEdkiiSmmReadyToBootProtocolGuid,
> -                    SmmReportFpdtRecordData,
> -                    &SmmReadyToBootRegistration
> -                    );
> +  //
> +  // Register SMI handler.
> +  //
> +  SmiHandle = NULL;
> +  Status = gSmst->SmiHandlerRegister (FpdtSmiHandler,
> &gEfiFirmwarePerformanceGuid, &SmiHandle);
> +  ASSERT_EFI_ERROR (Status);
> +
>    Status = EfiGetSystemConfigurationTable (&gPerformanceProtocolGuid,
> (VOID **) &PerformanceProperty);
>    if (EFI_ERROR (Status)) {
>      //
> diff --git
> a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLi
> b.inf
> b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLi
> b.inf
> index 6b013b8557..9eecc4b58c 100644
> ---
> a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLi
> b.inf
> +++
> b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLi
> b.inf
> @@ -8,7 +8,7 @@
>  #  This library is mainly used by SMM Core to start performance logging
to
> ensure that
>  #  SMM Performance and PerformanceEx Protocol are installed at the very
> beginning of SMM phase.
>  #
> -#  Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent
>  #
>  ##
> @@ -58,14 +58,13 @@ [LibraryClasses]
> 
>  [Protocols]
>    gEfiSmmBase2ProtocolGuid                  ## CONSUMES
> -  gEdkiiSmmReadyToBootProtocolGuid          ## NOTIFY
> 
>  [Guids]
>    ## PRODUCES ## SystemTable
>    gPerformanceProtocolGuid
> -  gEdkiiFpdtExtendedFirmwarePerformanceGuid ##
> SOMETIMES_PRODUCES ## UNDEFINED # StatusCode Data
>    gZeroGuid                                 ##
> SOMETIMES_CONSUMES ## GUID
>    gEdkiiSmmPerformanceMeasurementProtocolGuid             ##
> PRODUCES ## UNDEFINED # Install protocol
> +  gEfiFirmwarePerformanceGuid               ##
> SOMETIMES_PRODUCES ## UNDEFINED # SmiHandlerRegister
> 
>  [Pcd]
>    gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask
> ## CONSUMES
> diff --git a/MdeModulePkg/MdeModulePkg.dec
> b/MdeModulePkg/MdeModulePkg.dec
> index 133e04ee86..463e889e9a 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -1879,9 +1879,9 @@ [PcdsFixedAtBuild, PcdsPatchableInModule,
> PcdsDynamic, PcdsDynamicEx]
> 
> gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosEntryPointProvideMethod|0x3
> |UINT32|0x00010069
> 
>    ## This PCD specifies the additional pad size in FPDT Basic Boot
> Performance Table for
> -  #  the extension FPDT boot records received after ReadyToBoot and
> before ExitBootService.
> +  #  the extension FPDT boot records received after EndOfDxe and before
> ExitBootService.
>    # @Prompt Pad size for extension FPDT boot records.
> -
> gEfiMdeModulePkgTokenSpaceGuid.PcdExtFpdtBootRecordPadSize|0x20000|
> UINT32|0x0001005F
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdExtFpdtBootRecordPadSize|0x30000|
> UINT32|0x0001005F
> 
>    ## Indicates if ConIn device are connected on demand.<BR><BR>
>    #   TRUE  - ConIn device are not connected during BDS and
> ReadKeyStroke/ReadKeyStrokeEx produced
> diff --git
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/Firm
> warePerformanceDxe.c
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/Firm
> warePerformanceDxe.c
> index 61a7704b37..a6a0cd9e7d 100644
> ---
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/Firm
> warePerformanceDxe.c
> +++
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/Firm
> warePerformanceDxe.c
> @@ -5,7 +5,7 @@
>    for Firmware Basic Boot Performance Record and other boot performance
> records,
>    and install FPDT to ACPI table.
> 
> -  Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -16,6 +16,7 @@
>  #include <Protocol/AcpiTable.h>
>  #include <Protocol/LockBox.h>
>  #include <Protocol/Variable.h>
> +#include <Protocol/VariablePolicy.h>
> 
>  #include <Guid/Acpi.h>
>  #include <Guid/FirmwarePerformance.h>
> @@ -32,6 +33,8 @@
>  #include <Library/HobLib.h>
>  #include <Library/LockBoxLib.h>
>  #include <Library/UefiLib.h>
> +#include <Library/VariablePolicyHelperLib.h>
> +#include <Library/PerformanceLib.h>
> 
>  #define SMM_BOOT_RECORD_COMM_SIZE (OFFSET_OF
> (EFI_SMM_COMMUNICATE_HEADER, Data) +
> sizeof(SMM_BOOT_RECORD_COMMUNICATE))
> 
> @@ -278,11 +281,12 @@ InstallFirmwarePerformanceDataTable (
>    VOID
>    )
>  {
> -  EFI_STATUS                    Status;
> -  EFI_ACPI_TABLE_PROTOCOL       *AcpiTableProtocol;
> -  UINTN                         BootPerformanceDataSize;
> -  FIRMWARE_PERFORMANCE_VARIABLE PerformanceVariable;
> -  UINTN                         Size;
> +  EFI_STATUS                      Status;
> +  EFI_ACPI_TABLE_PROTOCOL         *AcpiTableProtocol;
> +  UINTN                           BootPerformanceDataSize;
> +  FIRMWARE_PERFORMANCE_VARIABLE   PerformanceVariable;
> +  UINTN                           Size;
> +  EDKII_VARIABLE_POLICY_PROTOCOL  *VariablePolicyProtocol;
> 
>    //
>    // Get AcpiTable Protocol.
> @@ -292,6 +296,14 @@ InstallFirmwarePerformanceDataTable (
>      return Status;
>    }
> 
> +  //
> +  // Get VariablePolicy Protocol.
> +  //
> +  Status = gBS->LocateProtocol(&gEdkiiVariablePolicyProtocolGuid, NULL,
> (VOID **)&VariablePolicyProtocol);
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
>    if (mReceivedAcpiBootPerformanceTable != NULL) {
>      mAcpiBootPerformanceTable = mReceivedAcpiBootPerformanceTable;
>      mAcpiBootPerformanceTable->BasicBoot.ResetEnd =
> mBootPerformanceTableTemplate.BasicBoot.ResetEnd;
> @@ -369,6 +381,24 @@ InstallFirmwarePerformanceDataTable (
>          &PerformanceVariable
>          );
> 
> +  //
> +  // Lock the variable which stores the Performance Table pointers.
> +  //
> +  Status = RegisterBasicVariablePolicy (
> +             VariablePolicyProtocol,
> +             &gEfiFirmwarePerformanceGuid,
> +             EFI_FIRMWARE_PERFORMANCE_VARIABLE_NAME,
> +             VARIABLE_POLICY_NO_MIN_SIZE,
> +             VARIABLE_POLICY_NO_MAX_SIZE,
> +             VARIABLE_POLICY_NO_MUST_ATTR,
> +             VARIABLE_POLICY_NO_CANT_ATTR,
> +             VARIABLE_POLICY_TYPE_LOCK_NOW
> +             );
> +  if (EFI_ERROR(Status)) {
> +    DEBUG((EFI_D_ERROR, "[FirmwarePerformanceDxe] Error when lock
> variable %s, Status = %r\n",
> EFI_FIRMWARE_PERFORMANCE_VARIABLE_NAME, Status));
> +    ASSERT_EFI_ERROR(Status);
> +  }
> +
>    //
>    // Publish Firmware Performance Data Table.
>    //
> @@ -501,18 +531,12 @@ FpdtStatusCodeListenerDxe (
>      DEBUG ((EFI_D_INFO, "FPDT: Boot Performance -
> OsLoaderStartImageStart = %ld\n",
> mAcpiBootPerformanceTable->BasicBoot.OsLoaderStartImageStart));
>      DEBUG ((EFI_D_INFO, "FPDT: Boot Performance -
> ExitBootServicesEntry   = 0\n"));
>      DEBUG ((EFI_D_INFO, "FPDT: Boot Performance - ExitBootServicesExit
> = 0\n"));
> -  } else if (Value == (EFI_SOFTWARE_DXE_BS_DRIVER |
> EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT)) {
> -    if (mAcpiBootPerformanceTable == NULL) {
> -      //
> -      // ACPI Firmware Performance Data Table not installed yet, install
it
> now.
> -      //
> -      InstallFirmwarePerformanceDataTable ();
> -    }
>    } else if (Data != NULL && CompareGuid (&Data->Type,
> &gEdkiiFpdtExtendedFirmwarePerformanceGuid)) {
>      //
>      // Get the Boot performance table and then install it to ACPI table.
>      //
>      CopyMem (&mReceivedAcpiBootPerformanceTable, Data + 1,
> Data->Size);
> +    InstallFirmwarePerformanceDataTable ();
>    } else if (Data != NULL && CompareGuid (&Data->Type,
> &gEfiFirmwarePerformanceGuid)) {
>      DEBUG ((DEBUG_ERROR, "FpdtStatusCodeListenerDxe: Performance
> data reported through gEfiFirmwarePerformanceGuid will not be collected by
> FirmwarePerformanceDataTableDxe\n"));
>      Status = EFI_UNSUPPORTED;
> @@ -526,6 +550,32 @@ FpdtStatusCodeListenerDxe (
>    return Status;
>  }
> 
> +/**
> +  Notify function for event EndOfDxe.
> +
> +  This is used to install ACPI Firmware Performance Data Table for basic
> boot records.
> +
> +  @param[in]  Event   The Event that is being processed.
> +  @param[in]  Context The Event Context.
> +
> +**/
> +VOID
> +EFIAPI
> +FpdtEndOfDxeEventNotify (
> +  IN EFI_EVENT        Event,
> +  IN VOID             *Context
> +  )
> +{
> +  //
> +  // When performance is enabled, the FPDT will be installed when
> DxeCorePerformanceLib report the data to FimwarePerformanceDxe.
> +  // This is used to install the FPDT for the basic boot recods when
> performance infrastructure is not enabled.
> +  //
> +  if ((PcdGet8(PcdPerformanceLibraryPropertyMask) &
> PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED) != 0) {
> +    return;
> +  }
> +  ASSERT (mReceivedAcpiBootPerformanceTable == NULL);
> +  InstallFirmwarePerformanceDataTable ();
> +}
> 
>  /**
>    Notify function for event EVT_SIGNAL_EXIT_BOOT_SERVICES. This is used
> to record
> @@ -596,6 +646,7 @@ FirmwarePerformanceDxeEntryPoint (
>    FIRMWARE_SEC_PERFORMANCE *Performance;
>    VOID                     *Registration;
>    UINT64                   OemTableId;
> +  EFI_EVENT                EndOfDxeEvent;
> 
>    CopyMem (
>      mFirmwarePerformanceTableTemplate.Header.OemId,
> @@ -620,6 +671,19 @@ FirmwarePerformanceDxeEntryPoint (
>    Status = mRscHandlerProtocol->Register (FpdtStatusCodeListenerDxe,
> TPL_HIGH_LEVEL);
>    ASSERT_EFI_ERROR (Status);
> 
> +  //
> +  // Register the notify function to install FPDT at EndOfDxe.
> +  //
> +  Status = gBS->CreateEventEx (
> +                  EVT_NOTIFY_SIGNAL,
> +                  TPL_NOTIFY,
> +                  FpdtEndOfDxeEventNotify,
> +                  NULL,
> +                  &gEfiEndOfDxeEventGroupGuid,
> +                  &EndOfDxeEvent
> +                  );
> +  ASSERT_EFI_ERROR (Status);
> +
>    //
>    // Register the notify function to update FPDT on ExitBootServices
Event.
>    //
> diff --git
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/Firm
> warePerformanceDxe.inf
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/Firm
> warePerformanceDxe.inf
> index 1debb0193e..0411a22e66 100644
> ---
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/Firm
> warePerformanceDxe.inf
> +++
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableDxe/Firm
> warePerformanceDxe.inf
> @@ -5,7 +5,7 @@
>  #  for Firmware Basic Boot Performance Record and other boot
> performance records,
>  #  and install FPDT to ACPI table.
>  #
> -#  Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent
>  #
>  ##
> @@ -46,12 +46,14 @@ [LibraryClasses]
>    HobLib
>    LockBoxLib
>    UefiLib
> +  VariablePolicyHelperLib
> 
>  [Protocols]
>    gEfiAcpiTableProtocolGuid                     ## CONSUMES
>    gEfiRscHandlerProtocolGuid                    ## CONSUMES
>    gEfiVariableArchProtocolGuid                  ## CONSUMES
>    gEfiLockBoxProtocolGuid                       ## CONSUMES
> +  gEdkiiVariablePolicyProtocolGuid              ## CONSUMES
> 
>  [Guids]
>    gEfiEventExitBootServicesGuid                 ## CONSUMES
> ## Event
> @@ -63,6 +65,7 @@ [Guids]
>    gEfiFirmwarePerformanceGuid
>    gEdkiiFpdtExtendedFirmwarePerformanceGuid     ##
> SOMETIMES_CONSUMES ## UNDEFINED # StatusCode Data
>    gFirmwarePerformanceS3PointerGuid             ## PRODUCES ##
> UNDEFINED # SaveLockBox
> +  gEfiEndOfDxeEventGroupGuid                    ## CONSUMES ##
> Event
> 
>  [Pcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdProgressCodeOsLoaderLoad
> ## CONSUMES
> @@ -72,6 +75,7 @@ [Pcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemRevision
> ## CONSUMES
>    gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorId        ##
> CONSUMES
>    gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision  ##
> CONSUMES
> +  gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask    ##
> CONSUMES
> 
>  [FeaturePcd]
> 
> gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwarePerformanceDataTableS3Su
> pport   ## CONSUMES
> diff --git
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceCommon.c
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceCommon.c
> index ecadef8711..47db9a2fc0 100644
> ---
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceCommon.c
> +++
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceCommon.c
> @@ -11,7 +11,7 @@
> 
>    FpdtSmiHandler() will receive untrusted input and do basic validation.
> 
> -  Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -29,20 +29,12 @@
>  #include <Library/LockBoxLib.h>
>  #include <Library/PcdLib.h>
>  #include <Library/BaseMemoryLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/SynchronizationLib.h>
>  #include "FirmwarePerformanceCommon.h"
> 
> -SMM_BOOT_PERFORMANCE_TABLE    *mMmBootPerformanceTable =
> NULL;
> 
>  EFI_MM_RSC_HANDLER_PROTOCOL   *mRscHandlerProtocol    = NULL;
>  UINT64                        mSuspendStartTime       = 0;
>  BOOLEAN                       mS3SuspendLockBoxSaved  = FALSE;
> -UINT32                        mBootRecordSize = 0;
> -UINT8                         *mBootRecordBuffer = NULL;
> -
> -SPIN_LOCK                     mMmFpdtLock;
> -BOOLEAN                       mMmramIsOutOfResource = FALSE;
> 
>  /**
>    Report status code listener for MM. This is used to record the
performance
> @@ -84,21 +76,6 @@ FpdtStatusCodeListenerMm (
>      return EFI_UNSUPPORTED;
>    }
> 
> -  //
> -  // Collect one or more Boot records in boot time
> -  //
> -  if (Data != NULL && CompareGuid (&Data->Type,
> &gEdkiiFpdtExtendedFirmwarePerformanceGuid)) {
> -    AcquireSpinLock (&mMmFpdtLock);
> -    //
> -    // Get the boot performance data.
> -    //
> -    CopyMem (&mMmBootPerformanceTable, Data + 1, Data->Size);
> -    mBootRecordBuffer = ((UINT8 *) (mMmBootPerformanceTable)) + sizeof
> (SMM_BOOT_PERFORMANCE_TABLE);
> -
> -    ReleaseSpinLock (&mMmFpdtLock);
> -    return EFI_SUCCESS;
> -  }
> -
>    if (Data != NULL && CompareGuid (&Data->Type,
> &gEfiFirmwarePerformanceGuid)) {
>      DEBUG ((DEBUG_ERROR, "FpdtStatusCodeListenerMm: Performance
> data reported through gEfiFirmwarePerformanceGuid will not be collected by
> FirmwarePerformanceDataTableMm\n"));
>      return EFI_UNSUPPORTED;
> @@ -153,118 +130,6 @@ FpdtStatusCodeListenerMm (
>    return EFI_SUCCESS;
>  }
> 
> -/**
> -  Communication service SMI Handler entry.
> -
> -  This SMI handler provides services for report MM boot records.
> -
> -  Caution: This function may receive untrusted input.
> -  Communicate buffer and buffer size are external input, so this function
will
> do basic validation.
> -
> -  @param[in]     DispatchHandle  The unique handle assigned to this
> handler by SmiHandlerRegister().
> -  @param[in]     RegisterContext Points to an optional handler context
> which was specified when the
> -                                 handler was registered.
> -  @param[in, out] CommBuffer     A pointer to a collection of data in
> memory that will
> -                                 be conveyed from a non-MM
> environment into an MM environment.
> -  @param[in, out] CommBufferSize The size of the CommBuffer.
> -
> -  @retval EFI_SUCCESS                         The interrupt was
> handled and quiesced. No other handlers
> -                                              should still be
> called.
> -  @retval EFI_WARN_INTERRUPT_SOURCE_QUIESCED  The interrupt has
> been quiesced but other handlers should
> -                                              still be called.
> -  @retval EFI_WARN_INTERRUPT_SOURCE_PENDING   The interrupt is
> still pending and other handlers should still
> -                                              be called.
> -  @retval EFI_INTERRUPT_PENDING               The interrupt could
> not be quiesced.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -FpdtSmiHandler (
> -  IN     EFI_HANDLE                   DispatchHandle,
> -  IN     CONST VOID                   *RegisterContext,
> -  IN OUT VOID                         *CommBuffer,
> -  IN OUT UINTN                        *CommBufferSize
> -  )
> -{
> -  EFI_STATUS                   Status;
> -  SMM_BOOT_RECORD_COMMUNICATE  *SmmCommData;
> -  UINTN                        BootRecordOffset;
> -  UINTN                        BootRecordSize;
> -  VOID                         *BootRecordData;
> -  UINTN                        TempCommBufferSize;
> -
> -  //
> -  // If input is invalid, stop processing this SMI
> -  //
> -  if (CommBuffer == NULL || CommBufferSize == NULL) {
> -    return EFI_SUCCESS;
> -  }
> -
> -  TempCommBufferSize = *CommBufferSize;
> -
> -  if(TempCommBufferSize < sizeof (SMM_BOOT_RECORD_COMMUNICATE))
> {
> -    return EFI_SUCCESS;
> -  }
> -
> -  if (!IsBufferOutsideMmValid ((UINTN)CommBuffer, TempCommBufferSize))
> {
> -    DEBUG ((DEBUG_ERROR, "FpdtSmiHandler: MM communication data
> buffer in MMRAM or overflow!\n"));
> -    return EFI_SUCCESS;
> -  }
> -
> -  SmmCommData = (SMM_BOOT_RECORD_COMMUNICATE*)CommBuffer;
> -
> -  Status = EFI_SUCCESS;
> -
> -  switch (SmmCommData->Function) {
> -    case SMM_FPDT_FUNCTION_GET_BOOT_RECORD_SIZE :
> -      if (mMmBootPerformanceTable != NULL) {
> -        mBootRecordSize = mMmBootPerformanceTable->Header.Length -
> sizeof (SMM_BOOT_PERFORMANCE_TABLE);
> -      }
> -      SmmCommData->BootRecordSize = mBootRecordSize;
> -      break;
> -
> -    case SMM_FPDT_FUNCTION_GET_BOOT_RECORD_DATA :
> -      Status = EFI_UNSUPPORTED;
> -      break;
> -
> -    case SMM_FPDT_FUNCTION_GET_BOOT_RECORD_DATA_BY_OFFSET :
> -      BootRecordOffset = SmmCommData->BootRecordOffset;
> -      BootRecordData   = SmmCommData->BootRecordData;
> -      BootRecordSize   = SmmCommData->BootRecordSize;
> -      if (BootRecordData == NULL || BootRecordOffset >=
> mBootRecordSize) {
> -        Status = EFI_INVALID_PARAMETER;
> -        break;
> -      }
> -
> -      //
> -      // Sanity check
> -      //
> -      if (BootRecordSize > mBootRecordSize - BootRecordOffset) {
> -        BootRecordSize = mBootRecordSize - BootRecordOffset;
> -      }
> -      SmmCommData->BootRecordSize = BootRecordSize;
> -      if (!IsBufferOutsideMmValid ((UINTN)BootRecordData,
> BootRecordSize)) {
> -        DEBUG ((DEBUG_ERROR, "FpdtSmiHandler: MM Data buffer in
> MMRAM or overflow!\n"));
> -        Status = EFI_ACCESS_DENIED;
> -        break;
> -      }
> -
> -      CopyMem (
> -       (UINT8*)BootRecordData,
> -       mBootRecordBuffer + BootRecordOffset,
> -       BootRecordSize
> -       );
> -      break;
> -
> -    default:
> -      Status = EFI_UNSUPPORTED;
> -  }
> -
> -  SmmCommData->ReturnStatus = Status;
> -
> -  return EFI_SUCCESS;
> -}
> -
>  /**
>    The module Entry Point of the Firmware Performance Data Table MM
> driver.
> 
> @@ -278,12 +143,6 @@ FirmwarePerformanceCommonEntryPoint (
>    )
>  {
>    EFI_STATUS                Status;
> -  EFI_HANDLE                Handle;
> -
> -  //
> -  // Initialize spin lock
> -  //
> -  InitializeSpinLock (&mMmFpdtLock);
> 
>    //
>    // Get MM Report Status Code Handler Protocol.
> @@ -301,12 +160,5 @@ FirmwarePerformanceCommonEntryPoint (
>    Status = mRscHandlerProtocol->Register (FpdtStatusCodeListenerMm);
>    ASSERT_EFI_ERROR (Status);
> 
> -  //
> -  // Register SMI handler.
> -  //
> -  Handle = NULL;
> -  Status = gMmst->MmiHandlerRegister (FpdtSmiHandler,
> &gEfiFirmwarePerformanceGuid, &Handle);
> -  ASSERT_EFI_ERROR (Status);
> -
>    return Status;
>  }
> diff --git
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceCommon.h
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceCommon.h
> index 0fbdac02de..0640c48db7 100644
> ---
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceCommon.h
> +++
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceCommon.h
> @@ -11,7 +11,7 @@
> 
>    FpdtSmiHandler() will receive untrusted input and do basic validation.
> 
> -  Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
>    Copyright (c), Microsoft Corporation.
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> @@ -20,21 +20,6 @@
>  #ifndef _FW_PERF_COMMON_H_
>  #define _FW_PERF_COMMON_H_
> 
> -/**
> -  This function is an abstraction layer for implementation specific Mm
buffer
> validation routine.
> -
> -  @param Buffer  The buffer start address to be checked.
> -  @param Length  The buffer length to be checked.
> -
> -  @retval TRUE  This buffer is valid per processor architecture and not
> overlap with SMRAM.
> -  @retval FALSE This buffer is not valid per processor architecture or
overlap
> with SMRAM.
> -**/
> -BOOLEAN
> -IsBufferOutsideMmValid (
> -  IN EFI_PHYSICAL_ADDRESS  Buffer,
> -  IN UINT64                Length
> -  );
> -
>  /**
>    The module Entry Point of the Firmware Performance Data Table MM
> driver.
> 
> diff --git
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceSmm.inf
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceSmm.inf
> index b7194bd899..a4da0ba8b2 100644
> ---
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceSmm.inf
> +++
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceSmm.inf
> @@ -4,7 +4,7 @@
>  #  This module registers report status code listener to collect
performance
> data
>  #  for SMM boot performance records and S3 Suspend Performance Record.
>  #
> -#  Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent
>  #
>  ##
> @@ -52,10 +52,8 @@ [Protocols]
> 
>  [Guids]
>    ## SOMETIMES_PRODUCES   ## UNDEFINED # SaveLockBox
> -  ## PRODUCES             ## UNDEFINED # SmiHandlerRegister
>    ## SOMETIMES_CONSUMES   ## UNDEFINED # StatusCode Data
>    gEfiFirmwarePerformanceGuid
> -  gEdkiiFpdtExtendedFirmwarePerformanceGuid  ##
> SOMETIMES_PRODUCES ## UNDEFINED # StatusCode Data
> 
>  [Pcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdProgressCodeS3SuspendStart  ##
> CONSUMES
> diff --git
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceStandaloneMm.c
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceStandaloneMm.c
> index d7da61c98c..be52d8ce90 100644
> ---
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceStandaloneMm.c
> +++
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceStandaloneMm.c
> @@ -11,7 +11,7 @@
> 
>    FpdtSmiHandler() will receive untrusted input and do basic validation.
> 
> -  Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
>    Copyright (c), Microsoft Corporation.
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> @@ -19,27 +19,8 @@
> 
>  #include <PiMm.h>
> 
> -#include <Library/StandaloneMmMemLib.h>
>  #include "FirmwarePerformanceCommon.h"
> 
> -/**
> -  This function is an abstraction layer for implementation specific Mm
buffer
> validation routine.
> -
> -  @param Buffer  The buffer start address to be checked.
> -  @param Length  The buffer length to be checked.
> -
> -  @retval TRUE  This buffer is valid per processor architecture and not
> overlap with SMRAM.
> -  @retval FALSE This buffer is not valid per processor architecture or
overlap
> with SMRAM.
> -**/
> -BOOLEAN
> -IsBufferOutsideMmValid (
> -  IN EFI_PHYSICAL_ADDRESS  Buffer,
> -  IN UINT64                Length
> -  )
> -{
> -  return MmIsBufferOutsideMmValid (Buffer, Length);
> -}
> -
>  /**
>    The module Entry Point of the Firmware Performance Data Table MM
> driver.
> 
> diff --git
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceStandaloneMm.inf
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceStandaloneMm.inf
> index e6aad88be0..fabe30b071 100644
> ---
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceStandaloneMm.inf
> +++
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceStandaloneMm.inf
> @@ -4,7 +4,7 @@
>  #  This module registers report status code listener to collect
performance
> data
>  #  for SMM boot performance records and S3 Suspend Performance Record.
>  #
> -#  Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
>  #  Copyright (c) Microsoft Corporation.
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent
>  #
> @@ -53,10 +53,8 @@ [Protocols]
> 
>  [Guids]
>    ## SOMETIMES_PRODUCES   ## UNDEFINED # SaveLockBox
> -  ## PRODUCES             ## UNDEFINED # SmiHandlerRegister
>    ## SOMETIMES_CONSUMES   ## UNDEFINED # StatusCode Data
>    gEfiFirmwarePerformanceGuid
> -  gEdkiiFpdtExtendedFirmwarePerformanceGuid  ##
> SOMETIMES_PRODUCES ## UNDEFINED # StatusCode Data
> 
>  [Pcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdProgressCodeS3SuspendStart  ##
> CONSUMES
> diff --git
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceTraditional.c
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceTraditional.c
> index 43c050d6b5..5bd38b0ef3 100644
> ---
> a/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceTraditional.c
> +++
> b/MdeModulePkg/Universal/Acpi/FirmwarePerformanceDataTableSmm/Firm
> warePerformanceTraditional.c
> @@ -11,7 +11,7 @@
> 
>    FpdtSmiHandler() will receive untrusted input and do basic validation.
> 
> -  Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2011 - 2021, Intel Corporation. All rights reserved.<BR>
>    Copyright (c), Microsoft Corporation.
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> @@ -19,27 +19,8 @@
> 
>  #include <PiSmm.h>
> 
> -#include <Library/SmmMemLib.h>
>  #include "FirmwarePerformanceCommon.h"
> 
> -/**
> -  This function is an abstraction layer for implementation specific Mm
buffer
> validation routine.
> -
> -  @param Buffer  The buffer start address to be checked.
> -  @param Length  The buffer length to be checked.
> -
> -  @retval TRUE  This buffer is valid per processor architecture and not
> overlap with SMRAM.
> -  @retval FALSE This buffer is not valid per processor architecture or
overlap
> with SMRAM.
> -**/
> -BOOLEAN
> -IsBufferOutsideMmValid (
> -  IN EFI_PHYSICAL_ADDRESS  Buffer,
> -  IN UINT64                Length
> -  )
> -{
> -  return SmmIsBufferOutsideSmmValid (Buffer, Length);
> -}
> -
>  /**
>    The module Entry Point of the Firmware Performance Data Table MM
> driver.
> 
> --
> 2.18.0.windows.1
> 
> 
> 
> 
> 





-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#83665): https://edk2.groups.io/g/devel/message/83665
Mute This Topic: https://groups.io/mt/86997466/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