From 4ba61e5e2a1b3cec7faaad36c252738f6f57f8a6 Mon Sep 17 00:00:00 2001 From: qhuang8 Date: Thu, 22 Jun 2006 06:08:00 +0000 Subject: =?UTF-8?q?1.=20UINTN=20&=20INTN=20issue=20for=20EBC=20architectur?= =?UTF-8?q?e:=20=09The=20MAX=5FBIT=20of=20EBC=20will=20no=20longer=20be=20?= =?UTF-8?q?fixed=20to=20bit=2063.=20It=20is=20defined=20as=20(1ULL=20<<=20?= =?UTF-8?q?(sizeof=20(INTN)=20*=208=20-=201)).=20=09Make=20EdkModulePkg=20?= =?UTF-8?q?&=20MdePkg=20EBC=20compiler=20clean:=20treat=20all=20EFI=5FSTAT?= =?UTF-8?q?US=20error=20code=20as=20variable.=202.=20PrintLib=20=09Complet?= =?UTF-8?q?e=20all=20missing=20ASSERT()s.=20=09Fix=20=E2=80=9C\n=E2=80=9D?= =?UTF-8?q?=20&=20=E2=80=9C%\n=E2=80=9D=20issue=20thanks=20to=20the=20clar?= =?UTF-8?q?ification=20of=20MWG=200.56d.=20=09Adjust=20StatusString=20arra?= =?UTF-8?q?y=20to=20support=20EBC=20build.=203.=20BaseMemoryLib=20=09Adjus?= =?UTF-8?q?t=20ASSERT=20()=20&=20function=20header=20of=20ComparaMem,=20Se?= =?UTF-8?q?tMemXX,=20ScanMemXX=20to=20synchronize=20with=20MWG=200.56d.=20?= =?UTF-8?q?4.SmbusLib=20=09Change=20Pec=20bit=20to=20bit=2022=20SmBusAddre?= =?UTF-8?q?ss=20to=20synchronize=20MWG=200.56d.=20=09Add=20ASSERT()s=20to?= =?UTF-8?q?=20check=20if=20length=20is=20illegal=20for=20SmBusBlockWrite()?= =?UTF-8?q?=20&=20SmBusProcessBlock()=20since=20it=20is=206=20bit=20now.?= =?UTF-8?q?=205.=20PerformanceLib=20=09Rename=20=E2=80=9CEdkDxePerformance?= =?UTF-8?q?Lib=E2=80=9D=20&=20=E2=80=9CEdkPeiPerformanceLib=E2=80=9D=20to?= =?UTF-8?q?=20=E2=80=9CDxePerformanceLib=E2=80=9D=20&=20=E2=80=9CPeiPerfor?= =?UTF-8?q?manceLib=E2=80=9D=20respectively.=20=09Synchronize=20the=20func?= =?UTF-8?q?tion=20header=20of=20GetPerformanceMeasurement()=20with=20MWG?= =?UTF-8?q?=200.56d.=206.=20BasePeCoffLoaderLib.=20=09Make=20PeCoffLoaderL?= =?UTF-8?q?oadImage=20()=20Assert()=20if=20ImageContext=20is=20NULL>=20=09?= =?UTF-8?q?Make=20PeCoffLoaderLoadImage=20()=20return=20RETURN=5FINVALID?= =?UTF-8?q?=5FPARAMETER=20if=20the=20ImageAddress=20in=20ImageContext=20is?= =?UTF-8?q?=200.=20=09Adjust=20some=20coding=20style.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@593 6f19259b-4bc3-4df7-8a09-765794883524 --- .../DxeCorePerformanceLib/DxeCorePerformanceLib.c | 56 ++-- .../Library/DxePerformanceLib/DxePerformanceLib.c | 228 ++++++++++++++ .../DxePerformanceLib/DxePerformanceLib.mbd | 29 ++ .../DxePerformanceLib/DxePerformanceLib.msa | 60 ++++ EdkModulePkg/Library/DxePerformanceLib/build.xml | 47 +++ .../Library/PeiPerformanceLib/PeiPerformanceLib.c | 330 +++++++++++++++++++++ .../PeiPerformanceLib/PeiPerformanceLib.mbd | 29 ++ .../PeiPerformanceLib/PeiPerformanceLib.msa | 59 ++++ EdkModulePkg/Library/PeiPerformanceLib/build.xml | 47 +++ 9 files changed, 863 insertions(+), 22 deletions(-) create mode 100644 EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c create mode 100644 EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.mbd create mode 100644 EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.msa create mode 100644 EdkModulePkg/Library/DxePerformanceLib/build.xml create mode 100644 EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c create mode 100644 EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.mbd create mode 100644 EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.msa create mode 100644 EdkModulePkg/Library/PeiPerformanceLib/build.xml (limited to 'EdkModulePkg/Library') diff --git a/EdkModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c b/EdkModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c index c75ab851f7..e4e7b3bb3b 100644 --- a/EdkModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c +++ b/EdkModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c @@ -532,34 +532,46 @@ EndPerformanceMeasurement ( } /** - Retrieves a previously logged performance measurement. + Attempts to retrieve a performance measurement log entry from the performance measurement log. - Retrieves the performance log entry from the performance log - that immediately follows the log entry specified by LogEntryKey. - If LogEntryKey is zero, then the first entry from the performance log is returned. - If the log entry specified by LogEntryKey is the last entry in the performance log, - then 0 is returned. Otherwise, the performance log entry is returned in Handle, - Token, Module, StartTimeStamp, and EndTimeStamp. - The key for the current performance log entry is returned. - - @param LogEntryKey The key for the previous performance measurement log entry. - If 0, then the first performance measurement log entry is retrieved. - @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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @param StartTimeStamp The 64-bit time stamp that was recorded when the measurement was started. - @param EndTimeStamp The 64-bit time stamp that was recorded when the measurement was ended. - - @return The key for the current performance log entry. + Attempts to retrieve the performance log entry specified by LogEntryKey. If LogEntryKey is + zero on entry, then an attempt is made to retrieve the first entry from the performance log, + and the key for the second entry in the log is returned. If the performance log is empty, + then no entry is retrieved and zero is returned. If LogEntryKey is not zero, then the performance + log entry associated with LogEntryKey is retrieved, and the key for the next entry in the log is + returned. If LogEntryKey is the key for the last entry in the log, then the last log entry is + retrieved and an implementation specific non-zero key value that specifies the end of the performance + log is returned. If LogEntryKey is equal this implementation specific non-zero key value, then no entry + is retrieved and zero is returned. In the cases where a performance log entry can be returned, + the log entry is returned in Handle, Token, Module, StartTimeStamp, and EndTimeStamp. + If LogEntryKey is not a valid log entry key for the performance measurement log, then ASSERT(). + If Handle is NULL, then ASSERT(). + If Token is NULL, then ASSERT(). + If Module is NULL, then ASSERT(). + If StartTimeStamp is NULL, then ASSERT(). + If EndTimeStamp is NULL, then ASSERT(). + + @param LogEntryKey On entry, the key of the performance measurement log entry to retrieve. + 0, then the first performance measurement log entry is retrieved. + On exit, the key of the next performance lof entry entry. + @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 measured. + @param Module Pointer to a Null-terminated ASCII string that identifies the module + being measured. + @param StartTimeStamp Pointer to the 64-bit time stamp that was recorded when the measurement + was started. + @param EndTimeStamp Pointer to the 64-bit time stamp that was recorded when the measurement + was ended. + + @return The key for the next performance log entry (in general case). **/ UINTN EFIAPI GetPerformanceMeasurement ( - UINTN LogEntryKey, + IN UINTN LogEntryKey, OUT CONST VOID **Handle, OUT CONST CHAR8 **Token, OUT CONST CHAR8 **Module, diff --git a/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c b/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c new file mode 100644 index 0000000000..8a3ac4053f --- /dev/null +++ b/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c @@ -0,0 +1,228 @@ +/*++ + +Copyright (c) 2006, 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 + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + DxePerformanceLib.c + +Abstract: + + Performance Library + +--*/ + +STATIC PERFORMANCE_PROTOCOL *mPerformance = NULL; + +/** + The constructor function caches the pointer to Performance protocol. + + The constructor function locates Performance protocol from protocol database. + It will ASSERT() if that operation fails and it will always return EFI_SUCCESS. + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +PerformanceLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = gBS->LocateProtocol (&gPerformanceProtocolGuid, NULL, (VOID **) &mPerformance); + ASSERT_EFI_ERROR (Status); + ASSERT (mPerformance != NULL); + + return Status; +} + +/** + Creates a record for the beginning of a performance measurement. + + Creates a record that contains the Handle, Token, and Module. + If TimeStamp is not zero, then TimeStamp is added to the record as the start 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. + + @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 measured. + @param Module Pointer to a Null-terminated ASCII string + that identifies the module being measured. + @param TimeStamp 64-bit time stamp. + + @retval RETURN_SUCCESS The start of the measurement was recorded. + @retval RETURN_OUT_OF_RESOURCES There are not enough resources to record the measurement. + +**/ +RETURN_STATUS +EFIAPI +StartPerformanceMeasurement ( + IN CONST VOID *Handle, OPTIONAL + IN CONST CHAR8 *Token, OPTIONAL + IN CONST CHAR8 *Module, OPTIONAL + IN UINT64 TimeStamp + ) +{ + EFI_STATUS Status; + + Status = mPerformance->StartGauge (Handle, Token, Module, TimeStamp); + + return (RETURN_STATUS) Status; +} + +/** + Fills in the end time of a performance measurement. + + 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 the end time. + If this function is called multiple times for the same record, then the end time is overwritten. + + @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 measured. + @param Module Pointer to a Null-terminated ASCII string + that identifies the module being measured. + @param TimeStamp 64-bit time stamp. + + @retval RETURN_SUCCESS The end of the measurement was recorded. + @retval RETURN_NOT_FOUND The specified measurement record could not be found. + +**/ +RETURN_STATUS +EFIAPI +EndPerformanceMeasurement ( + IN CONST VOID *Handle, OPTIONAL + IN CONST CHAR8 *Token, OPTIONAL + IN CONST CHAR8 *Module, OPTIONAL + IN UINT64 TimeStamp + ) +{ + EFI_STATUS Status; + + Status = mPerformance->EndGauge (Handle, Token, Module, TimeStamp); + + return (RETURN_STATUS) Status; +} + +/** + Attempts to retrieve a performance measurement log entry from the performance measurement log. + + Attempts to retrieve the performance log entry specified by LogEntryKey. If LogEntryKey is + zero on entry, then an attempt is made to retrieve the first entry from the performance log, + and the key for the second entry in the log is returned. If the performance log is empty, + then no entry is retrieved and zero is returned. If LogEntryKey is not zero, then the performance + log entry associated with LogEntryKey is retrieved, and the key for the next entry in the log is + returned. If LogEntryKey is the key for the last entry in the log, then the last log entry is + retrieved and an implementation specific non-zero key value that specifies the end of the performance + log is returned. If LogEntryKey is equal this implementation specific non-zero key value, then no entry + is retrieved and zero is returned. In the cases where a performance log entry can be returned, + the log entry is returned in Handle, Token, Module, StartTimeStamp, and EndTimeStamp. + If LogEntryKey is not a valid log entry key for the performance measurement log, then ASSERT(). + If Handle is NULL, then ASSERT(). + If Token is NULL, then ASSERT(). + If Module is NULL, then ASSERT(). + If StartTimeStamp is NULL, then ASSERT(). + If EndTimeStamp is NULL, then ASSERT(). + + @param LogEntryKey On entry, the key of the performance measurement log entry to retrieve. + 0, then the first performance measurement log entry is retrieved. + On exit, the key of the next performance lof entry entry. + @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 measured. + @param Module Pointer to a Null-terminated ASCII string that identifies the module + being measured. + @param StartTimeStamp Pointer to the 64-bit time stamp that was recorded when the measurement + was started. + @param EndTimeStamp Pointer to the 64-bit time stamp that was recorded when the measurement + was ended. + + @return The key for the next performance log entry (in general case). + +**/ +UINTN +EFIAPI +GetPerformanceMeasurement ( + IN UINTN LogEntryKey, + OUT CONST VOID **Handle, + OUT CONST CHAR8 **Token, + OUT CONST CHAR8 **Module, + OUT UINT64 *StartTimeStamp, + OUT UINT64 *EndTimeStamp + ) +{ + EFI_STATUS Status; + GAUGE_DATA_ENTRY *GaugeData; + + ASSERT (Handle != NULL); + ASSERT (Token != NULL); + ASSERT (Module != NULL); + ASSERT (StartTimeStamp != NULL); + ASSERT (EndTimeStamp != NULL); + + Status = mPerformance->GetGauge (LogEntryKey++, &GaugeData); + + // + // Make sure that LogEntryKey is a valid log entry key, + // + ASSERT (Status != EFI_INVALID_PARAMETER); + + if (EFI_ERROR (Status)) { + // + // The LogEntryKey is the last entry (equals to the total entry number). + // + return 0; + } + + ASSERT (GaugeData != NULL); + + *Handle = (VOID *) (UINTN) GaugeData->Handle; + *Token = GaugeData->Token; + *Module = GaugeData->Module; + *StartTimeStamp = GaugeData->StartTimeStamp; + *EndTimeStamp = GaugeData->EndTimeStamp; + + return LogEntryKey; +} + +/** + Returns TRUE if the performance measurement macros are enabled. + + This function returns TRUE if the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of + PcdPerformanceLibraryPropertyMask is set. Otherwise FALSE is returned. + + @retval TRUE The PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of + PcdPerformanceLibraryPropertyMask is set. + @retval FALSE The PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of + PcdPerformanceLibraryPropertyMask is clear. + +**/ +BOOLEAN +EFIAPI +PerformanceMeasurementEnabled ( + VOID + ) +{ + return ((PcdGet8(PcdPerformanceLibraryPropertyMask) & PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED) != 0); +} diff --git a/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.mbd b/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.mbd new file mode 100644 index 0000000000..1d8df5409b --- /dev/null +++ b/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.mbd @@ -0,0 +1,29 @@ + + + + + DxePerformanceLib + 8B8B4CCC-65FC-41a5-8067-308B8E42CCF2 + EDK_RELEASE_VERSION 0x00020000 + FIX ME! + Copyright (c) 2006, 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 + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + 2006-04-04 11:11 + + diff --git a/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.msa b/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.msa new file mode 100644 index 0000000000..d8696f24e7 --- /dev/null +++ b/EdkModulePkg/Library/DxePerformanceLib/DxePerformanceLib.msa @@ -0,0 +1,60 @@ + + + + + DxePerformanceLib + DXE_DRIVER + LIBRARY + 8B8B4CCC-65FC-41a5-8067-308B8E42CCF2 + EDK_RELEASE_VERSION 0x00020000 + Memory-only library functions with no library constructor/destructor + FIX ME! + Copyright (c) 2006, 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 + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + 2006-04-04 11:11 + EFI_SPECIFICATION_VERSION 0x00000000 + + + PerformanceLib + DebugLib + UefiBootServicesTableLib + TimerLib + PcdLib + + + DxePerformanceLib.c + + + MdePkg + EdkModulePkg + + + Performance + + + + PerformanceLibConstructor + + + + + PcdPerformanceLibraryPropertyMask + + + diff --git a/EdkModulePkg/Library/DxePerformanceLib/build.xml b/EdkModulePkg/Library/DxePerformanceLib/build.xml new file mode 100644 index 0000000000..a663483133 --- /dev/null +++ b/EdkModulePkg/Library/DxePerformanceLib/build.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c b/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c new file mode 100644 index 0000000000..b97849fa35 --- /dev/null +++ b/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.c @@ -0,0 +1,330 @@ +/*++ + +Copyright (c) 2006, 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 + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + PeiPerformanceLib.c + +Abstract: + + Performance Library + +--*/ + +/** + Gets PEI the GUID HOB for PEI performance. + + 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 returns the data area of that GUID HOB to record performance 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 measured. + @param Module Pointer to a Null-terminated ASCII string + that identifies the module being measured. + + @retval The index of log entry in the array. + +**/ +PEI_PERFORMANCE_LOG_HEADER * +InternalGetPerformanceHobLog ( + VOID + ) +{ + EFI_HOB_GUID_TYPE *GuidHob; + PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog; + UINTN PeiPerformanceLogSize; + + GuidHob = GetFirstGuidHob (&gPeiPerformanceHobGuid); + + if (GuidHob != NULL) { + // + // PEI Performance HOB was found, then return the existing one. + // + PeiPerformanceLog = GET_GUID_HOB_DATA (GuidHob); + } else { + // + // PEI Performance HOB was not found, then build one. + // + PeiPerformanceLogSize = sizeof (PEI_PERFORMANCE_LOG_HEADER) + + sizeof (PEI_PERFORMANCE_LOG_ENTRY) * MAX_PEI_PERFORMANCE_LOG_ENTRIES; + PeiPerformanceLog = BuildGuidHob (&gPeiPerformanceHobGuid, PeiPerformanceLogSize); + PeiPerformanceLog = ZeroMem (PeiPerformanceLog, PeiPerformanceLogSize); + } + + return PeiPerformanceLog; +} + +/** + Searches in the log array with keyword Handle, Token and Module. + + This internal function searches for the log entry in the log array. + If there is an entry that exactly matches the given key word triple + and its end time stamp is zero, then the index of that log entry is returned; + otherwise, the the number of log entries in the array is returned. + + @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 measured. + @param Module Pointer to a Null-terminated ASCII string + that identifies the module being measured. + + @retval The index of log entry in the array. + +**/ +UINT32 +InternalSearchForLogEntry ( + IN PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog, + IN CONST VOID *Handle, OPTIONAL + IN CONST CHAR8 *Token, OPTIONAL + IN CONST CHAR8 *Module OPTIONAL + ) +{ + UINT32 Index; + UINT32 NumberOfEntries; + PEI_PERFORMANCE_LOG_ENTRY *LogEntryArray; + + + if (Token == NULL) { + Token = ""; + } + if (Module == NULL) { + Module = ""; + } + NumberOfEntries = PeiPerformanceLog->NumberOfEntries; + LogEntryArray = (PEI_PERFORMANCE_LOG_ENTRY *) (PeiPerformanceLog + 1); + + for (Index = 0; Index < NumberOfEntries; Index++) { + if ((LogEntryArray[Index].Handle == (EFI_PHYSICAL_ADDRESS) (UINTN) Handle) && + AsciiStrnCmp (LogEntryArray[Index].Token, Token, PEI_PERFORMANCE_STRING_LENGTH) == 0 && + AsciiStrnCmp (LogEntryArray[Index].Module, Module, PEI_PERFORMANCE_STRING_LENGTH) == 0 && + LogEntryArray[Index].EndTimeStamp == 0 + ) { + break; + } + } + return Index; +} + +/** + Creates a record for the beginning of a performance measurement. + + Creates a record that contains the Handle, Token, and Module. + If TimeStamp is not zero, then TimeStamp is added to the record as the start 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. + + @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 measured. + @param Module Pointer to a Null-terminated ASCII string + that identifies the module being measured. + @param TimeStamp 64-bit time stamp. + + @retval RETURN_SUCCESS The start of the measurement was recorded. + @retval RETURN_OUT_OF_RESOURCES There are not enough resources to record the measurement. + +**/ +RETURN_STATUS +EFIAPI +StartPerformanceMeasurement ( + IN CONST VOID *Handle, OPTIONAL + IN CONST CHAR8 *Token, OPTIONAL + IN CONST CHAR8 *Module, OPTIONAL + IN UINT64 TimeStamp + ) +{ + PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog; + PEI_PERFORMANCE_LOG_ENTRY *LogEntryArray; + UINT32 Index; + + PeiPerformanceLog = InternalGetPerformanceHobLog (); + + if (PeiPerformanceLog->NumberOfEntries >= MAX_PEI_PERFORMANCE_LOG_ENTRIES) { + return RETURN_OUT_OF_RESOURCES; + } + Index = PeiPerformanceLog->NumberOfEntries++; + LogEntryArray = (PEI_PERFORMANCE_LOG_ENTRY *) (PeiPerformanceLog + 1); + LogEntryArray[Index].Handle = (EFI_PHYSICAL_ADDRESS) (UINTN) Handle; + + if (Token != NULL) { + AsciiStrnCpy (LogEntryArray[Index].Token, Token, PEI_PERFORMANCE_STRING_LENGTH); + } + if (Module != NULL) { + AsciiStrnCpy (LogEntryArray[Index].Module, Module, PEI_PERFORMANCE_STRING_LENGTH); + } + + if (TimeStamp == 0) { + TimeStamp = GetPerformanceCounter (); + } + LogEntryArray[Index].StartTimeStamp = TimeStamp; + + return RETURN_SUCCESS; +} + +/** + Fills in the end time of a performance measurement. + + 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 the end time. + If this function is called multiple times for the same record, then the end time is overwritten. + + @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 measured. + @param Module Pointer to a Null-terminated ASCII string + that identifies the module being measured. + @param TimeStamp 64-bit time stamp. + + @retval RETURN_SUCCESS The end of the measurement was recorded. + @retval RETURN_NOT_FOUND The specified measurement record could not be found. + +**/ +RETURN_STATUS +EFIAPI +EndPerformanceMeasurement ( + IN CONST VOID *Handle, OPTIONAL + IN CONST CHAR8 *Token, OPTIONAL + IN CONST CHAR8 *Module, OPTIONAL + IN UINT64 TimeStamp + ) +{ + PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog; + PEI_PERFORMANCE_LOG_ENTRY *LogEntryArray; + UINT32 Index; + + if (TimeStamp == 0) { + TimeStamp = GetPerformanceCounter (); + } + + PeiPerformanceLog = InternalGetPerformanceHobLog (); + Index = InternalSearchForLogEntry (PeiPerformanceLog, Handle, Token, Module); + if (Index >= PeiPerformanceLog->NumberOfEntries) { + return RETURN_NOT_FOUND; + } + LogEntryArray = (PEI_PERFORMANCE_LOG_ENTRY *) (PeiPerformanceLog + 1); + LogEntryArray[Index].EndTimeStamp = TimeStamp; + + return RETURN_SUCCESS; +} + +/** + Attempts to retrieve a performance measurement log entry from the performance measurement log. + + Attempts to retrieve the performance log entry specified by LogEntryKey. If LogEntryKey is + zero on entry, then an attempt is made to retrieve the first entry from the performance log, + and the key for the second entry in the log is returned. If the performance log is empty, + then no entry is retrieved and zero is returned. If LogEntryKey is not zero, then the performance + log entry associated with LogEntryKey is retrieved, and the key for the next entry in the log is + returned. If LogEntryKey is the key for the last entry in the log, then the last log entry is + retrieved and an implementation specific non-zero key value that specifies the end of the performance + log is returned. If LogEntryKey is equal this implementation specific non-zero key value, then no entry + is retrieved and zero is returned. In the cases where a performance log entry can be returned, + the log entry is returned in Handle, Token, Module, StartTimeStamp, and EndTimeStamp. + If LogEntryKey is not a valid log entry key for the performance measurement log, then ASSERT(). + If Handle is NULL, then ASSERT(). + If Token is NULL, then ASSERT(). + If Module is NULL, then ASSERT(). + If StartTimeStamp is NULL, then ASSERT(). + If EndTimeStamp is NULL, then ASSERT(). + + @param LogEntryKey On entry, the key of the performance measurement log entry to retrieve. + 0, then the first performance measurement log entry is retrieved. + On exit, the key of the next performance lof entry entry. + @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 measured. + @param Module Pointer to a Null-terminated ASCII string that identifies the module + being measured. + @param StartTimeStamp Pointer to the 64-bit time stamp that was recorded when the measurement + was started. + @param EndTimeStamp Pointer to the 64-bit time stamp that was recorded when the measurement + was ended. + + @return The key for the next performance log entry (in general case). + +**/ +UINTN +EFIAPI +GetPerformanceMeasurement ( + IN UINTN LogEntryKey, + OUT CONST VOID **Handle, + OUT CONST CHAR8 **Token, + OUT CONST CHAR8 **Module, + OUT UINT64 *StartTimeStamp, + OUT UINT64 *EndTimeStamp + ) +{ + PEI_PERFORMANCE_LOG_HEADER *PeiPerformanceLog; + PEI_PERFORMANCE_LOG_ENTRY *CurrentLogEntry; + PEI_PERFORMANCE_LOG_ENTRY *LogEntryArray; + UINTN NumberOfEntries; + + ASSERT (Handle != NULL); + ASSERT (Token != NULL); + ASSERT (Module != NULL); + ASSERT (StartTimeStamp != NULL); + ASSERT (EndTimeStamp != NULL); + + PeiPerformanceLog = InternalGetPerformanceHobLog (); + + NumberOfEntries = (UINTN) (PeiPerformanceLog->NumberOfEntries); + LogEntryArray = (PEI_PERFORMANCE_LOG_ENTRY *) (PeiPerformanceLog + 1); + // + // Make sure that LogEntryKey is a valid log entry key. + // + ASSERT (LogEntryKey <= NumberOfEntries); + + if (LogEntryKey == NumberOfEntries) { + return 0; + } + + CurrentLogEntry = &(LogEntryArray[LogEntryKey++]); + + *Handle = (VOID *) (UINTN) (CurrentLogEntry->Handle); + *Token = CurrentLogEntry->Token; + *Module = CurrentLogEntry->Module; + *StartTimeStamp = CurrentLogEntry->StartTimeStamp; + *EndTimeStamp = CurrentLogEntry->EndTimeStamp; + + return LogEntryKey; +} + +/** + Returns TRUE if the performance measurement macros are enabled. + + This function returns TRUE if the PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of + PcdPerformanceLibraryPropertyMask is set. Otherwise FALSE is returned. + + @retval TRUE The PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of + PcdPerformanceLibraryPropertyMask is set. + @retval FALSE The PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED bit of + PcdPerformanceLibraryPropertyMask is clear. + +**/ +BOOLEAN +EFIAPI +PerformanceMeasurementEnabled ( + VOID + ) +{ + return ((PcdGet8(PcdPerformanceLibraryPropertyMask) & PERFORMANCE_LIBRARY_PROPERTY_MEASUREMENT_ENABLED) != 0); +} diff --git a/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.mbd b/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.mbd new file mode 100644 index 0000000000..8dba9c21c1 --- /dev/null +++ b/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.mbd @@ -0,0 +1,29 @@ + + + + + PeiPerformanceLib + F72DE735-B24F-4ef6-897F-70A85D01A047 + EDK_RELEASE_VERSION 0x00020000 + FIX ME! + Copyright (c) 2006, 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 + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + 2006-04-04 11:12 + + diff --git a/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.msa b/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.msa new file mode 100644 index 0000000000..a80adce978 --- /dev/null +++ b/EdkModulePkg/Library/PeiPerformanceLib/PeiPerformanceLib.msa @@ -0,0 +1,59 @@ + + + + + PeiPerformanceLib + PEIM + LIBRARY + F72DE735-B24F-4ef6-897F-70A85D01A047 + EDK_RELEASE_VERSION 0x00020000 + Memory-only library functions with no library constructor/destructor + FIX ME! + Copyright (c) 2006, 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 + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + 2006-04-04 11:12 + EFI_SPECIFICATION_VERSION 0x00000000 + + + PerformanceLib + DebugLib + HobLib + BaseLib + TimerLib + PcdLib + BaseMemoryLib + + + PeiPerformanceLib.c + + + MdePkg + EdkModulePkg + + + + PeiPerformanceHob + + + + + PcdPerformanceLibraryPropertyMask + + + diff --git a/EdkModulePkg/Library/PeiPerformanceLib/build.xml b/EdkModulePkg/Library/PeiPerformanceLib/build.xml new file mode 100644 index 0000000000..e0bd259b3a --- /dev/null +++ b/EdkModulePkg/Library/PeiPerformanceLib/build.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- cgit v1.2.3