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 174A13B14C2 for ; Fri, 10 Jul 2026 21:20:02 +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=1783718403; cv=none; b=MU/PelRVG3ZagHuL9U/ZHgblWipMnLk9m8Gc5oPnfWe6ukmIXw0glyS/kEamaiDx+nE188hgYvL0bQXvzRUIfecg7xIDi4ZLVBMrw69953SHWYiXLOBewLB6e+H5XFb+vWIfBjrAcWqJxP300TrYi2SL/hjCxW/ICuxgCX80WbA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783718403; c=relaxed/simple; bh=Mey/L86LXHTjCZDtl+gOHdvQ0iXtLAFRq/NRjxr54zo=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=WSAxRmim7VNM9xliQQKo3DU/+bIHN/KzoJXIG18qKymXHluXjhwpAc1WZASCMLb+U/Lfplrv+XiZ0Idry0VD/krDThaf5WkpdJieQDtVx+Vh9Cnb5GRtU75BnGxH0iQsl9UFjnYHC9/sKOrbKsMseNru35tRzZCzy8P0owuUG3I= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LyV1pL0l; 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="LyV1pL0l" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8A5731F00A3A; Fri, 10 Jul 2026 21:20:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783718402; bh=EI+LtceVAhQJEqPxtiiVn7H7VZKchQfHbavOANyRi7U=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=LyV1pL0l38EmEVHkBSQDImMBrnShKnu0prThj3DrGOcTjFz20gf4GF78yJmnXZPyn AWjjITzEfqdr6i8tiKlgg1lDVXzXCmk1JC+qSv/pTTMPYOaqdSgki2c/cMZ4Ry4Ryz QFN783GG3WpbunIZssyWaru+LVW8bitUSR4aGgkmrSrusgGvHcJ2uOkHxoRLEHgf6p 6QdWFhgmOv+TcApl9aOyc1b6GCT4Y0luKvQj9zg044y85SOWCdStsR0PG1Vz3anLhE JDpG+0lXIgtC0T270CqjANcsh9YQoOzg8Kd0cdjRxIfJnMUiEO5XV07TJOEIzcwNp8 cByT4MUlk9AIQ== From: sashiko-bot@kernel.org Subject: Re: [PATCH v12 30/36] usb: dwc3: core: support PHY reset notifications Reply-To: sashiko-reviews@lists.linux.dev To: "Sebastian Reichel" Cc: devicetree@vger.kernel.org, olteanv@gmail.com, linux-phy@lists.infradead.org, vkoul@kernel.org, robh@kernel.org, neil.armstrong@linaro.org, conor+dt@kernel.org In-Reply-To: <20260710-rockchip-usbdp-cleanup-v12-30-8b41a9a9bef0@collabora.com> References: <20260710-rockchip-usbdp-cleanup-v12-0-8b41a9a9bef0@collabora.com> <20260710-rockchip-usbdp-cleanup-v12-30-8b41a9a9bef0@collabora.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Fri, 10 Jul 2026 21:20:01 +0000 Message-Id: <20260710212001.8A5731F00A3A@smtp.kernel.org> Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Thank you for your contribution! Sashiko AI review found 2 potential issue(= s) to consider: - [High] The global `phy_reset_count` atomic variable is incorrectly used t= o track the reset state of multiple independent USB3 ports, and is read non= -atomically, leading to cross-port state corruption, TOCTOU race conditions= , and unbalanced PM usage counters. - [High] The PHY reset workaround is completely bypassed if Runtime PM is d= isabled in the kernel configuration or via sysfs, causing the very hardware= corruption the patch intends to fix. -- --- Patch [30]: [PATCH v12 30/36] usb: dwc3: core: support PHY reset notifi= cations --- commit 9e1e85d93d9ab9e98188f6d4d342fd431f334513 Author: Sebastian Reichel usb: dwc3: core: support PHY reset notifications This commit handles external PHY reset notifications on Rockchip platforms by asserting PHYSOFTRST before the PHY disables and deasserting it when the PHY returns. This prevents the DWC3 IP from corrupting the PHY's internal state and failing to lock PLL clocks. > diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c > index 517aa7f1486da..4d0b4c1c73f11 100644 > --- a/drivers/usb/dwc3/core.c > +++ b/drivers/usb/dwc3/core.c [ ... ] > @@ -880,6 +881,90 @@ static int dwc3_phy_init(struct dwc3 *dwc) > return ret; > } > =20 > +static int dwc3_usb3_phy_notify(struct notifier_block *nb, > + unsigned long action, void *data) > +{ > + struct dwc3_phy_nb *pnb =3D container_of(nb, struct dwc3_phy_nb, nb); > + struct dwc3 *dwc =3D pnb->dwc; > + int port =3D pnb->port_index; > + unsigned long flags; > + u32 reg; > + > + switch (action) { > + case PHY_NOTIFY_PRE_RESET: > + /* > + * If already suspended, the resume path will reinit GUSB3PIPECTL > + * via dwc3_core_init(). A forced resume is not possible as that > + * would call phy_init() resulting in a deadlock. Due to the > + * phy_init() in the resume path there is also no need to block > + * async RPM resume on our side, since the PHY synchronizes it > + * for us. > + */ > + if (pm_runtime_get_if_active(dwc->dev) <=3D 0) > + return NOTIFY_OK; [Severity: High] If CONFIG_PM is disabled, or runtime PM is disabled for this device via sysfs, pm_runtime_get_if_active() returns -EINVAL. Will this check treat the -EINVAL error code as suspended and bypass the workaround completely, even though the DWC3 IP is actively running? Also, if the check is later modified to proceed on -EINVAL, would the POST_RESET path underflow the PM counter? pm_runtime_get_if_active() doesn't increment the usage count when returning -EINVAL, but POST_RESET unconditionally calls pm_runtime_put_autosuspend(). > + > + atomic_inc(&dwc->phy_reset_count); > + > + /* > + * Assert USB3 PHY soft reset within DWC3 before the external > + * PHY resets. This disconnects the PIPE interface, preventing > + * the DWC3 from interfering with PHY reinitialization and > + * avoiding LCPLL lock failures. > + */ > + spin_lock_irqsave(&dwc->lock, flags); > + reg =3D dwc3_readl(dwc, DWC3_GUSB3PIPECTL(port)); > + reg |=3D DWC3_GUSB3PIPECTL_PHYSOFTRST; > + dwc3_writel(dwc, DWC3_GUSB3PIPECTL(port), reg); > + spin_unlock_irqrestore(&dwc->lock, flags); > + break; > + > + case PHY_NOTIFY_POST_RESET: > + if (!atomic_read(&dwc->phy_reset_count)) > + return NOTIFY_OK; [Severity: High] Can this global count cause state corruption on multi-port systems if notifications interleave with PM state changes? For example, if Port 0 starts a reset while suspended, it skips the PRE_RES= ET workaround and doesn't increment phy_reset_count. If the controller resumes and Port 1 starts a reset, it increments the global phy_reset_count to 1. When Port 0 finishes its reset and hits POST_RESET, it sees phy_reset_count as 1. Won't it erroneously clear PHYSOFTRST for Port 0 (which was never set= ), call pm_runtime_put_autosuspend() unbalanced, and decrement the count to 0? If Port 1 then finishes its reset, won't it see phy_reset_count at 0 and skip its cleanup, leaving Port 1 permanently stuck in PHYSOFTRST? > + /* > + * Deassert PHY soft reset to reconnect the PIPE interface > + * after PHY reinitialization. > + */ > + spin_lock_irqsave(&dwc->lock, flags); > + reg =3D dwc3_readl(dwc, DWC3_GUSB3PIPECTL(port)); > + reg &=3D ~DWC3_GUSB3PIPECTL_PHYSOFTRST; > + dwc3_writel(dwc, DWC3_GUSB3PIPECTL(port), reg); > + spin_unlock_irqrestore(&dwc->lock, flags); > + > + pm_runtime_put_autosuspend(dwc->dev); > + atomic_dec(&dwc->phy_reset_count); > + break; > + } > + > + return NOTIFY_OK; > +} --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260710-rockchip-u= sbdp-cleanup-v12-0-8b41a9a9bef0@collabora.com?part=3D30 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 2338AC43458 for ; Fri, 10 Jul 2026 21:20:04 +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=usRtKWVKlWb3QSe1J9uqTw85cydq19DwHQGJ9IvyjeQ=; b=zL2p8GRCvV8Z1F EqTQI7FL/5RewezlbEMLC++WlpGn5DIpqbJqCgES7cJSHNsdFoDIPk8O6l+O8lADX+DoJHUfHx3Nt k2RXTI9nH6cz9gwnmYdQ1dzU0JM9Tt6m8kZYbTD4dBR5QITeG7ZT7Akqi88Ln1MVAkM4kVu33ZcGP AxkmZ+8gZvZSEGTB2mkXG0EjiKh0x4RsUiwELrFCKm4s9JUAtk3zvcFM0LK3ex8+YzfJbhAjj8jSK R8TxvAY1dcibD/vYjKv1Wsq5dCFd8hNHS9JoWPHQ8SpEd5j4GRH4j6aegAbCdFboNB9Ol4UYTtOik 35Gyj3j3HNaGofnPUaag==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wiIdf-00000005nLk-3jnO; Fri, 10 Jul 2026 21:20:03 +0000 Received: from tor.source.kernel.org ([172.105.4.254]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wiIde-00000005nLW-3QxZ for linux-phy@lists.infradead.org; Fri, 10 Jul 2026 21:20:02 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id 4602060052; Fri, 10 Jul 2026 21:20:02 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8A5731F00A3A; Fri, 10 Jul 2026 21:20:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783718402; bh=EI+LtceVAhQJEqPxtiiVn7H7VZKchQfHbavOANyRi7U=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=LyV1pL0l38EmEVHkBSQDImMBrnShKnu0prThj3DrGOcTjFz20gf4GF78yJmnXZPyn AWjjITzEfqdr6i8tiKlgg1lDVXzXCmk1JC+qSv/pTTMPYOaqdSgki2c/cMZ4Ry4Ryz QFN783GG3WpbunIZssyWaru+LVW8bitUSR4aGgkmrSrusgGvHcJ2uOkHxoRLEHgf6p 6QdWFhgmOv+TcApl9aOyc1b6GCT4Y0luKvQj9zg044y85SOWCdStsR0PG1Vz3anLhE JDpG+0lXIgtC0T270CqjANcsh9YQoOzg8Kd0cdjRxIfJnMUiEO5XV07TJOEIzcwNp8 cByT4MUlk9AIQ== From: sashiko-bot@kernel.org Subject: Re: [PATCH v12 30/36] usb: dwc3: core: support PHY reset notifications To: "Sebastian Reichel" Cc: devicetree@vger.kernel.org, olteanv@gmail.com, linux-phy@lists.infradead.org, vkoul@kernel.org, robh@kernel.org, neil.armstrong@linaro.org, conor+dt@kernel.org In-Reply-To: <20260710-rockchip-usbdp-cleanup-v12-30-8b41a9a9bef0@collabora.com> References: <20260710-rockchip-usbdp-cleanup-v12-0-8b41a9a9bef0@collabora.com> <20260710-rockchip-usbdp-cleanup-v12-30-8b41a9a9bef0@collabora.com> Date: Fri, 10 Jul 2026 21:20:01 +0000 Message-Id: <20260710212001.8A5731F00A3A@smtp.kernel.org> X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list 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-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg MiBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW0hpZ2hdIFRoZSBnbG9iYWwgYHBo eV9yZXNldF9jb3VudGAgYXRvbWljIHZhcmlhYmxlIGlzIGluY29ycmVjdGx5IHVzZWQgdG8gdHJh Y2sgdGhlIHJlc2V0IHN0YXRlIG9mIG11bHRpcGxlIGluZGVwZW5kZW50IFVTQjMgcG9ydHMsIGFu ZCBpcyByZWFkIG5vbi1hdG9taWNhbGx5LCBsZWFkaW5nIHRvIGNyb3NzLXBvcnQgc3RhdGUgY29y cnVwdGlvbiwgVE9DVE9VIHJhY2UgY29uZGl0aW9ucywgYW5kIHVuYmFsYW5jZWQgUE0gdXNhZ2Ug Y291bnRlcnMuCi0gW0hpZ2hdIFRoZSBQSFkgcmVzZXQgd29ya2Fyb3VuZCBpcyBjb21wbGV0ZWx5 IGJ5cGFzc2VkIGlmIFJ1bnRpbWUgUE0gaXMgZGlzYWJsZWQgaW4gdGhlIGtlcm5lbCBjb25maWd1 cmF0aW9uIG9yIHZpYSBzeXNmcywgY2F1c2luZyB0aGUgdmVyeSBoYXJkd2FyZSBjb3JydXB0aW9u IHRoZSBwYXRjaCBpbnRlbmRzIHRvIGZpeC4KLS0KCi0tLSBQYXRjaCBbMzBdOiBbUEFUQ0ggdjEy IDMwLzM2XSB1c2I6IGR3YzM6IGNvcmU6IHN1cHBvcnQgUEhZIHJlc2V0IG5vdGlmaWNhdGlvbnMg LS0tCmNvbW1pdCA5ZTFlODVkOTNkOWFiOWU5ODE4OGY2ZDRkMzQyZmQ0MzFmMzM0NTEzCkF1dGhv cjogU2ViYXN0aWFuIFJlaWNoZWwgPHNlYmFzdGlhbi5yZWljaGVsQGNvbGxhYm9yYS5jb20+Cgp1 c2I6IGR3YzM6IGNvcmU6IHN1cHBvcnQgUEhZIHJlc2V0IG5vdGlmaWNhdGlvbnMKClRoaXMgY29t bWl0IGhhbmRsZXMgZXh0ZXJuYWwgUEhZIHJlc2V0IG5vdGlmaWNhdGlvbnMgb24gUm9ja2NoaXAg cGxhdGZvcm1zCmJ5IGFzc2VydGluZyBQSFlTT0ZUUlNUIGJlZm9yZSB0aGUgUEhZIGRpc2FibGVz IGFuZCBkZWFzc2VydGluZyBpdCB3aGVuIHRoZQpQSFkgcmV0dXJucy4gVGhpcyBwcmV2ZW50cyB0 aGUgRFdDMyBJUCBmcm9tIGNvcnJ1cHRpbmcgdGhlIFBIWSdzIGludGVybmFsCnN0YXRlIGFuZCBm YWlsaW5nIHRvIGxvY2sgUExMIGNsb2Nrcy4KCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3 YzMvY29yZS5jIGIvZHJpdmVycy91c2IvZHdjMy9jb3JlLmMKPiBpbmRleCA1MTdhYTdmMTQ4NmRh Li40ZDBiNGMxYzczZjExIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jCj4g KysrIGIvZHJpdmVycy91c2IvZHdjMy9jb3JlLmMKClsgLi4uIF0KCj4gQEAgLTg4MCw2ICs4ODEs OTAgQEAgc3RhdGljIGludCBkd2MzX3BoeV9pbml0KHN0cnVjdCBkd2MzICpkd2MpCj4gIAlyZXR1 cm4gcmV0Owo+ICB9Cj4gIAo+ICtzdGF0aWMgaW50IGR3YzNfdXNiM19waHlfbm90aWZ5KHN0cnVj dCBub3RpZmllcl9ibG9jayAqbmIsCj4gKwkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAq ZGF0YSkKPiArewo+ICsJc3RydWN0IGR3YzNfcGh5X25iICpwbmIgPSBjb250YWluZXJfb2YobmIs IHN0cnVjdCBkd2MzX3BoeV9uYiwgbmIpOwo+ICsJc3RydWN0IGR3YzMgKmR3YyA9IHBuYi0+ZHdj Owo+ICsJaW50IHBvcnQgPSBwbmItPnBvcnRfaW5kZXg7Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdz Owo+ICsJdTMyIHJlZzsKPiArCj4gKwlzd2l0Y2ggKGFjdGlvbikgewo+ICsJY2FzZSBQSFlfTk9U SUZZX1BSRV9SRVNFVDoKPiArCQkvKgo+ICsJCSAqIElmIGFscmVhZHkgc3VzcGVuZGVkLCB0aGUg cmVzdW1lIHBhdGggd2lsbCByZWluaXQgR1VTQjNQSVBFQ1RMCj4gKwkJICogdmlhIGR3YzNfY29y ZV9pbml0KCkuIEEgZm9yY2VkIHJlc3VtZSBpcyBub3QgcG9zc2libGUgYXMgdGhhdAo+ICsJCSAq IHdvdWxkIGNhbGwgcGh5X2luaXQoKSByZXN1bHRpbmcgaW4gYSBkZWFkbG9jay4gRHVlIHRvIHRo ZQo+ICsJCSAqIHBoeV9pbml0KCkgaW4gdGhlIHJlc3VtZSBwYXRoIHRoZXJlIGlzIGFsc28gbm8g bmVlZCB0byBibG9jawo+ICsJCSAqIGFzeW5jIFJQTSByZXN1bWUgb24gb3VyIHNpZGUsIHNpbmNl IHRoZSBQSFkgc3luY2hyb25pemVzIGl0Cj4gKwkJICogZm9yIHVzLgo+ICsJCSAqLwo+ICsJCWlm IChwbV9ydW50aW1lX2dldF9pZl9hY3RpdmUoZHdjLT5kZXYpIDw9IDApCj4gKwkJCXJldHVybiBO T1RJRllfT0s7CgpbU2V2ZXJpdHk6IEhpZ2hdCklmIENPTkZJR19QTSBpcyBkaXNhYmxlZCwgb3Ig cnVudGltZSBQTSBpcyBkaXNhYmxlZCBmb3IgdGhpcyBkZXZpY2UgdmlhCnN5c2ZzLCBwbV9ydW50 aW1lX2dldF9pZl9hY3RpdmUoKSByZXR1cm5zIC1FSU5WQUwuCgpXaWxsIHRoaXMgY2hlY2sgdHJl YXQgdGhlIC1FSU5WQUwgZXJyb3IgY29kZSBhcyBzdXNwZW5kZWQgYW5kIGJ5cGFzcyB0aGUKd29y a2Fyb3VuZCBjb21wbGV0ZWx5LCBldmVuIHRob3VnaCB0aGUgRFdDMyBJUCBpcyBhY3RpdmVseSBy dW5uaW5nPwoKQWxzbywgaWYgdGhlIGNoZWNrIGlzIGxhdGVyIG1vZGlmaWVkIHRvIHByb2NlZWQg b24gLUVJTlZBTCwgd291bGQgdGhlClBPU1RfUkVTRVQgcGF0aCB1bmRlcmZsb3cgdGhlIFBNIGNv dW50ZXI/IHBtX3J1bnRpbWVfZ2V0X2lmX2FjdGl2ZSgpCmRvZXNuJ3QgaW5jcmVtZW50IHRoZSB1 c2FnZSBjb3VudCB3aGVuIHJldHVybmluZyAtRUlOVkFMLCBidXQgUE9TVF9SRVNFVAp1bmNvbmRp dGlvbmFsbHkgY2FsbHMgcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoKS4KCj4gKwo+ICsJCWF0 b21pY19pbmMoJmR3Yy0+cGh5X3Jlc2V0X2NvdW50KTsKPiArCj4gKwkJLyoKPiArCQkgKiBBc3Nl cnQgVVNCMyBQSFkgc29mdCByZXNldCB3aXRoaW4gRFdDMyBiZWZvcmUgdGhlIGV4dGVybmFsCj4g KwkJICogUEhZIHJlc2V0cy4gVGhpcyBkaXNjb25uZWN0cyB0aGUgUElQRSBpbnRlcmZhY2UsIHBy ZXZlbnRpbmcKPiArCQkgKiB0aGUgRFdDMyBmcm9tIGludGVyZmVyaW5nIHdpdGggUEhZIHJlaW5p dGlhbGl6YXRpb24gYW5kCj4gKwkJICogYXZvaWRpbmcgTENQTEwgbG9jayBmYWlsdXJlcy4KPiAr CQkgKi8KPiArCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHdjLT5sb2NrLCBmbGFncyk7Cj4gKwkJcmVn ID0gZHdjM19yZWFkbChkd2MsIERXQzNfR1VTQjNQSVBFQ1RMKHBvcnQpKTsKPiArCQlyZWcgfD0g RFdDM19HVVNCM1BJUEVDVExfUEhZU09GVFJTVDsKPiArCQlkd2MzX3dyaXRlbChkd2MsIERXQzNf R1VTQjNQSVBFQ1RMKHBvcnQpLCByZWcpOwo+ICsJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3 Yy0+bG9jaywgZmxhZ3MpOwo+ICsJCWJyZWFrOwo+ICsKPiArCWNhc2UgUEhZX05PVElGWV9QT1NU X1JFU0VUOgo+ICsJCWlmICghYXRvbWljX3JlYWQoJmR3Yy0+cGh5X3Jlc2V0X2NvdW50KSkKPiAr CQkJcmV0dXJuIE5PVElGWV9PSzsKCltTZXZlcml0eTogSGlnaF0KQ2FuIHRoaXMgZ2xvYmFsIGNv dW50IGNhdXNlIHN0YXRlIGNvcnJ1cHRpb24gb24gbXVsdGktcG9ydCBzeXN0ZW1zIGlmCm5vdGlm aWNhdGlvbnMgaW50ZXJsZWF2ZSB3aXRoIFBNIHN0YXRlIGNoYW5nZXM/CgpGb3IgZXhhbXBsZSwg aWYgUG9ydCAwIHN0YXJ0cyBhIHJlc2V0IHdoaWxlIHN1c3BlbmRlZCwgaXQgc2tpcHMgdGhlIFBS RV9SRVNFVAp3b3JrYXJvdW5kIGFuZCBkb2Vzbid0IGluY3JlbWVudCBwaHlfcmVzZXRfY291bnQu CgpJZiB0aGUgY29udHJvbGxlciByZXN1bWVzIGFuZCBQb3J0IDEgc3RhcnRzIGEgcmVzZXQsIGl0 IGluY3JlbWVudHMgdGhlCmdsb2JhbCBwaHlfcmVzZXRfY291bnQgdG8gMS4KCldoZW4gUG9ydCAw IGZpbmlzaGVzIGl0cyByZXNldCBhbmQgaGl0cyBQT1NUX1JFU0VULCBpdCBzZWVzIHBoeV9yZXNl dF9jb3VudAphcyAxLiBXb24ndCBpdCBlcnJvbmVvdXNseSBjbGVhciBQSFlTT0ZUUlNUIGZvciBQ b3J0IDAgKHdoaWNoIHdhcyBuZXZlciBzZXQpLApjYWxsIHBtX3J1bnRpbWVfcHV0X2F1dG9zdXNw ZW5kKCkgdW5iYWxhbmNlZCwgYW5kIGRlY3JlbWVudCB0aGUgY291bnQgdG8gMD8KCklmIFBvcnQg MSB0aGVuIGZpbmlzaGVzIGl0cyByZXNldCwgd29uJ3QgaXQgc2VlIHBoeV9yZXNldF9jb3VudCBh dCAwIGFuZApza2lwIGl0cyBjbGVhbnVwLCBsZWF2aW5nIFBvcnQgMSBwZXJtYW5lbnRseSBzdHVj ayBpbiBQSFlTT0ZUUlNUPwoKPiArCQkvKgo+ICsJCSAqIERlYXNzZXJ0IFBIWSBzb2Z0IHJlc2V0 IHRvIHJlY29ubmVjdCB0aGUgUElQRSBpbnRlcmZhY2UKPiArCQkgKiBhZnRlciBQSFkgcmVpbml0 aWFsaXphdGlvbi4KPiArCQkgKi8KPiArCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHdjLT5sb2NrLCBm bGFncyk7Cj4gKwkJcmVnID0gZHdjM19yZWFkbChkd2MsIERXQzNfR1VTQjNQSVBFQ1RMKHBvcnQp KTsKPiArCQlyZWcgJj0gfkRXQzNfR1VTQjNQSVBFQ1RMX1BIWVNPRlRSU1Q7Cj4gKwkJZHdjM193 cml0ZWwoZHdjLCBEV0MzX0dVU0IzUElQRUNUTChwb3J0KSwgcmVnKTsKPiArCQlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZkd2MtPmxvY2ssIGZsYWdzKTsKPiArCj4gKwkJcG1fcnVudGltZV9wdXRf YXV0b3N1c3BlbmQoZHdjLT5kZXYpOwo+ICsJCWF0b21pY19kZWMoJmR3Yy0+cGh5X3Jlc2V0X2Nv dW50KTsKPiArCQlicmVhazsKPiArCX0KPiArCj4gKwlyZXR1cm4gTk9USUZZX09LOwo+ICt9Cgot LSAKU2FzaGlrbyBBSSByZXZpZXcgwrcgaHR0cHM6Ly9zYXNoaWtvLmRldi8jL3BhdGNoc2V0LzIw MjYwNzEwLXJvY2tjaGlwLXVzYmRwLWNsZWFudXAtdjEyLTAtOGI0MWE5YTliZWYwQGNvbGxhYm9y YS5jb20/cGFydD0zMAoKLS0gCmxpbnV4LXBoeSBtYWlsaW5nIGxpc3QKbGludXgtcGh5QGxpc3Rz LmluZnJhZGVhZC5vcmcKaHR0cHM6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGlu Zm8vbGludXgtcGh5Cg==