mirror of
https://github.com/acidanthera/audk.git
synced 2025-04-08 17:05:09 +02:00
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:
parent
56f7741e27
commit
137fb13deb
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user