UINTN EndIndex;\r
\r
if (PdbFileName == NULL) {\r
- AsciiStrCpyS (GaugeString, PERF_TOKEN_LENGTH, " ");\r
+ AsciiStrCpyS (GaugeString, PERF_TOKEN_SIZE, " ");\r
} else {\r
StartIndex = 0;\r
for (EndIndex = 0; PdbFileName[EndIndex] != 0; EndIndex++)\r
for (Index = StartIndex; Index < EndIndex; Index++) {\r
GaugeString[Index1] = PdbFileName[Index];\r
Index1++;\r
- if (Index1 == PERF_TOKEN_LENGTH - 1) {\r
+ if (Index1 == PERF_TOKEN_LENGTH) {\r
break;\r
}\r
}\r
CHAR8 *PdbFileName;\r
EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
\r
- AsciiStrCpyS (GaugeString, PERF_TOKEN_LENGTH, " ");\r
+ AsciiStrCpyS (GaugeString, PERF_TOKEN_SIZE, " ");\r
\r
//\r
// Get handle name from image protocol\r
UINT32 LimitCount;\r
EFI_HANDLE *Handles;\r
UINTN NoHandles;\r
- CHAR8 GaugeString[PERF_TOKEN_LENGTH];\r
+ CHAR8 GaugeString[PERF_TOKEN_SIZE];\r
UINT8 *Ptr;\r
UINT32 Index;\r
UINT64 Ticker;\r
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
UINTN VarSize;\r
+ BOOLEAN Found;\r
\r
//\r
// Record the performance data for End of BDS\r
CountUp = FALSE;\r
}\r
\r
+ //\r
+ // Reset the entry count\r
+ //\r
+ mPerfHeader.Count = 0;\r
+\r
if (mAcpiLowMemoryBase == 0x0FFFFFFFF) {\r
VarSize = sizeof (EFI_PHYSICAL_ADDRESS);\r
Status = gRT->GetVariable (\r
Ptr = (UINT8 *) ((UINT32) mAcpiLowMemoryBase + sizeof (PERF_HEADER));\r
LimitCount = (UINT32) (PERF_DATA_MAX_LENGTH - sizeof (PERF_HEADER)) / sizeof (PERF_DATA);\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
- //\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
- &Token,\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
- if (StartTicker == 1) {\r
- StartTicker = StartValue;\r
- }\r
- if (EndTicker == 1) {\r
- EndTicker = StartValue;\r
- }\r
- Ticker += CountUp ? (EndTicker - StartTicker) : (StartTicker - EndTicker);\r
- }\r
- }\r
-\r
- Duration = (UINT32) DivU64x32 (Ticker, (UINT32) Freq);\r
-\r
- if (Duration > 0) {\r
-\r
- GetNameFromHandle (Handles[Index], GaugeString);\r
-\r
- AsciiStrCpyS (mPerfData.Token, PERF_TOKEN_SIZE, GaugeString);\r
- mPerfData.Duration = Duration;\r
-\r
- CopyMem (Ptr, &mPerfData, sizeof (PERF_DATA));\r
- Ptr += sizeof (PERF_DATA);\r
-\r
- mPerfHeader.Count++;\r
- if (mPerfHeader.Count == LimitCount) {\r
- goto Done;\r
- }\r
- }\r
- }\r
-\r
//\r
- // Get inserted performance data\r
+ // Get 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 (!PerfEntriesAsDxeHandle[EntryIndex] && EndTicker != 0) {\r
-\r
- ZeroMem (&mPerfData, sizeof (PERF_DATA));\r
-\r
- AsciiStrnCpyS (mPerfData.Token, PERF_TOKEN_SIZE, Token, PERF_TOKEN_LENGTH);\r
+ if (EndTicker != 0) {\r
if (StartTicker == 1) {\r
StartTicker = StartValue;\r
}\r
}\r
Ticker = CountUp ? (EndTicker - StartTicker) : (StartTicker - EndTicker);\r
\r
- mPerfData.Duration = (UINT32) DivU64x32 (Ticker, (UINT32) Freq);\r
+ Duration = (UINT32) DivU64x32 (Ticker, (UINT32) Freq);\r
+ if (Duration == 0) {\r
+ continue;\r
+ }\r
+\r
+ ZeroMem (&mPerfData, sizeof (PERF_DATA));\r
+\r
+ mPerfData.Duration = Duration;\r
+\r
+ //\r
+ // See if the Handle is in the handle buffer\r
+ //\r
+ Found = FALSE;\r
+ for (Index = 0; Index < NoHandles; Index++) {\r
+ if (Handle == Handles[Index]) {\r
+ GetNameFromHandle (Handles[Index], GaugeString);\r
+ AsciiStrCpyS (mPerfData.Token, PERF_TOKEN_SIZE, GaugeString);\r
+ Found = TRUE;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (!Found) {\r
+ AsciiStrnCpyS (mPerfData.Token, PERF_TOKEN_SIZE, Token, PERF_TOKEN_LENGTH);\r
+ }\r
\r
CopyMem (Ptr, &mPerfData, sizeof (PERF_DATA));\r
Ptr += sizeof (PERF_DATA);\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