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