MdeModulePkg: Update Performance instances to use new protocol
Update Performance instances in MdeModulePkg to use new PerformanceMeasurement protocol. Cc: Liming Gao <liming.gao@intel.com> Cc: Star Zeng <star.zeng@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Dandan Bi <dandan.bi@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
		| @@ -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); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -22,6 +22,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
| #include <PiDxe.h> | ||||
|  | ||||
| #include <Guid/Performance.h> | ||||
| #include <Guid/PerformanceMeasurement.h> | ||||
| #include <Guid/ExtendedFirmwarePerformance.h> | ||||
| #include <Guid/ZeroGuid.h> | ||||
| #include <Guid/EventGroup.h> | ||||
| @@ -49,201 +50,34 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
| #include <Library/DxeServicesLib.h> | ||||
| #include <Library/PeCoffGetEntryPointLib.h> | ||||
|  | ||||
| // | ||||
| // 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 | ||||
|   | ||||
| @@ -20,7 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
|  | ||||
| #include <PiDxe.h> | ||||
|  | ||||
| #include <Guid/Performance.h> | ||||
| #include <Guid/PerformanceMeasurement.h> | ||||
|  | ||||
| #include <Library/PerformanceLib.h> | ||||
| #include <Library/DebugLib.h> | ||||
| @@ -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; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -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.<BR> | ||||
| #  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> | ||||
| #  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] | ||||
|   | ||||
| @@ -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); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -20,6 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
|  | ||||
|  | ||||
| #include <Guid/Performance.h> | ||||
| #include <Guid/PerformanceMeasurement.h> | ||||
| #include <Guid/ExtendedFirmwarePerformance.h> | ||||
| #include <Guid/FirmwarePerformance.h> | ||||
| #include <Guid/ZeroGuid.h> | ||||
| @@ -46,200 +47,36 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
| #include <Protocol/DevicePathToText.h> | ||||
|  | ||||
| // | ||||
| // 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 | ||||
|   | ||||
| @@ -18,7 +18,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
| **/ | ||||
|  | ||||
|  | ||||
| #include <Guid/Performance.h> | ||||
| #include <Guid/PerformanceMeasurement.h> | ||||
|  | ||||
| #include <Library/PerformanceLib.h> | ||||
| #include <Library/DebugLib.h> | ||||
| @@ -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; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -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.<BR> | ||||
| #  Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR> | ||||
| #  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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user