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