]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c
ShellPkg/UefiShellAcpiViewCommandLib: Fix ECC issues
[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
f75c7478
DB
287 Index = 0;\r
288\r
ee4dc24f
RN
289 // Convert to Upper case and convert to ASCII\r
290 while ((Index < 4) && (Str[Index] != 0)) {\r
291 if (Str[Index] >= L'a' && Str[Index] <= L'z') {\r
292 Ptr[Index] = (CHAR8)(Str[Index] - (L'a' - L'A'));\r
293 } else {\r
294 Ptr[Index] = (CHAR8)Str[Index];\r
295 }\r
296 Index++;\r
297 }\r
298 return *(UINT32*)Ptr;\r
299}\r
300\r
a6eaba4d
DB
301/**\r
302 This function iterates the configuration table entries in the\r
303 system table, retrieves the RSDP pointer and starts parsing the ACPI tables.\r
ee4dc24f
RN
304\r
305 @param [in] SystemTable Pointer to the EFI system table.\r
306\r
307 @retval Returns EFI_NOT_FOUND if the RSDP pointer is not found.\r
308 Returns EFI_UNSUPPORTED if the RSDP version is less than 2.\r
309 Returns EFI_SUCCESS if successful.\r
a6eaba4d 310**/\r
ee4dc24f
RN
311STATIC\r
312EFI_STATUS\r
313EFIAPI\r
314AcpiView (\r
315 IN EFI_SYSTEM_TABLE* SystemTable\r
316 )\r
317{\r
318 EFI_STATUS Status;\r
319 UINTN Index;\r
320 EFI_CONFIGURATION_TABLE* EfiConfigurationTable;\r
321 BOOLEAN FoundAcpiTable;\r
322 UINTN OriginalAttribute;\r
323 UINTN PrintAttribute;\r
324 EREPORT_OPTION ReportOption;\r
325 UINT8* RsdpPtr;\r
326 UINT32 RsdpLength;\r
327 UINT8 RsdpRevision;\r
328 PARSE_ACPI_TABLE_PROC RsdpParserProc;\r
329 BOOLEAN Trace;\r
330\r
331 // Search the table for an entry that matches the ACPI Table Guid\r
332 FoundAcpiTable = FALSE;\r
333 for (Index = 0; Index < SystemTable->NumberOfTableEntries; Index++) {\r
334 if (CompareGuid (&gEfiAcpiTableGuid,\r
335 &(SystemTable->ConfigurationTable[Index].VendorGuid))) {\r
336 EfiConfigurationTable = &SystemTable->ConfigurationTable[Index];\r
337 FoundAcpiTable = TRUE;\r
338 break;\r
339 }\r
340 }\r
341\r
342 if (FoundAcpiTable) {\r
343 RsdpPtr = (UINT8*)EfiConfigurationTable->VendorTable;\r
344\r
345 // The RSDP revision is 1 byte starting at offset 15\r
346 RsdpRevision = *(RsdpPtr + RSDP_REVISION_OFFSET);\r
347\r
348 if (RsdpRevision < 2) {\r
349 Print (\r
350 L"ERROR: RSDP version less than 2 is not supported.\n"\r
351 );\r
352 return EFI_UNSUPPORTED;\r
353 }\r
354\r
355 // The RSDP length is 4 bytes starting at offset 20\r
356 RsdpLength = *(UINT32*)(RsdpPtr + RSDP_LENGTH_OFFSET);\r
357\r
358 Trace = ProcessTableReportOptions (RSDP_TABLE_INFO, RsdpPtr, RsdpLength);\r
359\r
360 Status = GetParser (RSDP_TABLE_INFO, &RsdpParserProc);\r
361 if (EFI_ERROR (Status)) {\r
362 Print (\r
363 L"ERROR: No registered parser found for RSDP.\n"\r
364 );\r
365 return Status;\r
366 }\r
367\r
368 RsdpParserProc (\r
369 Trace,\r
370 RsdpPtr,\r
371 RsdpLength,\r
372 RsdpRevision\r
373 );\r
374\r
375 } else {\r
376 IncrementErrorCount ();\r
377 Print (\r
378 L"ERROR: Failed to find ACPI Table Guid in System Configuration Table.\n"\r
379 );\r
380 return EFI_NOT_FOUND;\r
381 }\r
382\r
383 ReportOption = GetReportOption ();\r
f75c7478
DB
384 if (ReportTableList != ReportOption) {\r
385 if (((ReportSelected == ReportOption) ||\r
386 (ReportDumpBinFile == ReportOption)) &&\r
ee4dc24f
RN
387 (!mSelectedAcpiTableFound)) {\r
388 Print (L"\nRequested ACPI Table not found.\n");\r
f75c7478 389 } else if (ReportDumpBinFile != ReportOption) {\r
ee4dc24f
RN
390 OriginalAttribute = gST->ConOut->Mode->Attribute;\r
391\r
392 Print (L"\nTable Statistics:\n");\r
393\r
394 if (GetColourHighlighting ()) {\r
395 PrintAttribute = (GetErrorCount () > 0) ?\r
396 EFI_TEXT_ATTR (\r
397 EFI_RED,\r
398 ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)\r
399 ) :\r
400 OriginalAttribute;\r
401 gST->ConOut->SetAttribute (gST->ConOut, PrintAttribute);\r
402 }\r
403 Print (L"\t%d Error(s)\n", GetErrorCount ());\r
404\r
405 if (GetColourHighlighting ()) {\r
406 PrintAttribute = (GetWarningCount () > 0) ?\r
407 EFI_TEXT_ATTR (\r
408 EFI_RED,\r
409 ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)\r
410 ) :\r
411 OriginalAttribute;\r
412\r
413 gST->ConOut->SetAttribute (gST->ConOut, PrintAttribute);\r
414 }\r
415 Print (L"\t%d Warning(s)\n", GetWarningCount ());\r
416\r
417 if (GetColourHighlighting ()) {\r
418 gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute);\r
419 }\r
420 }\r
421 }\r
422 return EFI_SUCCESS;\r
423}\r
424\r
425/**\r
426 Function for 'acpiview' command.\r
427\r
428 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
429 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
a6eaba4d 430**/\r
ee4dc24f
RN
431SHELL_STATUS\r
432EFIAPI\r
433ShellCommandRunAcpiView (\r
434 IN EFI_HANDLE ImageHandle,\r
435 IN EFI_SYSTEM_TABLE* SystemTable\r
436 )\r
437{\r
438 EFI_STATUS Status;\r
f75c7478
DB
439 SHELL_STATUS ShellStatus;\r
440 LIST_ENTRY* Package;\r
ee4dc24f
RN
441 CHAR16* ProblemParam;\r
442 CONST CHAR16* Temp;\r
443 CHAR8 ColourOption[8];\r
f75c7478 444 SHELL_FILE_HANDLE TmpDumpFileHandle;\r
ee4dc24f
RN
445\r
446 // Set Defaults\r
f75c7478 447 mReportType = ReportAll;\r
ee4dc24f
RN
448 mTableCount = 0;\r
449 mBinTableCount = 0;\r
450 mSelectedAcpiTable = 0;\r
451 mSelectedAcpiTableName = NULL;\r
452 mSelectedAcpiTableFound = FALSE;\r
453 mVerbose = TRUE;\r
454 mConsistencyCheck = TRUE;\r
455\r
f75c7478
DB
456 ShellStatus = SHELL_SUCCESS;\r
457 Package = NULL;\r
458 TmpDumpFileHandle = NULL;\r
459\r
ee4dc24f
RN
460 // Reset The error/warning counters\r
461 ResetErrorCount ();\r
462 ResetWarningCount ();\r
463\r
464 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
465 if (EFI_ERROR (Status)) {\r
466 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
467 ShellPrintHiiEx (\r
468 -1,\r
469 -1,\r
470 NULL,\r
471 STRING_TOKEN (STR_GEN_PROBLEM),\r
472 gShellAcpiViewHiiHandle,\r
473 L"acpiview",\r
474 ProblemParam\r
475 );\r
476 FreePool (ProblemParam);\r
477 } else {\r
478 Print (L"acpiview: Error processing input parameter(s)\n");\r
479 }\r
480 ShellStatus = SHELL_INVALID_PARAMETER;\r
481 } else {\r
482 if (ShellCommandLineGetCount (Package) > 1) {\r
483 ShellPrintHiiEx (\r
484 -1,\r
485 -1,\r
486 NULL,\r
487 STRING_TOKEN (STR_GEN_TOO_MANY),\r
488 gShellAcpiViewHiiHandle,\r
489 L"acpiview"\r
490 );\r
491 ShellStatus = SHELL_INVALID_PARAMETER;\r
492 } else if (ShellCommandLineGetFlag (Package, L"-?")) {\r
493 ShellPrintHiiEx (\r
494 -1,\r
495 -1,\r
496 NULL,\r
497 STRING_TOKEN (STR_GET_HELP_ACPIVIEW),\r
498 gShellAcpiViewHiiHandle,\r
499 L"acpiview"\r
500 );\r
501 } else if (ShellCommandLineGetFlag (Package, L"-s") &&\r
502 ShellCommandLineGetValue (Package, L"-s") == NULL) {\r
503 ShellPrintHiiEx (\r
504 -1,\r
505 -1,\r
506 NULL,\r
507 STRING_TOKEN (STR_GEN_NO_VALUE),\r
508 gShellAcpiViewHiiHandle,\r
509 L"acpiview",\r
510 L"-s"\r
511 );\r
512 ShellStatus = SHELL_INVALID_PARAMETER;\r
513 } else if ((ShellCommandLineGetFlag (Package, L"-s") &&\r
514 ShellCommandLineGetFlag (Package, L"-l"))) {\r
515 ShellPrintHiiEx (\r
516 -1,\r
517 -1,\r
518 NULL,\r
519 STRING_TOKEN (STR_GEN_TOO_MANY),\r
520 gShellAcpiViewHiiHandle,\r
521 L"acpiview"\r
522 );\r
523 ShellStatus = SHELL_INVALID_PARAMETER;\r
524 } else if (ShellCommandLineGetFlag (Package, L"-h") &&\r
525 ShellCommandLineGetValue (Package, L"-h") == NULL) {\r
526 ShellPrintHiiEx (\r
527 -1,\r
528 -1,\r
529 NULL,\r
530 STRING_TOKEN (STR_GEN_NO_VALUE),\r
531 gShellAcpiViewHiiHandle,\r
532 L"acpiview",\r
533 L"-h"\r
534 );\r
535 ShellStatus = SHELL_INVALID_PARAMETER;\r
536 } else if (ShellCommandLineGetFlag (Package, L"-d") &&\r
537 !ShellCommandLineGetFlag (Package, L"-s")) {\r
538 ShellPrintHiiEx (\r
539 -1,\r
540 -1,\r
541 NULL,\r
542 STRING_TOKEN (STR_GEN_MISSING_OPTION),\r
543 gShellAcpiViewHiiHandle,\r
544 L"acpiview",\r
545 L"-s",\r
546 L"-d"\r
547 );\r
548 ShellStatus = SHELL_INVALID_PARAMETER;\r
549 } else {\r
550 // Check if the colour option is set\r
551 Temp = ShellCommandLineGetValue (Package, L"-h");\r
552 if (Temp != NULL) {\r
553 UnicodeStrToAsciiStrS (Temp, ColourOption, sizeof (ColourOption));\r
554 if ((AsciiStriCmp (ColourOption, "ON") == 0) ||\r
555 (AsciiStriCmp (ColourOption, "TRUE") == 0)) {\r
556 SetColourHighlighting (TRUE);\r
557 } else if ((AsciiStriCmp (ColourOption, "OFF") == 0) ||\r
558 (AsciiStriCmp (ColourOption, "FALSE") == 0)) {\r
559 SetColourHighlighting (FALSE);\r
560 }\r
561 }\r
562\r
563 if (ShellCommandLineGetFlag (Package, L"-l")) {\r
f75c7478 564 mReportType = ReportTableList;\r
ee4dc24f
RN
565 } else {\r
566 mSelectedAcpiTableName = ShellCommandLineGetValue (Package, L"-s");\r
567 if (mSelectedAcpiTableName != NULL) {\r
568 mSelectedAcpiTable = (UINT32)ConvertStrToAcpiSignature (\r
569 mSelectedAcpiTableName\r
570 );\r
f75c7478 571 mReportType = ReportSelected;\r
ee4dc24f
RN
572\r
573 if (ShellCommandLineGetFlag (Package, L"-d")) {\r
574 // Create a temporary file to check if the media is writable.\r
575 CHAR16 FileNameBuffer[MAX_FILE_NAME_LEN];\r
f75c7478 576 mReportType = ReportDumpBinFile;\r
ee4dc24f
RN
577\r
578 UnicodeSPrint (\r
579 FileNameBuffer,\r
580 sizeof (FileNameBuffer),\r
581 L".\\%s%04d.tmp",\r
582 mSelectedAcpiTableName,\r
583 mBinTableCount\r
584 );\r
585\r
586 Status = ShellOpenFileByName (\r
587 FileNameBuffer,\r
588 &TmpDumpFileHandle,\r
589 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE |\r
590 EFI_FILE_MODE_CREATE,\r
591 0\r
592 );\r
593\r
594 if (EFI_ERROR (Status)) {\r
595 ShellStatus = SHELL_INVALID_PARAMETER;\r
596 TmpDumpFileHandle = NULL;\r
597 ShellPrintHiiEx (\r
598 -1,\r
599 -1,\r
600 NULL,\r
601 STRING_TOKEN (STR_GEN_READONLY_MEDIA),\r
602 gShellAcpiViewHiiHandle,\r
603 L"acpiview"\r
604 );\r
605 goto Done;\r
606 }\r
607 // Delete Temporary file.\r
608 ShellDeleteFile (&TmpDumpFileHandle);\r
609 } // -d\r
610 } // -s\r
611 }\r
612\r
613 // Parse ACPI Table information\r
614 Status = AcpiView (SystemTable);\r
615 if (EFI_ERROR (Status)) {\r
616 ShellStatus = SHELL_NOT_FOUND;\r
617 }\r
618 }\r
619 }\r
620\r
621Done:\r
622 if (Package != NULL) {\r
623 ShellCommandLineFreeVarList (Package);\r
624 }\r
625 return ShellStatus;\r
626}\r