UINT64 StartValue;\r
UINT64 EndValue;\r
BOOLEAN CountUp;\r
+ UINTN EntryIndex;\r
+ UINTN NumPerfEntries;\r
+ //\r
+ // List of flags indicating PerfEntry contains DXE handle\r
+ //\r
+ BOOLEAN *PerfEntriesAsDxeHandle;\r
\r
//\r
// Retrieve time stamp count as early as possible\r
Ptr = (UINT8 *) ((UINT32) mAcpiLowMemoryBase + sizeof (PERF_HEADER));\r
LimitCount = (AcpiLowMemoryLength - sizeof (PERF_HEADER)) / sizeof (PERF_DATA);\r
\r
-\r
+ NumPerfEntries = 0;\r
+ LogEntryKey = 0;\r
+ while ((LogEntryKey = GetPerformanceMeasurement (\r
+ LogEntryKey,\r
+ &Handle,\r
+ &Token,\r
+ &Module,\r
+ &StartTicker,\r
+ &EndTicker)) != 0) {\r
+ NumPerfEntries++;\r
+ }\r
+ PerfEntriesAsDxeHandle = AllocateZeroPool (NumPerfEntries * sizeof (BOOLEAN));\r
+ ASSERT (PerfEntriesAsDxeHandle != NULL);\r
\r
//\r
// Get DXE drivers performance\r
for (Index = 0; Index < NoHandles; Index++) {\r
Ticker = 0;\r
LogEntryKey = 0;\r
+ EntryIndex = 0;\r
while ((LogEntryKey = GetPerformanceMeasurement (\r
LogEntryKey,\r
&Handle,\r
&Module,\r
&StartTicker,\r
&EndTicker)) != 0) {\r
+ if (Handle == Handles[Index] && !PerfEntriesAsDxeHandle[EntryIndex]) {\r
+ PerfEntriesAsDxeHandle[EntryIndex] = TRUE;\r
+ }\r
+ EntryIndex++;\r
if ((Handle == Handles[Index]) && (EndTicker != 0)) {\r
Ticker += CountUp ? (EndTicker - StartTicker) : (StartTicker - EndTicker);\r
}\r
}\r
}\r
\r
- FreePool (Handles);\r
-\r
//\r
// Get inserted performance data\r
//\r
LogEntryKey = 0;\r
+ EntryIndex = 0;\r
while ((LogEntryKey = GetPerformanceMeasurement (\r
LogEntryKey,\r
&Handle,\r
&Module,\r
&StartTicker,\r
&EndTicker)) != 0) {\r
- if (Handle == NULL && EndTicker != 0) {\r
+ if (!PerfEntriesAsDxeHandle[EntryIndex] && EndTicker != 0) {\r
\r
ZeroMem (&mPerfData, sizeof (PERF_DATA));\r
\r
goto Done;\r
}\r
}\r
+ EntryIndex++;\r
}\r
\r
Done:\r
\r
+ FreePool (Handles);\r
+ FreePool (PerfEntriesAsDxeHandle);\r
+\r
mPerfHeader.Signiture = PERFORMANCE_SIGNATURE;\r
\r
//\r