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