From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out-173.mta0.migadu.com (out-173.mta0.migadu.com [91.218.175.173]) (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 8D40B13793E for ; Fri, 7 Jun 2024 17:42:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.173 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717782148; cv=none; b=UIMNeoe9mgPZzx9W9A6P7B61MDg03PzztqFAV7fotHmKPkNJx/H5fHcP6Uz9z3OLmRQ6AlqidaNGun45Dt1JXjJmEcx5RR4Uv/cH6JdRqZC1D808Rd6miUZ7hlAzPrjSXV7aOL3lUsyXkSGlC1W0JryHpOGyoRaOj5WzCt/WPM0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717782148; c=relaxed/simple; bh=bynN+NIib0bsQeGI5MBVBUe5uLLp5OUgxGpwwLregvM=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=liUN5WTUBstyC9EtBKV3cGwlInPVhNkDS9ZB1jekSl/AalC0VMKRep+1Xsn7VO0EpyaoJPUwSROsxBIzLeH/lluD4FsRNWJXHWzNdnSjt8YsUrB69bZyCBh91xODbZpwd89SNZMV2Quq9jPrxBq8gTcjnOJYSK/in4F62gM28tM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=t2ngdEcA; arc=none smtp.client-ip=91.218.175.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="t2ngdEcA" X-Envelope-To: jonathan.cameron@huawei.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1717782143; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JG4OCpshlDYBrblK4di3ak7i8MvX6N4evo+AfyS3qVs=; b=t2ngdEcATktXj3Beb0DzU1C5DaDFbWjVmCjwBUckRR0x7sE7ZgVJwmNYA4fGBjCWtrp6OC B0WF+0ENNWplZ7r1u20xojHOroKJj565uNQEMYcU45Y0xHHjqQSHPaJDtwsBjhArM3zZi1 Do05WQ6ZeEu1UAWQs3xjmo/rjo0Gz8g= X-Envelope-To: jic23@kernel.org X-Envelope-To: conall.ogriofa@amd.com X-Envelope-To: linux-iio@vger.kernel.org X-Envelope-To: linux-arm-kernel@lists.infradead.org X-Envelope-To: linux-kernel@vger.kernel.org X-Envelope-To: lars@metafoo.de Message-ID: Date: Fri, 7 Jun 2024 13:42:19 -0400 Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Subject: Re: [PATCH] iio: xilinx-ams: Don't include ams_ctrl_channels in scan_mask To: Jonathan Cameron Cc: Jonathan Cameron , "O'Griofa, Conall" , "linux-iio@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , Lars-Peter Clausen References: <20240311162800.11074-1-sean.anderson@linux.dev> <20240314154824.37150a54@jic23-huawei> <3b481539-0c9c-4110-ad03-bd252e80efb0@linux.dev> <20240316133627.5d2bf585@jic23-huawei> <7ee83f15-88fc-4530-84b7-b8ee31663dbc@linux.dev> <20240318152446.00001345@Huawei.com> <7ddf8d4a-5b68-432d-93c1-ff270403cb60@linux.dev> <20240319134258.0000574d@Huawei.com> Content-Language: en-US X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Sean Anderson In-Reply-To: <20240319134258.0000574d@Huawei.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT On 3/19/24 09:42, Jonathan Cameron wrote: > On Mon, 18 Mar 2024 11:28:49 -0400 > Sean Anderson wrote: > >> On 3/18/24 11:24, Jonathan Cameron wrote: >> > On Mon, 18 Mar 2024 11:18:43 -0400 >> > Sean Anderson wrote: >> > >> >> On 3/16/24 09:36, Jonathan Cameron wrote: >> >> > On Fri, 15 Mar 2024 13:47:40 -0400 >> >> > Sean Anderson wrote: >> >> > >> >> >> Hi Conall, >> >> >> >> >> >> On 3/15/24 09:18, O'Griofa, Conall wrote: >> >> >> > [AMD Official Use Only - General] >> >> >> > >> >> >> > Hi, >> >> >> > >> >> >> > I think there was a fix for this issue applied to the version that was running on 5.15 that didn't seem to make it into the upstream driver. >> >> >> > Please see link for reference https://github.com/Xilinx/linux-xlnx/commit/608426961f16ab149b1b699f1c35f7ad244c0720 >> >> >> > >> >> >> > I think a similar fix to the above patch is may be beneficial? >> >> >> >> >> >> These patches look functionally identical to me. >> >> > >> >> > Because there are no channels with scan index between >> >> > 22 * 2 + 16 (that patch) and 22 * 3 (your patch) that is >> >> > the effect is indeed the same. But given the issues is the >> >> > 64 limit on maximum scan index, 22 * 3 = 66 is an ugly value >> >> > to compare with. >> >> > >> >> > I'm still very against the use of scan_index for anything other >> >> > than scan indices (which is why partly how this bug wasn't noticed >> >> > in the first palce). So the check should be scan_index != -1 >> >> > and uses of those values elsewhere in the driver should be fixed >> >> > (which looks simple to do from a quick glance at the code). >> >> >> >> OK, so how do the sysfs files get named then? >> > >> > Using channel and channel2 as appropriate (+ index and modified >> > which change the meaning of channel2) - scan_index never had >> > anything to do with sysfs file names - just the value in >> > bufferX/in_xyz_scan_index >> >> I tried to prototype setting scan_index to -1, but when registering channels I saw >> >> [ 1.637049] iio iio:device0: tried to double register : in_voltage_raw >> [ 1.637245] xilinx-ams ffa50000.ams: Failed to register sysfs interfaces >> [ 1.637433] xilinx-ams: probe of ffa50000.ams failed with error -16 >> >> And AIUI .channel is filled in by ams_parse_firmware. > > Is indexed set for the channel? Check it at the point of calling > devm_iio_device_register() as the code that builds the channels in this > driver is complex, so maybe it's getting overwritten? > > There might be a core bug somewhere, but there are other drivers using > -1 scan index without hitting this problem so my first instinct is > something is getting wrongly set in the driver. Upon further review, I think scan_index should remain the same, and this patch should be applied as-is. address is the only driver-private data in all of iio_chan_spec. Unfortunately, it is suggestively named "address" and not "priv" or "driver_id" or something similar. So the original author of this driver went "Ah, I should put the channel address offsets in this register." Except, because this driver has three address spaces, this is not enough to uniquely identify the channel. So he then stuck an actual unique identifier in scan_index. Now, you may object to this since the driver doesn't actually support scans, but that is the current situation. So there is really nothing wrong with scan_index semantically in the context of the driver. We should not convert one address space's channels to use -1 scan_index, since it is used as a unique identifier elsewhere in the channel. Future patches could convert scan_index to address, and store the address offsets in an array. So e.g. reading a channel would go from e.g. if (chan->scan_index >= AMS_PS_SEQ_MAX) *val = readl(ams->pl_base + chan->address); else *val = readl(ams->ps_base + chan->address); to if (chan->address >= AMS_PS_SEQ_MAX) *val = readl(ams->pl_base + ams_chan_addr[chan->address]); else *val = readl(ams->ps_base + ams_chan_addr[chan->address]); which while strictly less perfmant due to another level of indirection does conform to existing semantics for scan_index. But TBH I don't see much point in this. But the above change would be pretty significant and has a chance of causing bugs of its own. So I would rather this bug fix be applied as-is and the scan_index semantics be modified at some other time. --Sean >> >> --Sean >> >> >> >> >> --Sean >> >> >> >> >> >> >> >> --Sean >> >> >> >> >> >> >> -----Original Message----- >> >> >> >> From: Sean Anderson >> >> >> >> Sent: Thursday, March 14, 2024 5:30 PM >> >> >> >> To: Jonathan Cameron >> >> >> >> Cc: linux-iio@vger.kernel.org; O'Griofa, Conall ; >> >> >> >> linux-arm-kernel@lists.infradead.org; linux-kernel@vger.kernel.org; Lars-Peter >> >> >> >> Clausen >> >> >> >> Subject: Re: [PATCH] iio: xilinx-ams: Don't include ams_ctrl_channels in >> >> >> >> scan_mask >> >> >> >> >> >> >> >> Caution: This message originated from an External Source. Use proper caution >> >> >> >> when opening attachments, clicking links, or responding. >> >> >> >> >> >> >> >> >> >> >> >> On 3/14/24 11:48, Jonathan Cameron wrote: >> >> >> >> > On Mon, 11 Mar 2024 12:28:00 -0400 >> >> >> >> > Sean Anderson wrote: >> >> >> >> > >> >> >> >> >> ams_enable_channel_sequence constructs a "scan_mask" for all the PS >> >> >> >> >> and PL channels. This works out fine, since scan_index for these >> >> >> >> >> channels is less than 64. However, it also includes the >> >> >> >> >> ams_ctrl_channels, where scan_index is greater than 64, triggering >> >> >> >> >> undefined behavior. Since we don't need these channels anyway, just >> >> >> >> exclude them. >> >> >> >> >> >> >> >> >> >> Fixes: d5c70627a794 ("iio: adc: Add Xilinx AMS driver") >> >> >> >> >> Signed-off-by: Sean Anderson >> >> >> >> > >> >> >> >> > Hi Sean, >> >> >> >> > >> >> >> >> > I'd ideally like to understand why we have channels with such large >> >> >> >> > scan indexes. Those values should only be used for buffered capture. >> >> >> >> > It feels like they are being abused here. Can we set them to -1 >> >> >> >> > instead and check based on that? >> >> >> >> > For a channel, a scan index of -1 means it can't be captured via the >> >> >> >> > buffered interfaces but only accessed via sysfs reads. >> >> >> >> > I think that's what we have here? >> >> >> >> >> >> >> >> From what I can tell, none of the channels support buffered reads. And we can't >> >> >> >> naïvely convert the scan_index to -1, since that causes sysfs naming conflicts >> >> >> >> (not to mention the compatibility break). >> >> >> >> >> >> >> >> > >> >> >> >> > I just feel like if we leave these as things stand, we will get bitten >> >> >> >> > by similar bugs in the future. At least with -1 it should be obvious why! >> >> >> >> >> >> >> >> There are just as likely to be bugs confusing the PL/PS subdevices... >> >> >> >> >> >> >> >> FWIW I had no trouble identifying the channels involved with this bug. >> >> >> >> >> >> >> >> --Sean >> >> >> >> >> >> >> >> > Jonathan >> >> >> >> > >> >> >> >> > >> >> >> >> >> --- >> >> >> >> >> >> >> >> >> >> drivers/iio/adc/xilinx-ams.c | 8 ++++++-- >> >> >> >> >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> >> >> >> >> >> >> >> >> diff --git a/drivers/iio/adc/xilinx-ams.c >> >> >> >> >> b/drivers/iio/adc/xilinx-ams.c index a55396c1f8b2..4de7ce598e4d >> >> >> >> >> 100644 >> >> >> >> >> --- a/drivers/iio/adc/xilinx-ams.c >> >> >> >> >> +++ b/drivers/iio/adc/xilinx-ams.c >> >> >> >> >> @@ -414,8 +414,12 @@ static void ams_enable_channel_sequence(struct >> >> >> >> >> iio_dev *indio_dev) >> >> >> >> >> >> >> >> >> >> /* Run calibration of PS & PL as part of the sequence */ >> >> >> >> >> scan_mask = BIT(0) | BIT(AMS_PS_SEQ_MAX); >> >> >> >> >> - for (i = 0; i < indio_dev->num_channels; i++) >> >> >> >> >> - scan_mask |= BIT_ULL(indio_dev->channels[i].scan_index); >> >> >> >> >> + for (i = 0; i < indio_dev->num_channels; i++) { >> >> >> >> >> + const struct iio_chan_spec *chan = >> >> >> >> >> + &indio_dev->channels[i]; >> >> >> >> >> + >> >> >> >> >> + if (chan->scan_index < AMS_CTRL_SEQ_BASE) >> >> >> >> >> + scan_mask |= BIT_ULL(chan->scan_index); >> >> >> >> >> + } >> >> >> >> >> >> >> >> >> >> if (ams->ps_base) { >> >> >> >> >> /* put sysmon in a soft reset to change the sequence */ >> >> >> >> > >> >> >> >> >> > >> >> >> >> >> > >> > 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 78B5CC27C5F for ; Fri, 7 Jun 2024 17:42:57 +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:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To: Subject:MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=pdnIeuTgHWK7ge7pxmRUtHhNfnXw8HhYyqQ78Rz4BgU=; b=S5tkN4YW77yRQj Sww2ZAXJ6xYorzF3JPmD1Bs4Ax8hhIbmrs6WIPDSORvWCf47pqOIE8enF0N+NoWpar87N80y6tTYF W4YIcm1vYbFecYjihmQbY9VvfqVWYPHziTQzKwehRVsMd8j2LEFYtcgFff1hA0qiP8NPCXKhAcaWi VpEFVPXzc3o4A/fT8dDUACziQUIRHC6XMt4Xv4xCYTOaN0zqF+HDOAl2I+eIULBPa/NCWhC1Ivmu7 aen7eBsG+Eeak6qo7V19txaOGSBId3gPrWnDpo+U2PW7e3bWVNFPKrGErdhyuPjRiDmaXI5A+CK8n ic20FK/emG607YeclO8A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sFdbr-0000000F9jk-17G2; Fri, 07 Jun 2024 17:42:39 +0000 Received: from out-184.mta0.migadu.com ([91.218.175.184]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sFdbo-0000000F9ib-0DIT for linux-arm-kernel@lists.infradead.org; Fri, 07 Jun 2024 17:42:37 +0000 X-Envelope-To: jonathan.cameron@huawei.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1717782143; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JG4OCpshlDYBrblK4di3ak7i8MvX6N4evo+AfyS3qVs=; b=t2ngdEcATktXj3Beb0DzU1C5DaDFbWjVmCjwBUckRR0x7sE7ZgVJwmNYA4fGBjCWtrp6OC B0WF+0ENNWplZ7r1u20xojHOroKJj565uNQEMYcU45Y0xHHjqQSHPaJDtwsBjhArM3zZi1 Do05WQ6ZeEu1UAWQs3xjmo/rjo0Gz8g= X-Envelope-To: jic23@kernel.org X-Envelope-To: conall.ogriofa@amd.com X-Envelope-To: linux-iio@vger.kernel.org X-Envelope-To: linux-arm-kernel@lists.infradead.org X-Envelope-To: linux-kernel@vger.kernel.org X-Envelope-To: lars@metafoo.de Message-ID: Date: Fri, 7 Jun 2024 13:42:19 -0400 MIME-Version: 1.0 Subject: Re: [PATCH] iio: xilinx-ams: Don't include ams_ctrl_channels in scan_mask To: Jonathan Cameron Cc: Jonathan Cameron , "O'Griofa, Conall" , "linux-iio@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , Lars-Peter Clausen References: <20240311162800.11074-1-sean.anderson@linux.dev> <20240314154824.37150a54@jic23-huawei> <3b481539-0c9c-4110-ad03-bd252e80efb0@linux.dev> <20240316133627.5d2bf585@jic23-huawei> <7ee83f15-88fc-4530-84b7-b8ee31663dbc@linux.dev> <20240318152446.00001345@Huawei.com> <7ddf8d4a-5b68-432d-93c1-ff270403cb60@linux.dev> <20240319134258.0000574d@Huawei.com> Content-Language: en-US X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Sean Anderson In-Reply-To: <20240319134258.0000574d@Huawei.com> X-Migadu-Flow: FLOW_OUT X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240607_104236_467523_C7706528 X-CRM114-Status: GOOD ( 51.08 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMy8xOS8yNCAwOTo0MiwgSm9uYXRoYW4gQ2FtZXJvbiB3cm90ZToKPiBPbiBNb24sIDE4IE1h ciAyMDI0IDExOjI4OjQ5IC0wNDAwCj4gU2VhbiBBbmRlcnNvbiA8c2Vhbi5hbmRlcnNvbkBsaW51 eC5kZXY+IHdyb3RlOgo+IAo+PiBPbiAzLzE4LzI0IDExOjI0LCBKb25hdGhhbiBDYW1lcm9uIHdy b3RlOgo+PiA+IE9uIE1vbiwgMTggTWFyIDIwMjQgMTE6MTg6NDMgLTA0MDAKPj4gPiBTZWFuIEFu ZGVyc29uIDxzZWFuLmFuZGVyc29uQGxpbnV4LmRldj4gd3JvdGU6Cj4+ID4gICAKPj4gPj4gT24g My8xNi8yNCAwOTozNiwgSm9uYXRoYW4gQ2FtZXJvbiB3cm90ZTogIAo+PiA+PiA+IE9uIEZyaSwg MTUgTWFyIDIwMjQgMTM6NDc6NDAgLTA0MDAKPj4gPj4gPiBTZWFuIEFuZGVyc29uIDxzZWFuLmFu ZGVyc29uQGxpbnV4LmRldj4gd3JvdGU6Cj4+ID4+ID4gICAgIAo+PiA+PiA+PiBIaSBDb25hbGws Cj4+ID4+ID4+IAo+PiA+PiA+PiBPbiAzLzE1LzI0IDA5OjE4LCBPJ0dyaW9mYSwgQ29uYWxsIHdy b3RlOiAgICAKPj4gPj4gPj4gPiBbQU1EIE9mZmljaWFsIFVzZSBPbmx5IC0gR2VuZXJhbF0KPj4g Pj4gPj4gPiAKPj4gPj4gPj4gPiBIaSwKPj4gPj4gPj4gPiAKPj4gPj4gPj4gPiBJIHRoaW5rIHRo ZXJlIHdhcyBhIGZpeCBmb3IgdGhpcyBpc3N1ZSBhcHBsaWVkIHRvIHRoZSB2ZXJzaW9uIHRoYXQg d2FzIHJ1bm5pbmcgb24gNS4xNSB0aGF0IGRpZG4ndCBzZWVtIHRvIG1ha2UgaXQgaW50byB0aGUg dXBzdHJlYW0gZHJpdmVyLgo+PiA+PiA+PiA+IFBsZWFzZSBzZWUgbGluayBmb3IgcmVmZXJlbmNl IGh0dHBzOi8vZ2l0aHViLmNvbS9YaWxpbngvbGludXgteGxueC9jb21taXQvNjA4NDI2OTYxZjE2 YWIxNDliMWI2OTlmMWMzNWY3YWQyNDRjMDcyMAo+PiA+PiA+PiA+IAo+PiA+PiA+PiA+IEkgdGhp bmsgYSBzaW1pbGFyIGZpeCB0byB0aGUgYWJvdmUgcGF0Y2ggaXMgbWF5IGJlIGJlbmVmaWNpYWw/ ICAgICAgCj4+ID4+ID4+IAo+PiA+PiA+PiBUaGVzZSBwYXRjaGVzIGxvb2sgZnVuY3Rpb25hbGx5 IGlkZW50aWNhbCB0byBtZS4gICAgCj4+ID4+ID4gCj4+ID4+ID4gQmVjYXVzZSB0aGVyZSBhcmUg bm8gY2hhbm5lbHMgd2l0aCBzY2FuIGluZGV4IGJldHdlZW4KPj4gPj4gPiAyMiAqIDIgKyAxNiAo dGhhdCBwYXRjaCkgYW5kIDIyICogMyAoeW91ciBwYXRjaCkgdGhhdCBpcwo+PiA+PiA+IHRoZSBl ZmZlY3QgaXMgaW5kZWVkIHRoZSBzYW1lLiBCdXQgZ2l2ZW4gdGhlIGlzc3VlcyBpcyB0aGUKPj4g Pj4gPiA2NCBsaW1pdCBvbiBtYXhpbXVtIHNjYW4gaW5kZXgsIDIyICogMyA9IDY2IGlzIGFuIHVn bHkgdmFsdWUKPj4gPj4gPiB0byBjb21wYXJlIHdpdGguCj4+ID4+ID4gCj4+ID4+ID4gSSdtIHN0 aWxsIHZlcnkgYWdhaW5zdCB0aGUgdXNlIG9mIHNjYW5faW5kZXggZm9yIGFueXRoaW5nIG90aGVy Cj4+ID4+ID4gdGhhbiBzY2FuIGluZGljZXMgKHdoaWNoIGlzIHdoeSBwYXJ0bHkgaG93IHRoaXMg YnVnIHdhc24ndCBub3RpY2VkCj4+ID4+ID4gaW4gdGhlIGZpcnN0IHBhbGNlKS4gU28gdGhlIGNo ZWNrIHNob3VsZCBiZSBzY2FuX2luZGV4ICE9IC0xCj4+ID4+ID4gYW5kIHVzZXMgb2YgdGhvc2Ug dmFsdWVzIGVsc2V3aGVyZSBpbiB0aGUgZHJpdmVyIHNob3VsZCBiZSBmaXhlZAo+PiA+PiA+ICh3 aGljaCBsb29rcyBzaW1wbGUgdG8gZG8gZnJvbSBhIHF1aWNrIGdsYW5jZSBhdCB0aGUgY29kZSku ICAgIAo+PiA+PiAKPj4gPj4gT0ssIHNvIGhvdyBkbyB0aGUgc3lzZnMgZmlsZXMgZ2V0IG5hbWVk IHRoZW4/ICAKPj4gPiAKPj4gPiBVc2luZyBjaGFubmVsIGFuZCBjaGFubmVsMiBhcyBhcHByb3By aWF0ZSAoKyBpbmRleCBhbmQgbW9kaWZpZWQKPj4gPiB3aGljaCBjaGFuZ2UgdGhlIG1lYW5pbmcg b2YgY2hhbm5lbDIpIC0gc2Nhbl9pbmRleCBuZXZlciBoYWQKPj4gPiBhbnl0aGluZyB0byBkbyB3 aXRoIHN5c2ZzIGZpbGUgbmFtZXMgLSBqdXN0IHRoZSB2YWx1ZSBpbgo+PiA+IGJ1ZmZlclgvaW5f eHl6X3NjYW5faW5kZXggIAo+PiAKPj4gSSB0cmllZCB0byBwcm90b3R5cGUgc2V0dGluZyBzY2Fu X2luZGV4IHRvIC0xLCBidXQgd2hlbiByZWdpc3RlcmluZyBjaGFubmVscyBJIHNhdwo+PiAKPj4g WyAgICAxLjYzNzA0OV0gaWlvIGlpbzpkZXZpY2UwOiB0cmllZCB0byBkb3VibGUgcmVnaXN0ZXIg OiBpbl92b2x0YWdlX3Jhdwo+PiBbICAgIDEuNjM3MjQ1XSB4aWxpbngtYW1zIGZmYTUwMDAwLmFt czogRmFpbGVkIHRvIHJlZ2lzdGVyIHN5c2ZzIGludGVyZmFjZXMKPj4gWyAgICAxLjYzNzQzM10g eGlsaW54LWFtczogcHJvYmUgb2YgZmZhNTAwMDAuYW1zIGZhaWxlZCB3aXRoIGVycm9yIC0xNgo+ PiAKPj4gQW5kIEFJVUkgLmNoYW5uZWwgaXMgZmlsbGVkIGluIGJ5IGFtc19wYXJzZV9maXJtd2Fy ZS4KPiAKPiBJcyBpbmRleGVkIHNldCBmb3IgdGhlIGNoYW5uZWw/ICBDaGVjayBpdCBhdCB0aGUg cG9pbnQgb2YgY2FsbGluZwo+IGRldm1faWlvX2RldmljZV9yZWdpc3RlcigpIGFzIHRoZSBjb2Rl IHRoYXQgYnVpbGRzIHRoZSBjaGFubmVscyBpbiB0aGlzCj4gZHJpdmVyIGlzIGNvbXBsZXgsIHNv IG1heWJlIGl0J3MgZ2V0dGluZyBvdmVyd3JpdHRlbj8KPiAKPiBUaGVyZSBtaWdodCBiZSBhIGNv cmUgYnVnIHNvbWV3aGVyZSwgYnV0IHRoZXJlIGFyZSBvdGhlciBkcml2ZXJzIHVzaW5nCj4gLTEg c2NhbiBpbmRleCB3aXRob3V0IGhpdHRpbmcgdGhpcyBwcm9ibGVtIHNvIG15IGZpcnN0IGluc3Rp bmN0IGlzCj4gc29tZXRoaW5nIGlzIGdldHRpbmcgd3JvbmdseSBzZXQgaW4gdGhlIGRyaXZlci4K ClVwb24gZnVydGhlciByZXZpZXcsIEkgdGhpbmsgc2Nhbl9pbmRleCBzaG91bGQgcmVtYWluIHRo ZSBzYW1lLCBhbmQgdGhpcwpwYXRjaCBzaG91bGQgYmUgYXBwbGllZCBhcy1pcy4KCmFkZHJlc3Mg aXMgdGhlIG9ubHkgZHJpdmVyLXByaXZhdGUgZGF0YSBpbiBhbGwgb2YgaWlvX2NoYW5fc3BlYy4K VW5mb3J0dW5hdGVseSwgaXQgaXMgc3VnZ2VzdGl2ZWx5IG5hbWVkICJhZGRyZXNzIiBhbmQgbm90 ICJwcml2IiBvcgoiZHJpdmVyX2lkIiBvciBzb21ldGhpbmcgc2ltaWxhci4gU28gdGhlIG9yaWdp bmFsIGF1dGhvciBvZiB0aGlzIGRyaXZlcgp3ZW50ICJBaCwgSSBzaG91bGQgcHV0IHRoZSBjaGFu bmVsIGFkZHJlc3Mgb2Zmc2V0cyBpbiB0aGlzIHJlZ2lzdGVyLiIKRXhjZXB0LCBiZWNhdXNlIHRo aXMgZHJpdmVyIGhhcyB0aHJlZSBhZGRyZXNzIHNwYWNlcywgdGhpcyBpcyBub3QgZW5vdWdoCnRv IHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjaGFubmVsLiBTbyBoZSB0aGVuIHN0dWNrIGFuIGFjdHVh bCB1bmlxdWUKaWRlbnRpZmllciBpbiBzY2FuX2luZGV4LiBOb3csIHlvdSBtYXkgb2JqZWN0IHRv IHRoaXMgc2luY2UgdGhlIGRyaXZlcgpkb2Vzbid0IGFjdHVhbGx5IHN1cHBvcnQgc2NhbnMsIGJ1 dCB0aGF0IGlzIHRoZSBjdXJyZW50IHNpdHVhdGlvbi4KClNvIHRoZXJlIGlzIHJlYWxseSBub3Ro aW5nIHdyb25nIHdpdGggc2Nhbl9pbmRleCBzZW1hbnRpY2FsbHkgaW4gdGhlCmNvbnRleHQgb2Yg dGhlIGRyaXZlci4gV2Ugc2hvdWxkIG5vdCBjb252ZXJ0IG9uZSBhZGRyZXNzIHNwYWNlJ3MKY2hh bm5lbHMgdG8gdXNlIC0xIHNjYW5faW5kZXgsIHNpbmNlIGl0IGlzIHVzZWQgYXMgYSB1bmlxdWUg aWRlbnRpZmllcgplbHNld2hlcmUgaW4gdGhlIGNoYW5uZWwuCgpGdXR1cmUgcGF0Y2hlcyBjb3Vs ZCBjb252ZXJ0IHNjYW5faW5kZXggdG8gYWRkcmVzcywgYW5kIHN0b3JlIHRoZQphZGRyZXNzIG9m ZnNldHMgaW4gYW4gYXJyYXkuIFNvIGUuZy4gcmVhZGluZyBhIGNoYW5uZWwgd291bGQgZ28gZnJv bQplLmcuCgoJaWYgKGNoYW4tPnNjYW5faW5kZXggPj0gQU1TX1BTX1NFUV9NQVgpCgkJKnZhbCA9 IHJlYWRsKGFtcy0+cGxfYmFzZSArIGNoYW4tPmFkZHJlc3MpOwoJZWxzZQoJCSp2YWwgPSByZWFk bChhbXMtPnBzX2Jhc2UgKyBjaGFuLT5hZGRyZXNzKTsKCnRvCgoJaWYgKGNoYW4tPmFkZHJlc3Mg Pj0gQU1TX1BTX1NFUV9NQVgpCgkJKnZhbCA9IHJlYWRsKGFtcy0+cGxfYmFzZSArIGFtc19jaGFu X2FkZHJbY2hhbi0+YWRkcmVzc10pOwoJZWxzZQoJCSp2YWwgPSByZWFkbChhbXMtPnBzX2Jhc2Ug KyBhbXNfY2hhbl9hZGRyW2NoYW4tPmFkZHJlc3NdKTsKCndoaWNoIHdoaWxlIHN0cmljdGx5IGxl c3MgcGVyZm1hbnQgZHVlIHRvIGFub3RoZXIgbGV2ZWwgb2YgaW5kaXJlY3Rpb24KZG9lcyBjb25m b3JtIHRvIGV4aXN0aW5nIHNlbWFudGljcyBmb3Igc2Nhbl9pbmRleC4gQnV0IFRCSCBJIGRvbid0 IHNlZQptdWNoIHBvaW50IGluIHRoaXMuCgpCdXQgdGhlIGFib3ZlIGNoYW5nZSB3b3VsZCBiZSBw cmV0dHkgc2lnbmlmaWNhbnQgYW5kIGhhcyBhIGNoYW5jZSBvZgpjYXVzaW5nIGJ1Z3Mgb2YgaXRz IG93bi4gU28gSSB3b3VsZCByYXRoZXIgdGhpcyBidWcgZml4IGJlIGFwcGxpZWQgYXMtaXMKYW5k IHRoZSBzY2FuX2luZGV4IHNlbWFudGljcyBiZSBtb2RpZmllZCBhdCBzb21lIG90aGVyIHRpbWUu CgotLVNlYW4KCj4+IAo+PiAtLVNlYW4KPj4gCj4+ID4+IAo+PiA+PiAtLVNlYW4KPj4gPj4gICAK Pj4gPj4gPj4gCj4+ID4+ID4+IC0tU2Vhbgo+PiA+PiA+PiAgICAgCj4+ID4+ID4+ID4+IC0tLS0t T3JpZ2luYWwgTWVzc2FnZS0tLS0tCj4+ID4+ID4+ID4+IEZyb206IFNlYW4gQW5kZXJzb24gPHNl YW4uYW5kZXJzb25AbGludXguZGV2Pgo+PiA+PiA+PiA+PiBTZW50OiBUaHVyc2RheSwgTWFyY2gg MTQsIDIwMjQgNTozMCBQTQo+PiA+PiA+PiA+PiBUbzogSm9uYXRoYW4gQ2FtZXJvbiA8amljMjNA a2VybmVsLm9yZz4KPj4gPj4gPj4gPj4gQ2M6IGxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmc7IE8n R3Jpb2ZhLCBDb25hbGwgPGNvbmFsbC5vZ3Jpb2ZhQGFtZC5jb20+Owo+PiA+PiA+PiA+PiBsaW51 eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmc7IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5l bC5vcmc7IExhcnMtUGV0ZXIKPj4gPj4gPj4gPj4gQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPgo+ PiA+PiA+PiA+PiBTdWJqZWN0OiBSZTogW1BBVENIXSBpaW86IHhpbGlueC1hbXM6IERvbid0IGlu Y2x1ZGUgYW1zX2N0cmxfY2hhbm5lbHMgaW4KPj4gPj4gPj4gPj4gc2Nhbl9tYXNrCj4+ID4+ID4+ ID4+Cj4+ID4+ID4+ID4+IENhdXRpb246IFRoaXMgbWVzc2FnZSBvcmlnaW5hdGVkIGZyb20gYW4g RXh0ZXJuYWwgU291cmNlLiBVc2UgcHJvcGVyIGNhdXRpb24KPj4gPj4gPj4gPj4gd2hlbiBvcGVu aW5nIGF0dGFjaG1lbnRzLCBjbGlja2luZyBsaW5rcywgb3IgcmVzcG9uZGluZy4KPj4gPj4gPj4g Pj4KPj4gPj4gPj4gPj4KPj4gPj4gPj4gPj4gT24gMy8xNC8yNCAxMTo0OCwgSm9uYXRoYW4gQ2Ft ZXJvbiB3cm90ZTogICAgICAKPj4gPj4gPj4gPj4gPiBPbiBNb24sIDExIE1hciAyMDI0IDEyOjI4 OjAwIC0wNDAwCj4+ID4+ID4+ID4+ID4gU2VhbiBBbmRlcnNvbiA8c2Vhbi5hbmRlcnNvbkBsaW51 eC5kZXY+IHdyb3RlOgo+PiA+PiA+PiA+PiA+ICAgICAgCj4+ID4+ID4+ID4+ID4+IGFtc19lbmFi bGVfY2hhbm5lbF9zZXF1ZW5jZSBjb25zdHJ1Y3RzIGEgInNjYW5fbWFzayIgZm9yIGFsbCB0aGUg UFMKPj4gPj4gPj4gPj4gPj4gYW5kIFBMIGNoYW5uZWxzLiBUaGlzIHdvcmtzIG91dCBmaW5lLCBz aW5jZSBzY2FuX2luZGV4IGZvciB0aGVzZQo+PiA+PiA+PiA+PiA+PiBjaGFubmVscyBpcyBsZXNz IHRoYW4gNjQuIEhvd2V2ZXIsIGl0IGFsc28gaW5jbHVkZXMgdGhlCj4+ID4+ID4+ID4+ID4+IGFt c19jdHJsX2NoYW5uZWxzLCB3aGVyZSBzY2FuX2luZGV4IGlzIGdyZWF0ZXIgdGhhbiA2NCwgdHJp Z2dlcmluZwo+PiA+PiA+PiA+PiA+PiB1bmRlZmluZWQgYmVoYXZpb3IuIFNpbmNlIHdlIGRvbid0 IG5lZWQgdGhlc2UgY2hhbm5lbHMgYW55d2F5LCBqdXN0ICAgICAgCj4+ID4+ID4+ID4+IGV4Y2x1 ZGUgdGhlbS4gICAgICAKPj4gPj4gPj4gPj4gPj4KPj4gPj4gPj4gPj4gPj4gRml4ZXM6IGQ1Yzcw NjI3YTc5NCAoImlpbzogYWRjOiBBZGQgWGlsaW54IEFNUyBkcml2ZXIiKQo+PiA+PiA+PiA+PiA+ PiBTaWduZWQtb2ZmLWJ5OiBTZWFuIEFuZGVyc29uIDxzZWFuLmFuZGVyc29uQGxpbnV4LmRldj4g ICAgICAKPj4gPj4gPj4gPj4gPgo+PiA+PiA+PiA+PiA+IEhpIFNlYW4sCj4+ID4+ID4+ID4+ID4K Pj4gPj4gPj4gPj4gPiBJJ2QgaWRlYWxseSBsaWtlIHRvIHVuZGVyc3RhbmQgd2h5IHdlIGhhdmUg Y2hhbm5lbHMgd2l0aCBzdWNoIGxhcmdlCj4+ID4+ID4+ID4+ID4gc2NhbiBpbmRleGVzLiAgVGhv c2UgdmFsdWVzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGJ1ZmZlcmVkIGNhcHR1cmUuCj4+ID4+ ID4+ID4+ID4gSXQgZmVlbHMgbGlrZSB0aGV5IGFyZSBiZWluZyBhYnVzZWQgaGVyZS4gIENhbiB3 ZSBzZXQgdGhlbSB0byAtMQo+PiA+PiA+PiA+PiA+IGluc3RlYWQgYW5kIGNoZWNrIGJhc2VkIG9u IHRoYXQ/Cj4+ID4+ID4+ID4+ID4gRm9yIGEgY2hhbm5lbCwgYSBzY2FuIGluZGV4IG9mIC0xIG1l YW5zIGl0IGNhbid0IGJlIGNhcHR1cmVkIHZpYSB0aGUKPj4gPj4gPj4gPj4gPiBidWZmZXJlZCBp bnRlcmZhY2VzIGJ1dCBvbmx5IGFjY2Vzc2VkIHZpYSBzeXNmcyByZWFkcy4KPj4gPj4gPj4gPj4g PiBJIHRoaW5rIHRoYXQncyB3aGF0IHdlIGhhdmUgaGVyZT8gICAgICAKPj4gPj4gPj4gPj4KPj4g Pj4gPj4gPj4gRnJvbSB3aGF0IEkgY2FuIHRlbGwsIG5vbmUgb2YgdGhlIGNoYW5uZWxzIHN1cHBv cnQgYnVmZmVyZWQgcmVhZHMuIEFuZCB3ZSBjYW4ndAo+PiA+PiA+PiA+PiBuYWnMiHZlbHkgY29u dmVydCB0aGUgc2Nhbl9pbmRleCB0byAtMSwgc2luY2UgdGhhdCBjYXVzZXMgc3lzZnMgbmFtaW5n IGNvbmZsaWN0cwo+PiA+PiA+PiA+PiAobm90IHRvIG1lbnRpb24gdGhlIGNvbXBhdGliaWxpdHkg YnJlYWspLgo+PiA+PiA+PiA+PiAgICAgIAo+PiA+PiA+PiA+PiA+Cj4+ID4+ID4+ID4+ID4gSSBq dXN0IGZlZWwgbGlrZSBpZiB3ZSBsZWF2ZSB0aGVzZSBhcyB0aGluZ3Mgc3RhbmQsIHdlIHdpbGwg Z2V0IGJpdHRlbgo+PiA+PiA+PiA+PiA+IGJ5IHNpbWlsYXIgYnVncyBpbiB0aGUgZnV0dXJlLiAg QXQgbGVhc3Qgd2l0aCAtMSBpdCBzaG91bGQgYmUgb2J2aW91cyB3aHkhICAgICAgCj4+ID4+ID4+ ID4+Cj4+ID4+ID4+ID4+IFRoZXJlIGFyZSBqdXN0IGFzIGxpa2VseSB0byBiZSBidWdzIGNvbmZ1 c2luZyB0aGUgUEwvUFMgc3ViZGV2aWNlcy4uLgo+PiA+PiA+PiA+Pgo+PiA+PiA+PiA+PiBGV0lX IEkgaGFkIG5vIHRyb3VibGUgaWRlbnRpZnlpbmcgdGhlIGNoYW5uZWxzIGludm9sdmVkIHdpdGgg dGhpcyBidWcuCj4+ID4+ID4+ID4+Cj4+ID4+ID4+ID4+IC0tU2Vhbgo+PiA+PiA+PiA+PiAgICAg IAo+PiA+PiA+PiA+PiA+IEpvbmF0aGFuCj4+ID4+ID4+ID4+ID4KPj4gPj4gPj4gPj4gPiAgICAg IAo+PiA+PiA+PiA+PiA+PiAtLS0KPj4gPj4gPj4gPj4gPj4KPj4gPj4gPj4gPj4gPj4gIGRyaXZl cnMvaWlvL2FkYy94aWxpbngtYW1zLmMgfCA4ICsrKysrKy0tCj4+ID4+ID4+ID4+ID4+ICAxIGZp bGUgY2hhbmdlZCwgNiBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQo+PiA+PiA+PiA+PiA+ Pgo+PiA+PiA+PiA+PiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3hpbGlueC1hbXMu Ywo+PiA+PiA+PiA+PiA+PiBiL2RyaXZlcnMvaWlvL2FkYy94aWxpbngtYW1zLmMgaW5kZXggYTU1 Mzk2YzFmOGIyLi40ZGU3Y2U1OThlNGQKPj4gPj4gPj4gPj4gPj4gMTAwNjQ0Cj4+ID4+ID4+ID4+ ID4+IC0tLSBhL2RyaXZlcnMvaWlvL2FkYy94aWxpbngtYW1zLmMKPj4gPj4gPj4gPj4gPj4gKysr IGIvZHJpdmVycy9paW8vYWRjL3hpbGlueC1hbXMuYwo+PiA+PiA+PiA+PiA+PiBAQCAtNDE0LDgg KzQxNCwxMiBAQCBzdGF0aWMgdm9pZCBhbXNfZW5hYmxlX2NoYW5uZWxfc2VxdWVuY2Uoc3RydWN0 Cj4+ID4+ID4+ID4+ID4+IGlpb19kZXYgKmluZGlvX2RldikKPj4gPj4gPj4gPj4gPj4KPj4gPj4g Pj4gPj4gPj4gICAgICAvKiBSdW4gY2FsaWJyYXRpb24gb2YgUFMgJiBQTCBhcyBwYXJ0IG9mIHRo ZSBzZXF1ZW5jZSAqLwo+PiA+PiA+PiA+PiA+PiAgICAgIHNjYW5fbWFzayA9IEJJVCgwKSB8IEJJ VChBTVNfUFNfU0VRX01BWCk7Cj4+ID4+ID4+ID4+ID4+IC0gICAgZm9yIChpID0gMDsgaSA8IGlu ZGlvX2Rldi0+bnVtX2NoYW5uZWxzOyBpKyspCj4+ID4+ID4+ID4+ID4+IC0gICAgICAgICAgICBz Y2FuX21hc2sgfD0gQklUX1VMTChpbmRpb19kZXYtPmNoYW5uZWxzW2ldLnNjYW5faW5kZXgpOwo+ PiA+PiA+PiA+PiA+PiArICAgIGZvciAoaSA9IDA7IGkgPCBpbmRpb19kZXYtPm51bV9jaGFubmVs czsgaSsrKSB7Cj4+ID4+ID4+ID4+ID4+ICsgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaWlvX2No YW5fc3BlYyAqY2hhbiA9Cj4+ID4+ID4+ID4+ID4+ICsgJmluZGlvX2Rldi0+Y2hhbm5lbHNbaV07 Cj4+ID4+ID4+ID4+ID4+ICsKPj4gPj4gPj4gPj4gPj4gKyAgICAgICAgICAgIGlmIChjaGFuLT5z Y2FuX2luZGV4IDwgQU1TX0NUUkxfU0VRX0JBU0UpCj4+ID4+ID4+ID4+ID4+ICsgICAgICAgICAg ICAgICAgICAgIHNjYW5fbWFzayB8PSBCSVRfVUxMKGNoYW4tPnNjYW5faW5kZXgpOwo+PiA+PiA+ PiA+PiA+PiArICAgIH0KPj4gPj4gPj4gPj4gPj4KPj4gPj4gPj4gPj4gPj4gICAgICBpZiAoYW1z LT5wc19iYXNlKSB7Cj4+ID4+ID4+ID4+ID4+ICAgICAgICAgICAgICAvKiBwdXQgc3lzbW9uIGlu IGEgc29mdCByZXNldCB0byBjaGFuZ2UgdGhlIHNlcXVlbmNlICovICAgICAgCj4+ID4+ID4+ID4+ ID4gICAgICAKPj4gPj4gPj4gICAgIAo+PiA+PiA+ICAgICAKPj4gPj4gCj4+ID4+ICAgCj4+ID4g ICAKPj4gCj4gCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmlu ZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9s aW51eC1hcm0ta2VybmVsCg==