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 21DF5314D34 for ; Mon, 31 Aug 2026 08:33:39 +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=1788165222; cv=none; b=OBLqHClMLgWCiTz1+J7gYwUvAo9zf3hQyPtMQO9G0Fki125OYQwbNNN2rryVBCmXTodaH+QweBjz4ZKJYMEhJangLGgTJrElqoHq8eVklHqUBVQz3Ovx/T//KS/cANQDE+31c7nb0+F9DX7a+7oQDD6r3AKdpRpRcoxSsZSalR4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788165222; c=relaxed/simple; bh=RcI6wRhj02P7TjJ32TSx/hpFXqBHCnD4QV0M6wjl/Lg=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=RRCOEqGjSf9fMlAra2GC5buavf4TPhV75JW6GY/aS4fWcNdHYH8iPCnvMHB9nZKv8DFkDgL754gj7s6Tms+VQDvdhQWQws1UMqdIZUw/tMbmlHe0V32ew929qu3Koa1DEvOCNz6IDWxyo58/oKYbMvBA7hcgzpsRcoAmwzLtb9Y= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=B00cIkIX; 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="B00cIkIX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3DBE21F000E9; Mon, 31 Aug 2026 08:33:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788165219; bh=m4pOkBCmKudy6mOP+T/3a7PCG1EVTyrJizKZ0FrPTBY=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=B00cIkIXITodMK4f9k8ZodBWB476rC+lGuESSvGcqtgeDIAjhDf5FzeMHRQoKemHk 963mYIK8I00xxTViUqOc6tJjv+7KJ0TzBawhEFOaZkY1YIjzbu7gpTEVRo+joRFBYV p1HUvfvcZLy1yV11OPbOkie/8ZLeScYjngGqH7Zf0K1SFeE3R9yaQxaX1rTmwqzDnP Jh2Ol5Rbb9SJe56Oe29Rwzx5gfgUqoTrtd6nKJcJ+CSdF0ukGAeKk26GQ3TE+bnt8X jsEUp/LSHuKF81CRVGQUoZY866Pqq3sXMxaxKjgGVEGxRSu+0avTgzoKpfRh6fO5WU IaI76oVEci81Q== From: sashiko-bot@kernel.org Subject: Re: [PATCH v1 2/4] phy: cix: Add CIX Sky1 USB3 PHY driver Reply-To: sashiko-reviews@lists.linux.dev To: "Hongliang Yang" Cc: linux-phy@lists.infradead.org, robh@kernel.org, conor+dt@kernel.org, devicetree@vger.kernel.org, vkoul@kernel.org, neil.armstrong@linaro.org, olteanv@gmail.com In-Reply-To: <20260831082309.3854507-3-hongliang.yang@cixtech.com> References: <20260831082309.3854507-1-hongliang.yang@cixtech.com> <20260831082309.3854507-3-hongliang.yang@cixtech.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Mon, 31 Aug 2026 08:33:38 +0000 Message-Id: <20260831083339.3DBE21F000E9@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 6 potential issue(= s) to consider: - [High] Uninitialized pointer dereference and double-free of OF node refer= ence on probe error path. - [High] The probe function fails to propagate error codes and always retur= ns 0 (success) on failure paths. - [High] Missing cleanup for dynamically allocated `phy_lookup` entries cau= ses a memory leak and Use-After-Free. - [High] Hardware resets are unconditionally asserted without locking after= the PHY provider is registered, creating a race condition with consumer in= itialization. - [Medium] The error path in `sky1_u3phy_init` mistakenly deasserts the har= dware resets instead of asserting them. - [Medium] Missing `MODULE_DEVICE_TABLE(of, ...)` macro prevents automatic = module loading. -- commit 2c8f0e43d1973dd21cdeec9d0d419e0f7d1939aa Author: Hongliang Yang phy: cix: Add CIX Sky1 USB3 PHY driver =20 This patch adds a new PHY driver for the USB3 PHY found on CIX Sky1 SoCs. The driver handles initialization, reset, and clock management for the multi-port USB3 PHY. > diff --git a/drivers/phy/cix/phy-cix-usb3.c b/drivers/phy/cix/phy-cix-usb= 3.c > new file mode 100644 > index 0000000000000..3b6e2669b09d8 > --- /dev/null > +++ b/drivers/phy/cix/phy-cix-usb3.c [ ... ] > +static int sky1_u3phy_init(struct cix_u3phy *u3phy) > +{ [ ... ] > +disable_ref_clk: > + clk_disable_unprepare(u3phy->ref_clk); > +disable_apb_clk: > + clk_disable_unprepare(u3phy->apb_clk); > +assert_reset_preset: > + reset_control_deassert(u3phy->preset); > + reset_control_deassert(u3phy->reset); [Severity: Medium] Does this error path correctly assert the reset lines?=20 The code calls reset_control_deassert() instead of reset_control_assert(), which leaves the PHY in a deasserted reset state while its clocks are disabled. This might violate the intended quiescent hardware state and could potentially lead to hardware lockups or excessive power consumption. > + u3phy->init =3D false; > + return ret; > +} [ ... ] > +static int cix_u3phy_probe(struct platform_device *pdev) > +{ [ ... ] > + device_for_each_child_node(dev, child_fn) { > + child_np =3D to_of_node(child_fn); > + if (!strncmp(fwnode_get_name(child_fn), "usb-port", 8) || > + !strncmp(fwnode_get_name(child_fn), "USB", 3)) > + phy =3D devm_phy_create(dev, child_np, &cix_u3phy_ops); > + else > + continue; > + if (IS_ERR(phy)) { > + dev_err(dev, "failed to create phy: %s\n", > + fwnode_get_name(child_fn)); > + goto put_child; [Severity: High] Does this error path intentionally return 0 instead of propagating the error code? The variable 'ret' is initialized to 0 and is not updated with the error from devm_phy_create() before jumping to the cleanup label. This causes the kernel framework to consider the driver successfully probed despite the initialization failure. > + } > + phy_set_drvdata(phy, u3phy); > + phy_create_lookup(phy, fwnode_get_name(child_fn), dev_name(dev)); [Severity: High] Is there a corresponding cleanup mechanism for this dynamically allocated phy_lookup entry?=20 The driver creates lookup entries using phy_create_lookup() but does not seem to provide a .remove callback or devres action to call phy_remove_lookup(). When the driver is unbound, devres frees the struct phy, leaving dangling pointers in the global lookup list which could cause a use-after-free for subsequent lookups by consumers. > + } > + phy_provider =3D devm_of_phy_provider_register(dev, of_phy_simple_xlate= ); > + if (IS_ERR(phy_provider)) { > + dev_err(dev, "failed to register phy provider\n"); > + goto put_child; [Severity: High] Similar to the devm_phy_create() error path, does this drop the error code from devm_of_phy_provider_register()? Additionally, does jumping to put_child here cause a double-free or a dereference of an uninitialized pointer?=20 If the device_for_each_child_node loop executed zero times, child_np is completely uninitialized. If the loop executed at least once and completed normally, child_np holds a pointer to the last child whose reference was already released by the iterator's final condition check. > + } > + reset_control_assert(u3phy->reset); > + reset_control_assert(u3phy->preset); [Severity: High] Is it safe to unconditionally assert these hardware resets here without locking after the PHY provider is registered?=20 A deferred consumer could immediately acquire the exposed PHY and call phy_init(), which initializes the PHY and deasserts resets while holding a mutex. Concurrently, this probe function unconditionally executes reset_control_assert() without holding the mutex, which might forcefully reset the active PHY hardware. > + return 0; > + > +put_child: > + of_node_put(child_np); > + return ret; > +} > + > +static const struct of_device_id cix_u3phy_dt_match[] =3D { > + { > + .compatible =3D "cix,sky1-usb3-phy", > + .data =3D &sky1_u3phy_cfg > + }, > + { /* sentinel */ } > +}; [Severity: Medium] Is the MODULE_DEVICE_TABLE(of, ...) macro missing here?=20 Without it, the driver module cannot be automatically loaded by udev or kmod based on the Device Tree compatible string. > + > +static struct platform_driver cix_usb3_phy_driver =3D { > + .probe =3D cix_u3phy_probe, > + .driver =3D { > + .name =3D "cix-usb3-phy", > + .of_match_table =3D cix_u3phy_dt_match, > + }, > +}; --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260831082309.3854= 507-1-hongliang.yang@cixtech.com?part=3D2 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 5B3F7C61DE2 for ; Mon, 31 Aug 2026 08:33:42 +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=fOGdmo7Oi+DqoUVmCWBJJScoEv8QINnWjOMBCRU+U98=; b=QY9jSY/a4+mTT0 SsC+NnNhVdxhbVn8wGKOe1CWy2GOOszpfIj4oJ+e9hVzyBBjD6ZpL33tY0PVS15lUUzhovOHgiVYm wrpfBWFNjtPxYbtMSUsueVwB/44bii22JvVlgQBsYy7pvonKPX16O6b27CZLBm3DefR/+pr60vXj3 zg9OWegc8HPWWnZTCUGVdIsFRNKI2/hrN34o7zgumjxSAsUab+bFQnVHiuxrwjQYwe1ufh3qVHuad +S2jH6j9opiYtLZfGSWmZd2pbvBpDDr++Fqt6bCYMc0tOqKAwuNDIj1WUMJoe0r1fBa9IMH1MEPY3 j4T6AYVYV2iUBdGkIysA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1x0xSY-00000008uGU-09zk; Mon, 31 Aug 2026 08:33:42 +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 1x0xSW-00000008uGM-3W3j for linux-phy@lists.infradead.org; Mon, 31 Aug 2026 08:33:40 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id 097F860120; Mon, 31 Aug 2026 08:33:40 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3DBE21F000E9; Mon, 31 Aug 2026 08:33:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788165219; bh=m4pOkBCmKudy6mOP+T/3a7PCG1EVTyrJizKZ0FrPTBY=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=B00cIkIXITodMK4f9k8ZodBWB476rC+lGuESSvGcqtgeDIAjhDf5FzeMHRQoKemHk 963mYIK8I00xxTViUqOc6tJjv+7KJ0TzBawhEFOaZkY1YIjzbu7gpTEVRo+joRFBYV p1HUvfvcZLy1yV11OPbOkie/8ZLeScYjngGqH7Zf0K1SFeE3R9yaQxaX1rTmwqzDnP Jh2Ol5Rbb9SJe56Oe29Rwzx5gfgUqoTrtd6nKJcJ+CSdF0ukGAeKk26GQ3TE+bnt8X jsEUp/LSHuKF81CRVGQUoZY866Pqq3sXMxaxKjgGVEGxRSu+0avTgzoKpfRh6fO5WU IaI76oVEci81Q== From: sashiko-bot@kernel.org Subject: Re: [PATCH v1 2/4] phy: cix: Add CIX Sky1 USB3 PHY driver To: "Hongliang Yang" Cc: linux-phy@lists.infradead.org, robh@kernel.org, conor+dt@kernel.org, devicetree@vger.kernel.org, vkoul@kernel.org, neil.armstrong@linaro.org, olteanv@gmail.com In-Reply-To: <20260831082309.3854507-3-hongliang.yang@cixtech.com> References: <20260831082309.3854507-1-hongliang.yang@cixtech.com> <20260831082309.3854507-3-hongliang.yang@cixtech.com> Date: Mon, 31 Aug 2026 08:33:38 +0000 Message-Id: <20260831083339.3DBE21F000E9@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 NiBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW0hpZ2hdIFVuaW5pdGlhbGl6ZWQg cG9pbnRlciBkZXJlZmVyZW5jZSBhbmQgZG91YmxlLWZyZWUgb2YgT0Ygbm9kZSByZWZlcmVuY2Ug b24gcHJvYmUgZXJyb3IgcGF0aC4KLSBbSGlnaF0gVGhlIHByb2JlIGZ1bmN0aW9uIGZhaWxzIHRv IHByb3BhZ2F0ZSBlcnJvciBjb2RlcyBhbmQgYWx3YXlzIHJldHVybnMgMCAoc3VjY2Vzcykgb24g ZmFpbHVyZSBwYXRocy4KLSBbSGlnaF0gTWlzc2luZyBjbGVhbnVwIGZvciBkeW5hbWljYWxseSBh bGxvY2F0ZWQgYHBoeV9sb29rdXBgIGVudHJpZXMgY2F1c2VzIGEgbWVtb3J5IGxlYWsgYW5kIFVz ZS1BZnRlci1GcmVlLgotIFtIaWdoXSBIYXJkd2FyZSByZXNldHMgYXJlIHVuY29uZGl0aW9uYWxs eSBhc3NlcnRlZCB3aXRob3V0IGxvY2tpbmcgYWZ0ZXIgdGhlIFBIWSBwcm92aWRlciBpcyByZWdp c3RlcmVkLCBjcmVhdGluZyBhIHJhY2UgY29uZGl0aW9uIHdpdGggY29uc3VtZXIgaW5pdGlhbGl6 YXRpb24uCi0gW01lZGl1bV0gVGhlIGVycm9yIHBhdGggaW4gYHNreTFfdTNwaHlfaW5pdGAgbWlz dGFrZW5seSBkZWFzc2VydHMgdGhlIGhhcmR3YXJlIHJlc2V0cyBpbnN0ZWFkIG9mIGFzc2VydGlu ZyB0aGVtLgotIFtNZWRpdW1dIE1pc3NpbmcgYE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIC4uLilg IG1hY3JvIHByZXZlbnRzIGF1dG9tYXRpYyBtb2R1bGUgbG9hZGluZy4KLS0KCmNvbW1pdCAyYzhm MGU0M2QxOTczZGQyMWNkZWVjOWQwZDQxOWUwZjdkMTkzOWFhCkF1dGhvcjogSG9uZ2xpYW5nIFlh bmcgPGhvbmdsaWFuZy55YW5nQGNpeHRlY2guY29tPgoKICAgIHBoeTogY2l4OiBBZGQgQ0lYIFNr eTEgVVNCMyBQSFkgZHJpdmVyCiAgICAKVGhpcyBwYXRjaCBhZGRzIGEgbmV3IFBIWSBkcml2ZXIg Zm9yIHRoZSBVU0IzIFBIWSBmb3VuZCBvbiBDSVggU2t5MSBTb0NzLgpUaGUgZHJpdmVyIGhhbmRs ZXMgaW5pdGlhbGl6YXRpb24sIHJlc2V0LCBhbmQgY2xvY2sgbWFuYWdlbWVudCBmb3IgdGhlCm11 bHRpLXBvcnQgVVNCMyBQSFkuCgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9jaXgvcGh5LWNp eC11c2IzLmMgYi9kcml2ZXJzL3BoeS9jaXgvcGh5LWNpeC11c2IzLmMKPiBuZXcgZmlsZSBtb2Rl IDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMDAuLjNiNmUyNjY5YjA5ZDgKPiAtLS0gL2Rldi9u dWxsCj4gKysrIGIvZHJpdmVycy9waHkvY2l4L3BoeS1jaXgtdXNiMy5jClsgLi4uIF0KPiArc3Rh dGljIGludCBza3kxX3UzcGh5X2luaXQoc3RydWN0IGNpeF91M3BoeSAqdTNwaHkpCj4gK3sKWyAu Li4gXQo+ICtkaXNhYmxlX3JlZl9jbGs6Cj4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUodTNwaHkt PnJlZl9jbGspOwo+ICtkaXNhYmxlX2FwYl9jbGs6Cj4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUo dTNwaHktPmFwYl9jbGspOwo+ICthc3NlcnRfcmVzZXRfcHJlc2V0Ogo+ICsJcmVzZXRfY29udHJv bF9kZWFzc2VydCh1M3BoeS0+cHJlc2V0KTsKPiArCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQodTNw aHktPnJlc2V0KTsKCltTZXZlcml0eTogTWVkaXVtXQpEb2VzIHRoaXMgZXJyb3IgcGF0aCBjb3Jy ZWN0bHkgYXNzZXJ0IHRoZSByZXNldCBsaW5lcz8gCgpUaGUgY29kZSBjYWxscyByZXNldF9jb250 cm9sX2RlYXNzZXJ0KCkgaW5zdGVhZCBvZiByZXNldF9jb250cm9sX2Fzc2VydCgpLAp3aGljaCBs ZWF2ZXMgdGhlIFBIWSBpbiBhIGRlYXNzZXJ0ZWQgcmVzZXQgc3RhdGUgd2hpbGUgaXRzIGNsb2Nr cyBhcmUKZGlzYWJsZWQuIFRoaXMgbWlnaHQgdmlvbGF0ZSB0aGUgaW50ZW5kZWQgcXVpZXNjZW50 IGhhcmR3YXJlIHN0YXRlIGFuZApjb3VsZCBwb3RlbnRpYWxseSBsZWFkIHRvIGhhcmR3YXJlIGxv Y2t1cHMgb3IgZXhjZXNzaXZlIHBvd2VyIGNvbnN1bXB0aW9uLgoKPiArCXUzcGh5LT5pbml0ID0g ZmFsc2U7Cj4gKwlyZXR1cm4gcmV0Owo+ICt9ClsgLi4uIF0KPiArc3RhdGljIGludCBjaXhfdTNw aHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewpbIC4uLiBdCj4gKwlk ZXZpY2VfZm9yX2VhY2hfY2hpbGRfbm9kZShkZXYsIGNoaWxkX2ZuKSB7Cj4gKwkJY2hpbGRfbnAg PSB0b19vZl9ub2RlKGNoaWxkX2ZuKTsKPiArCQlpZiAoIXN0cm5jbXAoZndub2RlX2dldF9uYW1l KGNoaWxkX2ZuKSwgInVzYi1wb3J0IiwgOCkgfHwKPiArCQkgICAgIXN0cm5jbXAoZndub2RlX2dl dF9uYW1lKGNoaWxkX2ZuKSwgIlVTQiIsIDMpKQo+ICsJCQlwaHkgPSBkZXZtX3BoeV9jcmVhdGUo ZGV2LCBjaGlsZF9ucCwgJmNpeF91M3BoeV9vcHMpOwo+ICsJCWVsc2UKPiArCQkJY29udGludWU7 Cj4gKwkJaWYgKElTX0VSUihwaHkpKSB7Cj4gKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGNy ZWF0ZSBwaHk6ICVzXG4iLAo+ICsJCQkJZndub2RlX2dldF9uYW1lKGNoaWxkX2ZuKSk7Cj4gKwkJ CWdvdG8gcHV0X2NoaWxkOwoKW1NldmVyaXR5OiBIaWdoXQpEb2VzIHRoaXMgZXJyb3IgcGF0aCBp bnRlbnRpb25hbGx5IHJldHVybiAwIGluc3RlYWQgb2YgcHJvcGFnYXRpbmcgdGhlCmVycm9yIGNv ZGU/CgpUaGUgdmFyaWFibGUgJ3JldCcgaXMgaW5pdGlhbGl6ZWQgdG8gMCBhbmQgaXMgbm90IHVw ZGF0ZWQgd2l0aCB0aGUgZXJyb3IKZnJvbSBkZXZtX3BoeV9jcmVhdGUoKSBiZWZvcmUganVtcGlu ZyB0byB0aGUgY2xlYW51cCBsYWJlbC4gVGhpcyBjYXVzZXMKdGhlIGtlcm5lbCBmcmFtZXdvcmsg dG8gY29uc2lkZXIgdGhlIGRyaXZlciBzdWNjZXNzZnVsbHkgcHJvYmVkIGRlc3BpdGUKdGhlIGlu aXRpYWxpemF0aW9uIGZhaWx1cmUuCgo+ICsJCX0KPiArCQlwaHlfc2V0X2RydmRhdGEocGh5LCB1 M3BoeSk7Cj4gKwkJcGh5X2NyZWF0ZV9sb29rdXAocGh5LCBmd25vZGVfZ2V0X25hbWUoY2hpbGRf Zm4pLCBkZXZfbmFtZShkZXYpKTsKCltTZXZlcml0eTogSGlnaF0KSXMgdGhlcmUgYSBjb3JyZXNw b25kaW5nIGNsZWFudXAgbWVjaGFuaXNtIGZvciB0aGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZApw aHlfbG9va3VwIGVudHJ5PyAKClRoZSBkcml2ZXIgY3JlYXRlcyBsb29rdXAgZW50cmllcyB1c2lu ZyBwaHlfY3JlYXRlX2xvb2t1cCgpIGJ1dCBkb2VzIG5vdApzZWVtIHRvIHByb3ZpZGUgYSAucmVt b3ZlIGNhbGxiYWNrIG9yIGRldnJlcyBhY3Rpb24gdG8gY2FsbApwaHlfcmVtb3ZlX2xvb2t1cCgp LiBXaGVuIHRoZSBkcml2ZXIgaXMgdW5ib3VuZCwgZGV2cmVzIGZyZWVzIHRoZSBzdHJ1Y3QKcGh5 LCBsZWF2aW5nIGRhbmdsaW5nIHBvaW50ZXJzIGluIHRoZSBnbG9iYWwgbG9va3VwIGxpc3Qgd2hp Y2ggY291bGQgY2F1c2UKYSB1c2UtYWZ0ZXItZnJlZSBmb3Igc3Vic2VxdWVudCBsb29rdXBzIGJ5 IGNvbnN1bWVycy4KCj4gKwl9Cj4gKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRl cl9yZWdpc3RlcihkZXYsIG9mX3BoeV9zaW1wbGVfeGxhdGUpOwo+ICsJaWYgKElTX0VSUihwaHlf cHJvdmlkZXIpKSB7Cj4gKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgcGh5IHBy b3ZpZGVyXG4iKTsKPiArCQlnb3RvIHB1dF9jaGlsZDsKCltTZXZlcml0eTogSGlnaF0KU2ltaWxh ciB0byB0aGUgZGV2bV9waHlfY3JlYXRlKCkgZXJyb3IgcGF0aCwgZG9lcyB0aGlzIGRyb3AgdGhl IGVycm9yIGNvZGUKZnJvbSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcigpPwoKQWRkaXRp b25hbGx5LCBkb2VzIGp1bXBpbmcgdG8gcHV0X2NoaWxkIGhlcmUgY2F1c2UgYSBkb3VibGUtZnJl ZSBvciBhCmRlcmVmZXJlbmNlIG9mIGFuIHVuaW5pdGlhbGl6ZWQgcG9pbnRlcj8gCgpJZiB0aGUg ZGV2aWNlX2Zvcl9lYWNoX2NoaWxkX25vZGUgbG9vcCBleGVjdXRlZCB6ZXJvIHRpbWVzLCBjaGls ZF9ucCBpcwpjb21wbGV0ZWx5IHVuaW5pdGlhbGl6ZWQuIElmIHRoZSBsb29wIGV4ZWN1dGVkIGF0 IGxlYXN0IG9uY2UgYW5kIGNvbXBsZXRlZApub3JtYWxseSwgY2hpbGRfbnAgaG9sZHMgYSBwb2lu dGVyIHRvIHRoZSBsYXN0IGNoaWxkIHdob3NlIHJlZmVyZW5jZSB3YXMKYWxyZWFkeSByZWxlYXNl ZCBieSB0aGUgaXRlcmF0b3IncyBmaW5hbCBjb25kaXRpb24gY2hlY2suCgo+ICsJfQo+ICsJcmVz ZXRfY29udHJvbF9hc3NlcnQodTNwaHktPnJlc2V0KTsKPiArCXJlc2V0X2NvbnRyb2xfYXNzZXJ0 KHUzcGh5LT5wcmVzZXQpOwoKW1NldmVyaXR5OiBIaWdoXQpJcyBpdCBzYWZlIHRvIHVuY29uZGl0 aW9uYWxseSBhc3NlcnQgdGhlc2UgaGFyZHdhcmUgcmVzZXRzIGhlcmUgd2l0aG91dApsb2NraW5n IGFmdGVyIHRoZSBQSFkgcHJvdmlkZXIgaXMgcmVnaXN0ZXJlZD8gCgpBIGRlZmVycmVkIGNvbnN1 bWVyIGNvdWxkIGltbWVkaWF0ZWx5IGFjcXVpcmUgdGhlIGV4cG9zZWQgUEhZIGFuZCBjYWxsCnBo eV9pbml0KCksIHdoaWNoIGluaXRpYWxpemVzIHRoZSBQSFkgYW5kIGRlYXNzZXJ0cyByZXNldHMg d2hpbGUgaG9sZGluZyBhCm11dGV4LiBDb25jdXJyZW50bHksIHRoaXMgcHJvYmUgZnVuY3Rpb24g dW5jb25kaXRpb25hbGx5IGV4ZWN1dGVzCnJlc2V0X2NvbnRyb2xfYXNzZXJ0KCkgd2l0aG91dCBo b2xkaW5nIHRoZSBtdXRleCwgd2hpY2ggbWlnaHQgZm9yY2VmdWxseQpyZXNldCB0aGUgYWN0aXZl IFBIWSBoYXJkd2FyZS4KCj4gKwlyZXR1cm4gMDsKPiArCj4gK3B1dF9jaGlsZDoKPiArCW9mX25v ZGVfcHV0KGNoaWxkX25wKTsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25z dCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNpeF91M3BoeV9kdF9tYXRjaFtdID0gewo+ICsJewo+ICsJ CS5jb21wYXRpYmxlID0gImNpeCxza3kxLXVzYjMtcGh5IiwKPiArCQkuZGF0YSA9ICZza3kxX3Uz cGh5X2NmZwo+ICsJfSwKPiArCXsgLyogc2VudGluZWwgKi8gfQo+ICt9OwoKW1NldmVyaXR5OiBN ZWRpdW1dCklzIHRoZSBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCAuLi4pIG1hY3JvIG1pc3Npbmcg aGVyZT8gCgpXaXRob3V0IGl0LCB0aGUgZHJpdmVyIG1vZHVsZSBjYW5ub3QgYmUgYXV0b21hdGlj YWxseSBsb2FkZWQgYnkgdWRldiBvciBrbW9kCmJhc2VkIG9uIHRoZSBEZXZpY2UgVHJlZSBjb21w YXRpYmxlIHN0cmluZy4KCj4gKwo+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjaXhf dXNiM19waHlfZHJpdmVyID0gewo+ICsJLnByb2JlCQk9IGNpeF91M3BoeV9wcm9iZSwKPiArCS5k cml2ZXIJCT0gewo+ICsJCS5uYW1lCT0gImNpeC11c2IzLXBoeSIsCj4gKwkJLm9mX21hdGNoX3Rh YmxlID0gY2l4X3UzcGh5X2R0X21hdGNoLAo+ICsJfSwKPiArfTsKCi0tIApTYXNoaWtvIEFJIHJl dmlldyDCtyBodHRwczovL3Nhc2hpa28uZGV2LyMvcGF0Y2hzZXQvMjAyNjA4MzEwODIzMDkuMzg1 NDUwNy0xLWhvbmdsaWFuZy55YW5nQGNpeHRlY2guY29tP3BhcnQ9MgoKLS0gCmxpbnV4LXBoeSBt YWlsaW5nIGxpc3QKbGludXgtcGh5QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cHM6Ly9saXN0cy5p bmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcGh5Cg==