mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-28 09:43:50 +01:00 
			
		
		
		
	The UefiShellAcpiViewCommandLib is converted from NULL library to a named library so that it may be used in modules other than shell. The library interface exposes the main method for to AcpiView functionality as well as a helper method to dump a buffer to a file. The Shell module is still built by pulling UefiShellAcpiViewCommandLib as a NULL library to preserve the modularity of shell builds. Cc: Ray Ni <ray.ni@intel.com> Cc: Zhichao Gao <zhichao.gao@intel.com> Reviewed-by: Zhichao Gao <zhichao.gao@intel.com> Signed-off-by: Tomas Pilar <tomas.pilar@arm.com>
		
			
				
	
	
		
			325 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			325 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| 
 | |
|   Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
|   @par Glossary:
 | |
|     - Sbbr or SBBR   - Server Base Boot Requirements
 | |
| 
 | |
|   @par Reference(s):
 | |
|     - Arm Server Base Boot Requirements 1.2, September 2019
 | |
| **/
 | |
| 
 | |
| #include <Library/PrintLib.h>
 | |
| #include <Library/UefiLib.h>
 | |
| #include <Library/ShellLib.h>
 | |
| #include <Library/UefiBootServicesTableLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/MemoryAllocationLib.h>
 | |
| #include <Library/AcpiViewCommandLib.h>
 | |
| #include "AcpiParser.h"
 | |
| #include "AcpiTableParser.h"
 | |
| #include "AcpiView.h"
 | |
| #include "AcpiViewConfig.h"
 | |
| 
 | |
| #if defined(MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)
 | |
| #include "Arm/SbbrValidator.h"
 | |
| #endif
 | |
| 
 | |
| STATIC UINT32             mTableCount;
 | |
| STATIC UINT32             mBinTableCount;
 | |
| 
 | |
| /**
 | |
|   This function dumps the ACPI table to a file.
 | |
| 
 | |
|   @param [in] Ptr       Pointer to the ACPI table data.
 | |
|   @param [in] Length    The length of the ACPI table.
 | |
| 
 | |
|   @retval TRUE          Success.
 | |
|   @retval FALSE         Failure.
 | |
| **/
 | |
| STATIC
 | |
| BOOLEAN
 | |
| DumpAcpiTableToFile (
 | |
|   IN CONST UINT8*  Ptr,
 | |
|   IN CONST UINTN   Length
 | |
|   )
 | |
| {
 | |
|   CHAR16              FileNameBuffer[MAX_FILE_NAME_LEN];
 | |
|   UINTN               TransferBytes;
 | |
|   SELECTED_ACPI_TABLE *SelectedTable;
 | |
| 
 | |
|   GetSelectedAcpiTable (&SelectedTable);
 | |
| 
 | |
|   UnicodeSPrint (
 | |
|     FileNameBuffer,
 | |
|     sizeof (FileNameBuffer),
 | |
|     L".\\%s%04d.bin",
 | |
|     SelectedTable->Name,
 | |
|     mBinTableCount++
 | |
|     );
 | |
| 
 | |
|   Print (L"Dumping ACPI table to : %s ... ", FileNameBuffer);
 | |
| 
 | |
|   TransferBytes = ShellDumpBufferToFile (FileNameBuffer, Ptr, Length);
 | |
|   return (Length == TransferBytes);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   This function processes the table reporting options for the ACPI table.
 | |
| 
 | |
|   @param [in] Signature The ACPI table Signature.
 | |
|   @param [in] TablePtr  Pointer to the ACPI table data.
 | |
|   @param [in] Length    The length fo the ACPI table.
 | |
| 
 | |
|   @retval Returns TRUE if the ACPI table should be traced.
 | |
| **/
 | |
| BOOLEAN
 | |
| ProcessTableReportOptions (
 | |
|   IN CONST UINT32  Signature,
 | |
|   IN CONST UINT8*  TablePtr,
 | |
|   IN CONST UINT32  Length
 | |
|   )
 | |
| {
 | |
|   UINTN                OriginalAttribute;
 | |
|   UINT8                *SignaturePtr;
 | |
|   BOOLEAN              Log;
 | |
|   BOOLEAN              HighLight;
 | |
|   SELECTED_ACPI_TABLE  *SelectedTable;
 | |
| 
 | |
|   //
 | |
|   // set local variables to suppress incorrect compiler/analyzer warnings
 | |
|   //
 | |
|   OriginalAttribute = 0;
 | |
|   SignaturePtr = (UINT8*)(UINTN)&Signature;
 | |
|   Log = FALSE;
 | |
|   HighLight = GetColourHighlighting ();
 | |
|   GetSelectedAcpiTable (&SelectedTable);
 | |
| 
 | |
|   switch (GetReportOption ()) {
 | |
|     case ReportAll:
 | |
|       Log = TRUE;
 | |
|       break;
 | |
|     case ReportSelected:
 | |
|       if (Signature == SelectedTable->Type) {
 | |
|         Log = TRUE;
 | |
|         SelectedTable->Found = TRUE;
 | |
|       }
 | |
|       break;
 | |
|     case ReportTableList:
 | |
|       if (mTableCount == 0) {
 | |
|         if (HighLight) {
 | |
|           OriginalAttribute = gST->ConOut->Mode->Attribute;
 | |
|           gST->ConOut->SetAttribute (
 | |
|                          gST->ConOut,
 | |
|                          EFI_TEXT_ATTR(EFI_CYAN,
 | |
|                            ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4))
 | |
|                          );
 | |
|         }
 | |
|         Print (L"\nInstalled Table(s):\n");
 | |
|         if (HighLight) {
 | |
|           gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute);
 | |
|         }
 | |
|       }
 | |
|       Print (
 | |
|         L"\t%4d. %c%c%c%c\n",
 | |
|         ++mTableCount,
 | |
|         SignaturePtr[0],
 | |
|         SignaturePtr[1],
 | |
|         SignaturePtr[2],
 | |
|         SignaturePtr[3]
 | |
|         );
 | |
|       break;
 | |
|     case ReportDumpBinFile:
 | |
|       if (Signature == SelectedTable->Type) {
 | |
|         SelectedTable->Found = TRUE;
 | |
|         DumpAcpiTableToFile (TablePtr, Length);
 | |
|       }
 | |
|       break;
 | |
|     case ReportMax:
 | |
|       // We should never be here.
 | |
|       // This case is only present to prevent compiler warning.
 | |
|       break;
 | |
|   } // switch
 | |
| 
 | |
|   if (Log) {
 | |
|     if (HighLight) {
 | |
|       OriginalAttribute = gST->ConOut->Mode->Attribute;
 | |
|       gST->ConOut->SetAttribute (
 | |
|                      gST->ConOut,
 | |
|                      EFI_TEXT_ATTR(EFI_LIGHTBLUE,
 | |
|                        ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4))
 | |
|                      );
 | |
|     }
 | |
|     Print (
 | |
|       L"\n\n --------------- %c%c%c%c Table --------------- \n\n",
 | |
|       SignaturePtr[0],
 | |
|       SignaturePtr[1],
 | |
|       SignaturePtr[2],
 | |
|       SignaturePtr[3]
 | |
|       );
 | |
|     if (HighLight) {
 | |
|       gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return Log;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| /**
 | |
|   This function iterates the configuration table entries in the
 | |
|   system table, retrieves the RSDP pointer and starts parsing the ACPI tables.
 | |
| 
 | |
|   @param [in] SystemTable Pointer to the EFI system table.
 | |
| 
 | |
|   @retval Returns EFI_NOT_FOUND   if the RSDP pointer is not found.
 | |
|           Returns EFI_UNSUPPORTED if the RSDP version is less than 2.
 | |
|           Returns EFI_SUCCESS     if successful.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AcpiView (
 | |
|   IN EFI_SYSTEM_TABLE* SystemTable
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS               Status;
 | |
|   UINTN                    Index;
 | |
|   EFI_CONFIGURATION_TABLE* EfiConfigurationTable;
 | |
|   BOOLEAN                  FoundAcpiTable;
 | |
|   UINTN                    OriginalAttribute;
 | |
|   UINTN                    PrintAttribute;
 | |
|   EREPORT_OPTION           ReportOption;
 | |
|   UINT8*                   RsdpPtr;
 | |
|   UINT32                   RsdpLength;
 | |
|   UINT8                    RsdpRevision;
 | |
|   PARSE_ACPI_TABLE_PROC    RsdpParserProc;
 | |
|   BOOLEAN                  Trace;
 | |
|   SELECTED_ACPI_TABLE      *SelectedTable;
 | |
| 
 | |
|   //
 | |
|   // set local variables to suppress incorrect compiler/analyzer warnings
 | |
|   //
 | |
|   EfiConfigurationTable = NULL;
 | |
|   OriginalAttribute = 0;
 | |
| 
 | |
|   // Reset Table counts
 | |
|   mTableCount = 0;
 | |
|   mBinTableCount = 0;
 | |
| 
 | |
|   // Reset The error/warning counters
 | |
|   ResetErrorCount ();
 | |
|   ResetWarningCount ();
 | |
| 
 | |
|   // Retrieve the user selection of ACPI table to process
 | |
|   GetSelectedAcpiTable (&SelectedTable);
 | |
| 
 | |
|   // Search the table for an entry that matches the ACPI Table Guid
 | |
|   FoundAcpiTable = FALSE;
 | |
|   for (Index = 0; Index < SystemTable->NumberOfTableEntries; Index++) {
 | |
|     if (CompareGuid (&gEfiAcpiTableGuid,
 | |
|           &(SystemTable->ConfigurationTable[Index].VendorGuid))) {
 | |
|       EfiConfigurationTable = &SystemTable->ConfigurationTable[Index];
 | |
|       FoundAcpiTable = TRUE;
 | |
|       break;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (FoundAcpiTable) {
 | |
|     RsdpPtr = (UINT8*)EfiConfigurationTable->VendorTable;
 | |
| 
 | |
|     // The RSDP revision is 1 byte starting at offset 15
 | |
|     RsdpRevision = *(RsdpPtr + RSDP_REVISION_OFFSET);
 | |
| 
 | |
|     if (RsdpRevision < 2) {
 | |
|       Print (
 | |
|         L"ERROR: RSDP version less than 2 is not supported.\n"
 | |
|         );
 | |
|       return EFI_UNSUPPORTED;
 | |
|     }
 | |
| 
 | |
| #if defined(MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)
 | |
|     if (GetMandatoryTableValidate ()) {
 | |
|       ArmSbbrResetTableCounts ();
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|     // The RSDP length is 4 bytes starting at offset 20
 | |
|     RsdpLength = *(UINT32*)(RsdpPtr + RSDP_LENGTH_OFFSET);
 | |
| 
 | |
|     Trace = ProcessTableReportOptions (RSDP_TABLE_INFO, RsdpPtr, RsdpLength);
 | |
| 
 | |
|     Status = GetParser (RSDP_TABLE_INFO, &RsdpParserProc);
 | |
|     if (EFI_ERROR (Status)) {
 | |
|       Print (
 | |
|         L"ERROR: No registered parser found for RSDP.\n"
 | |
|         );
 | |
|       return Status;
 | |
|     }
 | |
| 
 | |
|     RsdpParserProc (
 | |
|       Trace,
 | |
|       RsdpPtr,
 | |
|       RsdpLength,
 | |
|       RsdpRevision
 | |
|       );
 | |
| 
 | |
|   } else {
 | |
|     IncrementErrorCount ();
 | |
|     Print (
 | |
|       L"ERROR: Failed to find ACPI Table Guid in System Configuration Table.\n"
 | |
|       );
 | |
|     return EFI_NOT_FOUND;
 | |
|   }
 | |
| 
 | |
| #if defined(MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)
 | |
|   if (GetMandatoryTableValidate ()) {
 | |
|     ArmSbbrReqsValidate ((ARM_SBBR_VERSION)GetMandatoryTableSpec ());
 | |
|   }
 | |
| #endif
 | |
| 
 | |
|   ReportOption = GetReportOption ();
 | |
|   if (ReportTableList != ReportOption) {
 | |
|     if (((ReportSelected == ReportOption)  ||
 | |
|          (ReportDumpBinFile == ReportOption)) &&
 | |
|         (!SelectedTable->Found)) {
 | |
|       Print (L"\nRequested ACPI Table not found.\n");
 | |
|     } else if (GetConsistencyChecking () &&
 | |
|                (ReportDumpBinFile != ReportOption)) {
 | |
|       OriginalAttribute = gST->ConOut->Mode->Attribute;
 | |
| 
 | |
|       Print (L"\nTable Statistics:\n");
 | |
| 
 | |
|       if (GetColourHighlighting ()) {
 | |
|         PrintAttribute = (GetErrorCount () > 0) ?
 | |
|                             EFI_TEXT_ATTR (
 | |
|                               EFI_RED,
 | |
|                               ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)
 | |
|                               ) :
 | |
|                             OriginalAttribute;
 | |
|         gST->ConOut->SetAttribute (gST->ConOut, PrintAttribute);
 | |
|       }
 | |
|       Print (L"\t%d Error(s)\n", GetErrorCount ());
 | |
| 
 | |
|       if (GetColourHighlighting ()) {
 | |
|         PrintAttribute = (GetWarningCount () > 0) ?
 | |
|                             EFI_TEXT_ATTR (
 | |
|                               EFI_RED,
 | |
|                               ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)
 | |
|                               ) :
 | |
|                             OriginalAttribute;
 | |
| 
 | |
|         gST->ConOut->SetAttribute (gST->ConOut, PrintAttribute);
 | |
|       }
 | |
|       Print (L"\t%d Warning(s)\n", GetWarningCount ());
 | |
| 
 | |
|       if (GetColourHighlighting ()) {
 | |
|         gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   return EFI_SUCCESS;
 | |
| }
 |