From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.3ffe.de (0001.3ffe.de [159.69.201.130]) (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 F1E82349AF0; Wed, 19 Nov 2025 10:27:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=159.69.201.130 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763548059; cv=none; b=GKhneCFMUzeywcfuc/+O81oP6vAvvVrGm44FXa2P0GW1cM/z1fEkKRfl8X9j0GGUtLfawI/sLyqDIPcfXQ7L6dPyIFwWmtrlSOgk/6ygz7a8o/2twg0VkiMMyhpIzRZB1QcXhAhPG1+U37q/0gsRTo91yQXNfiA36sJJvU/51Sw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763548059; c=relaxed/simple; bh=ztAc6se96wOdVyAwVyZ94FaMH5XUYmOddUYfZdXWVsg=; h=Mime-Version:Content-Type:Date:Message-Id:Subject:Cc:From:To: References:In-Reply-To; b=QqfkcWVnyGCasdnVCldkvCt6LyDIEskLG1tLKFdaD/NlXxlsei0MB8efAjM4w2J/TtzqLoOeQwL7Y12ylz9uZ0+41mR3/TShv+KJOdNmYDs1wr057uW9kR55teCmOsaG0zdrq3gGBs1a56SG2/LvKPvBH65CSci3S486dASuotM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org; spf=pass smtp.mailfrom=walle.cc; arc=none smtp.client-ip=159.69.201.130 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=walle.cc Received: from localhost (unknown [IPv6:2a00:20:d30b:5ad2:4685:ff:fe12:5967]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mail.3ffe.de (Postfix) with ESMTPSA id 90C5B4C0; Wed, 19 Nov 2025 11:27:27 +0100 (CET) Precedence: bulk X-Mailing-List: linux-doc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=UTF-8 Date: Wed, 19 Nov 2025 11:27:27 +0100 Message-Id: Subject: Re: [PATCH 16/19] mtd: spi-nor: Add steps for testing locking support Cc: "Tudor Ambarus" , "Pratyush Yadav" , "Richard Weinberger" , "Vignesh Raghavendra" , "Jonathan Corbet" , "Sean Anderson" , "Thomas Petazzoni" , "Steam Lin" , , , From: "Michael Walle" To: "Miquel Raynal" X-Mailer: aerc 0.20.0 References: <20251114-winbond-v6-18-rc1-spi-nor-swp-v1-0-487bc7129931@bootlin.com> <20251114-winbond-v6-18-rc1-spi-nor-swp-v1-16-487bc7129931@bootlin.com> <87tsyqcqcl.fsf@bootlin.com> In-Reply-To: <87tsyqcqcl.fsf@bootlin.com> On Wed Nov 19, 2025 at 10:40 AM CET, Miquel Raynal wrote: > On 18/11/2025 at 13:24:02 +01, "Michael Walle" wrote: > >> On Fri Nov 14, 2025 at 6:53 PM CET, Miquel Raynal wrote: >>> As recently raised on the mailing list, it may be useful to propose a >>> list of steps to go through in order to proove the devices have been >>> described correctly, especially since all the block protection >>> information is not stored in any kind of table and is instead filled >>> manually by developpers. >>> >>> Use the debugfs output to ease the comparison between expectations and >>> reality. >>> >>> Signed-off-by: Miquel Raynal >>> --- >>> Documentation/driver-api/mtd/spi-nor.rst | 118 +++++++++++++++++++++++= ++++++++ >>> 1 file changed, 118 insertions(+) >>> >>> diff --git a/Documentation/driver-api/mtd/spi-nor.rst b/Documentation/d= river-api/mtd/spi-nor.rst >>> index 148fa4288760b6ba47d530ed72c5ef81397d598f..d56ff5c42a98af23a65097c= 9b77cd20ef2504a49 100644 >>> --- a/Documentation/driver-api/mtd/spi-nor.rst >>> +++ b/Documentation/driver-api/mtd/spi-nor.rst >>> @@ -203,3 +203,121 @@ section, after the ``---`` marker. >>> mtd.writesize =3D 1 >>> mtd.oobsize =3D 0 >>> regions =3D 0 >>> + >>> +5) If your flash supports locking, also follow the following test >>> + procedure to make sure it correctly behaves. These tests must be >>> + conducted with #WP high (no hardware protection) or the `no-wp` >>> + property in the DT node. >> >> Or? If WPn is low, the no-wp property doesn't matter. >> It's hardware write protected. > > This is only correct if the SRP bit is set. If the SRP bit is unset, #WP > low still has no impact. And this is why setting the no-wp property > matters, because otherwise the SR_SRWD bit gets set at the first locking > command. Yes, but only if it's not write-protected before. The text read as if you could ignore the hardware write protection. More below. > I disliked this behaviour as I actually got almost locked with > a non drivable #WP pin and had to play with pinctrl in order to force it > high and allow me to overwrite the SR_SRWD bit back. That no-wp property was recently introduced because of faulty hardware. Before that, locking was always the "real" hardware write-protection. >> Also there is that corner case, where you can >> actually fully lock your flash: WPn hard tied to low. Be aware, that >> you can enable locking even if WPn is tied low. That has the use >> case to initially program the flash and then lock it forever. So we >> might add a warning note, that WPn should somehow be controllable >> (or be sure that is tied high) before conducting the locking tests. > > Yes, that is the situation I met, it is not documented anywhere except > the code. > > My intent with this paragraph was to hint people not to conduct these > tests under certain situations, but we can definitely improve that. What > about: > > 5) If your flash supports locking, please got through the following test > procedure to make sure it correctly behaves. > > Warning: These tests may hard lock your device! Make sure: > - The device is not hard locked already (#WP strapped to low and > SR_SRWD bit set) > - If you have a #WP pin, you may want to set `no-wp` in your DT for > the time of the test, to only make use of software protection. Yes that is much better. BTW, I've never seen "#signal" but only SIG#, nSIG, SIGn or /SIG, maybe I haven't paid too much attention. > Please amend this text if you still think it is missing his goal. What about - If you have a WPn pin, you may want to set `no-wp` in your DT for the time of the test, to only make use of software protection. Otherwise, clearing the locking state depends on the WPn signal and if it is tied to low, the flash will be permanently locked. > >>> + root@1:~# flash_lock -u /dev/mtd0 >>> + root@1:~# flash_lock -l /dev/mtd0 $(($size - (2 * $bs))) 2 # last = two >>> + root@1:~# show_sectors >>> + software locked sectors >>> + region (in hex) | status | #blocks >>> + ------------------+----------+-------- >>> + 00000000-03fdffff | unlocked | 1022 >>> + 03fe0000-03ffffff | locked | 2 >>> + root@1:~# flash_lock -u /dev/mtd0 $(($size - (2 * $bs))) 1 # last = one >> >> huh? shouldn't that be 1 * $bs? > > I don't think so: > - first we lock the last two blocks (offset: size - 2 blocks, length: 2 > blocks) > - then we unlock the penultimate block so that only the last block > remains locked (offset: size - 2 blocks, length 1). Yes you're correct. I've read the -u for a -l (and somehow assumed a complete unlock in between). > I we were doing flash_lock -u $(($size - (1 * $bs))) 1, we would > be asking to unlock the very last block and keep only the penultimate > block locked, which would not be supported. > > Thanks, > Miqu=C3=A8l 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 45CA1CF318A for ; Wed, 19 Nov 2025 10:27: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:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:References:To:From:Cc: Subject:Message-Id:Date:Mime-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=iD7R+WdwCc6n2fO2+NrRJkioNF/MD/Cjt0jUyk6SL0U=; b=LCDlWIYOwKQXXh eXLK30F2U994huWh490pULfwVFcTGJp+s0OfxnC0aDp/s5WnSDaWlFCeLq8YmDMW2WszDpNnUm0AW mVXIuxOEHNBwZagJn/ISJtyNwF6O9lLAT8CXYD6pbAJfRTcPCAZ1dNUFnzhxpM4rmFR9usikG8USf jvNWTm/luZenkco3zJWxLHc41xdn8GIqH9v9+G9LgREqhLp7ppME95SSwngTLK95LEM6eT5zWaS5k tXYtqzsdRGi/8CefZn1N6TCWxMKaJNUg4cjA+uUZsToiu/ln+0OS11dhTMulwU3Hn1iTi3Au2JouW PZ5KxqSABgbTOihGotpA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vLfPd-00000002y3G-2Xs7; Wed, 19 Nov 2025 10:27:45 +0000 Received: from 0001.3ffe.de ([2a01:4f8:c0c:9d57::1] helo=mail.3ffe.de) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1vLfPa-00000002y1M-1S2L for linux-mtd@lists.infradead.org; Wed, 19 Nov 2025 10:27:44 +0000 Received: from localhost (unknown [IPv6:2a00:20:d30b:5ad2:4685:ff:fe12:5967]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mail.3ffe.de (Postfix) with ESMTPSA id 90C5B4C0; Wed, 19 Nov 2025 11:27:27 +0100 (CET) Mime-Version: 1.0 Date: Wed, 19 Nov 2025 11:27:27 +0100 Message-Id: Subject: Re: [PATCH 16/19] mtd: spi-nor: Add steps for testing locking support Cc: "Tudor Ambarus" , "Pratyush Yadav" , "Richard Weinberger" , "Vignesh Raghavendra" , "Jonathan Corbet" , "Sean Anderson" , "Thomas Petazzoni" , "Steam Lin" , , , From: "Michael Walle" To: "Miquel Raynal" X-Mailer: aerc 0.20.0 References: <20251114-winbond-v6-18-rc1-spi-nor-swp-v1-0-487bc7129931@bootlin.com> <20251114-winbond-v6-18-rc1-spi-nor-swp-v1-16-487bc7129931@bootlin.com> <87tsyqcqcl.fsf@bootlin.com> In-Reply-To: <87tsyqcqcl.fsf@bootlin.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20251119_022742_539055_61D29EF7 X-CRM114-Status: GOOD ( 31.91 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org T24gV2VkIE5vdiAxOSwgMjAyNSBhdCAxMDo0MCBBTSBDRVQsIE1pcXVlbCBSYXluYWwgd3JvdGU6 Cj4gT24gMTgvMTEvMjAyNSBhdCAxMzoyNDowMiArMDEsICJNaWNoYWVsIFdhbGxlIiA8bXdhbGxl QGtlcm5lbC5vcmc+IHdyb3RlOgo+Cj4+IE9uIEZyaSBOb3YgMTQsIDIwMjUgYXQgNjo1MyBQTSBD RVQsIE1pcXVlbCBSYXluYWwgd3JvdGU6Cj4+PiBBcyByZWNlbnRseSByYWlzZWQgb24gdGhlIG1h aWxpbmcgbGlzdCwgaXQgbWF5IGJlIHVzZWZ1bCB0byBwcm9wb3NlIGEKPj4+IGxpc3Qgb2Ygc3Rl cHMgdG8gZ28gdGhyb3VnaCBpbiBvcmRlciB0byBwcm9vdmUgdGhlIGRldmljZXMgaGF2ZSBiZWVu Cj4+PiBkZXNjcmliZWQgY29ycmVjdGx5LCBlc3BlY2lhbGx5IHNpbmNlIGFsbCB0aGUgYmxvY2sg cHJvdGVjdGlvbgo+Pj4gaW5mb3JtYXRpb24gaXMgbm90IHN0b3JlZCBpbiBhbnkga2luZCBvZiB0 YWJsZSBhbmQgaXMgaW5zdGVhZCBmaWxsZWQKPj4+IG1hbnVhbGx5IGJ5IGRldmVsb3BwZXJzLgo+ Pj4KPj4+IFVzZSB0aGUgZGVidWdmcyBvdXRwdXQgdG8gZWFzZSB0aGUgY29tcGFyaXNvbiBiZXR3 ZWVuIGV4cGVjdGF0aW9ucyBhbmQKPj4+IHJlYWxpdHkuCj4+Pgo+Pj4gU2lnbmVkLW9mZi1ieTog TWlxdWVsIFJheW5hbCA8bWlxdWVsLnJheW5hbEBib290bGluLmNvbT4KPj4+IC0tLQo+Pj4gIERv Y3VtZW50YXRpb24vZHJpdmVyLWFwaS9tdGQvc3BpLW5vci5yc3QgfCAxMTggKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKwo+Pj4gIDEgZmlsZSBjaGFuZ2VkLCAxMTggaW5zZXJ0aW9ucygr KQo+Pj4KPj4+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvbXRkL3NwaS1u b3IucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL210ZC9zcGktbm9yLnJzdAo+Pj4gaW5k ZXggMTQ4ZmE0Mjg4NzYwYjZiYTQ3ZDUzMGVkNzJjNWVmODEzOTdkNTk4Zi4uZDU2ZmY1YzQyYTk4 YWYyM2E2NTA5N2M5Yjc3Y2QyMGVmMjUwNGE0OSAxMDA2NDQKPj4+IC0tLSBhL0RvY3VtZW50YXRp b24vZHJpdmVyLWFwaS9tdGQvc3BpLW5vci5yc3QKPj4+ICsrKyBiL0RvY3VtZW50YXRpb24vZHJp dmVyLWFwaS9tdGQvc3BpLW5vci5yc3QKPj4+IEBAIC0yMDMsMyArMjAzLDEyMSBAQCBzZWN0aW9u LCBhZnRlciB0aGUgYGAtLS1gYCBtYXJrZXIuCj4+PiAgICAgIG10ZC53cml0ZXNpemUgPSAxCj4+ PiAgICAgIG10ZC5vb2JzaXplID0gMAo+Pj4gICAgICByZWdpb25zID0gMAo+Pj4gKwo+Pj4gKzUp IElmIHlvdXIgZmxhc2ggc3VwcG9ydHMgbG9ja2luZywgYWxzbyBmb2xsb3cgdGhlIGZvbGxvd2lu ZyB0ZXN0Cj4+PiArICAgcHJvY2VkdXJlIHRvIG1ha2Ugc3VyZSBpdCBjb3JyZWN0bHkgYmVoYXZl cy4gVGhlc2UgdGVzdHMgbXVzdCBiZQo+Pj4gKyAgIGNvbmR1Y3RlZCB3aXRoICNXUCBoaWdoIChu byBoYXJkd2FyZSBwcm90ZWN0aW9uKSBvciB0aGUgYG5vLXdwYAo+Pj4gKyAgIHByb3BlcnR5IGlu IHRoZSBEVCBub2RlLgo+Pgo+PiBPcj8gSWYgV1BuIGlzIGxvdywgdGhlIG5vLXdwIHByb3BlcnR5 IGRvZXNuJ3QgbWF0dGVyLgo+PiBJdCdzIGhhcmR3YXJlIHdyaXRlIHByb3RlY3RlZC4KPgo+IFRo aXMgaXMgb25seSBjb3JyZWN0IGlmIHRoZSBTUlAgYml0IGlzIHNldC4gSWYgdGhlIFNSUCBiaXQg aXMgdW5zZXQsICNXUAo+IGxvdyBzdGlsbCBoYXMgbm8gaW1wYWN0LiBBbmQgdGhpcyBpcyB3aHkg c2V0dGluZyB0aGUgbm8td3AgcHJvcGVydHkKPiBtYXR0ZXJzLCBiZWNhdXNlIG90aGVyd2lzZSB0 aGUgU1JfU1JXRCBiaXQgZ2V0cyBzZXQgYXQgdGhlIGZpcnN0IGxvY2tpbmcKPiBjb21tYW5kLgoK WWVzLCBidXQgb25seSBpZiBpdCdzIG5vdCB3cml0ZS1wcm90ZWN0ZWQgYmVmb3JlLiBUaGUgdGV4 dCByZWFkIGFzCmlmIHlvdSBjb3VsZCBpZ25vcmUgdGhlIGhhcmR3YXJlIHdyaXRlIHByb3RlY3Rp b24uIE1vcmUgYmVsb3cuCgo+IEkgZGlzbGlrZWQgdGhpcyBiZWhhdmlvdXIgYXMgSSBhY3R1YWxs eSBnb3QgYWxtb3N0IGxvY2tlZCB3aXRoCj4gYSBub24gZHJpdmFibGUgI1dQIHBpbiBhbmQgaGFk IHRvIHBsYXkgd2l0aCBwaW5jdHJsIGluIG9yZGVyIHRvIGZvcmNlIGl0Cj4gaGlnaCBhbmQgYWxs b3cgbWUgdG8gb3ZlcndyaXRlIHRoZSBTUl9TUldEIGJpdCBiYWNrLgoKVGhhdCBuby13cCBwcm9w ZXJ0eSB3YXMgcmVjZW50bHkgaW50cm9kdWNlZCBiZWNhdXNlIG9mIGZhdWx0eQpoYXJkd2FyZS4g QmVmb3JlIHRoYXQsIGxvY2tpbmcgd2FzIGFsd2F5cyB0aGUgInJlYWwiIGhhcmR3YXJlCndyaXRl LXByb3RlY3Rpb24uCgo+PiBBbHNvIHRoZXJlIGlzIHRoYXQgY29ybmVyIGNhc2UsIHdoZXJlIHlv dSBjYW4KPj4gYWN0dWFsbHkgZnVsbHkgbG9jayB5b3VyIGZsYXNoOiBXUG4gaGFyZCB0aWVkIHRv IGxvdy4gQmUgYXdhcmUsIHRoYXQKPj4geW91IGNhbiBlbmFibGUgbG9ja2luZyBldmVuIGlmIFdQ biBpcyB0aWVkIGxvdy4gVGhhdCBoYXMgdGhlIHVzZQo+PiBjYXNlIHRvIGluaXRpYWxseSBwcm9n cmFtIHRoZSBmbGFzaCBhbmQgdGhlbiBsb2NrIGl0IGZvcmV2ZXIuIFNvIHdlCj4+IG1pZ2h0IGFk ZCBhIHdhcm5pbmcgbm90ZSwgdGhhdCBXUG4gc2hvdWxkIHNvbWVob3cgYmUgY29udHJvbGxhYmxl Cj4+IChvciBiZSBzdXJlIHRoYXQgaXMgdGllZCBoaWdoKSBiZWZvcmUgY29uZHVjdGluZyB0aGUg bG9ja2luZyB0ZXN0cy4KPgo+IFllcywgdGhhdCBpcyB0aGUgc2l0dWF0aW9uIEkgbWV0LCBpdCBp cyBub3QgZG9jdW1lbnRlZCBhbnl3aGVyZSBleGNlcHQKPiB0aGUgY29kZS4KPgo+IE15IGludGVu dCB3aXRoIHRoaXMgcGFyYWdyYXBoIHdhcyB0byBoaW50IHBlb3BsZSBub3QgdG8gY29uZHVjdCB0 aGVzZQo+IHRlc3RzIHVuZGVyIGNlcnRhaW4gc2l0dWF0aW9ucywgYnV0IHdlIGNhbiBkZWZpbml0 ZWx5IGltcHJvdmUgdGhhdC4gV2hhdAo+IGFib3V0Ogo+Cj4gNSkgSWYgeW91ciBmbGFzaCBzdXBw b3J0cyBsb2NraW5nLCBwbGVhc2UgZ290IHRocm91Z2ggdGhlIGZvbGxvd2luZyB0ZXN0Cj4gICAg cHJvY2VkdXJlIHRvIG1ha2Ugc3VyZSBpdCBjb3JyZWN0bHkgYmVoYXZlcy4KPgo+ICAgIFdhcm5p bmc6IFRoZXNlIHRlc3RzIG1heSBoYXJkIGxvY2sgeW91ciBkZXZpY2UhIE1ha2Ugc3VyZToKPiAg ICAtIFRoZSBkZXZpY2UgaXMgbm90IGhhcmQgbG9ja2VkIGFscmVhZHkgKCNXUCBzdHJhcHBlZCB0 byBsb3cgYW5kCj4gICAgICBTUl9TUldEIGJpdCBzZXQpCj4gICAgLSBJZiB5b3UgaGF2ZSBhICNX UCBwaW4sIHlvdSBtYXkgd2FudCB0byBzZXQgYG5vLXdwYCBpbiB5b3VyIERUIGZvcgo+ICAgICAg dGhlIHRpbWUgb2YgdGhlIHRlc3QsIHRvIG9ubHkgbWFrZSB1c2Ugb2Ygc29mdHdhcmUgcHJvdGVj dGlvbi4KClllcyB0aGF0IGlzIG11Y2ggYmV0dGVyLiBCVFcsIEkndmUgbmV2ZXIgc2VlbiAiI3Np Z25hbCIgYnV0IG9ubHkKU0lHIywgblNJRywgU0lHbiBvciAvU0lHLCBtYXliZSBJIGhhdmVuJ3Qg cGFpZCB0b28gbXVjaCBhdHRlbnRpb24uCgo+IFBsZWFzZSBhbWVuZCB0aGlzIHRleHQgaWYgeW91 IHN0aWxsIHRoaW5rIGl0IGlzIG1pc3NpbmcgaGlzIGdvYWwuCgpXaGF0IGFib3V0CgogICAgLSBJ ZiB5b3UgaGF2ZSBhIFdQbiBwaW4sIHlvdSBtYXkgd2FudCB0byBzZXQgYG5vLXdwYCBpbiB5b3Vy IERUIGZvcgogICAgICB0aGUgdGltZSBvZiB0aGUgdGVzdCwgdG8gb25seSBtYWtlIHVzZSBvZiBz b2Z0d2FyZSBwcm90ZWN0aW9uLgogICAgICBPdGhlcndpc2UsIGNsZWFyaW5nIHRoZSBsb2NraW5n IHN0YXRlIGRlcGVuZHMgb24gdGhlIFdQbgogICAgICBzaWduYWwgYW5kIGlmIGl0IGlzIHRpZWQg dG8gbG93LCB0aGUgZmxhc2ggd2lsbCBiZSBwZXJtYW5lbnRseQogICAgICBsb2NrZWQuCgoKPgo+ Pj4gKyAgICByb290QDE6fiMgZmxhc2hfbG9jayAtdSAvZGV2L210ZDAKPj4+ICsgICAgcm9vdEAx On4jIGZsYXNoX2xvY2sgLWwgL2Rldi9tdGQwICQoKCRzaXplIC0gKDIgKiAkYnMpKSkgMiAjIGxh c3QgdHdvCj4+PiArICAgIHJvb3RAMTp+IyBzaG93X3NlY3RvcnMKPj4+ICsgICAgc29mdHdhcmUg bG9ja2VkIHNlY3RvcnMKPj4+ICsgICAgIHJlZ2lvbiAoaW4gaGV4KSAgIHwgc3RhdHVzICAgfCAj YmxvY2tzCj4+PiArICAgICAtLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLQo+ Pj4gKyAgICAgMDAwMDAwMDAtMDNmZGZmZmYgfCB1bmxvY2tlZCB8IDEwMjIKPj4+ICsgICAgIDAz ZmUwMDAwLTAzZmZmZmZmIHwgICBsb2NrZWQgfCAyCj4+PiArICAgIHJvb3RAMTp+IyBmbGFzaF9s b2NrIC11IC9kZXYvbXRkMCAkKCgkc2l6ZSAtICgyICogJGJzKSkpIDEgIyBsYXN0IG9uZQo+Pgo+ PiBodWg/IHNob3VsZG4ndCB0aGF0IGJlIDEgKiAkYnM/Cj4KPiBJIGRvbid0IHRoaW5rIHNvOgo+ IC0gZmlyc3Qgd2UgbG9jayB0aGUgbGFzdCB0d28gYmxvY2tzIChvZmZzZXQ6IHNpemUgLSAyIGJs b2NrcywgbGVuZ3RoOiAyCj4gICBibG9ja3MpCj4gLSB0aGVuIHdlIHVubG9jayB0aGUgcGVudWx0 aW1hdGUgYmxvY2sgc28gdGhhdCBvbmx5IHRoZSBsYXN0IGJsb2NrCj4gICByZW1haW5zIGxvY2tl ZCAob2Zmc2V0OiBzaXplIC0gMiBibG9ja3MsIGxlbmd0aCAxKS4KClllcyB5b3UncmUgY29ycmVj dC4gSSd2ZSByZWFkIHRoZSAtdSBmb3IgYSAtbCAoYW5kIHNvbWVob3cgYXNzdW1lZAphIGNvbXBs ZXRlIHVubG9jayBpbiBiZXR3ZWVuKS4KCj4gSSB3ZSB3ZXJlIGRvaW5nIGZsYXNoX2xvY2sgLXUg PG10ZD4gJCgoJHNpemUgLSAoMSAqICRicykpKSAxLCB3ZSB3b3VsZAo+IGJlIGFza2luZyB0byB1 bmxvY2sgdGhlIHZlcnkgbGFzdCBibG9jayBhbmQga2VlcCBvbmx5IHRoZSBwZW51bHRpbWF0ZQo+ IGJsb2NrIGxvY2tlZCwgd2hpY2ggd291bGQgbm90IGJlIHN1cHBvcnRlZC4KPgo+IFRoYW5rcywK PiBNaXF1w6hsCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCkxpbnV4IE1URCBkaXNjdXNzaW9uIG1haWxpbmcgbGlzdApodHRwOi8vbGlzdHMu aW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW10ZC8K