]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c
ShellPkg: acpiview: Remove duplicate ACPI structure size definitions
[mirror_edk2.git] / ShellPkg / Library / UefiShellAcpiViewCommandLib / AcpiView.c
CommitLineData
a6eaba4d 1/** @file\r
ee4dc24f 2\r
6d960371 3 Copyright (c) 2016 - 2019, ARM Limited. All rights reserved.\r
56ba3746 4 SPDX-License-Identifier: BSD-2-Clause-Patent\r
ee4dc24f
RN
5**/\r
6\r
7#include <Library/PrintLib.h>\r
8#include <Library/UefiLib.h>\r
9#include <Library/ShellLib.h>\r
10#include <Library/UefiBootServicesTableLib.h>\r
11#include <Library/BaseMemoryLib.h>\r
12#include <Library/DebugLib.h>\r
13#include <Library/MemoryAllocationLib.h>\r
14#include "AcpiParser.h"\r
15#include "AcpiTableParser.h"\r
16#include "AcpiView.h"\r
17#include "UefiShellAcpiViewCommandLib.h"\r
18\r
19EFI_HII_HANDLE gShellAcpiViewHiiHandle = NULL;\r
20\r
21// Report variables\r
22STATIC UINT32 mSelectedAcpiTable;\r
23STATIC CONST CHAR16* mSelectedAcpiTableName;\r
24STATIC BOOLEAN mSelectedAcpiTableFound;\r
25STATIC EREPORT_OPTION mReportType;\r
26STATIC UINT32 mTableCount;\r
27STATIC UINT32 mBinTableCount;\r
ee4dc24f
RN
28STATIC BOOLEAN mConsistencyCheck;\r
29STATIC BOOLEAN mColourHighlighting;\r
30\r
a6eaba4d
DB
31/**\r
32 An array of acpiview command line parameters.\r
33**/\r
ee4dc24f 34STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
f73843d5 35 {L"-q", TypeFlag},\r
ee4dc24f 36 {L"-d", TypeFlag},\r
4286eb22 37 {L"-h", TypeFlag},\r
ee4dc24f
RN
38 {L"-l", TypeFlag},\r
39 {L"-s", TypeValue},\r
ee4dc24f
RN
40 {NULL, TypeMax}\r
41};\r
42\r
a6eaba4d
DB
43/**\r
44 This function returns the colour highlighting status.\r
ee4dc24f
RN
45\r
46 @retval TRUE if colour highlighting is enabled.\r
a6eaba4d 47**/\r
ee4dc24f
RN
48BOOLEAN\r
49GetColourHighlighting (\r
50 VOID\r
51 )\r
52{\r
53 return mColourHighlighting;\r
54}\r
55\r
a6eaba4d
DB
56/**\r
57 This function sets the colour highlighting status.\r
ee4dc24f 58\r
a6eaba4d
DB
59 @param Highlight The Highlight status.\r
60\r
61**/\r
ee4dc24f
RN
62VOID\r
63SetColourHighlighting (\r
64 BOOLEAN Highlight\r
65 )\r
66{\r
67 mColourHighlighting = Highlight;\r
68}\r
69\r
f73843d5
KK
70/**\r
71 This function returns the consistency checking status.\r
72\r
73 @retval TRUE if consistency checking is enabled.\r
74**/\r
75BOOLEAN\r
76GetConsistencyChecking (\r
77 VOID\r
78 )\r
79{\r
80 return mConsistencyCheck;\r
81}\r
82\r
83/**\r
84 This function sets the consistency checking status.\r
85\r
86 @param ConsistencyChecking The consistency checking status.\r
87\r
88**/\r
89VOID\r
90SetConsistencyChecking (\r
91 BOOLEAN ConsistencyChecking\r
92 )\r
93{\r
94 mConsistencyCheck = ConsistencyChecking;\r
95}\r
96\r
a6eaba4d
DB
97/**\r
98 This function returns the report options.\r
ee4dc24f
RN
99\r
100 @retval Returns the report option.\r
a6eaba4d 101**/\r
ee4dc24f
RN
102STATIC\r
103EREPORT_OPTION\r
104GetReportOption (\r
105 VOID\r
106 )\r
107{\r
108 return mReportType;\r
109}\r
110\r
a6eaba4d
DB
111/**\r
112 This function returns the selected ACPI table.\r
ee4dc24f
RN
113\r
114 @retval Returns signature of the selected ACPI table.\r
a6eaba4d 115**/\r
ee4dc24f
RN
116STATIC\r
117UINT32\r
118GetSelectedAcpiTable (\r
119 VOID\r
120 )\r
121{\r
122 return mSelectedAcpiTable;\r
123}\r
124\r
a6eaba4d
DB
125/**\r
126 This function dumps the ACPI table to a file.\r
127\r
ee4dc24f
RN
128 @param [in] Ptr Pointer to the ACPI table data.\r
129 @param [in] Length The length of the ACPI table.\r
130\r
131 @retval TRUE Success.\r
132 @retval FALSE Failure.\r
a6eaba4d 133**/\r
ee4dc24f
RN
134STATIC\r
135BOOLEAN\r
136DumpAcpiTableToFile (\r
137 IN CONST UINT8* Ptr,\r
138 IN CONST UINTN Length\r
139 )\r
140{\r
141 EFI_STATUS Status;\r
142 CHAR16 FileNameBuffer[MAX_FILE_NAME_LEN];\r
f75c7478
DB
143 SHELL_FILE_HANDLE DumpFileHandle;\r
144 UINTN TransferBytes;\r
145\r
146 DumpFileHandle = NULL;\r
147 TransferBytes = Length;\r
ee4dc24f
RN
148\r
149 UnicodeSPrint (\r
150 FileNameBuffer,\r
151 sizeof (FileNameBuffer),\r
152 L".\\%s%04d.bin",\r
153 mSelectedAcpiTableName,\r
154 mBinTableCount++\r
155 );\r
156\r
157 Status = ShellOpenFileByName (\r
158 FileNameBuffer,\r
159 &DumpFileHandle,\r
160 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,\r
161 0\r
162 );\r
163 if (EFI_ERROR (Status)) {\r
164 ShellPrintHiiEx (\r
165 -1,\r
166 -1,\r
167 NULL,\r
168 STRING_TOKEN (STR_GEN_READONLY_MEDIA),\r
169 gShellAcpiViewHiiHandle,\r
170 L"acpiview"\r
171 );\r
172 return FALSE;\r
173 }\r
174\r
175 Print (L"Dumping ACPI table to : %s ... ", FileNameBuffer);\r
176\r
177 Status = ShellWriteFile (\r
178 DumpFileHandle,\r
179 &TransferBytes,\r
180 (VOID*)Ptr\r
181 );\r
182 if (EFI_ERROR (Status)) {\r
183 Print (L"ERROR: Failed to dump table to binary file.\n");\r
184 TransferBytes = 0;\r
185 } else {\r
186 Print (L"DONE.\n");\r
187 }\r
188\r
189 ShellCloseFile (&DumpFileHandle);\r
190 return (Length == TransferBytes);\r
191}\r
192\r
a6eaba4d
DB
193/**\r
194 This function processes the table reporting options for the ACPI table.\r
ee4dc24f
RN
195\r
196 @param [in] Signature The ACPI table Signature.\r
197 @param [in] TablePtr Pointer to the ACPI table data.\r
198 @param [in] Length The length fo the ACPI table.\r
199\r
200 @retval Returns TRUE if the ACPI table should be traced.\r
a6eaba4d 201**/\r
ee4dc24f
RN
202BOOLEAN\r
203ProcessTableReportOptions (\r
204 IN CONST UINT32 Signature,\r
205 IN CONST UINT8* TablePtr,\r
206 IN CONST UINT32 Length\r
207 )\r
208{\r
209 UINTN OriginalAttribute;\r
f75c7478
DB
210 UINT8* SignaturePtr;\r
211 BOOLEAN Log;\r
212 BOOLEAN HighLight;\r
213\r
0154e02d
SZ
214 //\r
215 // set local variables to suppress incorrect compiler/analyzer warnings\r
216 //\r
217 OriginalAttribute = 0;\r
f75c7478
DB
218 SignaturePtr = (UINT8*)(UINTN)&Signature;\r
219 Log = FALSE;\r
220 HighLight = GetColourHighlighting ();\r
221\r
ee4dc24f 222 switch (GetReportOption ()) {\r
f75c7478 223 case ReportAll:\r
ee4dc24f
RN
224 Log = TRUE;\r
225 break;\r
f75c7478 226 case ReportSelected:\r
ee4dc24f
RN
227 if (Signature == GetSelectedAcpiTable ()) {\r
228 Log = TRUE;\r
229 mSelectedAcpiTableFound = TRUE;\r
230 }\r
231 break;\r
f75c7478 232 case ReportTableList:\r
ee4dc24f
RN
233 if (mTableCount == 0) {\r
234 if (HighLight) {\r
235 OriginalAttribute = gST->ConOut->Mode->Attribute;\r
236 gST->ConOut->SetAttribute (\r
237 gST->ConOut,\r
238 EFI_TEXT_ATTR(EFI_CYAN,\r
239 ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4))\r
240 );\r
241 }\r
242 Print (L"\nInstalled Table(s):\n");\r
243 if (HighLight) {\r
244 gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute);\r
245 }\r
246 }\r
247 Print (\r
248 L"\t%4d. %c%c%c%c\n",\r
249 ++mTableCount,\r
250 SignaturePtr[0],\r
251 SignaturePtr[1],\r
252 SignaturePtr[2],\r
253 SignaturePtr[3]\r
254 );\r
255 break;\r
f75c7478 256 case ReportDumpBinFile:\r
ee4dc24f
RN
257 if (Signature == GetSelectedAcpiTable ()) {\r
258 mSelectedAcpiTableFound = TRUE;\r
259 DumpAcpiTableToFile (TablePtr, Length);\r
260 }\r
261 break;\r
f75c7478 262 case ReportMax:\r
ee4dc24f
RN
263 // We should never be here.\r
264 // This case is only present to prevent compiler warning.\r
265 break;\r
266 } // switch\r
267\r
268 if (Log) {\r
269 if (HighLight) {\r
270 OriginalAttribute = gST->ConOut->Mode->Attribute;\r
271 gST->ConOut->SetAttribute (\r
272 gST->ConOut,\r
273 EFI_TEXT_ATTR(EFI_LIGHTBLUE,\r
274 ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4))\r
275 );\r
276 }\r
277 Print (\r
278 L"\n\n --------------- %c%c%c%c Table --------------- \n\n",\r
279 SignaturePtr[0],\r
280 SignaturePtr[1],\r
281 SignaturePtr[2],\r
282 SignaturePtr[3]\r
283 );\r
284 if (HighLight) {\r
285 gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute);\r
286 }\r
287 }\r
288\r
289 return Log;\r
290}\r
291\r
a6eaba4d
DB
292/**\r
293 This function converts a string to ACPI table signature.\r
ee4dc24f
RN
294\r
295 @param [in] Str Pointer to the string to be converted to the\r
296 ACPI table signature.\r
297\r
298 @retval The ACPI table signature.\r
a6eaba4d 299**/\r
ee4dc24f
RN
300STATIC\r
301UINT32\r
302ConvertStrToAcpiSignature (\r
303 IN CONST CHAR16* Str\r
304 )\r
305{\r
f75c7478 306 UINT8 Index;\r
ee4dc24f
RN
307 CHAR8 Ptr[4];\r
308\r
81038d50 309 ZeroMem (Ptr, sizeof (Ptr));\r
f75c7478
DB
310 Index = 0;\r
311\r
ee4dc24f
RN
312 // Convert to Upper case and convert to ASCII\r
313 while ((Index < 4) && (Str[Index] != 0)) {\r
314 if (Str[Index] >= L'a' && Str[Index] <= L'z') {\r
315 Ptr[Index] = (CHAR8)(Str[Index] - (L'a' - L'A'));\r
316 } else {\r
317 Ptr[Index] = (CHAR8)Str[Index];\r
318 }\r
319 Index++;\r
320 }\r
321 return *(UINT32*)Ptr;\r
322}\r
323\r
a6eaba4d
DB
324/**\r
325 This function iterates the configuration table entries in the\r
326 system table, retrieves the RSDP pointer and starts parsing the ACPI tables.\r
ee4dc24f
RN
327\r
328 @param [in] SystemTable Pointer to the EFI system table.\r
329\r
330 @retval Returns EFI_NOT_FOUND if the RSDP pointer is not found.\r
331 Returns EFI_UNSUPPORTED if the RSDP version is less than 2.\r
332 Returns EFI_SUCCESS if successful.\r
a6eaba4d 333**/\r
ee4dc24f
RN
334STATIC\r
335EFI_STATUS\r
336EFIAPI\r
337AcpiView (\r
338 IN EFI_SYSTEM_TABLE* SystemTable\r
339 )\r
340{\r
341 EFI_STATUS Status;\r
342 UINTN Index;\r
343 EFI_CONFIGURATION_TABLE* EfiConfigurationTable;\r
344 BOOLEAN FoundAcpiTable;\r
345 UINTN OriginalAttribute;\r
346 UINTN PrintAttribute;\r
347 EREPORT_OPTION ReportOption;\r
348 UINT8* RsdpPtr;\r
349 UINT32 RsdpLength;\r
350 UINT8 RsdpRevision;\r
351 PARSE_ACPI_TABLE_PROC RsdpParserProc;\r
352 BOOLEAN Trace;\r
353\r
0154e02d
SZ
354 //\r
355 // set local variables to suppress incorrect compiler/analyzer warnings\r
356 //\r
357 EfiConfigurationTable = NULL;\r
358 OriginalAttribute = 0;\r
359\r
ee4dc24f
RN
360 // Search the table for an entry that matches the ACPI Table Guid\r
361 FoundAcpiTable = FALSE;\r
362 for (Index = 0; Index < SystemTable->NumberOfTableEntries; Index++) {\r
363 if (CompareGuid (&gEfiAcpiTableGuid,\r
364 &(SystemTable->ConfigurationTable[Index].VendorGuid))) {\r
365 EfiConfigurationTable = &SystemTable->ConfigurationTable[Index];\r
366 FoundAcpiTable = TRUE;\r
367 break;\r
368 }\r
369 }\r
370\r
371 if (FoundAcpiTable) {\r
372 RsdpPtr = (UINT8*)EfiConfigurationTable->VendorTable;\r
373\r
374 // The RSDP revision is 1 byte starting at offset 15\r
375 RsdpRevision = *(RsdpPtr + RSDP_REVISION_OFFSET);\r
376\r
377 if (RsdpRevision < 2) {\r
378 Print (\r
379 L"ERROR: RSDP version less than 2 is not supported.\n"\r
380 );\r
381 return EFI_UNSUPPORTED;\r
382 }\r
383\r
384 // The RSDP length is 4 bytes starting at offset 20\r
385 RsdpLength = *(UINT32*)(RsdpPtr + RSDP_LENGTH_OFFSET);\r
386\r
387 Trace = ProcessTableReportOptions (RSDP_TABLE_INFO, RsdpPtr, RsdpLength);\r
388\r
389 Status = GetParser (RSDP_TABLE_INFO, &RsdpParserProc);\r
390 if (EFI_ERROR (Status)) {\r
391 Print (\r
392 L"ERROR: No registered parser found for RSDP.\n"\r
393 );\r
394 return Status;\r
395 }\r
396\r
397 RsdpParserProc (\r
398 Trace,\r
399 RsdpPtr,\r
400 RsdpLength,\r
401 RsdpRevision\r
402 );\r
403\r
404 } else {\r
405 IncrementErrorCount ();\r
406 Print (\r
407 L"ERROR: Failed to find ACPI Table Guid in System Configuration Table.\n"\r
408 );\r
409 return EFI_NOT_FOUND;\r
410 }\r
411\r
412 ReportOption = GetReportOption ();\r
f75c7478
DB
413 if (ReportTableList != ReportOption) {\r
414 if (((ReportSelected == ReportOption) ||\r
415 (ReportDumpBinFile == ReportOption)) &&\r
ee4dc24f
RN
416 (!mSelectedAcpiTableFound)) {\r
417 Print (L"\nRequested ACPI Table not found.\n");\r
f73843d5
KK
418 } else if (GetConsistencyChecking () &&\r
419 (ReportDumpBinFile != ReportOption)) {\r
ee4dc24f
RN
420 OriginalAttribute = gST->ConOut->Mode->Attribute;\r
421\r
422 Print (L"\nTable Statistics:\n");\r
423\r
424 if (GetColourHighlighting ()) {\r
425 PrintAttribute = (GetErrorCount () > 0) ?\r
426 EFI_TEXT_ATTR (\r
427 EFI_RED,\r
428 ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)\r
429 ) :\r
430 OriginalAttribute;\r
431 gST->ConOut->SetAttribute (gST->ConOut, PrintAttribute);\r
432 }\r
433 Print (L"\t%d Error(s)\n", GetErrorCount ());\r
434\r
435 if (GetColourHighlighting ()) {\r
436 PrintAttribute = (GetWarningCount () > 0) ?\r
437 EFI_TEXT_ATTR (\r
438 EFI_RED,\r
439 ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)\r
440 ) :\r
441 OriginalAttribute;\r
442\r
443 gST->ConOut->SetAttribute (gST->ConOut, PrintAttribute);\r
444 }\r
445 Print (L"\t%d Warning(s)\n", GetWarningCount ());\r
446\r
447 if (GetColourHighlighting ()) {\r
448 gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute);\r
449 }\r
450 }\r
451 }\r
452 return EFI_SUCCESS;\r
453}\r
454\r
455/**\r
456 Function for 'acpiview' command.\r
457\r
458 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
459 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
a6eaba4d 460**/\r
ee4dc24f
RN
461SHELL_STATUS\r
462EFIAPI\r
463ShellCommandRunAcpiView (\r
464 IN EFI_HANDLE ImageHandle,\r
465 IN EFI_SYSTEM_TABLE* SystemTable\r
466 )\r
467{\r
468 EFI_STATUS Status;\r
f75c7478
DB
469 SHELL_STATUS ShellStatus;\r
470 LIST_ENTRY* Package;\r
ee4dc24f 471 CHAR16* ProblemParam;\r
f75c7478 472 SHELL_FILE_HANDLE TmpDumpFileHandle;\r
ee4dc24f
RN
473\r
474 // Set Defaults\r
f75c7478 475 mReportType = ReportAll;\r
ee4dc24f
RN
476 mTableCount = 0;\r
477 mBinTableCount = 0;\r
478 mSelectedAcpiTable = 0;\r
479 mSelectedAcpiTableName = NULL;\r
480 mSelectedAcpiTableFound = FALSE;\r
ee4dc24f
RN
481 mConsistencyCheck = TRUE;\r
482\r
f75c7478
DB
483 ShellStatus = SHELL_SUCCESS;\r
484 Package = NULL;\r
485 TmpDumpFileHandle = NULL;\r
486\r
ee4dc24f
RN
487 // Reset The error/warning counters\r
488 ResetErrorCount ();\r
489 ResetWarningCount ();\r
490\r
491 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
492 if (EFI_ERROR (Status)) {\r
493 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
494 ShellPrintHiiEx (\r
495 -1,\r
496 -1,\r
497 NULL,\r
498 STRING_TOKEN (STR_GEN_PROBLEM),\r
499 gShellAcpiViewHiiHandle,\r
500 L"acpiview",\r
501 ProblemParam\r
502 );\r
503 FreePool (ProblemParam);\r
504 } else {\r
505 Print (L"acpiview: Error processing input parameter(s)\n");\r
506 }\r
507 ShellStatus = SHELL_INVALID_PARAMETER;\r
508 } else {\r
509 if (ShellCommandLineGetCount (Package) > 1) {\r
510 ShellPrintHiiEx (\r
511 -1,\r
512 -1,\r
513 NULL,\r
514 STRING_TOKEN (STR_GEN_TOO_MANY),\r
515 gShellAcpiViewHiiHandle,\r
516 L"acpiview"\r
517 );\r
518 ShellStatus = SHELL_INVALID_PARAMETER;\r
519 } else if (ShellCommandLineGetFlag (Package, L"-?")) {\r
520 ShellPrintHiiEx (\r
521 -1,\r
522 -1,\r
523 NULL,\r
524 STRING_TOKEN (STR_GET_HELP_ACPIVIEW),\r
525 gShellAcpiViewHiiHandle,\r
526 L"acpiview"\r
527 );\r
528 } else if (ShellCommandLineGetFlag (Package, L"-s") &&\r
529 ShellCommandLineGetValue (Package, L"-s") == NULL) {\r
530 ShellPrintHiiEx (\r
531 -1,\r
532 -1,\r
533 NULL,\r
534 STRING_TOKEN (STR_GEN_NO_VALUE),\r
535 gShellAcpiViewHiiHandle,\r
536 L"acpiview",\r
537 L"-s"\r
538 );\r
539 ShellStatus = SHELL_INVALID_PARAMETER;\r
540 } else if ((ShellCommandLineGetFlag (Package, L"-s") &&\r
541 ShellCommandLineGetFlag (Package, L"-l"))) {\r
542 ShellPrintHiiEx (\r
543 -1,\r
544 -1,\r
545 NULL,\r
546 STRING_TOKEN (STR_GEN_TOO_MANY),\r
547 gShellAcpiViewHiiHandle,\r
548 L"acpiview"\r
549 );\r
550 ShellStatus = SHELL_INVALID_PARAMETER;\r
ee4dc24f
RN
551 } else if (ShellCommandLineGetFlag (Package, L"-d") &&\r
552 !ShellCommandLineGetFlag (Package, L"-s")) {\r
553 ShellPrintHiiEx (\r
554 -1,\r
555 -1,\r
556 NULL,\r
557 STRING_TOKEN (STR_GEN_MISSING_OPTION),\r
558 gShellAcpiViewHiiHandle,\r
559 L"acpiview",\r
560 L"-s",\r
561 L"-d"\r
562 );\r
563 ShellStatus = SHELL_INVALID_PARAMETER;\r
564 } else {\r
4286eb22
KK
565 // Turn on colour highlighting if requested\r
566 SetColourHighlighting (ShellCommandLineGetFlag (Package, L"-h"));\r
ee4dc24f 567\r
f73843d5
KK
568 // Surpress consistency checking if requested\r
569 SetConsistencyChecking (!ShellCommandLineGetFlag (Package, L"-q"));\r
570\r
ee4dc24f 571 if (ShellCommandLineGetFlag (Package, L"-l")) {\r
f75c7478 572 mReportType = ReportTableList;\r
ee4dc24f
RN
573 } else {\r
574 mSelectedAcpiTableName = ShellCommandLineGetValue (Package, L"-s");\r
575 if (mSelectedAcpiTableName != NULL) {\r
576 mSelectedAcpiTable = (UINT32)ConvertStrToAcpiSignature (\r
577 mSelectedAcpiTableName\r
578 );\r
f75c7478 579 mReportType = ReportSelected;\r
ee4dc24f
RN
580\r
581 if (ShellCommandLineGetFlag (Package, L"-d")) {\r
582 // Create a temporary file to check if the media is writable.\r
583 CHAR16 FileNameBuffer[MAX_FILE_NAME_LEN];\r
f75c7478 584 mReportType = ReportDumpBinFile;\r
ee4dc24f
RN
585\r
586 UnicodeSPrint (\r
587 FileNameBuffer,\r
588 sizeof (FileNameBuffer),\r
589 L".\\%s%04d.tmp",\r
590 mSelectedAcpiTableName,\r
591 mBinTableCount\r
592 );\r
593\r
594 Status = ShellOpenFileByName (\r
595 FileNameBuffer,\r
596 &TmpDumpFileHandle,\r
597 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE |\r
598 EFI_FILE_MODE_CREATE,\r
599 0\r
600 );\r
601\r
602 if (EFI_ERROR (Status)) {\r
603 ShellStatus = SHELL_INVALID_PARAMETER;\r
604 TmpDumpFileHandle = NULL;\r
605 ShellPrintHiiEx (\r
606 -1,\r
607 -1,\r
608 NULL,\r
609 STRING_TOKEN (STR_GEN_READONLY_MEDIA),\r
610 gShellAcpiViewHiiHandle,\r
611 L"acpiview"\r
612 );\r
613 goto Done;\r
614 }\r
615 // Delete Temporary file.\r
616 ShellDeleteFile (&TmpDumpFileHandle);\r
617 } // -d\r
618 } // -s\r
619 }\r
620\r
621 // Parse ACPI Table information\r
622 Status = AcpiView (SystemTable);\r
623 if (EFI_ERROR (Status)) {\r
624 ShellStatus = SHELL_NOT_FOUND;\r
625 }\r
626 }\r
627 }\r
628\r
629Done:\r
630 if (Package != NULL) {\r
631 ShellCommandLineFreeVarList (Package);\r
632 }\r
633 return ShellStatus;\r
634}\r