REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the ShellPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
		
			
				
	
	
		
			312 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			312 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  DBG2 table parser
 | 
						|
 | 
						|
  Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
  @par Reference(s):
 | 
						|
    - Microsoft Debug Port Table 2 (DBG2) Specification - December 10, 2015.
 | 
						|
**/
 | 
						|
 | 
						|
#include <IndustryStandard/DebugPort2Table.h>
 | 
						|
#include <Library/UefiLib.h>
 | 
						|
#include "AcpiParser.h"
 | 
						|
#include "AcpiTableParser.h"
 | 
						|
 | 
						|
// Local variables pointing to the table fields
 | 
						|
STATIC CONST UINT32                  *OffsetDbgDeviceInfo;
 | 
						|
STATIC CONST UINT32                  *NumberDbgDeviceInfo;
 | 
						|
STATIC CONST UINT16                  *DbgDevInfoLen;
 | 
						|
STATIC CONST UINT8                   *GasCount;
 | 
						|
STATIC CONST UINT16                  *NameSpaceStringLength;
 | 
						|
STATIC CONST UINT16                  *NameSpaceStringOffset;
 | 
						|
STATIC CONST UINT16                  *OEMDataLength;
 | 
						|
STATIC CONST UINT16                  *OEMDataOffset;
 | 
						|
STATIC CONST UINT16                  *BaseAddrRegOffset;
 | 
						|
STATIC CONST UINT16                  *AddrSizeOffset;
 | 
						|
STATIC ACPI_DESCRIPTION_HEADER_INFO  AcpiHdrInfo;
 | 
						|
 | 
						|
/**
 | 
						|
  This function validates the NameSpace string length.
 | 
						|
 | 
						|
  @param [in] Ptr     Pointer to the start of the buffer.
 | 
						|
  @param [in] Context Pointer to context specific information e.g. this
 | 
						|
                      could be a pointer to the ACPI table header.
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
ValidateNameSpaceStrLen (
 | 
						|
  IN UINT8  *Ptr,
 | 
						|
  IN VOID   *Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT16  NameSpaceStrLen;
 | 
						|
 | 
						|
  NameSpaceStrLen = *(UINT16 *)Ptr;
 | 
						|
 | 
						|
  if (NameSpaceStrLen < 2) {
 | 
						|
    IncrementErrorCount ();
 | 
						|
    Print (
 | 
						|
      L"\nERROR: NamespaceString Length = %d. If no Namespace device exists, " \
 | 
						|
      L"NamespaceString[] must contain a period '.'",
 | 
						|
      NameSpaceStrLen
 | 
						|
      );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/// An ACPI_PARSER array describing the ACPI DBG2 table.
 | 
						|
STATIC CONST ACPI_PARSER  Dbg2Parser[] = {
 | 
						|
  PARSE_ACPI_HEADER (&AcpiHdrInfo),
 | 
						|
  { L"OffsetDbgDeviceInfo",        4,     36, L"0x%x", NULL,
 | 
						|
    (VOID **)&OffsetDbgDeviceInfo, NULL,  NULL },
 | 
						|
  { L"NumberDbgDeviceInfo",        4,     40, L"%d",   NULL,
 | 
						|
    (VOID **)&NumberDbgDeviceInfo, NULL,  NULL }
 | 
						|
};
 | 
						|
 | 
						|
/// An ACPI_PARSER array describing the debug device information structure
 | 
						|
/// header.
 | 
						|
STATIC CONST ACPI_PARSER  DbgDevInfoHeaderParser[] = {
 | 
						|
  { L"Revision", 1, 0, L"0x%x", NULL, NULL,                    NULL, NULL },
 | 
						|
  { L"Length",   2, 1, L"%d",   NULL, (VOID **)&DbgDevInfoLen, NULL, NULL }
 | 
						|
};
 | 
						|
 | 
						|
/// An ACPI_PARSER array describing the debug device information.
 | 
						|
STATIC CONST ACPI_PARSER  DbgDevInfoParser[] = {
 | 
						|
  { L"Revision",                        1, 0,  L"0x%x", NULL, NULL,                    NULL, NULL },
 | 
						|
  { L"Length",                          2, 1,  L"%d",   NULL, NULL,                    NULL, NULL },
 | 
						|
 | 
						|
  { L"Generic Address Registers Count", 1, 3,  L"0x%x", NULL,
 | 
						|
    (VOID **)&GasCount, NULL, NULL },
 | 
						|
  { L"NameSpace String Length",         2, 4,  L"%d",   NULL,
 | 
						|
    (VOID **)&NameSpaceStringLength, ValidateNameSpaceStrLen, NULL },
 | 
						|
  { L"NameSpace String Offset",         2, 6,  L"0x%x", NULL,
 | 
						|
    (VOID **)&NameSpaceStringOffset, NULL, NULL },
 | 
						|
  { L"OEM Data Length",                 2, 8,  L"%d",   NULL, (VOID **)&OEMDataLength,
 | 
						|
    NULL, NULL },
 | 
						|
  { L"OEM Data Offset",                 2, 10, L"0x%x", NULL, (VOID **)&OEMDataOffset,
 | 
						|
    NULL, NULL },
 | 
						|
 | 
						|
  { L"Port Type",                       2, 12, L"0x%x", NULL, NULL,                    NULL, NULL },
 | 
						|
  { L"Port SubType",                    2, 14, L"0x%x", NULL, NULL,                    NULL, NULL },
 | 
						|
  { L"Reserved",                        2, 16, L"%x",   NULL, NULL,                    NULL, NULL },
 | 
						|
 | 
						|
  { L"Base Address Register Offset",    2, 18, L"0x%x", NULL,
 | 
						|
    (VOID **)&BaseAddrRegOffset, NULL, NULL },
 | 
						|
  { L"Address Size Offset",             2, 20, L"0x%x", NULL,
 | 
						|
    (VOID **)&AddrSizeOffset, NULL, NULL }
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
  This function parses the debug device information structure.
 | 
						|
 | 
						|
  @param [in] Ptr     Pointer to the start of the buffer.
 | 
						|
  @param [in] Length  Length of the debug device information structure.
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
DumpDbgDeviceInfo (
 | 
						|
  IN UINT8   *Ptr,
 | 
						|
  IN UINT16  Length
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT16  Index;
 | 
						|
  UINT16  Offset;
 | 
						|
 | 
						|
  ParseAcpi (
 | 
						|
    TRUE,
 | 
						|
    2,
 | 
						|
    "Debug Device Info",
 | 
						|
    Ptr,
 | 
						|
    Length,
 | 
						|
    PARSER_PARAMS (DbgDevInfoParser)
 | 
						|
    );
 | 
						|
 | 
						|
  // Check if the values used to control the parsing logic have been
 | 
						|
  // successfully read.
 | 
						|
  if ((GasCount == NULL)              ||
 | 
						|
      (NameSpaceStringLength == NULL) ||
 | 
						|
      (NameSpaceStringOffset == NULL) ||
 | 
						|
      (OEMDataLength == NULL)         ||
 | 
						|
      (OEMDataOffset == NULL)         ||
 | 
						|
      (BaseAddrRegOffset == NULL)     ||
 | 
						|
      (AddrSizeOffset == NULL))
 | 
						|
  {
 | 
						|
    IncrementErrorCount ();
 | 
						|
    Print (
 | 
						|
      L"ERROR: Insufficient Debug Device Information Structure length. " \
 | 
						|
      L"Length = %d.\n",
 | 
						|
      Length
 | 
						|
      );
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  // GAS
 | 
						|
  Index  = 0;
 | 
						|
  Offset = *BaseAddrRegOffset;
 | 
						|
  while ((Index++ < *GasCount) &&
 | 
						|
         (Offset < Length))
 | 
						|
  {
 | 
						|
    PrintFieldName (4, L"BaseAddressRegister");
 | 
						|
    Offset += (UINT16)DumpGasStruct (
 | 
						|
                        Ptr + Offset,
 | 
						|
                        4,
 | 
						|
                        Length - Offset
 | 
						|
                        );
 | 
						|
  }
 | 
						|
 | 
						|
  // Make sure the array of address sizes corresponding to each GAS fit in the
 | 
						|
  // Debug Device Information structure
 | 
						|
  if ((*AddrSizeOffset + (*GasCount * sizeof (UINT32))) > Length) {
 | 
						|
    IncrementErrorCount ();
 | 
						|
    Print (
 | 
						|
      L"ERROR: Invalid GAS count. GasCount = %d. RemainingBufferLength = %d. " \
 | 
						|
      L"Parsing of the Debug Device Information structure aborted.\n",
 | 
						|
      *GasCount,
 | 
						|
      Length - *AddrSizeOffset
 | 
						|
      );
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  // Address Size
 | 
						|
  Index  = 0;
 | 
						|
  Offset = *AddrSizeOffset;
 | 
						|
  while ((Index++ < *GasCount) &&
 | 
						|
         (Offset < Length))
 | 
						|
  {
 | 
						|
    PrintFieldName (4, L"Address Size");
 | 
						|
    Print (L"0x%x\n", *((UINT32 *)(Ptr + Offset)));
 | 
						|
    Offset += sizeof (UINT32);
 | 
						|
  }
 | 
						|
 | 
						|
  // NameSpace String
 | 
						|
  Index  = 0;
 | 
						|
  Offset = *NameSpaceStringOffset;
 | 
						|
  PrintFieldName (4, L"NameSpace String");
 | 
						|
  while ((Index++ < *NameSpaceStringLength) &&
 | 
						|
         (Offset < Length))
 | 
						|
  {
 | 
						|
    Print (L"%c", *(Ptr + Offset));
 | 
						|
    Offset++;
 | 
						|
  }
 | 
						|
 | 
						|
  Print (L"\n");
 | 
						|
 | 
						|
  // OEM Data
 | 
						|
  if (*OEMDataOffset != 0) {
 | 
						|
    Index  = 0;
 | 
						|
    Offset = *OEMDataOffset;
 | 
						|
    PrintFieldName (4, L"OEM Data");
 | 
						|
    while ((Index++ < *OEMDataLength) &&
 | 
						|
           (Offset < Length))
 | 
						|
    {
 | 
						|
      Print (L"%x ", *(Ptr + Offset));
 | 
						|
      if ((Index & 7) == 0) {
 | 
						|
        Print (L"\n%-*s   ", OUTPUT_FIELD_COLUMN_WIDTH, L"");
 | 
						|
      }
 | 
						|
 | 
						|
      Offset++;
 | 
						|
    }
 | 
						|
 | 
						|
    Print (L"\n");
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function parses the ACPI DBG2 table.
 | 
						|
  When trace is enabled this function parses the DBG2 table and
 | 
						|
  traces the ACPI table fields.
 | 
						|
 | 
						|
  This function also performs validation of the ACPI table fields.
 | 
						|
 | 
						|
  @param [in] Trace              If TRUE, trace the ACPI fields.
 | 
						|
  @param [in] Ptr                Pointer to the start of the buffer.
 | 
						|
  @param [in] AcpiTableLength    Length of the ACPI table.
 | 
						|
  @param [in] AcpiTableRevision  Revision of the ACPI table.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
ParseAcpiDbg2 (
 | 
						|
  IN BOOLEAN  Trace,
 | 
						|
  IN UINT8    *Ptr,
 | 
						|
  IN UINT32   AcpiTableLength,
 | 
						|
  IN UINT8    AcpiTableRevision
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT32  Offset;
 | 
						|
  UINT32  Index;
 | 
						|
 | 
						|
  if (!Trace) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  Offset = ParseAcpi (
 | 
						|
             TRUE,
 | 
						|
             0,
 | 
						|
             "DBG2",
 | 
						|
             Ptr,
 | 
						|
             AcpiTableLength,
 | 
						|
             PARSER_PARAMS (Dbg2Parser)
 | 
						|
             );
 | 
						|
 | 
						|
  // Check if the values used to control the parsing logic have been
 | 
						|
  // successfully read.
 | 
						|
  if ((OffsetDbgDeviceInfo == NULL) ||
 | 
						|
      (NumberDbgDeviceInfo == NULL))
 | 
						|
  {
 | 
						|
    IncrementErrorCount ();
 | 
						|
    Print (
 | 
						|
      L"ERROR: Insufficient table length. AcpiTableLength = %d\n",
 | 
						|
      AcpiTableLength
 | 
						|
      );
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  Offset = *OffsetDbgDeviceInfo;
 | 
						|
  Index  = 0;
 | 
						|
 | 
						|
  while (Index++ < *NumberDbgDeviceInfo) {
 | 
						|
    // Parse the Debug Device Information Structure header to obtain Length
 | 
						|
    ParseAcpi (
 | 
						|
      FALSE,
 | 
						|
      0,
 | 
						|
      NULL,
 | 
						|
      Ptr + Offset,
 | 
						|
      AcpiTableLength - Offset,
 | 
						|
      PARSER_PARAMS (DbgDevInfoHeaderParser)
 | 
						|
      );
 | 
						|
 | 
						|
    // Check if the values used to control the parsing logic have been
 | 
						|
    // successfully read.
 | 
						|
    if (DbgDevInfoLen == NULL) {
 | 
						|
      IncrementErrorCount ();
 | 
						|
      Print (
 | 
						|
        L"ERROR: Insufficient remaining table buffer length to read the " \
 | 
						|
        L"Debug Device Information structure's 'Length' field. " \
 | 
						|
        L"RemainingTableBufferLength = %d.\n",
 | 
						|
        AcpiTableLength - Offset
 | 
						|
        );
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    // Validate Debug Device Information Structure length
 | 
						|
    if ((*DbgDevInfoLen == 0) ||
 | 
						|
        ((Offset + (*DbgDevInfoLen)) > AcpiTableLength))
 | 
						|
    {
 | 
						|
      IncrementErrorCount ();
 | 
						|
      Print (
 | 
						|
        L"ERROR: Invalid Debug Device Information Structure length. " \
 | 
						|
        L"Length = %d. Offset = %d. AcpiTableLength = %d.\n",
 | 
						|
        *DbgDevInfoLen,
 | 
						|
        Offset,
 | 
						|
        AcpiTableLength
 | 
						|
        );
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    DumpDbgDeviceInfo (Ptr + Offset, (*DbgDevInfoLen));
 | 
						|
    Offset += (*DbgDevInfoLen);
 | 
						|
  }
 | 
						|
}
 |