From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 61158C433EF for ; Mon, 9 May 2022 17:58:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=OfMi+9MU29gCgNO0z98ZSHVStWRO16rM7BlsUDGM8lE=; b=v1qEWI8uv5ew1+ y4tIlIHmqlvp2olWc9rAPDciaiMfQHuhf6xiDIMJQnaOrHsCEsWW7I16t9RqTPH/EPWdv8UT9PZlX yIjeMnUyYUh5nHXbQM6VgPwQZRvqKP1h2OucZ06wj9IgcaV9XxcYNsbec1RzLukZQNIpGmIj7PEup 7muX6efIbHM2BWJChqLLzO4J3YtsXcJSbpWczsb+3j2wVfmnXwDFibK+Fv8AW5b4WM0+h3A466RGA O+LkqTCJL92FffuMiPxw8oXrg5peH77dMvOEnHx8G81OXmZ/TpUi04p5KYBqDiTpmMr6ogwWqT59G i4NqBdmsUkumHMFbBoSQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1no7ee-00Ffzx-8a; Mon, 09 May 2022 17:58:44 +0000 Received: from gandalf.ozlabs.org ([150.107.74.76]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1no7cp-00Fetg-5L; Mon, 09 May 2022 17:57:00 +0000 Received: from gandalf.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by gandalf.ozlabs.org (Postfix) with ESMTP id 4KxplP6BMsz4xdK; Tue, 10 May 2022 03:56:49 +1000 (AEST) Received: from authenticated.ozlabs.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mail.ozlabs.org (Postfix) with ESMTPSA id 4KxplJ0G8vz4xVP; Tue, 10 May 2022 03:56:43 +1000 (AEST) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: linux-spi@vger.kernel.org, linux-mtd@lists.infradead.org Cc: Mark Brown , Tudor Ambarus , Pratyush Yadav , Miquel Raynal , Richard Weinberger , Vignesh Raghavendra , linux-aspeed@lists.ozlabs.org, Joel Stanley , Andrew Jeffery , Chin-Ting Kuo , devicetree@vger.kernel.org, Rob Herring , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , Tao Ren , Jae Hyun Yoo Subject: [PATCH v7 03/11] spi: spi-mem: Convert Aspeed SMC driver to spi-mem Date: Mon, 9 May 2022 19:56:08 +0200 Message-Id: <20220509175616.1089346-4-clg@kaod.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220509175616.1089346-1-clg@kaod.org> References: <20220509175616.1089346-1-clg@kaod.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220509_105651_787266_A2164BFC X-CRM114-Status: GOOD ( 37.44 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org VGhpcyBTUEkgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgdGhlIEFzcGVlZCBzdGF0aWMgbWVtb3J5 IGNvbnRyb2xsZXJzCm9mIHRoZSBBU1QyNjAwLCBBU1QyNTAwIGFuZCBBU1QyNDAwIFNvQ3MgdXNp bmcgdGhlIHNwaS1tZW0gaW50ZXJmYWNlLgoKICogQVNUMjYwMCBGaXJtd2FyZSBTUEkgTWVtb3J5 IENvbnRyb2xsZXIgKEZNQykKICAgLiBCTUMgZmlybXdhcmUKICAgLiAzIGNoaXAgc2VsZWN0IHBp bnMgKENFMCB+IENFMikKICAgLiBPbmx5IHN1cHBvcnRzIFNQSSB0eXBlIGZsYXNoIG1lbW9yeQog ICAuIGRpZmZlcmVudCBzZWdtZW50IHJlZ2lzdGVyIGludGVyZmFjZQogICAuIHNpbmdsZSwgZHVh bCBhbmQgcXVhZCBtb2RlLgoKICogQVNUMjYwMCBTUEkgRmxhc2ggQ29udHJvbGxlciAoU1BJMSBh bmQgU1BJMikKICAgLiBob3N0IGZpcm13YXJlCiAgIC4gMiBjaGlwIHNlbGVjdCBwaW5zIChDRTAg fiBDRTEpCiAgIC4gZGlmZmVyZW50IHNlZ21lbnQgcmVnaXN0ZXIgaW50ZXJmYWNlCiAgIC4gc2lu Z2xlLCBkdWFsIGFuZCBxdWFkIG1vZGUuCgogKiBBU1QyNTAwIEZpcm13YXJlIFNQSSBNZW1vcnkg Q29udHJvbGxlciAoRk1DKQogICAuIEJNQyBmaXJtd2FyZQogICAuIDMgY2hpcCBzZWxlY3QgcGlu cyAoQ0UwIH4gQ0UyKQogICAuIHN1cHBvcnRzIFNQSSB0eXBlIGZsYXNoIG1lbW9yeSAoQ0UwLUNF MSkKICAgLiBDRTIgY2FuIGJlIG9mIE5PUiB0eXBlIGZsYXNoIGJ1dCB0aGlzIGlzIG5vdCBzdXBw b3J0ZWQgYnkgdGhlIGRyaXZlcgogICAuIHNpbmdsZSwgZHVhbCBtb2RlLgoKICogQVNUMjUwMCBT UEkgRmxhc2ggQ29udHJvbGxlciAoU1BJMSBhbmQgU1BJMikKICAgLiBob3N0IGZpcm13YXJlCiAg IC4gMiBjaGlwIHNlbGVjdCBwaW5zIChDRTAgfiBDRTEpCiAgIC4gc2luZ2xlLCBkdWFsIG1vZGUu CgogKiBBU1QyNDAwIE5ldyBTdGF0aWMgTWVtb3J5IENvbnRyb2xsZXIgKGFsc28gcmVmZXJyZWQg YXMgRk1DKQogICAuIEJNQyBmaXJtd2FyZQogICAuIE5ldyByZWdpc3RlciBzZXQKICAgLiA1IGNo aXAgc2VsZWN0IHBpbnMgKENFMCDiiLwgQ0U0KQogICAuIHN1cHBvcnRzIE5PUiBmbGFzaCwgTkFO RCBmbGFzaCBhbmQgU1BJIGZsYXNoIG1lbW9yeS4KICAgLiBzaW5nbGUsIGR1YWwgYW5kIHF1YWQg bW9kZS4KCkVhY2ggY29udHJvbGxlciBoYXMgYSBtZW1vcnkgcmFuZ2Ugb24gd2hpY2ggZmxhc2gg ZGV2aWNlcyBjb250ZW50cyBhcmUKbWFwcGVkLiBFYWNoIGRldmljZSBpcyBhc3NpZ25lZCBhIHdp bmRvdyB0aGF0IGNhbiBiZSBjaGFuZ2VkIGF0IGJvb3RpbWUKd2l0aCB0aGUgU2VnbWVudCBBZGRy ZXNzIFJlZ2lzdGVycy4KCkVhY2ggU1BJIGZsYXNoIGRldmljZSBjYW4gdGhlbiBiZSBhY2Nlc3Nl ZCBpbiB0d28gbW9kZXM6IENvbW1hbmQgYW5kClVzZXIuIFdoZW4gaW4gVXNlciBtb2RlLCBTUEkg dHJhbnNmZXJzIGFyZSBpbml0aWF0ZWQgd2l0aCBhY2Nlc3NlcyB0bwp0aGUgbWVtb3J5IHNlZ21l bnQgb2YgYSBkZXZpY2UuIFdoZW4gaW4gQ29tbWFuZCBtb2RlLCBtZW1vcnkKb3BlcmF0aW9ucyBv biB0aGUgbWVtb3J5IHNlZ21lbnQgb2YgYSBkZXZpY2UgZ2VuZXJhdGUgU1BJIGNvbW1hbmRzCmF1 dG9tYXRpY2FsbHkgdXNpbmcgYSBDb250cm9sIFJlZ2lzdGVyIGZvciB0aGUgc2V0dGluZ3MuCgpU aGlzIGluaXRpYWwgcGF0Y2ggYWRkcyBzdXBwb3J0IGZvciBVc2VyIG1vZGUuIENvbW1hbmQgbW9k ZSBuZWVkcyBhIGxpdHRsZQptb3JlIHdvcmsgdG8gY2hlY2sgdGhhdCB0aGUgbWVtb3J5IHdpbmRv dyBvbiB0aGUgQUhCIGJ1cyBmaXRzIHRoZSBkZXZpY2UKc2l6ZS4gSXQgd2lsbCBjb21lIGxhdGVy IHdoZW4gc3VwcG9ydCBmb3IgZGlyZWN0IG1hcHBpbmcgaXMgYWRkZWQuCgpTaW5nbGUgYW5kIGR1 YWwgbW9kZSBSWCB0cmFuc2ZlcnMgYXJlIHN1cHBvcnRlZC4gT3RoZXIgdHlwZXMgdGhhbiBTUEkK YXJlIG5vdCBzdXBwb3J0ZWQuCgpSZXZpZXdlZC1ieTogSm9lbCBTdGFubGV5IDxqb2VsQGptcy5p ZC5hdT4KVGVzdGVkLWJ5OiBKb2VsIFN0YW5sZXkgPGpvZWxAam1zLmlkLmF1PgpUZXN0ZWQtYnk6 IFRhbyBSZW4gPHJlbnRhby5idXB0QGdtYWlsLmNvbT4KVGVzdGVkLWJ5OiBKYWUgSHl1biBZb28g PHF1aWNfamFlaHlvb0BxdWljaW5jLmNvbT4KU2lnbmVkLW9mZi1ieTogQ2hpbi1UaW5nIEt1byA8 Y2hpbi10aW5nX2t1b0Bhc3BlZWR0ZWNoLmNvbT4KU2lnbmVkLW9mZi1ieTogQ8OpZHJpYyBMZSBH b2F0ZXIgPGNsZ0BrYW9kLm9yZz4KLS0tCiBkcml2ZXJzL210ZC9zcGktbm9yL2NvbnRyb2xsZXJz L2FzcGVlZC1zbWMuYyB8IDkyMSAtLS0tLS0tLS0tLS0tLS0tLS0tCiBkcml2ZXJzL3NwaS9zcGkt YXNwZWVkLXNtYy5jICAgICAgICAgICAgICAgICB8IDcxNyArKysrKysrKysrKysrKysKIE1BSU5U QUlORVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKIGRyaXZlcnMv bXRkL3NwaS1ub3IvY29udHJvbGxlcnMvS2NvbmZpZyAgICAgIHwgIDEwIC0KIGRyaXZlcnMvbXRk L3NwaS1ub3IvY29udHJvbGxlcnMvTWFrZWZpbGUgICAgIHwgICAxIC0KIGRyaXZlcnMvc3BpL0tj b25maWcgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDExICsKIGRyaXZlcnMvc3BpL01ha2Vm aWxlICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKIDcgZmlsZXMgY2hhbmdlZCwgNzMw IGluc2VydGlvbnMoKyksIDkzMiBkZWxldGlvbnMoLSkKIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2 ZXJzL210ZC9zcGktbm9yL2NvbnRyb2xsZXJzL2FzcGVlZC1zbWMuYwogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvc3BpL3NwaS1hc3BlZWQtc21jLmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL210 ZC9zcGktbm9yL2NvbnRyb2xsZXJzL2FzcGVlZC1zbWMuYyBiL2RyaXZlcnMvbXRkL3NwaS1ub3Iv Y29udHJvbGxlcnMvYXNwZWVkLXNtYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBh Y2ZlMDEwZjlkZDcuLjAwMDAwMDAwMDAwMAotLS0gYS9kcml2ZXJzL210ZC9zcGktbm9yL2NvbnRy b2xsZXJzL2FzcGVlZC1zbWMuYworKysgL2Rldi9udWxsCkBAIC0xLDkyMSArMCwwIEBACi0vLyBT UERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlcgotLyoKLSAqIEFTUEVFRCBT dGF0aWMgTWVtb3J5IENvbnRyb2xsZXIgZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDE1 LTIwMTYsIElCTSBDb3Jwb3JhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvYnVnLmg+Ci0j aW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxp bnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotI2luY2x1 ZGUgPGxpbnV4L210ZC9zcGktbm9yLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRl IDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGxpbnV4L3NpemVzLmg+Ci0jaW5jbHVk ZSA8bGludXgvc3lzZnMuaD4KLQotI2RlZmluZSBERVZJQ0VfTkFNRQkiYXNwZWVkLXNtYyIKLQot LyoKLSAqIFRoZSBkcml2ZXIgb25seSBzdXBwb3J0IFNQSSBmbGFzaAotICovCi1lbnVtIGFzcGVl ZF9zbWNfZmxhc2hfdHlwZSB7Ci0Jc21jX3R5cGVfbm9yICA9IDAsCi0Jc21jX3R5cGVfbmFuZCA9 IDEsCi0Jc21jX3R5cGVfc3BpICA9IDIsCi19OwotCi1zdHJ1Y3QgYXNwZWVkX3NtY19jaGlwOwot Ci1zdHJ1Y3QgYXNwZWVkX3NtY19pbmZvIHsKLQl1MzIgbWF4c2l6ZTsJCS8qIG1heGltdW0gc2l6 ZSBvZiBjaGlwIHdpbmRvdyAqLwotCXU4IG5jZTsJCQkvKiBudW1iZXIgb2YgY2hpcCBlbmFibGVz ICovCi0JYm9vbCBoYXN0eXBlOwkJLyogZmxhc2ggdHlwZSBmaWVsZCBleGlzdHMgaW4gY29uZmln IHJlZyAqLwotCXU4IHdlMDsJCQkvKiBzaGlmdCBmb3Igd3JpdGUgZW5hYmxlIGJpdCBmb3IgQ0Uw ICovCi0JdTggY3RsMDsJCS8qIG9mZnNldCBpbiByZWdzIG9mIGN0bCBmb3IgQ0UwICovCi0KLQl2 b2lkICgqc2V0XzRiKShzdHJ1Y3QgYXNwZWVkX3NtY19jaGlwICpjaGlwKTsKLX07Ci0KLXN0YXRp YyB2b2lkIGFzcGVlZF9zbWNfY2hpcF9zZXRfNGJfc3BpXzI0MDAoc3RydWN0IGFzcGVlZF9zbWNf Y2hpcCAqY2hpcCk7Ci1zdGF0aWMgdm9pZCBhc3BlZWRfc21jX2NoaXBfc2V0XzRiKHN0cnVjdCBh c3BlZWRfc21jX2NoaXAgKmNoaXApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFzcGVlZF9zbWNf aW5mbyBmbWNfMjQwMF9pbmZvID0gewotCS5tYXhzaXplID0gNjQgKiAxMDI0ICogMTAyNCwKLQku bmNlID0gNSwKLQkuaGFzdHlwZSA9IHRydWUsCi0JLndlMCA9IDE2LAotCS5jdGwwID0gMHgxMCwK LQkuc2V0XzRiID0gYXNwZWVkX3NtY19jaGlwX3NldF80YiwKLX07Ci0KLXN0YXRpYyBjb25zdCBz dHJ1Y3QgYXNwZWVkX3NtY19pbmZvIHNwaV8yNDAwX2luZm8gPSB7Ci0JLm1heHNpemUgPSA2NCAq IDEwMjQgKiAxMDI0LAotCS5uY2UgPSAxLAotCS5oYXN0eXBlID0gZmFsc2UsCi0JLndlMCA9IDAs Ci0JLmN0bDAgPSAweDA0LAotCS5zZXRfNGIgPSBhc3BlZWRfc21jX2NoaXBfc2V0XzRiX3NwaV8y NDAwLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfc21jX2luZm8gZm1jXzI1MDBf aW5mbyA9IHsKLQkubWF4c2l6ZSA9IDI1NiAqIDEwMjQgKiAxMDI0LAotCS5uY2UgPSAzLAotCS5o YXN0eXBlID0gdHJ1ZSwKLQkud2UwID0gMTYsCi0JLmN0bDAgPSAweDEwLAotCS5zZXRfNGIgPSBh c3BlZWRfc21jX2NoaXBfc2V0XzRiLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRf c21jX2luZm8gc3BpXzI1MDBfaW5mbyA9IHsKLQkubWF4c2l6ZSA9IDEyOCAqIDEwMjQgKiAxMDI0 LAotCS5uY2UgPSAyLAotCS5oYXN0eXBlID0gZmFsc2UsCi0JLndlMCA9IDE2LAotCS5jdGwwID0g MHgxMCwKLQkuc2V0XzRiID0gYXNwZWVkX3NtY19jaGlwX3NldF80YiwKLX07Ci0KLWVudW0gYXNw ZWVkX3NtY19jdGxfcmVnX3ZhbHVlIHsKLQlzbWNfYmFzZSwJCS8qIGJhc2UgdmFsdWUgd2l0aG91 dCBtb2RlIGZvciBvdGhlciBjb21tYW5kcyAqLwotCXNtY19yZWFkLAkJLyogY29tbWFuZCByZWcg Zm9yIChtYXliZSBmYXN0KSByZWFkcyAqLwotCXNtY193cml0ZSwJCS8qIGNvbW1hbmQgcmVnIGZv ciB3cml0ZXMgKi8KLQlzbWNfbWF4LAotfTsKLQotc3RydWN0IGFzcGVlZF9zbWNfY29udHJvbGxl cjsKLQotc3RydWN0IGFzcGVlZF9zbWNfY2hpcCB7Ci0JaW50IGNzOwotCXN0cnVjdCBhc3BlZWRf c21jX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7Ci0Jdm9pZCBfX2lvbWVtICpjdGw7CQkJLyogY29u dHJvbCByZWdpc3RlciAqLwotCXZvaWQgX19pb21lbSAqYWhiX2Jhc2U7CQkJLyogYmFzZSBvZiBj aGlwIHdpbmRvdyAqLwotCXUzMiBhaGJfd2luZG93X3NpemU7CQkJLyogY2hpcCBtYXBwaW5nIHdp bmRvdyBzaXplICovCi0JdTMyIGN0bF92YWxbc21jX21heF07CQkJLyogY29udHJvbCBzZXR0aW5n cyAqLwotCWVudW0gYXNwZWVkX3NtY19mbGFzaF90eXBlIHR5cGU7CS8qIHdoYXQgdHlwZSBvZiBm bGFzaCAqLwotCXN0cnVjdCBzcGlfbm9yIG5vcjsKLX07Ci0KLXN0cnVjdCBhc3BlZWRfc21jX2Nv bnRyb2xsZXIgewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQotCXN0cnVjdCBtdXRleCBtdXRleDsJ CQkvKiBjb250cm9sbGVyIGFjY2VzcyBtdXRleCAqLwotCWNvbnN0IHN0cnVjdCBhc3BlZWRfc21j X2luZm8gKmluZm87CS8qIHR5cGUgaW5mbyBvZiBjb250cm9sbGVyICovCi0Jdm9pZCBfX2lvbWVt ICpyZWdzOwkJCS8qIGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCi0Jdm9pZCBfX2lvbWVtICphaGJf YmFzZTsJCQkvKiBwZXItY2hpcCB3aW5kb3dzIHJlc291cmNlICovCi0JdTMyIGFoYl93aW5kb3df c2l6ZTsJCQkvKiBmdWxsIG1hcHBpbmcgd2luZG93IHNpemUgKi8KLQotCXN0cnVjdCBhc3BlZWRf c21jX2NoaXAgKmNoaXBzW107CS8qIHBvaW50ZXJzIHRvIGF0dGFjaGVkIGNoaXBzICovCi19Owot Ci0vKgotICogU1BJIEZsYXNoIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKEFTVDI1MDAgU1BJKQot ICogICAgIG9yCi0gKiBUeXBlIHNldHRpbmcgUmVnaXN0ZXIgKEFTVDI1MDAgRk1DKS4KLSAqIENF MCBhbmQgQ0UxIGNhbiBvbmx5IGJlIG9mIHR5cGUgU1BJLiBDRTIgY2FuIGJlIG9mIHR5cGUgTk9S IGJ1dCB0aGUKLSAqIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGl0LgotICovCi0jZGVmaW5lIENP TkZJR19SRUcJCQkweDAKLSNkZWZpbmUgQ09ORklHX0RJU0FCTEVfTEVHQUNZCQlCSVQoMzEpIC8q IDEgKi8KLQotI2RlZmluZSBDT05GSUdfQ0UyX1dSSVRFCQlCSVQoMTgpCi0jZGVmaW5lIENPTkZJ R19DRTFfV1JJVEUJCUJJVCgxNykKLSNkZWZpbmUgQ09ORklHX0NFMF9XUklURQkJQklUKDE2KQot Ci0jZGVmaW5lIENPTkZJR19DRTJfVFlQRQkJCUJJVCg0KSAvKiBBU1QyNTAwIEZNQyBvbmx5ICov Ci0jZGVmaW5lIENPTkZJR19DRTFfVFlQRQkJCUJJVCgyKSAvKiBBU1QyNTAwIEZNQyBvbmx5ICov Ci0jZGVmaW5lIENPTkZJR19DRTBfVFlQRQkJCUJJVCgwKSAvKiBBU1QyNTAwIEZNQyBvbmx5ICov Ci0KLS8qCi0gKiBDRSBDb250cm9sIFJlZ2lzdGVyCi0gKi8KLSNkZWZpbmUgQ0VfQ09OVFJPTF9S RUcJCQkweDQKLQotLyoKLSAqIENFeCBDb250cm9sIFJlZ2lzdGVyCi0gKi8KLSNkZWZpbmUgQ09O VFJPTF9BQUZfTU9ERQkJQklUKDMxKQotI2RlZmluZSBDT05UUk9MX0lPX01PREVfTUFTSwkJR0VO TUFTSygzMCwgMjgpCi0jZGVmaW5lIENPTlRST0xfSU9fRFVBTF9EQVRBCQlCSVQoMjkpCi0jZGVm aW5lIENPTlRST0xfSU9fRFVBTF9BRERSX0RBVEEJKEJJVCgyOSkgfCBCSVQoMjgpKQotI2RlZmlu ZSBDT05UUk9MX0lPX1FVQURfREFUQQkJQklUKDMwKQotI2RlZmluZSBDT05UUk9MX0lPX1FVQURf QUREUl9EQVRBCShCSVQoMzApIHwgQklUKDI4KSkKLSNkZWZpbmUgQ09OVFJPTF9DRV9JTkFDVElW RV9TSElGVAkyNAotI2RlZmluZSBDT05UUk9MX0NFX0lOQUNUSVZFX01BU0sJR0VOTUFTSygyNywg XAotCQkJCQlDT05UUk9MX0NFX0lOQUNUSVZFX1NISUZUKQotLyogMCA9IDE2VCAuLi4gMTUgPSAx VCAgIFQ9SENMSyAqLwotI2RlZmluZSBDT05UUk9MX0NPTU1BTkRfU0hJRlQJCTE2Ci0jZGVmaW5l IENPTlRST0xfRFVNTVlfQ09NTUFORF9PVVQJQklUKDE1KQotI2RlZmluZSBDT05UUk9MX0lPX0RV TU1ZX0hJCQlCSVQoMTQpCi0jZGVmaW5lIENPTlRST0xfSU9fRFVNTVlfSElfU0hJRlQJMTQKLSNk ZWZpbmUgQ09OVFJPTF9DTEtfRElWNAkJQklUKDEzKSAvKiBvdGhlcnMgKi8KLSNkZWZpbmUgQ09O VFJPTF9JT19BRERSRVNTXzRCCQlCSVQoMTMpIC8qIEFTVDI0MDAgU1BJICovCi0jZGVmaW5lIENP TlRST0xfUldfTUVSR0UJCUJJVCgxMikKLSNkZWZpbmUgQ09OVFJPTF9JT19EVU1NWV9MT19TSElG VAk2Ci0jZGVmaW5lIENPTlRST0xfSU9fRFVNTVlfTE8JCUdFTk1BU0soNywgXAotCQkJCQkJQ09O VFJPTF9JT19EVU1NWV9MT19TSElGVCkKLSNkZWZpbmUgQ09OVFJPTF9JT19EVU1NWV9NQVNLCQko Q09OVFJPTF9JT19EVU1NWV9ISSB8IFwKLQkJCQkJIENPTlRST0xfSU9fRFVNTVlfTE8pCi0jZGVm aW5lIENPTlRST0xfSU9fRFVNTVlfU0VUKGR1bW15KQkJCQkgXAotCSgoKCgoZHVtbXkpID4+IDIp ICYgMHgxKSA8PCBDT05UUk9MX0lPX0RVTU1ZX0hJX1NISUZUKSB8IFwKLQkgKCgoZHVtbXkpICYg MHgzKSA8PCBDT05UUk9MX0lPX0RVTU1ZX0xPX1NISUZUKSkKLQotI2RlZmluZSBDT05UUk9MX0NM T0NLX0ZSRVFfU0VMX1NISUZUCTgKLSNkZWZpbmUgQ09OVFJPTF9DTE9DS19GUkVRX1NFTF9NQVNL CUdFTk1BU0soMTEsIFwKLQkJCQkJCUNPTlRST0xfQ0xPQ0tfRlJFUV9TRUxfU0hJRlQpCi0jZGVm aW5lIENPTlRST0xfTFNCX0ZJUlNUCQlCSVQoNSkKLSNkZWZpbmUgQ09OVFJPTF9DTE9DS19NT0RF XzMJCUJJVCg0KQotI2RlZmluZSBDT05UUk9MX0lOX0RVQUxfREFUQQkJQklUKDMpCi0jZGVmaW5l IENPTlRST0xfQ0VfU1RPUF9BQ1RJVkVfQ09OVFJPTAlCSVQoMikKLSNkZWZpbmUgQ09OVFJPTF9D T01NQU5EX01PREVfTUFTSwlHRU5NQVNLKDEsIDApCi0jZGVmaW5lIENPTlRST0xfQ09NTUFORF9N T0RFX05PUk1BTAkwCi0jZGVmaW5lIENPTlRST0xfQ09NTUFORF9NT0RFX0ZSRUFECTEKLSNkZWZp bmUgQ09OVFJPTF9DT01NQU5EX01PREVfV1JJVEUJMgotI2RlZmluZSBDT05UUk9MX0NPTU1BTkRf TU9ERV9VU0VSCTMKLQotI2RlZmluZSBDT05UUk9MX0tFRVBfTUFTSwkJCQkJCVwKLQkoQ09OVFJP TF9BQUZfTU9ERSB8IENPTlRST0xfQ0VfSU5BQ1RJVkVfTUFTSyB8IENPTlRST0xfQ0xLX0RJVjQg fCBcCi0JIENPTlRST0xfQ0xPQ0tfRlJFUV9TRUxfTUFTSyB8IENPTlRST0xfTFNCX0ZJUlNUIHwg Q09OVFJPTF9DTE9DS19NT0RFXzMpCi0KLS8qCi0gKiBUaGUgU2VnbWVudCBSZWdpc3RlciB1c2Vz IGEgOE1CIHVuaXQgdG8gZW5jb2RlIHRoZSBzdGFydCBhZGRyZXNzCi0gKiBhbmQgdGhlIGVuZCBh ZGRyZXNzIG9mIHRoZSBtYXBwaW5nIHdpbmRvdyBvZiBhIGZsYXNoIFNQSSBzbGF2ZSA6Ci0gKgot ICogICAgICAgIHwgYnl0ZSAxIHwgYnl0ZSAyIHwgYnl0ZSAzIHwgYnl0ZSA0IHwKLSAqICAgICAg ICArLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCi0gKiAgICAgICAgfCAgZW5k ICAgfCAgc3RhcnQgfCAgIDAgICAgfCAgIDAgICAgfAotICovCi0jZGVmaW5lIFNFR01FTlRfQURE Ul9SRUcwCQkweDMwCi0jZGVmaW5lIFNFR01FTlRfQUREUl9TVEFSVChfcikJCSgoKChfcikgPj4g MTYpICYgMHhGRikgPDwgMjMpCi0jZGVmaW5lIFNFR01FTlRfQUREUl9FTkQoX3IpCQkoKCgoX3Ip ID4+IDI0KSAmIDB4RkYpIDw8IDIzKQotI2RlZmluZSBTRUdNRU5UX0FERFJfVkFMVUUoc3RhcnQs IGVuZCkJCQkJCVwKLQkoKCgoKHN0YXJ0KSA+PiAyMykgJiAweEZGKSA8PCAxNikgfCAoKCgoZW5k KSA+PiAyMykgJiAweEZGKSA8PCAyNCkpCi0jZGVmaW5lIFNFR01FTlRfQUREUl9SRUcoY29udHJv bGxlciwgY3MpCVwKLQkoKGNvbnRyb2xsZXIpLT5yZWdzICsgU0VHTUVOVF9BRERSX1JFRzAgKyAo Y3MpICogNCkKLQotLyoKLSAqIEluIHVzZXIgbW9kZSBhbGwgZGF0YSBieXRlcyByZWFkIG9yIHdy aXR0ZW4gdG8gdGhlIGNoaXAgZGVjb2RlIGFkZHJlc3MKLSAqIHJhbmdlIGFyZSB0cmFuc2ZlcnJl ZCB0byBvciBmcm9tIHRoZSBTUEkgYnVzLiBUaGUgcmFuZ2UgaXMgdHJlYXRlZCBhcyBhCi0gKiBm aWZvIG9mIGFyYml0cmF0cnkgMSwgMiwgb3IgNCBieXRlIHdpZHRoIGJ1dCBlYWNoIHdyaXRlIGhh cyB0byBiZSBhbGlnbmVkCi0gKiB0byBpdHMgc2l6ZS4gVGhlIGFkZHJlc3Mgd2l0aGluIHRoZSBt dWx0aXBsZSA4a0IgcmFuZ2UgaXMgaWdub3JlZCB3aGVuCi0gKiBzZW5kaW5nIGJ5dGVzIHRvIHRo ZSBTUEkgYnVzLgotICoKLSAqIE9uIHRoZSBhcm0gYXJjaGl0ZWN0dXJlLCBhcyBvZiBMaW51eCB2 ZXJzaW9uIDQuMywgbWVtY3B5X2Zyb21pbyBhbmQKLSAqIG1lbWNweV90b2lvIG9uIGxpdHRsZSBl bmRpYW4gdGFyZ2V0cyB1c2UgdGhlIG9wdGltaXplZCBtZW1jcHkgcm91dGluZXMKLSAqIHRoYXQg d2VyZSBkZXNpZ25lZCBmb3Igd2VsbCBiZWhhdmllZCBtZW1vcnkgc3RvcmFnZS4gVGhlc2Ugcm91 dGluZXMKLSAqIGhhdmUgYSBzdHV0dGVyIGlmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFy ZSBub3QgYm90aCB3b3JkIGFsaWduZWQsCi0gKiBvbmNlIHdpdGggYSBkdXBsaWNhdGUgYWNjZXNz IHRvIHRoZSBzb3VyY2UgYWZ0ZXIgYWxpZ25pbmcgdG8gdGhlCi0gKiBkZXN0aW5hdGlvbiB0byBh IHdvcmQgYm91bmRhcnksIGFuZCBhZ2FpbiB3aXRoIGEgZHVwbGljYXRlIGFjY2VzcyB0bwotICog dGhlIHNvdXJjZSB3aGVuIHRoZSBmaW5hbCBieXRlIGNvdW50IGlzIG5vdCB3b3JkIGFsaWduZWQu Ci0gKgotICogV2hlbiB3cml0aW5nIG9yIHJlYWRpbmcgdGhlIGZpZm8gdGhpcyBzdHV0dGVyIGRp c2NhcmRzIGRhdGEgb3Igc2VuZHMKLSAqIHRvbyBtdWNoIGRhdGEgdG8gdGhlIGZpZm8gYW5kIGNh biBub3QgYmUgdXNlZCBieSB0aGlzIGRyaXZlci4KLSAqCi0gKiBXaGlsZSB0aGUgbG93IGxldmVs IGlvIHN0cmluZyByb3V0aW5lcyB0aGF0IGltcGxlbWVudCB0aGUgaW5zbCBmYW1pbHkgZG8KLSAq IHRoZSBkZXNpcmVkIGFjY2Vzc2VzIGFuZCBtZW1vcnkgaW5jcmVtZW50cywgdGhlIGNyb3NzIGFy Y2hpdGVjdHVyZSBpbwotICogbWFjcm9zIG1ha2UgdGhlbSBlc3NlbnRpYWxseSBpbXBvc3NpYmxl IHRvIHVzZSBvbiBhIG1lbW9yeSBtYXBwZWQgYWRkcmVzcwotICogaW5zdGVhZCBvZiBhIGEgdG9r ZW4gZnJvbSB0aGUgY2FsbCB0byBpb21hcCBvZiBhbiBpbyBwb3J0LgotICoKLSAqIFRoZXNlIGZp Zm8gcm91dGluZXMgdXNlIHJlYWRsIGFuZCBmcmllbmRzIHRvIGEgY29uc3RhbnQgaW8gcG9ydCBh bmQgdXBkYXRlCi0gKiB0aGUgbWVtb3J5IGJ1ZmZlciBwb2ludGVyIGFuZCBjb3VudCB2aWEgZXhw bGljaXQgY29kZS4gVGhlIGZpbmFsIHVwZGF0ZXMKLSAqIHRvIGxlbiBhcmUgb3B0aW1pc3RpY2Fs bHkgc3VwcHJlc3NlZC4KLSAqLwotc3RhdGljIGludCBhc3BlZWRfc21jX3JlYWRfZnJvbV9haGIo dm9pZCAqYnVmLCB2b2lkIF9faW9tZW0gKnNyYywgc2l6ZV90IGxlbikKLXsKLQlzaXplX3Qgb2Zm c2V0ID0gMDsKLQotCWlmIChJU19BTElHTkVEKCh1aW50cHRyX3Qpc3JjLCBzaXplb2YodWludHB0 cl90KSkgJiYKLQkgICAgSVNfQUxJR05FRCgodWludHB0cl90KWJ1Ziwgc2l6ZW9mKHVpbnRwdHJf dCkpKSB7Ci0JCWlvcmVhZDMyX3JlcChzcmMsIGJ1ZiwgbGVuID4+IDIpOwotCQlvZmZzZXQgPSBs ZW4gJiB+MHgzOwotCQlsZW4gLT0gb2Zmc2V0OwotCX0KLQlpb3JlYWQ4X3JlcChzcmMsICh1OCAq KWJ1ZiArIG9mZnNldCwgbGVuKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhc3BlZWRf c21jX3dyaXRlX3RvX2FoYih2b2lkIF9faW9tZW0gKmRzdCwgY29uc3Qgdm9pZCAqYnVmLAotCQkJ CSAgIHNpemVfdCBsZW4pCi17Ci0Jc2l6ZV90IG9mZnNldCA9IDA7Ci0KLQlpZiAoSVNfQUxJR05F RCgodWludHB0cl90KWRzdCwgc2l6ZW9mKHVpbnRwdHJfdCkpICYmCi0JICAgIElTX0FMSUdORUQo KHVpbnRwdHJfdClidWYsIHNpemVvZih1aW50cHRyX3QpKSkgewotCQlpb3dyaXRlMzJfcmVwKGRz dCwgYnVmLCBsZW4gPj4gMik7Ci0JCW9mZnNldCA9IGxlbiAmIH4weDM7Ci0JCWxlbiAtPSBvZmZz ZXQ7Ci0JfQotCWlvd3JpdGU4X3JlcChkc3QsIChjb25zdCB1OCAqKWJ1ZiArIG9mZnNldCwgbGVu KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgYXNwZWVkX3NtY19jaGlwX3dy aXRlX2JpdChzdHJ1Y3QgYXNwZWVkX3NtY19jaGlwICpjaGlwKQotewotCXJldHVybiBCSVQoY2hp cC0+Y29udHJvbGxlci0+aW5mby0+d2UwICsgY2hpcC0+Y3MpOwotfQotCi1zdGF0aWMgdm9pZCBh c3BlZWRfc21jX2NoaXBfY2hlY2tfY29uZmlnKHN0cnVjdCBhc3BlZWRfc21jX2NoaXAgKmNoaXAp Ci17Ci0Jc3RydWN0IGFzcGVlZF9zbWNfY29udHJvbGxlciAqY29udHJvbGxlciA9IGNoaXAtPmNv bnRyb2xsZXI7Ci0JdTMyIHJlZzsKLQotCXJlZyA9IHJlYWRsKGNvbnRyb2xsZXItPnJlZ3MgKyBD T05GSUdfUkVHKTsKLQotCWlmIChyZWcgJiBhc3BlZWRfc21jX2NoaXBfd3JpdGVfYml0KGNoaXAp KQotCQlyZXR1cm47Ci0KLQlkZXZfZGJnKGNvbnRyb2xsZXItPmRldiwgImNvbmZpZyB3cml0ZSBp cyBub3Qgc2V0ICEgQCVwOiAweCUwOHhcbiIsCi0JCWNvbnRyb2xsZXItPnJlZ3MgKyBDT05GSUdf UkVHLCByZWcpOwotCXJlZyB8PSBhc3BlZWRfc21jX2NoaXBfd3JpdGVfYml0KGNoaXApOwotCXdy aXRlbChyZWcsIGNvbnRyb2xsZXItPnJlZ3MgKyBDT05GSUdfUkVHKTsKLX0KLQotc3RhdGljIHZv aWQgYXNwZWVkX3NtY19zdGFydF91c2VyKHN0cnVjdCBzcGlfbm9yICpub3IpCi17Ci0Jc3RydWN0 IGFzcGVlZF9zbWNfY2hpcCAqY2hpcCA9IG5vci0+cHJpdjsKLQl1MzIgY3RsID0gY2hpcC0+Y3Rs X3ZhbFtzbWNfYmFzZV07Ci0KLQkvKgotCSAqIFdoZW4gdGhlIGNoaXAgaXMgY29udHJvbGxlZCBp biB1c2VyIG1vZGUsIHdlIG5lZWQgd3JpdGUKLQkgKiBhY2Nlc3MgdG8gc2VuZCB0aGUgb3Bjb2Rl cyB0byBpdC4gU28gY2hlY2sgdGhlIGNvbmZpZy4KLQkgKi8KLQlhc3BlZWRfc21jX2NoaXBfY2hl Y2tfY29uZmlnKGNoaXApOwotCi0JY3RsIHw9IENPTlRST0xfQ09NTUFORF9NT0RFX1VTRVIgfAot CQlDT05UUk9MX0NFX1NUT1BfQUNUSVZFX0NPTlRST0w7Ci0Jd3JpdGVsKGN0bCwgY2hpcC0+Y3Rs KTsKLQotCWN0bCAmPSB+Q09OVFJPTF9DRV9TVE9QX0FDVElWRV9DT05UUk9MOwotCXdyaXRlbChj dGwsIGNoaXAtPmN0bCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFzcGVlZF9zbWNfc3RvcF91c2VyKHN0 cnVjdCBzcGlfbm9yICpub3IpCi17Ci0Jc3RydWN0IGFzcGVlZF9zbWNfY2hpcCAqY2hpcCA9IG5v ci0+cHJpdjsKLQotCXUzMiBjdGwgPSBjaGlwLT5jdGxfdmFsW3NtY19yZWFkXTsKLQl1MzIgY3Rs MiA9IGN0bCB8IENPTlRST0xfQ09NTUFORF9NT0RFX1VTRVIgfAotCQlDT05UUk9MX0NFX1NUT1Bf QUNUSVZFX0NPTlRST0w7Ci0KLQl3cml0ZWwoY3RsMiwgY2hpcC0+Y3RsKTsJLyogc3RvcCB1c2Vy IENFIGNvbnRyb2wgKi8KLQl3cml0ZWwoY3RsLCBjaGlwLT5jdGwpOwkJLyogZGVmYXVsdCB0byBm cmVhZCBvciByZWFkIG1vZGUgKi8KLX0KLQotc3RhdGljIGludCBhc3BlZWRfc21jX3ByZXAoc3Ry dWN0IHNwaV9ub3IgKm5vcikKLXsKLQlzdHJ1Y3QgYXNwZWVkX3NtY19jaGlwICpjaGlwID0gbm9y LT5wcml2OwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+Y29udHJvbGxlci0+bXV0ZXgpOwotCXJldHVy biAwOwotfQotCi1zdGF0aWMgdm9pZCBhc3BlZWRfc21jX3VucHJlcChzdHJ1Y3Qgc3BpX25vciAq bm9yKQotewotCXN0cnVjdCBhc3BlZWRfc21jX2NoaXAgKmNoaXAgPSBub3ItPnByaXY7Ci0KLQlt dXRleF91bmxvY2soJmNoaXAtPmNvbnRyb2xsZXItPm11dGV4KTsKLX0KLQotc3RhdGljIGludCBh c3BlZWRfc21jX3JlYWRfcmVnKHN0cnVjdCBzcGlfbm9yICpub3IsIHU4IG9wY29kZSwgdTggKmJ1 ZiwKLQkJCSAgICAgICBzaXplX3QgbGVuKQotewotCXN0cnVjdCBhc3BlZWRfc21jX2NoaXAgKmNo aXAgPSBub3ItPnByaXY7Ci0KLQlhc3BlZWRfc21jX3N0YXJ0X3VzZXIobm9yKTsKLQlhc3BlZWRf c21jX3dyaXRlX3RvX2FoYihjaGlwLT5haGJfYmFzZSwgJm9wY29kZSwgMSk7Ci0JYXNwZWVkX3Nt Y19yZWFkX2Zyb21fYWhiKGJ1ZiwgY2hpcC0+YWhiX2Jhc2UsIGxlbik7Ci0JYXNwZWVkX3NtY19z dG9wX3VzZXIobm9yKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhc3BlZWRfc21jX3dy aXRlX3JlZyhzdHJ1Y3Qgc3BpX25vciAqbm9yLCB1OCBvcGNvZGUsIGNvbnN0IHU4ICpidWYsCi0J CQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgYXNwZWVkX3NtY19jaGlwICpjaGlwID0gbm9yLT5w cml2OwotCi0JYXNwZWVkX3NtY19zdGFydF91c2VyKG5vcik7Ci0JYXNwZWVkX3NtY193cml0ZV90 b19haGIoY2hpcC0+YWhiX2Jhc2UsICZvcGNvZGUsIDEpOwotCWFzcGVlZF9zbWNfd3JpdGVfdG9f YWhiKGNoaXAtPmFoYl9iYXNlLCBidWYsIGxlbik7Ci0JYXNwZWVkX3NtY19zdG9wX3VzZXIobm9y KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXNwZWVkX3NtY19zZW5kX2NtZF9hZGRy KHN0cnVjdCBzcGlfbm9yICpub3IsIHU4IGNtZCwgdTMyIGFkZHIpCi17Ci0Jc3RydWN0IGFzcGVl ZF9zbWNfY2hpcCAqY2hpcCA9IG5vci0+cHJpdjsKLQlfX2JlMzIgdGVtcDsKLQl1MzIgY21kYWRk cjsKLQotCXN3aXRjaCAobm9yLT5hZGRyX3dpZHRoKSB7Ci0JZGVmYXVsdDoKLQkJV0FSTl9PTkNF KDEsICJVbmV4cGVjdGVkIGFkZHJlc3Mgd2lkdGggJXUsIGRlZmF1bHRpbmcgdG8gM1xuIiwKLQkJ CSAgbm9yLT5hZGRyX3dpZHRoKTsKLQkJZmFsbHRocm91Z2g7Ci0JY2FzZSAzOgotCQljbWRhZGRy ID0gYWRkciAmIDB4RkZGRkZGOwotCQljbWRhZGRyIHw9IGNtZCA8PCAyNDsKLQotCQl0ZW1wID0g Y3B1X3RvX2JlMzIoY21kYWRkcik7Ci0JCWFzcGVlZF9zbWNfd3JpdGVfdG9fYWhiKGNoaXAtPmFo Yl9iYXNlLCAmdGVtcCwgNCk7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJdGVtcCA9IGNwdV90b19i ZTMyKGFkZHIpOwotCQlhc3BlZWRfc21jX3dyaXRlX3RvX2FoYihjaGlwLT5haGJfYmFzZSwgJmNt ZCwgMSk7Ci0JCWFzcGVlZF9zbWNfd3JpdGVfdG9fYWhiKGNoaXAtPmFoYl9iYXNlLCAmdGVtcCwg NCk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHNzaXplX3QgYXNwZWVkX3NtY19yZWFkX3Vz ZXIoc3RydWN0IHNwaV9ub3IgKm5vciwgbG9mZl90IGZyb20sCi0JCQkJICAgIHNpemVfdCBsZW4s IHVfY2hhciAqcmVhZF9idWYpCi17Ci0Jc3RydWN0IGFzcGVlZF9zbWNfY2hpcCAqY2hpcCA9IG5v ci0+cHJpdjsKLQlpbnQgaTsKLQl1OCBkdW1teSA9IDB4RkY7Ci0KLQlhc3BlZWRfc21jX3N0YXJ0 X3VzZXIobm9yKTsKLQlhc3BlZWRfc21jX3NlbmRfY21kX2FkZHIobm9yLCBub3ItPnJlYWRfb3Bj b2RlLCBmcm9tKTsKLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bm9yLnJlYWRfZHVtbXkgLyA4OyBp KyspCi0JCWFzcGVlZF9zbWNfd3JpdGVfdG9fYWhiKGNoaXAtPmFoYl9iYXNlLCAmZHVtbXksIHNp emVvZihkdW1teSkpOwotCi0JYXNwZWVkX3NtY19yZWFkX2Zyb21fYWhiKHJlYWRfYnVmLCBjaGlw LT5haGJfYmFzZSwgbGVuKTsKLQlhc3BlZWRfc21jX3N0b3BfdXNlcihub3IpOwotCXJldHVybiBs ZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFzcGVlZF9zbWNfd3JpdGVfdXNlcihzdHJ1Y3Qgc3Bp X25vciAqbm9yLCBsb2ZmX3QgdG8sCi0JCQkJICAgICBzaXplX3QgbGVuLCBjb25zdCB1X2NoYXIg KndyaXRlX2J1ZikKLXsKLQlzdHJ1Y3QgYXNwZWVkX3NtY19jaGlwICpjaGlwID0gbm9yLT5wcml2 OwotCi0JYXNwZWVkX3NtY19zdGFydF91c2VyKG5vcik7Ci0JYXNwZWVkX3NtY19zZW5kX2NtZF9h ZGRyKG5vciwgbm9yLT5wcm9ncmFtX29wY29kZSwgdG8pOwotCWFzcGVlZF9zbWNfd3JpdGVfdG9f YWhiKGNoaXAtPmFoYl9iYXNlLCB3cml0ZV9idWYsIGxlbik7Ci0JYXNwZWVkX3NtY19zdG9wX3Vz ZXIobm9yKTsKLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IGFzcGVlZF9zbWNfdW5yZWdp c3RlcihzdHJ1Y3QgYXNwZWVkX3NtY19jb250cm9sbGVyICpjb250cm9sbGVyKQotewotCXN0cnVj dCBhc3BlZWRfc21jX2NoaXAgKmNoaXA7Ci0JaW50IG47Ci0KLQlmb3IgKG4gPSAwOyBuIDwgY29u dHJvbGxlci0+aW5mby0+bmNlOyBuKyspIHsKLQkJY2hpcCA9IGNvbnRyb2xsZXItPmNoaXBzW25d OwotCQlpZiAoY2hpcCkKLQkJCW10ZF9kZXZpY2VfdW5yZWdpc3RlcigmY2hpcC0+bm9yLm10ZCk7 Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXNwZWVkX3NtY19yZW1vdmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXJldHVybiBhc3BlZWRfc21jX3VucmVnaXN0 ZXIocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qg b2ZfZGV2aWNlX2lkIGFzcGVlZF9zbWNfbWF0Y2hlc1tdID0gewotCXsgLmNvbXBhdGlibGUgPSAi YXNwZWVkLGFzdDI0MDAtZm1jIiwgLmRhdGEgPSAmZm1jXzI0MDBfaW5mbyB9LAotCXsgLmNvbXBh dGlibGUgPSAiYXNwZWVkLGFzdDI0MDAtc3BpIiwgLmRhdGEgPSAmc3BpXzI0MDBfaW5mbyB9LAot CXsgLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI1MDAtZm1jIiwgLmRhdGEgPSAmZm1jXzI1MDBf aW5mbyB9LAotCXsgLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI1MDAtc3BpIiwgLmRhdGEgPSAm c3BpXzI1MDBfaW5mbyB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFzcGVl ZF9zbWNfbWF0Y2hlcyk7Ci0KLS8qCi0gKiBFYWNoIGNoaXAgaGFzIGEgbWFwcGluZyB3aW5kb3cg ZGVmaW5lZCBieSBhIHNlZ21lbnQgYWRkcmVzcwotICogcmVnaXN0ZXIgZGVmaW5pbmcgYSBzdGFy dCBhbmQgYW4gZW5kIGFkZHJlc3Mgb24gdGhlIEFIQiBidXMuIFRoZXNlCi0gKiBhZGRyZXNzZXMg Y2FuIGJlIGNvbmZpZ3VyZWQgdG8gZml0IHRoZSBjaGlwIHNpemUgYW5kIG9mZmVyIGEKLSAqIGNv bnRpZ3VvdXMgbWVtb3J5IHJlZ2lvbiBhY3Jvc3MgY2hpcHMuIEZvciB0aGUgbW9tZW50LCB3ZSBv bmx5Ci0gKiBjaGVjayB0aGF0IGVhY2ggY2hpcCBzZWdtZW50IGlzIHZhbGlkLgotICovCi1zdGF0 aWMgdm9pZCBfX2lvbWVtICphc3BlZWRfc21jX2NoaXBfYmFzZShzdHJ1Y3QgYXNwZWVkX3NtY19j aGlwICpjaGlwLAotCQkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcmVzKQotewotCXN0cnVjdCBhc3Bl ZWRfc21jX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIgPSBjaGlwLT5jb250cm9sbGVyOwotCXUzMiBv ZmZzZXQgPSAwOwotCXUzMiByZWc7Ci0KLQlpZiAoY29udHJvbGxlci0+aW5mby0+bmNlID4gMSkg ewotCQlyZWcgPSByZWFkbChTRUdNRU5UX0FERFJfUkVHKGNvbnRyb2xsZXIsIGNoaXAtPmNzKSk7 Ci0KLQkJaWYgKFNFR01FTlRfQUREUl9TVEFSVChyZWcpID49IFNFR01FTlRfQUREUl9FTkQocmVn KSkKLQkJCXJldHVybiBOVUxMOwotCi0JCW9mZnNldCA9IFNFR01FTlRfQUREUl9TVEFSVChyZWcp IC0gcmVzLT5zdGFydDsKLQl9Ci0KLQlyZXR1cm4gY29udHJvbGxlci0+YWhiX2Jhc2UgKyBvZmZz ZXQ7Ci19Ci0KLXN0YXRpYyB1MzIgYXNwZWVkX3NtY19haGJfYmFzZV9waHkoc3RydWN0IGFzcGVl ZF9zbWNfY29udHJvbGxlciAqY29udHJvbGxlcikKLXsKLQl1MzIgc2VnMF92YWwgPSByZWFkbChT RUdNRU5UX0FERFJfUkVHKGNvbnRyb2xsZXIsIDApKTsKLQotCXJldHVybiBTRUdNRU5UX0FERFJf U1RBUlQoc2VnMF92YWwpOwotfQotCi1zdGF0aWMgdTMyIGNoaXBfc2V0X3NlZ21lbnQoc3RydWN0 IGFzcGVlZF9zbWNfY2hpcCAqY2hpcCwgdTMyIGNzLCB1MzIgc3RhcnQsCi0JCQkgICAgdTMyIHNp emUpCi17Ci0Jc3RydWN0IGFzcGVlZF9zbWNfY29udHJvbGxlciAqY29udHJvbGxlciA9IGNoaXAt PmNvbnRyb2xsZXI7Ci0Jdm9pZCBfX2lvbWVtICpzZWdfcmVnOwotCXUzMiBzZWdfb2xkdmFsLCBz ZWdfbmV3dmFsLCBhaGJfYmFzZV9waHksIGVuZDsKLQotCWFoYl9iYXNlX3BoeSA9IGFzcGVlZF9z bWNfYWhiX2Jhc2VfcGh5KGNvbnRyb2xsZXIpOwotCi0Jc2VnX3JlZyA9IFNFR01FTlRfQUREUl9S RUcoY29udHJvbGxlciwgY3MpOwotCXNlZ19vbGR2YWwgPSByZWFkbChzZWdfcmVnKTsKLQotCS8q Ci0JICogSWYgdGhlIGNoaXAgc2l6ZSBpcyBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIGRlZmF1bHQg c2VnbWVudAotCSAqIHNpemUsIGJ1dCB0YWtlIGludG8gYWNjb3VudCB0aGUgcG9zc2libGUgb3Zl cmxhcCB3aXRoIHRoZQotCSAqIHByZXZpb3VzIHNlZ21lbnQKLQkgKi8KLQlpZiAoIXNpemUpCi0J CXNpemUgPSBTRUdNRU5UX0FERFJfRU5EKHNlZ19vbGR2YWwpIC0gc3RhcnQ7Ci0KLQkvKgotCSAq IFRoZSBzZWdtZW50IGNhbm5vdCBleGNlZWQgdGhlIG1heGltdW0gd2luZG93IHNpemUgb2YgdGhl Ci0JICogY29udHJvbGxlci4KLQkgKi8KLQlpZiAoc3RhcnQgKyBzaXplID4gYWhiX2Jhc2VfcGh5 ICsgY29udHJvbGxlci0+YWhiX3dpbmRvd19zaXplKSB7Ci0JCXNpemUgPSBhaGJfYmFzZV9waHkg KyBjb250cm9sbGVyLT5haGJfd2luZG93X3NpemUgLSBzdGFydDsKLQkJZGV2X3dhcm4oY2hpcC0+ bm9yLmRldiwgIkNFJWQgd2luZG93IHJlc2l6ZWQgdG8gJWRNQiIsCi0JCQkgY3MsIHNpemUgPj4g MjApOwotCX0KLQotCWVuZCA9IHN0YXJ0ICsgc2l6ZTsKLQlzZWdfbmV3dmFsID0gU0VHTUVOVF9B RERSX1ZBTFVFKHN0YXJ0LCBlbmQpOwotCXdyaXRlbChzZWdfbmV3dmFsLCBzZWdfcmVnKTsKLQot CS8qCi0JICogUmVzdG9yZSBkZWZhdWx0IHZhbHVlIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLiBU aGUgY2hpcAotCSAqIG1pZ2h0IGhhdmUgc2V0IHNvbWUgYm9ndXMgdmFsdWUgYW5kIHdlIHdvdWxk IGxvb3NlIGFjY2VzcwotCSAqIHRvIHRoZSBjaGlwLgotCSAqLwotCWlmIChzZWdfbmV3dmFsICE9 IHJlYWRsKHNlZ19yZWcpKSB7Ci0JCWRldl9lcnIoY2hpcC0+bm9yLmRldiwgIkNFJWQgd2luZG93 IGludmFsaWQiLCBjcyk7Ci0JCXdyaXRlbChzZWdfb2xkdmFsLCBzZWdfcmVnKTsKLQkJc3RhcnQg PSBTRUdNRU5UX0FERFJfU1RBUlQoc2VnX29sZHZhbCk7Ci0JCWVuZCA9IFNFR01FTlRfQUREUl9F TkQoc2VnX29sZHZhbCk7Ci0JCXNpemUgPSBlbmQgLSBzdGFydDsKLQl9Ci0KLQlkZXZfaW5mbyhj aGlwLT5ub3IuZGV2LCAiQ0UlZCB3aW5kb3cgWyAweCUuOHggLSAweCUuOHggXSAlZE1CIiwKLQkJ IGNzLCBzdGFydCwgZW5kLCBzaXplID4+IDIwKTsKLQotCXJldHVybiBzaXplOwotfQotCi0vKgot ICogVGhlIHNlZ21lbnQgcmVnaXN0ZXIgZGVmaW5lcyB0aGUgbWFwcGluZyB3aW5kb3cgb24gdGhl IEFIQiBidXMgYW5kCi0gKiBpdCBuZWVkcyB0byBiZSBjb25maWd1cmVkIGRlcGVuZGluZyBvbiB0 aGUgY2hpcCBzaXplLiBUaGUgc2VnbWVudAotICogcmVnaXN0ZXIgb2YgdGhlIGZvbGxvd2luZyBD RSBhbHNvIG5lZWRzIHRvIGJlIHR1bmVkIGluIG9yZGVyIHRvCi0gKiBwcm92aWRlIGEgY29udGln dW91cyB3aW5kb3cgYWNyb3NzIG11bHRpcGxlIGNoaXBzLgotICoKLSAqIFRoaXMgaXMgZXhwZWN0 ZWQgdG8gYmUgY2FsbGVkIGluIGluY3JlYXNpbmcgQ0Ugb3JkZXIKLSAqLwotc3RhdGljIHUzMiBh c3BlZWRfc21jX2NoaXBfc2V0X3NlZ21lbnQoc3RydWN0IGFzcGVlZF9zbWNfY2hpcCAqY2hpcCkK LXsKLQlzdHJ1Y3QgYXNwZWVkX3NtY19jb250cm9sbGVyICpjb250cm9sbGVyID0gY2hpcC0+Y29u dHJvbGxlcjsKLQl1MzIgYWhiX2Jhc2VfcGh5LCBzdGFydDsKLQl1MzIgc2l6ZSA9IGNoaXAtPm5v ci5tdGQuc2l6ZTsKLQotCS8qCi0JICogRWFjaCBjb250cm9sbGVyIGhhcyBhIGNoaXAgc2l6ZSBs aW1pdCBmb3IgZGlyZWN0IG1lbW9yeQotCSAqIGFjY2VzcwotCSAqLwotCWlmIChzaXplID4gY29u dHJvbGxlci0+aW5mby0+bWF4c2l6ZSkKLQkJc2l6ZSA9IGNvbnRyb2xsZXItPmluZm8tPm1heHNp emU7Ci0KLQkvKgotCSAqIFRoZSBBU1QyNDAwIFNQSSBjb250cm9sbGVyIG9ubHkgaGFuZGxlcyBv bmUgY2hpcCBhbmQgZG9lcwotCSAqIG5vdCBoYXZlIHNlZ21lbnQgcmVnaXN0ZXJzLiBMZXQncyB1 c2UgdGhlIGNoaXAgc2l6ZSBmb3IgdGhlCi0JICogQUhCIHdpbmRvdy4KLQkgKi8KLQlpZiAoY29u dHJvbGxlci0+aW5mbyA9PSAmc3BpXzI0MDBfaW5mbykKLQkJZ290byBvdXQ7Ci0KLQkvKgotCSAq IFRoZSBBU1QyNTAwIFNQSSBjb250cm9sbGVyIGhhcyBhIEhXIGJ1ZyB3aGVuIHRoZSBDRTAgY2hp cAotCSAqIHNpemUgcmVhY2hlcyAxMjhNQi4gRW5mb3JjZSBhIHNpemUgbGltaXQgb2YgMTIwTUIg dG8KLQkgKiBwcmV2ZW50IHRoZSBjb250cm9sbGVyIGZyb20gdXNpbmcgYm9ndXMgc2V0dGluZ3Mg aW4gdGhlCi0JICogc2VnbWVudCByZWdpc3Rlci4KLQkgKi8KLQlpZiAoY2hpcC0+Y3MgPT0gMCAm JiBjb250cm9sbGVyLT5pbmZvID09ICZzcGlfMjUwMF9pbmZvICYmCi0JICAgIHNpemUgPT0gU1pf MTI4TSkgewotCQlzaXplID0gMTIwIDw8IDIwOwotCQlkZXZfaW5mbyhjaGlwLT5ub3IuZGV2LAot CQkJICJDRSVkIHdpbmRvdyByZXNpemVkIHRvICVkTUIgKEFTVDI1MDAgSFcgcXVpcmspIiwKLQkJ CSBjaGlwLT5jcywgc2l6ZSA+PiAyMCk7Ci0JfQotCi0JYWhiX2Jhc2VfcGh5ID0gYXNwZWVkX3Nt Y19haGJfYmFzZV9waHkoY29udHJvbGxlcik7Ci0KLQkvKgotCSAqIEFzIGEgc3RhcnQgYWRkcmVz cyBmb3IgdGhlIGN1cnJlbnQgc2VnbWVudCwgdXNlIHRoZSBkZWZhdWx0Ci0JICogc3RhcnQgYWRk cmVzcyBpZiB3ZSBhcmUgaGFuZGxpbmcgQ0UwIG9yIHVzZSB0aGUgcHJldmlvdXMKLQkgKiBzZWdt ZW50IGVuZGluZyBhZGRyZXNzCi0JICovCi0JaWYgKGNoaXAtPmNzKSB7Ci0JCXUzMiBwcmV2ID0g cmVhZGwoU0VHTUVOVF9BRERSX1JFRyhjb250cm9sbGVyLCBjaGlwLT5jcyAtIDEpKTsKLQotCQlz dGFydCA9IFNFR01FTlRfQUREUl9FTkQocHJldik7Ci0JfSBlbHNlIHsKLQkJc3RhcnQgPSBhaGJf YmFzZV9waHk7Ci0JfQotCi0Jc2l6ZSA9IGNoaXBfc2V0X3NlZ21lbnQoY2hpcCwgY2hpcC0+Y3Ms IHN0YXJ0LCBzaXplKTsKLQotCS8qIFVwZGF0ZSBjaGlwIGJhc2UgYWRkcmVzcyBvbiB0aGUgQUhC IGJ1cyAqLwotCWNoaXAtPmFoYl9iYXNlID0gY29udHJvbGxlci0+YWhiX2Jhc2UgKyAoc3RhcnQg LSBhaGJfYmFzZV9waHkpOwotCi0JLyoKLQkgKiBOb3csIG1ha2Ugc3VyZSB0aGUgbmV4dCBzZWdt ZW50IGRvZXMgbm90IG92ZXJsYXAgd2l0aCB0aGUKLQkgKiBjdXJyZW50IG9uZSB3ZSBqdXN0IGNv bmZpZ3VyZWQsIGV2ZW4gaWYgdGhlcmUgaXMgbm8KLQkgKiBhdmFpbGFibGUgY2hpcC4gVGhhdCBj b3VsZCBicmVhayBhY2Nlc3MgaW4gQ29tbWFuZCBNb2RlLgotCSAqLwotCWlmIChjaGlwLT5jcyA8 IGNvbnRyb2xsZXItPmluZm8tPm5jZSAtIDEpCi0JCWNoaXBfc2V0X3NlZ21lbnQoY2hpcCwgY2hp cC0+Y3MgKyAxLCBzdGFydCArIHNpemUsIDApOwotCi1vdXQ6Ci0JaWYgKHNpemUgPCBjaGlwLT5u b3IubXRkLnNpemUpCi0JCWRldl93YXJuKGNoaXAtPm5vci5kZXYsCi0JCQkgIkNFJWQgd2luZG93 IHRvbyBzbWFsbCBmb3IgY2hpcCAlZE1CIiwKLQkJCSBjaGlwLT5jcywgKHUzMiljaGlwLT5ub3Iu bXRkLnNpemUgPj4gMjApOwotCi0JcmV0dXJuIHNpemU7Ci19Ci0KLXN0YXRpYyB2b2lkIGFzcGVl ZF9zbWNfY2hpcF9lbmFibGVfd3JpdGUoc3RydWN0IGFzcGVlZF9zbWNfY2hpcCAqY2hpcCkKLXsK LQlzdHJ1Y3QgYXNwZWVkX3NtY19jb250cm9sbGVyICpjb250cm9sbGVyID0gY2hpcC0+Y29udHJv bGxlcjsKLQl1MzIgcmVnOwotCi0JcmVnID0gcmVhZGwoY29udHJvbGxlci0+cmVncyArIENPTkZJ R19SRUcpOwotCi0JcmVnIHw9IGFzcGVlZF9zbWNfY2hpcF93cml0ZV9iaXQoY2hpcCk7Ci0Jd3Jp dGVsKHJlZywgY29udHJvbGxlci0+cmVncyArIENPTkZJR19SRUcpOwotfQotCi1zdGF0aWMgdm9p ZCBhc3BlZWRfc21jX2NoaXBfc2V0X3R5cGUoc3RydWN0IGFzcGVlZF9zbWNfY2hpcCAqY2hpcCwg aW50IHR5cGUpCi17Ci0Jc3RydWN0IGFzcGVlZF9zbWNfY29udHJvbGxlciAqY29udHJvbGxlciA9 IGNoaXAtPmNvbnRyb2xsZXI7Ci0JdTMyIHJlZzsKLQotCWNoaXAtPnR5cGUgPSB0eXBlOwotCi0J cmVnID0gcmVhZGwoY29udHJvbGxlci0+cmVncyArIENPTkZJR19SRUcpOwotCXJlZyAmPSB+KDMg PDwgKGNoaXAtPmNzICogMikpOwotCXJlZyB8PSBjaGlwLT50eXBlIDw8IChjaGlwLT5jcyAqIDIp OwotCXdyaXRlbChyZWcsIGNvbnRyb2xsZXItPnJlZ3MgKyBDT05GSUdfUkVHKTsKLX0KLQotLyoK LSAqIFRoZSBmaXJzdCBjaGlwIG9mIHRoZSBBU1QyNTAwIEZNQyBmbGFzaCBjb250cm9sbGVyIGlz IHN0cmFwcGVkIGJ5Ci0gKiBoYXJkd2FyZSwgb3IgYXV0b2RldGVjdGVkLCBidXQgb3RoZXIgY2hp cHMgbmVlZCB0byBiZSBzZXQuIEVuZm9yY2UKLSAqIHRoZSA0QiBzZXR0aW5nIGZvciBhbGwgY2hp cHMuCi0gKi8KLXN0YXRpYyB2b2lkIGFzcGVlZF9zbWNfY2hpcF9zZXRfNGIoc3RydWN0IGFzcGVl ZF9zbWNfY2hpcCAqY2hpcCkKLXsKLQlzdHJ1Y3QgYXNwZWVkX3NtY19jb250cm9sbGVyICpjb250 cm9sbGVyID0gY2hpcC0+Y29udHJvbGxlcjsKLQl1MzIgcmVnOwotCi0JcmVnID0gcmVhZGwoY29u dHJvbGxlci0+cmVncyArIENFX0NPTlRST0xfUkVHKTsKLQlyZWcgfD0gMSA8PCBjaGlwLT5jczsK LQl3cml0ZWwocmVnLCBjb250cm9sbGVyLT5yZWdzICsgQ0VfQ09OVFJPTF9SRUcpOwotfQotCi0v KgotICogVGhlIEFTVDI0MDAgU1BJIGZsYXNoIGNvbnRyb2xsZXIgZG9lcyBub3QgaGF2ZSBhIENF IENvbnRyb2wKLSAqIHJlZ2lzdGVyLiBJdCB1c2VzIHRoZSBDRTAgY29udHJvbCByZWdpc3RlciB0 byBzZXQgNEJ5dGUgbW9kZSBhdCB0aGUKLSAqIGNvbnRyb2xsZXIgbGV2ZWwuCi0gKi8KLXN0YXRp YyB2b2lkIGFzcGVlZF9zbWNfY2hpcF9zZXRfNGJfc3BpXzI0MDAoc3RydWN0IGFzcGVlZF9zbWNf Y2hpcCAqY2hpcCkKLXsKLQljaGlwLT5jdGxfdmFsW3NtY19iYXNlXSB8PSBDT05UUk9MX0lPX0FE RFJFU1NfNEI7Ci0JY2hpcC0+Y3RsX3ZhbFtzbWNfcmVhZF0gfD0gQ09OVFJPTF9JT19BRERSRVNT XzRCOwotfQotCi1zdGF0aWMgaW50IGFzcGVlZF9zbWNfY2hpcF9zZXR1cF9pbml0KHN0cnVjdCBh c3BlZWRfc21jX2NoaXAgKmNoaXAsCi0JCQkJICAgICAgc3RydWN0IHJlc291cmNlICpyZXMpCi17 Ci0Jc3RydWN0IGFzcGVlZF9zbWNfY29udHJvbGxlciAqY29udHJvbGxlciA9IGNoaXAtPmNvbnRy b2xsZXI7Ci0JY29uc3Qgc3RydWN0IGFzcGVlZF9zbWNfaW5mbyAqaW5mbyA9IGNvbnRyb2xsZXIt PmluZm87Ci0JdTMyIHJlZywgYmFzZV9yZWc7Ci0KLQkvKgotCSAqIEFsd2F5cyB0dXJuIG9uIHRo ZSB3cml0ZSBlbmFibGUgYml0IHRvIGFsbG93IG9wY29kZXMgdG8gYmUKLQkgKiBzZW50IGluIHVz ZXIgbW9kZS4KLQkgKi8KLQlhc3BlZWRfc21jX2NoaXBfZW5hYmxlX3dyaXRlKGNoaXApOwotCi0J LyogVGhlIGRyaXZlciBvbmx5IHN1cHBvcnRzIFNQSSB0eXBlIGZsYXNoICovCi0JaWYgKGluZm8t Pmhhc3R5cGUpCi0JCWFzcGVlZF9zbWNfY2hpcF9zZXRfdHlwZShjaGlwLCBzbWNfdHlwZV9zcGkp OwotCi0JLyoKLQkgKiBDb25maWd1cmUgY2hpcCBiYXNlIGFkZHJlc3MgaW4gbWVtb3J5Ci0JICov Ci0JY2hpcC0+YWhiX2Jhc2UgPSBhc3BlZWRfc21jX2NoaXBfYmFzZShjaGlwLCByZXMpOwotCWlm ICghY2hpcC0+YWhiX2Jhc2UpIHsKLQkJZGV2X3dhcm4oY2hpcC0+bm9yLmRldiwgIkNFJWQgd2lu ZG93IGNsb3NlZCIsIGNoaXAtPmNzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyoKLQkg KiBHZXQgdmFsdWUgb2YgdGhlIGluaGVyaXRlZCBjb250cm9sIHJlZ2lzdGVyLiBVLUJvb3QgdXN1 YWxseQotCSAqIGRvZXMgc29tZSB0aW1pbmcgY2FsaWJyYXRpb24gb24gdGhlIEZNQyBjaGlwLCBz byBpdCdzIGdvb2QKLQkgKiB0byBrZWVwIHRoZW0uIEluIHRoZSBmdXR1cmUsIHdlIHNob3VsZCBo YW5kbGUgY2FsaWJyYXRpb24KLQkgKiBmcm9tIExpbnV4LgotCSAqLwotCXJlZyA9IHJlYWRsKGNo aXAtPmN0bCk7Ci0JZGV2X2RiZyhjb250cm9sbGVyLT5kZXYsICJjb250cm9sIHJlZ2lzdGVyOiAl MDh4XG4iLCByZWcpOwotCi0JYmFzZV9yZWcgPSByZWcgJiBDT05UUk9MX0tFRVBfTUFTSzsKLQlp ZiAoYmFzZV9yZWcgIT0gcmVnKSB7Ci0JCWRldl9kYmcoY29udHJvbGxlci0+ZGV2LAotCQkJImNv bnRyb2wgcmVnaXN0ZXIgY2hhbmdlZCB0bzogJTA4eFxuIiwKLQkJCWJhc2VfcmVnKTsKLQl9Ci0J Y2hpcC0+Y3RsX3ZhbFtzbWNfYmFzZV0gPSBiYXNlX3JlZzsKLQotCS8qCi0JICogUmV0YWluIHRo ZSBwcmlvciB2YWx1ZSBvZiB0aGUgY29udHJvbCByZWdpc3RlciBhcyB0aGUKLQkgKiBkZWZhdWx0 IGlmIGl0IHdhcyBub3JtYWwgYWNjZXNzIG1vZGUuIE90aGVyd2lzZSBzdGFydCB3aXRoCi0JICog dGhlIHNhbml0aXplZCBiYXNlIHZhbHVlIHNldCB0byByZWFkIG1vZGUuCi0JICovCi0JaWYgKChy ZWcgJiBDT05UUk9MX0NPTU1BTkRfTU9ERV9NQVNLKSA9PQotCSAgICBDT05UUk9MX0NPTU1BTkRf TU9ERV9OT1JNQUwpCi0JCWNoaXAtPmN0bF92YWxbc21jX3JlYWRdID0gcmVnOwotCWVsc2UKLQkJ Y2hpcC0+Y3RsX3ZhbFtzbWNfcmVhZF0gPSBjaGlwLT5jdGxfdmFsW3NtY19iYXNlXSB8Ci0JCQlD T05UUk9MX0NPTU1BTkRfTU9ERV9OT1JNQUw7Ci0KLQlkZXZfZGJnKGNvbnRyb2xsZXItPmRldiwg ImRlZmF1bHQgY29udHJvbCByZWdpc3RlcjogJTA4eFxuIiwKLQkJY2hpcC0+Y3RsX3ZhbFtzbWNf cmVhZF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFzcGVlZF9zbWNfY2hpcF9zZXR1 cF9maW5pc2goc3RydWN0IGFzcGVlZF9zbWNfY2hpcCAqY2hpcCkKLXsKLQlzdHJ1Y3QgYXNwZWVk X3NtY19jb250cm9sbGVyICpjb250cm9sbGVyID0gY2hpcC0+Y29udHJvbGxlcjsKLQljb25zdCBz dHJ1Y3QgYXNwZWVkX3NtY19pbmZvICppbmZvID0gY29udHJvbGxlci0+aW5mbzsKLQl1MzIgY21k OwotCi0JaWYgKGNoaXAtPm5vci5hZGRyX3dpZHRoID09IDQgJiYgaW5mby0+c2V0XzRiKQotCQlp bmZvLT5zZXRfNGIoY2hpcCk7Ci0KLQkvKiBUaGlzIGlzIGZvciBkaXJlY3QgQUhCIGFjY2VzcyB3 aGVuIHVzaW5nIENvbW1hbmQgTW9kZS4gKi8KLQljaGlwLT5haGJfd2luZG93X3NpemUgPSBhc3Bl ZWRfc21jX2NoaXBfc2V0X3NlZ21lbnQoY2hpcCk7Ci0KLQkvKgotCSAqIGJhc2UgbW9kZSBoYXMg bm90IGJlZW4gb3B0aW1pemVkIHlldC4gdXNlIGl0IGZvciB3cml0ZXMuCi0JICovCi0JY2hpcC0+ Y3RsX3ZhbFtzbWNfd3JpdGVdID0gY2hpcC0+Y3RsX3ZhbFtzbWNfYmFzZV0gfAotCQljaGlwLT5u b3IucHJvZ3JhbV9vcGNvZGUgPDwgQ09OVFJPTF9DT01NQU5EX1NISUZUIHwKLQkJQ09OVFJPTF9D T01NQU5EX01PREVfV1JJVEU7Ci0KLQlkZXZfZGJnKGNvbnRyb2xsZXItPmRldiwgIndyaXRlIGNv bnRyb2wgcmVnaXN0ZXI6ICUwOHhcbiIsCi0JCWNoaXAtPmN0bF92YWxbc21jX3dyaXRlXSk7Ci0K LQkvKgotCSAqIFRPRE86IEFkanVzdCBjbG9ja3MgaWYgZmFzdCByZWFkIGlzIHN1cHBvcnRlZCBh bmQgaW50ZXJwcmV0Ci0JICogU1BJIE5PUiBmbGFncyB0byBhZGp1c3QgY29udHJvbGxlciBzZXR0 aW5ncy4KLQkgKi8KLQlpZiAoY2hpcC0+bm9yLnJlYWRfcHJvdG8gPT0gU05PUl9QUk9UT18xXzFf MSkgewotCQlpZiAoY2hpcC0+bm9yLnJlYWRfZHVtbXkgPT0gMCkKLQkJCWNtZCA9IENPTlRST0xf Q09NTUFORF9NT0RFX05PUk1BTDsKLQkJZWxzZQotCQkJY21kID0gQ09OVFJPTF9DT01NQU5EX01P REVfRlJFQUQ7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycihjaGlwLT5ub3IuZGV2LCAidW5zdXBwb3J0 ZWQgU1BJIHJlYWQgbW9kZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNoaXAtPmN0 bF92YWxbc21jX3JlYWRdIHw9IGNtZCB8Ci0JCUNPTlRST0xfSU9fRFVNTVlfU0VUKGNoaXAtPm5v ci5yZWFkX2R1bW15IC8gOCk7Ci0KLQlkZXZfZGJnKGNvbnRyb2xsZXItPmRldiwgImJhc2UgY29u dHJvbCByZWdpc3RlcjogJTA4eFxuIiwKLQkJY2hpcC0+Y3RsX3ZhbFtzbWNfcmVhZF0pOwotCXJl dHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9ub3JfY29udHJvbGxlcl9vcHMg YXNwZWVkX3NtY19jb250cm9sbGVyX29wcyA9IHsKLQkucHJlcGFyZSA9IGFzcGVlZF9zbWNfcHJl cCwKLQkudW5wcmVwYXJlID0gYXNwZWVkX3NtY191bnByZXAsCi0JLnJlYWRfcmVnID0gYXNwZWVk X3NtY19yZWFkX3JlZywKLQkud3JpdGVfcmVnID0gYXNwZWVkX3NtY193cml0ZV9yZWcsCi0JLnJl YWQgPSBhc3BlZWRfc21jX3JlYWRfdXNlciwKLQkud3JpdGUgPSBhc3BlZWRfc21jX3dyaXRlX3Vz ZXIsCi19OwotCi1zdGF0aWMgaW50IGFzcGVlZF9zbWNfc2V0dXBfZmxhc2goc3RydWN0IGFzcGVl ZF9zbWNfY29udHJvbGxlciAqY29udHJvbGxlciwKLQkJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAq bnAsIHN0cnVjdCByZXNvdXJjZSAqcikKLXsKLQljb25zdCBzdHJ1Y3Qgc3BpX25vcl9od2NhcHMg aHdjYXBzID0gewotCQkubWFzayA9IFNOT1JfSFdDQVBTX1JFQUQgfAotCQkJU05PUl9IV0NBUFNf UkVBRF9GQVNUIHwKLQkJCVNOT1JfSFdDQVBTX1BQLAotCX07Ci0JY29uc3Qgc3RydWN0IGFzcGVl ZF9zbWNfaW5mbyAqaW5mbyA9IGNvbnRyb2xsZXItPmluZm87Ci0Jc3RydWN0IGRldmljZSAqZGV2 ID0gY29udHJvbGxlci0+ZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7Ci0JdW5zaWdu ZWQgaW50IGNzOwotCWludCByZXQgPSAtRU5PREVWOwotCWJvb2wgZm91bmRfb25lID0gZmFsc2U7 Ci0KLQlmb3JfZWFjaF9hdmFpbGFibGVfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGQpIHsKLQkJc3Ry dWN0IGFzcGVlZF9zbWNfY2hpcCAqY2hpcDsKLQkJc3RydWN0IHNwaV9ub3IgKm5vcjsKLQkJc3Ry dWN0IG10ZF9pbmZvICptdGQ7Ci0KLQkJLyogVGhpcyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBO QU5EIG9yIE5PUiBmbGFzaCBkZXZpY2VzLiAqLwotCQlpZiAoIW9mX2RldmljZV9pc19jb21wYXRp YmxlKGNoaWxkLCAiamVkZWMsc3BpLW5vciIpKQotCQkJY29udGludWU7Ci0KLQkJcmV0ID0gb2Zf cHJvcGVydHlfcmVhZF91MzIoY2hpbGQsICJyZWciLCAmY3MpOwotCQlpZiAocmV0KSB7Ci0JCQlk ZXZfZXJyKGRldiwgIkNvdWxkbid0IG5vdCByZWFkIGNoaXAgc2VsZWN0LlxuIik7Ci0JCQlicmVh azsKLQkJfQotCi0JCWlmIChjcyA+PSBpbmZvLT5uY2UpIHsKLQkJCWRldl9lcnIoZGV2LCAiQ2hp cCBzZWxlY3QgJWQgb3V0IG9mIHJhbmdlLlxuIiwKLQkJCQljcyk7Ci0JCQlyZXQgPSAtRVJBTkdF OwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY29udHJvbGxlci0+Y2hpcHNbY3NdKSB7Ci0JCQlk ZXZfZXJyKGRldiwgIkNoaXAgc2VsZWN0ICVkIGFscmVhZHkgaW4gdXNlIGJ5ICVzXG4iLAotCQkJ CWNzLCBkZXZfbmFtZShjb250cm9sbGVyLT5jaGlwc1tjc10tPm5vci5kZXYpKTsKLQkJCXJldCA9 IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2hpcCA9IGRldm1fa3phbGxvYyhjb250cm9s bGVyLT5kZXYsIHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwotCQlpZiAoIWNoaXApIHsKLQkJ CXJldCA9IC1FTk9NRU07Ci0JCQlicmVhazsKLQkJfQotCi0JCWNoaXAtPmNvbnRyb2xsZXIgPSBj b250cm9sbGVyOwotCQljaGlwLT5jdGwgPSBjb250cm9sbGVyLT5yZWdzICsgaW5mby0+Y3RsMCAr IGNzICogNDsKLQkJY2hpcC0+Y3MgPSBjczsKLQotCQlub3IgPSAmY2hpcC0+bm9yOwotCQltdGQg PSAmbm9yLT5tdGQ7Ci0KLQkJbm9yLT5kZXYgPSBkZXY7Ci0JCW5vci0+cHJpdiA9IGNoaXA7Ci0J CXNwaV9ub3Jfc2V0X2ZsYXNoX25vZGUobm9yLCBjaGlsZCk7Ci0JCW5vci0+Y29udHJvbGxlcl9v cHMgPSAmYXNwZWVkX3NtY19jb250cm9sbGVyX29wczsKLQotCQlyZXQgPSBhc3BlZWRfc21jX2No aXBfc2V0dXBfaW5pdChjaGlwLCByKTsKLQkJaWYgKHJldCkKLQkJCWJyZWFrOwotCi0JCS8qCi0J CSAqIFRPRE86IEFkZCBzdXBwb3J0IGZvciBEdWFsIGFuZCBRdWFkIFNQSSBwcm90b2NvbHMKLQkJ ICogYXR0YWNoIHdoZW4gYm9hcmQgc3VwcG9ydCBpcyBwcmVzZW50IGFzIGRldGVybWluZWQKLQkJ ICogYnkgb2YgcHJvcGVydHkuCi0JCSAqLwotCQlyZXQgPSBzcGlfbm9yX3NjYW4obm9yLCBOVUxM LCAmaHdjYXBzKTsKLQkJLyoKLQkJICogSWYgd2UgZmFpbCB0byBzY2FuIHRoZSBkZXZpY2UgaXQg bWlnaHQgbm90IGJlIHByZXNlbnQgb3IKLQkJICogYnJva2VuLiAgRG9uJ3QgZmFpbCB0aGUgd2hv bGUgY29udHJvbGxlciBpZiBvdGhlcnMgd29yay4KLQkJICovCi0JCWlmIChyZXQpIHsKLQkJCWlm IChmb3VuZF9vbmUpCi0JCQkJcmV0ID0gMDsKLQotCQkJZGV2bV9rZnJlZShjb250cm9sbGVyLT5k ZXYsIGNoaXApOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlyZXQgPSBhc3BlZWRfc21jX2NoaXBf c2V0dXBfZmluaXNoKGNoaXApOwotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0KLQkJcmV0ID0gbXRk X2RldmljZV9yZWdpc3RlcihtdGQsIE5VTEwsIDApOwotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0K LQkJY29udHJvbGxlci0+Y2hpcHNbY3NdID0gY2hpcDsKLQkJZm91bmRfb25lID0gdHJ1ZTsKLQl9 Ci0KLQlpZiAocmV0KSB7Ci0JCW9mX25vZGVfcHV0KGNoaWxkKTsKLQkJYXNwZWVkX3NtY191bnJl Z2lzdGVyKGNvbnRyb2xsZXIpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQg YXNwZWVkX3NtY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVj dCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQlzdHJ1Y3QgZGV2aWNlICpk ZXYgPSAmcGRldi0+ZGV2OwotCXN0cnVjdCBhc3BlZWRfc21jX2NvbnRyb2xsZXIgKmNvbnRyb2xs ZXI7Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7Ci0JY29uc3Qgc3RydWN0IGFz cGVlZF9zbWNfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlpbnQgcmV0Owot Ci0JbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2UoYXNwZWVkX3NtY19tYXRjaGVzLCAmcGRldi0+ZGV2 KTsKLQlpZiAoIW1hdGNoIHx8ICFtYXRjaC0+ZGF0YSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaW5m byA9IG1hdGNoLT5kYXRhOwotCi0JY29udHJvbGxlciA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2 LAotCQkJCSAgc3RydWN0X3NpemUoY29udHJvbGxlciwgY2hpcHMsIGluZm8tPm5jZSksCi0JCQkJ ICBHRlBfS0VSTkVMKTsKLQlpZiAoIWNvbnRyb2xsZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCWNv bnRyb2xsZXItPmluZm8gPSBpbmZvOwotCWNvbnRyb2xsZXItPmRldiA9IGRldjsKLQotCW11dGV4 X2luaXQoJmNvbnRyb2xsZXItPm11dGV4KTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBj b250cm9sbGVyKTsKLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09V UkNFX01FTSwgMCk7Ci0JY29udHJvbGxlci0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShk ZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihjb250cm9sbGVyLT5yZWdzKSkKLQkJcmV0dXJuIFBUUl9F UlIoY29udHJvbGxlci0+cmVncyk7Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRl diwgSU9SRVNPVVJDRV9NRU0sIDEpOwotCWNvbnRyb2xsZXItPmFoYl9iYXNlID0gZGV2bV9pb3Jl bWFwX3Jlc291cmNlKGRldiwgcmVzKTsKLQlpZiAoSVNfRVJSKGNvbnRyb2xsZXItPmFoYl9iYXNl KSkKLQkJcmV0dXJuIFBUUl9FUlIoY29udHJvbGxlci0+YWhiX2Jhc2UpOwotCi0JY29udHJvbGxl ci0+YWhiX3dpbmRvd19zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwotCi0JcmV0ID0gYXNwZWVk X3NtY19zZXR1cF9mbGFzaChjb250cm9sbGVyLCBucCwgcmVzKTsKLQlpZiAocmV0KQotCQlkZXZf ZXJyKGRldiwgIkFzcGVlZCBTTUMgcHJvYmUgZmFpbGVkICVkXG4iLCByZXQpOwotCi0JcmV0dXJu IHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXNwZWVkX3NtY19kcml2 ZXIgPSB7Ci0JLnByb2JlID0gYXNwZWVkX3NtY19wcm9iZSwKLQkucmVtb3ZlID0gYXNwZWVkX3Nt Y19yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBERVZJQ0VfTkFNRSwKLQkJLm9mX21h dGNoX3RhYmxlID0gYXNwZWVkX3NtY19tYXRjaGVzLAotCX0KLX07Ci0KLW1vZHVsZV9wbGF0Zm9y bV9kcml2ZXIoYXNwZWVkX3NtY19kcml2ZXIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkFTUEVF RCBTdGF0aWMgTWVtb3J5IENvbnRyb2xsZXIgRHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJDZWRy aWMgTGUgR29hdGVyIDxjbGdAa2FvZC5vcmc+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7 CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYXNwZWVkLXNtYy5jIGIvZHJpdmVycy9zcGkv c3BpLWFzcGVlZC1zbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAu LmNiNWEwNjUyZTVhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1hc3BlZWQt c21jLmMKQEAgLTAsMCArMSw3MTcgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwt Mi4wLW9yLWxhdGVyCisvKgorICogQVNQRUVEIEZNQy9TUEkgTWVtb3J5IENvbnRyb2xsZXIgRHJp dmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMjIsIElCTSBDb3Jwb3JhdGlvbi4KKyAq IENvcHlyaWdodCAoYykgMjAyMCwgQVNQRUVEIENvcnBvcmF0aW9uLgorICovCisKKyNpbmNsdWRl IDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51 eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgv cGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUg PGxpbnV4L3NwaS9zcGktbWVtLmg+CisKKyNkZWZpbmUgREVWSUNFX05BTUUgInNwaS1hc3BlZWQt c21jIgorCisvKiBUeXBlIHNldHRpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ09ORklHX1JFRwkJ CTB4MAorI2RlZmluZSAgIENPTkZJR19UWVBFX1NQSQkJMHgyCisKKy8qIENFIENvbnRyb2wgUmVn aXN0ZXIgKi8KKyNkZWZpbmUgQ0VfQ1RSTF9SRUcJCQkweDQKKworLyogQ0V4IENvbnRyb2wgUmVn aXN0ZXIgKi8KKyNkZWZpbmUgQ0UwX0NUUkxfUkVHCQkJMHgxMAorI2RlZmluZSAgIENUUkxfSU9f TU9ERV9NQVNLCQlHRU5NQVNLKDMwLCAyOCkKKyNkZWZpbmUgICBDVFJMX0lPX1NJTkdMRV9EQVRB CSAgICAgICAgMHgwCisjZGVmaW5lICAgQ1RSTF9JT19EVUFMX0RBVEEJCUJJVCgyOSkKKyNkZWZp bmUgICBDVFJMX0lPX1FVQURfREFUQQkJQklUKDMwKQorI2RlZmluZSAgIENUUkxfQ09NTUFORF9T SElGVAkJMTYKKyNkZWZpbmUgICBDVFJMX0lPX0RVTU1ZX1NFVChkdW1teSkJCQkJCVwKKwkoKCgo KGR1bW15KSA+PiAyKSAmIDB4MSkgPDwgMTQpIHwgKCgoZHVtbXkpICYgMHgzKSA8PCA2KSkKKyNk ZWZpbmUgICBDVFJMX0NFX1NUT1BfQUNUSVZFCQlCSVQoMikKKyNkZWZpbmUgICBDVFJMX0lPX01P REVfQ01EX01BU0sJCUdFTk1BU0soMSwgMCkKKyNkZWZpbmUgICBDVFJMX0lPX01PREVfTk9STUFM CQkweDAKKyNkZWZpbmUgICBDVFJMX0lPX01PREVfUkVBRAkJMHgxCisjZGVmaW5lICAgQ1RSTF9J T19NT0RFX1dSSVRFCQkweDIKKyNkZWZpbmUgICBDVFJMX0lPX01PREVfVVNFUgkJMHgzCisKKyNk ZWZpbmUgICBDVFJMX0lPX0NNRF9NQVNLCQkweGYwZmY0MGMzCisKKy8qIENFeCBBZGRyZXNzIERl Y29kaW5nIFJhbmdlIFJlZ2lzdGVyICovCisjZGVmaW5lIENFMF9TRUdNRU5UX0FERFJfUkVHCQkw eDMwCisKK2VudW0gYXNwZWVkX3NwaV9jdGxfcmVnX3ZhbHVlIHsKKwlBU1BFRURfU1BJX0JBU0Us CisJQVNQRUVEX1NQSV9SRUFELAorCUFTUEVFRF9TUElfV1JJVEUsCisJQVNQRUVEX1NQSV9NQVgs Cit9OworCitzdHJ1Y3QgYXNwZWVkX3NwaTsKKworc3RydWN0IGFzcGVlZF9zcGlfY2hpcCB7CisJ c3RydWN0IGFzcGVlZF9zcGkJKmFzcGk7CisJdTMyCQkJIGNzOworCXZvaWQgX19pb21lbQkJKmN0 bDsKKwl2b2lkIF9faW9tZW0JCSphaGJfYmFzZTsKKwl1MzIJCQkgYWhiX3dpbmRvd19zaXplOwor CXUzMgkJCSBjdGxfdmFsW0FTUEVFRF9TUElfTUFYXTsKKwl1MzIJCQkgY2xrX2ZyZXE7Cit9Owor CitzdHJ1Y3QgYXNwZWVkX3NwaV9kYXRhIHsKKwl1MzIJY3RsMDsKKwl1MzIJbWF4X2NzOworCWJv b2wJaGFzdHlwZTsKKwl1MzIJbW9kZV9iaXRzOworCXUzMgl3ZTA7CisKKwl1MzIgKCpzZWdtZW50 X3N0YXJ0KShzdHJ1Y3QgYXNwZWVkX3NwaSAqYXNwaSwgdTMyIHJlZyk7CisJdTMyICgqc2VnbWVu dF9lbmQpKHN0cnVjdCBhc3BlZWRfc3BpICphc3BpLCB1MzIgcmVnKTsKKwl1MzIgKCpzZWdtZW50 X3JlZykoc3RydWN0IGFzcGVlZF9zcGkgKmFzcGksIHUzMiBzdGFydCwgdTMyIGVuZCk7Cit9Owor CisjZGVmaW5lIEFTUEVFRF9TUElfTUFYX05VTV9DUwk1CisKK3N0cnVjdCBhc3BlZWRfc3BpIHsK Kwljb25zdCBzdHJ1Y3QgYXNwZWVkX3NwaV9kYXRhCSpkYXRhOworCisJdm9pZCBfX2lvbWVtCQkq cmVnczsKKwl2b2lkIF9faW9tZW0JCSphaGJfYmFzZTsKKwl1MzIJCQkgYWhiX2Jhc2VfcGh5Owor CXUzMgkJCSBhaGJfd2luZG93X3NpemU7CisJc3RydWN0IGRldmljZQkJKmRldjsKKworCXN0cnVj dCBjbGsJCSpjbGs7CisJdTMyCQkJIGNsa19mcmVxOworCisJc3RydWN0IGFzcGVlZF9zcGlfY2hp cAkgY2hpcHNbQVNQRUVEX1NQSV9NQVhfTlVNX0NTXTsKK307CisKK3N0YXRpYyB1MzIgYXNwZWVk X3NwaV9nZXRfaW9fbW9kZShjb25zdCBzdHJ1Y3Qgc3BpX21lbV9vcCAqb3ApCit7CisJc3dpdGNo IChvcC0+ZGF0YS5idXN3aWR0aCkgeworCWNhc2UgMToKKwkJcmV0dXJuIENUUkxfSU9fU0lOR0xF X0RBVEE7CisJY2FzZSAyOgorCQlyZXR1cm4gQ1RSTF9JT19EVUFMX0RBVEE7CisJY2FzZSA0Ogor CQlyZXR1cm4gQ1RSTF9JT19RVUFEX0RBVEE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIENUUkxfSU9f U0lOR0xFX0RBVEE7CisJfQorfQorCitzdGF0aWMgdm9pZCBhc3BlZWRfc3BpX3NldF9pb19tb2Rl KHN0cnVjdCBhc3BlZWRfc3BpX2NoaXAgKmNoaXAsIHUzMiBpb19tb2RlKQoreworCXUzMiBjdGw7 CisKKwlpZiAoaW9fbW9kZSA+IDApIHsKKwkJY3RsID0gcmVhZGwoY2hpcC0+Y3RsKSAmIH5DVFJM X0lPX01PREVfTUFTSzsKKwkJY3RsIHw9IGlvX21vZGU7CisJCXdyaXRlbChjdGwsIGNoaXAtPmN0 bCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhc3BlZWRfc3BpX3N0YXJ0X3VzZXIoc3RydWN0IGFz cGVlZF9zcGlfY2hpcCAqY2hpcCkKK3sKKwl1MzIgY3RsID0gY2hpcC0+Y3RsX3ZhbFtBU1BFRURf U1BJX0JBU0VdOworCisJY3RsIHw9IENUUkxfSU9fTU9ERV9VU0VSIHwgQ1RSTF9DRV9TVE9QX0FD VElWRTsKKwl3cml0ZWwoY3RsLCBjaGlwLT5jdGwpOworCisJY3RsICY9IH5DVFJMX0NFX1NUT1Bf QUNUSVZFOworCXdyaXRlbChjdGwsIGNoaXAtPmN0bCk7Cit9CisKK3N0YXRpYyB2b2lkIGFzcGVl ZF9zcGlfc3RvcF91c2VyKHN0cnVjdCBhc3BlZWRfc3BpX2NoaXAgKmNoaXApCit7CisJdTMyIGN0 bCA9IGNoaXAtPmN0bF92YWxbQVNQRUVEX1NQSV9SRUFEXSB8CisJCUNUUkxfSU9fTU9ERV9VU0VS IHwgQ1RSTF9DRV9TVE9QX0FDVElWRTsKKworCXdyaXRlbChjdGwsIGNoaXAtPmN0bCk7CisKKwkv KiBSZXN0b3JlIGRlZmF1bHRzICovCisJd3JpdGVsKGNoaXAtPmN0bF92YWxbQVNQRUVEX1NQSV9S RUFEXSwgY2hpcC0+Y3RsKTsKK30KKworc3RhdGljIGludCBhc3BlZWRfc3BpX3JlYWRfZnJvbV9h aGIodm9pZCAqYnVmLCB2b2lkIF9faW9tZW0gKnNyYywgc2l6ZV90IGxlbikKK3sKKwlzaXplX3Qg b2Zmc2V0ID0gMDsKKworCWlmIChJU19BTElHTkVEKCh1aW50cHRyX3Qpc3JjLCBzaXplb2YodWlu dHB0cl90KSkgJiYKKwkgICAgSVNfQUxJR05FRCgodWludHB0cl90KWJ1Ziwgc2l6ZW9mKHVpbnRw dHJfdCkpKSB7CisJCWlvcmVhZDMyX3JlcChzcmMsIGJ1ZiwgbGVuID4+IDIpOworCQlvZmZzZXQg PSBsZW4gJiB+MHgzOworCQlsZW4gLT0gb2Zmc2V0OworCX0KKwlpb3JlYWQ4X3JlcChzcmMsICh1 OCAqKWJ1ZiArIG9mZnNldCwgbGVuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3Bl ZWRfc3BpX3dyaXRlX3RvX2FoYih2b2lkIF9faW9tZW0gKmRzdCwgY29uc3Qgdm9pZCAqYnVmLCBz aXplX3QgbGVuKQoreworCXNpemVfdCBvZmZzZXQgPSAwOworCisJaWYgKElTX0FMSUdORUQoKHVp bnRwdHJfdClkc3QsIHNpemVvZih1aW50cHRyX3QpKSAmJgorCSAgICBJU19BTElHTkVEKCh1aW50 cHRyX3QpYnVmLCBzaXplb2YodWludHB0cl90KSkpIHsKKwkJaW93cml0ZTMyX3JlcChkc3QsIGJ1 ZiwgbGVuID4+IDIpOworCQlvZmZzZXQgPSBsZW4gJiB+MHgzOworCQlsZW4gLT0gb2Zmc2V0Owor CX0KKwlpb3dyaXRlOF9yZXAoZHN0LCAoY29uc3QgdTggKilidWYgKyBvZmZzZXQsIGxlbik7CisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNwZWVkX3NwaV9zZW5kX2NtZF9hZGRyKHN0cnVj dCBhc3BlZWRfc3BpX2NoaXAgKmNoaXAsIHU4IGFkZHJfbmJ5dGVzLAorCQkJCSAgICB1NjQgb2Zm c2V0LCB1MzIgb3Bjb2RlKQoreworCV9fYmUzMiB0ZW1wOworCXUzMiBjbWRhZGRyOworCisJc3dp dGNoIChhZGRyX25ieXRlcykgeworCWNhc2UgMzoKKwkJY21kYWRkciA9IG9mZnNldCAmIDB4RkZG RkZGOworCQljbWRhZGRyIHw9IG9wY29kZSA8PCAyNDsKKworCQl0ZW1wID0gY3B1X3RvX2JlMzIo Y21kYWRkcik7CisJCWFzcGVlZF9zcGlfd3JpdGVfdG9fYWhiKGNoaXAtPmFoYl9iYXNlLCAmdGVt cCwgNCk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJdGVtcCA9IGNwdV90b19iZTMyKG9mZnNldCk7 CisJCWFzcGVlZF9zcGlfd3JpdGVfdG9fYWhiKGNoaXAtPmFoYl9iYXNlLCAmb3Bjb2RlLCAxKTsK KwkJYXNwZWVkX3NwaV93cml0ZV90b19haGIoY2hpcC0+YWhiX2Jhc2UsICZ0ZW1wLCA0KTsKKwkJ YnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTkNFKDEsICJVbmV4cGVjdGVkIGFkZHJlc3Mgd2lk dGggJXUiLCBhZGRyX25ieXRlcyk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgYXNwZWVkX3NwaV9yZWFkX3JlZyhzdHJ1Y3QgYXNwZWVkX3Nw aV9jaGlwICpjaGlwLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzcGlfbWVtX29wICpvcCkKK3sK Kwlhc3BlZWRfc3BpX3N0YXJ0X3VzZXIoY2hpcCk7CisJYXNwZWVkX3NwaV93cml0ZV90b19haGIo Y2hpcC0+YWhiX2Jhc2UsICZvcC0+Y21kLm9wY29kZSwgMSk7CisJYXNwZWVkX3NwaV9yZWFkX2Zy b21fYWhiKG9wLT5kYXRhLmJ1Zi5pbiwKKwkJCQkgY2hpcC0+YWhiX2Jhc2UsIG9wLT5kYXRhLm5i eXRlcyk7CisJYXNwZWVkX3NwaV9zdG9wX3VzZXIoY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgYXNwZWVkX3NwaV93cml0ZV9yZWcoc3RydWN0IGFzcGVlZF9zcGlfY2hpcCAqY2hp cCwKKwkJCQljb25zdCBzdHJ1Y3Qgc3BpX21lbV9vcCAqb3ApCit7CisJYXNwZWVkX3NwaV9zdGFy dF91c2VyKGNoaXApOworCWFzcGVlZF9zcGlfd3JpdGVfdG9fYWhiKGNoaXAtPmFoYl9iYXNlLCAm b3AtPmNtZC5vcGNvZGUsIDEpOworCWFzcGVlZF9zcGlfd3JpdGVfdG9fYWhiKGNoaXAtPmFoYl9i YXNlLCBvcC0+ZGF0YS5idWYub3V0LAorCQkJCW9wLT5kYXRhLm5ieXRlcyk7CisJYXNwZWVkX3Nw aV9zdG9wX3VzZXIoY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFzcGVl ZF9zcGlfcmVhZF91c2VyKHN0cnVjdCBhc3BlZWRfc3BpX2NoaXAgKmNoaXAsCisJCQkJICAgIGNv bnN0IHN0cnVjdCBzcGlfbWVtX29wICpvcCwKKwkJCQkgICAgdTY0IG9mZnNldCwgc2l6ZV90IGxl biwgdm9pZCAqYnVmKQoreworCWludCBpb19tb2RlID0gYXNwZWVkX3NwaV9nZXRfaW9fbW9kZShv cCk7CisJdTggZHVtbXkgPSAweEZGOworCWludCBpOworCWludCByZXQ7CisKKwlhc3BlZWRfc3Bp X3N0YXJ0X3VzZXIoY2hpcCk7CisKKwlyZXQgPSBhc3BlZWRfc3BpX3NlbmRfY21kX2FkZHIoY2hp cCwgb3AtPmFkZHIubmJ5dGVzLCBvZmZzZXQsIG9wLT5jbWQub3Bjb2RlKTsKKwlpZiAocmV0IDwg MCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChvcC0+ZHVtbXkuYnVzd2lkdGggJiYgb3AtPmR1bW15 Lm5ieXRlcykgeworCQlmb3IgKGkgPSAwOyBpIDwgb3AtPmR1bW15Lm5ieXRlcyAvIG9wLT5kdW1t eS5idXN3aWR0aDsgaSsrKQorCQkJYXNwZWVkX3NwaV93cml0ZV90b19haGIoY2hpcC0+YWhiX2Jh c2UsICZkdW1teSwJc2l6ZW9mKGR1bW15KSk7CisJfQorCisJYXNwZWVkX3NwaV9zZXRfaW9fbW9k ZShjaGlwLCBpb19tb2RlKTsKKworCWFzcGVlZF9zcGlfcmVhZF9mcm9tX2FoYihidWYsIGNoaXAt PmFoYl9iYXNlLCBsZW4pOworCWFzcGVlZF9zcGlfc3RvcF91c2VyKGNoaXApOworCXJldHVybiAw OworfQorCitzdGF0aWMgc3NpemVfdCBhc3BlZWRfc3BpX3dyaXRlX3VzZXIoc3RydWN0IGFzcGVl ZF9zcGlfY2hpcCAqY2hpcCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBzcGlfbWVtX29wICpvcCkK K3sKKwlpbnQgcmV0OworCisJYXNwZWVkX3NwaV9zdGFydF91c2VyKGNoaXApOworCXJldCA9IGFz cGVlZF9zcGlfc2VuZF9jbWRfYWRkcihjaGlwLCBvcC0+YWRkci5uYnl0ZXMsIG9wLT5hZGRyLnZh bCwgb3AtPmNtZC5vcGNvZGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWFzcGVl ZF9zcGlfd3JpdGVfdG9fYWhiKGNoaXAtPmFoYl9iYXNlLCBvcC0+ZGF0YS5idWYub3V0LCBvcC0+ ZGF0YS5uYnl0ZXMpOworCWFzcGVlZF9zcGlfc3RvcF91c2VyKGNoaXApOworCXJldHVybiAwOwor fQorCisvKiBzdXBwb3J0IGZvciAxLTEtMSwgMS0xLTIgb3IgMS0xLTQgKi8KK3N0YXRpYyBib29s IGFzcGVlZF9zcGlfc3VwcG9ydHNfb3Aoc3RydWN0IHNwaV9tZW0gKm1lbSwgY29uc3Qgc3RydWN0 IHNwaV9tZW1fb3AgKm9wKQoreworCWlmIChvcC0+Y21kLmJ1c3dpZHRoID4gMSkKKwkJcmV0dXJu IGZhbHNlOworCisJaWYgKG9wLT5hZGRyLm5ieXRlcyAhPSAwKSB7CisJCWlmIChvcC0+YWRkci5i dXN3aWR0aCA+IDEpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChvcC0+YWRkci5uYnl0ZXMgPCAz IHx8IG9wLT5hZGRyLm5ieXRlcyA+IDQpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKG9w LT5kdW1teS5uYnl0ZXMgIT0gMCkgeworCQlpZiAob3AtPmR1bW15LmJ1c3dpZHRoID4gMSB8fCBv cC0+ZHVtbXkubmJ5dGVzID4gNykKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAob3AtPmRh dGEubmJ5dGVzICE9IDAgJiYgb3AtPmRhdGEuYnVzd2lkdGggPiA0KQorCQlyZXR1cm4gZmFsc2U7 CisKKwlyZXR1cm4gc3BpX21lbV9kZWZhdWx0X3N1cHBvcnRzX29wKG1lbSwgb3ApOworfQorCitz dGF0aWMgaW50IGRvX2FzcGVlZF9zcGlfZXhlY19vcChzdHJ1Y3Qgc3BpX21lbSAqbWVtLCBjb25z dCBzdHJ1Y3Qgc3BpX21lbV9vcCAqb3ApCit7CisJc3RydWN0IGFzcGVlZF9zcGkgKmFzcGkgPSBz cGlfY29udHJvbGxlcl9nZXRfZGV2ZGF0YShtZW0tPnNwaS0+bWFzdGVyKTsKKwlzdHJ1Y3QgYXNw ZWVkX3NwaV9jaGlwICpjaGlwID0gJmFzcGktPmNoaXBzW21lbS0+c3BpLT5jaGlwX3NlbGVjdF07 CisJdTMyIGFkZHJfbW9kZSwgYWRkcl9tb2RlX2JhY2t1cDsKKwl1MzIgY3RsX3ZhbDsKKwlpbnQg cmV0ID0gMDsKKworCWRldl9kYmcoYXNwaS0+ZGV2LAorCQkiQ0UlZCAlcyBPUCAlI3ggbW9kZTol ZC4lZC4lZC4lZCBuYWRkcjolI3ggbmR1bW1pZXM6JSN4IGxlbjolI3giLAorCQljaGlwLT5jcywg b3AtPmRhdGEuZGlyID09IFNQSV9NRU1fREFUQV9JTiA/ICJyZWFkIiA6ICJ3cml0ZSIsCisJCW9w LT5jbWQub3Bjb2RlLCBvcC0+Y21kLmJ1c3dpZHRoLCBvcC0+YWRkci5idXN3aWR0aCwKKwkJb3At PmR1bW15LmJ1c3dpZHRoLCBvcC0+ZGF0YS5idXN3aWR0aCwKKwkJb3AtPmFkZHIubmJ5dGVzLCBv cC0+ZHVtbXkubmJ5dGVzLCBvcC0+ZGF0YS5uYnl0ZXMpOworCisJYWRkcl9tb2RlID0gcmVhZGwo YXNwaS0+cmVncyArIENFX0NUUkxfUkVHKTsKKwlhZGRyX21vZGVfYmFja3VwID0gYWRkcl9tb2Rl OworCisJY3RsX3ZhbCA9IGNoaXAtPmN0bF92YWxbQVNQRUVEX1NQSV9CQVNFXTsKKwljdGxfdmFs ICY9IH5DVFJMX0lPX0NNRF9NQVNLOworCisJY3RsX3ZhbCB8PSBvcC0+Y21kLm9wY29kZSA8PCBD VFJMX0NPTU1BTkRfU0hJRlQ7CisKKwkvKiA0QllURSBhZGRyZXNzIG1vZGUgKi8KKwlpZiAob3At PmFkZHIubmJ5dGVzKSB7CisJCWlmIChvcC0+YWRkci5uYnl0ZXMgPT0gNCkKKwkJCWFkZHJfbW9k ZSB8PSAoMHgxMSA8PCBjaGlwLT5jcyk7CisJCWVsc2UKKwkJCWFkZHJfbW9kZSAmPSB+KDB4MTEg PDwgY2hpcC0+Y3MpOworCX0KKworCWlmIChvcC0+ZHVtbXkubmJ5dGVzKQorCQljdGxfdmFsIHw9 IENUUkxfSU9fRFVNTVlfU0VUKG9wLT5kdW1teS5uYnl0ZXMgLyBvcC0+ZHVtbXkuYnVzd2lkdGgp OworCisJaWYgKG9wLT5kYXRhLm5ieXRlcykKKwkJY3RsX3ZhbCB8PSBhc3BlZWRfc3BpX2dldF9p b19tb2RlKG9wKTsKKworCWlmIChvcC0+ZGF0YS5kaXIgPT0gU1BJX01FTV9EQVRBX09VVCkKKwkJ Y3RsX3ZhbCB8PSBDVFJMX0lPX01PREVfV1JJVEU7CisJZWxzZQorCQljdGxfdmFsIHw9IENUUkxf SU9fTU9ERV9SRUFEOworCisJaWYgKGFkZHJfbW9kZSAhPSBhZGRyX21vZGVfYmFja3VwKQorCQl3 cml0ZWwoYWRkcl9tb2RlLCBhc3BpLT5yZWdzICsgQ0VfQ1RSTF9SRUcpOworCXdyaXRlbChjdGxf dmFsLCBjaGlwLT5jdGwpOworCisJaWYgKG9wLT5kYXRhLmRpciA9PSBTUElfTUVNX0RBVEFfSU4p IHsKKwkJaWYgKCFvcC0+YWRkci5uYnl0ZXMpCisJCQlyZXQgPSBhc3BlZWRfc3BpX3JlYWRfcmVn KGNoaXAsIG9wKTsKKwkJZWxzZQorCQkJcmV0ID0gYXNwZWVkX3NwaV9yZWFkX3VzZXIoY2hpcCwg b3AsIG9wLT5hZGRyLnZhbCwKKwkJCQkJCSAgIG9wLT5kYXRhLm5ieXRlcywgb3AtPmRhdGEuYnVm LmluKTsKKwl9IGVsc2UgeworCQlpZiAoIW9wLT5hZGRyLm5ieXRlcykKKwkJCXJldCA9IGFzcGVl ZF9zcGlfd3JpdGVfcmVnKGNoaXAsIG9wKTsKKwkJZWxzZQorCQkJcmV0ID0gYXNwZWVkX3NwaV93 cml0ZV91c2VyKGNoaXAsIG9wKTsKKwl9CisKKwkvKiBSZXN0b3JlIGRlZmF1bHRzICovCisJaWYg KGFkZHJfbW9kZSAhPSBhZGRyX21vZGVfYmFja3VwKQorCQl3cml0ZWwoYWRkcl9tb2RlX2JhY2t1 cCwgYXNwaS0+cmVncyArIENFX0NUUkxfUkVHKTsKKwl3cml0ZWwoY2hpcC0+Y3RsX3ZhbFtBU1BF RURfU1BJX1JFQURdLCBjaGlwLT5jdGwpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQg YXNwZWVkX3NwaV9leGVjX29wKHN0cnVjdCBzcGlfbWVtICptZW0sIGNvbnN0IHN0cnVjdCBzcGlf bWVtX29wICpvcCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZG9fYXNwZWVkX3NwaV9leGVjX29w KG1lbSwgb3ApOworCWlmIChyZXQpCisJCWRldl9lcnIoJm1lbS0+c3BpLT5kZXYsICJvcGVyYXRp b24gZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qg Y2hhciAqYXNwZWVkX3NwaV9nZXRfbmFtZShzdHJ1Y3Qgc3BpX21lbSAqbWVtKQoreworCXN0cnVj dCBhc3BlZWRfc3BpICphc3BpID0gc3BpX2NvbnRyb2xsZXJfZ2V0X2RldmRhdGEobWVtLT5zcGkt Pm1hc3Rlcik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gYXNwaS0+ZGV2OworCisJcmV0dXJuIGRl dm1fa2FzcHJpbnRmKGRldiwgR0ZQX0tFUk5FTCwgIiVzLiVkIiwgZGV2X25hbWUoZGV2KSwgbWVt LT5zcGktPmNoaXBfc2VsZWN0KTsKK30KKworc3RydWN0IGFzcGVlZF9zcGlfd2luZG93IHsKKwl1 MzIgY3M7CisJdTMyIG9mZnNldDsKKwl1MzIgc2l6ZTsKK307CisKK3N0YXRpYyB2b2lkIGFzcGVl ZF9zcGlfZ2V0X3dpbmRvd3Moc3RydWN0IGFzcGVlZF9zcGkgKmFzcGksCisJCQkJICAgc3RydWN0 IGFzcGVlZF9zcGlfd2luZG93IHdpbmRvd3NbQVNQRUVEX1NQSV9NQVhfTlVNX0NTXSkKK3sKKwlj b25zdCBzdHJ1Y3QgYXNwZWVkX3NwaV9kYXRhICpkYXRhID0gYXNwaS0+ZGF0YTsKKwl1MzIgcmVn X3ZhbDsKKwl1MzIgY3M7CisKKwlmb3IgKGNzID0gMDsgY3MgPCBhc3BpLT5kYXRhLT5tYXhfY3M7 IGNzKyspIHsKKwkJcmVnX3ZhbCA9IHJlYWRsKGFzcGktPnJlZ3MgKyBDRTBfU0VHTUVOVF9BRERS X1JFRyArIGNzICogNCk7CisJCXdpbmRvd3NbY3NdLmNzID0gY3M7CisJCXdpbmRvd3NbY3NdLnNp emUgPSBkYXRhLT5zZWdtZW50X2VuZChhc3BpLCByZWdfdmFsKSAtCisJCQlkYXRhLT5zZWdtZW50 X3N0YXJ0KGFzcGksIHJlZ192YWwpOworCQl3aW5kb3dzW2NzXS5vZmZzZXQgPSBjcyA/IHdpbmRv d3NbY3MgLSAxXS5vZmZzZXQgKyB3aW5kb3dzW2NzIC0gMV0uc2l6ZSA6IDA7CisJCWRldl92ZGJn KGFzcGktPmRldiwgIkNFJWQgb2Zmc2V0PTB4JS44eCBzaXplPTB4JXhcbiIsIGNzLAorCQkJIHdp bmRvd3NbY3NdLm9mZnNldCwgd2luZG93c1tjc10uc2l6ZSk7CisJfQorfQorCisvKgorICogT24g dGhlIEFTVDI2MDAsIHNvbWUgQ0Ugd2luZG93cyBhcmUgY2xvc2VkIGJ5IGRlZmF1bHQgYXQgcmVz ZXQgYnV0CisgKiBVLUJvb3Qgc2hvdWxkIG9wZW4gYWxsLgorICovCitzdGF0aWMgaW50IGFzcGVl ZF9zcGlfY2hpcF9zZXRfZGVmYXVsdF93aW5kb3coc3RydWN0IGFzcGVlZF9zcGlfY2hpcCAqY2hp cCkKK3sKKwlzdHJ1Y3QgYXNwZWVkX3NwaSAqYXNwaSA9IGNoaXAtPmFzcGk7CisJc3RydWN0IGFz cGVlZF9zcGlfd2luZG93IHdpbmRvd3NbQVNQRUVEX1NQSV9NQVhfTlVNX0NTXSA9IHsgMCB9Owor CXN0cnVjdCBhc3BlZWRfc3BpX3dpbmRvdyAqd2luID0gJndpbmRvd3NbY2hpcC0+Y3NdOworCisJ YXNwZWVkX3NwaV9nZXRfd2luZG93cyhhc3BpLCB3aW5kb3dzKTsKKworCWNoaXAtPmFoYl9iYXNl ID0gYXNwaS0+YWhiX2Jhc2UgKyB3aW4tPm9mZnNldDsKKwljaGlwLT5haGJfd2luZG93X3NpemUg PSB3aW4tPnNpemU7CisKKwlkZXZfZGJnKGFzcGktPmRldiwgIkNFJWQgZGVmYXVsdCB3aW5kb3cg WyAweCUuOHggLSAweCUuOHggXSAlZE1CIiwKKwkJY2hpcC0+Y3MsIGFzcGktPmFoYl9iYXNlX3Bo eSArIHdpbi0+b2Zmc2V0LAorCQlhc3BpLT5haGJfYmFzZV9waHkgKyB3aW4tPm9mZnNldCArIHdp bi0+c2l6ZSAtIDEsCisJCXdpbi0+c2l6ZSA+PiAyMCk7CisKKwlyZXR1cm4gY2hpcC0+YWhiX3dp bmRvd19zaXplID8gMCA6IC0xOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9jb250cm9s bGVyX21lbV9vcHMgYXNwZWVkX3NwaV9tZW1fb3BzID0geworCS5zdXBwb3J0c19vcCA9IGFzcGVl ZF9zcGlfc3VwcG9ydHNfb3AsCisJLmV4ZWNfb3AgPSBhc3BlZWRfc3BpX2V4ZWNfb3AsCisJLmdl dF9uYW1lID0gYXNwZWVkX3NwaV9nZXRfbmFtZSwKK307CisKK3N0YXRpYyB2b2lkIGFzcGVlZF9z cGlfY2hpcF9zZXRfdHlwZShzdHJ1Y3QgYXNwZWVkX3NwaSAqYXNwaSwgdW5zaWduZWQgaW50IGNz LCBpbnQgdHlwZSkKK3sKKwl1MzIgcmVnOworCisJcmVnID0gcmVhZGwoYXNwaS0+cmVncyArIENP TkZJR19SRUcpOworCXJlZyAmPSB+KDB4MyA8PCAoY3MgKiAyKSk7CisJcmVnIHw9IHR5cGUgPDwg KGNzICogMik7CisJd3JpdGVsKHJlZywgYXNwaS0+cmVncyArIENPTkZJR19SRUcpOworfQorCitz dGF0aWMgdm9pZCBhc3BlZWRfc3BpX2NoaXBfZW5hYmxlKHN0cnVjdCBhc3BlZWRfc3BpICphc3Bp LCB1bnNpZ25lZCBpbnQgY3MsIGJvb2wgZW5hYmxlKQoreworCXUzMiB3ZV9iaXQgPSBCSVQoYXNw aS0+ZGF0YS0+d2UwICsgY3MpOworCXUzMiByZWcgPSByZWFkbChhc3BpLT5yZWdzICsgQ09ORklH X1JFRyk7CisKKwlpZiAoZW5hYmxlKQorCQlyZWcgfD0gd2VfYml0OworCWVsc2UKKwkJcmVnICY9 IH53ZV9iaXQ7CisJd3JpdGVsKHJlZywgYXNwaS0+cmVncyArIENPTkZJR19SRUcpOworfQorCitz dGF0aWMgaW50IGFzcGVlZF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlz dHJ1Y3QgYXNwZWVkX3NwaSAqYXNwaSA9IHNwaV9jb250cm9sbGVyX2dldF9kZXZkYXRhKHNwaS0+ bWFzdGVyKTsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3NwaV9kYXRhICpkYXRhID0gYXNwaS0+ZGF0 YTsKKwl1bnNpZ25lZCBpbnQgY3MgPSBzcGktPmNoaXBfc2VsZWN0OworCXN0cnVjdCBhc3BlZWRf c3BpX2NoaXAgKmNoaXAgPSAmYXNwaS0+Y2hpcHNbY3NdOworCisJY2hpcC0+YXNwaSA9IGFzcGk7 CisJY2hpcC0+Y3MgPSBjczsKKwljaGlwLT5jdGwgPSBhc3BpLT5yZWdzICsgZGF0YS0+Y3RsMCAr IGNzICogNDsKKworCS8qIFRoZSBkcml2ZXIgb25seSBzdXBwb3J0cyBTUEkgdHlwZSBmbGFzaCAq LworCWlmIChkYXRhLT5oYXN0eXBlKQorCQlhc3BlZWRfc3BpX2NoaXBfc2V0X3R5cGUoYXNwaSwg Y3MsIENPTkZJR19UWVBFX1NQSSk7CisKKwlpZiAoYXNwZWVkX3NwaV9jaGlwX3NldF9kZWZhdWx0 X3dpbmRvdyhjaGlwKSA8IDApIHsKKwkJZGV2X3dhcm4oYXNwaS0+ZGV2LCAiQ0UlZCB3aW5kb3cg aW52YWxpZCIsIGNzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXNwZWVkX3NwaV9jaGlw X2VuYWJsZShhc3BpLCBjcywgdHJ1ZSk7CisKKwljaGlwLT5jdGxfdmFsW0FTUEVFRF9TUElfQkFT RV0gPSBDVFJMX0NFX1NUT1BfQUNUSVZFIHwgQ1RSTF9JT19NT0RFX1VTRVI7CisKKwlkZXZfZGJn KGFzcGktPmRldiwgIkNFJWQgc2V0dXAgZG9uZVxuIiwgY3MpOworCXJldHVybiAwOworfQorCitz dGF0aWMgdm9pZCBhc3BlZWRfc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sK KwlzdHJ1Y3QgYXNwZWVkX3NwaSAqYXNwaSA9IHNwaV9jb250cm9sbGVyX2dldF9kZXZkYXRhKHNw aS0+bWFzdGVyKTsKKwl1bnNpZ25lZCBpbnQgY3MgPSBzcGktPmNoaXBfc2VsZWN0OworCisJYXNw ZWVkX3NwaV9jaGlwX2VuYWJsZShhc3BpLCBjcywgZmFsc2UpOworCisJZGV2X2RiZyhhc3BpLT5k ZXYsICJDRSVkIGNsZWFudXAgZG9uZVxuIiwgY3MpOworfQorCitzdGF0aWMgdm9pZCBhc3BlZWRf c3BpX2VuYWJsZShzdHJ1Y3QgYXNwZWVkX3NwaSAqYXNwaSwgYm9vbCBlbmFibGUpCit7CisJaW50 IGNzOworCisJZm9yIChjcyA9IDA7IGNzIDwgYXNwaS0+ZGF0YS0+bWF4X2NzOyBjcysrKQorCQlh c3BlZWRfc3BpX2NoaXBfZW5hYmxlKGFzcGksIGNzLCBlbmFibGUpOworfQorCitzdGF0aWMgaW50 IGFzcGVlZF9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWNvbnN0IHN0cnVjdCBhc3BlZWRfc3BpX2Rh dGEgKmRhdGE7CisJc3RydWN0IHNwaV9jb250cm9sbGVyICpjdGxyOworCXN0cnVjdCBhc3BlZWRf c3BpICphc3BpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisKKwlkYXRhID0g b2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOworCWlmICghZGF0YSkKKwkJcmV0 dXJuIC1FTk9ERVY7CisKKwljdGxyID0gZGV2bV9zcGlfYWxsb2NfbWFzdGVyKGRldiwgc2l6ZW9m KCphc3BpKSk7CisJaWYgKCFjdGxyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFzcGkgPSBzcGlf Y29udHJvbGxlcl9nZXRfZGV2ZGF0YShjdGxyKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2 LCBhc3BpKTsKKwlhc3BpLT5kYXRhID0gZGF0YTsKKwlhc3BpLT5kZXYgPSBkZXY7CisKKwlyZXMg PSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWFzcGkt PnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIoYXNw aS0+cmVncykpIHsKKwkJZGV2X2VycihkZXYsICJtaXNzaW5nIEFIQiByZWdpc3RlciB3aW5kb3dc biIpOworCQlyZXR1cm4gUFRSX0VSUihhc3BpLT5yZWdzKTsKKwl9CisKKwlyZXMgPSBwbGF0Zm9y bV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOworCWFzcGktPmFoYl9iYXNl ID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGFzcGktPmFo Yl9iYXNlKSkgeworCQlkZXZfZXJyKGRldiwgIm1pc3NpbmcgQUhCIG1hcHBpbmcgd2luZG93XG4i KTsKKwkJcmV0dXJuIFBUUl9FUlIoYXNwaS0+YWhiX2Jhc2UpOworCX0KKworCWFzcGktPmFoYl93 aW5kb3dfc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKwlhc3BpLT5haGJfYmFzZV9waHkgPSBy ZXMtPnN0YXJ0OworCisJYXNwaS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwp OworCWlmIChJU19FUlIoYXNwaS0+Y2xrKSkgeworCQlkZXZfZXJyKGRldiwgIm1pc3NpbmcgY2xv Y2tcbiIpOworCQlyZXR1cm4gUFRSX0VSUihhc3BpLT5jbGspOworCX0KKworCWFzcGktPmNsa19m cmVxID0gY2xrX2dldF9yYXRlKGFzcGktPmNsayk7CisJaWYgKCFhc3BpLT5jbGtfZnJlcSkgewor CQlkZXZfZXJyKGRldiwgImludmFsaWQgY2xvY2tcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9 CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoYXNwaS0+Y2xrKTsKKwlpZiAocmV0KSB7CisJ CWRldl9lcnIoZGV2LCAiY2FuIG5vdCBlbmFibGUgdGhlIGNsb2NrXG4iKTsKKwkJcmV0dXJuIHJl dDsKKwl9CisKKwkvKiBJUlEgaXMgZm9yIERNQSwgd2hpY2ggdGhlIGRyaXZlciBkb2Vzbid0IHN1 cHBvcnQgeWV0ICovCisKKwljdGxyLT5tb2RlX2JpdHMgPSBTUElfUlhfRFVBTCB8IFNQSV9UWF9E VUFMIHwgZGF0YS0+bW9kZV9iaXRzOworCWN0bHItPmJ1c19udW0gPSBwZGV2LT5pZDsKKwljdGxy LT5tZW1fb3BzID0gJmFzcGVlZF9zcGlfbWVtX29wczsKKwljdGxyLT5zZXR1cCA9IGFzcGVlZF9z cGlfc2V0dXA7CisJY3Rsci0+Y2xlYW51cCA9IGFzcGVlZF9zcGlfY2xlYW51cDsKKwljdGxyLT5u dW1fY2hpcHNlbGVjdCA9IGRhdGEtPm1heF9jczsKKwljdGxyLT5kZXYub2Zfbm9kZSA9IGRldi0+ b2Zfbm9kZTsKKworCXJldCA9IGRldm1fc3BpX3JlZ2lzdGVyX2NvbnRyb2xsZXIoZGV2LCBjdGxy KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNwaV9yZWdpc3Rlcl9jb250 cm9sbGVyIGZhaWxlZFxuIik7CisJCWdvdG8gZGlzYWJsZV9jbGs7CisJfQorCXJldHVybiAwOwor CitkaXNhYmxlX2NsazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoYXNwaS0+Y2xrKTsKKwlyZXR1 cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFzcGVlZF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFzcGVlZF9zcGkgKmFzcGkgPSBwbGF0Zm9ybV9n ZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFzcGVlZF9zcGlfZW5hYmxlKGFzcGksIGZhbHNlKTsKKwlj bGtfZGlzYWJsZV91bnByZXBhcmUoYXNwaS0+Y2xrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAq IEFIQiBtYXBwaW5ncworICovCisKKy8qCisgKiBUaGUgU2VnbWVudCBSZWdpc3RlcnMgb2YgdGhl IEFTVDI0MDAgYW5kIEFTVDI1MDAgdXNlIGEgOE1CIHVuaXQuCisgKiBUaGUgYWRkcmVzcyByYW5n ZSBpcyBlbmNvZGVkIHdpdGggYWJzb2x1dGUgYWRkcmVzc2VzIGluIHRoZSBvdmVyYWxsCisgKiBt YXBwaW5nIHdpbmRvdy4KKyAqLworc3RhdGljIHUzMiBhc3BlZWRfc3BpX3NlZ21lbnRfc3RhcnQo c3RydWN0IGFzcGVlZF9zcGkgKmFzcGksIHUzMiByZWcpCit7CisJcmV0dXJuICgocmVnID4+IDE2 KSAmIDB4RkYpIDw8IDIzOworfQorCitzdGF0aWMgdTMyIGFzcGVlZF9zcGlfc2VnbWVudF9lbmQo c3RydWN0IGFzcGVlZF9zcGkgKmFzcGksIHUzMiByZWcpCit7CisJcmV0dXJuICgocmVnID4+IDI0 KSAmIDB4RkYpIDw8IDIzOworfQorCitzdGF0aWMgdTMyIGFzcGVlZF9zcGlfc2VnbWVudF9yZWco c3RydWN0IGFzcGVlZF9zcGkgKmFzcGksIHUzMiBzdGFydCwgdTMyIGVuZCkKK3sKKwlyZXR1cm4g KCgoc3RhcnQgPj4gMjMpICYgMHhGRikgPDwgMTYpIHwgKCgoZW5kID4+IDIzKSAmIDB4RkYpIDw8 IDI0KTsKK30KKworLyoKKyAqIFRoZSBTZWdtZW50IFJlZ2lzdGVycyBvZiB0aGUgQVNUMjYwMCB1 c2UgYSAxTUIgdW5pdC4gVGhlIGFkZHJlc3MKKyAqIHJhbmdlIGlzIGVuY29kZWQgd2l0aCBvZmZz ZXRzIGluIHRoZSBvdmVyYWxsIG1hcHBpbmcgd2luZG93LgorICovCisKKyNkZWZpbmUgQVNUMjYw MF9TRUdfQUREUl9NQVNLIDB4MGZmMDAwMDAKKworc3RhdGljIHUzMiBhc3BlZWRfc3BpX3NlZ21l bnRfYXN0MjYwMF9zdGFydChzdHJ1Y3QgYXNwZWVkX3NwaSAqYXNwaSwKKwkJCQkJICAgIHUzMiBy ZWcpCit7CisJdTMyIHN0YXJ0X29mZnNldCA9IChyZWcgPDwgMTYpICYgQVNUMjYwMF9TRUdfQURE Ul9NQVNLOworCisJcmV0dXJuIGFzcGktPmFoYl9iYXNlX3BoeSArIHN0YXJ0X29mZnNldDsKK30K Kworc3RhdGljIHUzMiBhc3BlZWRfc3BpX3NlZ21lbnRfYXN0MjYwMF9lbmQoc3RydWN0IGFzcGVl ZF9zcGkgKmFzcGksCisJCQkJCSAgdTMyIHJlZykKK3sKKwl1MzIgZW5kX29mZnNldCA9IHJlZyAm IEFTVDI2MDBfU0VHX0FERFJfTUFTSzsKKworCS8qIHNlZ21lbnQgaXMgZGlzYWJsZWQgKi8KKwlp ZiAoIWVuZF9vZmZzZXQpCisJCXJldHVybiBhc3BpLT5haGJfYmFzZV9waHk7CisKKwlyZXR1cm4g YXNwaS0+YWhiX2Jhc2VfcGh5ICsgZW5kX29mZnNldCArIDB4MTAwMDAwOworfQorCitzdGF0aWMg dTMyIGFzcGVlZF9zcGlfc2VnbWVudF9hc3QyNjAwX3JlZyhzdHJ1Y3QgYXNwZWVkX3NwaSAqYXNw aSwKKwkJCQkJICB1MzIgc3RhcnQsIHUzMiBlbmQpCit7CisJLyogZGlzYWJsZSB6ZXJvIHNpemUg c2VnbWVudHMgKi8KKwlpZiAoc3RhcnQgPT0gZW5kKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAo KHN0YXJ0ICYgQVNUMjYwMF9TRUdfQUREUl9NQVNLKSA+PiAxNikgfAorCQkoKGVuZCAtIDEpICYg QVNUMjYwMF9TRUdfQUREUl9NQVNLKTsKK30KKworLyoKKyAqIFBsYXRmb3JtIGRlZmluaXRpb25z CisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXNwZWVkX3NwaV9kYXRhIGFzdDI0MDBfZm1jX2Rh dGEgPSB7CisJLm1heF9jcwkgICAgICAgPSA1LAorCS5oYXN0eXBlICAgICAgID0gdHJ1ZSwKKwku d2UwCSAgICAgICA9IDE2LAorCS5jdGwwCSAgICAgICA9IENFMF9DVFJMX1JFRywKKwkuc2VnbWVu dF9zdGFydCA9IGFzcGVlZF9zcGlfc2VnbWVudF9zdGFydCwKKwkuc2VnbWVudF9lbmQgICA9IGFz cGVlZF9zcGlfc2VnbWVudF9lbmQsCisJLnNlZ21lbnRfcmVnICAgPSBhc3BlZWRfc3BpX3NlZ21l bnRfcmVnLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfc3BpX2RhdGEgYXN0MjUw MF9mbWNfZGF0YSA9IHsKKwkubWF4X2NzCSAgICAgICA9IDMsCisJLmhhc3R5cGUgICAgICAgPSB0 cnVlLAorCS53ZTAJICAgICAgID0gMTYsCisJLmN0bDAJICAgICAgID0gQ0UwX0NUUkxfUkVHLAor CS5zZWdtZW50X3N0YXJ0ID0gYXNwZWVkX3NwaV9zZWdtZW50X3N0YXJ0LAorCS5zZWdtZW50X2Vu ZCAgID0gYXNwZWVkX3NwaV9zZWdtZW50X2VuZCwKKwkuc2VnbWVudF9yZWcgICA9IGFzcGVlZF9z cGlfc2VnbWVudF9yZWcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFzcGVlZF9zcGlfZGF0 YSBhc3QyNTAwX3NwaV9kYXRhID0geworCS5tYXhfY3MJICAgICAgID0gMiwKKwkuaGFzdHlwZSAg ICAgICA9IGZhbHNlLAorCS53ZTAJICAgICAgID0gMTYsCisJLmN0bDAJICAgICAgID0gQ0UwX0NU UkxfUkVHLAorCS5zZWdtZW50X3N0YXJ0ID0gYXNwZWVkX3NwaV9zZWdtZW50X3N0YXJ0LAorCS5z ZWdtZW50X2VuZCAgID0gYXNwZWVkX3NwaV9zZWdtZW50X2VuZCwKKwkuc2VnbWVudF9yZWcgICA9 IGFzcGVlZF9zcGlfc2VnbWVudF9yZWcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFzcGVl ZF9zcGlfZGF0YSBhc3QyNjAwX2ZtY19kYXRhID0geworCS5tYXhfY3MJICAgICAgID0gMywKKwku aGFzdHlwZSAgICAgICA9IGZhbHNlLAorCS5tb2RlX2JpdHMgICAgID0gU1BJX1JYX1FVQUQgfCBT UElfUlhfUVVBRCwKKwkud2UwCSAgICAgICA9IDE2LAorCS5jdGwwCSAgICAgICA9IENFMF9DVFJM X1JFRywKKwkuc2VnbWVudF9zdGFydCA9IGFzcGVlZF9zcGlfc2VnbWVudF9hc3QyNjAwX3N0YXJ0 LAorCS5zZWdtZW50X2VuZCAgID0gYXNwZWVkX3NwaV9zZWdtZW50X2FzdDI2MDBfZW5kLAorCS5z ZWdtZW50X3JlZyAgID0gYXNwZWVkX3NwaV9zZWdtZW50X2FzdDI2MDBfcmVnLAorfTsKKworc3Rh dGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfc3BpX2RhdGEgYXN0MjYwMF9zcGlfZGF0YSA9IHsKKwku bWF4X2NzCSAgICAgICA9IDIsCisJLmhhc3R5cGUgICAgICAgPSBmYWxzZSwKKwkubW9kZV9iaXRz ICAgICA9IFNQSV9SWF9RVUFEIHwgU1BJX1JYX1FVQUQsCisJLndlMAkgICAgICAgPSAxNiwKKwku Y3RsMAkgICAgICAgPSBDRTBfQ1RSTF9SRUcsCisJLnNlZ21lbnRfc3RhcnQgPSBhc3BlZWRfc3Bp X3NlZ21lbnRfYXN0MjYwMF9zdGFydCwKKwkuc2VnbWVudF9lbmQgICA9IGFzcGVlZF9zcGlfc2Vn bWVudF9hc3QyNjAwX2VuZCwKKwkuc2VnbWVudF9yZWcgICA9IGFzcGVlZF9zcGlfc2VnbWVudF9h c3QyNjAwX3JlZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFzcGVl ZF9zcGlfbWF0Y2hlc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI0MDAtZm1j IiwgLmRhdGEgPSAmYXN0MjQwMF9mbWNfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAiYXNwZWVk LGFzdDI1MDAtZm1jIiwgLmRhdGEgPSAmYXN0MjUwMF9mbWNfZGF0YSB9LAorCXsgLmNvbXBhdGli bGUgPSAiYXNwZWVkLGFzdDI1MDAtc3BpIiwgLmRhdGEgPSAmYXN0MjUwMF9zcGlfZGF0YSB9LAor CXsgLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI2MDAtZm1jIiwgLmRhdGEgPSAmYXN0MjYwMF9m bWNfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI2MDAtc3BpIiwgLmRhdGEg PSAmYXN0MjYwMF9zcGlfZGF0YSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2Ys IGFzcGVlZF9zcGlfbWF0Y2hlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFz cGVlZF9zcGlfZHJpdmVyID0geworCS5wcm9iZQkJCT0gYXNwZWVkX3NwaV9wcm9iZSwKKwkucmVt b3ZlCQkJPSBhc3BlZWRfc3BpX3JlbW92ZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQkJPSBERVZJ Q0VfTkFNRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gYXNwZWVkX3NwaV9tYXRjaGVzLAorCX0KK307 CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXNwZWVkX3NwaV9kcml2ZXIpOworCitNT0RVTEVf REVTQ1JJUFRJT04oIkFTUEVFRCBTdGF0aWMgTWVtb3J5IENvbnRyb2xsZXIgRHJpdmVyIik7CitN T0RVTEVfQVVUSE9SKCJDaGluLVRpbmcgS3VvIDxjaGluLXRpbmdfa3VvQGFzcGVlZHRlY2guY29t PiIpOworTU9EVUxFX0FVVEhPUigiQ2VkcmljIExlIEdvYXRlciA8Y2xnQGthb2Qub3JnPiIpOwor TU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlO VEFJTkVSUwppbmRleCAxNDllODRkMzIyOTMuLmZiYWQ4MzA5NDY1NiAxMDA2NDQKLS0tIGEvTUFJ TlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTMxMDksNiArMzEwOSw3IEBAIEw6CW9wZW5i bWNAbGlzdHMub3psYWJzLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBMOgls aW51eC1zcGlAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9u L2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL2FzcGVlZCxhc3QyNjAwLWZtYy55YW1sCitGOglkcml2 ZXJzL3NwaS9zcGktYXNwZWVkLXNtYy5jCiAKIEFTUEVFRCBWSURFTyBFTkdJTkUgRFJJVkVSCiBN OglFZGRpZSBKYW1lcyA8ZWFqYW1lc0BsaW51eC5pYm0uY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9tdGQvc3BpLW5vci9jb250cm9sbGVycy9LY29uZmlnIGIvZHJpdmVycy9tdGQvc3BpLW5vci9j b250cm9sbGVycy9LY29uZmlnCmluZGV4IDUwZjRmMzQ4NGQ0Mi4uY2E0NWRjZDNmZmU4IDEwMDY0 NAotLS0gYS9kcml2ZXJzL210ZC9zcGktbm9yL2NvbnRyb2xsZXJzL0tjb25maWcKKysrIGIvZHJp dmVycy9tdGQvc3BpLW5vci9jb250cm9sbGVycy9LY29uZmlnCkBAIC0xLDE0ICsxLDQgQEAKICMg U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotY29uZmlnIFNQSV9BU1BFRURf U01DCi0JdHJpc3RhdGUgIkFzcGVlZCBmbGFzaCBjb250cm9sbGVycyBpbiBTUEkgbW9kZSIKLQlk ZXBlbmRzIG9uIEFSQ0hfQVNQRUVEIHx8IENPTVBJTEVfVEVTVAotCWRlcGVuZHMgb24gSEFTX0lP TUVNICYmIE9GCi0JaGVscAotCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBGaXJtd2Fy ZSBNZW1vcnkgY29udHJvbGxlciAoRk1DKQotCSAgaW4gdGhlIEFzcGVlZCBBU1QyNTAwL0FTVDI0 MDAgU29DcyB3aGVuIGF0dGFjaGVkIHRvIFNQSSBOT1IgY2hpcHMsCi0JICBhbmQgc3VwcG9ydCBm b3IgdGhlIFNQSSBmbGFzaCBtZW1vcnkgY29udHJvbGxlciAoU1BJKSBmb3IKLQkgIHRoZSBob3N0 IGZpcm13YXJlLiBUaGUgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBTUEkgTk9SLgotCiBj b25maWcgU1BJX0hJU0lfU0ZDCiAJdHJpc3RhdGUgIkhpc2lsaWNvbiBGTUMgU1BJIE5PUiBGbGFz aCBDb250cm9sbGVyKFNGQykiCiAJZGVwZW5kcyBvbiBBUkNIX0hJU0kgfHwgQ09NUElMRV9URVNU CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9zcGktbm9yL2NvbnRyb2xsZXJzL01ha2VmaWxlIGIv ZHJpdmVycy9tdGQvc3BpLW5vci9jb250cm9sbGVycy9NYWtlZmlsZQppbmRleCA2ZTJhMWRjNjg0 NjYuLjBiOGUxZDUzMDkxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvc3BpLW5vci9jb250cm9s bGVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9zcGktbm9yL2NvbnRyb2xsZXJzL01ha2Vm aWxlCkBAIC0xLDQgKzEsMyBAQAogIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAot b2JqLSQoQ09ORklHX1NQSV9BU1BFRURfU01DKQkrPSBhc3BlZWQtc21jLm8KIG9iai0kKENPTkZJ R19TUElfSElTSV9TRkMpCSs9IGhpc2ktc2ZjLm8KIG9iai0kKENPTkZJR19TUElfTlhQX1NQSUZJ KQkrPSBueHAtc3BpZmkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvS2NvbmZpZyBiL2RyaXZl cnMvc3BpL0tjb25maWcKaW5kZXggZDI4MTVlYjM2MWMwLi40YTNiMDJlYzRiYTkgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvc3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9zcGkvS2NvbmZpZwpAQCAtMTAx LDYgKzEwMSwxNyBAQCBjb25maWcgU1BJX0FSTUFEQV8zNzAwCiAJICBUaGlzIGVuYWJsZXMgc3Vw cG9ydCBmb3IgdGhlIFNQSSBjb250cm9sbGVyIHByZXNlbnQgb24gdGhlCiAJICBNYXJ2ZWxsIEFy bWFkYSAzNzAwIFNvQ3MuCiAKK2NvbmZpZyBTUElfQVNQRUVEX1NNQworCXRyaXN0YXRlICJBc3Bl ZWQgZmxhc2ggY29udHJvbGxlcnMgaW4gU1BJIG1vZGUiCisJZGVwZW5kcyBvbiBBUkNIX0FTUEVF RCB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIE9GCisJaGVscAorCSAgVGhpcyBlbmFibGVz IHN1cHBvcnQgZm9yIHRoZSBGaXJtd2FyZSBNZW1vcnkgY29udHJvbGxlciAoRk1DKQorCSAgaW4g dGhlIEFzcGVlZCBBU1QyNjAwLCBBU1QyNTAwIGFuZCBBU1QyNDAwIFNvQ3Mgd2hlbiBhdHRhY2hl ZAorCSAgdG8gU1BJIE5PUiBjaGlwcywgYW5kIHN1cHBvcnQgZm9yIHRoZSBTUEkgZmxhc2ggbWVt b3J5CisJICBjb250cm9sbGVyIChTUEkpIGZvciB0aGUgaG9zdCBmaXJtd2FyZS4gVGhlIGltcGxl bWVudGF0aW9uCisJICBvbmx5IHN1cHBvcnRzIFNQSSBOT1IuCisKIGNvbmZpZyBTUElfQVRNRUwK IAl0cmlzdGF0ZSAiQXRtZWwgU1BJIENvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBBUkNIX0FUOTEg fHwgQ09NUElMRV9URVNUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9NYWtlZmlsZSBiL2RyaXZl cnMvc3BpL01ha2VmaWxlCmluZGV4IDNhYTI4ZWQzZjc2MS4uMTU2NjM4OGI5NmFlIDEwMDY0NAot LS0gYS9kcml2ZXJzL3NwaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NwaS9NYWtlZmlsZQpAQCAt MTksNiArMTksNyBAQCBvYmotJChDT05GSUdfU1BJX0FMVEVSQV9DT1JFKQkJKz0gc3BpLWFsdGVy YS1jb3JlLm8KIG9iai0kKENPTkZJR19TUElfQUxURVJBX0RGTCkJCSs9IHNwaS1hbHRlcmEtZGZs Lm8KIG9iai0kKENPTkZJR19TUElfQVI5MzRYKQkJKz0gc3BpLWFyOTM0eC5vCiBvYmotJChDT05G SUdfU1BJX0FSTUFEQV8zNzAwKQkJKz0gc3BpLWFybWFkYS0zNzAwLm8KK29iai0kKENPTkZJR19T UElfQVNQRUVEX1NNQykJCSs9IHNwaS1hc3BlZWQtc21jLm8KIG9iai0kKENPTkZJR19TUElfQVRN RUwpCQkJKz0gc3BpLWF0bWVsLm8KIG9iai0kKENPTkZJR19TUElfQVRNRUxfUVVBRFNQSSkJCSs9 IGF0bWVsLXF1YWRzcGkubwogb2JqLSQoQ09ORklHX1NQSV9BVDkxX1VTQVJUKQkJKz0gc3BpLWF0 OTEtdXNhcnQubwotLSAKMi4zNS4xCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCkxpbnV4IE1URCBkaXNjdXNzaW9uIG1haWxpbmcgbGlzdApo dHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW10ZC8K