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