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