]>
Commit | Line | Data |
---|---|---|
a6eaba4d | 1 | /** @file\r |
ee4dc24f RN |
2 | Main file for 'acpiview' Shell command function.\r |
3 | \r | |
558b37b4 | 4 | Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.\r |
80e67bcb | 5 | Copyright (c) 2016 - 2021, Arm Limited. All rights reserved.<BR>\r |
56ba3746 | 6 | SPDX-License-Identifier: BSD-2-Clause-Patent\r |
ee4dc24f RN |
7 | **/\r |
8 | \r | |
9 | #include <Guid/ShellLibHiiGuid.h>\r | |
10 | #include <IndustryStandard/Acpi.h>\r | |
1d3d5e32 | 11 | #include <IndustryStandard/ArmErrorSourceTable.h>\r |
422fe85c TP |
12 | \r |
13 | #include <Library/BaseMemoryLib.h>\r | |
ee4dc24f | 14 | #include <Library/HiiLib.h>\r |
422fe85c TP |
15 | #include <Library/MemoryAllocationLib.h>\r |
16 | #include <Library/PrintLib.h>\r | |
ee4dc24f | 17 | #include <Library/ShellCommandLib.h>\r |
422fe85c | 18 | #include <Library/ShellLib.h>\r |
ee4dc24f | 19 | #include <Library/UefiBootServicesTableLib.h>\r |
422fe85c | 20 | #include <Library/UefiLib.h>\r |
db77d8f7 | 21 | #include <Library/AcpiViewCommandLib.h>\r |
ee4dc24f | 22 | #include <Uefi.h>\r |
422fe85c | 23 | \r |
ee4dc24f RN |
24 | #include "AcpiParser.h"\r |
25 | #include "AcpiTableParser.h"\r | |
26 | #include "AcpiView.h"\r | |
422fe85c | 27 | #include "AcpiViewConfig.h"\r |
ee4dc24f | 28 | \r |
47d20b54 MK |
29 | CONST CHAR16 gShellAcpiViewFileName[] = L"ShellCommand";\r |
30 | EFI_HII_HANDLE gShellAcpiViewHiiHandle = NULL;\r | |
ee4dc24f | 31 | \r |
422fe85c TP |
32 | /**\r |
33 | An array of acpiview command line parameters.\r | |
34 | **/\r | |
47d20b54 MK |
35 | STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r |
36 | { L"-q", TypeFlag },\r | |
37 | { L"-d", TypeFlag },\r | |
38 | { L"-h", TypeFlag },\r | |
39 | { L"-l", TypeFlag },\r | |
40 | { L"-s", TypeValue },\r | |
41 | { L"-r", TypeValue },\r | |
42 | { NULL, TypeMax }\r | |
422fe85c TP |
43 | };\r |
44 | \r | |
ee4dc24f RN |
45 | /**\r |
46 | A list of available table parsers.\r | |
47 | */\r | |
48 | STATIC\r | |
49 | CONST\r | |
47d20b54 MK |
50 | ACPI_TABLE_PARSER ParserList[] = {\r |
51 | { EFI_ACPI_6_3_ARM_ERROR_SOURCE_TABLE_SIGNATURE, ParseAcpiAest },\r | |
1fd8d089 | 52 | { EFI_ACPI_6_4_ARM_PERFORMANCE_MONITORING_UNIT_TABLE_SIGNATURE, ParseAcpiApmt },\r |
47d20b54 MK |
53 | { EFI_ACPI_6_2_BOOT_GRAPHICS_RESOURCE_TABLE_SIGNATURE, ParseAcpiBgrt },\r |
54 | { EFI_ACPI_6_2_DEBUG_PORT_2_TABLE_SIGNATURE, ParseAcpiDbg2 },\r | |
55 | { EFI_ACPI_6_2_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,\r | |
56 | ParseAcpiDsdt },\r | |
558b37b4 | 57 | { EFI_ACPI_6_4_ERROR_RECORD_SERIALIZATION_TABLE_SIGNATURE, ParseAcpiErst },\r |
47d20b54 MK |
58 | { EFI_ACPI_6_3_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE, ParseAcpiFacs },\r |
59 | { EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiFadt },\r | |
60 | { EFI_ACPI_6_4_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiGtdt },\r | |
61 | { EFI_ACPI_6_4_HETEROGENEOUS_MEMORY_ATTRIBUTE_TABLE_SIGNATURE, ParseAcpiHmat },\r | |
62 | { EFI_ACPI_6_2_IO_REMAPPING_TABLE_SIGNATURE, ParseAcpiIort },\r | |
63 | { EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiMadt },\r | |
64 | { EFI_ACPI_6_2_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE,\r | |
65 | ParseAcpiMcfg },\r | |
66 | { EFI_ACPI_6_4_PLATFORM_COMMUNICATIONS_CHANNEL_TABLE_SIGNATURE,\r | |
67 | ParseAcpiPcct },\r | |
a50b65ce | 68 | { EFI_ACPI_6_4_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE,\r |
47d20b54 MK |
69 | ParseAcpiPptt },\r |
70 | { RSDP_TABLE_INFO, ParseAcpiRsdp },\r | |
71 | { EFI_ACPI_6_2_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE, ParseAcpiSlit },\r | |
72 | { EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE, ParseAcpiSpcr },\r | |
73 | { EFI_ACPI_6_2_SYSTEM_RESOURCE_AFFINITY_TABLE_SIGNATURE, ParseAcpiSrat },\r | |
74 | { EFI_ACPI_6_2_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiSsdt },\r | |
75 | { EFI_ACPI_6_2_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, ParseAcpiXsdt }\r | |
ee4dc24f RN |
76 | };\r |
77 | \r | |
a6eaba4d DB |
78 | /**\r |
79 | This function registers all the available table parsers.\r | |
ee4dc24f RN |
80 | \r |
81 | @retval EFI_SUCCESS The parser is registered.\r | |
82 | @retval EFI_ALREADY_STARTED The parser for the ACPI Table\r | |
83 | was already registered.\r | |
84 | @retval EFI_INVALID_PARAMETER A parameter is invalid.\r | |
85 | @retval EFI_OUT_OF_RESOURCES No space to register the\r | |
86 | parser.\r | |
a6eaba4d | 87 | **/\r |
ee4dc24f RN |
88 | EFI_STATUS\r |
89 | RegisterAllParsers (\r | |
90 | )\r | |
91 | {\r | |
47d20b54 MK |
92 | EFI_STATUS Status;\r |
93 | UINTN Count;\r | |
f75c7478 | 94 | \r |
7343bc80 | 95 | Status = EFI_SUCCESS;\r |
47d20b54 | 96 | Count = sizeof (ParserList) / sizeof (ParserList[0]);\r |
f75c7478 | 97 | \r |
ee4dc24f RN |
98 | while (Count-- != 0) {\r |
99 | Status = RegisterParser (\r | |
100 | ParserList[Count].Signature,\r | |
101 | ParserList[Count].Parser\r | |
102 | );\r | |
103 | if (EFI_ERROR (Status)) {\r | |
104 | return Status;\r | |
105 | }\r | |
106 | }\r | |
47d20b54 | 107 | \r |
ee4dc24f RN |
108 | return Status;\r |
109 | }\r | |
110 | \r | |
d45cf5ff TP |
111 | /**\r |
112 | Dump a buffer to a file. Print error message if a file cannot be created.\r | |
113 | \r | |
114 | @param[in] FileName The filename that shall be created to contain the buffer.\r | |
115 | @param[in] Buffer Pointer to buffer that shall be dumped.\r | |
116 | @param[in] BufferSize The size of buffer to be dumped in bytes.\r | |
117 | \r | |
118 | @return The number of bytes that were written\r | |
119 | **/\r | |
120 | UINTN\r | |
121 | EFIAPI\r | |
122 | ShellDumpBufferToFile (\r | |
47d20b54 MK |
123 | IN CONST CHAR16 *FileNameBuffer,\r |
124 | IN CONST VOID *Buffer,\r | |
d45cf5ff TP |
125 | IN CONST UINTN BufferSize\r |
126 | )\r | |
127 | {\r | |
47d20b54 MK |
128 | EFI_STATUS Status;\r |
129 | SHELL_FILE_HANDLE DumpFileHandle;\r | |
130 | UINTN TransferBytes;\r | |
d45cf5ff TP |
131 | \r |
132 | Status = ShellOpenFileByName (\r | |
133 | FileNameBuffer,\r | |
134 | &DumpFileHandle,\r | |
135 | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,\r | |
136 | 0\r | |
137 | );\r | |
138 | \r | |
139 | if (EFI_ERROR (Status)) {\r | |
140 | ShellPrintHiiEx (\r | |
141 | -1,\r | |
142 | -1,\r | |
143 | NULL,\r | |
144 | STRING_TOKEN (STR_GEN_READONLY_MEDIA),\r | |
145 | gShellAcpiViewHiiHandle,\r | |
146 | L"acpiview"\r | |
147 | );\r | |
148 | return 0;\r | |
149 | }\r | |
150 | \r | |
151 | TransferBytes = BufferSize;\r | |
47d20b54 MK |
152 | Status = ShellWriteFile (\r |
153 | DumpFileHandle,\r | |
154 | &TransferBytes,\r | |
155 | (VOID *)Buffer\r | |
156 | );\r | |
d45cf5ff TP |
157 | \r |
158 | if (EFI_ERROR (Status)) {\r | |
159 | Print (L"ERROR: Failed to write binary file.\n");\r | |
160 | TransferBytes = 0;\r | |
161 | } else {\r | |
162 | Print (L"DONE.\n");\r | |
163 | }\r | |
164 | \r | |
165 | ShellCloseFile (&DumpFileHandle);\r | |
166 | return TransferBytes;\r | |
167 | }\r | |
168 | \r | |
ee4dc24f RN |
169 | /**\r |
170 | Return the file name of the help text file if not using HII.\r | |
171 | \r | |
172 | @return The string pointer to the file name.\r | |
a6eaba4d | 173 | **/\r |
47d20b54 | 174 | CONST CHAR16 *\r |
ee4dc24f RN |
175 | EFIAPI\r |
176 | ShellCommandGetManFileNameAcpiView (\r | |
177 | VOID\r | |
178 | )\r | |
179 | {\r | |
180 | return gShellAcpiViewFileName;\r | |
181 | }\r | |
182 | \r | |
422fe85c TP |
183 | /**\r |
184 | Function for 'acpiview' command.\r | |
185 | \r | |
186 | @param[in] ImageHandle Handle to the Image (NULL if internal).\r | |
187 | @param[in] SystemTable Pointer to the System Table (NULL if internal).\r | |
188 | \r | |
189 | @retval SHELL_INVALID_PARAMETER The command line invocation could not be parsed\r | |
190 | @retval SHELL_NOT_FOUND The command failed\r | |
191 | @retval SHELL_SUCCESS The command was successful\r | |
192 | **/\r | |
193 | SHELL_STATUS\r | |
194 | EFIAPI\r | |
195 | ShellCommandRunAcpiView (\r | |
196 | IN EFI_HANDLE ImageHandle,\r | |
47d20b54 | 197 | IN EFI_SYSTEM_TABLE *SystemTable\r |
422fe85c TP |
198 | )\r |
199 | {\r | |
200 | EFI_STATUS Status;\r | |
201 | SHELL_STATUS ShellStatus;\r | |
47d20b54 MK |
202 | LIST_ENTRY *Package;\r |
203 | CHAR16 *ProblemParam;\r | |
422fe85c | 204 | SHELL_FILE_HANDLE TmpDumpFileHandle;\r |
47d20b54 MK |
205 | CONST CHAR16 *MandatoryTableSpecStr;\r |
206 | CONST CHAR16 *SelectedTableName;\r | |
422fe85c TP |
207 | \r |
208 | // Set configuration defaults\r | |
209 | AcpiConfigSetDefaults ();\r | |
210 | \r | |
47d20b54 MK |
211 | ShellStatus = SHELL_SUCCESS;\r |
212 | Package = NULL;\r | |
422fe85c TP |
213 | TmpDumpFileHandle = NULL;\r |
214 | \r | |
215 | Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r | |
216 | if (EFI_ERROR (Status)) {\r | |
47d20b54 | 217 | if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r |
422fe85c TP |
218 | ShellPrintHiiEx (\r |
219 | -1,\r | |
220 | -1,\r | |
221 | NULL,\r | |
222 | STRING_TOKEN (STR_GEN_PROBLEM),\r | |
223 | gShellAcpiViewHiiHandle,\r | |
224 | L"acpiview",\r | |
225 | ProblemParam\r | |
226 | );\r | |
227 | FreePool (ProblemParam);\r | |
228 | } else {\r | |
229 | Print (L"acpiview: Error processing input parameter(s)\n");\r | |
230 | }\r | |
47d20b54 | 231 | \r |
422fe85c TP |
232 | ShellStatus = SHELL_INVALID_PARAMETER;\r |
233 | } else {\r | |
234 | if (ShellCommandLineGetCount (Package) > 1) {\r | |
235 | ShellPrintHiiEx (\r | |
236 | -1,\r | |
237 | -1,\r | |
238 | NULL,\r | |
239 | STRING_TOKEN (STR_GEN_TOO_MANY),\r | |
240 | gShellAcpiViewHiiHandle,\r | |
241 | L"acpiview"\r | |
242 | );\r | |
243 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
244 | } else if (ShellCommandLineGetFlag (Package, L"-?")) {\r | |
245 | ShellPrintHiiEx (\r | |
246 | -1,\r | |
247 | -1,\r | |
248 | NULL,\r | |
249 | STRING_TOKEN (STR_GET_HELP_ACPIVIEW),\r | |
250 | gShellAcpiViewHiiHandle,\r | |
251 | L"acpiview"\r | |
252 | );\r | |
253 | } else if (ShellCommandLineGetFlag (Package, L"-s") &&\r | |
47d20b54 MK |
254 | (ShellCommandLineGetValue (Package, L"-s") == NULL))\r |
255 | {\r | |
422fe85c TP |
256 | ShellPrintHiiEx (\r |
257 | -1,\r | |
258 | -1,\r | |
259 | NULL,\r | |
260 | STRING_TOKEN (STR_GEN_NO_VALUE),\r | |
261 | gShellAcpiViewHiiHandle,\r | |
262 | L"acpiview",\r | |
263 | L"-s"\r | |
264 | );\r | |
265 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
266 | } else if (ShellCommandLineGetFlag (Package, L"-r") &&\r | |
47d20b54 MK |
267 | (ShellCommandLineGetValue (Package, L"-r") == NULL))\r |
268 | {\r | |
422fe85c TP |
269 | ShellPrintHiiEx (\r |
270 | -1,\r | |
271 | -1,\r | |
272 | NULL,\r | |
273 | STRING_TOKEN (STR_GEN_NO_VALUE),\r | |
274 | gShellAcpiViewHiiHandle,\r | |
275 | L"acpiview",\r | |
276 | L"-r"\r | |
277 | );\r | |
278 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
279 | } else if ((ShellCommandLineGetFlag (Package, L"-s") &&\r | |
47d20b54 MK |
280 | ShellCommandLineGetFlag (Package, L"-l")))\r |
281 | {\r | |
422fe85c TP |
282 | ShellPrintHiiEx (\r |
283 | -1,\r | |
284 | -1,\r | |
285 | NULL,\r | |
286 | STRING_TOKEN (STR_GEN_TOO_MANY),\r | |
287 | gShellAcpiViewHiiHandle,\r | |
288 | L"acpiview"\r | |
289 | );\r | |
290 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
291 | } else if (ShellCommandLineGetFlag (Package, L"-d") &&\r | |
47d20b54 MK |
292 | !ShellCommandLineGetFlag (Package, L"-s"))\r |
293 | {\r | |
294 | ShellPrintHiiEx (\r | |
295 | -1,\r | |
296 | -1,\r | |
297 | NULL,\r | |
298 | STRING_TOKEN (STR_GEN_MISSING_OPTION),\r | |
299 | gShellAcpiViewHiiHandle,\r | |
300 | L"acpiview",\r | |
301 | L"-s",\r | |
302 | L"-d"\r | |
303 | );\r | |
304 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
422fe85c TP |
305 | } else {\r |
306 | // Turn on colour highlighting if requested\r | |
307 | SetColourHighlighting (ShellCommandLineGetFlag (Package, L"-h"));\r | |
308 | \r | |
309 | // Surpress consistency checking if requested\r | |
310 | SetConsistencyChecking (!ShellCommandLineGetFlag (Package, L"-q"));\r | |
311 | \r | |
312 | // Evaluate the parameters for mandatory ACPI table presence checks\r | |
313 | SetMandatoryTableValidate (ShellCommandLineGetFlag (Package, L"-r"));\r | |
314 | MandatoryTableSpecStr = ShellCommandLineGetValue (Package, L"-r");\r | |
315 | \r | |
316 | if (MandatoryTableSpecStr != NULL) {\r | |
317 | SetMandatoryTableSpec (ShellHexStrToUintn (MandatoryTableSpecStr));\r | |
318 | }\r | |
319 | \r | |
320 | if (ShellCommandLineGetFlag (Package, L"-l")) {\r | |
321 | SetReportOption (ReportTableList);\r | |
322 | } else {\r | |
323 | SelectedTableName = ShellCommandLineGetValue (Package, L"-s");\r | |
324 | if (SelectedTableName != NULL) {\r | |
325 | SelectAcpiTable (SelectedTableName);\r | |
326 | SetReportOption (ReportSelected);\r | |
327 | \r | |
47d20b54 | 328 | if (ShellCommandLineGetFlag (Package, L"-d")) {\r |
422fe85c | 329 | // Create a temporary file to check if the media is writable.\r |
47d20b54 | 330 | CHAR16 FileNameBuffer[MAX_FILE_NAME_LEN];\r |
422fe85c TP |
331 | SetReportOption (ReportDumpBinFile);\r |
332 | \r | |
333 | UnicodeSPrint (\r | |
334 | FileNameBuffer,\r | |
335 | sizeof (FileNameBuffer),\r | |
336 | L".\\%s0000.tmp",\r | |
337 | SelectedTableName\r | |
338 | );\r | |
339 | \r | |
340 | Status = ShellOpenFileByName (\r | |
341 | FileNameBuffer,\r | |
342 | &TmpDumpFileHandle,\r | |
343 | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE |\r | |
344 | EFI_FILE_MODE_CREATE,\r | |
345 | 0\r | |
346 | );\r | |
347 | \r | |
348 | if (EFI_ERROR (Status)) {\r | |
47d20b54 | 349 | ShellStatus = SHELL_INVALID_PARAMETER;\r |
422fe85c TP |
350 | TmpDumpFileHandle = NULL;\r |
351 | ShellPrintHiiEx (\r | |
352 | -1,\r | |
353 | -1,\r | |
354 | NULL,\r | |
355 | STRING_TOKEN (STR_GEN_READONLY_MEDIA),\r | |
356 | gShellAcpiViewHiiHandle,\r | |
357 | L"acpiview"\r | |
358 | );\r | |
359 | goto Done;\r | |
360 | }\r | |
47d20b54 | 361 | \r |
422fe85c TP |
362 | // Delete Temporary file.\r |
363 | ShellDeleteFile (&TmpDumpFileHandle);\r | |
364 | } // -d\r | |
365 | } // -s\r | |
366 | }\r | |
367 | \r | |
368 | // Parse ACPI Table information\r | |
369 | Status = AcpiView (SystemTable);\r | |
370 | if (EFI_ERROR (Status)) {\r | |
371 | ShellStatus = SHELL_NOT_FOUND;\r | |
372 | }\r | |
373 | }\r | |
374 | }\r | |
375 | \r | |
376 | Done:\r | |
377 | if (Package != NULL) {\r | |
378 | ShellCommandLineFreeVarList (Package);\r | |
379 | }\r | |
47d20b54 | 380 | \r |
422fe85c TP |
381 | return ShellStatus;\r |
382 | }\r | |
383 | \r | |
ee4dc24f RN |
384 | /**\r |
385 | Constructor for the Shell AcpiView Command library.\r | |
386 | \r | |
387 | Install the handlers for acpiview UEFI Shell command.\r | |
388 | \r | |
389 | @param ImageHandle The image handle of the process.\r | |
390 | @param SystemTable The EFI System Table pointer.\r | |
391 | \r | |
392 | @retval EFI_SUCCESS The Shell command handlers were installed\r | |
393 | successfully.\r | |
394 | @retval EFI_DEVICE_ERROR Hii package failed to install.\r | |
a6eaba4d | 395 | **/\r |
ee4dc24f RN |
396 | EFI_STATUS\r |
397 | EFIAPI\r | |
398 | UefiShellAcpiViewCommandLibConstructor (\r | |
399 | IN EFI_HANDLE ImageHandle,\r | |
400 | IN EFI_SYSTEM_TABLE *SystemTable\r | |
401 | )\r | |
402 | {\r | |
47d20b54 MK |
403 | EFI_STATUS Status;\r |
404 | \r | |
ee4dc24f RN |
405 | gShellAcpiViewHiiHandle = NULL;\r |
406 | \r | |
407 | // Check Shell Profile Debug1 bit of the profiles mask\r | |
81038d50 | 408 | if ((PcdGet8 (PcdShellProfileMask) & BIT1) == 0) {\r |
ee4dc24f RN |
409 | return EFI_SUCCESS;\r |
410 | }\r | |
411 | \r | |
412 | Status = RegisterAllParsers ();\r | |
413 | if (EFI_ERROR (Status)) {\r | |
414 | Print (L"acpiview: Error failed to register parser.\n");\r | |
415 | return Status;\r | |
416 | }\r | |
417 | \r | |
418 | gShellAcpiViewHiiHandle = HiiAddPackages (\r | |
419 | &gShellAcpiViewHiiGuid,\r | |
420 | gImageHandle,\r | |
421 | UefiShellAcpiViewCommandLibStrings,\r | |
422 | NULL\r | |
423 | );\r | |
424 | if (gShellAcpiViewHiiHandle == NULL) {\r | |
425 | return EFI_DEVICE_ERROR;\r | |
426 | }\r | |
47d20b54 | 427 | \r |
ee4dc24f RN |
428 | // Install our Shell command handler\r |
429 | ShellCommandRegisterCommandName (\r | |
430 | L"acpiview",\r | |
431 | ShellCommandRunAcpiView,\r | |
432 | ShellCommandGetManFileNameAcpiView,\r | |
433 | 0,\r | |
434 | L"acpiview",\r | |
435 | TRUE,\r | |
436 | gShellAcpiViewHiiHandle,\r | |
437 | STRING_TOKEN (STR_GET_HELP_ACPIVIEW)\r | |
438 | );\r | |
439 | \r | |
440 | return EFI_SUCCESS;\r | |
441 | }\r | |
442 | \r | |
443 | /**\r | |
444 | Destructor for the library. free any resources.\r | |
445 | \r | |
446 | @param ImageHandle The image handle of the process.\r | |
447 | @param SystemTable The EFI System Table pointer.\r | |
a6eaba4d | 448 | **/\r |
ee4dc24f RN |
449 | EFI_STATUS\r |
450 | EFIAPI\r | |
451 | UefiShellAcpiViewCommandLibDestructor (\r | |
452 | IN EFI_HANDLE ImageHandle,\r | |
453 | IN EFI_SYSTEM_TABLE *SystemTable\r | |
454 | )\r | |
455 | {\r | |
456 | if (gShellAcpiViewHiiHandle != NULL) {\r | |
457 | HiiRemovePackages (gShellAcpiViewHiiHandle);\r | |
458 | }\r | |
47d20b54 | 459 | \r |
ee4dc24f RN |
460 | return EFI_SUCCESS;\r |
461 | }\r |