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 E345834FF74; Tue, 1 Sep 2026 15:58:44 +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=1788278326; cv=none; b=pGD9vmYS9Ct5VGuD1lmbH2b2o1e62QZI/FQUMSqH8QsPdkFP8mrXLw0+x5mIDQDol0iPq7XClcWUqu9REHlJHULHuNp6SkioUJHGNMf48iOm3i75m/rN+ADpwB3xkQBptPeK36j0xCEknk7Vf04FmvfAtlv9+Yozf5iZm85lxUQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788278326; c=relaxed/simple; bh=xgUcfwuLD2235xRbvvfCNAwIjpmWobPk2FbgQfVNMKo=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=mQKRUxcGcWkImSK8hJkGD+znPdiyqGbN7cvW90GyBknl3bBqZWH0KCAkgbTL+V18yxRjnAdDHAURtCGRMoXVcqSjoreeDglZm5EwUBUT8xz3isosPku9SdexaBePjVJ7ZAHBqUyrthnrzKLcncOTGCIf9nx0bnHX+vJzE1l3NrY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TT45qC47; 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="TT45qC47" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 00B2B1F000E9; Tue, 1 Sep 2026 15:58:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788278324; bh=M43OAN8l1nYO1zD2yvmzenQEcmoNg8EPMdD61wfp1PA=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=TT45qC47Wa8fvW4pU5u5Vkigw74cs87JU7vD5drs6ndn6ZIPcN2S8mZngbojYYdHP Put2oHSgbsydo8uIO24sAPz+6R9jF+Pua/hlMFSIiVe6AJ+A6dhMMJcv873efyPjMs 9UT/m0QeV03up7SfJvKppX5XZO/Be5kbuZawM5hCULZ6/90Rb7y0Bsx0ZZBzN7cGT3 cgrbSV2p5QwZ6UYuX5/qJtMZ3jJ0Z5+AUp7/ehdyspH/yaX7Y8ucPjMoFUb0dAjdoi EgEJmSNp4EWFnDZwh+wAIrmN/RLunFs4vF8LrBLo1FHlHfycahFshbwFfQf+1bD1nI FZhDk09yvb4SQ== From: sashiko-bot@kernel.org Subject: Re: [PATCH v10 4/6] thermal: khadas-mcu-fan: Add fan config from platform data Add regulator support Reply-To: sashiko-reviews@lists.linux.dev To: "Ronald Claveau" Cc: neil.armstrong@linaro.org, devicetree@vger.kernel.org, mfd@lists.linux.dev, linux-amlogic@lists.infradead.org, lee@kernel.org, robh@kernel.org, conor+dt@kernel.org In-Reply-To: <20260901-add-mcu-fan-khadas-vim4-v10-4-aecdb9955a30@aliel.fr> References: <20260901-add-mcu-fan-khadas-vim4-v10-0-aecdb9955a30@aliel.fr> <20260901-add-mcu-fan-khadas-vim4-v10-4-aecdb9955a30@aliel.fr> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Tue, 01 Sep 2026 15:58:43 +0000 Message-Id: <20260901155844.00B2B1F000E9@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 4 potential issue(= s) to consider: - [High] Direct assignment of `dev->of_node` without `of_node_get()` causes= a reference count underflow and use-after-free on device removal. - [Medium] State desynchronization on `khadas_mcu_fan_suspend` error path l= eaves the fan permanently disabled. - [Medium] Unchecked platform data pointer dereference causes a potential k= ernel panic. - [Medium] Rolling back `regulator_enable` in the `khadas_mcu_fan_resume` e= rror path causes a regulator enable count underflow on driver unbind. -- commit 48a15d3c23acef32291aa52062459e22677349e6 Author: Ronald Claveau thermal: khadas-mcu-fan: Add fan config from platform data Add regulator su= pport This commit reads the fan register and level table from platform data inste= ad of hardcoding them. It also introduces regulator support for the fan's power supply during probe, resume, and suspend. > diff --git a/drivers/thermal/khadas_mcu_fan.c b/drivers/thermal/khadas_mc= u_fan.c > index 21b3d0a71bd0d..512a6f0ff7c26 100644 > --- a/drivers/thermal/khadas_mcu_fan.c > +++ b/drivers/thermal/khadas_mcu_fan.c [ ... ] > @@ -76,22 +82,53 @@ static const struct thermal_cooling_device_ops khadas= _mcu_fan_cooling_ops =3D { > .set_cur_state =3D khadas_mcu_fan_set_cur_state, > }; > =20 > +static void khadas_mcu_fan_regulator_disable(void *data) > +{ > + struct regulator *power =3D data; > + > + regulator_disable(power); > +} > + > static int khadas_mcu_fan_probe(struct platform_device *pdev) > { > + const struct khadas_mcu_fan_pdata *pdata =3D dev_get_platdata(&pdev->de= v); > struct khadas_mcu *mcu =3D dev_get_drvdata(pdev->dev.parent); > struct thermal_cooling_device *cdev; > struct device *dev =3D &pdev->dev; > struct khadas_mcu_fan_ctx *ctx; > int ret; > =20 > + > + if (!dev->of_node) > + dev->of_node =3D dev->parent->of_node; [Severity: High] Does this code cause a reference count underflow and use-after-free on devi= ce removal? By assigning dev->of_node without incrementing the reference count via of_node_get(), the driver core's unconditional of_node_put(dev->of_node) on unbind could underflow the parent's reference count. > + > ctx =3D devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); > if (!ctx) > return -ENOMEM; > + > ctx->mcu =3D mcu; > + ctx->fan_reg =3D pdata->fan_reg; [Severity: Medium] Could this code cause a NULL pointer dereference? If the device is manually instantiated (e.g. via sysfs or a DT overlay) without providing the required platform data, dev_get_platdata() returns NULL, which is then unconditional= ly dereferenced here. > + ctx->levels =3D pdata->levels; > + ctx->nlevels =3D pdata->nlevels; > + > + ctx->power =3D devm_regulator_get(dev, "fan"); > + if (IS_ERR(ctx->power)) > + return PTR_ERR(ctx->power); > + > + ret =3D regulator_enable(ctx->power); > + if (ret) { > + dev_err(dev, "Failed to enable fan power supply: %d\n", ret); > + return ret; > + } > + > + ret =3D devm_add_action_or_reset(dev, khadas_mcu_fan_regulator_disable,= ctx->power); > + if (ret) > + return ret; > + > platform_set_drvdata(pdev, ctx); [ ... ] > #ifdef CONFIG_PM_SLEEP > static int khadas_mcu_fan_suspend(struct device *dev) > { > struct khadas_mcu_fan_ctx *ctx =3D dev_get_drvdata(dev); > - unsigned int level_save =3D ctx->level; > int ret; > =20 > - ret =3D khadas_mcu_fan_set_level(ctx, 0); > + ret =3D khadas_mcu_fan_set_level(ctx, ctx->levels[0]); > if (ret) > return ret; > =20 > - ctx->level =3D level_save; > - > - return 0; > + return regulator_disable(ctx->power); [Severity: Medium] If regulator_disable() fails here, the PM core aborts system suspend, and t= he resume callback will not be executed. Because the fan was successfully tur= ned off via khadas_mcu_fan_set_level(), but ctx->level was not updated to refle= ct this, will the thermal framework later fail to restore the correct fan state due to evaluating state =3D=3D ctx->level in khadas_mcu_fan_set_cur_state()? > } > =20 > static int khadas_mcu_fan_resume(struct device *dev) > { > struct khadas_mcu_fan_ctx *ctx =3D dev_get_drvdata(dev); > + int ret, ret2; > + > + ret =3D regulator_enable(ctx->power); > + if (ret) > + return ret; > =20 > - return khadas_mcu_fan_set_level(ctx, ctx->level); > + ret =3D khadas_mcu_fan_set_level(ctx, ctx->levels[ctx->level]); > + if (ret) { > + ret2 =3D regulator_disable(ctx->power); [Severity: Medium] Does rolling back the regulator state here cause an enable count underflow on driver unbind? Because khadas_mcu_fan_probe() registered an unconditional cleanup action via devm_add_action_or_reset(dev, khadas_mcu_fan_regulator_disable, ctx->po= wer), calling regulator_disable() here leaves the regulator disabled while the de= vice remains bound. When the device is later unbound, the devm action will call regulator_disable() again on the already disabled regulator. > + if (ret2) > + dev_err(dev, "failed to disable regulator after error %d: %d\n", ret, > + ret2); > + return ret; > + } > + > + return 0; > } > #endif --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260901-add-mcu-fa= n-khadas-vim4-v10-0-aecdb9955a30@aliel.fr?part=3D4 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 E5710C624D3 for ; Tue, 1 Sep 2026 15:58:53 +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=LNJ5/vTJ2wgQ4zXSe1PzBeU0+AmvhKwmTcUIbOz0YYM=; b=htu5E0KJSk60Lq 4Dg2trWcGoqzOY9n4oNMJZNa8Xa/xsR2Ras8c3EVCvWEvoFC69YOoU9AvbFRqenBenQYtGPKwWAuT 7M54erYaK0XD2YEmBWxbdCvVPjpSuZWDcYLTYCJqbDAlFSbqJue99coT3ZUuc63sqIFy13TrMc4SZ JyL+tZQ3WKJDGpvQh79Q5gbuzzyxddjY10bi+mZ7CQ9qXqIuWq2JWDx2qR14hwCgFUJ+rM6nsXXZx t+OCUi2c95mESBWN8+3SvPOfEN11jv/ybs/lYTgAUpxHMLL5C5Z3JQRS7qML40BGE4GrPE+pp76Ip 2hL9doVVanJ2ESR1KyeQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1x1Qso-0000000Cbbr-11OA; Tue, 01 Sep 2026 15:58:46 +0000 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1x1Qsm-0000000CbbT-3P3Q for linux-amlogic@lists.infradead.org; Tue, 01 Sep 2026 15:58:44 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 928EA43586; Tue, 1 Sep 2026 15:58:44 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 00B2B1F000E9; Tue, 1 Sep 2026 15:58:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788278324; bh=M43OAN8l1nYO1zD2yvmzenQEcmoNg8EPMdD61wfp1PA=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=TT45qC47Wa8fvW4pU5u5Vkigw74cs87JU7vD5drs6ndn6ZIPcN2S8mZngbojYYdHP Put2oHSgbsydo8uIO24sAPz+6R9jF+Pua/hlMFSIiVe6AJ+A6dhMMJcv873efyPjMs 9UT/m0QeV03up7SfJvKppX5XZO/Be5kbuZawM5hCULZ6/90Rb7y0Bsx0ZZBzN7cGT3 cgrbSV2p5QwZ6UYuX5/qJtMZ3jJ0Z5+AUp7/ehdyspH/yaX7Y8ucPjMoFUb0dAjdoi EgEJmSNp4EWFnDZwh+wAIrmN/RLunFs4vF8LrBLo1FHlHfycahFshbwFfQf+1bD1nI FZhDk09yvb4SQ== From: sashiko-bot@kernel.org Subject: Re: [PATCH v10 4/6] thermal: khadas-mcu-fan: Add fan config from platform data Add regulator support To: "Ronald Claveau" Cc: neil.armstrong@linaro.org, devicetree@vger.kernel.org, mfd@lists.linux.dev, linux-amlogic@lists.infradead.org, lee@kernel.org, robh@kernel.org, conor+dt@kernel.org In-Reply-To: <20260901-add-mcu-fan-khadas-vim4-v10-4-aecdb9955a30@aliel.fr> References: <20260901-add-mcu-fan-khadas-vim4-v10-0-aecdb9955a30@aliel.fr> <20260901-add-mcu-fan-khadas-vim4-v10-4-aecdb9955a30@aliel.fr> Date: Tue, 01 Sep 2026 15:58:43 +0000 Message-Id: <20260901155844.00B2B1F000E9@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 NCBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW0hpZ2hdIERpcmVjdCBhc3NpZ25t ZW50IG9mIGBkZXYtPm9mX25vZGVgIHdpdGhvdXQgYG9mX25vZGVfZ2V0KClgIGNhdXNlcyBhIHJl ZmVyZW5jZSBjb3VudCB1bmRlcmZsb3cgYW5kIHVzZS1hZnRlci1mcmVlIG9uIGRldmljZSByZW1v dmFsLgotIFtNZWRpdW1dIFN0YXRlIGRlc3luY2hyb25pemF0aW9uIG9uIGBraGFkYXNfbWN1X2Zh bl9zdXNwZW5kYCBlcnJvciBwYXRoIGxlYXZlcyB0aGUgZmFuIHBlcm1hbmVudGx5IGRpc2FibGVk LgotIFtNZWRpdW1dIFVuY2hlY2tlZCBwbGF0Zm9ybSBkYXRhIHBvaW50ZXIgZGVyZWZlcmVuY2Ug Y2F1c2VzIGEgcG90ZW50aWFsIGtlcm5lbCBwYW5pYy4KLSBbTWVkaXVtXSBSb2xsaW5nIGJhY2sg YHJlZ3VsYXRvcl9lbmFibGVgIGluIHRoZSBga2hhZGFzX21jdV9mYW5fcmVzdW1lYCBlcnJvciBw YXRoIGNhdXNlcyBhIHJlZ3VsYXRvciBlbmFibGUgY291bnQgdW5kZXJmbG93IG9uIGRyaXZlciB1 bmJpbmQuCi0tCgpjb21taXQgNDhhMTVkM2MyM2FjZWYzMjI5MWFhNTIwNjI0NTllMjI2NzczNDll NgpBdXRob3I6IFJvbmFsZCBDbGF2ZWF1IDxsaW51eC1rZXJuZWwtZGV2QGFsaWVsLmZyPgoKdGhl cm1hbDoga2hhZGFzLW1jdS1mYW46IEFkZCBmYW4gY29uZmlnIGZyb20gcGxhdGZvcm0gZGF0YSBB ZGQgcmVndWxhdG9yIHN1cHBvcnQKClRoaXMgY29tbWl0IHJlYWRzIHRoZSBmYW4gcmVnaXN0ZXIg YW5kIGxldmVsIHRhYmxlIGZyb20gcGxhdGZvcm0gZGF0YSBpbnN0ZWFkCm9mIGhhcmRjb2Rpbmcg dGhlbS4gSXQgYWxzbyBpbnRyb2R1Y2VzIHJlZ3VsYXRvciBzdXBwb3J0IGZvciB0aGUgZmFuJ3Mg cG93ZXIKc3VwcGx5IGR1cmluZyBwcm9iZSwgcmVzdW1lLCBhbmQgc3VzcGVuZC4KCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9raGFkYXNfbWN1X2Zhbi5jIGIvZHJpdmVycy90aGVybWFs L2toYWRhc19tY3VfZmFuLmMKPiBpbmRleCAyMWIzZDBhNzFiZDBkLi41MTJhNmYwZmY3YzI2IDEw MDY0NAo+IC0tLSBhL2RyaXZlcnMvdGhlcm1hbC9raGFkYXNfbWN1X2Zhbi5jCj4gKysrIGIvZHJp dmVycy90aGVybWFsL2toYWRhc19tY3VfZmFuLmMKClsgLi4uIF0KCj4gQEAgLTc2LDIyICs4Miw1 MyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIGtoYWRh c19tY3VfZmFuX2Nvb2xpbmdfb3BzID0gewo+ICAJLnNldF9jdXJfc3RhdGUgPSBraGFkYXNfbWN1 X2Zhbl9zZXRfY3VyX3N0YXRlLAo+ICB9Owo+ICAKPiArc3RhdGljIHZvaWQga2hhZGFzX21jdV9m YW5fcmVndWxhdG9yX2Rpc2FibGUodm9pZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IHJlZ3VsYXRv ciAqcG93ZXIgPSBkYXRhOwo+ICsKPiArCXJlZ3VsYXRvcl9kaXNhYmxlKHBvd2VyKTsKPiArfQo+ ICsKPiAgc3RhdGljIGludCBraGFkYXNfbWN1X2Zhbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2KQo+ICB7Cj4gKwljb25zdCBzdHJ1Y3Qga2hhZGFzX21jdV9mYW5fcGRhdGEgKnBk YXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKPiAgCXN0cnVjdCBraGFkYXNfbWN1 ICptY3UgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Cj4gIAlzdHJ1Y3QgdGhl cm1hbF9jb29saW5nX2RldmljZSAqY2RldjsKPiAgCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2 LT5kZXY7Cj4gIAlzdHJ1Y3Qga2hhZGFzX21jdV9mYW5fY3R4ICpjdHg7Cj4gIAlpbnQgcmV0Owo+ ICAKPiArCj4gKwlpZiAoIWRldi0+b2Zfbm9kZSkKPiArCQlkZXYtPm9mX25vZGUgPSBkZXYtPnBh cmVudC0+b2Zfbm9kZTsKCltTZXZlcml0eTogSGlnaF0KRG9lcyB0aGlzIGNvZGUgY2F1c2UgYSBy ZWZlcmVuY2UgY291bnQgdW5kZXJmbG93IGFuZCB1c2UtYWZ0ZXItZnJlZSBvbiBkZXZpY2UKcmVt b3ZhbD8gIEJ5IGFzc2lnbmluZyBkZXYtPm9mX25vZGUgd2l0aG91dCBpbmNyZW1lbnRpbmcgdGhl IHJlZmVyZW5jZSBjb3VudAp2aWEgb2Zfbm9kZV9nZXQoKSwgdGhlIGRyaXZlciBjb3JlJ3MgdW5j b25kaXRpb25hbCBvZl9ub2RlX3B1dChkZXYtPm9mX25vZGUpCm9uIHVuYmluZCBjb3VsZCB1bmRl cmZsb3cgdGhlIHBhcmVudCdzIHJlZmVyZW5jZSBjb3VudC4KCj4gKwo+ICAJY3R4ID0gZGV2bV9r emFsbG9jKGRldiwgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKPiAgCWlmICghY3R4KQo+ICAJ CXJldHVybiAtRU5PTUVNOwo+ICsKPiAgCWN0eC0+bWN1ID0gbWN1Owo+ICsJY3R4LT5mYW5fcmVn ID0gcGRhdGEtPmZhbl9yZWc7CgpbU2V2ZXJpdHk6IE1lZGl1bV0KQ291bGQgdGhpcyBjb2RlIGNh dXNlIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlPyAgSWYgdGhlIGRldmljZSBpcyBtYW51YWxs eQppbnN0YW50aWF0ZWQgKGUuZy4gdmlhIHN5c2ZzIG9yIGEgRFQgb3ZlcmxheSkgd2l0aG91dCBw cm92aWRpbmcgdGhlIHJlcXVpcmVkCnBsYXRmb3JtIGRhdGEsIGRldl9nZXRfcGxhdGRhdGEoKSBy ZXR1cm5zIE5VTEwsIHdoaWNoIGlzIHRoZW4gdW5jb25kaXRpb25hbGx5CmRlcmVmZXJlbmNlZCBo ZXJlLgoKPiArCWN0eC0+bGV2ZWxzID0gcGRhdGEtPmxldmVsczsKPiArCWN0eC0+bmxldmVscyA9 IHBkYXRhLT5ubGV2ZWxzOwo+ICsKPiArCWN0eC0+cG93ZXIgPSBkZXZtX3JlZ3VsYXRvcl9nZXQo ZGV2LCAiZmFuIik7Cj4gKwlpZiAoSVNfRVJSKGN0eC0+cG93ZXIpKQo+ICsJCXJldHVybiBQVFJf RVJSKGN0eC0+cG93ZXIpOwo+ICsKPiArCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoY3R4LT5wb3dl cik7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIGZh biBwb3dlciBzdXBwbHk6ICVkXG4iLCByZXQpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ ICsJcmV0ID0gZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0KGRldiwga2hhZGFzX21jdV9mYW5fcmVn dWxhdG9yX2Rpc2FibGUsIGN0eC0+cG93ZXIpOwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0 Owo+ICsKPiAgCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGN0eCk7CgpbIC4uLiBdCgo+ICAj aWZkZWYgQ09ORklHX1BNX1NMRUVQCj4gIHN0YXRpYyBpbnQga2hhZGFzX21jdV9mYW5fc3VzcGVu ZChzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gIHsKPiAgCXN0cnVjdCBraGFkYXNfbWN1X2Zhbl9jdHgg KmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+IC0JdW5zaWduZWQgaW50IGxldmVsX3NhdmUg PSBjdHgtPmxldmVsOwo+ICAJaW50IHJldDsKPiAgCj4gLQlyZXQgPSBraGFkYXNfbWN1X2Zhbl9z ZXRfbGV2ZWwoY3R4LCAwKTsKPiArCXJldCA9IGtoYWRhc19tY3VfZmFuX3NldF9sZXZlbChjdHgs IGN0eC0+bGV2ZWxzWzBdKTsKPiAgCWlmIChyZXQpCj4gIAkJcmV0dXJuIHJldDsKPiAgCj4gLQlj dHgtPmxldmVsID0gbGV2ZWxfc2F2ZTsKPiAtCj4gLQlyZXR1cm4gMDsKPiArCXJldHVybiByZWd1 bGF0b3JfZGlzYWJsZShjdHgtPnBvd2VyKTsKCltTZXZlcml0eTogTWVkaXVtXQpJZiByZWd1bGF0 b3JfZGlzYWJsZSgpIGZhaWxzIGhlcmUsIHRoZSBQTSBjb3JlIGFib3J0cyBzeXN0ZW0gc3VzcGVu ZCwgYW5kIHRoZQpyZXN1bWUgY2FsbGJhY2sgd2lsbCBub3QgYmUgZXhlY3V0ZWQuICBCZWNhdXNl IHRoZSBmYW4gd2FzIHN1Y2Nlc3NmdWxseSB0dXJuZWQKb2ZmIHZpYSBraGFkYXNfbWN1X2Zhbl9z ZXRfbGV2ZWwoKSwgYnV0IGN0eC0+bGV2ZWwgd2FzIG5vdCB1cGRhdGVkIHRvIHJlZmxlY3QKdGhp cywgd2lsbCB0aGUgdGhlcm1hbCBmcmFtZXdvcmsgbGF0ZXIgZmFpbCB0byByZXN0b3JlIHRoZSBj b3JyZWN0IGZhbiBzdGF0ZQpkdWUgdG8gZXZhbHVhdGluZyBzdGF0ZSA9PSBjdHgtPmxldmVsIGlu IGtoYWRhc19tY3VfZmFuX3NldF9jdXJfc3RhdGUoKT8KCj4gIH0KPiAgCj4gIHN0YXRpYyBpbnQg a2hhZGFzX21jdV9mYW5fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPiAgewo+ICAJc3RydWN0 IGtoYWRhc19tY3VfZmFuX2N0eCAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gKwlpbnQg cmV0LCByZXQyOwo+ICsKPiArCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoY3R4LT5wb3dlcik7Cj4g KwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gIAo+IC0JcmV0dXJuIGtoYWRhc19tY3VfZmFu X3NldF9sZXZlbChjdHgsIGN0eC0+bGV2ZWwpOwo+ICsJcmV0ID0ga2hhZGFzX21jdV9mYW5fc2V0 X2xldmVsKGN0eCwgY3R4LT5sZXZlbHNbY3R4LT5sZXZlbF0pOwo+ICsJaWYgKHJldCkgewo+ICsJ CXJldDIgPSByZWd1bGF0b3JfZGlzYWJsZShjdHgtPnBvd2VyKTsKCltTZXZlcml0eTogTWVkaXVt XQpEb2VzIHJvbGxpbmcgYmFjayB0aGUgcmVndWxhdG9yIHN0YXRlIGhlcmUgY2F1c2UgYW4gZW5h YmxlIGNvdW50IHVuZGVyZmxvdwpvbiBkcml2ZXIgdW5iaW5kPwoKQmVjYXVzZSBraGFkYXNfbWN1 X2Zhbl9wcm9iZSgpIHJlZ2lzdGVyZWQgYW4gdW5jb25kaXRpb25hbCBjbGVhbnVwIGFjdGlvbgp2 aWEgZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0KGRldiwga2hhZGFzX21jdV9mYW5fcmVndWxhdG9y X2Rpc2FibGUsIGN0eC0+cG93ZXIpLApjYWxsaW5nIHJlZ3VsYXRvcl9kaXNhYmxlKCkgaGVyZSBs ZWF2ZXMgdGhlIHJlZ3VsYXRvciBkaXNhYmxlZCB3aGlsZSB0aGUgZGV2aWNlCnJlbWFpbnMgYm91 bmQuICBXaGVuIHRoZSBkZXZpY2UgaXMgbGF0ZXIgdW5ib3VuZCwgdGhlIGRldm0gYWN0aW9uIHdp bGwgY2FsbApyZWd1bGF0b3JfZGlzYWJsZSgpIGFnYWluIG9uIHRoZSBhbHJlYWR5IGRpc2FibGVk IHJlZ3VsYXRvci4KCj4gKwkJaWYgKHJldDIpCj4gKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRv IGRpc2FibGUgcmVndWxhdG9yIGFmdGVyIGVycm9yICVkOiAlZFxuIiwgcmV0LAo+ICsJCQkJcmV0 Mik7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiAgfQo+ICAjZW5k aWYKCi0tIApTYXNoaWtvIEFJIHJldmlldyDCtyBodHRwczovL3Nhc2hpa28uZGV2LyMvcGF0Y2hz ZXQvMjAyNjA5MDEtYWRkLW1jdS1mYW4ta2hhZGFzLXZpbTQtdjEwLTAtYWVjZGI5OTU1YTMwQGFs aWVsLmZyP3BhcnQ9NAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KbGludXgtYW1sb2dpYyBtYWlsaW5nIGxpc3QKbGludXgtYW1sb2dpY0BsaXN0cy5pbmZy YWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGlu dXgtYW1sb2dpYwo=