回复: [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