diff --git a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c index 68b29ac5a9..7982060518 100644 --- a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c +++ b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.c @@ -82,21 +82,10 @@ BOOLEAN mLockInsertRecord = FALSE; EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *mDevicePathToText = NULL; // -// Interfaces for Performance Protocol. +// Interfaces for PerformanceMeasurement Protocol. // -PERFORMANCE_PROTOCOL mPerformanceInterface = { - StartGauge, - EndGauge, - GetGauge - }; - -// -// Interfaces for PerformanceEx Protocol. -// -PERFORMANCE_EX_PROTOCOL mPerformanceExInterface = { - StartGaugeEx, - EndGaugeEx, - GetGaugeEx +EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL mPerformanceMeasurementInterface = { + CreatePerformanceMeasurement, }; PERFORMANCE_PROPERTY mPerformanceProperty; @@ -799,18 +788,11 @@ InsertFpdtMeasurement ( UseModuleName = FALSE; ZeroMem (ModuleName, sizeof (ModuleName)); - if (mLockInsertRecord) { - return EFI_UNSUPPORTED; - } - - mLockInsertRecord = TRUE; - // // Get record info (type, size, ProgressID and Module Guid). // Status = GetFpdtRecordInfo (IsStart, Handle, Token, Module, &RecordInfo, &UseModuleName); if (EFI_ERROR (Status)) { - mLockInsertRecord = FALSE; return Status; } @@ -824,7 +806,6 @@ InsertFpdtMeasurement ( // If input ID doesn't follow the rule, we will adjust it. // if ((Identifier != 0) && (IsKnownID (Identifier)) && (!IsKnownTokens (Token))) { - mLockInsertRecord = FALSE; return EFI_UNSUPPORTED; } else if ((Identifier != 0) && (!IsKnownID (Identifier)) && (!IsKnownTokens (Token))) { if (IsStart && ((Identifier & 0x000F) != 0)) { @@ -844,7 +825,6 @@ InsertFpdtMeasurement ( DEBUG ((DEBUG_INFO, "DxeCorePerformanceLib: No enough space to save boot records\n")); mLackSpaceIsReported = TRUE; } - mLockInsertRecord = FALSE; return EFI_OUT_OF_RESOURCES; } else { // @@ -866,7 +846,6 @@ InsertFpdtMeasurement ( ); if (mPerformancePointer == NULL) { - mLockInsertRecord = FALSE; return EFI_OUT_OF_RESOURCES; } mMaxPerformanceLength = mPerformanceLength + RecordInfo.RecordSize + FIRMWARE_RECORD_BUFFER; @@ -963,11 +942,9 @@ InsertFpdtMeasurement ( // // Record is not supported in current DXE phase, return EFI_ABORTED // - mLockInsertRecord = FALSE; return EFI_UNSUPPORTED; } - mLockInsertRecord = FALSE; return EFI_SUCCESS; } @@ -1063,219 +1040,6 @@ ReportFpdtRecordBuffer ( } } -/** - 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 time 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, the created record - is same as the one created by StartGauge of PERFORMANCE_PROTOCOL. - - @retval EFI_SUCCESS The data was read correctly from the device. - @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, 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 and 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 matching 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, the 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 not 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, Identifier); -} - -/** - Retrieves a previously logged performance measurement. - It can also retrieve the log created by StartGauge and EndGauge of PERFORMANCE_PROTOCOL, - and then assign the Identifier with 0. - - !!! Not support!!! - - Retrieves the performance log entry from the performance log specified by 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 measurement log entry. - If 0, then the first performance measurement log entry is retrieved. - @param GaugeDataEntryEx The indirect pointer to the extended gauge data entry specified by LogEntryKey - if the retrieval is successful. - - @retval EFI_SUCCESS The GuageDataEntryEx is successfully found based on LogEntryKey. - @retval EFI_NOT_FOUND The LogEntryKey is the last entry (equals to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (greater 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 time 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @param TimeStamp 64-bit time stamp. - - @retval EFI_SUCCESS The data was read correctly from the device. - @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 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 matching 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @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 not 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 PERFORMANCE_EX_PROTOCOL, - and then eliminate the Identifier. - - !!! Not support!!! - - Retrieves the performance log entry from the performance log specified by 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 measurement log entry. - If 0, then the first performance measurement log entry is retrieved. - @param GaugeDataEntry The indirect pointer to the gauge data entry 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 (equals to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (greater 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. @@ -1319,10 +1083,8 @@ DxeCorePerformanceLibConstructor ( Handle = NULL; Status = gBS->InstallMultipleProtocolInterfaces ( &Handle, - &gPerformanceProtocolGuid, - &mPerformanceInterface, - &gPerformanceExProtocolGuid, - &mPerformanceExInterface, + &gEdkiiPerformanceMeasurementProtocolGuid, + &mPerformanceMeasurementInterface, NULL ); ASSERT_EFI_ERROR (Status); @@ -1359,6 +1121,55 @@ DxeCorePerformanceLibConstructor ( 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 TimeStamp - 64-bit time stamp. + @param Address - Pointer to a location in memory relevant to the measurement. + @param Identifier - Performance identifier describing the type of measurement. + @param Attribute - The attribute of the measurement. According to 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 - NULL + 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 = EFI_SUCCESS; + + if (mLockInsertRecord) { + return EFI_INVALID_PARAMETER; + } + mLockInsertRecord = TRUE; + + if (Attribute == PerfStartEntry) { + Status = InsertFpdtMeasurement (TRUE, CallerIdentifier, String, String, TimeStamp, Identifier); + } else if (Attribute == PerfEndEntry) { + Status = InsertFpdtMeasurement (FALSE, CallerIdentifier, String, String, TimeStamp, Identifier); + } + mLockInsertRecord = FALSE; + + return Status; +} + /** Adds a record at the end of the performance measurement log that records the start time of a performance measurement. @@ -1394,7 +1205,17 @@ StartPerformanceMeasurementEx ( IN UINT32 Identifier ) { - return InsertFpdtMeasurement (TRUE, Handle, Token, Module, TimeStamp, Identifier); + CONST CHAR8 *String; + + if (Token != NULL) { + String = Token; + } else if (Module != NULL) { + String = Module; + } else { + String = NULL; + } + + return (RETURN_STATUS)CreatePerformanceMeasurement (Handle, NULL, String, TimeStamp, 0, Identifier, PerfStartEntry); } /** @@ -1433,7 +1254,17 @@ EndPerformanceMeasurementEx ( IN UINT32 Identifier ) { - return InsertFpdtMeasurement (FALSE, Handle, Token, Module, TimeStamp, Identifier); + CONST CHAR8 *String; + + if (Token != NULL) { + String = Token; + } else if (Module != NULL) { + String = Module; + } else { + String = NULL; + } + + return (RETURN_STATUS)CreatePerformanceMeasurement (Handle, NULL, String, TimeStamp, 0, Identifier, PerfEndEntry); } /** @@ -1527,7 +1358,7 @@ StartPerformanceMeasurement ( IN UINT64 TimeStamp ) { - return InsertFpdtMeasurement (TRUE, Handle, Token, Module, TimeStamp, 0); + return StartPerformanceMeasurementEx (Handle, Token, Module, TimeStamp, 0); } /** @@ -1563,7 +1394,7 @@ EndPerformanceMeasurement ( IN UINT64 TimeStamp ) { - return InsertFpdtMeasurement (FALSE, Handle, Token, Module, TimeStamp, 0); + return EndPerformanceMeasurementEx (Handle, Token, Module, TimeStamp, 0); } /** diff --git a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf index e752a93d83..68cd76da5b 100644 --- a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf +++ b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLib.inf @@ -67,18 +67,14 @@ [Guids] - ## SOMETIMES_CONSUMES ## HOB - ## PRODUCES ## UNDEFINED # Install protocol ## PRODUCES ## SystemTable gPerformanceProtocolGuid - ## SOMETIMES_CONSUMES ## HOB - ## PRODUCES ## UNDEFINED # Install protocol - gPerformanceExProtocolGuid gZeroGuid ## SOMETIMES_CONSUMES ## GUID gEfiFirmwarePerformanceGuid ## SOMETIMES_PRODUCES ## UNDEFINED # StatusCode Data gEdkiiFpdtExtendedFirmwarePerformanceGuid ## SOMETIMES_CONSUMES ## HOB # StatusCode Data gEfiEventReadyToBootGuid ## CONSUMES ## Event gEdkiiPiSmmCommunicationRegionTableGuid ## SOMETIMES_CONSUMES ## SystemTable + gEdkiiPerformanceMeasurementProtocolGuid ## PRODUCES ## UNDEFINED # Install protocol [Pcd] gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask ## CONSUMES diff --git a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLibInternal.h b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLibInternal.h index 7e79675f94..f9800e3494 100644 --- a/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLibInternal.h +++ b/MdeModulePkg/Library/DxeCorePerformanceLib/DxeCorePerformanceLibInternal.h @@ -22,6 +22,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include +#include #include #include #include @@ -49,201 +50,34 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include -// -// 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. + Create performance record with event description and a timestamp. - 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 time 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, the created record - is same as the one created by StartGauge of PERFORMANCE_PROTOCOL. - - @retval EFI_SUCCESS The data was read correctly from the device. - @retval EFI_OUT_OF_RESOURCES There are not enough resources to record the measurement. + @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 TimeStamp - 64-bit time stamp. + @param Address - Pointer to a location in memory relevant to the measurement. + @param Identifier - Performance identifier describing the type of measurement. + @param Attribute - The attribute of the measurement. According to 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 - NULL + 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 ); -/** - 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 and 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 matching 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, the 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 not 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 PERFORMANCE_PROTOCOL, - and then assign the Identifier with 0. - - Retrieves the performance log entry from the performance log specified by 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 measurement log entry. - If 0, then the first performance measurement log entry is retrieved. - @param GaugeDataEntryEx The indirect pointer to the extended gauge data entry specified by LogEntryKey - if the retrieval is successful. - - @retval EFI_SUCCESS The GuageDataEntryEx is successfully found based on LogEntryKey. - @retval EFI_NOT_FOUND The LogEntryKey is the last entry (equals to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (greater 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 time 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @param TimeStamp 64-bit time stamp. - - @retval EFI_SUCCESS The data was read correctly from the device. - @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 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 matching 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @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 not 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 PERFORMANCE_EX_PROTOCOL, - and then eliminate the Identifier. - - Retrieves the performance log entry from the performance log specified by 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 measurement log entry. - If 0, then the first performance measurement log entry is retrieved. - @param GaugeDataEntry The indirect pointer to the gauge data entry 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 (equals to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (greater 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/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c index cb62d522f3..9ed50d22b8 100644 --- a/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c +++ b/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.c @@ -20,7 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include -#include +#include #include #include @@ -30,8 +30,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // // The cached Performance Protocol and PerformanceEx Protocol interface. // -PERFORMANCE_PROTOCOL *mPerformance = NULL; -PERFORMANCE_EX_PROTOCOL *mPerformanceEx = NULL; +EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL *mPerformanceMeasurement = NULL; /** The function caches the pointers to PerformanceEx protocol and Performance Protocol. @@ -43,35 +42,24 @@ PERFORMANCE_EX_PROTOCOL *mPerformanceEx = NULL; **/ EFI_STATUS -GetPerformanceProtocol ( +GetPerformanceMeasurementProtocol ( VOID ) { EFI_STATUS Status; - PERFORMANCE_PROTOCOL *Performance; - PERFORMANCE_EX_PROTOCOL *PerformanceEx; + EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL *PerformanceMeasurement; - if (mPerformanceEx != NULL || mPerformance != NULL) { + if (mPerformanceMeasurement != NULL) { return EFI_SUCCESS; } - Status = gBS->LocateProtocol (&gPerformanceExProtocolGuid, NULL, (VOID **) &PerformanceEx); + Status = gBS->LocateProtocol (&gEdkiiPerformanceMeasurementProtocolGuid, NULL, (VOID **) &PerformanceMeasurement); if (!EFI_ERROR (Status)) { - ASSERT (PerformanceEx != NULL); + ASSERT (PerformanceMeasurement != NULL); // - // Cache PerformanceEx Protocol. + // Cache PerformanceMeasurement Protocol. // - mPerformanceEx = PerformanceEx; - return EFI_SUCCESS; - } - - Status = gBS->LocateProtocol (&gPerformanceProtocolGuid, NULL, (VOID **) &Performance); - if (!EFI_ERROR (Status)) { - ASSERT (Performance != NULL); - // - // Cache performance protocol. - // - mPerformance = Performance; + mPerformanceMeasurement = PerformanceMeasurement; return EFI_SUCCESS; } @@ -110,17 +98,24 @@ StartPerformanceMeasurementEx ( IN UINT32 Identifier ) { - EFI_STATUS Status; + EFI_STATUS Status; + CONST CHAR8* String; - Status = GetPerformanceProtocol (); + Status = GetPerformanceMeasurementProtocol (); if (EFI_ERROR (Status)) { - return RETURN_OUT_OF_RESOURCES; + return RETURN_NOT_FOUND; } - if (mPerformanceEx != NULL) { - Status = mPerformanceEx->StartGaugeEx (Handle, Token, Module, TimeStamp, Identifier); - } else if (mPerformance != NULL) { - Status = mPerformance->StartGauge (Handle, Token, Module, TimeStamp); + if (Token != NULL) { + String = Token; + } else if (Module != NULL) { + String = Module; + } else { + String = NULL; + } + + if (mPerformanceMeasurement != NULL) { + Status = mPerformanceMeasurement->CreatePerformanceMeasurement (Handle, NULL, String, TimeStamp, 0, Identifier, PerfStartEntry); } else { ASSERT (FALSE); } @@ -162,17 +157,24 @@ EndPerformanceMeasurementEx ( IN UINT32 Identifier ) { - EFI_STATUS Status; + EFI_STATUS Status; + CONST CHAR8* String; - Status = GetPerformanceProtocol (); + Status = GetPerformanceMeasurementProtocol (); if (EFI_ERROR (Status)) { return RETURN_NOT_FOUND; } - if (mPerformanceEx != NULL) { - Status = mPerformanceEx->EndGaugeEx (Handle, Token, Module, TimeStamp, Identifier); - } else if (mPerformance != NULL) { - Status = mPerformance->EndGauge (Handle, Token, Module, TimeStamp); + if (Token != NULL) { + String = Token; + } else if (Module != NULL) { + String = Module; + } else { + String = NULL; + } + + if (mPerformanceMeasurement != NULL) { + Status = mPerformanceMeasurement->CreatePerformanceMeasurement (Handle, NULL, String, TimeStamp, 0, Identifier, PerfEndEntry); } else { ASSERT (FALSE); } @@ -233,58 +235,8 @@ GetPerformanceMeasurementEx ( OUT UINT32 *Identifier ) { - EFI_STATUS Status; - GAUGE_DATA_ENTRY_EX *GaugeData; + return 0; - GaugeData = NULL; - - ASSERT (Handle != NULL); - ASSERT (Token != NULL); - ASSERT (Module != NULL); - ASSERT (StartTimeStamp != NULL); - ASSERT (EndTimeStamp != NULL); - ASSERT (Identifier != NULL); - - Status = GetPerformanceProtocol (); - if (EFI_ERROR (Status)) { - return 0; - } - - if (mPerformanceEx != NULL) { - Status = mPerformanceEx->GetGaugeEx (LogEntryKey++, &GaugeData); - } else if (mPerformance != NULL) { - Status = mPerformance->GetGauge (LogEntryKey++, (GAUGE_DATA_ENTRY **) &GaugeData); - } else { - ASSERT (FALSE); - return 0; - } - - // - // 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; - if (mPerformanceEx != NULL) { - *Identifier = GaugeData->Identifier; - } else { - *Identifier = 0; - } - - return LogEntryKey; } /** @@ -403,8 +355,7 @@ GetPerformanceMeasurement ( OUT UINT64 *EndTimeStamp ) { - UINT32 Identifier; - return GetPerformanceMeasurementEx (LogEntryKey, Handle, Token, Module, StartTimeStamp, EndTimeStamp, &Identifier); + return 0; } /** diff --git a/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf b/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf index edc63c6f0b..c7d06a3a1b 100644 --- a/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf +++ b/MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf @@ -6,7 +6,7 @@ # to log performance data. If both PerformanceEx and Performance Protocol are not available, # it does not log any performance information. # -# 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 BSD License # which accompanies this distribution. The full text of the license may be found at @@ -48,8 +48,7 @@ [Guids] - gPerformanceProtocolGuid ## SOMETIMES_CONSUMES ## UNDEFINED # Locate protocol - gPerformanceExProtocolGuid ## SOMETIMES_CONSUMES ## UNDEFINED # Locate protocol + gEdkiiPerformanceMeasurementProtocolGuid ## SOMETIMES_CONSUMES ## UNDEFINED # Locate protocol [Pcd] diff --git a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c index dbc1166f25..e630773562 100644 --- a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c +++ b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.c @@ -54,21 +54,10 @@ SPIN_LOCK mSmmFpdtLock; PERFORMANCE_PROPERTY mPerformanceProperty; // -// Interfaces for SMM Performance Protocol. +// Interfaces for SMM PerformanceMeasurement Protocol. // -PERFORMANCE_PROTOCOL mPerformanceInterface = { - StartGauge, - EndGauge, - GetGauge -}; - -// -// Interfaces for SMM PerformanceEx Protocol. -// -PERFORMANCE_EX_PROTOCOL mPerformanceExInterface = { - StartGaugeEx, - EndGaugeEx, - GetGaugeEx +EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL mPerformanceMeasurementInterface = { + CreatePerformanceMeasurement, }; /** @@ -643,235 +632,6 @@ InsertFpdtMeasurement ( return EFI_SUCCESS; } -/** - 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 time 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, the created record - is same as the one created by StartGauge of PERFORMANCE_PROTOCOL. - - @retval EFI_SUCCESS The data was read correctly from the device. - @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 = 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 and 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 matching 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, the 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 not 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 = InsertFpdtMeasurement (FALSE, Handle, Token, Module, TimeStamp, Identifier); - - ReleaseSpinLock (&mSmmFpdtLock); - - return Status; -} - -/** - Retrieves a previously logged performance measurement. - It can also retrieve the log created by StartGauge and EndGauge of PERFORMANCE_PROTOCOL, - and then assign the Identifier with 0. - - !!! Not Support!!! - - Retrieves the performance log entry from the performance log specified by 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 measurement log entry. - If 0, then the first performance measurement log entry is retrieved. - @param GaugeDataEntryEx The indirect pointer to the extended gauge data entry specified by LogEntryKey - if the retrieval is successful. - - @retval EFI_SUCCESS The GuageDataEntryEx is successfully found based on LogEntryKey. - @retval EFI_NOT_FOUND The LogEntryKey is the last entry (equals to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (greater 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 time 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @param TimeStamp 64-bit time stamp. - - @retval EFI_SUCCESS The data was read correctly from the device. - @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 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 matching 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @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 not 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 PERFORMANCE_EX_PROTOCOL, - and then eliminate the Identifier. - - !!! Not Support!!! - - Retrieves the performance log entry from the performance log specified by 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 measurement log entry. - If 0, then the first performance measurement log entry is retrieved. - @param GaugeDataEntry The indirect pointer to the gauge data entry 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 (equals to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (greater 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. @@ -942,16 +702,9 @@ InitializeSmmCorePerformanceLib ( Handle = NULL; Status = gSmst->SmmInstallProtocolInterface ( &Handle, - &gSmmPerformanceProtocolGuid, + &gEdkiiSmmPerformanceMeasurementProtocolGuid, EFI_NATIVE_INTERFACE, - &mPerformanceInterface - ); - ASSERT_EFI_ERROR (Status); - Status = gSmst->SmmInstallProtocolInterface ( - &Handle, - &gSmmPerformanceExProtocolGuid, - EFI_NATIVE_INTERFACE, - &mPerformanceExInterface + &mPerformanceMeasurementInterface ); ASSERT_EFI_ERROR (Status); @@ -1031,6 +784,48 @@ SmmCorePerformanceLibConstructor ( 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 TimeStamp - 64-bit time stamp. + @param Address - Pointer to a location in memory relevant to the measurement. + @param Identifier - Performance identifier describing the type of measurement. + @param Attribute - The attribute of the measurement. According to 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 - NULL + 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 == PerfStartEntry) { + Status = InsertFpdtMeasurement (TRUE, CallerIdentifier, String, String, TimeStamp, Identifier); + } else if (Attribute == PerfEndEntry) { + Status = InsertFpdtMeasurement (FALSE, CallerIdentifier, String, String, 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. @@ -1066,7 +861,17 @@ StartPerformanceMeasurementEx ( IN UINT32 Identifier ) { - return (RETURN_STATUS) StartGaugeEx (Handle, Token, Module, TimeStamp, Identifier); + CONST CHAR8 *String; + + if (Token != NULL) { + String = Token; + } else if (Module != NULL) { + String = Module; + } else { + String = NULL; + } + + return (RETURN_STATUS)CreatePerformanceMeasurement (Handle, NULL, String, TimeStamp, 0, Identifier, PerfStartEntry); } /** @@ -1105,7 +910,17 @@ EndPerformanceMeasurementEx ( IN UINT32 Identifier ) { - return (RETURN_STATUS) EndGaugeEx (Handle, Token, Module, TimeStamp, Identifier); + CONST CHAR8 *String; + + if (Token != NULL) { + String = Token; + } else if (Module != NULL) { + String = Module; + } else { + String = NULL; + } + + return (RETURN_STATUS)CreatePerformanceMeasurement (Handle, NULL, String, TimeStamp, 0, Identifier, PerfEndEntry); } /** @@ -1198,7 +1013,7 @@ StartPerformanceMeasurement ( IN UINT64 TimeStamp ) { - return StartGaugeEx (Handle, Token, Module, TimeStamp, 0); + return StartPerformanceMeasurementEx (Handle, Token, Module, TimeStamp, 0); } /** @@ -1234,7 +1049,7 @@ EndPerformanceMeasurement ( IN UINT64 TimeStamp ) { - return EndGaugeEx (Handle, Token, Module, TimeStamp, 0); + return EndPerformanceMeasurementEx (Handle, Token, Module, TimeStamp, 0); } /** diff --git a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.inf b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.inf index 01d8604eb6..61b9283665 100644 --- a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.inf +++ b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLib.inf @@ -66,16 +66,11 @@ gEdkiiSmmReadyToBootProtocolGuid ## NOTIFY [Guids] - ## PRODUCES ## UNDEFINED # Install protocol - ## CONSUMES ## UNDEFINED # SmiHandlerRegister - gSmmPerformanceProtocolGuid - ## PRODUCES ## UNDEFINED # Install protocol - ## CONSUMES ## UNDEFINED # SmiHandlerRegister - gSmmPerformanceExProtocolGuid ## PRODUCES ## SystemTable gPerformanceProtocolGuid gEdkiiFpdtExtendedFirmwarePerformanceGuid ## SOMETIMES_PRODUCES ## UNDEFINED # StatusCode Data gZeroGuid ## SOMETIMES_CONSUMES ## GUID + gEdkiiSmmPerformanceMeasurementProtocolGuid ## PRODUCES ## UNDEFINED # Install protocol [Pcd] gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask ## CONSUMES diff --git a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLibInternal.h b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLibInternal.h index 9d24d9ff7a..76f2498473 100644 --- a/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLibInternal.h +++ b/MdeModulePkg/Library/SmmCorePerformanceLib/SmmCorePerformanceLibInternal.h @@ -20,6 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include +#include #include #include #include @@ -46,200 +47,36 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include // -// 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. + Create performance record with event description and a timestamp. - 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 time 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, the created record - is same as the one created by StartGauge of PERFORMANCE_PROTOCOL. - - @retval EFI_SUCCESS The data was read correctly from the device. - @retval EFI_OUT_OF_RESOURCES There are not enough resources to record the measurement. + @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 TimeStamp - 64-bit time stamp. + @param Address - Pointer to a location in memory relevant to the measurement. + @param Identifier - Performance identifier describing the type of measurement. + @param Attribute - The attribute of the measurement. According to 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 - NULL + 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 ); -/** - 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 and 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 matching 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @param TimeStamp 64-bit time stamp. - @param Identifier 32-bit identifier. If the value is 0, the 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 not 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 PERFORMANCE_PROTOCOL, - and then assign the Identifier with 0. - - Retrieves the performance log entry from the performance log specified by 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 measurement log entry. - If 0, then the first performance measurement log entry is retrieved. - @param GaugeDataEntryEx The indirect pointer to the extended gauge data entry specified by LogEntryKey - if the retrieval is successful. - - @retval EFI_SUCCESS The GuageDataEntryEx is successfully found based on LogEntryKey. - @retval EFI_NOT_FOUND The LogEntryKey is the last entry (equals to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (greater 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 time 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @param TimeStamp 64-bit time stamp. - - @retval EFI_SUCCESS The data was read correctly from the device. - @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 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 matching 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 measured. - @param Module Pointer to a Null-terminated ASCII string - that identifies the module being measured. - @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 not 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 PERFORMANCE_EX_PROTOCOL, - and then eliminate the Identifier. - - Retrieves the performance log entry from the performance log specified by 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 measurement log entry. - If 0, then the first performance measurement log entry is retrieved. - @param GaugeDataEntry The indirect pointer to the gauge data entry 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 (equals to the total entry number). - @retval EFI_INVALIDE_PARAMETER The LogEntryKey is not a valid entry (greater 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/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.c index 4a08c24789..fd820c0e49 100644 --- a/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.c +++ b/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.c @@ -18,7 +18,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ -#include +#include #include #include @@ -28,10 +28,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // // The cached SMM Performance Protocol and SMM PerformanceEx Protocol interface. -// -PERFORMANCE_PROTOCOL *mPerformance = NULL; -PERFORMANCE_EX_PROTOCOL *mPerformanceEx = NULL; -BOOLEAN mPerformanceMeasurementEnabled; +EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL *mPerformanceMeasurement = NULL; +BOOLEAN mPerformanceMeasurementEnabled; /** The constructor function initializes the Performance Measurement Enable flag @@ -65,38 +63,26 @@ SmmPerformanceLibConstructor ( **/ EFI_STATUS -GetPerformanceProtocol ( +GetPerformanceMeasurementProtocol ( VOID ) { EFI_STATUS Status; - PERFORMANCE_PROTOCOL *Performance; - PERFORMANCE_EX_PROTOCOL *PerformanceEx; + EDKII_PERFORMANCE_MEASUREMENT_PROTOCOL *PerformanceMeasurement; - if (mPerformanceEx != NULL || mPerformance != NULL) { + if (mPerformanceMeasurement != NULL) { return EFI_SUCCESS; } - Status = gSmst->SmmLocateProtocol (&gSmmPerformanceExProtocolGuid, NULL, (VOID **) &PerformanceEx); + Status = gSmst->SmmLocateProtocol (&gEdkiiSmmPerformanceMeasurementProtocolGuid, NULL, (VOID **) &PerformanceMeasurement); if (!EFI_ERROR (Status)) { - ASSERT (PerformanceEx != NULL); + ASSERT (PerformanceMeasurement != NULL); // - // Cache PerformanceEx Protocol. + // Cache PerformanceMeasurement Protocol. // - mPerformanceEx = PerformanceEx; + mPerformanceMeasurement = PerformanceMeasurement; return EFI_SUCCESS; } - - Status = gSmst->SmmLocateProtocol (&gSmmPerformanceProtocolGuid, NULL, (VOID **) &Performance); - if (!EFI_ERROR (Status)) { - ASSERT (Performance != NULL); - // - // Cache performance protocol. - // - mPerformance = Performance; - return EFI_SUCCESS; - } - return EFI_NOT_FOUND; } @@ -132,17 +118,24 @@ StartPerformanceMeasurementEx ( IN UINT32 Identifier ) { - EFI_STATUS Status; + EFI_STATUS Status; + CONST CHAR8* String; - Status = GetPerformanceProtocol (); + Status = GetPerformanceMeasurementProtocol (); if (EFI_ERROR (Status)) { - return RETURN_OUT_OF_RESOURCES; + return RETURN_NOT_FOUND; } - if (mPerformanceEx != NULL) { - Status = mPerformanceEx->StartGaugeEx (Handle, Token, Module, TimeStamp, Identifier); - } else if (mPerformance != NULL) { - Status = mPerformance->StartGauge (Handle, Token, Module, TimeStamp); + if (Token != NULL) { + String = Token; + } else if (Module != NULL) { + String = Module; + } else { + String = NULL; + } + + if (mPerformanceMeasurement != NULL) { + Status = mPerformanceMeasurement->CreatePerformanceMeasurement (Handle, NULL, String, TimeStamp, 0, Identifier, PerfStartEntry); } else { ASSERT (FALSE); } @@ -184,17 +177,24 @@ EndPerformanceMeasurementEx ( IN UINT32 Identifier ) { - EFI_STATUS Status; + EFI_STATUS Status; + CONST CHAR8* String; - Status = GetPerformanceProtocol (); + Status = GetPerformanceMeasurementProtocol (); if (EFI_ERROR (Status)) { return RETURN_NOT_FOUND; } - if (mPerformanceEx != NULL) { - Status = mPerformanceEx->EndGaugeEx (Handle, Token, Module, TimeStamp, Identifier); - } else if (mPerformance != NULL) { - Status = mPerformance->EndGauge (Handle, Token, Module, TimeStamp); + if (Token != NULL) { + String = Token; + } else if (Module != NULL) { + String = Module; + } else { + String = NULL; + } + + if (mPerformanceMeasurement != NULL) { + Status = mPerformanceMeasurement->CreatePerformanceMeasurement (Handle, NULL, String, TimeStamp, 0, Identifier, PerfEndEntry); } else { ASSERT (FALSE); } @@ -255,58 +255,7 @@ GetPerformanceMeasurementEx ( OUT UINT32 *Identifier ) { - EFI_STATUS Status; - GAUGE_DATA_ENTRY_EX *GaugeData; - - GaugeData = NULL; - - ASSERT (Handle != NULL); - ASSERT (Token != NULL); - ASSERT (Module != NULL); - ASSERT (StartTimeStamp != NULL); - ASSERT (EndTimeStamp != NULL); - ASSERT (Identifier != NULL); - - Status = GetPerformanceProtocol (); - if (EFI_ERROR (Status)) { - return 0; - } - - if (mPerformanceEx != NULL) { - Status = mPerformanceEx->GetGaugeEx (LogEntryKey++, &GaugeData); - } else if (mPerformance != NULL) { - Status = mPerformance->GetGauge (LogEntryKey++, (GAUGE_DATA_ENTRY **) &GaugeData); - } else { - ASSERT (FALSE); - return 0; - } - - // - // 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; - if (mPerformanceEx != NULL) { - *Identifier = GaugeData->Identifier; - } else { - *Identifier = 0; - } - - return LogEntryKey; + return 0; } /** @@ -425,8 +374,7 @@ GetPerformanceMeasurement ( OUT UINT64 *EndTimeStamp ) { - UINT32 Identifier; - return GetPerformanceMeasurementEx (LogEntryKey, Handle, Token, Module, StartTimeStamp, EndTimeStamp, &Identifier); + return 0; } /** diff --git a/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.inf b/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.inf index c3d01a1e51..174ed3f1e5 100644 --- a/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.inf +++ b/MdeModulePkg/Library/SmmPerformanceLib/SmmPerformanceLib.inf @@ -6,7 +6,7 @@ # to log performance data. If both SMM PerformanceEx and Performance Protocol are not available, # it does not log any performance information. # -# 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 BSD License # which accompanies this distribution. The full text of the license may be found at @@ -50,8 +50,7 @@ BaseMemoryLib [Guids] - gSmmPerformanceProtocolGuid ## SOMETIMES_CONSUMES ## UNDEFINED # Locate protocol - gSmmPerformanceExProtocolGuid ## SOMETIMES_CONSUMES ## UNDEFINED # Locate protocol + gEdkiiSmmPerformanceMeasurementProtocolGuid ## SOMETIMES_CONSUMES ## UNDEFINED # Locate protocol [Pcd] gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask ## CONSUMES