]> git.proxmox.com Git - mirror_edk2.git/blame - PerformancePkg/Dp_App/Dp.c
ShellPkg : Cache the environment variable into memory to enhance
[mirror_edk2.git] / PerformancePkg / Dp_App / Dp.c
CommitLineData
c06ad33e 1/** @file\r
86da563d
ED
2 Shell application for Displaying Performance Metrics.\r
3\r
4 The Dp application reads performance data and presents it in several\r
5 different formats depending upon the needs of the user. Both\r
6 Trace and Measured Profiling information is processed and presented.\r
7\r
8 Dp uses the "PerformanceLib" to read the measurement records.\r
9 The "TimerLib" provides information about the timer, such as frequency,\r
10 beginning, and ending counter values.\r
11 Measurement records contain identifying information (Handle, Token, Module)\r
12 and start and end time values.\r
13 Dp uses this information to group records in different ways. It also uses\r
14 timer information to calculate elapsed time for each measurement.\r
15 \r
c4ace582 16 Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>\r
3e9de670 17 (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>\r
86da563d
ED
18 This program and the accompanying materials\r
19 are licensed and made available under the terms and conditions of the BSD License\r
20 which accompanies this distribution. The full text of the license may be found at\r
21 http://opensource.org/licenses/bsd-license.php\r
22 \r
23 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
24 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
c06ad33e 25**/\r
26\r
27#include <Library/UefiApplicationEntryPoint.h>\r
28#include <Library/ShellLib.h>\r
29#include <Library/BaseLib.h>\r
30#include <Library/MemoryAllocationLib.h>\r
31#include <Library/DebugLib.h>\r
32#include <Library/TimerLib.h>\r
33#include <Library/UefiLib.h>\r
34#include <Library/HiiLib.h>\r
35#include <Library/PcdLib.h>\r
36\r
37#include <Guid/Performance.h>\r
38\r
39#include <PerformanceTokens.h>\r
40#include "Dp.h"\r
41#include "Literals.h"\r
42#include "DpInternal.h"\r
43\r
44//\r
45/// Module-Global Variables\r
9dd74618 46///@{\r
c06ad33e 47EFI_HII_HANDLE gHiiHandle;\r
88359546 48SHELL_PARAM_ITEM *DpParamList = NULL;\r
c06ad33e 49CHAR16 *mPrintTokenBuffer = NULL;\r
a2daf8db
SZ
50CHAR16 mGaugeString[DP_GAUGE_STRING_LENGTH + 1];\r
51CHAR16 mUnicodeToken[DXE_PERFORMANCE_STRING_SIZE];\r
c06ad33e 52UINT64 mInterestThreshold;\r
0b84f444 53BOOLEAN mShowId = FALSE;\r
c06ad33e 54\r
55PERF_SUMMARY_DATA SummaryData = { 0 }; ///< Create the SummaryData structure and init. to ZERO.\r
56\r
57/// Timer Specific Information.\r
58TIMER_INFO TimerInfo;\r
59\r
60/// Items for which to gather cumulative statistics.\r
61PERF_CUM_DATA CumData[] = {\r
62 PERF_INIT_CUM_DATA (LOAD_IMAGE_TOK),\r
63 PERF_INIT_CUM_DATA (START_IMAGE_TOK),\r
64 PERF_INIT_CUM_DATA (DRIVERBINDING_START_TOK),\r
65 PERF_INIT_CUM_DATA (DRIVERBINDING_SUPPORT_TOK)\r
66};\r
67\r
68/// Number of items for which we are gathering cumulative statistics.\r
69UINT32 const NumCum = sizeof(CumData) / sizeof(PERF_CUM_DATA);\r
70\r
88359546
ED
71PARAM_ITEM_LIST ParamList[] = {\r
72 {STRING_TOKEN (STR_DP_OPTION_QH), TypeFlag}, // -? Help\r
73 {STRING_TOKEN (STR_DP_OPTION_LH), TypeFlag}, // -h Help\r
74 {STRING_TOKEN (STR_DP_OPTION_UH), TypeFlag}, // -H Help\r
75 {STRING_TOKEN (STR_DP_OPTION_LV), TypeFlag}, // -v Verbose Mode\r
76 {STRING_TOKEN (STR_DP_OPTION_UA), TypeFlag}, // -A All, Cooked\r
77 {STRING_TOKEN (STR_DP_OPTION_UR), TypeFlag}, // -R RAW All\r
78 {STRING_TOKEN (STR_DP_OPTION_LS), TypeFlag}, // -s Summary\r
c06ad33e 79#if PROFILING_IMPLEMENTED\r
88359546
ED
80 {STRING_TOKEN (STR_DP_OPTION_UP), TypeFlag}, // -P Dump Profile Data\r
81 {STRING_TOKEN (STR_DP_OPTION_UT), TypeFlag}, // -T Dump Trace Data\r
c06ad33e 82#endif\r
88359546 83 {STRING_TOKEN (STR_DP_OPTION_LX), TypeFlag}, // -x eXclude Cumulative Items\r
0b84f444 84 {STRING_TOKEN (STR_DP_OPTION_LI), TypeFlag}, // -i Display Identifier\r
d28f77df 85 {STRING_TOKEN (STR_DP_OPTION_LC), TypeValue}, // -c Display cumulative data.\r
88359546
ED
86 {STRING_TOKEN (STR_DP_OPTION_LN), TypeValue}, // -n # Number of records to display for A and R\r
87 {STRING_TOKEN (STR_DP_OPTION_LT), TypeValue} // -t # Threshold of interest\r
c06ad33e 88 };\r
89\r
9dd74618 90///@}\r
c06ad33e 91\r
88359546
ED
92/**\r
93 Transfer the param list value and get the command line parse.\r
94\r
95**/\r
96VOID\r
97InitialShellParamList( void )\r
98{\r
99 UINT32 ListIndex;\r
100 UINT32 ListLength; \r
101\r
102 //\r
103 // Allocate one more for the end tag.\r
104 //\r
105 ListLength = sizeof (ParamList) / sizeof (ParamList[0]) + 1; \r
106 DpParamList = AllocatePool (sizeof (SHELL_PARAM_ITEM) * ListLength);\r
107 ASSERT (DpParamList != NULL);\r
108 \r
109 for (ListIndex = 0; ListIndex < ListLength - 1; ListIndex ++)\r
110 { \r
111 DpParamList[ListIndex].Name = HiiGetString (gHiiHandle, ParamList[ListIndex].Token, NULL); \r
112 DpParamList[ListIndex].Type = ParamList[ListIndex].Type;\r
113 }\r
114 DpParamList[ListIndex].Name = NULL;\r
115 DpParamList[ListIndex].Type = TypeMax;\r
116}\r
117\r
9dd74618
ED
118/**\r
119 Display Usage and Help information.\r
120**/\r
c06ad33e 121VOID\r
122ShowHelp( void )\r
123{\r
124 PrintToken (STRING_TOKEN (STR_DP_HELP_HEAD));\r
125#if PROFILING_IMPLEMENTED\r
126 PrintToken (STRING_TOKEN (STR_DP_HELP_FLAGS));\r
127#else\r
128 PrintToken (STRING_TOKEN (STR_DP_HELP_FLAGS_2));\r
129#endif // PROFILING_IMPLEMENTED\r
130 PrintToken (STRING_TOKEN (STR_DP_HELP_PAGINATE));\r
131 PrintToken (STRING_TOKEN (STR_DP_HELP_VERBOSE));\r
132 PrintToken (STRING_TOKEN (STR_DP_HELP_EXCLUDE));\r
133 PrintToken (STRING_TOKEN (STR_DP_HELP_STAT));\r
134 PrintToken (STRING_TOKEN (STR_DP_HELP_ALL));\r
135 PrintToken (STRING_TOKEN (STR_DP_HELP_RAW));\r
136#if PROFILING_IMPLEMENTED\r
137 PrintToken (STRING_TOKEN (STR_DP_HELP_TRACE));\r
138 PrintToken (STRING_TOKEN (STR_DP_HELP_PROFILE));\r
139#endif // PROFILING_IMPLEMENTED\r
140 PrintToken (STRING_TOKEN (STR_DP_HELP_THRESHOLD));\r
141 PrintToken (STRING_TOKEN (STR_DP_HELP_COUNT));\r
0b84f444 142 PrintToken (STRING_TOKEN (STR_DP_HELP_ID));\r
d28f77df 143 PrintToken (STRING_TOKEN (STR_DP_HELP_CUM_DATA));\r
c06ad33e 144 PrintToken (STRING_TOKEN (STR_DP_HELP_HELP));\r
145 Print(L"\n");\r
146}\r
147\r
9dd74618
ED
148/**\r
149 Display the trailing Verbose information.\r
150**/\r
c06ad33e 151VOID\r
152DumpStatistics( void )\r
153{\r
154 EFI_STRING StringPtr;\r
88359546
ED
155 EFI_STRING StringPtrUnknown;\r
156 StringPtr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_SECTION_STATISTICS), NULL);\r
157 StringPtrUnknown = HiiGetString (gHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); \r
c06ad33e 158 PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER),\r
88359546 159 (StringPtr == NULL) ? StringPtrUnknown : StringPtr);\r
c06ad33e 160\r
161 PrintToken( STRING_TOKEN (STR_DP_STATS_NUMTRACE), SummaryData.NumTrace);\r
162 PrintToken( STRING_TOKEN (STR_DP_STATS_NUMINCOMPLETE), SummaryData.NumIncomplete);\r
163 PrintToken( STRING_TOKEN (STR_DP_STATS_NUMPHASES), SummaryData.NumSummary);\r
164 PrintToken( STRING_TOKEN (STR_DP_STATS_NUMHANDLES), SummaryData.NumHandles, SummaryData.NumTrace - SummaryData.NumHandles);\r
165 PrintToken( STRING_TOKEN (STR_DP_STATS_NUMPEIMS), SummaryData.NumPEIMs);\r
166 PrintToken( STRING_TOKEN (STR_DP_STATS_NUMGLOBALS), SummaryData.NumGlobal);\r
167#if PROFILING_IMPLEMENTED\r
168 PrintToken( STRING_TOKEN (STR_DP_STATS_NUMPROFILE), SummaryData.NumProfile);\r
169#endif // PROFILING_IMPLEMENTED\r
88359546
ED
170 FreePool (StringPtr);\r
171 FreePool (StringPtrUnknown);\r
c06ad33e 172}\r
173\r
d28f77df
CS
174/**\r
175 Initialize the cumulative data.\r
176\r
177**/\r
178VOID\r
179InitCumulativeData (\r
180 VOID\r
181 )\r
182{\r
183 UINTN Index;\r
184\r
185 for (Index = 0; Index < NumCum; ++Index) {\r
186 CumData[Index].Count = 0;\r
187 CumData[Index].MinDur = PERF_MAXDUR;\r
188 CumData[Index].MaxDur = 0;\r
189 CumData[Index].Duration = 0;\r
190 }\r
191}\r
192\r
193/**\r
9dd74618
ED
194 Dump performance data.\r
195 \r
196 @param[in] ImageHandle The image handle.\r
197 @param[in] SystemTable The system table.\r
3e9de670 198\r
9dd74618
ED
199 @retval EFI_SUCCESS Command completed successfully.\r
200 @retval EFI_INVALID_PARAMETER Command usage error.\r
3e9de670 201 @retval EFI_ABORTED The user aborts the operation.\r
9dd74618 202 @retval value Unknown error.\r
c06ad33e 203**/\r
204EFI_STATUS\r
205EFIAPI\r
206InitializeDp (\r
207 IN EFI_HANDLE ImageHandle,\r
208 IN EFI_SYSTEM_TABLE *SystemTable\r
209 )\r
210{\r
211 UINT64 Freq;\r
212 UINT64 Ticker;\r
88359546
ED
213 UINT32 ListIndex;\r
214 \r
c06ad33e 215 LIST_ENTRY *ParamPackage;\r
216 CONST CHAR16 *CmdLineArg;\r
217 EFI_STRING StringPtr;\r
218 UINTN Number2Display;\r
219\r
220 EFI_STATUS Status;\r
9dd74618
ED
221 BOOLEAN SummaryMode;\r
222 BOOLEAN VerboseMode;\r
223 BOOLEAN AllMode;\r
224 BOOLEAN RawMode;\r
225 BOOLEAN TraceMode;\r
226 BOOLEAN ProfileMode;\r
227 BOOLEAN ExcludeMode;\r
d28f77df
CS
228 BOOLEAN CumulativeMode;\r
229 CONST CHAR16 *CustomCumulativeToken;\r
230 PERF_CUM_DATA *CustomCumulativeData;\r
9dd74618 231\r
88359546
ED
232 EFI_STRING StringDpOptionQh;\r
233 EFI_STRING StringDpOptionLh;\r
234 EFI_STRING StringDpOptionUh;\r
235 EFI_STRING StringDpOptionLv;\r
236 EFI_STRING StringDpOptionUs;\r
237 EFI_STRING StringDpOptionLs;\r
238 EFI_STRING StringDpOptionUa;\r
239 EFI_STRING StringDpOptionUr;\r
240 EFI_STRING StringDpOptionUt;\r
241 EFI_STRING StringDpOptionUp;\r
242 EFI_STRING StringDpOptionLx;\r
243 EFI_STRING StringDpOptionLn;\r
244 EFI_STRING StringDpOptionLt;\r
0b84f444 245 EFI_STRING StringDpOptionLi;\r
d28f77df 246 EFI_STRING StringDpOptionLc;\r
88359546 247 \r
9dd74618
ED
248 SummaryMode = FALSE;\r
249 VerboseMode = FALSE;\r
250 AllMode = FALSE;\r
251 RawMode = FALSE;\r
252 TraceMode = FALSE;\r
253 ProfileMode = FALSE;\r
254 ExcludeMode = FALSE;\r
d28f77df
CS
255 CumulativeMode = FALSE;\r
256 CustomCumulativeData = NULL;\r
88359546
ED
257\r
258 StringDpOptionQh = NULL;\r
259 StringDpOptionLh = NULL;\r
260 StringDpOptionUh = NULL;\r
261 StringDpOptionLv = NULL;\r
262 StringDpOptionUs = NULL;\r
263 StringDpOptionLs = NULL;\r
264 StringDpOptionUa = NULL;\r
265 StringDpOptionUr = NULL;\r
266 StringDpOptionUt = NULL;\r
267 StringDpOptionUp = NULL;\r
268 StringDpOptionLx = NULL;\r
269 StringDpOptionLn = NULL;\r
270 StringDpOptionLt = NULL;\r
0b84f444 271 StringDpOptionLi = NULL;\r
d28f77df 272 StringDpOptionLc = NULL;\r
88359546
ED
273 StringPtr = NULL;\r
274\r
c06ad33e 275 // Get DP's entry time as soon as possible.\r
276 // This is used as the Shell-Phase end time.\r
277 //\r
278 Ticker = GetPerformanceCounter ();\r
279\r
280 // Register our string package with HII and return the handle to it.\r
281 //\r
282 gHiiHandle = HiiAddPackages (&gEfiCallerIdGuid, ImageHandle, DPStrings, NULL);\r
283 ASSERT (gHiiHandle != NULL);\r
284\r
88359546
ED
285 // Initial the command list\r
286 //\r
287 InitialShellParamList ();\r
288 \r
c06ad33e 289/****************************************************************************\r
290**** Process Command Line arguments ****\r
291****************************************************************************/\r
292 Status = ShellCommandLineParse (DpParamList, &ParamPackage, NULL, TRUE);\r
293\r
294 if (EFI_ERROR(Status)) {\r
295 PrintToken (STRING_TOKEN (STR_DP_INVALID_ARG));\r
296 ShowHelp();\r
297 }\r
298 else {\r
88359546
ED
299 StringDpOptionQh = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_QH), NULL);\r
300 StringDpOptionLh = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LH), NULL);\r
301 StringDpOptionUh = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_UH), NULL);\r
302 \r
303 if (ShellCommandLineGetFlag (ParamPackage, StringDpOptionQh) ||\r
304 ShellCommandLineGetFlag (ParamPackage, StringDpOptionLh) ||\r
305 ShellCommandLineGetFlag (ParamPackage, StringDpOptionUh))\r
c06ad33e 306 {\r
307 ShowHelp();\r
308 }\r
309 else {\r
88359546
ED
310 StringDpOptionLv = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LV), NULL);\r
311 StringDpOptionUs = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_US), NULL);\r
312 StringDpOptionLs = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LS), NULL);\r
313 StringDpOptionUa = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_UA), NULL);\r
314 StringDpOptionUr = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_UR), NULL);\r
315 StringDpOptionUt = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_UT), NULL);\r
316 StringDpOptionUp = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_UP), NULL);\r
317 StringDpOptionLx = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LX), NULL);\r
318 StringDpOptionLn = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LN), NULL);\r
319 StringDpOptionLt = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LT), NULL);\r
0b84f444 320 StringDpOptionLi = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LI), NULL);\r
d28f77df 321 StringDpOptionLc = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LC), NULL);\r
88359546 322 \r
c06ad33e 323 // Boolean Options\r
88359546
ED
324 // \r
325 VerboseMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLv);\r
aec905b7
ED
326 SummaryMode = (BOOLEAN) (ShellCommandLineGetFlag (ParamPackage, StringDpOptionUs) ||\r
327 ShellCommandLineGetFlag (ParamPackage, StringDpOptionLs));\r
88359546
ED
328 AllMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionUa);\r
329 RawMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionUr);\r
c06ad33e 330#if PROFILING_IMPLEMENTED\r
88359546
ED
331 TraceMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionUt);\r
332 ProfileMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionUp);\r
c06ad33e 333#endif // PROFILING_IMPLEMENTED\r
88359546 334 ExcludeMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLx);\r
0b84f444 335 mShowId = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLi);\r
d28f77df 336 CumulativeMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLc);\r
c06ad33e 337\r
338 // Options with Values\r
88359546 339 CmdLineArg = ShellCommandLineGetValue (ParamPackage, StringDpOptionLn);\r
c06ad33e 340 if (CmdLineArg == NULL) {\r
341 Number2Display = DEFAULT_DISPLAYCOUNT;\r
342 }\r
343 else {\r
344 Number2Display = StrDecimalToUintn(CmdLineArg);\r
345 if (Number2Display == 0) {\r
346 Number2Display = MAXIMUM_DISPLAYCOUNT;\r
347 }\r
348 }\r
88359546 349 CmdLineArg = ShellCommandLineGetValue (ParamPackage, StringDpOptionLt);\r
c06ad33e 350 if (CmdLineArg == NULL) {\r
351 mInterestThreshold = DEFAULT_THRESHOLD; // 1ms := 1,000 us\r
352 }\r
353 else {\r
354 mInterestThreshold = StrDecimalToUint64(CmdLineArg);\r
355 }\r
356 // Handle Flag combinations and default behaviors\r
357 // If both TraceMode and ProfileMode are FALSE, set them both to TRUE\r
358 if ((! TraceMode) && (! ProfileMode)) {\r
359 TraceMode = TRUE;\r
360#if PROFILING_IMPLEMENTED\r
361 ProfileMode = TRUE;\r
362#endif // PROFILING_IMPLEMENTED\r
363 }\r
364\r
d28f77df
CS
365 //\r
366 // Init the custom cumulative data.\r
367 //\r
368 CustomCumulativeToken = ShellCommandLineGetValue (ParamPackage, StringDpOptionLc);\r
369 if (CustomCumulativeToken != NULL) {\r
370 CustomCumulativeData = AllocateZeroPool (sizeof (PERF_CUM_DATA));\r
c4ace582 371 ASSERT (CustomCumulativeData != NULL);\r
d28f77df
CS
372 CustomCumulativeData->MinDur = 0;\r
373 CustomCumulativeData->MaxDur = 0;\r
374 CustomCumulativeData->Count = 0;\r
375 CustomCumulativeData->Duration = 0;\r
376 CustomCumulativeData->Name = AllocateZeroPool (StrLen (CustomCumulativeToken) + 1);\r
377 UnicodeStrToAsciiStr (CustomCumulativeToken, CustomCumulativeData->Name);\r
378 }\r
379\r
c06ad33e 380/****************************************************************************\r
381**** Timer specific processing ****\r
382****************************************************************************/\r
383 // Get the Performance counter characteristics:\r
384 // Freq = Frequency in Hz\r
385 // StartCount = Value loaded into the counter when it starts counting\r
386 // EndCount = Value counter counts to before it needs to be reset\r
387 //\r
388 Freq = GetPerformanceCounterProperties (&TimerInfo.StartCount, &TimerInfo.EndCount);\r
389\r
390 // Convert the Frequency from Hz to KHz\r
391 TimerInfo.Frequency = (UINT32)DivU64x32 (Freq, 1000);\r
392\r
393 // Determine in which direction the performance counter counts.\r
394 TimerInfo.CountUp = (BOOLEAN) (TimerInfo.EndCount >= TimerInfo.StartCount);\r
395\r
396/****************************************************************************\r
397**** Print heading ****\r
398****************************************************************************/\r
399 // print DP's build version\r
400 PrintToken (STRING_TOKEN (STR_DP_BUILD_REVISION), DP_MAJOR_VERSION, DP_MINOR_VERSION);\r
401\r
402 // print performance timer characteristics\r
403 PrintToken (STRING_TOKEN (STR_DP_KHZ), TimerInfo.Frequency); // Print Timer frequency in KHz\r
404\r
405 if ((VerboseMode) &&\r
406 (! RawMode)\r
407 ) {\r
408 StringPtr = HiiGetString (gHiiHandle,\r
aec905b7 409 (EFI_STRING_ID) (TimerInfo.CountUp ? STRING_TOKEN (STR_DP_UP) : STRING_TOKEN (STR_DP_DOWN)),\r
c06ad33e 410 NULL);\r
411 ASSERT (StringPtr != NULL);\r
412 PrintToken (STRING_TOKEN (STR_DP_TIMER_PROPERTIES), // Print Timer count range and direction\r
413 StringPtr,\r
414 TimerInfo.StartCount,\r
415 TimerInfo.EndCount\r
416 );\r
417 PrintToken (STRING_TOKEN (STR_DP_VERBOSE_THRESHOLD), mInterestThreshold);\r
418 }\r
419\r
420/* **************************************************************************\r
421**** Print Sections based on command line options\r
422****\r
423**** Option modes have the following priority:\r
424**** v Verbose -- Valid in combination with any other options\r
425**** t Threshold -- Modifies All, Raw, and Cooked output\r
426**** Default is 0 for All and Raw mode\r
427**** Default is DEFAULT_THRESHOLD for "Cooked" mode\r
428**** n Number2Display Used by All and Raw mode. Otherwise ignored.\r
429**** A All -- R and S options are ignored\r
430**** R Raw -- S option is ignored\r
431**** s Summary -- Modifies "Cooked" output only\r
432**** Cooked (Default)\r
433****\r
434**** The All, Raw, and Cooked modes are modified by the Trace and Profile\r
435**** options.\r
436**** !T && !P := (0) Default, Both are displayed\r
437**** T && !P := (1) Only Trace records are displayed\r
438**** !T && P := (2) Only Profile records are displayed\r
439**** T && P := (3) Same as Default, both are displayed\r
440****************************************************************************/\r
d28f77df
CS
441 GatherStatistics (CustomCumulativeData);\r
442 if (CumulativeMode) { \r
443 ProcessCumulative (CustomCumulativeData);\r
444 } else if (AllMode) {\r
c06ad33e 445 if (TraceMode) {\r
3e9de670
CS
446 Status = DumpAllTrace( Number2Display, ExcludeMode);\r
447 if (Status == EFI_ABORTED) {\r
448 goto Done;\r
449 }\r
c06ad33e 450 }\r
451 if (ProfileMode) {\r
452 DumpAllProfile( Number2Display, ExcludeMode);\r
453 }\r
454 }\r
455 else if (RawMode) {\r
456 if (TraceMode) {\r
3e9de670
CS
457 Status = DumpRawTrace( Number2Display, ExcludeMode);\r
458 if (Status == EFI_ABORTED) {\r
459 goto Done;\r
460 }\r
c06ad33e 461 }\r
462 if (ProfileMode) {\r
463 DumpRawProfile( Number2Display, ExcludeMode);\r
464 }\r
465 }\r
466 else {\r
467 //------------- Begin Cooked Mode Processing\r
468 if (TraceMode) {\r
469 ProcessPhases ( Ticker );\r
470 if ( ! SummaryMode) {\r
471 Status = ProcessHandles ( ExcludeMode);\r
3e9de670
CS
472 if (Status == EFI_ABORTED) {\r
473 goto Done;\r
c06ad33e 474 }\r
3e9de670
CS
475\r
476 Status = ProcessPeims ();\r
477 if (Status == EFI_ABORTED) {\r
478 goto Done;\r
479 }\r
480\r
481 Status = ProcessGlobal ();\r
482 if (Status == EFI_ABORTED) {\r
483 goto Done;\r
484 }\r
485\r
486 ProcessCumulative (NULL);\r
c06ad33e 487 }\r
488 }\r
489 if (ProfileMode) {\r
490 DumpAllProfile( Number2Display, ExcludeMode);\r
491 }\r
492 } //------------- End of Cooked Mode Processing\r
493 if ( VerboseMode || SummaryMode) {\r
494 DumpStatistics();\r
495 }\r
496 }\r
497 }\r
88359546 498\r
3e9de670
CS
499Done:\r
500\r
d28f77df 501 //\r
88359546
ED
502 // Free the memory allocate from HiiGetString\r
503 //\r
504 ListIndex = 0;\r
505 while (DpParamList[ListIndex].Name != NULL) {\r
506 FreePool (DpParamList[ListIndex].Name);\r
507 ListIndex ++;\r
508 } \r
509 FreePool (DpParamList);\r
cdd95292
SZ
510\r
511 SafeFreePool (StringDpOptionQh);\r
512 SafeFreePool (StringDpOptionLh);\r
513 SafeFreePool (StringDpOptionUh);\r
514 SafeFreePool (StringDpOptionLv);\r
515 SafeFreePool (StringDpOptionUs);\r
516 SafeFreePool (StringDpOptionLs);\r
517 SafeFreePool (StringDpOptionUa);\r
518 SafeFreePool (StringDpOptionUr);\r
519 SafeFreePool (StringDpOptionUt);\r
520 SafeFreePool (StringDpOptionUp);\r
521 SafeFreePool (StringDpOptionLx);\r
522 SafeFreePool (StringDpOptionLn);\r
523 SafeFreePool (StringDpOptionLt);\r
0b84f444 524 SafeFreePool (StringDpOptionLi);\r
d28f77df 525 SafeFreePool (StringDpOptionLc);\r
cdd95292
SZ
526 SafeFreePool (StringPtr);\r
527 SafeFreePool (mPrintTokenBuffer);\r
528\r
38ac6bf1
CS
529 if (ParamPackage != NULL) {\r
530 ShellCommandLineFreeVarList (ParamPackage);\r
531 }\r
d28f77df
CS
532 if (CustomCumulativeData != NULL) {\r
533 SafeFreePool (CustomCumulativeData->Name);\r
534 }\r
535 SafeFreePool (CustomCumulativeData);\r
536\r
c06ad33e 537 HiiRemovePackages (gHiiHandle);\r
538 return Status;\r
539}\r