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