]> git.proxmox.com Git - mirror_edk2.git/blame - PerformancePkg/Dp_App/Dp.c
PerformancePkg/Dp_App: Support dumping cumulative data
[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
0b84f444 16 Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>\r
d28f77df 17 (C) Copyright 2015 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
198 \r
199 @retval EFI_SUCCESS Command completed successfully.\r
200 @retval EFI_INVALID_PARAMETER Command usage error.\r
201 @retval value Unknown error.\r
202 \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
371 CustomCumulativeData->MinDur = 0;\r
372 CustomCumulativeData->MaxDur = 0;\r
373 CustomCumulativeData->Count = 0;\r
374 CustomCumulativeData->Duration = 0;\r
375 CustomCumulativeData->Name = AllocateZeroPool (StrLen (CustomCumulativeToken) + 1);\r
376 UnicodeStrToAsciiStr (CustomCumulativeToken, CustomCumulativeData->Name);\r
377 }\r
378\r
c06ad33e 379/****************************************************************************\r
380**** Timer specific processing ****\r
381****************************************************************************/\r
382 // Get the Performance counter characteristics:\r
383 // Freq = Frequency in Hz\r
384 // StartCount = Value loaded into the counter when it starts counting\r
385 // EndCount = Value counter counts to before it needs to be reset\r
386 //\r
387 Freq = GetPerformanceCounterProperties (&TimerInfo.StartCount, &TimerInfo.EndCount);\r
388\r
389 // Convert the Frequency from Hz to KHz\r
390 TimerInfo.Frequency = (UINT32)DivU64x32 (Freq, 1000);\r
391\r
392 // Determine in which direction the performance counter counts.\r
393 TimerInfo.CountUp = (BOOLEAN) (TimerInfo.EndCount >= TimerInfo.StartCount);\r
394\r
395/****************************************************************************\r
396**** Print heading ****\r
397****************************************************************************/\r
398 // print DP's build version\r
399 PrintToken (STRING_TOKEN (STR_DP_BUILD_REVISION), DP_MAJOR_VERSION, DP_MINOR_VERSION);\r
400\r
401 // print performance timer characteristics\r
402 PrintToken (STRING_TOKEN (STR_DP_KHZ), TimerInfo.Frequency); // Print Timer frequency in KHz\r
403\r
404 if ((VerboseMode) &&\r
405 (! RawMode)\r
406 ) {\r
407 StringPtr = HiiGetString (gHiiHandle,\r
aec905b7 408 (EFI_STRING_ID) (TimerInfo.CountUp ? STRING_TOKEN (STR_DP_UP) : STRING_TOKEN (STR_DP_DOWN)),\r
c06ad33e 409 NULL);\r
410 ASSERT (StringPtr != NULL);\r
411 PrintToken (STRING_TOKEN (STR_DP_TIMER_PROPERTIES), // Print Timer count range and direction\r
412 StringPtr,\r
413 TimerInfo.StartCount,\r
414 TimerInfo.EndCount\r
415 );\r
416 PrintToken (STRING_TOKEN (STR_DP_VERBOSE_THRESHOLD), mInterestThreshold);\r
417 }\r
418\r
419/* **************************************************************************\r
420**** Print Sections based on command line options\r
421****\r
422**** Option modes have the following priority:\r
423**** v Verbose -- Valid in combination with any other options\r
424**** t Threshold -- Modifies All, Raw, and Cooked output\r
425**** Default is 0 for All and Raw mode\r
426**** Default is DEFAULT_THRESHOLD for "Cooked" mode\r
427**** n Number2Display Used by All and Raw mode. Otherwise ignored.\r
428**** A All -- R and S options are ignored\r
429**** R Raw -- S option is ignored\r
430**** s Summary -- Modifies "Cooked" output only\r
431**** Cooked (Default)\r
432****\r
433**** The All, Raw, and Cooked modes are modified by the Trace and Profile\r
434**** options.\r
435**** !T && !P := (0) Default, Both are displayed\r
436**** T && !P := (1) Only Trace records are displayed\r
437**** !T && P := (2) Only Profile records are displayed\r
438**** T && P := (3) Same as Default, both are displayed\r
439****************************************************************************/\r
d28f77df
CS
440 GatherStatistics (CustomCumulativeData);\r
441 if (CumulativeMode) { \r
442 ProcessCumulative (CustomCumulativeData);\r
443 } else if (AllMode) {\r
c06ad33e 444 if (TraceMode) {\r
445 DumpAllTrace( Number2Display, ExcludeMode);\r
446 }\r
447 if (ProfileMode) {\r
448 DumpAllProfile( Number2Display, ExcludeMode);\r
449 }\r
450 }\r
451 else if (RawMode) {\r
452 if (TraceMode) {\r
453 DumpRawTrace( Number2Display, ExcludeMode);\r
454 }\r
455 if (ProfileMode) {\r
456 DumpRawProfile( Number2Display, ExcludeMode);\r
457 }\r
458 }\r
459 else {\r
460 //------------- Begin Cooked Mode Processing\r
461 if (TraceMode) {\r
462 ProcessPhases ( Ticker );\r
463 if ( ! SummaryMode) {\r
464 Status = ProcessHandles ( ExcludeMode);\r
465 if ( ! EFI_ERROR( Status)) {\r
466 ProcessPeims ( );\r
467 ProcessGlobal ( );\r
d28f77df 468 ProcessCumulative (NULL);\r
c06ad33e 469 }\r
470 }\r
471 }\r
472 if (ProfileMode) {\r
473 DumpAllProfile( Number2Display, ExcludeMode);\r
474 }\r
475 } //------------- End of Cooked Mode Processing\r
476 if ( VerboseMode || SummaryMode) {\r
477 DumpStatistics();\r
478 }\r
479 }\r
480 }\r
88359546 481\r
d28f77df 482 //\r
88359546
ED
483 // Free the memory allocate from HiiGetString\r
484 //\r
485 ListIndex = 0;\r
486 while (DpParamList[ListIndex].Name != NULL) {\r
487 FreePool (DpParamList[ListIndex].Name);\r
488 ListIndex ++;\r
489 } \r
490 FreePool (DpParamList);\r
cdd95292
SZ
491\r
492 SafeFreePool (StringDpOptionQh);\r
493 SafeFreePool (StringDpOptionLh);\r
494 SafeFreePool (StringDpOptionUh);\r
495 SafeFreePool (StringDpOptionLv);\r
496 SafeFreePool (StringDpOptionUs);\r
497 SafeFreePool (StringDpOptionLs);\r
498 SafeFreePool (StringDpOptionUa);\r
499 SafeFreePool (StringDpOptionUr);\r
500 SafeFreePool (StringDpOptionUt);\r
501 SafeFreePool (StringDpOptionUp);\r
502 SafeFreePool (StringDpOptionLx);\r
503 SafeFreePool (StringDpOptionLn);\r
504 SafeFreePool (StringDpOptionLt);\r
0b84f444 505 SafeFreePool (StringDpOptionLi);\r
d28f77df 506 SafeFreePool (StringDpOptionLc);\r
cdd95292
SZ
507 SafeFreePool (StringPtr);\r
508 SafeFreePool (mPrintTokenBuffer);\r
509\r
d28f77df
CS
510 if (CustomCumulativeData != NULL) {\r
511 SafeFreePool (CustomCumulativeData->Name);\r
512 }\r
513 SafeFreePool (CustomCumulativeData);\r
514\r
c06ad33e 515 HiiRemovePackages (gHiiHandle);\r
516 return Status;\r
517}\r