1c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm/** @file
286da563d36390940d8bd565604b4377c3cebafb2ydong  Trace reporting for the Dp utility.
386da563d36390940d8bd565604b4377c3cebafb2ydong
40b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>
5d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia  (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
686da563d36390940d8bd565604b4377c3cebafb2ydong  This program and the accompanying materials
786da563d36390940d8bd565604b4377c3cebafb2ydong  are licensed and made available under the terms and conditions of the BSD License
886da563d36390940d8bd565604b4377c3cebafb2ydong  which accompanies this distribution.  The full text of the license may be found at
986da563d36390940d8bd565604b4377c3cebafb2ydong  http://opensource.org/licenses/bsd-license.php
1086da563d36390940d8bd565604b4377c3cebafb2ydong
1186da563d36390940d8bd565604b4377c3cebafb2ydong  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
1286da563d36390940d8bd565604b4377c3cebafb2ydong  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm**/
14c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
15c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include <Library/BaseLib.h>
16c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include <Library/BaseMemoryLib.h>
17c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include <Library/MemoryAllocationLib.h>
18c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include <Library/DebugLib.h>
19c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include <Library/UefiBootServicesTableLib.h>
20c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include <Library/TimerLib.h>
21c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include <Library/PeCoffGetEntryPointLib.h>
22c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include <Library/PerformanceLib.h>
23c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include <Library/PrintLib.h>
24c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include <Library/HiiLib.h>
25c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include <Library/PcdLib.h>
26c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
27c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include <Guid/Performance.h>
28c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
29c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include "Dp.h"
30c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include "Literals.h"
31c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#include "DpInternal.h"
32c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
339dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong/**
349dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Collect verbose statistics about the logged performance measurements.
359dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
369dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  General Summary information for all Trace measurements is gathered and
379dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  stored within the SummaryData structure.  This information is both
389dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  used internally by subsequent reporting functions, and displayed
399dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  at the end of verbose reports.
409dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
419dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  @pre  The SummaryData and CumData structures must be initialized
429dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong        prior to calling this function.
439dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
449dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  @post The SummaryData and CumData structures contain statistics for the
459dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong        current performance logs.
46d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia
47d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia  @param[in, out] CustomCumulativeData  A pointer to the cumtom cumulative data.
48d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia
49c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm**/
50c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmVOID
51c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmGatherStatistics(
52d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia  IN OUT PERF_CUM_DATA              *CustomCumulativeData OPTIONAL
53d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia  )
54c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm{
55c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  MEASUREMENT_RECORD        Measurement;
56c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    Duration;
57c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     LogEntryKey;
58fc48db0da0523576bb6959b59a268feea0f0f750ydong  INTN                      TIndex;
59c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
60c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  LogEntryKey = 0;
610b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  while ((LogEntryKey = GetPerformanceMeasurementEx (
62c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                        LogEntryKey,
63c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                        &Measurement.Handle,
64c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                        &Measurement.Token,
65c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                        &Measurement.Module,
66c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                        &Measurement.StartTimeStamp,
670b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                        &Measurement.EndTimeStamp,
680b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                        &Measurement.Identifier)) != 0)
69c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  {
70c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    ++SummaryData.NumTrace;           // Count the number of TRACE Measurement records
71c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    if (Measurement.EndTimeStamp == 0) {
72c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      ++SummaryData.NumIncomplete;    // Count the incomplete records
73c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      continue;
74c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
75c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
76c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    if (Measurement.Handle != NULL) {
77c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      ++SummaryData.NumHandles;       // Count the number of measurements with non-NULL handles
78c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
79c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
80c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    if (IsPhase( &Measurement)) {
81c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      ++SummaryData.NumSummary;       // Count the number of major phases
82c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
83c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    else {  // !IsPhase(...
84c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      if(Measurement.Handle == NULL) {
85c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        ++SummaryData.NumGlobal;
86c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      }
87c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
88c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
89c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    if (AsciiStrnCmp (Measurement.Token, ALit_PEIM, PERF_TOKEN_LENGTH) == 0) {
90c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      ++SummaryData.NumPEIMs;         // Count PEIM measurements
91c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
92c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
93c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Duration = GetDuration (&Measurement);
94c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    TIndex = GetCumulativeItem (&Measurement);
95c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    if (TIndex >= 0) {
96c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      CumData[TIndex].Duration += Duration;
97c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      CumData[TIndex].Count++;
98c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      if ( Duration < CumData[TIndex].MinDur ) {
99c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        CumData[TIndex].MinDur = Duration;
100c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      }
101c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      if ( Duration > CumData[TIndex].MaxDur ) {
102c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        CumData[TIndex].MaxDur = Duration;
103c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      }
104c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
105d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia
106d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia    //
107d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia    // Collect the data for custom cumulative data.
108d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia    //
109d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia    if ((CustomCumulativeData != NULL) && (AsciiStrCmp (Measurement.Token, CustomCumulativeData->Name) == 0)) {
110d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      CustomCumulativeData->Duration += Duration;
111d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      CustomCumulativeData->Count++;
112d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      if (Duration < CustomCumulativeData->MinDur) {
113d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia        CustomCumulativeData->MinDur = Duration;
114d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      }
115d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      if (Duration > CustomCumulativeData->MaxDur) {
116d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia        CustomCumulativeData->MaxDur = Duration;
117d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      }
118d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia    }
119c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
120c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm}
121c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
1229dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong/**
1239dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Gather and print ALL Trace Records.
1249dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
1259dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Displays all "interesting" Trace measurements in order.<BR>
1269dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  The number of records displayed is controlled by:
1279dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong     - records with a duration less than mInterestThreshold microseconds are not displayed.
1289dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong     - No more than Limit records are displayed.  A Limit of zero will not limit the output.
1299dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong     - If the ExcludeFlag is TRUE, records matching entries in the CumData array are not
1309dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong       displayed.
1319dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
1329dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  @pre    The mInterestThreshold global variable is set to the shortest duration to be printed.
1339dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong           The mGaugeString and mUnicodeToken global arrays are used for temporary string storage.
1349dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong           They must not be in use by a calling function.
1359dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
1369dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  @param[in]    Limit       The number of records to print.  Zero is ALL.
1379dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  @param[in]    ExcludeFlag TRUE to exclude individual Cumulative items from display.
1389dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
139c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm**/
140c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmVOID
141c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmDumpAllTrace(
142c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  IN UINTN             Limit,
143c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  IN BOOLEAN           ExcludeFlag
144c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  )
145c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm{
146c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  MEASUREMENT_RECORD        Measurement;
147c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    ElapsedTime;
148c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    Duration;
149c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  const CHAR16              *IncFlag;
150c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     LogEntryKey;
151c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     Count;
152c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     Index;
153c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     TIndex;
154c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
155c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  EFI_HANDLE                *HandleBuffer;
156c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     Size;
157c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  EFI_HANDLE                TempHandle;
158c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  EFI_STATUS                Status;
1598835954602834c41db448064a7205ac0b8b66189ydong  EFI_STRING                StringPtrUnknown;
160c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
1618835954602834c41db448064a7205ac0b8b66189ydong  StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL);
162c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  IncFlag = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_ALL), NULL);
163c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER),
1648835954602834c41db448064a7205ac0b8b66189ydong              (IncFlag == NULL) ? StringPtrUnknown : IncFlag);
1658835954602834c41db448064a7205ac0b8b66189ydong  FreePool (StringPtrUnknown);
166c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
167c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  // Get Handle information
168c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  //
169c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  Size = 0;
170fc48db0da0523576bb6959b59a268feea0f0f750ydong  HandleBuffer = &TempHandle;
171c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  Status  = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, &TempHandle);
172c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  if (Status == EFI_BUFFER_TOO_SMALL) {
173c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    HandleBuffer = AllocatePool (Size);
174c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    ASSERT (HandleBuffer != NULL);
175fc48db0da0523576bb6959b59a268feea0f0f750ydong    if (HandleBuffer == NULL) {
176fc48db0da0523576bb6959b59a268feea0f0f750ydong      return;
177fc48db0da0523576bb6959b59a268feea0f0f750ydong    }
178c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Status  = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, HandleBuffer);
179c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
180c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  if (EFI_ERROR (Status)) {
181c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    PrintToken (STRING_TOKEN (STR_DP_HANDLES_ERROR), Status);
182c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
183c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  else {
184c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    // We have successfully populated the HandleBuffer
185c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    // Display ALL Measurement Records
186c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    //    Up to Limit lines displayed
187c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    //    Display only records with Elapsed times >= mInterestThreshold
188c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    //    Display driver names in Module field for records with Handles.
189c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    //
1900b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    if (mShowId) {
1910b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      PrintToken (STRING_TOKEN (STR_DP_ALL_HEADR2) );
1920b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      PrintToken (STRING_TOKEN (STR_DP_ALL_DASHES2) );
1930b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    } else {
1940b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      PrintToken (STRING_TOKEN (STR_DP_ALL_HEADR) );
1950b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      PrintToken (STRING_TOKEN (STR_DP_DASHES) );
1960b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    }
197c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
198c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    LogEntryKey = 0;
199c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Count = 0;
200c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Index = 0;
201c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    while ( WITHIN_LIMIT(Count, Limit) &&
2020b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            ((LogEntryKey = GetPerformanceMeasurementEx (
203c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                            LogEntryKey,
204c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                            &Measurement.Handle,
205c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                            &Measurement.Token,
206c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                            &Measurement.Module,
207c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                            &Measurement.StartTimeStamp,
2080b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                            &Measurement.EndTimeStamp,
2090b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                            &Measurement.Identifier)) != 0)
210c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm          )
211c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    {
212c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      ++Index;    // Count every record.  First record is 1.
213c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      ElapsedTime = 0;
2140b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      SafeFreePool ((VOID *) IncFlag);
215c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      if (Measurement.EndTimeStamp != 0) {
216c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        Duration = GetDuration (&Measurement);
217c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        ElapsedTime = DurationInMicroSeconds ( Duration );
2188835954602834c41db448064a7205ac0b8b66189ydong        IncFlag = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_COMPLETE), NULL);
219c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      }
220c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      else {
2218835954602834c41db448064a7205ac0b8b66189ydong        IncFlag = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_INCOMPLETE), NULL);  // Mark incomplete records
222c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      }
223a2daf8dbecddcc04fb4317b6772bc154f0773f7alzeng      if (((Measurement.EndTimeStamp != 0) && (ElapsedTime < mInterestThreshold)) ||
224c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm          ((ExcludeFlag) && (GetCumulativeItem(&Measurement) >= 0))
225c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm         ) {      // Ignore "uninteresting" or excluded records
226c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        continue;
227c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      }
228c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      ++Count;    // Count the number of records printed
229c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
230c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      // If Handle is non-zero, see if we can determine a name for the driver
231c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      AsciiStrToUnicodeStr (Measurement.Module, mGaugeString); // Use Module by default
232c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      AsciiStrToUnicodeStr (Measurement.Token, mUnicodeToken);
233c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      if (Measurement.Handle != NULL) {
234c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        // See if the Handle is in the HandleBuffer
235c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        for (TIndex = 0; TIndex < (Size / sizeof(HandleBuffer[0])); TIndex++) {
236c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm          if (Measurement.Handle == HandleBuffer[TIndex]) {
237c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm            GetNameFromHandle (HandleBuffer[TIndex]);
238c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm            break;
239c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm          }
240c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        }
241c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      }
242a2daf8dbecddcc04fb4317b6772bc154f0773f7alzeng
243a2daf8dbecddcc04fb4317b6772bc154f0773f7alzeng      if (AsciiStrnCmp (Measurement.Token, ALit_PEIM, PERF_TOKEN_LENGTH) == 0) {
244a2daf8dbecddcc04fb4317b6772bc154f0773f7alzeng        UnicodeSPrint (mGaugeString, sizeof (mGaugeString), L"%g", Measurement.Handle);
245a2daf8dbecddcc04fb4317b6772bc154f0773f7alzeng      }
246a2daf8dbecddcc04fb4317b6772bc154f0773f7alzeng
247c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      // Ensure that the argument strings are not too long.
248a2daf8dbecddcc04fb4317b6772bc154f0773f7alzeng      mGaugeString[DP_GAUGE_STRING_LENGTH] = 0;
249a2daf8dbecddcc04fb4317b6772bc154f0773f7alzeng      mUnicodeToken[13] = 0;
250c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
2510b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      if (mShowId) {
2520b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        PrintToken( STRING_TOKEN (STR_DP_ALL_VARS2),
2530b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          Index,      // 1 based, Which measurement record is being printed
2540b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          IncFlag,
2550b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          Measurement.Handle,
2560b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          mGaugeString,
2570b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          mUnicodeToken,
2580b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          ElapsedTime,
2590b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          Measurement.Identifier
2600b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        );
2610b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      } else {
2620b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        PrintToken( STRING_TOKEN (STR_DP_ALL_VARS),
2630b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          Index,      // 1 based, Which measurement record is being printed
2640b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          IncFlag,
2650b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          Measurement.Handle,
2660b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          mGaugeString,
2670b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          mUnicodeToken,
2680b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          ElapsedTime
2690b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        );
2700b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      }
271c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
272c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
273fc48db0da0523576bb6959b59a268feea0f0f750ydong  if (HandleBuffer != &TempHandle) {
274fc48db0da0523576bb6959b59a268feea0f0f750ydong    FreePool (HandleBuffer);
275fc48db0da0523576bb6959b59a268feea0f0f750ydong  }
2760b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  SafeFreePool ((VOID *) IncFlag);
277c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm}
278c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
2799dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong/**
2809dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Gather and print Raw Trace Records.
2819dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
2829dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  All Trace measurements with a duration greater than or equal to
2839dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  mInterestThreshold are printed without interpretation.
2849dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
2859dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  The number of records displayed is controlled by:
2869dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong     - records with a duration less than mInterestThreshold microseconds are not displayed.
2879dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong     - No more than Limit records are displayed.  A Limit of zero will not limit the output.
2889dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong     - If the ExcludeFlag is TRUE, records matching entries in the CumData array are not
2899dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong       displayed.
2909dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
2919dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  @pre    The mInterestThreshold global variable is set to the shortest duration to be printed.
2929dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
2939dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  @param[in]    Limit       The number of records to print.  Zero is ALL.
2949dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  @param[in]    ExcludeFlag TRUE to exclude individual Cumulative items from display.
2959dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
296c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm**/
297c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmVOID
298c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmDumpRawTrace(
299c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  IN UINTN          Limit,
300c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  IN BOOLEAN        ExcludeFlag
301c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  )
302c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm{
303c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  MEASUREMENT_RECORD        Measurement;
304c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    ElapsedTime;
305c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    Duration;
306c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     LogEntryKey;
307c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     Count;
308c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     Index;
309c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
310c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  EFI_STRING    StringPtr;
3118835954602834c41db448064a7205ac0b8b66189ydong  EFI_STRING    StringPtrUnknown;
312c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
3138835954602834c41db448064a7205ac0b8b66189ydong  StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL);
314c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_RAWTRACE), NULL);
315c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER),
3168835954602834c41db448064a7205ac0b8b66189ydong              (StringPtr == NULL) ? StringPtrUnknown : StringPtr);
3178835954602834c41db448064a7205ac0b8b66189ydong  FreePool (StringPtr);
3188835954602834c41db448064a7205ac0b8b66189ydong  FreePool (StringPtrUnknown);
319c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
3200b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  if (mShowId) {
3210b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    PrintToken (STRING_TOKEN (STR_DP_RAW_HEADR2) );
3220b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    PrintToken (STRING_TOKEN (STR_DP_RAW_DASHES2) );
3230b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  } else {
3240b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    PrintToken (STRING_TOKEN (STR_DP_RAW_HEADR) );
3250b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    PrintToken (STRING_TOKEN (STR_DP_RAW_DASHES) );
3260b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  }
327c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
328c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  LogEntryKey = 0;
329c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  Count = 0;
330c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  Index = 0;
331c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  while ( WITHIN_LIMIT(Count, Limit) &&
3320b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          ((LogEntryKey = GetPerformanceMeasurementEx (
333c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          LogEntryKey,
334c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.Handle,
335c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.Token,
336c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.Module,
337c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.StartTimeStamp,
3380b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                          &Measurement.EndTimeStamp,
3390b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                          &Measurement.Identifier)) != 0)
340c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        )
341c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  {
342c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    ++Index;    // Count every record.  First record is 1.
343c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    ElapsedTime = 0;
344c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    if (Measurement.EndTimeStamp != 0) {
345c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      Duration = GetDuration (&Measurement);
346c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      ElapsedTime = DurationInMicroSeconds ( Duration );
347c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
348c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    if ((ElapsedTime < mInterestThreshold)                 ||
349c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        ((ExcludeFlag) && (GetCumulativeItem(&Measurement) >= 0))
350c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        ) { // Ignore "uninteresting" or Excluded records
351c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      continue;
352c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
353c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    ++Count;    // Count the number of records printed
3540b84f444de5b7d3f4224e728c9f2232742c0462dlzeng
3550b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    if (mShowId) {
3560b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      PrintToken (STRING_TOKEN (STR_DP_RAW_VARS2),
3570b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        Index,      // 1 based, Which measurement record is being printed
3580b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        Measurement.Handle,
3590b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        Measurement.StartTimeStamp,
3600b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        Measurement.EndTimeStamp,
3610b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        Measurement.Token,
3620b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        Measurement.Module,
3630b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        Measurement.Identifier
3640b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      );
3650b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    } else {
3660b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      PrintToken (STRING_TOKEN (STR_DP_RAW_VARS),
3670b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        Index,      // 1 based, Which measurement record is being printed
3680b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        Measurement.Handle,
3690b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        Measurement.StartTimeStamp,
3700b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        Measurement.EndTimeStamp,
3710b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        Measurement.Token,
3720b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        Measurement.Module
3730b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      );
3740b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    }
375c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
376c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm}
377c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
3789dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong/**
3799dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Gather and print Major Phase metrics.
3809dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
3819dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  @param[in]    Ticker      The timer value for the END of Shell phase
3829dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
383c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm**/
384c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmVOID
385c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmProcessPhases(
386cbdf19a53e502ed4824c587f6b19e8f138032875ydong  IN UINT64            Ticker
387c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  )
388c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm{
389c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  MEASUREMENT_RECORD        Measurement;
3909dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  UINT64                    BdsTimeoutValue;
3919dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  UINT64                    SecTime;
3929dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  UINT64                    PeiTime;
3939dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  UINT64                    DxeTime;
3949dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  UINT64                    BdsTime;
3959dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  UINT64                    ShellTime;
396c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    ElapsedTime;
397c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    Duration;
398c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    Total;
399c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  EFI_STRING                StringPtr;
400c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     LogEntryKey;
4018835954602834c41db448064a7205ac0b8b66189ydong  EFI_STRING                StringPtrUnknown;
402c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
4039dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  BdsTimeoutValue = 0;
4049dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  SecTime         = 0;
4059dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  PeiTime         = 0;
4069dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  DxeTime         = 0;
4079dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  BdsTime         = 0;
4089dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  ShellTime       = 0;
409c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  //
410c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  // Get Execution Phase Statistics
411c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  //
4128835954602834c41db448064a7205ac0b8b66189ydong  StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL);
413c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_PHASES), NULL);
414c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER),
4158835954602834c41db448064a7205ac0b8b66189ydong              (StringPtr == NULL) ? StringPtrUnknown : StringPtr);
4168835954602834c41db448064a7205ac0b8b66189ydong  FreePool (StringPtr);
4178835954602834c41db448064a7205ac0b8b66189ydong  FreePool (StringPtrUnknown);
418c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
419c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  LogEntryKey = 0;
4200b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  while ((LogEntryKey = GetPerformanceMeasurementEx (
421c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          LogEntryKey,
422c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.Handle,
423c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.Token,
424c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.Module,
425c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.StartTimeStamp,
4260b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                          &Measurement.EndTimeStamp,
4270b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                          &Measurement.Identifier)) != 0)
428c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  {
429c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    if (AsciiStrnCmp (Measurement.Token, ALit_SHELL, PERF_TOKEN_LENGTH) == 0) {
430c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      Measurement.EndTimeStamp = Ticker;
431c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
432c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    if (Measurement.EndTimeStamp == 0) { // Skip "incomplete" records
433c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      continue;
434c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
435c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Duration = GetDuration (&Measurement);
436c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    if (   Measurement.Handle != NULL
437c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        && (AsciiStrnCmp (Measurement.Token, ALit_BdsTO, PERF_TOKEN_LENGTH) == 0)
438c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm       )
439c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    {
440c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      BdsTimeoutValue = Duration;
441c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    } else if (AsciiStrnCmp (Measurement.Token, ALit_SEC, PERF_TOKEN_LENGTH) == 0) {
442c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      SecTime     = Duration;
443c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    } else if (AsciiStrnCmp (Measurement.Token, ALit_PEI, PERF_TOKEN_LENGTH) == 0) {
444c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      PeiTime     = Duration;
445c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    } else if (AsciiStrnCmp (Measurement.Token, ALit_DXE, PERF_TOKEN_LENGTH) == 0) {
446c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      DxeTime      = Duration;
447c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    } else if (AsciiStrnCmp (Measurement.Token, ALit_BDS, PERF_TOKEN_LENGTH) == 0) {
448c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      BdsTime      = Duration;
449c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    } else if (AsciiStrnCmp (Measurement.Token, ALit_SHELL, PERF_TOKEN_LENGTH) == 0) {
450c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      ShellTime    = Duration;
451c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
452c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
453c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
454c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  Total = 0;
455c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
456c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  // print SEC phase duration time
457c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  //
458c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  if (SecTime > 0) {
459c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    ElapsedTime = DurationInMicroSeconds ( SecTime );     // Calculate elapsed time in microseconds
460c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Total += DivU64x32 (ElapsedTime, 1000);   // Accumulate time in milliseconds
461c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    PrintToken (STRING_TOKEN (STR_DP_SEC_PHASE), ElapsedTime);
462c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
463c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
464c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  // print PEI phase duration time
465c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  //
466c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  if (PeiTime > 0) {
467c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    ElapsedTime = DivU64x32 (
468c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    PeiTime,
469c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    (UINT32)TimerInfo.Frequency
470c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    );
471c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Total += ElapsedTime;
472c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    PrintToken (STRING_TOKEN (STR_DP_PHASE_DURATION), ALit_PEI, ElapsedTime);
473c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
474c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
475c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  // print DXE phase duration time
476c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  //
477c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  if (DxeTime > 0) {
478c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    ElapsedTime = DivU64x32 (
479c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    DxeTime,
480c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    (UINT32)TimerInfo.Frequency
481c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    );
482c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Total += ElapsedTime;
483c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    PrintToken (STRING_TOKEN (STR_DP_PHASE_DURATION), ALit_DXE, ElapsedTime);
484c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
485c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
486c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  // print BDS phase duration time
487c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  //
488c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  if (BdsTime > 0) {
489c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    ElapsedTime = DivU64x32 (
490c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    BdsTime,
491c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    (UINT32)TimerInfo.Frequency
492c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    );
493c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Total += ElapsedTime;
494c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    PrintToken (STRING_TOKEN (STR_DP_PHASE_DURATION), ALit_BDS, ElapsedTime);
495c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
496c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
497c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  if (BdsTimeoutValue > 0) {
498c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    ElapsedTime = DivU64x32 (
499c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    BdsTimeoutValue,
500c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    (UINT32)TimerInfo.Frequency
501c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    );
502c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    PrintToken (STRING_TOKEN (STR_DP_PHASE_BDSTO), ALit_BdsTO, ElapsedTime);
503c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
504c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
505c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  // print SHELL phase duration time
506c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  //
507c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  if (ShellTime > 0) {
508c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    ElapsedTime = DivU64x32 (
509c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    ShellTime,
510c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    (UINT32)TimerInfo.Frequency
511c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                    );
512c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Total += ElapsedTime;
513c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    PrintToken (STRING_TOKEN (STR_DP_PHASE_DURATION), ALit_SHELL, ElapsedTime);
514c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
515c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
516c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  PrintToken (STRING_TOKEN (STR_DP_TOTAL_DURATION), Total);
517c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm}
518c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
5199dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong/**
5209dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Gather and print Handle data.
5219dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
5229dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  @param[in]    ExcludeFlag   TRUE to exclude individual Cumulative items from display.
5239dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
5249dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  @return       Status from a call to gBS->LocateHandle().
525c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm**/
526c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmEFI_STATUS
527c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmProcessHandles(
528c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  IN BOOLEAN      ExcludeFlag
529c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  )
530c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm{
531c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  MEASUREMENT_RECORD        Measurement;
532c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    ElapsedTime;
533c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    Duration;
534c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  EFI_HANDLE                *HandleBuffer;
535c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  EFI_STRING                StringPtr;
536c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     Index;
537c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     LogEntryKey;
538c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     Count;
539c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     Size;
540c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  EFI_HANDLE                TempHandle;
541c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  EFI_STATUS                Status;
5428835954602834c41db448064a7205ac0b8b66189ydong  EFI_STRING                StringPtrUnknown;
543c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
5448835954602834c41db448064a7205ac0b8b66189ydong  StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL);
545c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_DRIVERS), NULL);
546c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER),
5478835954602834c41db448064a7205ac0b8b66189ydong              (StringPtr == NULL) ? StringPtrUnknown : StringPtr);
5488835954602834c41db448064a7205ac0b8b66189ydong  FreePool (StringPtr);
5498835954602834c41db448064a7205ac0b8b66189ydong  FreePool (StringPtrUnknown);
550c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
551c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  Size = 0;
552fc48db0da0523576bb6959b59a268feea0f0f750ydong  HandleBuffer = &TempHandle;
553c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  Status  = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, &TempHandle);
554c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  if (Status == EFI_BUFFER_TOO_SMALL) {
555c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    HandleBuffer = AllocatePool (Size);
556c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    ASSERT (HandleBuffer != NULL);
557fc48db0da0523576bb6959b59a268feea0f0f750ydong    if (HandleBuffer == NULL) {
558224beee0fa29b9b10cda6c1d25307371368a1040ydong      return Status;
559fc48db0da0523576bb6959b59a268feea0f0f750ydong    }
560c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Status  = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, HandleBuffer);
561c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
562c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  if (EFI_ERROR (Status)) {
563c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    PrintToken (STRING_TOKEN (STR_DP_HANDLES_ERROR), Status);
564c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
565c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  else {
566c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#if DP_DEBUG == 2
567c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Print (L"There are %,d Handles defined.\n", (Size / sizeof(HandleBuffer[0])));
568c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm#endif
569c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
5700b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    if (mShowId) {
5710b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      PrintToken (STRING_TOKEN (STR_DP_HANDLE_SECTION2) );
5720b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    } else {
5730b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      PrintToken (STRING_TOKEN (STR_DP_HANDLE_SECTION) );
5740b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    }
575c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    PrintToken (STRING_TOKEN (STR_DP_DASHES) );
576c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
577c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    LogEntryKey = 0;
578c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Count   = 0;
5790b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    while ((LogEntryKey = GetPerformanceMeasurementEx (
580c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                            LogEntryKey,
581c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                            &Measurement.Handle,
582c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                            &Measurement.Token,
583c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                            &Measurement.Module,
584c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                            &Measurement.StartTimeStamp,
5850b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                            &Measurement.EndTimeStamp,
5860b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                            &Measurement.Identifier)) != 0)
587c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    {
588c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      Count++;
589c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      Duration = GetDuration (&Measurement);
590c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      ElapsedTime = DurationInMicroSeconds ( Duration );
591c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      if ((ElapsedTime < mInterestThreshold)                 ||
592c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm          (Measurement.EndTimeStamp == 0)                    ||
593c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm          (Measurement.Handle == NULL)                       ||
594c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm          ((ExcludeFlag) && (GetCumulativeItem(&Measurement) >= 0))
595c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm         ) { // Ignore "uninteresting" or excluded records
596c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        continue;
597c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      }
598c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      mGaugeString[0] = 0;    // Empty driver name by default
599c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      AsciiStrToUnicodeStr (Measurement.Token, mUnicodeToken);
600c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      // See if the Handle is in the HandleBuffer
601c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      for (Index = 0; Index < (Size / sizeof(HandleBuffer[0])); Index++) {
602c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        if (Measurement.Handle == HandleBuffer[Index]) {
603c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm          GetNameFromHandle (HandleBuffer[Index]); // Name is put into mGaugeString
604c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm          break;
605c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        }
606c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      }
607c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      // Ensure that the argument strings are not too long.
608a2daf8dbecddcc04fb4317b6772bc154f0773f7alzeng      mGaugeString[DP_GAUGE_STRING_LENGTH] = 0;
609a2daf8dbecddcc04fb4317b6772bc154f0773f7alzeng      mUnicodeToken[11] = 0;
610c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      if (mGaugeString[0] != 0) {
611c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        // Display the record if it has a valid handle.
6120b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        if (mShowId) {
6130b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          PrintToken (
6140b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            STRING_TOKEN (STR_DP_HANDLE_VARS2),
6150b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            Count,      // 1 based, Which measurement record is being printed
6160b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            Index + 1,  // 1 based, Which handle is being printed
6170b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            mGaugeString,
6180b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            mUnicodeToken,
6190b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            ElapsedTime,
6200b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            Measurement.Identifier
6210b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          );
6220b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        } else {
6230b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          PrintToken (
6240b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            STRING_TOKEN (STR_DP_HANDLE_VARS),
6250b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            Count,      // 1 based, Which measurement record is being printed
6260b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            Index + 1,  // 1 based, Which handle is being printed
6270b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            mGaugeString,
6280b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            mUnicodeToken,
6290b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            ElapsedTime
6300b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          );
6310b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        }
632c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      }
633c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
634c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
635fc48db0da0523576bb6959b59a268feea0f0f750ydong  if (HandleBuffer != &TempHandle) {
636fc48db0da0523576bb6959b59a268feea0f0f750ydong    FreePool (HandleBuffer);
637fc48db0da0523576bb6959b59a268feea0f0f750ydong  }
638c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  return Status;
639c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm}
640c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
6419dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong/**
6429dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Gather and print PEIM data.
6439dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
6449dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Only prints complete PEIM records
6459dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
646c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm**/
647c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmVOID
648c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmProcessPeims(
649c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  VOID
650c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm)
651c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm{
652c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  MEASUREMENT_RECORD        Measurement;
653c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    Duration;
654c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    ElapsedTime;
655c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  EFI_STRING                StringPtr;
656c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     LogEntryKey;
657c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     TIndex;
6588835954602834c41db448064a7205ac0b8b66189ydong  EFI_STRING                StringPtrUnknown;
659c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
6608835954602834c41db448064a7205ac0b8b66189ydong  StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL);
661c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_PEIMS), NULL);
662c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER),
6638835954602834c41db448064a7205ac0b8b66189ydong              (StringPtr == NULL) ? StringPtrUnknown : StringPtr);
6648835954602834c41db448064a7205ac0b8b66189ydong  FreePool (StringPtr);
6658835954602834c41db448064a7205ac0b8b66189ydong  FreePool (StringPtrUnknown);
666c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
6670b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  if (mShowId) {
6680b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    PrintToken (STRING_TOKEN (STR_DP_PEIM_SECTION2));
6690b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  } else {
6700b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    PrintToken (STRING_TOKEN (STR_DP_PEIM_SECTION));
6710b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  }
672c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  PrintToken (STRING_TOKEN (STR_DP_DASHES));
673c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  TIndex  = 0;
674c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  LogEntryKey = 0;
6750b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  while ((LogEntryKey = GetPerformanceMeasurementEx (
676c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          LogEntryKey,
677c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.Handle,
678c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.Token,
679c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.Module,
680c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.StartTimeStamp,
6810b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                          &Measurement.EndTimeStamp,
6820b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                          &Measurement.Identifier)) != 0)
683c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  {
684c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    TIndex++;
685c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    if ((Measurement.EndTimeStamp == 0) ||
686c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        (AsciiStrnCmp (Measurement.Token, ALit_PEIM, PERF_TOKEN_LENGTH) != 0)
687c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm       ) {
688c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      continue;
689c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
690c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
691c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Duration = GetDuration (&Measurement);
692c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    ElapsedTime = DurationInMicroSeconds ( Duration );  // Calculate elapsed time in microseconds
693c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    if (ElapsedTime >= mInterestThreshold) {
694c3522526f18e732b15ddfed48ca24eabdb5c1a23lgao      // PEIM FILE Handle is the start address of its FFS file that contains its file guid.
6950b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      if (mShowId) {
6960b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        PrintToken (STRING_TOKEN (STR_DP_PEIM_VARS2),
6970b84f444de5b7d3f4224e728c9f2232742c0462dlzeng              TIndex,   // 1 based, Which measurement record is being printed
6980b84f444de5b7d3f4224e728c9f2232742c0462dlzeng              Measurement.Handle,  // base address
6990b84f444de5b7d3f4224e728c9f2232742c0462dlzeng              Measurement.Handle,  // file guid
7000b84f444de5b7d3f4224e728c9f2232742c0462dlzeng              ElapsedTime,
7010b84f444de5b7d3f4224e728c9f2232742c0462dlzeng              Measurement.Identifier
7020b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        );
7030b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      } else {
7040b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        PrintToken (STRING_TOKEN (STR_DP_PEIM_VARS),
7050b84f444de5b7d3f4224e728c9f2232742c0462dlzeng              TIndex,   // 1 based, Which measurement record is being printed
7060b84f444de5b7d3f4224e728c9f2232742c0462dlzeng              Measurement.Handle,  // base address
7070b84f444de5b7d3f4224e728c9f2232742c0462dlzeng              Measurement.Handle,  // file guid
7080b84f444de5b7d3f4224e728c9f2232742c0462dlzeng              ElapsedTime
7090b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        );
7100b84f444de5b7d3f4224e728c9f2232742c0462dlzeng      }
711c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
712c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
713c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm}
714c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
7159dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong/**
7169dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Gather and print global data.
7179dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
7189dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Strips out incomplete or "Execution Phase" records
7199dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Only prints records where Handle is NULL
7209dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Increment TIndex for every record, even skipped ones, so that we have an
7219dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  indication of every measurement record taken.
7229dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
723c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm**/
724c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmVOID
725c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmProcessGlobal(
726c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  VOID
727c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm)
728c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm{
729c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  MEASUREMENT_RECORD        Measurement;
730c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    Duration;
731c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINT64                    ElapsedTime;
732c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  EFI_STRING                StringPtr;
733c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     LogEntryKey;
734c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     Index;        // Index, or number, of the measurement record being processed
7358835954602834c41db448064a7205ac0b8b66189ydong  EFI_STRING                StringPtrUnknown;
736c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
7378835954602834c41db448064a7205ac0b8b66189ydong  StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL);
738c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_GENERAL), NULL);
739c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER),
7408835954602834c41db448064a7205ac0b8b66189ydong              (StringPtr == NULL) ? StringPtrUnknown: StringPtr);
7418835954602834c41db448064a7205ac0b8b66189ydong  FreePool (StringPtr);
7428835954602834c41db448064a7205ac0b8b66189ydong  FreePool (StringPtrUnknown);
743c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
7440b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  if (mShowId) {
7450b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    PrintToken (STRING_TOKEN (STR_DP_GLOBAL_SECTION2));
7460b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  } else {
7470b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    PrintToken (STRING_TOKEN (STR_DP_GLOBAL_SECTION));
7480b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  }
749c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  PrintToken (STRING_TOKEN (STR_DP_DASHES));
750c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
751c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  Index = 1;
752c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  LogEntryKey = 0;
753c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
7540b84f444de5b7d3f4224e728c9f2232742c0462dlzeng  while ((LogEntryKey = GetPerformanceMeasurementEx (
755c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          LogEntryKey,
756c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.Handle,
757c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.Token,
758c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.Module,
759c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm                          &Measurement.StartTimeStamp,
7600b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                          &Measurement.EndTimeStamp,
7610b84f444de5b7d3f4224e728c9f2232742c0462dlzeng                          &Measurement.Identifier)) != 0)
762c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  {
763c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    AsciiStrToUnicodeStr (Measurement.Module, mGaugeString);
764c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    AsciiStrToUnicodeStr (Measurement.Token, mUnicodeToken);
7650b84f444de5b7d3f4224e728c9f2232742c0462dlzeng    mGaugeString[25] = 0;
766a2daf8dbecddcc04fb4317b6772bc154f0773f7alzeng    mUnicodeToken[31] = 0;
767c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    if ( ! ( IsPhase( &Measurement)  ||
768c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        (Measurement.Handle != NULL)      ||
769c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        (Measurement.EndTimeStamp == 0)
770c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm        ))
771c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    {
772c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      Duration = GetDuration (&Measurement);
773c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      ElapsedTime = DurationInMicroSeconds ( Duration );
774c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      if (ElapsedTime >= mInterestThreshold) {
7750b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        if (mShowId) {
7760b84f444de5b7d3f4224e728c9f2232742c0462dlzeng          PrintToken (
7770b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            STRING_TOKEN (STR_DP_GLOBAL_VARS2),
7780b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            Index,
7790b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            mGaugeString,
7800b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            mUnicodeToken,
7810b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            ElapsedTime,
7820b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            Measurement.Identifier
7830b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            );
7840b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        } else {
7850b84f444de5b7d3f4224e728c9f2232742c0462dlzeng           PrintToken (
7860b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            STRING_TOKEN (STR_DP_GLOBAL_VARS),
7870b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            Index,
7880b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            mGaugeString,
7890b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            mUnicodeToken,
7900b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            ElapsedTime
7910b84f444de5b7d3f4224e728c9f2232742c0462dlzeng            );
7920b84f444de5b7d3f4224e728c9f2232742c0462dlzeng        }
793c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm      }
794c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    }
795c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm    Index++;
796c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
797c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm}
798c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
7999dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong/**
8009dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Gather and print cumulative data.
8019dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong
8029dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Traverse the measurement records and:<BR>
8039dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  For each record with a Token listed in the CumData array:<BR>
8049dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong     - Update the instance count and the total, minimum, and maximum durations.
8059dd7461870e0239ce5b1d6573a3ca0bcd86b7a03ydong  Finally, print the gathered cumulative statistics.
806d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia
807d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia  @param[in]    CustomCumulativeData  A pointer to the cumtom cumulative data.
808d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia
809c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm**/
810c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmVOID
811c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylmProcessCumulative(
812d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia  IN PERF_CUM_DATA                  *CustomCumulativeData OPTIONAL
813d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia  )
814c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm{
8155460c4bbc5aa9d99d25c55c6b936166bea3dbea0ydong  UINT64                    AvgDur;         // the computed average duration
8165460c4bbc5aa9d99d25c55c6b936166bea3dbea0ydong  UINT64                    Dur;
8175460c4bbc5aa9d99d25c55c6b936166bea3dbea0ydong  UINT64                    MinDur;
8185460c4bbc5aa9d99d25c55c6b936166bea3dbea0ydong  UINT64                    MaxDur;
819c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  EFI_STRING                StringPtr;
820c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  UINTN                     TIndex;
8218835954602834c41db448064a7205ac0b8b66189ydong  EFI_STRING                StringPtrUnknown;
822c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
8238835954602834c41db448064a7205ac0b8b66189ydong  StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL);
824c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_CUMULATIVE), NULL);
825c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER),
8268835954602834c41db448064a7205ac0b8b66189ydong              (StringPtr == NULL) ? StringPtrUnknown: StringPtr);
8278835954602834c41db448064a7205ac0b8b66189ydong  FreePool (StringPtr);
8288835954602834c41db448064a7205ac0b8b66189ydong  FreePool (StringPtrUnknown);
829c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
830c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  PrintToken (STRING_TOKEN (STR_DP_CUMULATIVE_SECT_1));
831c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  PrintToken (STRING_TOKEN (STR_DP_CUMULATIVE_SECT_2));
832c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  PrintToken (STRING_TOKEN (STR_DP_DASHES));
833c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm
834c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  for ( TIndex = 0; TIndex < NumCum; ++TIndex) {
8350d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng    if (CumData[TIndex].Count != 0) {
8360d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng      AvgDur = DivU64x32 (CumData[TIndex].Duration, CumData[TIndex].Count);
8370d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng      AvgDur = DurationInMicroSeconds(AvgDur);
8380d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng      Dur    = DurationInMicroSeconds(CumData[TIndex].Duration);
8390d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng      MaxDur = DurationInMicroSeconds(CumData[TIndex].MaxDur);
8400d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng      MinDur = DurationInMicroSeconds(CumData[TIndex].MinDur);
8415460c4bbc5aa9d99d25c55c6b936166bea3dbea0ydong
8420d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng      PrintToken (STRING_TOKEN (STR_DP_CUMULATIVE_STATS),
8430d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng                  CumData[TIndex].Name,
8440d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng                  CumData[TIndex].Count,
8450d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng                  Dur,
8460d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng                  AvgDur,
8470d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng                  MinDur,
8480d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng                  MaxDur
8490d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng                 );
8500d70a7090f008b1d8d5f1592aad3c82e26bf1acflzeng    }
851c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm  }
852d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia
853d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia  //
854d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia  // Print the custom cumulative data.
855d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia  //
856d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia  if (CustomCumulativeData != NULL) {
857d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia    if (CustomCumulativeData->Count != 0) {
858d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      AvgDur = DivU64x32 (CustomCumulativeData->Duration, CustomCumulativeData->Count);
859d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      AvgDur = DurationInMicroSeconds (AvgDur);
860d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      Dur    = DurationInMicroSeconds (CustomCumulativeData->Duration);
861d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      MaxDur = DurationInMicroSeconds (CustomCumulativeData->MaxDur);
862d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      MinDur = DurationInMicroSeconds (CustomCumulativeData->MinDur);
863d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia    } else {
864d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      AvgDur = 0;
865d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      Dur    = 0;
866d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      MaxDur = 0;
867d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia      MinDur = 0;
868d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia    }
869d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia    PrintToken (STRING_TOKEN (STR_DP_CUMULATIVE_STATS),
870d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia                CustomCumulativeData->Name,
871d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia                CustomCumulativeData->Count,
872d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia                Dur,
873d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia                AvgDur,
874d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia                MinDur,
875d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia                MaxDur
876d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia                );
877d28f77df0f51f84b0af79f09abe2c27b1f1aaa69Cinnamon Shia  }
878c06ad33ed2fbbacdba42baf07f5d3fd41b36781ddarylm}
879