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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 65DCEC61DD6 for ; Fri, 4 Sep 2026 13:42:55 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8194B10E55F; Fri, 4 Sep 2026 13:42:54 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="ZX01FCF+"; dkim-atps=neutral Received: from sea.source.kernel.org (sea.source.kernel.org [172.234.252.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0CB3310E55F for ; Fri, 4 Sep 2026 13:42:53 +0000 (UTC) Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 7BB1940243; Fri, 4 Sep 2026 13:42:52 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 61DAD1F00A3D; Fri, 4 Sep 2026 13:42:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788529372; bh=wzU4YjPnSETRdodZme4TDyvK+QC9EtY4n+yRYCubHZg=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=ZX01FCF+BY26ep95y1j0Ggg5eTyVHVdVJNvbhbJ6wkGZ22mcxeEQKocLLLDnWI8uM Z9B0QGZDOrgeJmcl9JjMvUc3f9cUOAOkbUfaBUd3eFCWMSXk/yCdFKvl5M2fOiJOFq 6mMYqbNj9mYsO1aIvyr8h2Pyd3CjZsGujPjk2Za6NsKsnyXsJRZSHUz/m27Wa8gRfs rGpDdru+IlzblBtoLG9glzq4Na7zs1FqQpoIiFpwOqP4rDOGeJckwpqoos2Lsdv+l5 Bv4ljVAf9cqJVmJGYMIo7l6Rq4Q02+rkP2PznBwboOk03RIM1pMRgJLWe3pOsgP4Nx jjCLs4liQ04kA== From: sashiko-bot@kernel.org Subject: Re: [PATCH v3 07/19] drm/bridge: inno-hdmi: Split probe out of bind To: "Michal Wilczynski" Cc: lee@kernel.org, linux-phy@lists.infradead.org, robh@kernel.org, linux-clk@vger.kernel.org, devicetree@vger.kernel.org, vkoul@kernel.org, neil.armstrong@linaro.org, olteanv@gmail.com, mfd@lists.linux.dev, conor+dt@kernel.org, dri-devel@lists.freedesktop.org In-Reply-To: <20260904-jh7110-clean-send-v3-7-484f9ae72715@samsung.com> References: <20260904-jh7110-clean-send-v3-0-484f9ae72715@samsung.com> <20260904-jh7110-clean-send-v3-7-484f9ae72715@samsung.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Fri, 04 Sep 2026 13:42:50 +0000 Message-Id: <20260904134251.61DAD1F00A3D@smtp.kernel.org> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Thank you for your contribution! Sashiko AI review found 3 potential issue(= s) to consider: Pre-existing issues: - [High] Using `devm_` APIs during the component bind phase causes permanen= t resource leaks and breaks EPROBE_DEFER. - [High] The hotplug interrupt handler `inno_hdmi_irq` can fire before the = bridge is attached, leading to a NULL pointer dereference. - [High] The I2C adapter is exposed before its private data is initialized,= leading to a NULL pointer dereference on concurrent access. -- commit 72f1334365740cfcdf0865d9dfd6562b9c3b40a8 Author: Michal Wilczynski Subject: drm/bridge: inno-hdmi: Split probe out of bind This commit splits the hardware setup of the inno-hdmi driver into a new inno_hdmi_probe() function. This separates the bridge registration from its attachment in inno_hdmi_bind(), allowing decoupled MFD/glue drivers to mana= ge them independently. > diff --git a/drivers/gpu/drm/bridge/inno-hdmi.c b/drivers/gpu/drm/bridge/= inno-hdmi.c > index dd35f5a875d3d..aab474740f7f5 100644 > --- a/drivers/gpu/drm/bridge/inno-hdmi.c > +++ b/drivers/gpu/drm/bridge/inno-hdmi.c > @@ -1061,11 +1061,24 @@ static struct i2c_adapter *inno_hdmi_i2c_adapter(= struct inno_hdmi *hdmi) > return adap; > } [Severity: High] This is a pre-existing issue, but the I2C adapter is exposed before its pri= vate data is initialized, which can lead to a NULL pointer dereference on concur= rent access. Just above this line, devm_i2c_add_adapter() makes the bus visible to the s= ystem before hdmi->i2c is assigned: ret =3D devm_i2c_add_adapter(hdmi->dev, adap); if (ret) { ... } hdmi->i2c =3D i2c; If a concurrent I2C transfer is initiated (e.g. via udev running i2cdetect), inno_hdmi_i2c_xfer() can be invoked. It will read the uninitialized hdmi->i= 2c and attempt to lock its mutex: drivers/gpu/drm/bridge/inno-hdmi.c:inno_hdmi_i2c_xfer() { struct inno_hdmi_i2c *i2c =3D hdmi->i2c; ... mutex_lock(&i2c->lock); ... } Could hdmi->i2c be assigned before calling devm_i2c_add_adapter() to prevent this race? > -struct inno_hdmi *inno_hdmi_bind(struct device *dev, > - struct drm_encoder *encoder, > - const struct inno_hdmi_plat_data *plat_data) > +/** > + * inno_hdmi_probe - Internal helper to perform common setup > + * @pdev: platform device > + * @plat_data: SoC-specific platform data > + * > + * This function handles all the common hardware setup: allocating the m= ain > + * struct, mapping registers, getting clocks, initializing the hardware, > + * setting up the IRQ, and initializing the DDC adapter and bridge struc= t. > + * It returns a pointer to the inno_hdmi struct on success, or an ERR_PTR > + * on failure. > + * > + * This function is used by modern, decoupled MFD/glue drivers. It regis= ters > + * the bridge but does not attach it. > + */ > +struct inno_hdmi *inno_hdmi_probe(struct platform_device *pdev, > + const struct inno_hdmi_plat_data *plat_data) > { [Severity: High] This isn't a bug introduced by this patch, but using devm_ APIs in the component bind phase (now moved to inno_hdmi_probe()) causes permanent resource leaks and breaks EPROBE_DEFER. Because inno_hdmi_bind() is called from inno_hdmi_rockchip_bind() (a component bind callback), the platform device is not removed when a compone= nt unbinds. If another component in the DRM pipeline defers, the devm_ resourc= es are not freed. Subsequent bind attempts will fail with -EBUSY when re-requesting the IRQ or I/O regions: drivers/gpu/drm/bridge/inno-hdmi.c:inno_hdmi_probe() { ... ret =3D devm_request_threaded_irq(dev, irq, inno_hdmi_hardirq, inno_hdmi_irq, IRQF_SHARED, dev_name(dev), hdmi); ... } Should this driver be converted to request resources during the actual probe phase rather than bind? [ ... ] > +struct inno_hdmi *inno_hdmi_bind(struct device *dev, > + struct drm_encoder *encoder, > + const struct inno_hdmi_plat_data *plat_data) > +{ > + struct platform_device *pdev =3D to_platform_device(dev); > + struct inno_hdmi *hdmi; > + int ret; > + > + hdmi =3D inno_hdmi_probe(pdev, plat_data); > + if (IS_ERR(hdmi)) > + return hdmi; > + > + ret =3D drm_bridge_attach(encoder, &hdmi->bridge, NULL, > + DRM_BRIDGE_ATTACH_NO_CONNECTOR); [Severity: High] This is a pre-existing issue, but this refactoring significantly widens the= race window for a NULL pointer dereference. The hotplug interrupt handler can fi= re before the bridge is attached. inno_hdmi_probe() unmasks the HPD interrupt and registers the IRQ handler w= ith devm_request_threaded_irq(). If a monitor is physically connected, the interrupt can fire immediately. The IRQ handler then attempts to dereference hdmi->bridge.dev: drivers/gpu/drm/bridge/inno-hdmi.c:inno_hdmi_irq() { ... drm_helper_hpd_irq_event(hdmi->bridge.dev); ... } However, hdmi->bridge.dev is only assigned when drm_bridge_attach() is call= ed. Since this patch decouples probe from attach for modern MFD/glue drivers, t= he attach phase happens much later, leaving a dangerous race window. Should the IRQ registration be moved to after the bridge is attached, or sh= ould the IRQ handler check if the bridge is attached before proceeding? --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260904-jh7110-cle= an-send-v3-0-484f9ae72715@samsung.com?part=3D7 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 091EDC624D3 for ; Fri, 4 Sep 2026 13:42:55 +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=RLXXcWA5bbQ1dBMcAjBpAP/R1xaJwyc+ZYEBvRbpcA0=; b=y6iBbeGd0WCQau 8QdQCvhkpXWg4niZ13r0eLXyUq7WsGQRX1CVg8dLm78r+qRN7KKaqusdwur38IGw3kCPO1QEh9p8K 3hbBfylzsvBKRyvc2522wLXTb3UPlesgjovLAhreCOG79ISGEcRzyaXVJ7b04xzhu8//y/DiDIc+u UHwqyogsA8OvcMxiM672eMX0/lFY9L/7hY+fzT9KyUfIwcF699e28S+mxDVNAnZE2hP2cPKnAgzo8 ZD85EvPNdgSFSqAIBpo/eCWrYbhZGjXiZ0RYFDzelVbg9iW/PoxvrEpMz1rYcXzA3w3rRwt5RMoRx ZNsyjLEq4iEtUi6Q5C2A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1x2UBy-00000002GdC-36oC; Fri, 04 Sep 2026 13:42:54 +0000 Received: from sea.source.kernel.org ([172.234.252.31]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1x2UBw-00000002Gd2-322u for linux-phy@lists.infradead.org; Fri, 04 Sep 2026 13:42:52 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 7BB1940243; Fri, 4 Sep 2026 13:42:52 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 61DAD1F00A3D; Fri, 4 Sep 2026 13:42:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788529372; bh=wzU4YjPnSETRdodZme4TDyvK+QC9EtY4n+yRYCubHZg=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=ZX01FCF+BY26ep95y1j0Ggg5eTyVHVdVJNvbhbJ6wkGZ22mcxeEQKocLLLDnWI8uM Z9B0QGZDOrgeJmcl9JjMvUc3f9cUOAOkbUfaBUd3eFCWMSXk/yCdFKvl5M2fOiJOFq 6mMYqbNj9mYsO1aIvyr8h2Pyd3CjZsGujPjk2Za6NsKsnyXsJRZSHUz/m27Wa8gRfs rGpDdru+IlzblBtoLG9glzq4Na7zs1FqQpoIiFpwOqP4rDOGeJckwpqoos2Lsdv+l5 Bv4ljVAf9cqJVmJGYMIo7l6Rq4Q02+rkP2PznBwboOk03RIM1pMRgJLWe3pOsgP4Nx jjCLs4liQ04kA== From: sashiko-bot@kernel.org Subject: Re: [PATCH v3 07/19] drm/bridge: inno-hdmi: Split probe out of bind To: "Michal Wilczynski" Cc: lee@kernel.org, linux-phy@lists.infradead.org, robh@kernel.org, linux-clk@vger.kernel.org, devicetree@vger.kernel.org, vkoul@kernel.org, neil.armstrong@linaro.org, olteanv@gmail.com, mfd@lists.linux.dev, conor+dt@kernel.org, dri-devel@lists.freedesktop.org In-Reply-To: <20260904-jh7110-clean-send-v3-7-484f9ae72715@samsung.com> References: <20260904-jh7110-clean-send-v3-0-484f9ae72715@samsung.com> <20260904-jh7110-clean-send-v3-7-484f9ae72715@samsung.com> Date: Fri, 04 Sep 2026 13:42:50 +0000 Message-Id: <20260904134251.61DAD1F00A3D@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 MyBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6CgpQcmUtZXhpc3RpbmcgaXNzdWVzOgot IFtIaWdoXSBVc2luZyBgZGV2bV9gIEFQSXMgZHVyaW5nIHRoZSBjb21wb25lbnQgYmluZCBwaGFz ZSBjYXVzZXMgcGVybWFuZW50IHJlc291cmNlIGxlYWtzIGFuZCBicmVha3MgRVBST0JFX0RFRkVS LgotIFtIaWdoXSBUaGUgaG90cGx1ZyBpbnRlcnJ1cHQgaGFuZGxlciBgaW5ub19oZG1pX2lycWAg Y2FuIGZpcmUgYmVmb3JlIHRoZSBicmlkZ2UgaXMgYXR0YWNoZWQsIGxlYWRpbmcgdG8gYSBOVUxM IHBvaW50ZXIgZGVyZWZlcmVuY2UuCi0gW0hpZ2hdIFRoZSBJMkMgYWRhcHRlciBpcyBleHBvc2Vk IGJlZm9yZSBpdHMgcHJpdmF0ZSBkYXRhIGlzIGluaXRpYWxpemVkLCBsZWFkaW5nIHRvIGEgTlVM TCBwb2ludGVyIGRlcmVmZXJlbmNlIG9uIGNvbmN1cnJlbnQgYWNjZXNzLgotLQoKY29tbWl0IDcy ZjEzMzQzNjU3NDBjZmNkZjA4NjVkOWRmZDY1NjJiOWMzYjQwYTgKQXV0aG9yOiBNaWNoYWwgV2ls Y3p5bnNraSA8bS53aWxjenluc2tpQHNhbXN1bmcuY29tPgpTdWJqZWN0OiBkcm0vYnJpZGdlOiBp bm5vLWhkbWk6IFNwbGl0IHByb2JlIG91dCBvZiBiaW5kCgpUaGlzIGNvbW1pdCBzcGxpdHMgdGhl IGhhcmR3YXJlIHNldHVwIG9mIHRoZSBpbm5vLWhkbWkgZHJpdmVyIGludG8gYSBuZXcKaW5ub19o ZG1pX3Byb2JlKCkgZnVuY3Rpb24uIFRoaXMgc2VwYXJhdGVzIHRoZSBicmlkZ2UgcmVnaXN0cmF0 aW9uIGZyb20gaXRzCmF0dGFjaG1lbnQgaW4gaW5ub19oZG1pX2JpbmQoKSwgYWxsb3dpbmcgZGVj b3VwbGVkIE1GRC9nbHVlIGRyaXZlcnMgdG8gbWFuYWdlCnRoZW0gaW5kZXBlbmRlbnRseS4KCj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvaW5uby1oZG1pLmMgYi9kcml2ZXJz L2dwdS9kcm0vYnJpZGdlL2lubm8taGRtaS5jCj4gaW5kZXggZGQzNWY1YTg3NWQzZC4uYWFiNDc0 NzQwZjdmNSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2lubm8taGRtaS5j Cj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9pbm5vLWhkbWkuYwo+IEBAIC0xMDYxLDEx ICsxMDYxLDI0IEBAIHN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmlubm9faGRtaV9pMmNfYWRh cHRlcihzdHJ1Y3QgaW5ub19oZG1pICpoZG1pKQo+ICAJcmV0dXJuIGFkYXA7Cj4gIH0KCltTZXZl cml0eTogSGlnaF0KVGhpcyBpcyBhIHByZS1leGlzdGluZyBpc3N1ZSwgYnV0IHRoZSBJMkMgYWRh cHRlciBpcyBleHBvc2VkIGJlZm9yZSBpdHMgcHJpdmF0ZQpkYXRhIGlzIGluaXRpYWxpemVkLCB3 aGljaCBjYW4gbGVhZCB0byBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBvbiBjb25jdXJyZW50 CmFjY2Vzcy4KCkp1c3QgYWJvdmUgdGhpcyBsaW5lLCBkZXZtX2kyY19hZGRfYWRhcHRlcigpIG1h a2VzIHRoZSBidXMgdmlzaWJsZSB0byB0aGUgc3lzdGVtCmJlZm9yZSBoZG1pLT5pMmMgaXMgYXNz aWduZWQ6CgogICAgcmV0ID0gZGV2bV9pMmNfYWRkX2FkYXB0ZXIoaGRtaS0+ZGV2LCBhZGFwKTsK ICAgIGlmIChyZXQpIHsKICAgICAgICAuLi4KICAgIH0KCiAgICBoZG1pLT5pMmMgPSBpMmM7CgpJ ZiBhIGNvbmN1cnJlbnQgSTJDIHRyYW5zZmVyIGlzIGluaXRpYXRlZCAoZS5nLiB2aWEgdWRldiBy dW5uaW5nIGkyY2RldGVjdCksCmlubm9faGRtaV9pMmNfeGZlcigpIGNhbiBiZSBpbnZva2VkLiBJ dCB3aWxsIHJlYWQgdGhlIHVuaW5pdGlhbGl6ZWQgaGRtaS0+aTJjCmFuZCBhdHRlbXB0IHRvIGxv Y2sgaXRzIG11dGV4OgoKZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9pbm5vLWhkbWkuYzppbm5vX2hk bWlfaTJjX3hmZXIoKSB7CiAgICBzdHJ1Y3QgaW5ub19oZG1pX2kyYyAqaTJjID0gaGRtaS0+aTJj OwogICAgLi4uCiAgICBtdXRleF9sb2NrKCZpMmMtPmxvY2spOwogICAgLi4uCn0KCkNvdWxkIGhk bWktPmkyYyBiZSBhc3NpZ25lZCBiZWZvcmUgY2FsbGluZyBkZXZtX2kyY19hZGRfYWRhcHRlcigp IHRvIHByZXZlbnQKdGhpcyByYWNlPwoKPiAtc3RydWN0IGlubm9faGRtaSAqaW5ub19oZG1pX2Jp bmQoc3RydWN0IGRldmljZSAqZGV2LAo+IC0JCQkJIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rl ciwKPiAtCQkJCSBjb25zdCBzdHJ1Y3QgaW5ub19oZG1pX3BsYXRfZGF0YSAqcGxhdF9kYXRhKQo+ ICsvKioKPiArICogaW5ub19oZG1pX3Byb2JlIC0gSW50ZXJuYWwgaGVscGVyIHRvIHBlcmZvcm0g Y29tbW9uIHNldHVwCj4gKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UKPiArICogQHBsYXRfZGF0 YTogU29DLXNwZWNpZmljIHBsYXRmb3JtIGRhdGEKPiArICoKPiArICogVGhpcyBmdW5jdGlvbiBo YW5kbGVzIGFsbCB0aGUgY29tbW9uIGhhcmR3YXJlIHNldHVwOiBhbGxvY2F0aW5nIHRoZSBtYWlu Cj4gKyAqIHN0cnVjdCwgbWFwcGluZyByZWdpc3RlcnMsIGdldHRpbmcgY2xvY2tzLCBpbml0aWFs aXppbmcgdGhlIGhhcmR3YXJlLAo+ICsgKiBzZXR0aW5nIHVwIHRoZSBJUlEsIGFuZCBpbml0aWFs aXppbmcgdGhlIEREQyBhZGFwdGVyIGFuZCBicmlkZ2Ugc3RydWN0Lgo+ICsgKiBJdCByZXR1cm5z IGEgcG9pbnRlciB0byB0aGUgaW5ub19oZG1pIHN0cnVjdCBvbiBzdWNjZXNzLCBvciBhbiBFUlJf UFRSCj4gKyAqIG9uIGZhaWx1cmUuCj4gKyAqCj4gKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBi eSBtb2Rlcm4sIGRlY291cGxlZCBNRkQvZ2x1ZSBkcml2ZXJzLiBJdCByZWdpc3RlcnMKPiArICog dGhlIGJyaWRnZSBidXQgZG9lcyBub3QgYXR0YWNoIGl0Lgo+ICsgKi8KPiArc3RydWN0IGlubm9f aGRtaSAqaW5ub19oZG1pX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCj4gKwkJ CQkgIGNvbnN0IHN0cnVjdCBpbm5vX2hkbWlfcGxhdF9kYXRhICpwbGF0X2RhdGEpCj4gIHsKCltT ZXZlcml0eTogSGlnaF0KVGhpcyBpc24ndCBhIGJ1ZyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2gs IGJ1dCB1c2luZyBkZXZtXyBBUElzIGluIHRoZQpjb21wb25lbnQgYmluZCBwaGFzZSAobm93IG1v dmVkIHRvIGlubm9faGRtaV9wcm9iZSgpKSBjYXVzZXMgcGVybWFuZW50CnJlc291cmNlIGxlYWtz IGFuZCBicmVha3MgRVBST0JFX0RFRkVSLgoKQmVjYXVzZSBpbm5vX2hkbWlfYmluZCgpIGlzIGNh bGxlZCBmcm9tIGlubm9faGRtaV9yb2NrY2hpcF9iaW5kKCkgKGEKY29tcG9uZW50IGJpbmQgY2Fs bGJhY2spLCB0aGUgcGxhdGZvcm0gZGV2aWNlIGlzIG5vdCByZW1vdmVkIHdoZW4gYSBjb21wb25l bnQKdW5iaW5kcy4gSWYgYW5vdGhlciBjb21wb25lbnQgaW4gdGhlIERSTSBwaXBlbGluZSBkZWZl cnMsIHRoZSBkZXZtXyByZXNvdXJjZXMKYXJlIG5vdCBmcmVlZC4KClN1YnNlcXVlbnQgYmluZCBh dHRlbXB0cyB3aWxsIGZhaWwgd2l0aCAtRUJVU1kgd2hlbiByZS1yZXF1ZXN0aW5nIHRoZSBJUlEg b3IKSS9PIHJlZ2lvbnM6Cgpkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2lubm8taGRtaS5jOmlubm9f aGRtaV9wcm9iZSgpIHsKICAgIC4uLgogICAgcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2ly cShkZXYsIGlycSwgaW5ub19oZG1pX2hhcmRpcnEsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGlubm9faGRtaV9pcnEsIElSUUZfU0hBUkVELAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBkZXZfbmFtZShkZXYpLCBoZG1pKTsKICAgIC4uLgp9CgpTaG91bGQg dGhpcyBkcml2ZXIgYmUgY29udmVydGVkIHRvIHJlcXVlc3QgcmVzb3VyY2VzIGR1cmluZyB0aGUg YWN0dWFsIHByb2JlCnBoYXNlIHJhdGhlciB0aGFuIGJpbmQ/CgpbIC4uLiBdCgo+ICtzdHJ1Y3Qg aW5ub19oZG1pICppbm5vX2hkbWlfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gKwkJCQkgc3Ry dWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAo+ICsJCQkJIGNvbnN0IHN0cnVjdCBpbm5vX2hkbWlf cGxhdF9kYXRhICpwbGF0X2RhdGEpCj4gK3sKPiArCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKPiArCXN0cnVjdCBpbm5vX2hkbWkgKmhkbWk7 Cj4gKwlpbnQgcmV0Owo+ICsKPiArCWhkbWkgPSBpbm5vX2hkbWlfcHJvYmUocGRldiwgcGxhdF9k YXRhKTsKPiArCWlmIChJU19FUlIoaGRtaSkpCj4gKwkJcmV0dXJuIGhkbWk7Cj4gKwo+ICsJcmV0 ID0gZHJtX2JyaWRnZV9hdHRhY2goZW5jb2RlciwgJmhkbWktPmJyaWRnZSwgTlVMTCwKPiArCQkJ CURSTV9CUklER0VfQVRUQUNIX05PX0NPTk5FQ1RPUik7CgpbU2V2ZXJpdHk6IEhpZ2hdClRoaXMg aXMgYSBwcmUtZXhpc3RpbmcgaXNzdWUsIGJ1dCB0aGlzIHJlZmFjdG9yaW5nIHNpZ25pZmljYW50 bHkgd2lkZW5zIHRoZSByYWNlCndpbmRvdyBmb3IgYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2Uu IFRoZSBob3RwbHVnIGludGVycnVwdCBoYW5kbGVyIGNhbiBmaXJlCmJlZm9yZSB0aGUgYnJpZGdl IGlzIGF0dGFjaGVkLgoKaW5ub19oZG1pX3Byb2JlKCkgdW5tYXNrcyB0aGUgSFBEIGludGVycnVw dCBhbmQgcmVnaXN0ZXJzIHRoZSBJUlEgaGFuZGxlciB3aXRoCmRldm1fcmVxdWVzdF90aHJlYWRl ZF9pcnEoKS4gSWYgYSBtb25pdG9yIGlzIHBoeXNpY2FsbHkgY29ubmVjdGVkLCB0aGUKaW50ZXJy dXB0IGNhbiBmaXJlIGltbWVkaWF0ZWx5LgoKVGhlIElSUSBoYW5kbGVyIHRoZW4gYXR0ZW1wdHMg dG8gZGVyZWZlcmVuY2UgaGRtaS0+YnJpZGdlLmRldjoKCmRyaXZlcnMvZ3B1L2RybS9icmlkZ2Uv aW5uby1oZG1pLmM6aW5ub19oZG1pX2lycSgpIHsKICAgIC4uLgogICAgZHJtX2hlbHBlcl9ocGRf aXJxX2V2ZW50KGhkbWktPmJyaWRnZS5kZXYpOwogICAgLi4uCn0KCkhvd2V2ZXIsIGhkbWktPmJy aWRnZS5kZXYgaXMgb25seSBhc3NpZ25lZCB3aGVuIGRybV9icmlkZ2VfYXR0YWNoKCkgaXMgY2Fs bGVkLgpTaW5jZSB0aGlzIHBhdGNoIGRlY291cGxlcyBwcm9iZSBmcm9tIGF0dGFjaCBmb3IgbW9k ZXJuIE1GRC9nbHVlIGRyaXZlcnMsIHRoZQphdHRhY2ggcGhhc2UgaGFwcGVucyBtdWNoIGxhdGVy LCBsZWF2aW5nIGEgZGFuZ2Vyb3VzIHJhY2Ugd2luZG93LgoKU2hvdWxkIHRoZSBJUlEgcmVnaXN0 cmF0aW9uIGJlIG1vdmVkIHRvIGFmdGVyIHRoZSBicmlkZ2UgaXMgYXR0YWNoZWQsIG9yIHNob3Vs ZAp0aGUgSVJRIGhhbmRsZXIgY2hlY2sgaWYgdGhlIGJyaWRnZSBpcyBhdHRhY2hlZCBiZWZvcmUg cHJvY2VlZGluZz8KCi0tIApTYXNoaWtvIEFJIHJldmlldyDCtyBodHRwczovL3Nhc2hpa28uZGV2 LyMvcGF0Y2hzZXQvMjAyNjA5MDQtamg3MTEwLWNsZWFuLXNlbmQtdjMtMC00ODRmOWFlNzI3MTVA c2Ftc3VuZy5jb20/cGFydD03CgotLSAKbGludXgtcGh5IG1haWxpbmcgbGlzdApsaW51eC1waHlA bGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwczovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9s aXN0aW5mby9saW51eC1waHkK