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 6FACF481243 for ; Wed, 1 Jul 2026 12:49:35 +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=1782910176; cv=none; b=iHWH5EiPG2Kx0DTa7Qv/uevNa0j/EG1+bG7KfDFX4zI3zQ7oXEjoRmQnnspmoYlmo1dZw0g7d0nDFEdaGhQYZu6VmFpLS4kNP2c3jac0gKzi6H0+lE0XD5spbw8ecuhq8e/o+zeh+u+0FZqEbEY9xmNJEPKf0kAAczlIas669HY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782910176; c=relaxed/simple; bh=0K19coNnVeD+B2T8T5ylHUq4u9eWwT9/OFgAkiQy4Ls=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=h1WjSjQ6A4wYIVICh+90L6IWelN7yNOvgrVicvVKL6FjukhuiHzO4DDLCbl0aoSMz002E1RXn6hPWHUtiXd4fPUASK3JRZ++hJsQuWbjGb2G1rYyc4q5jMhCbmLJPFXydvGgnSArOv7Fz0dX2dVdZlW43KkXhgpP11TjrQ15kPI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kv2csqmE; 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="kv2csqmE" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 953791F000E9; Wed, 1 Jul 2026 12:49:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1782910175; bh=v3UgTfSxwXblzsiR2gHqjASTi3JdJQyKR9vyVzveb/4=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=kv2csqmEoVUHDDv3UiqHvXgnVh1j9XywRdUunm0vj3xd5PoS4NLSEB/tHsFSNby7r t0ESCSHc7ZJ/KaIZVm8qlcD/iWdR44/ivDxy/LHsL6ws2AVbSRq15FPdyxOJkcUNYj +/Hslr72fBxIrUa7JIJRnS+l20/ySl5YUnk9kNg3S3JfgBTVshNl6DGt0LrJOD3yA2 IVNDYnDotI6H4OLka1H754eX8duRdMARUWIcI1udiTlGx1C69aeb04TibDbXfYoCCr HhAqvomsBPE0yOa0wycCIdTsgTs4TavYD8W9L2+/ApmngZXVMgWP5mLHlPQoTXLEqa XhWEfb7hWscRg== From: sashiko-bot@kernel.org Subject: Re: [PATCH 07/12] phy: phy-mtk-dp: Support setting volt swing and preemphasis values Reply-To: sashiko-reviews@lists.linux.dev To: "AngeloGioacchino Del Regno" Cc: neil.armstrong@linaro.org, devicetree@vger.kernel.org, robh@kernel.org, vkoul@kernel.org, olteanv@gmail.com, dri-devel@lists.freedesktop.org, linux-phy@lists.infradead.org, conor+dt@kernel.org In-Reply-To: <20260701122008.19509-8-angelogioacchino.delregno@collabora.com> References: <20260701122008.19509-1-angelogioacchino.delregno@collabora.com> <20260701122008.19509-8-angelogioacchino.delregno@collabora.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Wed, 01 Jul 2026 12:49:33 +0000 Message-Id: <20260701124934.953791F000E9@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 3 potential issue(= s) to consider: New issues: - [High] The newly added PHYD_DP_TX_FORCE_VOLT_SWING_EN bit is never set or= cleared, causing the hardware to likely ignore the configured voltage swin= g and pre-emphasis values. - [High] Undefined behavior in `mtk_dp_phy_disable_all_lanes` when no lanes= are currently enabled. Pre-existing issues: - [High] Missing `.remove` callback leads to Use-After-Free and unbalanced = PM runtime states on module unload. -- commit 3443073c225a00d56dcccbe80409c8537773ab64 Author: AngeloGioacchino Del Regno phy: phy-mtk-dp: Support setting volt swing and preemphasis values Add support for honoring the set_voltages request to set the voltage swing and preemphasis values in the .configure() callback. It also updates the .reset() callback to clean up the newly configured values. > diff --git a/drivers/phy/mediatek/phy-mtk-dp.c b/drivers/phy/mediatek/phy= -mtk-dp.c > index a2cd22b9da066..17d871530ccaf 100644 > --- a/drivers/phy/mediatek/phy-mtk-dp.c > +++ b/drivers/phy/mediatek/phy-mtk-dp.c > @@ -235,6 +242,28 @@ static int mtk_dp_phy_configure(struct phy *phy, uni= on phy_configure_opts *opts) > PHYD_TX_LN_EN, val); > } > =20 > + if (opts->dp.set_voltages) { > + const u32 reg_drv_force =3D pdata->regs_dig_lane[DP_PHYD_LAN_DRIVING_F= ORCE]; > + > + if (opts->dp.lanes > 4) { > + dev_err(&phy->dev, "Wrong lanes config %u\n", opts->dp.lanes); > + return -EINVAL; > + } > + > + for (i =3D 0; i < opts->dp.lanes; i++) { > + const u32 off_dig_lane =3D pdata->off_dig_lane[i]; > + u32 val; > + > + val =3D FIELD_PREP(PHYD_DP_TX_FORCE_VOLT_SWING_VAL, opts->dp.voltage[= i]); > + val |=3D FIELD_PREP(PHYD_DP_TX_FORCE_PRE_EMPH_VAL, opts->dp.pre[i]); > + > + regmap_update_bits(dp_phy->regmap, off_dig_lane + reg_drv_force, > + PHYD_DP_TX_FORCE_VOLT_SWING_VAL | > + PHYD_DP_TX_FORCE_PRE_EMPH_VAL, > + val); [Severity: High] Does this override hardware configuration actually take effect? Since PHYD_DP_TX_FORCE_VOLT_SWING_EN is not included in the update mask or set in the value here, the hardware force enable bit remains unset. Will the hardware ignore these override values without the enable bit being asserted? > + } > + } > + > regmap_update_bits(dp_phy->regmap, [ ... ] > @@ -345,6 +375,15 @@ static int mtk_dp_phy_reset(struct phy *phy) > if (ret) > dev_err(dp_phy->dev, "Could not disable lanes during reset!\n"); > =20 [Severity: High] Is it possible for the loop in mtk_dp_phy_disable_all_lanes() to execute with val initially set to 0? drivers/phy/mediatek/phy-mtk-dp.c:mtk_dp_phy_disable_all_lanes() { ... /* Get mask of currently enabled lane */ val =3D FIELD_GET(PHYD_TX_LN_EN, val); /* Disable all lanes (needs to be done one by one, from last to first) = */ do { u32 lane_num =3D fls(val) - 1; val &=3D ~BIT(lane_num); ... } If no lanes are currently enabled, fls(0) - 1 evaluates to -1, which can cause undefined behavior when shifting ~BIT(-1). Should this be a while (val) loop instead of do { ... } while (val)? > + /* Reset Voltage Swing and Preemphasis values */ > + for (i =3D 0; i < MTK_DP_PHY_MAX_LANES; i++) { > + const u32 off_dig_lane =3D pdata->off_dig_lane[i]; > + > + regmap_clear_bits(dp_phy->regmap, off_dig_lane + reg_drv_force, > + PHYD_DP_TX_FORCE_VOLT_SWING_VAL | > + PHYD_DP_TX_FORCE_PRE_EMPH_VAL); [Severity: High] Does this correctly clear the override state? Similar to the configuration above, this clears the swing and pre-emphasis values but leaves the PHYD_DP_TX_FORCE_VOLT_SWING_EN bit untouched. If the force mode was enabled elsewhere, could it remain active after reset? > + } > + > return 0; > } [Severity: High] This is a pre-existing issue, but I noticed the platform driver lacks a .remove callback: static struct platform_driver mtk_dp_phy_driver =3D { .probe =3D mtk_dp_phy_probe, .driver =3D { ... }, }; During probe, pm_runtime_enable() and pm_runtime_get_sync() are called, and a phy_lookup structure is dynamically allocated via phy_create_lookup(). Because there is no .remove callback, unloading the module leaves PM runtime unbalanced and leaks the phy_lookup struct, which remains on the global phys list while pointing to a devres-freed phy device. Could this lead to a use-after-free on subsequent lookups? --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260701122008.1950= 9-1-angelogioacchino.delregno@collabora.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 7961AC43458 for ; Wed, 1 Jul 2026 12:49:37 +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=YHmwVK3MGXffQMEuCg8yQAK//b2CkqT+Ok6i2Z0SCi8=; b=taesbP166ucAOD DFxu/i7xHd1D6txliNyusRaAZP6yDyEErALO5peDyr8lSoWnQUe72rm9fmMeUtuP277/VjrFEyjnd naaEwrNXSL2z07RhbV3xAkAzCe9kmKqc3jXtCUSOxEMl/Zxjus37B6dHQ4hATWYdTqcMU/iTnth1s pp2Kc1S2E8f9OIn1qxyZezgXD1inNum1HbU1Ftif9wPnODa6vF1eBGt5tVj6z+un93c+u1jzGS6/w UPOlhcDow9/WomCFuArADzJB1mtVYLjKmBIDdruVuzcnfBskAmO3KDFmPhgMtglg/2SSA77k8zG5G PH/g6ulk9fpgGQKhaqQw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1weuNl-000000022qk-16rJ; Wed, 01 Jul 2026 12:49:37 +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 1weuNk-000000022qZ-0efE for linux-phy@lists.infradead.org; Wed, 01 Jul 2026 12:49:36 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id 5BF696001D; Wed, 1 Jul 2026 12:49:35 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 953791F000E9; Wed, 1 Jul 2026 12:49:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1782910175; bh=v3UgTfSxwXblzsiR2gHqjASTi3JdJQyKR9vyVzveb/4=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=kv2csqmEoVUHDDv3UiqHvXgnVh1j9XywRdUunm0vj3xd5PoS4NLSEB/tHsFSNby7r t0ESCSHc7ZJ/KaIZVm8qlcD/iWdR44/ivDxy/LHsL6ws2AVbSRq15FPdyxOJkcUNYj +/Hslr72fBxIrUa7JIJRnS+l20/ySl5YUnk9kNg3S3JfgBTVshNl6DGt0LrJOD3yA2 IVNDYnDotI6H4OLka1H754eX8duRdMARUWIcI1udiTlGx1C69aeb04TibDbXfYoCCr HhAqvomsBPE0yOa0wycCIdTsgTs4TavYD8W9L2+/ApmngZXVMgWP5mLHlPQoTXLEqa XhWEfb7hWscRg== From: sashiko-bot@kernel.org Subject: Re: [PATCH 07/12] phy: phy-mtk-dp: Support setting volt swing and preemphasis values To: "AngeloGioacchino Del Regno" Cc: neil.armstrong@linaro.org, devicetree@vger.kernel.org, robh@kernel.org, vkoul@kernel.org, olteanv@gmail.com, dri-devel@lists.freedesktop.org, linux-phy@lists.infradead.org, conor+dt@kernel.org In-Reply-To: <20260701122008.19509-8-angelogioacchino.delregno@collabora.com> References: <20260701122008.19509-1-angelogioacchino.delregno@collabora.com> <20260701122008.19509-8-angelogioacchino.delregno@collabora.com> Date: Wed, 01 Jul 2026 12:49:33 +0000 Message-Id: <20260701124934.953791F000E9@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 MyBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6CgpOZXcgaXNzdWVzOgotIFtIaWdoXSBU aGUgbmV3bHkgYWRkZWQgUEhZRF9EUF9UWF9GT1JDRV9WT0xUX1NXSU5HX0VOIGJpdCBpcyBuZXZl ciBzZXQgb3IgY2xlYXJlZCwgY2F1c2luZyB0aGUgaGFyZHdhcmUgdG8gbGlrZWx5IGlnbm9yZSB0 aGUgY29uZmlndXJlZCB2b2x0YWdlIHN3aW5nIGFuZCBwcmUtZW1waGFzaXMgdmFsdWVzLgotIFtI aWdoXSBVbmRlZmluZWQgYmVoYXZpb3IgaW4gYG10a19kcF9waHlfZGlzYWJsZV9hbGxfbGFuZXNg IHdoZW4gbm8gbGFuZXMgYXJlIGN1cnJlbnRseSBlbmFibGVkLgoKUHJlLWV4aXN0aW5nIGlzc3Vl czoKLSBbSGlnaF0gTWlzc2luZyBgLnJlbW92ZWAgY2FsbGJhY2sgbGVhZHMgdG8gVXNlLUFmdGVy LUZyZWUgYW5kIHVuYmFsYW5jZWQgUE0gcnVudGltZSBzdGF0ZXMgb24gbW9kdWxlIHVubG9hZC4K LS0KCmNvbW1pdCAzNDQzMDczYzIyNWEwMGQ1NmRjY2NiZTgwNDA5Yzg1Mzc3NzNhYjY0CkF1dGhv cjogQW5nZWxvR2lvYWNjaGlubyBEZWwgUmVnbm8gPGFuZ2Vsb2dpb2FjY2hpbm8uZGVscmVnbm9A Y29sbGFib3JhLmNvbT4KCnBoeTogcGh5LW10ay1kcDogU3VwcG9ydCBzZXR0aW5nIHZvbHQgc3dp bmcgYW5kIHByZWVtcGhhc2lzIHZhbHVlcwoKQWRkIHN1cHBvcnQgZm9yIGhvbm9yaW5nIHRoZSBz ZXRfdm9sdGFnZXMgcmVxdWVzdCB0byBzZXQgdGhlIHZvbHRhZ2Ugc3dpbmcKYW5kIHByZWVtcGhh c2lzIHZhbHVlcyBpbiB0aGUgLmNvbmZpZ3VyZSgpIGNhbGxiYWNrLiBJdCBhbHNvIHVwZGF0ZXMg dGhlCi5yZXNldCgpIGNhbGxiYWNrIHRvIGNsZWFuIHVwIHRoZSBuZXdseSBjb25maWd1cmVkIHZh bHVlcy4KCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L21lZGlhdGVrL3BoeS1tdGstZHAuYyBi L2RyaXZlcnMvcGh5L21lZGlhdGVrL3BoeS1tdGstZHAuYwo+IGluZGV4IGEyY2QyMmI5ZGEwNjYu LjE3ZDg3MTUzMGNjYWYgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9waHkvbWVkaWF0ZWsvcGh5LW10 ay1kcC5jCj4gKysrIGIvZHJpdmVycy9waHkvbWVkaWF0ZWsvcGh5LW10ay1kcC5jCj4gQEAgLTIz NSw2ICsyNDIsMjggQEAgc3RhdGljIGludCBtdGtfZHBfcGh5X2NvbmZpZ3VyZShzdHJ1Y3QgcGh5 ICpwaHksIHVuaW9uIHBoeV9jb25maWd1cmVfb3B0cyAqb3B0cykKPiAgCQkJCSAgIFBIWURfVFhf TE5fRU4sIHZhbCk7Cj4gIAl9Cj4gIAo+ICsJaWYgKG9wdHMtPmRwLnNldF92b2x0YWdlcykgewo+ ICsJCWNvbnN0IHUzMiByZWdfZHJ2X2ZvcmNlID0gcGRhdGEtPnJlZ3NfZGlnX2xhbmVbRFBfUEhZ RF9MQU5fRFJJVklOR19GT1JDRV07Cj4gKwo+ICsJCWlmIChvcHRzLT5kcC5sYW5lcyA+IDQpIHsK PiArCQkJZGV2X2VycigmcGh5LT5kZXYsICJXcm9uZyBsYW5lcyBjb25maWcgJXVcbiIsIG9wdHMt PmRwLmxhbmVzKTsKPiArCQkJcmV0dXJuIC1FSU5WQUw7Cj4gKwkJfQo+ICsKPiArCQlmb3IgKGkg PSAwOyBpIDwgb3B0cy0+ZHAubGFuZXM7IGkrKykgewo+ICsJCQljb25zdCB1MzIgb2ZmX2RpZ19s YW5lID0gcGRhdGEtPm9mZl9kaWdfbGFuZVtpXTsKPiArCQkJdTMyIHZhbDsKPiArCj4gKwkJCXZh bCA9IEZJRUxEX1BSRVAoUEhZRF9EUF9UWF9GT1JDRV9WT0xUX1NXSU5HX1ZBTCwgb3B0cy0+ZHAu dm9sdGFnZVtpXSk7Cj4gKwkJCXZhbCB8PSBGSUVMRF9QUkVQKFBIWURfRFBfVFhfRk9SQ0VfUFJF X0VNUEhfVkFMLCBvcHRzLT5kcC5wcmVbaV0pOwo+ICsKPiArCQkJcmVnbWFwX3VwZGF0ZV9iaXRz KGRwX3BoeS0+cmVnbWFwLCBvZmZfZGlnX2xhbmUgKyByZWdfZHJ2X2ZvcmNlLAo+ICsJCQkJCSAg IFBIWURfRFBfVFhfRk9SQ0VfVk9MVF9TV0lOR19WQUwgfAo+ICsJCQkJCSAgIFBIWURfRFBfVFhf Rk9SQ0VfUFJFX0VNUEhfVkFMLAo+ICsJCQkJCSAgIHZhbCk7CgpbU2V2ZXJpdHk6IEhpZ2hdCkRv ZXMgdGhpcyBvdmVycmlkZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGFjdHVhbGx5IHRha2UgZWZm ZWN0PwoKU2luY2UgUEhZRF9EUF9UWF9GT1JDRV9WT0xUX1NXSU5HX0VOIGlzIG5vdCBpbmNsdWRl ZCBpbiB0aGUgdXBkYXRlIG1hc2sgb3IKc2V0IGluIHRoZSB2YWx1ZSBoZXJlLCB0aGUgaGFyZHdh cmUgZm9yY2UgZW5hYmxlIGJpdCByZW1haW5zIHVuc2V0LiBXaWxsCnRoZSBoYXJkd2FyZSBpZ25v cmUgdGhlc2Ugb3ZlcnJpZGUgdmFsdWVzIHdpdGhvdXQgdGhlIGVuYWJsZSBiaXQgYmVpbmcKYXNz ZXJ0ZWQ/Cgo+ICsJCX0KPiArCX0KPiArCj4gIAlyZWdtYXBfdXBkYXRlX2JpdHMoZHBfcGh5LT5y ZWdtYXAsClsgLi4uIF0KPiBAQCAtMzQ1LDYgKzM3NSwxNSBAQCBzdGF0aWMgaW50IG10a19kcF9w aHlfcmVzZXQoc3RydWN0IHBoeSAqcGh5KQo+ICAJaWYgKHJldCkKPiAgCQlkZXZfZXJyKGRwX3Bo eS0+ZGV2LCAiQ291bGQgbm90IGRpc2FibGUgbGFuZXMgZHVyaW5nIHJlc2V0IVxuIik7Cj4gIAoK W1NldmVyaXR5OiBIaWdoXQpJcyBpdCBwb3NzaWJsZSBmb3IgdGhlIGxvb3AgaW4gbXRrX2RwX3Bo eV9kaXNhYmxlX2FsbF9sYW5lcygpIHRvIGV4ZWN1dGUKd2l0aCB2YWwgaW5pdGlhbGx5IHNldCB0 byAwPwoKZHJpdmVycy9waHkvbWVkaWF0ZWsvcGh5LW10ay1kcC5jOm10a19kcF9waHlfZGlzYWJs ZV9hbGxfbGFuZXMoKSB7CiAgICAuLi4KICAgIC8qIEdldCBtYXNrIG9mIGN1cnJlbnRseSBlbmFi bGVkIGxhbmUgKi8KICAgIHZhbCA9IEZJRUxEX0dFVChQSFlEX1RYX0xOX0VOLCB2YWwpOwoKICAg IC8qIERpc2FibGUgYWxsIGxhbmVzIChuZWVkcyB0byBiZSBkb25lIG9uZSBieSBvbmUsIGZyb20g bGFzdCB0byBmaXJzdCkgKi8KICAgIGRvIHsKICAgICAgICB1MzIgbGFuZV9udW0gPSBmbHModmFs KSAtIDE7CiAgICAgICAgdmFsICY9IH5CSVQobGFuZV9udW0pOwogICAgLi4uCn0KCklmIG5vIGxh bmVzIGFyZSBjdXJyZW50bHkgZW5hYmxlZCwgZmxzKDApIC0gMSBldmFsdWF0ZXMgdG8gLTEsIHdo aWNoIGNhbgpjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3Igd2hlbiBzaGlmdGluZyB+QklUKC0xKS4g U2hvdWxkIHRoaXMgYmUgYQp3aGlsZSAodmFsKSBsb29wIGluc3RlYWQgb2YgZG8geyAuLi4gfSB3 aGlsZSAodmFsKT8KCj4gKwkvKiBSZXNldCBWb2x0YWdlIFN3aW5nIGFuZCBQcmVlbXBoYXNpcyB2 YWx1ZXMgKi8KPiArCWZvciAoaSA9IDA7IGkgPCBNVEtfRFBfUEhZX01BWF9MQU5FUzsgaSsrKSB7 Cj4gKwkJY29uc3QgdTMyIG9mZl9kaWdfbGFuZSA9IHBkYXRhLT5vZmZfZGlnX2xhbmVbaV07Cj4g Kwo+ICsJCXJlZ21hcF9jbGVhcl9iaXRzKGRwX3BoeS0+cmVnbWFwLCBvZmZfZGlnX2xhbmUgKyBy ZWdfZHJ2X2ZvcmNlLAo+ICsJCQkJICAgUEhZRF9EUF9UWF9GT1JDRV9WT0xUX1NXSU5HX1ZBTCB8 Cj4gKwkJCQkgICBQSFlEX0RQX1RYX0ZPUkNFX1BSRV9FTVBIX1ZBTCk7CgpbU2V2ZXJpdHk6IEhp Z2hdCkRvZXMgdGhpcyBjb3JyZWN0bHkgY2xlYXIgdGhlIG92ZXJyaWRlIHN0YXRlPwoKU2ltaWxh ciB0byB0aGUgY29uZmlndXJhdGlvbiBhYm92ZSwgdGhpcyBjbGVhcnMgdGhlIHN3aW5nIGFuZCBw cmUtZW1waGFzaXMKdmFsdWVzIGJ1dCBsZWF2ZXMgdGhlIFBIWURfRFBfVFhfRk9SQ0VfVk9MVF9T V0lOR19FTiBiaXQgdW50b3VjaGVkLiBJZgp0aGUgZm9yY2UgbW9kZSB3YXMgZW5hYmxlZCBlbHNl d2hlcmUsIGNvdWxkIGl0IHJlbWFpbiBhY3RpdmUgYWZ0ZXIgcmVzZXQ/Cgo+ICsJfQo+ICsKPiAg CXJldHVybiAwOwo+ICB9CgoKW1NldmVyaXR5OiBIaWdoXQpUaGlzIGlzIGEgcHJlLWV4aXN0aW5n IGlzc3VlLCBidXQgSSBub3RpY2VkIHRoZSBwbGF0Zm9ybSBkcml2ZXIgbGFja3MgYQoucmVtb3Zl IGNhbGxiYWNrOgoKc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXRrX2RwX3BoeV9kcml2 ZXIgPSB7CgkucHJvYmUgPSBtdGtfZHBfcGh5X3Byb2JlLAoJLmRyaXZlciA9IHsgLi4uIH0sCn07 CgpEdXJpbmcgcHJvYmUsIHBtX3J1bnRpbWVfZW5hYmxlKCkgYW5kIHBtX3J1bnRpbWVfZ2V0X3N5 bmMoKSBhcmUgY2FsbGVkLCBhbmQKYSBwaHlfbG9va3VwIHN0cnVjdHVyZSBpcyBkeW5hbWljYWxs eSBhbGxvY2F0ZWQgdmlhIHBoeV9jcmVhdGVfbG9va3VwKCkuCgpCZWNhdXNlIHRoZXJlIGlzIG5v IC5yZW1vdmUgY2FsbGJhY2ssIHVubG9hZGluZyB0aGUgbW9kdWxlIGxlYXZlcyBQTSBydW50aW1l CnVuYmFsYW5jZWQgYW5kIGxlYWtzIHRoZSBwaHlfbG9va3VwIHN0cnVjdCwgd2hpY2ggcmVtYWlu cyBvbiB0aGUgZ2xvYmFsIHBoeXMKbGlzdCB3aGlsZSBwb2ludGluZyB0byBhIGRldnJlcy1mcmVl ZCBwaHkgZGV2aWNlLiBDb3VsZCB0aGlzIGxlYWQgdG8gYQp1c2UtYWZ0ZXItZnJlZSBvbiBzdWJz ZXF1ZW50IGxvb2t1cHM/CgotLSAKU2FzaGlrbyBBSSByZXZpZXcgwrcgaHR0cHM6Ly9zYXNoaWtv LmRldi8jL3BhdGNoc2V0LzIwMjYwNzAxMTIyMDA4LjE5NTA5LTEtYW5nZWxvZ2lvYWNjaGluby5k ZWxyZWdub0Bjb2xsYWJvcmEuY29tP3BhcnQ9NwoKLS0gCmxpbnV4LXBoeSBtYWlsaW5nIGxpc3QK bGludXgtcGh5QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cHM6Ly9saXN0cy5pbmZyYWRlYWQub3Jn L21haWxtYW4vbGlzdGluZm8vbGludXgtcGh5Cg==