diff options
| author | kx <kx@radix.pro> | 2024-06-04 06:43:08 +0300 |
|---|---|---|
| committer | kx <kx@radix.pro> | 2024-06-04 06:43:08 +0300 |
| commit | 7e2ccccace24636f29ddc210b94606abd4c7e42b (patch) | |
| tree | 545d43ea12671048956cafeb12303e84d601e571 /ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Dbg2/Dbg2Parser.c | |
| parent | 27b044605cd5f6b33a3d231576003850b3fe305b (diff) | |
| download | edk2-trunk.tar.xz | |
Renormalized end-of-lines from master@27b044605cd5f6b33a3d231576003850b3fe305btrunk
Diffstat (limited to 'ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Dbg2/Dbg2Parser.c')
| -rw-r--r-- | ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Dbg2/Dbg2Parser.c | 622 |
1 files changed, 311 insertions, 311 deletions
diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Dbg2/Dbg2Parser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Dbg2/Dbg2Parser.c index d25d4d84f8..1ad6ae130c 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Dbg2/Dbg2Parser.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Dbg2/Dbg2Parser.c @@ -1,311 +1,311 @@ -/** @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);
- }
-}
+/** @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); + } +} |
