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