From nobody Mon Dec 23 18:03:26 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 Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1516679284866473.1488539690823; Mon, 22 Jan 2018 19:48:04 -0800 (PST) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 06AB622333797; Mon, 22 Jan 2018 19:42:37 -0800 (PST) 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 46FC622333762 for ; Mon, 22 Jan 2018 19:42:36 -0800 (PST) Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 Jan 2018 19:48:01 -0800 Received: from shwdeopenpsi114.ccr.corp.intel.com ([10.239.157.135]) by orsmga008.jf.intel.com with ESMTP; 22 Jan 2018 19:48:00 -0800 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.46,399,1511856000"; d="scan'208";a="12262504" From: Dandan Bi To: edk2-devel@lists.01.org Date: Tue, 23 Jan 2018 11:47:29 +0800 Message-Id: <1516679255-12328-3-git-send-email-dandan.bi@intel.com> X-Mailer: git-send-email 1.9.5.msysgit.1 In-Reply-To: <1516679255-12328-1-git-send-email-dandan.bi@intel.com> References: <1516679255-12328-1-git-send-email-dandan.bi@intel.com> Subject: [edk2] [patch 2/8] MdeModulePkg/PeiPerformance:Updated to track FPDT record in PEI phase X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 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" Updated to convert Pref entry to FPDT record in PEI phase and then export records to FPDT table. Cc: Liming Gao Cc: Star Zeng Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi --- .../Library/PeiPerformanceLib/PeiPerformanceLib.c | 563 ++++++++++++++---= ---- .../PeiPerformanceLib/PeiPerformanceLib.inf | 14 +- 2 files changed, 378 insertions(+), 199 deletions(-) diff --git a/MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c b/M= deModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c index 62527b2..f78c349 100644 --- a/MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c +++ b/MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c @@ -5,11 +5,11 @@ performance logging GUIDed HOB on the first performance logging and then= logs the performance data to the GUIDed HOB. Due to the limitation of temporary R= AM, the maximum number of performance logging entry is specified by PcdMaxPeiPerformance= LogEntries or=20 PcdMaxPeiPerformanceLogEntries16. =20 -Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
(C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP
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,215 +20,444 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EI= THER EXPRESS OR IMPLIED. **/ =20 =20 #include =20 -#include +#include =20 #include #include #include #include #include #include #include =20 +#define STRING_SIZE (EDKII_STRING_EVENT_RECORD_NAME_LENGTH * s= izeof (CHAR8)) +#define MAX_RECORD_SIZE (sizeof (FPDT_RECORD) + STRING_SIZE) =20 /** - Gets the GUID HOB for PEI performance. +Check whether the Token is a known one which is uesed by core. =20 - This internal function searches for the GUID HOB for PEI performance. - If that GUID HOB is not found, it will build a new one. - It outputs the data area of that GUID HOB to record performance log. +@param Token Pointer to a Null-terminated ASCII string =20 - @param PeiPerformanceLog Pointer to Pointer to PEI performa= nce log header. - @param PeiPerformanceIdArray Pointer to Pointer to PEI performa= nce identifier array. +@retval TRUE Is a known one used by core. +@retval FALSE Not a known one. =20 **/ -VOID -InternalGetPerformanceHobLog ( - OUT PEI_PERFORMANCE_LOG_HEADER **PeiPerformanceLog, - OUT UINT32 **PeiPerformanceIdArray +BOOLEAN +IsKnownTokens ( + IN CONST CHAR8 *Token ) { - EFI_HOB_GUID_TYPE *GuidHob; - UINTN PeiPerformanceSize; - UINT16 PeiPerformanceLogEntries; + if (AsciiStrCmp (Token, SEC_TOK) =3D=3D 0 || + AsciiStrCmp (Token, PEI_TOK) =3D=3D 0 || + AsciiStrCmp (Token, DXE_TOK) =3D=3D 0 || + AsciiStrCmp (Token, BDS_TOK) =3D=3D 0 || + AsciiStrCmp (Token, DRIVERBINDING_START_TOK) =3D=3D 0 || + AsciiStrCmp (Token, DRIVERBINDING_SUPPORT_TOK) =3D=3D 0 || + AsciiStrCmp (Token, DRIVERBINDING_STOP_TOK) =3D=3D 0 || + AsciiStrCmp (Token, LOAD_IMAGE_TOK) =3D=3D 0 || + AsciiStrCmp (Token, START_IMAGE_TOK) =3D=3D 0 || + AsciiStrCmp (Token, PEIM_TOK) =3D=3D 0) { + return TRUE; + } else { + return FALSE; + } +} =20 - ASSERT (PeiPerformanceLog !=3D NULL); - ASSERT (PeiPerformanceIdArray !=3D NULL); +/** +Check whether the ID is a known one which map to the known Token. =20 - PeiPerformanceLogEntries =3D (UINT16) (PcdGet16 (PcdMaxPeiPerformanceLog= Entries16) !=3D 0 ? - PcdGet16 (PcdMaxPeiPerformanceLogEn= tries16) : - PcdGet8 (PcdMaxPeiPerformanceLogEnt= ries)); - GuidHob =3D GetFirstGuidHob (&gPerformanceProtocolGuid); +@param Identifier 32-bit identifier. =20 - if (GuidHob !=3D NULL) { - // - // PEI Performance HOB was found, then return the existing one. - // - *PeiPerformanceLog =3D GET_GUID_HOB_DATA (GuidHob); +@retval TRUE Is a known one used by core. +@retval FALSE Not a known one. =20 - GuidHob =3D GetFirstGuidHob (&gPerformanceExProtocolGuid); - ASSERT (GuidHob !=3D NULL); - *PeiPerformanceIdArray =3D GET_GUID_HOB_DATA (GuidHob); +**/ +BOOLEAN +IsKnownID ( + IN UINT32 Identifier + ) +{ + if (Identifier =3D=3D MODULE_START_ID || + Identifier =3D=3D MODULE_END_ID || + Identifier =3D=3D MODULE_LOADIMAGE_START_ID || + Identifier =3D=3D MODULE_LOADIMAGE_END_ID || + Identifier =3D=3D MODULE_DB_START_ID || + Identifier =3D=3D MODULE_DB_END_ID || + Identifier =3D=3D MODULE_DB_SUPPORT_START_ID || + Identifier =3D=3D MODULE_DB_SUPPORT_END_ID || + Identifier =3D=3D MODULE_DB_STOP_START_ID || + Identifier =3D=3D MODULE_DB_STOP_END_ID) { + return TRUE; } else { - // - // PEI Performance HOB was not found, then build one. - // - PeiPerformanceSize =3D sizeof (PEI_PERFORMANCE_LOG_HEADER) + - sizeof (PEI_PERFORMANCE_LOG_ENTRY) * PeiPerfo= rmanceLogEntries; - *PeiPerformanceLog =3D BuildGuidHob (&gPerformanceProtocolGuid, Pe= iPerformanceSize); - *PeiPerformanceLog =3D ZeroMem (*PeiPerformanceLog, PeiPerformance= Size); - - PeiPerformanceSize =3D sizeof (UINT32) * PeiPerformanceLogEntries; - *PeiPerformanceIdArray =3D BuildGuidHob (&gPerformanceExProtocolGuid, = PeiPerformanceSize); - *PeiPerformanceIdArray =3D ZeroMem (*PeiPerformanceIdArray, PeiPerform= anceSize); + return FALSE; } } =20 /** - Searches in the log array with keyword Handle, Token, Module and Identif= ier. - - This internal function searches for the log entry in the log array. - If there is an entry that exactly matches the given keywords - and its end time stamp is zero, then the index of that log entry is retu= rned; - otherwise, the the number of log entries in the array is returned. + Get the FPDT record info. =20 - @param PeiPerformanceLog Pointer to the data structure containing= PEI=20 - performance data. - @param PeiPerformanceIdArray Pointer to PEI performance identifier ar= ray. + @param IsStart TRUE if the performance log is start log. @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 Identifier 32-bit identifier. + @param RecordInfo On return, pointer to the info of the re= cord. =20 - @retval The index of log entry in the array. + @retval EFI_SUCCESS Get record info successfully. + @retval EFI_UNSUPPORTED No matched FPDT record. =20 **/ -UINT32 -InternalSearchForLogEntry ( - IN PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog, - IN UINT32 *PeiPerformanceIdArray, - IN CONST VOID *Handle, OPTIONAL - IN CONST CHAR8 *Token, OPTIONAL - IN CONST CHAR8 *Module, OPTIONAL - IN UINT32 Identifier +EFI_STATUS +GetFpdtRecordInfo ( + IN BOOLEAN IsStart, + IN CONST VOID *Handle, + IN CONST CHAR8 *Token, + IN CONST CHAR8 *Module, + OUT BASIC_RECORD_INFO *RecordInfo ) { - UINT32 Index; - UINT32 Index2; - UINT32 NumberOfEntries; - PEI_PERFORMANCE_LOG_ENTRY *LogEntryArray; + UINTN StringSize; + UINT16 RecordType; =20 + RecordType =3D DYNAMIC_STRING_EVENT_TYPE; =20 - if (Token =3D=3D NULL) { - Token =3D ""; - } - if (Module =3D=3D NULL) { - Module =3D ""; + // + // Get the ProgressID based on the Token. + // When PcdEdkiiFpdtStringRecordEnableOnly is TRUE, all records are with= type of DYNAMIC_STRING_EVENT_TYPE. + // + if (Token !=3D NULL) { + if (AsciiStrCmp (Token, LOAD_IMAGE_TOK) =3D=3D 0) { // "= LoadImage:" + if (IsStart) { + RecordInfo->ProgressID =3D MODULE_LOADIMAGE_START_ID; + } else { + RecordInfo->ProgressID =3D MODULE_LOADIMAGE_END_ID; + } + if(!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + RecordType =3D GUID_QWORD_EVENT_TYPE; + } + } else if (AsciiStrCmp (Token, SEC_TOK) =3D=3D 0 || // "= SEC" + AsciiStrCmp (Token, PEI_TOK) =3D=3D 0) { // "= PEI" + if (IsStart) { + RecordInfo->ProgressID =3D PERF_CROSSMODULE_START_ID; + } else { + RecordInfo->ProgressID =3D PERF_CROSSMODULE_END_ID; + } + } else if (AsciiStrCmp (Token, PEIM_TOK) =3D=3D 0) { // "= PEIM" + if (IsStart) { + RecordInfo->ProgressID =3D MODULE_START_ID; + } else { + RecordInfo->ProgressID =3D MODULE_END_ID; + } + if(!PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + RecordType =3D GUID_EVENT_TYPE; + } + } else { //Pref u= sed in Modules. + if (IsStart) { + RecordInfo->ProgressID =3D PERF_INMODULE_START_ID; + } else { + RecordInfo->ProgressID =3D PERF_INMODULE_END_ID; + } + } + } else if (Module !=3D NULL || Handle !=3D NULL) { //Pr= ef used in Modules. + if (IsStart) { + RecordInfo->ProgressID =3D PERF_INMODULE_START_ID; + } else { + RecordInfo->ProgressID =3D PERF_INMODULE_END_ID; + } + } else { + return EFI_UNSUPPORTED; } - NumberOfEntries =3D PeiPerformanceLog->NumberOfEntries; - LogEntryArray =3D (PEI_PERFORMANCE_LOG_ENTRY *) (PeiPerformanceLog + 1= ); - - Index2 =3D 0; - - for (Index =3D 0; Index < NumberOfEntries; Index++) { - Index2 =3D NumberOfEntries - 1 - Index; - if (LogEntryArray[Index2].EndTimeStamp =3D=3D 0 && - (LogEntryArray[Index2].Handle =3D=3D (EFI_PHYSICAL_ADDRESS) (UINTN= ) Handle) && - AsciiStrnCmp (LogEntryArray[Index2].Token, Token, PEI_PERFORMANCE_= STRING_LENGTH) =3D=3D 0 && - AsciiStrnCmp (LogEntryArray[Index2].Module, Module, PEI_PERFORMANC= E_STRING_LENGTH) =3D=3D 0) { - Index =3D Index2; + + // + // Get the Guid and string. + // + if(PcdGetBool (PcdEdkiiFpdtStringRecordEnableOnly)) { + RecordInfo->RecordSize =3D sizeof (DYNAMIC_STRING_EVENT_RECORD) + STRI= NG_SIZE; + } else { + switch (RecordType) { + case GUID_EVENT_TYPE: + RecordInfo->RecordSize =3D sizeof (GUID_EVENT_RECORD); break; + + case GUID_QWORD_EVENT_TYPE: + RecordInfo->RecordSize =3D sizeof (GUID_QWORD_EVENT_RECORD); + break; + + case DYNAMIC_STRING_EVENT_TYPE: + if (Token !=3D NULL) { + StringSize =3D AsciiStrSize (Token); + } else if (Module !=3D NULL) { + StringSize =3D AsciiStrSize (Module); + } else { + StringSize =3D STRING_SIZE; + } + RecordInfo->RecordSize =3D (UINT8)(sizeof (DYNAMIC_STRING_EVENT_REC= ORD) + StringSize); + break; + + default: + // + // Other type is unsupported in PEI phase yet, return EFI_UNSUPPORTED + // + return EFI_UNSUPPORTED; } } - return Index; + RecordInfo->Type =3D RecordType; + return EFI_SUCCESS; } =20 /** - Creates a record for the beginning of a performance measurement. - - Creates a record that contains the Handle, Token, Module and Identifier. - If TimeStamp is not zero, then TimeStamp is added to the record as the s= tart time. - If TimeStamp is zero, then this function reads the current time stamp - and adds that time stamp value to the record as the start time. + Convert PEI performance log to FPDT String boot record. =20 + @param IsStart TRUE if the performance log is start log. @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 Ticker 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 StartPerfo= rmanceMeasurement. + is same as the one created by StartGauge= of PERFORMANCE_PROTOCOL. =20 - @retval RETURN_SUCCESS The start of the measurement was recorde= d. - @retval RETURN_OUT_OF_RESOURCES There are not enough resources to record= the measurement. + @retval EFI_SUCCESS Add FPDT boot record. + @retval EFI_OUT_OF_RESOURCES There are not enough resources to recor= d the measurement. + @retval EFI_UNSUPPORTED No matched FPDT record. =20 **/ -RETURN_STATUS -EFIAPI -StartPerformanceMeasurementEx ( +EFI_STATUS +InsertPeiFpdtMeasurement ( + IN BOOLEAN IsStart, IN CONST VOID *Handle, OPTIONAL IN CONST CHAR8 *Token, OPTIONAL IN CONST CHAR8 *Module, OPTIONAL - IN UINT64 TimeStamp, + IN UINT64 Ticker, IN UINT32 Identifier ) { - PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog; - UINT32 *PeiPerformanceIdArray; - PEI_PERFORMANCE_LOG_ENTRY *LogEntryArray; - UINT32 Index; - UINT16 PeiPerformanceLogEntries; + EFI_HOB_GUID_TYPE *GuidHob; + UINTN PeiPerformanceSize; + UINT8 *PeiFirmwarePerformance; + PEI_EXT_FIRMWARE_PERF_HEADER *PeiPerformanceLogHeader; + FPDT_RECORD_PTR FpdtRecordPtr; + BASIC_RECORD_INFO RecordInfo; + CONST VOID *ModuleGuid; + UINTN DestMax; + UINTN StrLength; + CONST CHAR8 *StringPtr; + EFI_STATUS Status; + UINT16 PeiPerformanceLogEntries; + UINT64 TimeStamp; + + StringPtr =3D NULL; + + // + // Get record info (type, size, ProgressID and Module Guid). + // + Status =3D GetFpdtRecordInfo (IsStart, Handle, Token, Module, &RecordInf= o); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // If PERF_START()/PERF_END() have specified the ProgressID,it has high = priority. + // !!! Note: If the Pref is not the known Token used in the core but hav= e same + // ID with the core Token, this case will not be supported. + // And in currtnt usage mode, for the unkown ID, there is a general rule: + // 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))) { + 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)) { + 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)); =20 - InternalGetPerformanceHobLog (&PeiPerformanceLog, &PeiPerformanceIdArray= ); + // + // Create GUID HOB Data. + // + GuidHob =3D GetFirstGuidHob (&gEdkiiExtendedFirmwarePerformanceGuid); + 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 (PEI_EXT_FIRMWARE_PERF_HEADER *)PeiFirmwar= ePerformance; + 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 (PEI_EXT_FIRMWARE_PERF_HEADER) += PeiPerformanceLogHeader->SizeOfAllEntries); + break; + } + // + // Previous HOB is used, then find next one. + // + GuidHob =3D GetNextGuidHob (&gEdkiiExtendedFirmwarePerformanceGuid, GE= T_NEXT_HOB (GuidHob)); + } =20 - if (PeiPerformanceLog->NumberOfEntries >=3D PeiPerformanceLogEntries) { - DEBUG ((DEBUG_ERROR, "PEI performance log array out of resources\n")); - return RETURN_OUT_OF_RESOURCES; + if (GuidHob =3D=3D NULL) { + // + // PEI Performance HOB was not found, then build one. + // + PeiPerformanceSize =3D sizeof (PEI_EXT_FIRMWARE_PERF_HEADER) + + MAX_RECORD_SIZE * PeiPerformanceLogEntries; + PeiFirmwarePerformance =3D (UINT8*)BuildGuidHob (&gEdkiiExtendedFirmw= arePerformanceGuid, PeiPerformanceSize); + if (PeiFirmwarePerformance !=3D NULL) { + ZeroMem (PeiFirmwarePerformance, PeiPerformanceSize); + } + PeiPerformanceLogHeader =3D (PEI_EXT_FIRMWARE_PERF_HEADER *)PeiFirmwar= ePerformance; + FpdtRecordPtr.RecordHeader =3D (EFI_ACPI_5_0_FPDT_PERFORMANCE_RECORD_H= EADER *)(PeiFirmwarePerformance + sizeof (PEI_EXT_FIRMWARE_PERF_HEADER)); } - Index =3D PeiPerformanceLog->NumberOfEntries++; - LogEntryArray =3D (PEI_PERFORMANCE_LOG_ENTRY *) (PeiPerfor= manceLog + 1); - LogEntryArray[Index].Handle =3D (EFI_PHYSICAL_ADDRESS) (UINTN) Handle; =20 - if (Token !=3D NULL) { - AsciiStrnCpyS (LogEntryArray[Index].Token, PEI_PERFORMANCE_STRING_SIZE= , Token, PEI_PERFORMANCE_STRING_LENGTH); + if (PeiFirmwarePerformance =3D=3D NULL) { + // + // there is no enough resource to store performance data + // + return EFI_OUT_OF_RESOURCES; + } + + // + // Get the TimeStamp. + // + if (Ticker =3D=3D 0) { + Ticker =3D GetPerformanceCounter (); + TimeStamp =3D GetTimeInNanoSecond (Ticker); + } else if (Ticker =3D=3D 1) { + TimeStamp =3D 0; + } else { + TimeStamp =3D GetTimeInNanoSecond (Ticker); } - if (Module !=3D NULL) { - AsciiStrnCpyS (LogEntryArray[Index].Module, PEI_PERFORMANCE_STRING_SIZ= E, Module, PEI_PERFORMANCE_STRING_LENGTH); + + // + // Get the ModuleGuid. + // + if (Handle !=3D NULL) { + ModuleGuid =3D Handle; + } else { + ModuleGuid =3D &gEfiCallerIdGuid; } =20 - LogEntryArray[Index].EndTimeStamp =3D 0; - PeiPerformanceIdArray[Index] =3D Identifier; + switch (RecordInfo.Type) { + case GUID_EVENT_TYPE: + FpdtRecordPtr.GuidEvent->Header.Type =3D GUID_EVENT_TYPE; + FpdtRecordPtr.GuidEvent->Header.Length =3D sizeof (GUID_EVENT_RECO= RD); + FpdtRecordPtr.GuidEvent->Header.Revision =3D RECORD_REVISION_1; + FpdtRecordPtr.GuidEvent->ProgressID =3D RecordInfo.ProgressID; + FpdtRecordPtr.GuidEvent->Timestamp =3D TimeStamp; + CopyMem (&FpdtRecordPtr.GuidEvent->Guid, ModuleGuid, sizeof (EFI_GUID)= ); + PeiPerformanceLogHeader->SizeOfAllEntries +=3D sizeof (GUID_EVENT_RECO= RD); + break; + + case GUID_QWORD_EVENT_TYPE: + FpdtRecordPtr.GuidQwordEvent->Header.Type =3D GUID_QWORD_EVENT_TYP= E; + FpdtRecordPtr.GuidQwordEvent->Header.Length =3D sizeof (GUID_QWORD_E= VENT_RECORD); + FpdtRecordPtr.GuidQwordEvent->Header.Revision =3D RECORD_REVISION_1; + FpdtRecordPtr.GuidQwordEvent->ProgressID =3D RecordInfo.ProgressI= D; + FpdtRecordPtr.GuidQwordEvent->Timestamp =3D TimeStamp; + PeiPerformanceLogHeader->LoadImageCount++; + FpdtRecordPtr.GuidQwordEvent->Qword =3D PeiPerformanceLogHea= der->LoadImageCount; + CopyMem (&FpdtRecordPtr.GuidQwordEvent->Guid, ModuleGuid, sizeof (EFI_= GUID)); + PeiPerformanceLogHeader->SizeOfAllEntries +=3D sizeof (GUID_QWORD_EVEN= T_RECORD); + break; + + case DYNAMIC_STRING_EVENT_TYPE: + FpdtRecordPtr.DynamicStringEvent->Header.Type =3D DYNAMIC_STRING= _EVENT_TYPE; + FpdtRecordPtr.DynamicStringEvent->Header.Length =3D RecordInfo.Rec= ordSize; + FpdtRecordPtr.DynamicStringEvent->Header.Revision =3D RECORD_REVISIO= N_1; + FpdtRecordPtr.DynamicStringEvent->ProgressID =3D RecordInfo.Pro= gressID; + FpdtRecordPtr.DynamicStringEvent->Timestamp =3D TimeStamp; + CopyMem (&FpdtRecordPtr.DynamicStringEvent->Guid, ModuleGuid, sizeof (= EFI_GUID)); + PeiPerformanceLogHeader->SizeOfAllEntries +=3D RecordInfo.RecordSize; + + if (Token !=3D NULL) { + StringPtr =3D Token; + } else if (Module !=3D NULL) { + StringPtr =3D Module; + } + if (StringPtr !=3D NULL && AsciiStrLen (StringPtr) !=3D 0) { + DestMax =3D (RecordInfo.RecordSize - sizeof (D= YNAMIC_STRING_EVENT_RECORD)) / sizeof (CHAR8); + StrLength =3D AsciiStrLen (StringPtr); + if (StrLength >=3D DestMax) { + StrLength =3D DestMax -1; + } + AsciiStrnCpyS (FpdtRecordPtr.DynamicStringEvent->String, DestMax, St= ringPtr, StrLength); + } + break; =20 - if (TimeStamp =3D=3D 0) { - TimeStamp =3D GetPerformanceCounter (); + default: + // + // Record is not supported in current PEI phase, return EFI_ABORTED + // + return EFI_UNSUPPORTED; } - LogEntryArray[Index].StartTimeStamp =3D TimeStamp; =20 - return RETURN_SUCCESS; + return EFI_SUCCESS; } =20 /** - Fills in the end time of a performance measurement. + Creates a record for the beginning of a performance measurement. + + If TimeStamp is zero, then this function reads the current time stamp + and adds that time stamp value to the record as the start time. + + If TimeStamp is one, then this function reads 0 as the start time. =20 - Looks up the record that matches Handle, Token and Module. - If the record can not be found then return RETURN_NOT_FOUND. - If the record is found and TimeStamp is not zero, - then TimeStamp is added to the record as the end time. - If the record is found and TimeStamp is zero, then this function reads - the current time stamp and adds that time stamp value to the record as t= he end time. + If TimeStamp is other value, then TimeStamp is added to the record as th= e start time. + + @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 StartPerfo= rmanceMeasurement. + + @retval RETURN_SUCCESS The start of the measurement was recorde= d. + @retval RETURN_OUT_OF_RESOURCES There are not enough resources to record= the measurement. + +**/ +RETURN_STATUS +EFIAPI +StartPerformanceMeasurementEx ( + IN CONST VOID *Handle, OPTIONAL + IN CONST CHAR8 *Token, OPTIONAL + IN CONST CHAR8 *Module, OPTIONAL + IN UINT64 TimeStamp, + IN UINT32 Identifier + ) +{ + return InsertPeiFpdtMeasurement (TRUE, Handle, Token, Module, TimeStamp,= Identifier); +} + +/** + + Creates a record for the end of a performance measurement. + + If the TimeStamp is not zero or one, then TimeStamp is added to the reco= rd as the end time. + If the TimeStamp is zero, then this function reads the current time stam= p and adds that time stamp value to the record as the end time. + If the TimeStamp is one, then this function reads 0 as the end time. =20 @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. @@ -250,28 +479,11 @@ EndPerformanceMeasurementEx ( IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp, IN UINT32 Identifier ) { - PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog; - UINT32 *PeiPerformanceIdArray; - PEI_PERFORMANCE_LOG_ENTRY *LogEntryArray; - UINT32 Index; - - if (TimeStamp =3D=3D 0) { - TimeStamp =3D GetPerformanceCounter (); - } - - InternalGetPerformanceHobLog (&PeiPerformanceLog, &PeiPerformanceIdArray= ); - Index =3D InternalSearchForLogEntry (PeiPerformanceLog, PeiP= erformanceIdArray, Handle, Token, Module, Identifier); - if (Index >=3D PeiPerformanceLog->NumberOfEntries) { - return RETURN_NOT_FOUND; - } - LogEntryArray =3D (PEI_PERFORMANCE_LOG_ENTRY *) (PeiPerformanceLog += 1); - LogEntryArray[Index].EndTimeStamp =3D TimeStamp; - - return RETURN_SUCCESS; + return InsertPeiFpdtMeasurement (FALSE, Handle, Token, Module, TimeStamp= , Identifier); } =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, @@ -293,10 +505,12 @@ EndPerformanceMeasurementEx ( If Module is NULL, then ASSERT(). If StartTimeStamp is NULL, then ASSERT(). If EndTimeStamp is NULL, then ASSERT(). If Identifier is NULL, then ASSERT(). =20 + !!!NOT Support yet!!! + @param LogEntryKey On entry, the key of the performance mea= surement log entry to retrieve. 0, then the first performance measuremen= t log entry is retrieved. On exit, the key of the next performance= of entry entry. @param Handle Pointer to environment specific context = used to identify the component being measured. @@ -323,56 +537,24 @@ GetPerformanceMeasurementEx ( OUT UINT64 *StartTimeStamp, OUT UINT64 *EndTimeStamp, OUT UINT32 *Identifier ) { - PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog; - UINT32 *PeiPerformanceIdArray; - PEI_PERFORMANCE_LOG_ENTRY *CurrentLogEntry; - PEI_PERFORMANCE_LOG_ENTRY *LogEntryArray; - UINTN NumberOfEntries; - - ASSERT (Handle !=3D NULL); - ASSERT (Token !=3D NULL); - ASSERT (Module !=3D NULL); - ASSERT (StartTimeStamp !=3D NULL); - ASSERT (EndTimeStamp !=3D NULL); - ASSERT (Identifier !=3D NULL); - - InternalGetPerformanceHobLog (&PeiPerformanceLog, &PeiPerformanceIdArray= ); - - NumberOfEntries =3D (UINTN) (PeiPerformanceLog->NumberOfEntries); - LogEntryArray =3D (PEI_PERFORMANCE_LOG_ENTRY *) (PeiPerformanceLog += 1); - // - // Make sure that LogEntryKey is a valid log entry key. - // - ASSERT (LogEntryKey <=3D NumberOfEntries); - - if (LogEntryKey =3D=3D NumberOfEntries) { - return 0; - } - - CurrentLogEntry =3D &(LogEntryArray[LogEntryKey]); - - *Handle =3D (VOID *) (UINTN) (CurrentLogEntry->Handle); - *Token =3D CurrentLogEntry->Token; - *Module =3D CurrentLogEntry->Module; - *StartTimeStamp =3D CurrentLogEntry->StartTimeStamp; - *EndTimeStamp =3D CurrentLogEntry->EndTimeStamp; - *Identifier =3D PeiPerformanceIdArray[LogEntryKey++]; - - return LogEntryKey; + return 0; } =20 /** Creates a record for the beginning of a performance measurement. =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. If TimeStamp is zero, then this function reads the current time stamp and adds that time stamp value to the record as the start time. =20 + If TimeStamp is one, then this function reads 0 as the start time. + + If TimeStamp is other value, then TimeStamp is added to the record as th= e start time. + + @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 @@ -390,22 +572,20 @@ StartPerformanceMeasurement ( IN CONST CHAR8 *Token, OPTIONAL IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp ) { - return StartPerformanceMeasurementEx (Handle, Token, Module, TimeStamp, = 0); + return InsertPeiFpdtMeasurement (TRUE, Handle, Token, Module, TimeStamp,= 0); } =20 /** - Fills in the end time of a performance measurement. =20 - Looks up the record that matches Handle, Token, and Module. - If the record can not be found then return RETURN_NOT_FOUND. - If the record is found and TimeStamp is not zero, - then TimeStamp is added to the record as the end time. - If the record is found and TimeStamp is zero, then this function reads - the current time stamp and adds that time stamp value to the record as t= he end time. + Creates a record for the end of a performance measurement. + + If the TimeStamp is not zero or one, then TimeStamp is added to the reco= rd as the end time. + If the TimeStamp is zero, then this function reads the current time stam= p and adds that time stamp value to the record as the end time. + If the TimeStamp is one, then this function reads 0 as the end time. =20 @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. @@ -424,11 +604,11 @@ EndPerformanceMeasurement ( IN CONST CHAR8 *Token, OPTIONAL IN CONST CHAR8 *Module, OPTIONAL IN UINT64 TimeStamp ) { - return EndPerformanceMeasurementEx (Handle, Token, Module, TimeStamp, 0); + return InsertPeiFpdtMeasurement (FALSE, 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, @@ -449,10 +629,12 @@ EndPerformanceMeasurement ( If Token is NULL, then ASSERT(). If Module is NULL, then ASSERT(). If StartTimeStamp is NULL, then ASSERT(). If EndTimeStamp is NULL, then ASSERT(). =20 + NOT Support yet. + @param LogEntryKey On entry, the key of the performance mea= surement log entry to retrieve. 0, then the first performance measuremen= t log entry is retrieved. On exit, the key of the next performance= of entry entry. @param Handle Pointer to environment specific context = used to identify the component being measured. @@ -477,12 +659,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/PeiPerformanceLib/PeiPerformanceLib.inf b= /MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf index 08aa064..7239673 100644 --- a/MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf +++ b/MdeModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.inf @@ -3,11 +3,11 @@ # =20 # This library provides the performance measurement interfaces in PEI pha= se, it creates # and consumes GUIDed HOB for performance logging. The GUIDed HOB is pass= ed to DXE phase # so that it can be taken over by DxeCorePerformanceLib. =20 # =20 -# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
# (C) Copyright 2016 Hewlett Packard Enterprise Development LP
# 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 @@ -51,14 +51,12 @@ =20 =20 [Guids] ## PRODUCES ## HOB ## CONSUMES ## HOB - gPerformanceProtocolGuid - ## PRODUCES ## HOB - ## CONSUMES ## HOB - gPerformanceExProtocolGuid + gEdkiiExtendedFirmwarePerformanceGuid =20 [Pcd] - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPerformanceLogEntries ## CONSU= MES - gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPerformanceLogEntries16 ## CONSU= MES - gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask ## CONSU= MES + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPerformanceLogEntries ## CON= SUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPerformanceLogEntries16 ## CON= SUMES + gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask ## CON= SUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdEdkiiFpdtStringRecordEnableOnly ## CON= SUMES --=20 1.9.5.msysgit.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel