X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=PerformancePkg%2FDp_App%2FDp.c;h=4cdc39edb42e75ccf0221839550df5fa9fab0f2b;hp=f5d0bda9f890f3371d471fef88410d3368fcf5ea;hb=9555c09717ee0b1ed4619942257c7b64aeb57f6e;hpb=c06ad33ed2fbbacdba42baf07f5d3fd41b36781d
diff --git a/PerformancePkg/Dp_App/Dp.c b/PerformancePkg/Dp_App/Dp.c
index f5d0bda9f8..4cdc39edb4 100644
--- a/PerformancePkg/Dp_App/Dp.c
+++ b/PerformancePkg/Dp_App/Dp.c
@@ -1,35 +1,37 @@
/** @file
- * Shell application for Displaying Performance Metrics.
- *
- * The Dp application reads performance data and presents it in several
- * different formats depending upon the needs of the user. Both
- * Trace and Measured Profiling information is processed and presented.
- *
- * Dp uses the "PerformanceLib" to read the measurement records.
- * The "TimerLib" provides information about the timer, such as frequency,
- * beginning, and ending counter values.
- * Measurement records contain identifying information (Handle, Token, Module)
- * and start and end time values.
- * Dp uses this information to group records in different ways. It also uses
- * timer information to calculate elapsed time for each measurement.
- *
- * 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.
+ Shell application for Displaying Performance Metrics.
+
+ The Dp application reads performance data and presents it in several
+ different formats depending upon the needs of the user. Both
+ Trace and Measured Profiling information is processed and presented.
+
+ Dp uses the "PerformanceLib" to read the measurement records.
+ The "TimerLib" provides information about the timer, such as frequency,
+ beginning, and ending counter values.
+ Measurement records contain identifying information (Handle, Token, Module)
+ and start and end time values.
+ Dp uses this information to group records in different ways. It also uses
+ timer information to calculate elapsed time for each measurement.
+
+ 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
+#include
#include
#include
#include
#include
-#include
#include
+#include
#include
#include
@@ -40,14 +42,26 @@
#include "Literals.h"
#include "DpInternal.h"
+//
+// String token ID of help message text.
+// Shell supports to find help message in the resource section of an application image if
+// .MAN file is not found. This global variable is added to make build tool recognizes
+// that the help string is consumed by user and then build tool will add the string into
+// the resource section. Thus the application can use '-?' option to show help message in
+// Shell.
+//
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_STRING_ID mDpStrEngHelpTokenId = STRING_TOKEN (STR_DP_HELP_INFORMATION);
+
//
/// Module-Global Variables
-/// @{
+///@{
EFI_HII_HANDLE gHiiHandle;
+SHELL_PARAM_ITEM *DpParamList = NULL;
CHAR16 *mPrintTokenBuffer = NULL;
-CHAR16 mGaugeString[DXE_PERFORMANCE_STRING_SIZE];
-CHAR16 mUnicodeToken[PERF_TOKEN_LENGTH + 1];
+CHAR16 mGaugeString[DP_GAUGE_STRING_LENGTH + 1];
+CHAR16 mUnicodeToken[DXE_PERFORMANCE_STRING_SIZE];
UINT64 mInterestThreshold;
+BOOLEAN mShowId = FALSE;
PERF_SUMMARY_DATA SummaryData = { 0 }; ///< Create the SummaryData structure and init. to ZERO.
@@ -65,27 +79,56 @@ PERF_CUM_DATA CumData[] = {
/// Number of items for which we are gathering cumulative statistics.
UINT32 const NumCum = sizeof(CumData) / sizeof(PERF_CUM_DATA);
-SHELL_PARAM_ITEM DpParamList[] = {
- {STR_DP_OPTION_QH, TypeFlag}, // -? Help
- {STR_DP_OPTION_LH, TypeFlag}, // -h Help
- {STR_DP_OPTION_UH, TypeFlag}, // -H Help
- {STR_DP_OPTION_LV, TypeFlag}, // -v Verbose Mode
- {STR_DP_OPTION_UA, TypeFlag}, // -A All, Cooked
- {STR_DP_OPTION_UR, TypeFlag}, // -R RAW All
- {STR_DP_OPTION_LS, TypeFlag}, // -s Summary
+PARAM_ITEM_LIST ParamList[] = {
+ {STRING_TOKEN (STR_DP_OPTION_QH), TypeFlag}, // -? Help
+ {STRING_TOKEN (STR_DP_OPTION_LH), TypeFlag}, // -h Help
+ {STRING_TOKEN (STR_DP_OPTION_UH), TypeFlag}, // -H Help
+ {STRING_TOKEN (STR_DP_OPTION_LV), TypeFlag}, // -v Verbose Mode
+ {STRING_TOKEN (STR_DP_OPTION_UA), TypeFlag}, // -A All, Cooked
+ {STRING_TOKEN (STR_DP_OPTION_UR), TypeFlag}, // -R RAW All
+ {STRING_TOKEN (STR_DP_OPTION_LS), TypeFlag}, // -s Summary
#if PROFILING_IMPLEMENTED
- {STR_DP_OPTION_UP, TypeFlag}, // -P Dump Profile Data
- {STR_DP_OPTION_UT, TypeFlag}, // -T Dump Trace Data
+ {STRING_TOKEN (STR_DP_OPTION_UP), TypeFlag}, // -P Dump Profile Data
+ {STRING_TOKEN (STR_DP_OPTION_UT), TypeFlag}, // -T Dump Trace Data
#endif
- {STR_DP_OPTION_LX, TypeFlag}, // -x eXclude Cumulative Items
- {STR_DP_OPTION_LN, TypeValue}, // -n # Number of records to display for A and R
- {STR_DP_OPTION_LT, TypeValue}, // -t # Threshold of interest
- {NULL, TypeMax}
+ {STRING_TOKEN (STR_DP_OPTION_LX), TypeFlag}, // -x eXclude Cumulative Items
+ {STRING_TOKEN (STR_DP_OPTION_LI), TypeFlag}, // -i Display Identifier
+ {STRING_TOKEN (STR_DP_OPTION_LC), TypeValue}, // -c Display cumulative data.
+ {STRING_TOKEN (STR_DP_OPTION_LN), TypeValue}, // -n # Number of records to display for A and R
+ {STRING_TOKEN (STR_DP_OPTION_LT), TypeValue} // -t # Threshold of interest
};
-/// @}
+///@}
+
+/**
+ Transfer the param list value and get the command line parse.
+
+**/
+VOID
+InitialShellParamList( void )
+{
+ UINT32 ListIndex;
+ UINT32 ListLength;
+
+ //
+ // Allocate one more for the end tag.
+ //
+ ListLength = ARRAY_SIZE (ParamList) + 1;
+ DpParamList = AllocatePool (sizeof (SHELL_PARAM_ITEM) * ListLength);
+ ASSERT (DpParamList != NULL);
+
+ for (ListIndex = 0; ListIndex < ListLength - 1; ListIndex ++)
+ {
+ DpParamList[ListIndex].Name = HiiGetString (gHiiHandle, ParamList[ListIndex].Token, NULL);
+ DpParamList[ListIndex].Type = ParamList[ListIndex].Type;
+ }
+ DpParamList[ListIndex].Name = NULL;
+ DpParamList[ListIndex].Type = TypeMax;
+}
-/// Display Usage and Help information.
+/**
+ Display Usage and Help information.
+**/
VOID
ShowHelp( void )
{
@@ -107,19 +150,24 @@ ShowHelp( void )
#endif // PROFILING_IMPLEMENTED
PrintToken (STRING_TOKEN (STR_DP_HELP_THRESHOLD));
PrintToken (STRING_TOKEN (STR_DP_HELP_COUNT));
+ PrintToken (STRING_TOKEN (STR_DP_HELP_ID));
+ PrintToken (STRING_TOKEN (STR_DP_HELP_CUM_DATA));
PrintToken (STRING_TOKEN (STR_DP_HELP_HELP));
Print(L"\n");
}
-/// Display the trailing Verbose information.
+/**
+ Display the trailing Verbose information.
+**/
VOID
DumpStatistics( void )
{
EFI_STRING StringPtr;
-
- StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_STATISTICS), NULL);
+ EFI_STRING StringPtrUnknown;
+ StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_STATISTICS), NULL);
+ StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL);
PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER),
- (StringPtr == NULL) ? ALit_UNKNOWN: StringPtr);
+ (StringPtr == NULL) ? StringPtrUnknown : StringPtr);
PrintToken( STRING_TOKEN (STR_DP_STATS_NUMTRACE), SummaryData.NumTrace);
PrintToken( STRING_TOKEN (STR_DP_STATS_NUMINCOMPLETE), SummaryData.NumIncomplete);
@@ -130,17 +178,20 @@ DumpStatistics( void )
#if PROFILING_IMPLEMENTED
PrintToken( STRING_TOKEN (STR_DP_STATS_NUMPROFILE), SummaryData.NumProfile);
#endif // PROFILING_IMPLEMENTED
+ FreePool (StringPtr);
+ FreePool (StringPtrUnknown);
}
-/** Dump performance data.
- *
- * @param[in] ImageHandle The image handle.
- * @param[in] SystemTable The system table.
- *
- * @retval EFI_SUCCESS Command completed successfully.
- * @retval EFI_INVALID_PARAMETER Command usage error.
- * @retval value Unknown error.
- *
+/**
+ Dump performance data.
+
+ @param[in] ImageHandle The image handle.
+ @param[in] SystemTable The system table.
+
+ @retval EFI_SUCCESS Command completed successfully.
+ @retval EFI_INVALID_PARAMETER Command usage error.
+ @retval EFI_ABORTED The user aborts the operation.
+ @retval value Unknown error.
**/
EFI_STATUS
EFIAPI
@@ -149,34 +200,105 @@ InitializeDp (
IN EFI_SYSTEM_TABLE *SystemTable
)
{
- UINT64 Freq;
- UINT64 Ticker;
+ PERFORMANCE_PROPERTY *PerformanceProperty;
+ UINT32 ListIndex;
- LIST_ENTRY *ParamPackage;
- CONST CHAR16 *CmdLineArg;
- EFI_STRING StringPtr;
- UINTN Number2Display;
+ LIST_ENTRY *ParamPackage;
+ CONST CHAR16 *CmdLineArg;
+ EFI_STRING StringPtr;
+ UINTN Number2Display;
+
+ EFI_STATUS Status;
+ BOOLEAN SummaryMode;
+ BOOLEAN VerboseMode;
+ BOOLEAN AllMode;
+ BOOLEAN RawMode;
+ BOOLEAN TraceMode;
+ BOOLEAN ProfileMode;
+ BOOLEAN ExcludeMode;
+ BOOLEAN CumulativeMode;
+ CONST CHAR16 *CustomCumulativeToken;
+ PERF_CUM_DATA *CustomCumulativeData;
+ UINTN NameSize;
+ EFI_HII_PACKAGE_LIST_HEADER *PackageList;
- EFI_STATUS Status;
- BOOLEAN SummaryMode = FALSE;
- BOOLEAN VerboseMode = FALSE;
- BOOLEAN AllMode = FALSE;
- BOOLEAN RawMode = FALSE;
- BOOLEAN TraceMode = FALSE;
- BOOLEAN ProfileMode = FALSE;
- BOOLEAN ExcludeMode = FALSE;
+ EFI_STRING StringDpOptionQh;
+ EFI_STRING StringDpOptionLh;
+ EFI_STRING StringDpOptionUh;
+ EFI_STRING StringDpOptionLv;
+ EFI_STRING StringDpOptionUs;
+ EFI_STRING StringDpOptionLs;
+ EFI_STRING StringDpOptionUa;
+ EFI_STRING StringDpOptionUr;
+ EFI_STRING StringDpOptionUt;
+ EFI_STRING StringDpOptionUp;
+ EFI_STRING StringDpOptionLx;
+ EFI_STRING StringDpOptionLn;
+ EFI_STRING StringDpOptionLt;
+ EFI_STRING StringDpOptionLi;
+ EFI_STRING StringDpOptionLc;
+
+ SummaryMode = FALSE;
+ VerboseMode = FALSE;
+ AllMode = FALSE;
+ RawMode = FALSE;
+ TraceMode = FALSE;
+ ProfileMode = FALSE;
+ ExcludeMode = FALSE;
+ CumulativeMode = FALSE;
+ CustomCumulativeData = NULL;
+ StringDpOptionQh = NULL;
+ StringDpOptionLh = NULL;
+ StringDpOptionUh = NULL;
+ StringDpOptionLv = NULL;
+ StringDpOptionUs = NULL;
+ StringDpOptionLs = NULL;
+ StringDpOptionUa = NULL;
+ StringDpOptionUr = NULL;
+ StringDpOptionUt = NULL;
+ StringDpOptionUp = NULL;
+ StringDpOptionLx = NULL;
+ StringDpOptionLn = NULL;
+ StringDpOptionLt = NULL;
+ StringDpOptionLi = NULL;
+ StringDpOptionLc = NULL;
+ StringPtr = NULL;
- // Get DP's entry time as soon as possible.
- // This is used as the Shell-Phase end time.
//
- Ticker = GetPerformanceCounter ();
+ // Retrieve HII package list from ImageHandle
+ //
+ Status = gBS->OpenProtocol (
+ ImageHandle,
+ &gEfiHiiPackageListProtocolGuid,
+ (VOID **) &PackageList,
+ ImageHandle,
+ NULL,
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
- // Register our string package with HII and return the handle to it.
//
- gHiiHandle = HiiAddPackages (&gEfiCallerIdGuid, ImageHandle, DPStrings, NULL);
+ // Publish HII package list to HII Database.
+ //
+ Status = gHiiDatabase->NewPackageList (
+ gHiiDatabase,
+ PackageList,
+ NULL,
+ &gHiiHandle
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
ASSERT (gHiiHandle != NULL);
+
+ // Initial the command list
+ //
+ InitialShellParamList ();
+
/****************************************************************************
**** Process Command Line arguments ****
****************************************************************************/
@@ -187,27 +309,47 @@ InitializeDp (
ShowHelp();
}
else {
- if (ShellCommandLineGetFlag (ParamPackage, STR_DP_OPTION_QH) ||
- ShellCommandLineGetFlag (ParamPackage, STR_DP_OPTION_LH) ||
- ShellCommandLineGetFlag (ParamPackage, STR_DP_OPTION_UH))
+ StringDpOptionQh = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_QH), NULL);
+ StringDpOptionLh = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LH), NULL);
+ StringDpOptionUh = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_UH), NULL);
+
+ if (ShellCommandLineGetFlag (ParamPackage, StringDpOptionQh) ||
+ ShellCommandLineGetFlag (ParamPackage, StringDpOptionLh) ||
+ ShellCommandLineGetFlag (ParamPackage, StringDpOptionUh))
{
ShowHelp();
}
else {
+ StringDpOptionLv = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LV), NULL);
+ StringDpOptionUs = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_US), NULL);
+ StringDpOptionLs = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LS), NULL);
+ StringDpOptionUa = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_UA), NULL);
+ StringDpOptionUr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_UR), NULL);
+ StringDpOptionUt = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_UT), NULL);
+ StringDpOptionUp = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_UP), NULL);
+ StringDpOptionLx = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LX), NULL);
+ StringDpOptionLn = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LN), NULL);
+ StringDpOptionLt = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LT), NULL);
+ StringDpOptionLi = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LI), NULL);
+ StringDpOptionLc = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LC), NULL);
+
// Boolean Options
- VerboseMode = (ShellCommandLineGetFlag (ParamPackage, STR_DP_OPTION_LV));
- SummaryMode = (ShellCommandLineGetFlag (ParamPackage, STR_DP_OPTION_US) ||
- ShellCommandLineGetFlag (ParamPackage, STR_DP_OPTION_LS));
- AllMode = (ShellCommandLineGetFlag (ParamPackage, STR_DP_OPTION_UA));
- RawMode = (ShellCommandLineGetFlag (ParamPackage, STR_DP_OPTION_UR));
+ //
+ VerboseMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLv);
+ SummaryMode = (BOOLEAN) (ShellCommandLineGetFlag (ParamPackage, StringDpOptionUs) ||
+ ShellCommandLineGetFlag (ParamPackage, StringDpOptionLs));
+ AllMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionUa);
+ RawMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionUr);
#if PROFILING_IMPLEMENTED
- TraceMode = (ShellCommandLineGetFlag (ParamPackage, STR_DP_OPTION_UT));
- ProfileMode = (ShellCommandLineGetFlag (ParamPackage, STR_DP_OPTION_UP));
+ TraceMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionUt);
+ ProfileMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionUp);
#endif // PROFILING_IMPLEMENTED
- ExcludeMode = (ShellCommandLineGetFlag (ParamPackage, STR_DP_OPTION_LX));
+ ExcludeMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLx);
+ mShowId = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLi);
+ CumulativeMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLc);
// Options with Values
- CmdLineArg = ( ShellCommandLineGetValue (ParamPackage, STR_DP_OPTION_LN));
+ CmdLineArg = ShellCommandLineGetValue (ParamPackage, StringDpOptionLn);
if (CmdLineArg == NULL) {
Number2Display = DEFAULT_DISPLAYCOUNT;
}
@@ -217,7 +359,7 @@ InitializeDp (
Number2Display = MAXIMUM_DISPLAYCOUNT;
}
}
- CmdLineArg = (ShellCommandLineGetValue (ParamPackage, STR_DP_OPTION_LT));
+ CmdLineArg = ShellCommandLineGetValue (ParamPackage, StringDpOptionLt);
if (CmdLineArg == NULL) {
mInterestThreshold = DEFAULT_THRESHOLD; // 1ms := 1,000 us
}
@@ -233,6 +375,22 @@ InitializeDp (
#endif // PROFILING_IMPLEMENTED
}
+ //
+ // Init the custom cumulative data.
+ //
+ CustomCumulativeToken = ShellCommandLineGetValue (ParamPackage, StringDpOptionLc);
+ if (CustomCumulativeToken != NULL) {
+ CustomCumulativeData = AllocateZeroPool (sizeof (PERF_CUM_DATA));
+ ASSERT (CustomCumulativeData != NULL);
+ CustomCumulativeData->MinDur = 0;
+ CustomCumulativeData->MaxDur = 0;
+ CustomCumulativeData->Count = 0;
+ CustomCumulativeData->Duration = 0;
+ NameSize = StrLen (CustomCumulativeToken) + 1;
+ CustomCumulativeData->Name = AllocateZeroPool (NameSize);
+ UnicodeStrToAsciiStrS (CustomCumulativeToken, CustomCumulativeData->Name, NameSize);
+ }
+
/****************************************************************************
**** Timer specific processing ****
****************************************************************************/
@@ -241,10 +399,16 @@ InitializeDp (
// StartCount = Value loaded into the counter when it starts counting
// EndCount = Value counter counts to before it needs to be reset
//
- Freq = GetPerformanceCounterProperties (&TimerInfo.StartCount, &TimerInfo.EndCount);
+ Status = EfiGetSystemConfigurationTable (&gPerformanceProtocolGuid, (VOID **) &PerformanceProperty);
+ if (EFI_ERROR (Status) || (PerformanceProperty == NULL)) {
+ PrintToken (STRING_TOKEN (STR_PERF_PROPERTY_NOT_FOUND));
+ goto Done;
+ }
// Convert the Frequency from Hz to KHz
- TimerInfo.Frequency = (UINT32)DivU64x32 (Freq, 1000);
+ TimerInfo.Frequency = (UINT32)DivU64x32 (PerformanceProperty->Frequency, 1000);
+ TimerInfo.StartCount = PerformanceProperty->TimerStartValue;
+ TimerInfo.EndCount = PerformanceProperty->TimerEndValue;
// Determine in which direction the performance counter counts.
TimerInfo.CountUp = (BOOLEAN) (TimerInfo.EndCount >= TimerInfo.StartCount);
@@ -262,7 +426,7 @@ InitializeDp (
(! RawMode)
) {
StringPtr = HiiGetString (gHiiHandle,
- TimerInfo.CountUp ? STRING_TOKEN (STR_DP_UP) : STRING_TOKEN (STR_DP_DOWN),
+ (EFI_STRING_ID) (TimerInfo.CountUp ? STRING_TOKEN (STR_DP_UP) : STRING_TOKEN (STR_DP_DOWN)),
NULL);
ASSERT (StringPtr != NULL);
PrintToken (STRING_TOKEN (STR_DP_TIMER_PROPERTIES), // Print Timer count range and direction
@@ -294,10 +458,15 @@ InitializeDp (
**** !T && P := (2) Only Profile records are displayed
**** T && P := (3) Same as Default, both are displayed
****************************************************************************/
- GatherStatistics();
- if (AllMode) {
+ GatherStatistics (CustomCumulativeData);
+ if (CumulativeMode) {
+ ProcessCumulative (CustomCumulativeData);
+ } else if (AllMode) {
if (TraceMode) {
- DumpAllTrace( Number2Display, ExcludeMode);
+ Status = DumpAllTrace( Number2Display, ExcludeMode);
+ if (Status == EFI_ABORTED) {
+ goto Done;
+ }
}
if (ProfileMode) {
DumpAllProfile( Number2Display, ExcludeMode);
@@ -305,7 +474,10 @@ InitializeDp (
}
else if (RawMode) {
if (TraceMode) {
- DumpRawTrace( Number2Display, ExcludeMode);
+ Status = DumpRawTrace( Number2Display, ExcludeMode);
+ if (Status == EFI_ABORTED) {
+ goto Done;
+ }
}
if (ProfileMode) {
DumpRawProfile( Number2Display, ExcludeMode);
@@ -314,14 +486,24 @@ InitializeDp (
else {
//------------- Begin Cooked Mode Processing
if (TraceMode) {
- ProcessPhases ( Ticker );
+ ProcessPhases ();
if ( ! SummaryMode) {
Status = ProcessHandles ( ExcludeMode);
- if ( ! EFI_ERROR( Status)) {
- ProcessPeims ( );
- ProcessGlobal ( );
- ProcessCumulative ();
+ if (Status == EFI_ABORTED) {
+ goto Done;
}
+
+ Status = ProcessPeims ();
+ if (Status == EFI_ABORTED) {
+ goto Done;
+ }
+
+ Status = ProcessGlobal ();
+ if (Status == EFI_ABORTED) {
+ goto Done;
+ }
+
+ ProcessCumulative (NULL);
}
}
if (ProfileMode) {
@@ -333,7 +515,45 @@ InitializeDp (
}
}
}
- (void) FreePool (mPrintTokenBuffer);
+
+Done:
+
+ //
+ // Free the memory allocate from HiiGetString
+ //
+ ListIndex = 0;
+ while (DpParamList[ListIndex].Name != NULL) {
+ FreePool (DpParamList[ListIndex].Name);
+ ListIndex ++;
+ }
+ FreePool (DpParamList);
+
+ SafeFreePool (StringDpOptionQh);
+ SafeFreePool (StringDpOptionLh);
+ SafeFreePool (StringDpOptionUh);
+ SafeFreePool (StringDpOptionLv);
+ SafeFreePool (StringDpOptionUs);
+ SafeFreePool (StringDpOptionLs);
+ SafeFreePool (StringDpOptionUa);
+ SafeFreePool (StringDpOptionUr);
+ SafeFreePool (StringDpOptionUt);
+ SafeFreePool (StringDpOptionUp);
+ SafeFreePool (StringDpOptionLx);
+ SafeFreePool (StringDpOptionLn);
+ SafeFreePool (StringDpOptionLt);
+ SafeFreePool (StringDpOptionLi);
+ SafeFreePool (StringDpOptionLc);
+ SafeFreePool (StringPtr);
+ SafeFreePool (mPrintTokenBuffer);
+
+ if (ParamPackage != NULL) {
+ ShellCommandLineFreeVarList (ParamPackage);
+ }
+ if (CustomCumulativeData != NULL) {
+ SafeFreePool (CustomCumulativeData->Name);
+ }
+ SafeFreePool (CustomCumulativeData);
+
HiiRemovePackages (gHiiHandle);
return Status;
}