mirror of https://github.com/acidanthera/audk.git
341 lines
9.3 KiB
C
341 lines
9.3 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;
|
|
}
|