]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - PerformancePkg/Dp_App/Dp.c
MdeModulePkg AcpiTableDxe: Use Rsdt to check against NULL
[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 - 2015, Intel Corporation. All rights reserved.<BR>\r
17 (C) Copyright 2015 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/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
46///@{\r
47EFI_HII_HANDLE gHiiHandle;\r
48SHELL_PARAM_ITEM *DpParamList = NULL;\r
49CHAR16 *mPrintTokenBuffer = NULL;\r
50CHAR16 mGaugeString[DP_GAUGE_STRING_LENGTH + 1];\r
51CHAR16 mUnicodeToken[DXE_PERFORMANCE_STRING_SIZE];\r
52UINT64 mInterestThreshold;\r
53BOOLEAN mShowId = FALSE;\r
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
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
79#if PROFILING_IMPLEMENTED\r
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
82#endif\r
83 {STRING_TOKEN (STR_DP_OPTION_LX), TypeFlag}, // -x eXclude Cumulative Items\r
84 {STRING_TOKEN (STR_DP_OPTION_LI), TypeFlag}, // -i Display Identifier\r
85 {STRING_TOKEN (STR_DP_OPTION_LC), TypeValue}, // -c Display cumulative data.\r
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
88 };\r
89\r
90///@}\r
91\r
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
118/**\r
119 Display Usage and Help information.\r
120**/\r
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
142 PrintToken (STRING_TOKEN (STR_DP_HELP_ID));\r
143 PrintToken (STRING_TOKEN (STR_DP_HELP_CUM_DATA));\r
144 PrintToken (STRING_TOKEN (STR_DP_HELP_HELP));\r
145 Print(L"\n");\r
146}\r
147\r
148/**\r
149 Display the trailing Verbose information.\r
150**/\r
151VOID\r
152DumpStatistics( void )\r
153{\r
154 EFI_STRING StringPtr;\r
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
158 PrintToken( STRING_TOKEN (STR_DP_SECTION_HEADER),\r
159 (StringPtr == NULL) ? StringPtrUnknown : StringPtr);\r
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
170 FreePool (StringPtr);\r
171 FreePool (StringPtrUnknown);\r
172}\r
173\r
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
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
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
213 UINT32 ListIndex;\r
214 \r
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
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
228 BOOLEAN CumulativeMode;\r
229 CONST CHAR16 *CustomCumulativeToken;\r
230 PERF_CUM_DATA *CustomCumulativeData;\r
231\r
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
245 EFI_STRING StringDpOptionLi;\r
246 EFI_STRING StringDpOptionLc;\r
247 \r
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
255 CumulativeMode = FALSE;\r
256 CustomCumulativeData = NULL;\r
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
271 StringDpOptionLi = NULL;\r
272 StringDpOptionLc = NULL;\r
273 StringPtr = NULL;\r
274\r
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
285 // Initial the command list\r
286 //\r
287 InitialShellParamList ();\r
288 \r
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
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
306 {\r
307 ShowHelp();\r
308 }\r
309 else {\r
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
320 StringDpOptionLi = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LI), NULL);\r
321 StringDpOptionLc = HiiGetString (gHiiHandle, STRING_TOKEN (STR_DP_OPTION_LC), NULL);\r
322 \r
323 // Boolean Options\r
324 // \r
325 VerboseMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLv);\r
326 SummaryMode = (BOOLEAN) (ShellCommandLineGetFlag (ParamPackage, StringDpOptionUs) ||\r
327 ShellCommandLineGetFlag (ParamPackage, StringDpOptionLs));\r
328 AllMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionUa);\r
329 RawMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionUr);\r
330#if PROFILING_IMPLEMENTED\r
331 TraceMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionUt);\r
332 ProfileMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionUp);\r
333#endif // PROFILING_IMPLEMENTED\r
334 ExcludeMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLx);\r
335 mShowId = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLi);\r
336 CumulativeMode = ShellCommandLineGetFlag (ParamPackage, StringDpOptionLc);\r
337\r
338 // Options with Values\r
339 CmdLineArg = ShellCommandLineGetValue (ParamPackage, StringDpOptionLn);\r
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
349 CmdLineArg = ShellCommandLineGetValue (ParamPackage, StringDpOptionLt);\r
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
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 ASSERT (CustomCumulativeData != NULL);\r
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
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
409 (EFI_STRING_ID) (TimerInfo.CountUp ? STRING_TOKEN (STR_DP_UP) : STRING_TOKEN (STR_DP_DOWN)),\r
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
441 GatherStatistics (CustomCumulativeData);\r
442 if (CumulativeMode) { \r
443 ProcessCumulative (CustomCumulativeData);\r
444 } else if (AllMode) {\r
445 if (TraceMode) {\r
446 DumpAllTrace( Number2Display, ExcludeMode);\r
447 }\r
448 if (ProfileMode) {\r
449 DumpAllProfile( Number2Display, ExcludeMode);\r
450 }\r
451 }\r
452 else if (RawMode) {\r
453 if (TraceMode) {\r
454 DumpRawTrace( Number2Display, ExcludeMode);\r
455 }\r
456 if (ProfileMode) {\r
457 DumpRawProfile( Number2Display, ExcludeMode);\r
458 }\r
459 }\r
460 else {\r
461 //------------- Begin Cooked Mode Processing\r
462 if (TraceMode) {\r
463 ProcessPhases ( Ticker );\r
464 if ( ! SummaryMode) {\r
465 Status = ProcessHandles ( ExcludeMode);\r
466 if ( ! EFI_ERROR( Status)) {\r
467 ProcessPeims ( );\r
468 ProcessGlobal ( );\r
469 ProcessCumulative (NULL);\r
470 }\r
471 }\r
472 }\r
473 if (ProfileMode) {\r
474 DumpAllProfile( Number2Display, ExcludeMode);\r
475 }\r
476 } //------------- End of Cooked Mode Processing\r
477 if ( VerboseMode || SummaryMode) {\r
478 DumpStatistics();\r
479 }\r
480 }\r
481 }\r
482\r
483 //\r
484 // Free the memory allocate from HiiGetString\r
485 //\r
486 ListIndex = 0;\r
487 while (DpParamList[ListIndex].Name != NULL) {\r
488 FreePool (DpParamList[ListIndex].Name);\r
489 ListIndex ++;\r
490 } \r
491 FreePool (DpParamList);\r
492\r
493 SafeFreePool (StringDpOptionQh);\r
494 SafeFreePool (StringDpOptionLh);\r
495 SafeFreePool (StringDpOptionUh);\r
496 SafeFreePool (StringDpOptionLv);\r
497 SafeFreePool (StringDpOptionUs);\r
498 SafeFreePool (StringDpOptionLs);\r
499 SafeFreePool (StringDpOptionUa);\r
500 SafeFreePool (StringDpOptionUr);\r
501 SafeFreePool (StringDpOptionUt);\r
502 SafeFreePool (StringDpOptionUp);\r
503 SafeFreePool (StringDpOptionLx);\r
504 SafeFreePool (StringDpOptionLn);\r
505 SafeFreePool (StringDpOptionLt);\r
506 SafeFreePool (StringDpOptionLi);\r
507 SafeFreePool (StringDpOptionLc);\r
508 SafeFreePool (StringPtr);\r
509 SafeFreePool (mPrintTokenBuffer);\r
510\r
511 if (CustomCumulativeData != NULL) {\r
512 SafeFreePool (CustomCumulativeData->Name);\r
513 }\r
514 SafeFreePool (CustomCumulativeData);\r
515\r
516 HiiRemovePackages (gHiiHandle);\r
517 return Status;\r
518}\r