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 23B89C433FE for ; Wed, 19 Oct 2022 15:37:29 +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=EZWi2M2sNnSdvDi7BJMZk0ySgNTeCHtgp2D6A3amm0U=; b=SXc5FGU5BP3cxN s9EtNGIvNVjg8et/jrzSxUqMjGL6Xe85hzqVdAOoYqfGG7WHTW555dsq/mTi+psytvIzwqsqHSD4X PIXbpqZJi0rPh2W7vRiRJnGZZmuazJVvN4N5beNf3RMWz1IcdvnkvWVO7X99UBUpG89A/Nd2025Su dIX5aO6LPeLYzKGe9Bg4YmsZVSuWh72G/DgWr17eoIjTxll02ZoGUGx7/XovjwrA+6ejn2cjQO9Ux v188gkyjNcMkQoVVLeiA1d2qt+5dpJR01rV69FtXMPD9mK/iX+WVOqU54eI+LHOtapRoJNu1VcYtR KNGYRR6sGPFqmjjvpbMg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1olB6m-003KbP-LG; Wed, 19 Oct 2022 15:35:53 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1olAlT-0037dJ-V0 for linux-arm-kernel@lists.infradead.org; Wed, 19 Oct 2022 15:13:57 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 43D9461910; Wed, 19 Oct 2022 15:13:51 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DE44DC433D6; Wed, 19 Oct 2022 15:13:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1666192430; bh=VR3NeTBhBtEAIHhHholn1Yrc2xFwDESTvjvXXcZ5ooE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ejD8zL282tR+g0J0OzgNjBtMHkJRCeBEgRk27/7vAix9hZSti1sKvhGOYYtC5yDTg KUR96fHTYqv7ICVCAa2zdPQVjmlcoPtv2OE4W6Yruw4W3JCEKFgz+ffNkN8pFWkzvI upsE9FPdJmirq4kukaidRRGWszc8AjVNez79tvz6w+g536tpXXcW8eYfQUgAkDa0WB qBvlnG7v6s8fsbs9ZC5b0oaVbVjsyzNmMM0j6S/YKlATr9MROSwwGnLRA7dtuTp9TC MEsbfVYLgnY7xPuNzDEKgWq2wu/tvyMWOljCX2PKw5LtrGQGJ1K8on2otNa28MuCqz zdXfvPotknzXQ== From: Arnd Bergmann To: linux-arm-kernel@lists.infradead.org, Vinod Koul Cc: linux-kernel@vger.kernel.org, Arnd Bergmann , Dan Williams , dmaengine@vger.kernel.org Subject: [PATCH 10/17] dmaengine: remove iop-adma driver Date: Wed, 19 Oct 2022 17:03:32 +0200 Message-Id: <20221019150410.3851944-10-arnd@kernel.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20221019150410.3851944-1-arnd@kernel.org> References: <20221019144119.3848027-1-arnd@kernel.org> <20221019150410.3851944-1-arnd@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221019_081352_230240_BE18E213 X-CRM114-Status: GOOD ( 36.71 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org RnJvbTogQXJuZCBCZXJnbWFubiA8YXJuZEBhcm5kYi5kZT4KClRoZSBpb3AzMnggcGxhdGZvcm0g d2FzIHJlbW92ZWQsIHNvIHRoaXMgZHJpdmVyIGlzIG5vIGxvbmdlcgpuZWVkZWQuCgpDYzogRGFu IFdpbGxpYW1zIDxkYW4uai53aWxsaWFtc0BpbnRlbC5jb20+ClNpZ25lZC1vZmYtYnk6IEFybmQg QmVyZ21hbm4gPGFybmRAYXJuZGIuZGU+Ci0tLQogZHJpdmVycy9kbWEvS2NvbmZpZyAgICB8ICAg IDggLQogZHJpdmVycy9kbWEvTWFrZWZpbGUgICB8ICAgIDEgLQogZHJpdmVycy9kbWEvaW9wLWFk bWEuYyB8IDE1NTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogZHJp dmVycy9kbWEvaW9wLWFkbWEuaCB8ICA5MTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDQgZmls ZXMgY2hhbmdlZCwgMjQ3NyBkZWxldGlvbnMoLSkKIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2RtYS9pb3AtYWRtYS5jCiBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9kbWEvaW9wLWFkbWEu aAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL0tjb25maWcgYi9kcml2ZXJzL2RtYS9LY29uZmln CmluZGV4IDc1MjRiNjJhODg3MC4uYjczZmM4OWJhODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Rt YS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZG1hL0tjb25maWcKQEAgLTM1NywxNCArMzU3LDYgQEAg Y29uZmlnIElOVEVMX0lPQVRETUEKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElO VEVMX0lPUF9BRE1BCi0JdHJpc3RhdGUgIkludGVsIElPUDMyeCBBRE1BIHN1cHBvcnQiCi0JZGVw ZW5kcyBvbiBBUkNIX0lPUDMyWCB8fCBDT01QSUxFX1RFU1QKLQlzZWxlY3QgRE1BX0VOR0lORQot CXNlbGVjdCBBU1lOQ19UWF9FTkFCTEVfQ0hBTk5FTF9TV0lUQ0gKLQloZWxwCi0JICBFbmFibGUg c3VwcG9ydCBmb3IgdGhlIEludGVsKFIpIElPUCBTZXJpZXMgUkFJRCBlbmdpbmVzLgotCiBjb25m aWcgSzNfRE1BCiAJdHJpc3RhdGUgIkhpc2lsaWNvbiBLMyBETUEgc3VwcG9ydCIKIAlkZXBlbmRz IG9uIEFSQ0hfSEkzeHh4IHx8IEFSQ0hfSElTSSB8fCBDT01QSUxFX1RFU1QKZGlmZiAtLWdpdCBh L2RyaXZlcnMvZG1hL01ha2VmaWxlIGIvZHJpdmVycy9kbWEvTWFrZWZpbGUKaW5kZXggMTBmN2Q0 MjQxMDAxLi41YjU1YWRhMDUyYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL01ha2VmaWxlCisr KyBiL2RyaXZlcnMvZG1hL01ha2VmaWxlCkBAIC00NCw3ICs0NCw2IEBAIG9iai0kKENPTkZJR19J TVhfU0RNQSkgKz0gaW14LXNkbWEubwogb2JqLSQoQ09ORklHX0lOVEVMX0lETUE2NCkgKz0gaWRt YTY0Lm8KIG9iai0kKENPTkZJR19JTlRFTF9JT0FURE1BKSArPSBpb2F0Lwogb2JqLXkgKz0gaWR4 ZC8KLW9iai0kKENPTkZJR19JTlRFTF9JT1BfQURNQSkgKz0gaW9wLWFkbWEubwogb2JqLSQoQ09O RklHX0szX0RNQSkgKz0gazNkbWEubwogb2JqLSQoQ09ORklHX0xQQzE4WFhfRE1BTVVYKSArPSBs cGMxOHh4LWRtYW11eC5vCiBvYmotJChDT05GSUdfTUlMQkVBVVRfSERNQUMpICs9IG1pbGJlYXV0 LWhkbWFjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvcC1hZG1hLmMgYi9kcml2ZXJzL2Rt YS9pb3AtYWRtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTBiODk5ZDU4MWYu LjAwMDAwMDAwMDAwMAotLS0gYS9kcml2ZXJzL2RtYS9pb3AtYWRtYS5jCisrKyAvZGV2L251bGwK QEAgLTEsMTU1NCArMCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1v bmx5Ci0vKgotICogb2ZmbG9hZCBlbmdpbmUgZHJpdmVyIGZvciB0aGUgSW50ZWwgWHNjYWxlIHNl cmllcyBvZiBpL28gcHJvY2Vzc29ycwotICogQ29weXJpZ2h0IMKpIDIwMDYsIEludGVsIENvcnBv cmF0aW9uLgotICovCi0KLS8qCi0gKiBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgYXN5bmNocm91 bm91cyBETUEgY29weSBhbmQgUkFJRCBlbmdpbmVzIGF2YWlsYWJsZQotICogb24gdGhlIEludGVs IFhzY2FsZShSKSBmYW1pbHkgb2YgSS9PIFByb2Nlc3NvcnMgKElPUCAzMngsIDMzeCwgMTM0eCkK LSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5o PgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcu aD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVw dC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4 L3ByZWZldGNoLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtb3J5Lmg+Ci0jaW5jbHVkZSA8bGludXgv aW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgotI2luY2x1ZGUgPGxpbnV4L3Ns YWIuaD4KLQotI2luY2x1ZGUgImlvcC1hZG1hLmgiCi0jaW5jbHVkZSAiZG1hZW5naW5lLmgiCi0K LSNkZWZpbmUgdG9faW9wX2FkbWFfY2hhbihjaGFuKSBjb250YWluZXJfb2YoY2hhbiwgc3RydWN0 IGlvcF9hZG1hX2NoYW4sIGNvbW1vbikKLSNkZWZpbmUgdG9faW9wX2FkbWFfZGV2aWNlKGRldikg XAotCWNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpb3BfYWRtYV9kZXZpY2UsIGNvbW1vbikKLSNk ZWZpbmUgdHhfdG9faW9wX2FkbWFfc2xvdCh0eCkgXAotCWNvbnRhaW5lcl9vZih0eCwgc3RydWN0 IGlvcF9hZG1hX2Rlc2Nfc2xvdCwgYXN5bmNfdHgpCi0KLS8qKgotICogaW9wX2FkbWFfZnJlZV9z bG90cyAtIGZsYWdzIGRlc2NyaXB0b3Igc2xvdHMgZm9yIHJldXNlCi0gKiBAc2xvdDogU2xvdCB0 byBmcmVlCi0gKiBDYWxsZXIgbXVzdCBob2xkICZpb3BfY2hhbi0+bG9jayB3aGlsZSBjYWxsaW5n IHRoaXMgZnVuY3Rpb24KLSAqLwotc3RhdGljIHZvaWQgaW9wX2FkbWFfZnJlZV9zbG90cyhzdHJ1 Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpzbG90KQotewotCWludCBzdHJpZGUgPSBzbG90LT5zbG90 c19wZXJfb3A7Ci0KLQl3aGlsZSAoc3RyaWRlLS0pIHsKLQkJc2xvdC0+c2xvdHNfcGVyX29wID0g MDsKLQkJc2xvdCA9IGxpc3RfZW50cnkoc2xvdC0+c2xvdF9ub2RlLm5leHQsCi0JCQkJc3RydWN0 IGlvcF9hZG1hX2Rlc2Nfc2xvdCwKLQkJCQlzbG90X25vZGUpOwotCX0KLX0KLQotc3RhdGljIGRt YV9jb29raWVfdAotaW9wX2FkbWFfcnVuX3R4X2NvbXBsZXRlX2FjdGlvbnMoc3RydWN0IGlvcF9h ZG1hX2Rlc2Nfc2xvdCAqZGVzYywKLQlzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqaW9wX2NoYW4sIGRt YV9jb29raWVfdCBjb29raWUpCi17Ci0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0 eCA9ICZkZXNjLT5hc3luY190eDsKLQotCUJVR19PTih0eC0+Y29va2llIDwgMCk7Ci0JaWYgKHR4 LT5jb29raWUgPiAwKSB7Ci0JCWNvb2tpZSA9IHR4LT5jb29raWU7Ci0JCXR4LT5jb29raWUgPSAw OwotCi0JCS8qIGNhbGwgdGhlIGNhbGxiYWNrIChtdXN0IG5vdCBzbGVlcCBvciBzdWJtaXQgbmV3 Ci0JCSAqIG9wZXJhdGlvbnMgdG8gdGhpcyBjaGFubmVsKQotCQkgKi8KLQkJZG1hZW5naW5lX2Rl c2NfZ2V0X2NhbGxiYWNrX2ludm9rZSh0eCwgTlVMTCk7Ci0KLQkJZG1hX2Rlc2NyaXB0b3JfdW5t YXAodHgpOwotCQlpZiAoZGVzYy0+Z3JvdXBfaGVhZCkKLQkJCWRlc2MtPmdyb3VwX2hlYWQgPSBO VUxMOwotCX0KLQotCS8qIHJ1biBkZXBlbmRlbnQgb3BlcmF0aW9ucyAqLwotCWRtYV9ydW5fZGVw ZW5kZW5jaWVzKHR4KTsKLQotCXJldHVybiBjb29raWU7Ci19Ci0KLXN0YXRpYyBpbnQKLWlvcF9h ZG1hX2NsZWFuX3Nsb3Qoc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywKLQlzdHJ1Y3Qg aW9wX2FkbWFfY2hhbiAqaW9wX2NoYW4pCi17Ci0JLyogdGhlIGNsaWVudCBpcyBhbGxvd2VkIHRv IGF0dGFjaCBkZXBlbmRlbnQgb3BlcmF0aW9ucwotCSAqIHVudGlsICdhY2snIGlzIHNldAotCSAq LwotCWlmICghYXN5bmNfdHhfdGVzdF9hY2soJmRlc2MtPmFzeW5jX3R4KSkKLQkJcmV0dXJuIDA7 Ci0KLQkvKiBsZWF2ZSB0aGUgbGFzdCBkZXNjcmlwdG9yIGluIHRoZSBjaGFpbgotCSAqIHNvIHdl IGNhbiBhcHBlbmQgdG8gaXQKLQkgKi8KLQlpZiAoZGVzYy0+Y2hhaW5fbm9kZS5uZXh0ID09ICZp b3BfY2hhbi0+Y2hhaW4pCi0JCXJldHVybiAxOwotCi0JZGV2X2RiZyhpb3BfY2hhbi0+ZGV2aWNl LT5jb21tb24uZGV2LAotCQkiXHRmcmVlIHNsb3Q6ICVkIHNsb3RzX3Blcl9vcDogJWRcbiIsCi0J CWRlc2MtPmlkeCwgZGVzYy0+c2xvdHNfcGVyX29wKTsKLQotCWxpc3RfZGVsKCZkZXNjLT5jaGFp bl9ub2RlKTsKLQlpb3BfYWRtYV9mcmVlX3Nsb3RzKGRlc2MpOwotCi0JcmV0dXJuIDA7Ci19Ci0K LXN0YXRpYyB2b2lkIF9faW9wX2FkbWFfc2xvdF9jbGVhbnVwKHN0cnVjdCBpb3BfYWRtYV9jaGFu ICppb3BfY2hhbikKLXsKLQlzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICppdGVyLCAqX2l0ZXIs ICpncnBfc3RhcnQgPSBOVUxMOwotCWRtYV9jb29raWVfdCBjb29raWUgPSAwOwotCXUzMiBjdXJy ZW50X2Rlc2MgPSBpb3BfY2hhbl9nZXRfY3VycmVudF9kZXNjcmlwdG9yKGlvcF9jaGFuKTsKLQlp bnQgYnVzeSA9IGlvcF9jaGFuX2lzX2J1c3koaW9wX2NoYW4pOwotCWludCBzZWVuX2N1cnJlbnQg PSAwLCBzbG90X2NudCA9IDAsIHNsb3RzX3Blcl9vcCA9IDA7Ci0KLQlkZXZfZGJnKGlvcF9jaGFu LT5kZXZpY2UtPmNvbW1vbi5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCS8qIGZyZWUgY29tcGxl dGVkIHNsb3RzIGZyb20gdGhlIGNoYWluIHN0YXJ0aW5nIHdpdGgKLQkgKiB0aGUgb2xkZXN0IGRl c2NyaXB0b3IKLQkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXRlciwgX2l0ZXIsICZp b3BfY2hhbi0+Y2hhaW4sCi0JCQkJCWNoYWluX25vZGUpIHsKLQkJcHJfZGVidWcoIlx0Y29va2ll OiAlZCBzbG90OiAlZCBidXN5OiAlZCAiCi0JCQkidGhpc19kZXNjOiAlcGFkIG5leHRfZGVzYzog JSNsbHggYWNrOiAlZFxuIiwKLQkJCWl0ZXItPmFzeW5jX3R4LmNvb2tpZSwgaXRlci0+aWR4LCBi dXN5LAotCQkJJml0ZXItPmFzeW5jX3R4LnBoeXMsICh1NjQpaW9wX2Rlc2NfZ2V0X25leHRfZGVz YyhpdGVyKSwKLQkJCWFzeW5jX3R4X3Rlc3RfYWNrKCZpdGVyLT5hc3luY190eCkpOwotCQlwcmVm ZXRjaChfaXRlcik7Ci0JCXByZWZldGNoKCZfaXRlci0+YXN5bmNfdHgpOwotCi0JCS8qIGRvIG5v dCBhZHZhbmNlIHBhc3QgdGhlIGN1cnJlbnQgZGVzY3JpcHRvciBsb2FkZWQgaW50byB0aGUKLQkJ ICogaGFyZHdhcmUgY2hhbm5lbCwgc3Vic2VxdWVudCBkZXNjcmlwdG9ycyBhcmUgZWl0aGVyIGlu Ci0JCSAqIHByb2Nlc3Mgb3IgaGF2ZSBub3QgYmVlbiBzdWJtaXR0ZWQKLQkJICovCi0JCWlmIChz ZWVuX2N1cnJlbnQpCi0JCQlicmVhazsKLQotCQkvKiBzdG9wIHRoZSBzZWFyY2ggaWYgd2UgcmVh Y2ggdGhlIGN1cnJlbnQgZGVzY3JpcHRvciBhbmQgdGhlCi0JCSAqIGNoYW5uZWwgaXMgYnVzeSwg b3IgaWYgaXQgYXBwZWFycyB0aGF0IHRoZSBjdXJyZW50IGRlc2NyaXB0b3IKLQkJICogbmVlZHMg dG8gYmUgcmUtcmVhZCAoaS5lLiBoYXMgYmVlbiBhcHBlbmRlZCB0bykKLQkJICovCi0JCWlmIChp dGVyLT5hc3luY190eC5waHlzID09IGN1cnJlbnRfZGVzYykgewotCQkJQlVHX09OKHNlZW5fY3Vy cmVudCsrKTsKLQkJCWlmIChidXN5IHx8IGlvcF9kZXNjX2dldF9uZXh0X2Rlc2MoaXRlcikpCi0J CQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBkZXRlY3QgdGhlIHN0YXJ0IG9mIGEgZ3JvdXAgdHJhbnNh Y3Rpb24gKi8KLQkJaWYgKCFzbG90X2NudCAmJiAhc2xvdHNfcGVyX29wKSB7Ci0JCQlzbG90X2Nu dCA9IGl0ZXItPnNsb3RfY250OwotCQkJc2xvdHNfcGVyX29wID0gaXRlci0+c2xvdHNfcGVyX29w OwotCQkJaWYgKHNsb3RfY250IDw9IHNsb3RzX3Blcl9vcCkgewotCQkJCXNsb3RfY250ID0gMDsK LQkJCQlzbG90c19wZXJfb3AgPSAwOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNsb3RfY250KSB7Ci0J CQlwcl9kZWJ1ZygiXHRncm91cCsrXG4iKTsKLQkJCWlmICghZ3JwX3N0YXJ0KQotCQkJCWdycF9z dGFydCA9IGl0ZXI7Ci0JCQlzbG90X2NudCAtPSBzbG90c19wZXJfb3A7Ci0JCX0KLQotCQkvKiBh bGwgdGhlIG1lbWJlcnMgb2YgYSBncm91cCBhcmUgY29tcGxldGUgKi8KLQkJaWYgKHNsb3RzX3Bl cl9vcCAhPSAwICYmIHNsb3RfY250ID09IDApIHsKLQkJCXN0cnVjdCBpb3BfYWRtYV9kZXNjX3Ns b3QgKmdycF9pdGVyLCAqX2dycF9pdGVyOwotCQkJaW50IGVuZF9vZl9jaGFpbiA9IDA7Ci0JCQlw cl9kZWJ1ZygiXHRncm91cCBlbmRcbiIpOwotCi0JCQkvKiBjb2xsZWN0IHRoZSB0b3RhbCByZXN1 bHRzICovCi0JCQlpZiAoZ3JwX3N0YXJ0LT54b3JfY2hlY2tfcmVzdWx0KSB7Ci0JCQkJdTMyIHpl cm9fc3VtX3Jlc3VsdCA9IDA7Ci0JCQkJc2xvdF9jbnQgPSBncnBfc3RhcnQtPnNsb3RfY250Owot CQkJCWdycF9pdGVyID0gZ3JwX3N0YXJ0OwotCi0JCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9t KGdycF9pdGVyLAotCQkJCQkmaW9wX2NoYW4tPmNoYWluLCBjaGFpbl9ub2RlKSB7Ci0JCQkJCXpl cm9fc3VtX3Jlc3VsdCB8PQotCQkJCQkgICAgaW9wX2Rlc2NfZ2V0X3plcm9fcmVzdWx0KGdycF9p dGVyKTsKLQkJCQkJcHJfZGVidWcoIlx0aXRlciVkIHJlc3VsdDogJWRcbiIsCi0JCQkJCSAgICBn cnBfaXRlci0+aWR4LCB6ZXJvX3N1bV9yZXN1bHQpOwotCQkJCQlzbG90X2NudCAtPSBzbG90c19w ZXJfb3A7Ci0JCQkJCWlmIChzbG90X2NudCA9PSAwKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJ CXByX2RlYnVnKCJcdGdycF9zdGFydC0+eG9yX2NoZWNrX3Jlc3VsdDogJXBcbiIsCi0JCQkJCWdy cF9zdGFydC0+eG9yX2NoZWNrX3Jlc3VsdCk7Ci0JCQkJKmdycF9zdGFydC0+eG9yX2NoZWNrX3Jl c3VsdCA9IHplcm9fc3VtX3Jlc3VsdDsKLQkJCX0KLQotCQkJLyogY2xlYW4gdXAgdGhlIGdyb3Vw ICovCi0JCQlzbG90X2NudCA9IGdycF9zdGFydC0+c2xvdF9jbnQ7Ci0JCQlncnBfaXRlciA9IGdy cF9zdGFydDsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9mcm9tKGdycF9pdGVyLCBfZ3Jw X2l0ZXIsCi0JCQkJJmlvcF9jaGFuLT5jaGFpbiwgY2hhaW5fbm9kZSkgewotCQkJCWNvb2tpZSA9 IGlvcF9hZG1hX3J1bl90eF9jb21wbGV0ZV9hY3Rpb25zKAotCQkJCQlncnBfaXRlciwgaW9wX2No YW4sIGNvb2tpZSk7Ci0KLQkJCQlzbG90X2NudCAtPSBzbG90c19wZXJfb3A7Ci0JCQkJZW5kX29m X2NoYWluID0gaW9wX2FkbWFfY2xlYW5fc2xvdChncnBfaXRlciwKLQkJCQkJaW9wX2NoYW4pOwot Ci0JCQkJaWYgKHNsb3RfY250ID09IDAgfHwgZW5kX29mX2NoYWluKQotCQkJCQlicmVhazsKLQkJ CX0KLQotCQkJLyogdGhlIGdyb3VwIHNob3VsZCBiZSBjb21wbGV0ZSBhdCB0aGlzIHBvaW50ICov Ci0JCQlCVUdfT04oc2xvdF9jbnQpOwotCi0JCQlzbG90c19wZXJfb3AgPSAwOwotCQkJZ3JwX3N0 YXJ0ID0gTlVMTDsKLQkJCWlmIChlbmRfb2ZfY2hhaW4pCi0JCQkJYnJlYWs7Ci0JCQllbHNlCi0J CQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAoc2xvdHNfcGVyX29wKSAvKiB3YWl0IGZvciBncm91 cCBjb21wbGV0aW9uICovCi0JCQljb250aW51ZTsKLQotCQkvKiB3cml0ZSBiYWNrIHplcm8gc3Vt IHJlc3VsdHMgKHNpbmdsZSBkZXNjcmlwdG9yIGNhc2UpICovCi0JCWlmIChpdGVyLT54b3JfY2hl Y2tfcmVzdWx0ICYmIGl0ZXItPmFzeW5jX3R4LmNvb2tpZSkKLQkJCSppdGVyLT54b3JfY2hlY2tf cmVzdWx0ID0KLQkJCQlpb3BfZGVzY19nZXRfemVyb19yZXN1bHQoaXRlcik7Ci0KLQkJY29va2ll ID0gaW9wX2FkbWFfcnVuX3R4X2NvbXBsZXRlX2FjdGlvbnMoCi0JCQkJCWl0ZXIsIGlvcF9jaGFu LCBjb29raWUpOwotCi0JCWlmIChpb3BfYWRtYV9jbGVhbl9zbG90KGl0ZXIsIGlvcF9jaGFuKSkK LQkJCWJyZWFrOwotCX0KLQotCWlmIChjb29raWUgPiAwKSB7Ci0JCWlvcF9jaGFuLT5jb21tb24u Y29tcGxldGVkX2Nvb2tpZSA9IGNvb2tpZTsKLQkJcHJfZGVidWcoIlx0Y29tcGxldGVkIGNvb2tp ZSAlZFxuIiwgY29va2llKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1pb3BfYWRtYV9zbG90X2Ns ZWFudXAoc3RydWN0IGlvcF9hZG1hX2NoYW4gKmlvcF9jaGFuKQotewotCXNwaW5fbG9ja19iaCgm aW9wX2NoYW4tPmxvY2spOwotCV9faW9wX2FkbWFfc2xvdF9jbGVhbnVwKGlvcF9jaGFuKTsKLQlz cGluX3VubG9ja19iaCgmaW9wX2NoYW4tPmxvY2spOwotfQotCi1zdGF0aWMgdm9pZCBpb3BfYWRt YV90YXNrbGV0KHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdCkKLXsKLQlzdHJ1Y3QgaW9wX2FkbWFf Y2hhbiAqaW9wX2NoYW4gPSBmcm9tX3Rhc2tsZXQoaW9wX2NoYW4sIHQsCi0JCQkJCQkgICAgICBp cnFfdGFza2xldCk7Ci0KLQkvKiBsb2NrZGVwIHdpbGwgZmxhZyBkZXBlZGVuY3kgc3VibWlzc2lv bnMgYXMgcG90ZW50aWFsbHkKLQkgKiByZWN1cnNpdmUgbG9ja2luZywgdGhpcyBpcyBub3QgdGhl IGNhc2UgYXMgYSBkZXBlbmRlbmN5Ci0JICogc3VibWlzc2lvbiB3aWxsIG5ldmVyIHJlY3Vyc2Ug YSBjaGFubmVscyBzdWJtaXQgcm91dGluZS4KLQkgKiBUaGVyZSBhcmUgY2hlY2tzIGluIGFzeW5j X3R4LmMgdG8gcHJldmVudCB0aGlzLgotCSAqLwotCXNwaW5fbG9ja19uZXN0ZWQoJmlvcF9jaGFu LT5sb2NrLCBTSU5HTEVfREVQVEhfTkVTVElORyk7Ci0JX19pb3BfYWRtYV9zbG90X2NsZWFudXAo aW9wX2NoYW4pOwotCXNwaW5fdW5sb2NrKCZpb3BfY2hhbi0+bG9jayk7Ci19Ci0KLXN0YXRpYyBz dHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICoKLWlvcF9hZG1hX2FsbG9jX3Nsb3RzKHN0cnVjdCBp b3BfYWRtYV9jaGFuICppb3BfY2hhbiwgaW50IG51bV9zbG90cywKLQkJCWludCBzbG90c19wZXJf b3ApCi17Ci0Jc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqaXRlciwgKl9pdGVyLCAqYWxsb2Nf c3RhcnQgPSBOVUxMOwotCUxJU1RfSEVBRChjaGFpbik7Ci0JaW50IHNsb3RzX2ZvdW5kLCByZXRy eSA9IDA7Ci0KLQkvKiBzdGFydCBzZWFyY2ggZnJvbSB0aGUgbGFzdCBhbGxvY2F0ZWQgZGVzY3J0 aXB0b3IKLQkgKiBpZiBhIGNvbnRpZ3VvdXMgYWxsb2NhdGlvbiBjYW4gbm90IGJlIGZvdW5kIHN0 YXJ0IHNlYXJjaGluZwotCSAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAotCSAqLwot cmV0cnk6Ci0Jc2xvdHNfZm91bmQgPSAwOwotCWlmIChyZXRyeSA9PSAwKQotCQlpdGVyID0gaW9w X2NoYW4tPmxhc3RfdXNlZDsKLQllbHNlCi0JCWl0ZXIgPSBsaXN0X2VudHJ5KCZpb3BfY2hhbi0+ YWxsX3Nsb3RzLAotCQkJc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCwKLQkJCXNsb3Rfbm9kZSk7 Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfY29udGludWUoCi0JCWl0ZXIsIF9pdGVyLCAm aW9wX2NoYW4tPmFsbF9zbG90cywgc2xvdF9ub2RlKSB7Ci0JCXByZWZldGNoKF9pdGVyKTsKLQkJ cHJlZmV0Y2goJl9pdGVyLT5hc3luY190eCk7Ci0JCWlmIChpdGVyLT5zbG90c19wZXJfb3ApIHsK LQkJCS8qIGdpdmUgdXAgYWZ0ZXIgZmluZGluZyB0aGUgZmlyc3QgYnVzeSBzbG90Ci0JCQkgKiBv biB0aGUgc2Vjb25kIHBhc3MgdGhyb3VnaCB0aGUgbGlzdAotCQkJICovCi0JCQlpZiAocmV0cnkp Ci0JCQkJYnJlYWs7Ci0KLQkJCXNsb3RzX2ZvdW5kID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0K LQkJLyogc3RhcnQgdGhlIGFsbG9jYXRpb24gaWYgdGhlIHNsb3QgaXMgY29ycmVjdGx5IGFsaWdu ZWQgKi8KLQkJaWYgKCFzbG90c19mb3VuZCsrKSB7Ci0JCQlpZiAoaW9wX2Rlc2NfaXNfYWxpZ25l ZChpdGVyLCBzbG90c19wZXJfb3ApKQotCQkJCWFsbG9jX3N0YXJ0ID0gaXRlcjsKLQkJCWVsc2Ug ewotCQkJCXNsb3RzX2ZvdW5kID0gMDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCi0JCWlm IChzbG90c19mb3VuZCA9PSBudW1fc2xvdHMpIHsKLQkJCXN0cnVjdCBpb3BfYWRtYV9kZXNjX3Ns b3QgKmFsbG9jX3RhaWwgPSBOVUxMOwotCQkJc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqbGFz dF91c2VkID0gTlVMTDsKLQkJCWl0ZXIgPSBhbGxvY19zdGFydDsKLQkJCXdoaWxlIChudW1fc2xv dHMpIHsKLQkJCQlpbnQgaTsKLQkJCQlkZXZfZGJnKGlvcF9jaGFuLT5kZXZpY2UtPmNvbW1vbi5k ZXYsCi0JCQkJCSJhbGxvY2F0ZWQgc2xvdDogJWQgIgotCQkJCQkiKGRlc2MgJXAgcGh5czogJSNs bHgpIHNsb3RzX3Blcl9vcCAlZFxuIiwKLQkJCQkJaXRlci0+aWR4LCBpdGVyLT5od19kZXNjLAot CQkJCQkodTY0KWl0ZXItPmFzeW5jX3R4LnBoeXMsIHNsb3RzX3Blcl9vcCk7Ci0KLQkJCQkvKiBw cmUtYWNrIGFsbCBidXQgdGhlIGxhc3QgZGVzY3JpcHRvciAqLwotCQkJCWlmIChudW1fc2xvdHMg IT0gc2xvdHNfcGVyX29wKQotCQkJCQlhc3luY190eF9hY2soJml0ZXItPmFzeW5jX3R4KTsKLQot CQkJCWxpc3RfYWRkX3RhaWwoJml0ZXItPmNoYWluX25vZGUsICZjaGFpbik7Ci0JCQkJYWxsb2Nf dGFpbCA9IGl0ZXI7Ci0JCQkJaXRlci0+YXN5bmNfdHguY29va2llID0gMDsKLQkJCQlpdGVyLT5z bG90X2NudCA9IG51bV9zbG90czsKLQkJCQlpdGVyLT54b3JfY2hlY2tfcmVzdWx0ID0gTlVMTDsK LQkJCQlmb3IgKGkgPSAwOyBpIDwgc2xvdHNfcGVyX29wOyBpKyspIHsKLQkJCQkJaXRlci0+c2xv dHNfcGVyX29wID0gc2xvdHNfcGVyX29wIC0gaTsKLQkJCQkJbGFzdF91c2VkID0gaXRlcjsKLQkJ CQkJaXRlciA9IGxpc3RfZW50cnkoaXRlci0+c2xvdF9ub2RlLm5leHQsCi0JCQkJCQlzdHJ1Y3Qg aW9wX2FkbWFfZGVzY19zbG90LAotCQkJCQkJc2xvdF9ub2RlKTsKLQkJCQl9Ci0JCQkJbnVtX3Ns b3RzIC09IHNsb3RzX3Blcl9vcDsKLQkJCX0KLQkJCWFsbG9jX3RhaWwtPmdyb3VwX2hlYWQgPSBh bGxvY19zdGFydDsKLQkJCWFsbG9jX3RhaWwtPmFzeW5jX3R4LmNvb2tpZSA9IC1FQlVTWTsKLQkJ CWxpc3Rfc3BsaWNlKCZjaGFpbiwgJmFsbG9jX3RhaWwtPnR4X2xpc3QpOwotCQkJaW9wX2NoYW4t Pmxhc3RfdXNlZCA9IGxhc3RfdXNlZDsKLQkJCWlvcF9kZXNjX2NsZWFyX25leHRfZGVzYyhhbGxv Y19zdGFydCk7Ci0JCQlpb3BfZGVzY19jbGVhcl9uZXh0X2Rlc2MoYWxsb2NfdGFpbCk7Ci0JCQly ZXR1cm4gYWxsb2NfdGFpbDsKLQkJfQotCX0KLQlpZiAoIXJldHJ5KyspCi0JCWdvdG8gcmV0cnk7 Ci0KLQkvKiBwZXJmb3JtIGRpcmVjdCByZWNsYWltIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxzICov Ci0JX19pb3BfYWRtYV9zbG90X2NsZWFudXAoaW9wX2NoYW4pOwotCi0JcmV0dXJuIE5VTEw7Ci19 Ci0KLXN0YXRpYyB2b2lkIGlvcF9hZG1hX2NoZWNrX3RocmVzaG9sZChzdHJ1Y3QgaW9wX2FkbWFf Y2hhbiAqaW9wX2NoYW4pCi17Ci0JZGV2X2RiZyhpb3BfY2hhbi0+ZGV2aWNlLT5jb21tb24uZGV2 LCAicGVuZGluZzogJWRcbiIsCi0JCWlvcF9jaGFuLT5wZW5kaW5nKTsKLQotCWlmIChpb3BfY2hh bi0+cGVuZGluZyA+PSBJT1BfQURNQV9USFJFU0hPTEQpIHsKLQkJaW9wX2NoYW4tPnBlbmRpbmcg PSAwOwotCQlpb3BfY2hhbl9hcHBlbmQoaW9wX2NoYW4pOwotCX0KLX0KLQotc3RhdGljIGRtYV9j b29raWVfdAotaW9wX2FkbWFfdHhfc3VibWl0KHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRv ciAqdHgpCi17Ci0Jc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqc3dfZGVzYyA9IHR4X3RvX2lv cF9hZG1hX3Nsb3QodHgpOwotCXN0cnVjdCBpb3BfYWRtYV9jaGFuICppb3BfY2hhbiA9IHRvX2lv cF9hZG1hX2NoYW4odHgtPmNoYW4pOwotCXN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmdycF9z dGFydCwgKm9sZF9jaGFpbl90YWlsOwotCWludCBzbG90X2NudDsKLQlkbWFfY29va2llX3QgY29v a2llOwotCWRtYV9hZGRyX3QgbmV4dF9kbWE7Ci0KLQlncnBfc3RhcnQgPSBzd19kZXNjLT5ncm91 cF9oZWFkOwotCXNsb3RfY250ID0gZ3JwX3N0YXJ0LT5zbG90X2NudDsKLQotCXNwaW5fbG9ja19i aCgmaW9wX2NoYW4tPmxvY2spOwotCWNvb2tpZSA9IGRtYV9jb29raWVfYXNzaWduKHR4KTsKLQot CW9sZF9jaGFpbl90YWlsID0gbGlzdF9lbnRyeShpb3BfY2hhbi0+Y2hhaW4ucHJldiwKLQkJc3Ry dWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCwgY2hhaW5fbm9kZSk7Ci0JbGlzdF9zcGxpY2VfaW5pdCgm c3dfZGVzYy0+dHhfbGlzdCwKLQkJCSAmb2xkX2NoYWluX3RhaWwtPmNoYWluX25vZGUpOwotCi0J LyogZml4IHVwIHRoZSBoYXJkd2FyZSBjaGFpbiAqLwotCW5leHRfZG1hID0gZ3JwX3N0YXJ0LT5h c3luY190eC5waHlzOwotCWlvcF9kZXNjX3NldF9uZXh0X2Rlc2Mob2xkX2NoYWluX3RhaWwsIG5l eHRfZG1hKTsKLQlCVUdfT04oaW9wX2Rlc2NfZ2V0X25leHRfZGVzYyhvbGRfY2hhaW5fdGFpbCkg IT0gbmV4dF9kbWEpOyAvKiBmbHVzaCAqLwotCi0JLyogY2hlY2sgZm9yIHByZS1jaGFpbmVkIGRl c2NyaXB0b3JzICovCi0JaW9wX3BhcmFub2lhKGlvcF9kZXNjX2dldF9uZXh0X2Rlc2Moc3dfZGVz YykpOwotCi0JLyogaW5jcmVtZW50IHRoZSBwZW5kaW5nIGNvdW50IGJ5IHRoZSBudW1iZXIgb2Yg c2xvdHMKLQkgKiBtZW1jcHkgb3BlcmF0aW9ucyBoYXZlIGEgMToxIChzbG90Om9wZXJhdGlvbikg cmVsYXRpb24KLQkgKiBvdGhlciBvcGVyYXRpb25zIGFyZSBoZWF2aWVyIGFuZCB3aWxsIHBvcCB0 aGUgdGhyZXNob2xkCi0JICogbW9yZSBvZnRlbi4KLQkgKi8KLQlpb3BfY2hhbi0+cGVuZGluZyAr PSBzbG90X2NudDsKLQlpb3BfYWRtYV9jaGVja190aHJlc2hvbGQoaW9wX2NoYW4pOwotCXNwaW5f dW5sb2NrX2JoKCZpb3BfY2hhbi0+bG9jayk7Ci0KLQlkZXZfZGJnKGlvcF9jaGFuLT5kZXZpY2Ut PmNvbW1vbi5kZXYsICIlcyBjb29raWU6ICVkIHNsb3Q6ICVkXG4iLAotCQlfX2Z1bmNfXywgc3df ZGVzYy0+YXN5bmNfdHguY29va2llLCBzd19kZXNjLT5pZHgpOwotCi0JcmV0dXJuIGNvb2tpZTsK LX0KLQotc3RhdGljIHZvaWQgaW9wX2NoYW5fc3RhcnRfbnVsbF9tZW1jcHkoc3RydWN0IGlvcF9h ZG1hX2NoYW4gKmlvcF9jaGFuKTsKLXN0YXRpYyB2b2lkIGlvcF9jaGFuX3N0YXJ0X251bGxfeG9y KHN0cnVjdCBpb3BfYWRtYV9jaGFuICppb3BfY2hhbik7Ci0KLS8qKgotICogaW9wX2FkbWFfYWxs b2NfY2hhbl9yZXNvdXJjZXMgLSAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGFsbG9jYXRlZCBkZXNj cmlwdG9ycwotICogQGNoYW46IGFsbG9jYXRlIGRlc2NyaXB0b3IgcmVzb3VyY2VzIGZvciB0aGlz IGNoYW5uZWwKLSAqCi0gKiBOb3RlOiBXZSBrZWVwIHRoZSBzbG90cyBmb3IgMSBvcGVyYXRpb24g b24gaW9wX2NoYW4tPmNoYWluIGF0IGFsbCB0aW1lcy4gIFRvCi0gKiBhdm9pZCBkZWFkbG9jaywg dmlhIGFzeW5jX3hvciwgbnVtX2Rlc2NzX2luX3Bvb2wgbXVzdCBhdCBhIG1pbmltdW0gYmUKLSAq IGdyZWF0ZXIgdGhhbiAyeCB0aGUgbnVtYmVyIHNsb3RzIG5lZWRlZCB0byBzYXRpc2Z5IGEgZGV2 aWNlLT5tYXhfeG9yCi0gKiByZXF1ZXN0LgotICogKi8KLXN0YXRpYyBpbnQgaW9wX2FkbWFfYWxs b2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQotewotCWNoYXIgKmh3X2Rl c2M7Ci0JZG1hX2FkZHJfdCBkbWFfZGVzYzsKLQlpbnQgaWR4OwotCXN0cnVjdCBpb3BfYWRtYV9j aGFuICppb3BfY2hhbiA9IHRvX2lvcF9hZG1hX2NoYW4oY2hhbik7Ci0Jc3RydWN0IGlvcF9hZG1h X2Rlc2Nfc2xvdCAqc2xvdCA9IE5VTEw7Ci0JaW50IGluaXQgPSBpb3BfY2hhbi0+c2xvdHNfYWxs b2NhdGVkID8gMCA6IDE7Ci0Jc3RydWN0IGlvcF9hZG1hX3BsYXRmb3JtX2RhdGEgKnBsYXRfZGF0 YSA9Ci0JCWRldl9nZXRfcGxhdGRhdGEoJmlvcF9jaGFuLT5kZXZpY2UtPnBkZXYtPmRldik7Ci0J aW50IG51bV9kZXNjc19pbl9wb29sID0gcGxhdF9kYXRhLT5wb29sX3NpemUvSU9QX0FETUFfU0xP VF9TSVpFOwotCi0JLyogQWxsb2NhdGUgZGVzY3JpcHRvciBzbG90cyAqLwotCWRvIHsKLQkJaWR4 ID0gaW9wX2NoYW4tPnNsb3RzX2FsbG9jYXRlZDsKLQkJaWYgKGlkeCA9PSBudW1fZGVzY3NfaW5f cG9vbCkKLQkJCWJyZWFrOwotCi0JCXNsb3QgPSBremFsbG9jKHNpemVvZigqc2xvdCksIEdGUF9L RVJORUwpOwotCQlpZiAoIXNsb3QpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIklPUCBBRE1BIENo YW5uZWwgb25seSBpbml0aWFsaXplZCIKLQkJCQkiICVkIGRlc2NyaXB0b3Igc2xvdHMiLCBpZHgp OwotCQkJYnJlYWs7Ci0JCX0KLQkJaHdfZGVzYyA9IChjaGFyICopIGlvcF9jaGFuLT5kZXZpY2Ut PmRtYV9kZXNjX3Bvb2xfdmlydDsKLQkJc2xvdC0+aHdfZGVzYyA9ICh2b2lkICopICZod19kZXNj W2lkeCAqIElPUF9BRE1BX1NMT1RfU0laRV07Ci0KLQkJZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3Jf aW5pdCgmc2xvdC0+YXN5bmNfdHgsIGNoYW4pOwotCQlzbG90LT5hc3luY190eC50eF9zdWJtaXQg PSBpb3BfYWRtYV90eF9zdWJtaXQ7Ci0JCUlOSVRfTElTVF9IRUFEKCZzbG90LT50eF9saXN0KTsK LQkJSU5JVF9MSVNUX0hFQUQoJnNsb3QtPmNoYWluX25vZGUpOwotCQlJTklUX0xJU1RfSEVBRCgm c2xvdC0+c2xvdF9ub2RlKTsKLQkJZG1hX2Rlc2MgPSBpb3BfY2hhbi0+ZGV2aWNlLT5kbWFfZGVz Y19wb29sOwotCQlzbG90LT5hc3luY190eC5waHlzID0gZG1hX2Rlc2MgKyBpZHggKiBJT1BfQURN QV9TTE9UX1NJWkU7Ci0JCXNsb3QtPmlkeCA9IGlkeDsKLQotCQlzcGluX2xvY2tfYmgoJmlvcF9j aGFuLT5sb2NrKTsKLQkJaW9wX2NoYW4tPnNsb3RzX2FsbG9jYXRlZCsrOwotCQlsaXN0X2FkZF90 YWlsKCZzbG90LT5zbG90X25vZGUsICZpb3BfY2hhbi0+YWxsX3Nsb3RzKTsKLQkJc3Bpbl91bmxv Y2tfYmgoJmlvcF9jaGFuLT5sb2NrKTsKLQl9IHdoaWxlIChpb3BfY2hhbi0+c2xvdHNfYWxsb2Nh dGVkIDwgbnVtX2Rlc2NzX2luX3Bvb2wpOwotCi0JaWYgKGlkeCAmJiAhaW9wX2NoYW4tPmxhc3Rf dXNlZCkKLQkJaW9wX2NoYW4tPmxhc3RfdXNlZCA9IGxpc3RfZW50cnkoaW9wX2NoYW4tPmFsbF9z bG90cy5uZXh0LAotCQkJCQlzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90LAotCQkJCQlzbG90X25v ZGUpOwotCi0JZGV2X2RiZyhpb3BfY2hhbi0+ZGV2aWNlLT5jb21tb24uZGV2LAotCQkiYWxsb2Nh dGVkICVkIGRlc2NyaXB0b3Igc2xvdHMgbGFzdF91c2VkOiAlcFxuIiwKLQkJaW9wX2NoYW4tPnNs b3RzX2FsbG9jYXRlZCwgaW9wX2NoYW4tPmxhc3RfdXNlZCk7Ci0KLQkvKiBpbml0aWFsaXplIHRo ZSBjaGFubmVsIGFuZCB0aGUgY2hhaW4gd2l0aCBhIG51bGwgb3BlcmF0aW9uICovCi0JaWYgKGlu aXQpIHsKLQkJaWYgKGRtYV9oYXNfY2FwKERNQV9NRU1DUFksCi0JCQlpb3BfY2hhbi0+ZGV2aWNl LT5jb21tb24uY2FwX21hc2spKQotCQkJaW9wX2NoYW5fc3RhcnRfbnVsbF9tZW1jcHkoaW9wX2No YW4pOwotCQllbHNlIGlmIChkbWFfaGFzX2NhcChETUFfWE9SLAotCQkJaW9wX2NoYW4tPmRldmlj ZS0+Y29tbW9uLmNhcF9tYXNrKSkKLQkJCWlvcF9jaGFuX3N0YXJ0X251bGxfeG9yKGlvcF9jaGFu KTsKLQkJZWxzZQotCQkJQlVHKCk7Ci0JfQotCi0JcmV0dXJuIChpZHggPiAwKSA/IGlkeCA6IC1F Tk9NRU07Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgotaW9w X2FkbWFfcHJlcF9kbWFfaW50ZXJydXB0KHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdW5zaWduZWQg bG9uZyBmbGFncykKLXsKLQlzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqaW9wX2NoYW4gPSB0b19pb3Bf YWRtYV9jaGFuKGNoYW4pOwotCXN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKnN3X2Rlc2MsICpn cnBfc3RhcnQ7Ci0JaW50IHNsb3RfY250LCBzbG90c19wZXJfb3A7Ci0KLQlkZXZfZGJnKGlvcF9j aGFuLT5kZXZpY2UtPmNvbW1vbi5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCi0Jc3Bpbl9sb2Nr X2JoKCZpb3BfY2hhbi0+bG9jayk7Ci0Jc2xvdF9jbnQgPSBpb3BfY2hhbl9pbnRlcnJ1cHRfc2xv dF9jb3VudCgmc2xvdHNfcGVyX29wLCBpb3BfY2hhbik7Ci0Jc3dfZGVzYyA9IGlvcF9hZG1hX2Fs bG9jX3Nsb3RzKGlvcF9jaGFuLCBzbG90X2NudCwgc2xvdHNfcGVyX29wKTsKLQlpZiAoc3dfZGVz YykgewotCQlncnBfc3RhcnQgPSBzd19kZXNjLT5ncm91cF9oZWFkOwotCQlpb3BfZGVzY19pbml0 X2ludGVycnVwdChncnBfc3RhcnQsIGlvcF9jaGFuKTsKLQkJc3dfZGVzYy0+YXN5bmNfdHguZmxh Z3MgPSBmbGFnczsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJmlvcF9jaGFuLT5sb2NrKTsKLQotCXJl dHVybiBzd19kZXNjID8gJnN3X2Rlc2MtPmFzeW5jX3R4IDogTlVMTDsKLX0KLQotc3RhdGljIHN0 cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCi1pb3BfYWRtYV9wcmVwX2RtYV9tZW1jcHko c3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfYWRkcl90IGRtYV9kZXN0LAotCQkJIGRtYV9hZGRy X3QgZG1hX3NyYywgc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlzdHJ1Y3Qg aW9wX2FkbWFfY2hhbiAqaW9wX2NoYW4gPSB0b19pb3BfYWRtYV9jaGFuKGNoYW4pOwotCXN0cnVj dCBpb3BfYWRtYV9kZXNjX3Nsb3QgKnN3X2Rlc2MsICpncnBfc3RhcnQ7Ci0JaW50IHNsb3RfY250 LCBzbG90c19wZXJfb3A7Ci0KLQlpZiAodW5saWtlbHkoIWxlbikpCi0JCXJldHVybiBOVUxMOwot CUJVR19PTihsZW4gPiBJT1BfQURNQV9NQVhfQllURV9DT1VOVCk7Ci0KLQlkZXZfZGJnKGlvcF9j aGFuLT5kZXZpY2UtPmNvbW1vbi5kZXYsICIlcyBsZW46ICV6dVxuIiwKLQkJX19mdW5jX18sIGxl bik7Ci0KLQlzcGluX2xvY2tfYmgoJmlvcF9jaGFuLT5sb2NrKTsKLQlzbG90X2NudCA9IGlvcF9j aGFuX21lbWNweV9zbG90X2NvdW50KGxlbiwgJnNsb3RzX3Blcl9vcCk7Ci0Jc3dfZGVzYyA9IGlv cF9hZG1hX2FsbG9jX3Nsb3RzKGlvcF9jaGFuLCBzbG90X2NudCwgc2xvdHNfcGVyX29wKTsKLQlp ZiAoc3dfZGVzYykgewotCQlncnBfc3RhcnQgPSBzd19kZXNjLT5ncm91cF9oZWFkOwotCQlpb3Bf ZGVzY19pbml0X21lbWNweShncnBfc3RhcnQsIGZsYWdzKTsKLQkJaW9wX2Rlc2Nfc2V0X2J5dGVf Y291bnQoZ3JwX3N0YXJ0LCBpb3BfY2hhbiwgbGVuKTsKLQkJaW9wX2Rlc2Nfc2V0X2Rlc3RfYWRk cihncnBfc3RhcnQsIGlvcF9jaGFuLCBkbWFfZGVzdCk7Ci0JCWlvcF9kZXNjX3NldF9tZW1jcHlf c3JjX2FkZHIoZ3JwX3N0YXJ0LCBkbWFfc3JjKTsKLQkJc3dfZGVzYy0+YXN5bmNfdHguZmxhZ3Mg PSBmbGFnczsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJmlvcF9jaGFuLT5sb2NrKTsKLQotCXJldHVy biBzd19kZXNjID8gJnN3X2Rlc2MtPmFzeW5jX3R4IDogTlVMTDsKLX0KLQotc3RhdGljIHN0cnVj dCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCi1pb3BfYWRtYV9wcmVwX2RtYV94b3Ioc3RydWN0 IGRtYV9jaGFuICpjaGFuLCBkbWFfYWRkcl90IGRtYV9kZXN0LAotCQkgICAgICBkbWFfYWRkcl90 ICpkbWFfc3JjLCB1bnNpZ25lZCBpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwKLQkJICAgICAgdW5z aWduZWQgbG9uZyBmbGFncykKLXsKLQlzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqaW9wX2NoYW4gPSB0 b19pb3BfYWRtYV9jaGFuKGNoYW4pOwotCXN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKnN3X2Rl c2MsICpncnBfc3RhcnQ7Ci0JaW50IHNsb3RfY250LCBzbG90c19wZXJfb3A7Ci0KLQlpZiAodW5s aWtlbHkoIWxlbikpCi0JCXJldHVybiBOVUxMOwotCUJVR19PTihsZW4gPiBJT1BfQURNQV9YT1Jf TUFYX0JZVEVfQ09VTlQpOwotCi0JZGV2X2RiZyhpb3BfY2hhbi0+ZGV2aWNlLT5jb21tb24uZGV2 LAotCQkiJXMgc3JjX2NudDogJWQgbGVuOiAlenUgZmxhZ3M6ICVseFxuIiwKLQkJX19mdW5jX18s IHNyY19jbnQsIGxlbiwgZmxhZ3MpOwotCi0Jc3Bpbl9sb2NrX2JoKCZpb3BfY2hhbi0+bG9jayk7 Ci0Jc2xvdF9jbnQgPSBpb3BfY2hhbl94b3Jfc2xvdF9jb3VudChsZW4sIHNyY19jbnQsICZzbG90 c19wZXJfb3ApOwotCXN3X2Rlc2MgPSBpb3BfYWRtYV9hbGxvY19zbG90cyhpb3BfY2hhbiwgc2xv dF9jbnQsIHNsb3RzX3Blcl9vcCk7Ci0JaWYgKHN3X2Rlc2MpIHsKLQkJZ3JwX3N0YXJ0ID0gc3df ZGVzYy0+Z3JvdXBfaGVhZDsKLQkJaW9wX2Rlc2NfaW5pdF94b3IoZ3JwX3N0YXJ0LCBzcmNfY250 LCBmbGFncyk7Ci0JCWlvcF9kZXNjX3NldF9ieXRlX2NvdW50KGdycF9zdGFydCwgaW9wX2NoYW4s IGxlbik7Ci0JCWlvcF9kZXNjX3NldF9kZXN0X2FkZHIoZ3JwX3N0YXJ0LCBpb3BfY2hhbiwgZG1h X2Rlc3QpOwotCQlzd19kZXNjLT5hc3luY190eC5mbGFncyA9IGZsYWdzOwotCQl3aGlsZSAoc3Jj X2NudC0tKQotCQkJaW9wX2Rlc2Nfc2V0X3hvcl9zcmNfYWRkcihncnBfc3RhcnQsIHNyY19jbnQs Ci0JCQkJCQkgIGRtYV9zcmNbc3JjX2NudF0pOwotCX0KLQlzcGluX3VubG9ja19iaCgmaW9wX2No YW4tPmxvY2spOwotCi0JcmV0dXJuIHN3X2Rlc2MgPyAmc3dfZGVzYy0+YXN5bmNfdHggOiBOVUxM OwotfQotCi1zdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKLWlvcF9hZG1h X3ByZXBfZG1hX3hvcl92YWwoc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfYWRkcl90ICpkbWFf c3JjLAotCQkJICB1bnNpZ25lZCBpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwgdTMyICpyZXN1bHQs Ci0JCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0Jc3RydWN0IGlvcF9hZG1hX2NoYW4gKmlv cF9jaGFuID0gdG9faW9wX2FkbWFfY2hhbihjaGFuKTsKLQlzdHJ1Y3QgaW9wX2FkbWFfZGVzY19z bG90ICpzd19kZXNjLCAqZ3JwX3N0YXJ0OwotCWludCBzbG90X2NudCwgc2xvdHNfcGVyX29wOwot Ci0JaWYgKHVubGlrZWx5KCFsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQotCWRldl9kYmcoaW9wX2No YW4tPmRldmljZS0+Y29tbW9uLmRldiwgIiVzIHNyY19jbnQ6ICVkIGxlbjogJXp1XG4iLAotCQlf X2Z1bmNfXywgc3JjX2NudCwgbGVuKTsKLQotCXNwaW5fbG9ja19iaCgmaW9wX2NoYW4tPmxvY2sp OwotCXNsb3RfY250ID0gaW9wX2NoYW5femVyb19zdW1fc2xvdF9jb3VudChsZW4sIHNyY19jbnQs ICZzbG90c19wZXJfb3ApOwotCXN3X2Rlc2MgPSBpb3BfYWRtYV9hbGxvY19zbG90cyhpb3BfY2hh biwgc2xvdF9jbnQsIHNsb3RzX3Blcl9vcCk7Ci0JaWYgKHN3X2Rlc2MpIHsKLQkJZ3JwX3N0YXJ0 ID0gc3dfZGVzYy0+Z3JvdXBfaGVhZDsKLQkJaW9wX2Rlc2NfaW5pdF96ZXJvX3N1bShncnBfc3Rh cnQsIHNyY19jbnQsIGZsYWdzKTsKLQkJaW9wX2Rlc2Nfc2V0X3plcm9fc3VtX2J5dGVfY291bnQo Z3JwX3N0YXJ0LCBsZW4pOwotCQlncnBfc3RhcnQtPnhvcl9jaGVja19yZXN1bHQgPSByZXN1bHQ7 Ci0JCXByX2RlYnVnKCJcdCVzOiBncnBfc3RhcnQtPnhvcl9jaGVja19yZXN1bHQ6ICVwXG4iLAot CQkJX19mdW5jX18sIGdycF9zdGFydC0+eG9yX2NoZWNrX3Jlc3VsdCk7Ci0JCXN3X2Rlc2MtPmFz eW5jX3R4LmZsYWdzID0gZmxhZ3M7Ci0JCXdoaWxlIChzcmNfY250LS0pCi0JCQlpb3BfZGVzY19z ZXRfemVyb19zdW1fc3JjX2FkZHIoZ3JwX3N0YXJ0LCBzcmNfY250LAotCQkJCQkJICAgICAgIGRt YV9zcmNbc3JjX2NudF0pOwotCX0KLQlzcGluX3VubG9ja19iaCgmaW9wX2NoYW4tPmxvY2spOwot Ci0JcmV0dXJuIHN3X2Rlc2MgPyAmc3dfZGVzYy0+YXN5bmNfdHggOiBOVUxMOwotfQotCi1zdGF0 aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKLWlvcF9hZG1hX3ByZXBfZG1hX3Bx KHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCAqZHN0LCBkbWFfYWRkcl90ICpzcmMs Ci0JCSAgICAgdW5zaWduZWQgaW50IHNyY19jbnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNjZiwg c2l6ZV90IGxlbiwKLQkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCBpb3Bf YWRtYV9jaGFuICppb3BfY2hhbiA9IHRvX2lvcF9hZG1hX2NoYW4oY2hhbik7Ci0Jc3RydWN0IGlv cF9hZG1hX2Rlc2Nfc2xvdCAqc3dfZGVzYywgKmc7Ci0JaW50IHNsb3RfY250LCBzbG90c19wZXJf b3A7Ci0JaW50IGNvbnRpbnVlX3NyY3M7Ci0KLQlpZiAodW5saWtlbHkoIWxlbikpCi0JCXJldHVy biBOVUxMOwotCUJVR19PTihsZW4gPiBJT1BfQURNQV9YT1JfTUFYX0JZVEVfQ09VTlQpOwotCi0J ZGV2X2RiZyhpb3BfY2hhbi0+ZGV2aWNlLT5jb21tb24uZGV2LAotCQkiJXMgc3JjX2NudDogJWQg bGVuOiAlenUgZmxhZ3M6ICVseFxuIiwKLQkJX19mdW5jX18sIHNyY19jbnQsIGxlbiwgZmxhZ3Mp OwotCi0JaWYgKGRtYWZfcF9kaXNhYmxlZF9jb250aW51ZShmbGFncykpCi0JCWNvbnRpbnVlX3Ny Y3MgPSAxK3NyY19jbnQ7Ci0JZWxzZSBpZiAoZG1hZl9jb250aW51ZShmbGFncykpCi0JCWNvbnRp bnVlX3NyY3MgPSAzK3NyY19jbnQ7Ci0JZWxzZQotCQljb250aW51ZV9zcmNzID0gMCtzcmNfY250 OwotCi0Jc3Bpbl9sb2NrX2JoKCZpb3BfY2hhbi0+bG9jayk7Ci0Jc2xvdF9jbnQgPSBpb3BfY2hh bl9wcV9zbG90X2NvdW50KGxlbiwgY29udGludWVfc3JjcywgJnNsb3RzX3Blcl9vcCk7Ci0Jc3df ZGVzYyA9IGlvcF9hZG1hX2FsbG9jX3Nsb3RzKGlvcF9jaGFuLCBzbG90X2NudCwgc2xvdHNfcGVy X29wKTsKLQlpZiAoc3dfZGVzYykgewotCQlpbnQgaTsKLQotCQlnID0gc3dfZGVzYy0+Z3JvdXBf aGVhZDsKLQkJaW9wX2Rlc2Nfc2V0X2J5dGVfY291bnQoZywgaW9wX2NoYW4sIGxlbik7Ci0KLQkJ LyogZXZlbiBpZiBQIGlzIGRpc2FibGVkIGl0cyBkZXN0aW5hdGlvbiBhZGRyZXNzIChiaXRzCi0J CSAqIFszOjBdKSBtdXN0IG1hdGNoIFEuICBJdCBpcyBvayBpZiBQIHBvaW50cyB0byBhbgotCQkg KiBpbnZhbGlkIGFkZHJlc3MsIGl0IHdvbid0IGJlIHdyaXR0ZW4uCi0JCSAqLwotCQlpZiAoZmxh Z3MgJiBETUFfUFJFUF9QUV9ESVNBQkxFX1ApCi0JCQlkc3RbMF0gPSBkc3RbMV0gJiAweDc7Ci0K LQkJaW9wX2Rlc2Nfc2V0X3BxX2FkZHIoZywgZHN0KTsKLQkJc3dfZGVzYy0+YXN5bmNfdHguZmxh Z3MgPSBmbGFnczsKLQkJZm9yIChpID0gMDsgaSA8IHNyY19jbnQ7IGkrKykKLQkJCWlvcF9kZXNj X3NldF9wcV9zcmNfYWRkcihnLCBpLCBzcmNbaV0sIHNjZltpXSk7Ci0KLQkJLyogaWYgd2UgYXJl IGNvbnRpbnVpbmcgYSBwcmV2aW91cyBvcGVyYXRpb24gZmFjdG9yIGluCi0JCSAqIHRoZSBvbGQg cCBhbmQgcSB2YWx1ZXMsIHNlZSB0aGUgY29tbWVudCBmb3IgZG1hX21heHBxCi0JCSAqIGluIGlu Y2x1ZGUvbGludXgvZG1hZW5naW5lLmgKLQkJICovCi0JCWlmIChkbWFmX3BfZGlzYWJsZWRfY29u dGludWUoZmxhZ3MpKQotCQkJaW9wX2Rlc2Nfc2V0X3BxX3NyY19hZGRyKGcsIGkrKywgZHN0WzFd LCAxKTsKLQkJZWxzZSBpZiAoZG1hZl9jb250aW51ZShmbGFncykpIHsKLQkJCWlvcF9kZXNjX3Nl dF9wcV9zcmNfYWRkcihnLCBpKyssIGRzdFswXSwgMCk7Ci0JCQlpb3BfZGVzY19zZXRfcHFfc3Jj X2FkZHIoZywgaSsrLCBkc3RbMV0sIDEpOwotCQkJaW9wX2Rlc2Nfc2V0X3BxX3NyY19hZGRyKGcs IGkrKywgZHN0WzFdLCAwKTsKLQkJfQotCQlpb3BfZGVzY19pbml0X3BxKGcsIGksIGZsYWdzKTsK LQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJmlvcF9jaGFuLT5sb2NrKTsKLQotCXJldHVybiBzd19kZXNj ID8gJnN3X2Rlc2MtPmFzeW5jX3R4IDogTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBkbWFfYXN5 bmNfdHhfZGVzY3JpcHRvciAqCi1pb3BfYWRtYV9wcmVwX2RtYV9wcV92YWwoc3RydWN0IGRtYV9j aGFuICpjaGFuLCBkbWFfYWRkcl90ICpwcSwgZG1hX2FkZHJfdCAqc3JjLAotCQkJIHVuc2lnbmVk IGludCBzcmNfY250LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzY2YsCi0JCQkgc2l6ZV90IGxlbiwg ZW51bSBzdW1fY2hlY2tfZmxhZ3MgKnBxcmVzLAotCQkJIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17 Ci0Jc3RydWN0IGlvcF9hZG1hX2NoYW4gKmlvcF9jaGFuID0gdG9faW9wX2FkbWFfY2hhbihjaGFu KTsKLQlzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpzd19kZXNjLCAqZzsKLQlpbnQgc2xvdF9j bnQsIHNsb3RzX3Blcl9vcDsKLQotCWlmICh1bmxpa2VseSghbGVuKSkKLQkJcmV0dXJuIE5VTEw7 Ci0JQlVHX09OKGxlbiA+IElPUF9BRE1BX1hPUl9NQVhfQllURV9DT1VOVCk7Ci0KLQlkZXZfZGJn KGlvcF9jaGFuLT5kZXZpY2UtPmNvbW1vbi5kZXYsICIlcyBzcmNfY250OiAlZCBsZW46ICV6dVxu IiwKLQkJX19mdW5jX18sIHNyY19jbnQsIGxlbik7Ci0KLQlzcGluX2xvY2tfYmgoJmlvcF9jaGFu LT5sb2NrKTsKLQlzbG90X2NudCA9IGlvcF9jaGFuX3BxX3plcm9fc3VtX3Nsb3RfY291bnQobGVu LCBzcmNfY250ICsgMiwgJnNsb3RzX3Blcl9vcCk7Ci0Jc3dfZGVzYyA9IGlvcF9hZG1hX2FsbG9j X3Nsb3RzKGlvcF9jaGFuLCBzbG90X2NudCwgc2xvdHNfcGVyX29wKTsKLQlpZiAoc3dfZGVzYykg ewotCQkvKiBmb3IgdmFsaWRhdGUgb3BlcmF0aW9ucyBwIGFuZCBxIGFyZSB0YWdnZWQgb250byB0 aGUKLQkJICogZW5kIG9mIHRoZSBzb3VyY2UgbGlzdAotCQkgKi8KLQkJaW50IHBxX2lkeCA9IHNy Y19jbnQ7Ci0KLQkJZyA9IHN3X2Rlc2MtPmdyb3VwX2hlYWQ7Ci0JCWlvcF9kZXNjX2luaXRfcHFf emVyb19zdW0oZywgc3JjX2NudCsyLCBmbGFncyk7Ci0JCWlvcF9kZXNjX3NldF9wcV96ZXJvX3N1 bV9ieXRlX2NvdW50KGcsIGxlbik7Ci0JCWctPnBxX2NoZWNrX3Jlc3VsdCA9IHBxcmVzOwotCQlw cl9kZWJ1ZygiXHQlczogZy0+cHFfY2hlY2tfcmVzdWx0OiAlcFxuIiwKLQkJCV9fZnVuY19fLCBn LT5wcV9jaGVja19yZXN1bHQpOwotCQlzd19kZXNjLT5hc3luY190eC5mbGFncyA9IGZsYWdzOwot CQl3aGlsZSAoc3JjX2NudC0tKQotCQkJaW9wX2Rlc2Nfc2V0X3BxX3plcm9fc3VtX3NyY19hZGRy KGcsIHNyY19jbnQsCi0JCQkJCQkJICBzcmNbc3JjX2NudF0sCi0JCQkJCQkJICBzY2Zbc3JjX2Nu dF0pOwotCQlpb3BfZGVzY19zZXRfcHFfemVyb19zdW1fYWRkcihnLCBwcV9pZHgsIHNyYyk7Ci0J fQotCXNwaW5fdW5sb2NrX2JoKCZpb3BfY2hhbi0+bG9jayk7Ci0KLQlyZXR1cm4gc3dfZGVzYyA/ ICZzd19kZXNjLT5hc3luY190eCA6IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvcF9hZG1hX2Zy ZWVfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQotewotCXN0cnVjdCBpb3Bf YWRtYV9jaGFuICppb3BfY2hhbiA9IHRvX2lvcF9hZG1hX2NoYW4oY2hhbik7Ci0Jc3RydWN0IGlv cF9hZG1hX2Rlc2Nfc2xvdCAqaXRlciwgKl9pdGVyOwotCWludCBpbl91c2VfZGVzY3MgPSAwOwot Ci0JaW9wX2FkbWFfc2xvdF9jbGVhbnVwKGlvcF9jaGFuKTsKLQotCXNwaW5fbG9ja19iaCgmaW9w X2NoYW4tPmxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVyLCBfaXRlciwgJmlv cF9jaGFuLT5jaGFpbiwKLQkJCQkJY2hhaW5fbm9kZSkgewotCQlpbl91c2VfZGVzY3MrKzsKLQkJ bGlzdF9kZWwoJml0ZXItPmNoYWluX25vZGUpOwotCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3Nh ZmVfcmV2ZXJzZSgKLQkJaXRlciwgX2l0ZXIsICZpb3BfY2hhbi0+YWxsX3Nsb3RzLCBzbG90X25v ZGUpIHsKLQkJbGlzdF9kZWwoJml0ZXItPnNsb3Rfbm9kZSk7Ci0JCWtmcmVlKGl0ZXIpOwotCQlp b3BfY2hhbi0+c2xvdHNfYWxsb2NhdGVkLS07Ci0JfQotCWlvcF9jaGFuLT5sYXN0X3VzZWQgPSBO VUxMOwotCi0JZGV2X2RiZyhpb3BfY2hhbi0+ZGV2aWNlLT5jb21tb24uZGV2LCAiJXMgc2xvdHNf YWxsb2NhdGVkICVkXG4iLAotCQlfX2Z1bmNfXywgaW9wX2NoYW4tPnNsb3RzX2FsbG9jYXRlZCk7 Ci0Jc3Bpbl91bmxvY2tfYmgoJmlvcF9jaGFuLT5sb2NrKTsKLQotCS8qIG9uZSBpcyBvayBzaW5j ZSB3ZSBsZWZ0IGl0IG9uIHRoZXJlIG9uIHB1cnBvc2UgKi8KLQlpZiAoaW5fdXNlX2Rlc2NzID4g MSkKLQkJcHJpbnRrKEtFUk5fRVJSICJJT1A6IEZyZWVpbmcgJWQgaW4gdXNlIGRlc2NyaXB0b3Jz IVxuIiwKLQkJCWluX3VzZV9kZXNjcyAtIDEpOwotfQotCi0vKioKLSAqIGlvcF9hZG1hX3N0YXR1 cyAtIHBvbGwgdGhlIHN0YXR1cyBvZiBhbiBBRE1BIHRyYW5zYWN0aW9uCi0gKiBAY2hhbjogQURN QSBjaGFubmVsIGhhbmRsZQotICogQGNvb2tpZTogQURNQSB0cmFuc2FjdGlvbiBpZGVudGlmaWVy Ci0gKiBAdHhzdGF0ZTogYSBob2xkZXIgZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjaGFu bmVsIG9yIE5VTEwKLSAqLwotc3RhdGljIGVudW0gZG1hX3N0YXR1cyBpb3BfYWRtYV9zdGF0dXMo c3RydWN0IGRtYV9jaGFuICpjaGFuLAotCQkJCQlkbWFfY29va2llX3QgY29va2llLAotCQkJCQlz dHJ1Y3QgZG1hX3R4X3N0YXRlICp0eHN0YXRlKQotewotCXN0cnVjdCBpb3BfYWRtYV9jaGFuICpp b3BfY2hhbiA9IHRvX2lvcF9hZG1hX2NoYW4oY2hhbik7Ci0JaW50IHJldDsKLQotCXJldCA9IGRt YV9jb29raWVfc3RhdHVzKGNoYW4sIGNvb2tpZSwgdHhzdGF0ZSk7Ci0JaWYgKHJldCA9PSBETUFf Q09NUExFVEUpCi0JCXJldHVybiByZXQ7Ci0KLQlpb3BfYWRtYV9zbG90X2NsZWFudXAoaW9wX2No YW4pOwotCi0JcmV0dXJuIGRtYV9jb29raWVfc3RhdHVzKGNoYW4sIGNvb2tpZSwgdHhzdGF0ZSk7 Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBpb3BfYWRtYV9lb3RfaGFuZGxlcihpbnQgaXJxLCB2 b2lkICpkYXRhKQotewotCXN0cnVjdCBpb3BfYWRtYV9jaGFuICpjaGFuID0gZGF0YTsKLQotCWRl dl9kYmcoY2hhbi0+ZGV2aWNlLT5jb21tb24uZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQotCXRh c2tsZXRfc2NoZWR1bGUoJmNoYW4tPmlycV90YXNrbGV0KTsKLQotCWlvcF9hZG1hX2RldmljZV9j bGVhcl9lb3Rfc3RhdHVzKGNoYW4pOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0 aWMgaXJxcmV0dXJuX3QgaW9wX2FkbWFfZW9jX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkK LXsKLQlzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqY2hhbiA9IGRhdGE7Ci0KLQlkZXZfZGJnKGNoYW4t PmRldmljZS0+Y29tbW9uLmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQl0YXNrbGV0X3NjaGVk dWxlKCZjaGFuLT5pcnFfdGFza2xldCk7Ci0KLQlpb3BfYWRtYV9kZXZpY2VfY2xlYXJfZW9jX3N0 YXR1cyhjaGFuKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGlycXJldHVy bl90IGlvcF9hZG1hX2Vycl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0 IGlvcF9hZG1hX2NoYW4gKmNoYW4gPSBkYXRhOwotCXVuc2lnbmVkIGxvbmcgc3RhdHVzID0gaW9w X2NoYW5fZ2V0X3N0YXR1cyhjaGFuKTsKLQotCWRldl9lcnIoY2hhbi0+ZGV2aWNlLT5jb21tb24u ZGV2LAotCQkiZXJyb3IgKCAlcyVzJXMlcyVzJXMlcylcbiIsCi0JCWlvcF9pc19lcnJfaW50X3Bh cml0eShzdGF0dXMsIGNoYW4pID8gImludF9wYXJpdHkgIiA6ICIiLAotCQlpb3BfaXNfZXJyX21j dV9hYm9ydChzdGF0dXMsIGNoYW4pID8gIm1jdV9hYm9ydCAiIDogIiIsCi0JCWlvcF9pc19lcnJf aW50X3RhYm9ydChzdGF0dXMsIGNoYW4pID8gImludF90YWJvcnQgIiA6ICIiLAotCQlpb3BfaXNf ZXJyX2ludF9tYWJvcnQoc3RhdHVzLCBjaGFuKSA/ICJpbnRfbWFib3J0ICIgOiAiIiwKLQkJaW9w X2lzX2Vycl9wY2lfdGFib3J0KHN0YXR1cywgY2hhbikgPyAicGNpX3RhYm9ydCAiIDogIiIsCi0J CWlvcF9pc19lcnJfcGNpX21hYm9ydChzdGF0dXMsIGNoYW4pID8gInBjaV9tYWJvcnQgIiA6ICIi LAotCQlpb3BfaXNfZXJyX3NwbGl0X3R4KHN0YXR1cywgY2hhbikgPyAic3BsaXRfdHggIiA6ICIi KTsKLQotCWlvcF9hZG1hX2RldmljZV9jbGVhcl9lcnJfc3RhdHVzKGNoYW4pOwotCi0JQlVHKCk7 Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvcF9hZG1hX2lzc3Vl X3BlbmRpbmcoc3RydWN0IGRtYV9jaGFuICpjaGFuKQotewotCXN0cnVjdCBpb3BfYWRtYV9jaGFu ICppb3BfY2hhbiA9IHRvX2lvcF9hZG1hX2NoYW4oY2hhbik7Ci0KLQlpZiAoaW9wX2NoYW4tPnBl bmRpbmcpIHsKLQkJaW9wX2NoYW4tPnBlbmRpbmcgPSAwOwotCQlpb3BfY2hhbl9hcHBlbmQoaW9w X2NoYW4pOwotCX0KLX0KLQotLyoKLSAqIFBlcmZvcm0gYSB0cmFuc2FjdGlvbiB0byB2ZXJpZnkg dGhlIEhXIHdvcmtzLgotICovCi0jZGVmaW5lIElPUF9BRE1BX1RFU1RfU0laRSAyMDAwCi0KLXN0 YXRpYyBpbnQgaW9wX2FkbWFfbWVtY3B5X3NlbGZfdGVzdChzdHJ1Y3QgaW9wX2FkbWFfZGV2aWNl ICpkZXZpY2UpCi17Ci0JaW50IGk7Ci0Jdm9pZCAqc3JjLCAqZGVzdDsKLQlkbWFfYWRkcl90IHNy Y19kbWEsIGRlc3RfZG1hOwotCXN0cnVjdCBkbWFfY2hhbiAqZG1hX2NoYW47Ci0JZG1hX2Nvb2tp ZV90IGNvb2tpZTsKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4OwotCWludCBl cnIgPSAwOwotCXN0cnVjdCBpb3BfYWRtYV9jaGFuICppb3BfY2hhbjsKLQotCWRldl9kYmcoZGV2 aWNlLT5jb21tb24uZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQotCXNyYyA9IGttYWxsb2MoSU9Q X0FETUFfVEVTVF9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNyYykKLQkJcmV0dXJuIC1FTk9N RU07Ci0JZGVzdCA9IGt6YWxsb2MoSU9QX0FETUFfVEVTVF9TSVpFLCBHRlBfS0VSTkVMKTsKLQlp ZiAoIWRlc3QpIHsKLQkJa2ZyZWUoc3JjKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyog RmlsbCBpbiBzcmMgYnVmZmVyICovCi0JZm9yIChpID0gMDsgaSA8IElPUF9BRE1BX1RFU1RfU0la RTsgaSsrKQotCQkoKHU4ICopIHNyYylbaV0gPSAodTgpaTsKLQotCS8qIFN0YXJ0IGNvcHksIHVz aW5nIGZpcnN0IERNQSBjaGFubmVsICovCi0JZG1hX2NoYW4gPSBjb250YWluZXJfb2YoZGV2aWNl LT5jb21tb24uY2hhbm5lbHMubmV4dCwKLQkJCQlzdHJ1Y3QgZG1hX2NoYW4sCi0JCQkJZGV2aWNl X25vZGUpOwotCWlmIChpb3BfYWRtYV9hbGxvY19jaGFuX3Jlc291cmNlcyhkbWFfY2hhbikgPCAx KSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWRlc3RfZG1hID0gZG1h X21hcF9zaW5nbGUoZG1hX2NoYW4tPmRldmljZS0+ZGV2LCBkZXN0LAotCQkJCUlPUF9BRE1BX1RF U1RfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKLQlzcmNfZG1hID0gZG1hX21hcF9zaW5nbGUoZG1h X2NoYW4tPmRldmljZS0+ZGV2LCBzcmMsCi0JCQkJSU9QX0FETUFfVEVTVF9TSVpFLCBETUFfVE9f REVWSUNFKTsKLQl0eCA9IGlvcF9hZG1hX3ByZXBfZG1hX21lbWNweShkbWFfY2hhbiwgZGVzdF9k bWEsIHNyY19kbWEsCi0JCQkJICAgICAgSU9QX0FETUFfVEVTVF9TSVpFLAotCQkJCSAgICAgIERN QV9QUkVQX0lOVEVSUlVQVCB8IERNQV9DVFJMX0FDSyk7Ci0KLQljb29raWUgPSBpb3BfYWRtYV90 eF9zdWJtaXQodHgpOwotCWlvcF9hZG1hX2lzc3VlX3BlbmRpbmcoZG1hX2NoYW4pOwotCW1zbGVl cCgxKTsKLQotCWlmIChpb3BfYWRtYV9zdGF0dXMoZG1hX2NoYW4sIGNvb2tpZSwgTlVMTCkgIT0K LQkJCURNQV9DT01QTEVURSkgewotCQlkZXZfZXJyKGRtYV9jaGFuLT5kZXZpY2UtPmRldiwKLQkJ CSJTZWxmLXRlc3QgY29weSB0aW1lZCBvdXQsIGRpc2FibGluZ1xuIik7Ci0JCWVyciA9IC1FTk9E RVY7Ci0JCWdvdG8gZnJlZV9yZXNvdXJjZXM7Ci0JfQotCi0JaW9wX2NoYW4gPSB0b19pb3BfYWRt YV9jaGFuKGRtYV9jaGFuKTsKLQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdSgmaW9wX2NoYW4tPmRl dmljZS0+cGRldi0+ZGV2LCBkZXN0X2RtYSwKLQkJSU9QX0FETUFfVEVTVF9TSVpFLCBETUFfRlJP TV9ERVZJQ0UpOwotCWlmIChtZW1jbXAoc3JjLCBkZXN0LCBJT1BfQURNQV9URVNUX1NJWkUpKSB7 Ci0JCWRldl9lcnIoZG1hX2NoYW4tPmRldmljZS0+ZGV2LAotCQkJIlNlbGYtdGVzdCBjb3B5IGZh aWxlZCBjb21wYXJlLCBkaXNhYmxpbmdcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGZy ZWVfcmVzb3VyY2VzOwotCX0KLQotZnJlZV9yZXNvdXJjZXM6Ci0JaW9wX2FkbWFfZnJlZV9jaGFu X3Jlc291cmNlcyhkbWFfY2hhbik7Ci1vdXQ6Ci0Ja2ZyZWUoc3JjKTsKLQlrZnJlZShkZXN0KTsK LQlyZXR1cm4gZXJyOwotfQotCi0jZGVmaW5lIElPUF9BRE1BX05VTV9TUkNfVEVTVCA0IC8qIG11 c3QgYmUgPD0gMTUgKi8KLXN0YXRpYyBpbnQKLWlvcF9hZG1hX3hvcl92YWxfc2VsZl90ZXN0KHN0 cnVjdCBpb3BfYWRtYV9kZXZpY2UgKmRldmljZSkKLXsKLQlpbnQgaSwgc3JjX2lkeDsKLQlzdHJ1 Y3QgcGFnZSAqZGVzdDsKLQlzdHJ1Y3QgcGFnZSAqeG9yX3NyY3NbSU9QX0FETUFfTlVNX1NSQ19U RVNUXTsKLQlzdHJ1Y3QgcGFnZSAqemVyb19zdW1fc3Jjc1tJT1BfQURNQV9OVU1fU1JDX1RFU1Qg KyAxXTsKLQlkbWFfYWRkcl90IGRtYV9zcmNzW0lPUF9BRE1BX05VTV9TUkNfVEVTVCArIDFdOwot CWRtYV9hZGRyX3QgZGVzdF9kbWE7Ci0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0 eDsKLQlzdHJ1Y3QgZG1hX2NoYW4gKmRtYV9jaGFuOwotCWRtYV9jb29raWVfdCBjb29raWU7Ci0J dTggY21wX2J5dGUgPSAwOwotCXUzMiBjbXBfd29yZDsKLQl1MzIgemVyb19zdW1fcmVzdWx0Owot CWludCBlcnIgPSAwOwotCXN0cnVjdCBpb3BfYWRtYV9jaGFuICppb3BfY2hhbjsKLQotCWRldl9k YmcoZGV2aWNlLT5jb21tb24uZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQotCWZvciAoc3JjX2lk eCA9IDA7IHNyY19pZHggPCBJT1BfQURNQV9OVU1fU1JDX1RFU1Q7IHNyY19pZHgrKykgewotCQl4 b3Jfc3Jjc1tzcmNfaWR4XSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JCWlmICgheG9yX3Ny Y3Nbc3JjX2lkeF0pIHsKLQkJCXdoaWxlIChzcmNfaWR4LS0pCi0JCQkJX19mcmVlX3BhZ2UoeG9y X3NyY3Nbc3JjX2lkeF0pOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KLQlkZXN0ID0g YWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIWRlc3QpIHsKLQkJd2hpbGUgKHNyY19pZHgt LSkKLQkJCV9fZnJlZV9wYWdlKHhvcl9zcmNzW3NyY19pZHhdKTsKLQkJcmV0dXJuIC1FTk9NRU07 Ci0JfQotCi0JLyogRmlsbCBpbiBzcmMgYnVmZmVycyAqLwotCWZvciAoc3JjX2lkeCA9IDA7IHNy Y19pZHggPCBJT1BfQURNQV9OVU1fU1JDX1RFU1Q7IHNyY19pZHgrKykgewotCQl1OCAqcHRyID0g cGFnZV9hZGRyZXNzKHhvcl9zcmNzW3NyY19pZHhdKTsKLQkJZm9yIChpID0gMDsgaSA8IFBBR0Vf U0laRTsgaSsrKQotCQkJcHRyW2ldID0gKDEgPDwgc3JjX2lkeCk7Ci0JfQotCi0JZm9yIChzcmNf aWR4ID0gMDsgc3JjX2lkeCA8IElPUF9BRE1BX05VTV9TUkNfVEVTVDsgc3JjX2lkeCsrKQotCQlj bXBfYnl0ZSBePSAodTgpICgxIDw8IHNyY19pZHgpOwotCi0JY21wX3dvcmQgPSAoY21wX2J5dGUg PDwgMjQpIHwgKGNtcF9ieXRlIDw8IDE2KSB8Ci0JCQkoY21wX2J5dGUgPDwgOCkgfCBjbXBfYnl0 ZTsKLQotCW1lbXNldChwYWdlX2FkZHJlc3MoZGVzdCksIDAsIFBBR0VfU0laRSk7Ci0KLQlkbWFf Y2hhbiA9IGNvbnRhaW5lcl9vZihkZXZpY2UtPmNvbW1vbi5jaGFubmVscy5uZXh0LAotCQkJCXN0 cnVjdCBkbWFfY2hhbiwKLQkJCQlkZXZpY2Vfbm9kZSk7Ci0JaWYgKGlvcF9hZG1hX2FsbG9jX2No YW5fcmVzb3VyY2VzKGRtYV9jaGFuKSA8IDEpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBv dXQ7Ci0JfQotCi0JLyogdGVzdCB4b3IgKi8KLQlkZXN0X2RtYSA9IGRtYV9tYXBfcGFnZShkbWFf Y2hhbi0+ZGV2aWNlLT5kZXYsIGRlc3QsIDAsCi0JCQkJUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJ Q0UpOwotCWZvciAoaSA9IDA7IGkgPCBJT1BfQURNQV9OVU1fU1JDX1RFU1Q7IGkrKykKLQkJZG1h X3NyY3NbaV0gPSBkbWFfbWFwX3BhZ2UoZG1hX2NoYW4tPmRldmljZS0+ZGV2LCB4b3Jfc3Jjc1tp XSwKLQkJCQkJICAgMCwgUEFHRV9TSVpFLCBETUFfVE9fREVWSUNFKTsKLQl0eCA9IGlvcF9hZG1h X3ByZXBfZG1hX3hvcihkbWFfY2hhbiwgZGVzdF9kbWEsIGRtYV9zcmNzLAotCQkJCSAgIElPUF9B RE1BX05VTV9TUkNfVEVTVCwgUEFHRV9TSVpFLAotCQkJCSAgIERNQV9QUkVQX0lOVEVSUlVQVCB8 IERNQV9DVFJMX0FDSyk7Ci0KLQljb29raWUgPSBpb3BfYWRtYV90eF9zdWJtaXQodHgpOwotCWlv cF9hZG1hX2lzc3VlX3BlbmRpbmcoZG1hX2NoYW4pOwotCW1zbGVlcCg4KTsKLQotCWlmIChpb3Bf YWRtYV9zdGF0dXMoZG1hX2NoYW4sIGNvb2tpZSwgTlVMTCkgIT0KLQkJRE1BX0NPTVBMRVRFKSB7 Ci0JCWRldl9lcnIoZG1hX2NoYW4tPmRldmljZS0+ZGV2LAotCQkJIlNlbGYtdGVzdCB4b3IgdGlt ZWQgb3V0LCBkaXNhYmxpbmdcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGZyZWVfcmVz b3VyY2VzOwotCX0KLQotCWlvcF9jaGFuID0gdG9faW9wX2FkbWFfY2hhbihkbWFfY2hhbik7Ci0J ZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoJmlvcF9jaGFuLT5kZXZpY2UtPnBkZXYtPmRldiwgZGVz dF9kbWEsCi0JCVBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKLQlmb3IgKGkgPSAwOyBpIDwg KFBBR0VfU0laRSAvIHNpemVvZih1MzIpKTsgaSsrKSB7Ci0JCXUzMiAqcHRyID0gcGFnZV9hZGRy ZXNzKGRlc3QpOwotCQlpZiAocHRyW2ldICE9IGNtcF93b3JkKSB7Ci0JCQlkZXZfZXJyKGRtYV9j aGFuLT5kZXZpY2UtPmRldiwKLQkJCQkiU2VsZi10ZXN0IHhvciBmYWlsZWQgY29tcGFyZSwgZGlz YWJsaW5nXG4iKTsKLQkJCWVyciA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZyZWVfcmVzb3VyY2VzOwot CQl9Ci0JfQotCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKCZpb3BfY2hhbi0+ZGV2aWNlLT5w ZGV2LT5kZXYsIGRlc3RfZG1hLAotCQlQQUdFX1NJWkUsIERNQV9UT19ERVZJQ0UpOwotCi0JLyog c2tpcCB6ZXJvIHN1bSBpZiB0aGUgY2FwYWJpbGl0eSBpcyBub3QgcHJlc2VudCAqLwotCWlmICgh ZG1hX2hhc19jYXAoRE1BX1hPUl9WQUwsIGRtYV9jaGFuLT5kZXZpY2UtPmNhcF9tYXNrKSkKLQkJ Z290byBmcmVlX3Jlc291cmNlczsKLQotCS8qIHplcm8gc3VtIHRoZSBzb3VyY2VzIHdpdGggdGhl IGRlc3RpbnRhdGlvbiBwYWdlICovCi0JZm9yIChpID0gMDsgaSA8IElPUF9BRE1BX05VTV9TUkNf VEVTVDsgaSsrKQotCQl6ZXJvX3N1bV9zcmNzW2ldID0geG9yX3NyY3NbaV07Ci0JemVyb19zdW1f c3Jjc1tpXSA9IGRlc3Q7Ci0KLQl6ZXJvX3N1bV9yZXN1bHQgPSAxOwotCi0JZm9yIChpID0gMDsg aSA8IElPUF9BRE1BX05VTV9TUkNfVEVTVCArIDE7IGkrKykKLQkJZG1hX3NyY3NbaV0gPSBkbWFf bWFwX3BhZ2UoZG1hX2NoYW4tPmRldmljZS0+ZGV2LAotCQkJCQkgICB6ZXJvX3N1bV9zcmNzW2ld LCAwLCBQQUdFX1NJWkUsCi0JCQkJCSAgIERNQV9UT19ERVZJQ0UpOwotCXR4ID0gaW9wX2FkbWFf cHJlcF9kbWFfeG9yX3ZhbChkbWFfY2hhbiwgZG1hX3NyY3MsCi0JCQkJICAgICAgIElPUF9BRE1B X05VTV9TUkNfVEVTVCArIDEsIFBBR0VfU0laRSwKLQkJCQkgICAgICAgJnplcm9fc3VtX3Jlc3Vs dCwKLQkJCQkgICAgICAgRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NUUkxfQUNLKTsKLQotCWNv b2tpZSA9IGlvcF9hZG1hX3R4X3N1Ym1pdCh0eCk7Ci0JaW9wX2FkbWFfaXNzdWVfcGVuZGluZyhk bWFfY2hhbik7Ci0JbXNsZWVwKDgpOwotCi0JaWYgKGlvcF9hZG1hX3N0YXR1cyhkbWFfY2hhbiwg Y29va2llLCBOVUxMKSAhPSBETUFfQ09NUExFVEUpIHsKLQkJZGV2X2VycihkbWFfY2hhbi0+ZGV2 aWNlLT5kZXYsCi0JCQkiU2VsZi10ZXN0IHplcm8gc3VtIHRpbWVkIG91dCwgZGlzYWJsaW5nXG4i KTsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBmcmVlX3Jlc291cmNlczsKLQl9Ci0KLQlpZiAo emVyb19zdW1fcmVzdWx0ICE9IDApIHsKLQkJZGV2X2VycihkbWFfY2hhbi0+ZGV2aWNlLT5kZXYs Ci0JCQkiU2VsZi10ZXN0IHplcm8gc3VtIGZhaWxlZCBjb21wYXJlLCBkaXNhYmxpbmdcbiIpOwot CQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGZyZWVfcmVzb3VyY2VzOwotCX0KLQotCS8qIHRlc3Qg Zm9yIG5vbi16ZXJvIHBhcml0eSBzdW0gKi8KLQl6ZXJvX3N1bV9yZXN1bHQgPSAwOwotCWZvciAo aSA9IDA7IGkgPCBJT1BfQURNQV9OVU1fU1JDX1RFU1QgKyAxOyBpKyspCi0JCWRtYV9zcmNzW2ld ID0gZG1hX21hcF9wYWdlKGRtYV9jaGFuLT5kZXZpY2UtPmRldiwKLQkJCQkJICAgemVyb19zdW1f c3Jjc1tpXSwgMCwgUEFHRV9TSVpFLAotCQkJCQkgICBETUFfVE9fREVWSUNFKTsKLQl0eCA9IGlv cF9hZG1hX3ByZXBfZG1hX3hvcl92YWwoZG1hX2NoYW4sIGRtYV9zcmNzLAotCQkJCSAgICAgICBJ T1BfQURNQV9OVU1fU1JDX1RFU1QgKyAxLCBQQUdFX1NJWkUsCi0JCQkJICAgICAgICZ6ZXJvX3N1 bV9yZXN1bHQsCi0JCQkJICAgICAgIERNQV9QUkVQX0lOVEVSUlVQVCB8IERNQV9DVFJMX0FDSyk7 Ci0KLQljb29raWUgPSBpb3BfYWRtYV90eF9zdWJtaXQodHgpOwotCWlvcF9hZG1hX2lzc3VlX3Bl bmRpbmcoZG1hX2NoYW4pOwotCW1zbGVlcCg4KTsKLQotCWlmIChpb3BfYWRtYV9zdGF0dXMoZG1h X2NoYW4sIGNvb2tpZSwgTlVMTCkgIT0gRE1BX0NPTVBMRVRFKSB7Ci0JCWRldl9lcnIoZG1hX2No YW4tPmRldmljZS0+ZGV2LAotCQkJIlNlbGYtdGVzdCBub24temVybyBzdW0gdGltZWQgb3V0LCBk aXNhYmxpbmdcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGZyZWVfcmVzb3VyY2VzOwot CX0KLQotCWlmICh6ZXJvX3N1bV9yZXN1bHQgIT0gMSkgewotCQlkZXZfZXJyKGRtYV9jaGFuLT5k ZXZpY2UtPmRldiwKLQkJCSJTZWxmLXRlc3Qgbm9uLXplcm8gc3VtIGZhaWxlZCBjb21wYXJlLCBk aXNhYmxpbmdcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGZyZWVfcmVzb3VyY2VzOwot CX0KLQotZnJlZV9yZXNvdXJjZXM6Ci0JaW9wX2FkbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhkbWFf Y2hhbik7Ci1vdXQ6Ci0Jc3JjX2lkeCA9IElPUF9BRE1BX05VTV9TUkNfVEVTVDsKLQl3aGlsZSAo c3JjX2lkeC0tKQotCQlfX2ZyZWVfcGFnZSh4b3Jfc3Jjc1tzcmNfaWR4XSk7Ci0JX19mcmVlX3Bh Z2UoZGVzdCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotI2lmZGVmIENPTkZJR19SQUlENl9QUQotc3Rh dGljIGludAotaW9wX2FkbWFfcHFfemVyb19zdW1fc2VsZl90ZXN0KHN0cnVjdCBpb3BfYWRtYV9k ZXZpY2UgKmRldmljZSkKLXsKLQkvKiBjb21iaW5lZCBzb3VyY2VzLCBzb2Z0d2FyZSBwcSByZXN1 bHRzLCBhbmQgZXh0cmEgaHcgcHEgcmVzdWx0cyAqLwotCXN0cnVjdCBwYWdlICpwcVtJT1BfQURN QV9OVU1fU1JDX1RFU1QrMisyXTsKLQkvKiBwdHIgdG8gdGhlIGV4dHJhIGh3IHBxIGJ1ZmZlcnMg ZGVmaW5lZCBhYm92ZSAqLwotCXN0cnVjdCBwYWdlICoqcHFfaHcgPSAmcHFbSU9QX0FETUFfTlVN X1NSQ19URVNUKzJdOwotCS8qIGFkZHJlc3MgY29udmVyc2lvbiBidWZmZXJzIChkbWFfbWFwIC8g cGFnZV9hZGRyZXNzKSAqLwotCXZvaWQgKnBxX3N3W0lPUF9BRE1BX05VTV9TUkNfVEVTVCsyXTsK LQlkbWFfYWRkcl90IHBxX3NyY1tJT1BfQURNQV9OVU1fU1JDX1RFU1QrMl07Ci0JZG1hX2FkZHJf dCAqcHFfZGVzdCA9ICZwcV9zcmNbSU9QX0FETUFfTlVNX1NSQ19URVNUXTsKLQotCWludCBpOwot CXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7Ci0Jc3RydWN0IGRtYV9jaGFuICpk bWFfY2hhbjsKLQlkbWFfY29va2llX3QgY29va2llOwotCXUzMiB6ZXJvX3N1bV9yZXN1bHQ7Ci0J aW50IGVyciA9IDA7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCi0JZGV2X2RiZyhkZXZpY2UtPmNv bW1vbi5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJ WkUocHEpOyBpKyspIHsKLQkJcHFbaV0gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwotCQlpZiAo IXBxW2ldKSB7Ci0JCQl3aGlsZSAoaS0tKQotCQkJCV9fZnJlZV9wYWdlKHBxW2ldKTsKLQkJCXJl dHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCi0JLyogRmlsbCBpbiBzcmMgYnVmZmVycyAqLwotCWZv ciAoaSA9IDA7IGkgPCBJT1BfQURNQV9OVU1fU1JDX1RFU1Q7IGkrKykgewotCQlwcV9zd1tpXSA9 IHBhZ2VfYWRkcmVzcyhwcVtpXSk7Ci0JCW1lbXNldChwcV9zd1tpXSwgMHgxMTExMTExMSAqICgx PDxpKSwgUEFHRV9TSVpFKTsKLQl9Ci0JcHFfc3dbaV0gPSBwYWdlX2FkZHJlc3MocHFbaV0pOwot CXBxX3N3W2krMV0gPSBwYWdlX2FkZHJlc3MocHFbaSsxXSk7Ci0KLQlkbWFfY2hhbiA9IGNvbnRh aW5lcl9vZihkZXZpY2UtPmNvbW1vbi5jaGFubmVscy5uZXh0LAotCQkJCXN0cnVjdCBkbWFfY2hh biwKLQkJCQlkZXZpY2Vfbm9kZSk7Ci0JaWYgKGlvcF9hZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2Vz KGRtYV9jaGFuKSA8IDEpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBvdXQ7Ci0JfQotCi0J ZGV2ID0gZG1hX2NoYW4tPmRldmljZS0+ZGV2OwotCi0JLyogaW5pdGlhbGl6ZSB0aGUgZGVzdHMg Ki8KLQltZW1zZXQocGFnZV9hZGRyZXNzKHBxX2h3WzBdKSwgMCAsIFBBR0VfU0laRSk7Ci0JbWVt c2V0KHBhZ2VfYWRkcmVzcyhwcV9od1sxXSksIDAgLCBQQUdFX1NJWkUpOwotCi0JLyogdGVzdCBw cSAqLwotCXBxX2Rlc3RbMF0gPSBkbWFfbWFwX3BhZ2UoZGV2LCBwcV9od1swXSwgMCwgUEFHRV9T SVpFLCBETUFfRlJPTV9ERVZJQ0UpOwotCXBxX2Rlc3RbMV0gPSBkbWFfbWFwX3BhZ2UoZGV2LCBw cV9od1sxXSwgMCwgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwotCWZvciAoaSA9IDA7IGkg PCBJT1BfQURNQV9OVU1fU1JDX1RFU1Q7IGkrKykKLQkJcHFfc3JjW2ldID0gZG1hX21hcF9wYWdl KGRldiwgcHFbaV0sIDAsIFBBR0VfU0laRSwKLQkJCQkJIERNQV9UT19ERVZJQ0UpOwotCi0JdHgg PSBpb3BfYWRtYV9wcmVwX2RtYV9wcShkbWFfY2hhbiwgcHFfZGVzdCwgcHFfc3JjLAotCQkJCSAg SU9QX0FETUFfTlVNX1NSQ19URVNULCAodTggKilyYWlkNl9nZmV4cCwKLQkJCQkgIFBBR0VfU0la RSwKLQkJCQkgIERNQV9QUkVQX0lOVEVSUlVQVCB8Ci0JCQkJICBETUFfQ1RSTF9BQ0spOwotCi0J Y29va2llID0gaW9wX2FkbWFfdHhfc3VibWl0KHR4KTsKLQlpb3BfYWRtYV9pc3N1ZV9wZW5kaW5n KGRtYV9jaGFuKTsKLQltc2xlZXAoOCk7Ci0KLQlpZiAoaW9wX2FkbWFfc3RhdHVzKGRtYV9jaGFu LCBjb29raWUsIE5VTEwpICE9Ci0JCURNQV9DT01QTEVURSkgewotCQlkZXZfZXJyKGRldiwgIlNl bGYtdGVzdCBwcSB0aW1lZCBvdXQsIGRpc2FibGluZ1xuIik7Ci0JCWVyciA9IC1FTk9ERVY7Ci0J CWdvdG8gZnJlZV9yZXNvdXJjZXM7Ci0JfQotCi0JcmFpZDZfY2FsbC5nZW5fc3luZHJvbWUoSU9Q X0FETUFfTlVNX1NSQ19URVNUKzIsIFBBR0VfU0laRSwgcHFfc3cpOwotCi0JaWYgKG1lbWNtcChw cV9zd1tJT1BfQURNQV9OVU1fU1JDX1RFU1RdLAotCQkgICBwYWdlX2FkZHJlc3MocHFfaHdbMF0p LCBQQUdFX1NJWkUpICE9IDApIHsKLQkJZGV2X2VycihkZXYsICJTZWxmLXRlc3QgcCBmYWlsZWQg Y29tcGFyZSwgZGlzYWJsaW5nXG4iKTsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBmcmVlX3Jl c291cmNlczsKLQl9Ci0JaWYgKG1lbWNtcChwcV9zd1tJT1BfQURNQV9OVU1fU1JDX1RFU1QrMV0s Ci0JCSAgIHBhZ2VfYWRkcmVzcyhwcV9od1sxXSksIFBBR0VfU0laRSkgIT0gMCkgewotCQlkZXZf ZXJyKGRldiwgIlNlbGYtdGVzdCBxIGZhaWxlZCBjb21wYXJlLCBkaXNhYmxpbmdcbiIpOwotCQll cnIgPSAtRU5PREVWOwotCQlnb3RvIGZyZWVfcmVzb3VyY2VzOwotCX0KLQotCS8qIHRlc3QgY29y cmVjdCB6ZXJvIHN1bSB1c2luZyB0aGUgc29mdHdhcmUgZ2VuZXJhdGVkIHBxIHZhbHVlcyAqLwot CWZvciAoaSA9IDA7IGkgPCBJT1BfQURNQV9OVU1fU1JDX1RFU1QgKyAyOyBpKyspCi0JCXBxX3Ny Y1tpXSA9IGRtYV9tYXBfcGFnZShkZXYsIHBxW2ldLCAwLCBQQUdFX1NJWkUsCi0JCQkJCSBETUFf VE9fREVWSUNFKTsKLQotCXplcm9fc3VtX3Jlc3VsdCA9IH4wOwotCXR4ID0gaW9wX2FkbWFfcHJl cF9kbWFfcHFfdmFsKGRtYV9jaGFuLCAmcHFfc3JjW0lPUF9BRE1BX05VTV9TUkNfVEVTVF0sCi0J CQkJICAgICAgcHFfc3JjLCBJT1BfQURNQV9OVU1fU1JDX1RFU1QsCi0JCQkJICAgICAgcmFpZDZf Z2ZleHAsIFBBR0VfU0laRSwgJnplcm9fc3VtX3Jlc3VsdCwKLQkJCQkgICAgICBETUFfUFJFUF9J TlRFUlJVUFR8RE1BX0NUUkxfQUNLKTsKLQotCWNvb2tpZSA9IGlvcF9hZG1hX3R4X3N1Ym1pdCh0 eCk7Ci0JaW9wX2FkbWFfaXNzdWVfcGVuZGluZyhkbWFfY2hhbik7Ci0JbXNsZWVwKDgpOwotCi0J aWYgKGlvcF9hZG1hX3N0YXR1cyhkbWFfY2hhbiwgY29va2llLCBOVUxMKSAhPQotCQlETUFfQ09N UExFVEUpIHsKLQkJZGV2X2VycihkZXYsICJTZWxmLXRlc3QgcHEtemVyby1zdW0gdGltZWQgb3V0 LCBkaXNhYmxpbmdcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGZyZWVfcmVzb3VyY2Vz OwotCX0KLQotCWlmICh6ZXJvX3N1bV9yZXN1bHQgIT0gMCkgewotCQlkZXZfZXJyKGRldiwgIlNl bGYtdGVzdCBwcS16ZXJvLXN1bSBmYWlsZWQgdG8gdmFsaWRhdGU6ICV4XG4iLAotCQkJemVyb19z dW1fcmVzdWx0KTsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBmcmVlX3Jlc291cmNlczsKLQl9 Ci0KLQkvKiB0ZXN0IGluY29ycmVjdCB6ZXJvIHN1bSAqLwotCWkgPSBJT1BfQURNQV9OVU1fU1JD X1RFU1Q7Ci0JbWVtc2V0KHBxX3N3W2ldICsgMTAwLCAwLCAxMDApOwotCW1lbXNldChwcV9zd1tp KzFdICsgMjAwLCAwLCAyMDApOwotCWZvciAoaSA9IDA7IGkgPCBJT1BfQURNQV9OVU1fU1JDX1RF U1QgKyAyOyBpKyspCi0JCXBxX3NyY1tpXSA9IGRtYV9tYXBfcGFnZShkZXYsIHBxW2ldLCAwLCBQ QUdFX1NJWkUsCi0JCQkJCSBETUFfVE9fREVWSUNFKTsKLQotCXplcm9fc3VtX3Jlc3VsdCA9IDA7 Ci0JdHggPSBpb3BfYWRtYV9wcmVwX2RtYV9wcV92YWwoZG1hX2NoYW4sICZwcV9zcmNbSU9QX0FE TUFfTlVNX1NSQ19URVNUXSwKLQkJCQkgICAgICBwcV9zcmMsIElPUF9BRE1BX05VTV9TUkNfVEVT VCwKLQkJCQkgICAgICByYWlkNl9nZmV4cCwgUEFHRV9TSVpFLCAmemVyb19zdW1fcmVzdWx0LAot CQkJCSAgICAgIERNQV9QUkVQX0lOVEVSUlVQVHxETUFfQ1RSTF9BQ0spOwotCi0JY29va2llID0g aW9wX2FkbWFfdHhfc3VibWl0KHR4KTsKLQlpb3BfYWRtYV9pc3N1ZV9wZW5kaW5nKGRtYV9jaGFu KTsKLQltc2xlZXAoOCk7Ci0KLQlpZiAoaW9wX2FkbWFfc3RhdHVzKGRtYV9jaGFuLCBjb29raWUs IE5VTEwpICE9Ci0JCURNQV9DT01QTEVURSkgewotCQlkZXZfZXJyKGRldiwgIlNlbGYtdGVzdCAh cHEtemVyby1zdW0gdGltZWQgb3V0LCBkaXNhYmxpbmdcbiIpOwotCQllcnIgPSAtRU5PREVWOwot CQlnb3RvIGZyZWVfcmVzb3VyY2VzOwotCX0KLQotCWlmICh6ZXJvX3N1bV9yZXN1bHQgIT0gKFNV TV9DSEVDS19QX1JFU1VMVCB8IFNVTV9DSEVDS19RX1JFU1VMVCkpIHsKLQkJZGV2X2VycihkZXYs ICJTZWxmLXRlc3QgIXBxLXplcm8tc3VtIGZhaWxlZCB0byB2YWxpZGF0ZTogJXhcbiIsCi0JCQl6 ZXJvX3N1bV9yZXN1bHQpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGZyZWVfcmVzb3VyY2Vz OwotCX0KLQotZnJlZV9yZXNvdXJjZXM6Ci0JaW9wX2FkbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhk bWFfY2hhbik7Ci1vdXQ6Ci0JaSA9IEFSUkFZX1NJWkUocHEpOwotCXdoaWxlIChpLS0pCi0JCV9f ZnJlZV9wYWdlKHBxW2ldKTsKLQlyZXR1cm4gZXJyOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQg aW9wX2FkbWFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qg aW9wX2FkbWFfZGV2aWNlICpkZXZpY2UgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0 cnVjdCBkbWFfY2hhbiAqY2hhbiwgKl9jaGFuOwotCXN0cnVjdCBpb3BfYWRtYV9jaGFuICppb3Bf Y2hhbjsKLQlzdHJ1Y3QgaW9wX2FkbWFfcGxhdGZvcm1fZGF0YSAqcGxhdF9kYXRhID0gZGV2X2dl dF9wbGF0ZGF0YSgmZGV2LT5kZXYpOwotCi0JZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKCZk ZXZpY2UtPmNvbW1vbik7Ci0KLQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5kZXYsIHBsYXRfZGF0 YS0+cG9vbF9zaXplLAotCQkJZGV2aWNlLT5kbWFfZGVzY19wb29sX3ZpcnQsIGRldmljZS0+ZG1h X2Rlc2NfcG9vbCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hhbiwgX2NoYW4sICZk ZXZpY2UtPmNvbW1vbi5jaGFubmVscywKLQkJCQlkZXZpY2Vfbm9kZSkgewotCQlpb3BfY2hhbiA9 IHRvX2lvcF9hZG1hX2NoYW4oY2hhbik7Ci0JCWxpc3RfZGVsKCZjaGFuLT5kZXZpY2Vfbm9kZSk7 Ci0JCWtmcmVlKGlvcF9jaGFuKTsKLQl9Ci0Ja2ZyZWUoZGV2aWNlKTsKLQotCXJldHVybiAwOwot fQotCi1zdGF0aWMgaW50IGlvcF9hZG1hX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYpCi17Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JaW50IHJldCA9IDAsIGk7Ci0Jc3RydWN0 IGlvcF9hZG1hX2RldmljZSAqYWRldjsKLQlzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqaW9wX2NoYW47 Ci0Jc3RydWN0IGRtYV9kZXZpY2UgKmRtYV9kZXY7Ci0Jc3RydWN0IGlvcF9hZG1hX3BsYXRmb3Jt X2RhdGEgKnBsYXRfZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Ci0KLQlyZXMg PSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICgh cmVzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24o JnBkZXYtPmRldiwgcmVzLT5zdGFydCwKLQkJCQlyZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5h bWUpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JYWRldiA9IGt6YWxsb2Moc2l6ZW9mKCphZGV2KSwg R0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQlkbWFfZGV2ID0g JmFkZXYtPmNvbW1vbjsKLQotCS8qIGFsbG9jYXRlIGNvaGVyZW50IG1lbW9yeSBmb3IgaGFyZHdh cmUgZGVzY3JpcHRvcnMKLQkgKiBub3RlOiB3cml0ZWNvbWJpbmUgZ2l2ZXMgc2xpZ2h0bHkgYmV0 dGVyIHBlcmZvcm1hbmNlLCBidXQKLQkgKiByZXF1aXJlcyB0aGF0IHdlIGV4cGxpY2l0bHkgZmx1 c2ggdGhlIHdyaXRlcwotCSAqLwotCWFkZXYtPmRtYV9kZXNjX3Bvb2xfdmlydCA9IGRtYV9hbGxv Y193YygmcGRldi0+ZGV2LAotCQkJCQkJcGxhdF9kYXRhLT5wb29sX3NpemUsCi0JCQkJCQkmYWRl di0+ZG1hX2Rlc2NfcG9vbCwKLQkJCQkJCUdGUF9LRVJORUwpOwotCWlmICghYWRldi0+ZG1hX2Rl c2NfcG9vbF92aXJ0KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2ZyZWVfYWRldjsK LQl9Ci0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogYWxsb2NhdGVkIGRlc2NyaXB0b3IgcG9v bCB2aXJ0ICVwIHBoeXMgJXBhZFxuIiwKLQkJX19mdW5jX18sIGFkZXYtPmRtYV9kZXNjX3Bvb2xf dmlydCwgJmFkZXYtPmRtYV9kZXNjX3Bvb2wpOwotCi0JYWRldi0+aWQgPSBwbGF0X2RhdGEtPmh3 X2lkOwotCi0JLyogZGlzY292ZXIgdHJhbnNhY3Rpb24gY2FwYWJpbGl0ZXMgZnJvbSB0aGUgcGxh dGZvcm0gZGF0YSAqLwotCWRtYV9kZXYtPmNhcF9tYXNrID0gcGxhdF9kYXRhLT5jYXBfbWFzazsK LQotCWFkZXYtPnBkZXYgPSBwZGV2OwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGFkZXYp OwotCi0JSU5JVF9MSVNUX0hFQUQoJmRtYV9kZXYtPmNoYW5uZWxzKTsKLQotCS8qIHNldCBiYXNl IHJvdXRpbmVzICovCi0JZG1hX2Rldi0+ZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzID0gaW9w X2FkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXM7Ci0JZG1hX2Rldi0+ZGV2aWNlX2ZyZWVfY2hhbl9y ZXNvdXJjZXMgPSBpb3BfYWRtYV9mcmVlX2NoYW5fcmVzb3VyY2VzOwotCWRtYV9kZXYtPmRldmlj ZV90eF9zdGF0dXMgPSBpb3BfYWRtYV9zdGF0dXM7Ci0JZG1hX2Rldi0+ZGV2aWNlX2lzc3VlX3Bl bmRpbmcgPSBpb3BfYWRtYV9pc3N1ZV9wZW5kaW5nOwotCWRtYV9kZXYtPmRldiA9ICZwZGV2LT5k ZXY7Ci0KLQkvKiBzZXQgcHJlcCByb3V0aW5lcyBiYXNlZCBvbiBjYXBhYmlsaXR5ICovCi0JaWYg KGRtYV9oYXNfY2FwKERNQV9NRU1DUFksIGRtYV9kZXYtPmNhcF9tYXNrKSkKLQkJZG1hX2Rldi0+ ZGV2aWNlX3ByZXBfZG1hX21lbWNweSA9IGlvcF9hZG1hX3ByZXBfZG1hX21lbWNweTsKLQlpZiAo ZG1hX2hhc19jYXAoRE1BX1hPUiwgZG1hX2Rldi0+Y2FwX21hc2spKSB7Ci0JCWRtYV9kZXYtPm1h eF94b3IgPSBpb3BfYWRtYV9nZXRfbWF4X3hvcigpOwotCQlkbWFfZGV2LT5kZXZpY2VfcHJlcF9k bWFfeG9yID0gaW9wX2FkbWFfcHJlcF9kbWFfeG9yOwotCX0KLQlpZiAoZG1hX2hhc19jYXAoRE1B X1hPUl9WQUwsIGRtYV9kZXYtPmNhcF9tYXNrKSkKLQkJZG1hX2Rldi0+ZGV2aWNlX3ByZXBfZG1h X3hvcl92YWwgPQotCQkJaW9wX2FkbWFfcHJlcF9kbWFfeG9yX3ZhbDsKLQlpZiAoZG1hX2hhc19j YXAoRE1BX1BRLCBkbWFfZGV2LT5jYXBfbWFzaykpIHsKLQkJZG1hX3NldF9tYXhwcShkbWFfZGV2 LCBpb3BfYWRtYV9nZXRfbWF4X3BxKCksIDApOwotCQlkbWFfZGV2LT5kZXZpY2VfcHJlcF9kbWFf cHEgPSBpb3BfYWRtYV9wcmVwX2RtYV9wcTsKLQl9Ci0JaWYgKGRtYV9oYXNfY2FwKERNQV9QUV9W QUwsIGRtYV9kZXYtPmNhcF9tYXNrKSkKLQkJZG1hX2Rldi0+ZGV2aWNlX3ByZXBfZG1hX3BxX3Zh bCA9Ci0JCQlpb3BfYWRtYV9wcmVwX2RtYV9wcV92YWw7Ci0JaWYgKGRtYV9oYXNfY2FwKERNQV9J TlRFUlJVUFQsIGRtYV9kZXYtPmNhcF9tYXNrKSkKLQkJZG1hX2Rldi0+ZGV2aWNlX3ByZXBfZG1h X2ludGVycnVwdCA9Ci0JCQlpb3BfYWRtYV9wcmVwX2RtYV9pbnRlcnJ1cHQ7Ci0KLQlpb3BfY2hh biA9IGt6YWxsb2Moc2l6ZW9mKCppb3BfY2hhbiksIEdGUF9LRVJORUwpOwotCWlmICghaW9wX2No YW4pIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfZnJlZV9kbWE7Ci0JfQotCWlvcF9j aGFuLT5kZXZpY2UgPSBhZGV2OwotCi0JaW9wX2NoYW4tPm1tcl9iYXNlID0gZGV2bV9pb3JlbWFw KCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCi0JCQkJCXJlc291cmNlX3NpemUocmVzKSk7Ci0JaWYg KCFpb3BfY2hhbi0+bW1yX2Jhc2UpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfZnJl ZV9pb3BfY2hhbjsKLQl9Ci0JdGFza2xldF9zZXR1cCgmaW9wX2NoYW4tPmlycV90YXNrbGV0LCBp b3BfYWRtYV90YXNrbGV0KTsKLQotCS8qIGNsZWFyIGVycm9ycyBiZWZvcmUgZW5hYmxpbmcgaW50 ZXJydXB0cyAqLwotCWlvcF9hZG1hX2RldmljZV9jbGVhcl9lcnJfc3RhdHVzKGlvcF9jaGFuKTsK LQotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJc3RhdGljIGNvbnN0IGlycV9oYW5kbGVy X3QgaGFuZGxlcltdID0gewotCQkJaW9wX2FkbWFfZW90X2hhbmRsZXIsCi0JCQlpb3BfYWRtYV9l b2NfaGFuZGxlciwKLQkJCWlvcF9hZG1hX2Vycl9oYW5kbGVyCi0JCX07Ci0JCWludCBpcnEgPSBw bGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkpOwotCQlpZiAoaXJxIDwgMCkgewotCQkJcmV0ID0gLUVO WElPOwotCQkJZ290byBlcnJfZnJlZV9pb3BfY2hhbjsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IGRl dm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLAotCQkJCQloYW5kbGVyW2ldLCAwLCBwZGV2 LT5uYW1lLCBpb3BfY2hhbik7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyX2ZyZWVfaW9wX2No YW47Ci0JCX0KLQl9Ci0KLQlzcGluX2xvY2tfaW5pdCgmaW9wX2NoYW4tPmxvY2spOwotCUlOSVRf TElTVF9IRUFEKCZpb3BfY2hhbi0+Y2hhaW4pOwotCUlOSVRfTElTVF9IRUFEKCZpb3BfY2hhbi0+ YWxsX3Nsb3RzKTsKLQlpb3BfY2hhbi0+Y29tbW9uLmRldmljZSA9IGRtYV9kZXY7Ci0JZG1hX2Nv b2tpZV9pbml0KCZpb3BfY2hhbi0+Y29tbW9uKTsKLQlsaXN0X2FkZF90YWlsKCZpb3BfY2hhbi0+ Y29tbW9uLmRldmljZV9ub2RlLCAmZG1hX2Rldi0+Y2hhbm5lbHMpOwotCi0JaWYgKGRtYV9oYXNf Y2FwKERNQV9NRU1DUFksIGRtYV9kZXYtPmNhcF9tYXNrKSkgewotCQlyZXQgPSBpb3BfYWRtYV9t ZW1jcHlfc2VsZl90ZXN0KGFkZXYpOwotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtZW1jcHkgc2Vs ZiB0ZXN0IHJldHVybmVkICVkXG4iLCByZXQpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJfZnJl ZV9pb3BfY2hhbjsKLQl9Ci0KLQlpZiAoZG1hX2hhc19jYXAoRE1BX1hPUiwgZG1hX2Rldi0+Y2Fw X21hc2spKSB7Ci0JCXJldCA9IGlvcF9hZG1hX3hvcl92YWxfc2VsZl90ZXN0KGFkZXYpOwotCQlk ZXZfZGJnKCZwZGV2LT5kZXYsICJ4b3Igc2VsZiB0ZXN0IHJldHVybmVkICVkXG4iLCByZXQpOwot CQlpZiAocmV0KQotCQkJZ290byBlcnJfZnJlZV9pb3BfY2hhbjsKLQl9Ci0KLQlpZiAoZG1hX2hh c19jYXAoRE1BX1BRLCBkbWFfZGV2LT5jYXBfbWFzaykgJiYKLQkgICAgZG1hX2hhc19jYXAoRE1B X1BRX1ZBTCwgZG1hX2Rldi0+Y2FwX21hc2spKSB7Ci0JCSNpZmRlZiBDT05GSUdfUkFJRDZfUFEK LQkJcmV0ID0gaW9wX2FkbWFfcHFfemVyb19zdW1fc2VsZl90ZXN0KGFkZXYpOwotCQlkZXZfZGJn KCZwZGV2LT5kZXYsICJwcSBzZWxmIHRlc3QgcmV0dXJuZWQgJWRcbiIsIHJldCk7Ci0JCSNlbHNl Ci0JCS8qIGNhbiBub3QgdGVzdCByYWlkNiwgc28gZG8gbm90IHB1Ymxpc2ggY2FwYWJpbGl0eSAq LwotCQlkbWFfY2FwX2NsZWFyKERNQV9QUSwgZG1hX2Rldi0+Y2FwX21hc2spOwotCQlkbWFfY2Fw X2NsZWFyKERNQV9QUV9WQUwsIGRtYV9kZXYtPmNhcF9tYXNrKTsKLQkJcmV0ID0gMDsKLQkJI2Vu ZGlmCi0JCWlmIChyZXQpCi0JCQlnb3RvIGVycl9mcmVlX2lvcF9jaGFuOwotCX0KLQotCWRldl9p bmZvKCZwZGV2LT5kZXYsICJJbnRlbChSKSBJT1A6ICggJXMlcyVzJXMlcyVzKVxuIiwKLQkJIGRt YV9oYXNfY2FwKERNQV9QUSwgZG1hX2Rldi0+Y2FwX21hc2spID8gInBxICIgOiAiIiwKLQkJIGRt YV9oYXNfY2FwKERNQV9QUV9WQUwsIGRtYV9kZXYtPmNhcF9tYXNrKSA/ICJwcV92YWwgIiA6ICIi LAotCQkgZG1hX2hhc19jYXAoRE1BX1hPUiwgZG1hX2Rldi0+Y2FwX21hc2spID8gInhvciAiIDog IiIsCi0JCSBkbWFfaGFzX2NhcChETUFfWE9SX1ZBTCwgZG1hX2Rldi0+Y2FwX21hc2spID8gInhv cl92YWwgIiA6ICIiLAotCQkgZG1hX2hhc19jYXAoRE1BX01FTUNQWSwgZG1hX2Rldi0+Y2FwX21h c2spID8gImNweSAiIDogIiIsCi0JCSBkbWFfaGFzX2NhcChETUFfSU5URVJSVVBULCBkbWFfZGV2 LT5jYXBfbWFzaykgPyAiaW50ciAiIDogIiIpOwotCi0JZG1hX2FzeW5jX2RldmljZV9yZWdpc3Rl cihkbWFfZGV2KTsKLQlnb3RvIG91dDsKLQotIGVycl9mcmVlX2lvcF9jaGFuOgotCWtmcmVlKGlv cF9jaGFuKTsKLSBlcnJfZnJlZV9kbWE6Ci0JZG1hX2ZyZWVfY29oZXJlbnQoJmFkZXYtPnBkZXYt PmRldiwgcGxhdF9kYXRhLT5wb29sX3NpemUsCi0JCQlhZGV2LT5kbWFfZGVzY19wb29sX3ZpcnQs IGFkZXYtPmRtYV9kZXNjX3Bvb2wpOwotIGVycl9mcmVlX2FkZXY6Ci0Ja2ZyZWUoYWRldik7Ci0g b3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvcF9jaGFuX3N0YXJ0X251bGxf bWVtY3B5KHN0cnVjdCBpb3BfYWRtYV9jaGFuICppb3BfY2hhbikKLXsKLQlzdHJ1Y3QgaW9wX2Fk bWFfZGVzY19zbG90ICpzd19kZXNjLCAqZ3JwX3N0YXJ0OwotCWRtYV9jb29raWVfdCBjb29raWU7 Ci0JaW50IHNsb3RfY250LCBzbG90c19wZXJfb3A7Ci0KLQlkZXZfZGJnKGlvcF9jaGFuLT5kZXZp Y2UtPmNvbW1vbi5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCi0Jc3Bpbl9sb2NrX2JoKCZpb3Bf Y2hhbi0+bG9jayk7Ci0Jc2xvdF9jbnQgPSBpb3BfY2hhbl9tZW1jcHlfc2xvdF9jb3VudCgwLCAm c2xvdHNfcGVyX29wKTsKLQlzd19kZXNjID0gaW9wX2FkbWFfYWxsb2Nfc2xvdHMoaW9wX2NoYW4s IHNsb3RfY250LCBzbG90c19wZXJfb3ApOwotCWlmIChzd19kZXNjKSB7Ci0JCWdycF9zdGFydCA9 IHN3X2Rlc2MtPmdyb3VwX2hlYWQ7Ci0KLQkJbGlzdF9zcGxpY2VfaW5pdCgmc3dfZGVzYy0+dHhf bGlzdCwgJmlvcF9jaGFuLT5jaGFpbik7Ci0JCWFzeW5jX3R4X2Fjaygmc3dfZGVzYy0+YXN5bmNf dHgpOwotCQlpb3BfZGVzY19pbml0X21lbWNweShncnBfc3RhcnQsIDApOwotCQlpb3BfZGVzY19z ZXRfYnl0ZV9jb3VudChncnBfc3RhcnQsIGlvcF9jaGFuLCAwKTsKLQkJaW9wX2Rlc2Nfc2V0X2Rl c3RfYWRkcihncnBfc3RhcnQsIGlvcF9jaGFuLCAwKTsKLQkJaW9wX2Rlc2Nfc2V0X21lbWNweV9z cmNfYWRkcihncnBfc3RhcnQsIDApOwotCi0JCWNvb2tpZSA9IGRtYV9jb29raWVfYXNzaWduKCZz d19kZXNjLT5hc3luY190eCk7Ci0KLQkJLyogaW5pdGlhbGl6ZSB0aGUgY29tcGxldGVkIGNvb2tp ZSB0byBiZSBsZXNzIHRoYW4KLQkJICogdGhlIG1vc3QgcmVjZW50bHkgdXNlZCBjb29raWUKLQkJ ICovCi0JCWlvcF9jaGFuLT5jb21tb24uY29tcGxldGVkX2Nvb2tpZSA9IGNvb2tpZSAtIDE7Ci0K LQkJLyogY2hhbm5lbCBzaG91bGQgbm90IGJlIGJ1c3kgKi8KLQkJQlVHX09OKGlvcF9jaGFuX2lz X2J1c3koaW9wX2NoYW4pKTsKLQotCQkvKiBjbGVhciBhbnkgcHJpb3IgZXJyb3Itc3RhdHVzIGJp dHMgKi8KLQkJaW9wX2FkbWFfZGV2aWNlX2NsZWFyX2Vycl9zdGF0dXMoaW9wX2NoYW4pOwotCi0J CS8qIGRpc2FibGUgb3BlcmF0aW9uICovCi0JCWlvcF9jaGFuX2Rpc2FibGUoaW9wX2NoYW4pOwot Ci0JCS8qIHNldCB0aGUgZGVzY3JpcHRvciBhZGRyZXNzICovCi0JCWlvcF9jaGFuX3NldF9uZXh0 X2Rlc2NyaXB0b3IoaW9wX2NoYW4sIHN3X2Rlc2MtPmFzeW5jX3R4LnBoeXMpOwotCi0JCS8qIDEv IGRvbid0IGFkZCBwcmUtY2hhaW5lZCBkZXNjcmlwdG9ycwotCQkgKiAyLyBkdW1teSByZWFkIHRv IGZsdXNoIG5leHRfZGVzYyB3cml0ZQotCQkgKi8KLQkJQlVHX09OKGlvcF9kZXNjX2dldF9uZXh0 X2Rlc2Moc3dfZGVzYykpOwotCi0JCS8qIHJ1biB0aGUgZGVzY3JpcHRvciAqLwotCQlpb3BfY2hh bl9lbmFibGUoaW9wX2NoYW4pOwotCX0gZWxzZQotCQlkZXZfZXJyKGlvcF9jaGFuLT5kZXZpY2Ut PmNvbW1vbi5kZXYsCi0JCQkiZmFpbGVkIHRvIGFsbG9jYXRlIG51bGwgZGVzY3JpcHRvclxuIik7 Ci0Jc3Bpbl91bmxvY2tfYmgoJmlvcF9jaGFuLT5sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgaW9w X2NoYW5fc3RhcnRfbnVsbF94b3Ioc3RydWN0IGlvcF9hZG1hX2NoYW4gKmlvcF9jaGFuKQotewot CXN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKnN3X2Rlc2MsICpncnBfc3RhcnQ7Ci0JZG1hX2Nv b2tpZV90IGNvb2tpZTsKLQlpbnQgc2xvdF9jbnQsIHNsb3RzX3Blcl9vcDsKLQotCWRldl9kYmco aW9wX2NoYW4tPmRldmljZS0+Y29tbW9uLmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlzcGlu X2xvY2tfYmgoJmlvcF9jaGFuLT5sb2NrKTsKLQlzbG90X2NudCA9IGlvcF9jaGFuX3hvcl9zbG90 X2NvdW50KDAsIDIsICZzbG90c19wZXJfb3ApOwotCXN3X2Rlc2MgPSBpb3BfYWRtYV9hbGxvY19z bG90cyhpb3BfY2hhbiwgc2xvdF9jbnQsIHNsb3RzX3Blcl9vcCk7Ci0JaWYgKHN3X2Rlc2MpIHsK LQkJZ3JwX3N0YXJ0ID0gc3dfZGVzYy0+Z3JvdXBfaGVhZDsKLQkJbGlzdF9zcGxpY2VfaW5pdCgm c3dfZGVzYy0+dHhfbGlzdCwgJmlvcF9jaGFuLT5jaGFpbik7Ci0JCWFzeW5jX3R4X2Fjaygmc3df ZGVzYy0+YXN5bmNfdHgpOwotCQlpb3BfZGVzY19pbml0X251bGxfeG9yKGdycF9zdGFydCwgMiwg MCk7Ci0JCWlvcF9kZXNjX3NldF9ieXRlX2NvdW50KGdycF9zdGFydCwgaW9wX2NoYW4sIDApOwot CQlpb3BfZGVzY19zZXRfZGVzdF9hZGRyKGdycF9zdGFydCwgaW9wX2NoYW4sIDApOwotCQlpb3Bf ZGVzY19zZXRfeG9yX3NyY19hZGRyKGdycF9zdGFydCwgMCwgMCk7Ci0JCWlvcF9kZXNjX3NldF94 b3Jfc3JjX2FkZHIoZ3JwX3N0YXJ0LCAxLCAwKTsKLQotCQljb29raWUgPSBkbWFfY29va2llX2Fz c2lnbigmc3dfZGVzYy0+YXN5bmNfdHgpOwotCi0JCS8qIGluaXRpYWxpemUgdGhlIGNvbXBsZXRl ZCBjb29raWUgdG8gYmUgbGVzcyB0aGFuCi0JCSAqIHRoZSBtb3N0IHJlY2VudGx5IHVzZWQgY29v a2llCi0JCSAqLwotCQlpb3BfY2hhbi0+Y29tbW9uLmNvbXBsZXRlZF9jb29raWUgPSBjb29raWUg LSAxOwotCi0JCS8qIGNoYW5uZWwgc2hvdWxkIG5vdCBiZSBidXN5ICovCi0JCUJVR19PTihpb3Bf Y2hhbl9pc19idXN5KGlvcF9jaGFuKSk7Ci0KLQkJLyogY2xlYXIgYW55IHByaW9yIGVycm9yLXN0 YXR1cyBiaXRzICovCi0JCWlvcF9hZG1hX2RldmljZV9jbGVhcl9lcnJfc3RhdHVzKGlvcF9jaGFu KTsKLQotCQkvKiBkaXNhYmxlIG9wZXJhdGlvbiAqLwotCQlpb3BfY2hhbl9kaXNhYmxlKGlvcF9j aGFuKTsKLQotCQkvKiBzZXQgdGhlIGRlc2NyaXB0b3IgYWRkcmVzcyAqLwotCQlpb3BfY2hhbl9z ZXRfbmV4dF9kZXNjcmlwdG9yKGlvcF9jaGFuLCBzd19kZXNjLT5hc3luY190eC5waHlzKTsKLQot CQkvKiAxLyBkb24ndCBhZGQgcHJlLWNoYWluZWQgZGVzY3JpcHRvcnMKLQkJICogMi8gZHVtbXkg cmVhZCB0byBmbHVzaCBuZXh0X2Rlc2Mgd3JpdGUKLQkJICovCi0JCUJVR19PTihpb3BfZGVzY19n ZXRfbmV4dF9kZXNjKHN3X2Rlc2MpKTsKLQotCQkvKiBydW4gdGhlIGRlc2NyaXB0b3IgKi8KLQkJ aW9wX2NoYW5fZW5hYmxlKGlvcF9jaGFuKTsKLQl9IGVsc2UKLQkJZGV2X2Vycihpb3BfY2hhbi0+ ZGV2aWNlLT5jb21tb24uZGV2LAotCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBudWxsIGRlc2NyaXB0 b3JcbiIpOwotCXNwaW5fdW5sb2NrX2JoKCZpb3BfY2hhbi0+bG9jayk7Ci19Ci0KLXN0YXRpYyBz dHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlvcF9hZG1hX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gaW9w X2FkbWFfcHJvYmUsCi0JLnJlbW92ZQkJPSBpb3BfYWRtYV9yZW1vdmUsCi0JLmRyaXZlcgkJPSB7 Ci0JCS5uYW1lCT0gImlvcC1hZG1hIiwKLQl9LAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZl cihpb3BfYWRtYV9kcml2ZXIpOwotCi1NT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiIp OwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJT1AgQURNQSBFbmdpbmUgRHJpdmVyIik7Ci1NT0RVTEVf TElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOmlvcC1hZG1hIik7CmRpZmYg LS1naXQgYS9kcml2ZXJzL2RtYS9pb3AtYWRtYS5oIGIvZHJpdmVycy9kbWEvaW9wLWFkbWEuaApk ZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0ZWFiYjZmNWViLi4wMDAwMDAwMDAwMDAK LS0tIGEvZHJpdmVycy9kbWEvaW9wLWFkbWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCww IEBACi0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCi0vKgotICog Q29weXJpZ2h0IMKpIDIwMDYsIEludGVsIENvcnBvcmF0aW9uLgotICovCi0jaWZuZGVmIF9BRE1B X0gKLSNkZWZpbmUgX0FETUFfSAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8 bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1pb3AzMnguaD4K LQotLyogTWVtb3J5IGNvcHkgdW5pdHMgKi8KLSNkZWZpbmUgRE1BX0NDUihjaGFuKQkJKGNoYW4t Pm1tcl9iYXNlICsgMHgwKQotI2RlZmluZSBETUFfQ1NSKGNoYW4pCQkoY2hhbi0+bW1yX2Jhc2Ug KyAweDQpCi0jZGVmaW5lIERNQV9EQVIoY2hhbikJCShjaGFuLT5tbXJfYmFzZSArIDB4YykKLSNk ZWZpbmUgRE1BX05EQVIoY2hhbikJCShjaGFuLT5tbXJfYmFzZSArIDB4MTApCi0jZGVmaW5lIERN QV9QQURSKGNoYW4pCQkoY2hhbi0+bW1yX2Jhc2UgKyAweDE0KQotI2RlZmluZSBETUFfUFVBRFIo Y2hhbikJKGNoYW4tPm1tcl9iYXNlICsgMHgxOCkKLSNkZWZpbmUgRE1BX0xBRFIoY2hhbikJCShj aGFuLT5tbXJfYmFzZSArIDB4MWMpCi0jZGVmaW5lIERNQV9CQ1IoY2hhbikJCShjaGFuLT5tbXJf YmFzZSArIDB4MjApCi0jZGVmaW5lIERNQV9EQ1IoY2hhbikJCShjaGFuLT5tbXJfYmFzZSArIDB4 MjQpCi0KLS8qIEFwcGxpY2F0aW9uIGFjY2VsZXJhdG9yIHVuaXQgICovCi0jZGVmaW5lIEFBVV9B Q1IoY2hhbikJCShjaGFuLT5tbXJfYmFzZSArIDB4MCkKLSNkZWZpbmUgQUFVX0FTUihjaGFuKQkJ KGNoYW4tPm1tcl9iYXNlICsgMHg0KQotI2RlZmluZSBBQVVfQURBUihjaGFuKQkJKGNoYW4tPm1t cl9iYXNlICsgMHg4KQotI2RlZmluZSBBQVVfQU5EQVIoY2hhbikJKGNoYW4tPm1tcl9iYXNlICsg MHhjKQotI2RlZmluZSBBQVVfU0FSKHNyYywgY2hhbikJKGNoYW4tPm1tcl9iYXNlICsgKDB4MTAg KyAoKHNyYykgPDwgMikpKQotI2RlZmluZSBBQVVfREFSKGNoYW4pCQkoY2hhbi0+bW1yX2Jhc2Ug KyAweDIwKQotI2RlZmluZSBBQVVfQUJDUihjaGFuKQkJKGNoYW4tPm1tcl9iYXNlICsgMHgyNCkK LSNkZWZpbmUgQUFVX0FEQ1IoY2hhbikJCShjaGFuLT5tbXJfYmFzZSArIDB4MjgpCi0jZGVmaW5l IEFBVV9TQVJfRURDUihzcmNfZWRjKQkoY2hhbi0+bW1yX2Jhc2UgKyAoMHgwMmMgKyAoKHNyY19l ZGMtNCkgPDwgMikpKQotI2RlZmluZSBBQVVfRURDUjBfSURYCTgKLSNkZWZpbmUgQUFVX0VEQ1Ix X0lEWAkxNwotI2RlZmluZSBBQVVfRURDUjJfSURYCTI2Ci0KLXN0cnVjdCBpb3AzeHhfYWF1X2Rl c2NfY3RybCB7Ci0JdW5zaWduZWQgaW50IGludF9lbjoxOwotCXVuc2lnbmVkIGludCBibGsxX2Nt ZF9jdHJsOjM7Ci0JdW5zaWduZWQgaW50IGJsazJfY21kX2N0cmw6MzsKLQl1bnNpZ25lZCBpbnQg YmxrM19jbWRfY3RybDozOwotCXVuc2lnbmVkIGludCBibGs0X2NtZF9jdHJsOjM7Ci0JdW5zaWdu ZWQgaW50IGJsazVfY21kX2N0cmw6MzsKLQl1bnNpZ25lZCBpbnQgYmxrNl9jbWRfY3RybDozOwot CXVuc2lnbmVkIGludCBibGs3X2NtZF9jdHJsOjM7Ci0JdW5zaWduZWQgaW50IGJsazhfY21kX2N0 cmw6MzsKLQl1bnNpZ25lZCBpbnQgYmxrX2N0cmw6MjsKLQl1bnNpZ25lZCBpbnQgZHVhbF94b3Jf ZW46MTsKLQl1bnNpZ25lZCBpbnQgdHhfY29tcGxldGU6MTsKLQl1bnNpZ25lZCBpbnQgemVyb19y ZXN1bHRfZXJyOjE7Ci0JdW5zaWduZWQgaW50IHplcm9fcmVzdWx0X2VuOjE7Ci0JdW5zaWduZWQg aW50IGRlc3Rfd3JpdGVfZW46MTsKLX07Ci0KLXN0cnVjdCBpb3AzeHhfYWF1X2VfZGVzY19jdHJs IHsKLQl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ6MTsKLQl1bnNpZ25lZCBpbnQgYmxrMV9jbWRfY3Ry bDozOwotCXVuc2lnbmVkIGludCBibGsyX2NtZF9jdHJsOjM7Ci0JdW5zaWduZWQgaW50IGJsazNf Y21kX2N0cmw6MzsKLQl1bnNpZ25lZCBpbnQgYmxrNF9jbWRfY3RybDozOwotCXVuc2lnbmVkIGlu dCBibGs1X2NtZF9jdHJsOjM7Ci0JdW5zaWduZWQgaW50IGJsazZfY21kX2N0cmw6MzsKLQl1bnNp Z25lZCBpbnQgYmxrN19jbWRfY3RybDozOwotCXVuc2lnbmVkIGludCBibGs4X2NtZF9jdHJsOjM7 Ci0JdW5zaWduZWQgaW50IHJlc2VydmVkMjo3OwotfTsKLQotc3RydWN0IGlvcDN4eF9kbWFfZGVz Y19jdHJsIHsKLQl1bnNpZ25lZCBpbnQgcGNpX3RyYW5zYWN0aW9uOjQ7Ci0JdW5zaWduZWQgaW50 IGludF9lbjoxOwotCXVuc2lnbmVkIGludCBkYWNfY3ljbGVfZW46MTsKLQl1bnNpZ25lZCBpbnQg bWVtX3RvX21lbV9lbjoxOwotCXVuc2lnbmVkIGludCBjcmNfZGF0YV90eF9lbjoxOwotCXVuc2ln bmVkIGludCBjcmNfZ2VuX2VuOjE7Ci0JdW5zaWduZWQgaW50IGNyY19zZWVkX2RpczoxOwotCXVu c2lnbmVkIGludCByZXNlcnZlZDoyMTsKLQl1bnNpZ25lZCBpbnQgY3JjX3R4X2NvbXBsZXRlOjE7 Ci19OwotCi1zdHJ1Y3QgaW9wM3h4X2Rlc2NfZG1hIHsKLQl1MzIgbmV4dF9kZXNjOwotCXVuaW9u IHsKLQkJdTMyIHBjaV9zcmNfYWRkcjsKLQkJdTMyIHBjaV9kZXN0X2FkZHI7Ci0JCXUzMiBzcmNf YWRkcjsKLQl9OwotCXVuaW9uIHsKLQkJdTMyIHVwcGVyX3BjaV9zcmNfYWRkcjsKLQkJdTMyIHVw cGVyX3BjaV9kZXN0X2FkZHI7Ci0JfTsKLQl1bmlvbiB7Ci0JCXUzMiBsb2NhbF9wY2lfc3JjX2Fk ZHI7Ci0JCXUzMiBsb2NhbF9wY2lfZGVzdF9hZGRyOwotCQl1MzIgZGVzdF9hZGRyOwotCX07Ci0J dTMyIGJ5dGVfY291bnQ7Ci0JdW5pb24gewotCQl1MzIgZGVzY19jdHJsOwotCQlzdHJ1Y3QgaW9w M3h4X2RtYV9kZXNjX2N0cmwgZGVzY19jdHJsX2ZpZWxkOwotCX07Ci0JdTMyIGNyY19hZGRyOwot fTsKLQotc3RydWN0IGlvcDN4eF9kZXNjX2FhdSB7Ci0JdTMyIG5leHRfZGVzYzsKLQl1MzIgc3Jj WzRdOwotCXUzMiBkZXN0X2FkZHI7Ci0JdTMyIGJ5dGVfY291bnQ7Ci0JdW5pb24gewotCQl1MzIg ZGVzY19jdHJsOwotCQlzdHJ1Y3QgaW9wM3h4X2FhdV9kZXNjX2N0cmwgZGVzY19jdHJsX2ZpZWxk OwotCX07Ci0JdW5pb24gewotCQl1MzIgc3JjX2FkZHI7Ci0JCXUzMiBlX2Rlc2NfY3RybDsKLQkJ c3RydWN0IGlvcDN4eF9hYXVfZV9kZXNjX2N0cmwgZV9kZXNjX2N0cmxfZmllbGQ7Ci0JfSBzcmNf ZWRjWzMxXTsKLX07Ci0KLXN0cnVjdCBpb3AzeHhfYWF1X2dmbXIgewotCXVuc2lnbmVkIGludCBn Zm1yMTo4OwotCXVuc2lnbmVkIGludCBnZm1yMjo4OwotCXVuc2lnbmVkIGludCBnZm1yMzo4Owot CXVuc2lnbmVkIGludCBnZm1yNDo4OwotfTsKLQotc3RydWN0IGlvcDN4eF9kZXNjX3BxX3hvciB7 Ci0JdTMyIG5leHRfZGVzYzsKLQl1MzIgc3JjWzNdOwotCXVuaW9uIHsKLQkJdTMyIGRhdGFfbXVs dDE7Ci0JCXN0cnVjdCBpb3AzeHhfYWF1X2dmbXIgZGF0YV9tdWx0MV9maWVsZDsKLQl9OwotCXUz MiBkZXN0X2FkZHI7Ci0JdTMyIGJ5dGVfY291bnQ7Ci0JdW5pb24gewotCQl1MzIgZGVzY19jdHJs OwotCQlzdHJ1Y3QgaW9wM3h4X2FhdV9kZXNjX2N0cmwgZGVzY19jdHJsX2ZpZWxkOwotCX07Ci0J dW5pb24gewotCQl1MzIgc3JjX2FkZHI7Ci0JCXUzMiBlX2Rlc2NfY3RybDsKLQkJc3RydWN0IGlv cDN4eF9hYXVfZV9kZXNjX2N0cmwgZV9kZXNjX2N0cmxfZmllbGQ7Ci0JCXUzMiBkYXRhX211bHRp cGxpZXI7Ci0JCXN0cnVjdCBpb3AzeHhfYWF1X2dmbXIgZGF0YV9tdWx0X2ZpZWxkOwotCQl1MzIg cmVzZXJ2ZWQ7Ci0JfSBzcmNfZWRjX2dmbXJbMTldOwotfTsKLQotc3RydWN0IGlvcDN4eF9kZXNj X2R1YWxfeG9yIHsKLQl1MzIgbmV4dF9kZXNjOwotCXUzMiBzcmMwX2FkZHI7Ci0JdTMyIHNyYzFf YWRkcjsKLQl1MzIgaF9zcmNfYWRkcjsKLQl1MzIgZF9zcmNfYWRkcjsKLQl1MzIgaF9kZXN0X2Fk ZHI7Ci0JdTMyIGJ5dGVfY291bnQ7Ci0JdW5pb24gewotCQl1MzIgZGVzY19jdHJsOwotCQlzdHJ1 Y3QgaW9wM3h4X2FhdV9kZXNjX2N0cmwgZGVzY19jdHJsX2ZpZWxkOwotCX07Ci0JdTMyIGRfZGVz dF9hZGRyOwotfTsKLQotdW5pb24gaW9wM3h4X2Rlc2MgewotCXN0cnVjdCBpb3AzeHhfZGVzY19h YXUgKmFhdTsKLQlzdHJ1Y3QgaW9wM3h4X2Rlc2NfZG1hICpkbWE7Ci0Jc3RydWN0IGlvcDN4eF9k ZXNjX3BxX3hvciAqcHFfeG9yOwotCXN0cnVjdCBpb3AzeHhfZGVzY19kdWFsX3hvciAqZHVhbF94 b3I7Ci0Jdm9pZCAqcHRyOwotfTsKLQotLyogTm8gc3VwcG9ydCBmb3IgcCtxIG9wZXJhdGlvbnMg Ki8KLXN0YXRpYyBpbmxpbmUgaW50Ci1pb3BfY2hhbl9wcV9zbG90X2NvdW50KHNpemVfdCBsZW4s IGludCBzcmNfY250LCBpbnQgKnNsb3RzX3Blcl9vcCkKLXsKLQlCVUcoKTsKLQlyZXR1cm4gMDsK LX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1pb3BfZGVzY19pbml0X3BxKHN0cnVjdCBpb3BfYWRt YV9kZXNjX3Nsb3QgKmRlc2MsIGludCBzcmNfY250LAotCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3Mp Ci17Ci0JQlVHKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotaW9wX2Rlc2Nfc2V0X3BxX2Fk ZHIoc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywgZG1hX2FkZHJfdCAqYWRkcikKLXsK LQlCVUcoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1pb3BfZGVzY19zZXRfcHFfc3JjX2Fk ZHIoc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywgaW50IHNyY19pZHgsCi0JCQkgZG1h X2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBjaGFyIGNvZWYpCi17Ci0JQlVHKCk7Ci19Ci0KLXN0YXRp YyBpbmxpbmUgaW50Ci1pb3BfY2hhbl9wcV96ZXJvX3N1bV9zbG90X2NvdW50KHNpemVfdCBsZW4s IGludCBzcmNfY250LCBpbnQgKnNsb3RzX3Blcl9vcCkKLXsKLQlCVUcoKTsKLQlyZXR1cm4gMDsK LX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1pb3BfZGVzY19pbml0X3BxX3plcm9fc3VtKHN0cnVj dCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRlc2MsIGludCBzcmNfY250LAotCQkJICB1bnNpZ25lZCBs b25nIGZsYWdzKQotewotCUJVRygpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWlvcF9kZXNj X3NldF9wcV96ZXJvX3N1bV9ieXRlX2NvdW50KHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRl c2MsIHUzMiBsZW4pCi17Ci0JQlVHKCk7Ci19Ci0KLSNkZWZpbmUgaW9wX2Rlc2Nfc2V0X3BxX3pl cm9fc3VtX3NyY19hZGRyIGlvcF9kZXNjX3NldF9wcV9zcmNfYWRkcgotCi1zdGF0aWMgaW5saW5l IHZvaWQKLWlvcF9kZXNjX3NldF9wcV96ZXJvX3N1bV9hZGRyKHN0cnVjdCBpb3BfYWRtYV9kZXNj X3Nsb3QgKmRlc2MsIGludCBwcV9pZHgsCi0JCQkgICAgICBkbWFfYWRkcl90ICpzcmMpCi17Ci0J QlVHKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlvcF9hZG1hX2dldF9tYXhfeG9yKHZvaWQp Ci17Ci0JcmV0dXJuIDMyOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpb3BfYWRtYV9nZXRfbWF4 X3BxKHZvaWQpCi17Ci0JQlVHKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMy IGlvcF9jaGFuX2dldF9jdXJyZW50X2Rlc2NyaXB0b3Ioc3RydWN0IGlvcF9hZG1hX2NoYW4gKmNo YW4pCi17Ci0JaW50IGlkID0gY2hhbi0+ZGV2aWNlLT5pZDsKLQotCXN3aXRjaCAoaWQpIHsKLQlj YXNlIERNQTBfSUQ6Ci0JY2FzZSBETUExX0lEOgotCQlyZXR1cm4gX19yYXdfcmVhZGwoRE1BX0RB UihjaGFuKSk7Ci0JY2FzZSBBQVVfSUQ6Ci0JCXJldHVybiBfX3Jhd19yZWFkbChBQVVfQURBUihj aGFuKSk7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMg aW5saW5lIHZvaWQgaW9wX2NoYW5fc2V0X25leHRfZGVzY3JpcHRvcihzdHJ1Y3QgaW9wX2FkbWFf Y2hhbiAqY2hhbiwKLQkJCQkJCXUzMiBuZXh0X2Rlc2NfYWRkcikKLXsKLQlpbnQgaWQgPSBjaGFu LT5kZXZpY2UtPmlkOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgRE1BMF9JRDoKLQljYXNlIERN QTFfSUQ6Ci0JCV9fcmF3X3dyaXRlbChuZXh0X2Rlc2NfYWRkciwgRE1BX05EQVIoY2hhbikpOwot CQlicmVhazsKLQljYXNlIEFBVV9JRDoKLQkJX19yYXdfd3JpdGVsKG5leHRfZGVzY19hZGRyLCBB QVVfQU5EQVIoY2hhbikpOwotCQlicmVhazsKLQl9Ci0KLX0KLQotI2RlZmluZSBJT1BfQURNQV9T VEFUVVNfQlVTWSAoMSA8PCAxMCkKLSNkZWZpbmUgSU9QX0FETUFfWkVST19TVU1fTUFYX0JZVEVf Q09VTlQgKDEwMjQpCi0jZGVmaW5lIElPUF9BRE1BX1hPUl9NQVhfQllURV9DT1VOVCAoMTYgKiAx MDI0ICogMTAyNCkKLSNkZWZpbmUgSU9QX0FETUFfTUFYX0JZVEVfQ09VTlQgKDE2ICogMTAyNCAq IDEwMjQpCi0KLXN0YXRpYyBpbmxpbmUgaW50IGlvcF9jaGFuX2lzX2J1c3koc3RydWN0IGlvcF9h ZG1hX2NoYW4gKmNoYW4pCi17Ci0JdTMyIHN0YXR1cyA9IF9fcmF3X3JlYWRsKERNQV9DU1IoY2hh bikpOwotCXJldHVybiAoc3RhdHVzICYgSU9QX0FETUFfU1RBVFVTX0JVU1kpID8gMSA6IDA7Ci19 Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlvcF9kZXNjX2lzX2FsaWduZWQoc3RydWN0IGlvcF9hZG1h X2Rlc2Nfc2xvdCAqZGVzYywKLQkJCQkJaW50IG51bV9zbG90cykKLXsKLQkvKiBudW1fc2xvdHMg d2lsbCBvbmx5IGV2ZXIgYmUgMSwgMiwgNCwgb3IgOCAqLwotCXJldHVybiAoZGVzYy0+aWR4ICYg KG51bV9zbG90cyAtIDEpKSA/IDAgOiAxOwotfQotCi0vKiB0byBkbzogc3VwcG9ydCBsYXJnZSAo aS5lLiA+IGh3IG1heCkgYnVmZmVyIHNpemVzICovCi1zdGF0aWMgaW5saW5lIGludCBpb3BfY2hh bl9tZW1jcHlfc2xvdF9jb3VudChzaXplX3QgbGVuLCBpbnQgKnNsb3RzX3Blcl9vcCkKLXsKLQkq c2xvdHNfcGVyX29wID0gMTsKLQlyZXR1cm4gMTsKLX0KLQotLyogdG8gZG86IHN1cHBvcnQgbGFy Z2UgKGkuZS4gPiBodyBtYXgpIGJ1ZmZlciBzaXplcyAqLwotc3RhdGljIGlubGluZSBpbnQgaW9w X2NoYW5fbWVtc2V0X3Nsb3RfY291bnQoc2l6ZV90IGxlbiwgaW50ICpzbG90c19wZXJfb3ApCi17 Ci0JKnNsb3RzX3Blcl9vcCA9IDE7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50 IGlvcDN4eF9hYXVfeG9yX3Nsb3RfY291bnQoc2l6ZV90IGxlbiwgaW50IHNyY19jbnQsCi0JCQkJ CWludCAqc2xvdHNfcGVyX29wKQotewotCXN0YXRpYyBjb25zdCBjaGFyIHNsb3RfY291bnRfdGFi bGVbXSA9IHsKLQkJCQkJCTEsIDEsIDEsIDEsIC8qIDAxIC0gMDQgKi8KLQkJCQkJCTIsIDIsIDIs IDIsIC8qIDA1IC0gMDggKi8KLQkJCQkJCTQsIDQsIDQsIDQsIC8qIDA5IC0gMTIgKi8KLQkJCQkJ CTQsIDQsIDQsIDQsIC8qIDEzIC0gMTYgKi8KLQkJCQkJCTgsIDgsIDgsIDgsIC8qIDE3IC0gMjAg Ki8KLQkJCQkJCTgsIDgsIDgsIDgsIC8qIDIxIC0gMjQgKi8KLQkJCQkJCTgsIDgsIDgsIDgsIC8q IDI1IC0gMjggKi8KLQkJCQkJCTgsIDgsIDgsIDgsIC8qIDI5IC0gMzIgKi8KLQkJCQkJICAgICAg fTsKLQkqc2xvdHNfcGVyX29wID0gc2xvdF9jb3VudF90YWJsZVtzcmNfY250IC0gMV07Ci0JcmV0 dXJuICpzbG90c19wZXJfb3A7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1pb3BfY2hhbl9pbnRl cnJ1cHRfc2xvdF9jb3VudChpbnQgKnNsb3RzX3Blcl9vcCwgc3RydWN0IGlvcF9hZG1hX2NoYW4g KmNoYW4pCi17Ci0Jc3dpdGNoIChjaGFuLT5kZXZpY2UtPmlkKSB7Ci0JY2FzZSBETUEwX0lEOgot CWNhc2UgRE1BMV9JRDoKLQkJcmV0dXJuIGlvcF9jaGFuX21lbWNweV9zbG90X2NvdW50KDAsIHNs b3RzX3Blcl9vcCk7Ci0JY2FzZSBBQVVfSUQ6Ci0JCXJldHVybiBpb3AzeHhfYWF1X3hvcl9zbG90 X2NvdW50KDAsIDIsIHNsb3RzX3Blcl9vcCk7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCXJl dHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpb3BfY2hhbl94b3Jfc2xvdF9jb3VudChz aXplX3QgbGVuLCBpbnQgc3JjX2NudCwKLQkJCQkJCWludCAqc2xvdHNfcGVyX29wKQotewotCWlu dCBzbG90X2NudCA9IGlvcDN4eF9hYXVfeG9yX3Nsb3RfY291bnQobGVuLCBzcmNfY250LCBzbG90 c19wZXJfb3ApOwotCi0JaWYgKGxlbiA8PSBJT1BfQURNQV9YT1JfTUFYX0JZVEVfQ09VTlQpCi0J CXJldHVybiBzbG90X2NudDsKLQotCWxlbiAtPSBJT1BfQURNQV9YT1JfTUFYX0JZVEVfQ09VTlQ7 Ci0Jd2hpbGUgKGxlbiA+IElPUF9BRE1BX1hPUl9NQVhfQllURV9DT1VOVCkgewotCQlsZW4gLT0g SU9QX0FETUFfWE9SX01BWF9CWVRFX0NPVU5UOwotCQlzbG90X2NudCArPSAqc2xvdHNfcGVyX29w OwotCX0KLQotCXNsb3RfY250ICs9ICpzbG90c19wZXJfb3A7Ci0KLQlyZXR1cm4gc2xvdF9jbnQ7 Ci19Ci0KLS8qIHplcm8gc3VtIG9uIGlvcDN4eCBpcyBsaW1pdGVkIHRvIDFrIGF0IGEgdGltZSBz byBpdCByZXF1aXJlcyBtdWx0aXBsZQotICogZGVzY3JpcHRvcnMKLSAqLwotc3RhdGljIGlubGlu ZSBpbnQgaW9wX2NoYW5femVyb19zdW1fc2xvdF9jb3VudChzaXplX3QgbGVuLCBpbnQgc3JjX2Nu dCwKLQkJCQkJCWludCAqc2xvdHNfcGVyX29wKQotewotCWludCBzbG90X2NudCA9IGlvcDN4eF9h YXVfeG9yX3Nsb3RfY291bnQobGVuLCBzcmNfY250LCBzbG90c19wZXJfb3ApOwotCi0JaWYgKGxl biA8PSBJT1BfQURNQV9aRVJPX1NVTV9NQVhfQllURV9DT1VOVCkKLQkJcmV0dXJuIHNsb3RfY250 OwotCi0JbGVuIC09IElPUF9BRE1BX1pFUk9fU1VNX01BWF9CWVRFX0NPVU5UOwotCXdoaWxlIChs ZW4gPiBJT1BfQURNQV9aRVJPX1NVTV9NQVhfQllURV9DT1VOVCkgewotCQlsZW4gLT0gSU9QX0FE TUFfWkVST19TVU1fTUFYX0JZVEVfQ09VTlQ7Ci0JCXNsb3RfY250ICs9ICpzbG90c19wZXJfb3A7 Ci0JfQotCi0Jc2xvdF9jbnQgKz0gKnNsb3RzX3Blcl9vcDsKLQotCXJldHVybiBzbG90X2NudDsK LX0KLQotc3RhdGljIGlubGluZSB1MzIgaW9wX2Rlc2NfZ2V0X2J5dGVfY291bnQoc3RydWN0IGlv cF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywKLQkJCQkJc3RydWN0IGlvcF9hZG1hX2NoYW4gKmNoYW4p Ci17Ci0JdW5pb24gaW9wM3h4X2Rlc2MgaHdfZGVzYyA9IHsgLnB0ciA9IGRlc2MtPmh3X2Rlc2Ms IH07Ci0KLQlzd2l0Y2ggKGNoYW4tPmRldmljZS0+aWQpIHsKLQljYXNlIERNQTBfSUQ6Ci0JY2Fz ZSBETUExX0lEOgotCQlyZXR1cm4gaHdfZGVzYy5kbWEtPmJ5dGVfY291bnQ7Ci0JY2FzZSBBQVVf SUQ6Ci0JCXJldHVybiBod19kZXNjLmFhdS0+Ynl0ZV9jb3VudDsKLQlkZWZhdWx0OgotCQlCVUco KTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIHRyYW5zbGF0ZSB0aGUgc3JjX2lkeCB0byBhIGRl c2NyaXB0b3Igd29yZCBpbmRleCAqLwotc3RhdGljIGlubGluZSBpbnQgX19kZXNjX2lkeChpbnQg c3JjX2lkeCkKLXsKLQlzdGF0aWMgY29uc3QgaW50IGRlc2NfaWR4X3RhYmxlW10gPSB7IDAsIDAs IDAsIDAsCi0JCQkJCSAgICAgIDAsIDEsIDIsIDMsCi0JCQkJCSAgICAgIDUsIDYsIDcsIDgsCi0J CQkJCSAgICAgIDksIDEwLCAxMSwgMTIsCi0JCQkJCSAgICAgIDE0LCAxNSwgMTYsIDE3LAotCQkJ CQkgICAgICAxOCwgMTksIDIwLCAyMSwKLQkJCQkJICAgICAgMjMsIDI0LCAyNSwgMjYsCi0JCQkJ CSAgICAgIDI3LCAyOCwgMjksIDMwLAotCQkJCQkgICAgfTsKLQotCXJldHVybiBkZXNjX2lkeF90 YWJsZVtzcmNfaWR4XTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgaW9wX2Rlc2NfZ2V0X3NyY19h ZGRyKHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRlc2MsCi0JCQkJCXN0cnVjdCBpb3BfYWRt YV9jaGFuICpjaGFuLAotCQkJCQlpbnQgc3JjX2lkeCkKLXsKLQl1bmlvbiBpb3AzeHhfZGVzYyBo d19kZXNjID0geyAucHRyID0gZGVzYy0+aHdfZGVzYywgfTsKLQotCXN3aXRjaCAoY2hhbi0+ZGV2 aWNlLT5pZCkgewotCWNhc2UgRE1BMF9JRDoKLQljYXNlIERNQTFfSUQ6Ci0JCXJldHVybiBod19k ZXNjLmRtYS0+c3JjX2FkZHI7Ci0JY2FzZSBBQVVfSUQ6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0J CUJVRygpOwotCX0KLQotCWlmIChzcmNfaWR4IDwgNCkKLQkJcmV0dXJuIGh3X2Rlc2MuYWF1LT5z cmNbc3JjX2lkeF07Ci0JZWxzZQotCQlyZXR1cm4gaHdfZGVzYy5hYXUtPnNyY19lZGNbX19kZXNj X2lkeChzcmNfaWR4KV0uc3JjX2FkZHI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpb3AzeHhf YWF1X2Rlc2Nfc2V0X3NyY19hZGRyKHN0cnVjdCBpb3AzeHhfZGVzY19hYXUgKmh3X2Rlc2MsCi0J CQkJCWludCBzcmNfaWR4LCBkbWFfYWRkcl90IGFkZHIpCi17Ci0JaWYgKHNyY19pZHggPCA0KQot CQlod19kZXNjLT5zcmNbc3JjX2lkeF0gPSBhZGRyOwotCWVsc2UKLQkJaHdfZGVzYy0+c3JjX2Vk Y1tfX2Rlc2NfaWR4KHNyY19pZHgpXS5zcmNfYWRkciA9IGFkZHI7Ci19Ci0KLXN0YXRpYyBpbmxp bmUgdm9pZAotaW9wX2Rlc2NfaW5pdF9tZW1jcHkoc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAq ZGVzYywgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlzdHJ1Y3QgaW9wM3h4X2Rlc2NfZG1hICpo d19kZXNjID0gZGVzYy0+aHdfZGVzYzsKLQl1bmlvbiB7Ci0JCXUzMiB2YWx1ZTsKLQkJc3RydWN0 IGlvcDN4eF9kbWFfZGVzY19jdHJsIGZpZWxkOwotCX0gdV9kZXNjX2N0cmw7Ci0KLQl1X2Rlc2Nf Y3RybC52YWx1ZSA9IDA7Ci0JdV9kZXNjX2N0cmwuZmllbGQubWVtX3RvX21lbV9lbiA9IDE7Ci0J dV9kZXNjX2N0cmwuZmllbGQucGNpX3RyYW5zYWN0aW9uID0gMHhlOyAvKiBtZW1vcnkgcmVhZCBi bG9jayAqLwotCXVfZGVzY19jdHJsLmZpZWxkLmludF9lbiA9IGZsYWdzICYgRE1BX1BSRVBfSU5U RVJSVVBUOwotCWh3X2Rlc2MtPmRlc2NfY3RybCA9IHVfZGVzY19jdHJsLnZhbHVlOwotCWh3X2Rl c2MtPnVwcGVyX3BjaV9zcmNfYWRkciA9IDA7Ci0JaHdfZGVzYy0+Y3JjX2FkZHIgPSAwOwotfQot Ci1zdGF0aWMgaW5saW5lIHZvaWQKLWlvcF9kZXNjX2luaXRfbWVtc2V0KHN0cnVjdCBpb3BfYWRt YV9kZXNjX3Nsb3QgKmRlc2MsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0Jc3RydWN0IGlvcDN4 eF9kZXNjX2FhdSAqaHdfZGVzYyA9IGRlc2MtPmh3X2Rlc2M7Ci0JdW5pb24gewotCQl1MzIgdmFs dWU7Ci0JCXN0cnVjdCBpb3AzeHhfYWF1X2Rlc2NfY3RybCBmaWVsZDsKLQl9IHVfZGVzY19jdHJs OwotCi0JdV9kZXNjX2N0cmwudmFsdWUgPSAwOwotCXVfZGVzY19jdHJsLmZpZWxkLmJsazFfY21k X2N0cmwgPSAweDI7IC8qIG1lbW9yeSBibG9jayBmaWxsICovCi0JdV9kZXNjX2N0cmwuZmllbGQu ZGVzdF93cml0ZV9lbiA9IDE7Ci0JdV9kZXNjX2N0cmwuZmllbGQuaW50X2VuID0gZmxhZ3MgJiBE TUFfUFJFUF9JTlRFUlJVUFQ7Ci0JaHdfZGVzYy0+ZGVzY19jdHJsID0gdV9kZXNjX2N0cmwudmFs dWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyCi1pb3AzeHhfZGVzY19pbml0X3hvcihzdHJ1Y3Qg aW9wM3h4X2Rlc2NfYWF1ICpod19kZXNjLCBpbnQgc3JjX2NudCwKLQkJICAgICB1bnNpZ25lZCBs b25nIGZsYWdzKQotewotCWludCBpLCBzaGlmdDsKLQl1MzIgZWRjcjsKLQl1bmlvbiB7Ci0JCXUz MiB2YWx1ZTsKLQkJc3RydWN0IGlvcDN4eF9hYXVfZGVzY19jdHJsIGZpZWxkOwotCX0gdV9kZXNj X2N0cmw7Ci0KLQl1X2Rlc2NfY3RybC52YWx1ZSA9IDA7Ci0Jc3dpdGNoIChzcmNfY250KSB7Ci0J Y2FzZSAyNSAuLi4gMzI6Ci0JCXVfZGVzY19jdHJsLmZpZWxkLmJsa19jdHJsID0gMHgzOyAvKiB1 c2UgRURDUlsyOjBdICovCi0JCWVkY3IgPSAwOwotCQlzaGlmdCA9IDE7Ci0JCWZvciAoaSA9IDI0 OyBpIDwgc3JjX2NudDsgaSsrKSB7Ci0JCQllZGNyIHw9ICgxIDw8IHNoaWZ0KTsKLQkJCXNoaWZ0 ICs9IDM7Ci0JCX0KLQkJaHdfZGVzYy0+c3JjX2VkY1tBQVVfRURDUjJfSURYXS5lX2Rlc2NfY3Ry bCA9IGVkY3I7Ci0JCXNyY19jbnQgPSAyNDsKLQkJZmFsbHRocm91Z2g7Ci0JY2FzZSAxNyAuLi4g MjQ6Ci0JCWlmICghdV9kZXNjX2N0cmwuZmllbGQuYmxrX2N0cmwpIHsKLQkJCWh3X2Rlc2MtPnNy Y19lZGNbQUFVX0VEQ1IyX0lEWF0uZV9kZXNjX2N0cmwgPSAwOwotCQkJdV9kZXNjX2N0cmwuZmll bGQuYmxrX2N0cmwgPSAweDM7IC8qIHVzZSBFRENSWzI6MF0gKi8KLQkJfQotCQllZGNyID0gMDsK LQkJc2hpZnQgPSAxOwotCQlmb3IgKGkgPSAxNjsgaSA8IHNyY19jbnQ7IGkrKykgewotCQkJZWRj ciB8PSAoMSA8PCBzaGlmdCk7Ci0JCQlzaGlmdCArPSAzOwotCQl9Ci0JCWh3X2Rlc2MtPnNyY19l ZGNbQUFVX0VEQ1IxX0lEWF0uZV9kZXNjX2N0cmwgPSBlZGNyOwotCQlzcmNfY250ID0gMTY7Ci0J CWZhbGx0aHJvdWdoOwotCWNhc2UgOSAuLi4gMTY6Ci0JCWlmICghdV9kZXNjX2N0cmwuZmllbGQu YmxrX2N0cmwpCi0JCQl1X2Rlc2NfY3RybC5maWVsZC5ibGtfY3RybCA9IDB4MjsgLyogdXNlIEVE Q1IwICovCi0JCWVkY3IgPSAwOwotCQlzaGlmdCA9IDE7Ci0JCWZvciAoaSA9IDg7IGkgPCBzcmNf Y250OyBpKyspIHsKLQkJCWVkY3IgfD0gKDEgPDwgc2hpZnQpOwotCQkJc2hpZnQgKz0gMzsKLQkJ fQotCQlod19kZXNjLT5zcmNfZWRjW0FBVV9FRENSMF9JRFhdLmVfZGVzY19jdHJsID0gZWRjcjsK LQkJc3JjX2NudCA9IDg7Ci0JCWZhbGx0aHJvdWdoOwotCWNhc2UgMiAuLi4gODoKLQkJc2hpZnQg PSAxOwotCQlmb3IgKGkgPSAwOyBpIDwgc3JjX2NudDsgaSsrKSB7Ci0JCQl1X2Rlc2NfY3RybC52 YWx1ZSB8PSAoMSA8PCBzaGlmdCk7Ci0JCQlzaGlmdCArPSAzOwotCQl9Ci0KLQkJaWYgKCF1X2Rl c2NfY3RybC5maWVsZC5ibGtfY3RybCAmJiBzcmNfY250ID4gNCkKLQkJCXVfZGVzY19jdHJsLmZp ZWxkLmJsa19jdHJsID0gMHgxOyAvKiB1c2UgbWluaS1kZXNjICovCi0JfQotCi0JdV9kZXNjX2N0 cmwuZmllbGQuZGVzdF93cml0ZV9lbiA9IDE7Ci0JdV9kZXNjX2N0cmwuZmllbGQuYmxrMV9jbWRf Y3RybCA9IDB4NzsgLyogZGlyZWN0IGZpbGwgKi8KLQl1X2Rlc2NfY3RybC5maWVsZC5pbnRfZW4g PSBmbGFncyAmIERNQV9QUkVQX0lOVEVSUlVQVDsKLQlod19kZXNjLT5kZXNjX2N0cmwgPSB1X2Rl c2NfY3RybC52YWx1ZTsKLQotCXJldHVybiB1X2Rlc2NfY3RybC52YWx1ZTsKLX0KLQotc3RhdGlj IGlubGluZSB2b2lkCi1pb3BfZGVzY19pbml0X3hvcihzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90 ICpkZXNjLCBpbnQgc3JjX2NudCwKLQkJICB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCWlvcDN4 eF9kZXNjX2luaXRfeG9yKGRlc2MtPmh3X2Rlc2MsIHNyY19jbnQsIGZsYWdzKTsKLX0KLQotLyog cmV0dXJuIHRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyAqLwotc3RhdGljIGlubGluZSBpbnQKLWlv cF9kZXNjX2luaXRfemVyb19zdW0oc3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywgaW50 IHNyY19jbnQsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCWludCBzbG90X2Nu dCA9IGRlc2MtPnNsb3RfY250LCBzbG90c19wZXJfb3AgPSBkZXNjLT5zbG90c19wZXJfb3A7Ci0J c3RydWN0IGlvcDN4eF9kZXNjX2FhdSAqaHdfZGVzYywgKnByZXZfaHdfZGVzYywgKml0ZXI7Ci0J dW5pb24gewotCQl1MzIgdmFsdWU7Ci0JCXN0cnVjdCBpb3AzeHhfYWF1X2Rlc2NfY3RybCBmaWVs ZDsKLQl9IHVfZGVzY19jdHJsOwotCWludCBpLCBqOwotCi0JaHdfZGVzYyA9IGRlc2MtPmh3X2Rl c2M7Ci0KLQlmb3IgKGkgPSAwLCBqID0gMDsgKHNsb3RfY250IC09IHNsb3RzX3Blcl9vcCkgPj0g MDsKLQkJaSArPSBzbG90c19wZXJfb3AsIGorKykgewotCQlpdGVyID0gaW9wX2h3X2Rlc2Nfc2xv dF9pZHgoaHdfZGVzYywgaSk7Ci0JCXVfZGVzY19jdHJsLnZhbHVlID0gaW9wM3h4X2Rlc2NfaW5p dF94b3IoaXRlciwgc3JjX2NudCwgZmxhZ3MpOwotCQl1X2Rlc2NfY3RybC5maWVsZC5kZXN0X3dy aXRlX2VuID0gMDsKLQkJdV9kZXNjX2N0cmwuZmllbGQuemVyb19yZXN1bHRfZW4gPSAxOwotCQl1 X2Rlc2NfY3RybC5maWVsZC5pbnRfZW4gPSBmbGFncyAmIERNQV9QUkVQX0lOVEVSUlVQVDsKLQkJ aXRlci0+ZGVzY19jdHJsID0gdV9kZXNjX2N0cmwudmFsdWU7Ci0KLQkJLyogZm9yIHRoZSBzdWJz ZXF1ZW50IGRlc2NyaXB0b3JzIHByZXNlcnZlIHRoZSBzdG9yZSBxdWV1ZQotCQkgKiBhbmQgY2hh aW4gdGhlbSB0b2dldGhlcgotCQkgKi8KLQkJaWYgKGkpIHsKLQkJCXByZXZfaHdfZGVzYyA9Ci0J CQkJaW9wX2h3X2Rlc2Nfc2xvdF9pZHgoaHdfZGVzYywgaSAtIHNsb3RzX3Blcl9vcCk7Ci0JCQlw cmV2X2h3X2Rlc2MtPm5leHRfZGVzYyA9Ci0JCQkJKHUzMikgKGRlc2MtPmFzeW5jX3R4LnBoeXMg KyAoaSA8PCA1KSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gajsKLX0KLQotc3RhdGljIGlubGluZSB2 b2lkCi1pb3BfZGVzY19pbml0X251bGxfeG9yKHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRl c2MsIGludCBzcmNfY250LAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlzdHJ1 Y3QgaW9wM3h4X2Rlc2NfYWF1ICpod19kZXNjID0gZGVzYy0+aHdfZGVzYzsKLQl1bmlvbiB7Ci0J CXUzMiB2YWx1ZTsKLQkJc3RydWN0IGlvcDN4eF9hYXVfZGVzY19jdHJsIGZpZWxkOwotCX0gdV9k ZXNjX2N0cmw7Ci0KLQl1X2Rlc2NfY3RybC52YWx1ZSA9IDA7Ci0Jc3dpdGNoIChzcmNfY250KSB7 Ci0JY2FzZSAyNSAuLi4gMzI6Ci0JCXVfZGVzY19jdHJsLmZpZWxkLmJsa19jdHJsID0gMHgzOyAv KiB1c2UgRURDUlsyOjBdICovCi0JCWh3X2Rlc2MtPnNyY19lZGNbQUFVX0VEQ1IyX0lEWF0uZV9k ZXNjX2N0cmwgPSAwOwotCQlmYWxsdGhyb3VnaDsKLQljYXNlIDE3IC4uLiAyNDoKLQkJaWYgKCF1 X2Rlc2NfY3RybC5maWVsZC5ibGtfY3RybCkgewotCQkJaHdfZGVzYy0+c3JjX2VkY1tBQVVfRURD UjJfSURYXS5lX2Rlc2NfY3RybCA9IDA7Ci0JCQl1X2Rlc2NfY3RybC5maWVsZC5ibGtfY3RybCA9 IDB4MzsgLyogdXNlIEVEQ1JbMjowXSAqLwotCQl9Ci0JCWh3X2Rlc2MtPnNyY19lZGNbQUFVX0VE Q1IxX0lEWF0uZV9kZXNjX2N0cmwgPSAwOwotCQlmYWxsdGhyb3VnaDsKLQljYXNlIDkgLi4uIDE2 OgotCQlpZiAoIXVfZGVzY19jdHJsLmZpZWxkLmJsa19jdHJsKQotCQkJdV9kZXNjX2N0cmwuZmll bGQuYmxrX2N0cmwgPSAweDI7IC8qIHVzZSBFRENSMCAqLwotCQlod19kZXNjLT5zcmNfZWRjW0FB VV9FRENSMF9JRFhdLmVfZGVzY19jdHJsID0gMDsKLQkJZmFsbHRocm91Z2g7Ci0JY2FzZSAxIC4u LiA4OgotCQlpZiAoIXVfZGVzY19jdHJsLmZpZWxkLmJsa19jdHJsICYmIHNyY19jbnQgPiA0KQot CQkJdV9kZXNjX2N0cmwuZmllbGQuYmxrX2N0cmwgPSAweDE7IC8qIHVzZSBtaW5pLWRlc2MgKi8K LQl9Ci0KLQl1X2Rlc2NfY3RybC5maWVsZC5kZXN0X3dyaXRlX2VuID0gMDsKLQl1X2Rlc2NfY3Ry bC5maWVsZC5pbnRfZW4gPSBmbGFncyAmIERNQV9QUkVQX0lOVEVSUlVQVDsKLQlod19kZXNjLT5k ZXNjX2N0cmwgPSB1X2Rlc2NfY3RybC52YWx1ZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGlv cF9kZXNjX3NldF9ieXRlX2NvdW50KHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRlc2MsCi0J CQkJCXN0cnVjdCBpb3BfYWRtYV9jaGFuICpjaGFuLAotCQkJCQl1MzIgYnl0ZV9jb3VudCkKLXsK LQl1bmlvbiBpb3AzeHhfZGVzYyBod19kZXNjID0geyAucHRyID0gZGVzYy0+aHdfZGVzYywgfTsK LQotCXN3aXRjaCAoY2hhbi0+ZGV2aWNlLT5pZCkgewotCWNhc2UgRE1BMF9JRDoKLQljYXNlIERN QTFfSUQ6Ci0JCWh3X2Rlc2MuZG1hLT5ieXRlX2NvdW50ID0gYnl0ZV9jb3VudDsKLQkJYnJlYWs7 Ci0JY2FzZSBBQVVfSUQ6Ci0JCWh3X2Rlc2MuYWF1LT5ieXRlX2NvdW50ID0gYnl0ZV9jb3VudDsK LQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZv aWQKLWlvcF9kZXNjX2luaXRfaW50ZXJydXB0KHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRl c2MsCi0JCQlzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqY2hhbikKLXsKLQl1bmlvbiBpb3AzeHhfZGVz YyBod19kZXNjID0geyAucHRyID0gZGVzYy0+aHdfZGVzYywgfTsKLQotCXN3aXRjaCAoY2hhbi0+ ZGV2aWNlLT5pZCkgewotCWNhc2UgRE1BMF9JRDoKLQljYXNlIERNQTFfSUQ6Ci0JCWlvcF9kZXNj X2luaXRfbWVtY3B5KGRlc2MsIDEpOwotCQlod19kZXNjLmRtYS0+Ynl0ZV9jb3VudCA9IDA7Ci0J CWh3X2Rlc2MuZG1hLT5kZXN0X2FkZHIgPSAwOwotCQlod19kZXNjLmRtYS0+c3JjX2FkZHIgPSAw OwotCQlicmVhazsKLQljYXNlIEFBVV9JRDoKLQkJaW9wX2Rlc2NfaW5pdF9udWxsX3hvcihkZXNj LCAyLCAxKTsKLQkJaHdfZGVzYy5hYXUtPmJ5dGVfY291bnQgPSAwOwotCQlod19kZXNjLmFhdS0+ ZGVzdF9hZGRyID0gMDsKLQkJaHdfZGVzYy5hYXUtPnNyY1swXSA9IDA7Ci0JCWh3X2Rlc2MuYWF1 LT5zcmNbMV0gPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci19Ci0KLXN0 YXRpYyBpbmxpbmUgdm9pZAotaW9wX2Rlc2Nfc2V0X3plcm9fc3VtX2J5dGVfY291bnQoc3RydWN0 IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYywgdTMyIGxlbikKLXsKLQlpbnQgc2xvdHNfcGVyX29w ID0gZGVzYy0+c2xvdHNfcGVyX29wOwotCXN0cnVjdCBpb3AzeHhfZGVzY19hYXUgKmh3X2Rlc2Mg PSBkZXNjLT5od19kZXNjLCAqaXRlcjsKLQlpbnQgaSA9IDA7Ci0KLQlpZiAobGVuIDw9IElPUF9B RE1BX1pFUk9fU1VNX01BWF9CWVRFX0NPVU5UKSB7Ci0JCWh3X2Rlc2MtPmJ5dGVfY291bnQgPSBs ZW47Ci0JfSBlbHNlIHsKLQkJZG8gewotCQkJaXRlciA9IGlvcF9od19kZXNjX3Nsb3RfaWR4KGh3 X2Rlc2MsIGkpOwotCQkJaXRlci0+Ynl0ZV9jb3VudCA9IElPUF9BRE1BX1pFUk9fU1VNX01BWF9C WVRFX0NPVU5UOwotCQkJbGVuIC09IElPUF9BRE1BX1pFUk9fU1VNX01BWF9CWVRFX0NPVU5UOwot CQkJaSArPSBzbG90c19wZXJfb3A7Ci0JCX0gd2hpbGUgKGxlbiA+IElPUF9BRE1BX1pFUk9fU1VN X01BWF9CWVRFX0NPVU5UKTsKLQotCQlpdGVyID0gaW9wX2h3X2Rlc2Nfc2xvdF9pZHgoaHdfZGVz YywgaSk7Ci0JCWl0ZXItPmJ5dGVfY291bnQgPSBsZW47Ci0JfQotfQotCi1zdGF0aWMgaW5saW5l IHZvaWQgaW9wX2Rlc2Nfc2V0X2Rlc3RfYWRkcihzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpk ZXNjLAotCQkJCQlzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqY2hhbiwKLQkJCQkJZG1hX2FkZHJfdCBh ZGRyKQotewotCXVuaW9uIGlvcDN4eF9kZXNjIGh3X2Rlc2MgPSB7IC5wdHIgPSBkZXNjLT5od19k ZXNjLCB9OwotCi0Jc3dpdGNoIChjaGFuLT5kZXZpY2UtPmlkKSB7Ci0JY2FzZSBETUEwX0lEOgot CWNhc2UgRE1BMV9JRDoKLQkJaHdfZGVzYy5kbWEtPmRlc3RfYWRkciA9IGFkZHI7Ci0JCWJyZWFr OwotCWNhc2UgQUFVX0lEOgotCQlod19kZXNjLmFhdS0+ZGVzdF9hZGRyID0gYWRkcjsKLQkJYnJl YWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaW9w X2Rlc2Nfc2V0X21lbWNweV9zcmNfYWRkcihzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpkZXNj LAotCQkJCQlkbWFfYWRkcl90IGFkZHIpCi17Ci0Jc3RydWN0IGlvcDN4eF9kZXNjX2RtYSAqaHdf ZGVzYyA9IGRlc2MtPmh3X2Rlc2M7Ci0JaHdfZGVzYy0+c3JjX2FkZHIgPSBhZGRyOwotfQotCi1z dGF0aWMgaW5saW5lIHZvaWQKLWlvcF9kZXNjX3NldF96ZXJvX3N1bV9zcmNfYWRkcihzdHJ1Y3Qg aW9wX2FkbWFfZGVzY19zbG90ICpkZXNjLCBpbnQgc3JjX2lkeCwKLQkJCQlkbWFfYWRkcl90IGFk ZHIpCi17Ci0KLQlzdHJ1Y3QgaW9wM3h4X2Rlc2NfYWF1ICpod19kZXNjID0gZGVzYy0+aHdfZGVz YywgKml0ZXI7Ci0JaW50IHNsb3RfY250ID0gZGVzYy0+c2xvdF9jbnQsIHNsb3RzX3Blcl9vcCA9 IGRlc2MtPnNsb3RzX3Blcl9vcDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IChzbG90X2NudCAt PSBzbG90c19wZXJfb3ApID49IDA7Ci0JCWkgKz0gc2xvdHNfcGVyX29wLCBhZGRyICs9IElPUF9B RE1BX1pFUk9fU1VNX01BWF9CWVRFX0NPVU5UKSB7Ci0JCWl0ZXIgPSBpb3BfaHdfZGVzY19zbG90 X2lkeChod19kZXNjLCBpKTsKLQkJaW9wM3h4X2FhdV9kZXNjX3NldF9zcmNfYWRkcihpdGVyLCBz cmNfaWR4LCBhZGRyKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpb3BfZGVzY19zZXRf eG9yX3NyY19hZGRyKHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRlc2MsCi0JCQkJCWludCBz cmNfaWR4LCBkbWFfYWRkcl90IGFkZHIpCi17Ci0KLQlzdHJ1Y3QgaW9wM3h4X2Rlc2NfYWF1ICpo d19kZXNjID0gZGVzYy0+aHdfZGVzYywgKml0ZXI7Ci0JaW50IHNsb3RfY250ID0gZGVzYy0+c2xv dF9jbnQsIHNsb3RzX3Blcl9vcCA9IGRlc2MtPnNsb3RzX3Blcl9vcDsKLQlpbnQgaTsKLQotCWZv ciAoaSA9IDA7IChzbG90X2NudCAtPSBzbG90c19wZXJfb3ApID49IDA7Ci0JCWkgKz0gc2xvdHNf cGVyX29wLCBhZGRyICs9IElPUF9BRE1BX1hPUl9NQVhfQllURV9DT1VOVCkgewotCQlpdGVyID0g aW9wX2h3X2Rlc2Nfc2xvdF9pZHgoaHdfZGVzYywgaSk7Ci0JCWlvcDN4eF9hYXVfZGVzY19zZXRf c3JjX2FkZHIoaXRlciwgc3JjX2lkeCwgYWRkcik7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZv aWQgaW9wX2Rlc2Nfc2V0X25leHRfZGVzYyhzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpkZXNj LAotCQkJCQl1MzIgbmV4dF9kZXNjX2FkZHIpCi17Ci0JLyogaHdfZGVzYy0+bmV4dF9kZXNjIGlz IHRoZSBzYW1lIGxvY2F0aW9uIGZvciBhbGwgY2hhbm5lbHMgKi8KLQl1bmlvbiBpb3AzeHhfZGVz YyBod19kZXNjID0geyAucHRyID0gZGVzYy0+aHdfZGVzYywgfTsKLQotCWlvcF9wYXJhbm9pYSho d19kZXNjLmRtYS0+bmV4dF9kZXNjKTsKLQlod19kZXNjLmRtYS0+bmV4dF9kZXNjID0gbmV4dF9k ZXNjX2FkZHI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGlvcF9kZXNjX2dldF9uZXh0X2Rlc2Mo c3RydWN0IGlvcF9hZG1hX2Rlc2Nfc2xvdCAqZGVzYykKLXsKLQkvKiBod19kZXNjLT5uZXh0X2Rl c2MgaXMgdGhlIHNhbWUgbG9jYXRpb24gZm9yIGFsbCBjaGFubmVscyAqLwotCXVuaW9uIGlvcDN4 eF9kZXNjIGh3X2Rlc2MgPSB7IC5wdHIgPSBkZXNjLT5od19kZXNjLCB9OwotCXJldHVybiBod19k ZXNjLmRtYS0+bmV4dF9kZXNjOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaW9wX2Rlc2NfY2xl YXJfbmV4dF9kZXNjKHN0cnVjdCBpb3BfYWRtYV9kZXNjX3Nsb3QgKmRlc2MpCi17Ci0JLyogaHdf ZGVzYy0+bmV4dF9kZXNjIGlzIHRoZSBzYW1lIGxvY2F0aW9uIGZvciBhbGwgY2hhbm5lbHMgKi8K LQl1bmlvbiBpb3AzeHhfZGVzYyBod19kZXNjID0geyAucHRyID0gZGVzYy0+aHdfZGVzYywgfTsK LQlod19kZXNjLmRtYS0+bmV4dF9kZXNjID0gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGlv cF9kZXNjX3NldF9ibG9ja19maWxsX3ZhbChzdHJ1Y3QgaW9wX2FkbWFfZGVzY19zbG90ICpkZXNj LAotCQkJCQkJdTMyIHZhbCkKLXsKLQlzdHJ1Y3QgaW9wM3h4X2Rlc2NfYWF1ICpod19kZXNjID0g ZGVzYy0+aHdfZGVzYzsKLQlod19kZXNjLT5zcmNbMF0gPSB2YWw7Ci19Ci0KLXN0YXRpYyBpbmxp bmUgZW51bSBzdW1fY2hlY2tfZmxhZ3MKLWlvcF9kZXNjX2dldF96ZXJvX3Jlc3VsdChzdHJ1Y3Qg aW9wX2FkbWFfZGVzY19zbG90ICpkZXNjKQotewotCXN0cnVjdCBpb3AzeHhfZGVzY19hYXUgKmh3 X2Rlc2MgPSBkZXNjLT5od19kZXNjOwotCXN0cnVjdCBpb3AzeHhfYWF1X2Rlc2NfY3RybCBkZXNj X2N0cmwgPSBod19kZXNjLT5kZXNjX2N0cmxfZmllbGQ7Ci0KLQlpb3BfcGFyYW5vaWEoIShkZXNj X2N0cmwudHhfY29tcGxldGUgJiYgZGVzY19jdHJsLnplcm9fcmVzdWx0X2VuKSk7Ci0JcmV0dXJu IGRlc2NfY3RybC56ZXJvX3Jlc3VsdF9lcnIgPDwgU1VNX0NIRUNLX1A7Ci19Ci0KLXN0YXRpYyBp bmxpbmUgdm9pZCBpb3BfY2hhbl9hcHBlbmQoc3RydWN0IGlvcF9hZG1hX2NoYW4gKmNoYW4pCi17 Ci0JdTMyIGRtYV9jaGFuX2N0cmw7Ci0KLQlkbWFfY2hhbl9jdHJsID0gX19yYXdfcmVhZGwoRE1B X0NDUihjaGFuKSk7Ci0JZG1hX2NoYW5fY3RybCB8PSAweDI7Ci0JX19yYXdfd3JpdGVsKGRtYV9j aGFuX2N0cmwsIERNQV9DQ1IoY2hhbikpOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBpb3BfY2hh bl9nZXRfc3RhdHVzKHN0cnVjdCBpb3BfYWRtYV9jaGFuICpjaGFuKQotewotCXJldHVybiBfX3Jh d19yZWFkbChETUFfQ1NSKGNoYW4pKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGlvcF9jaGFu X2Rpc2FibGUoc3RydWN0IGlvcF9hZG1hX2NoYW4gKmNoYW4pCi17Ci0JdTMyIGRtYV9jaGFuX2N0 cmwgPSBfX3Jhd19yZWFkbChETUFfQ0NSKGNoYW4pKTsKLQlkbWFfY2hhbl9jdHJsICY9IH4xOwot CV9fcmF3X3dyaXRlbChkbWFfY2hhbl9jdHJsLCBETUFfQ0NSKGNoYW4pKTsKLX0KLQotc3RhdGlj IGlubGluZSB2b2lkIGlvcF9jaGFuX2VuYWJsZShzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqY2hhbikK LXsKLQl1MzIgZG1hX2NoYW5fY3RybCA9IF9fcmF3X3JlYWRsKERNQV9DQ1IoY2hhbikpOwotCi0J ZG1hX2NoYW5fY3RybCB8PSAxOwotCV9fcmF3X3dyaXRlbChkbWFfY2hhbl9jdHJsLCBETUFfQ0NS KGNoYW4pKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGlvcF9hZG1hX2RldmljZV9jbGVhcl9l b3Rfc3RhdHVzKHN0cnVjdCBpb3BfYWRtYV9jaGFuICpjaGFuKQotewotCXUzMiBzdGF0dXMgPSBf X3Jhd19yZWFkbChETUFfQ1NSKGNoYW4pKTsKLQlzdGF0dXMgJj0gKDEgPDwgOSk7Ci0JX19yYXdf d3JpdGVsKHN0YXR1cywgRE1BX0NTUihjaGFuKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBp b3BfYWRtYV9kZXZpY2VfY2xlYXJfZW9jX3N0YXR1cyhzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqY2hh bikKLXsKLQl1MzIgc3RhdHVzID0gX19yYXdfcmVhZGwoRE1BX0NTUihjaGFuKSk7Ci0Jc3RhdHVz ICY9ICgxIDw8IDgpOwotCV9fcmF3X3dyaXRlbChzdGF0dXMsIERNQV9DU1IoY2hhbikpOwotfQot Ci1zdGF0aWMgaW5saW5lIHZvaWQgaW9wX2FkbWFfZGV2aWNlX2NsZWFyX2Vycl9zdGF0dXMoc3Ry dWN0IGlvcF9hZG1hX2NoYW4gKmNoYW4pCi17Ci0JdTMyIHN0YXR1cyA9IF9fcmF3X3JlYWRsKERN QV9DU1IoY2hhbikpOwotCi0Jc3dpdGNoIChjaGFuLT5kZXZpY2UtPmlkKSB7Ci0JY2FzZSBETUEw X0lEOgotCWNhc2UgRE1BMV9JRDoKLQkJc3RhdHVzICY9ICgxIDw8IDUpIHwgKDEgPDwgMykgfCAo MSA8PCAyKSB8ICgxIDw8IDEpOwotCQlicmVhazsKLQljYXNlIEFBVV9JRDoKLQkJc3RhdHVzICY9 ICgxIDw8IDUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0KLQlfX3Jhd193 cml0ZWwoc3RhdHVzLCBETUFfQ1NSKGNoYW4pKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWlv cF9pc19lcnJfaW50X3Bhcml0eSh1bnNpZ25lZCBsb25nIHN0YXR1cywgc3RydWN0IGlvcF9hZG1h X2NoYW4gKmNoYW4pCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1pb3Bf aXNfZXJyX21jdV9hYm9ydCh1bnNpZ25lZCBsb25nIHN0YXR1cywgc3RydWN0IGlvcF9hZG1hX2No YW4gKmNoYW4pCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1pb3BfaXNf ZXJyX2ludF90YWJvcnQodW5zaWduZWQgbG9uZyBzdGF0dXMsIHN0cnVjdCBpb3BfYWRtYV9jaGFu ICpjaGFuKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotaW9wX2lzX2Vy cl9pbnRfbWFib3J0KHVuc2lnbmVkIGxvbmcgc3RhdHVzLCBzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAq Y2hhbikKLXsKLQlyZXR1cm4gdGVzdF9iaXQoNSwgJnN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbmxp bmUgaW50Ci1pb3BfaXNfZXJyX3BjaV90YWJvcnQodW5zaWduZWQgbG9uZyBzdGF0dXMsIHN0cnVj dCBpb3BfYWRtYV9jaGFuICpjaGFuKQotewotCXN3aXRjaCAoY2hhbi0+ZGV2aWNlLT5pZCkgewot CWNhc2UgRE1BMF9JRDoKLQljYXNlIERNQTFfSUQ6Ci0JCXJldHVybiB0ZXN0X2JpdCgyLCAmc3Rh dHVzKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50 Ci1pb3BfaXNfZXJyX3BjaV9tYWJvcnQodW5zaWduZWQgbG9uZyBzdGF0dXMsIHN0cnVjdCBpb3Bf YWRtYV9jaGFuICpjaGFuKQotewotCXN3aXRjaCAoY2hhbi0+ZGV2aWNlLT5pZCkgewotCWNhc2Ug RE1BMF9JRDoKLQljYXNlIERNQTFfSUQ6Ci0JCXJldHVybiB0ZXN0X2JpdCgzLCAmc3RhdHVzKTsK LQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1pb3Bf aXNfZXJyX3NwbGl0X3R4KHVuc2lnbmVkIGxvbmcgc3RhdHVzLCBzdHJ1Y3QgaW9wX2FkbWFfY2hh biAqY2hhbikKLXsKLQlzd2l0Y2ggKGNoYW4tPmRldmljZS0+aWQpIHsKLQljYXNlIERNQTBfSUQ6 Ci0JY2FzZSBETUExX0lEOgotCQlyZXR1cm4gdGVzdF9iaXQoMSwgJnN0YXR1cyk7Ci0JZGVmYXVs dDoKLQkJcmV0dXJuIDA7Ci0JfQotfQotI2VuZGlmIC8qIF9BRE1BX0ggKi8KLS0gCjIuMjkuMgoK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFy bS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9y ZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1r ZXJuZWwK