diff options
author | Cinnamon Shia <cinnamon.shia@hpe.com> | 2015-11-05 01:59:24 +0000 |
---|---|---|
committer | shenshushi <shenshushi@Edk2> | 2015-11-05 01:59:24 +0000 |
commit | a06795c6a628aa07e2274e2e3e083a5e1cc99322 (patch) | |
tree | 2c23388a2405e1c899c2bb588f3078940621616b /ShellPkg | |
parent | 303ec9bc9f3329e2ec20ef480e071777cc5b8514 (diff) | |
download | edk2-a06795c6a628aa07e2274e2e3e083a5e1cc99322.zip edk2-a06795c6a628aa07e2274e2e3e083a5e1cc99322.tar.gz edk2-a06795c6a628aa07e2274e2e3e083a5e1cc99322.tar.bz2 |
ShellPkg/UefiDpLib: Support dumping cumulative data
Add a new option -c to dump cumulative data.
For example:
shell> dp -c
==[ Cumulative ]========
(Times in microsec.) Cumulative Average Shortest Longest
Name Count Duration Duration Duration Duration
LoadImage: 200 1000000 7000 0 100000
StartImage: 200 20000000 90000 0 7000000
DB:Start: 200 20000000 100000 0 9000000
DB:Support: 200000 100000 0 0 7000
shell> dp -c DXE
==[ Cumulative ]========
(Times in microsec.) Cumulative Average Shortest Longest
Name Count Duration Duration Duration Duration
LoadImage: 200 1000000 7000 0 100000
StartImage: 200 20000000 90000 0 7000000
DB:Start: 200 20000000 100000 0 9000000
DB:Support: 200000 100000 0 0 7000
DXE 1 30000000 30000000 0 30000000
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Cinnamon Shia <cinnamon.shia@hpe.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
Reviewed-by: El-Haj-Mahmoud Samer <samer.el-haj-mahmoud@hpe.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18728 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'ShellPkg')
-rw-r--r-- | ShellPkg/Library/UefiDpLib/Dp.c | 33 | ||||
-rw-r--r-- | ShellPkg/Library/UefiDpLib/DpInternal.h | 9 | ||||
-rw-r--r-- | ShellPkg/Library/UefiDpLib/DpTrace.c | 55 | ||||
-rw-r--r-- | ShellPkg/Library/UefiDpLib/UefiDpLib.uni | bin | 17466 -> 18146 bytes |
4 files changed, 87 insertions, 10 deletions
diff --git a/ShellPkg/Library/UefiDpLib/Dp.c b/ShellPkg/Library/UefiDpLib/Dp.c index 62a4e7b..4d109d0 100644 --- a/ShellPkg/Library/UefiDpLib/Dp.c +++ b/ShellPkg/Library/UefiDpLib/Dp.c @@ -79,6 +79,7 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = { #endif // PROFILING_IMPLEMENTED
{L"-x", TypeFlag}, // -x eXclude Cumulative Items
{L"-i", TypeFlag}, // -i Display Identifier
+ {L"-c", TypeValue}, // -c Display cumulative data.
{L"-n", TypeValue}, // -n # Number of records to display for A and R
{L"-t", TypeValue}, // -t # Threshold of interest
{NULL, TypeMax}
@@ -164,6 +165,9 @@ ShellCommandRunDp ( BOOLEAN TraceMode;
BOOLEAN ProfileMode;
BOOLEAN ExcludeMode;
+ BOOLEAN CumulativeMode;
+ CONST CHAR16 *CustomCumulativeToken;
+ PERF_CUM_DATA *CustomCumulativeData;
StringPtr = NULL;
SummaryMode = FALSE;
@@ -173,6 +177,8 @@ ShellCommandRunDp ( TraceMode = FALSE;
ProfileMode = FALSE;
ExcludeMode = FALSE;
+ CumulativeMode = FALSE;
+ CustomCumulativeData = NULL;
// Get DP's entry time as soon as possible.
// This is used as the Shell-Phase end time.
@@ -210,6 +216,7 @@ ShellCommandRunDp ( #endif // PROFILING_IMPLEMENTED
ExcludeMode = ShellCommandLineGetFlag (ParamPackage, L"-x");
mShowId = ShellCommandLineGetFlag (ParamPackage, L"-i");
+ CumulativeMode = ShellCommandLineGetFlag (ParamPackage, L"-c");
// Options with Values
CmdLineArg = ShellCommandLineGetValue (ParamPackage, L"-n");
@@ -244,6 +251,20 @@ ShellCommandRunDp ( InitCumulativeData ();
//
+ // Init the custom cumulative data.
+ //
+ CustomCumulativeToken = ShellCommandLineGetValue (ParamPackage, L"-c");
+ if (CustomCumulativeToken != NULL) {
+ CustomCumulativeData = AllocateZeroPool (sizeof (PERF_CUM_DATA));
+ CustomCumulativeData->MinDur = 0;
+ CustomCumulativeData->MaxDur = 0;
+ CustomCumulativeData->Count = 0;
+ CustomCumulativeData->Duration = 0;
+ CustomCumulativeData->Name = AllocateZeroPool (StrLen (CustomCumulativeToken) + 1);
+ UnicodeStrToAsciiStr (CustomCumulativeToken, CustomCumulativeData->Name);
+ }
+
+ //
// Timer specific processing
//
// Get the Performance counter characteristics:
@@ -302,8 +323,10 @@ ShellCommandRunDp ( **** !T && P := (2) Only Profile records are displayed
**** T && P := (3) Same as Default, both are displayed
****************************************************************************/
- GatherStatistics();
- if (AllMode) {
+ GatherStatistics (CustomCumulativeData);
+ if (CumulativeMode) {
+ ProcessCumulative (CustomCumulativeData);
+ } else if (AllMode) {
if (TraceMode) {
DumpAllTrace( Number2Display, ExcludeMode);
}
@@ -326,7 +349,7 @@ ShellCommandRunDp ( if ( ! EFI_ERROR( Status)) {
ProcessPeims ();
ProcessGlobal ();
- ProcessCumulative ();
+ ProcessCumulative (NULL);
}
}
}
@@ -339,6 +362,10 @@ ShellCommandRunDp ( }
SHELL_FREE_NON_NULL (StringPtr);
+ if (CustomCumulativeData != NULL) {
+ SHELL_FREE_NON_NULL (CustomCumulativeData->Name);
+ }
+ SHELL_FREE_NON_NULL (CustomCumulativeData);
return SHELL_SUCCESS;
}
diff --git a/ShellPkg/Library/UefiDpLib/DpInternal.h b/ShellPkg/Library/UefiDpLib/DpInternal.h index 9b8163a..aa07fea 100644 --- a/ShellPkg/Library/UefiDpLib/DpInternal.h +++ b/ShellPkg/Library/UefiDpLib/DpInternal.h @@ -172,10 +172,13 @@ GetCumulativeItem( @post The SummaryData and CumData structures contain statistics for the
current performance logs.
+
+ @param[in, out] CustomCumulativeData The pointer to the custom cumulative data.
+
**/
VOID
GatherStatistics(
- VOID
+ IN OUT PERF_CUM_DATA *CustomCumulativeData OPTIONAL
);
/**
@@ -283,11 +286,13 @@ ProcessGlobal( For each record with a Token listed in the CumData array:<BR>
- Update the instance count and the total, minimum, and maximum durations.
Finally, print the gathered cumulative statistics.
+
+ @param[in] CustomCumulativeData The pointer to the custom cumulative data.
**/
VOID
ProcessCumulative(
- VOID
+ IN PERF_CUM_DATA *CustomCumulativeData OPTIONAL
);
/**
diff --git a/ShellPkg/Library/UefiDpLib/DpTrace.c b/ShellPkg/Library/UefiDpLib/DpTrace.c index cf8200c..d17d514 100644 --- a/ShellPkg/Library/UefiDpLib/DpTrace.c +++ b/ShellPkg/Library/UefiDpLib/DpTrace.c @@ -43,11 +43,14 @@ @post The SummaryData and CumData structures contain statistics for the
current performance logs.
+
+ @param[in, out] CustomCumulativeData A pointer to the cumtom cumulative data.
+
**/
VOID
GatherStatistics(
- VOID
-)
+ IN OUT PERF_CUM_DATA *CustomCumulativeData OPTIONAL
+ )
{
MEASUREMENT_RECORD Measurement;
UINT64 Duration;
@@ -99,6 +102,20 @@ GatherStatistics( CumData[TIndex].MaxDur = Duration;
}
}
+
+ //
+ // Collect the data for custom cumulative data.
+ //
+ if ((CustomCumulativeData != NULL) && (AsciiStrCmp (Measurement.Token, CustomCumulativeData->Name) == 0)) {
+ CustomCumulativeData->Duration += Duration;
+ CustomCumulativeData->Count++;
+ if (Duration < CustomCumulativeData->MinDur) {
+ CustomCumulativeData->MinDur = Duration;
+ }
+ if (Duration > CustomCumulativeData->MaxDur) {
+ CustomCumulativeData->MaxDur = Duration;
+ }
+ }
}
}
@@ -782,12 +799,14 @@ ProcessGlobal( For each record with a Token listed in the CumData array:<BR>
- Update the instance count and the total, minimum, and maximum durations.
Finally, print the gathered cumulative statistics.
-
+
+ @param[in] CustomCumulativeData A pointer to the cumtom cumulative data.
+
**/
VOID
ProcessCumulative(
- VOID
-)
+ IN PERF_CUM_DATA *CustomCumulativeData OPTIONAL
+ )
{
UINT64 AvgDur; // the computed average duration
UINT64 Dur;
@@ -826,4 +845,30 @@ ProcessCumulative( );
}
}
+
+ //
+ // Print the custom cumulative data.
+ //
+ if (CustomCumulativeData != NULL) {
+ if (CustomCumulativeData->Count != 0) {
+ AvgDur = DivU64x32 (CustomCumulativeData->Duration, CustomCumulativeData->Count);
+ AvgDur = DurationInMicroSeconds (AvgDur);
+ Dur = DurationInMicroSeconds (CustomCumulativeData->Duration);
+ MaxDur = DurationInMicroSeconds (CustomCumulativeData->MaxDur);
+ MinDur = DurationInMicroSeconds (CustomCumulativeData->MinDur);
+ } else {
+ AvgDur = 0;
+ Dur = 0;
+ MaxDur = 0;
+ MinDur = 0;
+ }
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_CUMULATIVE_STATS), gDpHiiHandle,
+ CustomCumulativeData->Name,
+ CustomCumulativeData->Count,
+ Dur,
+ AvgDur,
+ MinDur,
+ MaxDur
+ );
+ }
}
diff --git a/ShellPkg/Library/UefiDpLib/UefiDpLib.uni b/ShellPkg/Library/UefiDpLib/UefiDpLib.uni Binary files differindex 1e5c26a..5bcb496 100644 --- a/ShellPkg/Library/UefiDpLib/UefiDpLib.uni +++ b/ShellPkg/Library/UefiDpLib/UefiDpLib.uni |