From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM02-SN1-obe.outbound.protection.outlook.com (NAM02-SN1-obe.outbound.protection.outlook.com [40.107.96.68]) by mx.groups.io with SMTP id smtpd.web11.10466.1645010037452567558 for ; Wed, 16 Feb 2022 03:13:57 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@amd.com header.s=selector1 header.b=NyakzzZL; spf=permerror, err=parse error for token &{10 18 %{i}._ip.%{h}._ehlo.%{d}._spf.vali.email}: invalid domain name (domain: amd.com, ip: 40.107.96.68, mailfrom: abdullateef.attar@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=F+8fAID6gfinjRNWlwdX191IMi9pLRePdJzECeHvofhphNeA/1UIb0vkoIHD3SoTBc08ByinCrspI2DUI0SRIPZ3JGi++eMNj59c6uGvF3asx2trNxBonIQPcMW5sGdP1M3dEAMoVSv7t3mhKX5hdRSnR4qFAxlzcr/LqzyeRpZSYg916sKWvHRNrW+9yoZz7Q4o1Yk3VCfDEkEfp+PTI3H9YY3LdjGevwTemcCHu0jsOk2xQi3CCQRb0oQJlZBs1fILnHgbnhOUiiHTRhcfHfcuMoH2eN46ruYy5eU5M7QRDT7wz4YuRthYLE1y7U1zLh+mCNpiHEAL9Wg4W9cFZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Fs19HKYWFA/x6lb2/WYdj2arT3M6hvbydhBgyQ2UeT8=; b=GzmcZJ2Sh+dJbjHupDux9t25A630d4QzNj+q7BUwOHZo05A1WoMTxEQOBCfZzcWez38ugEwmznuhbPIju7Dc/tvn6vWOzUubCxm8JyeBhg0uwdwTfw9wFv/HhT2dHEXnLxgQKVwNwAaRaF7HZnHUgdwxD0TUJ8eVxLx2hkKHkykVCUlU3/+Q5cqLfIV9mzegodaGAluGA1/4ULJ7dO3325qSTjbX2xPNBwfwKHKa93K1ObNLmXEYC3wnHrqHicuAj0jKKvha8JzzzsLk/iNDP0Kt7nPoG9MFXXwElAeZ4TtTH+c6tn7EZMP61+MqzLYKWieFSJy5K5V2eLF08reuzg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=edk2.groups.io smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Fs19HKYWFA/x6lb2/WYdj2arT3M6hvbydhBgyQ2UeT8=; b=NyakzzZLVz0RWFpxKHYsXGL9I3SkrjSuF0fQz7RVI/xKVrPU6P8kEd6pfFG0V3ZS3jD1GEb2oTTkuiHXy4gRzjd6REYqUIaEzwgwRZzlM8M2SkPG9UqXMNPNm/OwccwYtjmhln7p4DRoqIV6TDaoDcsgHvCOSJ8A+55+YcGNWAI= Received: from MWHPR18CA0038.namprd18.prod.outlook.com (2603:10b6:320:31::24) by SN1PR12MB2479.namprd12.prod.outlook.com (2603:10b6:802:29::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4975.18; Wed, 16 Feb 2022 11:13:54 +0000 Received: from CO1NAM11FT009.eop-nam11.prod.protection.outlook.com (2603:10b6:320:31:cafe::a8) by MWHPR18CA0038.outlook.office365.com (2603:10b6:320:31::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4975.17 via Frontend Transport; Wed, 16 Feb 2022 11:13:54 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB03.amd.com; Received: from SATLEXMB03.amd.com (165.204.84.17) by CO1NAM11FT009.mail.protection.outlook.com (10.13.175.61) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.4975.11 via Frontend Transport; Wed, 16 Feb 2022 11:13:54 +0000 Received: from SATLEXMB03.amd.com (10.181.40.144) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.18; Wed, 16 Feb 2022 05:13:53 -0600 Received: from BLR-LAB-SFW01.amd.com (10.180.168.240) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server id 15.1.2375.18 via Frontend Transport; Wed, 16 Feb 2022 05:13:51 -0600 From: "Abdul Lateef Attar" To: CC: Ray Ni , Zhichao Gao , Sami Mujawar Subject: [PATCH v5 1/2] ShellPkg/AcpiView: Adds ACPI_PARSER bitfield parser Date: Wed, 16 Feb 2022 16:43:54 +0530 Message-ID: <20220216111355.9801-2-abdattar@amd.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220216111355.9801-1-abdattar@amd.com> References: <20220216111355.9801-1-abdattar@amd.com> MIME-Version: 1.0 Return-Path: AbdulLateef.Attar@amd.com X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f3fd3b7e-9773-4630-273c-08d9f13d6b5b X-MS-TrafficTypeDiagnostic: SN1PR12MB2479:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:9508; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 47UWb6LacwC8Du59GkEwVuhn4CAVwzQ8gyirPU/ruFIssoI/9GtQ8+Vqlpf9plQw4nagRc7uKsG3aLY49fdBgzE1g0UwVhphl36N5ucyT/GAFVPmlZ1VAqhwTI67FnZQxbuYfg6CPHfoStjGY4KwiG3A5Tl85M8JFSzfRw8K41lBZv4U/taHzAbJ0+7nf6y9dsB19P3j/GG6Gx7cbp3T0tspJbzJ7AIR4cxgLG+HSrKW4Z/AMop6yUqFbVeB/keYHdvG5qKk+QeFw34FP+kCkPh8cy/VDPFLCpJ7pXfdW/fBj+qmFkOlSg49Y8F7KhEERmzGBUw5FZAH5x3kBQJjmiJyZ8hZtG5Aph8qqyuUFSIXlrS1j5BON98zRW4FoNque+QryyOBx2WQPE6Aa++ROOTyKADmg/9u99UhMFjlIwYlotjTzDShVbybfCFao7w4yqZSZ9QhzGZPrgoorl4qad2IoioyveLKMW71KkCZW13wbOqa+XzTOQDpwZ0IGj0riLQGgdE76XNcz/YQUMYG2QsDh4kRYYzYoA8eMNfj43sL0yH6dYXMpS8H81YR98uZudeU/FFel2yCwmy8/jN9ek5PGkGjLMIF4mFCDBYpj6ejpEbvuEc9B++uvfKKSTdAPtEw5xsoLLj8qS+1/CvlQug2Qifg/fzIc1Djhil8NGEZfMrzJR/0e+blJPrSp80y63GgXVIE41UxWxIhBzLuD5ZpyjBPvmCrzP0eAy+wQ216lK63akuzBKlEX9G+LGrsSkos5pNpx07wmfxAWrb6HXQxIToOCTn3HDlwnJrIc8Q= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB03.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230001)(4636009)(46966006)(40470700004)(36840700001)(70586007)(508600001)(47076005)(26005)(426003)(40460700003)(2616005)(83380400001)(1076003)(966005)(316002)(36860700001)(336012)(70206006)(36756003)(7696005)(54906003)(5660300002)(6916009)(186003)(4326008)(356005)(82310400004)(81166007)(2906002)(8676002)(8936002)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Feb 2022 11:13:54.4039 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f3fd3b7e-9773-4630-273c-08d9f13d6b5b X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB03.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT009.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB2479 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3839 Adds ParseAcpiBitFields() which is based on ParseAcpi() and capable of parsing the bit fields. Supports parsing of UINT8, UINT16, UINT32 and UINT64 byte data. Cc: Ray Ni Cc: Zhichao Gao Cc: Sami Mujawar Signed-off-by: Abdul Lateef Attar --- ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h | 48 +++++ ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c | 188 ++++++++++= ++++++++++ 2 files changed, 236 insertions(+) diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h b/Sh= ellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h index 5c916a4720b8..db8c88f6dfa4 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h @@ -2,6 +2,7 @@ Header file for ACPI parser=0D =0D Copyright (c) 2016 - 2020, Arm Limited. All rights reserved.=0D + Copyright (c) 2022, AMD Incorporated. All rights reserved.=0D SPDX-License-Identifier: BSD-2-Clause-Patent=0D **/=0D =0D @@ -251,6 +252,11 @@ typedef VOID (EFIAPI *FNPTR_FIELD_VALIDATOR)(UINT8 *Pt= r, VOID *Context); the field data. If the field is more complex and requires additional=0D processing for formatting and representation a print formatter function= =0D can be specified in 'PrintFormatter'.=0D +=0D + ParseAcpiBitFields() uses AcpiParser structure to parse the bit fields.= =0D + It considers Length as a number of bits that need to be parsed.=0D + Also, the Offset field will be considered as starting offset of the bitf= ield.=0D +=0D The PrintFormatter function may choose to use the format string=0D specified by 'Format' or use its own internal format string.=0D =0D @@ -264,10 +270,12 @@ typedef struct AcpiParser { =0D /// The length of the field.=0D /// (Byte Length column from ACPI table spec)=0D + /// Length(in bits) of the bitfield if used with ParseAcpiBitFields().=0D UINT32 Length;=0D =0D /// The offset of the field from the start of the table.=0D /// (Byte Offset column from ACPI table spec)=0D + /// The Bit offset of the field if used with ParseAcpiBitFields().=0D UINT32 Offset;=0D =0D /// Optional Print() style format string for tracing the data. If not=0D @@ -285,6 +293,7 @@ typedef struct AcpiParser { /// a pointer to the field data. This value is set after the FieldValida= tor=0D /// has been called and therefore should not be used by the FieldValidat= or.=0D /// If unused this must be set to NULL.=0D + /// ItemPtr is not supported with ParseAcpiBitFields().=0D VOID **ItemPtr;=0D =0D /// Optional pointer to a field validator function.=0D @@ -364,6 +373,45 @@ ParseAcpi ( IN UINT32 ParserItems=0D );=0D =0D +/**=0D + This function is used to parse an ACPI table bitfield buffer.=0D +=0D + The ACPI table buffer is parsed using the ACPI table parser information= =0D + specified by a pointer to an array of ACPI_PARSER elements. This parser= =0D + function iterates through each item on the ACPI_PARSER array and logs th= e ACPI table bitfields.=0D +=0D + This function can optionally be used to parse ACPI tables and fetch spec= ific=0D + field values. The ItemPtr member of the ACPI_PARSER structure (where use= d)=0D + is updated by this parser function to point to the selected field data=0D + (e.g. useful for variable length nested fields).=0D +=0D + ItemPtr member of ACPI_PARSER is not supported with this function.=0D +=0D + @param [in] Trace Trace the ACPI fields TRUE else only parse the= =0D + table.=0D + @param [in] Indent Number of spaces to indent the output.=0D + @param [in] AsciiName Optional pointer to an ASCII string that descri= bes=0D + the table being parsed.=0D + @param [in] Ptr Pointer to the start of the buffer.=0D + @param [in] Length Length of the buffer pointed by Ptr.=0D + @param [in] Parser Pointer to an array of ACPI_PARSER structure th= at=0D + describes the table being parsed.=0D + @param [in] ParserItems Number of items in the ACPI_PARSER array.=0D +=0D + @retval Number of bits parsed.=0D +**/=0D +UINT32=0D +EFIAPI=0D +ParseAcpiBitFields (=0D + IN BOOLEAN Trace,=0D + IN UINT32 Indent,=0D + IN CONST CHAR8 *AsciiName OPTIONAL,=0D + IN UINT8 *Ptr,=0D + IN UINT32 Length,=0D + IN CONST ACPI_PARSER *Parser,=0D + IN UINT32 ParserItems=0D + );=0D +=0D /**=0D This is a helper macro to pass parameters to the Parser functions.=0D =0D diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c b/Sh= ellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c index cb193a5ea449..fcc56c189d65 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.c @@ -2,12 +2,14 @@ ACPI parser=0D =0D Copyright (c) 2016 - 2021, Arm Limited. All rights reserved.=0D + Copyright (c) 2022, AMD Incorporated. All rights reserved.=0D SPDX-License-Identifier: BSD-2-Clause-Patent=0D **/=0D =0D #include =0D #include =0D #include =0D +#include =0D #include "AcpiParser.h"=0D #include "AcpiView.h"=0D #include "AcpiViewConfig.h"=0D @@ -752,3 +754,189 @@ ParseAcpiHeader ( =0D return BytesParsed;=0D }=0D +=0D +/**=0D + This function is used to parse an ACPI table bitfield buffer.=0D +=0D + The ACPI table buffer is parsed using the ACPI table parser information= =0D + specified by a pointer to an array of ACPI_PARSER elements. This parser= =0D + function iterates through each item on the ACPI_PARSER array and logs th= e ACPI table bitfields.=0D +=0D + This function can optionally be used to parse ACPI tables and fetch spec= ific=0D + field values. The ItemPtr member of the ACPI_PARSER structure (where use= d)=0D + is updated by this parser function to point to the selected field data=0D + (e.g. useful for variable length nested fields).=0D +=0D + ItemPtr member of ACPI_PARSER is not supported with this function.=0D +=0D + @param [in] Trace Trace the ACPI fields TRUE else only parse the= =0D + table.=0D + @param [in] Indent Number of spaces to indent the output.=0D + @param [in] AsciiName Optional pointer to an ASCII string that descri= bes=0D + the table being parsed.=0D + @param [in] Ptr Pointer to the start of the buffer.=0D + @param [in] Length Length in bytes of the buffer pointed by Ptr.=0D + @param [in] Parser Pointer to an array of ACPI_PARSER structure th= at=0D + describes the table being parsed.=0D + @param [in] ParserItems Number of items in the ACPI_PARSER array.=0D +=0D + @retval Number of bits parsed.=0D +**/=0D +UINT32=0D +EFIAPI=0D +ParseAcpiBitFields (=0D + IN BOOLEAN Trace,=0D + IN UINT32 Indent,=0D + IN CONST CHAR8 *AsciiName OPTIONAL,=0D + IN UINT8 *Ptr,=0D + IN UINT32 Length,=0D + IN CONST ACPI_PARSER *Parser,=0D + IN UINT32 ParserItems=0D + )=0D +{=0D + UINT32 Index;=0D + UINT32 Offset;=0D + BOOLEAN HighLight;=0D + UINTN OriginalAttribute;=0D +=0D + UINT64 Data;=0D + UINT64 BitsData;=0D +=0D + if ((Length =3D=3D 0) || (Length > 8)) {=0D + IncrementErrorCount ();=0D + Print (=0D + L"\nERROR: Bitfield Length(%d) is zero or exceeding the 64 bit limit= .\n",=0D + Length=0D + );=0D + return 0;=0D + }=0D +=0D + //=0D + // set local variables to suppress incorrect compiler/analyzer warnings= =0D + //=0D + OriginalAttribute =3D 0;=0D + Offset =3D 0;=0D +=0D + // Increment the Indent=0D + gIndent +=3D Indent;=0D +=0D + CopyMem ((VOID *)&BitsData, (VOID *)Ptr, Length);=0D + if (Trace && (AsciiName !=3D NULL)) {=0D + HighLight =3D GetColourHighlighting ();=0D +=0D + if (HighLight) {=0D + OriginalAttribute =3D gST->ConOut->Mode->Attribute;=0D + gST->ConOut->SetAttribute (=0D + gST->ConOut,=0D + EFI_TEXT_ATTR (=0D + EFI_YELLOW,=0D + ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)=0D + )=0D + );=0D + }=0D +=0D + Print (=0D + L"%*a%-*a :\n",=0D + gIndent,=0D + "",=0D + (OUTPUT_FIELD_COLUMN_WIDTH - gIndent),=0D + AsciiName=0D + );=0D + if (HighLight) {=0D + gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute);=0D + }=0D + }=0D +=0D + for (Index =3D 0; Index < ParserItems; Index++) {=0D + if ((Offset + Parser[Index].Length) > (Length * 8)) {=0D + // For fields outside the buffer length provided, reset any pointers= =0D + // which were supposed to be updated by this function call=0D + if (Parser[Index].ItemPtr !=3D NULL) {=0D + *Parser[Index].ItemPtr =3D NULL;=0D + }=0D +=0D + // We don't parse past the end of the max length specified=0D + continue;=0D + }=0D +=0D + if (Parser[Index].Length =3D=3D 0) {=0D + IncrementErrorCount ();=0D + // don't parse the bitfield whose length is zero=0D + Print (=0D + L"\nERROR: %a: Cannot parse this field, Field Length =3D %d\n",=0D + Parser[Index].Length=0D + );=0D + continue;=0D + }=0D +=0D + if (GetConsistencyChecking () &&=0D + (Offset !=3D Parser[Index].Offset))=0D + {=0D + IncrementErrorCount ();=0D + Print (=0D + L"\nERROR: %a: Offset Mismatch for %s\n"=0D + L"CurrentOffset =3D %d FieldOffset =3D %d\n",=0D + AsciiName,=0D + Parser[Index].NameStr,=0D + Offset,=0D + Parser[Index].Offset=0D + );=0D + }=0D +=0D + // extract Bitfield data for the current item=0D + Data =3D (BitsData >> Parser[Index].Offset) & ~(~0ULL << Parser[Index]= .Length);=0D +=0D + if (Trace) {=0D + // if there is a Formatter function let the function handle=0D + // the printing else if a Format is specified in the table use=0D + // the Format for printing=0D + PrintFieldName (2, Parser[Index].NameStr);=0D + if (Parser[Index].PrintFormatter !=3D NULL) {=0D + Parser[Index].PrintFormatter (Parser[Index].Format, (UINT8 *)&Data= );=0D + } else if (Parser[Index].Format !=3D NULL) {=0D + // convert bit length to byte length=0D + switch ((Parser[Index].Length + 7) >> 3) {=0D + // print the data depends on byte size=0D + case 1:=0D + DumpUint8 (Parser[Index].Format, (UINT8 *)&Data);=0D + break;=0D + case 2:=0D + DumpUint16 (Parser[Index].Format, (UINT8 *)&Data);=0D + break;=0D + case 3:=0D + case 4:=0D + DumpUint32 (Parser[Index].Format, (UINT8 *)&Data);=0D + break;=0D + case 5:=0D + case 6:=0D + case 7:=0D + case 8:=0D + DumpUint64 (Parser[Index].Format, (UINT8 *)&Data);=0D + break;=0D + default:=0D + Print (=0D + L"\nERROR: %a: CANNOT PARSE THIS FIELD, Field Length =3D %d\= n",=0D + AsciiName,=0D + Parser[Index].Length=0D + );=0D + } // switch=0D + }=0D +=0D + // Validating only makes sense if we are tracing=0D + // the parsed table entries, to report by table name.=0D + if (GetConsistencyChecking () &&=0D + (Parser[Index].FieldValidator !=3D NULL))=0D + {=0D + Parser[Index].FieldValidator ((UINT8 *)&Data, Parser[Index].Contex= t);=0D + }=0D +=0D + Print (L"\n");=0D + } // if (Trace)=0D +=0D + Offset +=3D Parser[Index].Length;=0D + } // for=0D +=0D + // Decrement the Indent=0D + gIndent -=3D Indent;=0D + return Offset;=0D +}=0D --=20 2.25.1