X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=PerformancePkg%2FDp_App%2FDpTrace.c;h=9b4e0ed289ad19d9938eb07ad25e9c92ed672f36;hp=ca71b625176ad7bc5130873a1497a0c1b031c0fd;hb=02f6fd1d5f2e21dafc080721e7258bc2a2dc603c;hpb=fc48db0da0523576bb6959b59a268feea0f0f750 diff --git a/PerformancePkg/Dp_App/DpTrace.c b/PerformancePkg/Dp_App/DpTrace.c index ca71b62517..9b4e0ed289 100644 --- a/PerformancePkg/Dp_App/DpTrace.c +++ b/PerformancePkg/Dp_App/DpTrace.c @@ -1,14 +1,15 @@ /** @file - * Trace reporting for the Dp utility. - * - * Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.
- * This program and the accompanying materials - * are licensed and made available under the terms and conditions of the BSD License - * which accompanies this distribution. The full text of the license may be found at - * http://opensource.org/licenses/bsd-license.php - * - * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + Trace reporting for the Dp utility. + + Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.
+ (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ #include @@ -16,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -29,23 +29,27 @@ #include "Literals.h" #include "DpInternal.h" -/** Collect verbose statistics about the logged performance measurements. - * - * General Summary information for all Trace measurements is gathered and - * stored within the SummaryData structure. This information is both - * used internally by subsequent reporting functions, and displayed - * at the end of verbose reports. - * - * @pre The SummaryData and CumData structures must be initialized - * prior to calling this function. - * - * @post The SummaryData and CumData structures contain statistics for the - * current performance logs. +/** + Collect verbose statistics about the logged performance measurements. + + General Summary information for all Trace measurements is gathered and + stored within the SummaryData structure. This information is both + used internally by subsequent reporting functions, and displayed + at the end of verbose reports. + + @pre The SummaryData and CumData structures must be initialized + prior to calling this function. + + @post The SummaryData and CumData structures contain statistics for the + current performance logs. + + @param[in, out] CustomCumulativeData A pointer to the cumtom cumulative data. + **/ VOID GatherStatistics( - VOID -) + IN OUT PERF_CUM_DATA *CustomCumulativeData OPTIONAL + ) { MEASUREMENT_RECORD Measurement; UINT64 Duration; @@ -53,13 +57,14 @@ GatherStatistics( INTN TIndex; LogEntryKey = 0; - while ((LogEntryKey = GetPerformanceMeasurement ( + while ((LogEntryKey = GetPerformanceMeasurementEx ( LogEntryKey, &Measurement.Handle, &Measurement.Token, &Measurement.Module, &Measurement.StartTimeStamp, - &Measurement.EndTimeStamp)) != 0) + &Measurement.EndTimeStamp, + &Measurement.Identifier)) != 0) { ++SummaryData.NumTrace; // Count the number of TRACE Measurement records if (Measurement.EndTimeStamp == 0) { @@ -96,27 +101,45 @@ GatherStatistics( CumData[TIndex].MaxDur = Duration; } } + + // + // Collect the data for custom cumulative data. + // + if ((CustomCumulativeData != NULL) && (AsciiStrCmp (Measurement.Token, CustomCumulativeData->Name) == 0)) { + CustomCumulativeData->Duration += Duration; + CustomCumulativeData->Count++; + if (Duration < CustomCumulativeData->MinDur) { + CustomCumulativeData->MinDur = Duration; + } + if (Duration > CustomCumulativeData->MaxDur) { + CustomCumulativeData->MaxDur = Duration; + } + } } } -/** Gather and print ALL Trace Records. - * - * Displays all "interesting" Trace measurements in order.
- * The number of records displayed is controlled by: - * - records with a duration less than mInterestThreshold microseconds are not displayed. - * - No more than Limit records are displayed. A Limit of zero will not limit the output. - * - If the ExcludeFlag is TRUE, records matching entries in the CumData array are not - * displayed. - * - * @pre The mInterestThreshold global variable is set to the shortest duration to be printed. - * The mGaugeString and mUnicodeToken global arrays are used for temporary string storage. - * They must not be in use by a calling function. - * - * @param[in] Limit The number of records to print. Zero is ALL. - * @param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display. - * +/** + Gather and print ALL Trace Records. + + Displays all "interesting" Trace measurements in order.
+ The number of records displayed is controlled by: + - records with a duration less than mInterestThreshold microseconds are not displayed. + - No more than Limit records are displayed. A Limit of zero will not limit the output. + - If the ExcludeFlag is TRUE, records matching entries in the CumData array are not + displayed. + + @pre The mInterestThreshold global variable is set to the shortest duration to be printed. + The mGaugeString and mUnicodeToken global arrays are used for temporary string storage. + They must not be in use by a calling function. + + @param[in] Limit The number of records to print. Zero is ALL. + @param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display. + + @retval EFI_SUCCESS The operation was successful. + @retval EFI_ABORTED The user aborts the operation. + @return Others from a call to gBS->LocateHandleBuffer(). **/ -VOID +EFI_STATUS DumpAllTrace( IN UINTN Limit, IN BOOLEAN ExcludeFlag @@ -132,27 +155,19 @@ DumpAllTrace( UINTN TIndex; EFI_HANDLE *HandleBuffer; - UINTN Size; - EFI_HANDLE TempHandle; + UINTN HandleCount; EFI_STATUS Status; + EFI_STRING StringPtrUnknown; + StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); IncFlag = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_ALL), NULL); PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER), - (IncFlag == NULL) ? ALit_UNKNOWN: IncFlag); + (IncFlag == NULL) ? StringPtrUnknown : IncFlag); + FreePool (StringPtrUnknown); // Get Handle information // - Size = 0; - HandleBuffer = &TempHandle; - Status = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, &TempHandle); - if (Status == EFI_BUFFER_TOO_SMALL) { - HandleBuffer = AllocatePool (Size); - ASSERT (HandleBuffer != NULL); - if (HandleBuffer == NULL) { - return; - } - Status = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, HandleBuffer); - } + Status = gBS->LocateHandleBuffer (AllHandles, NULL, NULL, &HandleCount, &HandleBuffer); if (EFI_ERROR (Status)) { PrintToken (STRING_TOKEN (STR_DP_HANDLES_ERROR), Status); } @@ -163,91 +178,121 @@ DumpAllTrace( // Display only records with Elapsed times >= mInterestThreshold // Display driver names in Module field for records with Handles. // - PrintToken (STRING_TOKEN (STR_DP_ALL_HEADR) ); - PrintToken (STRING_TOKEN (STR_DP_DASHES) ); + if (mShowId) { + PrintToken (STRING_TOKEN (STR_DP_ALL_HEADR2) ); + PrintToken (STRING_TOKEN (STR_DP_ALL_DASHES2) ); + } else { + PrintToken (STRING_TOKEN (STR_DP_ALL_HEADR) ); + PrintToken (STRING_TOKEN (STR_DP_DASHES) ); + } LogEntryKey = 0; Count = 0; Index = 0; while ( WITHIN_LIMIT(Count, Limit) && - ((LogEntryKey = GetPerformanceMeasurement ( + ((LogEntryKey = GetPerformanceMeasurementEx ( LogEntryKey, &Measurement.Handle, &Measurement.Token, &Measurement.Module, &Measurement.StartTimeStamp, - &Measurement.EndTimeStamp)) != 0) + &Measurement.EndTimeStamp, + &Measurement.Identifier)) != 0) ) { ++Index; // Count every record. First record is 1. ElapsedTime = 0; + SafeFreePool ((VOID *) IncFlag); if (Measurement.EndTimeStamp != 0) { Duration = GetDuration (&Measurement); ElapsedTime = DurationInMicroSeconds ( Duration ); - IncFlag = STR_DP_COMPLETE; + IncFlag = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_COMPLETE), NULL); } else { - IncFlag = STR_DP_INCOMPLETE; // Mark incomplete records + IncFlag = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_INCOMPLETE), NULL); // Mark incomplete records } - if ((ElapsedTime < mInterestThreshold) || + if (((Measurement.EndTimeStamp != 0) && (ElapsedTime < mInterestThreshold)) || ((ExcludeFlag) && (GetCumulativeItem(&Measurement) >= 0)) ) { // Ignore "uninteresting" or excluded records continue; } - if (Measurement.EndTimeStamp == 0) { - ElapsedTime = Measurement.StartTimeStamp; - } ++Count; // Count the number of records printed // If Handle is non-zero, see if we can determine a name for the driver - AsciiStrToUnicodeStr (Measurement.Module, mGaugeString); // Use Module by default - AsciiStrToUnicodeStr (Measurement.Token, mUnicodeToken); + AsciiStrToUnicodeStrS (Measurement.Module, mGaugeString, ARRAY_SIZE (mGaugeString)); // Use Module by default + AsciiStrToUnicodeStrS (Measurement.Token, mUnicodeToken, ARRAY_SIZE (mUnicodeToken)); if (Measurement.Handle != NULL) { // See if the Handle is in the HandleBuffer - for (TIndex = 0; TIndex < (Size / sizeof(HandleBuffer[0])); TIndex++) { + for (TIndex = 0; TIndex < HandleCount; TIndex++) { if (Measurement.Handle == HandleBuffer[TIndex]) { GetNameFromHandle (HandleBuffer[TIndex]); break; } } } - // Ensure that the argument strings are not too long. - mGaugeString[31] = 0; - mUnicodeToken[18] = 0; - PrintToken( STRING_TOKEN (STR_DP_ALL_STATS), - Index, // 1 based, Which measurement record is being printed - IncFlag, - Measurement.Handle, - mGaugeString, - mUnicodeToken, - ElapsedTime - ); + if (AsciiStrnCmp (Measurement.Token, ALit_PEIM, PERF_TOKEN_LENGTH) == 0) { + UnicodeSPrint (mGaugeString, sizeof (mGaugeString), L"%g", Measurement.Handle); + } + + // Ensure that the argument strings are not too long. + mGaugeString[DP_GAUGE_STRING_LENGTH] = 0; + mUnicodeToken[13] = 0; + + if (mShowId) { + PrintToken( STRING_TOKEN (STR_DP_ALL_VARS2), + Index, // 1 based, Which measurement record is being printed + IncFlag, + Measurement.Handle, + mGaugeString, + mUnicodeToken, + ElapsedTime, + Measurement.Identifier + ); + } else { + PrintToken( STRING_TOKEN (STR_DP_ALL_VARS), + Index, // 1 based, Which measurement record is being printed + IncFlag, + Measurement.Handle, + mGaugeString, + mUnicodeToken, + ElapsedTime + ); + } + if (ShellGetExecutionBreakFlag ()) { + Status = EFI_ABORTED; + break; + } } } - if (HandleBuffer != &TempHandle) { + if (HandleBuffer != NULL) { FreePool (HandleBuffer); } + SafeFreePool ((VOID *) IncFlag); + return Status; } -/** Gather and print Raw Trace Records. - * - * All Trace measurements with a duration greater than or equal to - * mInterestThreshold are printed without interpretation. - * - * The number of records displayed is controlled by: - * - records with a duration less than mInterestThreshold microseconds are not displayed. - * - No more than Limit records are displayed. A Limit of zero will not limit the output. - * - If the ExcludeFlag is TRUE, records matching entries in the CumData array are not - * displayed. - * - * @pre The mInterestThreshold global variable is set to the shortest duration to be printed. - * - * @param[in] Limit The number of records to print. Zero is ALL. - * @param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display. - * +/** + Gather and print Raw Trace Records. + + All Trace measurements with a duration greater than or equal to + mInterestThreshold are printed without interpretation. + + The number of records displayed is controlled by: + - records with a duration less than mInterestThreshold microseconds are not displayed. + - No more than Limit records are displayed. A Limit of zero will not limit the output. + - If the ExcludeFlag is TRUE, records matching entries in the CumData array are not + displayed. + + @pre The mInterestThreshold global variable is set to the shortest duration to be printed. + + @param[in] Limit The number of records to print. Zero is ALL. + @param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display. + + @retval EFI_SUCCESS The operation was successful. + @retval EFI_ABORTED The user aborts the operation. **/ -VOID +EFI_STATUS DumpRawTrace( IN UINTN Limit, IN BOOLEAN ExcludeFlag @@ -261,25 +306,38 @@ DumpRawTrace( UINTN Index; EFI_STRING StringPtr; + EFI_STRING StringPtrUnknown; + EFI_STATUS Status; + + Status = EFI_SUCCESS; + StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_RAWTRACE), NULL); PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER), - (StringPtr == NULL) ? ALit_UNKNOWN: StringPtr); - - PrintToken (STRING_TOKEN (STR_DP_RAW_HEADR) ); - PrintToken (STRING_TOKEN (STR_DP_RAW_DASHES) ); + (StringPtr == NULL) ? StringPtrUnknown : StringPtr); + FreePool (StringPtr); + FreePool (StringPtrUnknown); + + if (mShowId) { + PrintToken (STRING_TOKEN (STR_DP_RAW_HEADR2) ); + PrintToken (STRING_TOKEN (STR_DP_RAW_DASHES2) ); + } else { + PrintToken (STRING_TOKEN (STR_DP_RAW_HEADR) ); + PrintToken (STRING_TOKEN (STR_DP_RAW_DASHES) ); + } LogEntryKey = 0; Count = 0; Index = 0; while ( WITHIN_LIMIT(Count, Limit) && - ((LogEntryKey = GetPerformanceMeasurement ( + ((LogEntryKey = GetPerformanceMeasurementEx ( LogEntryKey, &Measurement.Handle, &Measurement.Token, &Measurement.Module, &Measurement.StartTimeStamp, - &Measurement.EndTimeStamp)) != 0) + &Measurement.EndTimeStamp, + &Measurement.Identifier)) != 0) ) { ++Index; // Count every record. First record is 1. @@ -294,59 +352,82 @@ DumpRawTrace( continue; } ++Count; // Count the number of records printed - PrintToken (STRING_TOKEN (STR_DP_RAW_VARS), - Index, // 1 based, Which measurement record is being printed - Measurement.Handle, - Measurement.StartTimeStamp, - Measurement.EndTimeStamp, - Measurement.Token, - Measurement.Module - ); + + if (mShowId) { + PrintToken (STRING_TOKEN (STR_DP_RAW_VARS2), + Index, // 1 based, Which measurement record is being printed + Measurement.Handle, + Measurement.StartTimeStamp, + Measurement.EndTimeStamp, + Measurement.Token, + Measurement.Module, + Measurement.Identifier + ); + } else { + PrintToken (STRING_TOKEN (STR_DP_RAW_VARS), + Index, // 1 based, Which measurement record is being printed + Measurement.Handle, + Measurement.StartTimeStamp, + Measurement.EndTimeStamp, + Measurement.Token, + Measurement.Module + ); + } + if (ShellGetExecutionBreakFlag ()) { + Status = EFI_ABORTED; + break; + } } + return Status; } -/** Gather and print Major Phase metrics. - * - * @param[in] Ticker The timer value for the END of Shell phase - * +/** + Gather and print Major Phase metrics. + **/ VOID ProcessPhases( - UINT64 Ticker + VOID ) { MEASUREMENT_RECORD Measurement; - UINT64 BdsTimeoutValue = 0; - UINT64 SecTime = 0; - UINT64 PeiTime = 0; - UINT64 DxeTime = 0; - UINT64 BdsTime = 0; - UINT64 ShellTime = 0; + UINT64 BdsTimeoutValue; + UINT64 SecTime; + UINT64 PeiTime; + UINT64 DxeTime; + UINT64 BdsTime; UINT64 ElapsedTime; UINT64 Duration; UINT64 Total; EFI_STRING StringPtr; UINTN LogEntryKey; + EFI_STRING StringPtrUnknown; + BdsTimeoutValue = 0; + SecTime = 0; + PeiTime = 0; + DxeTime = 0; + BdsTime = 0; // // Get Execution Phase Statistics // + StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_PHASES), NULL); PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER), - (StringPtr == NULL) ? ALit_UNKNOWN: StringPtr); + (StringPtr == NULL) ? StringPtrUnknown : StringPtr); + FreePool (StringPtr); + FreePool (StringPtrUnknown); LogEntryKey = 0; - while ((LogEntryKey = GetPerformanceMeasurement ( + while ((LogEntryKey = GetPerformanceMeasurementEx ( LogEntryKey, &Measurement.Handle, &Measurement.Token, &Measurement.Module, &Measurement.StartTimeStamp, - &Measurement.EndTimeStamp)) != 0) + &Measurement.EndTimeStamp, + &Measurement.Identifier)) != 0) { - if (AsciiStrnCmp (Measurement.Token, ALit_SHELL, PERF_TOKEN_LENGTH) == 0) { - Measurement.EndTimeStamp = Ticker; - } if (Measurement.EndTimeStamp == 0) { // Skip "incomplete" records continue; } @@ -364,8 +445,6 @@ ProcessPhases( DxeTime = Duration; } else if (AsciiStrnCmp (Measurement.Token, ALit_BDS, PERF_TOKEN_LENGTH) == 0) { BdsTime = Duration; - } else if (AsciiStrnCmp (Measurement.Token, ALit_SHELL, PERF_TOKEN_LENGTH) == 0) { - ShellTime = Duration; } } @@ -420,25 +499,17 @@ ProcessPhases( PrintToken (STRING_TOKEN (STR_DP_PHASE_BDSTO), ALit_BdsTO, ElapsedTime); } - // print SHELL phase duration time - // - if (ShellTime > 0) { - ElapsedTime = DivU64x32 ( - ShellTime, - (UINT32)TimerInfo.Frequency - ); - Total += ElapsedTime; - PrintToken (STRING_TOKEN (STR_DP_PHASE_DURATION), ALit_SHELL, ElapsedTime); - } - PrintToken (STRING_TOKEN (STR_DP_TOTAL_DURATION), Total); } -/** Gather and print Handle data. - * - * @param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display. - * - * @return Status from a call to gBS->LocateHandle(). +/** + Gather and print Handle data. + + @param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display. + + @retval EFI_SUCCESS The operation was successful. + @retval EFI_ABORTED The user aborts the operation. + @return Others from a call to gBS->LocateHandleBuffer(). **/ EFI_STATUS ProcessHandles( @@ -453,25 +524,18 @@ ProcessHandles( UINTN Index; UINTN LogEntryKey; UINTN Count; - UINTN Size; - EFI_HANDLE TempHandle; + UINTN HandleCount; EFI_STATUS Status; + EFI_STRING StringPtrUnknown; + StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_DRIVERS), NULL); PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER), - (StringPtr == NULL) ? ALit_UNKNOWN: StringPtr); - - Size = 0; - HandleBuffer = &TempHandle; - Status = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, &TempHandle); - if (Status == EFI_BUFFER_TOO_SMALL) { - HandleBuffer = AllocatePool (Size); - ASSERT (HandleBuffer != NULL); - if (HandleBuffer == NULL) { - return; - } - Status = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, HandleBuffer); - } + (StringPtr == NULL) ? StringPtrUnknown : StringPtr); + FreePool (StringPtr); + FreePool (StringPtrUnknown); + + Status = gBS->LocateHandleBuffer (AllHandles, NULL, NULL, &HandleCount, &HandleBuffer); if (EFI_ERROR (Status)) { PrintToken (STRING_TOKEN (STR_DP_HANDLES_ERROR), Status); } @@ -480,18 +544,23 @@ ProcessHandles( Print (L"There are %,d Handles defined.\n", (Size / sizeof(HandleBuffer[0]))); #endif - PrintToken (STRING_TOKEN (STR_DP_HANDLE_GUID) ); + if (mShowId) { + PrintToken (STRING_TOKEN (STR_DP_HANDLE_SECTION2) ); + } else { + PrintToken (STRING_TOKEN (STR_DP_HANDLE_SECTION) ); + } PrintToken (STRING_TOKEN (STR_DP_DASHES) ); LogEntryKey = 0; Count = 0; - while ((LogEntryKey = GetPerformanceMeasurement ( + while ((LogEntryKey = GetPerformanceMeasurementEx ( LogEntryKey, &Measurement.Handle, &Measurement.Token, &Measurement.Module, &Measurement.StartTimeStamp, - &Measurement.EndTimeStamp)) != 0) + &Measurement.EndTimeStamp, + &Measurement.Identifier)) != 0) { Count++; Duration = GetDuration (&Measurement); @@ -504,42 +573,61 @@ ProcessHandles( continue; } mGaugeString[0] = 0; // Empty driver name by default - AsciiStrToUnicodeStr (Measurement.Token, mUnicodeToken); + AsciiStrToUnicodeStrS (Measurement.Token, mUnicodeToken, ARRAY_SIZE (mUnicodeToken)); // See if the Handle is in the HandleBuffer - for (Index = 0; Index < (Size / sizeof(HandleBuffer[0])); Index++) { + for (Index = 0; Index < HandleCount; Index++) { if (Measurement.Handle == HandleBuffer[Index]) { GetNameFromHandle (HandleBuffer[Index]); // Name is put into mGaugeString break; } } // Ensure that the argument strings are not too long. - mGaugeString[31] = 0; - mUnicodeToken[18] = 0; + mGaugeString[DP_GAUGE_STRING_LENGTH] = 0; + mUnicodeToken[11] = 0; if (mGaugeString[0] != 0) { // Display the record if it has a valid handle. - PrintToken ( - STRING_TOKEN (STR_DP_HANDLE_VARS), - Count, // 1 based, Which measurement record is being printed - Index + 1, // 1 based, Which handle is being printed - mGaugeString, - mUnicodeToken, - ElapsedTime - ); + if (mShowId) { + PrintToken ( + STRING_TOKEN (STR_DP_HANDLE_VARS2), + Count, // 1 based, Which measurement record is being printed + Index + 1, // 1 based, Which handle is being printed + mGaugeString, + mUnicodeToken, + ElapsedTime, + Measurement.Identifier + ); + } else { + PrintToken ( + STRING_TOKEN (STR_DP_HANDLE_VARS), + Count, // 1 based, Which measurement record is being printed + Index + 1, // 1 based, Which handle is being printed + mGaugeString, + mUnicodeToken, + ElapsedTime + ); + } + } + if (ShellGetExecutionBreakFlag ()) { + Status = EFI_ABORTED; + break; } } } - if (HandleBuffer != &TempHandle) { + if (HandleBuffer != NULL) { FreePool (HandleBuffer); } return Status; } -/** Gather and print PEIM data. - * - * Only prints complete PEIM records - * +/** + Gather and print PEIM data. + + Only prints complete PEIM records + + @retval EFI_SUCCESS The operation was successful. + @retval EFI_ABORTED The user aborts the operation. **/ -VOID +EFI_STATUS ProcessPeims( VOID ) @@ -550,23 +638,34 @@ ProcessPeims( EFI_STRING StringPtr; UINTN LogEntryKey; UINTN TIndex; + EFI_STRING StringPtrUnknown; + EFI_STATUS Status; + Status = EFI_SUCCESS; + StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_PEIMS), NULL); PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER), - (StringPtr == NULL) ? ALit_UNKNOWN: StringPtr); - - PrintToken (STRING_TOKEN (STR_DP_PEIM_SECTION)); + (StringPtr == NULL) ? StringPtrUnknown : StringPtr); + FreePool (StringPtr); + FreePool (StringPtrUnknown); + + if (mShowId) { + PrintToken (STRING_TOKEN (STR_DP_PEIM_SECTION2)); + } else { + PrintToken (STRING_TOKEN (STR_DP_PEIM_SECTION)); + } PrintToken (STRING_TOKEN (STR_DP_DASHES)); TIndex = 0; LogEntryKey = 0; - while ((LogEntryKey = GetPerformanceMeasurement ( + while ((LogEntryKey = GetPerformanceMeasurementEx ( LogEntryKey, &Measurement.Handle, &Measurement.Token, &Measurement.Module, &Measurement.StartTimeStamp, - &Measurement.EndTimeStamp)) != 0) + &Measurement.EndTimeStamp, + &Measurement.Identifier)) != 0) { TIndex++; if ((Measurement.EndTimeStamp == 0) || @@ -578,27 +677,44 @@ ProcessPeims( Duration = GetDuration (&Measurement); ElapsedTime = DurationInMicroSeconds ( Duration ); // Calculate elapsed time in microseconds if (ElapsedTime >= mInterestThreshold) { - GetNameFromHandle ((EFI_HANDLE) Measurement.Handle); // Name placed in mGaugeString - PrintToken (STRING_TOKEN (STR_DP_PEIM_STAT2), - TIndex, // 1 based, Which measurement record is being printed - Measurement.Handle, - mGaugeString, - ElapsedTime - ); + // PEIM FILE Handle is the start address of its FFS file that contains its file guid. + if (mShowId) { + PrintToken (STRING_TOKEN (STR_DP_PEIM_VARS2), + TIndex, // 1 based, Which measurement record is being printed + Measurement.Handle, // base address + Measurement.Handle, // file guid + ElapsedTime, + Measurement.Identifier + ); + } else { + PrintToken (STRING_TOKEN (STR_DP_PEIM_VARS), + TIndex, // 1 based, Which measurement record is being printed + Measurement.Handle, // base address + Measurement.Handle, // file guid + ElapsedTime + ); + } + } + if (ShellGetExecutionBreakFlag ()) { + Status = EFI_ABORTED; + break; } } + return Status; } -/** Gather and print global data. - * - * Strips out incomplete or "Execution Phase" records - * Only prints records where Handle is NULL - * Increment TIndex for every record, even skipped ones, so that we have an - * indication of every measurement record taken. - * - * +/** + Gather and print global data. + + Strips out incomplete or "Execution Phase" records + Only prints records where Handle is NULL + Increment TIndex for every record, even skipped ones, so that we have an + indication of every measurement record taken. + + @retval EFI_SUCCESS The operation was successful. + @retval EFI_ABORTED The user aborts the operation. **/ -VOID +EFI_STATUS ProcessGlobal( VOID ) @@ -609,27 +725,41 @@ ProcessGlobal( EFI_STRING StringPtr; UINTN LogEntryKey; UINTN Index; // Index, or number, of the measurement record being processed + EFI_STRING StringPtrUnknown; + EFI_STATUS Status; + + Status = EFI_SUCCESS; + StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_GENERAL), NULL); PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER), - (StringPtr == NULL) ? ALit_UNKNOWN: StringPtr); - - PrintToken (STRING_TOKEN (STR_DP_GLOBAL_SECTION)); + (StringPtr == NULL) ? StringPtrUnknown: StringPtr); + FreePool (StringPtr); + FreePool (StringPtrUnknown); + + if (mShowId) { + PrintToken (STRING_TOKEN (STR_DP_GLOBAL_SECTION2)); + } else { + PrintToken (STRING_TOKEN (STR_DP_GLOBAL_SECTION)); + } PrintToken (STRING_TOKEN (STR_DP_DASHES)); Index = 1; LogEntryKey = 0; - while ((LogEntryKey = GetPerformanceMeasurement ( + while ((LogEntryKey = GetPerformanceMeasurementEx ( LogEntryKey, &Measurement.Handle, &Measurement.Token, &Measurement.Module, &Measurement.StartTimeStamp, - &Measurement.EndTimeStamp)) != 0) + &Measurement.EndTimeStamp, + &Measurement.Identifier)) != 0) { - AsciiStrToUnicodeStr (Measurement.Module, mGaugeString); - AsciiStrToUnicodeStr (Measurement.Token, mUnicodeToken); + AsciiStrToUnicodeStrS (Measurement.Module, mGaugeString, ARRAY_SIZE (mGaugeString)); + AsciiStrToUnicodeStrS (Measurement.Token, mUnicodeToken, ARRAY_SIZE (mUnicodeToken)); + mGaugeString[25] = 0; + mUnicodeToken[31] = 0; if ( ! ( IsPhase( &Measurement) || (Measurement.Handle != NULL) || (Measurement.EndTimeStamp == 0) @@ -638,54 +768,112 @@ ProcessGlobal( Duration = GetDuration (&Measurement); ElapsedTime = DurationInMicroSeconds ( Duration ); if (ElapsedTime >= mInterestThreshold) { - PrintToken ( - STRING_TOKEN (STR_DP_FOUR_VARS_2), - Index, - mGaugeString, - mUnicodeToken, - ElapsedTime - ); + if (mShowId) { + PrintToken ( + STRING_TOKEN (STR_DP_GLOBAL_VARS2), + Index, + mGaugeString, + mUnicodeToken, + ElapsedTime, + Measurement.Identifier + ); + } else { + PrintToken ( + STRING_TOKEN (STR_DP_GLOBAL_VARS), + Index, + mGaugeString, + mUnicodeToken, + ElapsedTime + ); + } } } + if (ShellGetExecutionBreakFlag ()) { + Status = EFI_ABORTED; + break; + } Index++; } + return Status; } -/** Gather and print cumulative data. - * - * Traverse the measurement records and:
- * For each record with a Token listed in the CumData array:
- * - Update the instance count and the total, minimum, and maximum durations. - * Finally, print the gathered cumulative statistics. - * +/** + Gather and print cumulative data. + + Traverse the measurement records and:
+ For each record with a Token listed in the CumData array:
+ - Update the instance count and the total, minimum, and maximum durations. + Finally, print the gathered cumulative statistics. + + @param[in] CustomCumulativeData A pointer to the cumtom cumulative data. + **/ VOID ProcessCumulative( - VOID -) + IN PERF_CUM_DATA *CustomCumulativeData OPTIONAL + ) { - UINT64 avgval; // the computed average duration + UINT64 AvgDur; // the computed average duration + UINT64 Dur; + UINT64 MinDur; + UINT64 MaxDur; EFI_STRING StringPtr; UINTN TIndex; + EFI_STRING StringPtrUnknown; - + StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_CUMULATIVE), NULL); PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER), - (StringPtr == NULL) ? ALit_UNKNOWN: StringPtr); + (StringPtr == NULL) ? StringPtrUnknown: StringPtr); + FreePool (StringPtr); + FreePool (StringPtrUnknown); PrintToken (STRING_TOKEN (STR_DP_CUMULATIVE_SECT_1)); PrintToken (STRING_TOKEN (STR_DP_CUMULATIVE_SECT_2)); PrintToken (STRING_TOKEN (STR_DP_DASHES)); for ( TIndex = 0; TIndex < NumCum; ++TIndex) { - avgval = DivU64x32 (CumData[TIndex].Duration, CumData[TIndex].Count); + if (CumData[TIndex].Count != 0) { + AvgDur = DivU64x32 (CumData[TIndex].Duration, CumData[TIndex].Count); + AvgDur = DurationInMicroSeconds(AvgDur); + Dur = DurationInMicroSeconds(CumData[TIndex].Duration); + MaxDur = DurationInMicroSeconds(CumData[TIndex].MaxDur); + MinDur = DurationInMicroSeconds(CumData[TIndex].MinDur); + + PrintToken (STRING_TOKEN (STR_DP_CUMULATIVE_STATS), + CumData[TIndex].Name, + CumData[TIndex].Count, + Dur, + AvgDur, + MinDur, + MaxDur + ); + } + } + + // + // Print the custom cumulative data. + // + if (CustomCumulativeData != NULL) { + if (CustomCumulativeData->Count != 0) { + AvgDur = DivU64x32 (CustomCumulativeData->Duration, CustomCumulativeData->Count); + AvgDur = DurationInMicroSeconds (AvgDur); + Dur = DurationInMicroSeconds (CustomCumulativeData->Duration); + MaxDur = DurationInMicroSeconds (CustomCumulativeData->MaxDur); + MinDur = DurationInMicroSeconds (CustomCumulativeData->MinDur); + } else { + AvgDur = 0; + Dur = 0; + MaxDur = 0; + MinDur = 0; + } PrintToken (STRING_TOKEN (STR_DP_CUMULATIVE_STATS), - CumData[TIndex].Name, - CumData[TIndex].Count, - DurationInMicroSeconds(CumData[TIndex].Duration), - DurationInMicroSeconds(avgval), - DurationInMicroSeconds(CumData[TIndex].MinDur), - DurationInMicroSeconds(CumData[TIndex].MaxDur) - ); + CustomCumulativeData->Name, + CustomCumulativeData->Count, + Dur, + AvgDur, + MinDur, + MaxDur + ); } }