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