From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by mx.groups.io with SMTP id smtpd.web12.56739.1597711724157198952 for ; Mon, 17 Aug 2020 17:48:44 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=EuYLmrkn; spf=pass (domain: intel.com, ip: 192.55.52.93, mailfrom: zhichao.gao@intel.com) IronPort-SDR: BPKVg9/Ra3BdZJeOmbg4euZOot3DKpi2JMwew4PRzi0YL9MTEAJ60QOTRsrVQa6E6fKKNrsaVY XOhFOGzZ3Z5g== X-IronPort-AV: E=McAfee;i="6000,8403,9716"; a="152450417" X-IronPort-AV: E=Sophos;i="5.76,324,1592895600"; d="scan'208";a="152450417" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Aug 2020 17:48:43 -0700 IronPort-SDR: ZLpcjdzPyr50Jv/X6yyx7cHz82ag1mMtU7GRcZmX3kDlevEmO8vu1qXRXHKyenG41tOA3AICvS 7Wj7O587O6DA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.76,324,1592895600"; d="scan'208";a="497194779" Received: from fmsmsx601-2.cps.intel.com (HELO fmsmsx601.amr.corp.intel.com) ([10.18.84.211]) by fmsmga005.fm.intel.com with ESMTP; 17 Aug 2020 17:48:43 -0700 Received: from fmsmsx601.amr.corp.intel.com (10.18.126.81) by fmsmsx601.amr.corp.intel.com (10.18.126.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1713.5; Mon, 17 Aug 2020 17:48:42 -0700 Received: from fmsmsx152.amr.corp.intel.com (10.18.125.5) by fmsmsx601.amr.corp.intel.com (10.18.126.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.1713.5 via Frontend Transport; Mon, 17 Aug 2020 17:48:42 -0700 Received: from fmsedg601.ED.cps.intel.com (10.1.192.135) by FMSMSX152.amr.corp.intel.com (10.18.125.5) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 17 Aug 2020 17:48:42 -0700 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (104.47.58.105) by edgegateway.intel.com (192.55.55.70) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.1713.5; Mon, 17 Aug 2020 17:48:42 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Pq6C2ephFrec2v+lwx2/0XNbotBYoiI20/uKxCNCZfAIlw4T56rct6y7DLd/LbZocza9XJp1JObBoNlii5umHsGcS+kW2ALL+CXNm2g94SjBbhQUujK9hdgFVRqEWBN1Lo0mzEnpWVw+V2Ob1Q9gBNjvvuezwzJVZCPkeTesSFI6c5atbJ7jgUG8IMEAifMgBGj3EqOqfGp7I77fEYN/ZGI6qKgrqxrK0/hMI6Ly1226hmJBd7DnN4AjyyNzzl1UeKuvc1SXUHGpq4J9o+/Iadnmh5ww+7ZIZggXAsXL1M8hrbqvqZlerJXHfFAIRzNV8rkmk7QN+T9m1BZHE5sKhQ== 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=T0O8Vd96Z6oW72cncQcAbsXmZexQAOYq7wa1be8SYaU=; b=mEVRMKCUIheVHgVxM+YwwdfQWbwNl4rZNYIUC+ytI8E3/QgPns/PZo6PSaY4lhDw4LKZV3SUMl7xHazmMtk42s1zETzf/tN1X1mZcRG5unPC7DVwX0jIJzhuENI5SqKXe6wngpFLDiSdcc+T45pzD+ICNxQrQgvs71Grv+lg/HCyHx6e5gI+b5fOlhZ3rNz7Z3Tq4l9LJiaBxszm0Cz6ih4A4UzUUv6R9E15tUh5PAajwoJqcPYGhzvJU4SwHqcgu9QWToUXrqafQb65wlTsI0TfUhM8YnsD0bdu+Q0GjO9KWGWTbadYOq+lbIxC503bSQX4lXTqkX9+lpSiY0ebGA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=T0O8Vd96Z6oW72cncQcAbsXmZexQAOYq7wa1be8SYaU=; b=EuYLmrknn4bKA1gAO+UtPOObf4QIRM8eznY6gBNhyL9PuNeCMjHEl10XIf0UNCZN+IeM3IfXsPL8VXhquC0Y/ekabRtz3qAZlanDpx/WHRoaZTVgCbGWJGDrr1Rk10WTDYaGzTjIjjBFXB2vhBCWIpFb6Ww87KeLYl7ZYm45t+I= Received: from DM6PR11MB4425.namprd11.prod.outlook.com (2603:10b6:5:1d9::31) by DM6PR11MB3611.namprd11.prod.outlook.com (2603:10b6:5:13d::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3283.15; Tue, 18 Aug 2020 00:48:40 +0000 Received: from DM6PR11MB4425.namprd11.prod.outlook.com ([fe80::8dc1:7146:874:83f7]) by DM6PR11MB4425.namprd11.prod.outlook.com ([fe80::8dc1:7146:874:83f7%6]) with mapi id 15.20.3283.027; Tue, 18 Aug 2020 00:48:40 +0000 From: "Gao, Zhichao" To: Marc Moisson , "devel@edk2.groups.io" CC: "nd@arm.com" , "Ni, Ray" , "Matteo.Carlini@arm.com" , "Guillaume.Letellier@arm.com" , "sami.mujawar@arm.com" Subject: Re: [PATCH v1-resend 1/1] ShellPkg/AcpiView: PCCT Parser Thread-Topic: [PATCH v1-resend 1/1] ShellPkg/AcpiView: PCCT Parser Thread-Index: AQHWdH6ww4P7c/e/nEO3uMoTpKTe1qk9B8mw Date: Tue, 18 Aug 2020 00:48:40 +0000 Message-ID: References: <20200817100919.1547-1-marc.moisson-franckhauser@arm.com> In-Reply-To: <20200817100919.1547-1-marc.moisson-franckhauser@arm.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-reaction: no-action dlp-version: 11.5.1.3 authentication-results: arm.com; dkim=none (message not signed) header.d=none;arm.com; dmarc=none action=none header.from=intel.com; x-originating-ip: [192.102.204.38] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 237ce575-c35f-4b9b-d182-08d843107334 x-ms-traffictypediagnostic: DM6PR11MB3611: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:10000; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: E+38diDHCSxVhn6eTniv8lGd3MFcfQYmFsjTJ8j/ovjXKapH3iPAWJe1xHusRLv4fGNmsqbfENQKgH+YLgbVjV2bQV44oAvb0xoe+4QLqrsm/t8Pn8aTpGVfkml7YOopc2GnLGiQR44PxUajoVR4ysI9+zHa7THW/3IHsUve/qWz4A3rlQ/SosbOecUL4uNaC+UWuVNa4jObhiE3eiwsM78+wXq8Nc0mvME7FcdDpitoefuACiLK+v7zKntSet4p83aiedtLAfySoaILvd3bBzmqljW/PhWqee+rvpg+o3g/86oZHZJxnmTCArVIxnbaDfJ7b8lkMRqV6AjCvQUQwszEECHrfi+M081GHq10UEwCUCAy3lNbf1zXAtdbaTGfOXj20F1OyA9ZXV0+616ArQ== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR11MB4425.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(39860400002)(136003)(366004)(346002)(376002)(396003)(83380400001)(66446008)(33656002)(966005)(478600001)(19627235002)(66556008)(66476007)(110136005)(2906002)(52536014)(316002)(8936002)(64756008)(8676002)(86362001)(4326008)(71200400001)(6506007)(26005)(30864003)(76116006)(9686003)(66946007)(55016002)(53546011)(54906003)(7696005)(5660300002)(186003)(579004)(559001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata: 5iCkrS3iSotfikW9sssywd5KrL819zXGUj2FREOJWGnKqCdjsAVQWiAc03M34NUOxoKNBZ1Avk/79B/uT+0TzZA4HrvQpx0Y2vc2xtZAul4V7RoihfkxuLsGo51rm9ReW+Rn5cTbGpj0E0MMcCyVUHSV2KBsLlhwvfdJuO7LrhppzXUeroD7S8ha9p8KZG/7XvNV9i7cG/QqGNY16xClqiTI9VgSTY4MBsQzbPJ9GJcsXS9T6cJBEwEnbUrRhbGB8rLgtjypJslmTfHdHad2Yl+yqyXJsknEfijqQb3pnEt4aRDKzsRVtITbKKDbiXem4G4CVUMWsbSizjWEFvUZwqqthLS0j1SfwfUQpsctIuO4mDjwzqam+Hr1nX1Fexvxqu7Vq6kBWzKcnHYxTVufxpFkVsWUYmcAnY1hUDatjgY7HRvDPu8SIZdfPSImQ0+BeDRWt28FHwlyAx+7AYIplDqK47V59c1C2Ca3qfKVWmDciM0kFUNH4I84Lw3p4K4zjZtcIdTucYpdQnJYNy3eIBittMaKt3YBfkVBKwzafKsyAG3nMbOnQmb1QqJgD66vYabVZ79IbQils1bMzUH2tk1G00OrXEifwOtIdA//hzEq2NcP7othkn8Wj4EoYpodJkVL1qBE4YVdRzZqdRb/XA== MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM6PR11MB4425.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 237ce575-c35f-4b9b-d182-08d843107334 X-MS-Exchange-CrossTenant-originalarrivaltime: 18 Aug 2020 00:48:40.2635 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: KN+729YdQ+GyM+UnE7Nr6fRq6/HwS1Vi4xf+1KYOddSWwOOS4WEdOLrFoHQm/Hn4yJMZOQGBvY+/qIth+tNUqQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR11MB3611 Return-Path: zhichao.gao@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi Marc, Please send the patch to the devel@edk2.groups.io. There are two ways to do= this: 1. add below info in the .gitconfig. It would help to send to the email add= ress every time you use 'git send-email *.patch'. [sendemail] to =3D devel@edk2.groups.io 2. add the email address every time you send patch. i.e. 'git send-email *.= patch --to devel@edk2.groups.io' I prefer #1. Thanks, Zhichao > -----Original Message----- > From: Marc Moisson > Sent: Monday, August 17, 2020 6:09 PM > To: marc.moisson-franckhauser@arm.com > Cc: nd@arm.com; Ni, Ray ; Gao, Zhichao > ; Matteo.Carlini@arm.com; > Guillaume.Letellier@arm.com; sami.mujawar@arm.com > Subject: [PATCH v1-resend 1/1] ShellPkg/AcpiView: PCCT Parser >=20 > Create a new parser for the PCCT Table. >=20 > The PCCT Table is used to describe how the OSPM can communicate with >=20 > entities outside the platform. It describes which >=20 > memory spaces correspond to which entity as well as a few of the >=20 > needed information to handle the communications. >=20 > This new PCCT parser dumps the values and names of the table fields. It >=20 > also performs some validation on the table's fields. >=20 >=20 >=20 > Signed-off-by: Marc Moisson-Franckhauser franckhauser@arm.com> >=20 > --- >=20 >=20 >=20 > The changes can be seen at > https://github.com/AurelienMoisson/edk2/tree/840_acpiview_pcct_parser_v1 >=20 >=20 >=20 > ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h = | 24 +- >=20 > ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h = | 4 > +- >=20 > ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.c = | > 488 ++++++++++++++++++++ >=20 > ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.h = | > 33 ++ >=20 >=20 > ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.= c > | 4 +- >=20 >=20 > ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLib.= i > nf | 4 +- >=20 > 6 files changed, 552 insertions(+), 5 deletions(-) >=20 >=20 >=20 > diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h >=20 > index > f81ccac7e118378aa185db4b625e5bcd75f78347..7ed9cb5b7d8ff8f448f4893eebf8 > ddd744ccbf4b 100644 >=20 > --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h >=20 > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiParser.h >=20 > @@ -1,7 +1,7 @@ >=20 > /** @file >=20 > Header file for ACPI parser >=20 >=20 >=20 > - Copyright (c) 2016 - 2020, ARM Limited. All rights reserved. >=20 > + Copyright (c) 2016 - 2020, Arm Limited. All rights reserved. >=20 > SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > **/ >=20 >=20 >=20 > @@ -670,6 +670,28 @@ ParseAcpiMcfg ( >=20 > IN UINT8 AcpiTableRevision >=20 > ); >=20 >=20 >=20 > +/** >=20 > + This function parses the ACPI PCCT table including its sub-structures = of type >=20 > + 0 through 4. >=20 > + When trace is enabled this function parses the PCCT table and >=20 > + traces the ACPI table fields. >=20 > + >=20 > + This function also performs validation of the ACPI table fields. >=20 > + >=20 > + @param [in] Trace If TRUE, trace the ACPI fields. >=20 > + @param [in] Ptr Pointer to the start of the buffer. >=20 > + @param [in] AcpiTableLength Length of the ACPI table. >=20 > + @param [in] AcpiTableRevision Revision of the ACPI table. >=20 > +**/ >=20 > +VOID >=20 > +EFIAPI >=20 > +ParseAcpiPcct ( >=20 > + IN BOOLEAN Trace, >=20 > + IN UINT8* Ptr, >=20 > + IN UINT32 AcpiTableLength, >=20 > + IN UINT8 AcpiTableRevision >=20 > + ); >=20 > + >=20 > /** >=20 > This function parses the ACPI PPTT table. >=20 > When trace is enabled this function parses the PPTT table and >=20 > diff --git a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser= .h > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h >=20 > index > 4f92596b90a6ee422d8d0959881015ffd3de4da0..0ebf79fb653ae3a8190273aee4 > 52723c6213eb58 100644 >=20 > --- a/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h >=20 > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/AcpiTableParser.h >=20 > @@ -1,7 +1,7 @@ >=20 > /** @file >=20 > Header file for ACPI table parser >=20 >=20 >=20 > - Copyright (c) 2016 - 2018, ARM Limited. All rights reserved. >=20 > + Copyright (c) 2016 - 2020, Arm Limited. All rights reserved. >=20 > SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > **/ >=20 >=20 >=20 > @@ -11,7 +11,7 @@ >=20 > /** >=20 > The maximum number of ACPI table parsers. >=20 > */ >=20 > -#define MAX_ACPI_TABLE_PARSERS 16 >=20 > +#define MAX_ACPI_TABLE_PARSERS 32 >=20 >=20 >=20 > /** An invalid/NULL signature value. >=20 > */ >=20 > diff --git > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.c > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.c >=20 > new file mode 100644 >=20 > index > 0000000000000000000000000000000000000000..80cd35bb8fc6f1ece56fc3089d > e090687a836a1f >=20 > --- /dev/null >=20 > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParse= r.c >=20 > @@ -0,0 +1,488 @@ >=20 > +/** @file >=20 > + PCCT table parser >=20 > + >=20 > + Copyright (c) 2020, Arm Limited. >=20 > + SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > + >=20 > + @par Reference(s): >=20 > + - ACPI 6.3 Specification - January 2019 >=20 > +**/ >=20 > + >=20 > +#include >=20 > +#include >=20 > +#include "AcpiParser.h" >=20 > +#include "AcpiView.h" >=20 > +#include "AcpiViewConfig.h" >=20 > +#include "PcctParser.h" >=20 > + >=20 > +// Local variables >=20 > +STATIC ACPI_DESCRIPTION_HEADER_INFO AcpiHdrInfo; >=20 > + >=20 > +STATIC UINT8* PccSubspaceLength; >=20 > +STATIC UINT8* PccSubspaceType; >=20 > + >=20 > +/** >=20 > + This function validates the length coded on 4 bytes of a shared memory= range >=20 > + >=20 > + @param [in] Ptr Pointer to the start of the field data. >=20 > + @param [in] Context Pointer to context specific information e.g. this >=20 > + could be a pointer to the ACPI table header. >=20 > +**/ >=20 > +STATIC >=20 > +VOID >=20 > +EFIAPI >=20 > +ValidateRangeLength4 ( >=20 > + IN UINT8* Ptr, >=20 > + IN VOID* Context >=20 > + ) >=20 > +{ >=20 > + if (*(UINT32*)Ptr < MIN_EXT_PCC_SUBSPACE_MEM_RANGE_LEN) { >=20 > + IncrementErrorCount (); >=20 > + Print ( >=20 > + L"\nError: Shared memory range length is too short.\n" >=20 > + L"Length of: %u when it should be over or equal to %u", >=20 > + *(UINT32*)Ptr, >=20 > + MIN_EXT_PCC_SUBSPACE_MEM_RANGE_LEN >=20 > + ); >=20 > + } >=20 > +} >=20 > + >=20 > +/** >=20 > + This function validates the length coded on 8 bytes of a shared memory= range >=20 > + >=20 > + @param [in] Ptr Pointer to the start of the field data. >=20 > + @param [in] Context Pointer to context specific information e.g. this >=20 > + could be a pointer to the ACPI table header. >=20 > +**/ >=20 > +STATIC >=20 > +VOID >=20 > +EFIAPI >=20 > +ValidateRangeLength8 ( >=20 > + IN UINT8* Ptr, >=20 > + IN VOID* Context >=20 > + ) >=20 > +{ >=20 > + if (*(UINT64*)Ptr <=3D MIN_MEMORY_RANGE_LENGTH) { >=20 > + IncrementErrorCount (); >=20 > + Print ( >=20 > + L"\nError: Shared memory range length is too short.\n" >=20 > + L"Length of: %u when it should be over %u", >=20 > + *(UINT64*)Ptr, >=20 > + MIN_MEMORY_RANGE_LENGTH >=20 > + ); >=20 > + } >=20 > +} >=20 > + >=20 > +/** >=20 > + This function validates address space for type 0 structure. >=20 > + >=20 > + @param [in] Ptr Pointer to the start of the field data. >=20 > + @param [in] Context Pointer to context specific information e.g. this >=20 > + could be a pointer to the ACPI table header. >=20 > +**/ >=20 > +STATIC >=20 > +VOID >=20 > +EFIAPI >=20 > +ValidatePccType0Gas ( >=20 > + IN UINT8* Ptr, >=20 > + IN VOID* Context >=20 > + ) >=20 > +{ >=20 > + switch (*(UINT8*)Ptr) { >=20 > +#if !(defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)) >=20 > + case EFI_ACPI_6_3_SYSTEM_IO: >=20 > +#endif //if not (defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)) >=20 > + case EFI_ACPI_6_3_SYSTEM_MEMORY: >=20 > + return; >=20 > + default: >=20 > + IncrementErrorCount (); >=20 > + Print (L"\nError: Invalid address space"); >=20 > + } >=20 > +} >=20 > + >=20 > +/** >=20 > + This function validates address space for structures of types other th= an 0. >=20 > + >=20 > + @param [in] Ptr Pointer to the start of the field data. >=20 > + @param [in] Context Pointer to context specific information e.g. this >=20 > + could be a pointer to the ACPI table header. >=20 > +**/ >=20 > +STATIC >=20 > +VOID >=20 > +EFIAPI >=20 > +ValidatePccGas ( >=20 > + IN UINT8* Ptr, >=20 > + IN VOID* Context >=20 > + ) >=20 > +{ >=20 > + switch (*(UINT8*)Ptr) { >=20 > +#if !(defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)) >=20 > + case EFI_ACPI_6_3_SYSTEM_IO: >=20 > +#endif //if not (defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)) >=20 > + case EFI_ACPI_6_3_FUNCTIONAL_FIXED_HARDWARE: >=20 > + case EFI_ACPI_6_3_SYSTEM_MEMORY: >=20 > + return; >=20 > + default: >=20 > + IncrementErrorCount (); >=20 > + Print (L"\nError: Invalid address space"); >=20 > + } >=20 > +} >=20 > + >=20 > +/** >=20 > + An ACPI_PARSER array describing the ACPI PCCT Table. >=20 > +*/ >=20 > +STATIC CONST ACPI_PARSER PcctParser[] =3D { >=20 > + PARSE_ACPI_HEADER (&AcpiHdrInfo), >=20 > + {L"Flags", 4, 36, NULL, NULL, NULL, NULL, NULL}, >=20 > + {L"Reserved", 8, 40, NULL, NULL, NULL, NULL, NULL} >=20 > +}; >=20 > + >=20 > +/** >=20 > + An ACPI_PARSER array describing the platform communications channel > subspace >=20 > + structure header. >=20 > +*/ >=20 > +STATIC CONST ACPI_PARSER PccSubspaceHeaderParser[] =3D { >=20 > + PCC_SUBSPACE_HEADER () >=20 > + // ... Type Specific Fields ... >=20 > +}; >=20 > + >=20 > +/** >=20 > + An ACPI_PARSER array describing the Generic Communications Subspace - > Type 0 >=20 > +*/ >=20 > +STATIC CONST ACPI_PARSER PccSubspaceType0Parser[] =3D { >=20 > + PCC_SUBSPACE_HEADER (), >=20 > + {L"Reserved", 6, 2, L"0x%x%x%x%x%x%x", Dump6Chars, NULL, NULL, NULL}, >=20 > + {L"Base Address", 8, 8, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Memory Range Length", 8, 16, L"0x%lx", NULL, NULL, > ValidateRangeLength8, NULL}, >=20 > + {L"Doorbell Register", 12, 24, NULL, DumpGas, NULL, ValidatePccType0Ga= s, > NULL}, >=20 > + {L"Doorbell Preserve", 8, 36, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Doorbell Write", 8, 44, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Nominal Latency", 4, 52, L"%u", NULL, NULL, NULL, NULL}, >=20 > + {L"Maximum Periodic Access Rate", 4, 56, L"%u", NULL, NULL, NULL, NULL= }, >=20 > + {L"Minimum Request Turnaround Time", 2, 60, L"%u", NULL, NULL, NULL, > NULL} >=20 > +}; >=20 > + >=20 > +/** >=20 > + An ACPI_PARSER array describing the HW-Reduced Communications Subspace >=20 > + - Type 1 >=20 > +*/ >=20 > +STATIC CONST ACPI_PARSER PccSubspaceType1Parser[] =3D { >=20 > + PCC_SUBSPACE_HEADER (), >=20 > + {L"Platform Interrupt", 4, 2, L"0x%x", NULL, NULL, NULL, NULL}, >=20 > + {L"Platform Interrupt Flags", 1, 6, L"0x%x", NULL, NULL, NULL, NULL}, >=20 > + {L"Reserved", 1, 7, L"0x%x", NULL, NULL, NULL, NULL}, >=20 > + {L"Base Address", 8, 8, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Memory Range Length", 8, 16, L"0x%lx", NULL, NULL, > ValidateRangeLength8, NULL}, >=20 > + {L"Doorbell Register", 12, 24, NULL, DumpGas, NULL, >=20 > + ValidatePccGas, NULL}, >=20 > + {L"Doorbell Preserve", 8, 36, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Doorbell Write", 8, 44, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Nominal Latency", 4, 52, L"%u", NULL, NULL, NULL, NULL}, >=20 > + {L"Maximum Periodic Access Rate", 4, 56, L"%u", NULL, NULL, NULL, NULL= }, >=20 > + {L"Minimum Request Turnaround Time", 2, 60, L"%u", NULL, NULL, NULL, > NULL} >=20 > +}; >=20 > + >=20 > +/** >=20 > + An ACPI_PARSER array describing the HW-Reduced Communications Subspace >=20 > + - Type 2 >=20 > +*/ >=20 > +STATIC CONST ACPI_PARSER PccSubspaceType2Parser[] =3D { >=20 > + PCC_SUBSPACE_HEADER (), >=20 > + {L"Platform Interrupt", 4, 2, L"0x%x", NULL, NULL, NULL, NULL}, >=20 > + {L"Platform Interrupt Flags", 1, 6, L"0x%x", NULL, NULL, NULL, NULL}, >=20 > + {L"Reserved", 1, 7, L"0x%x", NULL, NULL, NULL, NULL}, >=20 > + {L"Base Address", 8, 8, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Memory Range Length", 8, 16, L"0x%lx", NULL, NULL, > ValidateRangeLength8, NULL}, >=20 > + {L"Doorbell Register", 12, 24, NULL, DumpGas, NULL, >=20 > + ValidatePccGas, NULL}, >=20 > + {L"Doorbell Preserve", 8, 36, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Doorbell Write", 8, 44, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Nominal Latency", 4, 52, L"%u", NULL, NULL, NULL, NULL}, >=20 > + {L"Maximum Periodic Access Rate", 4, 56, L"%u", NULL, NULL, NULL, NULL= }, >=20 > + {L"Minimum Request Turnaround Time", 2, 60, L"%u", NULL, NULL, NULL, > NULL}, >=20 > + {L"Platform Interrupt Ack Register", 12, 62, NULL, DumpGas, NULL, >=20 > + ValidatePccGas, NULL}, >=20 > + {L"Platform Interrupt Ack Preserve", 8, 74, L"0x%lx", NULL, NULL, NULL= , NULL}, >=20 > + {L"Platform Interrupt Ack Write", 8, 82, L"0x%lx", NULL, NULL, >=20 > + NULL, NULL}, >=20 > +}; >=20 > + >=20 > +/** >=20 > + An ACPI_PARSER array describing the Extended PCC Subspaces - Type 3/4 >=20 > +*/ >=20 > +STATIC CONST ACPI_PARSER PccSubspaceType3Parser[] =3D { >=20 > + PCC_SUBSPACE_HEADER (), >=20 > + {L"Platform Interrupt", 4, 2, L"0x%x", NULL, NULL, NULL, NULL}, >=20 > + {L"Platform Interrupt Flags", 1, 6, L"0x%x", NULL, NULL, NULL, NULL}, >=20 > + {L"Reserved", 1, 7, L"0x%x", NULL, NULL, NULL, NULL}, >=20 > + {L"Base Address", 8, 8, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Memory Range Length", 4, 16, L"0x%x", NULL, NULL, > ValidateRangeLength4, NULL}, >=20 > + {L"Doorbell Register", 12, 20, NULL, DumpGas, NULL, >=20 > + ValidatePccGas, NULL}, >=20 > + {L"Doorbell Preserve", 8, 32, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Doorbell Write", 8, 40, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Nominal Latency", 4, 48, L"%u", NULL, NULL, NULL, NULL}, >=20 > + {L"Maximum Periodic Access Rate", 4, 52, L"%u", NULL, NULL, NULL, NULL= }, >=20 > + {L"Minimum Request Turnaround Time", 4, 56, L"%u", NULL, NULL, NULL, > NULL}, >=20 > + {L"Platform Interrupt Ack Register", 12, 60, NULL, DumpGas, NULL, >=20 > + ValidatePccGas, NULL}, >=20 > + {L"Platform Interrupt Ack Preserve", 8, 72, L"0x%lx", NULL, NULL, NULL= , NULL}, >=20 > + {L"Platform Interrupt Ack Set", 8, 80, L"0x%lx", NULL, NULL, NULL, NUL= L}, >=20 > + {L"Reserved", 8, 88, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Cmd Complete Check Reg Addr", 12, 96, NULL, DumpGas, NULL, >=20 > + ValidatePccGas, NULL}, >=20 > + {L"Cmd Complete Check Mask", 8, 108, L"0x%lx", NULL, NULL, NULL, NULL}= , >=20 > + {L"Cmd Update Reg Addr", 12, 116, NULL, DumpGas, NULL, >=20 > + ValidatePccGas, NULL}, >=20 > + {L"Cmd Update Preserve mask", 8, 128, L"0x%lx", NULL, NULL, NULL, NULL= }, >=20 > + {L"Cmd Update Set mask", 8, 136, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > + {L"Error Status Register", 12, 144, NULL, DumpGas, NULL, >=20 > + ValidatePccGas, NULL}, >=20 > + {L"Error Status Mask", 8, 156, L"0x%lx", NULL, NULL, NULL, NULL}, >=20 > +}; >=20 > + >=20 > +/** >=20 > + This function parses the PCC Subspace type 0. >=20 > + >=20 > + @param [in] Ptr Pointer to the start of Subspace Structure. >=20 > + @param [in] Length Length of the Subspace Structure. >=20 > +**/ >=20 > +STATIC >=20 > +VOID >=20 > +DumpPccSubspaceType0 ( >=20 > + IN UINT8* Ptr, >=20 > + IN UINT8 Length >=20 > + ) >=20 > +{ >=20 > + ParseAcpi ( >=20 > + TRUE, >=20 > + 2, >=20 > + "Subspace Type 0", >=20 > + Ptr, >=20 > + Length, >=20 > + PARSER_PARAMS (PccSubspaceType0Parser) >=20 > + ); >=20 > +} >=20 > + >=20 > +/** >=20 > + This function parses the PCC Subspace type 1. >=20 > + >=20 > + @param [in] Ptr Pointer to the start of the Subspace Structure. >=20 > + @param [in] Length Length of the Subspace Structure. >=20 > +**/ >=20 > +STATIC >=20 > +VOID >=20 > +DumpPccSubspaceType1 ( >=20 > + IN UINT8* Ptr, >=20 > + IN UINT8 Length >=20 > + ) >=20 > +{ >=20 > + ParseAcpi ( >=20 > + TRUE, >=20 > + 2, >=20 > + "Subspace Type 1", >=20 > + Ptr, >=20 > + Length, >=20 > + PARSER_PARAMS (PccSubspaceType1Parser) >=20 > + ); >=20 > +} >=20 > + >=20 > +/** >=20 > + This function parses the PCC Subspace type 2. >=20 > + >=20 > + @param [in] Ptr Pointer to the start of the Subspace Structure. >=20 > + @param [in] Length Length of the Subspace Structure. >=20 > +**/ >=20 > +STATIC >=20 > +VOID >=20 > +DumpPccSubspaceType2 ( >=20 > + IN UINT8* Ptr, >=20 > + IN UINT8 Length >=20 > + ) >=20 > +{ >=20 > + ParseAcpi ( >=20 > + TRUE, >=20 > + 2, >=20 > + "Subspace Type 2", >=20 > + Ptr, >=20 > + Length, >=20 > + PARSER_PARAMS (PccSubspaceType2Parser) >=20 > + ); >=20 > +} >=20 > + >=20 > +/** >=20 > + This function parses the PCC Subspace type 3. >=20 > + >=20 > + @param [in] Ptr Pointer to the start of the Subspace Structure. >=20 > + @param [in] Length Length of the Subspace Structure. >=20 > +**/ >=20 > +STATIC >=20 > +VOID >=20 > +DumpPccSubspaceType3 ( >=20 > + IN UINT8* Ptr, >=20 > + IN UINT8 Length >=20 > + ) >=20 > +{ >=20 > + ParseAcpi ( >=20 > + TRUE, >=20 > + 2, >=20 > + "Subspace Type 3", >=20 > + Ptr, >=20 > + Length, >=20 > + PARSER_PARAMS (PccSubspaceType3Parser) >=20 > + ); >=20 > +} >=20 > + >=20 > +/** >=20 > + This function parses the PCC Subspace type 4. >=20 > + >=20 > + @param [in] Ptr Pointer to the start of the Subspace Structure. >=20 > + @param [in] Length Length of the Subspace Structure. >=20 > +**/ >=20 > +STATIC >=20 > +VOID >=20 > +DumpPccSubspaceType4 ( >=20 > + IN UINT8* Ptr, >=20 > + IN UINT8 Length >=20 > + ) >=20 > +{ >=20 > + ParseAcpi ( >=20 > + TRUE, >=20 > + 2, >=20 > + "Subspace Type 4", >=20 > + Ptr, >=20 > + Length, >=20 > + PARSER_PARAMS (PccSubspaceType3Parser) >=20 > + ); >=20 > +} >=20 > + >=20 > +/** >=20 > + This function parses the ACPI PCCT table including its sub-structures = of type >=20 > + 0 through 4. >=20 > + When trace is enabled this function parses the PCCT table and >=20 > + traces the ACPI table fields. >=20 > + >=20 > + This function also performs validation of the ACPI table fields. >=20 > + >=20 > + @param [in] Trace If TRUE, trace the ACPI fields. >=20 > + @param [in] Ptr Pointer to the start of the buffer. >=20 > + @param [in] AcpiTableLength Length of the ACPI table. >=20 > + @param [in] AcpiTableRevision Revision of the ACPI table. >=20 > +**/ >=20 > +VOID >=20 > +EFIAPI >=20 > +ParseAcpiPcct ( >=20 > + IN BOOLEAN Trace, >=20 > + IN UINT8* Ptr, >=20 > + IN UINT32 AcpiTableLength, >=20 > + IN UINT8 AcpiTableRevision >=20 > + ) >=20 > +{ >=20 > + UINT32 Offset; >=20 > + UINT8* PccSubspacePtr; >=20 > + UINT32 SubspaceCount; >=20 > + >=20 > + if (!Trace) { >=20 > + return; >=20 > + } >=20 > + >=20 > + Offset =3D ParseAcpi ( >=20 > + TRUE, >=20 > + 0, >=20 > + "PCCT", >=20 > + Ptr, >=20 > + AcpiTableLength, >=20 > + PARSER_PARAMS (PcctParser) >=20 > + ); >=20 > + >=20 > + PccSubspacePtr =3D Ptr + Offset; >=20 > + >=20 > + SubspaceCount =3D 0; >=20 > + while (Offset < AcpiTableLength) { >=20 > + // Parse common structure header to obtain Type and Length. >=20 > + ParseAcpi ( >=20 > + FALSE, >=20 > + 0, >=20 > + NULL, >=20 > + PccSubspacePtr, >=20 > + AcpiTableLength - Offset, >=20 > + PARSER_PARAMS (PccSubspaceHeaderParser) >=20 > + ); >=20 > + >=20 > + // Check if the values used to control the parsing logic have been >=20 > + // successfully read. >=20 > + if ((PccSubspaceType =3D=3D NULL) || >=20 > + (PccSubspaceLength =3D=3D NULL)) { >=20 > + IncrementErrorCount (); >=20 > + Print ( >=20 > + L"ERROR: Insufficient remaining table buffer length to read the = " \ >=20 > + L"structure header. Length =3D %u.\n", >=20 > + AcpiTableLength - Offset >=20 > + ); >=20 > + return; >=20 > + } >=20 > + >=20 > + // Validate Structure length >=20 > + if ((*PccSubspaceLength =3D=3D 0) || >=20 > + ((Offset + (*PccSubspaceLength)) > AcpiTableLength)) { >=20 > + IncrementErrorCount (); >=20 > + Print ( >=20 > + L"ERROR: Invalid Structure length. " \ >=20 > + L"Length =3D %u. Offset =3D %u. AcpiTableLength =3D %u.\n", >=20 > + *PccSubspaceLength, >=20 > + Offset, >=20 > + AcpiTableLength >=20 > + ); >=20 > + return; >=20 > + } >=20 > + >=20 > + switch (*PccSubspaceType) { >=20 > + case EFI_ACPI_6_3_PCCT_SUBSPACE_TYPE_GENERIC: >=20 > + DumpPccSubspaceType0 ( >=20 > + PccSubspacePtr, >=20 > + *PccSubspaceLength >=20 > + ); >=20 > + break; >=20 > + case > EFI_ACPI_6_3_PCCT_SUBSPACE_TYPE_1_HW_REDUCED_COMMUNICATIONS: >=20 > + DumpPccSubspaceType1 ( >=20 > + PccSubspacePtr, >=20 > + *PccSubspaceLength >=20 > + ); >=20 > + break; >=20 > + case > EFI_ACPI_6_3_PCCT_SUBSPACE_TYPE_2_HW_REDUCED_COMMUNICATIONS: >=20 > + DumpPccSubspaceType2 ( >=20 > + PccSubspacePtr, >=20 > + *PccSubspaceLength >=20 > + ); >=20 > + break; >=20 > + case EFI_ACPI_6_3_PCCT_SUBSPACE_TYPE_3_EXTENDED_PCC: >=20 > + DumpPccSubspaceType3 ( >=20 > + PccSubspacePtr, >=20 > + *PccSubspaceLength >=20 > + ); >=20 > + break; >=20 > + case EFI_ACPI_6_3_PCCT_SUBSPACE_TYPE_4_EXTENDED_PCC: >=20 > + DumpPccSubspaceType4 ( >=20 > + PccSubspacePtr, >=20 > + *PccSubspaceLength >=20 > + ); >=20 > + break; >=20 > + default: >=20 > + IncrementErrorCount (); >=20 > + Print ( >=20 > + L"ERROR: Unknown processor topology structure:" >=20 > + L" Type =3D %u, Length =3D %u\n", >=20 > + PccSubspaceType, >=20 > + *PccSubspaceLength >=20 > + ); >=20 > + } >=20 > + >=20 > + PccSubspacePtr +=3D *PccSubspaceLength; >=20 > + Offset +=3D *PccSubspaceLength; >=20 > + SubspaceCount++; >=20 > + } // while >=20 > + if (SubspaceCount > MAX_PCC_SUBSPACES) { >=20 > + IncrementErrorCount (); >=20 > + Print (L"ERROR: Too many subspaces."); >=20 > + } >=20 > +} >=20 > diff --git > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.h > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParser.h >=20 > new file mode 100644 >=20 > index > 0000000000000000000000000000000000000000..5260c22040ba87d3984eade7 > d8a8765ba03917e6 >=20 > --- /dev/null >=20 > +++ b/ShellPkg/Library/UefiShellAcpiViewCommandLib/Parsers/Pcct/PcctParse= r.h >=20 > @@ -0,0 +1,33 @@ >=20 > +/** @file >=20 > + Header file for PCCT parser >=20 > + >=20 > + Copyright (c) 2020, Arm Limited. >=20 > + SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > +**/ >=20 > + >=20 > +#ifndef PCCT_PARSER_H_ >=20 > +#define PCCT_PARSER_H_ >=20 > + >=20 > +/** >=20 > + Minimum value for the 'length' field in subspaces of types 0, 1 and 2. >=20 > +*/ >=20 > +#define MIN_MEMORY_RANGE_LENGTH 8 >=20 > + >=20 > +/** >=20 > + Minimum value for the 'length' field in subspaces of types 3 and 4. >=20 > +*/ >=20 > +#define MIN_EXT_PCC_SUBSPACE_MEM_RANGE_LEN 16 >=20 > + >=20 > +/** >=20 > + Maximum number of PCC subspaces. >=20 > +*/ >=20 > +#define MAX_PCC_SUBSPACES 256 >=20 > + >=20 > +/** >=20 > + Parser for the header of any type of PCC subspace. >=20 > +*/ >=20 > +#define PCC_SUBSPACE_HEADER() = \ >=20 > + {L"Type", 1, 0, L"0x%x", NULL, (VOID**)&PccSubspaceType, NULL, NULL}, = \ >=20 > + {L"Length", 1, 1, L"%u", NULL, (VOID**)&PccSubspaceLength, NULL, NULL} >=20 > + >=20 > +#endif // PCCT_PARSER_H_ >=20 > diff --git > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLi > b.c > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLi > b.c >=20 > index > d2f26ff89f12e596702281c38ab0de3729aa68e4..feb80661cddc420670edb2d8c7a > 570b0a89272d8 100644 >=20 > --- > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLi > b.c >=20 > +++ > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLi > b.c >=20 > @@ -1,7 +1,7 @@ >=20 > /** @file >=20 > Main file for 'acpiview' Shell command function. >=20 >=20 >=20 > - Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.
>=20 > + Copyright (c) 2016 - 2020, Arm Limited. All rights reserved.
>=20 > SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > **/ >=20 >=20 >=20 > @@ -57,6 +57,8 @@ ACPI_TABLE_PARSER ParserList[] =3D { >=20 > {EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, > ParseAcpiMadt}, >=20 >=20 > {EFI_ACPI_6_2_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BA > SE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE, >=20 > ParseAcpiMcfg}, >=20 > + > {EFI_ACPI_6_2_PLATFORM_COMMUNICATIONS_CHANNEL_TABLE_SIGNATURE, >=20 > + ParseAcpiPcct}, >=20 >=20 > {EFI_ACPI_6_2_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGN > ATURE, >=20 > ParseAcpiPptt}, >=20 > {RSDP_TABLE_INFO, ParseAcpiRsdp}, >=20 > diff --git > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLi > b.inf > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLi > b.inf >=20 > index > 91459f9ec632635ee453c5ef46f67445cd9eee0c..efa9c8784a6670e5a4f500e0ae5 > 59a4938852f95 100644 >=20 > --- > a/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLi > b.inf >=20 > +++ > b/ShellPkg/Library/UefiShellAcpiViewCommandLib/UefiShellAcpiViewCommandLi > b.inf >=20 > @@ -1,7 +1,7 @@ >=20 > ## @file >=20 > # Provides Shell 'acpiview' command functions >=20 > # >=20 > -# Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.
>=20 > +# Copyright (c) 2016 - 2020, Arm Limited. All rights reserved.
>=20 > # >=20 > # SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > # >=20 > @@ -37,6 +37,8 @@ >=20 > Parsers/Madt/MadtParser.c >=20 > Parsers/Madt/MadtParser.h >=20 > Parsers/Mcfg/McfgParser.c >=20 > + Parsers/Pcct/PcctParser.c >=20 > + Parsers/Pcct/PcctParser.h >=20 > Parsers/Pptt/PpttParser.c >=20 > Parsers/Pptt/PpttParser.h >=20 > Parsers/Rsdp/RsdpParser.c >=20 > -- >=20 > 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)' >=20 >=20