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.s...@hpe.com>
---
 PerformancePkg/Dp_App/Dp.c          |  62 +++++++++++++++++++++++++++++++++---
 PerformancePkg/Dp_App/DpInternal.h  |  10 ++++--
 PerformancePkg/Dp_App/DpStrings.uni | Bin 36606 -> 38432 bytes
 PerformancePkg/Dp_App/DpTrace.c     |  56 +++++++++++++++++++++++++++++---
 4 files changed, 117 insertions(+), 11 deletions(-)

diff --git a/PerformancePkg/Dp_App/Dp.c b/PerformancePkg/Dp_App/Dp.c
index 57144a8..0f61b9d 100644
--- a/PerformancePkg/Dp_App/Dp.c
+++ b/PerformancePkg/Dp_App/Dp.c
@@ -14,6 +14,7 @@
   timer information to calculate elapsed time for each measurement.
  
   Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>
+  (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD 
License
   which accompanies this distribution.  The full text of the license may be 
found at
@@ -81,6 +82,7 @@ PARAM_ITEM_LIST  ParamList[] = {
 #endif
   {STRING_TOKEN (STR_DP_OPTION_LX), TypeFlag},   // -x   eXclude Cumulative 
Items
   {STRING_TOKEN (STR_DP_OPTION_LI), TypeFlag},   // -i   Display Identifier
+  {STRING_TOKEN (STR_DP_OPTION_LC), TypeValue},  // -c   Display cumulative 
data.
   {STRING_TOKEN (STR_DP_OPTION_LN), TypeValue},  // -n # Number of records to 
display for A and R
   {STRING_TOKEN (STR_DP_OPTION_LT), TypeValue}   // -t # Threshold of interest
   };
@@ -138,6 +140,7 @@ ShowHelp( void )
   PrintToken (STRING_TOKEN (STR_DP_HELP_THRESHOLD));
   PrintToken (STRING_TOKEN (STR_DP_HELP_COUNT));
   PrintToken (STRING_TOKEN (STR_DP_HELP_ID));
+  PrintToken (STRING_TOKEN (STR_DP_HELP_CUM_DATA));
   PrintToken (STRING_TOKEN (STR_DP_HELP_HELP));
   Print(L"\n");
 }
@@ -168,7 +171,26 @@ DumpStatistics( void )
   FreePool (StringPtrUnknown);
 }
 
-/** 
+/**
+  Initialize the cumulative data.
+
+**/
+VOID
+InitCumulativeData (
+  VOID
+  )
+{
+  UINTN                             Index;
+
+  for (Index = 0; Index < NumCum; ++Index) {
+    CumData[Index].Count = 0;
+    CumData[Index].MinDur = PERF_MAXDUR;
+    CumData[Index].MaxDur = 0;
+    CumData[Index].Duration = 0;
+  }
+}
+
+/**
   Dump performance data.
   
   @param[in]  ImageHandle     The image handle.
@@ -203,6 +225,9 @@ InitializeDp (
   BOOLEAN                   TraceMode;
   BOOLEAN                   ProfileMode;
   BOOLEAN                   ExcludeMode;
+  BOOLEAN                   CumulativeMode;
+  CONST CHAR16              *CustomCumulativeToken;
+  PERF_CUM_DATA             *CustomCumulativeData;
 
   EFI_STRING                StringDpOptionQh;
   EFI_STRING                StringDpOptionLh;
@@ -218,6 +243,7 @@ InitializeDp (
   EFI_STRING                StringDpOptionLn;
   EFI_STRING                StringDpOptionLt;
   EFI_STRING                StringDpOptionLi;
+  EFI_STRING                StringDpOptionLc;
   
   SummaryMode     = FALSE;
   VerboseMode     = FALSE;
@@ -226,6 +252,8 @@ InitializeDp (
   TraceMode       = FALSE;
   ProfileMode     = FALSE;
   ExcludeMode     = FALSE;
+  CumulativeMode = FALSE;
+  CustomCumulativeData = NULL;
 
   StringDpOptionQh = NULL;
   StringDpOptionLh = NULL;
@@ -241,6 +269,7 @@ InitializeDp (
   StringDpOptionLn = NULL;
   StringDpOptionLt = NULL;
   StringDpOptionLi = NULL;
+  StringDpOptionLc = NULL;
   StringPtr        = NULL;
 
   // Get DP's entry time as soon as possible.
@@ -289,6 +318,7 @@ InitializeDp (
       StringDpOptionLn = HiiGetString (gHiiHandle, STRING_TOKEN 
(STR_DP_OPTION_LN), NULL);
       StringDpOptionLt = HiiGetString (gHiiHandle, STRING_TOKEN 
(STR_DP_OPTION_LT), NULL);
       StringDpOptionLi = HiiGetString (gHiiHandle, STRING_TOKEN 
(STR_DP_OPTION_LI), NULL);
+      StringDpOptionLc = HiiGetString (gHiiHandle, STRING_TOKEN 
(STR_DP_OPTION_LC), NULL);
       
       // Boolean Options
       // 
@@ -303,6 +333,7 @@ InitializeDp (
 #endif  // PROFILING_IMPLEMENTED
       ExcludeMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLx);
       mShowId     =  ShellCommandLineGetFlag (ParamPackage, StringDpOptionLi);
+      CumulativeMode = ShellCommandLineGetFlag (ParamPackage, 
StringDpOptionLc);
 
       // Options with Values
       CmdLineArg  = ShellCommandLineGetValue (ParamPackage, StringDpOptionLn);
@@ -331,6 +362,20 @@ InitializeDp (
 #endif  // PROFILING_IMPLEMENTED
       }
 
+  //
+  // Init the custom cumulative data.
+  //
+  CustomCumulativeToken = ShellCommandLineGetValue (ParamPackage, 
StringDpOptionLc);
+  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                                ****
 ****************************************************************************/
@@ -392,8 +437,10 @@ InitializeDp (
 ****    !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);
         }
@@ -418,7 +465,7 @@ InitializeDp (
             if ( ! EFI_ERROR( Status)) {
               ProcessPeims (     );
               ProcessGlobal (    );
-              ProcessCumulative ();
+              ProcessCumulative (NULL);
             }
           }
         }
@@ -432,6 +479,7 @@ InitializeDp (
     }
   }
 
+  //
   // Free the memory allocate from HiiGetString
   //
   ListIndex = 0;
@@ -455,9 +503,15 @@ InitializeDp (
   SafeFreePool (StringDpOptionLn);
   SafeFreePool (StringDpOptionLt);
   SafeFreePool (StringDpOptionLi);
+  SafeFreePool (StringDpOptionLc);
   SafeFreePool (StringPtr);
   SafeFreePool (mPrintTokenBuffer);
 
+  if (CustomCumulativeData != NULL) {
+    SafeFreePool (CustomCumulativeData->Name);
+  }
+  SafeFreePool (CustomCumulativeData);
+
   HiiRemovePackages (gHiiHandle);
   return Status;
 }
diff --git a/PerformancePkg/Dp_App/DpInternal.h 
b/PerformancePkg/Dp_App/DpInternal.h
index fff2995..0e97e1e 100644
--- a/PerformancePkg/Dp_App/DpInternal.h
+++ b/PerformancePkg/Dp_App/DpInternal.h
@@ -7,6 +7,7 @@
   DpUtilities.c, DpTrace.c, and DpProfile.c are included here.
 
   Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
+  (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD 
License
   which accompanies this distribution.  The full text of the license may be 
found at
@@ -188,10 +189,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
   );
 
 /** 
@@ -299,11 +303,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/PerformancePkg/Dp_App/DpStrings.uni 
b/PerformancePkg/Dp_App/DpStrings.uni
index 
eddc02c2b8536c63718b82040f9c0238e21d23ce..c4c146f6b152c5bd11c68b67c0aab22a17b90b44
 100644
GIT binary patch
delta 675
zcmaJ-T`PlO7{1;KuZ<Ytz-DigB2Bh&LOYmkMZP8+$d=yTjbz_8+6fLgTMN&zQah6q
zz2(T?@B{cEay>&!Lr?ejb>H`OKkv7ey9dkFQ|lN)7{7K7?)WeTFJ_=&0ZE)7MP206
z5QPo{htvfm7)Ov{KFKIYIlvKp4PokIN(x!#)AS@t!!n|ewOYH~pufXRmXl;HZU)p5
zr8zAE>V&A;#>9Qcb92><Tf6^gGOM<Wp6(E~u!3FE31SmLVQ-te=~U0;_D!r|iR@SD
zdnn;L_Z%7PC^MGVBw0yN@3EGlmG|oOq%~0Dt@48OSCnQ(b{C13w`;`7NJosbV(fD>
z*9EJ1>0cA)s#|f3yy}cZ|JWoqG|z1OndBll&dT{BZ{Kdrbb2w#UCU&rlf@$E=-B@q
z>+;pH8+E1y>VMHg{yI90dG2lW{KCOC{R3IzkLJinZumxDDu!4e@SD93Yfe;7dz6rP
V?F+SdU<h3;f7;<u(@}Y|d;q2Cjr9Nk

delta 53
zcmZ3mhUwp2rU~0NJ1|aQ-~5V0igEHQ4yDNsTu*@Xt;shybwK>h4LmIZn{AZ13O3tK
He#8U-a8edg

diff --git a/PerformancePkg/Dp_App/DpTrace.c b/PerformancePkg/Dp_App/DpTrace.c
index 1ba2b72..d3df30f 100644
--- a/PerformancePkg/Dp_App/DpTrace.c
+++ b/PerformancePkg/Dp_App/DpTrace.c
@@ -2,6 +2,7 @@
   Trace reporting for the Dp utility.
 
   Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>
+  (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD 
License
   which accompanies this distribution.  The full text of the license may be 
found at
@@ -42,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;
@@ -98,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;
+      }
+    }
   }
 }
 
@@ -785,12 +803,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;
@@ -829,4 +849,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;
+    }
+    PrintToken (STRING_TOKEN (STR_DP_CUMULATIVE_STATS),
+                CustomCumulativeData->Name,
+                CustomCumulativeData->Count,
+                Dur,
+                AvgDur,
+                MinDur,
+                MaxDur
+                );
+  }
 }
-- 
1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to