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