]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiView.c
ShellPkg: acpiview: Check if SBBR mandatory ACPI tables are installed
[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
ee4dc24f
RN
427 // Search the table for an entry that matches the ACPI Table Guid\r
428 FoundAcpiTable = FALSE;\r
429 for (Index = 0; Index < SystemTable->NumberOfTableEntries; Index++) {\r
430 if (CompareGuid (&gEfiAcpiTableGuid,\r
431 &(SystemTable->ConfigurationTable[Index].VendorGuid))) {\r
432 EfiConfigurationTable = &SystemTable->ConfigurationTable[Index];\r
433 FoundAcpiTable = TRUE;\r
434 break;\r
435 }\r
436 }\r
437\r
438 if (FoundAcpiTable) {\r
439 RsdpPtr = (UINT8*)EfiConfigurationTable->VendorTable;\r
440\r
441 // The RSDP revision is 1 byte starting at offset 15\r
442 RsdpRevision = *(RsdpPtr + RSDP_REVISION_OFFSET);\r
443\r
444 if (RsdpRevision < 2) {\r
445 Print (\r
446 L"ERROR: RSDP version less than 2 is not supported.\n"\r
447 );\r
448 return EFI_UNSUPPORTED;\r
449 }\r
450\r
faef5a36
KK
451#if defined(MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)\r
452 if (GetMandatoryTableValidate ()) {\r
453 ArmSbbrResetTableCounts ();\r
454 }\r
455#endif\r
456\r
ee4dc24f
RN
457 // The RSDP length is 4 bytes starting at offset 20\r
458 RsdpLength = *(UINT32*)(RsdpPtr + RSDP_LENGTH_OFFSET);\r
459\r
460 Trace = ProcessTableReportOptions (RSDP_TABLE_INFO, RsdpPtr, RsdpLength);\r
461\r
462 Status = GetParser (RSDP_TABLE_INFO, &RsdpParserProc);\r
463 if (EFI_ERROR (Status)) {\r
464 Print (\r
465 L"ERROR: No registered parser found for RSDP.\n"\r
466 );\r
467 return Status;\r
468 }\r
469\r
470 RsdpParserProc (\r
471 Trace,\r
472 RsdpPtr,\r
473 RsdpLength,\r
474 RsdpRevision\r
475 );\r
476\r
477 } else {\r
478 IncrementErrorCount ();\r
479 Print (\r
480 L"ERROR: Failed to find ACPI Table Guid in System Configuration Table.\n"\r
481 );\r
482 return EFI_NOT_FOUND;\r
483 }\r
484\r
faef5a36
KK
485#if defined(MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)\r
486 if (GetMandatoryTableValidate ()) {\r
487 ArmSbbrReqsValidate ((ARM_SBBR_VERSION)GetMandatoryTableSpec ());\r
488 }\r
489#endif\r
490\r
ee4dc24f 491 ReportOption = GetReportOption ();\r
f75c7478
DB
492 if (ReportTableList != ReportOption) {\r
493 if (((ReportSelected == ReportOption) ||\r
494 (ReportDumpBinFile == ReportOption)) &&\r
ee4dc24f
RN
495 (!mSelectedAcpiTableFound)) {\r
496 Print (L"\nRequested ACPI Table not found.\n");\r
f73843d5
KK
497 } else if (GetConsistencyChecking () &&\r
498 (ReportDumpBinFile != ReportOption)) {\r
ee4dc24f
RN
499 OriginalAttribute = gST->ConOut->Mode->Attribute;\r
500\r
501 Print (L"\nTable Statistics:\n");\r
502\r
503 if (GetColourHighlighting ()) {\r
504 PrintAttribute = (GetErrorCount () > 0) ?\r
505 EFI_TEXT_ATTR (\r
506 EFI_RED,\r
507 ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)\r
508 ) :\r
509 OriginalAttribute;\r
510 gST->ConOut->SetAttribute (gST->ConOut, PrintAttribute);\r
511 }\r
512 Print (L"\t%d Error(s)\n", GetErrorCount ());\r
513\r
514 if (GetColourHighlighting ()) {\r
515 PrintAttribute = (GetWarningCount () > 0) ?\r
516 EFI_TEXT_ATTR (\r
517 EFI_RED,\r
518 ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)\r
519 ) :\r
520 OriginalAttribute;\r
521\r
522 gST->ConOut->SetAttribute (gST->ConOut, PrintAttribute);\r
523 }\r
524 Print (L"\t%d Warning(s)\n", GetWarningCount ());\r
525\r
526 if (GetColourHighlighting ()) {\r
527 gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute);\r
528 }\r
529 }\r
530 }\r
531 return EFI_SUCCESS;\r
532}\r
533\r
534/**\r
535 Function for 'acpiview' command.\r
536\r
537 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
538 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
a6eaba4d 539**/\r
ee4dc24f
RN
540SHELL_STATUS\r
541EFIAPI\r
542ShellCommandRunAcpiView (\r
543 IN EFI_HANDLE ImageHandle,\r
544 IN EFI_SYSTEM_TABLE* SystemTable\r
545 )\r
546{\r
547 EFI_STATUS Status;\r
f75c7478
DB
548 SHELL_STATUS ShellStatus;\r
549 LIST_ENTRY* Package;\r
ee4dc24f 550 CHAR16* ProblemParam;\r
f75c7478 551 SHELL_FILE_HANDLE TmpDumpFileHandle;\r
8af507c1 552 CONST CHAR16* MandatoryTableSpecStr;\r
ee4dc24f
RN
553\r
554 // Set Defaults\r
f75c7478 555 mReportType = ReportAll;\r
ee4dc24f
RN
556 mTableCount = 0;\r
557 mBinTableCount = 0;\r
558 mSelectedAcpiTable = 0;\r
559 mSelectedAcpiTableName = NULL;\r
560 mSelectedAcpiTableFound = FALSE;\r
ee4dc24f 561 mConsistencyCheck = TRUE;\r
8af507c1
KK
562 mMandatoryTableValidate = FALSE;\r
563 mMandatoryTableSpec = 0;\r
ee4dc24f 564\r
f75c7478
DB
565 ShellStatus = SHELL_SUCCESS;\r
566 Package = NULL;\r
567 TmpDumpFileHandle = NULL;\r
568\r
ee4dc24f
RN
569 // Reset The error/warning counters\r
570 ResetErrorCount ();\r
571 ResetWarningCount ();\r
572\r
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