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