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:
committed by
Jaben Carsey
parent
fb5573b830
commit
8da8daafc9
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
GTDT table parser
|
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
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
@par Reference(s):
|
@par Reference(s):
|
||||||
@ -38,6 +38,21 @@ ValidateGtBlockTimerCount (
|
|||||||
IN VOID* Context
|
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.
|
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.
|
An ACPI_PARSER array describing the GT Block timer.
|
||||||
**/
|
**/
|
||||||
STATIC CONST ACPI_PARSER GtBlockTimerParser[] = {
|
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"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 (CntBaseX)", 8, 4, L"0x%lx", NULL, NULL, NULL, NULL},
|
||||||
{L"Physical address (CntEL0BaseX)", 8, 12, L"0x%lx", 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.
|
This function parses the Platform GT Block.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user