Revision: 18789
http://sourceforge.net/p/edk2/code/18789
Author: vanjeff
Date: 2015-11-16 06:50:12 +0000 (Mon, 16 Nov 2015)
Log Message:
-----------
MdeModulePkg UefiBootManagerLib: Do not assume perf entry count has no change
Current implementation assumes the performance entry count has no change from
multiple GetPerformanceMeasurement() while loops, it may cause the allocated
buffer
for PerfEntriesAsDxeHandle at the first loop to be overflowed if the following
loop has
the count changed.
This patch is also to sync the change at
commit R17851 "IntelFrameworkModulePkg GenericBdsLib: Resolve array size
mismatch".
(Sync patch r18561 from main trunk.)
Cc: Ruiyu Ni <[email protected]>
Cc: Liming Gao <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <[email protected]>
Reviewed-by: Ruiyu Ni <[email protected]>
Revision Links:
--------------
http://sourceforge.net/p/edk2/code/17851
http://sourceforge.net/p/edk2/code/18561
Modified Paths:
--------------
branches/UDK2015/MdeModulePkg/Library/UefiBootManagerLib/BmPerformance.c
Modified:
branches/UDK2015/MdeModulePkg/Library/UefiBootManagerLib/BmPerformance.c
===================================================================
--- branches/UDK2015/MdeModulePkg/Library/UefiBootManagerLib/BmPerformance.c
2015-11-16 06:49:28 UTC (rev 18788)
+++ branches/UDK2015/MdeModulePkg/Library/UefiBootManagerLib/BmPerformance.c
2015-11-16 06:50:12 UTC (rev 18789)
@@ -62,7 +62,7 @@
for (Index = StartIndex; Index < EndIndex; Index++) {
GaugeString[Index1] = PdbFileName[Index];
Index1++;
- if (Index1 == PERF_TOKEN_LENGTH - 1) {
+ if (Index1 == StringSize - 1) {
break;
}
}
@@ -157,7 +157,7 @@
UINT32 LimitCount;
EFI_HANDLE *Handles;
UINTN NoHandles;
- CHAR8 GaugeString[PERF_TOKEN_LENGTH];
+ CHAR8 GaugeString[PERF_TOKEN_SIZE];
UINT8 *Ptr;
UINT32 Index;
UINT64 Ticker;
@@ -172,13 +172,8 @@
UINT64 StartValue;
UINT64 EndValue;
BOOLEAN CountUp;
- UINTN EntryIndex;
- UINTN NumPerfEntries;
- //
- // List of flags indicating PerfEntry contains DXE handle
- //
- BOOLEAN *PerfEntriesAsDxeHandle;
UINTN VarSize;
+ BOOLEAN Found;
//
// Record the performance data for End of BDS
@@ -186,11 +181,6 @@
PERF_END(NULL, "BDS", NULL, 0);
//
- // Reset the entry count
- //
- mBmPerfHeader.Count = 0;
-
- //
// Retrieve time stamp count as early as possible
//
Ticker = GetPerformanceCounter ();
@@ -212,6 +202,11 @@
CountUp = FALSE;
}
+ //
+ // Reset the entry count
+ //
+ mBmPerfHeader.Count = 0;
+
if (mBmAcpiLowMemoryBase == 0x0FFFFFFFF) {
VarSize = sizeof (EFI_PHYSICAL_ADDRESS);
Status = gRT->GetVariable (
@@ -247,73 +242,10 @@
Ptr = (UINT8 *) ((UINT32) mBmAcpiLowMemoryBase + sizeof
(PERF_HEADER));
LimitCount = (UINT32) (PERF_DATA_MAX_LENGTH - sizeof (PERF_HEADER)) / sizeof
(PERF_DATA);
- NumPerfEntries = 0;
- LogEntryKey = 0;
- while ((LogEntryKey = GetPerformanceMeasurement (
- LogEntryKey,
- &Handle,
- &Token,
- &Module,
- &StartTicker,
- &EndTicker)) != 0) {
- NumPerfEntries++;
- }
- PerfEntriesAsDxeHandle = AllocateZeroPool (NumPerfEntries * sizeof
(BOOLEAN));
- ASSERT (PerfEntriesAsDxeHandle != NULL);
-
//
- // Get DXE drivers performance
+ // Get performance data
//
- for (Index = 0; Index < NoHandles; Index++) {
- Ticker = 0;
- LogEntryKey = 0;
- EntryIndex = 0;
- while ((LogEntryKey = GetPerformanceMeasurement (
- LogEntryKey,
- &Handle,
- &Token,
- &Module,
- &StartTicker,
- &EndTicker)) != 0) {
- if (Handle == Handles[Index] && !PerfEntriesAsDxeHandle[EntryIndex]) {
- PerfEntriesAsDxeHandle[EntryIndex] = TRUE;
- }
- EntryIndex++;
- if ((Handle == Handles[Index]) && (EndTicker != 0)) {
- if (StartTicker == 1) {
- StartTicker = StartValue;
- }
- if (EndTicker == 1) {
- EndTicker = StartValue;
- }
- Ticker += CountUp ? (EndTicker - StartTicker) : (StartTicker -
EndTicker);
- }
- }
-
- Duration = (UINT32) DivU64x32 (Ticker, (UINT32) Freq);
-
- if (Duration > 0) {
-
- BmGetNameFromHandle (Handles[Index], GaugeString, PERF_TOKEN_LENGTH);
-
- AsciiStrCpyS (mBmPerfData.Token, PERF_TOKEN_SIZE, GaugeString);
- mBmPerfData.Duration = Duration;
-
- CopyMem (Ptr, &mBmPerfData, sizeof (PERF_DATA));
- Ptr += sizeof (PERF_DATA);
-
- mBmPerfHeader.Count++;
- if (mBmPerfHeader.Count == LimitCount) {
- goto Done;
- }
- }
- }
-
- //
- // Get inserted performance data
- //
LogEntryKey = 0;
- EntryIndex = 0;
while ((LogEntryKey = GetPerformanceMeasurement (
LogEntryKey,
&Handle,
@@ -321,11 +253,7 @@
&Module,
&StartTicker,
&EndTicker)) != 0) {
- if (!PerfEntriesAsDxeHandle[EntryIndex] && EndTicker != 0) {
-
- ZeroMem (&mBmPerfData, sizeof (PERF_DATA));
-
- AsciiStrnCpyS (mBmPerfData.Token, PERF_TOKEN_SIZE, Token,
PERF_TOKEN_LENGTH);
+ if (EndTicker != 0) {
if (StartTicker == 1) {
StartTicker = StartValue;
}
@@ -334,8 +262,32 @@
}
Ticker = CountUp ? (EndTicker - StartTicker) : (StartTicker - EndTicker);
- mBmPerfData.Duration = (UINT32) DivU64x32 (Ticker, (UINT32) Freq);
+ Duration = (UINT32) DivU64x32 (Ticker, (UINT32) Freq);
+ if (Duration == 0) {
+ continue;
+ }
+ ZeroMem (&mBmPerfData, sizeof (PERF_DATA));
+
+ mBmPerfData.Duration = Duration;
+
+ //
+ // See if the Handle is in the handle buffer
+ //
+ Found = FALSE;
+ for (Index = 0; Index < NoHandles; Index++) {
+ if (Handle == Handles[Index]) {
+ BmGetNameFromHandle (Handles[Index], GaugeString, PERF_TOKEN_SIZE);
+ AsciiStrCpyS (mBmPerfData.Token, PERF_TOKEN_SIZE, GaugeString);
+ Found = TRUE;
+ break;
+ }
+ }
+
+ if (!Found) {
+ AsciiStrnCpyS (mBmPerfData.Token, PERF_TOKEN_SIZE, Token,
PERF_TOKEN_LENGTH);
+ }
+
CopyMem (Ptr, &mBmPerfData, sizeof (PERF_DATA));
Ptr += sizeof (PERF_DATA);
@@ -344,13 +296,11 @@
goto Done;
}
}
- EntryIndex++;
}
Done:
FreePool (Handles);
- FreePool (PerfEntriesAsDxeHandle);
mBmPerfHeader.Signiture = PERFORMANCE_SIGNATURE;
------------------------------------------------------------------------------
Presto, an open source distributed SQL query engine for big data, initially
developed by Facebook, enables you to easily query your data on Hadoop in a
more interactive manner. Teradata is also now providing full enterprise
support for Presto. Download a free open source copy now.
http://pubads.g.doubleclick.net/gampad/clk?id=250295911&iu=/4140
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits