ShellPkg: acpiview: Add GT Frame Number validation to GTDT parser

The ACPI 6.2 specification mandates that the Generic Timer (GT) Block
Timer Structures must have a frame number in the range 0-7.

Update the GTDT parser to warn if this condition is violated.

Signed-off-by: Krzysztof Koch <krzysztof.koch@arm.com>
Reviewed-by: Zhichao Gao <zhichao.gao@intel.com>
This commit is contained in:
Krzysztof Koch 2019-05-16 01:43:35 -07:00 committed by Jaben Carsey
parent fb5573b830
commit 8da8daafc9
1 changed files with 45 additions and 2 deletions

View File

@ -1,7 +1,7 @@
/** @file
GTDT table parser
Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
Copyright (c) 2016 - 2019, ARM Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Reference(s):
@ -38,6 +38,21 @@ ValidateGtBlockTimerCount (
IN VOID* Context
);
/**
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
);
/**
An ACPI_PARSER array describing the ACPI GTDT Table.
**/
@ -92,7 +107,7 @@ STATIC CONST ACPI_PARSER GtBlockParser[] = {
An ACPI_PARSER array describing the GT Block timer.
**/
STATIC CONST ACPI_PARSER GtBlockTimerParser[] = {
{L"Frame Number", 1, 0, L"%d", NULL, NULL, NULL, NULL},
{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,
@ -145,6 +160,34 @@ ValidateGtBlockTimerCount (
}
}
/**
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 > 7) {
IncrementErrorCount ();
Print (
L"\nERROR: GT Frame Number = %d. GT Frame Number must be in range 0-7.",
FrameNumber
);
}
}
/**
This function parses the Platform GT Block.