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