123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- /** @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);
- }
- }
|