Revision: 19401
          http://sourceforge.net/p/edk2/code/19401
Author:   vanjeff
Date:     2015-12-18 07:34:01 +0000 (Fri, 18 Dec 2015)
Log Message:
-----------
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

(Sync patch r18728 from main trunk.)

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Cinnamon Shia <[email protected]>
Reviewed-by: Star Zeng <[email protected]>
Reviewed-by: Jaben Carsey <[email protected]>
Reviewed-by: El-Haj-Mahmoud Samer <[email protected]>

Revision Links:
--------------
    http://sourceforge.net/p/edk2/code/18728

Modified Paths:
--------------
    branches/UDK2015/ShellPkg/Library/UefiDpLib/Dp.c
    branches/UDK2015/ShellPkg/Library/UefiDpLib/DpInternal.h
    branches/UDK2015/ShellPkg/Library/UefiDpLib/DpTrace.c
    branches/UDK2015/ShellPkg/Library/UefiDpLib/UefiDpLib.uni

Modified: branches/UDK2015/ShellPkg/Library/UefiDpLib/Dp.c
===================================================================
--- branches/UDK2015/ShellPkg/Library/UefiDpLib/Dp.c    2015-12-18 07:33:22 UTC 
(rev 19400)
+++ branches/UDK2015/ShellPkg/Library/UefiDpLib/Dp.c    2015-12-18 07:34:01 UTC 
(rev 19401)
@@ -79,6 +79,7 @@
 #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 @@
   BOOLEAN                   TraceMode;
   BOOLEAN                   ProfileMode;
   BOOLEAN                   ExcludeMode;
+  BOOLEAN                   CumulativeMode;
+  CONST CHAR16              *CustomCumulativeToken;
+  PERF_CUM_DATA             *CustomCumulativeData;
 
   StringPtr   = NULL;
   SummaryMode = FALSE;
@@ -173,6 +177,8 @@
   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 @@
 #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 @@
   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 @@
 ****    !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 @@
         if ( ! EFI_ERROR( Status)) {
           ProcessPeims ();
           ProcessGlobal ();
-          ProcessCumulative ();
+          ProcessCumulative (NULL);
         }
       }
     }
@@ -339,6 +362,10 @@
   }
 
   SHELL_FREE_NON_NULL (StringPtr);
+  if (CustomCumulativeData != NULL) {
+    SHELL_FREE_NON_NULL (CustomCumulativeData->Name);
+  }
+  SHELL_FREE_NON_NULL (CustomCumulativeData);
 
   return SHELL_SUCCESS;
 }

Modified: branches/UDK2015/ShellPkg/Library/UefiDpLib/DpInternal.h
===================================================================
--- branches/UDK2015/ShellPkg/Library/UefiDpLib/DpInternal.h    2015-12-18 
07:33:22 UTC (rev 19400)
+++ branches/UDK2015/ShellPkg/Library/UefiDpLib/DpInternal.h    2015-12-18 
07:34:01 UTC (rev 19401)
@@ -172,10 +172,13 @@
   
   @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 @@
   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
   );
 
 /** 

Modified: branches/UDK2015/ShellPkg/Library/UefiDpLib/DpTrace.c
===================================================================
--- branches/UDK2015/ShellPkg/Library/UefiDpLib/DpTrace.c       2015-12-18 
07:33:22 UTC (rev 19400)
+++ branches/UDK2015/ShellPkg/Library/UefiDpLib/DpTrace.c       2015-12-18 
07:34:01 UTC (rev 19401)
@@ -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 @@
         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 @@
   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 @@
                  );
     }
   }
+
+  //
+  // 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
+                );
+  }
 }

Modified: branches/UDK2015/ShellPkg/Library/UefiDpLib/UefiDpLib.uni
===================================================================
--- branches/UDK2015/ShellPkg/Library/UefiDpLib/UefiDpLib.uni   2015-12-18 
07:33:22 UTC (rev 19400)
+++ branches/UDK2015/ShellPkg/Library/UefiDpLib/UefiDpLib.uni   2015-12-18 
07:34:01 UTC (rev 19401)
@@ -6,6 +6,8 @@
  +    - @@ -218,6 +220,18 @@
  ++++++  

------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to