From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from EUR02-VE1-obe.outbound.protection.outlook.com (EUR02-VE1-obe.outbound.protection.outlook.com [40.107.2.81]) by mx.groups.io with SMTP id smtpd.web11.10677.1588693587707464757 for ; Tue, 05 May 2020 08:46:28 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=x887Kx5R; spf=pass (domain: arm.com, ip: 40.107.2.81, mailfrom: krzysztof.koch@arm.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3taRU50Ha63N9heycQdXv9kEDz2fGdNqqStU9vT3hZE=; b=x887Kx5RHf6I8NtzJzL123QHbCKpJaytEtLL0O6LIIj4msVZwYyzSnL0gUwAsl1+7oSowZ5cT+jAPmKwdvyR7z74YNmZfn9rc7z8of9XXE9R40qKowt2aFF9qgaKKMWiBCcrWPVq0xXmMmpwSThQSB+LfXbZNTaKoWofN9T/nWk= Received: from DBBPR09CA0010.eurprd09.prod.outlook.com (2603:10a6:10:c0::22) by VI1PR0802MB2558.eurprd08.prod.outlook.com (2603:10a6:800:ae::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2958.21; Tue, 5 May 2020 15:46:24 +0000 Received: from DB5EUR03FT011.eop-EUR03.prod.protection.outlook.com (2603:10a6:10:c0:cafe::7a) by DBBPR09CA0010.outlook.office365.com (2603:10a6:10:c0::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2979.26 via Frontend Transport; Tue, 5 May 2020 15:46:24 +0000 Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; edk2.groups.io; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;edk2.groups.io; dmarc=bestguesspass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DB5EUR03FT011.mail.protection.outlook.com (10.152.20.95) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2958.20 via Frontend Transport; Tue, 5 May 2020 15:46:24 +0000 Received: ("Tessian outbound fb9de21a7e90:v54"); Tue, 05 May 2020 15:46:24 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 44b4b4a18bbae059 X-CR-MTA-TID: 64aa7808 Received: from 614dce46c6eb.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 3499806F-738C-4AC5-8393-F25476065FDF.1; Tue, 05 May 2020 15:46:18 +0000 Received: from EUR04-DB3-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 614dce46c6eb.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Tue, 05 May 2020 15:46:18 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WBseuiVD/hDa3eFS3JNWVIRx4pDNvlmaz3rspxbCC7SJGsy9DBsj7UK3seg490GgwNcwXGnCl/SVU/h6Z9aTQ1pyW1kKYRrIm4tVB8XLKnygiDEscxVQWjxTPnP/FsrjzpwuGZ5KIgq/igg76SOD0esMqgf+HlH0GsCSh1KmDrULWcbqmbiiED6iCaxOSyabGQRtCOPTu0DiKGAcJRT3+DPsS4dfakxM5707/M9O7PkNHdFwbheSzhr5gdcgxhMxeCEKIilDoBjok10VOTTkCr7wS7wvv0mjhg/VOWhhkcofeVZeSBTpaeiYEBTMEtHcItoMDfYNInO9Ue5AkUhbGA== 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-SenderADCheck; bh=3taRU50Ha63N9heycQdXv9kEDz2fGdNqqStU9vT3hZE=; b=jmV/5qypc6jzOaJHU/lCxtU4Jr5AXF0VYQviU629aWXtQ67skbkE7O6cBWdtdQlPLXWi7b1eZc5Qc+yO8rUrHUbGtfe3vooU6TT5XpXTogzgF3e/gQynDEpkSFhMc6IBcnrztNsi1u5eQ24/VWbVAg/fF04MfmOi3NPLhw69HGL90Qq4MIC75scn/qA4Fz0A5AyxINnTUpjxMDZ4cZXygVOrsEsnsffESx7kp+VBKzS0uIYsr5Qi04GE0k8DdetkOvs2REPuXUN7KCybZNzYbUtyhaWixobWgORkg/a1bNTz1dLmbHdwedN5iq/fxn12z9NpSDYe2Gla2dVJdd1scQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.67.248.234) smtp.rcpttodomain=edk2.groups.io smtp.mailfrom=arm.com; dmarc=bestguesspass action=none header.from=arm.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3taRU50Ha63N9heycQdXv9kEDz2fGdNqqStU9vT3hZE=; b=x887Kx5RHf6I8NtzJzL123QHbCKpJaytEtLL0O6LIIj4msVZwYyzSnL0gUwAsl1+7oSowZ5cT+jAPmKwdvyR7z74YNmZfn9rc7z8of9XXE9R40qKowt2aFF9qgaKKMWiBCcrWPVq0xXmMmpwSThQSB+LfXbZNTaKoWofN9T/nWk= Received: from AM5PR04CA0011.eurprd04.prod.outlook.com (2603:10a6:206:1::24) by DB6PR08MB2837.eurprd08.prod.outlook.com (2603:10a6:6:19::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2958.27; Tue, 5 May 2020 15:46:18 +0000 Received: from AM5EUR03FT007.eop-EUR03.prod.protection.outlook.com (2603:10a6:206:1:cafe::2a) by AM5PR04CA0011.outlook.office365.com (2603:10a6:206:1::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2979.26 via Frontend Transport; Tue, 5 May 2020 15:46:18 +0000 Authentication-Results-Original: spf=pass (sender IP is 40.67.248.234) smtp.mailfrom=arm.com; edk2.groups.io; dkim=none (message not signed) header.d=none;edk2.groups.io; dmarc=bestguesspass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 40.67.248.234 as permitted sender) receiver=protection.outlook.com; client-ip=40.67.248.234; helo=nebula.arm.com; Received: from nebula.arm.com (40.67.248.234) by AM5EUR03FT007.mail.protection.outlook.com (10.152.16.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.2958.20 via Frontend Transport; Tue, 5 May 2020 15:46:17 +0000 Received: from AZ-NEU-EX03.Arm.com (10.251.24.31) by AZ-NEU-EX03.Arm.com (10.251.24.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1415.2; Tue, 5 May 2020 15:46:08 +0000 Received: from E119924.Arm.com (10.57.59.39) by mail.arm.com (10.251.24.31) with Microsoft SMTP Server id 15.1.1415.2 via Frontend Transport; Tue, 5 May 2020 15:46:07 +0000 From: "Krzysztof Koch" To: CC: , , , , Subject: [PATCH v1 4/6] ShellPkg: acpiview: Make GTDT parsing logic data driven Date: Tue, 5 May 2020 16:46:02 +0100 Message-ID: <20200505154604.9848-5-krzysztof.koch@arm.com> X-Mailer: git-send-email 2.16.2.windows.1 In-Reply-To: <20200505154604.9848-1-krzysztof.koch@arm.com> References: <20200505154604.9848-1-krzysztof.koch@arm.com> MIME-Version: 1.0 X-EOPAttributedMessage: 1 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report-Untrusted: CIP:40.67.248.234;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:nebula.arm.com;PTR:InfoDomainNonexistent;CAT:NONE;SFTY:;SFS:(4636009)(136003)(346002)(376002)(39860400002)(396003)(46966005)(33430700001)(8676002)(26005)(70586007)(36756003)(70206006)(336012)(316002)(7696005)(426003)(186003)(1076003)(33440700001)(5660300002)(8936002)(82310400002)(478600001)(2906002)(4326008)(6916009)(6666004)(54906003)(86362001)(356005)(2616005)(47076004)(81166007)(82740400003)(44832011);DIR:OUT;SFP:1101; X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c7ccda3d-a717-493f-8f29-08d7f10b7743 X-MS-TrafficTypeDiagnostic: DB6PR08MB2837:|VI1PR0802MB2558: X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true NoDisclaimer: true X-MS-Oob-TLC-OOBClassifiers: OLM:10000;OLM:10000; X-Forefront-PRVS: 0394259C80 X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: 0hpjZ2SvVpWBnrXsPJaMTzP8h7p/grgIUMoKYp6QWiadHmRBgpB5YNr4LFp37jQQXnDH+QTAEfWk43uMdsr99TQfqD0wbQHTGLH3+2FGwJVrR/WzWXX1Ya3EGYlrIWGxStHhdANTWr00WSCo/7pI1Paz4KLUxeVa+hsEpEmi4kEm5gnFVaEbi4o+jykkZTCbK7IflngTdcNgTgAGtPwAgkwuqlhvI3J1LJjRLIZ/veQH21oXDGZE+IHgSUtSZRPMRMzOMzsqQo13P+BOCr+HXXHPveNXR+clGaUnIFoZTFxY2OlFTHSFnera3v7TfdLaU+P/xNWUBG3caCinyKq2xBay+29m7RY+dFpdEB7i79lGH7TgpULCJKbht5gTjDc8Cn3pbQJa+oEKJLC29+Aa/u91NFY8lobrUSYZh+4Fnj+rgHWwxwGCGxHoXYZu/QoDY2fC5VdPQ8P7xNRB+RMTBo8bdexaOyUmCQxpy5iFjUstfI6gsjCvHI7xXyEoSAu6po8eYsPerlMj676vKbZNJCfjNMja4Jgj0yKXS1ktBBv9D13V3n6P0Ljfho9KY9p8KABnHjFlz/CMkktT7Vj5qA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR08MB2837 Original-Authentication-Results: spf=pass (sender IP is 40.67.248.234) smtp.mailfrom=arm.com; edk2.groups.io; dkim=none (message not signed) header.d=none;edk2.groups.io; dmarc=bestguesspass action=none header.from=arm.com; Return-Path: Krzysztof.Koch@arm.com X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5EUR03FT011.eop-EUR03.prod.protection.outlook.com X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFTY:;SFS:(4636009)(136003)(39860400002)(376002)(346002)(396003)(46966005)(33430700001)(82310400002)(6916009)(336012)(316002)(426003)(186003)(4326008)(47076004)(6666004)(86362001)(70586007)(70206006)(2906002)(26005)(8676002)(36756003)(44832011)(1076003)(478600001)(81166007)(7696005)(33440700001)(8936002)(82740400003)(2616005)(5660300002)(54906003);DIR:OUT;SFP:1101; X-MS-Office365-Filtering-Correlation-Id-Prvs: 5b76adea-d9d3-43dc-b3a1-08d7f10b7348 X-Forefront-PRVS: 0394259C80 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: VlPuU1+YUm8wEBR1Tv6kS0peO+x1JcsUWYvxqBTigKtDjQcYMcvS7swfUU9JnrCwCyk8wJ5N9C1pGb6E/GqLDWOxsSfbShwFvHtawXciAgbRWsFQd/HU6Y83G6I7D2h4iHe8+794fq+DZYE9VlHvqx6Cud573ieAXfz5B8KVT6vugAey5cRLsMu1StTEMqwEnIHcjxuzH6Ve/b3Sm3EfqyL09fp4qbeYUfncySIfj7eVzsqAk85Q8XrY9JNLVNAUWmm6pdjFJaeh3VjvjfyHMCxmWgaVVicFDbOD4HK3zX4Zc8yWeADeeXgiOfK0RapDErTgcuyHeyu03xasHOLAG85ICh5/krMhrNkYIF3cfjBIjumv6utbCZkO1DHAXBucXZ08V9eouQxkpDVc7P7J3S9e7w4uf13nhHDNBAFr9vo8Y4nQUMC20rCR1l4HPiaiDhJNKjVCmy3n7rG1IwsowZfHMY5Ka2ERilZNvz16cSJh4uf0FpT1IdjY5c6SVvFyqVe461Mpg4f9uEEwTZcD0uYKr/QM9cBcj8/DEJIjzvgX1HgNejk7x0xlBmtd/scu8nhUtEy15iM/LrxiIoYaYg== X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 May 2020 15:46:24.3975 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c7ccda3d-a717-493f-8f29-08d7f10b7743 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0802MB2558 Content-Type: text/plain Replace the switch statement in the main parser loop with a table-driven approach. Use the ParseAcpiStruct () method to resolve how each Platform Timer Structure given should be parsed. Enumerate all structures found in the Generic Timer Description Table (GTDT) on a per-type basis. Print the offset from the start of the table for each structure. Consolidate all metadata about each Platform Timer Structure. Define an array of ACPI_STRUCT_INFO structures to store the name, instance count, architecture support and handling information. Use this array to construct the ACPI_STRUCT_DATABASE for GTDT. Count the number of instances of each Platform Timer Structure type. Optionally report these counts after GTDT table parsing is finished. Modify DumpGTBlock () funtion signature so that it matches that of ACPI_STRUCT_PARSER_FUNC. This way, the function can be used in the ParseAcpiStruct () call. Remove the definition of the DumpWatchdogTimer (). Its only purpose was to call ParseAcpi () and now this process is streamlined. References: - ACPI 6.3 Specification - January 2019, Section 5.2.24 Signed-off-by: Krzysztof Koch --- Notes: v1: - Make GTDT parsing logic data driven [Krzysztof] ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Gtdt/GtdtParser.c | 123 ++++++++++++-------- 1 file changed, 77 insertions(+), 46 deletions(-) diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Gtdt/GtdtParser.c b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Gtdt/GtdtParser.c index bdd30ff45c61142c071ead63a27babab8998721b..9a9f8fda442081507768b1540f0b9b3c6c254329 100644 --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Gtdt/GtdtParser.c +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Gtdt/GtdtParser.c @@ -9,13 +9,20 @@ **/ #include +#include #include #include "AcpiParser.h" #include "AcpiTableParser.h" +#include "AcpiView.h" // "The number of GT Block Timers must be less than or equal to 8" #define GT_BLOCK_TIMER_COUNT_MAX 8 +/** + Handler for each Platform Timer Structure type +**/ +STATIC ACPI_STRUCT_INFO GtdtStructs[]; + // Local variables STATIC CONST UINT32* GtdtPlatformTimerCount; STATIC CONST UINT32* GtdtPlatformTimerOffset; @@ -167,23 +174,35 @@ STATIC CONST ACPI_PARSER SBSAGenericWatchdogParser[] = { /** This function parses the Platform GT Block. - @param [in] Ptr Pointer to the start of the GT Block data. - @param [in] Length Length of the GT Block structure. + @param [in] Ptr Pointer to the start of structure's buffer. + @param [in] Length Length of the buffer. + @param [in] OptArg0 First optional argument (Not used). + @param [in] OptArg1 Second optional argument (Not used). **/ STATIC VOID DumpGTBlock ( - IN UINT8* Ptr, - IN UINT16 Length + IN UINT8* Ptr, + IN UINT32 Length, + IN CONST VOID* OptArg0 OPTIONAL, + IN CONST VOID* OptArg1 OPTIONAL ) { UINT32 Index; UINT32 Offset; + CHAR8 Buffer[80]; + + PrintAcpiStructName ( + GtdtStructs[EFI_ACPI_6_3_GTDT_GT_BLOCK].Name, + GtdtStructs[EFI_ACPI_6_3_GTDT_GT_BLOCK].Count, + sizeof (Buffer), + Buffer + ); ParseAcpi ( TRUE, 2, - "GT Block", + Buffer, Ptr, Length, PARSER_PARAMS (GtBlockParser) @@ -195,7 +214,8 @@ DumpGTBlock ( (GtBlockTimerOffset == NULL)) { IncrementErrorCount (); Print ( - L"ERROR: Insufficient GT Block Structure length. Length = %d.\n", + L"ERROR: Insufficient %a Structure length. Length = %d.\n", + GtdtStructs[EFI_ACPI_6_3_GTDT_GT_BLOCK].Name, Length ); return; @@ -206,41 +226,47 @@ DumpGTBlock ( // Parse the specified number of GT Block Timer Structures or the GT Block // Structure buffer length. Whichever is minimum. - while ((Index++ < *GtBlockTimerCount) && + while ((Index < *GtBlockTimerCount) && (Offset < Length)) { + PrintAcpiStructName ("GT Block Timer", Index, sizeof (Buffer), Buffer); Offset += ParseAcpi ( TRUE, - 2, - "GT Block Timer", + 4, + Buffer, Ptr + Offset, Length - Offset, PARSER_PARAMS (GtBlockTimerParser) ); + Index++; } } /** - This function parses the Platform Watchdog timer. - - @param [in] Ptr Pointer to the start of the watchdog timer data. - @param [in] Length Length of the watchdog timer structure. + Information about each Platform Timer Structure type. **/ -STATIC -VOID -DumpWatchdogTimer ( - IN UINT8* Ptr, - IN UINT16 Length - ) -{ - ParseAcpi ( - TRUE, - 2, +STATIC ACPI_STRUCT_INFO GtdtStructs[] = { + ADD_ACPI_STRUCT_INFO_FUNC ( + "GT Block", + EFI_ACPI_6_3_GTDT_GT_BLOCK, + ARCH_COMPAT_ARM | ARCH_COMPAT_AARCH64, + DumpGTBlock + ), + ADD_ACPI_STRUCT_INFO_ARRAY ( "SBSA Generic Watchdog", - Ptr, - Length, - PARSER_PARAMS (SBSAGenericWatchdogParser) - ); -} + EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG, + ARCH_COMPAT_ARM | ARCH_COMPAT_AARCH64, + SBSAGenericWatchdogParser + ) +}; + +/** + GTDT structure database +**/ +STATIC ACPI_STRUCT_DATABASE GtdtDatabase = { + "Platform Timer Structure", + GtdtStructs, + ARRAY_SIZE (GtdtStructs) +}; /** This function parses the ACPI GTDT table. @@ -275,6 +301,8 @@ ParseAcpiGtdt ( return; } + ResetAcpiStructCounts (&GtdtDatabase); + ParseAcpi ( TRUE, 0, @@ -321,7 +349,8 @@ ParseAcpiGtdt ( IncrementErrorCount (); Print ( L"ERROR: Insufficient remaining table buffer length to read the " \ - L"Platform Timer Structure header. Length = %d.\n", + L"%a header. Length = %d.\n", + GtdtDatabase.Name, AcpiTableLength - Offset ); return; @@ -332,8 +361,9 @@ ParseAcpiGtdt ( ((Offset + (*PlatformTimerLength)) > AcpiTableLength)) { IncrementErrorCount (); Print ( - L"ERROR: Invalid Platform Timer Structure length. " \ - L"Length = %d. Offset = %d. AcpiTableLength = %d.\n", + L"ERROR: Invalid %a length. Length = %d. Offset = %d. " \ + L"AcpiTableLength = %d.\n", + GtdtDatabase.Name, *PlatformTimerLength, Offset, AcpiTableLength @@ -341,23 +371,24 @@ ParseAcpiGtdt ( return; } - switch (*PlatformTimerType) { - case EFI_ACPI_6_3_GTDT_GT_BLOCK: - DumpGTBlock (TimerPtr, *PlatformTimerLength); - break; - case EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG: - DumpWatchdogTimer (TimerPtr, *PlatformTimerLength); - break; - default: - IncrementErrorCount (); - Print ( - L"ERROR: Invalid Platform Timer Type = %d\n", - *PlatformTimerType - ); - break; - } // switch + // Parse the Platform Timer Structure + ParseAcpiStruct ( + 2, + TimerPtr, + &GtdtDatabase, + Offset, + *PlatformTimerType, + *PlatformTimerLength, + NULL, + NULL + ); TimerPtr += *PlatformTimerLength; Offset += *PlatformTimerLength; } // while + + // Report and validate Platform Timer Type Structure counts + if (GetConsistencyChecking ()) { + ValidateAcpiStructCounts (&GtdtDatabase); + } } -- 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'