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 X-Spam-Level: X-Spam-Status: No, score=-7.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 46548C33CAD for ; Mon, 13 Jan 2020 14:16:39 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 051C720661 for ; Mon, 13 Jan 2020 14:16:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="Nmbcii2P"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="bxwqALCx" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 051C720661 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=kXh4dbmZsPUjLBcAfhZRs4/afwjsf7rgtc2MNWgW9iU=; b=Nmbcii2P0RePui DlRbNSrxqmGtBENp9rvmduqyPbapnVBeoWA6IJS2e1KlWq1E4a6hEw9oRBSGa9Xbn1HapGeCKEgGJ 0shaAF6TTWnl6xcuPAU63R69Ul19fQfNigX9EuPRxFp2jY2eY9yJL57W457Y0U80sfwgHaA7W1AWs 5DzlOA1tTQyZaARmpVG5hA3v31TMGzqbB84hbPW+opvFwNgqKf7CwQ1GuZQSAuUP1L4kGjacD7dGL bZFikh5aKYS5rfLMOkLsaowBxM0KSpKm0ycQMdOkO3aNZqdz89eaOoMBFrVMiOqTBSjGEV/DgJgud 7p9uE8gOBGCakj3hVvsg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ir0Vx-0003NJ-PA; Mon, 13 Jan 2020 14:16:21 +0000 Received: from merlin.infradead.org ([2001:8b0:10b:1231::1]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ir0Vq-0003HB-Cy; Mon, 13 Jan 2020 14:16:15 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=merlin.20170209; h=Content-Transfer-Encoding:Content-Type: MIME-Version:References:In-Reply-To:Message-ID:Subject:Cc:To:From:Date:Sender :Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=KcGu/db24kGYodcRgxPPq4DsT/2e9G7RP7nlC1xb5Aw=; b=bxwqALCxPRInFkQTRXocHuzPRd kio3bvQAB545/vFljWhpFWbPXLRueu7Ix4B6Wt5pXJUlbDXaqrH8sGDntwP1cqkxdN0ws47Y342ya mCptG0O3YHsGt1iMRghJHADe0Xhcfl1L1M8cXcU/gsDD9800P4tysMlP4rAuAcCeXNjT0mUYD5KRd gc/vfVAfvd7qv83XHJFSFIwXeUEbbvg1LnDdPInZ2tkvKpgVtcdXLvAabpZkyGDdWrcT+JE5VtZqt dKO643nXfMqs398ARLymdWuwai6W4bRasbybR6ZiH/vjlBCeBvglAYJh4nFAAtus1arWu07xS3YZ/ TuCx7NtA==; Received: from relay8-d.mail.gandi.net ([217.70.183.201]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ir0Vl-0006UN-GP; Mon, 13 Jan 2020 14:16:12 +0000 X-Originating-IP: 90.76.211.102 Received: from xps13 (lfbn-tou-1-1151-102.w90-76.abo.wanadoo.fr [90.76.211.102]) (Authenticated sender: miquel.raynal@bootlin.com) by relay8-d.mail.gandi.net (Postfix) with ESMTPSA id 5D4F31BF20B; Mon, 13 Jan 2020 14:15:30 +0000 (UTC) Date: Mon, 13 Jan 2020 15:15:29 +0100 From: Miquel Raynal To: Johan Jonker Subject: Re: [RFC PATCH v1 02/10] mtd: nand: raw: add rockchip nand controller driver Message-ID: <20200113151529.1ecba50e@xps13> In-Reply-To: <7a477af0-1448-4f26-4004-9331978e824c@gmail.com> References: <20200108205338.11369-1-jbx6244@gmail.com> <20200108205338.11369-3-jbx6244@gmail.com> <20200110120534.1b4026b0@xps13> <7a477af0-1448-4f26-4004-9331978e824c@gmail.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, devicetree@vger.kernel.org, vigneshr@ti.com, richard@nod.at, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, robh+dt@kernel.org, linux-mtd@lists.infradead.org, linux-arm-kernel@lists.infradead.org, heiko@sntech.de 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 SGkgSm9oYW4sCgpKb2hhbiBKb25rZXIgPGpieDYyNDRAZ21haWwuY29tPiB3cm90ZSBvbiBTdW4s IDEyIEphbiAyMDIwIDE4OjI2OjIwCiswMTAwOgoKPiBIaSBNaXF1ZWwsCj4gCj4gVGhhbmsgeW91 IGZvciB5b3VyIGRldGFpbGVkIGFuZCB1c2VmdWwgcmV2aWV3Lgo+IAo+IFdpdGhvdXQgbWFudWZh Y3R1cmVyIHN1cHBvcnQgSSBtdXN0IHNjcmFwZSBteSBpbmZvcm1hdGlvbgo+IGZyb20gYWxsIG92 ZXIgdGhlIGludGVybmV0LCB0b2dldGhlciB3aXRoIHNsb3cgaW50ZXJwcmV0YXRpb24gb2YKPiBS b2NrY2hpcCBkcml2ZXJzLgo+IFNvIHBsZWFzZSBoYXZlIHNvbWUgcGF0aWVuY2Ugd2l0aCBteSB1 cGRhdGVzIGFuZCBuZXcgdmVyc2lvbnMuCgpUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIGh1cnJ5LCBp dCBpcyBncmVhdCB0aGF0IHlvdSB3b3JrIG9uIHRoaXMhCgo+IAo+IEJlbG93IGFyZSBzb21lIGNv bW1lbnRzIGFuZCBxdWVzdGlvbnMgaW4gcmFuZG9tIG9yZGVyLgo+IAo+IC8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vCj4gCj4gVG8gcHJldmVudCBndWVzc2luZyBnYW1lcyBjb3VsZCB5b3Ug Y29uZmlybSB0aGUgZm9sbG93aW5nIG5hbWVzOgo+IAo+IGRyaXZlciBmaWxlIG5hbWU6ICAgcm9j a2NoaXAtbmFuZC1jb250cm9sbGVyLmMKCkZpbmUKCj4gZG9jdW1lbnQgZmlsZSBuYW1lOiByb2Nr Y2hpcC1uYW5kLWNvbnRyb2xsZXIueWFtbAoKSSB0aGluayByb2NrY2hpcCxuYW5kLWNvbnRyb2xs ZXIueWFtbCBpcyBwcmVmZXJyZWQuCgo+IAo+IGNvbXBhdGlibGU6ICJyb2NrY2hpcCxuYW5kYy12 NiIKCnJvY2tjaGlwLG5hbmQtY29udHJvbGxlci12NgoKPiBjb21wYXRpYmxlOiAicm9ja2NoaXAs bmFuZGMtdjkiCgpzYW1lIGFzIGFib3ZlIHdpdGggLXY5IGFzIHN1ZmZpeC4KCgpbLi4uXQoKPiBK YW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDUzMzg4XSBuYW5kOiA4MTkyIE1p QiwgTUxDLAplcmFzZQoKSnVzdCB0byBiZSBjbGVhciwgTUxDIGlzIG5vdCB5ZXQgc3VwcG9ydGVk IGluIG1haW5saW5lLiBUaGVyZSBpcyBhCnBhdGNoIHNlcmllcyB0aGF0IGFpbXMgYXQgc3VwcG9y dGluZyBNTEMgaW4gcHNldWRvLVNMQyBtb2RlIGJ1dCBkbyBub3QKdXNlIE1MQyBhcyBhIHJlbGlh YmxlIHN0b3JhZ2UgbWVkaXVtLgoKPiBzaXplOiAyMDQ4IEtpQiwgcGFnZSBzaXplOiA4MTkyLCBP T0Igc2l6ZTogNjQwCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA1NDA1 MF0gcm9ja2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPm51bWNo aXBzID0gMQo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTQ3NDBdIHJv Y2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5jaGlwc2l6ZSA9 IDg1ODk5MzQ1OTIKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU1Mzgw XSByb2NrY2hpcC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+cGFnZW1h c2sgPSAgICBmZmZmZgo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTU5 OTRdIHJvY2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5iYWRi bG9ja3BvcyA9IDAKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU2NTkx XSByb2NrY2hpcC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+Y2hpcF9z aGlmdCA9IDMzCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA1NzE3NF0g cm9ja2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPnBhZ2Vfc2hp ZnQgPSAxMwo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTc3NTFdIHJv Y2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5waHlzX2VyYXNl X3NoaWZ0ID0gMjEKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU4MzY2 XSByb2NrY2hpcC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLm1v ZGUgPSAzCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA1ODkyMF0gcm9j a2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPmVjYy5zdGVwcyA9 IDgKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU5NDgxXSByb2NrY2hp cC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLmJ5dGVzID0gNzAK PiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYwMDQ5XSByb2NrY2hpcC1u YW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLnRvdGFsID0gMAo+IEph biAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjA2MDddIHJvY2tjaGlwLW5hbmRj Cj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5lY2MucHJlcGFkID0gNAo+IEphbiAg MSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjExNzVdIHJvY2tjaGlwLW5hbmRjCj4g MTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5lY2Muc2l6ZSA9IDEwMjQKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYxNzQ4XSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLnN0cmVuZ3RoID0gNDAKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYyMzQxXSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbXRkLT5vb2JsYXlvdXQgPSA5MWNlOWNlMgo+IEphbiAg MSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjI5NDNdIHJvY2tjaGlwLW5hbmRjCj4g MTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBtdGQtPmZsYWdzID0gMDAwMDAwMDAKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYzNTE4XSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbXRkLT5zaXplID0gODU4OTkzNDU5Mgo+IEphbiAgMSAw MDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjQwOThdIHJvY2tjaGlwLW5hbmRjCj4gMTA1 MDAwMDAubmFuZC1jb250cm9sbGVyOiBtdGQtPmVyYXNlc2l6ZSA9IDIwOTcxNTIKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDY0ODE1XSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbXRkLT53cml0ZXNpemUgPSA4MTkyCj4gSmFuICAxIDAw OjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA2NTQxM10gcm9ja2NoaXAtbmFuZGMKPiAxMDUw MDAwMC5uYW5kLWNvbnRyb2xsZXI6IG10ZC0+b29ic2l6ZSA9IDY0MAo+IEphbiAgMSAwMDowMjoy NyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjg5ODVdIDEgZml4ZWQtcGFydGl0aW9ucwo+IHBhcnRp dGlvbnMgZm91bmQgb24gTVREIGRldmljZSAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXIuMAo+IEph biAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjkxOTBdIENyZWF0aW5nIDEgTVRE IHBhcnRpdGlvbnMKPiBvbiAiMTA1MDAwMDAubmFuZC1jb250cm9sbGVyLjAiOgo+IEphbiAgMSAw MDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNzIzNzVdCj4gMHgwMDAwMDAwMDAwMDAtMHgw MDAwMDA0MDAwMDAgOiAicGFyYW1ldGVyIgo+IAo+IAo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBr ZXJuZWw6IFsgIDE0Ny4wNzU2NDldIHJvY2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250 cm9sbGVyOiBSOjB4MDBmZiBjczowCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAg MTQ3LjA3OTQyM10gcm9ja2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IFI6 MHgwMWZmIGNzOjAKPiAKPiAKPiBEZXNwaXRlIG5hbmQtPm9wdGlvbnMgPSBOQU5EX1NLSVBfQkJU U0NBTi4KPiAKPiBXaGF0IGlzIHRoZSByZWFzb24gZm9yIHRoZXNlIDIgcmtfbmFuZGNfaHdfc3lu ZHJvbWVfZWNjX3JlYWRfcGFnZSgpCj4gY29tbWFuZHMgYXQgcGFnZSBSOjB4MDBmZiBhbmQgUjow eDAxZmYgcmlnaHQgYWZ0ZXIgY3JlYXRpbmcKPiBwYXJ0aXRpb25zLgo+IAo+IFdoZW4gZW5hYmxl ZCBCQlRTQ0FOIE1URCBzdGFydHMgdG8gc3RvcmUgYXQgYWxsIGtpbmQgb2YgcGxhY2VzLiBDYW4K PiB5b3Ugc3RhdGUKClBsZWFzZSBkbyBub3QgbWl4IHRoZSB0d28gY29uY2VwdHM6Ci0gb24gY2hp cCBiYnQ6IHRoZSBsYXN0IGJsb2NrcyB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgdGhlIEJCLCB3aXRo b3V0LAogIHRoZSBCQlQgbXVzdCBiZSByZWNvbnN0cnVjdGVkIGJ5IHJlYWRpbmcgYWxsIHRoZSBi bG9ja3MuCi0gU0tJUF9CQlRfU0NBTjogZG8gbm90IGNvbnN0cnVjdCB0aGUgQkJUIGluIFJBTS4K ClBsZWFzZSB0cmFjZSB0aGUgY2FsbHMgKGR1bXBfc3RhY2soKSBtaWdodCBoZWxwIHlvdSkgdG8g c2VlIHdoYXQKZnVuY3Rpb24gYWN0dWFsbHkgY2FsbHMgdGhlIC0+cmVhZF9wYWdlKCkgaGVscGVy cy4KCj4gdGhlcmUgcGFnZSBhZGRyZXNzIGxvZ2ljLCBpZS4gV291bGQgdGhhdCBkYW1hZ2UgdGhl IGV4Y2lzdGluZyBSb2NrY2hpcAo+IGxheW91dD8KCkkgZG9uJ3Qga25vdyBhYm91dCB0aGUgZXhp c3RpbmcgUm9ja2NoaXAgbGF5b3V0LgoKPiAKPiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Lwo+IAo+IE5vIGJhZCBibG9jayBzdXBwb3J0Cj4gCj4gQmFzZWQgb246Cj4gZHJpdmVyczogbXRk OiBuYW5kOiByb2NrY2hpcCBuYW5kYyBhZGQgYmFkIGJsb2NrIGRldGVjdCBhcGkKPiBodHRwczov L2dpdGh1Yi5jb20vcm9ja2NoaXAtbGludXgvdS1ib290L2NvbW1pdC8KPiA3YWVjNzA0YTRlOWQ5 MzIyZjExMDJiY2Y2MWVlNWMzY2Y2ZWM3OTRkCj4gCj4gcm9ja2NoaXA6IGRyaXZlcnM6IG10ZDog bmFuZDogbW9kaWZ5IHRoZSBiYWQgYmxvY2sgZGV0ZWN0aW9uIHByb2Nlc3MKPiBodHRwczovL2dp dGh1Yi5jb20vcm9ja2NoaXAtbGludXgvdS1ib290L2NvbW1pdC8KPiBkNmQ3MDhkMWEzMjlhNjM2 OTE0M2U4ZGQzNGNmNGUyYzgxZDVkOTJmCj4gCj4gQkNIICAgICAgfCAgICAgIG9vYiBzaXplCj4g LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gMTY6IGJ5dGVzOiAyOCArIDQgPSAzMgo+IDI0OiBi eXRlczogNDIgKyA0ID0gNDYKPiA0MDogYnl0ZXM6IDcwICsgNCA9IDc0Cj4gNjA6IGJ5dGVzOiAx MDYgKyA0ID0gMTEwCj4gCj4gVGhlIGRhdGEgbGF5b3V0IHRoYXQgaXMgd3JpdHRlbiBieSBhbiBp bnRlcm5hbCBSb2NrY2hpcCBuYW5kYyBkbWEgaXM6Cj4gICAgIDEwMjQgYnl0ZXMgZGF0YSArIDMy IG9iYiArIDEwMjQgZGF0YSArIDMyIG9iYiAuLi4KPiAKPiBUaGUgTVREIHN5c3RlbSBob3dldmVy IHRyaWVzIHRvIGRldGVjdCBiYWQgYmxvY2sgZmxhZ3MgbG9jYXRlZCBhdDoKPiAgICAgMjA0OCwg NDA5NiwgODE5Mi4uLgoKQmFkIGJsb2NrIGZsYWdzIChzbyBjYWxsZWQgYmFkIGJsb2NrIG1hcmtl cnMsIGFicmV2aWF0ZWQgQkJNKSBhcmUgdGhlCmZpcnN0IHR3byBieXRlcyBvZiB0aGUgT09CLiBB IHBhZ2UgaXMgYWx3YXlzOgoKCTxYIGluLWJhbmQgYnl0ZXMgKGRhdGEpPjxZIG91dC1vZi1iYW5k IGJ5dGVzIChPT0IpPgoKTm8gbWF0dGVyIHRoZSB3YXkgdGhpcyBpcyBzdG9yZWQgb24gdGhlIE5B TkQgY2hpcCwgdGhlIHVzZXIgaXMKZXhwZWN0aW5nIGFsbCB0aGUgZGF0YSBieXRlcyB0b2dldGhl ciBhbmQgYWxsIHRoZSBPT0IgYnl0ZXMgdG9nZXRoZXIuCllvdSBtdXN0IHJlY29uc3RydWN0IHRo aXMuCgo+IFRoZSBzeXN0ZW0gY2hlY2tzIGZvciBiYWQgYmxvY2tzIGFuZCBsb29rcyBhdCB0aGUg d3JvbmcgYmFkIGJsb2NrCj4gbWFya2VyIGxvY2F0aW9uLgo+IFlpZmVuZyBaaGFvIHByb3Bvc2Vz IHRvIGFkZCBhIGJhZCBibG9jayBkZXRlY3Rpbmcgc3RyYXRlZ3kgYnkgZG9pbmcKPiBhIHJlYWQg d2l0aCBya19uYW5kY19od19zeW5kcm9tZV9lY2NfcmVhZF9wYWdlKCkgZmlyc3QsCj4gaWYgZmFp bHVyZSB0aGVuIGFzc3VtZSBpdCdzIHN0aWxsIHJhdyB1bndyaXR0ZW4gTkFORCBhbmQgdGVzdCBi eXRlcwo+IGFyZSBhdCB0aGUgcG9zaXRpb24gTVREIG5vcm1hbHkgd291bGQgY2hlY2sgZm9yIHJp Z2h0IGZyb20gdGhlCj4gZmFjdG9yeS4gV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgb24gYSBG VEwgY29udHJvbGxlZCBOQU5EIGl0Cj4gY3JlYXRlcyBhbiBhd2Z1bCBsb3Qgb2YgZXJyb3JzIGlu IHRoZSBrZXJuZWwgbG9nLCBiZWNhdXNlIGl0IHVzZXMgdGhlCj4gQkIgbWFya2VyIGZvciBkaXJ0 eSB0YWcgdHJpY2tzIGZvciB0aGVyZSBkYXRhIHN0b3JhZ2UuCj4gU28gd2hhdCBpcyBnb29kIGZv ciBhIHJhdyBlbXB0eSBOQU5EIHdpdGhvdXQgRlRMCj4gZG9lcyBub3Qgd29yayBmb3IgdGhlIG1h am9yaXR5IG9mIFJvY2tjaGlwIGRldmljZXMgSSB0aGluay4KPiAKPiBQbGVhc2UgYWR2aXNlIGZv ciBvdGhlciBvcHRpb25zLgoKVGhhdCdzIHNhZCB0aGF0IFJvY2tjaGlwIEJTUCBkb2VzIG5vdCBm b2xsb3cgc3RhbmRhcmQgcnVsZXMsIGJ1dCBJTUhPCnRoaXMga2luZCBvZiByZXNlYXJjaCBsb2dp YyBpcyB3YXkgdG9vIG11Y2ggZXJyb3IgcHJvbmUgYW5kIHRoaXMgaXMgbm90CnNvbWVodGluZyB3 ZSB3YW50IHRvIHBsYXkgd2l0aDogaWYgeW91IHN0YXJ0IGEgbWFpbmxpbmUga2VybmVsIHdpdGgg YQp3cm9uZyBsb2dpYywgdGhlbiBsYXRlciB5b3UgZml4IHRoZSBsb2dpYyBpbiBtYWlubGluZSwg eW91IG11c3Qgc3VwcG9ydAp0aGUgYnJva2VuIGxvZ2ljIGZvcmV2ZXIuCgpUaGlzIG1lYW5zIHlv dSBjYW5ub3QgYm9vdCBhIHZlbmRvciBrZXJuZWwgYW5kIGEgbWFpbmxpbmUga2VybmVsIG9uIHRo ZQpzYW1lIHBsYXRmb3JtIGFueW1vcmUuIFRoaXMgaXMgc2FkIGJ1dCB3ZSBjYW5ub3QgZmlnaHQg YWdhaW5zdCBpdC4KVW5sZXNzLCBhcyBJIGFtIHBvaW50aW5nIGl0IG91dCBhYm92ZSwgeW91IGNh biBzaW1wbHkgcmVjb25zdHJ1Y3QgdGhlCnBhZ2UgdG8gb2ZmZXIgYSBsaW5lYXIgZGF0YStPT0Ig bGF5b3V0LgoKPiBzdGF0aWMgdWludDhfdCBya19uYW5kX3JlYWRfYnl0ZShzdHJ1Y3QgbmFuZF9j aGlwICpuYW5kKQo+IHsKPiAJdWludDhfdCByZXQ7Cj4gCj4gCXJrX25hbmRfcmVhZF9idWYobmFu ZCwgJnJldCwgMSk7Cj4gCj4gCXJldHVybiByZXQ7Cj4gfQo+IAo+IHN0YXRpYyBpbnQgcmtfbmFu ZF9ibG9ja19iYWQoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgbG9mZl90IG9mcykKPiB7Cj4gCXN0 cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQobmFuZCk7Cj4gCWludCBwYWdlLCByZXMg PSAwOwo+IAl1MTYgYmFkID0gMHhmZjsKPiAJdTggKmJ1ZiA9IG5hbmRfZ2V0X2RhdGFfYnVmKG5h bmQpOwo+IAlpbnQgY2hpcG5yID0gKGludCkob2ZzID4+IG5hbmQtPmNoaXBfc2hpZnQpOwo+IAo+ IAlwYWdlID0gKGludCkob2ZzID4+IG5hbmQtPnBhZ2Vfc2hpZnQpICYgbmFuZC0+cGFnZW1hc2s7 Cj4gCXJrX25hbmRfc2VsZWN0X2NoaXAobmFuZCwgY2hpcG5yKTsKPiAJaWYgKHJrX25hbmRfaHdf c3luZHJvbWVfZWNjX3JlYWRfcGFnZShuYW5kLCBidWYsIGZhbHNlLCBwYWdlKQo+ID09IC0xKSB7 IC8qIGZpcnN0IHBhZ2Ugb2YgYSBibG9jayovCj4gCQluYW5kX3JlYWRfcGFnZV9vcChuYW5kLCBw YWdlLCBuYW5kLT5iYWRibG9ja3BvcywKPiBOVUxMLCAwKTsgYmFkID0gcmtfbmFuZF9yZWFkX2J5 dGUobmFuZCk7Cj4gCQlpZiAoYmFkICE9IDB4RkYpCj4gCQkJcmVzID0gMTsKPiAJCS8qIHNlY29u ZCBwYWdlIG9mIGEgYmxvY2sqLwo+IAkJbmFuZF9yZWFkX3BhZ2Vfb3AobmFuZCwgcGFnZSArIDEs IG5hbmQtPmJhZGJsb2NrcG9zLAo+IE5VTEwsIDApOyBiYWQgPSBya19uYW5kX3JlYWRfYnl0ZShu YW5kKTsKPiAJCWlmIChiYWQgIT0gMHhGRikKPiAJCQlyZXMgPSAxOwo+IAkJLyogbGFzdCBwYWdl IG9mIGEgYmxvY2sgKi8KPiAJCXBhZ2UgKz0gKChtdGQtPmVyYXNlc2l6ZSAtIG10ZC0+d3JpdGVz aXplKSA+Pgo+IG5hbmQtPmNoaXBfc2hpZnQpOyBwYWdlLS07Cj4gCQluYW5kX3JlYWRfcGFnZV9v cChuYW5kLCBwYWdlLCBuYW5kLT5iYWRibG9ja3BvcywKPiBOVUxMLCAwKTsgYmFkID0gcmtfbmFu ZF9yZWFkX2J5dGUobmFuZCk7Cj4gCQlpZiAoYmFkICE9IDB4RkYpCj4gCQkJcmVzID0gMTsKPiAJ fQo+IAlya19uYW5kX3NlbGVjdF9jaGlwKG5hbmQsIC0xKTsKPiAJcmV0dXJuIHJlczsKPiB9Cj4g Cj4gVGhpcyBhbHNvIHJlcXVpcmVzIGEgcGF0Y2ggZm9yIG5hbmRfYmJ0LmMKPiBBcyBJIHRyeSB0 byBnZXQgdG8gZ2V0IHNvbWUgc2hhcGUgaW4gdGhlIHJlc3Qgb2YgdGhpcyBkcml2ZXIsCj4gSSBo YXZlIGxlZnQgaXQgb3V0IGZvciB2ZXJzaW9uIDEgYW5kIGFzIEkgd2FpdCBmb3Igb3VyIHJlc3Bv bnMgZmlyc3QuCj4gCj4gZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JidC5jCj4gQEAgLTQ4Nyw4ICs0 ODcsMTAgQEAgc3RhdGljIGludCBjcmVhdGVfYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLAo+IHVp bnQ4X3QgKmJ1ZiwKPiAJCWludCByZXQ7Cj4gCj4gCQlCVUdfT04oYmQtPm9wdGlvbnMgJiBOQU5E X0JCVF9OT19PT0IpOwo+IAo+IAkJcmV0ID0gc2Nhbl9ibG9ja19mYXN0KG10ZCwgYmQsIGZyb20s IGJ1ZiwgbnVtcGFnZXMpOwo+IAkJaWYgKHRoaXMtPmJsb2NrX2JhZCkKPiAJCQlyZXQgPSB0aGlz LT5ibG9ja19iYWQobXRkLCBmcm9tKTsKPiAJCWVsc2UKPiAJCQlyZXQgPSBzY2FuX2Jsb2NrX2Zh c3QobXRkLCBiZCwgZnJvbSwgYnVmLAo+IG51bXBhZ2VzKTsKPiAKPiAvLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLwo+IAo+IERhdGEgc3RydWN0dXJlcy9QYXJ0aXRpb25zCj4gCj4gVGhlIG1h am9yaXR5IG9mIFJvY2tjaGlwIGRldmljZXMgdXNlIGEgY2xvc2VkIHNvdXJjZSBGVEwgZHJpdmVy LAo+IHNvIHdoZW4gd2Ugd2FudCB0byByZWFkIG9yIHdyaXRlIHdlIG11c3QgZGVhbCB3aXRoIGl0 Lgo+IAo+IEV4YW1wbGUgTVREIHN0cmluZzoKPiBtdGRwYXJ0cz1yazI5eHhuYW5kOgo+IDB4MDAw MDIwMDBAMHgwMDAwMjAwMChtaXNjKSwKPiAweDAwMDA4MDAwQDB4MDAwMDQwMDAoa2VybmVsKSwK PiAweDAwMDA4MDAwQDB4MDAwMEMwMDAoYm9vdCksCj4gMHgwMDAwODAwMEAweDAwMDE0MDAwKHJl Y292ZXJ5KSwKPiAweDAwMEMwMDAwQDB4MDAwMUMwMDAoYmFja3VwKSwKPiAweDAwMDQwMDAwQDB4 MDAwREMwMDAoY2FjaGUpLAo+IDB4MDAzMDAwMDBAMHgwMDExQzAwMCh1c2VyZGF0YSksCj4gMHgw MDAwMjAwMEAweDAwNDFDMDAwKGtwYW5pYyksCj4gMHgwMDIwMDAwMEAweDAwNDFFMDAwKHN5c3Rl bSksCj4gLUAweDAwNjNFMDAwKHVzZXIpIgo+IAo+IFdoZW4gUm9ja2NoaXAgbWVudGlvbnMgYSBz dHJpbmcgbGlrZSB0aGlzIGl0IGhhcyBub3RoaW5nIHRvIGRvCj4gd2l0aCB0aGUgcmVhbCBwb3Np dGlvbiBvbiBOQU5ELiBGVEwgd3JpdGUgd2hlcmUgd2FudHMsCj4gc28gcmVhZGluZyB0aGVyZSBp cyBub3QgdXNlZnVsLgo+IEFsbCBzaXplcyBoYXZlIHRvIGJlIG11bHRpcGxpZWQgYnkgNTEyIGFu ZCBjYXN0ZWQgdG8gKHU2NCkhCj4gQWxsIHBhcnRpdGlvbnMgbmVlZCB0byBjb250YWluIGF0IGxl YXN0IDIgZXJhc2UgYmxvY2tzLgo+IE9uZSBmb3Igbm9ybWFsIHVzZSBhbmQgb25lIHNwYXJlLgoK SSBkb24ndCB0aGluayB0cnlpbmcgdG8gbWltaWMgUm9ja2NoaXAgRlRMIGlzIHdpc2UuIFdlIHdp bGwgbm90IHVzZSB0aGUKRlRMIGluIGEgbWFpbmxpbmUga2VybmVsIGJ1dCB2ZXJ5IGxpa2VseTog VUJJL1VCSUZTLgoKPiAtLS0tLS0tLS0tLS0tLS0tLS0tLQo+IEZsYXNoU2F2ZVBoeUluZm8KPiBS YXdJZGJEYXRhCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAuLi4KPiBGVEwgZGF0YQo+IC4uLgo+ IC0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gTWFwIGJsb2NrczoKPiArIEwycE1hcEluZm8KPiArIFZl bmRvckJsa0luZm8KPiAKPiBTeXMgaW5mbzoKPiArIHN5c19zYXZlX2RhdGEKPiAKPiBWZW5kb3Ig cGFydGl0aW9uOgo+ICsgc3lzX2V4dF9kYXRhICAgIDAKPiArIGVjdF90YmxfaW5mbyAgIDY0Cj4g KyB2ZW5kb3IgICAgICAgIDI1NiArID8KPiArIEJvb3RDb25maWcgICAgNTEyICsgMAo+ICsgRHJt S2V5SW5mbyAgICA1MTIgKyAxCj4gKyBWZW5kb3IwSW5mbyAgIDUxMiArIDIKPiArIFZlbmRvcjFJ bmZvICAgNTEyICsgMwo+ICsgc3lzICAgICAgICAgICA1MTIgKyA/Cj4gKyBwdWJsaWMga2V5ICAg IDUyMAo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gQmFkIEJsb2NrIE1hcCBUYmwobm90IGNvbXBh dGlibGUgd2l0aCBNVEQpCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiByZXNlcnZlZDogbGFzdCBO QU5EIGJsb2NrIC0gbgo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gCj4gRnJvbSB0aGUgYWJvdmUg ZGlhZ3JhbSBvbmx5IFJhd0lkYkRhdGEgaGFzIHRvIGJlIGxvY2F0ZWQgaW4gdGhlIGZpcnN0Cj4g ZXJhc2UgYmxvY2suCj4gQm9vdCBST00gc2VhcmNoZXMgZm9yIHRoZSB0YWcgSURfSURSVyA9IDB4 RkNEQzhDM0IuCj4gT25seSB0aGUgZmlyc3QgNCBzZWN0aW9ucyAoNCoxMDI0KSBvZiBhIHBhZ2Ug YXJlIHVzZWQuCj4gV2hlbiB3cml0aW5nIG11bHRpcGxlIHBhZ2VzIGV4dHJhIHNwYWNlcyBpbiB0 aGUgZGF0YQo+IGZvciBiZXR3ZWVuIHRoZSBzZWN0aW9ucyBhcmUgcmVxdWlyZWQuCj4gT2xkZXIg Y3B1J3MgKFJLMzA2NikgbWlnaHQgbmVlZCBleHRyYSBSQzQgY29kaW5nLgo+IAo+IEZUTCB1c2Vz IHRoYXQgUmF3SWRiRGF0YSBhcmVhIHVuZm9ydHVuYXRlbHkgYWxzbyB0byBzYXZlIHN0cnVjdAo+ IEZsYXNoU2F2ZVBoeUluZm8uCj4gRm9yIGEgYmFyZSBiYXNpYyBhcHBsaWNhdGlvbiBvbmx5IFJh d0lkYkRhdGEgaXMgbmVlZGVkLgo+IAo+IEZvciB1c2VycyB0aGF0IG1pZ2h0IGNvbnNpZGVyIE1U RCBhcyBhIG9wdGlvbiB0byBkbyBzb21ldGhpbmcgb24gYQo+IFJvY2tjaGlwIE5BTkQKPiBzZWUg dGhlIHNvdXJjZSBjb2RlIGJlbG93IHRvIGdldCBhbiBpbmRpY2F0aW9uIG9mIHdoYXQgaXMgbmVl ZGVkIGZvciBhCj4gdXNlZnVsCj4gc2V0dXAgdG8ganVzdCByZWFkIGFuZCB3cml0ZSBhIGJvb3Rs b2FkZXIgYWxvbmUuIFdyaXRpbmcgb2YgYW55IHVzZXIKPiBwYXJ0aXRpb24KPiBpcyBub3QgZXZl biBpbmNsdWRlZC4KPiBIYXZpbmcgYSBiYXNpYyBNVEQgZHJpdmVyIGlzIGp1c3Qgbm90IGVub3Vn aC4KPiBQbGVhc2UgYWR2aXNlIGlmIHN1Y2ggYSBvdmVyaGVhZCBjYW4gaW50ZXJmYWNlIHdpdGgg TVREPwo+IEhhdmUgZnVuIQo+IAo+IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCj4gCgpb Li4uXQoKPiA+PiArI2RlZmluZSBOQU5EQ19JRF9WNjAwCQkJMHg1NjM2MzAzMAo+ID4+ICsjZGVm aW5lIE5BTkRDX0lEX1Y2MjIJCQkweDU2MzYzMjMyCj4gPj4gKyNkZWZpbmUgTkFORENfSURfVjcw MQkJCTB4NzAxCj4gPj4gKyNkZWZpbmUgTkFORENfSURfVjgwMAkJCTB4NTYzODMwMzAKPiA+PiAr I2RlZmluZSBOQU5EQ19JRF9WODAxCQkJMHg4MDEKPiA+PiArI2RlZmluZSBOQU5EQ19JRF9WOTAw CQkJMHg1NjM5MzAzMCAgCj4gPiAgCj4gCj4gPiBJIHdvdWxkIHByZWZlciBwcmVmaXhpbmcgZXZl cnl0aGluZyBSS19OQU5EQ18gb3IgUktfICAKPiAKPiBXaWxsIGNoYW5nZSBkZWZpbmUgbGlzdCBh Ym92ZSBhbmQgYmVsb3cgdG8gUktfTkFORENfCj4gSXQgdGFrZXMgbW9yZSBzcGFjZSB0aG91Z2gu IEFscmVhZHkgZGlmZmljdWx0IHRvIHN0YXkgYmVsb3cgODAKPiBjaGFyL2xpbmUuCgpEbyB5b3Vy IGJlc3QsIGlmIGl0IGh1cnRzIHJlYWRhYmlsaXR5IHlvdSBtYXkgYnJlYWsgdGhlIDgwIGNoYXJz IHJ1bGUuCk9yIHRyeSB0byB3cml0ZSBpdCBkb3duIGRpZmZlcmVudGx5LgoKClsuLi5dCgo+ID4+ ICtzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyIHsKPiA+PiArCXZvaWQgX19pb21lbSAqcmVnczsK PiA+PiArCWludCBpcnE7Cj4gPj4gKwlzdHJ1Y3QgY2xrICpoY2xrOwo+ID4+ICsJc3RydWN0IGNs ayAqY2xrOwo+ID4+ICsJc3RydWN0IGxpc3RfaGVhZCBjaGlwczsKPiA+PiArCXN0cnVjdCBjb21w bGV0aW9uIGNvbXBsZXRlOwo+ID4+ICsJc3RydWN0IG5hbmRfY29udHJvbGxlciBjb250cm9sbGVy Owo+ID4+ICsJaW50IGJhbmtzW05BTkRDX05VTV9CQU5LU107ICAKPiA+ICAKPiA+PiArCWJvb2wg Ym9vdHJvbWJsb2NrczsKPiA+PiArCWludCBlY2NfbW9kZTsKPiA+PiArCXVpbnQzMl90IGVjY19z dHJlbmd0aDsKPiA+PiArCWludCBtYXhfZWNjX3N0cmVuZ3RoOyAgCj4gPiAgCj4gCj4gPiBJIGhh dmUgbm90IHJlYWQgeWV0IHRoZSBlbnRpcmUgZHJpdmVyIGJ1dCBJIGJlbGlldmUgdGhlIGFib3Zl IDQKPiA+IHBhcmFtZXRlcnMgc2hvdWxkIHByb2JhYmx5IGJlIG1vdmVkIGluIHJrX25hbmRfY2hp cCwgcmlnaHQ/IEFueXRoaW5nCj4gPiB0aGF0IGlzIE5BTkQgY2hpcCByZWxhdGVkIHNob3VsZCBu b3QgYmUgaW4gdGhlIGNvbnRyb2xsZXIKPiA+IHN0cnVjdHVyZS4gSXQgZGVwZW5kcyBpZiB5b3Ug Y2FuIGNoYW5nZSBFQ0MgcmVxdWlyZW1lbnRzIG9uIHRoZSBmbHkKPiA+IG9yIG5vdC4gIAo+IAo+ IFNob3J0IGFuc3dlcjoKPiBUaGUgcmVhc29uIHRoYXQgaXQgaXMgdGhlIG1vc3QgY29udmVuaWVu Y2UgcGxhY2UgdG8gaGF2ZSB0aGVtIGZvciBub3cuCj4gV2l0aCBvbmUgcG9pbnRlciBmcm9tIG5h bmRfZ2V0X2NvbnRyb2xsZXJfZGF0YSgpIEkgaGF2ZSBhbGwgZGF0YQo+IGF2YWlsYWJsZS4KPiAK PiBzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyICpjdHJsID0gbmFuZF9nZXRfY29udHJvbGxlcl9k YXRhKG5hbmQpOwo+IAo+IFRoZSBFQ0MgaXMgbm93IHNvcnQgb2YgZml4ZWQgdG8gMjQgYW5kIDQw IGZvciBsZWdhY3kgcmVhc29ucy4KPiBUaGUgb2xkZXIgcmszMDY2IGJvb3Ryb20gYXBwYXJlbnRs eSBvbmx5IHdvcmtzIGZvciBlY2MgMjQuCj4gU2VlIGluZm8gYmFzZWQgb24gb2xkZXIgd29yayBi eSBQYXdlxYIgSmFyb3N6IGZvciBVYm9vdC4KPiAKPiBJJ20gbm90IHRvbyBmYW1pbGlhciB3aXRo IGFsbCBpbm5lciB3b3JraW5nIG9mIE1URCwgc28gcGxlYXNlIGFkdmlzZS4KPiBDYW4gdGhlIHVz ZXJzIGdldCBhY2Nlc3MgdG8gc3RydWN0IHJrX25hbmRfY2hpcD8KPiBXb3VsZCB5b3UgbGlrZSB0 byBnaXZlIHVzZXJzIGNvbnRyb2wgb3ZlciB3aGF0IGVjYyB0byB1c2U/CgpJdCBpcyBhbHJlYWR5 IHRoZSBjYXNlOiBEVCBwcm9wZXJ0aWVzIGluIHRoZSBOQU5EIG5vZGUgKHNlZSB0aGUKYmluZGlu Z3MpLiBCdXQgdGhpcyBpcyBhIHN0YXRpYyBpbmZvcm1hdGlvbiwgeW91IGNhbm5vdCBjaGFuZ2Ug aXQgYXQKcnVuIHRpbWUgb2YgY291cnNlLgoKPiBXaGF0IHByb2dyYW0gY2FuIHdlIHVzZSBmb3Ig dGhhdD8gQ2FuJ3QgdXNlIGRkIHRoZW4gYW55IG1vcmUuCgpZb3Ugc2hvdWxkIG5vdCB1c2UgZGQg YXQgYWxsLiBkZCBpcyBmb3IgYmxvY2sgZGV2aWNlcyBvciBjaGFyIGRldmljZXMsCm5vdCBNVEQg ZGV2aWNlcy4gVGhlcmUgaXMgYW4gbXRkLXV0aWxzIHBhY2thZ2Ugb3V0IHRoZXJlIHRoYXQgY292 ZXJzCnByZXR0eSBtdWNoIGFsbCB0aGUgYWN0aW9ucyB5b3Ugd2FudCB0by4KCj4gSG93IGRvIHdl IHJlZ2FpbiBlY2MgY29udHJvbCBpZiB3ZSByZWFsbHkgaGF2ZSB0byBmb3IgZXhhbXBsZSByazMw NjY/Cj4gT3IgcmVtb3ZlIHRoYXQgYm9vdHJvbSBjaGVjayBhbmQgYWx3YXlzIHNldCBFQ0Mgd2l0 aCBldmVyeQo+IHJrX25hbmRjX2h3X3N5bmRyb21lX2VjY19yZWFkX3BhZ2UgYW5kCj4gcmtfbmFu ZGNfaHdfc3luZHJvbWVfZWNjX3dyaXRlX3BhZ2Ugd2l0aCB3aGF0ZXZlciBwYXNzZWQgYWxvbmc/ CgpJIGRvbid0IHVuZGVyc3RhbmQgeW91ciBxdWVzdGlvbi4KCgpbLi4uXQoKPiA+PiArc3RhdGlj IGludCBya19uYW5kY19od19lY2Nfc2V0dXAoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwKPiA+PiAr CQkJCSB1aW50MzJfdCBzdHJlbmd0aCkKPiA+PiArewo+ID4+ICsJc3RydWN0IHJrX25hbmRfY29u dHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+ID4+ ICsJdWludDMyX3QgcmVnOwo+ID4+ICsKPiA+PiArCW5hbmQtPmVjYy5zdHJlbmd0aCA9IHN0cmVu Z3RoOyAgCj4gCj4gU2hvdWxkIEkgYWRkIHRoaXMgY29tbWVudCBiZWxvdz8KPiAKPiAvKiBIVyBF Q0MgYWx3YXlzIHJlcXVlc3QgRUNDIGJ5dGVzIGZvciAxMDI0IGJ5dGVzIGJsb2NrcyAqLwo+IAo+ ID4+ICsJbmFuZC0+ZWNjLmJ5dGVzID0gRElWX1JPVU5EX1VQKG5hbmQtPmVjYy5zdHJlbmd0aCAq IDE0LAo+ID4+IDgpOyAgCj4gPiAgCj4gCj4gPiBXaGF0IGRvIDE0IGFuZCA4IG1lYW4/ICAKPiAK PiBmbHMgLSBmaW5kIGxhc3QgKG1vc3Qtc2lnbmlmaWNhbnQpIGJpdCBzZXQKPiAKPiBpbnQgZmxz KHVuc2lnbmVkIGludCB4KQo+IHsKPiAJaW50IHIgPSAzMjsKPiAKPiAJaWYgKCF4KQo+IAkJcmV0 dXJuIDA7Cj4gCWlmICghKHggJiAweGZmZmYwMDAwdSkpIHsKPiAJCXggPDw9IDE2Owo+IAkJciAt PSAxNjsKPiAJfQo+IAlpZiAoISh4ICYgMHhmZjAwMDAwMHUpKSB7Cj4gCQl4IDw8PSA4Owo+IAkJ ciAtPSA4Owo+IAl9Cj4gCWlmICghKHggJiAweGYwMDAwMDAwdSkpIHsKPiAJCXggPDw9IDQ7Cj4g CQlyIC09IDQ7Cj4gCX0KPiAJaWYgKCEoeCAmIDB4YzAwMDAwMDB1KSkgewo+IAkJeCA8PD0gMjsK PiAJCXIgLT0gMjsKPiAJfQo+IAlpZiAoISh4ICYgMHg4MDAwMDAwMHUpKSB7Cj4gCQl4IDw8PSAx Owo+IAkJciAtPSAxOwo+IAl9Cj4gCXJldHVybiByOwo+IH0KPiAKPiAJbmFuZC0+ZWNjLmJ5dGVz ID0gRElWX1JPVU5EX1VQKGVjYy0+c3RyZW5ndGggKiBmbHMoOCAqIDEwMjQpLAo+IDgpOwo+IAo+ IGZvcm11bGUgaXMgdXNlZCB0byB0cmFuc2xhdGUgc3RyZW5ndGggaW4gYml0LzEwMjQgQkNIL0VD Qwo+IHRvIE1URCBFQ0MgYnl0ZXMgZm9yIDEwMjQgYnl0ZXMgYmxvY2tzIGluIG5hbmQtPmVjYy5i eXRlcwo+IAo+IDE0IGlzIHJlcGxhY2VtZW50IGZvciBmbHMoOCAqIDEwMjQpCgpUaGlzIGlzIGFi c29sdXRlbHkgZm9yYmlkZGVuIDopIFlvdSBzaG91bGQgbmV2ZXIgaGlkZSB5b3VyIGZpcnN0Cmlu dGVudGlvbiwgMTQgaGVyZSBpcyBhIHZlcnkgYmFkIHBsYWNlaG9sZGVyIGJlY2F1c2Ugd2UgY2Fu bm90IGtub3cKd2hhdCBpdCBtZWFucy4gSSBzdXBwb3NlIHlvdXIgaW50ZW50aW9uIHdhcyB0byBv cHRpbWl6ZSB0aGluZ3MuIGZscygpCmFscmVhZHkgZXhpc3QgaW4gdGhlIGtlcm5lbCwgOCBhbmQg MTAyNCBhcmUgY29uc3RhbnRzIHNvIEdDQyAob3IKd2hhdGV2ZXIgY29tcGlsZXIgeW91IHVzZSkg d2lsbCBvcHRpbWl6ZSB0aGluZ3MgYXMgbXVjaCBhcyBpdCBjYW4uClBsdXMsIGl0IGlzIHJ1biBv bmx5IG9uY2UgaW4gYSBsaWZldGltZSBzbyB0aGVyZSBpcyBub3Qgc28gbXVjaCBnYWluCmFueXdh eS4KCj4gOCBiaXRzIGluIGEgYnl0ZQoKSSB0aGluayB0aGVyZSBpcyBhIG1hY3JvIGZvciB0aGF0 IChvdGhlcndpc2UgaXQgaXMgbm90IGltcG9ydGFudCkKCj4gCj4gPiAgCj4gPj4gKwkvKiBIVyBF Q0Mgb25seSB3b3JrcyB3aXRoIGFuIGV2ZW4gbnVtYmVyIG9mIEVDQyBieXRlcyAqLwo+ID4+ICsJ bmFuZC0+ZWNjLmJ5dGVzID0gQUxJR04obmFuZC0+ZWNjLmJ5dGVzLCAyKTsKPiA+PiArCj4gPj4g KwlpZiAoY3RybC0+dmVyc2lvbiA9PSBWRVJTSU9OXzkpIHsKPiA+PiArCQlzd2l0Y2ggKG5hbmQt PmVjYy5zdHJlbmd0aCkgewo+ID4+ICsJCWNhc2UgNzA6Cj4gPj4gKwkJCXJlZyA9IE5BTkRDX1Y5 X0VDQ183MDsKPiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJY2FzZSA2MDoKPiA+PiArCQkJcmVnID0g TkFORENfVjlfRUNDXzYwOwo+ID4+ICsJCQlicmVhazsKPiA+PiArCQljYXNlIDQwOgo+ID4+ICsJ CQlyZWcgPSBOQU5EQ19WOV9FQ0NfNDA7Cj4gPj4gKwkJCWJyZWFrOwo+ID4+ICsJCWNhc2UgMTY6 Cj4gPj4gKwkJCXJlZyA9IE5BTkRDX1Y5X0VDQ18xNjsKPiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJ ZGVmYXVsdDoKPiA+PiArCQkJcmV0dXJuIC1FSU5WQUw7Cj4gPj4gKwkJfQo+ID4+ICsJCXdyaXRl bChyZWcsIGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjlfQkNIQ1RMKTsKPiA+PiArCX0gZWxzZSB7 Cj4gPj4gKwkJc3dpdGNoIChuYW5kLT5lY2Muc3RyZW5ndGgpIHsKPiA+PiArCQljYXNlIDYwOgo+ ID4+ICsJCQlyZWcgPSBOQU5EQ19WNl9FQ0NfNjA7Cj4gPj4gKwkJCWJyZWFrOwo+ID4+ICsJCWNh c2UgNDA6Cj4gPj4gKwkJCXJlZyA9IE5BTkRDX1Y2X0VDQ180MDsKPiA+PiArCQkJYnJlYWs7Cj4g Pj4gKwkJY2FzZSAyNDoKPiA+PiArCQkJcmVnID0gTkFORENfVjZfRUNDXzI0Owo+ID4+ICsJCQli cmVhazsKPiA+PiArCQljYXNlIDE2Ogo+ID4+ICsJCQlyZWcgPSBOQU5EQ19WNl9FQ0NfMTY7Cj4g Pj4gKwkJCWJyZWFrOwo+ID4+ICsJCWRlZmF1bHQ6Cj4gPj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ ID4+ICsJCX0KPiA+PiArCQl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2X0JD SENUTCk7Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30KPiA+PiArCj4g Pj4gK3N0YXRpYyB2b2lkIHJrX25hbmRjX3hmZXJfc3RhcnQoc3RydWN0IHJrX25hbmRfY29udHJv bGxlciAqY3RybCwKPiA+PiArCQkJCXVpbnQ4X3QgZGlyLCB1aW50OF90IG5fS0IsCj4gPj4gKwkJ CQlkbWFfYWRkcl90IGRtYV9kYXRhLCBkbWFfYWRkcl90Cj4gPj4gZG1hX29vYikgK3sKPiA+PiAr CXVpbnQzMl90IHJlZzsKPiA+PiArCj4gPj4gKwlpZiAoY3RybC0+dmVyc2lvbiA9PSBWRVJTSU9O XzkpIHsKPiA+PiArCQlyZWcgPSBOQU5EQ19WOV9ETUFfQ0ZHX1dSX1NUIHwKPiA+PiArCQkgICAg ICBOQU5EQ19WOV9ETUFfQ0ZHX1dSKGRpcikgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0RNQV9D RkdfQlVTX01PREUgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0RNQV9DRkdfSFNJWkVfMzIgfAo+ ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0RNQV9DRkdfQlVSU1RfMTYgfAo+ID4+ICsJCSAgICAgIE5B TkRDX1Y5X0RNQV9DRkdfSU5DUl9OVU0oMTYpOwo+ID4+ICsJCXdyaXRlbChyZWcsIGN0cmwtPnJl Z3MgKyBOQU5EQ19SRUdfVjlfRE1BX0NGRyk7Cj4gPj4gKwkJd3JpdGVsKCh1aW50MzJfdClkbWFf ZGF0YSwgY3RybC0+cmVncyArCj4gPj4gTkFORENfUkVHX1Y5X0RNQV9CVUYwKTsKPiA+PiArCQl3 cml0ZWwoKHVpbnQzMl90KWRtYV9vb2IsIGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19WOV9E TUFfQlVGMSk7ICAKPiA+Cj4gPiBJJ20gcHJldHR5IHN1cmUgbW9zdCBvZiB0aGVzZSB3cml0ZWwg Y291bGQgYmUgdHVybmVkIGludG8KPiA+IHdyaXRlbF9yZWxheGVkLiAgCj4gCj4gd3JpdGVsKCkg ICAgICAgLS0gd3JpdGUgdG8gdGhlIGxpdHRsZS1lbmRpYW4gaGFyZHdhcmUgcmVnaXN0ZXIgd2l0 aAo+IGNvbXBpbGVyIG1lbW9yeSBiYXJyaWVyLAo+IHdyaXRlbF9yZWxheGVkIC0tIGFzIGFib3Zl LCB3aXRob3V0IGJhcnJpZXIsCj4gX19yYXdfd3JpdGVsKCkgLS0gYXMgYWJvdmUgKHdyaXRlbF9y ZWxheGVkKCkpIHdpdGhvdXQgZW5kaWFuZXNzCj4gY29udmVyc2lvbiAoQ1BVIG9yZGVyaW5nIHdp bGwgYmUgdXNlZCkuCj4gQXJjaGl0ZWN0dXJlLWRlcGVuZGVudC4KPiBJIGRvbid0IGtub3cuCgpJ biBtb3N0IG9mIHRoZSBjYXNlcyB5b3UgZG9uJ3QgbmVlZCBhbiBleHBsaWNpdCBiYXJyaWVyICh1 bmxlc3MsIGZvcgppbnN0YW5jZSwgeW91IGFyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gaGFw cGVuIHdpdGggYSBzaG9ydCB0aW1lb3V0KS4KClBsZWFzZSB0cnkgd2l0aCB3cml0ZWxfcmVsYXhl ZCBpbiBtb3N0IG9mIHRoZSBjYXNlcy4KCj4gCj4gPgo+ID4gQWxzbyBJIGFtIG5vdCBhIGJpZyBm YW4gb2YgdGhlc2UgY2FzdHMsIG1heWJlIHlvdSBzaG91bGQgY2hhbmdlCj4gPiBkbWFfZGF0YSBh bmQgZG1hX29vYiB0eXBlcyAoYmUgY2FyZWZ1bDogeW91IGVuYWJsZWQgQ09NUElMRV9URVNUIGlu Cj4gPiBLY29uZmlnLCB5b3UgbXVzdCBzdXBwb3J0IDMyLWJpdCBhbmQgNjQtYml0IHBvaW50ZXJz LCBwbGVhc2UgdHJ5IHRvCj4gPiBjb21waWxlIHRoaXMgZHJpdmVyIHdpdGggZGlmZmVyZW50IHRv b2xjaGFpbnMpLiAgCj4gCj4gRHJpdmVyIGlzIHVzZWQgZm9yIGJvdGggQVJNIGFzIGFybTY0Lgo+ IFRoZXNlIHJlZ2lzdGVycyBhcmUgMzIgYml0LiBQbGVhc2UgYWR2aXNlIHdoYXQgaGFwcGVucwo+ IHdoZW4gd3JpdGVsIGdldHMgZG1hX2FkZHJfdCBhbmQgZG1hX2RhdGEgYXMgNjQgYml0Lgo+IERv bid0IGhhdmUgdGhlIGhhcmR3YXJlIHRvIGZpbmQgb3V0LgoKWW91IGRvbid0IG5lZWQgaGFyZHdh cmUsIGp1c3QgYSAzMi1iaXQgYW5kIGEgNjQtYml0IHRvb2xjaGFpbi4gV2UganVzdAp3YW50IHRv IGF2b2lkIGNhc3RzIGFuZCBidWlsZCB3YXJuaW5ncy4KCj4gCj4gPiAgCj4gPj4gKwo+ID4+ICsJ CXJlZyA9IE5BTkRDX1Y5X0ZMX0RJUihkaXIpIHwKPiA+PiArCQkgICAgICBOQU5EQ19WOV9GTF9Y RkVSX0VOIHwKPiA+PiArCQkgICAgICBOQU5EQ19WOV9GTF9YRkVSX0NPVU5UIHwKPiA+PiArCQkg ICAgICBOQU5EQ19WOV9GTF9BQ09SUkVDVCB8Cj4gPj4gKwkJICAgICAgTkFORENfVjlfRkxfUEFH RV9OVU0obl9LQikgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0ZMX0FTWU5DX1RPR19NSVg7Cj4g Pj4gKwkJd3JpdGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRDX1JFR19WOV9GTENUTCk7Cj4gPj4g KwkJcmVnIHw9IE5BTkRDX1Y5X0ZMX1hGRVJfU1RBUlQ7Cj4gPj4gKwkJd3JpdGVsKHJlZywgY3Ry bC0+cmVncyArIE5BTkRDX1JFR19WOV9GTENUTCk7Cj4gPj4gKwl9IGVsc2Ugewo+ID4+ICsJCXJl ZyA9IHJlYWRsKGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjZfQkNIQ1RMKTsKPiA+PiArCQlyZWcg PSAocmVnICYgKH4oTkFORF9WNl9CQ0hfUkVHSU9OX00gPDwKPiA+PiArCQkJCU5BTkRfVjZfQkNI X1JFR0lPTl9TKSkpIHwKPiA+PiArCQkgICAgICAoY3RybC0+c2VsZWN0ZWRfYmFuayA8PAo+ID4+ IE5BTkRfVjZfQkNIX1JFR0lPTl9TKTsKPiA+PiArCQl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsg TkFORENfUkVHX1Y2X0JDSENUTCk7Cj4gPj4gKwo+ID4+ICsJCXJlZyA9IE5BTkRDX1Y2X0RNQV9D RkdfV1JfU1QgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y2X0RNQV9DRkdfV1IoZGlyKSB8Cj4gPj4g KwkJICAgICAgTkFORENfVjZfRE1BX0NGR19CVVNfTU9ERSB8Cj4gPj4gKwkJICAgICAgTkFORENf VjZfRE1BX0NGR19IU0laRV8zMiB8Cj4gPj4gKwkJICAgICAgTkFORENfVjZfRE1BX0NGR19CVVJT VF8xNiB8Cj4gPj4gKwkJICAgICAgTkFORENfVjZfRE1BX0NGR19JTkNSX05VTSgxNik7Cj4gPj4g KwkJd3JpdGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9ETUFfQ0ZHKTsKPiA+PiAr CQl3cml0ZWwoZG1hX2RhdGEsIGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19WNl9ETUFfQlVG MCk7Cj4gPj4gKwkJd3JpdGVsKGRtYV9vb2IsIGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19W Nl9ETUFfQlVGMSk7ICAKPiAKPiBTYW1lIGhlcmUuCj4gCj4gPj4gKwo+ID4+ICsJCXJlZyA9IE5B TkRDX1Y2X0ZMX0RJUihkaXIpIHwKPiA+PiArCQkgICAgICBOQU5EQ19WNl9GTF9YRkVSX0VOIHwK PiA+PiArCQkgICAgICBOQU5EQ19WNl9GTF9YRkVSX0NPVU5UIHwKPiA+PiArCQkgICAgICBOQU5E Q19WNl9GTF9BQ09SUkVDVCB8Cj4gPj4gKwkJICAgICAgTkFORENfVjZfRkxfUEFHRV9OVU0obl9L QikgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y2X0ZMX0FTWU5DX1RPR19NSVg7Cj4gPj4gKwkJd3Jp dGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9GTENUTCk7Cj4gPj4gKwkJcmVnIHw9 IE5BTkRDX1Y2X0ZMX1hGRVJfU1RBUlQ7Cj4gPj4gKwkJd3JpdGVsKHJlZywgY3RybC0+cmVncyAr IE5BTkRDX1JFR19WNl9GTENUTCk7Cj4gPj4gKwl9Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRp YyBpbnQgcmtfbmFuZGNfd2FpdF9mb3JfeGZlcl9kb25lKHN0cnVjdCBya19uYW5kX2NvbnRyb2xs ZXIKPiA+PiAqY3RybCkgK3sKPiA+PiArCXVpbnQzMl90IHJlZzsKPiA+PiArCWludCByZXQ7Cj4g Pj4gKwo+ID4+ICsJaWYgKGN0cmwtPnZlcnNpb24gPT0gVkVSU0lPTl85KSB7Cj4gPj4gKwkJdm9p ZCBfX2lvbWVtICpwdHIgPSBjdHJsLT5yZWdzICsKPiA+PiBOQU5EQ19SRUdfVjlfRkxDVEw7ICsK PiA+PiArCQlyZXQgPSByZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljKHB0ciwgcmVnLAo+ID4+ICsJ CQkJCQlyZWcgJgo+ID4+IE5BTkRDX1Y5X0ZMX1hGRVJfUkVBRFksCj4gPj4gKwkJCQkJCTEsCj4g Pj4gTkFORENfREVGX1RJTUVPVVQpOwo+ID4+ICsJfSBlbHNlIHsKPiA+PiArCQl2b2lkIF9faW9t ZW0gKnB0ciA9IGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19WNl9GTENUTDsgKwo+ID4+ICsJ CXJldCA9IHJlYWRsX3BvbGxfdGltZW91dF9hdG9taWMocHRyLCByZWcsCj4gPj4gKwkJCQkJCXJl ZyAmCj4gPj4gTkFORENfVjZfRkxfWEZFUl9SRUFEWSwKPiA+PiArCQkJCQkJMSwKPiA+PiBOQU5E Q19ERUZfVElNRU9VVCk7Cj4gPj4gKwl9ICAKPiA+Cj4gPiBTcGFjZQo+ID4gIAo+ID4+ICsJaWYg KHJldCkKPiA+PiArCQlwcl9lcnIoInRpbWVvdXQgcmVnPSV4XG4iLCByZWcpOwo+ID4+ICsKPiA+ PiArCXJldHVybiByZXQ7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB1bnNpZ25lZCBsb25n IHJrX25hbmRjX2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwKPiA+PiArCQl2b2lk ICpwdHIsIGludCBzaXplLCBpbnQgZGlyKSAgCj4gPiAgCj4gCj4gPiBVbmFsaWduZWQgcGFyYW1l dGVycyAgCj4gCj4gVG8gcmVzdHlsZSBJIHVzZToKPiBhc3R5bGUgLVQ4IC0tbWF4LWNvZGUtbGVu Z3RoPTgwIC0tc3R5bGU9bGludXggcm9ja2NoaXBfbmFuZGMuYwo+IAo+IFBsZWFzZSBhZHZpc2Ug Zm9yIGEgYmV0dGVyIHNvbHV0aW9uLgoKSSBkb24ndCBrbm93IGFzdHlsZSwgYnV0IHRoaXMgd291 bGQgY2VydGFpbmx5IHRyaWdnZXIgYSBjaGVja3BhdGNoLnBsCndhcm5pbmcuIEp1c3QgY2hlY2sg dGhlbSBhbmQgY29ycmVjdCB0aGVtIGJ5IGhhbmQuCgo+IAo+ID4gIAo+ID4+ICt7Cj4gPj4gKyNp ZmRlZiBDT05GSUdfQVJNNjQKPiA+PiArCV9fZG1hX21hcF9hcmVhKCh2b2lkICopcHRyLCBzaXpl LCBkaXIpOwo+ID4+ICsJcmV0dXJuICgodW5zaWduZWQgbG9uZyl2aXJ0X3RvX3BoeXMoKHZvaWQg KilwdHIpKTsKPiA+PiArI2Vsc2UKPiA+PiArCXJldHVybiBkbWFfbWFwX3NpbmdsZShkZXYsICh2 b2lkICopcHRyLCBzaXplLCBkaXIpOwo+ID4+ICsjZW5kaWYgIAo+ID4gIAo+IAo+ID4gUGxlYXNl IHRyeSB0byByZW1vdmUgdGhlc2UgI2lmZGVmcywgSSBkb24ndCBrbm93IHdoeSB3b3VsZCB5b3Ug bmVlZAo+ID4gdGhlIGZvcm1lciBibG9jaz8gIAo+IAo+IFRoaXMgZHJpdmVyIGlzIHVzZWQgYm90 aCBmb3IgQVJNIGFzIGFybTY0Lgo+IE9yaWdpbmFsIGZyb20gUm9ja2NoaXA6IGFybTY0IGRvZXNu J3QgaGF2ZSBkbWFfbWFwX3NpbmdsZSgpIGFzIEkKPiByZW1lbWJlci4gRG9uJ3Qga25vdyB3aGF0 IHRvIHVzZSBpbnN0ZWFkLgo+IFBsZWFzZSBhZHZpc2UuCgpJIGFtIG5vdCBhd2FyZSBvZiBzdWNo IGEgbGltaXRhdGlvbi4gUGxlYXNlIGNoZWNrIGFnYWluLgoKPiAKPiA+ICAKPiA+PiArfQo+ID4+ ICsKPiA+PiArc3RhdGljIHZvaWQgcmtfbmFuZGNfZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2 aWNlICpkZXYsCj4gPj4gKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHB0ciwgaW50Cj4gPj4gc2l6 ZSwgaW50IGRpcikgK3sKPiA+PiArI2lmZGVmIENPTkZJR19BUk02NAo+ID4+ICsJX19kbWFfdW5t YXBfYXJlYShwaHlzX3RvX3ZpcnQocHRyKSwgc2l6ZSwgZGlyKTsKPiA+PiArI2Vsc2UKPiA+PiAr CWRtYV91bm1hcF9zaW5nbGUoZGV2LCAoZG1hX2FkZHJfdClwdHIsIHNpemUsIGRpcik7Cj4gPj4g KyNlbmRpZiAgCj4gPgo+ID4gU2FtZQo+ID4gIAo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMg aW50IHJrX25hbmRjX2h3X3N5bmRyb21lX2VjY19yZWFkX3BhZ2Uoc3RydWN0IG5hbmRfY2hpcAo+ ID4+ICpuYW5kLAo+ID4+ICsJCXVpbnQ4X3QgKmJ1ZiwKPiA+PiArCQlpbnQgb29iX3JlcXVpcmVk LCBpbnQgcGFnZSkgIAo+ID4gIAo+IAo+ID4gVW5hbGlnbmVkIHBhcmFtZXRlcnMgKHBsZWFzZSBj aGVjayBhbGwgb2YgdGhlbSkuICAKPiAKPiBBZ2FpbiBibGFtZSBhc3R5bGUgLi4uCj4gQWZ0ZXIg Y29ycmVjdGluZyBpdCBtYW51YWxseSBhIGZldyB0aW1lIEkganVzdCBsZWZ0IGl0IGFzIGl0IGlz Lgo+IAo+ID4gIAo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9f bXRkKG5hbmQpOwo+ID4+ICsJc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4g bmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+ID4+ICsJc3RydWN0IG5hbmRfZWNjX2N0 cmwgKmVjYyA9ICZuYW5kLT5lY2M7Cj4gPj4gKwlpbnQgbWF4X2JpdGZsaXBzID0gMDsKPiA+PiAr CWRtYV9hZGRyX3QgZG1hX2RhdGEsIGRtYV9vb2I7Cj4gPj4gKwlpbnQgcmV0LCBpOwo+ID4+ICsJ aW50IGJjaF9zdDsKPiA+PiArCWludCBkbWFfb29iX3NpemUgPSBlY2MtPnN0ZXBzICogMTI4Owo+ ID4+ICsJaW50IHBhZ2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXpl Owo+ID4+ICsKPiA+PiArCXJrX25hbmRjX3NlbGVjdF9jaGlwKG5hbmQsIGN0cmwtPnNlbGVjdGVk X2JhbmspOwo+ID4+ICsKPiA+PiArCWlmICgocGFnZSA8IHBhZ2VzX3Blcl9ibGsgKiBOQU5EQ19J REJSZXNCbGtOdW0pICYmICAKPiA+ICAKPiAKPiA+IENhbWVsIGNhc2UgaXMgdXN1YWxseSBub3Qg d2VsY29tZSAgCj4gCj4gQW55IHN1Z2dlc3Rpb25zIGZvciBhIGJldGVyIHJlcGxhY2UgZm9yIE5B TkRDX0lEQlJlc0Jsa051bSBhcmUKPiB3ZWxjb21lLgoKU09NRVRISU5HX0xpa2VUaGlzIC0+IFNP TUVUSElOR19MSUtFX1RISVMKCj4gCj4gPiAgCj4gPj4gKwkgICAgY3RybC0+Ym9vdHJvbWJsb2Nr cykgIAo+ID4KPiA+IFRoaXMgd291bGQgcHJvYmFibHkgZGVzZXJ2ZSBhIGhlbHBlcgo+ID4gIAo+ ID4+ICsJCXJrX25hbmRjX2h3X2VjY19zZXR1cChuYW5kLCBOQU5EQ19JREJFY2NCaXRzKTsKPiA+ PiArCj4gPj4gKwluYW5kX3JlYWRfcGFnZV9vcChuYW5kLCBwYWdlLCAwLCBOVUxMLCAwKTsKPiA+ PiArCj4gPj4gKwlkbWFfZGF0YSA9IHJrX25hbmRjX2RtYV9tYXBfc2luZ2xlKG10ZC0+ZGV2LnBh cmVudCwKPiA+PiArCQkJCQkgICBjdHJsLT5wYWdlX2J1ZiwKPiA+PiBtdGQtPndyaXRlc2l6ZSwK PiA+PiArCQkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ICsJZG1hX29vYiA9IHJrX25hbmRj X2RtYV9tYXBfc2luZ2xlKG10ZC0+ZGV2LnBhcmVudCwKPiA+PiArCQkJCQkgIGN0cmwtPm9vYl9i dWYsCj4gPj4gZG1hX29vYl9zaXplLAo+ID4+ICsJCQkJCSAgRE1BX0ZST01fREVWSUNFKTsKPiA+ PiArCj4gPj4gKwlpbml0X2NvbXBsZXRpb24oJmN0cmwtPmNvbXBsZXRlKTsgIAo+ID4gIAo+IAo+ ID4gT25lIGluaXRfY29tcGxldGlvbiBpcyBuZWVkZWQgKGluIHRoZSBwcm9iZSwgcHJvYmFibHkp IHRoZW4gcGxlYXNlCj4gPiB1c2UgcmVpbml0X2NvbXBsZXRpb24oKS4gIAo+IAo+IE11c3Qgc3R1 ZHkgdGhpcyBsYXRlci4KPiAKPiA+ICAKPiA+PiArCWlmIChjdHJsLT52ZXJzaW9uID09IFZFUlNJ T05fOSkKPiA+PiArCQl3cml0ZWwoTkFORENfVjlfSU5UX0RNQSwgY3RybC0+cmVncyArCj4gPj4g TkFORENfUkVHX1Y5X0lOVEVOKTsKPiA+PiArCWVsc2UKPiA+PiArCQl3cml0ZWwoTkFORENfVjZf SU5UX0RNQSwgY3RybC0+cmVncyArCj4gPj4gTkFORENfUkVHX1Y2X0lOVEVOKTsKPiA+PiArCXJr X25hbmRjX3hmZXJfc3RhcnQoY3RybCwgMCwgZWNjLT5zdGVwcywgZG1hX2RhdGEsCj4gPj4gZG1h X29vYik7ICAKPiAKPiA+PiArCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY3RybC0+Y29t cGxldGUsCj4gPj4gbXNlY3NfdG9famlmZmllcyg1KSk7Cj4gPj4gKwlya19uYW5kY193YWl0X2Zv cl94ZmVyX2RvbmUoY3RybCk7ICAKPiA+Cj4gPiBZb3VzIHNob3VsZCBjaGVjayB0aGUgcmV0dXJu IHN0YXR1cyBvZiBhbG1vc3QgYWxsIHRoZSBmdW5jdGlvbnMKPiA+IGhlcmUuICAKPiAKPiBQbGVh c2UgYWR2aXNlIHdoYXQgRVJST1IgY29kZSBzaG91bGQgYmUgcmV0dXJuZWQgaGVyZQo+IHRoYXQg aXMgY29tcGF0aWJsZSB3aXRoIE1URC4KCkFzIGEgZ2VuZXJhbCBydWxlLCBwbGVhc2UgY2hlY2sg dGhlIGRyaXZlcnMgd2hpY2ggaGF2ZSBiZWVuIHVwZGF0ZWQKcmVjZW50bHkgd2l0aCBnaXQgbG9n IC0tb25lLWxpbmUgLS0gZHJpdmVycy9tdGQvbmFuZC9yYXcvCgotPiBtYXJ2ZWxsLCBhdG1lbCwg ZnNtYywgc3VueGksIHN0bSwgY2FkZW5jZSwgZXRjCgpJbiB0aGlzIGNhc2UsIHlvdSBjYW4gcmV0 dXJuIHRoZSBlcnJvciBjb2RlIG9mIHRoZSBmYWlsaW5nIGZ1bmN0aW9uCndpdGggYSBzaW1wbGU6 CgoJcmV0ID0gZnVuYygpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoKSSBleHBlY3QgdGhlIHJr X25hbmRjX3dpYXRfZm9yX3hmZXJfZG9uZSgpIGhlbHBlciB0byByZXR1cm4gLUVUSU1FRE9VVApp biBjYXNlIG9mIHRpbWVvdXQuCgo+IAo+ID4gIAo+ID4+ICsJcmtfbmFuZGNfZG1hX3VubWFwX3Np bmdsZShtdGQtPmRldi5wYXJlbnQsIGRtYV9kYXRhLAo+ID4+IG10ZC0+d3JpdGVzaXplLAo+ID4+ ICsJCQkJICBETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ICsJcmtfbmFuZGNfZG1hX3VubWFwX3Npbmds ZShtdGQtPmRldi5wYXJlbnQsIGRtYV9vb2IsCj4gPj4gZG1hX29vYl9zaXplLAo+ID4+ICsJCQkJ ICBETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ICsKPiA+PiArCW1lbWNweShidWYsIGN0cmwtPnBhZ2Vf YnVmLCBtdGQtPndyaXRlc2l6ZSk7Cj4gPj4gKwo+ID4+ICsJaWYgKG9vYl9yZXF1aXJlZCkgewo+ ID4+ICsJCXVpbnQ4X3QgKm9vYjsKPiA+PiArCQl1aW50MzJfdCB0bXA7ICAKPiA+ICAKPiAKPiA+ IFBsZWFzZSB1c2UgdTgsIHUxNiBhbmQgdTMyIHR5cGVzLiAgCj4gCj4gU2hvdWxkIHRoaXMgYmUg Y2hhbmdlZCBmb3IgdGhlIGVudGlyZSBzb3VyY2U/CgpZZXMsIGNoZWNrcGF0Y2gucGwgd2lsbCB3 YXJuIHlvdSBhYm91dCB0aGlzIHRvby4gdWludDx4Pl90IHR5cGVzIGFyZQpkZXByZWNhdGVkLgoK PiAKPiA+ICAKPiA+PiArCj4gPj4gKwkJZm9yIChpID0gMDsgaSA8IGVjYy0+c3RlcHM7IGkrKykg ewo+ID4+ICsJCQlvb2IgPSBuYW5kLT5vb2JfcG9pICsKPiA+PiArCQkJICAgICAgaSAqIChlY2Mt PmJ5dGVzICsgbmFuZC0+ZWNjLnByZXBhZCk7Cj4gPj4gKwkJCWlmIChjdHJsLT52ZXJzaW9uID09 IFZFUlNJT05fOSkgewo+ID4+ICsJCQkJdG1wID0gY3RybC0+b29iX2J1ZltpXTsKPiA+PiArCQkJ fSBlbHNlIHsKPiA+PiArCQkJCXVpbnQ4X3Qgb29iX3N0ZXAgPQo+ID4+IChjdHJsLT5lY2NfbW9k ZSA8PSAyNCkgPwo+ID4+ICsJCQkJCQkgICA2NCA6IDEyODsKPiA+PiArCQkJCXRtcCA9IGN0cmwt Pm9vYl9idWZbaSAqIG9vYl9zdGVwCj4gPj4gLyA0XTsKPiA+PiArCQkJfQo+ID4+ICsJCQkqb29i KysgPSAodWludDhfdCl0bXA7Cj4gPj4gKwkJCSpvb2IrKyA9ICh1aW50OF90KSh0bXAgPj4gOCk7 Cj4gPj4gKwkJCSpvb2IrKyA9ICh1aW50OF90KSh0bXAgPj4gMTYpOwo+ID4+ICsJCQkqb29iKysg PSAodWludDhfdCkodG1wID4+IDI0KTsKPiA+PiArCQl9Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJ aWYgKGN0cmwtPnZlcnNpb24gPT0gVkVSU0lPTl85KSB7Cj4gPj4gKwkJZm9yIChpID0gMDsgaSA8 IGVjYy0+c3RlcHMgLyAyOyBpKyspIHsKPiA+PiArCQkJYmNoX3N0ID0gcmVhZGwoY3RybC0+cmVn cyArCj4gPj4gTkFORENfUkVHX1Y5X0JDSFNUICsgaSAqIDQpOwo+ID4+ICsJCQlpZiAoYmNoX3N0 ICYgTkFORENfVjlfQkNIMF9TVF9FUlIgfHwKPiA+PiArCQkJICAgIGJjaF9zdCAmIE5BTkRDX1Y5 X0JDSDFfU1RfRVJSKSB7Cj4gPj4gKwkJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKPiA+PiAr CQkJCW1heF9iaXRmbGlwcyA9IC0xOwo+ID4+ICsJCQl9IGVsc2Ugewo+ID4+ICsJCQkJcmV0ID0K PiA+PiBOQU5EQ19WOV9FQ0NfRVJSX0NOVDAoYmNoX3N0KTsKPiA+PiArCQkJCW10ZC0+ZWNjX3N0 YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gPj4gKwkJCQltYXhfYml0ZmxpcHMgPSBtYXhfdCh1bnNp Z25lZCBpbnQsCj4gPj4gKwo+ID4+IG1heF9iaXRmbGlwcywgcmV0KTsgKwo+ID4+ICsJCQkJcmV0 ID0KPiA+PiBOQU5EQ19WOV9FQ0NfRVJSX0NOVDEoYmNoX3N0KTsKPiA+PiArCQkJCW10ZC0+ZWNj X3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gPj4gKwkJCQltYXhfYml0ZmxpcHMgPSBtYXhfdCh1 bnNpZ25lZCBpbnQsCj4gPj4gKwo+ID4+IG1heF9iaXRmbGlwcywgcmV0KTsKPiA+PiArCQkJfQo+ ID4+ICsJCX0KPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwkJZm9yIChpID0gMDsgaSA8IGVjYy0+c3Rl cHMgLyAyOyBpKyspIHsKPiA+PiArCQkJYmNoX3N0ID0gcmVhZGwoY3RybC0+cmVncyArCj4gPj4g TkFORENfUkVHX1Y2X0JDSFNUICsgaSAqIDQpOwo+ID4+ICsJCQlpZiAoYmNoX3N0ICYgTkFORENf VjZfQkNIMF9TVF9FUlIgfHwKPiA+PiArCQkJICAgIGJjaF9zdCAmIE5BTkRDX1Y2X0JDSDFfU1Rf RVJSKSB7Cj4gPj4gKwkJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKPiA+PiArCQkJCW1heF9i aXRmbGlwcyA9IC0xOyAgCj4gPiAgCj4gCj4gPiBXaHkgbm90IHVzaW5nIHJldCA9ICQocmVhbCBl cnJvcikgaW5zdGVhZCBvZiB1c2luZyBtYXhfYml0ZmxpcHMKPiA+IGhlcmU/Cj4gPgo+ID4gVGhl bjoKPiA+Cj4gPiAJaWYgKHJldCkgeyAgCj4gCj4gPiAJCWRldl9lcnIoKTsgIAo+IAo+IERvIHlv dSByZWFsbHkgd2FudCB0byBsaXR0ZXIgdGhlIGtlcm5lbCBsb2cgd2l0aCBlYWNoIHRpbWUgeW91 IGhpdCBhCj4gYmFkIGJsb2NrLAo+IGluIGNhc2UgeW91IHVzZSB0aGlzIGZ1bmN0aW9uIGluIGEg c2VhcmNoIGJhZCBibG9jayBsb29wPwo+IERvbid0IHRoaW5rcyBzbyAuLi4KPiBQbGVhc2UgYWR2 aXNlLgoKQWN0dWFsbHkgSSB0aGluayB0aGF0IEkgd2FzIHNpbXBsaWZ5aW5nIHlvdXIgY29kZSBi dXQgeW91IGFyZSByaWdodCB0aGF0CnRoaXMgZGV2X2VyciBoYXMgdG8gYmUgcmVtb3ZlZC4KCj4g Cj4gPiAJCXJldHVybiByZXQ7Cj4gPiAJfQo+ID4KPiA+IAlyZXR1cm4gbWF4X2JpdGZsaXBzOyAg Cj4gCj4gcmtfbmFuZGNfaHdfc3luZHJvbWVfZWNjX3JlYWRfcGFnZSgpIGlzIHVzZWQgaW4gYSBi YWQgYmxvY2sgc2VhcmNoCj4gc3RyYXRlZ3kuIEkgdGhpbmsgbWF4X2JpdGZsaXBzID0gLTEgd2Fz IGNob3NlbiBhcyBhIHNhdmVyIHZhbHVlIHRvCj4gcmV0dXJuLiBQbGVhc2UgYWR2aXNlIHdoYXQg bnVtYmVyIHJhbmdlIE1URCBpbnRlcnByZXRzIGFzCj4gbWF4X2JpdGZsaXBzIG9yIGFzIGZhdWx0 LiBBbHNvIGNvbnNpZGVyIHNvbWUgdW5jb250cm9sbGVkIHN0YXR1cwo+IHJldHVybiB2YWx1ZSwg aXQgd291bGQgYmUgYmV0dGVyIGlmIHdlCj4gYXJlIGluIGNvbnRyb2wgb2Ygd2hhdCBnb2VzIHJl dHVybi4KCm1heF9iaXRmbGlwIGlzIGEgbG9jYWwgdmFyaWFibGUsIEknbSBqdXN0IHNheWluZyB0 aGF0IHVzaW5nIG1heF9iaXRmbGlwCnRvIHNhdmUgYW4gZXJyb3IgY29kZSBpcyBiYWQuCgpZb3Ug Y2FuIGNoZWNrIHdoYXQgb3RoZXIgZHJpdmVycyBkby4KCj4gCj4gPiAgCj4gPj4gKwkJCX0gZWxz ZSB7Cj4gPj4gKwkJCQlyZXQgPQo+ID4+IE5BTkRDX1Y2X0VDQ19FUlJfQ05UMChiY2hfc3QpOwo+ ID4+ICsJCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHJldDsKPiA+PiArCQkJCW1heF9i aXRmbGlwcyA9IG1heF90KHVuc2lnbmVkIGludCwKPiA+PiArCj4gPj4gbWF4X2JpdGZsaXBzLCBy ZXQpOyArCj4gPj4gKwkJCQlyZXQgPQo+ID4+IE5BTkRDX1Y2X0VDQ19FUlJfQ05UMShiY2hfc3Qp Owo+ID4+ICsJCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHJldDsKPiA+PiArCQkJCW1h eF9iaXRmbGlwcyA9IG1heF90KHVuc2lnbmVkIGludCwKPiA+PiArCj4gPj4gbWF4X2JpdGZsaXBz LCByZXQpOwo+ID4+ICsJCQl9Cj4gPj4gKwkJfQo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWlmICht YXhfYml0ZmxpcHMgPT0gLTEpIHsKPiA+PiArCQlkZXZfZXJyKG10ZC0+ZGV2LnBhcmVudCwKPiA+ PiArCQkJInJlYWRfcGFnZSAleCAleCAleCAleCAleCAlcCAleFxuIiwKPiA+PiArCQkJcGFnZSwK PiA+PiArCQkJbWF4X2JpdGZsaXBzLAo+ID4+ICsJCQliY2hfc3QsCj4gPj4gKwkJCSgodWludDMy X3QgKilidWYpWzBdLAo+ID4+ICsJCQkoKHVpbnQzMl90ICopYnVmKVsxXSwKPiA+PiArCQkJYnVm LAo+ID4+ICsJCQkodWludDMyX3QpZG1hX2RhdGEpOyAgCj4gPiAgCgpbLi4uXQoKPiA+PiArCj4g Pj4gKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDwgbGVuOyBvZmZzKyspCj4gPj4gKwkJYnVmW29mZnNd ID0gcmVhZGIoYmFua19iYXNlKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIHZvaWQgcmtf bmFuZGNfd3JpdGVfYnVmKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsCj4gPj4gKwkJCSAgICAgICBj b25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBya19uYW5k X2NvbnRyb2xsZXIgKmN0cmwgPQo+ID4+IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsK PiA+PiArCWludCBvZmZzID0gMDsKPiA+PiArCXZvaWQgX19pb21lbSAqYmFua19iYXNlID0gY3Ry bC0+cmVncyArIE5BTkRDX1JFR19CQU5LMCArCj4gPj4gKwkJCQkgIGN0cmwtPnNlbGVjdGVkX2Jh bmsgKiAweDEwMDsKPiA+PiArCj4gPj4gKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDwgbGVuOyBvZmZz KyspCj4gPj4gKwkJd3JpdGViKGJ1ZltvZmZzXSwgYmFua19iYXNlKTsKPiA+PiArfQo+ID4+ICsK PiA+PiArc3RhdGljIHZvaWQgcmtfbmFuZGNfd3JpdGVfY21kKHN0cnVjdCBuYW5kX2NoaXAgKm5h bmQsIHVpbnQ4X3QKPiA+PiBjbWQpICt7Cj4gPj4gKwlzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVy ICpjdHJsID0KPiA+PiBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEobmFuZCk7ICsKPiA+PiArCXZv aWQgX19pb21lbSAqYmFua19iYXNlID0gY3RybC0+cmVncyArIE5BTkRDX1JFR19CQU5LMCArCj4g Pj4gKwkJCQkgIGN0cmwtPnNlbGVjdGVkX2JhbmsgKiAweDEwMCArCj4gPj4gKwkJCQkgIE5BTkRD X1JFR19DTUQ7ICAKPiA+ICAKPiAKPiA+IFlvdSBtaWdodCB3YW50IHRvIHdyaXRlIGFuIGhlbHBl ciB0byBjYWxjdWxhdGUgYmFua19iYXNlLCB0byBhdm9pZAo+ID4gcmVwZWF0aW5nIHRoZXNlIGxp bmVzLiAgCj4gCj4gRXZlbiB3aXRoIGEgc2VwYXJhdGUgZGVmaW5lIG9yIGhlbHBlciBmdW5jdGlv biBJIHN0aWxsIGhhdmUgdG8gc3VwcGx5Cj4gbXkgcmVnLCBzZWxlY3RlZF9iYW5rIGFuZCBvZmZz ZXQuIEl0IGRvZXNuJ3QgbWFrZSB0aGluZ3MgY2xlYW5lcgo+IHB1bXBpbmcgZGF0ZQo+IHRvIGFu ZCBmcm9tIGEgaGVscGVyIG9yIG5laXRoZXIgZG9lc24ndCBpdCBzaG9ydGVuIG15IHNvdXJjZSB3 aXRoIGEKPiBkZWZpbmUuIFRlbmQgdG8ga2VlcCBpdCBhcyBpdCBpcyBmb3Igbm93LiBJZiB5b3Ug YWdyZWUgb2YgY291cnNlLgoKI2RlZmluZSBSS19SRUcoY3RybCwgb2ZmKSBcCgkoY3RybCktPnJl Z3MgKyBcCglOQU5EQ19SRUdfQkFOSzAgKyBcCgkoY3RybCktPnNlbGVjdGVkX2JhbmsgKiBCQU5L X1NJWkUgKyBcCgkob2ZmKQoKI2RlZmluZSBSS19SRUdfQ01EKGN0cmwpIFJLX1JFRyhjdHJsLCBO QU5EQ19SRUdfQ01EKQoKPiAKPiA+ICAKPiA+PiArCj4gPj4gKwl3cml0ZWIoY21kLCBiYW5rX2Jh c2UpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9pZCBya19uYW5kY193cml0ZV9hZGRy KHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsIHVpbnQ4X3QKPiA+PiBhZGRyKSArewo+ID4+ICsJc3Ry dWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9nZXRfY29udHJvbGxlcl9k YXRhKG5hbmQpOyArCj4gPj4gKwl2b2lkIF9faW9tZW0gKmJhbmtfYmFzZSA9IGN0cmwtPnJlZ3Mg KyBOQU5EQ19SRUdfQkFOSzAgKwo+ID4+ICsJCQkJICBjdHJsLT5zZWxlY3RlZF9iYW5rICogMHgx MDAgKwo+ID4+ICsJCQkJICBOQU5EQ19SRUdfQUREUjsKPiA+PiArCj4gPj4gKwl3cml0ZWIoYWRk ciwgYmFua19iYXNlKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uYW5kY19k ZXZfcmVhZHkoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCkKPiA+PiArewo+ID4+ICsJc3RydWN0IHJr X25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKG5h bmQpOyArCj4gPj4gKwlpZiAocmVhZGwoY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9GTUNUTCkg Jgo+ID4+IE5BTkRDX1Y2X0ZNX0ZSRUFEWSkKPiA+PiArCQlyZXR1cm4gMTsKPiA+PiArCj4gPj4g KwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uYW5kY19vb2Js YXlvdXRfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQKPiA+PiBzZWN0aW9uLAo+ID4+ICsJ CQkJICBzdHJ1Y3QgbXRkX29vYl9yZWdpb24KPiA+PiAqb29icmVnaW9uKSArewo+ID4+ICsJc3Ry dWN0IG5hbmRfY2hpcCAqbmFuZCA9IG10ZF90b19uYW5kKG10ZCk7Cj4gPj4gKwo+ID4+ICsJaWYg KHNlY3Rpb24gPj0gbmFuZC0+ZWNjLnN0ZXBzKQo+ID4+ICsJCXJldHVybiAtRVJBTkdFOwo+ID4+ ICsKPiA+PiArCW9vYnJlZ2lvbi0+b2Zmc2V0ID0gKG5hbmQtPmVjYy5ieXRlcyArIG5hbmQtPmVj Yy5wcmVwYWQpCj4gPj4gKiBzZWN0aW9uICsKPiA+PiArCQkJICAgIG5hbmQtPmVjYy5wcmVwYWQ7 Cj4gPj4gKwlvb2JyZWdpb24tPmxlbmd0aCA9IG5hbmQtPmVjYy5zdGVwcyAqIG5hbmQtPmVjYy5i eXRlczsKPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGlj IGludCBya19uYW5kY19vb2JsYXlvdXRfZnJlZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50Cj4g Pj4gc2VjdGlvbiwKPiA+PiArCQkJCSAgIHN0cnVjdCBtdGRfb29iX3JlZ2lvbgo+ID4+ICpvb2Jy ZWdpb24pICt7Cj4gPj4gKwlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kID0gbXRkX3RvX25hbmQobXRk KTsKPiA+PiArCj4gPj4gKwlpZiAoc2VjdGlvbiA+PSBuYW5kLT5lY2Muc3RlcHMpCj4gPj4gKwkJ cmV0dXJuIC1FUkFOR0U7Cj4gPj4gKwo+ID4+ICsJb29icmVnaW9uLT5vZmZzZXQgPSAobmFuZC0+ ZWNjLmJ5dGVzICsgbmFuZC0+ZWNjLnByZXBhZCkKPiA+PiAqIHNlY3Rpb247Cj4gPj4gKwlvb2Jy ZWdpb24tPmxlbmd0aCA9IG5hbmQtPmVjYy5zdGVwcyAqIG5hbmQtPmVjYy5wcmVwYWQ7Cj4gPj4g Kwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgbXRkX29vYmxheW91dF9vcHMgcmtfbmFuZGNfb29iX29wcyA9IHsKPiA+PiArCS5lY2MgPSBy a19uYW5kY19vb2JsYXlvdXRfZWNjLAo+ID4+ICsJLmZyZWUgPSBya19uYW5kY19vb2JsYXlvdXRf ZnJlZSwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lkIHJrX25hbmRjX2ZyZWVfYnVm ZmVyKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQpCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBya19uYW5k X2NvbnRyb2xsZXIgKmN0cmwgPQo+ID4+IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsg Kwo+ID4+ICsJa2ZyZWUoY3RybC0+cGFnZV9idWYpOwo+ID4+ICsJa2ZyZWUoY3RybC0+b29iX2J1 Zik7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmFuZGNfYnVmZmVyX2luaXQo c3RydWN0IG5hbmRfY2hpcCAqbmFuZCkKPiA+PiArewo+ID4+ICsJc3RydWN0IG10ZF9pbmZvICpt dGQgPSBuYW5kX3RvX210ZChuYW5kKTsKPiA+PiArCXN0cnVjdCBya19uYW5kX2NvbnRyb2xsZXIg KmN0cmwgPQo+ID4+IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsgKwo+ID4+ICsJY3Ry bC0+cGFnZV9idWYgPSBrbWFsbG9jKG10ZC0+d3JpdGVzaXplLCBHRlBfS0VSTkVMIHwKPiA+PiBH RlBfRE1BKTsgIAo+ID4gIAo+IAo+ID4gZGV2aWNlIG1hbmFnZWQgYWxsb2NhdGlvbnMgKGRldm1f Li4uKSB3b3VsZCBiZSBuaWNlICAKPiAKPiBkZXZtX2t6YWxsb2MoKSBuZWVkcyBhbiBleHRyYSBz dHJ1Y3QgZGV2aWNlLgo+IERvZXMgTVREIHNhZmUtZ2FyZCB0aGUgY29ycmVjdCBvcmRlciB0byBk ZXRhY2ggZnJvbSBzdHJ1Y3QKPiBya19uYW5kX2NvbnRyb2xsZXIKPiB3aXRob3V0IHJrX25hbmRj X2ZyZWVfYnVmZmVyKCk/CgomcGRldi0+ZGV2IGlzIGZpbmUsIHlvdSBjYW4gc2F2ZSBpdCB5b3Vy IG93biBuYW5kIGNvbnRyb2xsZXIgc3RydWN0dXJlLgoKSSB0aGluayBhY2Nlc3NpbmcgbXRkLT5k ZXYgaXMgbm90IGFsbG93ZWQgYmVmb3JlIHRoZSByZWdpc3RyYXRpb24gb2YKdGhlIE1URCBkZXZp Y2UgdGhvdWdoLgoKPiAKPiA+ICAKPiA+PiArCWlmICghY3RybC0+cGFnZV9idWYpCj4gPj4gKwkJ cmV0dXJuIC1FTk9NRU07Cj4gPj4gKwo+ID4+ICsJY3RybC0+b29iX2J1ZiA9IGttYWxsb2MobmFu ZC0+ZWNjLnN0ZXBzICogMTI4LCBHRlBfS0VSTkVMCj4gPj4gfCBHRlBfRE1BKTsKPiA+PiArCWlm ICghY3RybC0+b29iX2J1Zikgewo+ID4+ICsJCWtmcmVlKGN0cmwtPnBhZ2VfYnVmKTsKPiA+PiAr CQlyZXR1cm4gLUVOT01FTTsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiAr fQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uYW5kY19od19lY2NfY3RybF9pbml0KHN0cnVj dCBuYW5kX2NoaXAgKm5hbmQpCj4gPj4gK3sKPiA+PiArCXVpbnQ4X3Qgc3RyZW5ndGhzX3Y2W10g PSB7NjAsIDQwLCAyNCwgMTZ9Owo+ID4+ICsJdWludDhfdCBzdHJlbmd0aHNfdjlbXSA9IHs3MCwg NjAsIDQwLCAxNn07Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKG5h bmQpOwo+ID4+ICsJc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9n ZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+ID4+ICsJaW50IG1heF9zdHJlbmd0aDsKPiA+PiAr CXVpbnQzMl90IGksIHZlcjsKPiA+PiArCj4gPj4gKwlpZiAobmFuZC0+b3B0aW9ucyAmIE5BTkRf SVNfQk9PVF9NRURJVU0pCj4gPj4gKwkJY3RybC0+Ym9vdHJvbWJsb2NrcyA9IHRydWU7Cj4gPj4g KwllbHNlCj4gPj4gKwkJY3RybC0+Ym9vdHJvbWJsb2NrcyA9IGZhbHNlOwo+ID4+ICsKPiA+PiAr CW5hbmQtPmVjYy5wcmVwYWQgPSA0Owo+ID4+ICsJbmFuZC0+ZWNjLnN0ZXBzID0gbXRkLT53cml0 ZXNpemUgLyBuYW5kLT5lY2Muc2l6ZTsKPiA+PiArCj4gPj4gKwltYXhfc3RyZW5ndGggPSAoKG10 ZC0+b29ic2l6ZSAvIG5hbmQtPmVjYy5zdGVwcykgLSA0KSAqIDgKPiA+PiAvIDE0Owo+ID4+ICsJ aWYgKGN0cmwtPnZlcnNpb24gPT0gVkVSU0lPTl85KSB7Cj4gPj4gKwkJY3RybC0+bWF4X2VjY19z dHJlbmd0aCA9IDcwOwo+ID4+ICsJCXZlciA9IHJlYWRsKGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdf VjlfVkVSKTsKPiA+PiArCQlpZiAodmVyICE9IE5BTkRDX0lEX1Y5MDApCj4gPj4gKwkJCWRldl9l cnIobXRkLT5kZXYucGFyZW50LAo+ID4+ICsJCQkJInVuc3VwcG9ydGVkIG5hbmRjIHZlcnNpb24g JXhcbiIsCj4gPj4gdmVyKTsgKwo+ID4+ICsJCWlmIChtYXhfc3RyZW5ndGggPiBjdHJsLT5tYXhf ZWNjX3N0cmVuZ3RoKQo+ID4+ICsJCQltYXhfc3RyZW5ndGggPSBjdHJsLT5tYXhfZWNjX3N0cmVu Z3RoOwo+ID4+ICsKPiA+PiArCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdHJlbmd0aHNf djkpOyBpKyspIHsKPiA+PiArCQkJaWYgKG1heF9zdHJlbmd0aCA+PSBzdHJlbmd0aHNfdjlbaV0p Cj4gPj4gKwkJCQlicmVhazsKPiA+PiArCQl9Cj4gPj4gKwo+ID4+ICsJCWlmIChpID49IEFSUkFZ X1NJWkUoc3RyZW5ndGhzX3Y5KSkgewo+ID4+ICsJCQlkZXZfZXJyKG10ZC0+ZGV2LnBhcmVudCwK PiA+PiArCQkJCSJ1bnN1cHBvcnRlZCBzdHJlbmd0aFxuIik7Cj4gPj4gKwkJCXJldHVybiAtRU5P VFNVUFA7Cj4gPj4gKwkJfQo+ID4+ICsKPiA+PiArCQljdHJsLT5lY2NfbW9kZSA9IHN0cmVuZ3Ro c192OVtpXTsKPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwkJY3RybC0+bWF4X2VjY19zdHJlbmd0aCA9 IDYwOwo+ID4+ICsKPiA+PiArCQl2ZXIgPSByZWFkbChjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2 X1ZFUik7Cj4gPj4gKwkJaWYgKHZlciA9PSBOQU5EQ19JRF9WODAxKQo+ID4+ICsJCQljdHJsLT5t YXhfZWNjX3N0cmVuZ3RoID0gMTY7Cj4gPj4gKwkJZWxzZSBpZiAodmVyID09IE5BTkRDX0lEX1Y2 MDAgfHwKPiA+PiArCQkJIHZlciA9PSBOQU5EQ19JRF9WNjIyIHx8ICAKPiAKPiA+PiArCQkJIHZl ciA9PSBOQU5EQ19JRF9WNzAxIHx8ICAKPiAKPiBBZGRlZCB2ZXJzaW9uIDcgZm9yIFJLMzIyOEEv UkszMjI4Qi4gQ2FuIHNvbWVvbmUgd2l0aCBpbnNpZGVyIGluZm8KPiBjb25maXJtIGlmIHRoaXMg d29ya3Mgb3Igbm90Lgo+IAo+ID4+ICsJCQkgdmVyID09IE5BTkRDX0lEX1Y4MDApCj4gPj4gKwkJ CWN0cmwtPm1heF9lY2Nfc3RyZW5ndGggPSA2MDsKPiA+PiArCQllbHNlCj4gPj4gKwkJCWRldl9l cnIobXRkLT5kZXYucGFyZW50LAo+ID4+ICsJCQkJInVuc3VwcG9ydGVkIG5hbmRjIHZlcnNpb24g JXhcbiIsCj4gPj4gdmVyKTsgKwo+ID4+ICsJCWlmIChtYXhfc3RyZW5ndGggPiBjdHJsLT5tYXhf ZWNjX3N0cmVuZ3RoKQo+ID4+ICsJCQltYXhfc3RyZW5ndGggPSBjdHJsLT5tYXhfZWNjX3N0cmVu Z3RoOwo+ID4+ICsKPiA+PiArCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdHJlbmd0aHNf djYpOyBpKyspIHsKPiA+PiArCQkJaWYgKG1heF9zdHJlbmd0aCA+PSBzdHJlbmd0aHNfdjZbaV0p Cj4gPj4gKwkJCQlicmVhazsKPiA+PiArCQl9Cj4gPj4gKwo+ID4+ICsJCWlmIChpID49IEFSUkFZ X1NJWkUoc3RyZW5ndGhzX3Y2KSkgewo+ID4+ICsJCQlkZXZfZXJyKG10ZC0+ZGV2LnBhcmVudCwK PiA+PiArCQkJCSJ1bnN1cHBvcnRlZCBzdHJlbmd0aFxuIik7Cj4gPj4gKwkJCXJldHVybiAtRU5P VFNVUFA7Cj4gPj4gKwkJfQo+ID4+ICsKPiA+PiArCQljdHJsLT5lY2NfbW9kZSA9IHN0cmVuZ3Ro c192NltpXTsKPiA+PiArCX0KPiA+PiArCXJrX25hbmRjX2h3X2VjY19zZXR1cChuYW5kLCBjdHJs LT5lY2NfbW9kZSk7Cj4gPj4gKwo+ID4+ICsJbXRkX3NldF9vb2JsYXlvdXQobXRkLCAmcmtfbmFu ZGNfb29iX29wcyk7Cj4gPj4gKwo+ID4+ICsJaWYgKG10ZC0+b29ic2l6ZSA8ICgobmFuZC0+ZWNj LmJ5dGVzICsgbmFuZC0+ZWNjLnByZXBhZCkgKgo+ID4+ICsJCQkgICAgbmFuZC0+ZWNjLnN0ZXBz KSkgewo+ID4+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCXJldHVy biAwOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9pZCBya19uYW5kY19kZXRhY2hfY2hp cChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQo+ID4+ICt7Cj4gPj4gKwlzd2l0Y2ggKG5hbmQtPmVj Yy5tb2RlKSB7Cj4gPj4gKwljYXNlIE5BTkRfRUNDX0hXX1NZTkRST01FOgo+ID4+ICsJCXJrX25h bmRjX2ZyZWVfYnVmZmVyKG5hbmQpOwo+ID4+ICsJCWJyZWFrOwo+ID4+ICsJZGVmYXVsdDoKPiA+ PiArCQlicmVhazsKPiA+PiArCX0KPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19u YW5kY19hdHRhY2hfY2hpcChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQo+ID4+ICt7Cj4gPj4gKwlz dHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKG5hbmQpOwo+ID4+ICsJaW50IHJldDsK PiA+PiArCj4gPj4gKwlzd2l0Y2ggKG5hbmQtPmVjYy5tb2RlKSB7Cj4gPj4gKwljYXNlIE5BTkRf RUNDX0hXX1NZTkRST01FOgo+ID4+ICsJCXJldCA9IHJrX25hbmRjX2h3X2VjY19jdHJsX2luaXQo bmFuZCk7Cj4gPj4gKwkJaWYgKHJldCkKPiA+PiArCQkJcmV0dXJuIHJldDsKPiA+PiArCQlyZXQg PSBya19uYW5kY19idWZmZXJfaW5pdChuYW5kKTsKPiA+PiArCQlpZiAocmV0KQo+ID4+ICsJCQly ZXR1cm4gLUVOT01FTTsKPiA+PiArCQluYW5kLT5lY2MucmVhZF9wYWdlID0KPiA+PiBya19uYW5k Y19od19zeW5kcm9tZV9lY2NfcmVhZF9wYWdlOwo+ID4+ICsJCW5hbmQtPmVjYy53cml0ZV9wYWdl ID0KPiA+PiBya19uYW5kY19od19zeW5kcm9tZV9lY2Nfd3JpdGVfcGFnZTsKPiA+PiArCQluYW5k LT5lY2MucmVhZF9vb2IgPSBya19uYW5kY19od19lY2NfcmVhZF9vb2I7Cj4gPj4gKwkJbmFuZC0+ ZWNjLndyaXRlX29vYiA9IHJrX25hbmRjX2h3X2VjY193cml0ZV9vb2I7Cj4gPj4gKwkJYnJlYWs7 Cj4gPj4gKwljYXNlIE5BTkRfRUNDX0hXOiAgCj4gPgo+ID4gSSB3b3VsZCBlaXRoZXIgcmVmdXNl IEVDQ19IVyBvciBwdXQgaXQgYmVzaWRlcyBIV19TWU5EUk9NRS4gIAo+IAo+IElzIHRoZXJlIGEg ZnVuZGFtZW50YWwgZGlmZmVyZW5jZSBpbiBoYW5kbGluZyBFQ0NfSFcgYW5kIEhXX1NZTkRST01F Cj4gZnJvbSB0aGUgTVREIHBvaW50IG9mIHZpZXc/IE90aGVyIHRoZW4gYSBpbmRpY2F0aW9uIGhv dyBpdCdzIGRvbmUgb24KPiB0aGUgZHJpdmVyIHNpZGU/CgpJIGRvbid0IHRoaW5rIHNvLi4KCj4g V2lsbCBkcm9wIGl0Lgo+IAo+ID4gIAo+ID4+ICsJY2FzZSBOQU5EX0VDQ19OT05FOgo+ID4+ICsJ Y2FzZSBOQU5EX0VDQ19TT0ZUOiAgCj4gPiAgCj4gCj4gPiBIYXZlIHlvdSB0ZXN0ZWQgd2l0aCBT VyBCQ0g/ICAKPiAKPiBTaG9ydCBhbnN3ZXI6IE5vCj4gSnVzdCBjb3BpZWQgaXQgZnJvbSB0aGUg b3JpZ2luYWwuCj4gUGxlYXNlIGFkdmlzZSBhIHRvb2wgdG8gZG8gYSB0ZXN0IGJldHdlZW4gdGhl IGluZGl2aWR1YWwgZWNjIHJlYWQKPiBvcHRpb25zLiBPciBkbyBJIGhhdmUgdG8gd3JpdGUgdGhl IHRvb2wgbXkgc2VsZiB3aXRoIG10ZC11dGlscz8KCkFsbCB0aGUgdG9vbHMgYXJlIGFscmVhZHkg YXZhaWxhYmxlLiBuYW5kX3Rlc3QsIGZsYXNoX3NwZWVkLApuYW5kYml0ZXJycyAtaSwgZXRjCgo+ IAo+ID4gIAo+ID4+ICsJCWJyZWFrOwo+ID4+ICsJZGVmYXVsdDoKPiA+PiArCQlyZXR1cm4gLUVJ TlZBTDsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+ PiArc3RhdGljIGludCBya19uYW5kY19leGVjX29wKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsCj4g Pj4gKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmFuZF9vcGVyYXRpb24gKm9wLAo+ID4+ICsJCQkgICAg Ym9vbCBjaGVja19vbmx5KQo+ID4+ICt7Cj4gPj4gKwlpbnQgaTsKPiA+PiArCXVuc2lnbmVkIGlu dCBvcF9pZDsKPiA+PiArCWNvbnN0IHN0cnVjdCBuYW5kX29wX2luc3RyICppbnN0ciA9IE5VTEw7 Cj4gPj4gKwo+ID4+ICsJcmtfbmFuZGNfc2VsZWN0X2NoaXAobmFuZCwgb3AtPmNzKTsKPiA+PiAr Cj4gPj4gKwlpZiAoY2hlY2tfb25seSkKPiA+PiArCQlyZXR1cm4gMDsKPiA+PiArCj4gPj4gKwlm b3IgKG9wX2lkID0gMDsgb3BfaWQgPCBvcC0+bmluc3Ryczsgb3BfaWQrKykgewo+ID4+ICsJCWlu c3RyID0gJm9wLT5pbnN0cnNbb3BfaWRdOwo+ID4+ICsKPiA+PiArCQlzd2l0Y2ggKGluc3RyLT50 eXBlKSB7Cj4gPj4gKwkJY2FzZSBOQU5EX09QX0NNRF9JTlNUUjoKPiA+PiArCQkJcmtfbmFuZGNf d3JpdGVfY21kKG5hbmQsCj4gPj4gaW5zdHItPmN0eC5jbWQub3Bjb2RlKTsKPiA+PiArCQkJYnJl YWs7Cj4gPj4gKwkJY2FzZSBOQU5EX09QX0FERFJfSU5TVFI6Cj4gPj4gKwkJCWZvciAoaSA9IDA7 IGkgPCBpbnN0ci0+Y3R4LmFkZHIubmFkZHJzOwo+ID4+IGkrKykKPiA+PiArCQkJCXJrX25hbmRj X3dyaXRlX2FkZHIobmFuZCwKPiA+PiArCj4gPj4gaW5zdHItPmN0eC5hZGRyLmFkZHJzW2ldKTsK PiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJY2FzZSBOQU5EX09QX0RBVEFfSU5fSU5TVFI6Cj4gPj4g KwkJCXJrX25hbmRjX3JlYWRfYnVmKG5hbmQsCj4gPj4gaW5zdHItPmN0eC5kYXRhLmJ1Zi5pbiwK PiA+PiArCQkJCQkgIGluc3RyLT5jdHguZGF0YS5sZW4pOwo+ID4+ICsJCQlicmVhazsKPiA+PiAr CQljYXNlIE5BTkRfT1BfREFUQV9PVVRfSU5TVFI6Cj4gPj4gKwkJCXJrX25hbmRjX3dyaXRlX2J1 ZihuYW5kLAo+ID4+IGluc3RyLT5jdHguZGF0YS5idWYub3V0LAo+ID4+ICsJCQkJCSAgIGluc3Ry LT5jdHguZGF0YS5sZW4pOwo+ID4+ICsJCQlicmVhazsKPiA+PiArCQljYXNlIE5BTkRfT1BfV0FJ VFJEWV9JTlNUUjoKPiA+PiArCQkJcmtfbmFuZGNfZGV2X3JlYWR5KG5hbmQpOwo+ID4+ICsJCQli cmVhazsKPiA+PiArCQl9Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30K PiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmFuZF9jb250cm9sbGVyX29wcyBya19u YW5kX2NvbnRyb2xsZXJfb3BzID0gewo+ID4+ICsJLmF0dGFjaF9jaGlwID0gcmtfbmFuZGNfYXR0 YWNoX2NoaXAsCj4gPj4gKwkuZGV0YWNoX2NoaXAgPSBya19uYW5kY19kZXRhY2hfY2hpcCwKPiA+ PiArCS5leGVjX29wID0gcmtfbmFuZGNfZXhlY19vcCwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0 YXRpYyBpbnQgcmtfbmFuZGNfY2hpcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKPiA+PiArCQkJ ICAgICAgc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCwKPiA+PiArCQkJICAgICAgc3Ry dWN0IGRldmljZV9ub2RlICpucCwgdW5zaWduZWQKPiA+PiBpbnQgY2hpcG5yKSArewo+ID4+ICsJ c3RydWN0IHJrX25hbmRfY2hpcCAqbm9kZTsKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgKm5hbmQ7 Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKPiA+PiArCWNvbnN0IF9fYmUzMiAqcmVnOwo+ ID4+ICsJaW50IHJldDsKPiA+PiArCj4gPj4gKwlyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJy ZWciLCBOVUxMKTsKPiA+PiArCWlmICghcmVnKQo+ID4+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4+ ICsKPiA+PiArCWN0cmwtPmJhbmtzW2NoaXBucl0gPSBiZTMyX3RvX2NwdSgqcmVnKTsKPiA+PiAr Cj4gPj4gKwlpZiAoY3RybC0+YmFua3NbY2hpcG5yXSA8IDApCj4gPj4gKwkJcmV0dXJuIC1FSU5W QUw7Cj4gPj4gKwo+ID4+ICsJbm9kZSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbm9kZSks IEdGUF9LRVJORUwpOwo+ID4+ICsJaWYgKCFub2RlKQo+ID4+ICsJCXJldHVybiAtRU5PTUVNOwo+ ID4+ICsKPiA+PiArCW5hbmQgPSAmbm9kZS0+bmFuZDsKPiA+PiArCj4gPj4gKwluYW5kX3NldF9m bGFzaF9ub2RlKG5hbmQsIG5wKTsKPiA+PiArCW5hbmRfc2V0X2NvbnRyb2xsZXJfZGF0YShuYW5k LCBjdHJsKTsKPiA+PiArCj4gPj4gKwluYW5kLT5jb250cm9sbGVyID0gJmN0cmwtPmNvbnRyb2xs ZXI7Cj4gPj4gKwluYW5kLT5jb250cm9sbGVyLT5vcHMgPSAmcmtfbmFuZF9jb250cm9sbGVyX29w czsKPiA+PiArCj4gPj4gKwluYW5kLT5lY2MubW9kZSA9IE5BTkRfRUNDX0hXX1NZTkRST01FOwo+ ID4+ICsJbmFuZC0+ZWNjLnNpemUgPSAxMDI0Owo+ID4+ICsJbmFuZC0+ZWNjLnN0cmVuZ3RoID0g NDA7Cj4gPj4gKwo+ID4+ICsJbmFuZC0+b3B0aW9ucyA9IE5BTkRfU0tJUF9CQlRTQ0FOIHwgTkFO RF9OT19TVUJQQUdFX1dSSVRFOwo+ID4+ICsKPiA+PiArCW10ZCA9IG5hbmRfdG9fbXRkKG5hbmQp Owo+ID4+ICsJbXRkLT5kZXYucGFyZW50ID0gZGV2Owo+ID4+ICsJbXRkLT5uYW1lID0gZGV2bV9r YXNwcmludGYoZGV2LCBHRlBfS0VSTkVMLCAiJXMuJWQiLAo+ID4+IGRldl9uYW1lKGRldiksCj4g Pj4gKwkJCQkgICBjdHJsLT5iYW5rc1tjaGlwbnJdKTsKPiA+PiArCj4gPj4gKwlyZXQgPSBuYW5k X3NjYW4obmFuZCwgMSk7ICAKPiA+Cj4gPiBXaHkgMSBoZXJlPyAgCj4gCj4gVE9ETyBmb3IgdmVy c2lvbiAyLgo+IEEgbGl0dGxlIG1pc3VuZGVyc3RhbmRpbmcgb24gaG93IGZvcl9lYWNoX2NoaWxk X29mX25vZGUgd29ya3MuCj4gQWxsIGNoaXBzIHNob3VsZCBiZSBzY2FubmVkLgo+IC8vLy8vCj4g RGVyaXZlIGNoaXBucgo+IEV4YW1wbGUgZnJvbSBzdW54aV9uYW5kLmMKPiAKPiAJaWYgKCFvZl9n ZXRfcHJvcGVydHkobnAsICJyZWciLCAmbnNlbHMpKQo+IAkJcmV0dXJuIC1FSU5WQUw7Cj4gCj4g CW5zZWxzIC89IHNpemVvZih1MzIpOwo+IAlpZiAoIW5zZWxzKSB7Cj4gCQlkZXZfZXJyKGRldiwg ImludmFsaWQgcmVnIHByb3BlcnR5IHNpemVcbiIpOwo+IAkJcmV0dXJuIC1FSU5WQUw7Cj4gCX0K PiAvLy8vLwo+IEZyb20gcmtfbmFuZGNfY2hpcHNfaW5pdCgpCj4gCj4gCWZvcl9lYWNoX2NoaWxk X29mX25vZGUobnAsIG5hbmRfbnApIHsKPiAJCXJldCA9IHJrX25hbmRjX2NoaXBfaW5pdChkZXYs IGN0cmwsIG5hbmRfbnAsIGkpOwo+IAo+IFdoeSBkb2VzIHN1bnhpX25hbmQuYyBuZWVkIHRoaXMg ZXh0cmEgZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZT8KCmZvcl9lYWNoX2NoaWxkX29mX25vZGUgd2ls bCBsb29wIG92ZXIgYWxsIHRoZSBOQU5EIGNoaXBzIHRoYXQgYXJlCmNvbm5lY3RlZCB0byB0aGUg TkFORCBjb250cm9sbGVyLgoKWW91IG1heSBoYXZlIC1kZXBlbmRpbmcgb24gdGhlIE5BTkQgY29u dHJvbGxlci0gbW9yZSB0aGFuIG9uZSBDUyBwZXIKY2hpcC4KCgpbLi4uXQoKPiA+PiArCW5vZGUg PSBwZGV2LT5kZXYub2Zfbm9kZTsKPiA+PiArCj4gPj4gKwlpZCA9IG9mX2FsaWFzX2dldF9pZChu b2RlLCAibmFuZGMiKTsKPiA+PiArCWlmIChpZCA8IDApCj4gPj4gKwkJaWQgPSBnX2lkX2NvdW50 ZXI7Cj4gPj4gKwlpZiAoKGlkID49IEFSUkFZX1NJWkUoZ19uYW5kY19pbmZvKSB8fAo+ID4+IGdf bmFuZGNfaW5mb1tpZF0ucmVncykpIHsKPiA+PiArCQlkZXZfZXJyKAo+ID4+ICsJCQkmcGRldi0+ ZGV2LAo+ID4+ICsJCQkiZmFpbGVkIHRvIGdldCBpZCBmb3IgbmFuZGMgbm9kZQo+ID4+ICclcE9G bidcbiIsCj4gPj4gKwkJCW5vZGUpOwo+ID4+ICsJCW9mX25vZGVfcHV0KG5vZGUpOwo+ID4+ICsJ CXJldHVybiAtRU5PREVWOwo+ID4+ICsJfQo+ID4+ICsJKytnX2lkX2NvdW50ZXI7ICAKPiAKPiBT ZWUgY29tbWVudHMgYWJvdmUgYWJvdXQgUmszMjg4LiBLZWVwaW5nIHRyYWNrIG5vZGUgYWxpYXMg Zm9yIG5hbmRjMC4KPiBUbyByZW1vdmUgb3Igbm90PwoKWW91IG1heSBrZWVwIGEgc3RhdGljIHZh cmlhYmxlIHRvIHBvaW50IHRvIGFuIGFycmF5IG9yIGhhdmUgYSBzdGF0aWMKY291bnRlciB0aGF0 IHlvdSBpbmNyZW1lbnQsIGJ1dCBkZWZpbml0ZWx5IG5vdCBzdGF0aWMgc3RydWN0dXJlcyB0aGF0 CndvdWxkIGJlIHNoYXJlZC4gSWYgdGhlcmUgYXJlIHR3byBkaXN0aW5jdCBOQU5EIGNvbnRyb2xs ZXJzLCB5b3UgbXVzdApoYXZlIGRpc3RpbmN0IHBhdGgvc3RydWN0dXJlcy4KCi0+cHJvYmUoKSB3 aWxsIGJlIHJ1biBvbmNlIGZvciBlYWNoIE5BTkQgY29udHJvbGxlci4KCgpUaGFua3MsCk1pcXXD qGwKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpMaW51eCBNVEQgZGlzY3Vzc2lvbiBtYWlsaW5nIGxpc3QKaHR0cDovL2xpc3RzLmluZnJhZGVh ZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1tdGQvCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: Miquel Raynal Subject: Re: [RFC PATCH v1 02/10] mtd: nand: raw: add rockchip nand controller driver Date: Mon, 13 Jan 2020 15:15:29 +0100 Message-ID: <20200113151529.1ecba50e@xps13> References: <20200108205338.11369-1-jbx6244@gmail.com> <20200108205338.11369-3-jbx6244@gmail.com> <20200110120534.1b4026b0@xps13> <7a477af0-1448-4f26-4004-9331978e824c@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <7a477af0-1448-4f26-4004-9331978e824c-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+glpar-linux-rockchip=m.gmane-mx.org-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org To: Johan Jonker Cc: mark.rutland-5wv7dgnIgG8@public.gmane.org, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, vigneshr-l0cyMroinI0@public.gmane.org, richard-/L3Ra7n9ekc@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org, linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org List-Id: linux-rockchip.vger.kernel.org SGkgSm9oYW4sCgpKb2hhbiBKb25rZXIgPGpieDYyNDRAZ21haWwuY29tPiB3cm90ZSBvbiBTdW4s IDEyIEphbiAyMDIwIDE4OjI2OjIwCiswMTAwOgoKPiBIaSBNaXF1ZWwsCj4gCj4gVGhhbmsgeW91 IGZvciB5b3VyIGRldGFpbGVkIGFuZCB1c2VmdWwgcmV2aWV3Lgo+IAo+IFdpdGhvdXQgbWFudWZh Y3R1cmVyIHN1cHBvcnQgSSBtdXN0IHNjcmFwZSBteSBpbmZvcm1hdGlvbgo+IGZyb20gYWxsIG92 ZXIgdGhlIGludGVybmV0LCB0b2dldGhlciB3aXRoIHNsb3cgaW50ZXJwcmV0YXRpb24gb2YKPiBS b2NrY2hpcCBkcml2ZXJzLgo+IFNvIHBsZWFzZSBoYXZlIHNvbWUgcGF0aWVuY2Ugd2l0aCBteSB1 cGRhdGVzIGFuZCBuZXcgdmVyc2lvbnMuCgpUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIGh1cnJ5LCBp dCBpcyBncmVhdCB0aGF0IHlvdSB3b3JrIG9uIHRoaXMhCgo+IAo+IEJlbG93IGFyZSBzb21lIGNv bW1lbnRzIGFuZCBxdWVzdGlvbnMgaW4gcmFuZG9tIG9yZGVyLgo+IAo+IC8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vCj4gCj4gVG8gcHJldmVudCBndWVzc2luZyBnYW1lcyBjb3VsZCB5b3Ug Y29uZmlybSB0aGUgZm9sbG93aW5nIG5hbWVzOgo+IAo+IGRyaXZlciBmaWxlIG5hbWU6ICAgcm9j a2NoaXAtbmFuZC1jb250cm9sbGVyLmMKCkZpbmUKCj4gZG9jdW1lbnQgZmlsZSBuYW1lOiByb2Nr Y2hpcC1uYW5kLWNvbnRyb2xsZXIueWFtbAoKSSB0aGluayByb2NrY2hpcCxuYW5kLWNvbnRyb2xs ZXIueWFtbCBpcyBwcmVmZXJyZWQuCgo+IAo+IGNvbXBhdGlibGU6ICJyb2NrY2hpcCxuYW5kYy12 NiIKCnJvY2tjaGlwLG5hbmQtY29udHJvbGxlci12NgoKPiBjb21wYXRpYmxlOiAicm9ja2NoaXAs bmFuZGMtdjkiCgpzYW1lIGFzIGFib3ZlIHdpdGggLXY5IGFzIHN1ZmZpeC4KCgpbLi4uXQoKPiBK YW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDUzMzg4XSBuYW5kOiA4MTkyIE1p QiwgTUxDLAplcmFzZQoKSnVzdCB0byBiZSBjbGVhciwgTUxDIGlzIG5vdCB5ZXQgc3VwcG9ydGVk IGluIG1haW5saW5lLiBUaGVyZSBpcyBhCnBhdGNoIHNlcmllcyB0aGF0IGFpbXMgYXQgc3VwcG9y dGluZyBNTEMgaW4gcHNldWRvLVNMQyBtb2RlIGJ1dCBkbyBub3QKdXNlIE1MQyBhcyBhIHJlbGlh YmxlIHN0b3JhZ2UgbWVkaXVtLgoKPiBzaXplOiAyMDQ4IEtpQiwgcGFnZSBzaXplOiA4MTkyLCBP T0Igc2l6ZTogNjQwCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA1NDA1 MF0gcm9ja2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPm51bWNo aXBzID0gMQo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTQ3NDBdIHJv Y2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5jaGlwc2l6ZSA9 IDg1ODk5MzQ1OTIKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU1Mzgw XSByb2NrY2hpcC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+cGFnZW1h c2sgPSAgICBmZmZmZgo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTU5 OTRdIHJvY2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5iYWRi bG9ja3BvcyA9IDAKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU2NTkx XSByb2NrY2hpcC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+Y2hpcF9z aGlmdCA9IDMzCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA1NzE3NF0g cm9ja2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPnBhZ2Vfc2hp ZnQgPSAxMwo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTc3NTFdIHJv Y2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5waHlzX2VyYXNl X3NoaWZ0ID0gMjEKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU4MzY2 XSByb2NrY2hpcC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLm1v ZGUgPSAzCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA1ODkyMF0gcm9j a2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPmVjYy5zdGVwcyA9 IDgKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU5NDgxXSByb2NrY2hp cC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLmJ5dGVzID0gNzAK PiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYwMDQ5XSByb2NrY2hpcC1u YW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLnRvdGFsID0gMAo+IEph biAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjA2MDddIHJvY2tjaGlwLW5hbmRj Cj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5lY2MucHJlcGFkID0gNAo+IEphbiAg MSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjExNzVdIHJvY2tjaGlwLW5hbmRjCj4g MTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5lY2Muc2l6ZSA9IDEwMjQKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYxNzQ4XSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLnN0cmVuZ3RoID0gNDAKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYyMzQxXSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbXRkLT5vb2JsYXlvdXQgPSA5MWNlOWNlMgo+IEphbiAg MSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjI5NDNdIHJvY2tjaGlwLW5hbmRjCj4g MTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBtdGQtPmZsYWdzID0gMDAwMDAwMDAKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYzNTE4XSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbXRkLT5zaXplID0gODU4OTkzNDU5Mgo+IEphbiAgMSAw MDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjQwOThdIHJvY2tjaGlwLW5hbmRjCj4gMTA1 MDAwMDAubmFuZC1jb250cm9sbGVyOiBtdGQtPmVyYXNlc2l6ZSA9IDIwOTcxNTIKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDY0ODE1XSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbXRkLT53cml0ZXNpemUgPSA4MTkyCj4gSmFuICAxIDAw OjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA2NTQxM10gcm9ja2NoaXAtbmFuZGMKPiAxMDUw MDAwMC5uYW5kLWNvbnRyb2xsZXI6IG10ZC0+b29ic2l6ZSA9IDY0MAo+IEphbiAgMSAwMDowMjoy NyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjg5ODVdIDEgZml4ZWQtcGFydGl0aW9ucwo+IHBhcnRp dGlvbnMgZm91bmQgb24gTVREIGRldmljZSAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXIuMAo+IEph biAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjkxOTBdIENyZWF0aW5nIDEgTVRE IHBhcnRpdGlvbnMKPiBvbiAiMTA1MDAwMDAubmFuZC1jb250cm9sbGVyLjAiOgo+IEphbiAgMSAw MDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNzIzNzVdCj4gMHgwMDAwMDAwMDAwMDAtMHgw MDAwMDA0MDAwMDAgOiAicGFyYW1ldGVyIgo+IAo+IAo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBr ZXJuZWw6IFsgIDE0Ny4wNzU2NDldIHJvY2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250 cm9sbGVyOiBSOjB4MDBmZiBjczowCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAg MTQ3LjA3OTQyM10gcm9ja2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IFI6 MHgwMWZmIGNzOjAKPiAKPiAKPiBEZXNwaXRlIG5hbmQtPm9wdGlvbnMgPSBOQU5EX1NLSVBfQkJU U0NBTi4KPiAKPiBXaGF0IGlzIHRoZSByZWFzb24gZm9yIHRoZXNlIDIgcmtfbmFuZGNfaHdfc3lu ZHJvbWVfZWNjX3JlYWRfcGFnZSgpCj4gY29tbWFuZHMgYXQgcGFnZSBSOjB4MDBmZiBhbmQgUjow eDAxZmYgcmlnaHQgYWZ0ZXIgY3JlYXRpbmcKPiBwYXJ0aXRpb25zLgo+IAo+IFdoZW4gZW5hYmxl ZCBCQlRTQ0FOIE1URCBzdGFydHMgdG8gc3RvcmUgYXQgYWxsIGtpbmQgb2YgcGxhY2VzLiBDYW4K PiB5b3Ugc3RhdGUKClBsZWFzZSBkbyBub3QgbWl4IHRoZSB0d28gY29uY2VwdHM6Ci0gb24gY2hp cCBiYnQ6IHRoZSBsYXN0IGJsb2NrcyB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgdGhlIEJCLCB3aXRo b3V0LAogIHRoZSBCQlQgbXVzdCBiZSByZWNvbnN0cnVjdGVkIGJ5IHJlYWRpbmcgYWxsIHRoZSBi bG9ja3MuCi0gU0tJUF9CQlRfU0NBTjogZG8gbm90IGNvbnN0cnVjdCB0aGUgQkJUIGluIFJBTS4K ClBsZWFzZSB0cmFjZSB0aGUgY2FsbHMgKGR1bXBfc3RhY2soKSBtaWdodCBoZWxwIHlvdSkgdG8g c2VlIHdoYXQKZnVuY3Rpb24gYWN0dWFsbHkgY2FsbHMgdGhlIC0+cmVhZF9wYWdlKCkgaGVscGVy cy4KCj4gdGhlcmUgcGFnZSBhZGRyZXNzIGxvZ2ljLCBpZS4gV291bGQgdGhhdCBkYW1hZ2UgdGhl IGV4Y2lzdGluZyBSb2NrY2hpcAo+IGxheW91dD8KCkkgZG9uJ3Qga25vdyBhYm91dCB0aGUgZXhp c3RpbmcgUm9ja2NoaXAgbGF5b3V0LgoKPiAKPiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Lwo+IAo+IE5vIGJhZCBibG9jayBzdXBwb3J0Cj4gCj4gQmFzZWQgb246Cj4gZHJpdmVyczogbXRk OiBuYW5kOiByb2NrY2hpcCBuYW5kYyBhZGQgYmFkIGJsb2NrIGRldGVjdCBhcGkKPiBodHRwczov L2dpdGh1Yi5jb20vcm9ja2NoaXAtbGludXgvdS1ib290L2NvbW1pdC8KPiA3YWVjNzA0YTRlOWQ5 MzIyZjExMDJiY2Y2MWVlNWMzY2Y2ZWM3OTRkCj4gCj4gcm9ja2NoaXA6IGRyaXZlcnM6IG10ZDog bmFuZDogbW9kaWZ5IHRoZSBiYWQgYmxvY2sgZGV0ZWN0aW9uIHByb2Nlc3MKPiBodHRwczovL2dp dGh1Yi5jb20vcm9ja2NoaXAtbGludXgvdS1ib290L2NvbW1pdC8KPiBkNmQ3MDhkMWEzMjlhNjM2 OTE0M2U4ZGQzNGNmNGUyYzgxZDVkOTJmCj4gCj4gQkNIICAgICAgfCAgICAgIG9vYiBzaXplCj4g LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gMTY6IGJ5dGVzOiAyOCArIDQgPSAzMgo+IDI0OiBi eXRlczogNDIgKyA0ID0gNDYKPiA0MDogYnl0ZXM6IDcwICsgNCA9IDc0Cj4gNjA6IGJ5dGVzOiAx MDYgKyA0ID0gMTEwCj4gCj4gVGhlIGRhdGEgbGF5b3V0IHRoYXQgaXMgd3JpdHRlbiBieSBhbiBp bnRlcm5hbCBSb2NrY2hpcCBuYW5kYyBkbWEgaXM6Cj4gICAgIDEwMjQgYnl0ZXMgZGF0YSArIDMy IG9iYiArIDEwMjQgZGF0YSArIDMyIG9iYiAuLi4KPiAKPiBUaGUgTVREIHN5c3RlbSBob3dldmVy IHRyaWVzIHRvIGRldGVjdCBiYWQgYmxvY2sgZmxhZ3MgbG9jYXRlZCBhdDoKPiAgICAgMjA0OCwg NDA5NiwgODE5Mi4uLgoKQmFkIGJsb2NrIGZsYWdzIChzbyBjYWxsZWQgYmFkIGJsb2NrIG1hcmtl cnMsIGFicmV2aWF0ZWQgQkJNKSBhcmUgdGhlCmZpcnN0IHR3byBieXRlcyBvZiB0aGUgT09CLiBB IHBhZ2UgaXMgYWx3YXlzOgoKCTxYIGluLWJhbmQgYnl0ZXMgKGRhdGEpPjxZIG91dC1vZi1iYW5k IGJ5dGVzIChPT0IpPgoKTm8gbWF0dGVyIHRoZSB3YXkgdGhpcyBpcyBzdG9yZWQgb24gdGhlIE5B TkQgY2hpcCwgdGhlIHVzZXIgaXMKZXhwZWN0aW5nIGFsbCB0aGUgZGF0YSBieXRlcyB0b2dldGhl ciBhbmQgYWxsIHRoZSBPT0IgYnl0ZXMgdG9nZXRoZXIuCllvdSBtdXN0IHJlY29uc3RydWN0IHRo aXMuCgo+IFRoZSBzeXN0ZW0gY2hlY2tzIGZvciBiYWQgYmxvY2tzIGFuZCBsb29rcyBhdCB0aGUg d3JvbmcgYmFkIGJsb2NrCj4gbWFya2VyIGxvY2F0aW9uLgo+IFlpZmVuZyBaaGFvIHByb3Bvc2Vz IHRvIGFkZCBhIGJhZCBibG9jayBkZXRlY3Rpbmcgc3RyYXRlZ3kgYnkgZG9pbmcKPiBhIHJlYWQg d2l0aCBya19uYW5kY19od19zeW5kcm9tZV9lY2NfcmVhZF9wYWdlKCkgZmlyc3QsCj4gaWYgZmFp bHVyZSB0aGVuIGFzc3VtZSBpdCdzIHN0aWxsIHJhdyB1bndyaXR0ZW4gTkFORCBhbmQgdGVzdCBi eXRlcwo+IGFyZSBhdCB0aGUgcG9zaXRpb24gTVREIG5vcm1hbHkgd291bGQgY2hlY2sgZm9yIHJp Z2h0IGZyb20gdGhlCj4gZmFjdG9yeS4gV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgb24gYSBG VEwgY29udHJvbGxlZCBOQU5EIGl0Cj4gY3JlYXRlcyBhbiBhd2Z1bCBsb3Qgb2YgZXJyb3JzIGlu IHRoZSBrZXJuZWwgbG9nLCBiZWNhdXNlIGl0IHVzZXMgdGhlCj4gQkIgbWFya2VyIGZvciBkaXJ0 eSB0YWcgdHJpY2tzIGZvciB0aGVyZSBkYXRhIHN0b3JhZ2UuCj4gU28gd2hhdCBpcyBnb29kIGZv ciBhIHJhdyBlbXB0eSBOQU5EIHdpdGhvdXQgRlRMCj4gZG9lcyBub3Qgd29yayBmb3IgdGhlIG1h am9yaXR5IG9mIFJvY2tjaGlwIGRldmljZXMgSSB0aGluay4KPiAKPiBQbGVhc2UgYWR2aXNlIGZv ciBvdGhlciBvcHRpb25zLgoKVGhhdCdzIHNhZCB0aGF0IFJvY2tjaGlwIEJTUCBkb2VzIG5vdCBm b2xsb3cgc3RhbmRhcmQgcnVsZXMsIGJ1dCBJTUhPCnRoaXMga2luZCBvZiByZXNlYXJjaCBsb2dp YyBpcyB3YXkgdG9vIG11Y2ggZXJyb3IgcHJvbmUgYW5kIHRoaXMgaXMgbm90CnNvbWVodGluZyB3 ZSB3YW50IHRvIHBsYXkgd2l0aDogaWYgeW91IHN0YXJ0IGEgbWFpbmxpbmUga2VybmVsIHdpdGgg YQp3cm9uZyBsb2dpYywgdGhlbiBsYXRlciB5b3UgZml4IHRoZSBsb2dpYyBpbiBtYWlubGluZSwg eW91IG11c3Qgc3VwcG9ydAp0aGUgYnJva2VuIGxvZ2ljIGZvcmV2ZXIuCgpUaGlzIG1lYW5zIHlv dSBjYW5ub3QgYm9vdCBhIHZlbmRvciBrZXJuZWwgYW5kIGEgbWFpbmxpbmUga2VybmVsIG9uIHRo ZQpzYW1lIHBsYXRmb3JtIGFueW1vcmUuIFRoaXMgaXMgc2FkIGJ1dCB3ZSBjYW5ub3QgZmlnaHQg YWdhaW5zdCBpdC4KVW5sZXNzLCBhcyBJIGFtIHBvaW50aW5nIGl0IG91dCBhYm92ZSwgeW91IGNh biBzaW1wbHkgcmVjb25zdHJ1Y3QgdGhlCnBhZ2UgdG8gb2ZmZXIgYSBsaW5lYXIgZGF0YStPT0Ig bGF5b3V0LgoKPiBzdGF0aWMgdWludDhfdCBya19uYW5kX3JlYWRfYnl0ZShzdHJ1Y3QgbmFuZF9j aGlwICpuYW5kKQo+IHsKPiAJdWludDhfdCByZXQ7Cj4gCj4gCXJrX25hbmRfcmVhZF9idWYobmFu ZCwgJnJldCwgMSk7Cj4gCj4gCXJldHVybiByZXQ7Cj4gfQo+IAo+IHN0YXRpYyBpbnQgcmtfbmFu ZF9ibG9ja19iYWQoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgbG9mZl90IG9mcykKPiB7Cj4gCXN0 cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQobmFuZCk7Cj4gCWludCBwYWdlLCByZXMg PSAwOwo+IAl1MTYgYmFkID0gMHhmZjsKPiAJdTggKmJ1ZiA9IG5hbmRfZ2V0X2RhdGFfYnVmKG5h bmQpOwo+IAlpbnQgY2hpcG5yID0gKGludCkob2ZzID4+IG5hbmQtPmNoaXBfc2hpZnQpOwo+IAo+ IAlwYWdlID0gKGludCkob2ZzID4+IG5hbmQtPnBhZ2Vfc2hpZnQpICYgbmFuZC0+cGFnZW1hc2s7 Cj4gCXJrX25hbmRfc2VsZWN0X2NoaXAobmFuZCwgY2hpcG5yKTsKPiAJaWYgKHJrX25hbmRfaHdf c3luZHJvbWVfZWNjX3JlYWRfcGFnZShuYW5kLCBidWYsIGZhbHNlLCBwYWdlKQo+ID09IC0xKSB7 IC8qIGZpcnN0IHBhZ2Ugb2YgYSBibG9jayovCj4gCQluYW5kX3JlYWRfcGFnZV9vcChuYW5kLCBw YWdlLCBuYW5kLT5iYWRibG9ja3BvcywKPiBOVUxMLCAwKTsgYmFkID0gcmtfbmFuZF9yZWFkX2J5 dGUobmFuZCk7Cj4gCQlpZiAoYmFkICE9IDB4RkYpCj4gCQkJcmVzID0gMTsKPiAJCS8qIHNlY29u ZCBwYWdlIG9mIGEgYmxvY2sqLwo+IAkJbmFuZF9yZWFkX3BhZ2Vfb3AobmFuZCwgcGFnZSArIDEs IG5hbmQtPmJhZGJsb2NrcG9zLAo+IE5VTEwsIDApOyBiYWQgPSBya19uYW5kX3JlYWRfYnl0ZShu YW5kKTsKPiAJCWlmIChiYWQgIT0gMHhGRikKPiAJCQlyZXMgPSAxOwo+IAkJLyogbGFzdCBwYWdl IG9mIGEgYmxvY2sgKi8KPiAJCXBhZ2UgKz0gKChtdGQtPmVyYXNlc2l6ZSAtIG10ZC0+d3JpdGVz aXplKSA+Pgo+IG5hbmQtPmNoaXBfc2hpZnQpOyBwYWdlLS07Cj4gCQluYW5kX3JlYWRfcGFnZV9v cChuYW5kLCBwYWdlLCBuYW5kLT5iYWRibG9ja3BvcywKPiBOVUxMLCAwKTsgYmFkID0gcmtfbmFu ZF9yZWFkX2J5dGUobmFuZCk7Cj4gCQlpZiAoYmFkICE9IDB4RkYpCj4gCQkJcmVzID0gMTsKPiAJ fQo+IAlya19uYW5kX3NlbGVjdF9jaGlwKG5hbmQsIC0xKTsKPiAJcmV0dXJuIHJlczsKPiB9Cj4g Cj4gVGhpcyBhbHNvIHJlcXVpcmVzIGEgcGF0Y2ggZm9yIG5hbmRfYmJ0LmMKPiBBcyBJIHRyeSB0 byBnZXQgdG8gZ2V0IHNvbWUgc2hhcGUgaW4gdGhlIHJlc3Qgb2YgdGhpcyBkcml2ZXIsCj4gSSBo YXZlIGxlZnQgaXQgb3V0IGZvciB2ZXJzaW9uIDEgYW5kIGFzIEkgd2FpdCBmb3Igb3VyIHJlc3Bv bnMgZmlyc3QuCj4gCj4gZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JidC5jCj4gQEAgLTQ4Nyw4ICs0 ODcsMTAgQEAgc3RhdGljIGludCBjcmVhdGVfYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLAo+IHVp bnQ4X3QgKmJ1ZiwKPiAJCWludCByZXQ7Cj4gCj4gCQlCVUdfT04oYmQtPm9wdGlvbnMgJiBOQU5E X0JCVF9OT19PT0IpOwo+IAo+IAkJcmV0ID0gc2Nhbl9ibG9ja19mYXN0KG10ZCwgYmQsIGZyb20s IGJ1ZiwgbnVtcGFnZXMpOwo+IAkJaWYgKHRoaXMtPmJsb2NrX2JhZCkKPiAJCQlyZXQgPSB0aGlz LT5ibG9ja19iYWQobXRkLCBmcm9tKTsKPiAJCWVsc2UKPiAJCQlyZXQgPSBzY2FuX2Jsb2NrX2Zh c3QobXRkLCBiZCwgZnJvbSwgYnVmLAo+IG51bXBhZ2VzKTsKPiAKPiAvLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLwo+IAo+IERhdGEgc3RydWN0dXJlcy9QYXJ0aXRpb25zCj4gCj4gVGhlIG1h am9yaXR5IG9mIFJvY2tjaGlwIGRldmljZXMgdXNlIGEgY2xvc2VkIHNvdXJjZSBGVEwgZHJpdmVy LAo+IHNvIHdoZW4gd2Ugd2FudCB0byByZWFkIG9yIHdyaXRlIHdlIG11c3QgZGVhbCB3aXRoIGl0 Lgo+IAo+IEV4YW1wbGUgTVREIHN0cmluZzoKPiBtdGRwYXJ0cz1yazI5eHhuYW5kOgo+IDB4MDAw MDIwMDBAMHgwMDAwMjAwMChtaXNjKSwKPiAweDAwMDA4MDAwQDB4MDAwMDQwMDAoa2VybmVsKSwK PiAweDAwMDA4MDAwQDB4MDAwMEMwMDAoYm9vdCksCj4gMHgwMDAwODAwMEAweDAwMDE0MDAwKHJl Y292ZXJ5KSwKPiAweDAwMEMwMDAwQDB4MDAwMUMwMDAoYmFja3VwKSwKPiAweDAwMDQwMDAwQDB4 MDAwREMwMDAoY2FjaGUpLAo+IDB4MDAzMDAwMDBAMHgwMDExQzAwMCh1c2VyZGF0YSksCj4gMHgw MDAwMjAwMEAweDAwNDFDMDAwKGtwYW5pYyksCj4gMHgwMDIwMDAwMEAweDAwNDFFMDAwKHN5c3Rl bSksCj4gLUAweDAwNjNFMDAwKHVzZXIpIgo+IAo+IFdoZW4gUm9ja2NoaXAgbWVudGlvbnMgYSBz dHJpbmcgbGlrZSB0aGlzIGl0IGhhcyBub3RoaW5nIHRvIGRvCj4gd2l0aCB0aGUgcmVhbCBwb3Np dGlvbiBvbiBOQU5ELiBGVEwgd3JpdGUgd2hlcmUgd2FudHMsCj4gc28gcmVhZGluZyB0aGVyZSBp cyBub3QgdXNlZnVsLgo+IEFsbCBzaXplcyBoYXZlIHRvIGJlIG11bHRpcGxpZWQgYnkgNTEyIGFu ZCBjYXN0ZWQgdG8gKHU2NCkhCj4gQWxsIHBhcnRpdGlvbnMgbmVlZCB0byBjb250YWluIGF0IGxl YXN0IDIgZXJhc2UgYmxvY2tzLgo+IE9uZSBmb3Igbm9ybWFsIHVzZSBhbmQgb25lIHNwYXJlLgoK SSBkb24ndCB0aGluayB0cnlpbmcgdG8gbWltaWMgUm9ja2NoaXAgRlRMIGlzIHdpc2UuIFdlIHdp bGwgbm90IHVzZSB0aGUKRlRMIGluIGEgbWFpbmxpbmUga2VybmVsIGJ1dCB2ZXJ5IGxpa2VseTog VUJJL1VCSUZTLgoKPiAtLS0tLS0tLS0tLS0tLS0tLS0tLQo+IEZsYXNoU2F2ZVBoeUluZm8KPiBS YXdJZGJEYXRhCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAuLi4KPiBGVEwgZGF0YQo+IC4uLgo+ IC0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gTWFwIGJsb2NrczoKPiArIEwycE1hcEluZm8KPiArIFZl bmRvckJsa0luZm8KPiAKPiBTeXMgaW5mbzoKPiArIHN5c19zYXZlX2RhdGEKPiAKPiBWZW5kb3Ig cGFydGl0aW9uOgo+ICsgc3lzX2V4dF9kYXRhICAgIDAKPiArIGVjdF90YmxfaW5mbyAgIDY0Cj4g KyB2ZW5kb3IgICAgICAgIDI1NiArID8KPiArIEJvb3RDb25maWcgICAgNTEyICsgMAo+ICsgRHJt S2V5SW5mbyAgICA1MTIgKyAxCj4gKyBWZW5kb3IwSW5mbyAgIDUxMiArIDIKPiArIFZlbmRvcjFJ bmZvICAgNTEyICsgMwo+ICsgc3lzICAgICAgICAgICA1MTIgKyA/Cj4gKyBwdWJsaWMga2V5ICAg IDUyMAo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gQmFkIEJsb2NrIE1hcCBUYmwobm90IGNvbXBh dGlibGUgd2l0aCBNVEQpCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiByZXNlcnZlZDogbGFzdCBO QU5EIGJsb2NrIC0gbgo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gCj4gRnJvbSB0aGUgYWJvdmUg ZGlhZ3JhbSBvbmx5IFJhd0lkYkRhdGEgaGFzIHRvIGJlIGxvY2F0ZWQgaW4gdGhlIGZpcnN0Cj4g ZXJhc2UgYmxvY2suCj4gQm9vdCBST00gc2VhcmNoZXMgZm9yIHRoZSB0YWcgSURfSURSVyA9IDB4 RkNEQzhDM0IuCj4gT25seSB0aGUgZmlyc3QgNCBzZWN0aW9ucyAoNCoxMDI0KSBvZiBhIHBhZ2Ug YXJlIHVzZWQuCj4gV2hlbiB3cml0aW5nIG11bHRpcGxlIHBhZ2VzIGV4dHJhIHNwYWNlcyBpbiB0 aGUgZGF0YQo+IGZvciBiZXR3ZWVuIHRoZSBzZWN0aW9ucyBhcmUgcmVxdWlyZWQuCj4gT2xkZXIg Y3B1J3MgKFJLMzA2NikgbWlnaHQgbmVlZCBleHRyYSBSQzQgY29kaW5nLgo+IAo+IEZUTCB1c2Vz IHRoYXQgUmF3SWRiRGF0YSBhcmVhIHVuZm9ydHVuYXRlbHkgYWxzbyB0byBzYXZlIHN0cnVjdAo+ IEZsYXNoU2F2ZVBoeUluZm8uCj4gRm9yIGEgYmFyZSBiYXNpYyBhcHBsaWNhdGlvbiBvbmx5IFJh d0lkYkRhdGEgaXMgbmVlZGVkLgo+IAo+IEZvciB1c2VycyB0aGF0IG1pZ2h0IGNvbnNpZGVyIE1U RCBhcyBhIG9wdGlvbiB0byBkbyBzb21ldGhpbmcgb24gYQo+IFJvY2tjaGlwIE5BTkQKPiBzZWUg dGhlIHNvdXJjZSBjb2RlIGJlbG93IHRvIGdldCBhbiBpbmRpY2F0aW9uIG9mIHdoYXQgaXMgbmVl ZGVkIGZvciBhCj4gdXNlZnVsCj4gc2V0dXAgdG8ganVzdCByZWFkIGFuZCB3cml0ZSBhIGJvb3Rs b2FkZXIgYWxvbmUuIFdyaXRpbmcgb2YgYW55IHVzZXIKPiBwYXJ0aXRpb24KPiBpcyBub3QgZXZl biBpbmNsdWRlZC4KPiBIYXZpbmcgYSBiYXNpYyBNVEQgZHJpdmVyIGlzIGp1c3Qgbm90IGVub3Vn aC4KPiBQbGVhc2UgYWR2aXNlIGlmIHN1Y2ggYSBvdmVyaGVhZCBjYW4gaW50ZXJmYWNlIHdpdGgg TVREPwo+IEhhdmUgZnVuIQo+IAo+IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCj4gCgpb Li4uXQoKPiA+PiArI2RlZmluZSBOQU5EQ19JRF9WNjAwCQkJMHg1NjM2MzAzMAo+ID4+ICsjZGVm aW5lIE5BTkRDX0lEX1Y2MjIJCQkweDU2MzYzMjMyCj4gPj4gKyNkZWZpbmUgTkFORENfSURfVjcw MQkJCTB4NzAxCj4gPj4gKyNkZWZpbmUgTkFORENfSURfVjgwMAkJCTB4NTYzODMwMzAKPiA+PiAr I2RlZmluZSBOQU5EQ19JRF9WODAxCQkJMHg4MDEKPiA+PiArI2RlZmluZSBOQU5EQ19JRF9WOTAw CQkJMHg1NjM5MzAzMCAgCj4gPiAgCj4gCj4gPiBJIHdvdWxkIHByZWZlciBwcmVmaXhpbmcgZXZl cnl0aGluZyBSS19OQU5EQ18gb3IgUktfICAKPiAKPiBXaWxsIGNoYW5nZSBkZWZpbmUgbGlzdCBh Ym92ZSBhbmQgYmVsb3cgdG8gUktfTkFORENfCj4gSXQgdGFrZXMgbW9yZSBzcGFjZSB0aG91Z2gu IEFscmVhZHkgZGlmZmljdWx0IHRvIHN0YXkgYmVsb3cgODAKPiBjaGFyL2xpbmUuCgpEbyB5b3Vy IGJlc3QsIGlmIGl0IGh1cnRzIHJlYWRhYmlsaXR5IHlvdSBtYXkgYnJlYWsgdGhlIDgwIGNoYXJz IHJ1bGUuCk9yIHRyeSB0byB3cml0ZSBpdCBkb3duIGRpZmZlcmVudGx5LgoKClsuLi5dCgo+ID4+ ICtzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyIHsKPiA+PiArCXZvaWQgX19pb21lbSAqcmVnczsK PiA+PiArCWludCBpcnE7Cj4gPj4gKwlzdHJ1Y3QgY2xrICpoY2xrOwo+ID4+ICsJc3RydWN0IGNs ayAqY2xrOwo+ID4+ICsJc3RydWN0IGxpc3RfaGVhZCBjaGlwczsKPiA+PiArCXN0cnVjdCBjb21w bGV0aW9uIGNvbXBsZXRlOwo+ID4+ICsJc3RydWN0IG5hbmRfY29udHJvbGxlciBjb250cm9sbGVy Owo+ID4+ICsJaW50IGJhbmtzW05BTkRDX05VTV9CQU5LU107ICAKPiA+ICAKPiA+PiArCWJvb2wg Ym9vdHJvbWJsb2NrczsKPiA+PiArCWludCBlY2NfbW9kZTsKPiA+PiArCXVpbnQzMl90IGVjY19z dHJlbmd0aDsKPiA+PiArCWludCBtYXhfZWNjX3N0cmVuZ3RoOyAgCj4gPiAgCj4gCj4gPiBJIGhh dmUgbm90IHJlYWQgeWV0IHRoZSBlbnRpcmUgZHJpdmVyIGJ1dCBJIGJlbGlldmUgdGhlIGFib3Zl IDQKPiA+IHBhcmFtZXRlcnMgc2hvdWxkIHByb2JhYmx5IGJlIG1vdmVkIGluIHJrX25hbmRfY2hp cCwgcmlnaHQ/IEFueXRoaW5nCj4gPiB0aGF0IGlzIE5BTkQgY2hpcCByZWxhdGVkIHNob3VsZCBu b3QgYmUgaW4gdGhlIGNvbnRyb2xsZXIKPiA+IHN0cnVjdHVyZS4gSXQgZGVwZW5kcyBpZiB5b3Ug Y2FuIGNoYW5nZSBFQ0MgcmVxdWlyZW1lbnRzIG9uIHRoZSBmbHkKPiA+IG9yIG5vdC4gIAo+IAo+ IFNob3J0IGFuc3dlcjoKPiBUaGUgcmVhc29uIHRoYXQgaXQgaXMgdGhlIG1vc3QgY29udmVuaWVu Y2UgcGxhY2UgdG8gaGF2ZSB0aGVtIGZvciBub3cuCj4gV2l0aCBvbmUgcG9pbnRlciBmcm9tIG5h bmRfZ2V0X2NvbnRyb2xsZXJfZGF0YSgpIEkgaGF2ZSBhbGwgZGF0YQo+IGF2YWlsYWJsZS4KPiAK PiBzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyICpjdHJsID0gbmFuZF9nZXRfY29udHJvbGxlcl9k YXRhKG5hbmQpOwo+IAo+IFRoZSBFQ0MgaXMgbm93IHNvcnQgb2YgZml4ZWQgdG8gMjQgYW5kIDQw IGZvciBsZWdhY3kgcmVhc29ucy4KPiBUaGUgb2xkZXIgcmszMDY2IGJvb3Ryb20gYXBwYXJlbnRs eSBvbmx5IHdvcmtzIGZvciBlY2MgMjQuCj4gU2VlIGluZm8gYmFzZWQgb24gb2xkZXIgd29yayBi eSBQYXdlxYIgSmFyb3N6IGZvciBVYm9vdC4KPiAKPiBJJ20gbm90IHRvbyBmYW1pbGlhciB3aXRo IGFsbCBpbm5lciB3b3JraW5nIG9mIE1URCwgc28gcGxlYXNlIGFkdmlzZS4KPiBDYW4gdGhlIHVz ZXJzIGdldCBhY2Nlc3MgdG8gc3RydWN0IHJrX25hbmRfY2hpcD8KPiBXb3VsZCB5b3UgbGlrZSB0 byBnaXZlIHVzZXJzIGNvbnRyb2wgb3ZlciB3aGF0IGVjYyB0byB1c2U/CgpJdCBpcyBhbHJlYWR5 IHRoZSBjYXNlOiBEVCBwcm9wZXJ0aWVzIGluIHRoZSBOQU5EIG5vZGUgKHNlZSB0aGUKYmluZGlu Z3MpLiBCdXQgdGhpcyBpcyBhIHN0YXRpYyBpbmZvcm1hdGlvbiwgeW91IGNhbm5vdCBjaGFuZ2Ug aXQgYXQKcnVuIHRpbWUgb2YgY291cnNlLgoKPiBXaGF0IHByb2dyYW0gY2FuIHdlIHVzZSBmb3Ig dGhhdD8gQ2FuJ3QgdXNlIGRkIHRoZW4gYW55IG1vcmUuCgpZb3Ugc2hvdWxkIG5vdCB1c2UgZGQg YXQgYWxsLiBkZCBpcyBmb3IgYmxvY2sgZGV2aWNlcyBvciBjaGFyIGRldmljZXMsCm5vdCBNVEQg ZGV2aWNlcy4gVGhlcmUgaXMgYW4gbXRkLXV0aWxzIHBhY2thZ2Ugb3V0IHRoZXJlIHRoYXQgY292 ZXJzCnByZXR0eSBtdWNoIGFsbCB0aGUgYWN0aW9ucyB5b3Ugd2FudCB0by4KCj4gSG93IGRvIHdl IHJlZ2FpbiBlY2MgY29udHJvbCBpZiB3ZSByZWFsbHkgaGF2ZSB0byBmb3IgZXhhbXBsZSByazMw NjY/Cj4gT3IgcmVtb3ZlIHRoYXQgYm9vdHJvbSBjaGVjayBhbmQgYWx3YXlzIHNldCBFQ0Mgd2l0 aCBldmVyeQo+IHJrX25hbmRjX2h3X3N5bmRyb21lX2VjY19yZWFkX3BhZ2UgYW5kCj4gcmtfbmFu ZGNfaHdfc3luZHJvbWVfZWNjX3dyaXRlX3BhZ2Ugd2l0aCB3aGF0ZXZlciBwYXNzZWQgYWxvbmc/ CgpJIGRvbid0IHVuZGVyc3RhbmQgeW91ciBxdWVzdGlvbi4KCgpbLi4uXQoKPiA+PiArc3RhdGlj IGludCBya19uYW5kY19od19lY2Nfc2V0dXAoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwKPiA+PiAr CQkJCSB1aW50MzJfdCBzdHJlbmd0aCkKPiA+PiArewo+ID4+ICsJc3RydWN0IHJrX25hbmRfY29u dHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+ID4+ ICsJdWludDMyX3QgcmVnOwo+ID4+ICsKPiA+PiArCW5hbmQtPmVjYy5zdHJlbmd0aCA9IHN0cmVu Z3RoOyAgCj4gCj4gU2hvdWxkIEkgYWRkIHRoaXMgY29tbWVudCBiZWxvdz8KPiAKPiAvKiBIVyBF Q0MgYWx3YXlzIHJlcXVlc3QgRUNDIGJ5dGVzIGZvciAxMDI0IGJ5dGVzIGJsb2NrcyAqLwo+IAo+ ID4+ICsJbmFuZC0+ZWNjLmJ5dGVzID0gRElWX1JPVU5EX1VQKG5hbmQtPmVjYy5zdHJlbmd0aCAq IDE0LAo+ID4+IDgpOyAgCj4gPiAgCj4gCj4gPiBXaGF0IGRvIDE0IGFuZCA4IG1lYW4/ICAKPiAK PiBmbHMgLSBmaW5kIGxhc3QgKG1vc3Qtc2lnbmlmaWNhbnQpIGJpdCBzZXQKPiAKPiBpbnQgZmxz KHVuc2lnbmVkIGludCB4KQo+IHsKPiAJaW50IHIgPSAzMjsKPiAKPiAJaWYgKCF4KQo+IAkJcmV0 dXJuIDA7Cj4gCWlmICghKHggJiAweGZmZmYwMDAwdSkpIHsKPiAJCXggPDw9IDE2Owo+IAkJciAt PSAxNjsKPiAJfQo+IAlpZiAoISh4ICYgMHhmZjAwMDAwMHUpKSB7Cj4gCQl4IDw8PSA4Owo+IAkJ ciAtPSA4Owo+IAl9Cj4gCWlmICghKHggJiAweGYwMDAwMDAwdSkpIHsKPiAJCXggPDw9IDQ7Cj4g CQlyIC09IDQ7Cj4gCX0KPiAJaWYgKCEoeCAmIDB4YzAwMDAwMDB1KSkgewo+IAkJeCA8PD0gMjsK PiAJCXIgLT0gMjsKPiAJfQo+IAlpZiAoISh4ICYgMHg4MDAwMDAwMHUpKSB7Cj4gCQl4IDw8PSAx Owo+IAkJciAtPSAxOwo+IAl9Cj4gCXJldHVybiByOwo+IH0KPiAKPiAJbmFuZC0+ZWNjLmJ5dGVz ID0gRElWX1JPVU5EX1VQKGVjYy0+c3RyZW5ndGggKiBmbHMoOCAqIDEwMjQpLAo+IDgpOwo+IAo+ IGZvcm11bGUgaXMgdXNlZCB0byB0cmFuc2xhdGUgc3RyZW5ndGggaW4gYml0LzEwMjQgQkNIL0VD Qwo+IHRvIE1URCBFQ0MgYnl0ZXMgZm9yIDEwMjQgYnl0ZXMgYmxvY2tzIGluIG5hbmQtPmVjYy5i eXRlcwo+IAo+IDE0IGlzIHJlcGxhY2VtZW50IGZvciBmbHMoOCAqIDEwMjQpCgpUaGlzIGlzIGFi c29sdXRlbHkgZm9yYmlkZGVuIDopIFlvdSBzaG91bGQgbmV2ZXIgaGlkZSB5b3VyIGZpcnN0Cmlu dGVudGlvbiwgMTQgaGVyZSBpcyBhIHZlcnkgYmFkIHBsYWNlaG9sZGVyIGJlY2F1c2Ugd2UgY2Fu bm90IGtub3cKd2hhdCBpdCBtZWFucy4gSSBzdXBwb3NlIHlvdXIgaW50ZW50aW9uIHdhcyB0byBv cHRpbWl6ZSB0aGluZ3MuIGZscygpCmFscmVhZHkgZXhpc3QgaW4gdGhlIGtlcm5lbCwgOCBhbmQg MTAyNCBhcmUgY29uc3RhbnRzIHNvIEdDQyAob3IKd2hhdGV2ZXIgY29tcGlsZXIgeW91IHVzZSkg d2lsbCBvcHRpbWl6ZSB0aGluZ3MgYXMgbXVjaCBhcyBpdCBjYW4uClBsdXMsIGl0IGlzIHJ1biBv bmx5IG9uY2UgaW4gYSBsaWZldGltZSBzbyB0aGVyZSBpcyBub3Qgc28gbXVjaCBnYWluCmFueXdh eS4KCj4gOCBiaXRzIGluIGEgYnl0ZQoKSSB0aGluayB0aGVyZSBpcyBhIG1hY3JvIGZvciB0aGF0 IChvdGhlcndpc2UgaXQgaXMgbm90IGltcG9ydGFudCkKCj4gCj4gPiAgCj4gPj4gKwkvKiBIVyBF Q0Mgb25seSB3b3JrcyB3aXRoIGFuIGV2ZW4gbnVtYmVyIG9mIEVDQyBieXRlcyAqLwo+ID4+ICsJ bmFuZC0+ZWNjLmJ5dGVzID0gQUxJR04obmFuZC0+ZWNjLmJ5dGVzLCAyKTsKPiA+PiArCj4gPj4g KwlpZiAoY3RybC0+dmVyc2lvbiA9PSBWRVJTSU9OXzkpIHsKPiA+PiArCQlzd2l0Y2ggKG5hbmQt PmVjYy5zdHJlbmd0aCkgewo+ID4+ICsJCWNhc2UgNzA6Cj4gPj4gKwkJCXJlZyA9IE5BTkRDX1Y5 X0VDQ183MDsKPiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJY2FzZSA2MDoKPiA+PiArCQkJcmVnID0g TkFORENfVjlfRUNDXzYwOwo+ID4+ICsJCQlicmVhazsKPiA+PiArCQljYXNlIDQwOgo+ID4+ICsJ CQlyZWcgPSBOQU5EQ19WOV9FQ0NfNDA7Cj4gPj4gKwkJCWJyZWFrOwo+ID4+ICsJCWNhc2UgMTY6 Cj4gPj4gKwkJCXJlZyA9IE5BTkRDX1Y5X0VDQ18xNjsKPiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJ ZGVmYXVsdDoKPiA+PiArCQkJcmV0dXJuIC1FSU5WQUw7Cj4gPj4gKwkJfQo+ID4+ICsJCXdyaXRl bChyZWcsIGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjlfQkNIQ1RMKTsKPiA+PiArCX0gZWxzZSB7 Cj4gPj4gKwkJc3dpdGNoIChuYW5kLT5lY2Muc3RyZW5ndGgpIHsKPiA+PiArCQljYXNlIDYwOgo+ ID4+ICsJCQlyZWcgPSBOQU5EQ19WNl9FQ0NfNjA7Cj4gPj4gKwkJCWJyZWFrOwo+ID4+ICsJCWNh c2UgNDA6Cj4gPj4gKwkJCXJlZyA9IE5BTkRDX1Y2X0VDQ180MDsKPiA+PiArCQkJYnJlYWs7Cj4g Pj4gKwkJY2FzZSAyNDoKPiA+PiArCQkJcmVnID0gTkFORENfVjZfRUNDXzI0Owo+ID4+ICsJCQli cmVhazsKPiA+PiArCQljYXNlIDE2Ogo+ID4+ICsJCQlyZWcgPSBOQU5EQ19WNl9FQ0NfMTY7Cj4g Pj4gKwkJCWJyZWFrOwo+ID4+ICsJCWRlZmF1bHQ6Cj4gPj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ ID4+ICsJCX0KPiA+PiArCQl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2X0JD SENUTCk7Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30KPiA+PiArCj4g Pj4gK3N0YXRpYyB2b2lkIHJrX25hbmRjX3hmZXJfc3RhcnQoc3RydWN0IHJrX25hbmRfY29udHJv bGxlciAqY3RybCwKPiA+PiArCQkJCXVpbnQ4X3QgZGlyLCB1aW50OF90IG5fS0IsCj4gPj4gKwkJ CQlkbWFfYWRkcl90IGRtYV9kYXRhLCBkbWFfYWRkcl90Cj4gPj4gZG1hX29vYikgK3sKPiA+PiAr CXVpbnQzMl90IHJlZzsKPiA+PiArCj4gPj4gKwlpZiAoY3RybC0+dmVyc2lvbiA9PSBWRVJTSU9O XzkpIHsKPiA+PiArCQlyZWcgPSBOQU5EQ19WOV9ETUFfQ0ZHX1dSX1NUIHwKPiA+PiArCQkgICAg ICBOQU5EQ19WOV9ETUFfQ0ZHX1dSKGRpcikgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0RNQV9D RkdfQlVTX01PREUgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0RNQV9DRkdfSFNJWkVfMzIgfAo+ ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0RNQV9DRkdfQlVSU1RfMTYgfAo+ID4+ICsJCSAgICAgIE5B TkRDX1Y5X0RNQV9DRkdfSU5DUl9OVU0oMTYpOwo+ID4+ICsJCXdyaXRlbChyZWcsIGN0cmwtPnJl Z3MgKyBOQU5EQ19SRUdfVjlfRE1BX0NGRyk7Cj4gPj4gKwkJd3JpdGVsKCh1aW50MzJfdClkbWFf ZGF0YSwgY3RybC0+cmVncyArCj4gPj4gTkFORENfUkVHX1Y5X0RNQV9CVUYwKTsKPiA+PiArCQl3 cml0ZWwoKHVpbnQzMl90KWRtYV9vb2IsIGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19WOV9E TUFfQlVGMSk7ICAKPiA+Cj4gPiBJJ20gcHJldHR5IHN1cmUgbW9zdCBvZiB0aGVzZSB3cml0ZWwg Y291bGQgYmUgdHVybmVkIGludG8KPiA+IHdyaXRlbF9yZWxheGVkLiAgCj4gCj4gd3JpdGVsKCkg ICAgICAgLS0gd3JpdGUgdG8gdGhlIGxpdHRsZS1lbmRpYW4gaGFyZHdhcmUgcmVnaXN0ZXIgd2l0 aAo+IGNvbXBpbGVyIG1lbW9yeSBiYXJyaWVyLAo+IHdyaXRlbF9yZWxheGVkIC0tIGFzIGFib3Zl LCB3aXRob3V0IGJhcnJpZXIsCj4gX19yYXdfd3JpdGVsKCkgLS0gYXMgYWJvdmUgKHdyaXRlbF9y ZWxheGVkKCkpIHdpdGhvdXQgZW5kaWFuZXNzCj4gY29udmVyc2lvbiAoQ1BVIG9yZGVyaW5nIHdp bGwgYmUgdXNlZCkuCj4gQXJjaGl0ZWN0dXJlLWRlcGVuZGVudC4KPiBJIGRvbid0IGtub3cuCgpJ biBtb3N0IG9mIHRoZSBjYXNlcyB5b3UgZG9uJ3QgbmVlZCBhbiBleHBsaWNpdCBiYXJyaWVyICh1 bmxlc3MsIGZvcgppbnN0YW5jZSwgeW91IGFyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gaGFw cGVuIHdpdGggYSBzaG9ydCB0aW1lb3V0KS4KClBsZWFzZSB0cnkgd2l0aCB3cml0ZWxfcmVsYXhl ZCBpbiBtb3N0IG9mIHRoZSBjYXNlcy4KCj4gCj4gPgo+ID4gQWxzbyBJIGFtIG5vdCBhIGJpZyBm YW4gb2YgdGhlc2UgY2FzdHMsIG1heWJlIHlvdSBzaG91bGQgY2hhbmdlCj4gPiBkbWFfZGF0YSBh bmQgZG1hX29vYiB0eXBlcyAoYmUgY2FyZWZ1bDogeW91IGVuYWJsZWQgQ09NUElMRV9URVNUIGlu Cj4gPiBLY29uZmlnLCB5b3UgbXVzdCBzdXBwb3J0IDMyLWJpdCBhbmQgNjQtYml0IHBvaW50ZXJz LCBwbGVhc2UgdHJ5IHRvCj4gPiBjb21waWxlIHRoaXMgZHJpdmVyIHdpdGggZGlmZmVyZW50IHRv b2xjaGFpbnMpLiAgCj4gCj4gRHJpdmVyIGlzIHVzZWQgZm9yIGJvdGggQVJNIGFzIGFybTY0Lgo+ IFRoZXNlIHJlZ2lzdGVycyBhcmUgMzIgYml0LiBQbGVhc2UgYWR2aXNlIHdoYXQgaGFwcGVucwo+ IHdoZW4gd3JpdGVsIGdldHMgZG1hX2FkZHJfdCBhbmQgZG1hX2RhdGEgYXMgNjQgYml0Lgo+IERv bid0IGhhdmUgdGhlIGhhcmR3YXJlIHRvIGZpbmQgb3V0LgoKWW91IGRvbid0IG5lZWQgaGFyZHdh cmUsIGp1c3QgYSAzMi1iaXQgYW5kIGEgNjQtYml0IHRvb2xjaGFpbi4gV2UganVzdAp3YW50IHRv IGF2b2lkIGNhc3RzIGFuZCBidWlsZCB3YXJuaW5ncy4KCj4gCj4gPiAgCj4gPj4gKwo+ID4+ICsJ CXJlZyA9IE5BTkRDX1Y5X0ZMX0RJUihkaXIpIHwKPiA+PiArCQkgICAgICBOQU5EQ19WOV9GTF9Y RkVSX0VOIHwKPiA+PiArCQkgICAgICBOQU5EQ19WOV9GTF9YRkVSX0NPVU5UIHwKPiA+PiArCQkg ICAgICBOQU5EQ19WOV9GTF9BQ09SUkVDVCB8Cj4gPj4gKwkJICAgICAgTkFORENfVjlfRkxfUEFH RV9OVU0obl9LQikgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0ZMX0FTWU5DX1RPR19NSVg7Cj4g Pj4gKwkJd3JpdGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRDX1JFR19WOV9GTENUTCk7Cj4gPj4g KwkJcmVnIHw9IE5BTkRDX1Y5X0ZMX1hGRVJfU1RBUlQ7Cj4gPj4gKwkJd3JpdGVsKHJlZywgY3Ry bC0+cmVncyArIE5BTkRDX1JFR19WOV9GTENUTCk7Cj4gPj4gKwl9IGVsc2Ugewo+ID4+ICsJCXJl ZyA9IHJlYWRsKGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjZfQkNIQ1RMKTsKPiA+PiArCQlyZWcg PSAocmVnICYgKH4oTkFORF9WNl9CQ0hfUkVHSU9OX00gPDwKPiA+PiArCQkJCU5BTkRfVjZfQkNI X1JFR0lPTl9TKSkpIHwKPiA+PiArCQkgICAgICAoY3RybC0+c2VsZWN0ZWRfYmFuayA8PAo+ID4+ IE5BTkRfVjZfQkNIX1JFR0lPTl9TKTsKPiA+PiArCQl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsg TkFORENfUkVHX1Y2X0JDSENUTCk7Cj4gPj4gKwo+ID4+ICsJCXJlZyA9IE5BTkRDX1Y2X0RNQV9D RkdfV1JfU1QgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y2X0RNQV9DRkdfV1IoZGlyKSB8Cj4gPj4g KwkJICAgICAgTkFORENfVjZfRE1BX0NGR19CVVNfTU9ERSB8Cj4gPj4gKwkJICAgICAgTkFORENf VjZfRE1BX0NGR19IU0laRV8zMiB8Cj4gPj4gKwkJICAgICAgTkFORENfVjZfRE1BX0NGR19CVVJT VF8xNiB8Cj4gPj4gKwkJICAgICAgTkFORENfVjZfRE1BX0NGR19JTkNSX05VTSgxNik7Cj4gPj4g KwkJd3JpdGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9ETUFfQ0ZHKTsKPiA+PiAr CQl3cml0ZWwoZG1hX2RhdGEsIGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19WNl9ETUFfQlVG MCk7Cj4gPj4gKwkJd3JpdGVsKGRtYV9vb2IsIGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19W Nl9ETUFfQlVGMSk7ICAKPiAKPiBTYW1lIGhlcmUuCj4gCj4gPj4gKwo+ID4+ICsJCXJlZyA9IE5B TkRDX1Y2X0ZMX0RJUihkaXIpIHwKPiA+PiArCQkgICAgICBOQU5EQ19WNl9GTF9YRkVSX0VOIHwK PiA+PiArCQkgICAgICBOQU5EQ19WNl9GTF9YRkVSX0NPVU5UIHwKPiA+PiArCQkgICAgICBOQU5E Q19WNl9GTF9BQ09SUkVDVCB8Cj4gPj4gKwkJICAgICAgTkFORENfVjZfRkxfUEFHRV9OVU0obl9L QikgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y2X0ZMX0FTWU5DX1RPR19NSVg7Cj4gPj4gKwkJd3Jp dGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9GTENUTCk7Cj4gPj4gKwkJcmVnIHw9 IE5BTkRDX1Y2X0ZMX1hGRVJfU1RBUlQ7Cj4gPj4gKwkJd3JpdGVsKHJlZywgY3RybC0+cmVncyAr IE5BTkRDX1JFR19WNl9GTENUTCk7Cj4gPj4gKwl9Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRp YyBpbnQgcmtfbmFuZGNfd2FpdF9mb3JfeGZlcl9kb25lKHN0cnVjdCBya19uYW5kX2NvbnRyb2xs ZXIKPiA+PiAqY3RybCkgK3sKPiA+PiArCXVpbnQzMl90IHJlZzsKPiA+PiArCWludCByZXQ7Cj4g Pj4gKwo+ID4+ICsJaWYgKGN0cmwtPnZlcnNpb24gPT0gVkVSU0lPTl85KSB7Cj4gPj4gKwkJdm9p ZCBfX2lvbWVtICpwdHIgPSBjdHJsLT5yZWdzICsKPiA+PiBOQU5EQ19SRUdfVjlfRkxDVEw7ICsK PiA+PiArCQlyZXQgPSByZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljKHB0ciwgcmVnLAo+ID4+ICsJ CQkJCQlyZWcgJgo+ID4+IE5BTkRDX1Y5X0ZMX1hGRVJfUkVBRFksCj4gPj4gKwkJCQkJCTEsCj4g Pj4gTkFORENfREVGX1RJTUVPVVQpOwo+ID4+ICsJfSBlbHNlIHsKPiA+PiArCQl2b2lkIF9faW9t ZW0gKnB0ciA9IGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19WNl9GTENUTDsgKwo+ID4+ICsJ CXJldCA9IHJlYWRsX3BvbGxfdGltZW91dF9hdG9taWMocHRyLCByZWcsCj4gPj4gKwkJCQkJCXJl ZyAmCj4gPj4gTkFORENfVjZfRkxfWEZFUl9SRUFEWSwKPiA+PiArCQkJCQkJMSwKPiA+PiBOQU5E Q19ERUZfVElNRU9VVCk7Cj4gPj4gKwl9ICAKPiA+Cj4gPiBTcGFjZQo+ID4gIAo+ID4+ICsJaWYg KHJldCkKPiA+PiArCQlwcl9lcnIoInRpbWVvdXQgcmVnPSV4XG4iLCByZWcpOwo+ID4+ICsKPiA+ PiArCXJldHVybiByZXQ7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB1bnNpZ25lZCBsb25n IHJrX25hbmRjX2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwKPiA+PiArCQl2b2lk ICpwdHIsIGludCBzaXplLCBpbnQgZGlyKSAgCj4gPiAgCj4gCj4gPiBVbmFsaWduZWQgcGFyYW1l dGVycyAgCj4gCj4gVG8gcmVzdHlsZSBJIHVzZToKPiBhc3R5bGUgLVQ4IC0tbWF4LWNvZGUtbGVu Z3RoPTgwIC0tc3R5bGU9bGludXggcm9ja2NoaXBfbmFuZGMuYwo+IAo+IFBsZWFzZSBhZHZpc2Ug Zm9yIGEgYmV0dGVyIHNvbHV0aW9uLgoKSSBkb24ndCBrbm93IGFzdHlsZSwgYnV0IHRoaXMgd291 bGQgY2VydGFpbmx5IHRyaWdnZXIgYSBjaGVja3BhdGNoLnBsCndhcm5pbmcuIEp1c3QgY2hlY2sg dGhlbSBhbmQgY29ycmVjdCB0aGVtIGJ5IGhhbmQuCgo+IAo+ID4gIAo+ID4+ICt7Cj4gPj4gKyNp ZmRlZiBDT05GSUdfQVJNNjQKPiA+PiArCV9fZG1hX21hcF9hcmVhKCh2b2lkICopcHRyLCBzaXpl LCBkaXIpOwo+ID4+ICsJcmV0dXJuICgodW5zaWduZWQgbG9uZyl2aXJ0X3RvX3BoeXMoKHZvaWQg KilwdHIpKTsKPiA+PiArI2Vsc2UKPiA+PiArCXJldHVybiBkbWFfbWFwX3NpbmdsZShkZXYsICh2 b2lkICopcHRyLCBzaXplLCBkaXIpOwo+ID4+ICsjZW5kaWYgIAo+ID4gIAo+IAo+ID4gUGxlYXNl IHRyeSB0byByZW1vdmUgdGhlc2UgI2lmZGVmcywgSSBkb24ndCBrbm93IHdoeSB3b3VsZCB5b3Ug bmVlZAo+ID4gdGhlIGZvcm1lciBibG9jaz8gIAo+IAo+IFRoaXMgZHJpdmVyIGlzIHVzZWQgYm90 aCBmb3IgQVJNIGFzIGFybTY0Lgo+IE9yaWdpbmFsIGZyb20gUm9ja2NoaXA6IGFybTY0IGRvZXNu J3QgaGF2ZSBkbWFfbWFwX3NpbmdsZSgpIGFzIEkKPiByZW1lbWJlci4gRG9uJ3Qga25vdyB3aGF0 IHRvIHVzZSBpbnN0ZWFkLgo+IFBsZWFzZSBhZHZpc2UuCgpJIGFtIG5vdCBhd2FyZSBvZiBzdWNo IGEgbGltaXRhdGlvbi4gUGxlYXNlIGNoZWNrIGFnYWluLgoKPiAKPiA+ICAKPiA+PiArfQo+ID4+ ICsKPiA+PiArc3RhdGljIHZvaWQgcmtfbmFuZGNfZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2 aWNlICpkZXYsCj4gPj4gKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHB0ciwgaW50Cj4gPj4gc2l6 ZSwgaW50IGRpcikgK3sKPiA+PiArI2lmZGVmIENPTkZJR19BUk02NAo+ID4+ICsJX19kbWFfdW5t YXBfYXJlYShwaHlzX3RvX3ZpcnQocHRyKSwgc2l6ZSwgZGlyKTsKPiA+PiArI2Vsc2UKPiA+PiAr CWRtYV91bm1hcF9zaW5nbGUoZGV2LCAoZG1hX2FkZHJfdClwdHIsIHNpemUsIGRpcik7Cj4gPj4g KyNlbmRpZiAgCj4gPgo+ID4gU2FtZQo+ID4gIAo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMg aW50IHJrX25hbmRjX2h3X3N5bmRyb21lX2VjY19yZWFkX3BhZ2Uoc3RydWN0IG5hbmRfY2hpcAo+ ID4+ICpuYW5kLAo+ID4+ICsJCXVpbnQ4X3QgKmJ1ZiwKPiA+PiArCQlpbnQgb29iX3JlcXVpcmVk LCBpbnQgcGFnZSkgIAo+ID4gIAo+IAo+ID4gVW5hbGlnbmVkIHBhcmFtZXRlcnMgKHBsZWFzZSBj aGVjayBhbGwgb2YgdGhlbSkuICAKPiAKPiBBZ2FpbiBibGFtZSBhc3R5bGUgLi4uCj4gQWZ0ZXIg Y29ycmVjdGluZyBpdCBtYW51YWxseSBhIGZldyB0aW1lIEkganVzdCBsZWZ0IGl0IGFzIGl0IGlz Lgo+IAo+ID4gIAo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9f bXRkKG5hbmQpOwo+ID4+ICsJc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4g bmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+ID4+ICsJc3RydWN0IG5hbmRfZWNjX2N0 cmwgKmVjYyA9ICZuYW5kLT5lY2M7Cj4gPj4gKwlpbnQgbWF4X2JpdGZsaXBzID0gMDsKPiA+PiAr CWRtYV9hZGRyX3QgZG1hX2RhdGEsIGRtYV9vb2I7Cj4gPj4gKwlpbnQgcmV0LCBpOwo+ID4+ICsJ aW50IGJjaF9zdDsKPiA+PiArCWludCBkbWFfb29iX3NpemUgPSBlY2MtPnN0ZXBzICogMTI4Owo+ ID4+ICsJaW50IHBhZ2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXpl Owo+ID4+ICsKPiA+PiArCXJrX25hbmRjX3NlbGVjdF9jaGlwKG5hbmQsIGN0cmwtPnNlbGVjdGVk X2JhbmspOwo+ID4+ICsKPiA+PiArCWlmICgocGFnZSA8IHBhZ2VzX3Blcl9ibGsgKiBOQU5EQ19J REJSZXNCbGtOdW0pICYmICAKPiA+ICAKPiAKPiA+IENhbWVsIGNhc2UgaXMgdXN1YWxseSBub3Qg d2VsY29tZSAgCj4gCj4gQW55IHN1Z2dlc3Rpb25zIGZvciBhIGJldGVyIHJlcGxhY2UgZm9yIE5B TkRDX0lEQlJlc0Jsa051bSBhcmUKPiB3ZWxjb21lLgoKU09NRVRISU5HX0xpa2VUaGlzIC0+IFNP TUVUSElOR19MSUtFX1RISVMKCj4gCj4gPiAgCj4gPj4gKwkgICAgY3RybC0+Ym9vdHJvbWJsb2Nr cykgIAo+ID4KPiA+IFRoaXMgd291bGQgcHJvYmFibHkgZGVzZXJ2ZSBhIGhlbHBlcgo+ID4gIAo+ ID4+ICsJCXJrX25hbmRjX2h3X2VjY19zZXR1cChuYW5kLCBOQU5EQ19JREJFY2NCaXRzKTsKPiA+ PiArCj4gPj4gKwluYW5kX3JlYWRfcGFnZV9vcChuYW5kLCBwYWdlLCAwLCBOVUxMLCAwKTsKPiA+ PiArCj4gPj4gKwlkbWFfZGF0YSA9IHJrX25hbmRjX2RtYV9tYXBfc2luZ2xlKG10ZC0+ZGV2LnBh cmVudCwKPiA+PiArCQkJCQkgICBjdHJsLT5wYWdlX2J1ZiwKPiA+PiBtdGQtPndyaXRlc2l6ZSwK PiA+PiArCQkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ICsJZG1hX29vYiA9IHJrX25hbmRj X2RtYV9tYXBfc2luZ2xlKG10ZC0+ZGV2LnBhcmVudCwKPiA+PiArCQkJCQkgIGN0cmwtPm9vYl9i dWYsCj4gPj4gZG1hX29vYl9zaXplLAo+ID4+ICsJCQkJCSAgRE1BX0ZST01fREVWSUNFKTsKPiA+ PiArCj4gPj4gKwlpbml0X2NvbXBsZXRpb24oJmN0cmwtPmNvbXBsZXRlKTsgIAo+ID4gIAo+IAo+ ID4gT25lIGluaXRfY29tcGxldGlvbiBpcyBuZWVkZWQgKGluIHRoZSBwcm9iZSwgcHJvYmFibHkp IHRoZW4gcGxlYXNlCj4gPiB1c2UgcmVpbml0X2NvbXBsZXRpb24oKS4gIAo+IAo+IE11c3Qgc3R1 ZHkgdGhpcyBsYXRlci4KPiAKPiA+ICAKPiA+PiArCWlmIChjdHJsLT52ZXJzaW9uID09IFZFUlNJ T05fOSkKPiA+PiArCQl3cml0ZWwoTkFORENfVjlfSU5UX0RNQSwgY3RybC0+cmVncyArCj4gPj4g TkFORENfUkVHX1Y5X0lOVEVOKTsKPiA+PiArCWVsc2UKPiA+PiArCQl3cml0ZWwoTkFORENfVjZf SU5UX0RNQSwgY3RybC0+cmVncyArCj4gPj4gTkFORENfUkVHX1Y2X0lOVEVOKTsKPiA+PiArCXJr X25hbmRjX3hmZXJfc3RhcnQoY3RybCwgMCwgZWNjLT5zdGVwcywgZG1hX2RhdGEsCj4gPj4gZG1h X29vYik7ICAKPiAKPiA+PiArCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY3RybC0+Y29t cGxldGUsCj4gPj4gbXNlY3NfdG9famlmZmllcyg1KSk7Cj4gPj4gKwlya19uYW5kY193YWl0X2Zv cl94ZmVyX2RvbmUoY3RybCk7ICAKPiA+Cj4gPiBZb3VzIHNob3VsZCBjaGVjayB0aGUgcmV0dXJu IHN0YXR1cyBvZiBhbG1vc3QgYWxsIHRoZSBmdW5jdGlvbnMKPiA+IGhlcmUuICAKPiAKPiBQbGVh c2UgYWR2aXNlIHdoYXQgRVJST1IgY29kZSBzaG91bGQgYmUgcmV0dXJuZWQgaGVyZQo+IHRoYXQg aXMgY29tcGF0aWJsZSB3aXRoIE1URC4KCkFzIGEgZ2VuZXJhbCBydWxlLCBwbGVhc2UgY2hlY2sg dGhlIGRyaXZlcnMgd2hpY2ggaGF2ZSBiZWVuIHVwZGF0ZWQKcmVjZW50bHkgd2l0aCBnaXQgbG9n IC0tb25lLWxpbmUgLS0gZHJpdmVycy9tdGQvbmFuZC9yYXcvCgotPiBtYXJ2ZWxsLCBhdG1lbCwg ZnNtYywgc3VueGksIHN0bSwgY2FkZW5jZSwgZXRjCgpJbiB0aGlzIGNhc2UsIHlvdSBjYW4gcmV0 dXJuIHRoZSBlcnJvciBjb2RlIG9mIHRoZSBmYWlsaW5nIGZ1bmN0aW9uCndpdGggYSBzaW1wbGU6 CgoJcmV0ID0gZnVuYygpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoKSSBleHBlY3QgdGhlIHJr X25hbmRjX3dpYXRfZm9yX3hmZXJfZG9uZSgpIGhlbHBlciB0byByZXR1cm4gLUVUSU1FRE9VVApp biBjYXNlIG9mIHRpbWVvdXQuCgo+IAo+ID4gIAo+ID4+ICsJcmtfbmFuZGNfZG1hX3VubWFwX3Np bmdsZShtdGQtPmRldi5wYXJlbnQsIGRtYV9kYXRhLAo+ID4+IG10ZC0+d3JpdGVzaXplLAo+ID4+ ICsJCQkJICBETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ICsJcmtfbmFuZGNfZG1hX3VubWFwX3Npbmds ZShtdGQtPmRldi5wYXJlbnQsIGRtYV9vb2IsCj4gPj4gZG1hX29vYl9zaXplLAo+ID4+ICsJCQkJ ICBETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ICsKPiA+PiArCW1lbWNweShidWYsIGN0cmwtPnBhZ2Vf YnVmLCBtdGQtPndyaXRlc2l6ZSk7Cj4gPj4gKwo+ID4+ICsJaWYgKG9vYl9yZXF1aXJlZCkgewo+ ID4+ICsJCXVpbnQ4X3QgKm9vYjsKPiA+PiArCQl1aW50MzJfdCB0bXA7ICAKPiA+ICAKPiAKPiA+ IFBsZWFzZSB1c2UgdTgsIHUxNiBhbmQgdTMyIHR5cGVzLiAgCj4gCj4gU2hvdWxkIHRoaXMgYmUg Y2hhbmdlZCBmb3IgdGhlIGVudGlyZSBzb3VyY2U/CgpZZXMsIGNoZWNrcGF0Y2gucGwgd2lsbCB3 YXJuIHlvdSBhYm91dCB0aGlzIHRvby4gdWludDx4Pl90IHR5cGVzIGFyZQpkZXByZWNhdGVkLgoK PiAKPiA+ICAKPiA+PiArCj4gPj4gKwkJZm9yIChpID0gMDsgaSA8IGVjYy0+c3RlcHM7IGkrKykg ewo+ID4+ICsJCQlvb2IgPSBuYW5kLT5vb2JfcG9pICsKPiA+PiArCQkJICAgICAgaSAqIChlY2Mt PmJ5dGVzICsgbmFuZC0+ZWNjLnByZXBhZCk7Cj4gPj4gKwkJCWlmIChjdHJsLT52ZXJzaW9uID09 IFZFUlNJT05fOSkgewo+ID4+ICsJCQkJdG1wID0gY3RybC0+b29iX2J1ZltpXTsKPiA+PiArCQkJ fSBlbHNlIHsKPiA+PiArCQkJCXVpbnQ4X3Qgb29iX3N0ZXAgPQo+ID4+IChjdHJsLT5lY2NfbW9k ZSA8PSAyNCkgPwo+ID4+ICsJCQkJCQkgICA2NCA6IDEyODsKPiA+PiArCQkJCXRtcCA9IGN0cmwt Pm9vYl9idWZbaSAqIG9vYl9zdGVwCj4gPj4gLyA0XTsKPiA+PiArCQkJfQo+ID4+ICsJCQkqb29i KysgPSAodWludDhfdCl0bXA7Cj4gPj4gKwkJCSpvb2IrKyA9ICh1aW50OF90KSh0bXAgPj4gOCk7 Cj4gPj4gKwkJCSpvb2IrKyA9ICh1aW50OF90KSh0bXAgPj4gMTYpOwo+ID4+ICsJCQkqb29iKysg PSAodWludDhfdCkodG1wID4+IDI0KTsKPiA+PiArCQl9Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJ aWYgKGN0cmwtPnZlcnNpb24gPT0gVkVSU0lPTl85KSB7Cj4gPj4gKwkJZm9yIChpID0gMDsgaSA8 IGVjYy0+c3RlcHMgLyAyOyBpKyspIHsKPiA+PiArCQkJYmNoX3N0ID0gcmVhZGwoY3RybC0+cmVn cyArCj4gPj4gTkFORENfUkVHX1Y5X0JDSFNUICsgaSAqIDQpOwo+ID4+ICsJCQlpZiAoYmNoX3N0 ICYgTkFORENfVjlfQkNIMF9TVF9FUlIgfHwKPiA+PiArCQkJICAgIGJjaF9zdCAmIE5BTkRDX1Y5 X0JDSDFfU1RfRVJSKSB7Cj4gPj4gKwkJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKPiA+PiAr CQkJCW1heF9iaXRmbGlwcyA9IC0xOwo+ID4+ICsJCQl9IGVsc2Ugewo+ID4+ICsJCQkJcmV0ID0K PiA+PiBOQU5EQ19WOV9FQ0NfRVJSX0NOVDAoYmNoX3N0KTsKPiA+PiArCQkJCW10ZC0+ZWNjX3N0 YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gPj4gKwkJCQltYXhfYml0ZmxpcHMgPSBtYXhfdCh1bnNp Z25lZCBpbnQsCj4gPj4gKwo+ID4+IG1heF9iaXRmbGlwcywgcmV0KTsgKwo+ID4+ICsJCQkJcmV0 ID0KPiA+PiBOQU5EQ19WOV9FQ0NfRVJSX0NOVDEoYmNoX3N0KTsKPiA+PiArCQkJCW10ZC0+ZWNj X3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gPj4gKwkJCQltYXhfYml0ZmxpcHMgPSBtYXhfdCh1 bnNpZ25lZCBpbnQsCj4gPj4gKwo+ID4+IG1heF9iaXRmbGlwcywgcmV0KTsKPiA+PiArCQkJfQo+ ID4+ICsJCX0KPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwkJZm9yIChpID0gMDsgaSA8IGVjYy0+c3Rl cHMgLyAyOyBpKyspIHsKPiA+PiArCQkJYmNoX3N0ID0gcmVhZGwoY3RybC0+cmVncyArCj4gPj4g TkFORENfUkVHX1Y2X0JDSFNUICsgaSAqIDQpOwo+ID4+ICsJCQlpZiAoYmNoX3N0ICYgTkFORENf VjZfQkNIMF9TVF9FUlIgfHwKPiA+PiArCQkJICAgIGJjaF9zdCAmIE5BTkRDX1Y2X0JDSDFfU1Rf RVJSKSB7Cj4gPj4gKwkJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKPiA+PiArCQkJCW1heF9i aXRmbGlwcyA9IC0xOyAgCj4gPiAgCj4gCj4gPiBXaHkgbm90IHVzaW5nIHJldCA9ICQocmVhbCBl cnJvcikgaW5zdGVhZCBvZiB1c2luZyBtYXhfYml0ZmxpcHMKPiA+IGhlcmU/Cj4gPgo+ID4gVGhl bjoKPiA+Cj4gPiAJaWYgKHJldCkgeyAgCj4gCj4gPiAJCWRldl9lcnIoKTsgIAo+IAo+IERvIHlv dSByZWFsbHkgd2FudCB0byBsaXR0ZXIgdGhlIGtlcm5lbCBsb2cgd2l0aCBlYWNoIHRpbWUgeW91 IGhpdCBhCj4gYmFkIGJsb2NrLAo+IGluIGNhc2UgeW91IHVzZSB0aGlzIGZ1bmN0aW9uIGluIGEg c2VhcmNoIGJhZCBibG9jayBsb29wPwo+IERvbid0IHRoaW5rcyBzbyAuLi4KPiBQbGVhc2UgYWR2 aXNlLgoKQWN0dWFsbHkgSSB0aGluayB0aGF0IEkgd2FzIHNpbXBsaWZ5aW5nIHlvdXIgY29kZSBi dXQgeW91IGFyZSByaWdodCB0aGF0CnRoaXMgZGV2X2VyciBoYXMgdG8gYmUgcmVtb3ZlZC4KCj4g Cj4gPiAJCXJldHVybiByZXQ7Cj4gPiAJfQo+ID4KPiA+IAlyZXR1cm4gbWF4X2JpdGZsaXBzOyAg Cj4gCj4gcmtfbmFuZGNfaHdfc3luZHJvbWVfZWNjX3JlYWRfcGFnZSgpIGlzIHVzZWQgaW4gYSBi YWQgYmxvY2sgc2VhcmNoCj4gc3RyYXRlZ3kuIEkgdGhpbmsgbWF4X2JpdGZsaXBzID0gLTEgd2Fz IGNob3NlbiBhcyBhIHNhdmVyIHZhbHVlIHRvCj4gcmV0dXJuLiBQbGVhc2UgYWR2aXNlIHdoYXQg bnVtYmVyIHJhbmdlIE1URCBpbnRlcnByZXRzIGFzCj4gbWF4X2JpdGZsaXBzIG9yIGFzIGZhdWx0 LiBBbHNvIGNvbnNpZGVyIHNvbWUgdW5jb250cm9sbGVkIHN0YXR1cwo+IHJldHVybiB2YWx1ZSwg aXQgd291bGQgYmUgYmV0dGVyIGlmIHdlCj4gYXJlIGluIGNvbnRyb2wgb2Ygd2hhdCBnb2VzIHJl dHVybi4KCm1heF9iaXRmbGlwIGlzIGEgbG9jYWwgdmFyaWFibGUsIEknbSBqdXN0IHNheWluZyB0 aGF0IHVzaW5nIG1heF9iaXRmbGlwCnRvIHNhdmUgYW4gZXJyb3IgY29kZSBpcyBiYWQuCgpZb3Ug Y2FuIGNoZWNrIHdoYXQgb3RoZXIgZHJpdmVycyBkby4KCj4gCj4gPiAgCj4gPj4gKwkJCX0gZWxz ZSB7Cj4gPj4gKwkJCQlyZXQgPQo+ID4+IE5BTkRDX1Y2X0VDQ19FUlJfQ05UMChiY2hfc3QpOwo+ ID4+ICsJCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHJldDsKPiA+PiArCQkJCW1heF9i aXRmbGlwcyA9IG1heF90KHVuc2lnbmVkIGludCwKPiA+PiArCj4gPj4gbWF4X2JpdGZsaXBzLCBy ZXQpOyArCj4gPj4gKwkJCQlyZXQgPQo+ID4+IE5BTkRDX1Y2X0VDQ19FUlJfQ05UMShiY2hfc3Qp Owo+ID4+ICsJCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHJldDsKPiA+PiArCQkJCW1h eF9iaXRmbGlwcyA9IG1heF90KHVuc2lnbmVkIGludCwKPiA+PiArCj4gPj4gbWF4X2JpdGZsaXBz LCByZXQpOwo+ID4+ICsJCQl9Cj4gPj4gKwkJfQo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWlmICht YXhfYml0ZmxpcHMgPT0gLTEpIHsKPiA+PiArCQlkZXZfZXJyKG10ZC0+ZGV2LnBhcmVudCwKPiA+ PiArCQkJInJlYWRfcGFnZSAleCAleCAleCAleCAleCAlcCAleFxuIiwKPiA+PiArCQkJcGFnZSwK PiA+PiArCQkJbWF4X2JpdGZsaXBzLAo+ID4+ICsJCQliY2hfc3QsCj4gPj4gKwkJCSgodWludDMy X3QgKilidWYpWzBdLAo+ID4+ICsJCQkoKHVpbnQzMl90ICopYnVmKVsxXSwKPiA+PiArCQkJYnVm LAo+ID4+ICsJCQkodWludDMyX3QpZG1hX2RhdGEpOyAgCj4gPiAgCgpbLi4uXQoKPiA+PiArCj4g Pj4gKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDwgbGVuOyBvZmZzKyspCj4gPj4gKwkJYnVmW29mZnNd ID0gcmVhZGIoYmFua19iYXNlKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIHZvaWQgcmtf bmFuZGNfd3JpdGVfYnVmKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsCj4gPj4gKwkJCSAgICAgICBj b25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBya19uYW5k X2NvbnRyb2xsZXIgKmN0cmwgPQo+ID4+IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsK PiA+PiArCWludCBvZmZzID0gMDsKPiA+PiArCXZvaWQgX19pb21lbSAqYmFua19iYXNlID0gY3Ry bC0+cmVncyArIE5BTkRDX1JFR19CQU5LMCArCj4gPj4gKwkJCQkgIGN0cmwtPnNlbGVjdGVkX2Jh bmsgKiAweDEwMDsKPiA+PiArCj4gPj4gKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDwgbGVuOyBvZmZz KyspCj4gPj4gKwkJd3JpdGViKGJ1ZltvZmZzXSwgYmFua19iYXNlKTsKPiA+PiArfQo+ID4+ICsK PiA+PiArc3RhdGljIHZvaWQgcmtfbmFuZGNfd3JpdGVfY21kKHN0cnVjdCBuYW5kX2NoaXAgKm5h bmQsIHVpbnQ4X3QKPiA+PiBjbWQpICt7Cj4gPj4gKwlzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVy ICpjdHJsID0KPiA+PiBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEobmFuZCk7ICsKPiA+PiArCXZv aWQgX19pb21lbSAqYmFua19iYXNlID0gY3RybC0+cmVncyArIE5BTkRDX1JFR19CQU5LMCArCj4g Pj4gKwkJCQkgIGN0cmwtPnNlbGVjdGVkX2JhbmsgKiAweDEwMCArCj4gPj4gKwkJCQkgIE5BTkRD X1JFR19DTUQ7ICAKPiA+ICAKPiAKPiA+IFlvdSBtaWdodCB3YW50IHRvIHdyaXRlIGFuIGhlbHBl ciB0byBjYWxjdWxhdGUgYmFua19iYXNlLCB0byBhdm9pZAo+ID4gcmVwZWF0aW5nIHRoZXNlIGxp bmVzLiAgCj4gCj4gRXZlbiB3aXRoIGEgc2VwYXJhdGUgZGVmaW5lIG9yIGhlbHBlciBmdW5jdGlv biBJIHN0aWxsIGhhdmUgdG8gc3VwcGx5Cj4gbXkgcmVnLCBzZWxlY3RlZF9iYW5rIGFuZCBvZmZz ZXQuIEl0IGRvZXNuJ3QgbWFrZSB0aGluZ3MgY2xlYW5lcgo+IHB1bXBpbmcgZGF0ZQo+IHRvIGFu ZCBmcm9tIGEgaGVscGVyIG9yIG5laXRoZXIgZG9lc24ndCBpdCBzaG9ydGVuIG15IHNvdXJjZSB3 aXRoIGEKPiBkZWZpbmUuIFRlbmQgdG8ga2VlcCBpdCBhcyBpdCBpcyBmb3Igbm93LiBJZiB5b3Ug YWdyZWUgb2YgY291cnNlLgoKI2RlZmluZSBSS19SRUcoY3RybCwgb2ZmKSBcCgkoY3RybCktPnJl Z3MgKyBcCglOQU5EQ19SRUdfQkFOSzAgKyBcCgkoY3RybCktPnNlbGVjdGVkX2JhbmsgKiBCQU5L X1NJWkUgKyBcCgkob2ZmKQoKI2RlZmluZSBSS19SRUdfQ01EKGN0cmwpIFJLX1JFRyhjdHJsLCBO QU5EQ19SRUdfQ01EKQoKPiAKPiA+ICAKPiA+PiArCj4gPj4gKwl3cml0ZWIoY21kLCBiYW5rX2Jh c2UpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9pZCBya19uYW5kY193cml0ZV9hZGRy KHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsIHVpbnQ4X3QKPiA+PiBhZGRyKSArewo+ID4+ICsJc3Ry dWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9nZXRfY29udHJvbGxlcl9k YXRhKG5hbmQpOyArCj4gPj4gKwl2b2lkIF9faW9tZW0gKmJhbmtfYmFzZSA9IGN0cmwtPnJlZ3Mg KyBOQU5EQ19SRUdfQkFOSzAgKwo+ID4+ICsJCQkJICBjdHJsLT5zZWxlY3RlZF9iYW5rICogMHgx MDAgKwo+ID4+ICsJCQkJICBOQU5EQ19SRUdfQUREUjsKPiA+PiArCj4gPj4gKwl3cml0ZWIoYWRk ciwgYmFua19iYXNlKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uYW5kY19k ZXZfcmVhZHkoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCkKPiA+PiArewo+ID4+ICsJc3RydWN0IHJr X25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKG5h bmQpOyArCj4gPj4gKwlpZiAocmVhZGwoY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9GTUNUTCkg Jgo+ID4+IE5BTkRDX1Y2X0ZNX0ZSRUFEWSkKPiA+PiArCQlyZXR1cm4gMTsKPiA+PiArCj4gPj4g KwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uYW5kY19vb2Js YXlvdXRfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQKPiA+PiBzZWN0aW9uLAo+ID4+ICsJ CQkJICBzdHJ1Y3QgbXRkX29vYl9yZWdpb24KPiA+PiAqb29icmVnaW9uKSArewo+ID4+ICsJc3Ry dWN0IG5hbmRfY2hpcCAqbmFuZCA9IG10ZF90b19uYW5kKG10ZCk7Cj4gPj4gKwo+ID4+ICsJaWYg KHNlY3Rpb24gPj0gbmFuZC0+ZWNjLnN0ZXBzKQo+ID4+ICsJCXJldHVybiAtRVJBTkdFOwo+ID4+ ICsKPiA+PiArCW9vYnJlZ2lvbi0+b2Zmc2V0ID0gKG5hbmQtPmVjYy5ieXRlcyArIG5hbmQtPmVj Yy5wcmVwYWQpCj4gPj4gKiBzZWN0aW9uICsKPiA+PiArCQkJICAgIG5hbmQtPmVjYy5wcmVwYWQ7 Cj4gPj4gKwlvb2JyZWdpb24tPmxlbmd0aCA9IG5hbmQtPmVjYy5zdGVwcyAqIG5hbmQtPmVjYy5i eXRlczsKPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGlj IGludCBya19uYW5kY19vb2JsYXlvdXRfZnJlZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50Cj4g Pj4gc2VjdGlvbiwKPiA+PiArCQkJCSAgIHN0cnVjdCBtdGRfb29iX3JlZ2lvbgo+ID4+ICpvb2Jy ZWdpb24pICt7Cj4gPj4gKwlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kID0gbXRkX3RvX25hbmQobXRk KTsKPiA+PiArCj4gPj4gKwlpZiAoc2VjdGlvbiA+PSBuYW5kLT5lY2Muc3RlcHMpCj4gPj4gKwkJ cmV0dXJuIC1FUkFOR0U7Cj4gPj4gKwo+ID4+ICsJb29icmVnaW9uLT5vZmZzZXQgPSAobmFuZC0+ ZWNjLmJ5dGVzICsgbmFuZC0+ZWNjLnByZXBhZCkKPiA+PiAqIHNlY3Rpb247Cj4gPj4gKwlvb2Jy ZWdpb24tPmxlbmd0aCA9IG5hbmQtPmVjYy5zdGVwcyAqIG5hbmQtPmVjYy5wcmVwYWQ7Cj4gPj4g Kwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgbXRkX29vYmxheW91dF9vcHMgcmtfbmFuZGNfb29iX29wcyA9IHsKPiA+PiArCS5lY2MgPSBy a19uYW5kY19vb2JsYXlvdXRfZWNjLAo+ID4+ICsJLmZyZWUgPSBya19uYW5kY19vb2JsYXlvdXRf ZnJlZSwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lkIHJrX25hbmRjX2ZyZWVfYnVm ZmVyKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQpCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBya19uYW5k X2NvbnRyb2xsZXIgKmN0cmwgPQo+ID4+IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsg Kwo+ID4+ICsJa2ZyZWUoY3RybC0+cGFnZV9idWYpOwo+ID4+ICsJa2ZyZWUoY3RybC0+b29iX2J1 Zik7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmFuZGNfYnVmZmVyX2luaXQo c3RydWN0IG5hbmRfY2hpcCAqbmFuZCkKPiA+PiArewo+ID4+ICsJc3RydWN0IG10ZF9pbmZvICpt dGQgPSBuYW5kX3RvX210ZChuYW5kKTsKPiA+PiArCXN0cnVjdCBya19uYW5kX2NvbnRyb2xsZXIg KmN0cmwgPQo+ID4+IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsgKwo+ID4+ICsJY3Ry bC0+cGFnZV9idWYgPSBrbWFsbG9jKG10ZC0+d3JpdGVzaXplLCBHRlBfS0VSTkVMIHwKPiA+PiBH RlBfRE1BKTsgIAo+ID4gIAo+IAo+ID4gZGV2aWNlIG1hbmFnZWQgYWxsb2NhdGlvbnMgKGRldm1f Li4uKSB3b3VsZCBiZSBuaWNlICAKPiAKPiBkZXZtX2t6YWxsb2MoKSBuZWVkcyBhbiBleHRyYSBz dHJ1Y3QgZGV2aWNlLgo+IERvZXMgTVREIHNhZmUtZ2FyZCB0aGUgY29ycmVjdCBvcmRlciB0byBk ZXRhY2ggZnJvbSBzdHJ1Y3QKPiBya19uYW5kX2NvbnRyb2xsZXIKPiB3aXRob3V0IHJrX25hbmRj X2ZyZWVfYnVmZmVyKCk/CgomcGRldi0+ZGV2IGlzIGZpbmUsIHlvdSBjYW4gc2F2ZSBpdCB5b3Vy IG93biBuYW5kIGNvbnRyb2xsZXIgc3RydWN0dXJlLgoKSSB0aGluayBhY2Nlc3NpbmcgbXRkLT5k ZXYgaXMgbm90IGFsbG93ZWQgYmVmb3JlIHRoZSByZWdpc3RyYXRpb24gb2YKdGhlIE1URCBkZXZp Y2UgdGhvdWdoLgoKPiAKPiA+ICAKPiA+PiArCWlmICghY3RybC0+cGFnZV9idWYpCj4gPj4gKwkJ cmV0dXJuIC1FTk9NRU07Cj4gPj4gKwo+ID4+ICsJY3RybC0+b29iX2J1ZiA9IGttYWxsb2MobmFu ZC0+ZWNjLnN0ZXBzICogMTI4LCBHRlBfS0VSTkVMCj4gPj4gfCBHRlBfRE1BKTsKPiA+PiArCWlm ICghY3RybC0+b29iX2J1Zikgewo+ID4+ICsJCWtmcmVlKGN0cmwtPnBhZ2VfYnVmKTsKPiA+PiAr CQlyZXR1cm4gLUVOT01FTTsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiAr fQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uYW5kY19od19lY2NfY3RybF9pbml0KHN0cnVj dCBuYW5kX2NoaXAgKm5hbmQpCj4gPj4gK3sKPiA+PiArCXVpbnQ4X3Qgc3RyZW5ndGhzX3Y2W10g PSB7NjAsIDQwLCAyNCwgMTZ9Owo+ID4+ICsJdWludDhfdCBzdHJlbmd0aHNfdjlbXSA9IHs3MCwg NjAsIDQwLCAxNn07Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKG5h bmQpOwo+ID4+ICsJc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9n ZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+ID4+ICsJaW50IG1heF9zdHJlbmd0aDsKPiA+PiAr CXVpbnQzMl90IGksIHZlcjsKPiA+PiArCj4gPj4gKwlpZiAobmFuZC0+b3B0aW9ucyAmIE5BTkRf SVNfQk9PVF9NRURJVU0pCj4gPj4gKwkJY3RybC0+Ym9vdHJvbWJsb2NrcyA9IHRydWU7Cj4gPj4g KwllbHNlCj4gPj4gKwkJY3RybC0+Ym9vdHJvbWJsb2NrcyA9IGZhbHNlOwo+ID4+ICsKPiA+PiAr CW5hbmQtPmVjYy5wcmVwYWQgPSA0Owo+ID4+ICsJbmFuZC0+ZWNjLnN0ZXBzID0gbXRkLT53cml0 ZXNpemUgLyBuYW5kLT5lY2Muc2l6ZTsKPiA+PiArCj4gPj4gKwltYXhfc3RyZW5ndGggPSAoKG10 ZC0+b29ic2l6ZSAvIG5hbmQtPmVjYy5zdGVwcykgLSA0KSAqIDgKPiA+PiAvIDE0Owo+ID4+ICsJ aWYgKGN0cmwtPnZlcnNpb24gPT0gVkVSU0lPTl85KSB7Cj4gPj4gKwkJY3RybC0+bWF4X2VjY19z dHJlbmd0aCA9IDcwOwo+ID4+ICsJCXZlciA9IHJlYWRsKGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdf VjlfVkVSKTsKPiA+PiArCQlpZiAodmVyICE9IE5BTkRDX0lEX1Y5MDApCj4gPj4gKwkJCWRldl9l cnIobXRkLT5kZXYucGFyZW50LAo+ID4+ICsJCQkJInVuc3VwcG9ydGVkIG5hbmRjIHZlcnNpb24g JXhcbiIsCj4gPj4gdmVyKTsgKwo+ID4+ICsJCWlmIChtYXhfc3RyZW5ndGggPiBjdHJsLT5tYXhf ZWNjX3N0cmVuZ3RoKQo+ID4+ICsJCQltYXhfc3RyZW5ndGggPSBjdHJsLT5tYXhfZWNjX3N0cmVu Z3RoOwo+ID4+ICsKPiA+PiArCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdHJlbmd0aHNf djkpOyBpKyspIHsKPiA+PiArCQkJaWYgKG1heF9zdHJlbmd0aCA+PSBzdHJlbmd0aHNfdjlbaV0p Cj4gPj4gKwkJCQlicmVhazsKPiA+PiArCQl9Cj4gPj4gKwo+ID4+ICsJCWlmIChpID49IEFSUkFZ X1NJWkUoc3RyZW5ndGhzX3Y5KSkgewo+ID4+ICsJCQlkZXZfZXJyKG10ZC0+ZGV2LnBhcmVudCwK PiA+PiArCQkJCSJ1bnN1cHBvcnRlZCBzdHJlbmd0aFxuIik7Cj4gPj4gKwkJCXJldHVybiAtRU5P VFNVUFA7Cj4gPj4gKwkJfQo+ID4+ICsKPiA+PiArCQljdHJsLT5lY2NfbW9kZSA9IHN0cmVuZ3Ro c192OVtpXTsKPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwkJY3RybC0+bWF4X2VjY19zdHJlbmd0aCA9 IDYwOwo+ID4+ICsKPiA+PiArCQl2ZXIgPSByZWFkbChjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2 X1ZFUik7Cj4gPj4gKwkJaWYgKHZlciA9PSBOQU5EQ19JRF9WODAxKQo+ID4+ICsJCQljdHJsLT5t YXhfZWNjX3N0cmVuZ3RoID0gMTY7Cj4gPj4gKwkJZWxzZSBpZiAodmVyID09IE5BTkRDX0lEX1Y2 MDAgfHwKPiA+PiArCQkJIHZlciA9PSBOQU5EQ19JRF9WNjIyIHx8ICAKPiAKPiA+PiArCQkJIHZl ciA9PSBOQU5EQ19JRF9WNzAxIHx8ICAKPiAKPiBBZGRlZCB2ZXJzaW9uIDcgZm9yIFJLMzIyOEEv UkszMjI4Qi4gQ2FuIHNvbWVvbmUgd2l0aCBpbnNpZGVyIGluZm8KPiBjb25maXJtIGlmIHRoaXMg d29ya3Mgb3Igbm90Lgo+IAo+ID4+ICsJCQkgdmVyID09IE5BTkRDX0lEX1Y4MDApCj4gPj4gKwkJ CWN0cmwtPm1heF9lY2Nfc3RyZW5ndGggPSA2MDsKPiA+PiArCQllbHNlCj4gPj4gKwkJCWRldl9l cnIobXRkLT5kZXYucGFyZW50LAo+ID4+ICsJCQkJInVuc3VwcG9ydGVkIG5hbmRjIHZlcnNpb24g JXhcbiIsCj4gPj4gdmVyKTsgKwo+ID4+ICsJCWlmIChtYXhfc3RyZW5ndGggPiBjdHJsLT5tYXhf ZWNjX3N0cmVuZ3RoKQo+ID4+ICsJCQltYXhfc3RyZW5ndGggPSBjdHJsLT5tYXhfZWNjX3N0cmVu Z3RoOwo+ID4+ICsKPiA+PiArCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdHJlbmd0aHNf djYpOyBpKyspIHsKPiA+PiArCQkJaWYgKG1heF9zdHJlbmd0aCA+PSBzdHJlbmd0aHNfdjZbaV0p Cj4gPj4gKwkJCQlicmVhazsKPiA+PiArCQl9Cj4gPj4gKwo+ID4+ICsJCWlmIChpID49IEFSUkFZ X1NJWkUoc3RyZW5ndGhzX3Y2KSkgewo+ID4+ICsJCQlkZXZfZXJyKG10ZC0+ZGV2LnBhcmVudCwK PiA+PiArCQkJCSJ1bnN1cHBvcnRlZCBzdHJlbmd0aFxuIik7Cj4gPj4gKwkJCXJldHVybiAtRU5P VFNVUFA7Cj4gPj4gKwkJfQo+ID4+ICsKPiA+PiArCQljdHJsLT5lY2NfbW9kZSA9IHN0cmVuZ3Ro c192NltpXTsKPiA+PiArCX0KPiA+PiArCXJrX25hbmRjX2h3X2VjY19zZXR1cChuYW5kLCBjdHJs LT5lY2NfbW9kZSk7Cj4gPj4gKwo+ID4+ICsJbXRkX3NldF9vb2JsYXlvdXQobXRkLCAmcmtfbmFu ZGNfb29iX29wcyk7Cj4gPj4gKwo+ID4+ICsJaWYgKG10ZC0+b29ic2l6ZSA8ICgobmFuZC0+ZWNj LmJ5dGVzICsgbmFuZC0+ZWNjLnByZXBhZCkgKgo+ID4+ICsJCQkgICAgbmFuZC0+ZWNjLnN0ZXBz KSkgewo+ID4+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCXJldHVy biAwOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9pZCBya19uYW5kY19kZXRhY2hfY2hp cChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQo+ID4+ICt7Cj4gPj4gKwlzd2l0Y2ggKG5hbmQtPmVj Yy5tb2RlKSB7Cj4gPj4gKwljYXNlIE5BTkRfRUNDX0hXX1NZTkRST01FOgo+ID4+ICsJCXJrX25h bmRjX2ZyZWVfYnVmZmVyKG5hbmQpOwo+ID4+ICsJCWJyZWFrOwo+ID4+ICsJZGVmYXVsdDoKPiA+ PiArCQlicmVhazsKPiA+PiArCX0KPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19u YW5kY19hdHRhY2hfY2hpcChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQo+ID4+ICt7Cj4gPj4gKwlz dHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKG5hbmQpOwo+ID4+ICsJaW50IHJldDsK PiA+PiArCj4gPj4gKwlzd2l0Y2ggKG5hbmQtPmVjYy5tb2RlKSB7Cj4gPj4gKwljYXNlIE5BTkRf RUNDX0hXX1NZTkRST01FOgo+ID4+ICsJCXJldCA9IHJrX25hbmRjX2h3X2VjY19jdHJsX2luaXQo bmFuZCk7Cj4gPj4gKwkJaWYgKHJldCkKPiA+PiArCQkJcmV0dXJuIHJldDsKPiA+PiArCQlyZXQg PSBya19uYW5kY19idWZmZXJfaW5pdChuYW5kKTsKPiA+PiArCQlpZiAocmV0KQo+ID4+ICsJCQly ZXR1cm4gLUVOT01FTTsKPiA+PiArCQluYW5kLT5lY2MucmVhZF9wYWdlID0KPiA+PiBya19uYW5k Y19od19zeW5kcm9tZV9lY2NfcmVhZF9wYWdlOwo+ID4+ICsJCW5hbmQtPmVjYy53cml0ZV9wYWdl ID0KPiA+PiBya19uYW5kY19od19zeW5kcm9tZV9lY2Nfd3JpdGVfcGFnZTsKPiA+PiArCQluYW5k LT5lY2MucmVhZF9vb2IgPSBya19uYW5kY19od19lY2NfcmVhZF9vb2I7Cj4gPj4gKwkJbmFuZC0+ ZWNjLndyaXRlX29vYiA9IHJrX25hbmRjX2h3X2VjY193cml0ZV9vb2I7Cj4gPj4gKwkJYnJlYWs7 Cj4gPj4gKwljYXNlIE5BTkRfRUNDX0hXOiAgCj4gPgo+ID4gSSB3b3VsZCBlaXRoZXIgcmVmdXNl IEVDQ19IVyBvciBwdXQgaXQgYmVzaWRlcyBIV19TWU5EUk9NRS4gIAo+IAo+IElzIHRoZXJlIGEg ZnVuZGFtZW50YWwgZGlmZmVyZW5jZSBpbiBoYW5kbGluZyBFQ0NfSFcgYW5kIEhXX1NZTkRST01F Cj4gZnJvbSB0aGUgTVREIHBvaW50IG9mIHZpZXc/IE90aGVyIHRoZW4gYSBpbmRpY2F0aW9uIGhv dyBpdCdzIGRvbmUgb24KPiB0aGUgZHJpdmVyIHNpZGU/CgpJIGRvbid0IHRoaW5rIHNvLi4KCj4g V2lsbCBkcm9wIGl0Lgo+IAo+ID4gIAo+ID4+ICsJY2FzZSBOQU5EX0VDQ19OT05FOgo+ID4+ICsJ Y2FzZSBOQU5EX0VDQ19TT0ZUOiAgCj4gPiAgCj4gCj4gPiBIYXZlIHlvdSB0ZXN0ZWQgd2l0aCBT VyBCQ0g/ICAKPiAKPiBTaG9ydCBhbnN3ZXI6IE5vCj4gSnVzdCBjb3BpZWQgaXQgZnJvbSB0aGUg b3JpZ2luYWwuCj4gUGxlYXNlIGFkdmlzZSBhIHRvb2wgdG8gZG8gYSB0ZXN0IGJldHdlZW4gdGhl IGluZGl2aWR1YWwgZWNjIHJlYWQKPiBvcHRpb25zLiBPciBkbyBJIGhhdmUgdG8gd3JpdGUgdGhl IHRvb2wgbXkgc2VsZiB3aXRoIG10ZC11dGlscz8KCkFsbCB0aGUgdG9vbHMgYXJlIGFscmVhZHkg YXZhaWxhYmxlLiBuYW5kX3Rlc3QsIGZsYXNoX3NwZWVkLApuYW5kYml0ZXJycyAtaSwgZXRjCgo+ IAo+ID4gIAo+ID4+ICsJCWJyZWFrOwo+ID4+ICsJZGVmYXVsdDoKPiA+PiArCQlyZXR1cm4gLUVJ TlZBTDsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+ PiArc3RhdGljIGludCBya19uYW5kY19leGVjX29wKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsCj4g Pj4gKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmFuZF9vcGVyYXRpb24gKm9wLAo+ID4+ICsJCQkgICAg Ym9vbCBjaGVja19vbmx5KQo+ID4+ICt7Cj4gPj4gKwlpbnQgaTsKPiA+PiArCXVuc2lnbmVkIGlu dCBvcF9pZDsKPiA+PiArCWNvbnN0IHN0cnVjdCBuYW5kX29wX2luc3RyICppbnN0ciA9IE5VTEw7 Cj4gPj4gKwo+ID4+ICsJcmtfbmFuZGNfc2VsZWN0X2NoaXAobmFuZCwgb3AtPmNzKTsKPiA+PiAr Cj4gPj4gKwlpZiAoY2hlY2tfb25seSkKPiA+PiArCQlyZXR1cm4gMDsKPiA+PiArCj4gPj4gKwlm b3IgKG9wX2lkID0gMDsgb3BfaWQgPCBvcC0+bmluc3Ryczsgb3BfaWQrKykgewo+ID4+ICsJCWlu c3RyID0gJm9wLT5pbnN0cnNbb3BfaWRdOwo+ID4+ICsKPiA+PiArCQlzd2l0Y2ggKGluc3RyLT50 eXBlKSB7Cj4gPj4gKwkJY2FzZSBOQU5EX09QX0NNRF9JTlNUUjoKPiA+PiArCQkJcmtfbmFuZGNf d3JpdGVfY21kKG5hbmQsCj4gPj4gaW5zdHItPmN0eC5jbWQub3Bjb2RlKTsKPiA+PiArCQkJYnJl YWs7Cj4gPj4gKwkJY2FzZSBOQU5EX09QX0FERFJfSU5TVFI6Cj4gPj4gKwkJCWZvciAoaSA9IDA7 IGkgPCBpbnN0ci0+Y3R4LmFkZHIubmFkZHJzOwo+ID4+IGkrKykKPiA+PiArCQkJCXJrX25hbmRj X3dyaXRlX2FkZHIobmFuZCwKPiA+PiArCj4gPj4gaW5zdHItPmN0eC5hZGRyLmFkZHJzW2ldKTsK PiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJY2FzZSBOQU5EX09QX0RBVEFfSU5fSU5TVFI6Cj4gPj4g KwkJCXJrX25hbmRjX3JlYWRfYnVmKG5hbmQsCj4gPj4gaW5zdHItPmN0eC5kYXRhLmJ1Zi5pbiwK PiA+PiArCQkJCQkgIGluc3RyLT5jdHguZGF0YS5sZW4pOwo+ID4+ICsJCQlicmVhazsKPiA+PiAr CQljYXNlIE5BTkRfT1BfREFUQV9PVVRfSU5TVFI6Cj4gPj4gKwkJCXJrX25hbmRjX3dyaXRlX2J1 ZihuYW5kLAo+ID4+IGluc3RyLT5jdHguZGF0YS5idWYub3V0LAo+ID4+ICsJCQkJCSAgIGluc3Ry LT5jdHguZGF0YS5sZW4pOwo+ID4+ICsJCQlicmVhazsKPiA+PiArCQljYXNlIE5BTkRfT1BfV0FJ VFJEWV9JTlNUUjoKPiA+PiArCQkJcmtfbmFuZGNfZGV2X3JlYWR5KG5hbmQpOwo+ID4+ICsJCQli cmVhazsKPiA+PiArCQl9Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30K PiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmFuZF9jb250cm9sbGVyX29wcyBya19u YW5kX2NvbnRyb2xsZXJfb3BzID0gewo+ID4+ICsJLmF0dGFjaF9jaGlwID0gcmtfbmFuZGNfYXR0 YWNoX2NoaXAsCj4gPj4gKwkuZGV0YWNoX2NoaXAgPSBya19uYW5kY19kZXRhY2hfY2hpcCwKPiA+ PiArCS5leGVjX29wID0gcmtfbmFuZGNfZXhlY19vcCwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0 YXRpYyBpbnQgcmtfbmFuZGNfY2hpcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKPiA+PiArCQkJ ICAgICAgc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCwKPiA+PiArCQkJICAgICAgc3Ry dWN0IGRldmljZV9ub2RlICpucCwgdW5zaWduZWQKPiA+PiBpbnQgY2hpcG5yKSArewo+ID4+ICsJ c3RydWN0IHJrX25hbmRfY2hpcCAqbm9kZTsKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgKm5hbmQ7 Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKPiA+PiArCWNvbnN0IF9fYmUzMiAqcmVnOwo+ ID4+ICsJaW50IHJldDsKPiA+PiArCj4gPj4gKwlyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJy ZWciLCBOVUxMKTsKPiA+PiArCWlmICghcmVnKQo+ID4+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4+ ICsKPiA+PiArCWN0cmwtPmJhbmtzW2NoaXBucl0gPSBiZTMyX3RvX2NwdSgqcmVnKTsKPiA+PiAr Cj4gPj4gKwlpZiAoY3RybC0+YmFua3NbY2hpcG5yXSA8IDApCj4gPj4gKwkJcmV0dXJuIC1FSU5W QUw7Cj4gPj4gKwo+ID4+ICsJbm9kZSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbm9kZSks IEdGUF9LRVJORUwpOwo+ID4+ICsJaWYgKCFub2RlKQo+ID4+ICsJCXJldHVybiAtRU5PTUVNOwo+ ID4+ICsKPiA+PiArCW5hbmQgPSAmbm9kZS0+bmFuZDsKPiA+PiArCj4gPj4gKwluYW5kX3NldF9m bGFzaF9ub2RlKG5hbmQsIG5wKTsKPiA+PiArCW5hbmRfc2V0X2NvbnRyb2xsZXJfZGF0YShuYW5k LCBjdHJsKTsKPiA+PiArCj4gPj4gKwluYW5kLT5jb250cm9sbGVyID0gJmN0cmwtPmNvbnRyb2xs ZXI7Cj4gPj4gKwluYW5kLT5jb250cm9sbGVyLT5vcHMgPSAmcmtfbmFuZF9jb250cm9sbGVyX29w czsKPiA+PiArCj4gPj4gKwluYW5kLT5lY2MubW9kZSA9IE5BTkRfRUNDX0hXX1NZTkRST01FOwo+ ID4+ICsJbmFuZC0+ZWNjLnNpemUgPSAxMDI0Owo+ID4+ICsJbmFuZC0+ZWNjLnN0cmVuZ3RoID0g NDA7Cj4gPj4gKwo+ID4+ICsJbmFuZC0+b3B0aW9ucyA9IE5BTkRfU0tJUF9CQlRTQ0FOIHwgTkFO RF9OT19TVUJQQUdFX1dSSVRFOwo+ID4+ICsKPiA+PiArCW10ZCA9IG5hbmRfdG9fbXRkKG5hbmQp Owo+ID4+ICsJbXRkLT5kZXYucGFyZW50ID0gZGV2Owo+ID4+ICsJbXRkLT5uYW1lID0gZGV2bV9r YXNwcmludGYoZGV2LCBHRlBfS0VSTkVMLCAiJXMuJWQiLAo+ID4+IGRldl9uYW1lKGRldiksCj4g Pj4gKwkJCQkgICBjdHJsLT5iYW5rc1tjaGlwbnJdKTsKPiA+PiArCj4gPj4gKwlyZXQgPSBuYW5k X3NjYW4obmFuZCwgMSk7ICAKPiA+Cj4gPiBXaHkgMSBoZXJlPyAgCj4gCj4gVE9ETyBmb3IgdmVy c2lvbiAyLgo+IEEgbGl0dGxlIG1pc3VuZGVyc3RhbmRpbmcgb24gaG93IGZvcl9lYWNoX2NoaWxk X29mX25vZGUgd29ya3MuCj4gQWxsIGNoaXBzIHNob3VsZCBiZSBzY2FubmVkLgo+IC8vLy8vCj4g RGVyaXZlIGNoaXBucgo+IEV4YW1wbGUgZnJvbSBzdW54aV9uYW5kLmMKPiAKPiAJaWYgKCFvZl9n ZXRfcHJvcGVydHkobnAsICJyZWciLCAmbnNlbHMpKQo+IAkJcmV0dXJuIC1FSU5WQUw7Cj4gCj4g CW5zZWxzIC89IHNpemVvZih1MzIpOwo+IAlpZiAoIW5zZWxzKSB7Cj4gCQlkZXZfZXJyKGRldiwg ImludmFsaWQgcmVnIHByb3BlcnR5IHNpemVcbiIpOwo+IAkJcmV0dXJuIC1FSU5WQUw7Cj4gCX0K PiAvLy8vLwo+IEZyb20gcmtfbmFuZGNfY2hpcHNfaW5pdCgpCj4gCj4gCWZvcl9lYWNoX2NoaWxk X29mX25vZGUobnAsIG5hbmRfbnApIHsKPiAJCXJldCA9IHJrX25hbmRjX2NoaXBfaW5pdChkZXYs IGN0cmwsIG5hbmRfbnAsIGkpOwo+IAo+IFdoeSBkb2VzIHN1bnhpX25hbmQuYyBuZWVkIHRoaXMg ZXh0cmEgZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZT8KCmZvcl9lYWNoX2NoaWxkX29mX25vZGUgd2ls bCBsb29wIG92ZXIgYWxsIHRoZSBOQU5EIGNoaXBzIHRoYXQgYXJlCmNvbm5lY3RlZCB0byB0aGUg TkFORCBjb250cm9sbGVyLgoKWW91IG1heSBoYXZlIC1kZXBlbmRpbmcgb24gdGhlIE5BTkQgY29u dHJvbGxlci0gbW9yZSB0aGFuIG9uZSBDUyBwZXIKY2hpcC4KCgpbLi4uXQoKPiA+PiArCW5vZGUg PSBwZGV2LT5kZXYub2Zfbm9kZTsKPiA+PiArCj4gPj4gKwlpZCA9IG9mX2FsaWFzX2dldF9pZChu b2RlLCAibmFuZGMiKTsKPiA+PiArCWlmIChpZCA8IDApCj4gPj4gKwkJaWQgPSBnX2lkX2NvdW50 ZXI7Cj4gPj4gKwlpZiAoKGlkID49IEFSUkFZX1NJWkUoZ19uYW5kY19pbmZvKSB8fAo+ID4+IGdf bmFuZGNfaW5mb1tpZF0ucmVncykpIHsKPiA+PiArCQlkZXZfZXJyKAo+ID4+ICsJCQkmcGRldi0+ ZGV2LAo+ID4+ICsJCQkiZmFpbGVkIHRvIGdldCBpZCBmb3IgbmFuZGMgbm9kZQo+ID4+ICclcE9G bidcbiIsCj4gPj4gKwkJCW5vZGUpOwo+ID4+ICsJCW9mX25vZGVfcHV0KG5vZGUpOwo+ID4+ICsJ CXJldHVybiAtRU5PREVWOwo+ID4+ICsJfQo+ID4+ICsJKytnX2lkX2NvdW50ZXI7ICAKPiAKPiBT ZWUgY29tbWVudHMgYWJvdmUgYWJvdXQgUmszMjg4LiBLZWVwaW5nIHRyYWNrIG5vZGUgYWxpYXMg Zm9yIG5hbmRjMC4KPiBUbyByZW1vdmUgb3Igbm90PwoKWW91IG1heSBrZWVwIGEgc3RhdGljIHZh cmlhYmxlIHRvIHBvaW50IHRvIGFuIGFycmF5IG9yIGhhdmUgYSBzdGF0aWMKY291bnRlciB0aGF0 IHlvdSBpbmNyZW1lbnQsIGJ1dCBkZWZpbml0ZWx5IG5vdCBzdGF0aWMgc3RydWN0dXJlcyB0aGF0 CndvdWxkIGJlIHNoYXJlZC4gSWYgdGhlcmUgYXJlIHR3byBkaXN0aW5jdCBOQU5EIGNvbnRyb2xs ZXJzLCB5b3UgbXVzdApoYXZlIGRpc3RpbmN0IHBhdGgvc3RydWN0dXJlcy4KCi0+cHJvYmUoKSB3 aWxsIGJlIHJ1biBvbmNlIGZvciBlYWNoIE5BTkQgY29udHJvbGxlci4KCgpUaGFua3MsCk1pcXXD qGwKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4 LXJvY2tjaGlwIG1haWxpbmcgbGlzdApMaW51eC1yb2NrY2hpcEBsaXN0cy5pbmZyYWRlYWQub3Jn Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcm9ja2No aXAK 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 X-Spam-Level: X-Spam-Status: No, score=-7.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3FC72C33CAD for ; Mon, 13 Jan 2020 14:16:24 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 05BF420661 for ; Mon, 13 Jan 2020 14:16:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="U7uT4rjM"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="bxwqALCx" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 05BF420661 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=9fXhmGr8tUK0sxA+XZ5Yys/aSZA4ey6DmRqFP+mzRlw=; b=U7uT4rjMs1RY68 Rn9tLNxRTM22YcncT6D0KcsMsPwIGOW/ZGUVnXWKA87VXG+OHvMc49jREQ0TbSd0PftvA8cUILAV0 BQFHWOYA4mCxaeuiQm1lF89asjY9+M2Z7BELmKkhEnrLn2etWoMy4+BZ8qgkFszZv8D41mfKJ3+E3 IPvK4oQUI5+KhmSZGpAnlKVeBgJqInCa4e3sYoypiy8noQcG78Ngm6ZlwVySBAnOlot3uaIMaU8jw 1cr6t/9mzagCGNMhXgK+eYNuUN91YRMAvNPcWjTlx9gjFCJNg4rlLSmsHIShfKvEgy7AWrhretQnj 5yzc5HK2tV3ledBSLnhA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ir0Vt-0003HR-4C; Mon, 13 Jan 2020 14:16:17 +0000 Received: from merlin.infradead.org ([2001:8b0:10b:1231::1]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ir0Vq-0003HB-Cy; Mon, 13 Jan 2020 14:16:15 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=merlin.20170209; h=Content-Transfer-Encoding:Content-Type: MIME-Version:References:In-Reply-To:Message-ID:Subject:Cc:To:From:Date:Sender :Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=KcGu/db24kGYodcRgxPPq4DsT/2e9G7RP7nlC1xb5Aw=; b=bxwqALCxPRInFkQTRXocHuzPRd kio3bvQAB545/vFljWhpFWbPXLRueu7Ix4B6Wt5pXJUlbDXaqrH8sGDntwP1cqkxdN0ws47Y342ya mCptG0O3YHsGt1iMRghJHADe0Xhcfl1L1M8cXcU/gsDD9800P4tysMlP4rAuAcCeXNjT0mUYD5KRd gc/vfVAfvd7qv83XHJFSFIwXeUEbbvg1LnDdPInZ2tkvKpgVtcdXLvAabpZkyGDdWrcT+JE5VtZqt dKO643nXfMqs398ARLymdWuwai6W4bRasbybR6ZiH/vjlBCeBvglAYJh4nFAAtus1arWu07xS3YZ/ TuCx7NtA==; Received: from relay8-d.mail.gandi.net ([217.70.183.201]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ir0Vl-0006UN-GP; Mon, 13 Jan 2020 14:16:12 +0000 X-Originating-IP: 90.76.211.102 Received: from xps13 (lfbn-tou-1-1151-102.w90-76.abo.wanadoo.fr [90.76.211.102]) (Authenticated sender: miquel.raynal@bootlin.com) by relay8-d.mail.gandi.net (Postfix) with ESMTPSA id 5D4F31BF20B; Mon, 13 Jan 2020 14:15:30 +0000 (UTC) Date: Mon, 13 Jan 2020 15:15:29 +0100 From: Miquel Raynal To: Johan Jonker Subject: Re: [RFC PATCH v1 02/10] mtd: nand: raw: add rockchip nand controller driver Message-ID: <20200113151529.1ecba50e@xps13> In-Reply-To: <7a477af0-1448-4f26-4004-9331978e824c@gmail.com> References: <20200108205338.11369-1-jbx6244@gmail.com> <20200108205338.11369-3-jbx6244@gmail.com> <20200110120534.1b4026b0@xps13> <7a477af0-1448-4f26-4004-9331978e824c@gmail.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, devicetree@vger.kernel.org, vigneshr@ti.com, richard@nod.at, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, robh+dt@kernel.org, linux-mtd@lists.infradead.org, linux-arm-kernel@lists.infradead.org, heiko@sntech.de Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgSm9oYW4sCgpKb2hhbiBKb25rZXIgPGpieDYyNDRAZ21haWwuY29tPiB3cm90ZSBvbiBTdW4s IDEyIEphbiAyMDIwIDE4OjI2OjIwCiswMTAwOgoKPiBIaSBNaXF1ZWwsCj4gCj4gVGhhbmsgeW91 IGZvciB5b3VyIGRldGFpbGVkIGFuZCB1c2VmdWwgcmV2aWV3Lgo+IAo+IFdpdGhvdXQgbWFudWZh Y3R1cmVyIHN1cHBvcnQgSSBtdXN0IHNjcmFwZSBteSBpbmZvcm1hdGlvbgo+IGZyb20gYWxsIG92 ZXIgdGhlIGludGVybmV0LCB0b2dldGhlciB3aXRoIHNsb3cgaW50ZXJwcmV0YXRpb24gb2YKPiBS b2NrY2hpcCBkcml2ZXJzLgo+IFNvIHBsZWFzZSBoYXZlIHNvbWUgcGF0aWVuY2Ugd2l0aCBteSB1 cGRhdGVzIGFuZCBuZXcgdmVyc2lvbnMuCgpUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIGh1cnJ5LCBp dCBpcyBncmVhdCB0aGF0IHlvdSB3b3JrIG9uIHRoaXMhCgo+IAo+IEJlbG93IGFyZSBzb21lIGNv bW1lbnRzIGFuZCBxdWVzdGlvbnMgaW4gcmFuZG9tIG9yZGVyLgo+IAo+IC8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vCj4gCj4gVG8gcHJldmVudCBndWVzc2luZyBnYW1lcyBjb3VsZCB5b3Ug Y29uZmlybSB0aGUgZm9sbG93aW5nIG5hbWVzOgo+IAo+IGRyaXZlciBmaWxlIG5hbWU6ICAgcm9j a2NoaXAtbmFuZC1jb250cm9sbGVyLmMKCkZpbmUKCj4gZG9jdW1lbnQgZmlsZSBuYW1lOiByb2Nr Y2hpcC1uYW5kLWNvbnRyb2xsZXIueWFtbAoKSSB0aGluayByb2NrY2hpcCxuYW5kLWNvbnRyb2xs ZXIueWFtbCBpcyBwcmVmZXJyZWQuCgo+IAo+IGNvbXBhdGlibGU6ICJyb2NrY2hpcCxuYW5kYy12 NiIKCnJvY2tjaGlwLG5hbmQtY29udHJvbGxlci12NgoKPiBjb21wYXRpYmxlOiAicm9ja2NoaXAs bmFuZGMtdjkiCgpzYW1lIGFzIGFib3ZlIHdpdGggLXY5IGFzIHN1ZmZpeC4KCgpbLi4uXQoKPiBK YW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDUzMzg4XSBuYW5kOiA4MTkyIE1p QiwgTUxDLAplcmFzZQoKSnVzdCB0byBiZSBjbGVhciwgTUxDIGlzIG5vdCB5ZXQgc3VwcG9ydGVk IGluIG1haW5saW5lLiBUaGVyZSBpcyBhCnBhdGNoIHNlcmllcyB0aGF0IGFpbXMgYXQgc3VwcG9y dGluZyBNTEMgaW4gcHNldWRvLVNMQyBtb2RlIGJ1dCBkbyBub3QKdXNlIE1MQyBhcyBhIHJlbGlh YmxlIHN0b3JhZ2UgbWVkaXVtLgoKPiBzaXplOiAyMDQ4IEtpQiwgcGFnZSBzaXplOiA4MTkyLCBP T0Igc2l6ZTogNjQwCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA1NDA1 MF0gcm9ja2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPm51bWNo aXBzID0gMQo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTQ3NDBdIHJv Y2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5jaGlwc2l6ZSA9 IDg1ODk5MzQ1OTIKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU1Mzgw XSByb2NrY2hpcC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+cGFnZW1h c2sgPSAgICBmZmZmZgo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTU5 OTRdIHJvY2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5iYWRi bG9ja3BvcyA9IDAKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU2NTkx XSByb2NrY2hpcC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+Y2hpcF9z aGlmdCA9IDMzCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA1NzE3NF0g cm9ja2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPnBhZ2Vfc2hp ZnQgPSAxMwo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTc3NTFdIHJv Y2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5waHlzX2VyYXNl X3NoaWZ0ID0gMjEKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU4MzY2 XSByb2NrY2hpcC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLm1v ZGUgPSAzCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA1ODkyMF0gcm9j a2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPmVjYy5zdGVwcyA9 IDgKPiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU5NDgxXSByb2NrY2hp cC1uYW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLmJ5dGVzID0gNzAK PiBKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYwMDQ5XSByb2NrY2hpcC1u YW5kYwo+IDEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLnRvdGFsID0gMAo+IEph biAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjA2MDddIHJvY2tjaGlwLW5hbmRj Cj4gMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5lY2MucHJlcGFkID0gNAo+IEphbiAg MSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjExNzVdIHJvY2tjaGlwLW5hbmRjCj4g MTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5lY2Muc2l6ZSA9IDEwMjQKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYxNzQ4XSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+ZWNjLnN0cmVuZ3RoID0gNDAKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYyMzQxXSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbXRkLT5vb2JsYXlvdXQgPSA5MWNlOWNlMgo+IEphbiAg MSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjI5NDNdIHJvY2tjaGlwLW5hbmRjCj4g MTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBtdGQtPmZsYWdzID0gMDAwMDAwMDAKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYzNTE4XSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbXRkLT5zaXplID0gODU4OTkzNDU5Mgo+IEphbiAgMSAw MDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjQwOThdIHJvY2tjaGlwLW5hbmRjCj4gMTA1 MDAwMDAubmFuZC1jb250cm9sbGVyOiBtdGQtPmVyYXNlc2l6ZSA9IDIwOTcxNTIKPiBKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDY0ODE1XSByb2NrY2hpcC1uYW5kYwo+IDEw NTAwMDAwLm5hbmQtY29udHJvbGxlcjogbXRkLT53cml0ZXNpemUgPSA4MTkyCj4gSmFuICAxIDAw OjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA2NTQxM10gcm9ja2NoaXAtbmFuZGMKPiAxMDUw MDAwMC5uYW5kLWNvbnRyb2xsZXI6IG10ZC0+b29ic2l6ZSA9IDY0MAo+IEphbiAgMSAwMDowMjoy NyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjg5ODVdIDEgZml4ZWQtcGFydGl0aW9ucwo+IHBhcnRp dGlvbnMgZm91bmQgb24gTVREIGRldmljZSAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXIuMAo+IEph biAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjkxOTBdIENyZWF0aW5nIDEgTVRE IHBhcnRpdGlvbnMKPiBvbiAiMTA1MDAwMDAubmFuZC1jb250cm9sbGVyLjAiOgo+IEphbiAgMSAw MDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNzIzNzVdCj4gMHgwMDAwMDAwMDAwMDAtMHgw MDAwMDA0MDAwMDAgOiAicGFyYW1ldGVyIgo+IAo+IAo+IEphbiAgMSAwMDowMjoyNyBtazgwOCBr ZXJuZWw6IFsgIDE0Ny4wNzU2NDldIHJvY2tjaGlwLW5hbmRjCj4gMTA1MDAwMDAubmFuZC1jb250 cm9sbGVyOiBSOjB4MDBmZiBjczowCj4gSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAg MTQ3LjA3OTQyM10gcm9ja2NoaXAtbmFuZGMKPiAxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IFI6 MHgwMWZmIGNzOjAKPiAKPiAKPiBEZXNwaXRlIG5hbmQtPm9wdGlvbnMgPSBOQU5EX1NLSVBfQkJU U0NBTi4KPiAKPiBXaGF0IGlzIHRoZSByZWFzb24gZm9yIHRoZXNlIDIgcmtfbmFuZGNfaHdfc3lu ZHJvbWVfZWNjX3JlYWRfcGFnZSgpCj4gY29tbWFuZHMgYXQgcGFnZSBSOjB4MDBmZiBhbmQgUjow eDAxZmYgcmlnaHQgYWZ0ZXIgY3JlYXRpbmcKPiBwYXJ0aXRpb25zLgo+IAo+IFdoZW4gZW5hYmxl ZCBCQlRTQ0FOIE1URCBzdGFydHMgdG8gc3RvcmUgYXQgYWxsIGtpbmQgb2YgcGxhY2VzLiBDYW4K PiB5b3Ugc3RhdGUKClBsZWFzZSBkbyBub3QgbWl4IHRoZSB0d28gY29uY2VwdHM6Ci0gb24gY2hp cCBiYnQ6IHRoZSBsYXN0IGJsb2NrcyB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgdGhlIEJCLCB3aXRo b3V0LAogIHRoZSBCQlQgbXVzdCBiZSByZWNvbnN0cnVjdGVkIGJ5IHJlYWRpbmcgYWxsIHRoZSBi bG9ja3MuCi0gU0tJUF9CQlRfU0NBTjogZG8gbm90IGNvbnN0cnVjdCB0aGUgQkJUIGluIFJBTS4K ClBsZWFzZSB0cmFjZSB0aGUgY2FsbHMgKGR1bXBfc3RhY2soKSBtaWdodCBoZWxwIHlvdSkgdG8g c2VlIHdoYXQKZnVuY3Rpb24gYWN0dWFsbHkgY2FsbHMgdGhlIC0+cmVhZF9wYWdlKCkgaGVscGVy cy4KCj4gdGhlcmUgcGFnZSBhZGRyZXNzIGxvZ2ljLCBpZS4gV291bGQgdGhhdCBkYW1hZ2UgdGhl IGV4Y2lzdGluZyBSb2NrY2hpcAo+IGxheW91dD8KCkkgZG9uJ3Qga25vdyBhYm91dCB0aGUgZXhp c3RpbmcgUm9ja2NoaXAgbGF5b3V0LgoKPiAKPiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Lwo+IAo+IE5vIGJhZCBibG9jayBzdXBwb3J0Cj4gCj4gQmFzZWQgb246Cj4gZHJpdmVyczogbXRk OiBuYW5kOiByb2NrY2hpcCBuYW5kYyBhZGQgYmFkIGJsb2NrIGRldGVjdCBhcGkKPiBodHRwczov L2dpdGh1Yi5jb20vcm9ja2NoaXAtbGludXgvdS1ib290L2NvbW1pdC8KPiA3YWVjNzA0YTRlOWQ5 MzIyZjExMDJiY2Y2MWVlNWMzY2Y2ZWM3OTRkCj4gCj4gcm9ja2NoaXA6IGRyaXZlcnM6IG10ZDog bmFuZDogbW9kaWZ5IHRoZSBiYWQgYmxvY2sgZGV0ZWN0aW9uIHByb2Nlc3MKPiBodHRwczovL2dp dGh1Yi5jb20vcm9ja2NoaXAtbGludXgvdS1ib290L2NvbW1pdC8KPiBkNmQ3MDhkMWEzMjlhNjM2 OTE0M2U4ZGQzNGNmNGUyYzgxZDVkOTJmCj4gCj4gQkNIICAgICAgfCAgICAgIG9vYiBzaXplCj4g LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gMTY6IGJ5dGVzOiAyOCArIDQgPSAzMgo+IDI0OiBi eXRlczogNDIgKyA0ID0gNDYKPiA0MDogYnl0ZXM6IDcwICsgNCA9IDc0Cj4gNjA6IGJ5dGVzOiAx MDYgKyA0ID0gMTEwCj4gCj4gVGhlIGRhdGEgbGF5b3V0IHRoYXQgaXMgd3JpdHRlbiBieSBhbiBp bnRlcm5hbCBSb2NrY2hpcCBuYW5kYyBkbWEgaXM6Cj4gICAgIDEwMjQgYnl0ZXMgZGF0YSArIDMy IG9iYiArIDEwMjQgZGF0YSArIDMyIG9iYiAuLi4KPiAKPiBUaGUgTVREIHN5c3RlbSBob3dldmVy IHRyaWVzIHRvIGRldGVjdCBiYWQgYmxvY2sgZmxhZ3MgbG9jYXRlZCBhdDoKPiAgICAgMjA0OCwg NDA5NiwgODE5Mi4uLgoKQmFkIGJsb2NrIGZsYWdzIChzbyBjYWxsZWQgYmFkIGJsb2NrIG1hcmtl cnMsIGFicmV2aWF0ZWQgQkJNKSBhcmUgdGhlCmZpcnN0IHR3byBieXRlcyBvZiB0aGUgT09CLiBB IHBhZ2UgaXMgYWx3YXlzOgoKCTxYIGluLWJhbmQgYnl0ZXMgKGRhdGEpPjxZIG91dC1vZi1iYW5k IGJ5dGVzIChPT0IpPgoKTm8gbWF0dGVyIHRoZSB3YXkgdGhpcyBpcyBzdG9yZWQgb24gdGhlIE5B TkQgY2hpcCwgdGhlIHVzZXIgaXMKZXhwZWN0aW5nIGFsbCB0aGUgZGF0YSBieXRlcyB0b2dldGhl ciBhbmQgYWxsIHRoZSBPT0IgYnl0ZXMgdG9nZXRoZXIuCllvdSBtdXN0IHJlY29uc3RydWN0IHRo aXMuCgo+IFRoZSBzeXN0ZW0gY2hlY2tzIGZvciBiYWQgYmxvY2tzIGFuZCBsb29rcyBhdCB0aGUg d3JvbmcgYmFkIGJsb2NrCj4gbWFya2VyIGxvY2F0aW9uLgo+IFlpZmVuZyBaaGFvIHByb3Bvc2Vz IHRvIGFkZCBhIGJhZCBibG9jayBkZXRlY3Rpbmcgc3RyYXRlZ3kgYnkgZG9pbmcKPiBhIHJlYWQg d2l0aCBya19uYW5kY19od19zeW5kcm9tZV9lY2NfcmVhZF9wYWdlKCkgZmlyc3QsCj4gaWYgZmFp bHVyZSB0aGVuIGFzc3VtZSBpdCdzIHN0aWxsIHJhdyB1bndyaXR0ZW4gTkFORCBhbmQgdGVzdCBi eXRlcwo+IGFyZSBhdCB0aGUgcG9zaXRpb24gTVREIG5vcm1hbHkgd291bGQgY2hlY2sgZm9yIHJp Z2h0IGZyb20gdGhlCj4gZmFjdG9yeS4gV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgb24gYSBG VEwgY29udHJvbGxlZCBOQU5EIGl0Cj4gY3JlYXRlcyBhbiBhd2Z1bCBsb3Qgb2YgZXJyb3JzIGlu IHRoZSBrZXJuZWwgbG9nLCBiZWNhdXNlIGl0IHVzZXMgdGhlCj4gQkIgbWFya2VyIGZvciBkaXJ0 eSB0YWcgdHJpY2tzIGZvciB0aGVyZSBkYXRhIHN0b3JhZ2UuCj4gU28gd2hhdCBpcyBnb29kIGZv ciBhIHJhdyBlbXB0eSBOQU5EIHdpdGhvdXQgRlRMCj4gZG9lcyBub3Qgd29yayBmb3IgdGhlIG1h am9yaXR5IG9mIFJvY2tjaGlwIGRldmljZXMgSSB0aGluay4KPiAKPiBQbGVhc2UgYWR2aXNlIGZv ciBvdGhlciBvcHRpb25zLgoKVGhhdCdzIHNhZCB0aGF0IFJvY2tjaGlwIEJTUCBkb2VzIG5vdCBm b2xsb3cgc3RhbmRhcmQgcnVsZXMsIGJ1dCBJTUhPCnRoaXMga2luZCBvZiByZXNlYXJjaCBsb2dp YyBpcyB3YXkgdG9vIG11Y2ggZXJyb3IgcHJvbmUgYW5kIHRoaXMgaXMgbm90CnNvbWVodGluZyB3 ZSB3YW50IHRvIHBsYXkgd2l0aDogaWYgeW91IHN0YXJ0IGEgbWFpbmxpbmUga2VybmVsIHdpdGgg YQp3cm9uZyBsb2dpYywgdGhlbiBsYXRlciB5b3UgZml4IHRoZSBsb2dpYyBpbiBtYWlubGluZSwg eW91IG11c3Qgc3VwcG9ydAp0aGUgYnJva2VuIGxvZ2ljIGZvcmV2ZXIuCgpUaGlzIG1lYW5zIHlv dSBjYW5ub3QgYm9vdCBhIHZlbmRvciBrZXJuZWwgYW5kIGEgbWFpbmxpbmUga2VybmVsIG9uIHRo ZQpzYW1lIHBsYXRmb3JtIGFueW1vcmUuIFRoaXMgaXMgc2FkIGJ1dCB3ZSBjYW5ub3QgZmlnaHQg YWdhaW5zdCBpdC4KVW5sZXNzLCBhcyBJIGFtIHBvaW50aW5nIGl0IG91dCBhYm92ZSwgeW91IGNh biBzaW1wbHkgcmVjb25zdHJ1Y3QgdGhlCnBhZ2UgdG8gb2ZmZXIgYSBsaW5lYXIgZGF0YStPT0Ig bGF5b3V0LgoKPiBzdGF0aWMgdWludDhfdCBya19uYW5kX3JlYWRfYnl0ZShzdHJ1Y3QgbmFuZF9j aGlwICpuYW5kKQo+IHsKPiAJdWludDhfdCByZXQ7Cj4gCj4gCXJrX25hbmRfcmVhZF9idWYobmFu ZCwgJnJldCwgMSk7Cj4gCj4gCXJldHVybiByZXQ7Cj4gfQo+IAo+IHN0YXRpYyBpbnQgcmtfbmFu ZF9ibG9ja19iYWQoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgbG9mZl90IG9mcykKPiB7Cj4gCXN0 cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQobmFuZCk7Cj4gCWludCBwYWdlLCByZXMg PSAwOwo+IAl1MTYgYmFkID0gMHhmZjsKPiAJdTggKmJ1ZiA9IG5hbmRfZ2V0X2RhdGFfYnVmKG5h bmQpOwo+IAlpbnQgY2hpcG5yID0gKGludCkob2ZzID4+IG5hbmQtPmNoaXBfc2hpZnQpOwo+IAo+ IAlwYWdlID0gKGludCkob2ZzID4+IG5hbmQtPnBhZ2Vfc2hpZnQpICYgbmFuZC0+cGFnZW1hc2s7 Cj4gCXJrX25hbmRfc2VsZWN0X2NoaXAobmFuZCwgY2hpcG5yKTsKPiAJaWYgKHJrX25hbmRfaHdf c3luZHJvbWVfZWNjX3JlYWRfcGFnZShuYW5kLCBidWYsIGZhbHNlLCBwYWdlKQo+ID09IC0xKSB7 IC8qIGZpcnN0IHBhZ2Ugb2YgYSBibG9jayovCj4gCQluYW5kX3JlYWRfcGFnZV9vcChuYW5kLCBw YWdlLCBuYW5kLT5iYWRibG9ja3BvcywKPiBOVUxMLCAwKTsgYmFkID0gcmtfbmFuZF9yZWFkX2J5 dGUobmFuZCk7Cj4gCQlpZiAoYmFkICE9IDB4RkYpCj4gCQkJcmVzID0gMTsKPiAJCS8qIHNlY29u ZCBwYWdlIG9mIGEgYmxvY2sqLwo+IAkJbmFuZF9yZWFkX3BhZ2Vfb3AobmFuZCwgcGFnZSArIDEs IG5hbmQtPmJhZGJsb2NrcG9zLAo+IE5VTEwsIDApOyBiYWQgPSBya19uYW5kX3JlYWRfYnl0ZShu YW5kKTsKPiAJCWlmIChiYWQgIT0gMHhGRikKPiAJCQlyZXMgPSAxOwo+IAkJLyogbGFzdCBwYWdl IG9mIGEgYmxvY2sgKi8KPiAJCXBhZ2UgKz0gKChtdGQtPmVyYXNlc2l6ZSAtIG10ZC0+d3JpdGVz aXplKSA+Pgo+IG5hbmQtPmNoaXBfc2hpZnQpOyBwYWdlLS07Cj4gCQluYW5kX3JlYWRfcGFnZV9v cChuYW5kLCBwYWdlLCBuYW5kLT5iYWRibG9ja3BvcywKPiBOVUxMLCAwKTsgYmFkID0gcmtfbmFu ZF9yZWFkX2J5dGUobmFuZCk7Cj4gCQlpZiAoYmFkICE9IDB4RkYpCj4gCQkJcmVzID0gMTsKPiAJ fQo+IAlya19uYW5kX3NlbGVjdF9jaGlwKG5hbmQsIC0xKTsKPiAJcmV0dXJuIHJlczsKPiB9Cj4g Cj4gVGhpcyBhbHNvIHJlcXVpcmVzIGEgcGF0Y2ggZm9yIG5hbmRfYmJ0LmMKPiBBcyBJIHRyeSB0 byBnZXQgdG8gZ2V0IHNvbWUgc2hhcGUgaW4gdGhlIHJlc3Qgb2YgdGhpcyBkcml2ZXIsCj4gSSBo YXZlIGxlZnQgaXQgb3V0IGZvciB2ZXJzaW9uIDEgYW5kIGFzIEkgd2FpdCBmb3Igb3VyIHJlc3Bv bnMgZmlyc3QuCj4gCj4gZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JidC5jCj4gQEAgLTQ4Nyw4ICs0 ODcsMTAgQEAgc3RhdGljIGludCBjcmVhdGVfYmJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLAo+IHVp bnQ4X3QgKmJ1ZiwKPiAJCWludCByZXQ7Cj4gCj4gCQlCVUdfT04oYmQtPm9wdGlvbnMgJiBOQU5E X0JCVF9OT19PT0IpOwo+IAo+IAkJcmV0ID0gc2Nhbl9ibG9ja19mYXN0KG10ZCwgYmQsIGZyb20s IGJ1ZiwgbnVtcGFnZXMpOwo+IAkJaWYgKHRoaXMtPmJsb2NrX2JhZCkKPiAJCQlyZXQgPSB0aGlz LT5ibG9ja19iYWQobXRkLCBmcm9tKTsKPiAJCWVsc2UKPiAJCQlyZXQgPSBzY2FuX2Jsb2NrX2Zh c3QobXRkLCBiZCwgZnJvbSwgYnVmLAo+IG51bXBhZ2VzKTsKPiAKPiAvLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLwo+IAo+IERhdGEgc3RydWN0dXJlcy9QYXJ0aXRpb25zCj4gCj4gVGhlIG1h am9yaXR5IG9mIFJvY2tjaGlwIGRldmljZXMgdXNlIGEgY2xvc2VkIHNvdXJjZSBGVEwgZHJpdmVy LAo+IHNvIHdoZW4gd2Ugd2FudCB0byByZWFkIG9yIHdyaXRlIHdlIG11c3QgZGVhbCB3aXRoIGl0 Lgo+IAo+IEV4YW1wbGUgTVREIHN0cmluZzoKPiBtdGRwYXJ0cz1yazI5eHhuYW5kOgo+IDB4MDAw MDIwMDBAMHgwMDAwMjAwMChtaXNjKSwKPiAweDAwMDA4MDAwQDB4MDAwMDQwMDAoa2VybmVsKSwK PiAweDAwMDA4MDAwQDB4MDAwMEMwMDAoYm9vdCksCj4gMHgwMDAwODAwMEAweDAwMDE0MDAwKHJl Y292ZXJ5KSwKPiAweDAwMEMwMDAwQDB4MDAwMUMwMDAoYmFja3VwKSwKPiAweDAwMDQwMDAwQDB4 MDAwREMwMDAoY2FjaGUpLAo+IDB4MDAzMDAwMDBAMHgwMDExQzAwMCh1c2VyZGF0YSksCj4gMHgw MDAwMjAwMEAweDAwNDFDMDAwKGtwYW5pYyksCj4gMHgwMDIwMDAwMEAweDAwNDFFMDAwKHN5c3Rl bSksCj4gLUAweDAwNjNFMDAwKHVzZXIpIgo+IAo+IFdoZW4gUm9ja2NoaXAgbWVudGlvbnMgYSBz dHJpbmcgbGlrZSB0aGlzIGl0IGhhcyBub3RoaW5nIHRvIGRvCj4gd2l0aCB0aGUgcmVhbCBwb3Np dGlvbiBvbiBOQU5ELiBGVEwgd3JpdGUgd2hlcmUgd2FudHMsCj4gc28gcmVhZGluZyB0aGVyZSBp cyBub3QgdXNlZnVsLgo+IEFsbCBzaXplcyBoYXZlIHRvIGJlIG11bHRpcGxpZWQgYnkgNTEyIGFu ZCBjYXN0ZWQgdG8gKHU2NCkhCj4gQWxsIHBhcnRpdGlvbnMgbmVlZCB0byBjb250YWluIGF0IGxl YXN0IDIgZXJhc2UgYmxvY2tzLgo+IE9uZSBmb3Igbm9ybWFsIHVzZSBhbmQgb25lIHNwYXJlLgoK SSBkb24ndCB0aGluayB0cnlpbmcgdG8gbWltaWMgUm9ja2NoaXAgRlRMIGlzIHdpc2UuIFdlIHdp bGwgbm90IHVzZSB0aGUKRlRMIGluIGEgbWFpbmxpbmUga2VybmVsIGJ1dCB2ZXJ5IGxpa2VseTog VUJJL1VCSUZTLgoKPiAtLS0tLS0tLS0tLS0tLS0tLS0tLQo+IEZsYXNoU2F2ZVBoeUluZm8KPiBS YXdJZGJEYXRhCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAuLi4KPiBGVEwgZGF0YQo+IC4uLgo+ IC0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gTWFwIGJsb2NrczoKPiArIEwycE1hcEluZm8KPiArIFZl bmRvckJsa0luZm8KPiAKPiBTeXMgaW5mbzoKPiArIHN5c19zYXZlX2RhdGEKPiAKPiBWZW5kb3Ig cGFydGl0aW9uOgo+ICsgc3lzX2V4dF9kYXRhICAgIDAKPiArIGVjdF90YmxfaW5mbyAgIDY0Cj4g KyB2ZW5kb3IgICAgICAgIDI1NiArID8KPiArIEJvb3RDb25maWcgICAgNTEyICsgMAo+ICsgRHJt S2V5SW5mbyAgICA1MTIgKyAxCj4gKyBWZW5kb3IwSW5mbyAgIDUxMiArIDIKPiArIFZlbmRvcjFJ bmZvICAgNTEyICsgMwo+ICsgc3lzICAgICAgICAgICA1MTIgKyA/Cj4gKyBwdWJsaWMga2V5ICAg IDUyMAo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gQmFkIEJsb2NrIE1hcCBUYmwobm90IGNvbXBh dGlibGUgd2l0aCBNVEQpCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiByZXNlcnZlZDogbGFzdCBO QU5EIGJsb2NrIC0gbgo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gCj4gRnJvbSB0aGUgYWJvdmUg ZGlhZ3JhbSBvbmx5IFJhd0lkYkRhdGEgaGFzIHRvIGJlIGxvY2F0ZWQgaW4gdGhlIGZpcnN0Cj4g ZXJhc2UgYmxvY2suCj4gQm9vdCBST00gc2VhcmNoZXMgZm9yIHRoZSB0YWcgSURfSURSVyA9IDB4 RkNEQzhDM0IuCj4gT25seSB0aGUgZmlyc3QgNCBzZWN0aW9ucyAoNCoxMDI0KSBvZiBhIHBhZ2Ug YXJlIHVzZWQuCj4gV2hlbiB3cml0aW5nIG11bHRpcGxlIHBhZ2VzIGV4dHJhIHNwYWNlcyBpbiB0 aGUgZGF0YQo+IGZvciBiZXR3ZWVuIHRoZSBzZWN0aW9ucyBhcmUgcmVxdWlyZWQuCj4gT2xkZXIg Y3B1J3MgKFJLMzA2NikgbWlnaHQgbmVlZCBleHRyYSBSQzQgY29kaW5nLgo+IAo+IEZUTCB1c2Vz IHRoYXQgUmF3SWRiRGF0YSBhcmVhIHVuZm9ydHVuYXRlbHkgYWxzbyB0byBzYXZlIHN0cnVjdAo+ IEZsYXNoU2F2ZVBoeUluZm8uCj4gRm9yIGEgYmFyZSBiYXNpYyBhcHBsaWNhdGlvbiBvbmx5IFJh d0lkYkRhdGEgaXMgbmVlZGVkLgo+IAo+IEZvciB1c2VycyB0aGF0IG1pZ2h0IGNvbnNpZGVyIE1U RCBhcyBhIG9wdGlvbiB0byBkbyBzb21ldGhpbmcgb24gYQo+IFJvY2tjaGlwIE5BTkQKPiBzZWUg dGhlIHNvdXJjZSBjb2RlIGJlbG93IHRvIGdldCBhbiBpbmRpY2F0aW9uIG9mIHdoYXQgaXMgbmVl ZGVkIGZvciBhCj4gdXNlZnVsCj4gc2V0dXAgdG8ganVzdCByZWFkIGFuZCB3cml0ZSBhIGJvb3Rs b2FkZXIgYWxvbmUuIFdyaXRpbmcgb2YgYW55IHVzZXIKPiBwYXJ0aXRpb24KPiBpcyBub3QgZXZl biBpbmNsdWRlZC4KPiBIYXZpbmcgYSBiYXNpYyBNVEQgZHJpdmVyIGlzIGp1c3Qgbm90IGVub3Vn aC4KPiBQbGVhc2UgYWR2aXNlIGlmIHN1Y2ggYSBvdmVyaGVhZCBjYW4gaW50ZXJmYWNlIHdpdGgg TVREPwo+IEhhdmUgZnVuIQo+IAo+IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCj4gCgpb Li4uXQoKPiA+PiArI2RlZmluZSBOQU5EQ19JRF9WNjAwCQkJMHg1NjM2MzAzMAo+ID4+ICsjZGVm aW5lIE5BTkRDX0lEX1Y2MjIJCQkweDU2MzYzMjMyCj4gPj4gKyNkZWZpbmUgTkFORENfSURfVjcw MQkJCTB4NzAxCj4gPj4gKyNkZWZpbmUgTkFORENfSURfVjgwMAkJCTB4NTYzODMwMzAKPiA+PiAr I2RlZmluZSBOQU5EQ19JRF9WODAxCQkJMHg4MDEKPiA+PiArI2RlZmluZSBOQU5EQ19JRF9WOTAw CQkJMHg1NjM5MzAzMCAgCj4gPiAgCj4gCj4gPiBJIHdvdWxkIHByZWZlciBwcmVmaXhpbmcgZXZl cnl0aGluZyBSS19OQU5EQ18gb3IgUktfICAKPiAKPiBXaWxsIGNoYW5nZSBkZWZpbmUgbGlzdCBh Ym92ZSBhbmQgYmVsb3cgdG8gUktfTkFORENfCj4gSXQgdGFrZXMgbW9yZSBzcGFjZSB0aG91Z2gu IEFscmVhZHkgZGlmZmljdWx0IHRvIHN0YXkgYmVsb3cgODAKPiBjaGFyL2xpbmUuCgpEbyB5b3Vy IGJlc3QsIGlmIGl0IGh1cnRzIHJlYWRhYmlsaXR5IHlvdSBtYXkgYnJlYWsgdGhlIDgwIGNoYXJz IHJ1bGUuCk9yIHRyeSB0byB3cml0ZSBpdCBkb3duIGRpZmZlcmVudGx5LgoKClsuLi5dCgo+ID4+ ICtzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyIHsKPiA+PiArCXZvaWQgX19pb21lbSAqcmVnczsK PiA+PiArCWludCBpcnE7Cj4gPj4gKwlzdHJ1Y3QgY2xrICpoY2xrOwo+ID4+ICsJc3RydWN0IGNs ayAqY2xrOwo+ID4+ICsJc3RydWN0IGxpc3RfaGVhZCBjaGlwczsKPiA+PiArCXN0cnVjdCBjb21w bGV0aW9uIGNvbXBsZXRlOwo+ID4+ICsJc3RydWN0IG5hbmRfY29udHJvbGxlciBjb250cm9sbGVy Owo+ID4+ICsJaW50IGJhbmtzW05BTkRDX05VTV9CQU5LU107ICAKPiA+ICAKPiA+PiArCWJvb2wg Ym9vdHJvbWJsb2NrczsKPiA+PiArCWludCBlY2NfbW9kZTsKPiA+PiArCXVpbnQzMl90IGVjY19z dHJlbmd0aDsKPiA+PiArCWludCBtYXhfZWNjX3N0cmVuZ3RoOyAgCj4gPiAgCj4gCj4gPiBJIGhh dmUgbm90IHJlYWQgeWV0IHRoZSBlbnRpcmUgZHJpdmVyIGJ1dCBJIGJlbGlldmUgdGhlIGFib3Zl IDQKPiA+IHBhcmFtZXRlcnMgc2hvdWxkIHByb2JhYmx5IGJlIG1vdmVkIGluIHJrX25hbmRfY2hp cCwgcmlnaHQ/IEFueXRoaW5nCj4gPiB0aGF0IGlzIE5BTkQgY2hpcCByZWxhdGVkIHNob3VsZCBu b3QgYmUgaW4gdGhlIGNvbnRyb2xsZXIKPiA+IHN0cnVjdHVyZS4gSXQgZGVwZW5kcyBpZiB5b3Ug Y2FuIGNoYW5nZSBFQ0MgcmVxdWlyZW1lbnRzIG9uIHRoZSBmbHkKPiA+IG9yIG5vdC4gIAo+IAo+ IFNob3J0IGFuc3dlcjoKPiBUaGUgcmVhc29uIHRoYXQgaXQgaXMgdGhlIG1vc3QgY29udmVuaWVu Y2UgcGxhY2UgdG8gaGF2ZSB0aGVtIGZvciBub3cuCj4gV2l0aCBvbmUgcG9pbnRlciBmcm9tIG5h bmRfZ2V0X2NvbnRyb2xsZXJfZGF0YSgpIEkgaGF2ZSBhbGwgZGF0YQo+IGF2YWlsYWJsZS4KPiAK PiBzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyICpjdHJsID0gbmFuZF9nZXRfY29udHJvbGxlcl9k YXRhKG5hbmQpOwo+IAo+IFRoZSBFQ0MgaXMgbm93IHNvcnQgb2YgZml4ZWQgdG8gMjQgYW5kIDQw IGZvciBsZWdhY3kgcmVhc29ucy4KPiBUaGUgb2xkZXIgcmszMDY2IGJvb3Ryb20gYXBwYXJlbnRs eSBvbmx5IHdvcmtzIGZvciBlY2MgMjQuCj4gU2VlIGluZm8gYmFzZWQgb24gb2xkZXIgd29yayBi eSBQYXdlxYIgSmFyb3N6IGZvciBVYm9vdC4KPiAKPiBJJ20gbm90IHRvbyBmYW1pbGlhciB3aXRo IGFsbCBpbm5lciB3b3JraW5nIG9mIE1URCwgc28gcGxlYXNlIGFkdmlzZS4KPiBDYW4gdGhlIHVz ZXJzIGdldCBhY2Nlc3MgdG8gc3RydWN0IHJrX25hbmRfY2hpcD8KPiBXb3VsZCB5b3UgbGlrZSB0 byBnaXZlIHVzZXJzIGNvbnRyb2wgb3ZlciB3aGF0IGVjYyB0byB1c2U/CgpJdCBpcyBhbHJlYWR5 IHRoZSBjYXNlOiBEVCBwcm9wZXJ0aWVzIGluIHRoZSBOQU5EIG5vZGUgKHNlZSB0aGUKYmluZGlu Z3MpLiBCdXQgdGhpcyBpcyBhIHN0YXRpYyBpbmZvcm1hdGlvbiwgeW91IGNhbm5vdCBjaGFuZ2Ug aXQgYXQKcnVuIHRpbWUgb2YgY291cnNlLgoKPiBXaGF0IHByb2dyYW0gY2FuIHdlIHVzZSBmb3Ig dGhhdD8gQ2FuJ3QgdXNlIGRkIHRoZW4gYW55IG1vcmUuCgpZb3Ugc2hvdWxkIG5vdCB1c2UgZGQg YXQgYWxsLiBkZCBpcyBmb3IgYmxvY2sgZGV2aWNlcyBvciBjaGFyIGRldmljZXMsCm5vdCBNVEQg ZGV2aWNlcy4gVGhlcmUgaXMgYW4gbXRkLXV0aWxzIHBhY2thZ2Ugb3V0IHRoZXJlIHRoYXQgY292 ZXJzCnByZXR0eSBtdWNoIGFsbCB0aGUgYWN0aW9ucyB5b3Ugd2FudCB0by4KCj4gSG93IGRvIHdl IHJlZ2FpbiBlY2MgY29udHJvbCBpZiB3ZSByZWFsbHkgaGF2ZSB0byBmb3IgZXhhbXBsZSByazMw NjY/Cj4gT3IgcmVtb3ZlIHRoYXQgYm9vdHJvbSBjaGVjayBhbmQgYWx3YXlzIHNldCBFQ0Mgd2l0 aCBldmVyeQo+IHJrX25hbmRjX2h3X3N5bmRyb21lX2VjY19yZWFkX3BhZ2UgYW5kCj4gcmtfbmFu ZGNfaHdfc3luZHJvbWVfZWNjX3dyaXRlX3BhZ2Ugd2l0aCB3aGF0ZXZlciBwYXNzZWQgYWxvbmc/ CgpJIGRvbid0IHVuZGVyc3RhbmQgeW91ciBxdWVzdGlvbi4KCgpbLi4uXQoKPiA+PiArc3RhdGlj IGludCBya19uYW5kY19od19lY2Nfc2V0dXAoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwKPiA+PiAr CQkJCSB1aW50MzJfdCBzdHJlbmd0aCkKPiA+PiArewo+ID4+ICsJc3RydWN0IHJrX25hbmRfY29u dHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+ID4+ ICsJdWludDMyX3QgcmVnOwo+ID4+ICsKPiA+PiArCW5hbmQtPmVjYy5zdHJlbmd0aCA9IHN0cmVu Z3RoOyAgCj4gCj4gU2hvdWxkIEkgYWRkIHRoaXMgY29tbWVudCBiZWxvdz8KPiAKPiAvKiBIVyBF Q0MgYWx3YXlzIHJlcXVlc3QgRUNDIGJ5dGVzIGZvciAxMDI0IGJ5dGVzIGJsb2NrcyAqLwo+IAo+ ID4+ICsJbmFuZC0+ZWNjLmJ5dGVzID0gRElWX1JPVU5EX1VQKG5hbmQtPmVjYy5zdHJlbmd0aCAq IDE0LAo+ID4+IDgpOyAgCj4gPiAgCj4gCj4gPiBXaGF0IGRvIDE0IGFuZCA4IG1lYW4/ICAKPiAK PiBmbHMgLSBmaW5kIGxhc3QgKG1vc3Qtc2lnbmlmaWNhbnQpIGJpdCBzZXQKPiAKPiBpbnQgZmxz KHVuc2lnbmVkIGludCB4KQo+IHsKPiAJaW50IHIgPSAzMjsKPiAKPiAJaWYgKCF4KQo+IAkJcmV0 dXJuIDA7Cj4gCWlmICghKHggJiAweGZmZmYwMDAwdSkpIHsKPiAJCXggPDw9IDE2Owo+IAkJciAt PSAxNjsKPiAJfQo+IAlpZiAoISh4ICYgMHhmZjAwMDAwMHUpKSB7Cj4gCQl4IDw8PSA4Owo+IAkJ ciAtPSA4Owo+IAl9Cj4gCWlmICghKHggJiAweGYwMDAwMDAwdSkpIHsKPiAJCXggPDw9IDQ7Cj4g CQlyIC09IDQ7Cj4gCX0KPiAJaWYgKCEoeCAmIDB4YzAwMDAwMDB1KSkgewo+IAkJeCA8PD0gMjsK PiAJCXIgLT0gMjsKPiAJfQo+IAlpZiAoISh4ICYgMHg4MDAwMDAwMHUpKSB7Cj4gCQl4IDw8PSAx Owo+IAkJciAtPSAxOwo+IAl9Cj4gCXJldHVybiByOwo+IH0KPiAKPiAJbmFuZC0+ZWNjLmJ5dGVz ID0gRElWX1JPVU5EX1VQKGVjYy0+c3RyZW5ndGggKiBmbHMoOCAqIDEwMjQpLAo+IDgpOwo+IAo+ IGZvcm11bGUgaXMgdXNlZCB0byB0cmFuc2xhdGUgc3RyZW5ndGggaW4gYml0LzEwMjQgQkNIL0VD Qwo+IHRvIE1URCBFQ0MgYnl0ZXMgZm9yIDEwMjQgYnl0ZXMgYmxvY2tzIGluIG5hbmQtPmVjYy5i eXRlcwo+IAo+IDE0IGlzIHJlcGxhY2VtZW50IGZvciBmbHMoOCAqIDEwMjQpCgpUaGlzIGlzIGFi c29sdXRlbHkgZm9yYmlkZGVuIDopIFlvdSBzaG91bGQgbmV2ZXIgaGlkZSB5b3VyIGZpcnN0Cmlu dGVudGlvbiwgMTQgaGVyZSBpcyBhIHZlcnkgYmFkIHBsYWNlaG9sZGVyIGJlY2F1c2Ugd2UgY2Fu bm90IGtub3cKd2hhdCBpdCBtZWFucy4gSSBzdXBwb3NlIHlvdXIgaW50ZW50aW9uIHdhcyB0byBv cHRpbWl6ZSB0aGluZ3MuIGZscygpCmFscmVhZHkgZXhpc3QgaW4gdGhlIGtlcm5lbCwgOCBhbmQg MTAyNCBhcmUgY29uc3RhbnRzIHNvIEdDQyAob3IKd2hhdGV2ZXIgY29tcGlsZXIgeW91IHVzZSkg d2lsbCBvcHRpbWl6ZSB0aGluZ3MgYXMgbXVjaCBhcyBpdCBjYW4uClBsdXMsIGl0IGlzIHJ1biBv bmx5IG9uY2UgaW4gYSBsaWZldGltZSBzbyB0aGVyZSBpcyBub3Qgc28gbXVjaCBnYWluCmFueXdh eS4KCj4gOCBiaXRzIGluIGEgYnl0ZQoKSSB0aGluayB0aGVyZSBpcyBhIG1hY3JvIGZvciB0aGF0 IChvdGhlcndpc2UgaXQgaXMgbm90IGltcG9ydGFudCkKCj4gCj4gPiAgCj4gPj4gKwkvKiBIVyBF Q0Mgb25seSB3b3JrcyB3aXRoIGFuIGV2ZW4gbnVtYmVyIG9mIEVDQyBieXRlcyAqLwo+ID4+ICsJ bmFuZC0+ZWNjLmJ5dGVzID0gQUxJR04obmFuZC0+ZWNjLmJ5dGVzLCAyKTsKPiA+PiArCj4gPj4g KwlpZiAoY3RybC0+dmVyc2lvbiA9PSBWRVJTSU9OXzkpIHsKPiA+PiArCQlzd2l0Y2ggKG5hbmQt PmVjYy5zdHJlbmd0aCkgewo+ID4+ICsJCWNhc2UgNzA6Cj4gPj4gKwkJCXJlZyA9IE5BTkRDX1Y5 X0VDQ183MDsKPiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJY2FzZSA2MDoKPiA+PiArCQkJcmVnID0g TkFORENfVjlfRUNDXzYwOwo+ID4+ICsJCQlicmVhazsKPiA+PiArCQljYXNlIDQwOgo+ID4+ICsJ CQlyZWcgPSBOQU5EQ19WOV9FQ0NfNDA7Cj4gPj4gKwkJCWJyZWFrOwo+ID4+ICsJCWNhc2UgMTY6 Cj4gPj4gKwkJCXJlZyA9IE5BTkRDX1Y5X0VDQ18xNjsKPiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJ ZGVmYXVsdDoKPiA+PiArCQkJcmV0dXJuIC1FSU5WQUw7Cj4gPj4gKwkJfQo+ID4+ICsJCXdyaXRl bChyZWcsIGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjlfQkNIQ1RMKTsKPiA+PiArCX0gZWxzZSB7 Cj4gPj4gKwkJc3dpdGNoIChuYW5kLT5lY2Muc3RyZW5ndGgpIHsKPiA+PiArCQljYXNlIDYwOgo+ ID4+ICsJCQlyZWcgPSBOQU5EQ19WNl9FQ0NfNjA7Cj4gPj4gKwkJCWJyZWFrOwo+ID4+ICsJCWNh c2UgNDA6Cj4gPj4gKwkJCXJlZyA9IE5BTkRDX1Y2X0VDQ180MDsKPiA+PiArCQkJYnJlYWs7Cj4g Pj4gKwkJY2FzZSAyNDoKPiA+PiArCQkJcmVnID0gTkFORENfVjZfRUNDXzI0Owo+ID4+ICsJCQli cmVhazsKPiA+PiArCQljYXNlIDE2Ogo+ID4+ICsJCQlyZWcgPSBOQU5EQ19WNl9FQ0NfMTY7Cj4g Pj4gKwkJCWJyZWFrOwo+ID4+ICsJCWRlZmF1bHQ6Cj4gPj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ ID4+ICsJCX0KPiA+PiArCQl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2X0JD SENUTCk7Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30KPiA+PiArCj4g Pj4gK3N0YXRpYyB2b2lkIHJrX25hbmRjX3hmZXJfc3RhcnQoc3RydWN0IHJrX25hbmRfY29udHJv bGxlciAqY3RybCwKPiA+PiArCQkJCXVpbnQ4X3QgZGlyLCB1aW50OF90IG5fS0IsCj4gPj4gKwkJ CQlkbWFfYWRkcl90IGRtYV9kYXRhLCBkbWFfYWRkcl90Cj4gPj4gZG1hX29vYikgK3sKPiA+PiAr CXVpbnQzMl90IHJlZzsKPiA+PiArCj4gPj4gKwlpZiAoY3RybC0+dmVyc2lvbiA9PSBWRVJTSU9O XzkpIHsKPiA+PiArCQlyZWcgPSBOQU5EQ19WOV9ETUFfQ0ZHX1dSX1NUIHwKPiA+PiArCQkgICAg ICBOQU5EQ19WOV9ETUFfQ0ZHX1dSKGRpcikgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0RNQV9D RkdfQlVTX01PREUgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0RNQV9DRkdfSFNJWkVfMzIgfAo+ ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0RNQV9DRkdfQlVSU1RfMTYgfAo+ID4+ICsJCSAgICAgIE5B TkRDX1Y5X0RNQV9DRkdfSU5DUl9OVU0oMTYpOwo+ID4+ICsJCXdyaXRlbChyZWcsIGN0cmwtPnJl Z3MgKyBOQU5EQ19SRUdfVjlfRE1BX0NGRyk7Cj4gPj4gKwkJd3JpdGVsKCh1aW50MzJfdClkbWFf ZGF0YSwgY3RybC0+cmVncyArCj4gPj4gTkFORENfUkVHX1Y5X0RNQV9CVUYwKTsKPiA+PiArCQl3 cml0ZWwoKHVpbnQzMl90KWRtYV9vb2IsIGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19WOV9E TUFfQlVGMSk7ICAKPiA+Cj4gPiBJJ20gcHJldHR5IHN1cmUgbW9zdCBvZiB0aGVzZSB3cml0ZWwg Y291bGQgYmUgdHVybmVkIGludG8KPiA+IHdyaXRlbF9yZWxheGVkLiAgCj4gCj4gd3JpdGVsKCkg ICAgICAgLS0gd3JpdGUgdG8gdGhlIGxpdHRsZS1lbmRpYW4gaGFyZHdhcmUgcmVnaXN0ZXIgd2l0 aAo+IGNvbXBpbGVyIG1lbW9yeSBiYXJyaWVyLAo+IHdyaXRlbF9yZWxheGVkIC0tIGFzIGFib3Zl LCB3aXRob3V0IGJhcnJpZXIsCj4gX19yYXdfd3JpdGVsKCkgLS0gYXMgYWJvdmUgKHdyaXRlbF9y ZWxheGVkKCkpIHdpdGhvdXQgZW5kaWFuZXNzCj4gY29udmVyc2lvbiAoQ1BVIG9yZGVyaW5nIHdp bGwgYmUgdXNlZCkuCj4gQXJjaGl0ZWN0dXJlLWRlcGVuZGVudC4KPiBJIGRvbid0IGtub3cuCgpJ biBtb3N0IG9mIHRoZSBjYXNlcyB5b3UgZG9uJ3QgbmVlZCBhbiBleHBsaWNpdCBiYXJyaWVyICh1 bmxlc3MsIGZvcgppbnN0YW5jZSwgeW91IGFyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gaGFw cGVuIHdpdGggYSBzaG9ydCB0aW1lb3V0KS4KClBsZWFzZSB0cnkgd2l0aCB3cml0ZWxfcmVsYXhl ZCBpbiBtb3N0IG9mIHRoZSBjYXNlcy4KCj4gCj4gPgo+ID4gQWxzbyBJIGFtIG5vdCBhIGJpZyBm YW4gb2YgdGhlc2UgY2FzdHMsIG1heWJlIHlvdSBzaG91bGQgY2hhbmdlCj4gPiBkbWFfZGF0YSBh bmQgZG1hX29vYiB0eXBlcyAoYmUgY2FyZWZ1bDogeW91IGVuYWJsZWQgQ09NUElMRV9URVNUIGlu Cj4gPiBLY29uZmlnLCB5b3UgbXVzdCBzdXBwb3J0IDMyLWJpdCBhbmQgNjQtYml0IHBvaW50ZXJz LCBwbGVhc2UgdHJ5IHRvCj4gPiBjb21waWxlIHRoaXMgZHJpdmVyIHdpdGggZGlmZmVyZW50IHRv b2xjaGFpbnMpLiAgCj4gCj4gRHJpdmVyIGlzIHVzZWQgZm9yIGJvdGggQVJNIGFzIGFybTY0Lgo+ IFRoZXNlIHJlZ2lzdGVycyBhcmUgMzIgYml0LiBQbGVhc2UgYWR2aXNlIHdoYXQgaGFwcGVucwo+ IHdoZW4gd3JpdGVsIGdldHMgZG1hX2FkZHJfdCBhbmQgZG1hX2RhdGEgYXMgNjQgYml0Lgo+IERv bid0IGhhdmUgdGhlIGhhcmR3YXJlIHRvIGZpbmQgb3V0LgoKWW91IGRvbid0IG5lZWQgaGFyZHdh cmUsIGp1c3QgYSAzMi1iaXQgYW5kIGEgNjQtYml0IHRvb2xjaGFpbi4gV2UganVzdAp3YW50IHRv IGF2b2lkIGNhc3RzIGFuZCBidWlsZCB3YXJuaW5ncy4KCj4gCj4gPiAgCj4gPj4gKwo+ID4+ICsJ CXJlZyA9IE5BTkRDX1Y5X0ZMX0RJUihkaXIpIHwKPiA+PiArCQkgICAgICBOQU5EQ19WOV9GTF9Y RkVSX0VOIHwKPiA+PiArCQkgICAgICBOQU5EQ19WOV9GTF9YRkVSX0NPVU5UIHwKPiA+PiArCQkg ICAgICBOQU5EQ19WOV9GTF9BQ09SUkVDVCB8Cj4gPj4gKwkJICAgICAgTkFORENfVjlfRkxfUEFH RV9OVU0obl9LQikgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y5X0ZMX0FTWU5DX1RPR19NSVg7Cj4g Pj4gKwkJd3JpdGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRDX1JFR19WOV9GTENUTCk7Cj4gPj4g KwkJcmVnIHw9IE5BTkRDX1Y5X0ZMX1hGRVJfU1RBUlQ7Cj4gPj4gKwkJd3JpdGVsKHJlZywgY3Ry bC0+cmVncyArIE5BTkRDX1JFR19WOV9GTENUTCk7Cj4gPj4gKwl9IGVsc2Ugewo+ID4+ICsJCXJl ZyA9IHJlYWRsKGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjZfQkNIQ1RMKTsKPiA+PiArCQlyZWcg PSAocmVnICYgKH4oTkFORF9WNl9CQ0hfUkVHSU9OX00gPDwKPiA+PiArCQkJCU5BTkRfVjZfQkNI X1JFR0lPTl9TKSkpIHwKPiA+PiArCQkgICAgICAoY3RybC0+c2VsZWN0ZWRfYmFuayA8PAo+ID4+ IE5BTkRfVjZfQkNIX1JFR0lPTl9TKTsKPiA+PiArCQl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsg TkFORENfUkVHX1Y2X0JDSENUTCk7Cj4gPj4gKwo+ID4+ICsJCXJlZyA9IE5BTkRDX1Y2X0RNQV9D RkdfV1JfU1QgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y2X0RNQV9DRkdfV1IoZGlyKSB8Cj4gPj4g KwkJICAgICAgTkFORENfVjZfRE1BX0NGR19CVVNfTU9ERSB8Cj4gPj4gKwkJICAgICAgTkFORENf VjZfRE1BX0NGR19IU0laRV8zMiB8Cj4gPj4gKwkJICAgICAgTkFORENfVjZfRE1BX0NGR19CVVJT VF8xNiB8Cj4gPj4gKwkJICAgICAgTkFORENfVjZfRE1BX0NGR19JTkNSX05VTSgxNik7Cj4gPj4g KwkJd3JpdGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9ETUFfQ0ZHKTsKPiA+PiAr CQl3cml0ZWwoZG1hX2RhdGEsIGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19WNl9ETUFfQlVG MCk7Cj4gPj4gKwkJd3JpdGVsKGRtYV9vb2IsIGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19W Nl9ETUFfQlVGMSk7ICAKPiAKPiBTYW1lIGhlcmUuCj4gCj4gPj4gKwo+ID4+ICsJCXJlZyA9IE5B TkRDX1Y2X0ZMX0RJUihkaXIpIHwKPiA+PiArCQkgICAgICBOQU5EQ19WNl9GTF9YRkVSX0VOIHwK PiA+PiArCQkgICAgICBOQU5EQ19WNl9GTF9YRkVSX0NPVU5UIHwKPiA+PiArCQkgICAgICBOQU5E Q19WNl9GTF9BQ09SUkVDVCB8Cj4gPj4gKwkJICAgICAgTkFORENfVjZfRkxfUEFHRV9OVU0obl9L QikgfAo+ID4+ICsJCSAgICAgIE5BTkRDX1Y2X0ZMX0FTWU5DX1RPR19NSVg7Cj4gPj4gKwkJd3Jp dGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9GTENUTCk7Cj4gPj4gKwkJcmVnIHw9 IE5BTkRDX1Y2X0ZMX1hGRVJfU1RBUlQ7Cj4gPj4gKwkJd3JpdGVsKHJlZywgY3RybC0+cmVncyAr IE5BTkRDX1JFR19WNl9GTENUTCk7Cj4gPj4gKwl9Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRp YyBpbnQgcmtfbmFuZGNfd2FpdF9mb3JfeGZlcl9kb25lKHN0cnVjdCBya19uYW5kX2NvbnRyb2xs ZXIKPiA+PiAqY3RybCkgK3sKPiA+PiArCXVpbnQzMl90IHJlZzsKPiA+PiArCWludCByZXQ7Cj4g Pj4gKwo+ID4+ICsJaWYgKGN0cmwtPnZlcnNpb24gPT0gVkVSU0lPTl85KSB7Cj4gPj4gKwkJdm9p ZCBfX2lvbWVtICpwdHIgPSBjdHJsLT5yZWdzICsKPiA+PiBOQU5EQ19SRUdfVjlfRkxDVEw7ICsK PiA+PiArCQlyZXQgPSByZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljKHB0ciwgcmVnLAo+ID4+ICsJ CQkJCQlyZWcgJgo+ID4+IE5BTkRDX1Y5X0ZMX1hGRVJfUkVBRFksCj4gPj4gKwkJCQkJCTEsCj4g Pj4gTkFORENfREVGX1RJTUVPVVQpOwo+ID4+ICsJfSBlbHNlIHsKPiA+PiArCQl2b2lkIF9faW9t ZW0gKnB0ciA9IGN0cmwtPnJlZ3MgKwo+ID4+IE5BTkRDX1JFR19WNl9GTENUTDsgKwo+ID4+ICsJ CXJldCA9IHJlYWRsX3BvbGxfdGltZW91dF9hdG9taWMocHRyLCByZWcsCj4gPj4gKwkJCQkJCXJl ZyAmCj4gPj4gTkFORENfVjZfRkxfWEZFUl9SRUFEWSwKPiA+PiArCQkJCQkJMSwKPiA+PiBOQU5E Q19ERUZfVElNRU9VVCk7Cj4gPj4gKwl9ICAKPiA+Cj4gPiBTcGFjZQo+ID4gIAo+ID4+ICsJaWYg KHJldCkKPiA+PiArCQlwcl9lcnIoInRpbWVvdXQgcmVnPSV4XG4iLCByZWcpOwo+ID4+ICsKPiA+ PiArCXJldHVybiByZXQ7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB1bnNpZ25lZCBsb25n IHJrX25hbmRjX2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwKPiA+PiArCQl2b2lk ICpwdHIsIGludCBzaXplLCBpbnQgZGlyKSAgCj4gPiAgCj4gCj4gPiBVbmFsaWduZWQgcGFyYW1l dGVycyAgCj4gCj4gVG8gcmVzdHlsZSBJIHVzZToKPiBhc3R5bGUgLVQ4IC0tbWF4LWNvZGUtbGVu Z3RoPTgwIC0tc3R5bGU9bGludXggcm9ja2NoaXBfbmFuZGMuYwo+IAo+IFBsZWFzZSBhZHZpc2Ug Zm9yIGEgYmV0dGVyIHNvbHV0aW9uLgoKSSBkb24ndCBrbm93IGFzdHlsZSwgYnV0IHRoaXMgd291 bGQgY2VydGFpbmx5IHRyaWdnZXIgYSBjaGVja3BhdGNoLnBsCndhcm5pbmcuIEp1c3QgY2hlY2sg dGhlbSBhbmQgY29ycmVjdCB0aGVtIGJ5IGhhbmQuCgo+IAo+ID4gIAo+ID4+ICt7Cj4gPj4gKyNp ZmRlZiBDT05GSUdfQVJNNjQKPiA+PiArCV9fZG1hX21hcF9hcmVhKCh2b2lkICopcHRyLCBzaXpl LCBkaXIpOwo+ID4+ICsJcmV0dXJuICgodW5zaWduZWQgbG9uZyl2aXJ0X3RvX3BoeXMoKHZvaWQg KilwdHIpKTsKPiA+PiArI2Vsc2UKPiA+PiArCXJldHVybiBkbWFfbWFwX3NpbmdsZShkZXYsICh2 b2lkICopcHRyLCBzaXplLCBkaXIpOwo+ID4+ICsjZW5kaWYgIAo+ID4gIAo+IAo+ID4gUGxlYXNl IHRyeSB0byByZW1vdmUgdGhlc2UgI2lmZGVmcywgSSBkb24ndCBrbm93IHdoeSB3b3VsZCB5b3Ug bmVlZAo+ID4gdGhlIGZvcm1lciBibG9jaz8gIAo+IAo+IFRoaXMgZHJpdmVyIGlzIHVzZWQgYm90 aCBmb3IgQVJNIGFzIGFybTY0Lgo+IE9yaWdpbmFsIGZyb20gUm9ja2NoaXA6IGFybTY0IGRvZXNu J3QgaGF2ZSBkbWFfbWFwX3NpbmdsZSgpIGFzIEkKPiByZW1lbWJlci4gRG9uJ3Qga25vdyB3aGF0 IHRvIHVzZSBpbnN0ZWFkLgo+IFBsZWFzZSBhZHZpc2UuCgpJIGFtIG5vdCBhd2FyZSBvZiBzdWNo IGEgbGltaXRhdGlvbi4gUGxlYXNlIGNoZWNrIGFnYWluLgoKPiAKPiA+ICAKPiA+PiArfQo+ID4+ ICsKPiA+PiArc3RhdGljIHZvaWQgcmtfbmFuZGNfZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2 aWNlICpkZXYsCj4gPj4gKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHB0ciwgaW50Cj4gPj4gc2l6 ZSwgaW50IGRpcikgK3sKPiA+PiArI2lmZGVmIENPTkZJR19BUk02NAo+ID4+ICsJX19kbWFfdW5t YXBfYXJlYShwaHlzX3RvX3ZpcnQocHRyKSwgc2l6ZSwgZGlyKTsKPiA+PiArI2Vsc2UKPiA+PiAr CWRtYV91bm1hcF9zaW5nbGUoZGV2LCAoZG1hX2FkZHJfdClwdHIsIHNpemUsIGRpcik7Cj4gPj4g KyNlbmRpZiAgCj4gPgo+ID4gU2FtZQo+ID4gIAo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMg aW50IHJrX25hbmRjX2h3X3N5bmRyb21lX2VjY19yZWFkX3BhZ2Uoc3RydWN0IG5hbmRfY2hpcAo+ ID4+ICpuYW5kLAo+ID4+ICsJCXVpbnQ4X3QgKmJ1ZiwKPiA+PiArCQlpbnQgb29iX3JlcXVpcmVk LCBpbnQgcGFnZSkgIAo+ID4gIAo+IAo+ID4gVW5hbGlnbmVkIHBhcmFtZXRlcnMgKHBsZWFzZSBj aGVjayBhbGwgb2YgdGhlbSkuICAKPiAKPiBBZ2FpbiBibGFtZSBhc3R5bGUgLi4uCj4gQWZ0ZXIg Y29ycmVjdGluZyBpdCBtYW51YWxseSBhIGZldyB0aW1lIEkganVzdCBsZWZ0IGl0IGFzIGl0IGlz Lgo+IAo+ID4gIAo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9f bXRkKG5hbmQpOwo+ID4+ICsJc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4g bmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+ID4+ICsJc3RydWN0IG5hbmRfZWNjX2N0 cmwgKmVjYyA9ICZuYW5kLT5lY2M7Cj4gPj4gKwlpbnQgbWF4X2JpdGZsaXBzID0gMDsKPiA+PiAr CWRtYV9hZGRyX3QgZG1hX2RhdGEsIGRtYV9vb2I7Cj4gPj4gKwlpbnQgcmV0LCBpOwo+ID4+ICsJ aW50IGJjaF9zdDsKPiA+PiArCWludCBkbWFfb29iX3NpemUgPSBlY2MtPnN0ZXBzICogMTI4Owo+ ID4+ICsJaW50IHBhZ2VzX3Blcl9ibGsgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXpl Owo+ID4+ICsKPiA+PiArCXJrX25hbmRjX3NlbGVjdF9jaGlwKG5hbmQsIGN0cmwtPnNlbGVjdGVk X2JhbmspOwo+ID4+ICsKPiA+PiArCWlmICgocGFnZSA8IHBhZ2VzX3Blcl9ibGsgKiBOQU5EQ19J REJSZXNCbGtOdW0pICYmICAKPiA+ICAKPiAKPiA+IENhbWVsIGNhc2UgaXMgdXN1YWxseSBub3Qg d2VsY29tZSAgCj4gCj4gQW55IHN1Z2dlc3Rpb25zIGZvciBhIGJldGVyIHJlcGxhY2UgZm9yIE5B TkRDX0lEQlJlc0Jsa051bSBhcmUKPiB3ZWxjb21lLgoKU09NRVRISU5HX0xpa2VUaGlzIC0+IFNP TUVUSElOR19MSUtFX1RISVMKCj4gCj4gPiAgCj4gPj4gKwkgICAgY3RybC0+Ym9vdHJvbWJsb2Nr cykgIAo+ID4KPiA+IFRoaXMgd291bGQgcHJvYmFibHkgZGVzZXJ2ZSBhIGhlbHBlcgo+ID4gIAo+ ID4+ICsJCXJrX25hbmRjX2h3X2VjY19zZXR1cChuYW5kLCBOQU5EQ19JREJFY2NCaXRzKTsKPiA+ PiArCj4gPj4gKwluYW5kX3JlYWRfcGFnZV9vcChuYW5kLCBwYWdlLCAwLCBOVUxMLCAwKTsKPiA+ PiArCj4gPj4gKwlkbWFfZGF0YSA9IHJrX25hbmRjX2RtYV9tYXBfc2luZ2xlKG10ZC0+ZGV2LnBh cmVudCwKPiA+PiArCQkJCQkgICBjdHJsLT5wYWdlX2J1ZiwKPiA+PiBtdGQtPndyaXRlc2l6ZSwK PiA+PiArCQkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ICsJZG1hX29vYiA9IHJrX25hbmRj X2RtYV9tYXBfc2luZ2xlKG10ZC0+ZGV2LnBhcmVudCwKPiA+PiArCQkJCQkgIGN0cmwtPm9vYl9i dWYsCj4gPj4gZG1hX29vYl9zaXplLAo+ID4+ICsJCQkJCSAgRE1BX0ZST01fREVWSUNFKTsKPiA+ PiArCj4gPj4gKwlpbml0X2NvbXBsZXRpb24oJmN0cmwtPmNvbXBsZXRlKTsgIAo+ID4gIAo+IAo+ ID4gT25lIGluaXRfY29tcGxldGlvbiBpcyBuZWVkZWQgKGluIHRoZSBwcm9iZSwgcHJvYmFibHkp IHRoZW4gcGxlYXNlCj4gPiB1c2UgcmVpbml0X2NvbXBsZXRpb24oKS4gIAo+IAo+IE11c3Qgc3R1 ZHkgdGhpcyBsYXRlci4KPiAKPiA+ICAKPiA+PiArCWlmIChjdHJsLT52ZXJzaW9uID09IFZFUlNJ T05fOSkKPiA+PiArCQl3cml0ZWwoTkFORENfVjlfSU5UX0RNQSwgY3RybC0+cmVncyArCj4gPj4g TkFORENfUkVHX1Y5X0lOVEVOKTsKPiA+PiArCWVsc2UKPiA+PiArCQl3cml0ZWwoTkFORENfVjZf SU5UX0RNQSwgY3RybC0+cmVncyArCj4gPj4gTkFORENfUkVHX1Y2X0lOVEVOKTsKPiA+PiArCXJr X25hbmRjX3hmZXJfc3RhcnQoY3RybCwgMCwgZWNjLT5zdGVwcywgZG1hX2RhdGEsCj4gPj4gZG1h X29vYik7ICAKPiAKPiA+PiArCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY3RybC0+Y29t cGxldGUsCj4gPj4gbXNlY3NfdG9famlmZmllcyg1KSk7Cj4gPj4gKwlya19uYW5kY193YWl0X2Zv cl94ZmVyX2RvbmUoY3RybCk7ICAKPiA+Cj4gPiBZb3VzIHNob3VsZCBjaGVjayB0aGUgcmV0dXJu IHN0YXR1cyBvZiBhbG1vc3QgYWxsIHRoZSBmdW5jdGlvbnMKPiA+IGhlcmUuICAKPiAKPiBQbGVh c2UgYWR2aXNlIHdoYXQgRVJST1IgY29kZSBzaG91bGQgYmUgcmV0dXJuZWQgaGVyZQo+IHRoYXQg aXMgY29tcGF0aWJsZSB3aXRoIE1URC4KCkFzIGEgZ2VuZXJhbCBydWxlLCBwbGVhc2UgY2hlY2sg dGhlIGRyaXZlcnMgd2hpY2ggaGF2ZSBiZWVuIHVwZGF0ZWQKcmVjZW50bHkgd2l0aCBnaXQgbG9n IC0tb25lLWxpbmUgLS0gZHJpdmVycy9tdGQvbmFuZC9yYXcvCgotPiBtYXJ2ZWxsLCBhdG1lbCwg ZnNtYywgc3VueGksIHN0bSwgY2FkZW5jZSwgZXRjCgpJbiB0aGlzIGNhc2UsIHlvdSBjYW4gcmV0 dXJuIHRoZSBlcnJvciBjb2RlIG9mIHRoZSBmYWlsaW5nIGZ1bmN0aW9uCndpdGggYSBzaW1wbGU6 CgoJcmV0ID0gZnVuYygpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoKSSBleHBlY3QgdGhlIHJr X25hbmRjX3dpYXRfZm9yX3hmZXJfZG9uZSgpIGhlbHBlciB0byByZXR1cm4gLUVUSU1FRE9VVApp biBjYXNlIG9mIHRpbWVvdXQuCgo+IAo+ID4gIAo+ID4+ICsJcmtfbmFuZGNfZG1hX3VubWFwX3Np bmdsZShtdGQtPmRldi5wYXJlbnQsIGRtYV9kYXRhLAo+ID4+IG10ZC0+d3JpdGVzaXplLAo+ID4+ ICsJCQkJICBETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ICsJcmtfbmFuZGNfZG1hX3VubWFwX3Npbmds ZShtdGQtPmRldi5wYXJlbnQsIGRtYV9vb2IsCj4gPj4gZG1hX29vYl9zaXplLAo+ID4+ICsJCQkJ ICBETUFfRlJPTV9ERVZJQ0UpOwo+ID4+ICsKPiA+PiArCW1lbWNweShidWYsIGN0cmwtPnBhZ2Vf YnVmLCBtdGQtPndyaXRlc2l6ZSk7Cj4gPj4gKwo+ID4+ICsJaWYgKG9vYl9yZXF1aXJlZCkgewo+ ID4+ICsJCXVpbnQ4X3QgKm9vYjsKPiA+PiArCQl1aW50MzJfdCB0bXA7ICAKPiA+ICAKPiAKPiA+ IFBsZWFzZSB1c2UgdTgsIHUxNiBhbmQgdTMyIHR5cGVzLiAgCj4gCj4gU2hvdWxkIHRoaXMgYmUg Y2hhbmdlZCBmb3IgdGhlIGVudGlyZSBzb3VyY2U/CgpZZXMsIGNoZWNrcGF0Y2gucGwgd2lsbCB3 YXJuIHlvdSBhYm91dCB0aGlzIHRvby4gdWludDx4Pl90IHR5cGVzIGFyZQpkZXByZWNhdGVkLgoK PiAKPiA+ICAKPiA+PiArCj4gPj4gKwkJZm9yIChpID0gMDsgaSA8IGVjYy0+c3RlcHM7IGkrKykg ewo+ID4+ICsJCQlvb2IgPSBuYW5kLT5vb2JfcG9pICsKPiA+PiArCQkJICAgICAgaSAqIChlY2Mt PmJ5dGVzICsgbmFuZC0+ZWNjLnByZXBhZCk7Cj4gPj4gKwkJCWlmIChjdHJsLT52ZXJzaW9uID09 IFZFUlNJT05fOSkgewo+ID4+ICsJCQkJdG1wID0gY3RybC0+b29iX2J1ZltpXTsKPiA+PiArCQkJ fSBlbHNlIHsKPiA+PiArCQkJCXVpbnQ4X3Qgb29iX3N0ZXAgPQo+ID4+IChjdHJsLT5lY2NfbW9k ZSA8PSAyNCkgPwo+ID4+ICsJCQkJCQkgICA2NCA6IDEyODsKPiA+PiArCQkJCXRtcCA9IGN0cmwt Pm9vYl9idWZbaSAqIG9vYl9zdGVwCj4gPj4gLyA0XTsKPiA+PiArCQkJfQo+ID4+ICsJCQkqb29i KysgPSAodWludDhfdCl0bXA7Cj4gPj4gKwkJCSpvb2IrKyA9ICh1aW50OF90KSh0bXAgPj4gOCk7 Cj4gPj4gKwkJCSpvb2IrKyA9ICh1aW50OF90KSh0bXAgPj4gMTYpOwo+ID4+ICsJCQkqb29iKysg PSAodWludDhfdCkodG1wID4+IDI0KTsKPiA+PiArCQl9Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJ aWYgKGN0cmwtPnZlcnNpb24gPT0gVkVSU0lPTl85KSB7Cj4gPj4gKwkJZm9yIChpID0gMDsgaSA8 IGVjYy0+c3RlcHMgLyAyOyBpKyspIHsKPiA+PiArCQkJYmNoX3N0ID0gcmVhZGwoY3RybC0+cmVn cyArCj4gPj4gTkFORENfUkVHX1Y5X0JDSFNUICsgaSAqIDQpOwo+ID4+ICsJCQlpZiAoYmNoX3N0 ICYgTkFORENfVjlfQkNIMF9TVF9FUlIgfHwKPiA+PiArCQkJICAgIGJjaF9zdCAmIE5BTkRDX1Y5 X0JDSDFfU1RfRVJSKSB7Cj4gPj4gKwkJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKPiA+PiAr CQkJCW1heF9iaXRmbGlwcyA9IC0xOwo+ID4+ICsJCQl9IGVsc2Ugewo+ID4+ICsJCQkJcmV0ID0K PiA+PiBOQU5EQ19WOV9FQ0NfRVJSX0NOVDAoYmNoX3N0KTsKPiA+PiArCQkJCW10ZC0+ZWNjX3N0 YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gPj4gKwkJCQltYXhfYml0ZmxpcHMgPSBtYXhfdCh1bnNp Z25lZCBpbnQsCj4gPj4gKwo+ID4+IG1heF9iaXRmbGlwcywgcmV0KTsgKwo+ID4+ICsJCQkJcmV0 ID0KPiA+PiBOQU5EQ19WOV9FQ0NfRVJSX0NOVDEoYmNoX3N0KTsKPiA+PiArCQkJCW10ZC0+ZWNj X3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4gPj4gKwkJCQltYXhfYml0ZmxpcHMgPSBtYXhfdCh1 bnNpZ25lZCBpbnQsCj4gPj4gKwo+ID4+IG1heF9iaXRmbGlwcywgcmV0KTsKPiA+PiArCQkJfQo+ ID4+ICsJCX0KPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwkJZm9yIChpID0gMDsgaSA8IGVjYy0+c3Rl cHMgLyAyOyBpKyspIHsKPiA+PiArCQkJYmNoX3N0ID0gcmVhZGwoY3RybC0+cmVncyArCj4gPj4g TkFORENfUkVHX1Y2X0JDSFNUICsgaSAqIDQpOwo+ID4+ICsJCQlpZiAoYmNoX3N0ICYgTkFORENf VjZfQkNIMF9TVF9FUlIgfHwKPiA+PiArCQkJICAgIGJjaF9zdCAmIE5BTkRDX1Y2X0JDSDFfU1Rf RVJSKSB7Cj4gPj4gKwkJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKPiA+PiArCQkJCW1heF9i aXRmbGlwcyA9IC0xOyAgCj4gPiAgCj4gCj4gPiBXaHkgbm90IHVzaW5nIHJldCA9ICQocmVhbCBl cnJvcikgaW5zdGVhZCBvZiB1c2luZyBtYXhfYml0ZmxpcHMKPiA+IGhlcmU/Cj4gPgo+ID4gVGhl bjoKPiA+Cj4gPiAJaWYgKHJldCkgeyAgCj4gCj4gPiAJCWRldl9lcnIoKTsgIAo+IAo+IERvIHlv dSByZWFsbHkgd2FudCB0byBsaXR0ZXIgdGhlIGtlcm5lbCBsb2cgd2l0aCBlYWNoIHRpbWUgeW91 IGhpdCBhCj4gYmFkIGJsb2NrLAo+IGluIGNhc2UgeW91IHVzZSB0aGlzIGZ1bmN0aW9uIGluIGEg c2VhcmNoIGJhZCBibG9jayBsb29wPwo+IERvbid0IHRoaW5rcyBzbyAuLi4KPiBQbGVhc2UgYWR2 aXNlLgoKQWN0dWFsbHkgSSB0aGluayB0aGF0IEkgd2FzIHNpbXBsaWZ5aW5nIHlvdXIgY29kZSBi dXQgeW91IGFyZSByaWdodCB0aGF0CnRoaXMgZGV2X2VyciBoYXMgdG8gYmUgcmVtb3ZlZC4KCj4g Cj4gPiAJCXJldHVybiByZXQ7Cj4gPiAJfQo+ID4KPiA+IAlyZXR1cm4gbWF4X2JpdGZsaXBzOyAg Cj4gCj4gcmtfbmFuZGNfaHdfc3luZHJvbWVfZWNjX3JlYWRfcGFnZSgpIGlzIHVzZWQgaW4gYSBi YWQgYmxvY2sgc2VhcmNoCj4gc3RyYXRlZ3kuIEkgdGhpbmsgbWF4X2JpdGZsaXBzID0gLTEgd2Fz IGNob3NlbiBhcyBhIHNhdmVyIHZhbHVlIHRvCj4gcmV0dXJuLiBQbGVhc2UgYWR2aXNlIHdoYXQg bnVtYmVyIHJhbmdlIE1URCBpbnRlcnByZXRzIGFzCj4gbWF4X2JpdGZsaXBzIG9yIGFzIGZhdWx0 LiBBbHNvIGNvbnNpZGVyIHNvbWUgdW5jb250cm9sbGVkIHN0YXR1cwo+IHJldHVybiB2YWx1ZSwg aXQgd291bGQgYmUgYmV0dGVyIGlmIHdlCj4gYXJlIGluIGNvbnRyb2wgb2Ygd2hhdCBnb2VzIHJl dHVybi4KCm1heF9iaXRmbGlwIGlzIGEgbG9jYWwgdmFyaWFibGUsIEknbSBqdXN0IHNheWluZyB0 aGF0IHVzaW5nIG1heF9iaXRmbGlwCnRvIHNhdmUgYW4gZXJyb3IgY29kZSBpcyBiYWQuCgpZb3Ug Y2FuIGNoZWNrIHdoYXQgb3RoZXIgZHJpdmVycyBkby4KCj4gCj4gPiAgCj4gPj4gKwkJCX0gZWxz ZSB7Cj4gPj4gKwkJCQlyZXQgPQo+ID4+IE5BTkRDX1Y2X0VDQ19FUlJfQ05UMChiY2hfc3QpOwo+ ID4+ICsJCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHJldDsKPiA+PiArCQkJCW1heF9i aXRmbGlwcyA9IG1heF90KHVuc2lnbmVkIGludCwKPiA+PiArCj4gPj4gbWF4X2JpdGZsaXBzLCBy ZXQpOyArCj4gPj4gKwkJCQlyZXQgPQo+ID4+IE5BTkRDX1Y2X0VDQ19FUlJfQ05UMShiY2hfc3Qp Owo+ID4+ICsJCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHJldDsKPiA+PiArCQkJCW1h eF9iaXRmbGlwcyA9IG1heF90KHVuc2lnbmVkIGludCwKPiA+PiArCj4gPj4gbWF4X2JpdGZsaXBz LCByZXQpOwo+ID4+ICsJCQl9Cj4gPj4gKwkJfQo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWlmICht YXhfYml0ZmxpcHMgPT0gLTEpIHsKPiA+PiArCQlkZXZfZXJyKG10ZC0+ZGV2LnBhcmVudCwKPiA+ PiArCQkJInJlYWRfcGFnZSAleCAleCAleCAleCAleCAlcCAleFxuIiwKPiA+PiArCQkJcGFnZSwK PiA+PiArCQkJbWF4X2JpdGZsaXBzLAo+ID4+ICsJCQliY2hfc3QsCj4gPj4gKwkJCSgodWludDMy X3QgKilidWYpWzBdLAo+ID4+ICsJCQkoKHVpbnQzMl90ICopYnVmKVsxXSwKPiA+PiArCQkJYnVm LAo+ID4+ICsJCQkodWludDMyX3QpZG1hX2RhdGEpOyAgCj4gPiAgCgpbLi4uXQoKPiA+PiArCj4g Pj4gKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDwgbGVuOyBvZmZzKyspCj4gPj4gKwkJYnVmW29mZnNd ID0gcmVhZGIoYmFua19iYXNlKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIHZvaWQgcmtf bmFuZGNfd3JpdGVfYnVmKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsCj4gPj4gKwkJCSAgICAgICBj b25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBya19uYW5k X2NvbnRyb2xsZXIgKmN0cmwgPQo+ID4+IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsK PiA+PiArCWludCBvZmZzID0gMDsKPiA+PiArCXZvaWQgX19pb21lbSAqYmFua19iYXNlID0gY3Ry bC0+cmVncyArIE5BTkRDX1JFR19CQU5LMCArCj4gPj4gKwkJCQkgIGN0cmwtPnNlbGVjdGVkX2Jh bmsgKiAweDEwMDsKPiA+PiArCj4gPj4gKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDwgbGVuOyBvZmZz KyspCj4gPj4gKwkJd3JpdGViKGJ1ZltvZmZzXSwgYmFua19iYXNlKTsKPiA+PiArfQo+ID4+ICsK PiA+PiArc3RhdGljIHZvaWQgcmtfbmFuZGNfd3JpdGVfY21kKHN0cnVjdCBuYW5kX2NoaXAgKm5h bmQsIHVpbnQ4X3QKPiA+PiBjbWQpICt7Cj4gPj4gKwlzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVy ICpjdHJsID0KPiA+PiBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEobmFuZCk7ICsKPiA+PiArCXZv aWQgX19pb21lbSAqYmFua19iYXNlID0gY3RybC0+cmVncyArIE5BTkRDX1JFR19CQU5LMCArCj4g Pj4gKwkJCQkgIGN0cmwtPnNlbGVjdGVkX2JhbmsgKiAweDEwMCArCj4gPj4gKwkJCQkgIE5BTkRD X1JFR19DTUQ7ICAKPiA+ICAKPiAKPiA+IFlvdSBtaWdodCB3YW50IHRvIHdyaXRlIGFuIGhlbHBl ciB0byBjYWxjdWxhdGUgYmFua19iYXNlLCB0byBhdm9pZAo+ID4gcmVwZWF0aW5nIHRoZXNlIGxp bmVzLiAgCj4gCj4gRXZlbiB3aXRoIGEgc2VwYXJhdGUgZGVmaW5lIG9yIGhlbHBlciBmdW5jdGlv biBJIHN0aWxsIGhhdmUgdG8gc3VwcGx5Cj4gbXkgcmVnLCBzZWxlY3RlZF9iYW5rIGFuZCBvZmZz ZXQuIEl0IGRvZXNuJ3QgbWFrZSB0aGluZ3MgY2xlYW5lcgo+IHB1bXBpbmcgZGF0ZQo+IHRvIGFu ZCBmcm9tIGEgaGVscGVyIG9yIG5laXRoZXIgZG9lc24ndCBpdCBzaG9ydGVuIG15IHNvdXJjZSB3 aXRoIGEKPiBkZWZpbmUuIFRlbmQgdG8ga2VlcCBpdCBhcyBpdCBpcyBmb3Igbm93LiBJZiB5b3Ug YWdyZWUgb2YgY291cnNlLgoKI2RlZmluZSBSS19SRUcoY3RybCwgb2ZmKSBcCgkoY3RybCktPnJl Z3MgKyBcCglOQU5EQ19SRUdfQkFOSzAgKyBcCgkoY3RybCktPnNlbGVjdGVkX2JhbmsgKiBCQU5L X1NJWkUgKyBcCgkob2ZmKQoKI2RlZmluZSBSS19SRUdfQ01EKGN0cmwpIFJLX1JFRyhjdHJsLCBO QU5EQ19SRUdfQ01EKQoKPiAKPiA+ICAKPiA+PiArCj4gPj4gKwl3cml0ZWIoY21kLCBiYW5rX2Jh c2UpOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9pZCBya19uYW5kY193cml0ZV9hZGRy KHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsIHVpbnQ4X3QKPiA+PiBhZGRyKSArewo+ID4+ICsJc3Ry dWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9nZXRfY29udHJvbGxlcl9k YXRhKG5hbmQpOyArCj4gPj4gKwl2b2lkIF9faW9tZW0gKmJhbmtfYmFzZSA9IGN0cmwtPnJlZ3Mg KyBOQU5EQ19SRUdfQkFOSzAgKwo+ID4+ICsJCQkJICBjdHJsLT5zZWxlY3RlZF9iYW5rICogMHgx MDAgKwo+ID4+ICsJCQkJICBOQU5EQ19SRUdfQUREUjsKPiA+PiArCj4gPj4gKwl3cml0ZWIoYWRk ciwgYmFua19iYXNlKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uYW5kY19k ZXZfcmVhZHkoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCkKPiA+PiArewo+ID4+ICsJc3RydWN0IHJr X25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKG5h bmQpOyArCj4gPj4gKwlpZiAocmVhZGwoY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9GTUNUTCkg Jgo+ID4+IE5BTkRDX1Y2X0ZNX0ZSRUFEWSkKPiA+PiArCQlyZXR1cm4gMTsKPiA+PiArCj4gPj4g KwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uYW5kY19vb2Js YXlvdXRfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQKPiA+PiBzZWN0aW9uLAo+ID4+ICsJ CQkJICBzdHJ1Y3QgbXRkX29vYl9yZWdpb24KPiA+PiAqb29icmVnaW9uKSArewo+ID4+ICsJc3Ry dWN0IG5hbmRfY2hpcCAqbmFuZCA9IG10ZF90b19uYW5kKG10ZCk7Cj4gPj4gKwo+ID4+ICsJaWYg KHNlY3Rpb24gPj0gbmFuZC0+ZWNjLnN0ZXBzKQo+ID4+ICsJCXJldHVybiAtRVJBTkdFOwo+ID4+ ICsKPiA+PiArCW9vYnJlZ2lvbi0+b2Zmc2V0ID0gKG5hbmQtPmVjYy5ieXRlcyArIG5hbmQtPmVj Yy5wcmVwYWQpCj4gPj4gKiBzZWN0aW9uICsKPiA+PiArCQkJICAgIG5hbmQtPmVjYy5wcmVwYWQ7 Cj4gPj4gKwlvb2JyZWdpb24tPmxlbmd0aCA9IG5hbmQtPmVjYy5zdGVwcyAqIG5hbmQtPmVjYy5i eXRlczsKPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGlj IGludCBya19uYW5kY19vb2JsYXlvdXRfZnJlZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50Cj4g Pj4gc2VjdGlvbiwKPiA+PiArCQkJCSAgIHN0cnVjdCBtdGRfb29iX3JlZ2lvbgo+ID4+ICpvb2Jy ZWdpb24pICt7Cj4gPj4gKwlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kID0gbXRkX3RvX25hbmQobXRk KTsKPiA+PiArCj4gPj4gKwlpZiAoc2VjdGlvbiA+PSBuYW5kLT5lY2Muc3RlcHMpCj4gPj4gKwkJ cmV0dXJuIC1FUkFOR0U7Cj4gPj4gKwo+ID4+ICsJb29icmVnaW9uLT5vZmZzZXQgPSAobmFuZC0+ ZWNjLmJ5dGVzICsgbmFuZC0+ZWNjLnByZXBhZCkKPiA+PiAqIHNlY3Rpb247Cj4gPj4gKwlvb2Jy ZWdpb24tPmxlbmd0aCA9IG5hbmQtPmVjYy5zdGVwcyAqIG5hbmQtPmVjYy5wcmVwYWQ7Cj4gPj4g Kwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgbXRkX29vYmxheW91dF9vcHMgcmtfbmFuZGNfb29iX29wcyA9IHsKPiA+PiArCS5lY2MgPSBy a19uYW5kY19vb2JsYXlvdXRfZWNjLAo+ID4+ICsJLmZyZWUgPSBya19uYW5kY19vb2JsYXlvdXRf ZnJlZSwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lkIHJrX25hbmRjX2ZyZWVfYnVm ZmVyKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQpCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBya19uYW5k X2NvbnRyb2xsZXIgKmN0cmwgPQo+ID4+IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsg Kwo+ID4+ICsJa2ZyZWUoY3RybC0+cGFnZV9idWYpOwo+ID4+ICsJa2ZyZWUoY3RybC0+b29iX2J1 Zik7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyBpbnQgcmtfbmFuZGNfYnVmZmVyX2luaXQo c3RydWN0IG5hbmRfY2hpcCAqbmFuZCkKPiA+PiArewo+ID4+ICsJc3RydWN0IG10ZF9pbmZvICpt dGQgPSBuYW5kX3RvX210ZChuYW5kKTsKPiA+PiArCXN0cnVjdCBya19uYW5kX2NvbnRyb2xsZXIg KmN0cmwgPQo+ID4+IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsgKwo+ID4+ICsJY3Ry bC0+cGFnZV9idWYgPSBrbWFsbG9jKG10ZC0+d3JpdGVzaXplLCBHRlBfS0VSTkVMIHwKPiA+PiBH RlBfRE1BKTsgIAo+ID4gIAo+IAo+ID4gZGV2aWNlIG1hbmFnZWQgYWxsb2NhdGlvbnMgKGRldm1f Li4uKSB3b3VsZCBiZSBuaWNlICAKPiAKPiBkZXZtX2t6YWxsb2MoKSBuZWVkcyBhbiBleHRyYSBz dHJ1Y3QgZGV2aWNlLgo+IERvZXMgTVREIHNhZmUtZ2FyZCB0aGUgY29ycmVjdCBvcmRlciB0byBk ZXRhY2ggZnJvbSBzdHJ1Y3QKPiBya19uYW5kX2NvbnRyb2xsZXIKPiB3aXRob3V0IHJrX25hbmRj X2ZyZWVfYnVmZmVyKCk/CgomcGRldi0+ZGV2IGlzIGZpbmUsIHlvdSBjYW4gc2F2ZSBpdCB5b3Vy IG93biBuYW5kIGNvbnRyb2xsZXIgc3RydWN0dXJlLgoKSSB0aGluayBhY2Nlc3NpbmcgbXRkLT5k ZXYgaXMgbm90IGFsbG93ZWQgYmVmb3JlIHRoZSByZWdpc3RyYXRpb24gb2YKdGhlIE1URCBkZXZp Y2UgdGhvdWdoLgoKPiAKPiA+ICAKPiA+PiArCWlmICghY3RybC0+cGFnZV9idWYpCj4gPj4gKwkJ cmV0dXJuIC1FTk9NRU07Cj4gPj4gKwo+ID4+ICsJY3RybC0+b29iX2J1ZiA9IGttYWxsb2MobmFu ZC0+ZWNjLnN0ZXBzICogMTI4LCBHRlBfS0VSTkVMCj4gPj4gfCBHRlBfRE1BKTsKPiA+PiArCWlm ICghY3RybC0+b29iX2J1Zikgewo+ID4+ICsJCWtmcmVlKGN0cmwtPnBhZ2VfYnVmKTsKPiA+PiAr CQlyZXR1cm4gLUVOT01FTTsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiAr fQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19uYW5kY19od19lY2NfY3RybF9pbml0KHN0cnVj dCBuYW5kX2NoaXAgKm5hbmQpCj4gPj4gK3sKPiA+PiArCXVpbnQ4X3Qgc3RyZW5ndGhzX3Y2W10g PSB7NjAsIDQwLCAyNCwgMTZ9Owo+ID4+ICsJdWludDhfdCBzdHJlbmd0aHNfdjlbXSA9IHs3MCwg NjAsIDQwLCAxNn07Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKG5h bmQpOwo+ID4+ICsJc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9Cj4gPj4gbmFuZF9n ZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+ID4+ICsJaW50IG1heF9zdHJlbmd0aDsKPiA+PiAr CXVpbnQzMl90IGksIHZlcjsKPiA+PiArCj4gPj4gKwlpZiAobmFuZC0+b3B0aW9ucyAmIE5BTkRf SVNfQk9PVF9NRURJVU0pCj4gPj4gKwkJY3RybC0+Ym9vdHJvbWJsb2NrcyA9IHRydWU7Cj4gPj4g KwllbHNlCj4gPj4gKwkJY3RybC0+Ym9vdHJvbWJsb2NrcyA9IGZhbHNlOwo+ID4+ICsKPiA+PiAr CW5hbmQtPmVjYy5wcmVwYWQgPSA0Owo+ID4+ICsJbmFuZC0+ZWNjLnN0ZXBzID0gbXRkLT53cml0 ZXNpemUgLyBuYW5kLT5lY2Muc2l6ZTsKPiA+PiArCj4gPj4gKwltYXhfc3RyZW5ndGggPSAoKG10 ZC0+b29ic2l6ZSAvIG5hbmQtPmVjYy5zdGVwcykgLSA0KSAqIDgKPiA+PiAvIDE0Owo+ID4+ICsJ aWYgKGN0cmwtPnZlcnNpb24gPT0gVkVSU0lPTl85KSB7Cj4gPj4gKwkJY3RybC0+bWF4X2VjY19z dHJlbmd0aCA9IDcwOwo+ID4+ICsJCXZlciA9IHJlYWRsKGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdf VjlfVkVSKTsKPiA+PiArCQlpZiAodmVyICE9IE5BTkRDX0lEX1Y5MDApCj4gPj4gKwkJCWRldl9l cnIobXRkLT5kZXYucGFyZW50LAo+ID4+ICsJCQkJInVuc3VwcG9ydGVkIG5hbmRjIHZlcnNpb24g JXhcbiIsCj4gPj4gdmVyKTsgKwo+ID4+ICsJCWlmIChtYXhfc3RyZW5ndGggPiBjdHJsLT5tYXhf ZWNjX3N0cmVuZ3RoKQo+ID4+ICsJCQltYXhfc3RyZW5ndGggPSBjdHJsLT5tYXhfZWNjX3N0cmVu Z3RoOwo+ID4+ICsKPiA+PiArCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdHJlbmd0aHNf djkpOyBpKyspIHsKPiA+PiArCQkJaWYgKG1heF9zdHJlbmd0aCA+PSBzdHJlbmd0aHNfdjlbaV0p Cj4gPj4gKwkJCQlicmVhazsKPiA+PiArCQl9Cj4gPj4gKwo+ID4+ICsJCWlmIChpID49IEFSUkFZ X1NJWkUoc3RyZW5ndGhzX3Y5KSkgewo+ID4+ICsJCQlkZXZfZXJyKG10ZC0+ZGV2LnBhcmVudCwK PiA+PiArCQkJCSJ1bnN1cHBvcnRlZCBzdHJlbmd0aFxuIik7Cj4gPj4gKwkJCXJldHVybiAtRU5P VFNVUFA7Cj4gPj4gKwkJfQo+ID4+ICsKPiA+PiArCQljdHJsLT5lY2NfbW9kZSA9IHN0cmVuZ3Ro c192OVtpXTsKPiA+PiArCX0gZWxzZSB7Cj4gPj4gKwkJY3RybC0+bWF4X2VjY19zdHJlbmd0aCA9 IDYwOwo+ID4+ICsKPiA+PiArCQl2ZXIgPSByZWFkbChjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2 X1ZFUik7Cj4gPj4gKwkJaWYgKHZlciA9PSBOQU5EQ19JRF9WODAxKQo+ID4+ICsJCQljdHJsLT5t YXhfZWNjX3N0cmVuZ3RoID0gMTY7Cj4gPj4gKwkJZWxzZSBpZiAodmVyID09IE5BTkRDX0lEX1Y2 MDAgfHwKPiA+PiArCQkJIHZlciA9PSBOQU5EQ19JRF9WNjIyIHx8ICAKPiAKPiA+PiArCQkJIHZl ciA9PSBOQU5EQ19JRF9WNzAxIHx8ICAKPiAKPiBBZGRlZCB2ZXJzaW9uIDcgZm9yIFJLMzIyOEEv UkszMjI4Qi4gQ2FuIHNvbWVvbmUgd2l0aCBpbnNpZGVyIGluZm8KPiBjb25maXJtIGlmIHRoaXMg d29ya3Mgb3Igbm90Lgo+IAo+ID4+ICsJCQkgdmVyID09IE5BTkRDX0lEX1Y4MDApCj4gPj4gKwkJ CWN0cmwtPm1heF9lY2Nfc3RyZW5ndGggPSA2MDsKPiA+PiArCQllbHNlCj4gPj4gKwkJCWRldl9l cnIobXRkLT5kZXYucGFyZW50LAo+ID4+ICsJCQkJInVuc3VwcG9ydGVkIG5hbmRjIHZlcnNpb24g JXhcbiIsCj4gPj4gdmVyKTsgKwo+ID4+ICsJCWlmIChtYXhfc3RyZW5ndGggPiBjdHJsLT5tYXhf ZWNjX3N0cmVuZ3RoKQo+ID4+ICsJCQltYXhfc3RyZW5ndGggPSBjdHJsLT5tYXhfZWNjX3N0cmVu Z3RoOwo+ID4+ICsKPiA+PiArCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdHJlbmd0aHNf djYpOyBpKyspIHsKPiA+PiArCQkJaWYgKG1heF9zdHJlbmd0aCA+PSBzdHJlbmd0aHNfdjZbaV0p Cj4gPj4gKwkJCQlicmVhazsKPiA+PiArCQl9Cj4gPj4gKwo+ID4+ICsJCWlmIChpID49IEFSUkFZ X1NJWkUoc3RyZW5ndGhzX3Y2KSkgewo+ID4+ICsJCQlkZXZfZXJyKG10ZC0+ZGV2LnBhcmVudCwK PiA+PiArCQkJCSJ1bnN1cHBvcnRlZCBzdHJlbmd0aFxuIik7Cj4gPj4gKwkJCXJldHVybiAtRU5P VFNVUFA7Cj4gPj4gKwkJfQo+ID4+ICsKPiA+PiArCQljdHJsLT5lY2NfbW9kZSA9IHN0cmVuZ3Ro c192NltpXTsKPiA+PiArCX0KPiA+PiArCXJrX25hbmRjX2h3X2VjY19zZXR1cChuYW5kLCBjdHJs LT5lY2NfbW9kZSk7Cj4gPj4gKwo+ID4+ICsJbXRkX3NldF9vb2JsYXlvdXQobXRkLCAmcmtfbmFu ZGNfb29iX29wcyk7Cj4gPj4gKwo+ID4+ICsJaWYgKG10ZC0+b29ic2l6ZSA8ICgobmFuZC0+ZWNj LmJ5dGVzICsgbmFuZC0+ZWNjLnByZXBhZCkgKgo+ID4+ICsJCQkgICAgbmFuZC0+ZWNjLnN0ZXBz KSkgewo+ID4+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCXJldHVy biAwOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9pZCBya19uYW5kY19kZXRhY2hfY2hp cChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQo+ID4+ICt7Cj4gPj4gKwlzd2l0Y2ggKG5hbmQtPmVj Yy5tb2RlKSB7Cj4gPj4gKwljYXNlIE5BTkRfRUNDX0hXX1NZTkRST01FOgo+ID4+ICsJCXJrX25h bmRjX2ZyZWVfYnVmZmVyKG5hbmQpOwo+ID4+ICsJCWJyZWFrOwo+ID4+ICsJZGVmYXVsdDoKPiA+ PiArCQlicmVhazsKPiA+PiArCX0KPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBya19u YW5kY19hdHRhY2hfY2hpcChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQo+ID4+ICt7Cj4gPj4gKwlz dHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKG5hbmQpOwo+ID4+ICsJaW50IHJldDsK PiA+PiArCj4gPj4gKwlzd2l0Y2ggKG5hbmQtPmVjYy5tb2RlKSB7Cj4gPj4gKwljYXNlIE5BTkRf RUNDX0hXX1NZTkRST01FOgo+ID4+ICsJCXJldCA9IHJrX25hbmRjX2h3X2VjY19jdHJsX2luaXQo bmFuZCk7Cj4gPj4gKwkJaWYgKHJldCkKPiA+PiArCQkJcmV0dXJuIHJldDsKPiA+PiArCQlyZXQg PSBya19uYW5kY19idWZmZXJfaW5pdChuYW5kKTsKPiA+PiArCQlpZiAocmV0KQo+ID4+ICsJCQly ZXR1cm4gLUVOT01FTTsKPiA+PiArCQluYW5kLT5lY2MucmVhZF9wYWdlID0KPiA+PiBya19uYW5k Y19od19zeW5kcm9tZV9lY2NfcmVhZF9wYWdlOwo+ID4+ICsJCW5hbmQtPmVjYy53cml0ZV9wYWdl ID0KPiA+PiBya19uYW5kY19od19zeW5kcm9tZV9lY2Nfd3JpdGVfcGFnZTsKPiA+PiArCQluYW5k LT5lY2MucmVhZF9vb2IgPSBya19uYW5kY19od19lY2NfcmVhZF9vb2I7Cj4gPj4gKwkJbmFuZC0+ ZWNjLndyaXRlX29vYiA9IHJrX25hbmRjX2h3X2VjY193cml0ZV9vb2I7Cj4gPj4gKwkJYnJlYWs7 Cj4gPj4gKwljYXNlIE5BTkRfRUNDX0hXOiAgCj4gPgo+ID4gSSB3b3VsZCBlaXRoZXIgcmVmdXNl IEVDQ19IVyBvciBwdXQgaXQgYmVzaWRlcyBIV19TWU5EUk9NRS4gIAo+IAo+IElzIHRoZXJlIGEg ZnVuZGFtZW50YWwgZGlmZmVyZW5jZSBpbiBoYW5kbGluZyBFQ0NfSFcgYW5kIEhXX1NZTkRST01F Cj4gZnJvbSB0aGUgTVREIHBvaW50IG9mIHZpZXc/IE90aGVyIHRoZW4gYSBpbmRpY2F0aW9uIGhv dyBpdCdzIGRvbmUgb24KPiB0aGUgZHJpdmVyIHNpZGU/CgpJIGRvbid0IHRoaW5rIHNvLi4KCj4g V2lsbCBkcm9wIGl0Lgo+IAo+ID4gIAo+ID4+ICsJY2FzZSBOQU5EX0VDQ19OT05FOgo+ID4+ICsJ Y2FzZSBOQU5EX0VDQ19TT0ZUOiAgCj4gPiAgCj4gCj4gPiBIYXZlIHlvdSB0ZXN0ZWQgd2l0aCBT VyBCQ0g/ICAKPiAKPiBTaG9ydCBhbnN3ZXI6IE5vCj4gSnVzdCBjb3BpZWQgaXQgZnJvbSB0aGUg b3JpZ2luYWwuCj4gUGxlYXNlIGFkdmlzZSBhIHRvb2wgdG8gZG8gYSB0ZXN0IGJldHdlZW4gdGhl IGluZGl2aWR1YWwgZWNjIHJlYWQKPiBvcHRpb25zLiBPciBkbyBJIGhhdmUgdG8gd3JpdGUgdGhl IHRvb2wgbXkgc2VsZiB3aXRoIG10ZC11dGlscz8KCkFsbCB0aGUgdG9vbHMgYXJlIGFscmVhZHkg YXZhaWxhYmxlLiBuYW5kX3Rlc3QsIGZsYXNoX3NwZWVkLApuYW5kYml0ZXJycyAtaSwgZXRjCgo+ IAo+ID4gIAo+ID4+ICsJCWJyZWFrOwo+ID4+ICsJZGVmYXVsdDoKPiA+PiArCQlyZXR1cm4gLUVJ TlZBTDsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlyZXR1cm4gMDsKPiA+PiArfQo+ID4+ICsKPiA+ PiArc3RhdGljIGludCBya19uYW5kY19leGVjX29wKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsCj4g Pj4gKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmFuZF9vcGVyYXRpb24gKm9wLAo+ID4+ICsJCQkgICAg Ym9vbCBjaGVja19vbmx5KQo+ID4+ICt7Cj4gPj4gKwlpbnQgaTsKPiA+PiArCXVuc2lnbmVkIGlu dCBvcF9pZDsKPiA+PiArCWNvbnN0IHN0cnVjdCBuYW5kX29wX2luc3RyICppbnN0ciA9IE5VTEw7 Cj4gPj4gKwo+ID4+ICsJcmtfbmFuZGNfc2VsZWN0X2NoaXAobmFuZCwgb3AtPmNzKTsKPiA+PiAr Cj4gPj4gKwlpZiAoY2hlY2tfb25seSkKPiA+PiArCQlyZXR1cm4gMDsKPiA+PiArCj4gPj4gKwlm b3IgKG9wX2lkID0gMDsgb3BfaWQgPCBvcC0+bmluc3Ryczsgb3BfaWQrKykgewo+ID4+ICsJCWlu c3RyID0gJm9wLT5pbnN0cnNbb3BfaWRdOwo+ID4+ICsKPiA+PiArCQlzd2l0Y2ggKGluc3RyLT50 eXBlKSB7Cj4gPj4gKwkJY2FzZSBOQU5EX09QX0NNRF9JTlNUUjoKPiA+PiArCQkJcmtfbmFuZGNf d3JpdGVfY21kKG5hbmQsCj4gPj4gaW5zdHItPmN0eC5jbWQub3Bjb2RlKTsKPiA+PiArCQkJYnJl YWs7Cj4gPj4gKwkJY2FzZSBOQU5EX09QX0FERFJfSU5TVFI6Cj4gPj4gKwkJCWZvciAoaSA9IDA7 IGkgPCBpbnN0ci0+Y3R4LmFkZHIubmFkZHJzOwo+ID4+IGkrKykKPiA+PiArCQkJCXJrX25hbmRj X3dyaXRlX2FkZHIobmFuZCwKPiA+PiArCj4gPj4gaW5zdHItPmN0eC5hZGRyLmFkZHJzW2ldKTsK PiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJY2FzZSBOQU5EX09QX0RBVEFfSU5fSU5TVFI6Cj4gPj4g KwkJCXJrX25hbmRjX3JlYWRfYnVmKG5hbmQsCj4gPj4gaW5zdHItPmN0eC5kYXRhLmJ1Zi5pbiwK PiA+PiArCQkJCQkgIGluc3RyLT5jdHguZGF0YS5sZW4pOwo+ID4+ICsJCQlicmVhazsKPiA+PiAr CQljYXNlIE5BTkRfT1BfREFUQV9PVVRfSU5TVFI6Cj4gPj4gKwkJCXJrX25hbmRjX3dyaXRlX2J1 ZihuYW5kLAo+ID4+IGluc3RyLT5jdHguZGF0YS5idWYub3V0LAo+ID4+ICsJCQkJCSAgIGluc3Ry LT5jdHguZGF0YS5sZW4pOwo+ID4+ICsJCQlicmVhazsKPiA+PiArCQljYXNlIE5BTkRfT1BfV0FJ VFJEWV9JTlNUUjoKPiA+PiArCQkJcmtfbmFuZGNfZGV2X3JlYWR5KG5hbmQpOwo+ID4+ICsJCQli cmVhazsKPiA+PiArCQl9Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICsJcmV0dXJuIDA7Cj4gPj4gK30K PiA+PiArCj4gPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmFuZF9jb250cm9sbGVyX29wcyBya19u YW5kX2NvbnRyb2xsZXJfb3BzID0gewo+ID4+ICsJLmF0dGFjaF9jaGlwID0gcmtfbmFuZGNfYXR0 YWNoX2NoaXAsCj4gPj4gKwkuZGV0YWNoX2NoaXAgPSBya19uYW5kY19kZXRhY2hfY2hpcCwKPiA+ PiArCS5leGVjX29wID0gcmtfbmFuZGNfZXhlY19vcCwKPiA+PiArfTsKPiA+PiArCj4gPj4gK3N0 YXRpYyBpbnQgcmtfbmFuZGNfY2hpcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKPiA+PiArCQkJ ICAgICAgc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCwKPiA+PiArCQkJICAgICAgc3Ry dWN0IGRldmljZV9ub2RlICpucCwgdW5zaWduZWQKPiA+PiBpbnQgY2hpcG5yKSArewo+ID4+ICsJ c3RydWN0IHJrX25hbmRfY2hpcCAqbm9kZTsKPiA+PiArCXN0cnVjdCBuYW5kX2NoaXAgKm5hbmQ7 Cj4gPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKPiA+PiArCWNvbnN0IF9fYmUzMiAqcmVnOwo+ ID4+ICsJaW50IHJldDsKPiA+PiArCj4gPj4gKwlyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJy ZWciLCBOVUxMKTsKPiA+PiArCWlmICghcmVnKQo+ID4+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4+ ICsKPiA+PiArCWN0cmwtPmJhbmtzW2NoaXBucl0gPSBiZTMyX3RvX2NwdSgqcmVnKTsKPiA+PiAr Cj4gPj4gKwlpZiAoY3RybC0+YmFua3NbY2hpcG5yXSA8IDApCj4gPj4gKwkJcmV0dXJuIC1FSU5W QUw7Cj4gPj4gKwo+ID4+ICsJbm9kZSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbm9kZSks IEdGUF9LRVJORUwpOwo+ID4+ICsJaWYgKCFub2RlKQo+ID4+ICsJCXJldHVybiAtRU5PTUVNOwo+ ID4+ICsKPiA+PiArCW5hbmQgPSAmbm9kZS0+bmFuZDsKPiA+PiArCj4gPj4gKwluYW5kX3NldF9m bGFzaF9ub2RlKG5hbmQsIG5wKTsKPiA+PiArCW5hbmRfc2V0X2NvbnRyb2xsZXJfZGF0YShuYW5k LCBjdHJsKTsKPiA+PiArCj4gPj4gKwluYW5kLT5jb250cm9sbGVyID0gJmN0cmwtPmNvbnRyb2xs ZXI7Cj4gPj4gKwluYW5kLT5jb250cm9sbGVyLT5vcHMgPSAmcmtfbmFuZF9jb250cm9sbGVyX29w czsKPiA+PiArCj4gPj4gKwluYW5kLT5lY2MubW9kZSA9IE5BTkRfRUNDX0hXX1NZTkRST01FOwo+ ID4+ICsJbmFuZC0+ZWNjLnNpemUgPSAxMDI0Owo+ID4+ICsJbmFuZC0+ZWNjLnN0cmVuZ3RoID0g NDA7Cj4gPj4gKwo+ID4+ICsJbmFuZC0+b3B0aW9ucyA9IE5BTkRfU0tJUF9CQlRTQ0FOIHwgTkFO RF9OT19TVUJQQUdFX1dSSVRFOwo+ID4+ICsKPiA+PiArCW10ZCA9IG5hbmRfdG9fbXRkKG5hbmQp Owo+ID4+ICsJbXRkLT5kZXYucGFyZW50ID0gZGV2Owo+ID4+ICsJbXRkLT5uYW1lID0gZGV2bV9r YXNwcmludGYoZGV2LCBHRlBfS0VSTkVMLCAiJXMuJWQiLAo+ID4+IGRldl9uYW1lKGRldiksCj4g Pj4gKwkJCQkgICBjdHJsLT5iYW5rc1tjaGlwbnJdKTsKPiA+PiArCj4gPj4gKwlyZXQgPSBuYW5k X3NjYW4obmFuZCwgMSk7ICAKPiA+Cj4gPiBXaHkgMSBoZXJlPyAgCj4gCj4gVE9ETyBmb3IgdmVy c2lvbiAyLgo+IEEgbGl0dGxlIG1pc3VuZGVyc3RhbmRpbmcgb24gaG93IGZvcl9lYWNoX2NoaWxk X29mX25vZGUgd29ya3MuCj4gQWxsIGNoaXBzIHNob3VsZCBiZSBzY2FubmVkLgo+IC8vLy8vCj4g RGVyaXZlIGNoaXBucgo+IEV4YW1wbGUgZnJvbSBzdW54aV9uYW5kLmMKPiAKPiAJaWYgKCFvZl9n ZXRfcHJvcGVydHkobnAsICJyZWciLCAmbnNlbHMpKQo+IAkJcmV0dXJuIC1FSU5WQUw7Cj4gCj4g CW5zZWxzIC89IHNpemVvZih1MzIpOwo+IAlpZiAoIW5zZWxzKSB7Cj4gCQlkZXZfZXJyKGRldiwg ImludmFsaWQgcmVnIHByb3BlcnR5IHNpemVcbiIpOwo+IAkJcmV0dXJuIC1FSU5WQUw7Cj4gCX0K PiAvLy8vLwo+IEZyb20gcmtfbmFuZGNfY2hpcHNfaW5pdCgpCj4gCj4gCWZvcl9lYWNoX2NoaWxk X29mX25vZGUobnAsIG5hbmRfbnApIHsKPiAJCXJldCA9IHJrX25hbmRjX2NoaXBfaW5pdChkZXYs IGN0cmwsIG5hbmRfbnAsIGkpOwo+IAo+IFdoeSBkb2VzIHN1bnhpX25hbmQuYyBuZWVkIHRoaXMg ZXh0cmEgZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZT8KCmZvcl9lYWNoX2NoaWxkX29mX25vZGUgd2ls bCBsb29wIG92ZXIgYWxsIHRoZSBOQU5EIGNoaXBzIHRoYXQgYXJlCmNvbm5lY3RlZCB0byB0aGUg TkFORCBjb250cm9sbGVyLgoKWW91IG1heSBoYXZlIC1kZXBlbmRpbmcgb24gdGhlIE5BTkQgY29u dHJvbGxlci0gbW9yZSB0aGFuIG9uZSBDUyBwZXIKY2hpcC4KCgpbLi4uXQoKPiA+PiArCW5vZGUg PSBwZGV2LT5kZXYub2Zfbm9kZTsKPiA+PiArCj4gPj4gKwlpZCA9IG9mX2FsaWFzX2dldF9pZChu b2RlLCAibmFuZGMiKTsKPiA+PiArCWlmIChpZCA8IDApCj4gPj4gKwkJaWQgPSBnX2lkX2NvdW50 ZXI7Cj4gPj4gKwlpZiAoKGlkID49IEFSUkFZX1NJWkUoZ19uYW5kY19pbmZvKSB8fAo+ID4+IGdf bmFuZGNfaW5mb1tpZF0ucmVncykpIHsKPiA+PiArCQlkZXZfZXJyKAo+ID4+ICsJCQkmcGRldi0+ ZGV2LAo+ID4+ICsJCQkiZmFpbGVkIHRvIGdldCBpZCBmb3IgbmFuZGMgbm9kZQo+ID4+ICclcE9G bidcbiIsCj4gPj4gKwkJCW5vZGUpOwo+ID4+ICsJCW9mX25vZGVfcHV0KG5vZGUpOwo+ID4+ICsJ CXJldHVybiAtRU5PREVWOwo+ID4+ICsJfQo+ID4+ICsJKytnX2lkX2NvdW50ZXI7ICAKPiAKPiBT ZWUgY29tbWVudHMgYWJvdmUgYWJvdXQgUmszMjg4LiBLZWVwaW5nIHRyYWNrIG5vZGUgYWxpYXMg Zm9yIG5hbmRjMC4KPiBUbyByZW1vdmUgb3Igbm90PwoKWW91IG1heSBrZWVwIGEgc3RhdGljIHZh cmlhYmxlIHRvIHBvaW50IHRvIGFuIGFycmF5IG9yIGhhdmUgYSBzdGF0aWMKY291bnRlciB0aGF0 IHlvdSBpbmNyZW1lbnQsIGJ1dCBkZWZpbml0ZWx5IG5vdCBzdGF0aWMgc3RydWN0dXJlcyB0aGF0 CndvdWxkIGJlIHNoYXJlZC4gSWYgdGhlcmUgYXJlIHR3byBkaXN0aW5jdCBOQU5EIGNvbnRyb2xs ZXJzLCB5b3UgbXVzdApoYXZlIGRpc3RpbmN0IHBhdGgvc3RydWN0dXJlcy4KCi0+cHJvYmUoKSB3 aWxsIGJlIHJ1biBvbmNlIGZvciBlYWNoIE5BTkQgY29udHJvbGxlci4KCgpUaGFua3MsCk1pcXXD qGwKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4 LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFy bS1rZXJuZWwK 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 X-Spam-Level: X-Spam-Status: No, score=-7.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 545F6C33CB0 for ; Mon, 13 Jan 2020 14:16:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 20B8624670 for ; Mon, 13 Jan 2020 14:16:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729017AbgAMOPk convert rfc822-to-8bit (ORCPT ); Mon, 13 Jan 2020 09:15:40 -0500 Received: from relay8-d.mail.gandi.net ([217.70.183.201]:47305 "EHLO relay8-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728512AbgAMOPi (ORCPT ); Mon, 13 Jan 2020 09:15:38 -0500 X-Originating-IP: 90.76.211.102 Received: from xps13 (lfbn-tou-1-1151-102.w90-76.abo.wanadoo.fr [90.76.211.102]) (Authenticated sender: miquel.raynal@bootlin.com) by relay8-d.mail.gandi.net (Postfix) with ESMTPSA id 5D4F31BF20B; Mon, 13 Jan 2020 14:15:30 +0000 (UTC) Date: Mon, 13 Jan 2020 15:15:29 +0100 From: Miquel Raynal To: Johan Jonker Cc: richard@nod.at, vigneshr@ti.com, robh+dt@kernel.org, mark.rutland@arm.com, heiko@sntech.de, linux-mtd@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [RFC PATCH v1 02/10] mtd: nand: raw: add rockchip nand controller driver Message-ID: <20200113151529.1ecba50e@xps13> In-Reply-To: <7a477af0-1448-4f26-4004-9331978e824c@gmail.com> References: <20200108205338.11369-1-jbx6244@gmail.com> <20200108205338.11369-3-jbx6244@gmail.com> <20200110120534.1b4026b0@xps13> <7a477af0-1448-4f26-4004-9331978e824c@gmail.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.4 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Hi Johan, Johan Jonker wrote on Sun, 12 Jan 2020 18:26:20 +0100: > Hi Miquel, > > Thank you for your detailed and useful review. > > Without manufacturer support I must scrape my information > from all over the internet, together with slow interpretation of > Rockchip drivers. > So please have some patience with my updates and new versions. There is absolutely no hurry, it is great that you work on this! > > Below are some comments and questions in random order. > > ///////////////////////////// > > To prevent guessing games could you confirm the following names: > > driver file name: rockchip-nand-controller.c Fine > document file name: rockchip-nand-controller.yaml I think rockchip,nand-controller.yaml is preferred. > > compatible: "rockchip,nandc-v6" rockchip,nand-controller-v6 > compatible: "rockchip,nandc-v9" same as above with -v9 as suffix. [...] > Jan 1 00:02:27 mk808 kernel: [ 147.053388] nand: 8192 MiB, MLC, erase Just to be clear, MLC is not yet supported in mainline. There is a patch series that aims at supporting MLC in pseudo-SLC mode but do not use MLC as a reliable storage medium. > size: 2048 KiB, page size: 8192, OOB size: 640 > Jan 1 00:02:27 mk808 kernel: [ 147.054050] rockchip-nandc > 10500000.nand-controller: nand->numchips = 1 > Jan 1 00:02:27 mk808 kernel: [ 147.054740] rockchip-nandc > 10500000.nand-controller: nand->chipsize = 8589934592 > Jan 1 00:02:27 mk808 kernel: [ 147.055380] rockchip-nandc > 10500000.nand-controller: nand->pagemask = fffff > Jan 1 00:02:27 mk808 kernel: [ 147.055994] rockchip-nandc > 10500000.nand-controller: nand->badblockpos = 0 > Jan 1 00:02:27 mk808 kernel: [ 147.056591] rockchip-nandc > 10500000.nand-controller: nand->chip_shift = 33 > Jan 1 00:02:27 mk808 kernel: [ 147.057174] rockchip-nandc > 10500000.nand-controller: nand->page_shift = 13 > Jan 1 00:02:27 mk808 kernel: [ 147.057751] rockchip-nandc > 10500000.nand-controller: nand->phys_erase_shift = 21 > Jan 1 00:02:27 mk808 kernel: [ 147.058366] rockchip-nandc > 10500000.nand-controller: nand->ecc.mode = 3 > Jan 1 00:02:27 mk808 kernel: [ 147.058920] rockchip-nandc > 10500000.nand-controller: nand->ecc.steps = 8 > Jan 1 00:02:27 mk808 kernel: [ 147.059481] rockchip-nandc > 10500000.nand-controller: nand->ecc.bytes = 70 > Jan 1 00:02:27 mk808 kernel: [ 147.060049] rockchip-nandc > 10500000.nand-controller: nand->ecc.total = 0 > Jan 1 00:02:27 mk808 kernel: [ 147.060607] rockchip-nandc > 10500000.nand-controller: nand->ecc.prepad = 4 > Jan 1 00:02:27 mk808 kernel: [ 147.061175] rockchip-nandc > 10500000.nand-controller: nand->ecc.size = 1024 > Jan 1 00:02:27 mk808 kernel: [ 147.061748] rockchip-nandc > 10500000.nand-controller: nand->ecc.strength = 40 > Jan 1 00:02:27 mk808 kernel: [ 147.062341] rockchip-nandc > 10500000.nand-controller: mtd->ooblayout = 91ce9ce2 > Jan 1 00:02:27 mk808 kernel: [ 147.062943] rockchip-nandc > 10500000.nand-controller: mtd->flags = 00000000 > Jan 1 00:02:27 mk808 kernel: [ 147.063518] rockchip-nandc > 10500000.nand-controller: mtd->size = 8589934592 > Jan 1 00:02:27 mk808 kernel: [ 147.064098] rockchip-nandc > 10500000.nand-controller: mtd->erasesize = 2097152 > Jan 1 00:02:27 mk808 kernel: [ 147.064815] rockchip-nandc > 10500000.nand-controller: mtd->writesize = 8192 > Jan 1 00:02:27 mk808 kernel: [ 147.065413] rockchip-nandc > 10500000.nand-controller: mtd->oobsize = 640 > Jan 1 00:02:27 mk808 kernel: [ 147.068985] 1 fixed-partitions > partitions found on MTD device 10500000.nand-controller.0 > Jan 1 00:02:27 mk808 kernel: [ 147.069190] Creating 1 MTD partitions > on "10500000.nand-controller.0": > Jan 1 00:02:27 mk808 kernel: [ 147.072375] > 0x000000000000-0x000000400000 : "parameter" > > > Jan 1 00:02:27 mk808 kernel: [ 147.075649] rockchip-nandc > 10500000.nand-controller: R:0x00ff cs:0 > Jan 1 00:02:27 mk808 kernel: [ 147.079423] rockchip-nandc > 10500000.nand-controller: R:0x01ff cs:0 > > > Despite nand->options = NAND_SKIP_BBTSCAN. > > What is the reason for these 2 rk_nandc_hw_syndrome_ecc_read_page() > commands at page R:0x00ff and R:0x01ff right after creating > partitions. > > When enabled BBTSCAN MTD starts to store at all kind of places. Can > you state Please do not mix the two concepts: - on chip bbt: the last blocks will be used to store the BB, without, the BBT must be reconstructed by reading all the blocks. - SKIP_BBT_SCAN: do not construct the BBT in RAM. Please trace the calls (dump_stack() might help you) to see what function actually calls the ->read_page() helpers. > there page address logic, ie. Would that damage the excisting Rockchip > layout? I don't know about the existing Rockchip layout. > > ///////////////////////////// > > No bad block support > > Based on: > drivers: mtd: nand: rockchip nandc add bad block detect api > https://github.com/rockchip-linux/u-boot/commit/ > 7aec704a4e9d9322f1102bcf61ee5c3cf6ec794d > > rockchip: drivers: mtd: nand: modify the bad block detection process > https://github.com/rockchip-linux/u-boot/commit/ > d6d708d1a329a6369143e8dd34cf4e2c81d5d92f > > BCH | oob size > ------------------------ > 16: bytes: 28 + 4 = 32 > 24: bytes: 42 + 4 = 46 > 40: bytes: 70 + 4 = 74 > 60: bytes: 106 + 4 = 110 > > The data layout that is written by an internal Rockchip nandc dma is: > 1024 bytes data + 32 obb + 1024 data + 32 obb ... > > The MTD system however tries to detect bad block flags located at: > 2048, 4096, 8192... Bad block flags (so called bad block markers, abreviated BBM) are the first two bytes of the OOB. A page is always: No matter the way this is stored on the NAND chip, the user is expecting all the data bytes together and all the OOB bytes together. You must reconstruct this. > The system checks for bad blocks and looks at the wrong bad block > marker location. > Yifeng Zhao proposes to add a bad block detecting strategy by doing > a read with rk_nandc_hw_syndrome_ecc_read_page() first, > if failure then assume it's still raw unwritten NAND and test bytes > are at the position MTD normaly would check for right from the > factory. When this function is used on a FTL controlled NAND it > creates an awful lot of errors in the kernel log, because it uses the > BB marker for dirty tag tricks for there data storage. > So what is good for a raw empty NAND without FTL > does not work for the majority of Rockchip devices I think. > > Please advise for other options. That's sad that Rockchip BSP does not follow standard rules, but IMHO this kind of research logic is way too much error prone and this is not somehting we want to play with: if you start a mainline kernel with a wrong logic, then later you fix the logic in mainline, you must support the broken logic forever. This means you cannot boot a vendor kernel and a mainline kernel on the same platform anymore. This is sad but we cannot fight against it. Unless, as I am pointing it out above, you can simply reconstruct the page to offer a linear data+OOB layout. > static uint8_t rk_nand_read_byte(struct nand_chip *nand) > { > uint8_t ret; > > rk_nand_read_buf(nand, &ret, 1); > > return ret; > } > > static int rk_nand_block_bad(struct nand_chip *nand, loff_t ofs) > { > struct mtd_info *mtd = nand_to_mtd(nand); > int page, res = 0; > u16 bad = 0xff; > u8 *buf = nand_get_data_buf(nand); > int chipnr = (int)(ofs >> nand->chip_shift); > > page = (int)(ofs >> nand->page_shift) & nand->pagemask; > rk_nand_select_chip(nand, chipnr); > if (rk_nand_hw_syndrome_ecc_read_page(nand, buf, false, page) > == -1) { /* first page of a block*/ > nand_read_page_op(nand, page, nand->badblockpos, > NULL, 0); bad = rk_nand_read_byte(nand); > if (bad != 0xFF) > res = 1; > /* second page of a block*/ > nand_read_page_op(nand, page + 1, nand->badblockpos, > NULL, 0); bad = rk_nand_read_byte(nand); > if (bad != 0xFF) > res = 1; > /* last page of a block */ > page += ((mtd->erasesize - mtd->writesize) >> > nand->chip_shift); page--; > nand_read_page_op(nand, page, nand->badblockpos, > NULL, 0); bad = rk_nand_read_byte(nand); > if (bad != 0xFF) > res = 1; > } > rk_nand_select_chip(nand, -1); > return res; > } > > This also requires a patch for nand_bbt.c > As I try to get to get some shape in the rest of this driver, > I have left it out for version 1 and as I wait for our respons first. > > drivers/mtd/nand/nand_bbt.c > @@ -487,8 +487,10 @@ static int create_bbt(struct mtd_info *mtd, > uint8_t *buf, > int ret; > > BUG_ON(bd->options & NAND_BBT_NO_OOB); > > ret = scan_block_fast(mtd, bd, from, buf, numpages); > if (this->block_bad) > ret = this->block_bad(mtd, from); > else > ret = scan_block_fast(mtd, bd, from, buf, > numpages); > > ///////////////////////////// > > Data structures/Partitions > > The majority of Rockchip devices use a closed source FTL driver, > so when we want to read or write we must deal with it. > > Example MTD string: > mtdparts=rk29xxnand: > 0x00002000@0x00002000(misc), > 0x00008000@0x00004000(kernel), > 0x00008000@0x0000C000(boot), > 0x00008000@0x00014000(recovery), > 0x000C0000@0x0001C000(backup), > 0x00040000@0x000DC000(cache), > 0x00300000@0x0011C000(userdata), > 0x00002000@0x0041C000(kpanic), > 0x00200000@0x0041E000(system), > -@0x0063E000(user)" > > When Rockchip mentions a string like this it has nothing to do > with the real position on NAND. FTL write where wants, > so reading there is not useful. > All sizes have to be multiplied by 512 and casted to (u64)! > All partitions need to contain at least 2 erase blocks. > One for normal use and one spare. I don't think trying to mimic Rockchip FTL is wise. We will not use the FTL in a mainline kernel but very likely: UBI/UBIFS. > -------------------- > FlashSavePhyInfo > RawIdbData > -------------------- > ... > FTL data > ... > -------------------- > Map blocks: > + L2pMapInfo > + VendorBlkInfo > > Sys info: > + sys_save_data > > Vendor partition: > + sys_ext_data 0 > + ect_tbl_info 64 > + vendor 256 + ? > + BootConfig 512 + 0 > + DrmKeyInfo 512 + 1 > + Vendor0Info 512 + 2 > + Vendor1Info 512 + 3 > + sys 512 + ? > + public key 520 > -------------------- > Bad Block Map Tbl(not compatible with MTD) > -------------------- > reserved: last NAND block - n > -------------------- > > From the above diagram only RawIdbData has to be located in the first > erase block. > Boot ROM searches for the tag ID_IDRW = 0xFCDC8C3B. > Only the first 4 sections (4*1024) of a page are used. > When writing multiple pages extra spaces in the data > for between the sections are required. > Older cpu's (RK3066) might need extra RC4 coding. > > FTL uses that RawIdbData area unfortunately also to save struct > FlashSavePhyInfo. > For a bare basic application only RawIdbData is needed. > > For users that might consider MTD as a option to do something on a > Rockchip NAND > see the source code below to get an indication of what is needed for a > useful > setup to just read and write a bootloader alone. Writing of any user > partition > is not even included. > Having a basic MTD driver is just not enough. > Please advise if such a overhead can interface with MTD? > Have fun! > > ///////////////////////////// > [...] > >> +#define NANDC_ID_V600 0x56363030 > >> +#define NANDC_ID_V622 0x56363232 > >> +#define NANDC_ID_V701 0x701 > >> +#define NANDC_ID_V800 0x56383030 > >> +#define NANDC_ID_V801 0x801 > >> +#define NANDC_ID_V900 0x56393030 > > > > > I would prefer prefixing everything RK_NANDC_ or RK_ > > Will change define list above and below to RK_NANDC_ > It takes more space though. Already difficult to stay below 80 > char/line. Do your best, if it hurts readability you may break the 80 chars rule. Or try to write it down differently. [...] > >> +struct rk_nand_controller { > >> + void __iomem *regs; > >> + int irq; > >> + struct clk *hclk; > >> + struct clk *clk; > >> + struct list_head chips; > >> + struct completion complete; > >> + struct nand_controller controller; > >> + int banks[NANDC_NUM_BANKS]; > > > >> + bool bootromblocks; > >> + int ecc_mode; > >> + uint32_t ecc_strength; > >> + int max_ecc_strength; > > > > > I have not read yet the entire driver but I believe the above 4 > > parameters should probably be moved in rk_nand_chip, right? Anything > > that is NAND chip related should not be in the controller > > structure. It depends if you can change ECC requirements on the fly > > or not. > > Short answer: > The reason that it is the most convenience place to have them for now. > With one pointer from nand_get_controller_data() I have all data > available. > > struct rk_nand_controller *ctrl = nand_get_controller_data(nand); > > The ECC is now sort of fixed to 24 and 40 for legacy reasons. > The older rk3066 bootrom apparently only works for ecc 24. > See info based on older work by Paweł Jarosz for Uboot. > > I'm not too familiar with all inner working of MTD, so please advise. > Can the users get access to struct rk_nand_chip? > Would you like to give users control over what ecc to use? It is already the case: DT properties in the NAND node (see the bindings). But this is a static information, you cannot change it at run time of course. > What program can we use for that? Can't use dd then any more. You should not use dd at all. dd is for block devices or char devices, not MTD devices. There is an mtd-utils package out there that covers pretty much all the actions you want to. > How do we regain ecc control if we really have to for example rk3066? > Or remove that bootrom check and always set ECC with every > rk_nandc_hw_syndrome_ecc_read_page and > rk_nandc_hw_syndrome_ecc_write_page with whatever passed along? I don't understand your question. [...] > >> +static int rk_nandc_hw_ecc_setup(struct nand_chip *nand, > >> + uint32_t strength) > >> +{ > >> + struct rk_nand_controller *ctrl = > >> nand_get_controller_data(nand); > >> + uint32_t reg; > >> + > >> + nand->ecc.strength = strength; > > Should I add this comment below? > > /* HW ECC always request ECC bytes for 1024 bytes blocks */ > > >> + nand->ecc.bytes = DIV_ROUND_UP(nand->ecc.strength * 14, > >> 8); > > > > > What do 14 and 8 mean? > > fls - find last (most-significant) bit set > > int fls(unsigned int x) > { > int r = 32; > > if (!x) > return 0; > if (!(x & 0xffff0000u)) { > x <<= 16; > r -= 16; > } > if (!(x & 0xff000000u)) { > x <<= 8; > r -= 8; > } > if (!(x & 0xf0000000u)) { > x <<= 4; > r -= 4; > } > if (!(x & 0xc0000000u)) { > x <<= 2; > r -= 2; > } > if (!(x & 0x80000000u)) { > x <<= 1; > r -= 1; > } > return r; > } > > nand->ecc.bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), > 8); > > formule is used to translate strength in bit/1024 BCH/ECC > to MTD ECC bytes for 1024 bytes blocks in nand->ecc.bytes > > 14 is replacement for fls(8 * 1024) This is absolutely forbidden :) You should never hide your first intention, 14 here is a very bad placeholder because we cannot know what it means. I suppose your intention was to optimize things. fls() already exist in the kernel, 8 and 1024 are constants so GCC (or whatever compiler you use) will optimize things as much as it can. Plus, it is run only once in a lifetime so there is not so much gain anyway. > 8 bits in a byte I think there is a macro for that (otherwise it is not important) > > > > >> + /* HW ECC only works with an even number of ECC bytes */ > >> + nand->ecc.bytes = ALIGN(nand->ecc.bytes, 2); > >> + > >> + if (ctrl->version == VERSION_9) { > >> + switch (nand->ecc.strength) { > >> + case 70: > >> + reg = NANDC_V9_ECC_70; > >> + break; > >> + case 60: > >> + reg = NANDC_V9_ECC_60; > >> + break; > >> + case 40: > >> + reg = NANDC_V9_ECC_40; > >> + break; > >> + case 16: > >> + reg = NANDC_V9_ECC_16; > >> + break; > >> + default: > >> + return -EINVAL; > >> + } > >> + writel(reg, ctrl->regs + NANDC_REG_V9_BCHCTL); > >> + } else { > >> + switch (nand->ecc.strength) { > >> + case 60: > >> + reg = NANDC_V6_ECC_60; > >> + break; > >> + case 40: > >> + reg = NANDC_V6_ECC_40; > >> + break; > >> + case 24: > >> + reg = NANDC_V6_ECC_24; > >> + break; > >> + case 16: > >> + reg = NANDC_V6_ECC_16; > >> + break; > >> + default: > >> + return -EINVAL; > >> + } > >> + writel(reg, ctrl->regs + NANDC_REG_V6_BCHCTL); > >> + } > >> + > >> + return 0; > >> +} > >> + > >> +static void rk_nandc_xfer_start(struct rk_nand_controller *ctrl, > >> + uint8_t dir, uint8_t n_KB, > >> + dma_addr_t dma_data, dma_addr_t > >> dma_oob) +{ > >> + uint32_t reg; > >> + > >> + if (ctrl->version == VERSION_9) { > >> + reg = NANDC_V9_DMA_CFG_WR_ST | > >> + NANDC_V9_DMA_CFG_WR(dir) | > >> + NANDC_V9_DMA_CFG_BUS_MODE | > >> + NANDC_V9_DMA_CFG_HSIZE_32 | > >> + NANDC_V9_DMA_CFG_BURST_16 | > >> + NANDC_V9_DMA_CFG_INCR_NUM(16); > >> + writel(reg, ctrl->regs + NANDC_REG_V9_DMA_CFG); > >> + writel((uint32_t)dma_data, ctrl->regs + > >> NANDC_REG_V9_DMA_BUF0); > >> + writel((uint32_t)dma_oob, ctrl->regs + > >> NANDC_REG_V9_DMA_BUF1); > > > > I'm pretty sure most of these writel could be turned into > > writel_relaxed. > > writel() -- write to the little-endian hardware register with > compiler memory barrier, > writel_relaxed -- as above, without barrier, > __raw_writel() -- as above (writel_relaxed()) without endianess > conversion (CPU ordering will be used). > Architecture-dependent. > I don't know. In most of the cases you don't need an explicit barrier (unless, for instance, you are waiting for something to happen with a short timeout). Please try with writel_relaxed in most of the cases. > > > > > Also I am not a big fan of these casts, maybe you should change > > dma_data and dma_oob types (be careful: you enabled COMPILE_TEST in > > Kconfig, you must support 32-bit and 64-bit pointers, please try to > > compile this driver with different toolchains). > > Driver is used for both ARM as arm64. > These registers are 32 bit. Please advise what happens > when writel gets dma_addr_t and dma_data as 64 bit. > Don't have the hardware to find out. You don't need hardware, just a 32-bit and a 64-bit toolchain. We just want to avoid casts and build warnings. > > > > >> + > >> + reg = NANDC_V9_FL_DIR(dir) | > >> + NANDC_V9_FL_XFER_EN | > >> + NANDC_V9_FL_XFER_COUNT | > >> + NANDC_V9_FL_ACORRECT | > >> + NANDC_V9_FL_PAGE_NUM(n_KB) | > >> + NANDC_V9_FL_ASYNC_TOG_MIX; > >> + writel(reg, ctrl->regs + NANDC_REG_V9_FLCTL); > >> + reg |= NANDC_V9_FL_XFER_START; > >> + writel(reg, ctrl->regs + NANDC_REG_V9_FLCTL); > >> + } else { > >> + reg = readl(ctrl->regs + NANDC_REG_V6_BCHCTL); > >> + reg = (reg & (~(NAND_V6_BCH_REGION_M << > >> + NAND_V6_BCH_REGION_S))) | > >> + (ctrl->selected_bank << > >> NAND_V6_BCH_REGION_S); > >> + writel(reg, ctrl->regs + NANDC_REG_V6_BCHCTL); > >> + > >> + reg = NANDC_V6_DMA_CFG_WR_ST | > >> + NANDC_V6_DMA_CFG_WR(dir) | > >> + NANDC_V6_DMA_CFG_BUS_MODE | > >> + NANDC_V6_DMA_CFG_HSIZE_32 | > >> + NANDC_V6_DMA_CFG_BURST_16 | > >> + NANDC_V6_DMA_CFG_INCR_NUM(16); > >> + writel(reg, ctrl->regs + NANDC_REG_V6_DMA_CFG); > >> + writel(dma_data, ctrl->regs + > >> NANDC_REG_V6_DMA_BUF0); > >> + writel(dma_oob, ctrl->regs + > >> NANDC_REG_V6_DMA_BUF1); > > Same here. > > >> + > >> + reg = NANDC_V6_FL_DIR(dir) | > >> + NANDC_V6_FL_XFER_EN | > >> + NANDC_V6_FL_XFER_COUNT | > >> + NANDC_V6_FL_ACORRECT | > >> + NANDC_V6_FL_PAGE_NUM(n_KB) | > >> + NANDC_V6_FL_ASYNC_TOG_MIX; > >> + writel(reg, ctrl->regs + NANDC_REG_V6_FLCTL); > >> + reg |= NANDC_V6_FL_XFER_START; > >> + writel(reg, ctrl->regs + NANDC_REG_V6_FLCTL); > >> + } > >> +} > >> + > >> +static int rk_nandc_wait_for_xfer_done(struct rk_nand_controller > >> *ctrl) +{ > >> + uint32_t reg; > >> + int ret; > >> + > >> + if (ctrl->version == VERSION_9) { > >> + void __iomem *ptr = ctrl->regs + > >> NANDC_REG_V9_FLCTL; + > >> + ret = readl_poll_timeout_atomic(ptr, reg, > >> + reg & > >> NANDC_V9_FL_XFER_READY, > >> + 1, > >> NANDC_DEF_TIMEOUT); > >> + } else { > >> + void __iomem *ptr = ctrl->regs + > >> NANDC_REG_V6_FLCTL; + > >> + ret = readl_poll_timeout_atomic(ptr, reg, > >> + reg & > >> NANDC_V6_FL_XFER_READY, > >> + 1, > >> NANDC_DEF_TIMEOUT); > >> + } > > > > Space > > > >> + if (ret) > >> + pr_err("timeout reg=%x\n", reg); > >> + > >> + return ret; > >> +} > >> + > >> +static unsigned long rk_nandc_dma_map_single(struct device *dev, > >> + void *ptr, int size, int dir) > > > > > Unaligned parameters > > To restyle I use: > astyle -T8 --max-code-length=80 --style=linux rockchip_nandc.c > > Please advise for a better solution. I don't know astyle, but this would certainly trigger a checkpatch.pl warning. Just check them and correct them by hand. > > > > >> +{ > >> +#ifdef CONFIG_ARM64 > >> + __dma_map_area((void *)ptr, size, dir); > >> + return ((unsigned long)virt_to_phys((void *)ptr)); > >> +#else > >> + return dma_map_single(dev, (void *)ptr, size, dir); > >> +#endif > > > > > Please try to remove these #ifdefs, I don't know why would you need > > the former block? > > This driver is used both for ARM as arm64. > Original from Rockchip: arm64 doesn't have dma_map_single() as I > remember. Don't know what to use instead. > Please advise. I am not aware of such a limitation. Please check again. > > > > >> +} > >> + > >> +static void rk_nandc_dma_unmap_single(struct device *dev, > >> + unsigned long ptr, int > >> size, int dir) +{ > >> +#ifdef CONFIG_ARM64 > >> + __dma_unmap_area(phys_to_virt(ptr), size, dir); > >> +#else > >> + dma_unmap_single(dev, (dma_addr_t)ptr, size, dir); > >> +#endif > > > > Same > > > >> +} > >> + > >> +static int rk_nandc_hw_syndrome_ecc_read_page(struct nand_chip > >> *nand, > >> + uint8_t *buf, > >> + int oob_required, int page) > > > > > Unaligned parameters (please check all of them). > > Again blame astyle ... > After correcting it manually a few time I just left it as it is. > > > > >> +{ > >> + struct mtd_info *mtd = nand_to_mtd(nand); > >> + struct rk_nand_controller *ctrl = > >> nand_get_controller_data(nand); > >> + struct nand_ecc_ctrl *ecc = &nand->ecc; > >> + int max_bitflips = 0; > >> + dma_addr_t dma_data, dma_oob; > >> + int ret, i; > >> + int bch_st; > >> + int dma_oob_size = ecc->steps * 128; > >> + int pages_per_blk = mtd->erasesize / mtd->writesize; > >> + > >> + rk_nandc_select_chip(nand, ctrl->selected_bank); > >> + > >> + if ((page < pages_per_blk * NANDC_IDBResBlkNum) && > > > > > Camel case is usually not welcome > > Any suggestions for a beter replace for NANDC_IDBResBlkNum are > welcome. SOMETHING_LikeThis -> SOMETHING_LIKE_THIS > > > > >> + ctrl->bootromblocks) > > > > This would probably deserve a helper > > > >> + rk_nandc_hw_ecc_setup(nand, NANDC_IDBEccBits); > >> + > >> + nand_read_page_op(nand, page, 0, NULL, 0); > >> + > >> + dma_data = rk_nandc_dma_map_single(mtd->dev.parent, > >> + ctrl->page_buf, > >> mtd->writesize, > >> + DMA_FROM_DEVICE); > >> + dma_oob = rk_nandc_dma_map_single(mtd->dev.parent, > >> + ctrl->oob_buf, > >> dma_oob_size, > >> + DMA_FROM_DEVICE); > >> + > >> + init_completion(&ctrl->complete); > > > > > One init_completion is needed (in the probe, probably) then please > > use reinit_completion(). > > Must study this later. > > > > >> + if (ctrl->version == VERSION_9) > >> + writel(NANDC_V9_INT_DMA, ctrl->regs + > >> NANDC_REG_V9_INTEN); > >> + else > >> + writel(NANDC_V6_INT_DMA, ctrl->regs + > >> NANDC_REG_V6_INTEN); > >> + rk_nandc_xfer_start(ctrl, 0, ecc->steps, dma_data, > >> dma_oob); > > >> + wait_for_completion_timeout(&ctrl->complete, > >> msecs_to_jiffies(5)); > >> + rk_nandc_wait_for_xfer_done(ctrl); > > > > Yous should check the return status of almost all the functions > > here. > > Please advise what ERROR code should be returned here > that is compatible with MTD. As a general rule, please check the drivers which have been updated recently with git log --one-line -- drivers/mtd/nand/raw/ -> marvell, atmel, fsmc, sunxi, stm, cadence, etc In this case, you can return the error code of the failing function with a simple: ret = func(); if (ret) return ret; I expect the rk_nandc_wiat_for_xfer_done() helper to return -ETIMEDOUT in case of timeout. > > > > >> + rk_nandc_dma_unmap_single(mtd->dev.parent, dma_data, > >> mtd->writesize, > >> + DMA_FROM_DEVICE); > >> + rk_nandc_dma_unmap_single(mtd->dev.parent, dma_oob, > >> dma_oob_size, > >> + DMA_FROM_DEVICE); > >> + > >> + memcpy(buf, ctrl->page_buf, mtd->writesize); > >> + > >> + if (oob_required) { > >> + uint8_t *oob; > >> + uint32_t tmp; > > > > > Please use u8, u16 and u32 types. > > Should this be changed for the entire source? Yes, checkpatch.pl will warn you about this too. uint_t types are deprecated. > > > > >> + > >> + for (i = 0; i < ecc->steps; i++) { > >> + oob = nand->oob_poi + > >> + i * (ecc->bytes + nand->ecc.prepad); > >> + if (ctrl->version == VERSION_9) { > >> + tmp = ctrl->oob_buf[i]; > >> + } else { > >> + uint8_t oob_step = > >> (ctrl->ecc_mode <= 24) ? > >> + 64 : 128; > >> + tmp = ctrl->oob_buf[i * oob_step > >> / 4]; > >> + } > >> + *oob++ = (uint8_t)tmp; > >> + *oob++ = (uint8_t)(tmp >> 8); > >> + *oob++ = (uint8_t)(tmp >> 16); > >> + *oob++ = (uint8_t)(tmp >> 24); > >> + } > >> + } > >> + > >> + if (ctrl->version == VERSION_9) { > >> + for (i = 0; i < ecc->steps / 2; i++) { > >> + bch_st = readl(ctrl->regs + > >> NANDC_REG_V9_BCHST + i * 4); > >> + if (bch_st & NANDC_V9_BCH0_ST_ERR || > >> + bch_st & NANDC_V9_BCH1_ST_ERR) { > >> + mtd->ecc_stats.failed++; > >> + max_bitflips = -1; > >> + } else { > >> + ret = > >> NANDC_V9_ECC_ERR_CNT0(bch_st); > >> + mtd->ecc_stats.corrected += ret; > >> + max_bitflips = max_t(unsigned int, > >> + > >> max_bitflips, ret); + > >> + ret = > >> NANDC_V9_ECC_ERR_CNT1(bch_st); > >> + mtd->ecc_stats.corrected += ret; > >> + max_bitflips = max_t(unsigned int, > >> + > >> max_bitflips, ret); > >> + } > >> + } > >> + } else { > >> + for (i = 0; i < ecc->steps / 2; i++) { > >> + bch_st = readl(ctrl->regs + > >> NANDC_REG_V6_BCHST + i * 4); > >> + if (bch_st & NANDC_V6_BCH0_ST_ERR || > >> + bch_st & NANDC_V6_BCH1_ST_ERR) { > >> + mtd->ecc_stats.failed++; > >> + max_bitflips = -1; > > > > > Why not using ret = $(real error) instead of using max_bitflips > > here? > > > > Then: > > > > if (ret) { > > > dev_err(); > > Do you really want to litter the kernel log with each time you hit a > bad block, > in case you use this function in a search bad block loop? > Don't thinks so ... > Please advise. Actually I think that I was simplifying your code but you are right that this dev_err has to be removed. > > > return ret; > > } > > > > return max_bitflips; > > rk_nandc_hw_syndrome_ecc_read_page() is used in a bad block search > strategy. I think max_bitflips = -1 was chosen as a saver value to > return. Please advise what number range MTD interprets as > max_bitflips or as fault. Also consider some uncontrolled status > return value, it would be better if we > are in control of what goes return. max_bitflip is a local variable, I'm just saying that using max_bitflip to save an error code is bad. You can check what other drivers do. > > > > >> + } else { > >> + ret = > >> NANDC_V6_ECC_ERR_CNT0(bch_st); > >> + mtd->ecc_stats.corrected += ret; > >> + max_bitflips = max_t(unsigned int, > >> + > >> max_bitflips, ret); + > >> + ret = > >> NANDC_V6_ECC_ERR_CNT1(bch_st); > >> + mtd->ecc_stats.corrected += ret; > >> + max_bitflips = max_t(unsigned int, > >> + > >> max_bitflips, ret); > >> + } > >> + } > >> + } > >> + > >> + if (max_bitflips == -1) { > >> + dev_err(mtd->dev.parent, > >> + "read_page %x %x %x %x %x %p %x\n", > >> + page, > >> + max_bitflips, > >> + bch_st, > >> + ((uint32_t *)buf)[0], > >> + ((uint32_t *)buf)[1], > >> + buf, > >> + (uint32_t)dma_data); > > [...] > >> + > >> + for (offs = 0; offs < len; offs++) > >> + buf[offs] = readb(bank_base); > >> +} > >> + > >> +static void rk_nandc_write_buf(struct nand_chip *nand, > >> + const uint8_t *buf, int len) > >> +{ > >> + struct rk_nand_controller *ctrl = > >> nand_get_controller_data(nand); > >> + int offs = 0; > >> + void __iomem *bank_base = ctrl->regs + NANDC_REG_BANK0 + > >> + ctrl->selected_bank * 0x100; > >> + > >> + for (offs = 0; offs < len; offs++) > >> + writeb(buf[offs], bank_base); > >> +} > >> + > >> +static void rk_nandc_write_cmd(struct nand_chip *nand, uint8_t > >> cmd) +{ > >> + struct rk_nand_controller *ctrl = > >> nand_get_controller_data(nand); + > >> + void __iomem *bank_base = ctrl->regs + NANDC_REG_BANK0 + > >> + ctrl->selected_bank * 0x100 + > >> + NANDC_REG_CMD; > > > > > You might want to write an helper to calculate bank_base, to avoid > > repeating these lines. > > Even with a separate define or helper function I still have to supply > my reg, selected_bank and offset. It doesn't make things cleaner > pumping date > to and from a helper or neither doesn't it shorten my source with a > define. Tend to keep it as it is for now. If you agree of course. #define RK_REG(ctrl, off) \ (ctrl)->regs + \ NANDC_REG_BANK0 + \ (ctrl)->selected_bank * BANK_SIZE + \ (off) #define RK_REG_CMD(ctrl) RK_REG(ctrl, NANDC_REG_CMD) > > > > >> + > >> + writeb(cmd, bank_base); > >> +} > >> + > >> +static void rk_nandc_write_addr(struct nand_chip *nand, uint8_t > >> addr) +{ > >> + struct rk_nand_controller *ctrl = > >> nand_get_controller_data(nand); + > >> + void __iomem *bank_base = ctrl->regs + NANDC_REG_BANK0 + > >> + ctrl->selected_bank * 0x100 + > >> + NANDC_REG_ADDR; > >> + > >> + writeb(addr, bank_base); > >> +} > >> + > >> +static int rk_nandc_dev_ready(struct nand_chip *nand) > >> +{ > >> + struct rk_nand_controller *ctrl = > >> nand_get_controller_data(nand); + > >> + if (readl(ctrl->regs + NANDC_REG_V6_FMCTL) & > >> NANDC_V6_FM_FREADY) > >> + return 1; > >> + > >> + return 0; > >> +} > >> + > >> +static int rk_nandc_ooblayout_ecc(struct mtd_info *mtd, int > >> section, > >> + struct mtd_oob_region > >> *oobregion) +{ > >> + struct nand_chip *nand = mtd_to_nand(mtd); > >> + > >> + if (section >= nand->ecc.steps) > >> + return -ERANGE; > >> + > >> + oobregion->offset = (nand->ecc.bytes + nand->ecc.prepad) > >> * section + > >> + nand->ecc.prepad; > >> + oobregion->length = nand->ecc.steps * nand->ecc.bytes; > >> + > >> + return 0; > >> +} > >> + > >> +static int rk_nandc_ooblayout_free(struct mtd_info *mtd, int > >> section, > >> + struct mtd_oob_region > >> *oobregion) +{ > >> + struct nand_chip *nand = mtd_to_nand(mtd); > >> + > >> + if (section >= nand->ecc.steps) > >> + return -ERANGE; > >> + > >> + oobregion->offset = (nand->ecc.bytes + nand->ecc.prepad) > >> * section; > >> + oobregion->length = nand->ecc.steps * nand->ecc.prepad; > >> + > >> + return 0; > >> +} > >> + > >> +static const struct mtd_ooblayout_ops rk_nandc_oob_ops = { > >> + .ecc = rk_nandc_ooblayout_ecc, > >> + .free = rk_nandc_ooblayout_free, > >> +}; > >> + > >> +static void rk_nandc_free_buffer(struct nand_chip *nand) > >> +{ > >> + struct rk_nand_controller *ctrl = > >> nand_get_controller_data(nand); + > >> + kfree(ctrl->page_buf); > >> + kfree(ctrl->oob_buf); > >> +} > >> + > >> +static int rk_nandc_buffer_init(struct nand_chip *nand) > >> +{ > >> + struct mtd_info *mtd = nand_to_mtd(nand); > >> + struct rk_nand_controller *ctrl = > >> nand_get_controller_data(nand); + > >> + ctrl->page_buf = kmalloc(mtd->writesize, GFP_KERNEL | > >> GFP_DMA); > > > > > device managed allocations (devm_...) would be nice > > devm_kzalloc() needs an extra struct device. > Does MTD safe-gard the correct order to detach from struct > rk_nand_controller > without rk_nandc_free_buffer()? &pdev->dev is fine, you can save it your own nand controller structure. I think accessing mtd->dev is not allowed before the registration of the MTD device though. > > > > >> + if (!ctrl->page_buf) > >> + return -ENOMEM; > >> + > >> + ctrl->oob_buf = kmalloc(nand->ecc.steps * 128, GFP_KERNEL > >> | GFP_DMA); > >> + if (!ctrl->oob_buf) { > >> + kfree(ctrl->page_buf); > >> + return -ENOMEM; > >> + } > >> + > >> + return 0; > >> +} > >> + > >> +static int rk_nandc_hw_ecc_ctrl_init(struct nand_chip *nand) > >> +{ > >> + uint8_t strengths_v6[] = {60, 40, 24, 16}; > >> + uint8_t strengths_v9[] = {70, 60, 40, 16}; > >> + struct mtd_info *mtd = nand_to_mtd(nand); > >> + struct rk_nand_controller *ctrl = > >> nand_get_controller_data(nand); > >> + int max_strength; > >> + uint32_t i, ver; > >> + > >> + if (nand->options & NAND_IS_BOOT_MEDIUM) > >> + ctrl->bootromblocks = true; > >> + else > >> + ctrl->bootromblocks = false; > >> + > >> + nand->ecc.prepad = 4; > >> + nand->ecc.steps = mtd->writesize / nand->ecc.size; > >> + > >> + max_strength = ((mtd->oobsize / nand->ecc.steps) - 4) * 8 > >> / 14; > >> + if (ctrl->version == VERSION_9) { > >> + ctrl->max_ecc_strength = 70; > >> + ver = readl(ctrl->regs + NANDC_REG_V9_VER); > >> + if (ver != NANDC_ID_V900) > >> + dev_err(mtd->dev.parent, > >> + "unsupported nandc version %x\n", > >> ver); + > >> + if (max_strength > ctrl->max_ecc_strength) > >> + max_strength = ctrl->max_ecc_strength; > >> + > >> + for (i = 0; i < ARRAY_SIZE(strengths_v9); i++) { > >> + if (max_strength >= strengths_v9[i]) > >> + break; > >> + } > >> + > >> + if (i >= ARRAY_SIZE(strengths_v9)) { > >> + dev_err(mtd->dev.parent, > >> + "unsupported strength\n"); > >> + return -ENOTSUPP; > >> + } > >> + > >> + ctrl->ecc_mode = strengths_v9[i]; > >> + } else { > >> + ctrl->max_ecc_strength = 60; > >> + > >> + ver = readl(ctrl->regs + NANDC_REG_V6_VER); > >> + if (ver == NANDC_ID_V801) > >> + ctrl->max_ecc_strength = 16; > >> + else if (ver == NANDC_ID_V600 || > >> + ver == NANDC_ID_V622 || > > >> + ver == NANDC_ID_V701 || > > Added version 7 for RK3228A/RK3228B. Can someone with insider info > confirm if this works or not. > > >> + ver == NANDC_ID_V800) > >> + ctrl->max_ecc_strength = 60; > >> + else > >> + dev_err(mtd->dev.parent, > >> + "unsupported nandc version %x\n", > >> ver); + > >> + if (max_strength > ctrl->max_ecc_strength) > >> + max_strength = ctrl->max_ecc_strength; > >> + > >> + for (i = 0; i < ARRAY_SIZE(strengths_v6); i++) { > >> + if (max_strength >= strengths_v6[i]) > >> + break; > >> + } > >> + > >> + if (i >= ARRAY_SIZE(strengths_v6)) { > >> + dev_err(mtd->dev.parent, > >> + "unsupported strength\n"); > >> + return -ENOTSUPP; > >> + } > >> + > >> + ctrl->ecc_mode = strengths_v6[i]; > >> + } > >> + rk_nandc_hw_ecc_setup(nand, ctrl->ecc_mode); > >> + > >> + mtd_set_ooblayout(mtd, &rk_nandc_oob_ops); > >> + > >> + if (mtd->oobsize < ((nand->ecc.bytes + nand->ecc.prepad) * > >> + nand->ecc.steps)) { > >> + return -EINVAL; > >> + } > >> + > >> + return 0; > >> +} > >> + > >> +static void rk_nandc_detach_chip(struct nand_chip *nand) > >> +{ > >> + switch (nand->ecc.mode) { > >> + case NAND_ECC_HW_SYNDROME: > >> + rk_nandc_free_buffer(nand); > >> + break; > >> + default: > >> + break; > >> + } > >> +} > >> + > >> +static int rk_nandc_attach_chip(struct nand_chip *nand) > >> +{ > >> + struct mtd_info *mtd = nand_to_mtd(nand); > >> + int ret; > >> + > >> + switch (nand->ecc.mode) { > >> + case NAND_ECC_HW_SYNDROME: > >> + ret = rk_nandc_hw_ecc_ctrl_init(nand); > >> + if (ret) > >> + return ret; > >> + ret = rk_nandc_buffer_init(nand); > >> + if (ret) > >> + return -ENOMEM; > >> + nand->ecc.read_page = > >> rk_nandc_hw_syndrome_ecc_read_page; > >> + nand->ecc.write_page = > >> rk_nandc_hw_syndrome_ecc_write_page; > >> + nand->ecc.read_oob = rk_nandc_hw_ecc_read_oob; > >> + nand->ecc.write_oob = rk_nandc_hw_ecc_write_oob; > >> + break; > >> + case NAND_ECC_HW: > > > > I would either refuse ECC_HW or put it besides HW_SYNDROME. > > Is there a fundamental difference in handling ECC_HW and HW_SYNDROME > from the MTD point of view? Other then a indication how it's done on > the driver side? I don't think so.. > Will drop it. > > > > >> + case NAND_ECC_NONE: > >> + case NAND_ECC_SOFT: > > > > > Have you tested with SW BCH? > > Short answer: No > Just copied it from the original. > Please advise a tool to do a test between the individual ecc read > options. Or do I have to write the tool my self with mtd-utils? All the tools are already available. nand_test, flash_speed, nandbiterrs -i, etc > > > > >> + break; > >> + default: > >> + return -EINVAL; > >> + } > >> + > >> + return 0; > >> +} > >> + > >> +static int rk_nandc_exec_op(struct nand_chip *nand, > >> + const struct nand_operation *op, > >> + bool check_only) > >> +{ > >> + int i; > >> + unsigned int op_id; > >> + const struct nand_op_instr *instr = NULL; > >> + > >> + rk_nandc_select_chip(nand, op->cs); > >> + > >> + if (check_only) > >> + return 0; > >> + > >> + for (op_id = 0; op_id < op->ninstrs; op_id++) { > >> + instr = &op->instrs[op_id]; > >> + > >> + switch (instr->type) { > >> + case NAND_OP_CMD_INSTR: > >> + rk_nandc_write_cmd(nand, > >> instr->ctx.cmd.opcode); > >> + break; > >> + case NAND_OP_ADDR_INSTR: > >> + for (i = 0; i < instr->ctx.addr.naddrs; > >> i++) > >> + rk_nandc_write_addr(nand, > >> + > >> instr->ctx.addr.addrs[i]); > >> + break; > >> + case NAND_OP_DATA_IN_INSTR: > >> + rk_nandc_read_buf(nand, > >> instr->ctx.data.buf.in, > >> + instr->ctx.data.len); > >> + break; > >> + case NAND_OP_DATA_OUT_INSTR: > >> + rk_nandc_write_buf(nand, > >> instr->ctx.data.buf.out, > >> + instr->ctx.data.len); > >> + break; > >> + case NAND_OP_WAITRDY_INSTR: > >> + rk_nandc_dev_ready(nand); > >> + break; > >> + } > >> + } > >> + > >> + return 0; > >> +} > >> + > >> +static const struct nand_controller_ops rk_nand_controller_ops = { > >> + .attach_chip = rk_nandc_attach_chip, > >> + .detach_chip = rk_nandc_detach_chip, > >> + .exec_op = rk_nandc_exec_op, > >> +}; > >> + > >> +static int rk_nandc_chip_init(struct device *dev, > >> + struct rk_nand_controller *ctrl, > >> + struct device_node *np, unsigned > >> int chipnr) +{ > >> + struct rk_nand_chip *node; > >> + struct nand_chip *nand; > >> + struct mtd_info *mtd; > >> + const __be32 *reg; > >> + int ret; > >> + > >> + reg = of_get_property(np, "reg", NULL); > >> + if (!reg) > >> + return -EINVAL; > >> + > >> + ctrl->banks[chipnr] = be32_to_cpu(*reg); > >> + > >> + if (ctrl->banks[chipnr] < 0) > >> + return -EINVAL; > >> + > >> + node = devm_kzalloc(dev, sizeof(*node), GFP_KERNEL); > >> + if (!node) > >> + return -ENOMEM; > >> + > >> + nand = &node->nand; > >> + > >> + nand_set_flash_node(nand, np); > >> + nand_set_controller_data(nand, ctrl); > >> + > >> + nand->controller = &ctrl->controller; > >> + nand->controller->ops = &rk_nand_controller_ops; > >> + > >> + nand->ecc.mode = NAND_ECC_HW_SYNDROME; > >> + nand->ecc.size = 1024; > >> + nand->ecc.strength = 40; > >> + > >> + nand->options = NAND_SKIP_BBTSCAN | NAND_NO_SUBPAGE_WRITE; > >> + > >> + mtd = nand_to_mtd(nand); > >> + mtd->dev.parent = dev; > >> + mtd->name = devm_kasprintf(dev, GFP_KERNEL, "%s.%d", > >> dev_name(dev), > >> + ctrl->banks[chipnr]); > >> + > >> + ret = nand_scan(nand, 1); > > > > Why 1 here? > > TODO for version 2. > A little misunderstanding on how for_each_child_of_node works. > All chips should be scanned. > ///// > Derive chipnr > Example from sunxi_nand.c > > if (!of_get_property(np, "reg", &nsels)) > return -EINVAL; > > nsels /= sizeof(u32); > if (!nsels) { > dev_err(dev, "invalid reg property size\n"); > return -EINVAL; > } > ///// > From rk_nandc_chips_init() > > for_each_child_of_node(np, nand_np) { > ret = rk_nandc_chip_init(dev, ctrl, nand_np, i); > > Why does sunxi_nand.c need this extra for_each_child_of_node? for_each_child_of_node will loop over all the NAND chips that are connected to the NAND controller. You may have -depending on the NAND controller- more than one CS per chip. [...] > >> + node = pdev->dev.of_node; > >> + > >> + id = of_alias_get_id(node, "nandc"); > >> + if (id < 0) > >> + id = g_id_counter; > >> + if ((id >= ARRAY_SIZE(g_nandc_info) || > >> g_nandc_info[id].regs)) { > >> + dev_err( > >> + &pdev->dev, > >> + "failed to get id for nandc node > >> '%pOFn'\n", > >> + node); > >> + of_node_put(node); > >> + return -ENODEV; > >> + } > >> + ++g_id_counter; > > See comments above about Rk3288. Keeping track node alias for nandc0. > To remove or not? You may keep a static variable to point to an array or have a static counter that you increment, but definitely not static structures that would be shared. If there are two distinct NAND controllers, you must have distinct path/structures. ->probe() will be run once for each NAND controller. Thanks, Miquèl