From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A2A0A30F94D; Mon, 20 Jul 2026 15:29:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784561343; cv=none; b=kVlD1k6cZ+tsXBm4X8XU6AOgvStH1dIfJlSO2rQPfnwo6BJrMOPE9BkPawyCviZmOvJCjA+ym19uwgHsx/UT2NXqCTw2fnAwhw8Age7r6my7e7CHmbYRqpwhxHv9GCtXiEdACi7aDl97APkMoRwWJEr3NxXyCJcrrQvgHbRxZe4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784561343; c=relaxed/simple; bh=7O0vC6/yqYA0BI4cZmKbu1kjJIMuCL0aau+hjeo2LCA=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=WY1CoxxkmqockXnwPSsIh6hSiScm+q6Sbnt310WKunJSgwyGBCBxSvApSNoIkyGQ+w6llEdaieAerFWd/+ICM2YA6Am1Xu7gb9Xh01NtzWdelebCevuPJtRECHRXAFA+HbfSTi+Y/l+s78OmRg4UqxmTIg9qk9IbvXud9zm21Os= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cWqsMtpy; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cWqsMtpy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B1D8B1F00A3D; Mon, 20 Jul 2026 15:29:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1784561341; bh=dWPGGLsF2G/6ezyrvFhnGo/wg7YMOtfz7V0dnxZgbtA=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=cWqsMtpydBlML83AsA+ikPeWf7b22QD++F4XPMvZRe2Qz4eOHwMQ2u9LXL1sjC39k qKFGMcAjldB5Pdr328XAPBDnL9qol6ffXYSNuRVEzXwlI7KKHDOKEVnM796DoCOOxt NpOk7+CprQRS84R16g1BoHeVGlYHk4yrEm4vzSOPH3ZCBjBC0ony/x6r7qRs/Yeiyn u1PwgDbgp8jPKW+jZUDVo8/iXuj81udUAxK6IghMOiENM3vLEuJV0H5P7ajF2966TV +cB8ayydU1sV4XCoQex3ZqGjC/wqdcNDIbix5TronbPlXTdsN/QSGJc9Mv71K5kiIY EBOM5tJhZ9aKA== From: sashiko-bot@kernel.org Subject: Re: [PATCH v3 10/16] PCI: dwc: qcom-ep: Use cached PCIe capability offset Reply-To: sashiko-reviews@lists.linux.dev To: "Hans Zhang" <18255117159@163.com> Cc: linux-pci@vger.kernel.org, linux-amlogic@lists.infradead.org, Frank.Li@kernel.org, imx@lists.linux.dev, neil.armstrong@linaro.org In-Reply-To: <20260720150619.24733-11-18255117159@163.com> References: <20260720150619.24733-1-18255117159@163.com> <20260720150619.24733-11-18255117159@163.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Mon, 20 Jul 2026 15:29:00 +0000 Message-Id: <20260720152900.B1D8B1F00A3D@smtp.kernel.org> Precedence: bulk X-Mailing-List: imx@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: Thank you for your contribution! Sashiko AI review found 3 potential issue(= s) to consider: New issues: - [High] `pci->pcie_cap` is used uninitialized (as 0) in `qcom_pcie_ep_icc_= update()` if the global IRQ triggers before `perst_irq` completes. Pre-existing issues: - [High] Lost interrupt events due to mutually exclusive `if-else if` chain= dropping concurrently pending status bits. - [High] Concurrent execution of global IRQ and PERST IRQ leads to unclocke= d MMIO accesses and system crash. -- --- Patch [10]: [PATCH v3 10/16] PCI: dwc: qcom-ep: Use cached PCIe capabil= ity offset --- commit 66f17f8dee9121b185f046f6247725965823798a Author: Hans Zhang <18255117159@163.com> PCI: dwc: qcom-ep: Use cached PCIe capability offset =20 dw_pcie_ep_init() no longer caches the offset automatically. For qcom-ep, hardware (clocks, PHY) is enabled only after PERST# deassert. Therefore, we must call dw_pcie_get_pcie_cap() in qcom_pcie_perst_deassert() after the resources are enabled, before any DBI access. This ensures the cached offset is valid for subsequent uses in interrupt handlers and ICC updates. > diff --git a/drivers/pci/controller/dwc/pcie-qcom-ep.c b/drivers/pci/cont= roller/dwc/pcie-qcom-ep.c > index 56184e6ca6e69..16b0891f95713 100644 > --- a/drivers/pci/controller/dwc/pcie-qcom-ep.c > +++ b/drivers/pci/controller/dwc/pcie-qcom-ep.c > @@ -307,15 +307,13 @@ static void qcom_pcie_ep_icc_update(struct qcom_pci= e_ep *pcie_ep) > { > struct dw_pcie *pci =3D &pcie_ep->pci; > - u32 offset, status; > - int speed, width; > - int ret; > + int speed, width, ret; > + u32 status; > =20 > if (!pcie_ep->icc_mem) > return; > =20 > - offset =3D dw_pcie_find_capability(pci, PCI_CAP_ID_EXP); > - status =3D readw(pci->dbi_base + offset + PCI_EXP_LNKSTA); > + status =3D readw(pci->dbi_base + pci->pcie_cap + PCI_EXP_LNKSTA); [Severity: High] Does this read from an uninitialized offset if the global IRQ triggers before the PERST IRQ completes? qcom_pcie_ep_enable_irq_resources() requests the global IRQ without IRQ_NOAUTOEN, making it active immediately. If the PCIe link is already established (e.g., by the bootloader or firmware), the IRQ can trigger before pci_epc_start() enables the PERST IRQ and qcom_pcie_perst_deassert() caches the offset. If this happens, pci->pcie_cap would be 0, causing the function to read from DBI offset 0x12 instead of PCI_EXP_LNKSTA. This would compute arbitrary speed and width values to pass to icc_set_bw(), which could misconfigure the system interconnect bandwidth. > =20 > speed =3D FIELD_GET(PCI_EXP_LNKSTA_CLS, status); > width =3D FIELD_GET(PCI_EXP_LNKSTA_NLW, status); [ ... ] > @@ -491,14 +489,15 @@ static int qcom_pcie_perst_deassert(struct dw_pcie = *pci) > =20 > dw_pcie_dbi_ro_wr_en(pci); > =20 > + dw_pcie_get_pcie_cap(pci); > + > /* Set the L0s Exit Latency to 2us-4us =3D 0x6 */ > - offset =3D dw_pcie_find_capability(pci, PCI_CAP_ID_EXP); > + offset =3D pci->pcie_cap; > val =3D dw_pcie_readl_dbi(pci, offset + PCI_EXP_LNKCAP); [ ... ] drivers/pci/controller/dwc/pcie-qcom-ep.c:qcom_pcie_ep_global_irq_thread() { ... writel_relaxed(status, pcie_ep->parf + PARF_INT_ALL_CLEAR); if (FIELD_GET(PARF_INT_ALL_LINK_DOWN, status)) { ... } else if (FIELD_GET(PARF_INT_ALL_BME, status)) { ... } [Severity: High] This is a pre-existing issue, but does this if-else chain lose concurrent interrupt events? qcom_pcie_ep_global_irq_thread() clears all pending events simultaneously in hardware. If the host sends multiple events in close succession (e.g., both Bus Master Enable and Link Up are set in PARF_INT_ALL_STATUS), the else-if logic will process the first matching event and discard the others. Since the discarded events are already cleared from the register, they would be permanently lost, potentially leaving the endpoint in an incorrect logic= al state. drivers/pci/controller/dwc/pcie-qcom-ep.c:qcom_pcie_ep_global_irq_thread() { ... u32 status =3D readl_relaxed(pcie_ep->parf + PARF_INT_ALL_STATUS); ... } drivers/pci/controller/dwc/pcie-qcom-ep.c:qcom_pcie_disable_resources() { ... clk_bulk_disable_unprepare(pcie_ep->num_clks, pcie_ep->clks); ... } [Severity: High] This is a pre-existing issue, but can the global IRQ thread race with PERST deassertion/assertion and cause an unclocked MMIO access? Both the global and PERST IRQs are requested as threaded IRQs without mutual exclusion. If the host toggles PERST, qcom_pcie_ep_perst_irq_thread() calls qcom_pcie_perst_assert(), which unconditionally disables the PCIe clocks via clk_bulk_disable_unprepare(). If a simultaneous link state change triggers qcom_pcie_ep_global_irq_thread= () and it reads from PARF_INT_ALL_STATUS after the clocks are disabled, this would cause a synchronous external abort (SError) and crash the system. --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260720150619.2473= 3-1-18255117159@163.com?part=3D10 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1450AC44520 for ; Mon, 20 Jul 2026 15:29:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Reply-To:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date: References:In-Reply-To:Cc:To:Subject:From:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=5gRyDgC/YYNw32DUAepq1kCVJu+j17QMI55yB55QRLI=; b=4H1GdNMywzK23r +/ZAA17ym4mNcLDh921LP2bSKlUuKV7kZHVY46IjKmoa4L+lYws367Og7qFxVeQ4BQmx7NSzxr/Pi LyykkTx6NJ7VIwaXh17kcFA3K5SvGJGYBJ8w4LzSy8kDqTSQqfK5I/PPSaldJIfJ8xJ2HAs7bctnc 2lEYSDzxvu5yixrGh1imZDUUDonu9vXuwZd+CrYyY+uBYBRaO8cl2C7Y8tXMTL0OkQ4+/1EjNgRLE sKQdy2NtvWdCazfWPNtxT1MHV8faIV21Cx/GOjrDvEgDp3hCfLwrHniVF5bwi3/hShMebPwG4ySeS w0p68bTk9sxuvuo2vXVw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wlpvT-00000007C8Y-1Xym; Mon, 20 Jul 2026 15:29:03 +0000 Received: from tor.source.kernel.org ([2600:3c04:e001:324:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wlpvR-00000007C7l-3YZ3 for linux-amlogic@lists.infradead.org; Mon, 20 Jul 2026 15:29:01 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id 4969E60A5C; Mon, 20 Jul 2026 15:29:01 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B1D8B1F00A3D; Mon, 20 Jul 2026 15:29:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1784561341; bh=dWPGGLsF2G/6ezyrvFhnGo/wg7YMOtfz7V0dnxZgbtA=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=cWqsMtpydBlML83AsA+ikPeWf7b22QD++F4XPMvZRe2Qz4eOHwMQ2u9LXL1sjC39k qKFGMcAjldB5Pdr328XAPBDnL9qol6ffXYSNuRVEzXwlI7KKHDOKEVnM796DoCOOxt NpOk7+CprQRS84R16g1BoHeVGlYHk4yrEm4vzSOPH3ZCBjBC0ony/x6r7qRs/Yeiyn u1PwgDbgp8jPKW+jZUDVo8/iXuj81udUAxK6IghMOiENM3vLEuJV0H5P7ajF2966TV +cB8ayydU1sV4XCoQex3ZqGjC/wqdcNDIbix5TronbPlXTdsN/QSGJc9Mv71K5kiIY EBOM5tJhZ9aKA== From: sashiko-bot@kernel.org Subject: Re: [PATCH v3 10/16] PCI: dwc: qcom-ep: Use cached PCIe capability offset To: "Hans Zhang" <18255117159@163.com> Cc: linux-pci@vger.kernel.org, linux-amlogic@lists.infradead.org, Frank.Li@kernel.org, imx@lists.linux.dev, neil.armstrong@linaro.org In-Reply-To: <20260720150619.24733-11-18255117159@163.com> References: <20260720150619.24733-1-18255117159@163.com> <20260720150619.24733-11-18255117159@163.com> Date: Mon, 20 Jul 2026 15:29:00 +0000 Message-Id: <20260720152900.B1D8B1F00A3D@smtp.kernel.org> X-BeenThere: linux-amlogic@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-amlogic" Errors-To: linux-amlogic-bounces+linux-amlogic=archiver.kernel.org@lists.infradead.org VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg MyBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6CgpOZXcgaXNzdWVzOgotIFtIaWdoXSBg cGNpLT5wY2llX2NhcGAgaXMgdXNlZCB1bmluaXRpYWxpemVkIChhcyAwKSBpbiBgcWNvbV9wY2ll X2VwX2ljY191cGRhdGUoKWAgaWYgdGhlIGdsb2JhbCBJUlEgdHJpZ2dlcnMgYmVmb3JlIGBwZXJz dF9pcnFgIGNvbXBsZXRlcy4KClByZS1leGlzdGluZyBpc3N1ZXM6Ci0gW0hpZ2hdIExvc3QgaW50 ZXJydXB0IGV2ZW50cyBkdWUgdG8gbXV0dWFsbHkgZXhjbHVzaXZlIGBpZi1lbHNlIGlmYCBjaGFp biBkcm9wcGluZyBjb25jdXJyZW50bHkgcGVuZGluZyBzdGF0dXMgYml0cy4KLSBbSGlnaF0gQ29u Y3VycmVudCBleGVjdXRpb24gb2YgZ2xvYmFsIElSUSBhbmQgUEVSU1QgSVJRIGxlYWRzIHRvIHVu Y2xvY2tlZCBNTUlPIGFjY2Vzc2VzIGFuZCBzeXN0ZW0gY3Jhc2guCi0tCgotLS0gUGF0Y2ggWzEw XTogW1BBVENIIHYzIDEwLzE2XSBQQ0k6IGR3YzogcWNvbS1lcDogVXNlIGNhY2hlZCBQQ0llIGNh cGFiaWxpdHkgb2Zmc2V0IC0tLQpjb21taXQgNjZmMTdmOGRlZTkxMjFiMTg1ZjA0NmY2MjQ3NzI1 OTY1ODIzNzk4YQpBdXRob3I6IEhhbnMgWmhhbmcgPDE4MjU1MTE3MTU5QDE2My5jb20+CgpQQ0k6 IGR3YzogcWNvbS1lcDogVXNlIGNhY2hlZCBQQ0llIGNhcGFiaWxpdHkgb2Zmc2V0CiAgICAKZHdf cGNpZV9lcF9pbml0KCkgbm8gbG9uZ2VyIGNhY2hlcyB0aGUgb2Zmc2V0IGF1dG9tYXRpY2FsbHku IEZvciBxY29tLWVwLApoYXJkd2FyZSAoY2xvY2tzLCBQSFkpIGlzIGVuYWJsZWQgb25seSBhZnRl ciBQRVJTVCMgZGVhc3NlcnQuIFRoZXJlZm9yZSwKd2UgbXVzdCBjYWxsIGR3X3BjaWVfZ2V0X3Bj aWVfY2FwKCkgaW4gcWNvbV9wY2llX3BlcnN0X2RlYXNzZXJ0KCkgYWZ0ZXIKdGhlIHJlc291cmNl cyBhcmUgZW5hYmxlZCwgYmVmb3JlIGFueSBEQkkgYWNjZXNzLiBUaGlzIGVuc3VyZXMgdGhlIGNh Y2hlZApvZmZzZXQgaXMgdmFsaWQgZm9yIHN1YnNlcXVlbnQgdXNlcyBpbiBpbnRlcnJ1cHQgaGFu ZGxlcnMgYW5kIElDQyB1cGRhdGVzLgoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvY29udHJv bGxlci9kd2MvcGNpZS1xY29tLWVwLmMgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9wY2ll LXFjb20tZXAuYwo+IGluZGV4IDU2MTg0ZTZjYTZlNjkuLjE2YjA4OTFmOTU3MTMgMTAwNjQ0Cj4g LS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNpZS1xY29tLWVwLmMKPiArKysgYi9k cml2ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9wY2llLXFjb20tZXAuYwo+IEBAIC0zMDcsMTUgKzMw NywxMyBAQCBzdGF0aWMgdm9pZCBxY29tX3BjaWVfZXBfaWNjX3VwZGF0ZShzdHJ1Y3QgcWNvbV9w Y2llX2VwICpwY2llX2VwKQo+ICB7Cj4gIAlzdHJ1Y3QgZHdfcGNpZSAqcGNpID0gJnBjaWVfZXAt PnBjaTsKPiAtCXUzMiBvZmZzZXQsIHN0YXR1czsKPiAtCWludCBzcGVlZCwgd2lkdGg7Cj4gLQlp bnQgcmV0Owo+ICsJaW50IHNwZWVkLCB3aWR0aCwgcmV0Owo+ICsJdTMyIHN0YXR1czsKPiAgCj4g IAlpZiAoIXBjaWVfZXAtPmljY19tZW0pCj4gIAkJcmV0dXJuOwo+ICAKPiAtCW9mZnNldCA9IGR3 X3BjaWVfZmluZF9jYXBhYmlsaXR5KHBjaSwgUENJX0NBUF9JRF9FWFApOwo+IC0Jc3RhdHVzID0g cmVhZHcocGNpLT5kYmlfYmFzZSArIG9mZnNldCArIFBDSV9FWFBfTE5LU1RBKTsKPiArCXN0YXR1 cyA9IHJlYWR3KHBjaS0+ZGJpX2Jhc2UgKyBwY2ktPnBjaWVfY2FwICsgUENJX0VYUF9MTktTVEEp OwoKW1NldmVyaXR5OiBIaWdoXQpEb2VzIHRoaXMgcmVhZCBmcm9tIGFuIHVuaW5pdGlhbGl6ZWQg b2Zmc2V0IGlmIHRoZSBnbG9iYWwgSVJRIHRyaWdnZXJzCmJlZm9yZSB0aGUgUEVSU1QgSVJRIGNv bXBsZXRlcz8KCnFjb21fcGNpZV9lcF9lbmFibGVfaXJxX3Jlc291cmNlcygpIHJlcXVlc3RzIHRo ZSBnbG9iYWwgSVJRIHdpdGhvdXQKSVJRX05PQVVUT0VOLCBtYWtpbmcgaXQgYWN0aXZlIGltbWVk aWF0ZWx5LiBJZiB0aGUgUENJZSBsaW5rIGlzIGFscmVhZHkKZXN0YWJsaXNoZWQgKGUuZy4sIGJ5 IHRoZSBib290bG9hZGVyIG9yIGZpcm13YXJlKSwgdGhlIElSUSBjYW4gdHJpZ2dlcgpiZWZvcmUg cGNpX2VwY19zdGFydCgpIGVuYWJsZXMgdGhlIFBFUlNUIElSUSBhbmQgcWNvbV9wY2llX3BlcnN0 X2RlYXNzZXJ0KCkKY2FjaGVzIHRoZSBvZmZzZXQuCgpJZiB0aGlzIGhhcHBlbnMsIHBjaS0+cGNp ZV9jYXAgd291bGQgYmUgMCwgY2F1c2luZyB0aGUgZnVuY3Rpb24gdG8gcmVhZApmcm9tIERCSSBv ZmZzZXQgMHgxMiBpbnN0ZWFkIG9mIFBDSV9FWFBfTE5LU1RBLiBUaGlzIHdvdWxkIGNvbXB1dGUg YXJiaXRyYXJ5CnNwZWVkIGFuZCB3aWR0aCB2YWx1ZXMgdG8gcGFzcyB0byBpY2Nfc2V0X2J3KCks IHdoaWNoIGNvdWxkIG1pc2NvbmZpZ3VyZSB0aGUKc3lzdGVtIGludGVyY29ubmVjdCBiYW5kd2lk dGguCgo+ICAKPiAgCXNwZWVkID0gRklFTERfR0VUKFBDSV9FWFBfTE5LU1RBX0NMUywgc3RhdHVz KTsKPiAgCXdpZHRoID0gRklFTERfR0VUKFBDSV9FWFBfTE5LU1RBX05MVywgc3RhdHVzKTsKClsg Li4uIF0KCj4gQEAgLTQ5MSwxNCArNDg5LDE1IEBAIHN0YXRpYyBpbnQgcWNvbV9wY2llX3BlcnN0 X2RlYXNzZXJ0KHN0cnVjdCBkd19wY2llICpwY2kpCj4gIAo+ICAJZHdfcGNpZV9kYmlfcm9fd3Jf ZW4ocGNpKTsKPiAgCj4gKwlkd19wY2llX2dldF9wY2llX2NhcChwY2kpOwo+ICsKPiAgCS8qIFNl dCB0aGUgTDBzIEV4aXQgTGF0ZW5jeSB0byAydXMtNHVzID0gMHg2ICovCj4gLQlvZmZzZXQgPSBk d19wY2llX2ZpbmRfY2FwYWJpbGl0eShwY2ksIFBDSV9DQVBfSURfRVhQKTsKPiArCW9mZnNldCA9 IHBjaS0+cGNpZV9jYXA7Cj4gIAl2YWwgPSBkd19wY2llX3JlYWRsX2RiaShwY2ksIG9mZnNldCAr IFBDSV9FWFBfTE5LQ0FQKTsKClsgLi4uIF0KCgpkcml2ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9w Y2llLXFjb20tZXAuYzpxY29tX3BjaWVfZXBfZ2xvYmFsX2lycV90aHJlYWQoKSB7Ci4uLgoJd3Jp dGVsX3JlbGF4ZWQoc3RhdHVzLCBwY2llX2VwLT5wYXJmICsgUEFSRl9JTlRfQUxMX0NMRUFSKTsK CglpZiAoRklFTERfR0VUKFBBUkZfSU5UX0FMTF9MSU5LX0RPV04sIHN0YXR1cykpIHsKLi4uCgl9 IGVsc2UgaWYgKEZJRUxEX0dFVChQQVJGX0lOVF9BTExfQk1FLCBzdGF0dXMpKSB7Ci4uLgp9Cgpb U2V2ZXJpdHk6IEhpZ2hdClRoaXMgaXMgYSBwcmUtZXhpc3RpbmcgaXNzdWUsIGJ1dCBkb2VzIHRo aXMgaWYtZWxzZSBjaGFpbiBsb3NlIGNvbmN1cnJlbnQKaW50ZXJydXB0IGV2ZW50cz8KCnFjb21f cGNpZV9lcF9nbG9iYWxfaXJxX3RocmVhZCgpIGNsZWFycyBhbGwgcGVuZGluZyBldmVudHMgc2lt dWx0YW5lb3VzbHkgaW4KaGFyZHdhcmUuIElmIHRoZSBob3N0IHNlbmRzIG11bHRpcGxlIGV2ZW50 cyBpbiBjbG9zZSBzdWNjZXNzaW9uIChlLmcuLCBib3RoCkJ1cyBNYXN0ZXIgRW5hYmxlIGFuZCBM aW5rIFVwIGFyZSBzZXQgaW4gUEFSRl9JTlRfQUxMX1NUQVRVUyksIHRoZSBlbHNlLWlmCmxvZ2lj IHdpbGwgcHJvY2VzcyB0aGUgZmlyc3QgbWF0Y2hpbmcgZXZlbnQgYW5kIGRpc2NhcmQgdGhlIG90 aGVycy4KClNpbmNlIHRoZSBkaXNjYXJkZWQgZXZlbnRzIGFyZSBhbHJlYWR5IGNsZWFyZWQgZnJv bSB0aGUgcmVnaXN0ZXIsIHRoZXkgd291bGQKYmUgcGVybWFuZW50bHkgbG9zdCwgcG90ZW50aWFs bHkgbGVhdmluZyB0aGUgZW5kcG9pbnQgaW4gYW4gaW5jb3JyZWN0IGxvZ2ljYWwKc3RhdGUuCgoK ZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNpZS1xY29tLWVwLmM6cWNvbV9wY2llX2VwX2ds b2JhbF9pcnFfdGhyZWFkKCkgewouLi4KCXUzMiBzdGF0dXMgPSByZWFkbF9yZWxheGVkKHBjaWVf ZXAtPnBhcmYgKyBQQVJGX0lOVF9BTExfU1RBVFVTKTsKLi4uCn0KCmRyaXZlcnMvcGNpL2NvbnRy b2xsZXIvZHdjL3BjaWUtcWNvbS1lcC5jOnFjb21fcGNpZV9kaXNhYmxlX3Jlc291cmNlcygpIHsK Li4uCgljbGtfYnVsa19kaXNhYmxlX3VucHJlcGFyZShwY2llX2VwLT5udW1fY2xrcywgcGNpZV9l cC0+Y2xrcyk7Ci4uLgp9CgpbU2V2ZXJpdHk6IEhpZ2hdClRoaXMgaXMgYSBwcmUtZXhpc3Rpbmcg aXNzdWUsIGJ1dCBjYW4gdGhlIGdsb2JhbCBJUlEgdGhyZWFkIHJhY2Ugd2l0aApQRVJTVCBkZWFz c2VydGlvbi9hc3NlcnRpb24gYW5kIGNhdXNlIGFuIHVuY2xvY2tlZCBNTUlPIGFjY2Vzcz8KCkJv dGggdGhlIGdsb2JhbCBhbmQgUEVSU1QgSVJRcyBhcmUgcmVxdWVzdGVkIGFzIHRocmVhZGVkIElS UXMgd2l0aG91dCBtdXR1YWwKZXhjbHVzaW9uLiBJZiB0aGUgaG9zdCB0b2dnbGVzIFBFUlNULCBx Y29tX3BjaWVfZXBfcGVyc3RfaXJxX3RocmVhZCgpIGNhbGxzCnFjb21fcGNpZV9wZXJzdF9hc3Nl cnQoKSwgd2hpY2ggdW5jb25kaXRpb25hbGx5IGRpc2FibGVzIHRoZSBQQ0llIGNsb2NrcyB2aWEK Y2xrX2J1bGtfZGlzYWJsZV91bnByZXBhcmUoKS4KCklmIGEgc2ltdWx0YW5lb3VzIGxpbmsgc3Rh dGUgY2hhbmdlIHRyaWdnZXJzIHFjb21fcGNpZV9lcF9nbG9iYWxfaXJxX3RocmVhZCgpCmFuZCBp dCByZWFkcyBmcm9tIFBBUkZfSU5UX0FMTF9TVEFUVVMgYWZ0ZXIgdGhlIGNsb2NrcyBhcmUgZGlz YWJsZWQsIHRoaXMKd291bGQgY2F1c2UgYSBzeW5jaHJvbm91cyBleHRlcm5hbCBhYm9ydCAoU0Vy cm9yKSBhbmQgY3Jhc2ggdGhlIHN5c3RlbS4KCi0tIApTYXNoaWtvIEFJIHJldmlldyDCtyBodHRw czovL3Nhc2hpa28uZGV2LyMvcGF0Y2hzZXQvMjAyNjA3MjAxNTA2MTkuMjQ3MzMtMS0xODI1NTEx NzE1OUAxNjMuY29tP3BhcnQ9MTAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmxpbnV4LWFtbG9naWMgbWFpbGluZyBsaXN0CmxpbnV4LWFtbG9naWNAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LWFtbG9naWMK