From nobody Sun May 5 09:12:48 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1529393161055579.0151557421705; Tue, 19 Jun 2018 00:26:01 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 497B0211299A0; Tue, 19 Jun 2018 00:26:00 -0700 (PDT) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D116721129998 for ; Tue, 19 Jun 2018 00:25:58 -0700 (PDT) Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jun 2018 00:25:57 -0700 Received: from shwdeopenpsi114.ccr.corp.intel.com ([10.239.157.135]) by orsmga006.jf.intel.com with ESMTP; 19 Jun 2018 00:25:56 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.65; helo=mga03.intel.com; envelope-from=dandan.bi@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,242,1526367600"; d="scan'208";a="51022206" From: Dandan Bi To: edk2-devel@lists.01.org Date: Tue, 19 Jun 2018 15:23:57 +0800 Message-Id: <20180619072405.142872-2-dandan.bi@intel.com> X-Mailer: git-send-email 2.14.3.windows.1 In-Reply-To: <20180619072405.142872-1-dandan.bi@intel.com> References: <20180619072405.142872-1-dandan.bi@intel.com> Subject: [edk2] [patch 1/9] MdeModulePkg: Add PERFORMANCE_MEASUREMENT_PROTOCOL X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Star Zeng , Liming Gao MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add PerformanceMeasurement protocol to log performance info. Cc: Liming Gao Cc: Star Zeng Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi --- MdeModulePkg/Include/Guid/PerformanceMeasurement.h | 91 ++++++++++++++++++= ++++ MdeModulePkg/MdeModulePkg.dec | 3 + 2 files changed, 94 insertions(+) create mode 100644 MdeModulePkg/Include/Guid/PerformanceMeasurement.h diff --git a/MdeModulePkg/Include/Guid/PerformanceMeasurement.h b/MdeModule= Pkg/Include/Guid/PerformanceMeasurement.h new file mode 100644 index 00000000000..f2955c73589 --- /dev/null +++ b/MdeModulePkg/Include/Guid/PerformanceMeasurement.h @@ -0,0 +1,91 @@ +/** @file + +Copyright (c) 2017, Microsoft Corporation +Copyright (c) 2018, Intel Corporation. All rights reserved.
+ +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notic= e, +this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS= " AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPL= IED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DIS= CLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY D= IRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUD= ING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF U= SE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO= RY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLI= GENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Performance measurement protocol, allows logging performance data. + +**/ + +#ifndef _PERFORMANCE_MEASUREMENT_H_ +#define _PERFORMANCE_MEASUREMENT_H_ + +// +// GUID for Performance measurement Protocol +// +#define PERFORMANCE_MEASUREMENT_PROTOCOL_GUID \ + { 0xc85d06be, 0x5f75, 0x48ce, {0xa8, 0x0f, 0x12, 0x36, 0xba, 0x3b, 0x87,= 0xb1 } } + +#define SMM_PERFORMANCE_MEASUREMENT_PROTOCOL_GUID \ + { 0xd56b6d73, 0x1a7b, 0x4015, {0x9b, 0xb4, 0x7b, 0x07, 0x17, 0x29, 0xed,= 0x24 } } + +typedef struct _EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL EDKII_PERFORMANCE_M= EASUREMENT_PROTOCOL; + +typedef enum { + PerfStartEntry, // used in StartPerformanceMeasur= ement()/StartPerformanceMeasurementEx() + // (map to PERF_START/PERF_START_= EX) + PerfEndEntry, // used in EndPerformanceMeasurem= ent()/EndPerformanceMeasurementEx() + // (map to PERF_END/PERF_END_EX) + PerfEntry // used in LogPerformanceMeasurem= ent() + // (map to other Perf macros exce= pt above 4 macros) +} PERF_MEASUREMENT_ATTRIBUTE; + +/** + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID. + @param Guid - Pointer to a GUID. + @param String - Pointer to a string describing the measuremen= t. + @param TimeStamp - 64-bit time stamp. + @param Address - Pointer to a location in memory relevant to t= he measurement. + @param Identifier - Performance identifier describing the type of= measurement. + @param Attribute - The attribute of the measurement. According t= o attribute can create a start + record for PERF_START/PERF_START_EX, or a end= record for PERF_END/PERF_END_EX, + or a general record for other Perf macros. + + @retval EFI_SUCCESS - Successfully created performance record. + @retval EFI_OUT_OF_RESOURCES - Ran out of space to store the records. + @retval EFI_INVALID_PARAMETER - Invalid parameter passed to function - N= ULL + pointer or invalid PerfId. + +**/ +typedef +EFI_STATUS +(EFIAPI *CREATE_PERFORMANCE_MEASUREMENT)( + IN CONST VOID *CallerIdentifier, OPTIONAL + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 TimeStamp, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT32 Identifier, + IN PERF_MEASUREMENT_ATTRIBUTE Attribute + ); + +struct _EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL { + CREATE_PERFORMANCE_MEASUREMENT CreatePerformanceMeasurement; +}; + +extern EFI_GUID gEdkiiPerformanceMeasurementProtocolGuid; +extern EFI_GUID gEdkiiSmmPerformanceMeasurementProtocolGuid; + +#endif // _PERFORMANCE_MEASUREMENT_H_ diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 3802b6e0b86..108accc2c29 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -258,10 +258,13 @@ # Include/Guid/Performance.h gPerformanceProtocolGuid =3D { 0x76B6BDFA, 0x2ACD, 0x4462, { 0x9E,= 0x3F, 0xCB, 0x58, 0xC9, 0x69, 0xD9, 0x37 } } gSmmPerformanceProtocolGuid =3D { 0xf866226a, 0xeaa5, 0x4f5a, { 0xa9,= 0xa, 0x6c, 0xfb, 0xa5, 0x7c, 0x58, 0x8e } } gPerformanceExProtocolGuid =3D { 0x1ea81bec, 0xf01a, 0x4d98, { 0xa2,= 0x1, 0x4a, 0x61, 0xce, 0x2f, 0xc0, 0x22 } } gSmmPerformanceExProtocolGuid =3D { 0x931fc048, 0xc71d, 0x4455, { 0x89,= 0x30, 0x47, 0x6, 0x30, 0xe3, 0xe, 0xe5 } } + # Include/Guid/PerformanceMeasurement.h + gEdkiiPerformanceMeasurementProtocolGuid =3D { 0xc85d06be, 0x5f75, = 0x48ce, { 0xa8, 0x0f, 0x12, 0x36, 0xba, 0x3b, 0x87, 0xb1 } } + gEdkiiSmmPerformanceMeasurementProtocolGuid =3D { 0xd56b6d73, 0x1a7b, = 0x4015, { 0x9b, 0xb4, 0x7b, 0x07, 0x17, 0x29, 0xed, 0x24 } } =20 ## Guid is defined for CRC32 encapsulation scheme. # Include/Guid/Crc32GuidedSectionExtraction.h gEfiCrc32GuidedSectionExtractionGuid =3D { 0xFC1BCDB0, 0x7D31, 0x49aa, {= 0x93, 0x6A, 0xA4, 0x60, 0x0D, 0x9D, 0xD0, 0x83 } } =20 --=20 2.14.3.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Sun May 5 09:12:48 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1529393173446622.617620078646; Tue, 19 Jun 2018 00:26:13 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 8886B211299A8; Tue, 19 Jun 2018 00:26:12 -0700 (PDT) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 574AF210D7F47 for ; Tue, 19 Jun 2018 00:26:10 -0700 (PDT) Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jun 2018 00:26:09 -0700 Received: from shwdeopenpsi114.ccr.corp.intel.com ([10.239.157.135]) by orsmga006.jf.intel.com with ESMTP; 19 Jun 2018 00:26:06 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.88; helo=mga01.intel.com; envelope-from=dandan.bi@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,242,1526367600"; d="scan'208";a="51022232" From: Dandan Bi To: edk2-devel@lists.01.org Date: Tue, 19 Jun 2018 15:23:58 +0800 Message-Id: <20180619072405.142872-3-dandan.bi@intel.com> X-Mailer: git-send-email 2.14.3.windows.1 In-Reply-To: <20180619072405.142872-1-dandan.bi@intel.com> References: <20180619072405.142872-1-dandan.bi@intel.com> Subject: [edk2] [patch 2/9] MdeModulePkg: Update Performance instances to use new protocol X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Star Zeng , Liming Gao MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Update Update Performance instances in MdeModulePkg to use new PerformanceMeasurement protocol. Cc: Liming Gao Cc: Star Zeng Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi --- .../DxeCorePerformanceLib/DxeCorePerformanceLib.c | 325 +++++------------= --- .../DxeCorePerformanceLib.inf | 6 +- .../DxeCorePerformanceLibInternal.h | 216 ++------------ .../Library/DxePerformanceLib/DxePerformanceLib.c | 125 +++----- .../DxePerformanceLib/DxePerformanceLib.inf | 5 +- .../SmmCorePerformanceLib/SmmCorePerformanceLib.c | 327 +++++------------= ---- .../SmmCorePerformanceLib.inf | 7 +- .../SmmCorePerformanceLibInternal.h | 215 ++------------ .../Library/SmmPerformanceLib/SmmPerformanceLib.c | 130 +++----- .../SmmPerformanceLib/SmmPerformanceLib.inf | 5 +- 10 files changed, 283 insertions(+), 1078 deletions(-) diff --git a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceL= ib.c b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c index 68b29ac5a9e..79820605184 100644 --- a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c +++ b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c @@ -80,25 +80,14 @@ UINT8 *mBootRecordBuffer =3D NULL; BOOLEAN mLockInsertRecord =3D FALSE; =20 EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *mDevicePathToText =3D NULL; =20 // -// Interfaces for Performance Protocol. +// Interfaces for PerformanceMeasurement Protocol. // -PERFORMANCE_PROTOCOL mPerformanceInterface =3D { - StartGauge, - EndGauge, - GetGauge - }; - -// -// Interfaces for PerformanceEx Protocol. -// -PERFORMANCE_EX_PROTOCOL mPerformanceExInterface =3D { - StartGaugeEx, - EndGaugeEx, - GetGaugeEx +EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL mPerformanceMeasurementInterface = =3D { + CreatePerformanceMeasurement, }; =20 PERFORMANCE_PROPERTY mPerformanceProperty; =20 /** @@ -797,22 +786,15 @@ InsertFpdtMeasurement ( =20 StringPtr =3D NULL; UseModuleName =3D FALSE; ZeroMem (ModuleName, sizeof (ModuleName)); =20 - if (mLockInsertRecord) { - return EFI_UNSUPPORTED; - } - - mLockInsertRecord =3D TRUE; - // // Get record info (type, size, ProgressID and Module Guid). // Status =3D GetFpdtRecordInfo (IsStart, Handle, Token, Module, &RecordInf= o, &UseModuleName); if (EFI_ERROR (Status)) { - mLockInsertRecord =3D FALSE; return Status; } =20 // // If PERF_START()/PERF_END() have specified the ProgressID,it has high = priority. @@ -822,11 +804,10 @@ InsertFpdtMeasurement ( // If it is start pref: the lower 4 bits of the ID should be 0. // If it is end pref: the lower 4 bits of the ID should not be 0. // If input ID doesn't follow the rule, we will adjust it. // if ((Identifier !=3D 0) && (IsKnownID (Identifier)) && (!IsKnownTokens (= Token))) { - mLockInsertRecord =3D FALSE; return EFI_UNSUPPORTED; } else if ((Identifier !=3D 0) && (!IsKnownID (Identifier)) && (!IsKnown= Tokens (Token))) { if (IsStart && ((Identifier & 0x000F) !=3D 0)) { Identifier &=3D 0xFFF0; } else if ((!IsStart) && ((Identifier & 0x000F) =3D=3D 0)) { @@ -842,11 +823,10 @@ InsertFpdtMeasurement ( if (mBootRecordSize + RecordInfo.RecordSize > mBootRecordMaxSize) { if (!mLackSpaceIsReported) { DEBUG ((DEBUG_INFO, "DxeCorePerformanceLib: No enough space to sav= e boot records\n")); mLackSpaceIsReported =3D TRUE; } - mLockInsertRecord =3D FALSE; return EFI_OUT_OF_RESOURCES; } else { // // Save boot record into BootPerformance table // @@ -864,11 +844,10 @@ InsertFpdtMeasurement ( mPerformanceLength + RecordInfo.RecordSize += FIRMWARE_RECORD_BUFFER, mPerformancePointer ); =20 if (mPerformancePointer =3D=3D NULL) { - mLockInsertRecord =3D FALSE; return EFI_OUT_OF_RESOURCES; } mMaxPerformanceLength =3D mPerformanceLength + RecordInfo.RecordSize= + FIRMWARE_RECORD_BUFFER; } // @@ -961,15 +940,13 @@ InsertFpdtMeasurement ( =20 default: // // Record is not supported in current DXE phase, return EFI_ABORTED // - mLockInsertRecord =3D FALSE; return EFI_UNSUPPORTED; } =20 - mLockInsertRecord =3D FALSE; return EFI_SUCCESS; } =20 /** Dumps all the PEI performance. @@ -1061,223 +1038,10 @@ ReportFpdtRecordBuffer ( // mFpdtBufferIsReported =3D TRUE; } } =20 -/** - Adds a record at the end of the performance measurement log - that records the start time of a performance measurement. - - Adds a record to the end of the performance measurement log - that contains the Handle, Token, Module and Identifier. - The end time of the new record must be set to zero. - If TimeStamp is not zero, then TimeStamp is used to fill in the start ti= me in the record. - If TimeStamp is zero, the start time in the record is filled in with the= value - read from the current time stamp. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, th= e created record - is same as the one created by StartGauge= of PERFORMANCE_PROTOCOL. - - @retval EFI_SUCCESS The data was read correctly from the dev= ice. - @retval EFI_OUT_OF_RESOURCES There are not enough resources to record= the measurement. - -**/ -EFI_STATUS -EFIAPI -StartGaugeEx ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp, - IN UINT32 Identifier - ) -{ - return InsertFpdtMeasurement (TRUE, Handle, Token, Module, TimeStamp, Id= entifier); -} - -/** - Searches the performance measurement log from the beginning of the log - for the first matching record that contains a zero end time and fills in= a valid end time. - - Searches the performance measurement log from the beginning of the log - for the first record that matches Handle, Token, Module and Identifier a= nd has an end time value of zero. - If the record can not be found then return EFI_NOT_FOUND. - If the record is found and TimeStamp is not zero, - then the end time in the record is filled in with the value specified by= TimeStamp. - If the record is found and TimeStamp is zero, then the end time in the m= atching record - is filled in with the current time stamp value. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, th= e found record - is same as the one found by EndGauge of = PERFORMANCE_PROTOCOL. - - @retval EFI_SUCCESS The end of the measurement was recorded. - @retval EFI_NOT_FOUND The specified measurement record could n= ot be found. - -**/ -EFI_STATUS -EFIAPI -EndGaugeEx ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp, - IN UINT32 Identifier - ) -{ - return InsertFpdtMeasurement (FALSE, Handle, Token, Module, TimeStamp, I= dentifier); -} - -/** - Retrieves a previously logged performance measurement. - It can also retrieve the log created by StartGauge and EndGauge of PERFO= RMANCE_PROTOCOL, - and then assign the Identifier with 0. - - !!! Not support!!! - - Retrieves the performance log entry from the performance log specified b= y LogEntryKey. - If it stands for a valid entry, then EFI_SUCCESS is returned and - GaugeDataEntryEx stores the pointer to that entry. - - @param LogEntryKey The key for the previous performance mea= surement log entry. - If 0, then the first performance measure= ment log entry is retrieved. - @param GaugeDataEntryEx The indirect pointer to the extended gau= ge data entry specified by LogEntryKey - if the retrieval is successful. - - @retval EFI_SUCCESS The GuageDataEntryEx is successfully fou= nd based on LogEntryKey. - @retval EFI_NOT_FOUND The LogEntryKey is the last entry (equal= s to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (gr= eater than the total entry number). - @retval EFI_INVALIDE_PARAMETER GaugeDataEntryEx is NULL. - -**/ -EFI_STATUS -EFIAPI -GetGaugeEx ( - IN UINTN LogEntryKey, - OUT GAUGE_DATA_ENTRY_EX **GaugeDataEntryEx - ) -{ - return EFI_UNSUPPORTED; -} - -/** - Adds a record at the end of the performance measurement log - that records the start time of a performance measurement. - - Adds a record to the end of the performance measurement log - that contains the Handle, Token, and Module. - The end time of the new record must be set to zero. - If TimeStamp is not zero, then TimeStamp is used to fill in the start ti= me in the record. - If TimeStamp is zero, the start time in the record is filled in with the= value - read from the current time stamp. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - - @retval EFI_SUCCESS The data was read correctly from the dev= ice. - @retval EFI_OUT_OF_RESOURCES There are not enough resources to record= the measurement. - -**/ -EFI_STATUS -EFIAPI -StartGauge ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp - ) -{ - return StartGaugeEx (Handle, Token, Module, TimeStamp, 0); -} - -/** - Searches the performance measurement log from the beginning of the log - for the first matching record that contains a zero end time and fills in= a valid end time. - - Searches the performance measurement log from the beginning of the log - for the first record that matches Handle, Token, and Module and has an e= nd time value of zero. - If the record can not be found then return EFI_NOT_FOUND. - If the record is found and TimeStamp is not zero, - then the end time in the record is filled in with the value specified by= TimeStamp. - If the record is found and TimeStamp is zero, then the end time in the m= atching record - is filled in with the current time stamp value. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - - @retval EFI_SUCCESS The end of the measurement was recorded. - @retval EFI_NOT_FOUND The specified measurement record could n= ot be found. - -**/ -EFI_STATUS -EFIAPI -EndGauge ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp - ) -{ - return EndGaugeEx (Handle, Token, Module, TimeStamp, 0); -} - -/** - Retrieves a previously logged performance measurement. - It can also retrieve the log created by StartGaugeEx and EndGaugeEx of P= ERFORMANCE_EX_PROTOCOL, - and then eliminate the Identifier. - - !!! Not support!!! - - Retrieves the performance log entry from the performance log specified b= y LogEntryKey. - If it stands for a valid entry, then EFI_SUCCESS is returned and - GaugeDataEntry stores the pointer to that entry. - - @param LogEntryKey The key for the previous performance mea= surement log entry. - If 0, then the first performance measure= ment log entry is retrieved. - @param GaugeDataEntry The indirect pointer to the gauge data e= ntry specified by LogEntryKey - if the retrieval is successful. - - @retval EFI_SUCCESS The GuageDataEntry is successfully found= based on LogEntryKey. - @retval EFI_NOT_FOUND The LogEntryKey is the last entry (equal= s to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (gr= eater than the total entry number). - @retval EFI_INVALIDE_PARAMETER GaugeDataEntry is NULL. - -**/ -EFI_STATUS -EFIAPI -GetGauge ( - IN UINTN LogEntryKey, - OUT GAUGE_DATA_ENTRY **GaugeDataEntry - ) -{ - return EFI_UNSUPPORTED; -} - - /** The constructor function initializes Performance infrastructure for DXE = phase. =20 The constructor function publishes Performance and PerformanceEx protoco= l, allocates memory to log DXE performance and merges PEI performance data to DXE performance log. @@ -1317,14 +1081,12 @@ DxeCorePerformanceLibConstructor ( // Install the protocol interfaces for DXE performance library instance. // Handle =3D NULL; Status =3D gBS->InstallMultipleProtocolInterfaces ( &Handle, - &gPerformanceProtocolGuid, - &mPerformanceInterface, - &gPerformanceExProtocolGuid, - &mPerformanceExInterface, + &gEdkiiPerformanceMeasurementProtocolGuid, + &mPerformanceMeasurementInterface, NULL ); ASSERT_EFI_ERROR (Status); =20 // @@ -1357,10 +1119,59 @@ DxeCorePerformanceLibConstructor ( } =20 return EFI_SUCCESS; } =20 +/** + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID. + @param Guid - Pointer to a GUID. + @param String - Pointer to a string describing the measuremen= t. + @param TimeStamp - 64-bit time stamp. + @param Address - Pointer to a location in memory relevant to t= he measurement. + @param Identifier - Performance identifier describing the type of= measurement. + @param Attribute - The attribute of the measurement. According t= o attribute can create a start + record for PERF_START/PERF_START_EX, or a end= record for PERF_END/PERF_END_EX, + or a general record for other Perf macros. + + @retval EFI_SUCCESS - Successfully created performance record. + @retval EFI_OUT_OF_RESOURCES - Ran out of space to store the records. + @retval EFI_INVALID_PARAMETER - Invalid parameter passed to function - N= ULL + pointer or invalid PerfId. +**/ +EFI_STATUS +EFIAPI +CreatePerformanceMeasurement ( + IN CONST VOID *CallerIdentifier, + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 TimeStamp, + IN UINT64 Address, OPTIONAL + IN UINT32 Identifier, + IN PERF_MEASUREMENT_ATTRIBUTE Attribute + ) +{ + EFI_STATUS Status; + + Status =3D EFI_SUCCESS; + + if (mLockInsertRecord) { + return EFI_INVALID_PARAMETER; + } + mLockInsertRecord =3D TRUE; + + if (Attribute =3D=3D PerfStartEntry) { + Status =3D InsertFpdtMeasurement (TRUE, CallerIdentifier, String, Stri= ng, TimeStamp, Identifier); + } else if (Attribute =3D=3D PerfEndEntry) { + Status =3D InsertFpdtMeasurement (FALSE, CallerIdentifier, String, Str= ing, TimeStamp, Identifier); + } + mLockInsertRecord =3D FALSE; + + return Status; +} + /** Adds a record at the end of the performance measurement log that records the start time of a performance measurement. =20 Adds a record to the end of the performance measurement log @@ -1392,11 +1203,21 @@ StartPerformanceMeasurementEx ( IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp, IN UINT32 Identifier ) { - return InsertFpdtMeasurement (TRUE, Handle, Token, Module, TimeStamp, Id= entifier); + CONST CHAR8 *String; + + if (Token !=3D NULL) { + String =3D Token; + } else if (Module !=3D NULL) { + String =3D Module; + } else { + String =3D NULL; + } + + return (RETURN_STATUS)CreatePerformanceMeasurement (Handle, NULL, String= , TimeStamp, 0, Identifier, PerfStartEntry); } =20 /** Searches the performance measurement log from the beginning of the log for the first matching record that contains a zero end time and fills in= a valid end time. @@ -1431,11 +1252,21 @@ EndPerformanceMeasurementEx ( IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp, IN UINT32 Identifier ) { - return InsertFpdtMeasurement (FALSE, Handle, Token, Module, TimeStamp, I= dentifier); + CONST CHAR8 *String; + + if (Token !=3D NULL) { + String =3D Token; + } else if (Module !=3D NULL) { + String =3D Module; + } else { + String =3D NULL; + } + + return (RETURN_STATUS)CreatePerformanceMeasurement (Handle, NULL, String= , TimeStamp, 0, Identifier, PerfEndEntry); } =20 /** Attempts to retrieve a performance measurement log entry from the perfor= mance measurement log. It can also retrieve the log created by StartPerformanceMeasurement and = EndPerformanceMeasurement, @@ -1525,11 +1356,11 @@ StartPerformanceMeasurement ( IN CONST CHAR8 *Token, OPTIONAL IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp ) { - return InsertFpdtMeasurement (TRUE, Handle, Token, Module, TimeStamp, 0); + return StartPerformanceMeasurementEx (Handle, Token, Module, TimeStamp, = 0); } =20 /** Searches the performance measurement log from the beginning of the log for the first matching record that contains a zero end time and fills in= a valid end time. @@ -1561,11 +1392,11 @@ EndPerformanceMeasurement ( IN CONST CHAR8 *Token, OPTIONAL IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp ) { - return InsertFpdtMeasurement (FALSE, Handle, Token, Module, TimeStamp, 0= ); + return EndPerformanceMeasurementEx (Handle, Token, Module, TimeStamp, 0); } =20 /** Attempts to retrieve a performance measurement log entry from the perfor= mance measurement log. It can also retrieve the log created by StartPerformanceMeasurementEx an= d EndPerformanceMeasurementEx, diff --git a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceL= ib.inf b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.i= nf index e752a93d837..68cd76da5b3 100644 --- a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf +++ b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf @@ -65,22 +65,18 @@ [Protocols] gEfiSmmCommunicationProtocolGuid ## SOMETIMES_CONSUMES =20 =20 [Guids] - ## SOMETIMES_CONSUMES ## HOB - ## PRODUCES ## UNDEFINED # Install protocol ## PRODUCES ## SystemTable gPerformanceProtocolGuid - ## SOMETIMES_CONSUMES ## HOB - ## PRODUCES ## UNDEFINED # Install protocol - gPerformanceExProtocolGuid gZeroGuid ## SOMETIMES_CONSUMES ## G= UID gEfiFirmwarePerformanceGuid ## SOMETIMES_PRODUCES ## U= NDEFINED # StatusCode Data gEdkiiFpdtExtendedFirmwarePerformanceGuid ## SOMETIMES_CONSUMES ## H= OB # StatusCode Data gEfiEventReadyToBootGuid ## CONSUMES ## E= vent gEdkiiPiSmmCommunicationRegionTableGuid ## SOMETIMES_CONSUMES #= # SystemTable + gEdkiiPerformanceMeasurementProtocolGuid ## PRODUCES ## U= NDEFINED # Install protocol =20 [Pcd] gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask ## CO= NSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdEdkiiFpdtStringRecordEnableOnly ## CO= NSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdExtFpdtBootRecordPadSize ## CO= NSUMES diff --git a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceL= ibInternal.h b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanc= eLibInternal.h index 7e79675f940..f9800e34941 100644 --- a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLibInter= nal.h +++ b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLibInter= nal.h @@ -20,10 +20,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITH= ER EXPRESS OR IMPLIED. =20 =20 #include =20 #include +#include #include #include #include #include #include @@ -47,203 +48,36 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EIT= HER EXPRESS OR IMPLIED. #include #include #include #include =20 -// -// Interface declarations for PerformanceEx Protocol. -// /** - Adds a record at the end of the performance measurement log - that records the start time of a performance measurement. - - Adds a record to the end of the performance measurement log - that contains the Handle, Token, Module and Identifier. - The end time of the new record must be set to zero. - If TimeStamp is not zero, then TimeStamp is used to fill in the start ti= me in the record. - If TimeStamp is zero, the start time in the record is filled in with the= value - read from the current time stamp. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, th= e created record - is same as the one created by StartGauge= of PERFORMANCE_PROTOCOL. - - @retval EFI_SUCCESS The data was read correctly from the dev= ice. - @retval EFI_OUT_OF_RESOURCES There are not enough resources to record= the measurement. - -**/ -EFI_STATUS -EFIAPI -StartGaugeEx ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp, - IN UINT32 Identifier - ); - -/** - Searches the performance measurement log from the beginning of the log - for the first matching record that contains a zero end time and fills in= a valid end time. - - Searches the performance measurement log from the beginning of the log - for the first record that matches Handle, Token, Module and Identifier a= nd has an end time value of zero. - If the record can not be found then return EFI_NOT_FOUND. - If the record is found and TimeStamp is not zero, - then the end time in the record is filled in with the value specified by= TimeStamp. - If the record is found and TimeStamp is zero, then the end time in the m= atching record - is filled in with the current time stamp value. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, th= e found record - is same as the one found by EndGauge of = PERFORMANCE_PROTOCOL. - - @retval EFI_SUCCESS The end of the measurement was recorded. - @retval EFI_NOT_FOUND The specified measurement record could n= ot be found. - + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID. + @param Guid - Pointer to a GUID. + @param String - Pointer to a string describing the measuremen= t. + @param TimeStamp - 64-bit time stamp. + @param Address - Pointer to a location in memory relevant to t= he measurement. + @param Identifier - Performance identifier describing the type of= measurement. + @param Attribute - The attribute of the measurement. According t= o attribute can create a start + record for PERF_START/PERF_START_EX, or a end= record for PERF_END/PERF_END_EX, + or a general record for other Perf macros. + + @retval EFI_SUCCESS - Successfully created performance record. + @retval EFI_OUT_OF_RESOURCES - Ran out of space to store the records. + @retval EFI_INVALID_PARAMETER - Invalid parameter passed to function - N= ULL + pointer or invalid PerfId. **/ EFI_STATUS EFIAPI -EndGaugeEx ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp, - IN UINT32 Identifier +CreatePerformanceMeasurement( + IN CONST VOID *CallerIdentifier, OPTIONAL + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 TimeStamp, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT32 Identifier, + IN PERF_MEASUREMENT_ATTRIBUTE Attribute ); =20 -/** - Retrieves a previously logged performance measurement. - It can also retrieve the log created by StartGauge and EndGauge of PERFO= RMANCE_PROTOCOL, - and then assign the Identifier with 0. - - Retrieves the performance log entry from the performance log specified b= y LogEntryKey. - If it stands for a valid entry, then EFI_SUCCESS is returned and - GaugeDataEntryEx stores the pointer to that entry. - - @param LogEntryKey The key for the previous performance mea= surement log entry. - If 0, then the first performance measure= ment log entry is retrieved. - @param GaugeDataEntryEx The indirect pointer to the extended gau= ge data entry specified by LogEntryKey - if the retrieval is successful. - - @retval EFI_SUCCESS The GuageDataEntryEx is successfully fou= nd based on LogEntryKey. - @retval EFI_NOT_FOUND The LogEntryKey is the last entry (equal= s to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (gr= eater than the total entry number). - @retval EFI_INVALIDE_PARAMETER GaugeDataEntryEx is NULL. - -**/ -EFI_STATUS -EFIAPI -GetGaugeEx ( - IN UINTN LogEntryKey, - OUT GAUGE_DATA_ENTRY_EX **GaugeDataEntryEx - ); - -// -// Interface declarations for Performance Protocol. -// -/** - Adds a record at the end of the performance measurement log - that records the start time of a performance measurement. - - Adds a record to the end of the performance measurement log - that contains the Handle, Token, and Module. - The end time of the new record must be set to zero. - If TimeStamp is not zero, then TimeStamp is used to fill in the start ti= me in the record. - If TimeStamp is zero, the start time in the record is filled in with the= value - read from the current time stamp. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - - @retval EFI_SUCCESS The data was read correctly from the dev= ice. - @retval EFI_OUT_OF_RESOURCES There are not enough resources to record= the measurement. - -**/ -EFI_STATUS -EFIAPI -StartGauge ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp - ); - -/** - Searches the performance measurement log from the beginning of the log - for the first matching record that contains a zero end time and fills in= a valid end time. - - Searches the performance measurement log from the beginning of the log - for the first record that matches Handle, Token, and Module and has an e= nd time value of zero. - If the record can not be found then return EFI_NOT_FOUND. - If the record is found and TimeStamp is not zero, - then the end time in the record is filled in with the value specified by= TimeStamp. - If the record is found and TimeStamp is zero, then the end time in the m= atching record - is filled in with the current time stamp value. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - - @retval EFI_SUCCESS The end of the measurement was recorded. - @retval EFI_NOT_FOUND The specified measurement record could n= ot be found. - -**/ -EFI_STATUS -EFIAPI -EndGauge ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp - ); - -/** - Retrieves a previously logged performance measurement. - It can also retrieve the log created by StartGaugeEx and EndGaugeEx of P= ERFORMANCE_EX_PROTOCOL, - and then eliminate the Identifier. - - Retrieves the performance log entry from the performance log specified b= y LogEntryKey. - If it stands for a valid entry, then EFI_SUCCESS is returned and - GaugeDataEntry stores the pointer to that entry. - - @param LogEntryKey The key for the previous performance mea= surement log entry. - If 0, then the first performance measure= ment log entry is retrieved. - @param GaugeDataEntry The indirect pointer to the gauge data e= ntry specified by LogEntryKey - if the retrieval is successful. - - @retval EFI_SUCCESS The GuageDataEntry is successfully found= based on LogEntryKey. - @retval EFI_NOT_FOUND The LogEntryKey is the last entry (equal= s to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (gr= eater than the total entry number). - @retval EFI_INVALIDE_PARAMETER GaugeDataEntry is NULL. - -**/ -EFI_STATUS -EFIAPI -GetGauge ( - IN UINTN LogEntryKey, - OUT GAUGE_DATA_ENTRY **GaugeDataEntry - ); - - #endif diff --git a/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c b/M= deModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c index cb62d522f3d..9ed50d22b8d 100644 --- a/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c +++ b/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c @@ -18,22 +18,21 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITH= ER EXPRESS OR IMPLIED. **/ =20 =20 #include =20 -#include +#include =20 #include #include #include #include =20 // // The cached Performance Protocol and PerformanceEx Protocol interface. // -PERFORMANCE_PROTOCOL *mPerformance =3D NULL; -PERFORMANCE_EX_PROTOCOL *mPerformanceEx =3D NULL; +EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL *mPerformanceMeasurement =3D N= ULL; =20 /** The function caches the pointers to PerformanceEx protocol and Performan= ce Protocol. =20 The function locates PerformanceEx protocol and Performance Protocol fro= m protocol database. @@ -41,39 +40,28 @@ PERFORMANCE_EX_PROTOCOL *mPerformanceEx =3D NULL; @retval EFI_SUCCESS PerformanceEx protocol or Performance Protocol i= s successfully located. @retval EFI_NOT_FOUND Both PerformanceEx protocol and Performance Prot= ocol are not located to log performance. =20 **/ EFI_STATUS -GetPerformanceProtocol ( +GetPerformanceMeasurementProtocol ( VOID ) { EFI_STATUS Status; - PERFORMANCE_PROTOCOL *Performance; - PERFORMANCE_EX_PROTOCOL *PerformanceEx; + EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL *PerformanceMeasurement; =20 - if (mPerformanceEx !=3D NULL || mPerformance !=3D NULL) { + if (mPerformanceMeasurement !=3D NULL) { return EFI_SUCCESS; } =20 - Status =3D gBS->LocateProtocol (&gPerformanceExProtocolGuid, NULL, (VOID= **) &PerformanceEx); + Status =3D gBS->LocateProtocol (&gEdkiiPerformanceMeasurementProtocolGui= d, NULL, (VOID **) &PerformanceMeasurement); if (!EFI_ERROR (Status)) { - ASSERT (PerformanceEx !=3D NULL); + ASSERT (PerformanceMeasurement !=3D NULL); // - // Cache PerformanceEx Protocol. + // Cache PerformanceMeasurement Protocol. // - mPerformanceEx =3D PerformanceEx; - return EFI_SUCCESS; - } - - Status =3D gBS->LocateProtocol (&gPerformanceProtocolGuid, NULL, (VOID *= *) &Performance); - if (!EFI_ERROR (Status)) { - ASSERT (Performance !=3D NULL); - // - // Cache performance protocol. - // - mPerformance =3D Performance; + mPerformanceMeasurement =3D PerformanceMeasurement; return EFI_SUCCESS; } =20 return EFI_NOT_FOUND; } @@ -108,21 +96,28 @@ StartPerformanceMeasurementEx ( IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp, IN UINT32 Identifier ) { - EFI_STATUS Status; + EFI_STATUS Status; + CONST CHAR8* String; =20 - Status =3D GetPerformanceProtocol (); + Status =3D GetPerformanceMeasurementProtocol (); if (EFI_ERROR (Status)) { - return RETURN_OUT_OF_RESOURCES; + return RETURN_NOT_FOUND; + } + + if (Token !=3D NULL) { + String =3D Token; + } else if (Module !=3D NULL) { + String =3D Module; + } else { + String =3D NULL; } =20 - if (mPerformanceEx !=3D NULL) { - Status =3D mPerformanceEx->StartGaugeEx (Handle, Token, Module, TimeSt= amp, Identifier); - } else if (mPerformance !=3D NULL) { - Status =3D mPerformance->StartGauge (Handle, Token, Module, TimeStamp); + if (mPerformanceMeasurement !=3D NULL) { + Status =3D mPerformanceMeasurement->CreatePerformanceMeasurement (Hand= le, NULL, String, TimeStamp, 0, Identifier, PerfStartEntry); } else { ASSERT (FALSE); } =20 return (RETURN_STATUS) Status; @@ -160,21 +155,28 @@ EndPerformanceMeasurementEx ( IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp, IN UINT32 Identifier ) { - EFI_STATUS Status; + EFI_STATUS Status; + CONST CHAR8* String; =20 - Status =3D GetPerformanceProtocol (); + Status =3D GetPerformanceMeasurementProtocol (); if (EFI_ERROR (Status)) { return RETURN_NOT_FOUND; } =20 - if (mPerformanceEx !=3D NULL) { - Status =3D mPerformanceEx->EndGaugeEx (Handle, Token, Module, TimeStam= p, Identifier); - } else if (mPerformance !=3D NULL) { - Status =3D mPerformance->EndGauge (Handle, Token, Module, TimeStamp); + if (Token !=3D NULL) { + String =3D Token; + } else if (Module !=3D NULL) { + String =3D Module; + } else { + String =3D NULL; + } + + if (mPerformanceMeasurement !=3D NULL) { + Status =3D mPerformanceMeasurement->CreatePerformanceMeasurement (Hand= le, NULL, String, TimeStamp, 0, Identifier, PerfEndEntry); } else { ASSERT (FALSE); } =20 return (RETURN_STATUS) Status; @@ -231,62 +233,12 @@ GetPerformanceMeasurementEx ( OUT UINT64 *StartTimeStamp, OUT UINT64 *EndTimeStamp, OUT UINT32 *Identifier ) { - EFI_STATUS Status; - GAUGE_DATA_ENTRY_EX *GaugeData; - - GaugeData =3D NULL; - - ASSERT (Handle !=3D NULL); - ASSERT (Token !=3D NULL); - ASSERT (Module !=3D NULL); - ASSERT (StartTimeStamp !=3D NULL); - ASSERT (EndTimeStamp !=3D NULL); - ASSERT (Identifier !=3D NULL); - - Status =3D GetPerformanceProtocol (); - if (EFI_ERROR (Status)) { - return 0; - } - - if (mPerformanceEx !=3D NULL) { - Status =3D mPerformanceEx->GetGaugeEx (LogEntryKey++, &GaugeData); - } else if (mPerformance !=3D NULL) { - Status =3D mPerformance->GetGauge (LogEntryKey++, (GAUGE_DATA_ENTRY **= ) &GaugeData); - } else { - ASSERT (FALSE); - return 0; - } - - // - // Make sure that LogEntryKey is a valid log entry key, - // - ASSERT (Status !=3D EFI_INVALID_PARAMETER); - - if (EFI_ERROR (Status)) { - // - // The LogEntryKey is the last entry (equals to the total entry number= ). - // - return 0; - } - - ASSERT (GaugeData !=3D NULL); - - *Handle =3D (VOID *) (UINTN) GaugeData->Handle; - *Token =3D GaugeData->Token; - *Module =3D GaugeData->Module; - *StartTimeStamp =3D GaugeData->StartTimeStamp; - *EndTimeStamp =3D GaugeData->EndTimeStamp; - if (mPerformanceEx !=3D NULL) { - *Identifier =3D GaugeData->Identifier; - } else { - *Identifier =3D 0; - } + return 0; =20 - return LogEntryKey; } =20 /** Creates a record for the beginning of a performance measurement. =20 @@ -401,12 +353,11 @@ GetPerformanceMeasurement ( OUT CONST CHAR8 **Module, OUT UINT64 *StartTimeStamp, OUT UINT64 *EndTimeStamp ) { - UINT32 Identifier; - return GetPerformanceMeasurementEx (LogEntryKey, Handle, Token, Module, = StartTimeStamp, EndTimeStamp, &Identifier); + return 0; } =20 /** Returns TRUE if the performance measurement macros are enabled. =20 diff --git a/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf b= /MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf index edc63c6f0b6..c7d06a3a1b1 100644 --- a/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf +++ b/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf @@ -4,11 +4,11 @@ # This library instance provides infrastructure for DXE phase drivers to = log performance # data. It consumes PerformanceEx or Performance Protocol published by Dx= eCorePerformanceLib # to log performance data. If both PerformanceEx and Performance Protocol= are not available, # it does not log any performance information. # =20 -# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the B= SD License # which accompanies this distribution. The full text of the license may = be found at # http://opensource.org/licenses/bsd-license.php # =20 @@ -46,12 +46,11 @@ UefiBootServicesTableLib DebugLib =20 =20 [Guids] - gPerformanceProtocolGuid ## SOMETIMES_CONSUMES ## UNDEFINED # Loc= ate protocol - gPerformanceExProtocolGuid ## SOMETIMES_CONSUMES ## UNDEFINED # Loc= ate protocol + gEdkiiPerformanceMeasurementProtocolGuid ## SOMETIMES_CONSUMES ## U= NDEFINED # Locate protocol =20 =20 [Pcd] gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask ## CONSUMES =20 diff --git a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceL= ib.c b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c index dbc1166f254..e630773562f 100644 --- a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c +++ b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c @@ -52,25 +52,14 @@ BOOLEAN mLackSpaceIsReport =3D FALSE; CHAR8 *mPlatformLanguage =3D NULL; SPIN_LOCK mSmmFpdtLock; PERFORMANCE_PROPERTY mPerformanceProperty; =20 // -// Interfaces for SMM Performance Protocol. +// Interfaces for SMM PerformanceMeasurement Protocol. // -PERFORMANCE_PROTOCOL mPerformanceInterface =3D { - StartGauge, - EndGauge, - GetGauge -}; - -// -// Interfaces for SMM PerformanceEx Protocol. -// -PERFORMANCE_EX_PROTOCOL mPerformanceExInterface =3D { - StartGaugeEx, - EndGaugeEx, - GetGaugeEx +EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL mPerformanceMeasurementInterface = =3D { + CreatePerformanceMeasurement, }; =20 /** Check whether the Token is a known one which is uesed by core. =20 @@ -641,239 +630,10 @@ InsertFpdtMeasurement ( mSmmBootPerformanceTable->Header.Length +=3D FpdtRecordPtr.RecordHeader-= >Length; =20 return EFI_SUCCESS; } =20 -/** - Adds a record at the end of the performance measurement log - that records the start time of a performance measurement. - - Adds a record to the end of the performance measurement log - that contains the Handle, Token, Module and Identifier. - The end time of the new record must be set to zero. - If TimeStamp is not zero, then TimeStamp is used to fill in the start ti= me in the record. - If TimeStamp is zero, the start time in the record is filled in with the= value - read from the current time stamp. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, th= e created record - is same as the one created by StartGauge= of PERFORMANCE_PROTOCOL. - - @retval EFI_SUCCESS The data was read correctly from the dev= ice. - @retval EFI_OUT_OF_RESOURCES There are not enough resources to record= the measurement. - -**/ -EFI_STATUS -EFIAPI -StartGaugeEx ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp, - IN UINT32 Identifier - ) -{ - EFI_STATUS Status; - - AcquireSpinLock (&mSmmFpdtLock); - - Status =3D InsertFpdtMeasurement (TRUE, Handle, Token, Module, TimeStamp= , Identifier); - - ReleaseSpinLock (&mSmmFpdtLock); - - return Status; -} - -/** - Searches the performance measurement log from the beginning of the log - for the first matching record that contains a zero end time and fills in= a valid end time. - - Searches the performance measurement log from the beginning of the log - for the first record that matches Handle, Token, Module and Identifier a= nd has an end time value of zero. - If the record can not be found then return EFI_NOT_FOUND. - If the record is found and TimeStamp is not zero, - then the end time in the record is filled in with the value specified by= TimeStamp. - If the record is found and TimeStamp is zero, then the end time in the m= atching record - is filled in with the current time stamp value. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, th= e found record - is same as the one found by EndGauge of = PERFORMANCE_PROTOCOL. - - @retval EFI_SUCCESS The end of the measurement was recorded. - @retval EFI_NOT_FOUND The specified measurement record could n= ot be found. - -**/ -EFI_STATUS -EFIAPI -EndGaugeEx ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp, - IN UINT32 Identifier - ) -{ - EFI_STATUS Status; - - AcquireSpinLock (&mSmmFpdtLock); - - Status =3D InsertFpdtMeasurement (FALSE, Handle, Token, Module, TimeStam= p, Identifier); - - ReleaseSpinLock (&mSmmFpdtLock); - - return Status; -} - -/** - Retrieves a previously logged performance measurement. - It can also retrieve the log created by StartGauge and EndGauge of PERFO= RMANCE_PROTOCOL, - and then assign the Identifier with 0. - - !!! Not Support!!! - - Retrieves the performance log entry from the performance log specified b= y LogEntryKey. - If it stands for a valid entry, then EFI_SUCCESS is returned and - GaugeDataEntryEx stores the pointer to that entry. - - @param LogEntryKey The key for the previous performance mea= surement log entry. - If 0, then the first performance measure= ment log entry is retrieved. - @param GaugeDataEntryEx The indirect pointer to the extended gau= ge data entry specified by LogEntryKey - if the retrieval is successful. - - @retval EFI_SUCCESS The GuageDataEntryEx is successfully fou= nd based on LogEntryKey. - @retval EFI_NOT_FOUND The LogEntryKey is the last entry (equal= s to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (gr= eater than the total entry number). - @retval EFI_INVALIDE_PARAMETER GaugeDataEntryEx is NULL. - -**/ -EFI_STATUS -EFIAPI -GetGaugeEx ( - IN UINTN LogEntryKey, - OUT GAUGE_DATA_ENTRY_EX **GaugeDataEntryEx - ) -{ - return EFI_UNSUPPORTED; -} - -/** - Adds a record at the end of the performance measurement log - that records the start time of a performance measurement. - - Adds a record to the end of the performance measurement log - that contains the Handle, Token, and Module. - The end time of the new record must be set to zero. - If TimeStamp is not zero, then TimeStamp is used to fill in the start ti= me in the record. - If TimeStamp is zero, the start time in the record is filled in with the= value - read from the current time stamp. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - - @retval EFI_SUCCESS The data was read correctly from the dev= ice. - @retval EFI_OUT_OF_RESOURCES There are not enough resources to record= the measurement. - -**/ -EFI_STATUS -EFIAPI -StartGauge ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp - ) -{ - return StartGaugeEx (Handle, Token, Module, TimeStamp, 0); -} - -/** - Searches the performance measurement log from the beginning of the log - for the first matching record that contains a zero end time and fills in= a valid end time. - - Searches the performance measurement log from the beginning of the log - for the first record that matches Handle, Token, and Module and has an e= nd time value of zero. - If the record can not be found then return EFI_NOT_FOUND. - If the record is found and TimeStamp is not zero, - then the end time in the record is filled in with the value specified by= TimeStamp. - If the record is found and TimeStamp is zero, then the end time in the m= atching record - is filled in with the current time stamp value. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - - @retval EFI_SUCCESS The end of the measurement was recorded. - @retval EFI_NOT_FOUND The specified measurement record could n= ot be found. - -**/ -EFI_STATUS -EFIAPI -EndGauge ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp - ) -{ - return EndGaugeEx (Handle, Token, Module, TimeStamp, 0); -} - -/** - Retrieves a previously logged performance measurement. - It can also retrieve the log created by StartGaugeEx and EndGaugeEx of P= ERFORMANCE_EX_PROTOCOL, - and then eliminate the Identifier. - - !!! Not Support!!! - - Retrieves the performance log entry from the performance log specified b= y LogEntryKey. - If it stands for a valid entry, then EFI_SUCCESS is returned and - GaugeDataEntry stores the pointer to that entry. - - @param LogEntryKey The key for the previous performance mea= surement log entry. - If 0, then the first performance measure= ment log entry is retrieved. - @param GaugeDataEntry The indirect pointer to the gauge data e= ntry specified by LogEntryKey - if the retrieval is successful. - - @retval EFI_SUCCESS The GuageDataEntry is successfully found= based on LogEntryKey. - @retval EFI_NOT_FOUND The LogEntryKey is the last entry (equal= s to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (gr= eater than the total entry number). - @retval EFI_INVALIDE_PARAMETER GaugeDataEntry is NULL. - -**/ -EFI_STATUS -EFIAPI -GetGauge ( - IN UINTN LogEntryKey, - OUT GAUGE_DATA_ENTRY **GaugeDataEntry - ) -{ - return EFI_UNSUPPORTED; -} - - /** SmmReadyToBoot protocol notification event handler. =20 @param Protocol Points to the protocol's unique identifier @param Interface Points to the interface instance @@ -940,20 +700,13 @@ InitializeSmmCorePerformanceLib ( // Install the protocol interfaces for SMM performance library instance. // Handle =3D NULL; Status =3D gSmst->SmmInstallProtocolInterface ( &Handle, - &gSmmPerformanceProtocolGuid, - EFI_NATIVE_INTERFACE, - &mPerformanceInterface - ); - ASSERT_EFI_ERROR (Status); - Status =3D gSmst->SmmInstallProtocolInterface ( - &Handle, - &gSmmPerformanceExProtocolGuid, + &gEdkiiSmmPerformanceMeasurementProtocolGuid, EFI_NATIVE_INTERFACE, - &mPerformanceExInterface + &mPerformanceMeasurementInterface ); ASSERT_EFI_ERROR (Status); =20 Status =3D gSmst->SmmRegisterProtocolNotify ( &gEdkiiSmmReadyToBootProtocolGuid, @@ -1029,10 +782,52 @@ SmmCorePerformanceLibConstructor ( ASSERT_EFI_ERROR (Status); =20 return EFI_SUCCESS; } =20 +/** + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID. + @param Guid - Pointer to a GUID. + @param String - Pointer to a string describing the measuremen= t. + @param TimeStamp - 64-bit time stamp. + @param Address - Pointer to a location in memory relevant to t= he measurement. + @param Identifier - Performance identifier describing the type of= measurement. + @param Attribute - The attribute of the measurement. According t= o attribute can create a start + record for PERF_START/PERF_START_EX, or a end= record for PERF_END/PERF_END_EX, + or a general record for other Perf macros. + + @retval EFI_SUCCESS - Successfully created performance record. + @retval EFI_OUT_OF_RESOURCES - Ran out of space to store the records. + @retval EFI_INVALID_PARAMETER - Invalid parameter passed to function - N= ULL + pointer or invalid PerfId. +**/ +EFI_STATUS +EFIAPI +CreatePerformanceMeasurement( + IN CONST VOID *CallerIdentifier, OPTIONAL + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 TimeStamp, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT32 Identifier, + IN PERF_MEASUREMENT_ATTRIBUTE Attribute + ) +{ + EFI_STATUS Status; + + AcquireSpinLock (&mSmmFpdtLock); + if (Attribute =3D=3D PerfStartEntry) { + Status =3D InsertFpdtMeasurement (TRUE, CallerIdentifier, String, Stri= ng, TimeStamp, Identifier); + } else if (Attribute =3D=3D PerfEndEntry) { + Status =3D InsertFpdtMeasurement (FALSE, CallerIdentifier, String, Str= ing, TimeStamp, Identifier); + } + ReleaseSpinLock (&mSmmFpdtLock); + return Status; +} + /** Adds a record at the end of the performance measurement log that records the start time of a performance measurement. =20 Adds a record to the end of the performance measurement log @@ -1064,11 +859,21 @@ StartPerformanceMeasurementEx ( IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp, IN UINT32 Identifier ) { - return (RETURN_STATUS) StartGaugeEx (Handle, Token, Module, TimeStamp, I= dentifier); + CONST CHAR8 *String; + + if (Token !=3D NULL) { + String =3D Token; + } else if (Module !=3D NULL) { + String =3D Module; + } else { + String =3D NULL; + } + + return (RETURN_STATUS)CreatePerformanceMeasurement (Handle, NULL, String= , TimeStamp, 0, Identifier, PerfStartEntry); } =20 /** Searches the performance measurement log from the beginning of the log for the first matching record that contains a zero end time and fills in= a valid end time. @@ -1103,11 +908,21 @@ EndPerformanceMeasurementEx ( IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp, IN UINT32 Identifier ) { - return (RETURN_STATUS) EndGaugeEx (Handle, Token, Module, TimeStamp, Ide= ntifier); + CONST CHAR8 *String; + + if (Token !=3D NULL) { + String =3D Token; + } else if (Module !=3D NULL) { + String =3D Module; + } else { + String =3D NULL; + } + + return (RETURN_STATUS)CreatePerformanceMeasurement (Handle, NULL, String= , TimeStamp, 0, Identifier, PerfEndEntry); } =20 /** Attempts to retrieve a performance measurement log entry from the perfor= mance measurement log. It can also retrieve the log created by StartPerformanceMeasurement and = EndPerformanceMeasurement, @@ -1196,11 +1011,11 @@ StartPerformanceMeasurement ( IN CONST CHAR8 *Token, OPTIONAL IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp ) { - return StartGaugeEx (Handle, Token, Module, TimeStamp, 0); + return StartPerformanceMeasurementEx (Handle, Token, Module, TimeStamp, = 0); } =20 /** Searches the performance measurement log from the beginning of the log for the first matching record that contains a zero end time and fills in= a valid end time. @@ -1232,11 +1047,11 @@ EndPerformanceMeasurement ( IN CONST CHAR8 *Token, OPTIONAL IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp ) { - return EndGaugeEx (Handle, Token, Module, TimeStamp, 0); + return EndPerformanceMeasurementEx (Handle, Token, Module, TimeStamp, 0); } =20 /** Attempts to retrieve a performance measurement log entry from the perfor= mance measurement log. It can also retrieve the log created by StartPerformanceMeasurementEx an= d EndPerformanceMeasurementEx, diff --git a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceL= ib.inf b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.i= nf index 01d8604eb61..61b92836657 100644 --- a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.inf +++ b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.inf @@ -64,19 +64,14 @@ [Protocols] gEfiSmmBase2ProtocolGuid ## CONSUMES gEdkiiSmmReadyToBootProtocolGuid ## NOTIFY =20 [Guids] - ## PRODUCES ## UNDEFINED # Install protocol - ## CONSUMES ## UNDEFINED # SmiHandlerRegister - gSmmPerformanceProtocolGuid - ## PRODUCES ## UNDEFINED # Install protocol - ## CONSUMES ## UNDEFINED # SmiHandlerRegister - gSmmPerformanceExProtocolGuid ## PRODUCES ## SystemTable gPerformanceProtocolGuid gEdkiiFpdtExtendedFirmwarePerformanceGuid ## SOMETIMES_PRODUCES ## UNDEF= INED # StatusCode Data gZeroGuid ## SOMETIMES_CONSUMES ## GUID + gEdkiiSmmPerformanceMeasurementProtocolGuid ## PRODUCES ## U= NDEFINED # Install protocol =20 [Pcd] gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask ## CON= SUMES gEfiMdeModulePkgTokenSpaceGuid.PcdEdkiiFpdtStringRecordEnableOnly ## CON= SUMES diff --git a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceL= ibInternal.h b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanc= eLibInternal.h index 9d24d9ff7a0..76f24984735 100644 --- a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLibInter= nal.h +++ b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLibInter= nal.h @@ -18,10 +18,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITH= ER EXPRESS OR IMPLIED. #ifndef _SMM_CORE_PERFORMANCE_LIB_INTERNAL_H_ #define _SMM_CORE_PERFORMANCE_LIB_INTERNAL_H_ =20 =20 #include +#include #include #include #include #include =20 @@ -44,202 +45,38 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EIT= HER EXPRESS OR IMPLIED. #include #include #include =20 // -// Interface declarations for SMM PerformanceEx Protocol. +// Interface declarations for SMM PerformanceMeasurement Protocol. // /** - Adds a record at the end of the performance measurement log - that records the start time of a performance measurement. - - Adds a record to the end of the performance measurement log - that contains the Handle, Token, Module and Identifier. - The end time of the new record must be set to zero. - If TimeStamp is not zero, then TimeStamp is used to fill in the start ti= me in the record. - If TimeStamp is zero, the start time in the record is filled in with the= value - read from the current time stamp. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, th= e created record - is same as the one created by StartGauge= of PERFORMANCE_PROTOCOL. - - @retval EFI_SUCCESS The data was read correctly from the dev= ice. - @retval EFI_OUT_OF_RESOURCES There are not enough resources to record= the measurement. - + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID. + @param Guid - Pointer to a GUID. + @param String - Pointer to a string describing the measuremen= t. + @param TimeStamp - 64-bit time stamp. + @param Address - Pointer to a location in memory relevant to t= he measurement. + @param Identifier - Performance identifier describing the type of= measurement. + @param Attribute - The attribute of the measurement. According t= o attribute can create a start + record for PERF_START/PERF_START_EX, or a end= record for PERF_END/PERF_END_EX, + or a general record for other Perf macros. + + @retval EFI_SUCCESS - Successfully created performance record. + @retval EFI_OUT_OF_RESOURCES - Ran out of space to store the records. + @retval EFI_INVALID_PARAMETER - Invalid parameter passed to function - N= ULL + pointer or invalid PerfId. **/ EFI_STATUS EFIAPI -StartGaugeEx ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp, - IN UINT32 Identifier +CreatePerformanceMeasurement( + IN CONST VOID *CallerIdentifier, OPTIONAL + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 TimeStamp, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT32 Identifier, + IN PERF_MEASUREMENT_ATTRIBUTE Attribute ); =20 -/** - Searches the performance measurement log from the beginning of the log - for the first matching record that contains a zero end time and fills in= a valid end time. - - Searches the performance measurement log from the beginning of the log - for the first record that matches Handle, Token, Module and Identifier a= nd has an end time value of zero. - If the record can not be found then return EFI_NOT_FOUND. - If the record is found and TimeStamp is not zero, - then the end time in the record is filled in with the value specified by= TimeStamp. - If the record is found and TimeStamp is zero, then the end time in the m= atching record - is filled in with the current time stamp value. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, th= e found record - is same as the one found by EndGauge of = PERFORMANCE_PROTOCOL. - - @retval EFI_SUCCESS The end of the measurement was recorded. - @retval EFI_NOT_FOUND The specified measurement record could n= ot be found. - -**/ -EFI_STATUS -EFIAPI -EndGaugeEx ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp, - IN UINT32 Identifier - ); - -/** - Retrieves a previously logged performance measurement. - It can also retrieve the log created by StartGauge and EndGauge of PERFO= RMANCE_PROTOCOL, - and then assign the Identifier with 0. - - Retrieves the performance log entry from the performance log specified b= y LogEntryKey. - If it stands for a valid entry, then EFI_SUCCESS is returned and - GaugeDataEntryEx stores the pointer to that entry. - - @param LogEntryKey The key for the previous performance mea= surement log entry. - If 0, then the first performance measure= ment log entry is retrieved. - @param GaugeDataEntryEx The indirect pointer to the extended gau= ge data entry specified by LogEntryKey - if the retrieval is successful. - - @retval EFI_SUCCESS The GuageDataEntryEx is successfully fou= nd based on LogEntryKey. - @retval EFI_NOT_FOUND The LogEntryKey is the last entry (equal= s to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (gr= eater than the total entry number). - @retval EFI_INVALIDE_PARAMETER GaugeDataEntryEx is NULL. - -**/ -EFI_STATUS -EFIAPI -GetGaugeEx ( - IN UINTN LogEntryKey, - OUT GAUGE_DATA_ENTRY_EX **GaugeDataEntryEx - ); - -// -// Interface declarations for SMM Performance Protocol. -// -/** - Adds a record at the end of the performance measurement log - that records the start time of a performance measurement. - - Adds a record to the end of the performance measurement log - that contains the Handle, Token, and Module. - The end time of the new record must be set to zero. - If TimeStamp is not zero, then TimeStamp is used to fill in the start ti= me in the record. - If TimeStamp is zero, the start time in the record is filled in with the= value - read from the current time stamp. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - - @retval EFI_SUCCESS The data was read correctly from the dev= ice. - @retval EFI_OUT_OF_RESOURCES There are not enough resources to record= the measurement. - -**/ -EFI_STATUS -EFIAPI -StartGauge ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp - ); - -/** - Searches the performance measurement log from the beginning of the log - for the first matching record that contains a zero end time and fills in= a valid end time. - - Searches the performance measurement log from the beginning of the log - for the first record that matches Handle, Token, and Module and has an e= nd time value of zero. - If the record can not be found then return EFI_NOT_FOUND. - If the record is found and TimeStamp is not zero, - then the end time in the record is filled in with the value specified by= TimeStamp. - If the record is found and TimeStamp is zero, then the end time in the m= atching record - is filled in with the current time stamp value. - - @param Handle Pointer to environment specific context = used - to identify the component being measured. - @param Token Pointer to a Null-terminated ASCII string - that identifies the component being meas= ured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measure= d. - @param TimeStamp 64-bit time stamp. - - @retval EFI_SUCCESS The end of the measurement was recorded. - @retval EFI_NOT_FOUND The specified measurement record could n= ot be found. - -**/ -EFI_STATUS -EFIAPI -EndGauge ( - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp - ); - -/** - Retrieves a previously logged performance measurement. - It can also retrieve the log created by StartGaugeEx and EndGaugeEx of P= ERFORMANCE_EX_PROTOCOL, - and then eliminate the Identifier. - - Retrieves the performance log entry from the performance log specified b= y LogEntryKey. - If it stands for a valid entry, then EFI_SUCCESS is returned and - GaugeDataEntry stores the pointer to that entry. - - @param LogEntryKey The key for the previous performance mea= surement log entry. - If 0, then the first performance measure= ment log entry is retrieved. - @param GaugeDataEntry The indirect pointer to the gauge data e= ntry specified by LogEntryKey - if the retrieval is successful. - - @retval EFI_SUCCESS The GuageDataEntry is successfully found= based on LogEntryKey. - @retval EFI_NOT_FOUND The LogEntryKey is the last entry (equal= s to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (gr= eater than the total entry number). - @retval EFI_INVALIDE_PARAMETER GaugeDataEntry is NULL. - -**/ -EFI_STATUS -EFIAPI -GetGauge ( - IN UINTN LogEntryKey, - OUT GAUGE_DATA_ENTRY **GaugeDataEntry - ); - - #endif diff --git a/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.c b/M= deModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.c index 4a08c24789c..fd820c0e49c 100644 --- a/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.c +++ b/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.c @@ -16,24 +16,22 @@ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN = "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLI= ED. =20 **/ =20 =20 -#include +#include =20 #include #include #include #include #include =20 // // The cached SMM Performance Protocol and SMM PerformanceEx Protocol inte= rface. -// -PERFORMANCE_PROTOCOL *mPerformance =3D NULL; -PERFORMANCE_EX_PROTOCOL *mPerformanceEx =3D NULL; -BOOLEAN mPerformanceMeasurementEnabled; +EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL *mPerformanceMeasurement =3D NULL; +BOOLEAN mPerformanceMeasurementEnabled; =20 /** The constructor function initializes the Performance Measurement Enable = flag =20 @param ImageHandle The firmware allocated handle for the EFI image. @@ -63,42 +61,30 @@ SmmPerformanceLibConstructor ( @retval EFI_SUCCESS SMM PerformanceEx protocol or Performance Protoc= ol is successfully located. @retval EFI_NOT_FOUND Both SMM PerformanceEx protocol and Performance = Protocol are not located to log performance. =20 **/ EFI_STATUS -GetPerformanceProtocol ( +GetPerformanceMeasurementProtocol ( VOID ) { EFI_STATUS Status; - PERFORMANCE_PROTOCOL *Performance; - PERFORMANCE_EX_PROTOCOL *PerformanceEx; + EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL *PerformanceMeasurement; =20 - if (mPerformanceEx !=3D NULL || mPerformance !=3D NULL) { + if (mPerformanceMeasurement !=3D NULL) { return EFI_SUCCESS; } =20 - Status =3D gSmst->SmmLocateProtocol (&gSmmPerformanceExProtocolGuid, NUL= L, (VOID **) &PerformanceEx); + Status =3D gSmst->SmmLocateProtocol (&gEdkiiSmmPerformanceMeasurementPro= tocolGuid, NULL, (VOID **) &PerformanceMeasurement); if (!EFI_ERROR (Status)) { - ASSERT (PerformanceEx !=3D NULL); + ASSERT (PerformanceMeasurement !=3D NULL); // - // Cache PerformanceEx Protocol. + // Cache PerformanceMeasurement Protocol. // - mPerformanceEx =3D PerformanceEx; + mPerformanceMeasurement =3D PerformanceMeasurement; return EFI_SUCCESS; } - - Status =3D gSmst->SmmLocateProtocol (&gSmmPerformanceProtocolGuid, NULL,= (VOID **) &Performance); - if (!EFI_ERROR (Status)) { - ASSERT (Performance !=3D NULL); - // - // Cache performance protocol. - // - mPerformance =3D Performance; - return EFI_SUCCESS; - } - return EFI_NOT_FOUND; } =20 /** Creates a record for the beginning of a performance measurement. @@ -130,21 +116,28 @@ StartPerformanceMeasurementEx ( IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp, IN UINT32 Identifier ) { - EFI_STATUS Status; + EFI_STATUS Status; + CONST CHAR8* String; =20 - Status =3D GetPerformanceProtocol (); + Status =3D GetPerformanceMeasurementProtocol (); if (EFI_ERROR (Status)) { - return RETURN_OUT_OF_RESOURCES; + return RETURN_NOT_FOUND; } =20 - if (mPerformanceEx !=3D NULL) { - Status =3D mPerformanceEx->StartGaugeEx (Handle, Token, Module, TimeSt= amp, Identifier); - } else if (mPerformance !=3D NULL) { - Status =3D mPerformance->StartGauge (Handle, Token, Module, TimeStamp); + if (Token !=3D NULL) { + String =3D Token; + } else if (Module !=3D NULL) { + String =3D Module; + } else { + String =3D NULL; + } + + if (mPerformanceMeasurement !=3D NULL) { + Status =3D mPerformanceMeasurement->CreatePerformanceMeasurement (Hand= le, NULL, String, TimeStamp, 0, Identifier, PerfStartEntry); } else { ASSERT (FALSE); } =20 return (RETURN_STATUS) Status; @@ -182,21 +175,28 @@ EndPerformanceMeasurementEx ( IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp, IN UINT32 Identifier ) { - EFI_STATUS Status; + EFI_STATUS Status; + CONST CHAR8* String; =20 - Status =3D GetPerformanceProtocol (); + Status =3D GetPerformanceMeasurementProtocol (); if (EFI_ERROR (Status)) { return RETURN_NOT_FOUND; } =20 - if (mPerformanceEx !=3D NULL) { - Status =3D mPerformanceEx->EndGaugeEx (Handle, Token, Module, TimeStam= p, Identifier); - } else if (mPerformance !=3D NULL) { - Status =3D mPerformance->EndGauge (Handle, Token, Module, TimeStamp); + if (Token !=3D NULL) { + String =3D Token; + } else if (Module !=3D NULL) { + String =3D Module; + } else { + String =3D NULL; + } + + if (mPerformanceMeasurement !=3D NULL) { + Status =3D mPerformanceMeasurement->CreatePerformanceMeasurement (Hand= le, NULL, String, TimeStamp, 0, Identifier, PerfEndEntry); } else { ASSERT (FALSE); } =20 return (RETURN_STATUS) Status; @@ -253,62 +253,11 @@ GetPerformanceMeasurementEx ( OUT UINT64 *StartTimeStamp, OUT UINT64 *EndTimeStamp, OUT UINT32 *Identifier ) { - EFI_STATUS Status; - GAUGE_DATA_ENTRY_EX *GaugeData; - - GaugeData =3D NULL; - - ASSERT (Handle !=3D NULL); - ASSERT (Token !=3D NULL); - ASSERT (Module !=3D NULL); - ASSERT (StartTimeStamp !=3D NULL); - ASSERT (EndTimeStamp !=3D NULL); - ASSERT (Identifier !=3D NULL); - - Status =3D GetPerformanceProtocol (); - if (EFI_ERROR (Status)) { - return 0; - } - - if (mPerformanceEx !=3D NULL) { - Status =3D mPerformanceEx->GetGaugeEx (LogEntryKey++, &GaugeData); - } else if (mPerformance !=3D NULL) { - Status =3D mPerformance->GetGauge (LogEntryKey++, (GAUGE_DATA_ENTRY **= ) &GaugeData); - } else { - ASSERT (FALSE); - return 0; - } - - // - // Make sure that LogEntryKey is a valid log entry key, - // - ASSERT (Status !=3D EFI_INVALID_PARAMETER); - - if (EFI_ERROR (Status)) { - // - // The LogEntryKey is the last entry (equals to the total entry number= ). - // - return 0; - } - - ASSERT (GaugeData !=3D NULL); - - *Handle =3D (VOID *) (UINTN) GaugeData->Handle; - *Token =3D GaugeData->Token; - *Module =3D GaugeData->Module; - *StartTimeStamp =3D GaugeData->StartTimeStamp; - *EndTimeStamp =3D GaugeData->EndTimeStamp; - if (mPerformanceEx !=3D NULL) { - *Identifier =3D GaugeData->Identifier; - } else { - *Identifier =3D 0; - } - - return LogEntryKey; + return 0; } =20 /** Creates a record for the beginning of a performance measurement. =20 @@ -423,12 +372,11 @@ GetPerformanceMeasurement ( OUT CONST CHAR8 **Module, OUT UINT64 *StartTimeStamp, OUT UINT64 *EndTimeStamp ) { - UINT32 Identifier; - return GetPerformanceMeasurementEx (LogEntryKey, Handle, Token, Module, = StartTimeStamp, EndTimeStamp, &Identifier); + return 0; } =20 /** Returns TRUE if the performance measurement macros are enabled. =20 diff --git a/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.inf b= /MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.inf index c3d01a1e51d..174ed3f1e59 100644 --- a/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.inf +++ b/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.inf @@ -4,11 +4,11 @@ # This library instance provides infrastructure for SMM drivers to log pe= rformance # data. It consumes SMM PerformanceEx or Performance Protocol published b= y SmmCorePerformanceLib # to log performance data. If both SMM PerformanceEx and Performance Prot= ocol are not available, # it does not log any performance information. # =20 -# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the B= SD License # which accompanies this distribution. The full text of the license may = be found at # http://opensource.org/licenses/bsd-license.php # =20 @@ -48,10 +48,9 @@ SmmServicesTableLib DebugLib BaseMemoryLib =20 [Guids] - gSmmPerformanceProtocolGuid ## SOMETIMES_CONSUMES ## UNDEFIN= ED # Locate protocol - gSmmPerformanceExProtocolGuid ## SOMETIMES_CONSUMES ## UNDEFIN= ED # Locate protocol + gEdkiiSmmPerformanceMeasurementProtocolGuid ## SOMETIMES_CONSUM= ES ## UNDEFINED # Locate protocol =20 [Pcd] gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask ## CONSUMES --=20 2.14.3.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Sun May 5 09:12:48 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1529393175627886.6003489165275; Tue, 19 Jun 2018 00:26:15 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id BC919211299AE; Tue, 19 Jun 2018 00:26:12 -0700 (PDT) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 3CCC7211299A8 for ; Tue, 19 Jun 2018 00:26:12 -0700 (PDT) Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jun 2018 00:26:11 -0700 Received: from shwdeopenpsi114.ccr.corp.intel.com ([10.239.157.135]) by orsmga006.jf.intel.com with ESMTP; 19 Jun 2018 00:26:10 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.88; helo=mga01.intel.com; envelope-from=dandan.bi@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,242,1526367600"; d="scan'208";a="51022245" From: Dandan Bi To: edk2-devel@lists.01.org Date: Tue, 19 Jun 2018 15:23:59 +0800 Message-Id: <20180619072405.142872-4-dandan.bi@intel.com> X-Mailer: git-send-email 2.14.3.windows.1 In-Reply-To: <20180619072405.142872-1-dandan.bi@intel.com> References: <20180619072405.142872-1-dandan.bi@intel.com> Subject: [edk2] [patch 3/9] MdePkg/PerformanceLib.h: Add new Perf macros X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Michael Kinney , Liming Gao MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" 1. Add new Perf macros for performance measurement and related APIs and definitions in Performance library class. 2. Update NULL performance library instance in MdePkg. Cc: Liming Gao Cc: Michael Kinney Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi --- MdePkg/Include/Library/PerformanceLib.h | 408 +++++++++++++++++= +++- .../BasePerformanceLibNull/PerformanceLib.c | 57 ++- MdePkg/MdePkg.dec | 9 +- MdePkg/MdePkg.uni | 6 + 4 files changed, 477 insertions(+), 3 deletions(-) diff --git a/MdePkg/Include/Library/PerformanceLib.h b/MdePkg/Include/Libra= ry/PerformanceLib.h index 3ecd62bd201..8a8f5e3694a 100644 --- a/MdePkg/Include/Library/PerformanceLib.h +++ b/MdePkg/Include/Library/PerformanceLib.h @@ -1,9 +1,9 @@ /** @file Provides services to log the execution times and retrieve them later. =20 -Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD = License which accompanies this distribution. The full text of the license may be = found at http://opensource.org/licenses/bsd-license.php =20 @@ -18,10 +18,49 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITH= ER EXPRESS OR IMPLIED. /// /// Performance library propery mask bits /// #define PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED 0x00000001 =20 +// +// Public Progress Identifiers for Event Records. +// +#define PERF_EVENT_ID 0x00 + +#define MODULE_START_ID 0x01 +#define MODULE_END_ID 0x02 +#define MODULE_LOADIMAGE_START_ID 0x03 +#define MODULE_LOADIMAGE_END_ID 0x04 +#define MODULE_DB_START_ID 0x05 +#define MODULE_DB_END_ID 0x06 +#define MODULE_DB_SUPPORT_START_ID 0x07 +#define MODULE_DB_SUPPORT_END_ID 0x08 +#define MODULE_DB_STOP_START_ID 0x09 +#define MODULE_DB_STOP_END_ID 0x0A + +#define PERF_EVENTSIGNAL_START_ID 0x10 +#define PERF_EVENTSIGNAL_END_ID 0x11 +#define PERF_CALLBACK_START_ID 0x20 +#define PERF_CALLBACK_END_ID 0x21 +#define PERF_FUNCTION_START_ID 0x30 +#define PERF_FUNCTION_END_ID 0x31 +#define PERF_INMODULE_START_ID 0x40 +#define PERF_INMODULE_END_ID 0x41 +#define PERF_CROSSMODULE_START_ID 0x50 +#define PERF_CROSSMODULE_END_ID 0x51 + +// +// Declare bits for PcdPerformanceLibraryPropertyMask and +// also used as the Type parameter of LogPerformanceMeasurementEnabled(). +// +#define PERF_CORE_START_IMAGE 0x0002 +#define PERF_CORE_LOAD_IMAGE 0x0004 +#define PERF_CORE_DB_SUPPORT 0x0008 +#define PERF_CORE_DB_START 0x0010 +#define PERF_CORE_DB_STOP 0x0020 + +#define PERF_GENERAL_TYPE 0x0040 + /** Creates a record for the beginning of a performance measurement.=20 =20 Creates a record that contains the Handle, Token, and Module. If TimeStamp is not zero, then TimeStamp is added to the record as the s= tart time. @@ -269,10 +308,377 @@ BOOLEAN EFIAPI PerformanceMeasurementEnabled ( VOID ); =20 + +/** + Check whether the specified performance measurement can be logged. + + This function returns TRUE when the PERFORMANCE_LIBRARY_PROPERTY_MEASURE= MENT_ENABLED bit of PcdPerformanceLibraryPropertyMask is set + and the Type disable bit in PcdPerformanceLibraryPropertyMask is not set. + + @param Type - Type of the performance measurement entry. + + @retval TRUE The performance measurement can be logged. + @retval FALSE The performance measurement can NOT be logged. + +**/ +BOOLEAN +EFIAPI +LogPerformanceMeasurementEnabled ( + IN CONST UINTN Type + ); + +/** + Create performance record with event description. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID + @param Guid - Pointer to a GUID. + Used for event signal perf and callback perf t= o cache the event guid. + @param String - Pointer to a string describing the measurement + @param Address - Pointer to a location in memory relevant to th= e measurement. + @param Identifier - Performance identifier describing the type of = measurement. + + @retval RETURN_SUCCESS - Successfully created performance reco= rd + @retval RETURN_OUT_OF_RESOURCES - Ran out of space to store the records + @retval RETURN_INVALID_PARAMETER - Invalid parameter passed to function = - NULL + pointer or invalid Identifier. + +**/ +RETURN_STATUS +EFIAPI +LogPerformanceMeasurement ( + IN CONST VOID *CallerIdentifier, OPTIONAL + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT32 Identifier + ); + +/** + Begin Macro to measure the performance of StartImage in core. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT1(dsiable PERF_CORE_START_IMAGE) of PcdPerformanceLibraryProp= ertyMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_START_IMAGE_BEGIN(ModuleHandle) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_CORE_START_IMAGE)) { \ + LogPerformanceMeasurement (ModuleHandle, NULL, NULL, 0, MODULE_START= _ID); \ + } \ + } while (FALSE) + +/** + End Macro to measure the performance of StartImage in core. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT1 (dsiable PERF_CORE_START_IMAGE)of PcdPerformanceLibraryProp= ertyMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_START_IMAGE_END(ModuleHandle) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_CORE_START_IMAGE)) { \ + LogPerformanceMeasurement (ModuleHandle, NULL, NULL, 0, MODULE_END_I= D); \ + } \ + } while (FALSE) + +/** + Begin Macro to measure the performance of LoadImage in core. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT2 (dsiable PERF_CORE_LOAD_IAMGE) of PcdPerformanceLibraryProp= ertyMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_LOAD_IMAGE_BEGIN(ModuleHandle) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_CORE_LOAD_IMAGE)) { \ + LogPerformanceMeasurement (ModuleHandle, NULL, NULL, 0, MODULE_LOADI= MAGE_START_ID); \ + } \ + } while (FALSE) + +/** + End Macro to measure the performance of LoadImage in core. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT2 (dsiable PERF_CORE_LOAD_IAMGE) of PcdPerformanceLibraryProp= ertyMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_LOAD_IMAGE_END(ModuleHandle) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_CORE_LOAD_IMAGE)) { \ + LogPerformanceMeasurement (ModuleHandle, NULL, NULL, 0, MODULE_LOADI= MAGE_END_ID); \ + } \ + } while (FALSE) + +/** + Start Macro to measure the performance of DriverBinding Support in core. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT3 (dsiable PERF_CORE_DB_SUPPORT) of PcdPerformanceLibraryProp= ertyMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_DRIVER_BINDING_SUPPORT_BEGIN(ModuleHandle, ControllerHandle) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_CORE_DB_SUPPORT)) { \ + LogPerformanceMeasurement (ModuleHandle, NULL, NULL, (UINT64)(UINTN)= ControllerHandle, MODULE_DB_SUPPORT_START_ID); \ + } \ + } while (FALSE) + +/** + End Macro to measure the performance of DriverBinding Support in core. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT3 (dsiable PERF_CORE_DB_SUPPORT) of PcdPerformanceLibraryProp= ertyMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_DRIVER_BINDING_SUPPORT_END(ModuleHandle, ControllerHandle) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_CORE_DB_SUPPORT)) { \ + LogPerformanceMeasurement (ModuleHandle, NULL, NULL, (UINT64)(UINTN)= ControllerHandle, MODULE_DB_SUPPORT_END_ID); \ + } \ + } while (FALSE) + +/** + Begin Macro to measure the performance of DriverBinding Start in core. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT4 (dsiable PERF_CORE_DB_START) of PcdPerformanceLibraryProper= tyMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_DRIVER_BINDING_START_BEGIN(ModuleHandle, ControllerHandle) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_CORE_DB_START)) { \ + LogPerformanceMeasurement (ModuleHandle, NULL, NULL, (UINT64)(UINTN)= ControllerHandle, MODULE_DB_START_ID); \ + } \ + } while (FALSE) + +/** + End Macro to measure the performance of DriverBinding Start in core. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT4 (dsiable PERF_CORE_DB_START) of PcdPerformanceLibraryProper= tyMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_DRIVER_BINDING_START_END(ModuleHandle, ControllerHandle) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_CORE_DB_START)) { \ + LogPerformanceMeasurement (ModuleHandle, NULL, NULL, (UINT64)(UINTN)= ControllerHandle, MODULE_DB_END_ID); \ + } \ + } while (FALSE) + +/** + Start Macro to measure the performance of DriverBinding Stop in core. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT5 (dsiable PERF_CORE_DB_STOP) of PcdPerformanceLibraryPropert= yMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_DRIVER_BINDING_STOP_BEGIN(ModuleHandle, ControllerHandle) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_CORE_DB_STOP)) { \ + LogPerformanceMeasurement (ModuleHandle, NULL, NULL, (UINT64)(UINTN)= ControllerHandle, MODULE_DB_STOP_START_ID); \ + } \ + } while (FALSE) + +/** + End Macro to measure the performance of DriverBinding Stop in core. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT5 (dsiable PERF_CORE_DB_STOP) of PcdPerformanceLibraryPropert= yMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_DRIVER_BINDING_STOP_END(ModuleHandle, ControllerHandle) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_CORE_DB_STOP)) { \ + LogPerformanceMeasurement (ModuleHandle, NULL, NULL, (UINT64)(UINTN)= ControllerHandle, MODULE_DB_STOP_END_ID); \ + } \ + } while (FALSE) + +/** + Macro to measure the time from power-on to this macro execution. + It can be used to log a meaningful thing which happens at a time point. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT6 (dsiable PERF_GENERAL_TYPE) of PcdPerformanceLibraryPropert= yMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_EVENT(EventString) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_GENERAL_TYPE)) { \ + LogPerformanceMeasurement (&gEfiCallerIdGuid, NULL, EventString , 0,= PERF_EVENT_ID); \ + } \ + } while (FALSE) + +/** + Begin Macro to measure the perofrmance of evnent signal behavior in any = module. + The event guid will be passed with this macro. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT6 (dsiable PERF_GENERAL_TYPE) of PcdPerformanceLibraryPropert= yMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_EVENT_SIGNAL_BEGIN(EventGuid) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_GENERAL_TYPE)) { \ + LogPerformanceMeasurement (&gEfiCallerIdGuid, EventGuid, __FUNCTION_= _ , 0, PERF_EVENTSIGNAL_START_ID); \ + } \ + } while (FALSE) + +/** + End Macro to measure the perofrmance of evnent signal behavior in any mo= dule. + The event guid will be passed with this macro. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT6 (dsiable PERF_GENERAL_TYPE) of PcdPerformanceLibraryPropert= yMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_EVENT_SIGNAL_END(EventGuid) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_GENERAL_TYPE)) { \ + LogPerformanceMeasurement (&gEfiCallerIdGuid, EventGuid, __FUNCTION_= _ , 0, PERF_EVENTSIGNAL_END_ID); \ + } \ + } while (FALSE) + +/** + Begin Macro to measure the perofrmance of a callback function in any mod= ule. + The event guid which trigger the callback function will be passed with t= his macro. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT6 (dsiable PERF_GENERAL_TYPE) of PcdPerformanceLibraryPropert= yMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_CALLBACK_BEGIN(TriggerGuid) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_GENERAL_TYPE)) { \ + LogPerformanceMeasurement (&gEfiCallerIdGuid, TriggerGuid, __FUNCTIO= N__ , 0, PERF_CALLBACK_START_ID); \ + } \ + } while (FALSE) + +/** + End Macro to measure the perofrmance of a callback function in any modul= e. + The event guid which trigger the callback function will be passed with t= his macro. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT6 (dsiable PERF_GENERAL_TYPE) of PcdPerformanceLibraryPropert= yMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_CALLBACK_END(TriggerGuid) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_GENERAL_TYPE)) { \ + LogPerformanceMeasurement (&gEfiCallerIdGuid, TriggerGuid, __FUNCTIO= N__ , 0, PERF_CALLBACK_END_ID); \ + } \ + } while (FALSE) + +/** + Begin Macro to measure the perofrmance of a general function in any modu= le. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT6 (dsiable PERF_GENERAL_TYPE) of PcdPerformanceLibraryPropert= yMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_FUNCTION_BEGIN() \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_GENERAL_TYPE)) { \ + LogPerformanceMeasurement (&gEfiCallerIdGuid, NULL, __FUNCTION__ , 0= , PERF_FUNCTION_START_ID); \ + } \ + } while (FALSE) + +/** + End Macro to measure the perofrmance of a general function in any module. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT6 (dsiable PERF_GENERAL_TYPE) of PcdPerformanceLibraryPropert= yMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_FUNCTION_END() \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_GENERAL_TYPE)) { \ + LogPerformanceMeasurement (&gEfiCallerIdGuid, NULL, __FUNCTION__ , 0= , PERF_FUNCTION_END_ID); \ + } \ + } while (FALSE) + +/** + Begin Macro to measure the perofrmance of a behavior within one module. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT6 (dsiable PERF_GENERAL_TYPE) of PcdPerformanceLibraryPropert= yMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_INMODULE_BEGIN(MeasurementString) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_GENERAL_TYPE)) { \ + LogPerformanceMeasurement (&gEfiCallerIdGuid, NULL, MeasurementStrin= g, 0, PERF_INMODULE_START_ID); \ + } \ + } while (FALSE) + +/** + End Macro to measure the perofrmance of a behavior within one module. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT6 (dsiable PERF_GENERAL_TYPE) of PcdPerformanceLibraryPropert= yMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_INMODULE_END(MeasurementString) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_GENERAL_TYPE)) { \ + LogPerformanceMeasurement (&gEfiCallerIdGuid, NULL, MeasurementStrin= g, 0, PERF_INMODULE_END_ID); \ + } \ + } while (FALSE) + +/** + Begin Macro to measure the perofrmance of a behavior in different module= s. + Such as the performance of PEI phase, DXE phase, BDS phase. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT6 (dsiable PERF_GENERAL_TYPE) of PcdPerformanceLibraryPropert= yMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_CROSSMODULE_BEGIN(MeasurementString) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_GENERAL_TYPE)) { \ + LogPerformanceMeasurement (&gEfiCallerIdGuid, NULL, MeasurementStrin= g, 0, PERF_CROSSMODULE_START_ID); \ + } \ + } while (FALSE) + +/** + End Macro to measure the perofrmance of a behavior in different modules. + Such as the performance of PEI phase, DXE phase, BDS phase. + + If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, + and the BIT6 (dsiable PERF_GENERAL_TYPE) of PcdPerformanceLibraryPropert= yMask is not set. + then LogPerformanceMeasurement() is called. + +**/ +#define PERF_CROSSMODULE_END(MeasurementString) \ + do { \ + if (LogPerformanceMeasurementEnabled (PERF_GENERAL_TYPE)) { \ + LogPerformanceMeasurement (&gEfiCallerIdGuid, NULL, MeasurementStrin= g, 0, PERF_CROSSMODULE_END_ID); \ + } \ + } while (FALSE) + /** Macro that calls EndPerformanceMeasurement(). =20 If the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of PcdPerfor= manceLibraryPropertyMask is set, then EndPerformanceMeasurement() is called. diff --git a/MdePkg/Library/BasePerformanceLibNull/PerformanceLib.c b/MdePk= g/Library/BasePerformanceLibNull/PerformanceLib.c index e35235d9a29..a68ea90d4f0 100644 --- a/MdePkg/Library/BasePerformanceLibNull/PerformanceLib.c +++ b/MdePkg/Library/BasePerformanceLibNull/PerformanceLib.c @@ -1,9 +1,9 @@ /** @file Base Performance Library which provides no service. =20 - Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BS= D License which accompanies this distribution. The full text of the license may b= e found at http://opensource.org/licenses/bsd-license.php. =20 @@ -302,5 +302,60 @@ PerformanceMeasurementEnabled ( VOID ) { return (BOOLEAN) ((PcdGet8(PcdPerformanceLibraryPropertyMask) & PERFORMA= NCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED) !=3D 0); } + +/** + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID + @param Guid - Pointer to a GUID + @param String - Pointer to a string describing the measurement + @param Address - Pointer to a location in memory relevant to t= he measurement + @param Identifier - Performance identifier describing the type of= measurement + + @retval RETURN_SUCCESS - Successfully created performance reco= rd + @retval RETURN_OUT_OF_RESOURCES - Ran out of space to store the records + @retval RETURN_INVALID_PARAMETER - Invalid parameter passed to function = - NULL + pointer or invalid PerfId + +**/ +RETURN_STATUS +EFIAPI +LogPerformanceMeasurement ( + IN CONST VOID *CallerIdentifier,OPTIONAL + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT32 Identifier + ) +{ + return RETURN_SUCCESS; +} + +/** + Check whether the specified performance measurement can be logged. + + This function returns TRUE when the PERFORMANCE_LIBRARY_PROPERTY_MEASURE= MENT_ENABLED bit of PcdPerformanceLibraryPropertyMask is set + and the Type disable bit in PcdPerformanceLibraryPropertyMask is not set. + + @param Type - Type of the performance measurement entry. + + @retval TRUE The performance measurement can be logged. + @retval FALSE The performance measurement can NOT be logged. + +**/ +BOOLEAN +EFIAPI +LogPerformanceMeasurementEnabled ( + IN CONST UINTN Type + ) +{ + // + // When Performance measurement is enabled and the type is not filtered,= the performance can be logged. + // + if (PerformanceMeasurementEnabled () && (PcdGet8(PcdPerformanceLibraryPr= opertyMask) & Type) =3D=3D 0) { + return TRUE; + } + return FALSE; +} diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index 0e64f22f4a7..432de804c5d 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -2167,12 +2167,19 @@ # @Prompt Value to Clear Memory. gEfiMdePkgTokenSpaceGuid.PcdDebugClearMemoryValue|0xAF|UINT8|0x00000008 =20 ## The mask is used to control PerformanceLib behavior.

# BIT0 - Enable Performance Measurement.
+ # BIT1 - Disable Start Image Logging.
+ # BIT2 - Disable Load Image logging.
+ # BIT3 - Disable Binding Support logging.
+ # BIT4 - Disable Binding Start logging.
+ # BIT5 - Disable Binding Stop logging.
+ # BIT6 - Disable all other general Perfs.
+ # BIT1-BIT6 are evaluated when BIT0 is set.
# @Prompt Performance Measurement Property. - # @Expression 0x80000002 | (gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibr= aryPropertyMask & 0xFE) =3D=3D 0 + # @Expression 0x80000002 | (gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibr= aryPropertyMask & 0x80) =3D=3D 0 gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask|0|UINT8|0x000= 00009 =20 ## The mask is used to control PostCodeLib behavior.

# BIT0 - Enable Post Code.
# BIT1 - Enable Post Code with Description.
diff --git a/MdePkg/MdePkg.uni b/MdePkg/MdePkg.uni index a110e453df8..18bb01f2199 100644 --- a/MdePkg/MdePkg.uni +++ b/MdePkg/MdePkg.uni @@ -243,10 +243,16 @@ =20 #string STR_gEfiMdePkgTokenSpaceGuid_PcdPerformanceLibraryPropertyMask_PRO= MPT #language en-US "Performance Measurement Property" =20 #string STR_gEfiMdePkgTokenSpaceGuid_PcdPerformanceLibraryPropertyMask_HEL= P #language en-US "The mask is used to control PerformanceLib behavior.
\n" = "BIT0 - Enable Performance Measurement.
" + = "BIT1 - Disable Start Image Logging.
" + = "BIT2 - Disable Load Image logging.
" + = "BIT3 - Disable Binding Support logging.
" + = "BIT4 - Disable Binding Start logging.
" + = "BIT5 - Disable Binding Stop logging.
" + = "BIT6 - Disable all other general Perfs.
" =20 #string STR_gEfiMdePkgTokenSpaceGuid_PcdPostCodePropertyMask_PROMPT #lang= uage en-US "Post Code Property" =20 #string STR_gEfiMdePkgTokenSpaceGuid_PcdPostCodePropertyMask_HELP #langua= ge en-US "The mask is used to control PostCodeLib behavior.

\n" = "BIT0 - Enable Post Code.
\n" --=20 2.14.3.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Sun May 5 09:12:48 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1529393180251556.8749059419616; Tue, 19 Jun 2018 00:26:20 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id F1A5F202E5487; Tue, 19 Jun 2018 00:26:17 -0700 (PDT) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 0F270202E5469 for ; Tue, 19 Jun 2018 00:26:17 -0700 (PDT) Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jun 2018 00:26:16 -0700 Received: from shwdeopenpsi114.ccr.corp.intel.com ([10.239.157.135]) by orsmga006.jf.intel.com with ESMTP; 19 Jun 2018 00:26:16 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.88; helo=mga01.intel.com; envelope-from=dandan.bi@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,242,1526367600"; d="scan'208";a="51022255" From: Dandan Bi To: edk2-devel@lists.01.org Date: Tue, 19 Jun 2018 15:24:00 +0800 Message-Id: <20180619072405.142872-5-dandan.bi@intel.com> X-Mailer: git-send-email 2.14.3.windows.1 In-Reply-To: <20180619072405.142872-1-dandan.bi@intel.com> References: <20180619072405.142872-1-dandan.bi@intel.com> Subject: [edk2] [patch 4/9] MdeModulePkg/ExtendedFirmwarePerf: Remove PerfId definitions X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Star Zeng , Liming Gao MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Remove the definitions of performance identifier since they have been added into PerformanceLib.h. Cc: Liming Gao Cc: Star Zeng Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi --- .../Include/Guid/ExtendedFirmwarePerformance.h | 25 ------------------= ---- 1 file changed, 25 deletions(-) diff --git a/MdeModulePkg/Include/Guid/ExtendedFirmwarePerformance.h b/MdeM= odulePkg/Include/Guid/ExtendedFirmwarePerformance.h index f2db02ddf49..465b4082750 100644 --- a/MdeModulePkg/Include/Guid/ExtendedFirmwarePerformance.h +++ b/MdeModulePkg/Include/Guid/ExtendedFirmwarePerformance.h @@ -30,35 +30,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITH= ER EXPRESS OR IMPLIED. #define DRIVERBINDING_STOP_TOK "DB:Stop:" ///< Driver Bind= ing Stop() function call #define LOAD_IMAGE_TOK "LoadImage:" ///< Load a disp= atched module #define START_IMAGE_TOK "StartImage:" ///< Dispatched = Modules Entry Point execution #define PEIM_TOK "PEIM" ///< PEIM Module= s Entry Point execution =20 -// -// Public Progress Identifiers for Event Records to map the above known to= ken -// -#define MODULE_START_ID 0x01 -#define MODULE_END_ID 0x02 -#define MODULE_LOADIMAGE_START_ID 0x03 -#define MODULE_LOADIMAGE_END_ID 0x04 -#define MODULE_DB_START_ID 0x05 -#define MODULE_DB_END_ID 0x06 -#define MODULE_DB_SUPPORT_START_ID 0x07 -#define MODULE_DB_SUPPORT_END_ID 0x08 -#define MODULE_DB_STOP_START_ID 0x09 -#define MODULE_DB_STOP_END_ID 0x0A - -#define PERF_EVENTSIGNAL_START_ID 0x10 -#define PERF_EVENTSIGNAL_END_ID 0x11 -#define PERF_CALLBACK_START_ID 0x20 -#define PERF_CALLBACK_END_ID 0x21 -#define PERF_FUNCTION_START_ID 0x30 -#define PERF_FUNCTION_END_ID 0x31 -#define PERF_INMODULE_START_ID 0x40 -#define PERF_INMODULE_END_ID 0x41 -#define PERF_CROSSMODULE_START_ID 0x50 -#define PERF_CROSSMODULE_END_ID 0x51 - // // Misc defines // #define FPDT_RECORD_REVISION_1 (0x01) =20 --=20 2.14.3.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Sun May 5 09:12:48 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1529393190097414.79782512299766; Tue, 19 Jun 2018 00:26:30 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 3C7E2211299BD; Tue, 19 Jun 2018 00:26:29 -0700 (PDT) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D06AF210DC1B0 for ; Tue, 19 Jun 2018 00:26:27 -0700 (PDT) Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jun 2018 00:26:27 -0700 Received: from shwdeopenpsi114.ccr.corp.intel.com ([10.239.157.135]) by orsmga006.jf.intel.com with ESMTP; 19 Jun 2018 00:26:26 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.24; helo=mga09.intel.com; envelope-from=dandan.bi@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,242,1526367600"; d="scan'208";a="51022272" From: Dandan Bi To: edk2-devel@lists.01.org Date: Tue, 19 Jun 2018 15:24:01 +0800 Message-Id: <20180619072405.142872-6-dandan.bi@intel.com> X-Mailer: git-send-email 2.14.3.windows.1 In-Reply-To: <20180619072405.142872-1-dandan.bi@intel.com> References: <20180619072405.142872-1-dandan.bi@intel.com> Subject: [edk2] [patch 5/9] MdeModulePkg: Update performance library instances X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Star Zeng , Liming Gao MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Update the performance library instances in MdeModulePkg to implement the APIs used for new added Perf macros. Cc: Liming Gao Cc: Star Zeng Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi --- .../DxeCorePerformanceLib/DxeCorePerformanceLib.c | 664 +++++++++++++++++= ++-- .../DxeCorePerformanceLib.inf | 1 + .../DxeCorePerformanceLibInternal.h | 1 + .../Library/DxePerformanceLib/DxePerformanceLib.c | 68 +++ .../Library/PeiPerformanceLib/PeiPerformanceLib.c | 442 ++++++++++++-- .../SmmCorePerformanceLib/SmmCorePerformanceLib.c | 440 ++++++++++++-- .../Library/SmmPerformanceLib/SmmPerformanceLib.c | 68 +++ 7 files changed, 1550 insertions(+), 134 deletions(-) diff --git a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceL= ib.c b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c index 79820605184..68724ce9e1c 100644 --- a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c +++ b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c @@ -69,17 +69,19 @@ UINTN mCachePairCount =3D 0; UINT32 mLoadImageCount =3D 0; UINT32 mPerformanceLength =3D 0; UINT32 mMaxPerformanceLength =3D 0; UINT32 mBootRecordSize =3D 0; UINT32 mBootRecordMaxSize =3D 0; +UINT32 mCachedLength =3D 0; =20 BOOLEAN mFpdtBufferIsReported =3D FALSE; BOOLEAN mLackSpaceIsReported =3D FALSE; CHAR8 *mPlatformLanguage =3D NULL; UINT8 *mPerformancePointer =3D NULL; UINT8 *mBootRecordBuffer =3D NULL; BOOLEAN mLockInsertRecord =3D FALSE; +CHAR8 *mDevicePathString =3D NULL; =20 EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *mDevicePathToText =3D NULL; =20 // // Interfaces for PerformanceMeasurement Protocol. @@ -88,10 +90,64 @@ EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL mPerformanceMeas= urementInterface =3D { CreatePerformanceMeasurement, }; =20 PERFORMANCE_PROPERTY mPerformanceProperty; =20 +/** + Return the pointer to the FPDT record in the allocated memory. + + @param RecordSize The size of FPDT record. + @param FpdtRecordPtr Pointer the FPDT record in the allocated = memory. + + @retval EFI_SUCCESS Successfully get the pointer to the FPDT = record. + @retval EFI_OUT_OF_RESOURCES Ran out of space to store the records. +**/ +EFI_STATUS +GetFpdtRecordPtr ( + IN UINT8 RecordSize, + IN OUT FPDT_RECORD_PTR *FpdtRecordPtr +) +{ + if (mFpdtBufferIsReported) { + // + // Append Boot records to the boot performance table. + // + if (mBootRecordSize + RecordSize > mBootRecordMaxSize) { + if (!mLackSpaceIsReported) { + DEBUG ((DEBUG_INFO, "DxeCorePerformanceLib: No enough space to sav= e boot records\n")); + mLackSpaceIsReported =3D TRUE; + } + return EFI_OUT_OF_RESOURCES; + } else { + // + // Save boot record into BootPerformance table + // + FpdtRecordPtr->RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECOR= D_HEADER *)(mBootRecordBuffer + mBootRecordSize); + } + } else { + // + // Check if pre-allocated buffer is full + // + if (mPerformanceLength + RecordSize > mMaxPerformanceLength) { + mPerformancePointer =3D ReallocatePool ( + mPerformanceLength, + mPerformanceLength + RecordSize + FIRMWARE_R= ECORD_BUFFER, + mPerformancePointer + ); + if (mPerformancePointer =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + mMaxPerformanceLength =3D mPerformanceLength + RecordSize + FIRMWARE= _RECORD_BUFFER; + } + // + // Covert buffer to FPDT Ptr Union type. + // + FpdtRecordPtr->RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_= HEADER *)(mPerformancePointer + mPerformanceLength); + } + return EFI_SUCCESS; +} + /** Check whether the Token is a known one which is uesed by core. =20 @param Token Pointer to a Null-terminated ASCII string =20 @@ -814,49 +870,13 @@ InsertFpdtMeasurement ( Identifier +=3D 1; } RecordInfo.ProgressID =3D (UINT16)Identifier; } =20 - if (mFpdtBufferIsReported) { - // - // Append Boot records to the boot performance table. - // - if (mBootRecordSize + RecordInfo.RecordSize > mBootRecordMaxSize) { - if (!mLackSpaceIsReported) { - DEBUG ((DEBUG_INFO, "DxeCorePerformanceLib: No enough space to sav= e boot records\n")); - mLackSpaceIsReported =3D TRUE; - } - return EFI_OUT_OF_RESOURCES; - } else { - // - // Save boot record into BootPerformance table - // - FpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD= _HEADER *)(mBootRecordBuffer + mBootRecordSize); - mBootRecordSize +=3D RecordInfo.RecordSize; - mAcpiBootPerformanceTable->Header.Length +=3D RecordInfo.RecordSize; - } - } else { - // - // Check if pre-allocated buffer is full - // - if (mPerformanceLength + RecordInfo.RecordSize > mMaxPerformanceLength= ) { - mPerformancePointer =3D ReallocatePool ( - mPerformanceLength, - mPerformanceLength + RecordInfo.RecordSize += FIRMWARE_RECORD_BUFFER, - mPerformancePointer - ); - - if (mPerformancePointer =3D=3D NULL) { - return EFI_OUT_OF_RESOURCES; - } - mMaxPerformanceLength =3D mPerformanceLength + RecordInfo.RecordSize= + FIRMWARE_RECORD_BUFFER; - } - // - // Covert buffer to FPDT Ptr Union type. - // - FpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_H= EADER *)(mPerformancePointer + mPerformanceLength); - mPerformanceLength +=3D RecordInfo.RecordSize; + Status =3D GetFpdtRecordPtr (RecordInfo.RecordSize, &FpdtRecordPtr); + if (EFI_ERROR (Status)) { + return Status; } =20 // // Get the TimeStamp. // @@ -942,11 +962,16 @@ InsertFpdtMeasurement ( // // Record is not supported in current DXE phase, return EFI_ABORTED // return EFI_UNSUPPORTED; } - + if (mFpdtBufferIsReported) { + mBootRecordSize +=3D FpdtRecordPtr.RecordHeader->Length; + mAcpiBootPerformanceTable->Header.Length +=3D FpdtRecordPtr.RecordHead= er->Length; + } else { + mPerformanceLength +=3D FpdtRecordPtr.RecordHeader->Length; + } return EFI_SUCCESS; } =20 /** Dumps all the PEI performance. @@ -1038,10 +1063,512 @@ ReportFpdtRecordBuffer ( // mFpdtBufferIsReported =3D TRUE; } } =20 +/** + Get a string description for device for the given controller handle. + If ComponentName2 GetControllerName is supported, the value is + included in the string,followed by device path, otherwise just device pa= th. + + @param Handle - Image handle + @param ControllerHandle - Controller handle. + @param Length - Pointer to record length to be updated + + @retval EFI_SUCCESS - Successfully got string description for device + @retval EFI_UNSUPPORTED - Neither ComponentName2 ControllerName nor Devi= cePath were found. + +**/ +EFI_STATUS +GetDeviceInfoFromHandleAndUpdateLength ( + IN CONST VOID *Handle, + IN EFI_HANDLE ControllerHandle, + IN OUT UINT8 *Length + ) +{ + EFI_DEVICE_PATH_PROTOCOL *DevicePathProtocol; + EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2; + EFI_STATUS Status; + CHAR16 *StringPtr; + CHAR8 *AsciiStringPtr; + UINTN ControllerNameStringSize; + UINTN DevicePathStringSize; + + ControllerNameStringSize =3D 0; + + Status =3D gBS->HandleProtocol ( + (EFI_HANDLE) Handle, + &gEfiComponentName2ProtocolGuid, + (VOID **) &ComponentName2 + ); + + if (!EFI_ERROR(Status)) { + // + // Get the current platform language setting + // + if (mPlatformLanguage =3D=3D NULL) { + GetEfiGlobalVariable2 (L"PlatformLang", (VOID **)&mPlatformLanguage,= NULL); + } + + Status =3D ComponentName2->GetControllerName ( + ComponentName2, + ControllerHandle, + NULL, + mPlatformLanguage !=3D NULL ? mPlatformLang= uage:"en-US", + &StringPtr + ); + } + + if (!EFI_ERROR (Status)) { + // + // This will produce the size of the unicode string, which is twice as= large as the ASCII one + // This must be an even number, so ok to divide by 2 + // + ControllerNameStringSize =3D StrSize(StringPtr) / 2; + + // + // The + 1 is because we want to add a space between the ControllerNam= e and the device path + // + if ((ControllerNameStringSize + (*Length) + 1) > FPDT_MAX_PERF_RECORD_= SIZE) { + // + // Only copy enough to fill MAX_PERF_RECORD_SIZE worth of the record + // + ControllerNameStringSize =3D FPDT_MAX_PERF_RECORD_SIZE - (*Length) -= 1; + } + + mDevicePathString =3D AllocateZeroPool (ControllerNameStringSize + 1); + if (mDevicePathString =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + UnicodeStrToAsciiStrS(StringPtr, mDevicePathString, ControllerNameStri= ngSize); + + // + // Add a space in the end of the ControllerName + // + AsciiStringPtr =3D mDevicePathString + ControllerNameStringSize - 1; + *AsciiStringPtr =3D 0x20; + AsciiStringPtr++; + *AsciiStringPtr =3D 0; + ControllerNameStringSize++; + + *Length +=3D (UINT8)ControllerNameStringSize; + } + + // + // This function returns the device path protocol from the handle specif= ied by Handle. If Handle is + // NULL or Handle does not contain a device path protocol, then NULL is = returned. + // + DevicePathProtocol =3D DevicePathFromHandle(ControllerHandle); + + if (DevicePathProtocol !=3D NULL) { + StringPtr =3D ConvertDevicePathToText (DevicePathProtocol, TRUE, FALSE= ); + if (StringPtr !=3D NULL) { + // + // This will produce the size of the unicode string, which is twice = as large as the ASCII one + // This must be an even number, so ok to divide by 2 + // + DevicePathStringSize =3D StrSize(StringPtr) / 2; + + if ((DevicePathStringSize + (*Length)) > FPDT_MAX_PERF_RECORD_SIZE) { + // + // Only copy enough to fill MAX_PERF_RECORD_SIZE worth of the reco= rd + // + DevicePathStringSize =3D FPDT_MAX_PERF_RECORD_SIZE - (*Length); + } + if (ControllerNameStringSize !=3D 0) { + mDevicePathString =3D ReallocatePool( + ControllerNameStringSize + 1, + ControllerNameStringSize + DevicePathStringSize = + 1, + mDevicePathString + ); + } else { + mDevicePathString =3D AllocateZeroPool(DevicePathStringSize + 1); + } + if (mDevicePathString =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + if (ControllerNameStringSize !=3D 0) { + AsciiStringPtr =3D mDevicePathString + ControllerNameStringSize - = 1; + } else { + AsciiStringPtr =3D mDevicePathString; + } + + UnicodeStrToAsciiStrS(StringPtr, AsciiStringPtr, DevicePathStringSiz= e); + *Length +=3D (UINT8)DevicePathStringSize; + return EFI_SUCCESS; + } + } + + return EFI_UNSUPPORTED; +} + +/** + Get the FPDT record size. + + @param Handle Pointer to environment specific context= used + to identify the component being measure= d. + @param String Pointer to a Null-terminated ASCII stri= ng + that identifies the component being mea= sured. + @param Address Pointer to a location in memory relevan= t to the measurement. + For DriverBinding Perf, it's the Contro= ller handle. + For other Perf, it's NULL. + @param PerfId Performance identifier. + @param RecordSize On return, pointer to the size of recor= d. + + @retval EFI_SUCCESS Get record size successfully. + @retval EFI_INVALID_PARAMETER Invalid Performance identifier. + +**/ +EFI_STATUS +GetFpdtRecordSize ( + IN CONST VOID *Handle, + IN CONST CHAR8 *String, + IN UINT64 Address, + IN UINT16 PerfId, + OUT UINT8 *RecordSize + ) +{ + UINTN StringSize; + + if (PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + if (PerfId =3D=3D MODULE_DB_SUPPORT_START_ID || PerfId =3D=3D MODULE_= DB_SUPPORT_END_ID) { + return EFI_UNSUPPORTED; + } + *RecordSize =3D (UINT8)(sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD) + ST= RING_SIZE); + } else { + switch (PerfId) { + case MODULE_START_ID: + case MODULE_END_ID: + *RecordSize =3D sizeof (FPDT_GUID_EVENT_RECORD); + break; + + case MODULE_LOADIMAGE_START_ID: + case MODULE_LOADIMAGE_END_ID: + *RecordSize =3D sizeof (FPDT_GUID_QWORD_EVENT_RECORD); + break; + + case MODULE_DB_START_ID: + case MODULE_DB_SUPPORT_START_ID: + case MODULE_DB_SUPPORT_END_ID: + case MODULE_DB_STOP_START_ID: + case MODULE_DB_STOP_END_ID: + *RecordSize =3D sizeof (FPDT_GUID_QWORD_EVENT_RECORD); + break; + + case MODULE_DB_END_ID: + *RecordSize =3D sizeof (FPDT_GUID_QWORD_STRING_EVENT_RECORD); + GetDeviceInfoFromHandleAndUpdateLength(Handle, (EFI_HANDLE)(UINTN)Ad= dress, RecordSize); + break; + + case PERF_EVENTSIGNAL_START_ID: + case PERF_EVENTSIGNAL_END_ID: + case PERF_CALLBACK_START_ID: + case PERF_CALLBACK_END_ID: + if (String =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + StringSize =3D AsciiStrSize (String); + if (StringSize > STRING_SIZE) { + StringSize =3D STRING_SIZE; + } + *RecordSize =3D (UINT8)(sizeof (FPDT_DUAL_GUID_STRING_EVENT_RECORD) = + StringSize); + break; + + case PERF_EVENT_ID: + case PERF_FUNCTION_START_ID: + case PERF_FUNCTION_END_ID: + case PERF_INMODULE_START_ID: + case PERF_INMODULE_END_ID: + case PERF_CROSSMODULE_START_ID: + case PERF_CROSSMODULE_END_ID: + if (String =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + StringSize =3D AsciiStrSize (String); + if (StringSize > STRING_SIZE) { + StringSize =3D STRING_SIZE; + } + *RecordSize =3D (UINT8)(sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD) + = StringSize); + break; + + default: + return EFI_INVALID_PARAMETER; + } + } + + return EFI_SUCCESS; +} + +/** + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID. + @param Guid - Pointer to a GUID + @param String - Pointer to a string describing the measurement + @param Address - Pointer to a location in memory relevant to t= he measurement + @param PerfId - Performance identifier describing the type of= measurement + + @retval EFI_SUCCESS - Successfully created performance record + @retval EFI_OUT_OF_RESOURCES - Ran out of space to store the records + @retval EFI_INVALID_PARAMETER - Invalid parameter passed to function - N= ULL + pointer or invalid PerfId + +**/ +EFI_STATUS +InsertFpdtRecord ( + IN CONST VOID *CallerIdentifier, OPTIONAL + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT16 PerfId + ) +{ + EFI_GUID ModuleGuid; + CHAR8 ModuleName[FPDT_STRING_EVENT_RECORD_NAME_LE= NGTH]; + FPDT_RECORD_PTR FpdtRecordPtr; + FPDT_RECORD_PTR CachedFpdtRecordPtr; + UINT64 TimeStamp; + UINT64 TimeStampCounter; + CONST CHAR8 *StringPtr; + UINT8 RecordSize; + UINTN DestMax; + UINTN StringLen; + EFI_STATUS Status; + + StringPtr =3D NULL; + RecordSize =3D 0; + ZeroMem (ModuleName, sizeof (ModuleName)); + + Status =3D GetFpdtRecordSize(CallerIdentifier, String, Address, PerfId, = &RecordSize); + if (EFI_ERROR (Status)) { + return Status; + } + + Status =3D GetFpdtRecordPtr (RecordSize, &FpdtRecordPtr); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get the TimeStamp. + // + TimeStampCounter =3D GetPerformanceCounter (); + TimeStamp =3D GetTimeInNanoSecond (TimeStampCounter); + + switch (PerfId) { + case MODULE_START_ID: + case MODULE_END_ID: + // + // Get the ModuleGuid and ModuleName from the handle. + // + GetModuleInfoFromHandle ((EFI_HANDLE *)CallerIdentifier, ModuleName, s= izeof (ModuleName), &ModuleGuid); + StringPtr =3D ModuleName; + if (PerfId =3D=3D MODULE_START_ID) { + if (mFpdtBufferIsReported) { + mCachedLength =3D mBootRecordSize; + } else { + mCachedLength =3D mPerformanceLength; + } + } + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.GuidEvent->Header.Type =3D FPDT_GUID_EV= ENT_TYPE; + FpdtRecordPtr.GuidEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.GuidEvent->Header.Revision =3D FPDT_RECORD_= REVISION_1; + FpdtRecordPtr.GuidEvent->ProgressID =3D PerfId; + FpdtRecordPtr.GuidEvent->Timestamp =3D TimeStamp; + CopyMem (&FpdtRecordPtr.GuidEvent->Guid, &ModuleGuid, sizeof (FpdtRe= cordPtr.GuidEvent->Guid)); + if (PerfId =3D=3D MODULE_END_ID && mCachedLength !=3D 0) { + if (mFpdtBufferIsReported) { + CachedFpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMA= NCE_RECORD_HEADER *)(mBootRecordBuffer + mCachedLength); + } else { + CachedFpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMA= NCE_RECORD_HEADER *)(mPerformancePointer + mCachedLength); + } + CopyMem (&CachedFpdtRecordPtr.GuidEvent->Guid, &ModuleGuid, sizeof= (CachedFpdtRecordPtr.GuidEvent->Guid)); + mCachedLength =3D 0; + } + } + break; + + case MODULE_LOADIMAGE_START_ID: + case MODULE_LOADIMAGE_END_ID: + GetModuleInfoFromHandle ((EFI_HANDLE *)CallerIdentifier, ModuleName, s= izeof (ModuleName), &ModuleGuid); + StringPtr =3D ModuleName; + if (PerfId =3D=3D MODULE_LOADIMAGE_START_ID) { + mLoadImageCount ++; + if (mFpdtBufferIsReported) { + mCachedLength =3D mBootRecordSize; + } else { + mCachedLength =3D mPerformanceLength; + } + } + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.GuidQwordEvent->Header.Type =3D FPDT_GUID_QW= ORD_EVENT_TYPE; + FpdtRecordPtr.GuidQwordEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.GuidQwordEvent->Header.Revision =3D FPDT_RECORD_= REVISION_1; + FpdtRecordPtr.GuidQwordEvent->ProgressID =3D PerfId; + FpdtRecordPtr.GuidQwordEvent->Timestamp =3D TimeStamp; + FpdtRecordPtr.GuidQwordEvent->Qword =3D mLoadImageCo= unt; + CopyMem (&FpdtRecordPtr.GuidQwordEvent->Guid, &ModuleGuid, sizeof (F= pdtRecordPtr.GuidQwordEvent->Guid)); + if (PerfId =3D=3D MODULE_LOADIMAGE_END_ID && mCachedLength !=3D 0) { + if (mFpdtBufferIsReported) { + CachedFpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMA= NCE_RECORD_HEADER *)(mBootRecordBuffer + mCachedLength); + } else { + CachedFpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMA= NCE_RECORD_HEADER *)(mPerformancePointer + mCachedLength); + } + CopyMem (&CachedFpdtRecordPtr.GuidQwordEvent->Guid, &ModuleGuid, s= izeof (CachedFpdtRecordPtr.GuidQwordEvent->Guid)); + mCachedLength =3D 0; + } + } + break; + + case MODULE_DB_START_ID: + case MODULE_DB_SUPPORT_START_ID: + case MODULE_DB_SUPPORT_END_ID: + case MODULE_DB_STOP_START_ID: + case MODULE_DB_STOP_END_ID: + if (Address =3D=3D 0) { + return EFI_INVALID_PARAMETER; + } + GetModuleInfoFromHandle ((EFI_HANDLE *)CallerIdentifier, ModuleName, s= izeof (ModuleName), &ModuleGuid); + StringPtr =3D ModuleName; + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.GuidQwordEvent->Header.Type =3D FPDT_GUID_QW= ORD_EVENT_TYPE; + FpdtRecordPtr.GuidQwordEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.GuidQwordEvent->Header.Revision =3D FPDT_RECORD_= REVISION_1; + FpdtRecordPtr.GuidQwordEvent->ProgressID =3D PerfId; + FpdtRecordPtr.GuidQwordEvent->Timestamp =3D TimeStamp; + FpdtRecordPtr.GuidQwordEvent->Qword =3D Address; + CopyMem (&FpdtRecordPtr.GuidQwordEvent->Guid, &ModuleGuid, sizeof (F= pdtRecordPtr.GuidQwordEvent->Guid)); + } + break; + + case MODULE_DB_END_ID: + if (Address =3D=3D 0) { + return EFI_INVALID_PARAMETER; + } + GetModuleInfoFromHandle ((EFI_HANDLE *)CallerIdentifier, ModuleName, s= izeof (ModuleName), &ModuleGuid); + StringPtr =3D ModuleName; + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.GuidQwordStringEvent->Header.Type =3D FPDT_GUID_QW= ORD_STRING_EVENT_TYPE; + FpdtRecordPtr.GuidQwordStringEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.GuidQwordStringEvent->Header.Revision =3D FPDT_RECORD_= REVISION_1; + FpdtRecordPtr.GuidQwordStringEvent->ProgressID =3D PerfId; + FpdtRecordPtr.GuidQwordStringEvent->Timestamp =3D TimeStamp; + FpdtRecordPtr.GuidQwordStringEvent->Qword =3D Address; + CopyMem (&FpdtRecordPtr.GuidQwordStringEvent->Guid, &ModuleGuid, siz= eof (FpdtRecordPtr.GuidQwordStringEvent->Guid)); + DestMax =3D (RecordSize - sizeof (FPDT_GUID_QWORD_STRING_EVENT_RECOR= D)) / sizeof (CHAR8); + if (mDevicePathString !=3D NULL) { + AsciiStrCpyS (FpdtRecordPtr.GuidQwordStringEvent->String, DestMax,= mDevicePathString); + FreePool (mDevicePathString); + mDevicePathString =3D NULL; + } + } + break; + + case PERF_EVENTSIGNAL_START_ID: + case PERF_EVENTSIGNAL_END_ID: + case PERF_CALLBACK_START_ID: + case PERF_CALLBACK_END_ID: + if (CallerIdentifier =3D=3D NULL || Guid =3D=3DNULL || String =3D=3D N= ULL) { + return EFI_INVALID_PARAMETER; + } + // + // Cache the event guid in string event record when PcdEdkiiFpdtString= RecordEnableOnly =3D=3D TRUE + // + CopyGuid (&ModuleGuid, Guid); + StringPtr =3D String; + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.DualGuidStringEvent->Header.Type =3D FPDT_DUAL_GU= ID_STRING_EVENT_TYPE; + FpdtRecordPtr.DualGuidStringEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.DualGuidStringEvent->Header.Revision =3D FPDT_RECORD_= REVISION_1; + FpdtRecordPtr.DualGuidStringEvent->ProgressID =3D PerfId; + FpdtRecordPtr.DualGuidStringEvent->Timestamp =3D TimeStamp; + CopyMem (&FpdtRecordPtr.DualGuidStringEvent->Guid1, CallerIdentifier= , sizeof (FpdtRecordPtr.DualGuidStringEvent->Guid1)); + CopyMem (&FpdtRecordPtr.DualGuidStringEvent->Guid2, Guid, sizeof (Fp= dtRecordPtr.DualGuidStringEvent->Guid2)); + DestMax =3D (RecordSize - sizeof (FPDT_DUAL_GUID_STRING_EVENT_RECORD= )) / sizeof (CHAR8); + StringLen =3D AsciiStrLen (StringPtr); + if (StringLen >=3D DestMax) { + StringLen =3D DestMax -1; + } + AsciiStrnCpyS (FpdtRecordPtr.DualGuidStringEvent->String, DestMax, S= tringPtr, StringLen); + } + break; + + case PERF_EVENT_ID: + case PERF_FUNCTION_START_ID: + case PERF_FUNCTION_END_ID: + case PERF_INMODULE_START_ID: + case PERF_INMODULE_END_ID: + case PERF_CROSSMODULE_START_ID: + case PERF_CROSSMODULE_END_ID: + if (CallerIdentifier =3D=3D NULL || String =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + CopyGuid (&ModuleGuid, (EFI_GUID *) CallerIdentifier); + StringPtr =3D String; + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.DynamicStringEvent->Header.Type =3D FPDT_DYNAMIC= _STRING_EVENT_TYPE; + FpdtRecordPtr.DynamicStringEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.DynamicStringEvent->Header.Revision =3D FPDT_RECORD_= REVISION_1; + FpdtRecordPtr.DynamicStringEvent->ProgressID =3D PerfId; + FpdtRecordPtr.DynamicStringEvent->Timestamp =3D TimeStamp; + CopyMem (&FpdtRecordPtr.DynamicStringEvent->Guid, CallerIdentifier, = sizeof (FpdtRecordPtr.DynamicStringEvent->Guid)); + DestMax =3D (RecordSize - sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD))= / sizeof (CHAR8); + StringLen =3D AsciiStrLen (StringPtr); + if (StringLen >=3D DestMax) { + StringLen =3D DestMax -1; + } + AsciiStrnCpyS (FpdtRecordPtr.DynamicStringEvent->String, DestMax, St= ringPtr, StringLen); + } + break; + + default: + return EFI_INVALID_PARAMETER; + } + + if (PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.DynamicStringEvent->Header.Type =3D FPDT_DYNAMIC_S= TRING_EVENT_TYPE; + FpdtRecordPtr.DynamicStringEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.DynamicStringEvent->Header.Revision =3D FPDT_RECORD_RE= VISION_1; + FpdtRecordPtr.DynamicStringEvent->ProgressID =3D PerfId; + FpdtRecordPtr.DynamicStringEvent->Timestamp =3D TimeStamp; + DestMax =3D (RecordSize - sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD)) /= sizeof (CHAR8); + if (StringPtr !=3D NULL && AsciiStrLen (StringPtr) =3D=3D 0) { + StringPtr =3D "unknown name"; + } + if (StringPtr !=3D NULL) { + StringLen =3D AsciiStrLen (StringPtr); + if (StringLen >=3D DestMax) { + StringLen =3D DestMax -1; + } + } + CopyMem (&FpdtRecordPtr.DynamicStringEvent->Guid, &ModuleGuid, sizeof = (FpdtRecordPtr.DynamicStringEvent->Guid)); + AsciiStrnCpyS (FpdtRecordPtr.DynamicStringEvent->String, DestMax, Stri= ngPtr, StringLen); + + if ((PerfId =3D=3D MODULE_LOADIMAGE_END_ID) || (PerfId =3D=3D MODULE_E= ND_ID)) { + if (mCachedLength !=3D 0) { + if (mFpdtBufferIsReported) { + CachedFpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMA= NCE_RECORD_HEADER *)(mBootRecordBuffer + mCachedLength); + } else { + CachedFpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMA= NCE_RECORD_HEADER *)(mPerformancePointer + mCachedLength); + } + CopyMem (&CachedFpdtRecordPtr.DynamicStringEvent->Guid, &ModuleGui= d, sizeof (CachedFpdtRecordPtr.DynamicStringEvent->Guid)); + AsciiStrnCpyS (CachedFpdtRecordPtr.DynamicStringEvent->String, Des= tMax, StringPtr, StringLen); + mCachedLength =3D 0; + } + } + } + if (mFpdtBufferIsReported) { + mBootRecordSize +=3D FpdtRecordPtr.RecordHeader->Length; + mAcpiBootPerformanceTable->Header.Length +=3D FpdtRecordPtr.RecordHead= er->Length; + } else { + mPerformanceLength +=3D FpdtRecordPtr.RecordHeader->Length; + } + return EFI_SUCCESS; +} + /** The constructor function initializes Performance infrastructure for DXE = phase. =20 The constructor function publishes Performance and PerformanceEx protoco= l, allocates memory to log DXE performance and merges PEI performance data to DXE performance log. @@ -1162,10 +1689,12 @@ CreatePerformanceMeasurement ( =20 if (Attribute =3D=3D PerfStartEntry) { Status =3D InsertFpdtMeasurement (TRUE, CallerIdentifier, String, Stri= ng, TimeStamp, Identifier); } else if (Attribute =3D=3D PerfEndEntry) { Status =3D InsertFpdtMeasurement (FALSE, CallerIdentifier, String, Str= ing, TimeStamp, Identifier); + } else if ( Attribute =3D=3D PerfEntry) { + Status =3D InsertFpdtRecord (CallerIdentifier, Guid, String, Address, = (UINT16) Identifier); } mLockInsertRecord =3D FALSE; =20 return Status; } @@ -1470,5 +1999,60 @@ PerformanceMeasurementEnabled ( VOID ) { return (BOOLEAN) ((PcdGet8(PcdPerformanceLibraryPropertyMask) & PERFORMA= NCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED) !=3D 0); } + +/** + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID + @param Guid - Pointer to a GUID + @param String - Pointer to a string describing the measurement + @param Address - Pointer to a location in memory relevant to t= he measurement + @param Identifier - Performance identifier describing the type of= measurement + + @retval RETURN_SUCCESS - Successfully created performance reco= rd + @retval RETURN_OUT_OF_RESOURCES - Ran out of space to store the records + @retval RETURN_INVALID_PARAMETER - Invalid parameter passed to function = - NULL + pointer or invalid PerfId + +**/ +RETURN_STATUS +EFIAPI +LogPerformanceMeasurement ( + IN CONST VOID *CallerIdentifier, + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT32 Identifier + ) +{ + return (RETURN_STATUS)CreatePerformanceMeasurement (CallerIdentifier, Gu= id, String, 0, Address, Identifier, PerfEntry); +} + +/** + Check whether the specified performance measurement can be logged. + + This function returns TRUE when the PERFORMANCE_LIBRARY_PROPERTY_MEASURE= MENT_ENABLED bit of PcdPerformanceLibraryPropertyMask is set + and the Type disable bit in PcdPerformanceLibraryPropertyMask is not set. + + @param Type - Type of the performance measurement entry. + + @retval TRUE The performance measurement can be logged. + @retval FALSE The performance measurement can NOT be logged. + +**/ +BOOLEAN +EFIAPI +LogPerformanceMeasurementEnabled ( + IN CONST UINTN Type + ) +{ + // + // When Performance measurement is enabled and the type is not filtered,= the performance can be logged. + // + if (PerformanceMeasurementEnabled () && (PcdGet8(PcdPerformanceLibraryPr= opertyMask) & Type) =3D=3D 0) { + return TRUE; + } + return FALSE; +} diff --git a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceL= ib.inf b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.i= nf index 68cd76da5b3..3e77f9cd57a 100644 --- a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf +++ b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf @@ -59,10 +59,11 @@ DebugLib UefiLib ReportStatusCodeLib DxeServicesLib PeCoffGetEntryPointLib + DevicePathLib =20 [Protocols] gEfiSmmCommunicationProtocolGuid ## SOMETIMES_CONSUMES =20 =20 diff --git a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceL= ibInternal.h b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanc= eLibInternal.h index f9800e34941..a96f4081503 100644 --- a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLibInter= nal.h +++ b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLibInter= nal.h @@ -40,10 +40,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITH= ER EXPRESS OR IMPLIED. #include #include #include #include #include +#include #include #include #include #include #include diff --git a/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c b/M= deModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c index 9ed50d22b8d..664e8261af9 100644 --- a/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c +++ b/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c @@ -376,5 +376,73 @@ PerformanceMeasurementEnabled ( VOID ) { return (BOOLEAN) ((PcdGet8(PcdPerformanceLibraryPropertyMask) & PERFORMA= NCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED) !=3D 0); } + +/** + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID + @param Guid - Pointer to a GUID + @param String - Pointer to a string describing the measurement + @param Address - Pointer to a location in memory relevant to t= he measurement + @param Identifier - Performance identifier describing the type of= measurement + + @retval RETURN_SUCCESS - Successfully created performance reco= rd + @retval RETURN_OUT_OF_RESOURCES - Ran out of space to store the records + @retval RETURN_INVALID_PARAMETER - Invalid parameter passed to function = - NULL + pointer or invalid PerfId + +**/ +RETURN_STATUS +EFIAPI +LogPerformanceMeasurement ( + IN CONST VOID *CallerIdentifier, + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT32 Identifier + ) +{ + EFI_STATUS Status; + + Status =3D GetPerformanceMeasurementProtocol (); + if (EFI_ERROR (Status)) { + return RETURN_OUT_OF_RESOURCES; + } + + if (mPerformanceMeasurement !=3D NULL) { + Status =3D mPerformanceMeasurement->CreatePerformanceMeasurement (Call= erIdentifier, Guid, String, 0, Address, Identifier, PerfEntry); + } else { + ASSERT (FALSE); + } + + return (RETURN_STATUS) Status; +} + +/** + Check whether the specified performance measurement can be logged. + + This function returns TRUE when the PERFORMANCE_LIBRARY_PROPERTY_MEASURE= MENT_ENABLED bit of PcdPerformanceLibraryPropertyMask is set + and the Type disable bit in PcdPerformanceLibraryPropertyMask is not set. + + @param Type - Type of the performance measurement entry. + + @retval TRUE The performance measurement can be logged. + @retval FALSE The performance measurement can NOT be logged. + +**/ +BOOLEAN +EFIAPI +LogPerformanceMeasurementEnabled ( + IN CONST UINTN Type + ) +{ + // + // When Performance measurement is enabled and the type is not filtered,= the performance can be logged. + // + if (PerformanceMeasurementEnabled () && (PcdGet8(PcdPerformanceLibraryPr= opertyMask) & Type) =3D=3D 0) { + return TRUE; + } + return FALSE; +} diff --git a/MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c b/M= deModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c index f770a35a995..d7b652c5771 100644 --- a/MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c +++ b/MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c @@ -31,11 +31,88 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITH= ER EXPRESS OR IMPLIED. #include #include #include =20 #define STRING_SIZE (FPDT_STRING_EVENT_RECORD_NAME_LENGTH * si= zeof (CHAR8)) -#define MAX_RECORD_SIZE (sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD)= + STRING_SIZE) +#define PEI_MAX_RECORD_SIZE (sizeof (FPDT_DUAL_GUID_STRING_EVENT_RECOR= D) + STRING_SIZE) + +/** + Return the pointer to the FPDT record in the allocated memory. + + @param RecordSize The size of FPDT record. + @param FpdtRecordPtr Pointer the FPDT record in the allocat= ed memory. + @param PeiPerformanceLogHeader Pointer to the header of the PEI Perfo= rmance records in the GUID Hob. + + @retval EFI_SUCCESS Successfully get the pointer to the FP= DT record. + @retval EFI_OUT_OF_RESOURCES Ran out of space to store the records. +**/ +EFI_STATUS +GetFpdtRecordPtr ( + IN UINT8 RecordSize, + IN OUT FPDT_RECORD_PTR *FpdtRecordPtr, + IN OUT FPDT_PEI_EXT_PERF_HEADER **PeiPerformanceLogHeader +) +{ + UINT16 PeiPerformanceLogEntries; + UINTN PeiPerformanceSize; + UINT8 *PeiFirmwarePerformance; + EFI_HOB_GUID_TYPE *GuidHob; + + // + // Get the number of PeiPerformanceLogEntries form PCD. + // + PeiPerformanceLogEntries =3D (UINT16) (PcdGet16 (PcdMaxPeiPerformanceLog= Entries16) !=3D 0 ? + PcdGet16 (PcdMaxPeiPerformanceLogEn= tries16) : + PcdGet8 (PcdMaxPeiPerformanceLogEnt= ries)); + + // + // Create GUID HOB Data. + // + GuidHob =3D GetFirstGuidHob (&gEdkiiFpdtExtendedFirmwarePerformanceGuid); + PeiFirmwarePerformance =3D NULL; + while (GuidHob !=3D NULL) { + // + // PEI Performance HOB was found, then return the existing one. + // + PeiFirmwarePerformance =3D (UINT8*)GET_GUID_HOB_DATA (GuidHob); + *PeiPerformanceLogHeader =3D (FPDT_PEI_EXT_PERF_HEADER *)PeiFirmwarePe= rformance; + if (!(*PeiPerformanceLogHeader)->HobIsFull && (*PeiPerformanceLogHeade= r)->SizeOfAllEntries + RecordSize > PeiPerformanceLogEntries * PEI_MAX_RECO= RD_SIZE) { + (*PeiPerformanceLogHeader)->HobIsFull =3D TRUE; + } + if (!(*PeiPerformanceLogHeader)->HobIsFull && (*PeiPerformanceLogHeade= r)->SizeOfAllEntries + RecordSize <=3D PeiPerformanceLogEntries * PEI_MAX_R= ECORD_SIZE) { + FpdtRecordPtr->RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECOR= D_HEADER *)(PeiFirmwarePerformance + sizeof (FPDT_PEI_EXT_PERF_HEADER) + (*= PeiPerformanceLogHeader)->SizeOfAllEntries); + break; + } + // + // Previous HOB is used, then find next one. + // + GuidHob =3D GetNextGuidHob (&gEdkiiFpdtExtendedFirmwarePerformanceGuid= , GET_NEXT_HOB (GuidHob)); + } + + if (GuidHob =3D=3D NULL) { + // + // PEI Performance HOB was not found, then build one. + // + PeiPerformanceSize =3D sizeof (FPDT_PEI_EXT_PERF_HEADER) + + PEI_MAX_RECORD_SIZE * PeiPerformanceLogEntri= es; + PeiFirmwarePerformance =3D (UINT8*)BuildGuidHob (&gEdkiiFpdtExtendedF= irmwarePerformanceGuid, PeiPerformanceSize); + if (PeiFirmwarePerformance !=3D NULL) { + ZeroMem (PeiFirmwarePerformance, PeiPerformanceSize); + (*PeiPerformanceLogHeader) =3D (FPDT_PEI_EXT_PERF_HEADER *)PeiFirmwa= rePerformance; + FpdtRecordPtr->RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECOR= D_HEADER *)(PeiFirmwarePerformance + sizeof (FPDT_PEI_EXT_PERF_HEADER)); + } + } + + if (PeiFirmwarePerformance =3D=3D NULL) { + // + // there is no enough resource to store performance data + // + return EFI_OUT_OF_RESOURCES; + } + + return EFI_SUCCESS; +} =20 /** Check whether the Token is a known one which is uesed by core. =20 @param Token Pointer to a Null-terminated ASCII string @@ -240,23 +317,19 @@ InsertPeiFpdtMeasurement ( IN CONST CHAR8 *Module, OPTIONAL IN UINT64 Ticker, IN UINT32 Identifier ) { - EFI_HOB_GUID_TYPE *GuidHob; - UINTN PeiPerformanceSize; - UINT8 *PeiFirmwarePerformance; - FPDT_PEI_EXT_PERF_HEADER *PeiPerformanceLogHeader; FPDT_RECORD_PTR FpdtRecordPtr; FPDT_BASIC_RECORD_INFO RecordInfo; CONST VOID *ModuleGuid; UINTN DestMax; UINTN StrLength; CONST CHAR8 *StringPtr; EFI_STATUS Status; - UINT16 PeiPerformanceLogEntries; UINT64 TimeStamp; + FPDT_PEI_EXT_PERF_HEADER *PeiPerformanceLogHeader; =20 StringPtr =3D NULL; FpdtRecordPtr.RecordHeader =3D NULL; PeiPerformanceLogHeader =3D NULL; =20 @@ -286,60 +359,13 @@ InsertPeiFpdtMeasurement ( Identifier +=3D 1; } RecordInfo.ProgressID =3D (UINT16)Identifier; } =20 - // - // Get the number of PeiPerformanceLogEntries form PCD. - // - PeiPerformanceLogEntries =3D (UINT16) (PcdGet16 (PcdMaxPeiPerformanceLog= Entries16) !=3D 0 ? - PcdGet16 (PcdMaxPeiPerformanceLogEn= tries16) : - PcdGet8 (PcdMaxPeiPerformanceLogEnt= ries)); - - // - // Create GUID HOB Data. - // - GuidHob =3D GetFirstGuidHob (&gEdkiiFpdtExtendedFirmwarePerformanceGuid); - PeiFirmwarePerformance =3D NULL; - while (GuidHob !=3D NULL) { - // - // PEI Performance HOB was found, then return the existing one. - // - PeiFirmwarePerformance =3D (UINT8*)GET_GUID_HOB_DATA (GuidHob); - PeiPerformanceLogHeader =3D (FPDT_PEI_EXT_PERF_HEADER *)PeiFirmwarePer= formance; - if (!PeiPerformanceLogHeader->HobIsFull && PeiPerformanceLogHeader->Si= zeOfAllEntries + RecordInfo.RecordSize > PeiPerformanceLogEntries * MAX_REC= ORD_SIZE) { - PeiPerformanceLogHeader->HobIsFull =3D TRUE; - } - if (!PeiPerformanceLogHeader->HobIsFull && PeiPerformanceLogHeader->Si= zeOfAllEntries + RecordInfo.RecordSize <=3D PeiPerformanceLogEntries * MAX_= RECORD_SIZE) { - FpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD= _HEADER *)(PeiFirmwarePerformance + sizeof (FPDT_PEI_EXT_PERF_HEADER) + Pei= PerformanceLogHeader->SizeOfAllEntries); - break; - } - // - // Previous HOB is used, then find next one. - // - GuidHob =3D GetNextGuidHob (&gEdkiiFpdtExtendedFirmwarePerformanceGuid= , GET_NEXT_HOB (GuidHob)); - } - - if (GuidHob =3D=3D NULL) { - // - // PEI Performance HOB was not found, then build one. - // - PeiPerformanceSize =3D sizeof (FPDT_PEI_EXT_PERF_HEADER) + - MAX_RECORD_SIZE * PeiPerformanceLogEntries; - PeiFirmwarePerformance =3D (UINT8*)BuildGuidHob (&gEdkiiFpdtExtendedF= irmwarePerformanceGuid, PeiPerformanceSize); - if (PeiFirmwarePerformance !=3D NULL) { - ZeroMem (PeiFirmwarePerformance, PeiPerformanceSize); - } - PeiPerformanceLogHeader =3D (FPDT_PEI_EXT_PERF_HEADER *)PeiFirmwarePer= formance; - FpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_H= EADER *)(PeiFirmwarePerformance + sizeof (FPDT_PEI_EXT_PERF_HEADER)); - } - - if (PeiFirmwarePerformance =3D=3D NULL) { - // - // there is no enough resource to store performance data - // - return EFI_OUT_OF_RESOURCES; + Status =3D GetFpdtRecordPtr (RecordInfo.RecordSize, &FpdtRecordPtr, &Pei= PerformanceLogHeader); + if (EFI_ERROR (Status)) { + return Status; } =20 // // Get the TimeStamp. // @@ -690,5 +716,309 @@ PerformanceMeasurementEnabled ( VOID ) { return (BOOLEAN) ((PcdGet8(PcdPerformanceLibraryPropertyMask) & PERFORMA= NCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED) !=3D 0); } + +/** + Get the FPDT record size. + + @param String Pointer to a Null-terminated ASCII stri= ng + that identifies the component being mea= sured. + @param PerfId Performance identifier. + @param RecordSize On return, pointer to the size of recor= d. + + @retval EFI_SUCCESS Get record size successfully. + @retval EFI_INVALID_PARAMETER Invalid Performance identifier. + +**/ +EFI_STATUS +GetFpdtRecordSize ( + IN CONST CHAR8 *String, + IN UINT16 PerfId, + OUT UINT8 *RecordSize + ) +{ + UINTN StringSize; + + if (PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + *RecordSize =3D sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD) + STRING_SIZ= E; + } else { + switch (PerfId) { + case MODULE_START_ID: + case MODULE_END_ID: + *RecordSize =3D sizeof (FPDT_GUID_EVENT_RECORD); + break; + + case MODULE_LOADIMAGE_START_ID: + case MODULE_LOADIMAGE_END_ID: + *RecordSize =3D sizeof (FPDT_GUID_QWORD_EVENT_RECORD); + break; + + case PERF_EVENTSIGNAL_START_ID: + case PERF_EVENTSIGNAL_END_ID: + case PERF_CALLBACK_START_ID: + case PERF_CALLBACK_END_ID: + if (String =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + StringSize =3D AsciiStrSize (String); + if (StringSize > STRING_SIZE) { + StringSize =3D STRING_SIZE; + } + *RecordSize =3D (UINT8) (sizeof (FPDT_DUAL_GUID_STRING_EVENT_RECORD)= + StringSize); + break; + + case PERF_EVENT_ID: + case PERF_FUNCTION_START_ID: + case PERF_FUNCTION_END_ID: + case PERF_INMODULE_START_ID: + case PERF_INMODULE_END_ID: + case PERF_CROSSMODULE_START_ID: + case PERF_CROSSMODULE_END_ID: + if (String =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + StringSize =3D AsciiStrSize (String); + if (StringSize > STRING_SIZE) { + StringSize =3D STRING_SIZE; + } + *RecordSize =3D (UINT8) (sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD) += StringSize); + break; + + default: + return EFI_INVALID_PARAMETER; + } + } + return EFI_SUCCESS; +} + +/** + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID + @param Guid - Pointer to a GUID + @param String - Pointer to a string describing the measurement + @param Address - Pointer to a location in memory relevant to t= he measurement + @param PerfId - Performance identifier describing the type of= measurement + + @retval EFI_SUCCESS - Successfully created performance record + @retval EFI_OUT_OF_RESOURCES - Ran out of space to store the records + @retval EFI_INVALID_PARAMETER - Invalid parameter passed to function - N= ULL + pointer or invalid PerfId + +**/ +EFI_STATUS +CreateFpdtRecord ( + IN CONST VOID *CallerIdentifier, OPTIONAL + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT16 PerfId + ) +{ + FPDT_PEI_EXT_PERF_HEADER *PeiPerformanceLogHeader; + FPDT_RECORD_PTR FpdtRecordPtr; + CONST CHAR8 *StringPtr; + EFI_STATUS Status; + UINT64 TimeStamp; + UINT64 TimeStampCounter; + UINT8 RecordSize; + UINTN DestMax; + UINTN StringLen; + + StringPtr =3D NULL; + RecordSize =3D 0; + + Status =3D GetFpdtRecordSize(String, PerfId, &RecordSize); + if (EFI_ERROR (Status)) { + return Status; + } + + Status =3D GetFpdtRecordPtr (RecordSize, &FpdtRecordPtr, &PeiPerformance= LogHeader); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get the TimeStamp. + // + TimeStampCounter =3D GetPerformanceCounter (); + TimeStamp =3D GetTimeInNanoSecond (TimeStampCounter); + + switch (PerfId) { + case MODULE_START_ID: + case MODULE_END_ID: + if (CallerIdentifier =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + StringPtr =3D PEIM_TOK; + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.GuidEvent->Header.Type =3D FPDT_GUID_EVENT_TYPE; + FpdtRecordPtr.GuidEvent->Header.Length =3D RecordSize;; + FpdtRecordPtr.GuidEvent->Header.Revision =3D FPDT_RECORD_REVISION_= 1; + FpdtRecordPtr.GuidEvent->ProgressID =3D PerfId; + FpdtRecordPtr.GuidEvent->Timestamp =3D TimeStamp; + CopyMem (&FpdtRecordPtr.GuidEvent->Guid, CallerIdentifier, sizeof (E= FI_GUID)); + PeiPerformanceLogHeader->SizeOfAllEntries +=3D RecordSize; + } + break; + + case MODULE_LOADIMAGE_START_ID: + case MODULE_LOADIMAGE_END_ID: + if (CallerIdentifier =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + StringPtr =3D LOAD_IMAGE_TOK; + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.GuidQwordEvent->Header.Type =3D FPDT_GUID_QWORD_EV= ENT_TYPE; + FpdtRecordPtr.GuidQwordEvent->Header.Length =3D RecordSize;; + FpdtRecordPtr.GuidQwordEvent->Header.Revision =3D FPDT_RECORD_REVISI= ON_1; + FpdtRecordPtr.GuidQwordEvent->ProgressID =3D PerfId; + FpdtRecordPtr.GuidQwordEvent->Timestamp =3D TimeStamp; + if (PerfId =3D=3D MODULE_LOADIMAGE_START_ID) { + PeiPerformanceLogHeader->LoadImageCount++; + } + FpdtRecordPtr.GuidQwordEvent->Qword =3D PeiPerformanceLogH= eader->LoadImageCount; + CopyMem (&FpdtRecordPtr.GuidQwordEvent->Guid, CallerIdentifier, size= of (EFI_GUID)); + PeiPerformanceLogHeader->SizeOfAllEntries +=3D RecordSize; + } + break; + + case PERF_EVENTSIGNAL_START_ID: + case PERF_EVENTSIGNAL_END_ID: + case PERF_CALLBACK_START_ID: + case PERF_CALLBACK_END_ID: + if (CallerIdentifier =3D=3D NULL || Guid =3D=3DNULL || String =3D=3D N= ULL) { + return EFI_INVALID_PARAMETER; + } + StringPtr =3D String; + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.DualGuidStringEvent->Header.Type =3D FPDT_DUAL_GU= ID_STRING_EVENT_TYPE; + FpdtRecordPtr.DualGuidStringEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.DualGuidStringEvent->Header.Revision =3D FPDT_RECORD_= REVISION_1; + FpdtRecordPtr.DualGuidStringEvent->ProgressID =3D PerfId; + FpdtRecordPtr.DualGuidStringEvent->Timestamp =3D TimeStamp; + CopyMem (&FpdtRecordPtr.DualGuidStringEvent->Guid1, CallerIdentifier= , sizeof (FpdtRecordPtr.DualGuidStringEvent->Guid1)); + CopyMem (&FpdtRecordPtr.DualGuidStringEvent->Guid2, Guid, sizeof (Fp= dtRecordPtr.DualGuidStringEvent->Guid2)); + DestMax =3D (RecordSize - sizeof (FPDT_DUAL_GUID_STRING_EVENT_RECORD= )) / sizeof (CHAR8); + StringLen =3D AsciiStrLen (StringPtr); + if (StringLen >=3D DestMax) { + StringLen =3D DestMax -1; + } + AsciiStrnCpyS (FpdtRecordPtr.DualGuidStringEvent->String, DestMax, S= tringPtr, StringLen); + PeiPerformanceLogHeader->SizeOfAllEntries +=3D RecordSize; + } + break; + + case PERF_EVENT_ID: + case PERF_FUNCTION_START_ID: + case PERF_FUNCTION_END_ID: + case PERF_INMODULE_START_ID: + case PERF_INMODULE_END_ID: + case PERF_CROSSMODULE_START_ID: + case PERF_CROSSMODULE_END_ID: + if (CallerIdentifier =3D=3D NULL || String =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + StringPtr =3D String; + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.DynamicStringEvent->Header.Type =3D FPDT_DYNAMIC= _STRING_EVENT_TYPE; + FpdtRecordPtr.DynamicStringEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.DynamicStringEvent->Header.Revision =3D FPDT_RECORD_= REVISION_1; + FpdtRecordPtr.DynamicStringEvent->ProgressID =3D PerfId; + FpdtRecordPtr.DynamicStringEvent->Timestamp =3D TimeStamp; + CopyMem (&FpdtRecordPtr.DynamicStringEvent->Guid, CallerIdentifier, = sizeof (EFI_GUID)); + DestMax =3D (RecordSize - sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD))= / sizeof (CHAR8); + StringLen =3D AsciiStrLen (StringPtr); + if (StringLen >=3D DestMax) { + StringLen =3D DestMax -1; + } + AsciiStrnCpyS (FpdtRecordPtr.DynamicStringEvent->String, DestMax, St= ringPtr, StringLen); + PeiPerformanceLogHeader->SizeOfAllEntries +=3D RecordSize; + } + break; + + default: + return EFI_INVALID_PARAMETER; + } + + if (PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.DynamicStringEvent->Header.Type =3D FPDT_DYNAMIC_S= TRING_EVENT_TYPE; + FpdtRecordPtr.DynamicStringEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.DynamicStringEvent->Header.Revision =3D FPDT_RECORD_RE= VISION_1; + FpdtRecordPtr.DynamicStringEvent->ProgressID =3D PerfId; + FpdtRecordPtr.DynamicStringEvent->Timestamp =3D TimeStamp; + if (Guid !=3D NULL) { + // + // Cache the event guid in string event record. + // + CopyMem (&FpdtRecordPtr.DynamicStringEvent->Guid, Guid, sizeof (EFI_= GUID)); + } else { + CopyMem (&FpdtRecordPtr.DynamicStringEvent->Guid, CallerIdentifier, = sizeof (EFI_GUID)); + } + DestMax =3D (RecordSize - sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD)) /= sizeof (CHAR8); + StringLen =3D AsciiStrLen (StringPtr); + if (StringLen >=3D DestMax) { + StringLen =3D DestMax -1; + } + AsciiStrnCpyS (FpdtRecordPtr.DynamicStringEvent->String, DestMax, Stri= ngPtr, StringLen); + PeiPerformanceLogHeader->SizeOfAllEntries +=3D RecordSize; + } + + return EFI_SUCCESS; +} + +/** + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID + @param Guid - Pointer to a GUID + @param String - Pointer to a string describing the measurement + @param Address - Pointer to a location in memory relevant to t= he measurement + @param Identifier - Performance identifier describing the type of= measurement + + @retval RETURN_SUCCESS - Successfully created performance reco= rd + @retval RETURN_OUT_OF_RESOURCES - Ran out of space to store the records + @retval RETURN_INVALID_PARAMETER - Invalid parameter passed to function = - NULL + pointer or invalid PerfId + +**/ +RETURN_STATUS +EFIAPI +LogPerformanceMeasurement ( + IN CONST VOID *CallerIdentifier, + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT32 Identifier + ) +{ + return (RETURN_STATUS)CreateFpdtRecord (CallerIdentifier, Guid, String, = Address, (UINT16)Identifier); +} + +/** + Check whether the specified performance measurement can be logged. + + This function returns TRUE when the PERFORMANCE_LIBRARY_PROPERTY_MEASURE= MENT_ENABLED bit of PcdPerformanceLibraryPropertyMask is set + and the Type disable bit in PcdPerformanceLibraryPropertyMask is not set. + + @param Type - Type of the performance measurement entry. + + @retval TRUE The performance measurement can be logged. + @retval FALSE The performance measurement can NOT be logged. + +**/ +BOOLEAN +EFIAPI +LogPerformanceMeasurementEnabled ( + IN CONST UINTN Type + ) +{ + // + // When Performance measurement is enabled and the type is not filtered,= the performance can be logged. + // + if (PerformanceMeasurementEnabled () && (PcdGet8(PcdPerformanceLibraryPr= opertyMask) & Type) =3D=3D 0) { + return TRUE; + } + return FALSE; +} diff --git a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceL= ib.c b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c index e630773562f..efbde88220b 100644 --- a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c +++ b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c @@ -45,23 +45,83 @@ typedef struct { HANDLE_GUID_MAP mCacheHandleGuidTable[CACHE_HANDLE_GUID_COUNT]; UINTN mCachePairCount =3D 0; =20 UINT32 mPerformanceLength =3D 0; UINT32 mMaxPerformanceLength =3D 0; +UINT32 mLoadImageCount =3D 0; BOOLEAN mFpdtDataIsReported =3D FALSE; BOOLEAN mLackSpaceIsReport =3D FALSE; CHAR8 *mPlatformLanguage =3D NULL; SPIN_LOCK mSmmFpdtLock; PERFORMANCE_PROPERTY mPerformanceProperty; +UINT32 mCachedLength =3D 0; =20 // // Interfaces for SMM PerformanceMeasurement Protocol. // EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL mPerformanceMeasurementInterface = =3D { CreatePerformanceMeasurement, }; =20 +/** + Return the pointer to the FPDT record in the allocated memory. + + @param RecordSize The size of FPDT record. + @param FpdtRecordPtr Pointer the FPDT record in the allocated = memory. + + @retval EFI_SUCCESS Successfully get the pointer to the FPDT = record. + @retval EFI_OUT_OF_RESOURCES Ran out of space to store the records. +**/ +EFI_STATUS +GetFpdtRecordPtr ( + IN UINT8 RecordSize, + IN OUT FPDT_RECORD_PTR *FpdtRecordPtr +) +{ + if (mFpdtDataIsReported) { + // + // Append Boot records after Smm boot performance records have been re= ported. + // + if (mPerformanceLength + RecordSize > mMaxPerformanceLength) { + if (!mLackSpaceIsReport) { + DEBUG ((DEBUG_INFO, "SmmCorePerformanceLib: No enough space to sav= e boot records\n")); + mLackSpaceIsReport =3D TRUE; + } + return EFI_OUT_OF_RESOURCES; + } else { + // + // Covert buffer to FPDT Ptr Union type. + // + FpdtRecordPtr->RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECOR= D_HEADER *)((UINT8*)mSmmBootPerformanceTable + mSmmBootPerformanceTable->He= ader.Length); + } + } else { + // + // Check if pre-allocated buffer is full + // + if (mPerformanceLength + RecordSize > mMaxPerformanceLength) { + mSmmBootPerformanceTable =3D ReallocatePool ( + mPerformanceLength, + mPerformanceLength + sizeof (SMM_BOOT_P= ERFORMANCE_TABLE) + RecordSize + FIRMWARE_RECORD_BUFFER, + mSmmBootPerformanceTable + ); + + if (mSmmBootPerformanceTable =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + mSmmBootPerformanceTable->Header.Length =3D sizeof (SMM_BOOT_PERFORM= ANCE_TABLE) + mPerformanceLength; + mMaxPerformanceLength =3D mPerformanceLength + sizeof (SMM_BOOT_PERF= ORMANCE_TABLE) + RecordSize + FIRMWARE_RECORD_BUFFER; + } + // + // Covert buffer to FPDT Ptr Union type. + // + FpdtRecordPtr->RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_= HEADER *)((UINT8*)mSmmBootPerformanceTable + mSmmBootPerformanceTable->Head= er.Length); + } + FpdtRecordPtr->RecordHeader->Length =3D 0; + return EFI_SUCCESS; +} + + /** Check whether the Token is a known one which is uesed by core. =20 @param Token Pointer to a Null-terminated ASCII string =20 @@ -506,49 +566,14 @@ InsertFpdtMeasurement ( Identifier +=3D 1; } RecordInfo.ProgressID =3D (UINT16)Identifier; } =20 - if (mFpdtDataIsReported) { - // - // Append Boot records after Smm boot performance records have been re= ported. - // - if (mPerformanceLength + RecordInfo.RecordSize > mMaxPerformanceLength= ) { - if (!mLackSpaceIsReport) { - DEBUG ((DEBUG_INFO, "SmmCorePerformanceLib: No enough space to sav= e boot records\n")); - mLackSpaceIsReport =3D TRUE; - } - return EFI_OUT_OF_RESOURCES; - } else { - // - // Covert buffer to FPDT Ptr Union type. - // - FpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD= _HEADER *)((UINT8*)mSmmBootPerformanceTable + mSmmBootPerformanceTable->Hea= der.Length); - } - } else { - // - // Check if pre-allocated buffer is full - // - if (mPerformanceLength + RecordInfo.RecordSize > mMaxPerformanceLength= ) { - mSmmBootPerformanceTable =3D ReallocatePool ( - mPerformanceLength, - mPerformanceLength + sizeof (SMM_BOOT_P= ERFORMANCE_TABLE) + RecordInfo.RecordSize + FIRMWARE_RECORD_BUFFER, - mSmmBootPerformanceTable - ); - - if (mSmmBootPerformanceTable =3D=3D NULL) { - return EFI_OUT_OF_RESOURCES; - } - mSmmBootPerformanceTable->Header.Length =3D sizeof (SMM_BOOT_PERFORM= ANCE_TABLE) + mPerformanceLength; - mMaxPerformanceLength =3D mPerformanceLength + sizeof (SMM_BOOT_PERF= ORMANCE_TABLE) + RecordInfo.RecordSize + FIRMWARE_RECORD_BUFFER; - } - // - // Covert buffer to FPDT Ptr Union type. - // - FpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_H= EADER *)((UINT8*)mSmmBootPerformanceTable + mSmmBootPerformanceTable->Heade= r.Length); + Status =3D GetFpdtRecordPtr (RecordInfo.RecordSize, &FpdtRecordPtr); + if (EFI_ERROR (Status)) { + return Status; } - FpdtRecordPtr.RecordHeader->Length =3D 0; =20 // // Get the TimeStamp. // if (Ticker =3D=3D 0) { @@ -630,10 +655,289 @@ InsertFpdtMeasurement ( mSmmBootPerformanceTable->Header.Length +=3D FpdtRecordPtr.RecordHeader-= >Length; =20 return EFI_SUCCESS; } =20 +/** + Get the FPDT record size. + + @param String Pointer to a Null-terminated ASCII stri= ng + that identifies the component being mea= sured. + @param PerfId Performance identifier. + @param RecordSize On return, pointer to the size of recor= d. + + @retval EFI_SUCCESS Get record size successfully. + @retval EFI_INVALID_PARAMETER Invalid Performance identifier. + +**/ +EFI_STATUS +GetFpdtRecordSize ( + IN CONST CHAR8 *String, + IN UINT16 PerfId, + OUT UINT8 *RecordSize + ) +{ + UINTN StringSize; + + if (PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + *RecordSize =3D (UINT8)(sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD) + ST= RING_SIZE); + } else { + switch (PerfId) { + case MODULE_START_ID: + case MODULE_END_ID: + *RecordSize =3D sizeof (FPDT_GUID_EVENT_RECORD); + break; + + case MODULE_LOADIMAGE_START_ID: + case MODULE_LOADIMAGE_END_ID: + *RecordSize =3D sizeof (FPDT_GUID_QWORD_EVENT_RECORD); + break; + + case PERF_EVENTSIGNAL_START_ID: + case PERF_EVENTSIGNAL_END_ID: + case PERF_CALLBACK_START_ID: + case PERF_CALLBACK_END_ID: + if (String =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + StringSize =3D AsciiStrSize (String); + if (StringSize > STRING_SIZE) { + StringSize =3D STRING_SIZE; + } + *RecordSize =3D (UINT8) (sizeof (FPDT_DUAL_GUID_STRING_EVENT_RECORD)= + StringSize); + break; + + case PERF_EVENT_ID: + case PERF_FUNCTION_START_ID: + case PERF_FUNCTION_END_ID: + case PERF_INMODULE_START_ID: + case PERF_INMODULE_END_ID: + case PERF_CROSSMODULE_START_ID: + case PERF_CROSSMODULE_END_ID: + if (String =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + StringSize =3D AsciiStrSize (String); + if (StringSize > STRING_SIZE) { + StringSize =3D STRING_SIZE; + } + *RecordSize =3D (UINT8) (sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD) += StringSize); + break; + + default: + return EFI_INVALID_PARAMETER; + } + } + return EFI_SUCCESS; +} + +/** + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID + @param Guid - Pointer to a GUID + @param String - Pointer to a string describing the measurement + @param Address - Pointer to a location in memory relevant to t= he measurement + @param PerfId - Performance identifier describing the type of= measurement + + @retval EFI_SUCCESS - Successfully created performance record + @retval EFI_OUT_OF_RESOURCES - Ran out of space to store the records + @retval EFI_INVALID_PARAMETER - Invalid parameter passed to function - N= ULL + pointer or invalid PerfId + +**/ +EFI_STATUS +InsertFpdtRecord ( + IN CONST VOID *CallerIdentifier, OPTIONAL + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT16 PerfId + ) +{ + EFI_STATUS Status; + EFI_GUID ModuleGuid; + CHAR8 ModuleName[FPDT_STRING_EVENT_RECORD_NAME_LE= NGTH]; + FPDT_RECORD_PTR FpdtRecordPtr; + FPDT_RECORD_PTR CachedFpdtRecordPtr; + UINT64 TimeStamp; + UINT64 TimeStampCounter; + CONST CHAR8 *StringPtr; + UINT8 RecordSize; + UINTN DestMax; + UINTN StringLen; + + StringPtr =3D NULL; + RecordSize =3D 0; + ZeroMem (ModuleName, sizeof (ModuleName)); + + Status =3D GetFpdtRecordSize(String, PerfId, &RecordSize); + if (EFI_ERROR (Status)) { + return Status; + } + + Status =3D GetFpdtRecordPtr (RecordSize, &FpdtRecordPtr); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get the TimeStamp. + // + TimeStampCounter =3D GetPerformanceCounter (); + TimeStamp =3D GetTimeInNanoSecond (TimeStampCounter); + + switch (PerfId) { + case MODULE_START_ID: + case MODULE_END_ID: + // + // Get the ModuleGuid from the handle. + // + GetModuleInfoFromHandle ((EFI_HANDLE *)CallerIdentifier, ModuleName, s= izeof (ModuleName), &ModuleGuid); + StringPtr =3D ModuleName; + if (PerfId =3D=3D MODULE_START_ID) { + mCachedLength =3D mSmmBootPerformanceTable->Header.Length; + } + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.GuidEvent->Header.Type =3D FPDT_GUID_EV= ENT_TYPE; + FpdtRecordPtr.GuidEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.GuidEvent->Header.Revision =3D FPDT_RECORD_= REVISION_1; + FpdtRecordPtr.GuidEvent->ProgressID =3D PerfId; + FpdtRecordPtr.GuidEvent->Timestamp =3D TimeStamp; + CopyMem (&FpdtRecordPtr.GuidEvent->Guid, &ModuleGuid, sizeof (FpdtRe= cordPtr.GuidEvent->Guid)); + if (PerfId =3D=3D MODULE_END_ID && mCachedLength !=3D 0) { + CachedFpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANC= E_RECORD_HEADER *)((UINT8*)mSmmBootPerformanceTable + mCachedLength); + CopyMem (&CachedFpdtRecordPtr.GuidEvent->Guid, &ModuleGuid, sizeof= (CachedFpdtRecordPtr.GuidEvent->Guid)); + mCachedLength =3D 0; + } + } + break; + + case MODULE_LOADIMAGE_START_ID: + case MODULE_LOADIMAGE_END_ID: + GetModuleInfoFromHandle ((EFI_HANDLE *)CallerIdentifier, ModuleName, s= izeof (ModuleName), &ModuleGuid); + StringPtr =3D ModuleName; + if (PerfId =3D=3D MODULE_LOADIMAGE_START_ID) { + mLoadImageCount++; + mCachedLength =3D mSmmBootPerformanceTable->Header.Length; + } + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.GuidQwordEvent->Header.Type =3D FPDT_GUID_QW= ORD_EVENT_TYPE; + FpdtRecordPtr.GuidQwordEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.GuidQwordEvent->Header.Revision =3D FPDT_RECORD_= REVISION_1; + FpdtRecordPtr.GuidQwordEvent->ProgressID =3D PerfId; + FpdtRecordPtr.GuidQwordEvent->Timestamp =3D TimeStamp; + FpdtRecordPtr.GuidQwordEvent->Qword =3D mLoadImageCo= unt; + CopyMem (&FpdtRecordPtr.GuidQwordEvent->Guid, &ModuleGuid, sizeof (F= pdtRecordPtr.GuidQwordEvent->Guid)); + if (PerfId =3D=3D MODULE_LOADIMAGE_END_ID && mCachedLength !=3D 0) { + CachedFpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANC= E_RECORD_HEADER *)((UINT8*)mSmmBootPerformanceTable + mCachedLength); + CopyMem (&CachedFpdtRecordPtr.GuidQwordEvent->Guid, &ModuleGuid, s= izeof (CachedFpdtRecordPtr.GuidQwordEvent->Guid)); + mCachedLength =3D 0; + } + } + break; + + case PERF_EVENTSIGNAL_START_ID: + case PERF_EVENTSIGNAL_END_ID: + case PERF_CALLBACK_START_ID: + case PERF_CALLBACK_END_ID: + if (CallerIdentifier =3D=3D NULL || Guid =3D=3DNULL || String =3D=3D N= ULL) { + return EFI_INVALID_PARAMETER; + } + // + // Cache the event guid in string event record when PcdEdkiiFpdtString= RecordEnableOnly =3D=3D TRUE + // + CopyGuid (&ModuleGuid, Guid); + StringPtr =3D String; + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.DualGuidStringEvent->Header.Type =3D FPDT_DUAL_GU= ID_STRING_EVENT_TYPE; + FpdtRecordPtr.DualGuidStringEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.DualGuidStringEvent->Header.Revision =3D FPDT_RECORD_= REVISION_1; + FpdtRecordPtr.DualGuidStringEvent->ProgressID =3D PerfId; + FpdtRecordPtr.DualGuidStringEvent->Timestamp =3D TimeStamp; + CopyMem (&FpdtRecordPtr.DualGuidStringEvent->Guid1, CallerIdentifier= , sizeof (FpdtRecordPtr.DualGuidStringEvent->Guid1)); + CopyMem (&FpdtRecordPtr.DualGuidStringEvent->Guid2, Guid, sizeof (Fp= dtRecordPtr.DualGuidStringEvent->Guid2)); + DestMax =3D (RecordSize - sizeof (FPDT_DUAL_GUID_STRING_EVENT_RECORD= )) / sizeof (CHAR8); + StringLen =3D AsciiStrLen (StringPtr); + if (StringLen >=3D DestMax) { + StringLen =3D DestMax -1; + } + AsciiStrnCpyS (FpdtRecordPtr.DualGuidStringEvent->String, DestMax, S= tringPtr, StringLen); + } + break; + + case PERF_EVENT_ID: + case PERF_FUNCTION_START_ID: + case PERF_FUNCTION_END_ID: + case PERF_INMODULE_START_ID: + case PERF_INMODULE_END_ID: + case PERF_CROSSMODULE_START_ID: + case PERF_CROSSMODULE_END_ID: + if (CallerIdentifier =3D=3D NULL || String =3D=3D NULL) { + return EFI_INVALID_PARAMETER; + } + CopyGuid (&ModuleGuid, (EFI_GUID *) CallerIdentifier); + StringPtr =3D String; + if (!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.DynamicStringEvent->Header.Type =3D FPDT_DYNAMIC= _STRING_EVENT_TYPE; + FpdtRecordPtr.DynamicStringEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.DynamicStringEvent->Header.Revision =3D FPDT_RECORD_= REVISION_1; + FpdtRecordPtr.DynamicStringEvent->ProgressID =3D PerfId; + FpdtRecordPtr.DynamicStringEvent->Timestamp =3D TimeStamp; + CopyMem (&FpdtRecordPtr.DynamicStringEvent->Guid, CallerIdentifier, = sizeof (FpdtRecordPtr.DynamicStringEvent->Guid)); + DestMax =3D (RecordSize - sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD))= / sizeof (CHAR8); + StringLen =3D AsciiStrLen (StringPtr); + if (StringLen >=3D DestMax) { + StringLen =3D DestMax -1; + } + AsciiStrnCpyS (FpdtRecordPtr.DynamicStringEvent->String, DestMax, St= ringPtr, StringLen); + } + break; + + default: + return EFI_INVALID_PARAMETER; + } + + if (PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + FpdtRecordPtr.DynamicStringEvent->Header.Type =3D FPDT_DYNAMIC_S= TRING_EVENT_TYPE; + FpdtRecordPtr.DynamicStringEvent->Header.Length =3D RecordSize; + FpdtRecordPtr.DynamicStringEvent->Header.Revision =3D FPDT_RECORD_RE= VISION_1; + FpdtRecordPtr.DynamicStringEvent->ProgressID =3D PerfId; + FpdtRecordPtr.DynamicStringEvent->Timestamp =3D TimeStamp; + DestMax =3D (RecordSize - sizeof (FPDT_DYNAMIC_STRING_EVENT_RECORD)) /= sizeof (CHAR8); + if (StringPtr !=3D NULL && AsciiStrLen (StringPtr) =3D=3D 0) { + StringPtr =3D "unknown name"; + } + if (StringPtr !=3D NULL) { + StringLen =3D AsciiStrLen (StringPtr); + if (StringLen >=3D DestMax) { + StringLen =3D DestMax -1; + } + } + + CopyMem (&FpdtRecordPtr.DynamicStringEvent->Guid, &ModuleGuid, sizeof = (FpdtRecordPtr.DynamicStringEvent->Guid)); + AsciiStrnCpyS (FpdtRecordPtr.DynamicStringEvent->String, DestMax, Stri= ngPtr, StringLen); + + if ((PerfId =3D=3D MODULE_LOADIMAGE_END_ID) || (PerfId =3D=3D MODULE_E= ND_ID)) { + if (mCachedLength !=3D 0) { + CachedFpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANC= E_RECORD_HEADER *)((UINT8*)mSmmBootPerformanceTable + mCachedLength); + CopyMem (&CachedFpdtRecordPtr.DynamicStringEvent->Guid, &ModuleGui= d, sizeof (CachedFpdtRecordPtr.DynamicStringEvent->Guid)); + AsciiStrnCpyS (CachedFpdtRecordPtr.DynamicStringEvent->String, Des= tMax, StringPtr, StringLen); + mCachedLength =3D 0; + } + } + } + + // + // Update the cached FPDT record buffer. + // + mPerformanceLength +=3D FpdtRecordPtr.RecordHeader->Length; + mSmmBootPerformanceTable->Header.Length +=3D FpdtRecordPtr.RecordHeader-= >Length; + + return EFI_SUCCESS; +} + /** SmmReadyToBoot protocol notification event handler. =20 @param Protocol Points to the protocol's unique identifier @param Interface Points to the interface instance @@ -814,15 +1118,19 @@ CreatePerformanceMeasurement( IN PERF_MEASUREMENT_ATTRIBUTE Attribute ) { EFI_STATUS Status; =20 + Status =3D EFI_SUCCESS; + AcquireSpinLock (&mSmmFpdtLock); if (Attribute =3D=3D PerfStartEntry) { Status =3D InsertFpdtMeasurement (TRUE, CallerIdentifier, String, Stri= ng, TimeStamp, Identifier); } else if (Attribute =3D=3D PerfEndEntry) { Status =3D InsertFpdtMeasurement (FALSE, CallerIdentifier, String, Str= ing, TimeStamp, Identifier); + } else if (Attribute =3D=3D PerfEntry) { + Status =3D InsertFpdtRecord (CallerIdentifier, Guid, String, Address, = (UINT16) Identifier); } ReleaseSpinLock (&mSmmFpdtLock); return Status; } =20 @@ -1125,5 +1433,61 @@ PerformanceMeasurementEnabled ( VOID ) { return (BOOLEAN) ((PcdGet8(PcdPerformanceLibraryPropertyMask) & PERFORMA= NCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED) !=3D 0); } + +/** + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID + @param Guid - Pointer to a GUID + @param String - Pointer to a string describing the measurement + @param Address - Pointer to a location in memory relevant to t= he measurement + @param Identifier - Performance identifier describing the type of= measurement + + @retval RETURN_SUCCESS - Successfully created performance reco= rd + @retval RETURN_OUT_OF_RESOURCES - Ran out of space to store the records + @retval RETURN_INVALID_PARAMETER - Invalid parameter passed to function = - NULL + pointer or invalid PerfId + +**/ +RETURN_STATUS +EFIAPI +LogPerformanceMeasurement ( + IN CONST VOID *CallerIdentifier, + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT32 Identifier + ) +{ + return (RETURN_STATUS)CreatePerformanceMeasurement (CallerIdentifier, Gu= id, String, 0, Address, Identifier, PerfEntry); +} + +/** + Check whether the specified performance measurement can be logged. + + This function returns TRUE when the PERFORMANCE_LIBRARY_PROPERTY_MEASURE= MENT_ENABLED bit of PcdPerformanceLibraryPropertyMask is set + and the Type disable bit in PcdPerformanceLibraryPropertyMask is not set. + + @param Type - Type of the performance measurement entry. + + @retval TRUE The performance measurement can be logged. + @retval FALSE The performance measurement can NOT be logged. + +**/ +BOOLEAN +EFIAPI +LogPerformanceMeasurementEnabled ( + IN CONST UINTN Type + ) +{ + // + // When Performance measurement is enabled and the type is not filtered,= the performance can be logged. + // + if (PerformanceMeasurementEnabled () && (PcdGet8(PcdPerformanceLibraryPr= opertyMask) & Type) =3D=3D 0) { + return TRUE; + } + return FALSE; +} + diff --git a/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.c b/M= deModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.c index fd820c0e49c..830037befa6 100644 --- a/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.c +++ b/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.c @@ -395,5 +395,73 @@ PerformanceMeasurementEnabled ( VOID ) { return mPerformanceMeasurementEnabled; } + +/** + Create performance record with event description and a timestamp. + + @param CallerIdentifier - Image handle or pointer to caller ID GUID + @param Guid - Pointer to a GUID + @param String - Pointer to a string describing the measurement + @param Address - Pointer to a location in memory relevant to t= he measurement + @param Identifier - Performance identifier describing the type of= measurement + + @retval RETURN_SUCCESS - Successfully created performance reco= rd + @retval RETURN_OUT_OF_RESOURCES - Ran out of space to store the records + @retval RETURN_INVALID_PARAMETER - Invalid parameter passed to function = - NULL + pointer or invalid PerfId + +**/ +RETURN_STATUS +EFIAPI +LogPerformanceMeasurement ( + IN CONST VOID *CallerIdentifier, + IN CONST VOID *Guid, OPTIONAL + IN CONST CHAR8 *String, OPTIONAL + IN UINT64 Address, OPTIONAL + IN UINT32 Identifier + ) +{ + EFI_STATUS Status; + + Status =3D GetPerformanceMeasurementProtocol (); + if (EFI_ERROR (Status)) { + return RETURN_OUT_OF_RESOURCES; + } + + if (mPerformanceMeasurement !=3D NULL) { + Status =3D mPerformanceMeasurement->CreatePerformanceMeasurement (Call= erIdentifier, Guid, String, 0, Address, Identifier, PerfEntry); + } else { + ASSERT (FALSE); + } + + return (RETURN_STATUS) Status; +} + +/** + Check whether the specified performance measurement can be logged. + + This function returns TRUE when the PERFORMANCE_LIBRARY_PROPERTY_MEASURE= MENT_ENABLED bit of PcdPerformanceLibraryPropertyMask is set + and the Type disable bit in PcdPerformanceLibraryPropertyMask is not set. + + @param Type - Type of the performance measurement entry. + + @retval TRUE The performance measurement can be logged. + @retval FALSE The performance measurement can NOT be logged. + +**/ +BOOLEAN +EFIAPI +LogPerformanceMeasurementEnabled ( + IN CONST UINTN Type + ) +{ + // + // When Performance measurement is enabled and the type is not filtered,= the performance can be logged. + // + if (PerformanceMeasurementEnabled () && (PcdGet8(PcdPerformanceLibraryPr= opertyMask) & Type) =3D=3D 0) { + return TRUE; + } + return FALSE; +} --=20 2.14.3.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Sun May 5 09:12:48 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 152939320029231.61574438267212; Tue, 19 Jun 2018 00:26:40 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 7329E211299B7; Tue, 19 Jun 2018 00:26:39 -0700 (PDT) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 25F492112999C for ; Tue, 19 Jun 2018 00:26:38 -0700 (PDT) Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jun 2018 00:26:37 -0700 Received: from shwdeopenpsi114.ccr.corp.intel.com ([10.239.157.135]) by orsmga006.jf.intel.com with ESMTP; 19 Jun 2018 00:26:33 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.88; helo=mga01.intel.com; envelope-from=dandan.bi@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,242,1526367600"; d="scan'208";a="51022318" From: Dandan Bi To: edk2-devel@lists.01.org Date: Tue, 19 Jun 2018 15:24:02 +0800 Message-Id: <20180619072405.142872-7-dandan.bi@intel.com> X-Mailer: git-send-email 2.14.3.windows.1 In-Reply-To: <20180619072405.142872-1-dandan.bi@intel.com> References: <20180619072405.142872-1-dandan.bi@intel.com> Subject: [edk2] [patch 6/9] ShellPkg/dp: Update dp tool to parse new Perf record X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ruiyu Ni , Liming Gao MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Since performance library instances have been updated to create new FPDT records for new Perf macros. So enhance dp tool to parse the new FPDT records. Enhancement mainly includes: 1. parse the single records for PERF_EVENT macro 2. Parse the new added FPDT_DUAL_GUID_STRING_EVENT_RECORD Cc: Liming Gao Cc: Ruiyu Ni Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi --- ShellPkg/DynamicCommand/DpDynamicCommand/Dp.c | 75 +++++++++++++++++++++++= ---- ShellPkg/DynamicCommand/DpDynamicCommand/Dp.h | 1 + 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/ShellPkg/DynamicCommand/DpDynamicCommand/Dp.c b/ShellPkg/Dynam= icCommand/DpDynamicCommand/Dp.c index 38766613175..925341303a4 100644 --- a/ShellPkg/DynamicCommand/DpDynamicCommand/Dp.c +++ b/ShellPkg/DynamicCommand/DpDynamicCommand/Dp.c @@ -428,15 +428,29 @@ GetMeasurementInfo ( break; default: ASSERT(FALSE); } =20 - if (AsciiStrCmp (Measurement->Token, ALit_PEIM) =3D=3D 0) { - Measurement->Handle =3D &(((FPDT_GUID_EVENT_RECORD *)RecordH= eader)->Guid); + if (Measurement->Token !=3D NULL && AsciiStrCmp (Measurement->Token, A= Lit_PEIM) =3D=3D 0) { + Measurement->Handle =3D &(((FPDT_DYNAMIC_STRING_EVENT_RECORD= *)RecordHeader)->Guid); } else { GetHandleFormModuleGuid(ModuleGuid, &StartHandle); - Measurement->Handle =3D StartHandle; + Measurement->Handle =3D StartHandle; + // + // When no perf entry to record the PEI and DXE phase, + // For start image, we need detect the PEIM and non PEIM here. + // + if (Measurement->Token =3D=3D NULL) { + if (StartHandle =3D=3D NULL && !IsZeroGuid (ModuleGuid)) { + Measurement->Token =3D ALit_PEIM; + Measurement->Module =3D ALit_PEIM; + Measurement->Handle =3D ModuleGuid; + } else { + Measurement->Token =3D ALit_START_IMAGE; + Measurement->Module =3D ALit_START_IMAGE; + } + } } break; =20 case FPDT_DYNAMIC_STRING_EVENT_TYPE: ModuleGuid =3D &(((FPDT_DYNAMIC_STRING_EVENT_RECORD= *)RecordHeader)->Guid); @@ -481,15 +495,27 @@ GetMeasurementInfo ( break; } =20 Measurement->Module =3D ((FPDT_DYNAMIC_STRING_EVENT_RECORD *= )RecordHeader)->String; =20 - if (AsciiStrCmp (Measurement->Token, ALit_PEIM) =3D=3D 0) { + if (Measurement->Token !=3D NULL && AsciiStrCmp (Measurement->Token, A= Lit_PEIM) =3D=3D 0) { Measurement->Handle =3D &(((FPDT_DYNAMIC_STRING_EVENT_RECORD= *)RecordHeader)->Guid); } else { GetHandleFormModuleGuid(ModuleGuid, &StartHandle); Measurement->Handle =3D StartHandle; + // + // When no perf entry to record the PEI and DXE phase, + // For start image, we need detect the PEIM and non PEIM here. + // + if (Measurement->Token =3D=3D NULL && (Measurement->Identifier =3D= =3D MODULE_START_ID || Measurement->Identifier =3D=3D MODULE_END_ID)) { + if (StartHandle =3D=3D NULL && !IsZeroGuid (ModuleGuid)) { + Measurement->Token =3D ALit_PEIM; + Measurement->Handle =3D ModuleGuid; + } else { + Measurement->Token =3D ALit_START_IMAGE; + } + } } break; =20 case FPDT_GUID_QWORD_EVENT_TYPE: ModuleGuid =3D &(((FPDT_GUID_QWORD_EVENT_RECORD *)R= ecordHeader)->Guid); @@ -551,10 +577,24 @@ GetMeasurementInfo ( } GetHandleFormModuleGuid(ModuleGuid, &StartHandle); Measurement->Handle =3D StartHandle; break; =20 + case FPDT_DUAL_GUID_STRING_EVENT_TYPE: + ModuleGuid =3D &(((FPDT_DUAL_GUID_STRING_EVENT_RECO= RD *)RecordHeader)->Guid1); + Measurement->Identifier =3D ((UINT32)((FPDT_DUAL_GUID_STRING_EVE= NT_RECORD *)RecordHeader)->ProgressID); + if (IsStart) { + Measurement->StartTimeStamp =3D ((FPDT_DUAL_GUID_STRING_EVENT_RECORD= *)RecordHeader)->Timestamp; + } else { + Measurement->EndTimeStamp =3D ((FPDT_DUAL_GUID_STRING_EVENT_RECORD= *)RecordHeader)->Timestamp; + } + Measurement->Token =3D ((FPDT_DUAL_GUID_STRING_EVENT_RECORD= *)RecordHeader)->String; + Measurement->Module =3D ((FPDT_DUAL_GUID_STRING_EVENT_RECORD= *)RecordHeader)->String; + GetHandleFormModuleGuid(ModuleGuid, &StartHandle); + Measurement->Handle =3D StartHandle; + break; + default: break; } } =20 @@ -578,10 +618,18 @@ SearchMeasurement ( (AsciiStrCmp (mMeasurementList[Index].Token, EndMeasureMent->Tok= en) =3D=3D 0) && (AsciiStrCmp (mMeasurementList[Index].Module, EndMeasureMent->Mo= dule) =3D=3D 0)) { mMeasurementList[Index].EndTimeStamp =3D EndMeasureMent->EndTimeSt= amp; break; } + } else if (EndMeasureMent->Identifier =3D=3D PERF_CROSSMODULE_END_ID) { + if (mMeasurementList[Index].EndTimeStamp =3D=3D 0 && + (AsciiStrCmp (mMeasurementList[Index].Token, EndMeasureMent->Toke= n) =3D=3D 0) && + (AsciiStrCmp (mMeasurementList[Index].Module, EndMeasureMent->Mod= ule) =3D=3D 0) && + mMeasurementList[Index].Identifier =3D=3D PERF_CROSSMODULE_START_= ID) { + mMeasurementList[Index].EndTimeStamp =3D EndMeasureMent->EndTimeSt= amp; + break; + } } else { if (mMeasurementList[Index].EndTimeStamp =3D=3D 0 && mMeasurementLis= t[Index].Handle =3D=3D EndMeasureMent->Handle && (AsciiStrCmp (mMeasurementList[Index].Token, EndMeasureMent->Toke= n) =3D=3D 0) && (AsciiStrCmp (mMeasurementList[Index].Module, EndMeasureMent->Mod= ule) =3D=3D 0)) { mMeasurementList[Index].EndTimeStamp =3D EndMeasureMent->EndTimeSt= amp; @@ -618,29 +666,36 @@ BuildMeasurementList ( RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_HEADER*) P= erformanceTablePtr; StartRecordEvent =3D (UINT8 *)RecordHeader; StartProgressId =3D ((FPDT_GUID_EVENT_RECORD *)StartRecordEvent)->Pr= ogressID; =20 // + // If the record with ProgressId 0, the record doesn't appear in pairs= . The timestamp in the record is the EndTimeStamp, its StartTimeStamp is 0. // If the record is the start record, fill the info to the measurement= in the mMeasurementList. // If the record is the end record, find the related start measurement= in the mMeasurementList and fill the EndTimeStamp. // - if (((StartProgressId >=3D PERF_EVENTSIGNAL_START_ID && ((StartProgres= sId & 0x000F) =3D=3D 0)) || + if (StartProgressId =3D=3D 0) { + GetMeasurementInfo (RecordHeader, FALSE, &(mMeasurementList[mMeasure= mentNum])); + mMeasurementNum ++; + } else if (((StartProgressId >=3D PERF_EVENTSIGNAL_START_ID && ((Start= ProgressId & 0x000F) =3D=3D 0)) || (StartProgressId < PERF_EVENTSIGNAL_START_ID && ((StartProgressId = & 0x0001) !=3D 0)))) { // // Since PEIM and StartImage has same Type and ID when PCD PcdEdkiiF= pdtStringRecordEnableOnly =3D FALSE // So we need to identify these two kinds of record through differen= t phase. // - if (AsciiStrCmp (((FPDT_DYNAMIC_STRING_EVENT_RECORD *)StartRecordEve= nt)->String, ALit_PEI) =3D=3D 0) { - mPeiPhase =3D TRUE; - } else if (AsciiStrCmp (((FPDT_DYNAMIC_STRING_EVENT_RECORD *)StartRe= cordEvent)->String, ALit_DXE) =3D=3D 0) { - mDxePhase =3D TRUE; - mPeiPhase =3D FALSE; + if(StartProgressId =3D=3D PERF_CROSSMODULE_START_ID ){ + if (AsciiStrCmp (((FPDT_DYNAMIC_STRING_EVENT_RECORD *)StartRecordE= vent)->String, ALit_PEI) =3D=3D 0) { + mPeiPhase =3D TRUE; + } else if (AsciiStrCmp (((FPDT_DYNAMIC_STRING_EVENT_RECORD *)Start= RecordEvent)->String, ALit_DXE) =3D=3D 0) { + mDxePhase =3D TRUE; + mPeiPhase =3D FALSE; + } } // Get measurement info form the start record to the mMeasurementLis= t. GetMeasurementInfo (RecordHeader, TRUE, &(mMeasurementList[mMeasurem= entNum])); mMeasurementNum ++; } else { + ZeroMem(&MeasureMent, sizeof(MEASUREMENT_RECORD)); GetMeasurementInfo (RecordHeader, FALSE, &MeasureMent); SearchMeasurement (&MeasureMent); } TableLength +=3D RecordHeader->Length; PerformanceTablePtr +=3D RecordHeader->Length; diff --git a/ShellPkg/DynamicCommand/DpDynamicCommand/Dp.h b/ShellPkg/Dynam= icCommand/DpDynamicCommand/Dp.h index aae021334d6..96bc89db8dc 100644 --- a/ShellPkg/DynamicCommand/DpDynamicCommand/Dp.h +++ b/ShellPkg/DynamicCommand/DpDynamicCommand/Dp.h @@ -39,10 +39,11 @@ #include #include #include #include #include +#include =20 extern EFI_HANDLE mDpHiiHandle; =20 #define DP_MAJOR_VERSION 2 #define DP_MINOR_VERSION 5 --=20 2.14.3.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Sun May 5 09:12:48 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1529393212445608.3571316032068; Tue, 19 Jun 2018 00:26:52 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id A96252112A28A; Tue, 19 Jun 2018 00:26:51 -0700 (PDT) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 961F421106A33 for ; Tue, 19 Jun 2018 00:26:49 -0700 (PDT) Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jun 2018 00:26:49 -0700 Received: from shwdeopenpsi114.ccr.corp.intel.com ([10.239.157.135]) by orsmga006.jf.intel.com with ESMTP; 19 Jun 2018 00:26:45 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.31; helo=mga06.intel.com; envelope-from=dandan.bi@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,242,1526367600"; d="scan'208";a="51022369" From: Dandan Bi To: edk2-devel@lists.01.org Date: Tue, 19 Jun 2018 15:24:03 +0800 Message-Id: <20180619072405.142872-8-dandan.bi@intel.com> X-Mailer: git-send-email 2.14.3.windows.1 In-Reply-To: <20180619072405.142872-1-dandan.bi@intel.com> References: <20180619072405.142872-1-dandan.bi@intel.com> Subject: [edk2] [patch 7/9] MdeModulePkg: Use new added Perf macros X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Star Zeng , Liming Gao , Eric Dong MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Replace old Perf macros with the new added ones. Cc: Liming Gao Cc: Star Zeng Cc: Eric Dong Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi --- MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c | 7 +++++ MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c | 8 ++---- MdeModulePkg/Core/Dxe/Hand/DriverSupport.c | 8 +++--- MdeModulePkg/Core/Dxe/Image/Image.c | 30 +++++-------------= ---- MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c | 8 +++--- MdeModulePkg/Core/Pei/PeiMain/PeiMain.c | 17 ++++++------ MdeModulePkg/Core/PiSmmCore/Dispatcher.c | 15 ++++------- MdeModulePkg/Core/PiSmmCore/PiSmmCore.c | 4 +-- MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c | 2 +- .../Library/UefiBootManagerLib/BmConsole.c | 9 +++---- MdeModulePkg/Universal/BdsDxe/BdsEntry.c | 21 ++++++++------- 11 files changed, 53 insertions(+), 76 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c b/MdeModulePkg/C= ore/Dxe/Dispatcher/Dispatcher.c index 088cd810631..4c6ca761a60 100644 --- a/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c +++ b/MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c @@ -417,10 +417,11 @@ CoreDispatcher ( LIST_ENTRY *Link; EFI_CORE_DRIVER_ENTRY *DriverEntry; BOOLEAN ReadyToRun; EFI_EVENT DxeDispatchEvent; =20 + PERF_FUNCTION_BEGIN (); =20 if (gDispatcherRunning) { // // If the dispatcher is running don't let it be restarted. // @@ -582,10 +583,12 @@ CoreDispatcher ( // CoreCloseEvent (DxeDispatchEvent); =20 gDispatcherRunning =3D FALSE; =20 + PERF_FUNCTION_END (); + return ReturnStatus; } =20 =20 /** @@ -1435,17 +1438,21 @@ CoreFwVolEventProtocolNotify ( VOID CoreInitializeDispatcher ( VOID ) { + PERF_FUNCTION_BEGIN (); + mFwVolEvent =3D EfiCreateProtocolNotifyEvent ( &gEfiFirmwareVolume2ProtocolGuid, TPL_CALLBACK, CoreFwVolEventProtocolNotify, NULL, &mFwVolEventRegistration ); + + PERF_FUNCTION_END (); } =20 // // Function only used in debug builds // diff --git a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c b/MdeModulePkg/Core/Dx= e/DxeMain/DxeMain.c index 07c74034624..3f753738a27 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c +++ b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c @@ -299,12 +299,12 @@ DxeMain ( =20 // // Call constructor for all libraries // ProcessLibraryConstructorList (gDxeCoreImageHandle, gDxeCoreST); - PERF_END (NULL,"PEI", NULL, 0) ; - PERF_START (NULL,"DXE", NULL, 0) ; + PERF_CROSSMODULE_END ("PEI"); + PERF_CROSSMODULE_BEGIN ("DXE"); =20 // // Report DXE Core image information to the PE/COFF Extra Action Library // ZeroMem (&ImageContext, sizeof (ImageContext)); @@ -497,20 +497,16 @@ DxeMain ( ASSERT_EFI_ERROR (Status); =20 // // Initialize the DXE Dispatcher // - PERF_START (NULL,"CoreInitializeDispatcher", "DxeMain", 0) ; CoreInitializeDispatcher (); - PERF_END (NULL,"CoreInitializeDispatcher", "DxeMain", 0) ; =20 // // Invoke the DXE Dispatcher // - PERF_START (NULL, "CoreDispatcher", "DxeMain", 0); CoreDispatcher (); - PERF_END (NULL, "CoreDispatcher", "DxeMain", 0); =20 // // Display Architectural protocols that were not loaded if this is DEBUG= build // DEBUG_CODE_BEGIN (); diff --git a/MdeModulePkg/Core/Dxe/Hand/DriverSupport.c b/MdeModulePkg/Core= /Dxe/Hand/DriverSupport.c index 33dd0bd0b7c..ab3cc0c07e5 100644 --- a/MdeModulePkg/Core/Dxe/Hand/DriverSupport.c +++ b/MdeModulePkg/Core/Dxe/Hand/DriverSupport.c @@ -625,32 +625,32 @@ CoreConnectSingleController ( DriverBinding =3D NULL; DriverFound =3D FALSE; for (Index =3D 0; (Index < NumberOfSortedDriverBindingProtocols) && !D= riverFound; Index++) { if (SortedDriverBindingProtocols[Index] !=3D NULL) { DriverBinding =3D SortedDriverBindingProtocols[Index]; - PERF_START (DriverBinding->DriverBindingHandle, "DB:Support:", NUL= L, 0); + PERF_DRIVER_BINDING_SUPPORT_BEGIN (DriverBinding->DriverBindingHan= dle, ControllerHandle); Status =3D DriverBinding->Supported( DriverBinding, ControllerHandle, RemainingDevicePath ); - PERF_END (DriverBinding->DriverBindingHandle, "DB:Support:", NULL,= 0); + PERF_DRIVER_BINDING_SUPPORT_END (DriverBinding->DriverBindingHandl= e, ControllerHandle); if (!EFI_ERROR (Status)) { SortedDriverBindingProtocols[Index] =3D NULL; DriverFound =3D TRUE; =20 // // A driver was found that supports ControllerHandle, so attempt= to start the driver // on ControllerHandle. // - PERF_START (DriverBinding->DriverBindingHandle, "DB:Start:", NUL= L, 0); + PERF_DRIVER_BINDING_START_BEGIN (DriverBinding->DriverBindingHan= dle, ControllerHandle); Status =3D DriverBinding->Start ( DriverBinding, ControllerHandle, RemainingDevicePath ); - PERF_END (DriverBinding->DriverBindingHandle, "DB:Start:", NULL,= 0); + PERF_DRIVER_BINDING_START_END (DriverBinding->DriverBindingHandl= e, ControllerHandle); =20 if (!EFI_ERROR (Status)) { // // The driver was successfully started on ControllerHandle, so= set a flag // diff --git a/MdeModulePkg/Core/Dxe/Image/Image.c b/MdeModulePkg/Core/Dxe/Im= age/Image.c index c49ddfcc81d..adeb4bf313a 100644 --- a/MdeModulePkg/Core/Dxe/Image/Image.c +++ b/MdeModulePkg/Core/Dxe/Image/Image.c @@ -1434,17 +1434,13 @@ CoreLoadImage ( IN UINTN SourceSize, OUT EFI_HANDLE *ImageHandle ) { EFI_STATUS Status; - UINT64 Tick; EFI_HANDLE Handle; =20 - Tick =3D 0; - PERF_CODE ( - Tick =3D GetPerformanceCounter (); - ); + PERF_LOAD_IMAGE_BEGIN (NULL); =20 Status =3D CoreLoadImageCommon ( BootPolicy, ParentImageHandle, FilePath, @@ -1463,12 +1459,11 @@ CoreLoadImage ( // ImageHandle will be valid only Status is success.=20 // Handle =3D *ImageHandle; } =20 - PERF_START (Handle, "LoadImage:", NULL, Tick); - PERF_END (Handle, "LoadImage:", NULL, 0); + PERF_LOAD_IMAGE_END (Handle); =20 return Status; } =20 =20 @@ -1524,17 +1519,13 @@ CoreLoadImageEx ( OUT EFI_PHYSICAL_ADDRESS *EntryPoint OPTIONAL, IN UINT32 Attribute ) { EFI_STATUS Status; - UINT64 Tick; EFI_HANDLE Handle; =20 - Tick =3D 0; - PERF_CODE ( - Tick =3D GetPerformanceCounter (); - ); + PERF_LOAD_IMAGE_BEGIN (NULL); =20 Status =3D CoreLoadImageCommon ( TRUE, ParentImageHandle, FilePath, @@ -1553,12 +1544,11 @@ CoreLoadImageEx ( // ImageHandle will be valid only Status is success.=20 // Handle =3D *ImageHandle; } =20 - PERF_START (Handle, "LoadImage:", NULL, Tick); - PERF_END (Handle, "LoadImage:", NULL, 0); + PERF_LOAD_IMAGE_END (Handle); =20 return Status; } =20 =20 @@ -1592,14 +1582,12 @@ CoreStartImage ( EFI_STATUS Status; LOADED_IMAGE_PRIVATE_DATA *Image; LOADED_IMAGE_PRIVATE_DATA *LastImage; UINT64 HandleDatabaseKey; UINTN SetJumpFlag; - UINT64 Tick; EFI_HANDLE Handle; =20 - Tick =3D 0; Handle =3D ImageHandle; =20 Image =3D CoreLoadedImageInfo (ImageHandle); if (Image =3D=3D NULL || Image->Started) { return EFI_INVALID_PARAMETER; @@ -1619,13 +1607,11 @@ CoreStartImage ( DEBUG ((EFI_D_ERROR, "Image type %s can't be started ", GetMachineType= Name(Image->Machine))); DEBUG ((EFI_D_ERROR, "on %s UEFI system.\n", GetMachineTypeName(mDxeCo= reImageMachineType))); return EFI_UNSUPPORTED; } =20 - PERF_CODE ( - Tick =3D GetPerformanceCounter (); - ); + PERF_START_IMAGE_BEGIN (Handle); =20 =20 // // Push the current start image context, and // link the current image to the head. This is the @@ -1645,12 +1631,11 @@ CoreStartImage ( if (Image->JumpBuffer =3D=3D NULL) { // // Image may be unloaded after return with failure, // then ImageHandle may be invalid, so use NULL handle to record perf = log. // - PERF_START (NULL, "StartImage:", NULL, Tick); - PERF_END (NULL, "StartImage:", NULL, 0); + PERF_START_IMAGE_END (NULL); =20 // // Pop the current start image context // mCurrentImage =3D LastImage; @@ -1761,12 +1746,11 @@ CoreStartImage ( } =20 // // Done // - PERF_START (Handle, "StartImage:", NULL, Tick); - PERF_END (Handle, "StartImage:", NULL, 0); + PERF_START_IMAGE_END (Handle); return Status; } =20 /** Terminates the currently loaded EFI image and returns control to boot se= rvices. diff --git a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c b/MdeModulePkg/C= ore/Pei/Dispatcher/Dispatcher.c index 0ac3fdde6a9..c4f629dadff 100644 --- a/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c +++ b/MdeModulePkg/Core/Pei/Dispatcher/Dispatcher.c @@ -998,13 +998,13 @@ PeiDispatcher ( // // Call the PEIM entry point // PeimEntryPoint =3D (EFI_PEIM_ENTRY_POINT2)(UINTN)EntryPoint; =20 - PERF_START (PeimFileHandle, "PEIM", NULL, 0); + PERF_START_IMAGE_BEGIN (PeimFileHandle); PeimEntryPoint(PeimFileHandle, (const EFI_PEI_SERVICES **) &Pr= ivate->Ps); - PERF_END (PeimFileHandle, "PEIM", NULL, 0); + PERF_START_IMAGE_END (PeimFileHandle); } =20 // // Process the Notify list and dispatch any notifies for // newly installed PPIs. @@ -1107,11 +1107,11 @@ PeiDispatcher ( if (Status =3D=3D EFI_SUCCESS) { // // The PEIM has its dependencies satisfied, and its entry = point // has been found, so invoke it. // - PERF_START (PeimFileHandle, "PEIM", NULL, 0); + PERF_START_IMAGE_BEGIN (PeimFileHandle); =20 REPORT_STATUS_CODE_WITH_EXTENDED_DATA ( EFI_PROGRESS_CODE, (EFI_SOFTWARE_PEI_CORE | EFI_SW_PC_INIT_BEGIN), (VOID *)(&PeimFileHandle), @@ -1143,11 +1143,11 @@ PeiDispatcher ( EFI_PROGRESS_CODE, (EFI_SOFTWARE_PEI_CORE | EFI_SW_PC_INIT_END), (VOID *)(&PeimFileHandle), sizeof (PeimFileHandle) ); - PERF_END (PeimFileHandle, "PEIM", NULL, 0); + PERF_START_IMAGE_END (PeimFileHandle); =20 } } =20 PeiCheckAndSwitchStack (SecCoreData, Private); diff --git a/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c b/MdeModulePkg/Core/Pe= i/PeiMain/PeiMain.c index 775bf18ce93..a52e6f02017 100644 --- a/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c +++ b/MdeModulePkg/Core/Pei/PeiMain/PeiMain.c @@ -350,22 +350,21 @@ PeiCore ( =20 // // Update performance measurements=20 // if (OldCoreData =3D=3D NULL) { - PERF_START (NULL, "SEC", NULL, 1); - PERF_END (NULL, "SEC", NULL, 0); + PERF_EVENT ("SEC"); // Means the end of SEC phase. =20 // // If first pass, start performance measurement. // - PERF_START (NULL,"PEI", NULL, 0); - PERF_START (NULL,"PreMem", NULL, 0); + PERF_CROSSMODULE_BEGIN ("PEI"); + PERF_INMODULE_BEGIN ("PreMem"); =20 } else { - PERF_END (NULL,"PreMem", NULL, 0); - PERF_START (NULL,"PostMem", NULL, 0); + PERF_INMODULE_END ("PreMem"); + PERF_INMODULE_BEGIN ("PostMem"); } =20 // // Complete PEI Core Service initialization // =20 @@ -409,19 +408,19 @@ PeiCore ( } =20 // // Alert any listeners that there is permanent memory available // - PERF_START (NULL,"DisMem", NULL, 0); + PERF_INMODULE_BEGIN ("DisMem"); Status =3D PeiServicesInstallPpi (&mMemoryDiscoveredPpi); =20 // // Process the Notify list and dispatch any notifies for the Memory Di= scovered PPI // ProcessNotifyList (&PrivateData); =20 - PERF_END (NULL,"DisMem", NULL, 0); + PERF_INMODULE_END ("DisMem"); } =20 // // Call PEIM dispatcher // @@ -435,11 +434,11 @@ PeiCore ( } =20 // // Measure PEI Core execution time. // - PERF_END (NULL, "PostMem", NULL, 0); + PERF_INMODULE_END ("PostMem"); =20 // // Lookup DXE IPL PPI // Status =3D PeiServicesLocatePpi ( diff --git a/MdeModulePkg/Core/PiSmmCore/Dispatcher.c b/MdeModulePkg/Core/P= iSmmCore/Dispatcher.c index f32bbbd1b4b..0b3b5924d38 100644 --- a/MdeModulePkg/Core/PiSmmCore/Dispatcher.c +++ b/MdeModulePkg/Core/PiSmmCore/Dispatcher.c @@ -319,17 +319,13 @@ SmmLoadImage ( EFI_DEVICE_PATH_PROTOCOL *FilePath; EFI_DEVICE_PATH_PROTOCOL *OriginalFilePath; EFI_DEVICE_PATH_PROTOCOL *HandleFilePath; EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; - UINT64 Tick; =20 - Tick =3D 0; - PERF_CODE ( - Tick =3D GetPerformanceCounter (); - ); - =20 + PERF_LOAD_IMAGE_BEGIN (DriverEntry->ImageHandle); + Buffer =3D NULL; Size =3D 0; Fv =3D DriverEntry->Fv; NameGuid =3D &DriverEntry->FileName; FilePath =3D DriverEntry->FvFileDevicePath; @@ -639,12 +635,11 @@ SmmLoadImage ( &gEfiLoadedImageProtocolGuid, EFI_NATIVE_INTERFACE, &DriverEntry->SmmLoadedImage ); =20 - PERF_START (DriverEntry->ImageHandle, "LoadImage:", NULL, Tick); - PERF_END (DriverEntry->ImageHandle, "LoadImage:", NULL, 0); + PERF_LOAD_IMAGE_END (DriverEntry->ImageHandle); =20 // // Print the load address and the PDB file name if it is available // =20 @@ -907,13 +902,13 @@ SmmDispatcher ( =20 // // For each SMM driver, pass NULL as ImageHandle // RegisterSmramProfileImage (DriverEntry, TRUE); - PERF_START (DriverEntry->ImageHandle, "StartImage:", NULL, 0); + PERF_START_IMAGE_BEGIN (DriverEntry->ImageHandle); Status =3D ((EFI_IMAGE_ENTRY_POINT)(UINTN)DriverEntry->ImageEntryPoi= nt)(DriverEntry->ImageHandle, gST); - PERF_END (DriverEntry->ImageHandle, "StartImage:", NULL, 0); + PERF_START_IMAGE_END (DriverEntry->ImageHandle); if (EFI_ERROR(Status)){ UnregisterSmramProfileImage (DriverEntry, TRUE); SmmFreePages(DriverEntry->ImageBuffer, DriverEntry->NumberOfPage); // // Uninstall LoadedImage diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c b/MdeModulePkg/Core/Pi= SmmCore/PiSmmCore.c index 686b9b45a55..45f40e0e60c 100644 --- a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.c @@ -642,11 +642,11 @@ SmmEntryPoint ( BOOLEAN InLegacyBoot; BOOLEAN IsOverlapped; VOID *CommunicationBuffer; UINTN BufferSize; =20 - PERF_START (NULL, "SMM", NULL, 0) ; + PERF_INMODULE_BEGIN ("SMM"); =20 // // Update SMST with contents of the SmmEntryContext structure // gSmmCoreSmst.SmmStartupThisAp =3D SmmEntryContext->SmmStartupThisAp; @@ -737,11 +737,11 @@ SmmEntryPoint ( // Clear the InSmm flag as we are going to leave SMM // gSmmCorePrivate->InSmm =3D FALSE; } =20 - PERF_END (NULL, "SMM", NULL, 0) ; + PERF_INMODULE_END ("SMM"); } =20 /** Install LoadedImage protocol for SMM Core. **/ diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c b/MdeModulePk= g/Library/UefiBootManagerLib/BmBoot.c index b842d5824ae..59bd1e4c6c0 100644 --- a/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmBoot.c @@ -43,11 +43,11 @@ BmEndOfBdsPerfCode ( ) { // // Record the performance data for End of BDS // - PERF_END(NULL, "BDS", NULL, 0); + PERF_CROSSMODULE_END("BDS"); =20 return ; } =20 /** diff --git a/MdeModulePkg/Library/UefiBootManagerLib/BmConsole.c b/MdeModul= ePkg/Library/UefiBootManagerLib/BmConsole.c index 80511814eec..d85b603d64a 100644 --- a/MdeModulePkg/Library/UefiBootManagerLib/BmConsole.c +++ b/MdeModulePkg/Library/UefiBootManagerLib/BmConsole.c @@ -720,27 +720,24 @@ EfiBootManagerConnectAllDefaultConsoles ( =20 Status =3D EfiBootManagerConnectConsoleVariable (ConOut); if (!EFI_ERROR (Status)) { OneConnected =3D TRUE; } - PERF_START (NULL, "ConOutReady", "BDS", 1); - PERF_END (NULL, "ConOutReady", "BDS", 0); + PERF_EVENT ("ConOutReady"); =20 =20 Status =3D EfiBootManagerConnectConsoleVariable (ConIn); if (!EFI_ERROR (Status)) { OneConnected =3D TRUE; } - PERF_START (NULL, "ConInReady", "BDS", 1); - PERF_END (NULL, "ConInReady", "BDS", 0); + PERF_EVENT ("ConInReady"); =20 Status =3D EfiBootManagerConnectConsoleVariable (ErrOut); if (!EFI_ERROR (Status)) { OneConnected =3D TRUE; } - PERF_START (NULL, "ErrOutReady", "BDS", 1); - PERF_END (NULL, "ErrOutReady", "BDS", 0); + PERF_EVENT ("ErrOutReady"); =20 SystemTableUpdated =3D FALSE; // // Fill console handles in System Table if no console device assignd. // diff --git a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c b/MdeModulePkg/Univer= sal/BdsDxe/BdsEntry.c index 3191a986304..acb25abfcd4 100644 --- a/MdeModulePkg/Universal/BdsDxe/BdsEntry.c +++ b/MdeModulePkg/Universal/BdsDxe/BdsEntry.c @@ -723,12 +723,12 @@ BdsEntry ( BootSuccess =3D FALSE; =20 // // Insert the performance probe // - PERF_END (NULL, "DXE", NULL, 0); - PERF_START (NULL, "BDS", NULL, 0); + PERF_CROSSMODULE_END("DXE"); + PERF_CROSSMODULE_BEGIN("BDS"); DEBUG ((EFI_D_INFO, "[Bds] Entry...\n")); =20 // // Fill in FirmwareVendor and FirmwareRevision from PCDs // @@ -886,13 +886,13 @@ BdsEntry ( // > Register new Driver#### or Boot#### // > Register new Key####: e.g.: F12=20 // > Signal ReadyToLock event // > Authentication action: 1. connect Auth devices; 2. Identify auto lo= gon user. // - PERF_START (NULL, "PlatformBootManagerBeforeConsole", "BDS", 0); + PERF_INMODULE_BEGIN("PlatformBootManagerBeforeConsole"); PlatformBootManagerBeforeConsole (); - PERF_END (NULL, "PlatformBootManagerBeforeConsole", "BDS", 0); + PERF_INMODULE_END("PlatformBootManagerBeforeConsole"); =20 // // Initialize hotkey service // EfiBootManagerStartHotkeyService (&HotkeyTriggered); @@ -905,21 +905,21 @@ BdsEntry ( EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount); =20 // // Connect consoles // - PERF_START (NULL, "EfiBootManagerConnectAllDefaultConsoles", "BDS", 0); + PERF_INMODULE_BEGIN("EfiBootManagerConnectAllDefaultConsoles"); if (PcdGetBool (PcdConInConnectOnDemand)) { EfiBootManagerConnectConsoleVariable (ConOut); EfiBootManagerConnectConsoleVariable (ErrOut); // // Do not connect ConIn devices when lazy ConIn feature is ON. // } else { EfiBootManagerConnectAllDefaultConsoles (); } - PERF_END (NULL, "EfiBootManagerConnectAllDefaultConsoles", "BDS", 0); + PERF_INMODULE_END("EfiBootManagerConnectAllDefaultConsoles"); =20 // // Do the platform specific action after the console is ready // Possible things that can be done in PlatformBootManagerAfterConsole: // > Console post action: @@ -928,13 +928,13 @@ BdsEntry ( // > Run diagnostics like memory testing // > Connect certain devices // > Dispatch aditional option roms // > Special boot: e.g.: USB boot, enter UI //=20 - PERF_START (NULL, "PlatformBootManagerAfterConsole", "BDS", 0); + PERF_INMODULE_BEGIN("PlatformBootManagerAfterConsole"); PlatformBootManagerAfterConsole (); - PERF_END (NULL, "PlatformBootManagerAfterConsole", "BDS", 0); + PERF_INMODULE_END("PlatformBootManagerAfterConsole"); // // Boot to Boot Manager Menu when EFI_OS_INDICATIONS_BOOT_TO_FW_UI is se= t. Skip HotkeyBoot // DataSize =3D sizeof (UINT64); Status =3D gRT->GetVariable ( @@ -1023,14 +1023,13 @@ BdsEntry ( EfiBootManagerFreeLoadOptions (LoadOptions, LoadOptionCount); =20 // // Execute Key#### // - PERF_START (NULL, "BdsWait", "BDS", 0); + PERF_INMODULE_BEGIN ("BdsWait"); BdsWait (HotkeyTriggered); - PERF_END (NULL, "BdsWait", "BDS", 0); - + PERF_INMODULE_END ("BdsWait"); // // BdsReadKeys() can be removed after all keyboard drivers invoke call= back in timer callback. // BdsReadKeys (); =20 --=20 2.14.3.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Sun May 5 09:12:48 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1529393216764883.0145028991807; Tue, 19 Jun 2018 00:26:56 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id E7EE92112A291; Tue, 19 Jun 2018 00:26:53 -0700 (PDT) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D53E821106A33 for ; Tue, 19 Jun 2018 00:26:51 -0700 (PDT) Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jun 2018 00:26:51 -0700 Received: from shwdeopenpsi114.ccr.corp.intel.com ([10.239.157.135]) by orsmga006.jf.intel.com with ESMTP; 19 Jun 2018 00:26:51 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.31; helo=mga06.intel.com; envelope-from=dandan.bi@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,242,1526367600"; d="scan'208";a="51022380" From: Dandan Bi To: edk2-devel@lists.01.org Date: Tue, 19 Jun 2018 15:24:04 +0800 Message-Id: <20180619072405.142872-9-dandan.bi@intel.com> X-Mailer: git-send-email 2.14.3.windows.1 In-Reply-To: <20180619072405.142872-1-dandan.bi@intel.com> References: <20180619072405.142872-1-dandan.bi@intel.com> Subject: [edk2] [patch 8/9] SecurityPkg: Use new added Perf macros X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Chao Zhang , Liming Gao MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Replace old Perf macros with the new added ones. Cc: Liming Gao Cc: Chao Zhang Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi --- .../DxeRsa2048Sha256GuidedSectionExtractLib.c | 16 ++++++++----= ---- .../PeiRsa2048Sha256GuidedSectionExtractLib.c | 16 ++++++++----= ---- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/SecurityPkg/Library/DxeRsa2048Sha256GuidedSectionExtractLib/Dx= eRsa2048Sha256GuidedSectionExtractLib.c b/SecurityPkg/Library/DxeRsa2048Sha= 256GuidedSectionExtractLib/DxeRsa2048Sha256GuidedSectionExtractLib.c index 39768fbac22..d6f4207a506 100644 --- a/SecurityPkg/Library/DxeRsa2048Sha256GuidedSectionExtractLib/DxeRsa204= 8Sha256GuidedSectionExtractLib.c +++ b/SecurityPkg/Library/DxeRsa2048Sha256GuidedSectionExtractLib/DxeRsa204= 8Sha256GuidedSectionExtractLib.c @@ -161,13 +161,13 @@ Rsa2048Sha256GuidedSectionHandler ( // Get the RSA 2048 SHA 256 information. // CertBlockRsa2048Sha256 =3D &((RSA_2048_SHA_256_SECTION2_HEADER *) Inpu= tSection)->CertBlockRsa2048Sha256; OutputBufferSize =3D SECTION2_SIZE (InputSection) - sizeof (RSA_= 2048_SHA_256_SECTION2_HEADER); if ((((EFI_GUID_DEFINED_SECTION *)InputSection)->Attributes & EFI_GUID= ED_SECTION_PROCESSING_REQUIRED) !=3D 0) { - PERF_START (NULL, "RsaCopy", "DXE", 0); + PERF_INMODULE_BEGIN ("DxeRsaCopy"); CopyMem (*OutputBuffer, (UINT8 *)InputSection + sizeof (RSA_2048_SHA= _256_SECTION2_HEADER), OutputBufferSize); - PERF_END (NULL, "RsaCopy", "DXE", 0); + PERF_INMODULE_END ("DxeRsaCopy"); } else { *OutputBuffer =3D (UINT8 *)InputSection + sizeof (RSA_2048_SHA_256_S= ECTION2_HEADER); } =20 // @@ -189,13 +189,13 @@ Rsa2048Sha256GuidedSectionHandler ( // Get the RSA 2048 SHA 256 information. // CertBlockRsa2048Sha256 =3D &((RSA_2048_SHA_256_SECTION_HEADER *)InputS= ection)->CertBlockRsa2048Sha256; OutputBufferSize =3D SECTION_SIZE (InputSection) - sizeof (RSA_2= 048_SHA_256_SECTION_HEADER); if ((((EFI_GUID_DEFINED_SECTION *)InputSection)->Attributes & EFI_GUID= ED_SECTION_PROCESSING_REQUIRED) !=3D 0) { - PERF_START (NULL, "RsaCopy", "DXE", 0); + PERF_INMODULE_BEGIN ("DxeRsaCopy"); CopyMem (*OutputBuffer, (UINT8 *)InputSection + sizeof (RSA_2048_SHA= _256_SECTION_HEADER), OutputBufferSize); - PERF_END (NULL, "RsaCopy", "DXE", 0); + PERF_INMODULE_END ("DxeRsaCopy"); } else { *OutputBuffer =3D (UINT8 *)InputSection + sizeof (RSA_2048_SHA_256_S= ECTION_HEADER); } =20 // @@ -325,13 +325,13 @@ Rsa2048Sha256GuidedSectionHandler ( if (!CryptoStatus) { DEBUG ((DEBUG_ERROR, "DxeRsa2048Sha256: Sha256Init() failed\n")); *AuthenticationStatus |=3D EFI_AUTH_STATUS_TEST_FAILED; goto Done; } - PERF_START (NULL, "RsaShaData", "DXE", 0); + PERF_INMODULE_BEGIN ("DxeRsaShaData"); CryptoStatus =3D Sha256Update (HashContext, *OutputBuffer, OutputBufferS= ize); - PERF_END (NULL, "RsaShaData", "DXE", 0); + PERF_INMODULE_END ("DxeRsaShaData"); if (!CryptoStatus) { DEBUG ((DEBUG_ERROR, "DxeRsa2048Sha256: Sha256Update() failed\n")); *AuthenticationStatus |=3D EFI_AUTH_STATUS_TEST_FAILED; goto Done; } @@ -343,19 +343,19 @@ Rsa2048Sha256GuidedSectionHandler ( } =20 // // Verify the RSA 2048 SHA 256 signature. // - PERF_START (NULL, "RsaVerify", "DXE", 0); + PERF_INMODULE_BEGIN ("DxeRsaVerify"); CryptoStatus =3D RsaPkcs1Verify ( Rsa,=20 Digest,=20 SHA256_DIGEST_SIZE,=20 CertBlockRsa2048Sha256->Signature,=20 sizeof (CertBlockRsa2048Sha256->Signature) ); - PERF_END (NULL, "RsaVerify", "DXE", 0); + PERF_INMODULE_END ("DxeRsaVerify"); if (!CryptoStatus) { // // If RSA 2048 SHA 256 signature verification fails, AUTH tested faile= d bit is set. // DEBUG ((DEBUG_ERROR, "DxeRsa2048Sha256: RsaPkcs1Verify() failed\n")); diff --git a/SecurityPkg/Library/PeiRsa2048Sha256GuidedSectionExtractLib/Pe= iRsa2048Sha256GuidedSectionExtractLib.c b/SecurityPkg/Library/PeiRsa2048Sha= 256GuidedSectionExtractLib/PeiRsa2048Sha256GuidedSectionExtractLib.c index ba1c700ad03..2272308ddca 100644 --- a/SecurityPkg/Library/PeiRsa2048Sha256GuidedSectionExtractLib/PeiRsa204= 8Sha256GuidedSectionExtractLib.c +++ b/SecurityPkg/Library/PeiRsa2048Sha256GuidedSectionExtractLib/PeiRsa204= 8Sha256GuidedSectionExtractLib.c @@ -158,13 +158,13 @@ Rsa2048Sha256GuidedSectionHandler ( // Get the RSA 2048 SHA 256 information. // CertBlockRsa2048Sha256 =3D &((RSA_2048_SHA_256_SECTION2_HEADER *) Inpu= tSection)->CertBlockRsa2048Sha256; OutputBufferSize =3D SECTION2_SIZE (InputSection) - sizeof (RSA_= 2048_SHA_256_SECTION2_HEADER); if ((((EFI_GUID_DEFINED_SECTION *)InputSection)->Attributes & EFI_GUID= ED_SECTION_PROCESSING_REQUIRED) !=3D 0) { - PERF_START (NULL, "RsaCopy", "PEI", 0); + PERF_INMODULE_BEGIN ("PeiRsaCopy"); CopyMem (*OutputBuffer, (UINT8 *)InputSection + sizeof (RSA_2048_SHA= _256_SECTION2_HEADER), OutputBufferSize); - PERF_END (NULL, "RsaCopy", "PEI", 0); + PERF_INMODULE_END ("PeiRsaCopy"); } else { *OutputBuffer =3D (UINT8 *)InputSection + sizeof (RSA_2048_SHA_256_S= ECTION2_HEADER); } =20 // @@ -186,13 +186,13 @@ Rsa2048Sha256GuidedSectionHandler ( // Get the RSA 2048 SHA 256 information. // CertBlockRsa2048Sha256 =3D &((RSA_2048_SHA_256_SECTION_HEADER *)InputS= ection)->CertBlockRsa2048Sha256; OutputBufferSize =3D SECTION_SIZE (InputSection) - sizeof (RSA_2= 048_SHA_256_SECTION_HEADER); if ((((EFI_GUID_DEFINED_SECTION *)InputSection)->Attributes & EFI_GUID= ED_SECTION_PROCESSING_REQUIRED) !=3D 0) { - PERF_START (NULL, "RsaCopy", "PEI", 0); + PERF_INMODULE_BEGIN ("PeiRsaCopy"); CopyMem (*OutputBuffer, (UINT8 *)InputSection + sizeof (RSA_2048_SHA= _256_SECTION_HEADER), OutputBufferSize); - PERF_END (NULL, "RsaCopy", "PEI", 0); + PERF_INMODULE_END ("PeiRsaCopy"); } else { *OutputBuffer =3D (UINT8 *)InputSection + sizeof (RSA_2048_SHA_256_S= ECTION_HEADER); } =20 // @@ -309,13 +309,13 @@ Rsa2048Sha256GuidedSectionHandler ( if (!CryptoStatus) { DEBUG ((DEBUG_ERROR, "PeiRsa2048Sha256: Sha256Init() failed\n")); *AuthenticationStatus |=3D EFI_AUTH_STATUS_TEST_FAILED; goto Done; } - PERF_START (NULL, "RsaShaData", "PEI", 0); + PERF_INMODULE_BEGIN ("PeiRsaShaData"); CryptoStatus =3D Sha256Update (HashContext, *OutputBuffer, OutputBufferS= ize); - PERF_END (NULL, "RsaShaData", "PEI", 0); + PERF_INMODULE_END ("PeiRsaShaData"); if (!CryptoStatus) { DEBUG ((DEBUG_ERROR, "PeiRsa2048Sha256: Sha256Update() failed\n")); *AuthenticationStatus |=3D EFI_AUTH_STATUS_TEST_FAILED; goto Done; } @@ -327,19 +327,19 @@ Rsa2048Sha256GuidedSectionHandler ( } =20 // // Verify the RSA 2048 SHA 256 signature. // - PERF_START (NULL, "RsaVerify", "PEI", 0); + PERF_INMODULE_BEGIN ("PeiRsaVerify"); CryptoStatus =3D RsaPkcs1Verify ( Rsa,=20 Digest,=20 SHA256_DIGEST_SIZE,=20 CertBlockRsa2048Sha256->Signature,=20 sizeof (CertBlockRsa2048Sha256->Signature) ); - PERF_END (NULL, "RsaVerify", "PEI", 0); + PERF_INMODULE_END ("PeiRsaVerify"); if (!CryptoStatus) { // // If RSA 2048 SHA 256 signature verification fails, AUTH tested faile= d bit is set. // DEBUG ((DEBUG_ERROR, "PeiRsa2048Sha256: RsaPkcs1Verify() failed\n")); --=20 2.14.3.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Sun May 5 09:12:48 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1529393221118101.02877465449649; Tue, 19 Jun 2018 00:27:01 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 227BF2112A294; Tue, 19 Jun 2018 00:26:56 -0700 (PDT) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 88B91211299A8 for ; Tue, 19 Jun 2018 00:26:55 -0700 (PDT) Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jun 2018 00:26:55 -0700 Received: from shwdeopenpsi114.ccr.corp.intel.com ([10.239.157.135]) by orsmga006.jf.intel.com with ESMTP; 19 Jun 2018 00:26:54 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.31; helo=mga06.intel.com; envelope-from=dandan.bi@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,242,1526367600"; d="scan'208";a="51022398" From: Dandan Bi To: edk2-devel@lists.01.org Date: Tue, 19 Jun 2018 15:24:05 +0800 Message-Id: <20180619072405.142872-10-dandan.bi@intel.com> X-Mailer: git-send-email 2.14.3.windows.1 In-Reply-To: <20180619072405.142872-1-dandan.bi@intel.com> References: <20180619072405.142872-1-dandan.bi@intel.com> Subject: [edk2] [patch 9/9] UefiCpuPkg: Use new added Perf macros X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Eric Dong , Liming Gao MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Replace old Perf macros with the new added ones. Cc: Liming Gao Cc: Eric Dong Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi --- UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c b/UefiCpuPkg= /Universal/Acpi/S3Resume2Pei/S3Resume.c index 4ae168a2c3c..d3cb07cd2d0 100644 --- a/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c +++ b/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c @@ -428,21 +428,21 @@ S3ResumeBootOs ( // NOTE: Because Debug Timer interrupt and system interrupts will be dis= abled=20 // in BootScriptExecuteDxe, the rest code in S3ResumeBootOs() cannot be = halted // by soft debugger. // =20 - PERF_END (NULL, "ScriptExec", NULL, 0); + PERF_INMODULE_END ("ScriptExec"); =20 // // Install BootScriptDonePpi // - PERF_START_EX (NULL, "BootScriptDonePpi", NULL, 0, PERF_INMODULE_START_I= D); + PERF_INMODULE_BEGIN ("BootScriptDonePpi"); =20 Status =3D PeiServicesInstallPpi (&mPpiListPostScriptTable); ASSERT_EFI_ERROR (Status); =20 - PERF_END_EX (NULL, "BootScriptDonePpi", NULL, 0, PERF_INMODULE_END_ID); + PERF_INMODULE_END ("BootScriptDonePpi"); =20 // // Get ACPI Table Address // Facs =3D (EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *) ((UINTN) (Acpi= S3Context->AcpiFacsTable)); @@ -462,26 +462,26 @@ S3ResumeBootOs ( } =20 // // Install EndOfPeiPpi // - PERF_START_EX (NULL, "EndOfPeiPpi", NULL, 0, PERF_INMODULE_START_ID); + PERF_INMODULE_BEGIN("EndOfPeiPpi"); =20 Status =3D PeiServicesInstallPpi (&mPpiListEndOfPeiTable); ASSERT_EFI_ERROR (Status); =20 - PERF_END_EX (NULL, "EndOfPeiPpi", NULL, 0, PERF_INMODULE_END_ID); + PERF_INMODULE_END("EndOfPeiPpi"); =20 - PERF_START_EX (NULL, "EndOfS3Resume", NULL, 0, PERF_INMODULE_START_ID); + PERF_INMODULE_BEGIN("EndOfS3Resume"); =20 DEBUG ((DEBUG_INFO, "Signal EndOfS3Resume\n")); // // Signal EndOfS3Resume to SMM. // SignalToSmmByCommunication (&gEdkiiEndOfS3ResumeGuid); =20 - PERF_END_EX (NULL, "EndOfS3Resume", NULL, 0, PERF_INMODULE_END_ID); + PERF_INMODULE_END ("EndOfS3Resume"); =20 // // report status code on S3 resume // REPORT_STATUS_CODE (EFI_PROGRESS_CODE, EFI_SOFTWARE_PEI_MODULE | EFI_SW_= PEI_PC_OS_WAKE); @@ -878,11 +878,11 @@ S3ResumeExecuteBootScript ( // // Report Status Code to indicate S3 boot script execution // REPORT_STATUS_CODE (EFI_PROGRESS_CODE, EFI_SOFTWARE_PEI_MODULE | EFI_SW_= PEI_PC_S3_BOOT_SCRIPT); =20 - PERF_START (NULL, "ScriptExec", NULL, 0); + PERF_INMODULE_BEGIN ("ScriptExec"); =20 if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) { // // X64 S3 Resume // --=20 2.14.3.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel