From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.free-electrons.com ([62.4.15.54]) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1e44gD-0004eb-Hp for linux-mtd@lists.infradead.org; Mon, 16 Oct 2017 12:39:40 +0000 Date: Mon, 16 Oct 2017 14:39:04 +0200 From: Boris Brezillon To: Roger Quadros , Tony Lindgren Cc: linux-omap , "linux-mtd@lists.infradead.org" , "Cooper Jr., Franklin" Subject: Re: gpmc-nand broken since v4.12 Message-ID: <20171016143904.098eaa50@bbrezillon> In-Reply-To: References: <7eae9266-558f-6578-66d7-7ab0eb659a81@ti.com> <20171013145033.5d1d9647@bbrezillon> <20171013222458.3f4c103e@bbrezillon> <20171013222907.16adf410@bbrezillon> <20171016133457.74b2773f@bbrezillon> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , On Mon, 16 Oct 2017 15:12:38 +0300 Roger Quadros wrote: > =EF=BB=BFHi Boris, >=20 >=20 > Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/= Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki >=20 > On 16/10/17 14:34, Boris Brezillon wrote: > > Hi Roger, > >=20 > > On Mon, 16 Oct 2017 13:22:04 +0300 > > Roger Quadros wrote: > > =20 > >> =EF=BB=BF > >> Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunn= us/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki > >> > >> On 13/10/17 23:29, Boris Brezillon wrote: =20 > >>> On Fri, 13 Oct 2017 22:24:58 +0200 > >>> Boris Brezillon wrote: > >>> =20 > >>>> On Fri, 13 Oct 2017 14:50:33 +0200 > >>>> Boris Brezillon wrote: > >>>> =20 > >>>>> On Fri, 13 Oct 2017 14:57:29 +0300 > >>>>> Roger Quadros wrote: > >>>>> =20 > >>>>>> =EF=BB=BFHi Boris, > >>>>>> > >>>>>> NAND on gpmc-omap breaks for me while doing a unmount of a ubi vol= ume since v4.12 > >>>>>> > >>>>>> Behaviour follows through in v4.13 and v4.14-rc as well. > >>>>>> > >>>>>> Do you have any idea about this? =20 > >>>> > >>>> More info on what has changed in 4.12: we no longer allocate the > >>>> nand_buffer struct + its internal buffer using a single big kmalloc > >>>> call, which means the nand_buffer struct is now likely to be allocat= ed > >>>> in a small object slab (sizeof(nand_buffers) =3D 12). If you have a > >>>> use-after-free bug somewhere in the kernel, it might corrupt the = =20 > >> > >> Spot on. Problem starts from commit 4d5dea5725f3aa95b9b64e252540e435dd= 216dbc > >> "mtd: nand: allocate aligned buffers if NAND_OWN_BUFFERS is unset" > >> =20 > >>> > >>> I meant buffer-overflow, not use-after-free. =20 > >> > >> Your analysis seems correct. > >> =20 > >>> =20 > >>>> nand_buffers object, which might explain the bug you see here. > >>>> =20 > >>>>> > >>>>> Can you try with this patch [1] applied and paste me the values pri= nted > >>>>> just before the crash? > >>>>> > >>>>> [1]http://code.bulix.org/lc8xk0-209746 =20 > >> > >> =3D=3D unmounting volume > >> [ 36.308792] nand: nand_write_subpage_hwecc:2575 ecc_calc =3D (nul= l) oob_poi =3D ed096800 > >> [ 36.317319] mtd_ooblayout_set_bytes:1330 dst =3D ed096802 src =3D = (null) > >> [ 36.324162] Unable to handle kernel NULL pointer dereference at vir= tual address 00000000 > >> > >> > >> Running the following patch > >> https://hastebin.com/ulogurutuz.php > >> shows > >> > >> [ 37.260689] nand: nand_write_subpage_hwecc:2547:A ecc_calc =3D ed11= 6e40 oob_poi =3D ed117800 > >> [ 37.260772] nand: nand_write_subpage_hwecc:2556:A1:step 0, ecc_calc= =3D ed116e40 > >> [ 37.260779] nand: nand_write_subpage_hwecc:2562:A2:step 0, ecc_calc= =3D ed116e40 > >> [ 37.260834] nand: nand_write_subpage_hwecc:2556:A1:step 1, ecc_calc= =3D ed116e40 > >> [ 37.260840] nand: nand_write_subpage_hwecc:2567:A3-pre:step 1, ecc_= calc =3D ed116e40 > >> [ 37.260846] omap_calculate_ecc_bch > >> [ 37.260856] nand: nand_write_subpage_hwecc:2570:A3-post:step 1, ecc= _calc =3D (null) > >> [ 37.260912] nand: nand_write_subpage_hwecc:2556:A1:step 2, ecc_calc= =3D (null) > >> [ 37.260918] nand: nand_write_subpage_hwecc:2562:A2:step 2, ecc_calc= =3D (null) > >> [ 37.260972] nand: nand_write_subpage_hwecc:2556:A1:step 3, ecc_calc= =3D (null) > >> [ 37.260978] nand: nand_write_subpage_hwecc:2562:A2:step 3, ecc_calc= =3D (null) > >> [ 37.260984] nand: nand_write_subpage_hwecc:2587:B ecc_calc =3D (n= ull) oob_poi =3D ed117800 > >> [ 37.260991] mtd_ooblayout_set_bytes:1330 dst =3D ed117802 src =3D = (null) > >> > >> which means omap_calculate_ecc_bch() it the culprit. > >> > >> Looks like the function calculates and stores ECC for all sectors even= if we just want ECC > >> for just one sector (sub-page). =20 > >=20 > > Yes, looks like you find the root cause. > > =20 > >> > >> Is my understanding correct > >> - We should not be hooking the multi-sector ECC calculator omap_calcul= ate_ecc_bch() to ecc.calculate > >> - provide a new one sector ECC calculator function (for BCH4/8/16) for= omap and hook it to ecc.calculate > >> OR > >> - override nand_read_subpage() and nand_write_subpage() using omap spe= cific implementation (for BCH4/8/16). =20 > >=20 > > Second solution sounds simpler because the ECC sector information is > > not passed to ecc->calculate() hook, which means you'd have to extract > > it from the ecc_calc pointer: > >=20 > > (uintptr_t)(ecc_calc - chip->buffers->ecccalc) / chip->ecc.size =20 >=20 > I don't think we need ECC sector number at all if we're always going to d= o a transfer > of one sector of data after calling ecc.hwctl(NAND_ECC_READ/WRITE) and be= fore calling ecc.calculate. >=20 > My understanding is that the ECC calculators sector 0 registers will alwa= ys contain > the right content irrespective of which sector we transfer as long as we = do, > ecc.hwctl(mtd, NAND_ECC_READ/WRITE); > transfer one sector; > ecc.calculate(); Ok, then the first solution sounds good too. >=20 > Why isn't there a nand_read_subpage_hwecc()? Probably because nobody ever needed it. Feel free to add it if you think this is necessary. > In the current form a subpage read won't work if > if ecc->mode is NAND_ECC_HW and controllers expect a ecc.hwctl(NAND_ECC_R= EAD) before > calling ecc.calculate(). >=20 > For the OMAP case I can override both subpage functions. > Is there a good way to test if subpage read/writes are working as they sh= ould? There's a nandsubpage test [1] in mtd-utils. [1]http://git.infradead.org/mtd-utils.git/blob/HEAD:/tests/mtd-tests/nandpa= getest.c From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Brezillon Subject: Re: gpmc-nand broken since v4.12 Date: Mon, 16 Oct 2017 14:39:04 +0200 Message-ID: <20171016143904.098eaa50@bbrezillon> References: <7eae9266-558f-6578-66d7-7ab0eb659a81@ti.com> <20171013145033.5d1d9647@bbrezillon> <20171013222458.3f4c103e@bbrezillon> <20171013222907.16adf410@bbrezillon> <20171016133457.74b2773f@bbrezillon> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-mtd" Errors-To: linux-mtd-bounces+gldm-linux-mtd-36=gmane.org@lists.infradead.org To: Roger Quadros , Tony Lindgren Cc: linux-omap , "linux-mtd@lists.infradead.org" , "Cooper Jr., Franklin" List-Id: linux-omap@vger.kernel.org T24gTW9uLCAxNiBPY3QgMjAxNyAxNToxMjozOCArMDMwMApSb2dlciBRdWFkcm9zIDxyb2dlcnFA dGkuY29tPiB3cm90ZToKCj4g77u/SGkgQm9yaXMsCj4gCj4gCj4gVGV4YXMgSW5zdHJ1bWVudHMg RmlubGFuZCBPeSwgUG9ya2thbGFua2F0dSAyMiwgMDAxODAgSGVsc2lua2kuIFktdHVubnVzL0J1 c2luZXNzIElEOiAwNjE1NTIxLTQuIEtvdGlwYWlra2EvRG9taWNpbGU6IEhlbHNpbmtpCj4gCj4g T24gMTYvMTAvMTcgMTQ6MzQsIEJvcmlzIEJyZXppbGxvbiB3cm90ZToKPiA+IEhpIFJvZ2VyLAo+ ID4gCj4gPiBPbiBNb24sIDE2IE9jdCAyMDE3IDEzOjIyOjA0ICswMzAwCj4gPiBSb2dlciBRdWFk cm9zIDxyb2dlcnFAdGkuY29tPiB3cm90ZToKPiA+ICAgCj4gPj4g77u/Cj4gPj4gVGV4YXMgSW5z dHJ1bWVudHMgRmlubGFuZCBPeSwgUG9ya2thbGFua2F0dSAyMiwgMDAxODAgSGVsc2lua2kuIFkt dHVubnVzL0J1c2luZXNzIElEOiAwNjE1NTIxLTQuIEtvdGlwYWlra2EvRG9taWNpbGU6IEhlbHNp bmtpCj4gPj4KPiA+PiBPbiAxMy8xMC8xNyAyMzoyOSwgQm9yaXMgQnJlemlsbG9uIHdyb3RlOiAg Cj4gPj4+IE9uIEZyaSwgMTMgT2N0IDIwMTcgMjI6MjQ6NTggKzAyMDAKPiA+Pj4gQm9yaXMgQnJl emlsbG9uIDxib3Jpcy5icmV6aWxsb25AZnJlZS1lbGVjdHJvbnMuY29tPiB3cm90ZToKPiA+Pj4g ICAgIAo+ID4+Pj4gT24gRnJpLCAxMyBPY3QgMjAxNyAxNDo1MDozMyArMDIwMAo+ID4+Pj4gQm9y aXMgQnJlemlsbG9uIDxib3Jpcy5icmV6aWxsb25AZnJlZS1lbGVjdHJvbnMuY29tPiB3cm90ZToK PiA+Pj4+ICAgIAo+ID4+Pj4+IE9uIEZyaSwgMTMgT2N0IDIwMTcgMTQ6NTc6MjkgKzAzMDAKPiA+ Pj4+PiBSb2dlciBRdWFkcm9zIDxyb2dlcnFAdGkuY29tPiB3cm90ZToKPiA+Pj4+PiAgICAgICAK PiA+Pj4+Pj4g77u/SGkgQm9yaXMsCj4gPj4+Pj4+Cj4gPj4+Pj4+IE5BTkQgb24gZ3BtYy1vbWFw IGJyZWFrcyBmb3IgbWUgd2hpbGUgZG9pbmcgYSB1bm1vdW50IG9mIGEgdWJpIHZvbHVtZSBzaW5j ZSB2NC4xMgo+ID4+Pj4+Pgo+ID4+Pj4+PiBCZWhhdmlvdXIgZm9sbG93cyB0aHJvdWdoIGluIHY0 LjEzIGFuZCB2NC4xNC1yYyBhcyB3ZWxsLgo+ID4+Pj4+Pgo+ID4+Pj4+PiBEbyB5b3UgaGF2ZSBh bnkgaWRlYSBhYm91dCB0aGlzPyAgICAgIAo+ID4+Pj4KPiA+Pj4+IE1vcmUgaW5mbyBvbiB3aGF0 IGhhcyBjaGFuZ2VkIGluIDQuMTI6IHdlIG5vIGxvbmdlciBhbGxvY2F0ZSB0aGUKPiA+Pj4+IG5h bmRfYnVmZmVyIHN0cnVjdCArIGl0cyBpbnRlcm5hbCBidWZmZXIgdXNpbmcgYSBzaW5nbGUgYmln IGttYWxsb2MKPiA+Pj4+IGNhbGwsIHdoaWNoIG1lYW5zIHRoZSBuYW5kX2J1ZmZlciBzdHJ1Y3Qg aXMgbm93IGxpa2VseSB0byBiZSBhbGxvY2F0ZWQKPiA+Pj4+IGluIGEgc21hbGwgb2JqZWN0IHNs YWIgKHNpemVvZihuYW5kX2J1ZmZlcnMpID0gMTIpLiBJZiB5b3UgaGF2ZSBhCj4gPj4+PiB1c2Ut YWZ0ZXItZnJlZSBidWcgc29tZXdoZXJlIGluIHRoZSBrZXJuZWwsIGl0IG1pZ2h0IGNvcnJ1cHQg dGhlICAgIAo+ID4+Cj4gPj4gU3BvdCBvbi4gUHJvYmxlbSBzdGFydHMgZnJvbSBjb21taXQgNGQ1 ZGVhNTcyNWYzYWE5NWI5YjY0ZTI1MjU0MGU0MzVkZDIxNmRiYwo+ID4+ICJtdGQ6IG5hbmQ6IGFs bG9jYXRlIGFsaWduZWQgYnVmZmVycyBpZiBOQU5EX09XTl9CVUZGRVJTIGlzIHVuc2V0Igo+ID4+ ICAKPiA+Pj4KPiA+Pj4gSSBtZWFudCBidWZmZXItb3ZlcmZsb3csIG5vdCB1c2UtYWZ0ZXItZnJl ZS4gICAgCj4gPj4KPiA+PiBZb3VyIGFuYWx5c2lzIHNlZW1zIGNvcnJlY3QuCj4gPj4gIAo+ID4+ PiAgICAgCj4gPj4+PiBuYW5kX2J1ZmZlcnMgb2JqZWN0LCB3aGljaCBtaWdodCBleHBsYWluIHRo ZSBidWcgeW91IHNlZSBoZXJlLgo+ID4+Pj4gICAgCj4gPj4+Pj4KPiA+Pj4+PiBDYW4geW91IHRy eSB3aXRoIHRoaXMgcGF0Y2ggWzFdIGFwcGxpZWQgYW5kIHBhc3RlIG1lIHRoZSB2YWx1ZXMgcHJp bnRlZAo+ID4+Pj4+IGp1c3QgYmVmb3JlIHRoZSBjcmFzaD8KPiA+Pj4+Pgo+ID4+Pj4+IFsxXWh0 dHA6Ly9jb2RlLmJ1bGl4Lm9yZy9sYzh4azAtMjA5NzQ2ICAgIAo+ID4+Cj4gPj4gPT0gdW5tb3Vu dGluZyB2b2x1bWUKPiA+PiBbICAgMzYuMzA4NzkyXSBuYW5kOiBuYW5kX3dyaXRlX3N1YnBhZ2Vf aHdlY2M6MjU3NSBlY2NfY2FsYyA9ICAgKG51bGwpIG9vYl9wb2kgPSBlZDA5NjgwMAo+ID4+IFsg ICAzNi4zMTczMTldIG10ZF9vb2JsYXlvdXRfc2V0X2J5dGVzOjEzMzAgZHN0ID0gZWQwOTY4MDIg c3JjID0gICAobnVsbCkKPiA+PiBbICAgMzYuMzI0MTYyXSBVbmFibGUgdG8gaGFuZGxlIGtlcm5l bCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UgYXQgdmlydHVhbCBhZGRyZXNzIDAwMDAwMDAwCj4g Pj4KPiA+Pgo+ID4+IFJ1bm5pbmcgdGhlIGZvbGxvd2luZyBwYXRjaAo+ID4+IGh0dHBzOi8vaGFz dGViaW4uY29tL3Vsb2d1cnV0dXoucGhwCj4gPj4gc2hvd3MKPiA+Pgo+ID4+IFsgICAzNy4yNjA2 ODldIG5hbmQ6IG5hbmRfd3JpdGVfc3VicGFnZV9od2VjYzoyNTQ3OkEgZWNjX2NhbGMgPSBlZDEx NmU0MCBvb2JfcG9pID0gZWQxMTc4MDAKPiA+PiBbICAgMzcuMjYwNzcyXSBuYW5kOiBuYW5kX3dy aXRlX3N1YnBhZ2VfaHdlY2M6MjU1NjpBMTpzdGVwIDAsIGVjY19jYWxjID0gZWQxMTZlNDAKPiA+ PiBbICAgMzcuMjYwNzc5XSBuYW5kOiBuYW5kX3dyaXRlX3N1YnBhZ2VfaHdlY2M6MjU2MjpBMjpz dGVwIDAsIGVjY19jYWxjID0gZWQxMTZlNDAKPiA+PiBbICAgMzcuMjYwODM0XSBuYW5kOiBuYW5k X3dyaXRlX3N1YnBhZ2VfaHdlY2M6MjU1NjpBMTpzdGVwIDEsIGVjY19jYWxjID0gZWQxMTZlNDAK PiA+PiBbICAgMzcuMjYwODQwXSBuYW5kOiBuYW5kX3dyaXRlX3N1YnBhZ2VfaHdlY2M6MjU2NzpB My1wcmU6c3RlcCAxLCBlY2NfY2FsYyA9IGVkMTE2ZTQwCj4gPj4gWyAgIDM3LjI2MDg0Nl0gb21h cF9jYWxjdWxhdGVfZWNjX2JjaAo+ID4+IFsgICAzNy4yNjA4NTZdIG5hbmQ6IG5hbmRfd3JpdGVf c3VicGFnZV9od2VjYzoyNTcwOkEzLXBvc3Q6c3RlcCAxLCBlY2NfY2FsYyA9ICAgKG51bGwpCj4g Pj4gWyAgIDM3LjI2MDkxMl0gbmFuZDogbmFuZF93cml0ZV9zdWJwYWdlX2h3ZWNjOjI1NTY6QTE6 c3RlcCAyLCBlY2NfY2FsYyA9ICAgKG51bGwpCj4gPj4gWyAgIDM3LjI2MDkxOF0gbmFuZDogbmFu ZF93cml0ZV9zdWJwYWdlX2h3ZWNjOjI1NjI6QTI6c3RlcCAyLCBlY2NfY2FsYyA9ICAgKG51bGwp Cj4gPj4gWyAgIDM3LjI2MDk3Ml0gbmFuZDogbmFuZF93cml0ZV9zdWJwYWdlX2h3ZWNjOjI1NTY6 QTE6c3RlcCAzLCBlY2NfY2FsYyA9ICAgKG51bGwpCj4gPj4gWyAgIDM3LjI2MDk3OF0gbmFuZDog bmFuZF93cml0ZV9zdWJwYWdlX2h3ZWNjOjI1NjI6QTI6c3RlcCAzLCBlY2NfY2FsYyA9ICAgKG51 bGwpCj4gPj4gWyAgIDM3LjI2MDk4NF0gbmFuZDogbmFuZF93cml0ZV9zdWJwYWdlX2h3ZWNjOjI1 ODc6QiBlY2NfY2FsYyA9ICAgKG51bGwpIG9vYl9wb2kgPSBlZDExNzgwMAo+ID4+IFsgICAzNy4y NjA5OTFdIG10ZF9vb2JsYXlvdXRfc2V0X2J5dGVzOjEzMzAgZHN0ID0gZWQxMTc4MDIgc3JjID0g ICAobnVsbCkKPiA+Pgo+ID4+IHdoaWNoIG1lYW5zIG9tYXBfY2FsY3VsYXRlX2VjY19iY2goKSBp dCB0aGUgY3VscHJpdC4KPiA+Pgo+ID4+IExvb2tzIGxpa2UgdGhlIGZ1bmN0aW9uIGNhbGN1bGF0 ZXMgYW5kIHN0b3JlcyBFQ0MgZm9yIGFsbCBzZWN0b3JzIGV2ZW4gaWYgd2UganVzdCB3YW50IEVD Qwo+ID4+IGZvciBqdXN0IG9uZSBzZWN0b3IgKHN1Yi1wYWdlKS4gIAo+ID4gCj4gPiBZZXMsIGxv b2tzIGxpa2UgeW91IGZpbmQgdGhlIHJvb3QgY2F1c2UuCj4gPiAgIAo+ID4+Cj4gPj4gSXMgbXkg dW5kZXJzdGFuZGluZyBjb3JyZWN0Cj4gPj4gLSBXZSBzaG91bGQgbm90IGJlIGhvb2tpbmcgdGhl IG11bHRpLXNlY3RvciBFQ0MgY2FsY3VsYXRvciBvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoKCkgdG8g ZWNjLmNhbGN1bGF0ZQo+ID4+IC0gcHJvdmlkZSBhIG5ldyBvbmUgc2VjdG9yIEVDQyBjYWxjdWxh dG9yIGZ1bmN0aW9uIChmb3IgQkNINC84LzE2KSBmb3Igb21hcCBhbmQgaG9vayBpdCB0byBlY2Mu Y2FsY3VsYXRlCj4gPj4gT1IKPiA+PiAtIG92ZXJyaWRlIG5hbmRfcmVhZF9zdWJwYWdlKCkgYW5k IG5hbmRfd3JpdGVfc3VicGFnZSgpIHVzaW5nIG9tYXAgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24g KGZvciBCQ0g0LzgvMTYpLiAgCj4gPiAKPiA+IFNlY29uZCBzb2x1dGlvbiBzb3VuZHMgc2ltcGxl ciBiZWNhdXNlIHRoZSBFQ0Mgc2VjdG9yIGluZm9ybWF0aW9uIGlzCj4gPiBub3QgcGFzc2VkIHRv IGVjYy0+Y2FsY3VsYXRlKCkgaG9vaywgd2hpY2ggbWVhbnMgeW91J2QgaGF2ZSB0byBleHRyYWN0 Cj4gPiBpdCBmcm9tIHRoZSBlY2NfY2FsYyBwb2ludGVyOgo+ID4gCj4gPiAJKHVpbnRwdHJfdCko ZWNjX2NhbGMgLSBjaGlwLT5idWZmZXJzLT5lY2NjYWxjKSAvIGNoaXAtPmVjYy5zaXplICAKPiAK PiBJIGRvbid0IHRoaW5rIHdlIG5lZWQgRUNDIHNlY3RvciBudW1iZXIgYXQgYWxsIGlmIHdlJ3Jl IGFsd2F5cyBnb2luZyB0byBkbyBhIHRyYW5zZmVyCj4gb2Ygb25lIHNlY3RvciBvZiBkYXRhIGFm dGVyIGNhbGxpbmcgZWNjLmh3Y3RsKE5BTkRfRUNDX1JFQUQvV1JJVEUpIGFuZCBiZWZvcmUgY2Fs bGluZyBlY2MuY2FsY3VsYXRlLgo+IAo+IE15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCB0aGUgRUND IGNhbGN1bGF0b3JzIHNlY3RvciAwIHJlZ2lzdGVycyB3aWxsIGFsd2F5cyBjb250YWluCj4gdGhl IHJpZ2h0IGNvbnRlbnQgaXJyZXNwZWN0aXZlIG9mIHdoaWNoIHNlY3RvciB3ZSB0cmFuc2ZlciBh cyBsb25nIGFzIHdlIGRvLAo+IAllY2MuaHdjdGwobXRkLCBOQU5EX0VDQ19SRUFEL1dSSVRFKTsK PiAJdHJhbnNmZXIgb25lIHNlY3RvcjsKPiAJZWNjLmNhbGN1bGF0ZSgpOwoKT2ssIHRoZW4gdGhl IGZpcnN0IHNvbHV0aW9uIHNvdW5kcyBnb29kIHRvby4KCj4gCj4gV2h5IGlzbid0IHRoZXJlIGEg bmFuZF9yZWFkX3N1YnBhZ2VfaHdlY2MoKT8KClByb2JhYmx5IGJlY2F1c2Ugbm9ib2R5IGV2ZXIg bmVlZGVkIGl0LiBGZWVsIGZyZWUgdG8gYWRkIGl0IGlmIHlvdQp0aGluayB0aGlzIGlzIG5lY2Vz c2FyeS4KCj4gSW4gdGhlIGN1cnJlbnQgZm9ybSBhIHN1YnBhZ2UgcmVhZCB3b24ndCB3b3JrIGlm Cj4gaWYgZWNjLT5tb2RlIGlzIE5BTkRfRUNDX0hXIGFuZCBjb250cm9sbGVycyBleHBlY3QgYSBl Y2MuaHdjdGwoTkFORF9FQ0NfUkVBRCkgYmVmb3JlCj4gY2FsbGluZyBlY2MuY2FsY3VsYXRlKCku Cj4gCj4gRm9yIHRoZSBPTUFQIGNhc2UgSSBjYW4gb3ZlcnJpZGUgYm90aCBzdWJwYWdlIGZ1bmN0 aW9ucy4KPiBJcyB0aGVyZSBhIGdvb2Qgd2F5IHRvIHRlc3QgaWYgc3VicGFnZSByZWFkL3dyaXRl cyBhcmUgd29ya2luZyBhcyB0aGV5IHNob3VsZD8KClRoZXJlJ3MgYSBuYW5kc3VicGFnZSB0ZXN0 IFsxXSBpbiBtdGQtdXRpbHMuCgpbMV1odHRwOi8vZ2l0LmluZnJhZGVhZC5vcmcvbXRkLXV0aWxz LmdpdC9ibG9iL0hFQUQ6L3Rlc3RzL210ZC10ZXN0cy9uYW5kcGFnZXRlc3QuYwoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4IE1URCBk aXNjdXNzaW9uIG1haWxpbmcgbGlzdApodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2xpbnV4LW10ZC8K