ASSERT(FALSE);\r
}\r
\r
- if (AsciiStrCmp (Measurement->Token, ALit_PEIM) == 0) {\r
- Measurement->Handle = &(((FPDT_GUID_EVENT_RECORD *)RecordHeader)->Guid);\r
+ if (Measurement->Token != NULL && AsciiStrCmp (Measurement->Token, ALit_PEIM) == 0) {\r
+ Measurement->Handle = &(((FPDT_DYNAMIC_STRING_EVENT_RECORD *)RecordHeader)->Guid);\r
} else {\r
GetHandleFormModuleGuid(ModuleGuid, &StartHandle);\r
- Measurement->Handle = StartHandle;\r
+ Measurement->Handle = StartHandle;\r
+ //\r
+ // When no perf entry to record the PEI and DXE phase,\r
+ // For start image, we need detect the PEIM and non PEIM here.\r
+ //\r
+ if (Measurement->Token == NULL) {\r
+ if (StartHandle == NULL && !IsZeroGuid (ModuleGuid)) {\r
+ Measurement->Token = ALit_PEIM;\r
+ Measurement->Module = ALit_PEIM;\r
+ Measurement->Handle = ModuleGuid;\r
+ } else {\r
+ Measurement->Token = ALit_START_IMAGE;\r
+ Measurement->Module = ALit_START_IMAGE;\r
+ }\r
+ }\r
}\r
break;\r
\r
\r
Measurement->Module = ((FPDT_DYNAMIC_STRING_EVENT_RECORD *)RecordHeader)->String;\r
\r
- if (AsciiStrCmp (Measurement->Token, ALit_PEIM) == 0) {\r
+ if (Measurement->Token != NULL && AsciiStrCmp (Measurement->Token, ALit_PEIM) == 0) {\r
Measurement->Handle = &(((FPDT_DYNAMIC_STRING_EVENT_RECORD *)RecordHeader)->Guid);\r
} else {\r
GetHandleFormModuleGuid(ModuleGuid, &StartHandle);\r
Measurement->Handle = StartHandle;\r
+ //\r
+ // When no perf entry to record the PEI and DXE phase,\r
+ // For start image, we need detect the PEIM and non PEIM here.\r
+ //\r
+ if (Measurement->Token == NULL && (Measurement->Identifier == MODULE_START_ID || Measurement->Identifier == MODULE_END_ID)) {\r
+ if (StartHandle == NULL && !IsZeroGuid (ModuleGuid)) {\r
+ Measurement->Token = ALit_PEIM;\r
+ Measurement->Handle = ModuleGuid;\r
+ } else {\r
+ Measurement->Token = ALit_START_IMAGE;\r
+ }\r
+ }\r
}\r
break;\r
\r
Measurement->Handle = StartHandle;\r
break;\r
\r
+ case FPDT_DUAL_GUID_STRING_EVENT_TYPE:\r
+ ModuleGuid = &(((FPDT_DUAL_GUID_STRING_EVENT_RECORD *)RecordHeader)->Guid1);\r
+ Measurement->Identifier = ((UINT32)((FPDT_DUAL_GUID_STRING_EVENT_RECORD *)RecordHeader)->ProgressID);\r
+ if (IsStart) {\r
+ Measurement->StartTimeStamp = ((FPDT_DUAL_GUID_STRING_EVENT_RECORD *)RecordHeader)->Timestamp;\r
+ } else {\r
+ Measurement->EndTimeStamp = ((FPDT_DUAL_GUID_STRING_EVENT_RECORD *)RecordHeader)->Timestamp;\r
+ }\r
+ Measurement->Token = ((FPDT_DUAL_GUID_STRING_EVENT_RECORD *)RecordHeader)->String;\r
+ Measurement->Module = ((FPDT_DUAL_GUID_STRING_EVENT_RECORD *)RecordHeader)->String;\r
+ GetHandleFormModuleGuid(ModuleGuid, &StartHandle);\r
+ Measurement->Handle = StartHandle;\r
+ break;\r
+\r
default:\r
break;\r
}\r
mMeasurementList[Index].EndTimeStamp = EndMeasureMent->EndTimeStamp;\r
break;\r
}\r
+ } else if (EndMeasureMent->Identifier == PERF_CROSSMODULE_END_ID) {\r
+ if (mMeasurementList[Index].EndTimeStamp == 0 &&\r
+ (AsciiStrCmp (mMeasurementList[Index].Token, EndMeasureMent->Token) == 0) &&\r
+ (AsciiStrCmp (mMeasurementList[Index].Module, EndMeasureMent->Module) == 0) &&\r
+ mMeasurementList[Index].Identifier == PERF_CROSSMODULE_START_ID) {\r
+ mMeasurementList[Index].EndTimeStamp = EndMeasureMent->EndTimeStamp;\r
+ break;\r
+ }\r
} else {\r
if (mMeasurementList[Index].EndTimeStamp == 0 && mMeasurementList[Index].Handle == EndMeasureMent->Handle &&\r
(AsciiStrCmp (mMeasurementList[Index].Token, EndMeasureMent->Token) == 0) &&\r
StartProgressId = ((FPDT_GUID_EVENT_RECORD *)StartRecordEvent)->ProgressID;\r
\r
//\r
+ // If the record with ProgressId 0, the record doesn't appear in pairs. The timestamp in the record is the EndTimeStamp, its StartTimeStamp is 0.\r
// If the record is the start record, fill the info to the measurement in the mMeasurementList.\r
// If the record is the end record, find the related start measurement in the mMeasurementList and fill the EndTimeStamp.\r
//\r
- if (((StartProgressId >= PERF_EVENTSIGNAL_START_ID && ((StartProgressId & 0x000F) == 0)) ||\r
+ if (StartProgressId == 0) {\r
+ GetMeasurementInfo (RecordHeader, FALSE, &(mMeasurementList[mMeasurementNum]));\r
+ mMeasurementNum ++;\r
+ } else if (((StartProgressId >= PERF_EVENTSIGNAL_START_ID && ((StartProgressId & 0x000F) == 0)) ||\r
(StartProgressId < PERF_EVENTSIGNAL_START_ID && ((StartProgressId & 0x0001) != 0)))) {\r
//\r
// Since PEIM and StartImage has same Type and ID when PCD PcdEdkiiFpdtStringRecordEnableOnly = FALSE\r
// So we need to identify these two kinds of record through different phase.\r
//\r
- if (AsciiStrCmp (((FPDT_DYNAMIC_STRING_EVENT_RECORD *)StartRecordEvent)->String, ALit_PEI) == 0) {\r
- mPeiPhase = TRUE;\r
- } else if (AsciiStrCmp (((FPDT_DYNAMIC_STRING_EVENT_RECORD *)StartRecordEvent)->String, ALit_DXE) == 0) {\r
- mDxePhase = TRUE;\r
- mPeiPhase = FALSE;\r
+ if(StartProgressId == PERF_CROSSMODULE_START_ID ){\r
+ if (AsciiStrCmp (((FPDT_DYNAMIC_STRING_EVENT_RECORD *)StartRecordEvent)->String, ALit_PEI) == 0) {\r
+ mPeiPhase = TRUE;\r
+ } else if (AsciiStrCmp (((FPDT_DYNAMIC_STRING_EVENT_RECORD *)StartRecordEvent)->String, ALit_DXE) == 0) {\r
+ mDxePhase = TRUE;\r
+ mPeiPhase = FALSE;\r
+ }\r
}\r
// Get measurement info form the start record to the mMeasurementList.\r
GetMeasurementInfo (RecordHeader, TRUE, &(mMeasurementList[mMeasurementNum]));\r
mMeasurementNum ++;\r
} else {\r
+ ZeroMem(&MeasureMent, sizeof(MEASUREMENT_RECORD));\r
GetMeasurementInfo (RecordHeader, FALSE, &MeasureMent);\r
SearchMeasurement (&MeasureMent);\r
}\r