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>
		
			
				
	
	
		
			371 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			371 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  GTDT table parser
 | 
						|
 | 
						|
  Copyright (c) 2016 - 2021, ARM Limited. All rights reserved.
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
  @par Reference(s):
 | 
						|
    - ACPI 6.4 Specification - January 2021
 | 
						|
  **/
 | 
						|
 | 
						|
#include <IndustryStandard/Acpi.h>
 | 
						|
#include <Library/UefiLib.h>
 | 
						|
#include "AcpiParser.h"
 | 
						|
#include "AcpiTableParser.h"
 | 
						|
#include "AcpiViewConfig.h"
 | 
						|
 | 
						|
// "The number of GT Block Timers must be less than or equal to 8"
 | 
						|
#define GT_BLOCK_TIMER_COUNT_MAX  8
 | 
						|
 | 
						|
// Local variables
 | 
						|
STATIC CONST UINT32                  *GtdtPlatformTimerCount;
 | 
						|
STATIC CONST UINT32                  *GtdtPlatformTimerOffset;
 | 
						|
STATIC CONST UINT8                   *PlatformTimerType;
 | 
						|
STATIC CONST UINT16                  *PlatformTimerLength;
 | 
						|
STATIC CONST UINT32                  *GtBlockTimerCount;
 | 
						|
STATIC CONST UINT32                  *GtBlockTimerOffset;
 | 
						|
STATIC ACPI_DESCRIPTION_HEADER_INFO  AcpiHdrInfo;
 | 
						|
 | 
						|
/**
 | 
						|
  This function validates the GT Block timer count.
 | 
						|
 | 
						|
  @param [in] Ptr     Pointer to the start of the field data.
 | 
						|
  @param [in] Context Pointer to context specific information e.g. this
 | 
						|
                      could be a pointer to the ACPI table header.
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
ValidateGtBlockTimerCount (
 | 
						|
  IN UINT8  *Ptr,
 | 
						|
  IN VOID   *Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT32  BlockTimerCount;
 | 
						|
 | 
						|
  BlockTimerCount = *(UINT32 *)Ptr;
 | 
						|
 | 
						|
  if (BlockTimerCount > GT_BLOCK_TIMER_COUNT_MAX) {
 | 
						|
    IncrementErrorCount ();
 | 
						|
    Print (
 | 
						|
      L"\nERROR: Timer Count = %d. Max Timer Count is %d.",
 | 
						|
      BlockTimerCount,
 | 
						|
      GT_BLOCK_TIMER_COUNT_MAX
 | 
						|
      );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function validates the GT Frame Number.
 | 
						|
 | 
						|
  @param [in] Ptr     Pointer to the start of the field data.
 | 
						|
  @param [in] Context Pointer to context specific information e.g. this
 | 
						|
                      could be a pointer to the ACPI table header.
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
ValidateGtFrameNumber (
 | 
						|
  IN UINT8  *Ptr,
 | 
						|
  IN VOID   *Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT8  FrameNumber;
 | 
						|
 | 
						|
  FrameNumber = *(UINT8 *)Ptr;
 | 
						|
 | 
						|
  if (FrameNumber >= GT_BLOCK_TIMER_COUNT_MAX) {
 | 
						|
    IncrementErrorCount ();
 | 
						|
    Print (
 | 
						|
      L"\nERROR: GT Frame Number = %d. GT Frame Number must be in range 0-%d.",
 | 
						|
      FrameNumber,
 | 
						|
      GT_BLOCK_TIMER_COUNT_MAX - 1
 | 
						|
      );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  An ACPI_PARSER array describing the ACPI GTDT Table.
 | 
						|
**/
 | 
						|
STATIC CONST ACPI_PARSER  GtdtParser[] = {
 | 
						|
  PARSE_ACPI_HEADER (&AcpiHdrInfo),
 | 
						|
  { L"CntControlBase Physical Address",8,      36,  L"0x%lx", NULL, NULL,
 | 
						|
    NULL,                             NULL },
 | 
						|
  { L"Reserved",                      4,      44,  L"0x%x",  NULL, NULL,NULL,  NULL },
 | 
						|
  { L"Secure EL1 timer GSIV",         4,      48,  L"0x%x",  NULL, NULL,NULL,  NULL },
 | 
						|
  { L"Secure EL1 timer FLAGS",        4,      52,  L"0x%x",  NULL, NULL,NULL,  NULL },
 | 
						|
 | 
						|
  { L"Non-Secure EL1 timer GSIV",     4,      56,  L"0x%x",  NULL, NULL,NULL,  NULL },
 | 
						|
  { L"Non-Secure EL1 timer FLAGS",    4,      60,  L"0x%x",  NULL, NULL,NULL,  NULL },
 | 
						|
 | 
						|
  { L"Virtual timer GSIV",            4,      64,  L"0x%x",  NULL, NULL,NULL,  NULL },
 | 
						|
  { L"Virtual timer FLAGS",           4,      68,  L"0x%x",  NULL, NULL,NULL,  NULL },
 | 
						|
 | 
						|
  { L"Non-Secure EL2 timer GSIV",     4,      72,  L"0x%x",  NULL, NULL,NULL,  NULL },
 | 
						|
  { L"Non-Secure EL2 timer FLAGS",    4,      76,  L"0x%x",  NULL, NULL,NULL,  NULL },
 | 
						|
 | 
						|
  { L"CntReadBase Physical address",  8,      80,  L"0x%lx", NULL, NULL,NULL,  NULL },
 | 
						|
  { L"Platform Timer Count",          4,      88,  L"%d",    NULL,
 | 
						|
    (VOID **)&GtdtPlatformTimerCount, NULL,   NULL },
 | 
						|
  { L"Platform Timer Offset",         4,      92,  L"0x%x",  NULL,
 | 
						|
    (VOID **)&GtdtPlatformTimerOffset,NULL,   NULL },
 | 
						|
  { L"Virtual EL2 Timer GSIV",        4,      96,  L"0x%x",  NULL, NULL,NULL,  NULL },
 | 
						|
  { L"Virtual EL2 Timer Flags",       4,      100, L"0x%x",  NULL, NULL,NULL,  NULL }
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
  An ACPI_PARSER array describing the Platform timer header.
 | 
						|
**/
 | 
						|
STATIC CONST ACPI_PARSER  GtPlatformTimerHeaderParser[] = {
 | 
						|
  { L"Type",     1, 0, NULL, NULL, (VOID **)&PlatformTimerType,   NULL, NULL },
 | 
						|
  { L"Length",   2, 1, NULL, NULL, (VOID **)&PlatformTimerLength, NULL, NULL },
 | 
						|
  { L"Reserved", 1, 3, NULL, NULL, NULL,                          NULL, NULL }
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
  An ACPI_PARSER array describing the Platform GT Block.
 | 
						|
**/
 | 
						|
STATIC CONST ACPI_PARSER  GtBlockParser[] = {
 | 
						|
  { L"Type",                          1, 0,  L"%d",    NULL, NULL,                         NULL, NULL },
 | 
						|
  { L"Length",                        2, 1,  L"%d",    NULL, NULL,                         NULL, NULL },
 | 
						|
  { L"Reserved",                      1, 3,  L"%x",    NULL, NULL,                         NULL, NULL },
 | 
						|
  { L"Physical address (CntCtlBase)", 8, 4,  L"0x%lx", NULL, NULL,                         NULL, NULL },
 | 
						|
  { L"Timer Count",                   4, 12, L"%d",    NULL, (VOID **)&GtBlockTimerCount,
 | 
						|
    ValidateGtBlockTimerCount, NULL },
 | 
						|
  { L"Timer Offset",                  4, 16, L"%d",    NULL, (VOID **)&GtBlockTimerOffset, NULL,
 | 
						|
    NULL }
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
  An ACPI_PARSER array describing the GT Block timer.
 | 
						|
**/
 | 
						|
STATIC CONST ACPI_PARSER  GtBlockTimerParser[] = {
 | 
						|
  { L"Frame Number",                   1, 0,  L"%d",       NULL,       NULL, ValidateGtFrameNumber, NULL },
 | 
						|
  { L"Reserved",                       3, 1,  L"%x %x %x", Dump3Chars, NULL, NULL,                  NULL },
 | 
						|
  { L"Physical address (CntBaseX)",    8, 4,  L"0x%lx",    NULL,       NULL, NULL,                  NULL },
 | 
						|
  { L"Physical address (CntEL0BaseX)", 8, 12, L"0x%lx",    NULL,       NULL, NULL,
 | 
						|
    NULL },
 | 
						|
  { L"Physical Timer GSIV",            4, 20, L"0x%x",     NULL,       NULL, NULL,                  NULL },
 | 
						|
  { L"Physical Timer Flags",           4, 24, L"0x%x",     NULL,       NULL, NULL,                  NULL },
 | 
						|
  { L"Virtual Timer GSIV",             4, 28, L"0x%x",     NULL,       NULL, NULL,                  NULL },
 | 
						|
  { L"Virtual Timer Flags",            4, 32, L"0x%x",     NULL,       NULL, NULL,                  NULL },
 | 
						|
  { L"Common Flags",                   4, 36, L"0x%x",     NULL,       NULL, NULL,                  NULL }
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
  An ACPI_PARSER array describing the Platform Watchdog.
 | 
						|
**/
 | 
						|
STATIC CONST ACPI_PARSER  ArmGenericWatchdogParser[] = {
 | 
						|
  { L"Type",                          1, 0,  L"%d",    NULL, NULL, NULL, NULL },
 | 
						|
  { L"Length",                        2, 1,  L"%d",    NULL, NULL, NULL, NULL },
 | 
						|
  { L"Reserved",                      1, 3,  L"%x",    NULL, NULL, NULL, NULL },
 | 
						|
  { L"RefreshFrame Physical address", 8, 4,  L"0x%lx", NULL, NULL, NULL, NULL },
 | 
						|
  { L"ControlFrame Physical address", 8, 12, L"0x%lx", NULL, NULL, NULL, NULL },
 | 
						|
  { L"Watchdog Timer GSIV",           4, 20, L"0x%x",  NULL, NULL, NULL, NULL },
 | 
						|
  { L"Watchdog Timer Flags",          4, 24, L"0x%x",  NULL, NULL, NULL, NULL }
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
  This function parses the Platform GT Block.
 | 
						|
 | 
						|
  @param [in] Ptr       Pointer to the start of the GT Block data.
 | 
						|
  @param [in] Length    Length of the GT Block structure.
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
DumpGTBlock (
 | 
						|
  IN UINT8   *Ptr,
 | 
						|
  IN UINT16  Length
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT32  Index;
 | 
						|
  UINT32  Offset;
 | 
						|
 | 
						|
  ParseAcpi (
 | 
						|
    TRUE,
 | 
						|
    2,
 | 
						|
    "GT Block",
 | 
						|
    Ptr,
 | 
						|
    Length,
 | 
						|
    PARSER_PARAMS (GtBlockParser)
 | 
						|
    );
 | 
						|
 | 
						|
  // Check if the values used to control the parsing logic have been
 | 
						|
  // successfully read.
 | 
						|
  if ((GtBlockTimerCount == NULL) ||
 | 
						|
      (GtBlockTimerOffset == NULL))
 | 
						|
  {
 | 
						|
    IncrementErrorCount ();
 | 
						|
    Print (
 | 
						|
      L"ERROR: Insufficient GT Block Structure length. Length = %d.\n",
 | 
						|
      Length
 | 
						|
      );
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  Offset = *GtBlockTimerOffset;
 | 
						|
  Index  = 0;
 | 
						|
 | 
						|
  // Parse the specified number of GT Block Timer Structures or the GT Block
 | 
						|
  // Structure buffer length. Whichever is minimum.
 | 
						|
  while ((Index++ < *GtBlockTimerCount) &&
 | 
						|
         (Offset < Length))
 | 
						|
  {
 | 
						|
    Offset += ParseAcpi (
 | 
						|
                TRUE,
 | 
						|
                2,
 | 
						|
                "GT Block Timer",
 | 
						|
                Ptr + Offset,
 | 
						|
                Length - Offset,
 | 
						|
                PARSER_PARAMS (GtBlockTimerParser)
 | 
						|
                );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function parses the Platform Watchdog timer.
 | 
						|
 | 
						|
  @param [in] Ptr     Pointer to the start of the watchdog timer data.
 | 
						|
  @param [in] Length  Length of the watchdog timer structure.
 | 
						|
**/
 | 
						|
STATIC
 | 
						|
VOID
 | 
						|
DumpWatchdogTimer (
 | 
						|
  IN UINT8   *Ptr,
 | 
						|
  IN UINT16  Length
 | 
						|
  )
 | 
						|
{
 | 
						|
  ParseAcpi (
 | 
						|
    TRUE,
 | 
						|
    2,
 | 
						|
    "Arm Generic Watchdog",
 | 
						|
    Ptr,
 | 
						|
    Length,
 | 
						|
    PARSER_PARAMS (ArmGenericWatchdogParser)
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function parses the ACPI GTDT table.
 | 
						|
  When trace is enabled this function parses the GTDT table and
 | 
						|
  traces the ACPI table fields.
 | 
						|
 | 
						|
  This function also parses the following platform timer structures:
 | 
						|
    - GT Block timer
 | 
						|
    - Watchdog timer
 | 
						|
 | 
						|
  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
 | 
						|
ParseAcpiGtdt (
 | 
						|
  IN BOOLEAN  Trace,
 | 
						|
  IN UINT8    *Ptr,
 | 
						|
  IN UINT32   AcpiTableLength,
 | 
						|
  IN UINT8    AcpiTableRevision
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT32  Index;
 | 
						|
  UINT32  Offset;
 | 
						|
  UINT8   *TimerPtr;
 | 
						|
 | 
						|
  if (!Trace) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  ParseAcpi (
 | 
						|
    TRUE,
 | 
						|
    0,
 | 
						|
    "GTDT",
 | 
						|
    Ptr,
 | 
						|
    AcpiTableLength,
 | 
						|
    PARSER_PARAMS (GtdtParser)
 | 
						|
    );
 | 
						|
 | 
						|
  // Check if the values used to control the parsing logic have been
 | 
						|
  // successfully read.
 | 
						|
  if ((GtdtPlatformTimerCount == NULL) ||
 | 
						|
      (GtdtPlatformTimerOffset == NULL))
 | 
						|
  {
 | 
						|
    IncrementErrorCount ();
 | 
						|
    Print (
 | 
						|
      L"ERROR: Insufficient table length. AcpiTableLength = %d.\n",
 | 
						|
      AcpiTableLength
 | 
						|
      );
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  TimerPtr = Ptr + *GtdtPlatformTimerOffset;
 | 
						|
  Offset   = *GtdtPlatformTimerOffset;
 | 
						|
  Index    = 0;
 | 
						|
 | 
						|
  // Parse the specified number of Platform Timer Structures or the GTDT
 | 
						|
  // buffer length. Whichever is minimum.
 | 
						|
  while ((Index++ < *GtdtPlatformTimerCount) &&
 | 
						|
         (Offset < AcpiTableLength))
 | 
						|
  {
 | 
						|
    // Parse the Platform Timer Header to obtain Length and Type
 | 
						|
    ParseAcpi (
 | 
						|
      FALSE,
 | 
						|
      0,
 | 
						|
      NULL,
 | 
						|
      TimerPtr,
 | 
						|
      AcpiTableLength - Offset,
 | 
						|
      PARSER_PARAMS (GtPlatformTimerHeaderParser)
 | 
						|
      );
 | 
						|
 | 
						|
    // Check if the values used to control the parsing logic have been
 | 
						|
    // successfully read.
 | 
						|
    if ((PlatformTimerType == NULL) ||
 | 
						|
        (PlatformTimerLength == NULL))
 | 
						|
    {
 | 
						|
      IncrementErrorCount ();
 | 
						|
      Print (
 | 
						|
        L"ERROR: Insufficient remaining table buffer length to read the " \
 | 
						|
        L"Platform Timer Structure header. Length = %d.\n",
 | 
						|
        AcpiTableLength - Offset
 | 
						|
        );
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    // Validate Platform Timer Structure length
 | 
						|
    if ((*PlatformTimerLength == 0) ||
 | 
						|
        ((Offset + (*PlatformTimerLength)) > AcpiTableLength))
 | 
						|
    {
 | 
						|
      IncrementErrorCount ();
 | 
						|
      Print (
 | 
						|
        L"ERROR: Invalid Platform Timer Structure length. " \
 | 
						|
        L"Length = %d. Offset = %d. AcpiTableLength = %d.\n",
 | 
						|
        *PlatformTimerLength,
 | 
						|
        Offset,
 | 
						|
        AcpiTableLength
 | 
						|
        );
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    switch (*PlatformTimerType) {
 | 
						|
      case EFI_ACPI_6_4_GTDT_GT_BLOCK:
 | 
						|
        DumpGTBlock (TimerPtr, *PlatformTimerLength);
 | 
						|
        break;
 | 
						|
      case EFI_ACPI_6_4_GTDT_ARM_GENERIC_WATCHDOG:
 | 
						|
        DumpWatchdogTimer (TimerPtr, *PlatformTimerLength);
 | 
						|
        break;
 | 
						|
      default:
 | 
						|
        IncrementErrorCount ();
 | 
						|
        Print (
 | 
						|
          L"ERROR: Invalid Platform Timer Type = %d\n",
 | 
						|
          *PlatformTimerType
 | 
						|
          );
 | 
						|
        break;
 | 
						|
    } // switch
 | 
						|
 | 
						|
    TimerPtr += *PlatformTimerLength;
 | 
						|
    Offset   += *PlatformTimerLength;
 | 
						|
  } // while
 | 
						|
}
 |