From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web11.12883.1675339388473014945 for ; Thu, 02 Feb 2023 04:03:08 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: pierre.gondois@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1FDB1C14; Thu, 2 Feb 2023 04:03:50 -0800 (PST) Received: from [10.34.100.128] (pierre123.nice.arm.com [10.34.100.128]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DED373F64C; Thu, 2 Feb 2023 04:03:06 -0800 (PST) Message-ID: Date: Thu, 2 Feb 2023 13:02:41 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Subject: Re: [PATCH] DynamicTablesPkg: Allow multiple top level physical nodes To: Jeff Brasen , devel@edk2.groups.io Cc: Sami.Mujawar@arm.com, Alexei.Fedorov@arm.com, quic_llindhol@quicinc.com, ardb+tianocore@kernel.org References: From: "PierreGondois" In-Reply-To: X-Groupsio-MsgNum: 99471 Content-Type: multipart/mixed; boundary="------------mSUXQWeP8bzfzBHlsM2HARoA" Content-Language: en-US --------------mSUXQWeP8bzfzBHlsM2HARoA Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hello Jeff, I think it's ok to make this the generic case and remove the Pcd to enable it. Cf ACPI 6.5, 5.2.30.1 Processor hierarchy node structure (Type 0): "Multiple trees may be described, covering for example multiple packages. For the root of a tree, the parent pointer should be 0." and "Each valid processor must belong to exactly one package. That is, the leaf must itself be a physical package or have an ancestor marked as a physical package." so this original comment is incorrect: """ // It is assumed that there is one unique CM_ARM_PROC_HIERARCHY_INFO // structure with no ParentToken and the EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL // flag set. All other CM_ARM_PROC_HIERARCHY_INFO are non-physical and // have a ParentToken. """ On 2/1/23 17:42, Jeff Brasen wrote: > In SSDT CPU topology generator allow for multiple top level physical > nodes as would be seen with a multi-socket system. This will be auto > detected if there are more then one physical device and there is a > new PCD to enable forcing of a top level processor container to allow > for consistency for systems that can be either single or multi socket. > > Signed-off-by: Jeff Brasen > --- > DynamicTablesPkg/DynamicTablesPkg.dec | 3 + > .../SsdtCpuTopologyGenerator.c | 66 ++++++++++--------- > .../SsdtCpuTopologyLibArm.inf | 4 ++ > 3 files changed, 41 insertions(+), 32 deletions(-) > > diff --git a/DynamicTablesPkg/DynamicTablesPkg.dec b/DynamicTablesPkg/DynamicTablesPkg.dec > index adc2e67cbf..a061b70322 100644 > --- a/DynamicTablesPkg/DynamicTablesPkg.dec > +++ b/DynamicTablesPkg/DynamicTablesPkg.dec > @@ -63,5 +63,8 @@ > # Use PCI segment numbers as UID > gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdPciUseSegmentAsUid|FALSE|BOOLEAN|0x40000009 > > + # Force top level container for single socket devices > + gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdForceTopLevelProcessorContainer|FALSE|BOOLEAN|0x4000000A > + > [Guids] > gEdkiiDynamicTablesPkgTokenSpaceGuid = { 0xab226e66, 0x31d8, 0x4613, { 0x87, 0x9d, 0xd2, 0xfa, 0xb6, 0x10, 0x26, 0x3c } } > diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCpuTopologyLibArm/SsdtCpuTopologyGenerator.c b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCpuTopologyLibArm/SsdtCpuTopologyGenerator.c > index c24da8ec71..58f86ff508 100644 > --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCpuTopologyLibArm/SsdtCpuTopologyGenerator.c > +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCpuTopologyLibArm/SsdtCpuTopologyGenerator.c > @@ -22,6 +22,7 @@ > #include > #include > #include > +#include > #include > > #include "SsdtCpuTopologyGenerator.h" > @@ -814,7 +815,8 @@ CreateAmlProcessorContainer ( > Protocol Interface. > @param [in] NodeToken Token of the CM_ARM_PROC_HIERARCHY_INFO > currently handled. > - Cannot be CM_NULL_TOKEN. > + CM_NULL_TOKEN if top level container > + should be created. > @param [in] ParentNode Parent node to attach the created > node to. > @param [in,out] ProcContainerIndex Pointer to the current processor container > @@ -841,12 +843,12 @@ CreateAmlCpuTopologyTree ( > AML_OBJECT_NODE_HANDLE ProcContainerNode; > UINT32 Uid; > UINT16 Name; > + UINT32 NodeFlags; > > ASSERT (Generator != NULL); > ASSERT (Generator->ProcNodeList != NULL); > ASSERT (Generator->ProcNodeCount != 0); > ASSERT (CfgMgrProtocol != NULL); > - ASSERT (NodeToken != CM_NULL_TOKEN); > ASSERT (ParentNode != NULL); > ASSERT (ProcContainerIndex != NULL); > > @@ -893,8 +895,14 @@ CreateAmlCpuTopologyTree ( > } else { > // If this is not a Cpu, then this is a processor container. > > + NodeFlags = Generator->ProcNodeList[Index].Flags; > + // Allow physical property for top level nodes > + if (NodeToken == CM_NULL_TOKEN) { > + NodeFlags &= ~EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL; > + } > + Even though it was never encountered so far, it should also be possible to have a physical package consisting of only one CPU. So I guess it would be better to create a function to check the flags, whether the ProcNode is a CPU or a cluster. I attached a Wip patch base on your work where such function is created. Feel free to take it/modify it at your will. > // Acpi processor Id for clusters is not handled. > - if ((Generator->ProcNodeList[Index].Flags & PPTT_PROCESSOR_MASK) != > + if ((NodeFlags & PPTT_PROCESSOR_MASK) != > PPTT_CLUSTER_PROCESSOR_MASK) > { > DEBUG (( > @@ -973,10 +981,10 @@ CreateTopologyFromProcHierarchy ( > IN AML_OBJECT_NODE_HANDLE ScopeNode > ) > { > - EFI_STATUS Status; > - UINT32 Index; > - UINT32 TopLevelProcNodeIndex; > - UINT32 ProcContainerIndex; > + EFI_STATUS Status; > + UINT32 Index; > + CM_OBJECT_TOKEN TopLevelToken; > + UINT32 ProcContainerIndex; > > ASSERT (Generator != NULL); > ASSERT (Generator->ProcNodeCount != 0); > @@ -984,8 +992,8 @@ CreateTopologyFromProcHierarchy ( > ASSERT (CfgMgrProtocol != NULL); > ASSERT (ScopeNode != NULL); > > - TopLevelProcNodeIndex = MAX_UINT32; > - ProcContainerIndex = 0; > + TopLevelToken = CM_NULL_TOKEN; > + ProcContainerIndex = 0; > > Status = TokenTableInitialize (Generator, Generator->ProcNodeCount); > if (EFI_ERROR (Status)) { > @@ -993,33 +1001,27 @@ CreateTopologyFromProcHierarchy ( > return Status; > } > > - // It is assumed that there is one unique CM_ARM_PROC_HIERARCHY_INFO > - // structure with no ParentToken and the EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL > - // flag set. All other CM_ARM_PROC_HIERARCHY_INFO are non-physical and > - // have a ParentToken. > - for (Index = 0; Index < Generator->ProcNodeCount; Index++) { > - if ((Generator->ProcNodeList[Index].ParentToken == CM_NULL_TOKEN) && > - (Generator->ProcNodeList[Index].Flags & > - EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL)) > - { > - if (TopLevelProcNodeIndex != MAX_UINT32) { > - DEBUG (( > - DEBUG_ERROR, > - "ERROR: SSDT-CPU-TOPOLOGY: Top level CM_ARM_PROC_HIERARCHY_INFO " > - "must be unique\n" > - )); > - ASSERT (0); > - goto exit_handler; > - } > + if (!PcdGetBool (PcdForceTopLevelProcessorContainer)) { > + for (Index = 0; Index < Generator->ProcNodeCount; Index++) { > + if ((Generator->ProcNodeList[Index].ParentToken == CM_NULL_TOKEN) && > + (Generator->ProcNodeList[Index].Flags & > + EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL)) > + { > + // Multi-socket detected, using top level containers > + if (TopLevelToken != CM_NULL_TOKEN) { > + TopLevelToken = CM_NULL_TOKEN; > + break; > + } > > - TopLevelProcNodeIndex = Index; > - } > - } // for > + TopLevelToken = Generator->ProcNodeList[Index].Token; > + } > + } // for > + } > > Status = CreateAmlCpuTopologyTree ( > Generator, > CfgMgrProtocol, > - Generator->ProcNodeList[TopLevelProcNodeIndex].Token, > + TopLevelToken, > ScopeNode, > &ProcContainerIndex > ); > @@ -1106,7 +1108,7 @@ CreateTopologyFromGicC ( > break; > } > } > - } // for > + } // for Is it possible to remove this change ? > > return Status; > } > diff --git a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCpuTopologyLibArm/SsdtCpuTopologyLibArm.inf b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCpuTopologyLibArm/SsdtCpuTopologyLibArm.inf > index 3e2d154749..00adfe986f 100644 > --- a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCpuTopologyLibArm/SsdtCpuTopologyLibArm.inf > +++ b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCpuTopologyLibArm/SsdtCpuTopologyLibArm.inf > @@ -31,3 +31,7 @@ > AcpiHelperLib > AmlLib > BaseLib > + PcdLib > + > +[Pcd] > + gEdkiiDynamicTablesPkgTokenSpaceGuid.PcdForceTopLevelProcessorContainer --------------mSUXQWeP8bzfzBHlsM2HARoA Content-Type: text/x-patch; charset=UTF-8; name="0001-WIP-DynamicTablesPkg-SsdtCpuTopology-Allow-multi-pac.patch" Content-Disposition: attachment; filename*0="0001-WIP-DynamicTablesPkg-SsdtCpuTopology-Allow-multi-pac.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA3OGVmNzQ1YTIwZWE5ZmUyMzFjZTVmZjE5ZjFjMjQ4NzExOTg5MDQ1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQaWVycmUgR29uZG9pcyA8cGllcnJlLmdvbmRvaXNAYXJtLmNv bT4KRGF0ZTogVGh1LCAyIEZlYiAyMDIzIDEyOjUzOjIwICswMTAwClN1YmplY3Q6IFtQQVRDSCAx LzFdIFdJUDogRHluYW1pY1RhYmxlc1BrZy9Tc2R0Q3B1VG9wb2xvZ3k6IEFsbG93CiBtdWx0aS1w YWNrYWdlcyB0b3BvbG9naWVzCgpTaWduZWQtb2ZmLWJ5OiBQaWVycmUgR29uZG9pcyA8cGllcnJl LmdvbmRvaXNAYXJtLmNvbT4KLS0tCiBDcnlwdG9Qa2cvTGlicmFyeS9PcGVuc3NsTGliL29wZW5z c2wgICAgICAgICAgfCAgIDIgKy0KIC4uLi9Tc2R0Q3B1VG9wb2xvZ3lHZW5lcmF0b3IuYyAgICAg ICAgICAgICAgICB8IDEyNyArKysrKysrKysrKy0tLS0tLS0KIDIgZmlsZXMgY2hhbmdlZCwgODAg aW5zZXJ0aW9ucygrKSwgNDkgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvQ3J5cHRvUGtnL0xp YnJhcnkvT3BlbnNzbExpYi9vcGVuc3NsIGIvQ3J5cHRvUGtnL0xpYnJhcnkvT3BlbnNzbExpYi9v cGVuc3NsCmluZGV4IDEyOTA1ODE2NWQxOS4uZDgyZTk1OWU2MjFhIDE2MDAwMAotLS0gYS9Dcnlw dG9Qa2cvTGlicmFyeS9PcGVuc3NsTGliL29wZW5zc2wKKysrIGIvQ3J5cHRvUGtnL0xpYnJhcnkv T3BlbnNzbExpYi9vcGVuc3NsCkBAIC0xICsxIEBACi1TdWJwcm9qZWN0IGNvbW1pdCAxMjkwNTgx NjVkMTk1ZTQzYTBhZDEwMTExYjBjMmUyOWJkZjY1OTgwCitTdWJwcm9qZWN0IGNvbW1pdCBkODJl OTU5ZTYyMWEzZDU5N2YxZTBkNTBmZjhjMmQ4Yjk2OTE1ZmQ3CmRpZmYgLS1naXQgYS9EeW5hbWlj VGFibGVzUGtnL0xpYnJhcnkvQWNwaS9Bcm0vQWNwaVNzZHRDcHVUb3BvbG9neUxpYkFybS9Tc2R0 Q3B1VG9wb2xvZ3lHZW5lcmF0b3IuYyBiL0R5bmFtaWNUYWJsZXNQa2cvTGlicmFyeS9BY3BpL0Fy bS9BY3BpU3NkdENwdVRvcG9sb2d5TGliQXJtL1NzZHRDcHVUb3BvbG9neUdlbmVyYXRvci5jCmlu ZGV4IGMyNGRhOGVjNzFhZC4uOGYzZGQxZGVmYWE4IDEwMDY0NAotLS0gYS9EeW5hbWljVGFibGVz UGtnL0xpYnJhcnkvQWNwaS9Bcm0vQWNwaVNzZHRDcHVUb3BvbG9neUxpYkFybS9Tc2R0Q3B1VG9w b2xvZ3lHZW5lcmF0b3IuYworKysgYi9EeW5hbWljVGFibGVzUGtnL0xpYnJhcnkvQWNwaS9Bcm0v QWNwaVNzZHRDcHVUb3BvbG9neUxpYkFybS9Tc2R0Q3B1VG9wb2xvZ3lHZW5lcmF0b3IuYwpAQCAt ODA1LDYgKzgwNSw2NyBAQCBDcmVhdGVBbWxQcm9jZXNzb3JDb250YWluZXIgKAogICByZXR1cm4g U3RhdHVzOw0KIH0NCiANCisvKiogQ2hlY2sgZmxhZ3MgYW5kIHRvcG9sb2d5IG9mIGEgYSBQcm9j Tm9kZS4NCisNCisgIEBwYXJhbSBbaW5dICBOb2RlRmxhZ3MgICAgICAgIEZsYWdzIG9mIHRoZSBQ cm9jTm9kZSB0byBjaGVjay4NCisgIEBwYXJhbSBbaW5dICBJc0NwdSAgICAgICAgICAgIFRoZSBQ cm9jTm9kZSBpcyBhIENQVS4NCisgIEBwYXJhbSBbaW5dICBOb2RlVG9rZW4gICAgICAgIE5vZGVU b2tlbiBvZiB0aGUgUHJvY05vZGUuDQorICBAcGFyYW0gW2luXSAgUGFyZW50Tm9kZVRva2VuICBQ YXJlbnQgTm9kZVRva2VuIG9mIHRoZSBQcm9jTm9kZS4NCisNCisgIEByZXR2YWwgRUZJX1NVQ0NF U1MgICAgICAgICAgICAgU3VjY2Vzcy4NCisgIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVS ICAgSW52YWxpZCBwYXJhbWV0ZXIuDQorKiovDQorU1RBVElDDQorRUZJX1NUQVRVUw0KK0VGSUFQ SQ0KK0NoZWNrUHJvY05vZGUgKA0KKyAgVUlOVDMyICAgICAgICAgICBOb2RlRmxhZ3MsDQorICBC T09MRUFOICAgICAgICAgIElzQ3B1LA0KKyAgQ01fT0JKRUNUX1RPS0VOICBOb2RlVG9rZW4sDQor ICBDTV9PQkpFQ1RfVE9LRU4gIFBhcmVudE5vZGVUb2tlbg0KKyAgKQ0KK3sNCisgIEJPT0xFQU4g IEludmFsaWRGbGFnczsNCisgIEJPT0xFQU4gIEhhc1BoeXNpY2FsUGFja2FnZUJpdDsNCisgIEJP T0xFQU4gIElzVG9wTGV2ZWxOb2RlOw0KKw0KKyAgSGFzUGh5c2ljYWxQYWNrYWdlQml0ID0gKE5v ZGVGbGFncyAmIEVGSV9BQ1BJXzZfM19QUFRUX1BBQ0tBR0VfUEhZU0lDQUwpID09DQorICAgICAg ICAgICAgICAgICAgICAgICAgICBFRklfQUNQSV82XzNfUFBUVF9QQUNLQUdFX1BIWVNJQ0FMOw0K KyAgSXNUb3BMZXZlbE5vZGUgPSAoUGFyZW50Tm9kZVRva2VuID09IENNX05VTExfVE9LRU4pOw0K Kw0KKyAgLy8gQSB0b3AgbGV2ZWwgbm9kZSBtdXN0IGhhdmUgdGhlIFBoeXNpY2FsIFBhY2thZ2Ug Yml0IHNldC4NCisgIC8vIENsZWFyIGl0IG9uY2UgY2hlY2tlZC4NCisgIEludmFsaWRGbGFncyA9 IEhhc1BoeXNpY2FsUGFja2FnZUJpdCBeIElzVG9wTGV2ZWxOb2RlOw0KKyAgTm9kZUZsYWdzICAg Jj0gfkVGSV9BQ1BJXzZfM19QUFRUX1BBQ0tBR0VfUEhZU0lDQUw7DQorDQorICAvLyBEb24ndCBz dXBwb3J0IHRvcG9sb2dpZXMgd2l0aCBtb3JlIHRoYW4gMyBsZXZlbHMgZm9yIG5vdywNCisgIC8v IGkuZS4gZGVlcGVyIHRoYW4gUGh5c2ljYWxQYWNrYWdlIC0+IENsdXN0ZXIgLT4gQ1BVDQorICBJ bnZhbGlkRmxhZ3MgfD0gIUlzVG9wTGV2ZWxOb2RlICYmICFJc0NwdSAmJg0KKyAgICAgICAgICAg ICAgICAgIChOb2RlVG9rZW4gPT0gQ01fTlVMTF9UT0tFTik7DQorDQorICAvLyBOb3cgY2hlY2sg Q1BVL0NsdXN0ZXIgc3BlY2lmaWMgZmxhZ3MuDQorICBpZiAoSXNDcHUpIHsNCisgICAgSW52YWxp ZEZsYWdzIHw9ICgoTm9kZUZsYWdzICYgUFBUVF9QUk9DRVNTT1JfTUFTSykgIT0NCisgICAgICAg ICAgICAgICAgICAgICBQUFRUX0NQVV9QUk9DRVNTT1JfTUFTSyk7DQorICB9IGVsc2Ugew0KKyAg ICBJbnZhbGlkRmxhZ3MgfD0gKChOb2RlRmxhZ3MgJiBQUFRUX1BST0NFU1NPUl9NQVNLKSAhPQ0K KyAgICAgICAgICAgICAgICAgICAgIFBQVFRfQ0xVU1RFUl9QUk9DRVNTT1JfTUFTSyk7DQorICB9 DQorDQorICAvLyBBc3N1bWUgdGhlIHRvcCBsZXZlbCBub2RlIGlzIGEgcGh5c2ljYWwgcGFja2Fn ZS4NCisgIGlmIChJbnZhbGlkRmxhZ3MpIHsNCisgICAgREVCVUcgKCgNCisgICAgICBERUJVR19F UlJPUiwNCisgICAgICAiRVJST1I6IFNTRFQtQ1BVLVRPUE9MT0dZOiBJbnZhbGlkIGZsYWdzIGZv ciBQcm9jTm9kZTogMHglcC5cbiIsDQorICAgICAgKFZPSUQgKilOb2RlVG9rZW4NCisgICAgICAp KTsNCisgICAgQVNTRVJUICgwKTsNCisgICAgcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsN CisgIH0NCisNCisgIHJldHVybiBFRklfU1VDQ0VTUzsNCit9DQorDQogLyoqIENyZWF0ZSBhbiBB TUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIENwdSB0b3BvbG9neS4NCiANCiAgIEEgcHJvY2Vzc29y IGNvbnRhaW5lciBpcyBieSBleHRlbnNpb24gYW55IG5vbi1sZWF2ZSBkZXZpY2UgaW4gdGhlIGNw dSB0b3BvbG9neS4NCkBAIC04NDYsNyArOTA3LDYgQEAgQ3JlYXRlQW1sQ3B1VG9wb2xvZ3lUcmVl ICgKICAgQVNTRVJUIChHZW5lcmF0b3ItPlByb2NOb2RlTGlzdCAhPSBOVUxMKTsNCiAgIEFTU0VS VCAoR2VuZXJhdG9yLT5Qcm9jTm9kZUNvdW50ICE9IDApOw0KICAgQVNTRVJUIChDZmdNZ3JQcm90 b2NvbCAhPSBOVUxMKTsNCi0gIEFTU0VSVCAoTm9kZVRva2VuICE9IENNX05VTExfVE9LRU4pOw0K ICAgQVNTRVJUIChQYXJlbnROb2RlICE9IE5VTEwpOw0KICAgQVNTRVJUIChQcm9jQ29udGFpbmVy SW5kZXggIT0gTlVMTCk7DQogDQpAQCAtODU5LDE2ICs5MTksMTUgQEAgQ3JlYXRlQW1sQ3B1VG9w b2xvZ3lUcmVlICgKICAgICAgIC8vIE9ubHkgQ3B1cyAobGVhZiBub2RlcyBpbiB0aGlzIHRyZWUp IGhhdmUgYSBHaWNDVG9rZW4uDQogICAgICAgLy8gQ3JlYXRlIGEgQ3B1IG5vZGUuDQogICAgICAg aWYgKEdlbmVyYXRvci0+UHJvY05vZGVMaXN0W0luZGV4XS5HaWNDVG9rZW4gIT0gQ01fTlVMTF9U T0tFTikgew0KLSAgICAgICAgaWYgKChHZW5lcmF0b3ItPlByb2NOb2RlTGlzdFtJbmRleF0uRmxh Z3MgJiBQUFRUX1BST0NFU1NPUl9NQVNLKSAhPQ0KLSAgICAgICAgICAgIFBQVFRfQ1BVX1BST0NF U1NPUl9NQVNLKQ0KLSAgICAgICAgew0KLSAgICAgICAgICBERUJVRyAoKA0KLSAgICAgICAgICAg IERFQlVHX0VSUk9SLA0KLSAgICAgICAgICAgICJFUlJPUjogU1NEVC1DUFUtVE9QT0xPR1k6IElu dmFsaWQgZmxhZ3MgZm9yIGNwdTogMHgleC5cbiIsDQotICAgICAgICAgICAgR2VuZXJhdG9yLT5Q cm9jTm9kZUxpc3RbSW5kZXhdLkZsYWdzDQotICAgICAgICAgICAgKSk7DQorICAgICAgICBTdGF0 dXMgPSBDaGVja1Byb2NOb2RlICgNCisgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yLT5Qcm9j Tm9kZUxpc3RbSW5kZXhdLkZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICBUUlVFLA0KKyAgICAg ICAgICAgICAgICAgICBHZW5lcmF0b3ItPlByb2NOb2RlTGlzdFtJbmRleF0uVG9rZW4sDQorICAg ICAgICAgICAgICAgICAgIE5vZGVUb2tlbg0KKyAgICAgICAgICAgICAgICAgICApOw0KKyAgICAg ICAgaWYgKEVGSV9FUlJPUiAoU3RhdHVzKSkgew0KICAgICAgICAgICBBU1NFUlQgKDApOw0KLSAg ICAgICAgICByZXR1cm4gRUZJX0lOVkFMSURfUEFSQU1FVEVSOw0KKyAgICAgICAgICByZXR1cm4g U3RhdHVzOw0KICAgICAgICAgfQ0KIA0KICAgICAgICAgaWYgKEdlbmVyYXRvci0+UHJvY05vZGVM aXN0W0luZGV4XS5PdmVycmlkZU5hbWVVaWRFbmFibGVkKSB7DQpAQCAtODkzLDE3ICs5NTIsMTUg QEAgQ3JlYXRlQW1sQ3B1VG9wb2xvZ3lUcmVlICgKICAgICAgIH0gZWxzZSB7DQogICAgICAgICAv LyBJZiB0aGlzIGlzIG5vdCBhIENwdSwgdGhlbiB0aGlzIGlzIGEgcHJvY2Vzc29yIGNvbnRhaW5l ci4NCiANCi0gICAgICAgIC8vIEFjcGkgcHJvY2Vzc29yIElkIGZvciBjbHVzdGVycyBpcyBub3Qg aGFuZGxlZC4NCi0gICAgICAgIGlmICgoR2VuZXJhdG9yLT5Qcm9jTm9kZUxpc3RbSW5kZXhdLkZs YWdzICYgUFBUVF9QUk9DRVNTT1JfTUFTSykgIT0NCi0gICAgICAgICAgICBQUFRUX0NMVVNURVJf UFJPQ0VTU09SX01BU0spDQotICAgICAgICB7DQotICAgICAgICAgIERFQlVHICgoDQotICAgICAg ICAgICAgREVCVUdfRVJST1IsDQotICAgICAgICAgICAgIkVSUk9SOiBTU0RULUNQVS1UT1BPTE9H WTogSW52YWxpZCBmbGFncyBmb3IgY2x1c3RlcjogMHgleC5cbiIsDQotICAgICAgICAgICAgR2Vu ZXJhdG9yLT5Qcm9jTm9kZUxpc3RbSW5kZXhdLkZsYWdzDQotICAgICAgICAgICAgKSk7DQorICAg ICAgICBTdGF0dXMgPSBDaGVja1Byb2NOb2RlICgNCisgICAgICAgICAgICAgICAgICAgR2VuZXJh dG9yLT5Qcm9jTm9kZUxpc3RbSW5kZXhdLkZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICBGQUxT RSwNCisgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yLT5Qcm9jTm9kZUxpc3RbSW5kZXhdLlRv a2VuLA0KKyAgICAgICAgICAgICAgICAgICBOb2RlVG9rZW4NCisgICAgICAgICAgICAgICAgICAg KTsNCisgICAgICAgIGlmIChFRklfRVJST1IgKFN0YXR1cykpIHsNCiAgICAgICAgICAgQVNTRVJU ICgwKTsNCi0gICAgICAgICAgcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsNCisgICAgICAg ICAgcmV0dXJuIFN0YXR1czsNCiAgICAgICAgIH0NCiANCiAgICAgICAgIGlmIChHZW5lcmF0b3It PlByb2NOb2RlTGlzdFtJbmRleF0uT3ZlcnJpZGVOYW1lVWlkRW5hYmxlZCkgew0KQEAgLTk3NCw4 ICsxMDMxLDYgQEAgQ3JlYXRlVG9wb2xvZ3lGcm9tUHJvY0hpZXJhcmNoeSAoCiAgICkNCiB7DQog ICBFRklfU1RBVFVTICBTdGF0dXM7DQotICBVSU5UMzIgICAgICBJbmRleDsNCi0gIFVJTlQzMiAg ICAgIFRvcExldmVsUHJvY05vZGVJbmRleDsNCiAgIFVJTlQzMiAgICAgIFByb2NDb250YWluZXJJ bmRleDsNCiANCiAgIEFTU0VSVCAoR2VuZXJhdG9yICE9IE5VTEwpOw0KQEAgLTk4NCw4ICsxMDM5 LDcgQEAgQ3JlYXRlVG9wb2xvZ3lGcm9tUHJvY0hpZXJhcmNoeSAoCiAgIEFTU0VSVCAoQ2ZnTWdy UHJvdG9jb2wgIT0gTlVMTCk7DQogICBBU1NFUlQgKFNjb3BlTm9kZSAhPSBOVUxMKTsNCiANCi0g IFRvcExldmVsUHJvY05vZGVJbmRleCA9IE1BWF9VSU5UMzI7DQotICBQcm9jQ29udGFpbmVySW5k ZXggICAgPSAwOw0KKyAgUHJvY0NvbnRhaW5lckluZGV4ID0gMDsNCiANCiAgIFN0YXR1cyA9IFRv a2VuVGFibGVJbml0aWFsaXplIChHZW5lcmF0b3IsIEdlbmVyYXRvci0+UHJvY05vZGVDb3VudCk7 DQogICBpZiAoRUZJX0VSUk9SIChTdGF0dXMpKSB7DQpAQCAtOTkzLDMzICsxMDQ3LDEwIEBAIENy ZWF0ZVRvcG9sb2d5RnJvbVByb2NIaWVyYXJjaHkgKAogICAgIHJldHVybiBTdGF0dXM7DQogICB9 DQogDQotICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlcmUgaXMgb25lIHVuaXF1ZSBDTV9BUk1f UFJPQ19ISUVSQVJDSFlfSU5GTw0KLSAgLy8gc3RydWN0dXJlIHdpdGggbm8gUGFyZW50VG9rZW4g YW5kIHRoZSBFRklfQUNQSV82XzNfUFBUVF9QQUNLQUdFX1BIWVNJQ0FMDQotICAvLyBmbGFnIHNl dC4gQWxsIG90aGVyIENNX0FSTV9QUk9DX0hJRVJBUkNIWV9JTkZPIGFyZSBub24tcGh5c2ljYWwg YW5kDQotICAvLyBoYXZlIGEgUGFyZW50VG9rZW4uDQotICBmb3IgKEluZGV4ID0gMDsgSW5kZXgg PCBHZW5lcmF0b3ItPlByb2NOb2RlQ291bnQ7IEluZGV4KyspIHsNCi0gICAgaWYgKChHZW5lcmF0 b3ItPlByb2NOb2RlTGlzdFtJbmRleF0uUGFyZW50VG9rZW4gPT0gQ01fTlVMTF9UT0tFTikgJiYN Ci0gICAgICAgIChHZW5lcmF0b3ItPlByb2NOb2RlTGlzdFtJbmRleF0uRmxhZ3MgJg0KLSAgICAg ICAgIEVGSV9BQ1BJXzZfM19QUFRUX1BBQ0tBR0VfUEhZU0lDQUwpKQ0KLSAgICB7DQotICAgICAg aWYgKFRvcExldmVsUHJvY05vZGVJbmRleCAhPSBNQVhfVUlOVDMyKSB7DQotICAgICAgICBERUJV RyAoKA0KLSAgICAgICAgICBERUJVR19FUlJPUiwNCi0gICAgICAgICAgIkVSUk9SOiBTU0RULUNQ VS1UT1BPTE9HWTogVG9wIGxldmVsIENNX0FSTV9QUk9DX0hJRVJBUkNIWV9JTkZPICINCi0gICAg ICAgICAgIm11c3QgYmUgdW5pcXVlXG4iDQotICAgICAgICAgICkpOw0KLSAgICAgICAgQVNTRVJU ICgwKTsNCi0gICAgICAgIGdvdG8gZXhpdF9oYW5kbGVyOw0KLSAgICAgIH0NCi0NCi0gICAgICBU b3BMZXZlbFByb2NOb2RlSW5kZXggPSBJbmRleDsNCi0gICAgfQ0KLSAgfSAvLyBmb3INCi0NCiAg IFN0YXR1cyA9IENyZWF0ZUFtbENwdVRvcG9sb2d5VHJlZSAoDQogICAgICAgICAgICAgIEdlbmVy YXRvciwNCiAgICAgICAgICAgICAgQ2ZnTWdyUHJvdG9jb2wsDQotICAgICAgICAgICAgIEdlbmVy YXRvci0+UHJvY05vZGVMaXN0W1RvcExldmVsUHJvY05vZGVJbmRleF0uVG9rZW4sDQorICAgICAg ICAgICAgIENNX05VTExfVE9LRU4sDQogICAgICAgICAgICAgIFNjb3BlTm9kZSwNCiAgICAgICAg ICAgICAgJlByb2NDb250YWluZXJJbmRleA0KICAgICAgICAgICAgICApOw0KLS0gCjIuMjUuMQoK --------------mSUXQWeP8bzfzBHlsM2HARoA--