From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D0A0BC2D0C0 for ; Mon, 23 Dec 2019 11:08:52 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 52578206B7 for ; Mon, 23 Dec 2019 11:08:52 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="sOn/88uN"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=ti.com header.i=@ti.com header.b="jDjFK6kg" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 52578206B7 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=ti.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=sfwkqBc726RloR4eBgxNSdrd/DeQ5fLhtJNsIBnSyxc=; b=sOn/88uNqSJunP vn2PoT346Anc6cqtzvcdEJCf/vmxkMN1bOnIm/dFexkoHfqLjDsHeDwekJpWt9x1zWa4iTDgAT/9j 6Ai1KYYnk3pKHbrthE0nF1OHevi0xakcVYNKJq96IyR9zZViuV7N08gEm5h+f+4PEte2bVyAx+Dvs +wki0VxjtqdUjRTBH8ovnC4ynGzWmvve59xff3lrrC7lxOttTV2NFM6/n0HsGeIb5nzo2AtiqJ8PR nl4R67PoTtgAFtIPKglhxb+35cKMuq6jm+azQ8XQt+dj6HqfKw9GgcxKJBBZuXDD7XJImycAyFKZT /xw04vJH1oNu225JLYDA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ijLZz-0004kj-DA; Mon, 23 Dec 2019 11:08:51 +0000 Received: from lelv0142.ext.ti.com ([198.47.23.249]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ijLWm-0002FC-MA for linux-arm-kernel@lists.infradead.org; Mon, 23 Dec 2019 11:05:44 +0000 Received: from lelv0265.itg.ti.com ([10.180.67.224]) by lelv0142.ext.ti.com (8.15.2/8.15.2) with ESMTP id xBNB5Pbk110615; Mon, 23 Dec 2019 05:05:25 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1577099125; bh=ORhVFdAR4VufFCDPhquIes+MleuQsimE0l6uo6vn4cg=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=jDjFK6kgLGjEVQXfEeaNa4bJcj4ZW0F5ouW9IPYBHXSTEkuCdjbrjrDB7fB7Y22H6 b0qdaPkZHKbUMzDXrB5tVD5wMZrTQ/pdv6o9FauC/wxy0+usG3OIS+Khb0u8Zy1jkO uVMfMDErwKKD+2+JK3CgC8WDjc1rclLxAcMJNlOk= Received: from DFLE105.ent.ti.com (dfle105.ent.ti.com [10.64.6.26]) by lelv0265.itg.ti.com (8.15.2/8.15.2) with ESMTPS id xBNB5PlB041009 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 23 Dec 2019 05:05:25 -0600 Received: from DFLE103.ent.ti.com (10.64.6.24) by DFLE105.ent.ti.com (10.64.6.26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1847.3; Mon, 23 Dec 2019 05:05:23 -0600 Received: from lelv0327.itg.ti.com (10.180.67.183) by DFLE103.ent.ti.com (10.64.6.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1847.3 via Frontend Transport; Mon, 23 Dec 2019 05:05:23 -0600 Received: from feketebors.ti.com (ileax41-snat.itg.ti.com [10.172.224.153]) by lelv0327.itg.ti.com (8.15.2/8.15.2) with ESMTP id xBNB4eMH025693; Mon, 23 Dec 2019 05:05:20 -0600 From: Peter Ujfalusi To: , , , Subject: [PATCH v8 10/18] dmaengine: ti: New driver for K3 UDMA Date: Mon, 23 Dec 2019 13:04:50 +0200 Message-ID: <20191223110458.30766-11-peter.ujfalusi@ti.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20191223110458.30766-1-peter.ujfalusi@ti.com> References: <20191223110458.30766-1-peter.ujfalusi@ti.com> MIME-Version: 1.0 X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191223_030534_002643_C69D428C X-CRM114-Status: GOOD ( 21.67 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, grygorii.strashko@ti.com, vigneshr@ti.com, lokeshvutla@ti.com, j-keerthy@ti.com, linux-kernel@vger.kernel.org, t-kristo@ti.com, tony@atomide.com, dmaengine@vger.kernel.org, dan.j.williams@intel.com, frowand.list@gmail.com, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org U3BsaXQgcGF0Y2ggZm9yIHJldmlldyBjb250YWluaW5nOiBkZWZpbmVzLCBzdHJ1Y3RzLCBpbyBh bmQgbG93IGxldmVsCmZ1bmN0aW9ucyBhbmQgaW50ZXJydXB0IGNhbGxiYWNrcy4KCkRNQSBkcml2 ZXIgZm9yClRleGFzIEluc3RydW1lbnRzIEszIE5BVlNTIFVuaWZpZWQgRE1BIOKAkyBQZXJpcGhl cmFsIFJvb3QgQ29tcGxleCAoVURNQS1QKQoKVGhlIFVETUEtUCBpcyBpbnRlbmRlZCB0byBwZXJm b3JtIHNpbWlsYXIgKGJ1dCBzaWduaWZpY2FudGx5IHVwZ3JhZGVkKSBmdW5jdGlvbnMKYXMgdGhl IHBhY2tldC1vcmllbnRlZCBETUEgdXNlZCBvbiBwcmV2aW91cyBTb0MgZGV2aWNlcy4gVGhlIFVE TUEtUCBtb2R1bGUKc3VwcG9ydHMgdGhlIHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uIG9mIHZh cmlvdXMgcGFja2V0IHR5cGVzLiBUaGUgVURNQS1QIGlzCmFyY2hpdGVjdGVkIHRvIGZhY2lsaXRh dGUgdGhlIHNlZ21lbnRhdGlvbiBhbmQgcmVhc3NlbWJseSBvZiBTb0MgRE1BIGRhdGEKc3RydWN0 dXJlIGNvbXBsaWFudCBwYWNrZXRzIHRvL2Zyb20gc21hbGxlciBkYXRhIGJsb2NrcyB0aGF0IGFy ZSBuYXRpdmVseQpjb21wYXRpYmxlIHdpdGggdGhlIHNwZWNpZmljIHJlcXVpcmVtZW50cyBvZiBl YWNoIGNvbm5lY3RlZCBwZXJpcGhlcmFsLiBNdWx0aXBsZQpUeCBhbmQgUnggY2hhbm5lbHMgYXJl IHByb3ZpZGVkIHdpdGhpbiB0aGUgRE1BIHdoaWNoIGFsbG93IG11bHRpcGxlIHNlZ21lbnRhdGlv bgpvciByZWFzc2VtYmx5IG9wZXJhdGlvbnMgdG8gYmUgb25nb2luZy4gVGhlIERNQSBjb250cm9s bGVyIG1haW50YWlucyBzdGF0ZQppbmZvcm1hdGlvbiBmb3IgZWFjaCBvZiB0aGUgY2hhbm5lbHMg d2hpY2ggYWxsb3dzIHBhY2tldCBzZWdtZW50YXRpb24gYW5kCnJlYXNzZW1ibHkgb3BlcmF0aW9u cyB0byBiZSB0aW1lIGRpdmlzaW9uIG11bHRpcGxleGVkIGJldHdlZW4gY2hhbm5lbHMgaW4gb3Jk ZXIKdG8gc2hhcmUgdGhlIHVuZGVybHlpbmcgRE1BIGhhcmR3YXJlLiBBbiBleHRlcm5hbCBETUEg c2NoZWR1bGVyIGlzIHVzZWQgdG8KY29udHJvbCB0aGUgb3JkZXJpbmcgYW5kIHJhdGUgYXQgd2hp Y2ggdGhpcyBtdWx0aXBsZXhpbmcgb2NjdXJzIGZvciBUcmFuc21pdApvcGVyYXRpb25zLiBUaGUg b3JkZXJpbmcgYW5kIHJhdGUgb2YgUmVjZWl2ZSBvcGVyYXRpb25zIGlzIGluZGlyZWN0bHkgY29u dHJvbGxlZApieSB0aGUgb3JkZXIgaW4gd2hpY2ggYmxvY2tzIGFyZSBwdXNoZWQgaW50byB0aGUg RE1BIG9uIHRoZSBSeCBQU0ktTCBpbnRlcmZhY2UuCgpUaGUgVURNQS1QIGFsc28gc3VwcG9ydHMg YWN0aW5nIGFzIGJvdGggYSBVVEMgYW5kIFVETUEtQyBmb3IgaXRzIGludGVybmFsCmNoYW5uZWxz LiBDaGFubmVscyBpbiB0aGUgVURNQS1QIGNhbiBiZSBjb25maWd1cmVkIHRvIGJlIGVpdGhlciBQ YWNrZXQtQmFzZWQgb3IKVGhpcmQtUGFydHkgY2hhbm5lbHMgb24gYSBjaGFubmVsIGJ5IGNoYW5u ZWwgYmFzaXMuCgpUaGUgaW5pdGlhbCBkcml2ZXIgc3VwcG9ydHM6Ci0gTUVNX1RPX01FTSAoVFIg bW9kZSkKLSBERVZfVE9fTUVNIChQYWNrZXQgLyBUUiBtb2RlKQotIE1FTV9UT19ERVYgKFBhY2tl dCAvIFRSIG1vZGUpCi0gQ3ljbGljIChQYWNrZXQgLyBUUiBtb2RlKQotIE1ldGFkYXRhIGZvciBk ZXNjcmlwdG9ycwoKU2lnbmVkLW9mZi1ieTogUGV0ZXIgVWpmYWx1c2kgPHBldGVyLnVqZmFsdXNp QHRpLmNvbT4KVGVzdGVkLWJ5OiBLZWVydGh5IDxqLWtlZXJ0aHlAdGkuY29tPgpSZXZpZXdlZC1i eTogR3J5Z29yaWkgU3RyYXNoa28gPGdyeWdvcmlpLnN0cmFzaGtvQHRpLmNvbT4KLS0tCiBkcml2 ZXJzL2RtYS90aS9LY29uZmlnICAgfCAgIDEzICsKIGRyaXZlcnMvZG1hL3RpL01ha2VmaWxlICB8 ICAgIDEgKwogZHJpdmVycy9kbWEvdGkvazMtdWRtYS5jIHwgMzM3MSArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVycy9kbWEvdGkvazMtdWRtYS5oIHwgIDEyMCAr KwogNCBmaWxlcyBjaGFuZ2VkLCAzNTA1IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL2RtYS90aS9rMy11ZG1hLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Rt YS90aS9rMy11ZG1hLmgKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS90aS9LY29uZmlnIGIvZHJp dmVycy9kbWEvdGkvS2NvbmZpZwppbmRleCA3MmYzZDI3MjgxNzguLmNjYTY3MDhiZDc3YyAxMDA2 NDQKLS0tIGEvZHJpdmVycy9kbWEvdGkvS2NvbmZpZworKysgYi9kcml2ZXJzL2RtYS90aS9LY29u ZmlnCkBAIC0zNCw2ICszNCwxOSBAQCBjb25maWcgRE1BX09NQVAKIAkgIEVuYWJsZSBzdXBwb3J0 IGZvciB0aGUgVEkgc0RNQSAoU3lzdGVtIERNQSBvciBETUE0KSBjb250cm9sbGVyLiBUaGlzCiAJ ICBETUEgZW5naW5lIGlzIGZvdW5kIG9uIE9NQVAgYW5kIERSQTd4eCBwYXJ0cy4KIAorY29uZmln IFRJX0szX1VETUEKKwlib29sICJUZXhhcyBJbnN0cnVtZW50cyBVRE1BIHN1cHBvcnQiCisJZGVw ZW5kcyBvbiBBUkNIX0szIHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gVElfU0NJX1BST1RP Q09MCisJZGVwZW5kcyBvbiBUSV9TQ0lfSU5UQV9JUlFDSElQCisJc2VsZWN0IERNQV9FTkdJTkUK KwlzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hBTk5FTFMKKwlzZWxlY3QgVElfSzNfUklOR0FDQworCXNl bGVjdCBUSV9LM19QU0lMCisgICAgICAgIGhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUg VEkgVURNQSAoVW5pZmllZCBETUEpIGNvbnRyb2xsZXIuIFRoaXMKKwkgIERNQSBlbmdpbmUgaXMg dXNlZCBpbiBBTTY1eCBhbmQgajcyMWUuCisKIGNvbmZpZyBUSV9LM19QU0lMCiAJYm9vbAogCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2RtYS90aS9NYWtlZmlsZSBiL2RyaXZlcnMvZG1hL3RpL01ha2Vm aWxlCmluZGV4IGY4ZDkxMmFkN2VhZi4uOWQ3ODdmMDA5MTk1IDEwMDY0NAotLS0gYS9kcml2ZXJz L2RtYS90aS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2RtYS90aS9NYWtlZmlsZQpAQCAtMiw1ICsy LDYgQEAKIG9iai0kKENPTkZJR19USV9DUFBJNDEpICs9IGNwcGk0MS5vCiBvYmotJChDT05GSUdf VElfRURNQSkgKz0gZWRtYS5vCiBvYmotJChDT05GSUdfRE1BX09NQVApICs9IG9tYXAtZG1hLm8K K29iai0kKENPTkZJR19USV9LM19VRE1BKSArPSBrMy11ZG1hLm8KIG9iai0kKENPTkZJR19USV9L M19QU0lMKSArPSBrMy1wc2lsLm8gazMtcHNpbC1hbTY1NC5vIGszLXBzaWwtajcyMWUubwogb2Jq LSQoQ09ORklHX1RJX0RNQV9DUk9TU0JBUikgKz0gZG1hLWNyb3NzYmFyLm8KZGlmZiAtLWdpdCBh L2RyaXZlcnMvZG1hL3RpL2szLXVkbWEuYyBiL2RyaXZlcnMvZG1hL3RpL2szLXVkbWEuYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjE0ZjhmOGM3NWQzYQotLS0gL2Rl di9udWxsCisrKyBiL2RyaXZlcnMvZG1hL3RpL2szLXVkbWEuYwpAQCAtMCwwICsxLDMzNzEgQEAK Ky8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogIENvcHlyaWdodCAo QykgMjAxOSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNv bQorICogIEF1dGhvcjogUGV0ZXIgVWpmYWx1c2kgPHBldGVyLnVqZmFsdXNpQHRpLmNvbT4KKyAq LworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5l Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFw b29sLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgor I2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNp bmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+ CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2lu Y2x1ZGUgPGxpbnV4L29mX2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2lu Y2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2lu Y2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2MvdGkvazMtcmlu Z2FjYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvYy90aS90aV9zY2lfcHJvdG9jb2wuaD4KKyNpbmNs dWRlIDxsaW51eC9zb2MvdGkvdGlfc2NpX2ludGFfbXNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1h L3RpLWNwcGk1Lmg+CisKKyNpbmNsdWRlICIuLi92aXJ0LWRtYS5oIgorI2luY2x1ZGUgImszLXVk bWEuaCIKKyNpbmNsdWRlICJrMy1wc2lsLXByaXYuaCIKKworc3RydWN0IHVkbWFfc3RhdGljX3Ry IHsKKwl1OCBlbHNpemU7IC8qIFJQU1RSMCAqLworCXUxNiBlbGNudDsgLyogUlBTVFIwICovCisJ dTE2IGJzdGNudDsgLyogUlBTVFIxICovCit9OworCisjZGVmaW5lIEszX1VETUFfTUFYX1JGTE9X UwkJMTAyNAorI2RlZmluZSBLM19VRE1BX0RFRkFVTFRfUklOR19TSVpFCTE2CisKKy8qIEhvdyBT UkMvRFNUIHRhZyBzaG91bGQgYmUgdXBkYXRlZCBieSBVRE1BIGluIHRoZSBkZXNjcmlwdG9yJ3Mg V29yZCAzICovCisjZGVmaW5lIFVETUFfUkZMT1dfU1JDVEFHX05PTkUJCTAKKyNkZWZpbmUgVURN QV9SRkxPV19TUkNUQUdfQ0ZHX1RBRwkxCisjZGVmaW5lIFVETUFfUkZMT1dfU1JDVEFHX0ZMT1df SUQJMgorI2RlZmluZSBVRE1BX1JGTE9XX1NSQ1RBR19TUkNfVEFHCTQKKworI2RlZmluZSBVRE1B X1JGTE9XX0RTVFRBR19OT05FCQkwCisjZGVmaW5lIFVETUFfUkZMT1dfRFNUVEFHX0NGR19UQUcJ MQorI2RlZmluZSBVRE1BX1JGTE9XX0RTVFRBR19GTE9XX0lECTIKKyNkZWZpbmUgVURNQV9SRkxP V19EU1RUQUdfRFNUX1RBR19MTwk0CisjZGVmaW5lIFVETUFfUkZMT1dfRFNUVEFHX0RTVF9UQUdf SEkJNQorCitzdHJ1Y3QgdWRtYV9jaGFuOworCitlbnVtIHVkbWFfbW1yIHsKKwlNTVJfR0NGRyA9 IDAsCisJTU1SX1JDSEFOUlQsCisJTU1SX1RDSEFOUlQsCisJTU1SX0xBU1QsCit9OworCitzdGF0 aWMgY29uc3QgY2hhciAqIGNvbnN0IG1tcl9uYW1lc1tdID0geyAiZ2NmZyIsICJyY2hhbnJ0Iiwg InRjaGFucnQiIH07CisKK3N0cnVjdCB1ZG1hX3RjaGFuIHsKKwl2b2lkIF9faW9tZW0gKnJlZ19y dDsKKworCWludCBpZDsKKwlzdHJ1Y3QgazNfcmluZyAqdF9yaW5nOyAvKiBUcmFuc21pdCByaW5n ICovCisJc3RydWN0IGszX3JpbmcgKnRjX3Jpbmc7IC8qIFRyYW5zbWl0IENvbXBsZXRpb24gcmlu ZyAqLworfTsKKworc3RydWN0IHVkbWFfcmZsb3cgeworCWludCBpZDsKKwlzdHJ1Y3QgazNfcmlu ZyAqZmRfcmluZzsgLyogRnJlZSBEZXNjcmlwdG9yIHJpbmcgKi8KKwlzdHJ1Y3QgazNfcmluZyAq cl9yaW5nOyAvKiBSZWNlaXZlIHJpbmcgKi8KK307CisKK3N0cnVjdCB1ZG1hX3JjaGFuIHsKKwl2 b2lkIF9faW9tZW0gKnJlZ19ydDsKKworCWludCBpZDsKK307CisKKyNkZWZpbmUgVURNQV9GTEFH X1BETUFfQUNDMzIJCUJJVCgwKQorI2RlZmluZSBVRE1BX0ZMQUdfUERNQV9CVVJTVAkJQklUKDEp CisKK3N0cnVjdCB1ZG1hX21hdGNoX2RhdGEgeworCXUzMiBwc2lsX2Jhc2U7CisJYm9vbCBlbmFi bGVfbWVtY3B5X3N1cHBvcnQ7CisJdTMyIGZsYWdzOworCXUzMiBzdGF0aWN0cl96X21hc2s7CisJ dTMyIHJjaGFuX29lc19vZmZzZXQ7CisKKwl1OCB0cGxfbGV2ZWxzOworCXUzMiBsZXZlbF9zdGFy dF9pZHhbXTsKK307CisKK3N0cnVjdCB1ZG1hX2RldiB7CisJc3RydWN0IGRtYV9kZXZpY2UgZGRl djsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdm9pZCBfX2lvbWVtICptbXJzW01NUl9MQVNUXTsK Kwljb25zdCBzdHJ1Y3QgdWRtYV9tYXRjaF9kYXRhICptYXRjaF9kYXRhOworCisJc2l6ZV90IGRl c2NfYWxpZ247IC8qIGFsaWdubWVudCB0byB1c2UgZm9yIGRlc2NyaXB0b3JzICovCisKKwlzdHJ1 Y3QgdWRtYV90aXNjaV9ybSB0aXNjaV9ybTsKKworCXN0cnVjdCBrM19yaW5nYWNjICpyaW5nYWNj OworCisJc3RydWN0IHdvcmtfc3RydWN0IHB1cmdlX3dvcms7CisJc3RydWN0IGxpc3RfaGVhZCBk ZXNjX3RvX3B1cmdlOworCXNwaW5sb2NrX3QgbG9jazsKKworCWludCB0Y2hhbl9jbnQ7CisJaW50 IGVjaGFuX2NudDsKKwlpbnQgcmNoYW5fY250OworCWludCByZmxvd19jbnQ7CisJdW5zaWduZWQg bG9uZyAqdGNoYW5fbWFwOworCXVuc2lnbmVkIGxvbmcgKnJjaGFuX21hcDsKKwl1bnNpZ25lZCBs b25nICpyZmxvd19ncF9tYXA7CisJdW5zaWduZWQgbG9uZyAqcmZsb3dfZ3BfbWFwX2FsbG9jYXRl ZDsKKwl1bnNpZ25lZCBsb25nICpyZmxvd19pbl91c2U7CisKKwlzdHJ1Y3QgdWRtYV90Y2hhbiAq dGNoYW5zOworCXN0cnVjdCB1ZG1hX3JjaGFuICpyY2hhbnM7CisJc3RydWN0IHVkbWFfcmZsb3cg KnJmbG93czsKKworCXN0cnVjdCB1ZG1hX2NoYW4gKmNoYW5uZWxzOworCXUzMiBwc2lsX2Jhc2U7 Cit9OworCitzdHJ1Y3QgdWRtYV9od2Rlc2MgeworCXNpemVfdCBjcHBpNV9kZXNjX3NpemU7CisJ dm9pZCAqY3BwaTVfZGVzY192YWRkcjsKKwlkbWFfYWRkcl90IGNwcGk1X2Rlc2NfcGFkZHI7CisK KwkvKiBUUiBkZXNjcmlwdG9yIGludGVybmFsIHBvaW50ZXJzICovCisJdm9pZCAqdHJfcmVxX2Jh c2U7CisJc3RydWN0IGNwcGk1X3RyX3Jlc3BfdCAqdHJfcmVzcF9iYXNlOworfTsKKworc3RydWN0 IHVkbWFfZGVzYyB7CisJc3RydWN0IHZpcnRfZG1hX2Rlc2MgdmQ7CisKKwlib29sIHRlcm1pbmF0 ZWQ7CisKKwllbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyOworCisJc3RydWN0IHVkbWFf c3RhdGljX3RyIHN0YXRpY190cjsKKwl1MzIgcmVzaWR1ZTsKKworCXVuc2lnbmVkIGludCBzZ2xl bjsKKwl1bnNpZ25lZCBpbnQgZGVzY19pZHg7IC8qIE9ubHkgdXNlZCBmb3IgY3ljbGljIGluIHBh Y2tldCBtb2RlICovCisJdW5zaWduZWQgaW50IHRyX2lkeDsKKworCXUzMiBtZXRhZGF0YV9zaXpl OworCXZvaWQgKm1ldGFkYXRhOyAvKiBwb2ludGVyIHRvIHByb3ZpZGVkIG1ldGFkYXRhIGJ1ZmZl ciAoRVBJUCwgUFNkYXRhKSAqLworCisJdW5zaWduZWQgaW50IGh3ZGVzY19jb3VudDsKKwlzdHJ1 Y3QgdWRtYV9od2Rlc2MgaHdkZXNjWzBdOworfTsKKworZW51bSB1ZG1hX2NoYW5fc3RhdGUgewor CVVETUFfQ0hBTl9JU19JRExFID0gMCwgLyogbm90IGFjdGl2ZSwgbm8gdGVhcmRvd24gaXMgaW4g cHJvZ3Jlc3MgKi8KKwlVRE1BX0NIQU5fSVNfQUNUSVZFLCAvKiBOb3JtYWwgb3BlcmF0aW9uICov CisJVURNQV9DSEFOX0lTX1RFUk1JTkFUSU5HLCAvKiBjaGFubmVsIGlzIGJlaW5nIHRlcm1pbmF0 ZWQgKi8KK307CisKK3N0cnVjdCB1ZG1hX3R4X2RyYWluIHsKKwlzdHJ1Y3QgZGVsYXllZF93b3Jr IHdvcms7CisJdW5zaWduZWQgbG9uZyBqaWZmaWU7CisJdTMyIHJlc2lkdWU7Cit9OworCitzdHJ1 Y3QgdWRtYV9jaGFuX2NvbmZpZyB7CisJYm9vbCBwa3RfbW9kZTsgLyogVFIgb3IgcGFja2V0ICov CisJYm9vbCBuZWVkc19lcGliOyAvKiBFUElCIGlzIG5lZWRlZCBmb3IgdGhlIGNvbW11bmljYXRp b24gb3Igbm90ICovCisJdTMyIHBzZF9zaXplOyAvKiBzaXplIG9mIFByb3RvY29sIFNwZWNpZmlj IERhdGEgKi8KKwl1MzIgbWV0YWRhdGFfc2l6ZTsgLyogKG5lZWRzX2VwaWIgPyAxNjowKSArIHBz ZF9zaXplICovCisJdTMyIGhkZXNjX3NpemU7IC8qIFNpemUgb2YgYSBwYWNrZXQgZGVzY3JpcHRv ciBpbiBwYWNrZXQgbW9kZSAqLworCWJvb2wgbm90ZHBrdDsgLyogU3VwcHJlc3Mgc2VuZGluZyBU REMgcGFja2V0ICovCisJaW50IHJlbW90ZV90aHJlYWRfaWQ7CisJdTMyIHNyY190aHJlYWQ7CisJ dTMyIGRzdF90aHJlYWQ7CisJZW51bSBwc2lsX2VuZHBvaW50X3R5cGUgZXBfdHlwZTsKKwlib29s IGVuYWJsZV9hY2MzMjsKKwlib29sIGVuYWJsZV9idXJzdDsKKwllbnVtIHVkbWFfdHBfbGV2ZWwg Y2hhbm5lbF90cGw7IC8qIENoYW5uZWwgVGhyb3VnaHB1dCBMZXZlbCAqLworCisJZW51bSBkbWFf dHJhbnNmZXJfZGlyZWN0aW9uIGRpcjsKK307CisKK3N0cnVjdCB1ZG1hX2NoYW4geworCXN0cnVj dCB2aXJ0X2RtYV9jaGFuIHZjOworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnCWNmZzsKKwlzdHJ1 Y3QgdWRtYV9kZXYgKnVkOworCXN0cnVjdCB1ZG1hX2Rlc2MgKmRlc2M7CisJc3RydWN0IHVkbWFf ZGVzYyAqdGVybWluYXRlZF9kZXNjOworCXN0cnVjdCB1ZG1hX3N0YXRpY190ciBzdGF0aWNfdHI7 CisJY2hhciAqbmFtZTsKKworCXN0cnVjdCB1ZG1hX3RjaGFuICp0Y2hhbjsKKwlzdHJ1Y3QgdWRt YV9yY2hhbiAqcmNoYW47CisJc3RydWN0IHVkbWFfcmZsb3cgKnJmbG93OworCisJYm9vbCBwc2ls X3BhaXJlZDsKKworCWludCBpcnFfbnVtX3Jpbmc7CisJaW50IGlycV9udW1fdWRtYTsKKworCWJv b2wgY3ljbGljOworCWJvb2wgcGF1c2VkOworCisJZW51bSB1ZG1hX2NoYW5fc3RhdGUgc3RhdGU7 CisJc3RydWN0IGNvbXBsZXRpb24gdGVhcmRvd25fY29tcGxldGVkOworCisJc3RydWN0IHVkbWFf dHhfZHJhaW4gdHhfZHJhaW47CisKKwl1MzIgYmNudDsgLyogbnVtYmVyIG9mIGJ5dGVzIGNvbXBs ZXRlZCBzaW5jZSB0aGUgc3RhcnQgb2YgdGhlIGNoYW5uZWwgKi8KKwl1MzIgaW5fcmluZ19jbnQ7 IC8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBmbGlnaHQgKi8KKworCS8qIENoYW5uZWwgY29u ZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisJc3RydWN0IHVkbWFfY2hhbl9jb25maWcgY29uZmln OworCisJLyogZG1hcG9vbCBmb3IgcGFja2V0IG1vZGUgZGVzY3JpcHRvcnMgKi8KKwlib29sIHVz ZV9kbWFfcG9vbDsKKwlzdHJ1Y3QgZG1hX3Bvb2wgKmhkZXNjX3Bvb2w7CisKKwl1MzIgaWQ7Cit9 OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1ZG1hX2RldiAqdG9fdWRtYV9kZXYoc3RydWN0IGRt YV9kZXZpY2UgKmQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgdWRtYV9kZXYs IGRkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1ZG1hX2NoYW4gKnRvX3VkbWFfY2hh bihzdHJ1Y3QgZG1hX2NoYW4gKmMpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjLCBzdHJ1Y3Qg dWRtYV9jaGFuLCB2Yy5jaGFuKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdWRtYV9kZXNj ICp0b191ZG1hX2Rlc2Moc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0KQoreworCXJl dHVybiBjb250YWluZXJfb2YodCwgc3RydWN0IHVkbWFfZGVzYywgdmQudHgpOworfQorCisvKiBH ZW5lcmljIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHVk bWFfcmVhZCh2b2lkIF9faW9tZW0gKmJhc2UsIGludCByZWcpCit7CisJcmV0dXJuIHJlYWRsKGJh c2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWRtYV93cml0ZSh2b2lkIF9faW9t ZW0gKmJhc2UsIGludCByZWcsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgYmFzZSArIHJlZyk7 Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1ZG1hX3VwZGF0ZV9iaXRzKHZvaWQgX19pb21lbSAq YmFzZSwgaW50IHJlZywKKwkJCQkgICAgdTMyIG1hc2ssIHUzMiB2YWwpCit7CisJdTMyIHRtcCwg b3JpZzsKKworCW9yaWcgPSByZWFkbChiYXNlICsgcmVnKTsKKwl0bXAgPSBvcmlnICYgfm1hc2s7 CisJdG1wIHw9ICh2YWwgJiBtYXNrKTsKKworCWlmICh0bXAgIT0gb3JpZykKKwkJd3JpdGVsKHRt cCwgYmFzZSArIHJlZyk7Cit9CisKKy8qIFRDSEFOUlQgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHVk bWFfdGNoYW5ydF9yZWFkKHN0cnVjdCB1ZG1hX3RjaGFuICp0Y2hhbiwgaW50IHJlZykKK3sKKwlp ZiAoIXRjaGFuKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gdWRtYV9yZWFkKHRjaGFuLT5yZWdfcnQs IHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1ZG1hX3RjaGFucnRfd3JpdGUoc3RydWN0 IHVkbWFfdGNoYW4gKnRjaGFuLCBpbnQgcmVnLAorCQkJCSAgICAgIHUzMiB2YWwpCit7CisJaWYg KCF0Y2hhbikKKwkJcmV0dXJuOworCXVkbWFfd3JpdGUodGNoYW4tPnJlZ19ydCwgcmVnLCB2YWwp OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWRtYV90Y2hhbnJ0X3VwZGF0ZV9iaXRzKHN0cnVj dCB1ZG1hX3RjaGFuICp0Y2hhbiwgaW50IHJlZywKKwkJCQkJICAgIHUzMiBtYXNrLCB1MzIgdmFs KQoreworCWlmICghdGNoYW4pCisJCXJldHVybjsKKwl1ZG1hX3VwZGF0ZV9iaXRzKHRjaGFuLT5y ZWdfcnQsIHJlZywgbWFzaywgdmFsKTsKK30KKworLyogUkNIQU5SVCAqLworc3RhdGljIGlubGlu ZSB1MzIgdWRtYV9yY2hhbnJ0X3JlYWQoc3RydWN0IHVkbWFfcmNoYW4gKnJjaGFuLCBpbnQgcmVn KQoreworCWlmICghcmNoYW4pCisJCXJldHVybiAwOworCXJldHVybiB1ZG1hX3JlYWQocmNoYW4t PnJlZ19ydCwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVkbWFfcmNoYW5ydF93cml0 ZShzdHJ1Y3QgdWRtYV9yY2hhbiAqcmNoYW4sIGludCByZWcsCisJCQkJICAgICAgdTMyIHZhbCkK K3sKKwlpZiAoIXJjaGFuKQorCQlyZXR1cm47CisJdWRtYV93cml0ZShyY2hhbi0+cmVnX3J0LCBy ZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1ZG1hX3JjaGFucnRfdXBkYXRlX2Jp dHMoc3RydWN0IHVkbWFfcmNoYW4gKnJjaGFuLCBpbnQgcmVnLAorCQkJCQkgICAgdTMyIG1hc2ss IHUzMiB2YWwpCit7CisJaWYgKCFyY2hhbikKKwkJcmV0dXJuOworCXVkbWFfdXBkYXRlX2JpdHMo cmNoYW4tPnJlZ19ydCwgcmVnLCBtYXNrLCB2YWwpOworfQorCitzdGF0aWMgaW50IG5hdnNzX3Bz aWxfcGFpcihzdHJ1Y3QgdWRtYV9kZXYgKnVkLCB1MzIgc3JjX3RocmVhZCwgdTMyIGRzdF90aHJl YWQpCit7CisJc3RydWN0IHVkbWFfdGlzY2lfcm0gKnRpc2NpX3JtID0gJnVkLT50aXNjaV9ybTsK KworCWRzdF90aHJlYWQgfD0gSzNfUFNJTF9EU1RfVEhSRUFEX0lEX09GRlNFVDsKKwlyZXR1cm4g dGlzY2lfcm0tPnRpc2NpX3BzaWxfb3BzLT5wYWlyKHRpc2NpX3JtLT50aXNjaSwKKwkJCQkJICAg ICAgdGlzY2lfcm0tPnRpc2NpX25hdnNzX2Rldl9pZCwKKwkJCQkJICAgICAgc3JjX3RocmVhZCwg ZHN0X3RocmVhZCk7Cit9CisKK3N0YXRpYyBpbnQgbmF2c3NfcHNpbF91bnBhaXIoc3RydWN0IHVk bWFfZGV2ICp1ZCwgdTMyIHNyY190aHJlYWQsCisJCQkgICAgIHUzMiBkc3RfdGhyZWFkKQorewor CXN0cnVjdCB1ZG1hX3Rpc2NpX3JtICp0aXNjaV9ybSA9ICZ1ZC0+dGlzY2lfcm07CisKKwlkc3Rf dGhyZWFkIHw9IEszX1BTSUxfRFNUX1RIUkVBRF9JRF9PRkZTRVQ7CisJcmV0dXJuIHRpc2NpX3Jt LT50aXNjaV9wc2lsX29wcy0+dW5wYWlyKHRpc2NpX3JtLT50aXNjaSwKKwkJCQkJCXRpc2NpX3Jt LT50aXNjaV9uYXZzc19kZXZfaWQsCisJCQkJCQlzcmNfdGhyZWFkLCBkc3RfdGhyZWFkKTsKK30K Kworc3RhdGljIHZvaWQgdWRtYV9yZXNldF91Y2hhbihzdHJ1Y3QgdWRtYV9jaGFuICp1YykKK3sK KwltZW1zZXQoJnVjLT5jb25maWcsIDAsIHNpemVvZih1Yy0+Y29uZmlnKSk7CisJdWMtPmNvbmZp Zy5yZW1vdGVfdGhyZWFkX2lkID0gLTE7CisJdWMtPnN0YXRlID0gVURNQV9DSEFOX0lTX0lETEU7 Cit9CisKK3N0YXRpYyB2b2lkIHVkbWFfZHVtcF9jaGFuX3N0ZGF0YShzdHJ1Y3QgdWRtYV9jaGFu ICp1YykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB1Yy0+dWQtPmRldjsKKwl1MzIgb2Zmc2V0 OworCWludCBpOworCisJaWYgKHVjLT5jb25maWcuZGlyID09IERNQV9NRU1fVE9fREVWIHx8IHVj LT5jb25maWcuZGlyID09IERNQV9NRU1fVE9fTUVNKSB7CisJCWRldl9kYmcoZGV2LCAiVENIQU4g U3RhdGUgZGF0YTpcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJb2Zmc2V0 ID0gVURNQV9UQ0hBTl9SVF9TVERBVEFfUkVHICsgaSAqIDQ7CisJCQlkZXZfZGJnKGRldiwgIlRS VF9TVERBVEFbJTAyZF06IDB4JTA4eFxuIiwgaSwKKwkJCQl1ZG1hX3RjaGFucnRfcmVhZCh1Yy0+ dGNoYW4sIG9mZnNldCkpOworCQl9CisJfQorCisJaWYgKHVjLT5jb25maWcuZGlyID09IERNQV9E RVZfVE9fTUVNIHx8IHVjLT5jb25maWcuZGlyID09IERNQV9NRU1fVE9fTUVNKSB7CisJCWRldl9k YmcoZGV2LCAiUkNIQU4gU3RhdGUgZGF0YTpcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkr KykgeworCQkJb2Zmc2V0ID0gVURNQV9SQ0hBTl9SVF9TVERBVEFfUkVHICsgaSAqIDQ7CisJCQlk ZXZfZGJnKGRldiwgIlJSVF9TVERBVEFbJTAyZF06IDB4JTA4eFxuIiwgaSwKKwkJCQl1ZG1hX3Jj aGFucnRfcmVhZCh1Yy0+cmNoYW4sIG9mZnNldCkpOworCQl9CisJfQorfQorCitzdGF0aWMgaW5s aW5lIGRtYV9hZGRyX3QgdWRtYV9jdXJyX2NwcGk1X2Rlc2NfcGFkZHIoc3RydWN0IHVkbWFfZGVz YyAqZCwKKwkJCQkJCSAgICBpbnQgaWR4KQoreworCXJldHVybiBkLT5od2Rlc2NbaWR4XS5jcHBp NV9kZXNjX3BhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnVkbWFfY3Vycl9jcHBpNV9k ZXNjX3ZhZGRyKHN0cnVjdCB1ZG1hX2Rlc2MgKmQsIGludCBpZHgpCit7CisJcmV0dXJuIGQtPmh3 ZGVzY1tpZHhdLmNwcGk1X2Rlc2NfdmFkZHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWRtYV9kZXNj ICp1ZG1hX3VkbWFfZGVzY19mcm9tX3BhZGRyKHN0cnVjdCB1ZG1hX2NoYW4gKnVjLAorCQkJCQkJ ICAgZG1hX2FkZHJfdCBwYWRkcikKK3sKKwlzdHJ1Y3QgdWRtYV9kZXNjICpkID0gdWMtPnRlcm1p bmF0ZWRfZGVzYzsKKworCWlmIChkKSB7CisJCWRtYV9hZGRyX3QgZGVzY19wYWRkciA9IHVkbWFf Y3Vycl9jcHBpNV9kZXNjX3BhZGRyKGQsCisJCQkJCQkJCSAgIGQtPmRlc2NfaWR4KTsKKworCQlp ZiAoZGVzY19wYWRkciAhPSBwYWRkcikKKwkJCWQgPSBOVUxMOworCX0KKworCWlmICghZCkgewor CQlkID0gdWMtPmRlc2M7CisJCWlmIChkKSB7CisJCQlkbWFfYWRkcl90IGRlc2NfcGFkZHIgPSB1 ZG1hX2N1cnJfY3BwaTVfZGVzY19wYWRkcihkLAorCQkJCQkJCQlkLT5kZXNjX2lkeCk7CisKKwkJ CWlmIChkZXNjX3BhZGRyICE9IHBhZGRyKQorCQkJCWQgPSBOVUxMOworCQl9CisJfQorCisJcmV0 dXJuIGQ7Cit9CisKK3N0YXRpYyB2b2lkIHVkbWFfZnJlZV9od2Rlc2Moc3RydWN0IHVkbWFfY2hh biAqdWMsIHN0cnVjdCB1ZG1hX2Rlc2MgKmQpCit7CisJaWYgKHVjLT51c2VfZG1hX3Bvb2wpIHsK KwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IGQtPmh3ZGVzY19jb3VudDsgaSsrKSB7CisJ CQlpZiAoIWQtPmh3ZGVzY1tpXS5jcHBpNV9kZXNjX3ZhZGRyKQorCQkJCWNvbnRpbnVlOworCisJ CQlkbWFfcG9vbF9mcmVlKHVjLT5oZGVzY19wb29sLAorCQkJCSAgICAgIGQtPmh3ZGVzY1tpXS5j cHBpNV9kZXNjX3ZhZGRyLAorCQkJCSAgICAgIGQtPmh3ZGVzY1tpXS5jcHBpNV9kZXNjX3BhZGRy KTsKKworCQkJZC0+aHdkZXNjW2ldLmNwcGk1X2Rlc2NfdmFkZHIgPSBOVUxMOworCQl9CisJfSBl bHNlIGlmIChkLT5od2Rlc2NbMF0uY3BwaTVfZGVzY192YWRkcikgeworCQlzdHJ1Y3QgdWRtYV9k ZXYgKnVkID0gdWMtPnVkOworCisJCWRtYV9mcmVlX2NvaGVyZW50KHVkLT5kZXYsIGQtPmh3ZGVz Y1swXS5jcHBpNV9kZXNjX3NpemUsCisJCQkJICBkLT5od2Rlc2NbMF0uY3BwaTVfZGVzY192YWRk ciwKKwkJCQkgIGQtPmh3ZGVzY1swXS5jcHBpNV9kZXNjX3BhZGRyKTsKKworCQlkLT5od2Rlc2Nb MF0uY3BwaTVfZGVzY192YWRkciA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCB1ZG1hX3B1 cmdlX2Rlc2Nfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHVkbWFf ZGV2ICp1ZCA9IGNvbnRhaW5lcl9vZih3b3JrLCB0eXBlb2YoKnVkKSwgcHVyZ2Vfd29yayk7CisJ c3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkLCAqX3ZkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJ TElTVF9IRUFEKGhlYWQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkLT5sb2NrLCBmbGFncyk7 CisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ1ZC0+ZGVzY190b19wdXJnZSwgJmhlYWQpOworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkLT5sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNo X2VudHJ5X3NhZmUodmQsIF92ZCwgJmhlYWQsIG5vZGUpIHsKKwkJc3RydWN0IHVkbWFfY2hhbiAq dWMgPSB0b191ZG1hX2NoYW4odmQtPnR4LmNoYW4pOworCQlzdHJ1Y3QgdWRtYV9kZXNjICpkID0g dG9fdWRtYV9kZXNjKCZ2ZC0+dHgpOworCisJCXVkbWFfZnJlZV9od2Rlc2ModWMsIGQpOworCQls aXN0X2RlbCgmdmQtPm5vZGUpOworCQlrZnJlZShkKTsKKwl9CisKKwkvKiBJZiBtb3JlIHRvIHB1 cmdlLCBzY2hlZHVsZSB0aGUgd29yayBhZ2FpbiAqLworCWlmICghbGlzdF9lbXB0eSgmdWQtPmRl c2NfdG9fcHVyZ2UpKQorCQlzY2hlZHVsZV93b3JrKCZ1ZC0+cHVyZ2Vfd29yayk7Cit9CisKK3N0 YXRpYyB2b2lkIHVkbWFfZGVzY19mcmVlKHN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCkKK3sKKwlz dHJ1Y3QgdWRtYV9kZXYgKnVkID0gdG9fdWRtYV9kZXYodmQtPnR4LmNoYW4tPmRldmljZSk7CisJ c3RydWN0IHVkbWFfY2hhbiAqdWMgPSB0b191ZG1hX2NoYW4odmQtPnR4LmNoYW4pOworCXN0cnVj dCB1ZG1hX2Rlc2MgKmQgPSB0b191ZG1hX2Rlc2MoJnZkLT50eCk7CisJdW5zaWduZWQgbG9uZyBm bGFnczsKKworCWlmICh1Yy0+dGVybWluYXRlZF9kZXNjID09IGQpCisJCXVjLT50ZXJtaW5hdGVk X2Rlc2MgPSBOVUxMOworCisJaWYgKHVjLT51c2VfZG1hX3Bvb2wpIHsKKwkJdWRtYV9mcmVlX2h3 ZGVzYyh1YywgZCk7CisJCWtmcmVlKGQpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2ly cXNhdmUoJnVkLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmdmQtPm5vZGUsICZ1ZC0+ ZGVzY190b19wdXJnZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWQtPmxvY2ssIGZsYWdz KTsKKworCXNjaGVkdWxlX3dvcmsoJnVkLT5wdXJnZV93b3JrKTsKK30KKworc3RhdGljIGJvb2wg dWRtYV9pc19jaGFuX3J1bm5pbmcoc3RydWN0IHVkbWFfY2hhbiAqdWMpCit7CisJdTMyIHRydF9j dGwgPSAwOworCXUzMiBycnRfY3RsID0gMDsKKworCWlmICh1Yy0+dGNoYW4pCisJCXRydF9jdGwg PSB1ZG1hX3RjaGFucnRfcmVhZCh1Yy0+dGNoYW4sIFVETUFfVENIQU5fUlRfQ1RMX1JFRyk7CisJ aWYgKHVjLT5yY2hhbikKKwkJcnJ0X2N0bCA9IHVkbWFfcmNoYW5ydF9yZWFkKHVjLT5yY2hhbiwg VURNQV9SQ0hBTl9SVF9DVExfUkVHKTsKKworCWlmICh0cnRfY3RsICYgVURNQV9DSEFOX1JUX0NU TF9FTiB8fCBycnRfY3RsICYgVURNQV9DSEFOX1JUX0NUTF9FTikKKwkJcmV0dXJuIHRydWU7CisK KwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHVkbWFfaXNfY2hhbl9wYXVzZWQoc3Ry dWN0IHVkbWFfY2hhbiAqdWMpCit7CisJdTMyIHZhbCwgcGF1c2VfbWFzazsKKworCXN3aXRjaCAo dWMtPmRlc2MtPmRpcikgeworCWNhc2UgRE1BX0RFVl9UT19NRU06CisJCXZhbCA9IHVkbWFfcmNo YW5ydF9yZWFkKHVjLT5yY2hhbiwKKwkJCQkJVURNQV9SQ0hBTl9SVF9QRUVSX1JUX0VOX1JFRyk7 CisJCXBhdXNlX21hc2sgPSBVRE1BX1BFRVJfUlRfRU5fUEFVU0U7CisJCWJyZWFrOworCWNhc2Ug RE1BX01FTV9UT19ERVY6CisJCXZhbCA9IHVkbWFfdGNoYW5ydF9yZWFkKHVjLT50Y2hhbiwKKwkJ CQkJVURNQV9UQ0hBTl9SVF9QRUVSX1JUX0VOX1JFRyk7CisJCXBhdXNlX21hc2sgPSBVRE1BX1BF RVJfUlRfRU5fUEFVU0U7CisJCWJyZWFrOworCWNhc2UgRE1BX01FTV9UT19NRU06CisJCXZhbCA9 IHVkbWFfdGNoYW5ydF9yZWFkKHVjLT50Y2hhbiwgVURNQV9UQ0hBTl9SVF9DVExfUkVHKTsKKwkJ cGF1c2VfbWFzayA9IFVETUFfQ0hBTl9SVF9DVExfUEFVU0U7CisJCWJyZWFrOworCWRlZmF1bHQ6 CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAodmFsICYgcGF1c2VfbWFzaykKKwkJcmV0dXJu IHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHVkbWFfc3luY19mb3Jf ZGV2aWNlKHN0cnVjdCB1ZG1hX2NoYW4gKnVjLCBpbnQgaWR4KQoreworCXN0cnVjdCB1ZG1hX2Rl c2MgKmQgPSB1Yy0+ZGVzYzsKKworCWlmICh1Yy0+Y3ljbGljICYmIHVjLT5jb25maWcucGt0X21v ZGUpIHsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UodWMtPnVkLT5kZXYsCisJCQkJCSAg IGQtPmh3ZGVzY1tpZHhdLmNwcGk1X2Rlc2NfcGFkZHIsCisJCQkJCSAgIGQtPmh3ZGVzY1tpZHhd LmNwcGk1X2Rlc2Nfc2l6ZSwKKwkJCQkJICAgRE1BX1RPX0RFVklDRSk7CisJfSBlbHNlIHsKKwkJ aW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IGQtPmh3ZGVzY19jb3VudDsgaSsrKSB7CisJCQlp ZiAoIWQtPmh3ZGVzY1tpXS5jcHBpNV9kZXNjX3ZhZGRyKQorCQkJCWNvbnRpbnVlOworCisJCQlk bWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh1Yy0+dWQtPmRldiwKKwkJCQkJCWQtPmh3ZGVzY1tp XS5jcHBpNV9kZXNjX3BhZGRyLAorCQkJCQkJZC0+aHdkZXNjW2ldLmNwcGk1X2Rlc2Nfc2l6ZSwK KwkJCQkJCURNQV9UT19ERVZJQ0UpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHVkbWFfcHVz aF90b19yaW5nKHN0cnVjdCB1ZG1hX2NoYW4gKnVjLCBpbnQgaWR4KQoreworCXN0cnVjdCB1ZG1h X2Rlc2MgKmQgPSB1Yy0+ZGVzYzsKKworCXN0cnVjdCBrM19yaW5nICpyaW5nID0gTlVMTDsKKwlp bnQgcmV0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAodWMtPmNvbmZpZy5kaXIpIHsKKwljYXNlIERN QV9ERVZfVE9fTUVNOgorCQlyaW5nID0gdWMtPnJmbG93LT5mZF9yaW5nOworCQlicmVhazsKKwlj YXNlIERNQV9NRU1fVE9fREVWOgorCWNhc2UgRE1BX01FTV9UT19NRU06CisJCXJpbmcgPSB1Yy0+ dGNoYW4tPnRfcmluZzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYg KHJpbmcpIHsKKwkJZG1hX2FkZHJfdCBkZXNjX2FkZHIgPSB1ZG1hX2N1cnJfY3BwaTVfZGVzY19w YWRkcihkLCBpZHgpOworCisJCXdtYigpOyAvKiBFbnN1cmUgdGhhdCB3cml0ZXMgYXJlIG5vdCBt b3ZlZCBvdmVyIHRoaXMgcG9pbnQgKi8KKwkJdWRtYV9zeW5jX2Zvcl9kZXZpY2UodWMsIGlkeCk7 CisJCXJldCA9IGszX3JpbmdhY2NfcmluZ19wdXNoKHJpbmcsICZkZXNjX2FkZHIpOworCQl1Yy0+ aW5fcmluZ19jbnQrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHVkbWFf cG9wX2Zyb21fcmluZyhzdHJ1Y3QgdWRtYV9jaGFuICp1YywgZG1hX2FkZHJfdCAqYWRkcikKK3sK KwlzdHJ1Y3QgazNfcmluZyAqcmluZyA9IE5VTEw7CisJaW50IHJldCA9IC1FTk9FTlQ7CisKKwlz d2l0Y2ggKHVjLT5jb25maWcuZGlyKSB7CisJY2FzZSBETUFfREVWX1RPX01FTToKKwkJcmluZyA9 IHVjLT5yZmxvdy0+cl9yaW5nOworCQlicmVhazsKKwljYXNlIERNQV9NRU1fVE9fREVWOgorCWNh c2UgRE1BX01FTV9UT19NRU06CisJCXJpbmcgPSB1Yy0+dGNoYW4tPnRjX3Jpbmc7CisJCWJyZWFr OworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmIChyaW5nICYmIGszX3JpbmdhY2Nfcmlu Z19nZXRfb2NjKHJpbmcpKSB7CisJCXN0cnVjdCB1ZG1hX2Rlc2MgKmQgPSBOVUxMOworCisJCXJl dCA9IGszX3JpbmdhY2NfcmluZ19wb3AocmluZywgYWRkcik7CisJCWlmIChyZXQpCisJCQlyZXR1 cm4gcmV0OworCisJCS8qIFRlYXJkb3duIGNvbXBsZXRpb24gKi8KKwkJaWYgKGNwcGk1X2Rlc2Nf aXNfdGRjbSgqYWRkcikpCisJCQlyZXR1cm4gcmV0OworCisJCWQgPSB1ZG1hX3VkbWFfZGVzY19m cm9tX3BhZGRyKHVjLCAqYWRkcik7CisKKwkJaWYgKGQpCisJCQlkbWFfc3luY19zaW5nbGVfZm9y X2NwdSh1Yy0+dWQtPmRldiwgKmFkZHIsCisJCQkJCQlkLT5od2Rlc2NbMF0uY3BwaTVfZGVzY19z aXplLAorCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJcm1iKCk7IC8qIEVuc3VyZSB0aGF0IHJl YWRzIGFyZSBub3QgbW92ZWQgYmVmb3JlIHRoaXMgcG9pbnQgKi8KKworCQlpZiAoIXJldCkKKwkJ CXVjLT5pbl9yaW5nX2NudC0tOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lk IHVkbWFfcmVzZXRfcmluZ3Moc3RydWN0IHVkbWFfY2hhbiAqdWMpCit7CisJc3RydWN0IGszX3Jp bmcgKnJpbmcxID0gTlVMTDsKKwlzdHJ1Y3QgazNfcmluZyAqcmluZzIgPSBOVUxMOworCisJc3dp dGNoICh1Yy0+Y29uZmlnLmRpcikgeworCWNhc2UgRE1BX0RFVl9UT19NRU06CisJCWlmICh1Yy0+ cmNoYW4pIHsKKwkJCXJpbmcxID0gdWMtPnJmbG93LT5mZF9yaW5nOworCQkJcmluZzIgPSB1Yy0+ cmZsb3ctPnJfcmluZzsKKwkJfQorCQlicmVhazsKKwljYXNlIERNQV9NRU1fVE9fREVWOgorCWNh c2UgRE1BX01FTV9UT19NRU06CisJCWlmICh1Yy0+dGNoYW4pIHsKKwkJCXJpbmcxID0gdWMtPnRj aGFuLT50X3Jpbmc7CisJCQlyaW5nMiA9IHVjLT50Y2hhbi0+dGNfcmluZzsKKwkJfQorCQlicmVh azsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAocmluZzEpCisJCWszX3JpbmdhY2Nf cmluZ19yZXNldF9kbWEocmluZzEsCisJCQkJCSAgazNfcmluZ2FjY19yaW5nX2dldF9vY2Mocmlu ZzEpKTsKKwlpZiAocmluZzIpCisJCWszX3JpbmdhY2NfcmluZ19yZXNldChyaW5nMik7CisKKwkv KiBtYWtlIHN1cmUgd2UgYXJlIG5vdCBsZWFraW5nIG1lbW9yeSBieSBzdGFsbGVkIGRlc2NyaXB0 b3IgKi8KKwlpZiAodWMtPnRlcm1pbmF0ZWRfZGVzYykgeworCQl1ZG1hX2Rlc2NfZnJlZSgmdWMt PnRlcm1pbmF0ZWRfZGVzYy0+dmQpOworCQl1Yy0+dGVybWluYXRlZF9kZXNjID0gTlVMTDsKKwl9 CisKKwl1Yy0+aW5fcmluZ19jbnQgPSAwOworfQorCitzdGF0aWMgdm9pZCB1ZG1hX3Jlc2V0X2Nv dW50ZXJzKHN0cnVjdCB1ZG1hX2NoYW4gKnVjKQoreworCXUzMiB2YWw7CisKKwlpZiAodWMtPnRj aGFuKSB7CisJCXZhbCA9IHVkbWFfdGNoYW5ydF9yZWFkKHVjLT50Y2hhbiwgVURNQV9UQ0hBTl9S VF9CQ05UX1JFRyk7CisJCXVkbWFfdGNoYW5ydF93cml0ZSh1Yy0+dGNoYW4sIFVETUFfVENIQU5f UlRfQkNOVF9SRUcsIHZhbCk7CisKKwkJdmFsID0gdWRtYV90Y2hhbnJ0X3JlYWQodWMtPnRjaGFu LCBVRE1BX1RDSEFOX1JUX1NCQ05UX1JFRyk7CisJCXVkbWFfdGNoYW5ydF93cml0ZSh1Yy0+dGNo YW4sIFVETUFfVENIQU5fUlRfU0JDTlRfUkVHLCB2YWwpOworCisJCXZhbCA9IHVkbWFfdGNoYW5y dF9yZWFkKHVjLT50Y2hhbiwgVURNQV9UQ0hBTl9SVF9QQ05UX1JFRyk7CisJCXVkbWFfdGNoYW5y dF93cml0ZSh1Yy0+dGNoYW4sIFVETUFfVENIQU5fUlRfUENOVF9SRUcsIHZhbCk7CisKKwkJdmFs ID0gdWRtYV90Y2hhbnJ0X3JlYWQodWMtPnRjaGFuLCBVRE1BX1RDSEFOX1JUX1BFRVJfQkNOVF9S RUcpOworCQl1ZG1hX3RjaGFucnRfd3JpdGUodWMtPnRjaGFuLCBVRE1BX1RDSEFOX1JUX1BFRVJf QkNOVF9SRUcsIHZhbCk7CisJfQorCisJaWYgKHVjLT5yY2hhbikgeworCQl2YWwgPSB1ZG1hX3Jj aGFucnRfcmVhZCh1Yy0+cmNoYW4sIFVETUFfUkNIQU5fUlRfQkNOVF9SRUcpOworCQl1ZG1hX3Jj aGFucnRfd3JpdGUodWMtPnJjaGFuLCBVRE1BX1JDSEFOX1JUX0JDTlRfUkVHLCB2YWwpOworCisJ CXZhbCA9IHVkbWFfcmNoYW5ydF9yZWFkKHVjLT5yY2hhbiwgVURNQV9SQ0hBTl9SVF9TQkNOVF9S RUcpOworCQl1ZG1hX3JjaGFucnRfd3JpdGUodWMtPnJjaGFuLCBVRE1BX1JDSEFOX1JUX1NCQ05U X1JFRywgdmFsKTsKKworCQl2YWwgPSB1ZG1hX3JjaGFucnRfcmVhZCh1Yy0+cmNoYW4sIFVETUFf UkNIQU5fUlRfUENOVF9SRUcpOworCQl1ZG1hX3JjaGFucnRfd3JpdGUodWMtPnJjaGFuLCBVRE1B X1JDSEFOX1JUX1BDTlRfUkVHLCB2YWwpOworCisJCXZhbCA9IHVkbWFfcmNoYW5ydF9yZWFkKHVj LT5yY2hhbiwgVURNQV9SQ0hBTl9SVF9QRUVSX0JDTlRfUkVHKTsKKwkJdWRtYV9yY2hhbnJ0X3dy aXRlKHVjLT5yY2hhbiwgVURNQV9SQ0hBTl9SVF9QRUVSX0JDTlRfUkVHLCB2YWwpOworCX0KKwor CXVjLT5iY250ID0gMDsKK30KKworc3RhdGljIGludCB1ZG1hX3Jlc2V0X2NoYW4oc3RydWN0IHVk bWFfY2hhbiAqdWMsIGJvb2wgaGFyZCkKK3sKKwlzd2l0Y2ggKHVjLT5jb25maWcuZGlyKSB7CisJ Y2FzZSBETUFfREVWX1RPX01FTToKKwkJdWRtYV9yY2hhbnJ0X3dyaXRlKHVjLT5yY2hhbiwgVURN QV9SQ0hBTl9SVF9QRUVSX1JUX0VOX1JFRywgMCk7CisJCXVkbWFfcmNoYW5ydF93cml0ZSh1Yy0+ cmNoYW4sIFVETUFfUkNIQU5fUlRfQ1RMX1JFRywgMCk7CisJCWJyZWFrOworCWNhc2UgRE1BX01F TV9UT19ERVY6CisJCXVkbWFfdGNoYW5ydF93cml0ZSh1Yy0+dGNoYW4sIFVETUFfVENIQU5fUlRf Q1RMX1JFRywgMCk7CisJCXVkbWFfdGNoYW5ydF93cml0ZSh1Yy0+dGNoYW4sIFVETUFfVENIQU5f UlRfUEVFUl9SVF9FTl9SRUcsIDApOworCQlicmVhazsKKwljYXNlIERNQV9NRU1fVE9fTUVNOgor CQl1ZG1hX3JjaGFucnRfd3JpdGUodWMtPnJjaGFuLCBVRE1BX1JDSEFOX1JUX0NUTF9SRUcsIDAp OworCQl1ZG1hX3RjaGFucnRfd3JpdGUodWMtPnRjaGFuLCBVRE1BX1RDSEFOX1JUX0NUTF9SRUcs IDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBS ZXNldCBhbGwgY291bnRlcnMgKi8KKwl1ZG1hX3Jlc2V0X2NvdW50ZXJzKHVjKTsKKworCS8qIEhh cmQgcmVzZXQ6IHJlLWluaXRpYWxpemUgdGhlIGNoYW5uZWwgdG8gcmVzZXQgKi8KKwlpZiAoaGFy ZCkgeworCQlzdHJ1Y3QgdWRtYV9jaGFuX2NvbmZpZyB1Y2NfYmFja3VwOworCQlpbnQgcmV0Owor CisJCW1lbWNweSgmdWNjX2JhY2t1cCwgJnVjLT5jb25maWcsIHNpemVvZih1Yy0+Y29uZmlnKSk7 CisJCXVjLT51ZC0+ZGRldi5kZXZpY2VfZnJlZV9jaGFuX3Jlc291cmNlcygmdWMtPnZjLmNoYW4p OworCisJCS8qIHJlc3RvcmUgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLworCQltZW1jcHko JnVjLT5jb25maWcsICZ1Y2NfYmFja3VwLCBzaXplb2YodWMtPmNvbmZpZykpOworCQlyZXQgPSB1 Yy0+dWQtPmRkZXYuZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzKCZ1Yy0+dmMuY2hhbik7CisJ CWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCS8qCisJCSAqIFNldHRpbmcgZm9yY2VkIHRl YXJkb3duIGFmdGVyIGZvcmNlZCByZXNldCBoZWxwcyByZWNvdmVyaW5nCisJCSAqIHRoZSByY2hh bi4KKwkJICovCisJCWlmICh1Yy0+Y29uZmlnLmRpciA9PSBETUFfREVWX1RPX01FTSkKKwkJCXVk bWFfcmNoYW5ydF93cml0ZSh1Yy0+cmNoYW4sIFVETUFfUkNIQU5fUlRfQ1RMX1JFRywKKwkJCQkJ ICAgVURNQV9DSEFOX1JUX0NUTF9FTiB8CisJCQkJCSAgIFVETUFfQ0hBTl9SVF9DVExfVERPV04g fAorCQkJCQkgICBVRE1BX0NIQU5fUlRfQ1RMX0ZURE9XTik7CisJfQorCXVjLT5zdGF0ZSA9IFVE TUFfQ0hBTl9JU19JRExFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVkbWFfc3Rh cnRfZGVzYyhzdHJ1Y3QgdWRtYV9jaGFuICp1YykKK3sKKwlzdHJ1Y3QgdWRtYV9jaGFuX2NvbmZp ZyAqdWNjID0gJnVjLT5jb25maWc7CisKKwlpZiAodWNjLT5wa3RfbW9kZSAmJiAodWMtPmN5Y2xp YyB8fCB1Y2MtPmRpciA9PSBETUFfREVWX1RPX01FTSkpIHsKKwkJaW50IGk7CisKKwkJLyogUHVz aCBhbGwgZGVzY3JpcHRvcnMgdG8gcmluZyBmb3IgcGFja2V0IG1vZGUgY3ljbGljIG9yIFJYICov CisJCWZvciAoaSA9IDA7IGkgPCB1Yy0+ZGVzYy0+c2dsZW47IGkrKykKKwkJCXVkbWFfcHVzaF90 b19yaW5nKHVjLCBpKTsKKwl9IGVsc2UgeworCQl1ZG1hX3B1c2hfdG9fcmluZyh1YywgMCk7CisJ fQorfQorCitzdGF0aWMgYm9vbCB1ZG1hX2NoYW5fbmVlZHNfcmVjb25maWd1cmF0aW9uKHN0cnVj dCB1ZG1hX2NoYW4gKnVjKQoreworCS8qIE9ubHkgUERNQXMgaGF2ZSBzdGF0aWNUUiAqLworCWlm ICh1Yy0+Y29uZmlnLmVwX3R5cGUgPT0gUFNJTF9FUF9OQVRJVkUpCisJCXJldHVybiBmYWxzZTsK KworCS8qIENoZWNrIGlmIHRoZSBzdGF0aWNUUiBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkIGZv ciBUWCAqLworCWlmIChtZW1jbXAoJnVjLT5zdGF0aWNfdHIsICZ1Yy0+ZGVzYy0+c3RhdGljX3Ry LCBzaXplb2YodWMtPnN0YXRpY190cikpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxz ZTsKK30KKworc3RhdGljIGludCB1ZG1hX3N0YXJ0KHN0cnVjdCB1ZG1hX2NoYW4gKnVjKQorewor CXN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCA9IHZjaGFuX25leHRfZGVzYygmdWMtPnZjKTsKKwor CWlmICghdmQpIHsKKwkJdWMtPmRlc2MgPSBOVUxMOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisK KwlsaXN0X2RlbCgmdmQtPm5vZGUpOworCisJdWMtPmRlc2MgPSB0b191ZG1hX2Rlc2MoJnZkLT50 eCk7CisKKwkvKiBDaGFubmVsIGlzIGFscmVhZHkgcnVubmluZyBhbmQgZG9lcyBub3QgbmVlZCBy ZWNvbmZpZ3VyYXRpb24gKi8KKwlpZiAodWRtYV9pc19jaGFuX3J1bm5pbmcodWMpICYmICF1ZG1h X2NoYW5fbmVlZHNfcmVjb25maWd1cmF0aW9uKHVjKSkgeworCQl1ZG1hX3N0YXJ0X2Rlc2ModWMp OworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBjbGVhciB0aGUgdGVh cmRvd24gYml0LCBpZiBpdCBpcyBzZXQgKi8KKwl1ZG1hX3Jlc2V0X2NoYW4odWMsIGZhbHNlKTsK KworCS8qIFB1c2ggZGVzY3JpcHRvcnMgYmVmb3JlIHdlIHN0YXJ0IHRoZSBjaGFubmVsICovCisJ dWRtYV9zdGFydF9kZXNjKHVjKTsKKworCXN3aXRjaCAodWMtPmRlc2MtPmRpcikgeworCWNhc2Ug RE1BX0RFVl9UT19NRU06CisJCS8qIENvbmZpZyByZW1vdGUgVFIgKi8KKwkJaWYgKHVjLT5jb25m aWcuZXBfdHlwZSA9PSBQU0lMX0VQX1BETUFfWFkpIHsKKwkJCXUzMiB2YWwgPSBQRE1BX1NUQVRJ Q19UUl9ZKHVjLT5kZXNjLT5zdGF0aWNfdHIuZWxjbnQpIHwKKwkJCQkgIFBETUFfU1RBVElDX1RS X1godWMtPmRlc2MtPnN0YXRpY190ci5lbHNpemUpOworCQkJY29uc3Qgc3RydWN0IHVkbWFfbWF0 Y2hfZGF0YSAqbWF0Y2hfZGF0YSA9CisJCQkJCQkJdWMtPnVkLT5tYXRjaF9kYXRhOworCisJCQlp ZiAodWMtPmNvbmZpZy5lbmFibGVfYWNjMzIpCisJCQkJdmFsIHw9IFBETUFfU1RBVElDX1RSX1hZ X0FDQzMyOworCQkJaWYgKHVjLT5jb25maWcuZW5hYmxlX2J1cnN0KQorCQkJCXZhbCB8PSBQRE1B X1NUQVRJQ19UUl9YWV9CVVJTVDsKKworCQkJdWRtYV9yY2hhbnJ0X3dyaXRlKHVjLT5yY2hhbiwK KwkJCQlVRE1BX1JDSEFOX1JUX1BFRVJfU1RBVElDX1RSX1hZX1JFRywgdmFsKTsKKworCQkJdWRt YV9yY2hhbnJ0X3dyaXRlKHVjLT5yY2hhbiwKKwkJCQlVRE1BX1JDSEFOX1JUX1BFRVJfU1RBVElD X1RSX1pfUkVHLAorCQkJCVBETUFfU1RBVElDX1RSX1oodWMtPmRlc2MtPnN0YXRpY190ci5ic3Rj bnQsCisJCQkJCQkgbWF0Y2hfZGF0YS0+c3RhdGljdHJfel9tYXNrKSk7CisKKwkJCS8qIHNhdmUg dGhlIGN1cnJlbnQgc3RhdGljVFIgY29uZmlndXJhdGlvbiAqLworCQkJbWVtY3B5KCZ1Yy0+c3Rh dGljX3RyLCAmdWMtPmRlc2MtPnN0YXRpY190ciwKKwkJCSAgICAgICBzaXplb2YodWMtPnN0YXRp Y190cikpOworCQl9CisKKwkJdWRtYV9yY2hhbnJ0X3dyaXRlKHVjLT5yY2hhbiwgVURNQV9SQ0hB Tl9SVF9DVExfUkVHLAorCQkJCSAgIFVETUFfQ0hBTl9SVF9DVExfRU4pOworCisJCS8qIEVuYWJs ZSByZW1vdGUgKi8KKwkJdWRtYV9yY2hhbnJ0X3dyaXRlKHVjLT5yY2hhbiwgVURNQV9SQ0hBTl9S VF9QRUVSX1JUX0VOX1JFRywKKwkJCQkgICBVRE1BX1BFRVJfUlRfRU5fRU5BQkxFKTsKKworCQli cmVhazsKKwljYXNlIERNQV9NRU1fVE9fREVWOgorCQkvKiBDb25maWcgcmVtb3RlIFRSICovCisJ CWlmICh1Yy0+Y29uZmlnLmVwX3R5cGUgPT0gUFNJTF9FUF9QRE1BX1hZKSB7CisJCQl1MzIgdmFs ID0gUERNQV9TVEFUSUNfVFJfWSh1Yy0+ZGVzYy0+c3RhdGljX3RyLmVsY250KSB8CisJCQkJICBQ RE1BX1NUQVRJQ19UUl9YKHVjLT5kZXNjLT5zdGF0aWNfdHIuZWxzaXplKTsKKworCQkJaWYgKHVj LT5jb25maWcuZW5hYmxlX2FjYzMyKQorCQkJCXZhbCB8PSBQRE1BX1NUQVRJQ19UUl9YWV9BQ0Mz MjsKKwkJCWlmICh1Yy0+Y29uZmlnLmVuYWJsZV9idXJzdCkKKwkJCQl2YWwgfD0gUERNQV9TVEFU SUNfVFJfWFlfQlVSU1Q7CisKKwkJCXVkbWFfdGNoYW5ydF93cml0ZSh1Yy0+dGNoYW4sCisJCQkJ VURNQV9UQ0hBTl9SVF9QRUVSX1NUQVRJQ19UUl9YWV9SRUcsIHZhbCk7CisKKwkJCS8qIHNhdmUg dGhlIGN1cnJlbnQgc3RhdGljVFIgY29uZmlndXJhdGlvbiAqLworCQkJbWVtY3B5KCZ1Yy0+c3Rh dGljX3RyLCAmdWMtPmRlc2MtPnN0YXRpY190ciwKKwkJCSAgICAgICBzaXplb2YodWMtPnN0YXRp Y190cikpOworCQl9CisKKwkJLyogRW5hYmxlIHJlbW90ZSAqLworCQl1ZG1hX3RjaGFucnRfd3Jp dGUodWMtPnRjaGFuLCBVRE1BX1RDSEFOX1JUX1BFRVJfUlRfRU5fUkVHLAorCQkJCSAgIFVETUFf UEVFUl9SVF9FTl9FTkFCTEUpOworCisJCXVkbWFfdGNoYW5ydF93cml0ZSh1Yy0+dGNoYW4sIFVE TUFfVENIQU5fUlRfQ1RMX1JFRywKKwkJCQkgICBVRE1BX0NIQU5fUlRfQ1RMX0VOKTsKKworCQli cmVhazsKKwljYXNlIERNQV9NRU1fVE9fTUVNOgorCQl1ZG1hX3JjaGFucnRfd3JpdGUodWMtPnJj aGFuLCBVRE1BX1JDSEFOX1JUX0NUTF9SRUcsCisJCQkJICAgVURNQV9DSEFOX1JUX0NUTF9FTik7 CisJCXVkbWFfdGNoYW5ydF93cml0ZSh1Yy0+dGNoYW4sIFVETUFfVENIQU5fUlRfQ1RMX1JFRywK KwkJCQkgICBVRE1BX0NIQU5fUlRfQ1RMX0VOKTsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQly ZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl1Yy0+c3RhdGUgPSBVRE1BX0NIQU5fSVNfQUNUSVZFOwor b3V0OgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWRtYV9zdG9wKHN0cnVjdCB1ZG1h X2NoYW4gKnVjKQoreworCWVudW0gdWRtYV9jaGFuX3N0YXRlIG9sZF9zdGF0ZSA9IHVjLT5zdGF0 ZTsKKworCXVjLT5zdGF0ZSA9IFVETUFfQ0hBTl9JU19URVJNSU5BVElORzsKKwlyZWluaXRfY29t cGxldGlvbigmdWMtPnRlYXJkb3duX2NvbXBsZXRlZCk7CisKKwlzd2l0Y2ggKHVjLT5jb25maWcu ZGlyKSB7CisJY2FzZSBETUFfREVWX1RPX01FTToKKwkJdWRtYV9yY2hhbnJ0X3dyaXRlKHVjLT5y Y2hhbiwgVURNQV9SQ0hBTl9SVF9QRUVSX1JUX0VOX1JFRywKKwkJCQkgICBVRE1BX1BFRVJfUlRf RU5fRU5BQkxFIHwKKwkJCQkgICBVRE1BX1BFRVJfUlRfRU5fVEVBUkRPV04pOworCQlicmVhazsK KwljYXNlIERNQV9NRU1fVE9fREVWOgorCQl1ZG1hX3RjaGFucnRfd3JpdGUodWMtPnRjaGFuLCBV RE1BX1RDSEFOX1JUX1BFRVJfUlRfRU5fUkVHLAorCQkJCSAgIFVETUFfUEVFUl9SVF9FTl9FTkFC TEUgfAorCQkJCSAgIFVETUFfUEVFUl9SVF9FTl9GTFVTSCk7CisJCXVkbWFfdGNoYW5ydF93cml0 ZSh1Yy0+dGNoYW4sIFVETUFfVENIQU5fUlRfQ1RMX1JFRywKKwkJCQkgICBVRE1BX0NIQU5fUlRf Q1RMX0VOIHwKKwkJCQkgICBVRE1BX0NIQU5fUlRfQ1RMX1RET1dOKTsKKwkJYnJlYWs7CisJY2Fz ZSBETUFfTUVNX1RPX01FTToKKwkJdWRtYV90Y2hhbnJ0X3dyaXRlKHVjLT50Y2hhbiwgVURNQV9U Q0hBTl9SVF9DVExfUkVHLAorCQkJCSAgIFVETUFfQ0hBTl9SVF9DVExfRU4gfAorCQkJCSAgIFVE TUFfQ0hBTl9SVF9DVExfVERPV04pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1Yy0+c3RhdGUg PSBvbGRfc3RhdGU7CisJCWNvbXBsZXRlX2FsbCgmdWMtPnRlYXJkb3duX2NvbXBsZXRlZCk7CisJ CXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1ZG1h X2N5Y2xpY19wYWNrZXRfZWxhcHNlZChzdHJ1Y3QgdWRtYV9jaGFuICp1YykKK3sKKwlzdHJ1Y3Qg dWRtYV9kZXNjICpkID0gdWMtPmRlc2M7CisJc3RydWN0IGNwcGk1X2hvc3RfZGVzY190ICpoX2Rl c2M7CisKKwloX2Rlc2MgPSBkLT5od2Rlc2NbZC0+ZGVzY19pZHhdLmNwcGk1X2Rlc2NfdmFkZHI7 CisJY3BwaTVfaGRlc2NfcmVzZXRfdG9fb3JpZ2luYWwoaF9kZXNjKTsKKwl1ZG1hX3B1c2hfdG9f cmluZyh1YywgZC0+ZGVzY19pZHgpOworCWQtPmRlc2NfaWR4ID0gKGQtPmRlc2NfaWR4ICsgMSkg JSBkLT5zZ2xlbjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVkbWFfZmV0Y2hfZXBpYihzdHJ1 Y3QgdWRtYV9jaGFuICp1Yywgc3RydWN0IHVkbWFfZGVzYyAqZCkKK3sKKwlzdHJ1Y3QgY3BwaTVf aG9zdF9kZXNjX3QgKmhfZGVzYyA9IGQtPmh3ZGVzY1swXS5jcHBpNV9kZXNjX3ZhZGRyOworCisJ bWVtY3B5KGQtPm1ldGFkYXRhLCBoX2Rlc2MtPmVwaWIsIGQtPm1ldGFkYXRhX3NpemUpOworfQor CitzdGF0aWMgYm9vbCB1ZG1hX2lzX2Rlc2NfcmVhbGx5X2RvbmUoc3RydWN0IHVkbWFfY2hhbiAq dWMsIHN0cnVjdCB1ZG1hX2Rlc2MgKmQpCit7CisJdTMyIHBlZXJfYmNudCwgYmNudDsKKworCS8q IE9ubHkgVFggdG93YXJkcyBQRE1BIGlzIGFmZmVjdGVkICovCisJaWYgKHVjLT5jb25maWcuZXBf dHlwZSA9PSBQU0lMX0VQX05BVElWRSB8fAorCSAgICB1Yy0+Y29uZmlnLmRpciAhPSBETUFfTUVN X1RPX0RFVikKKwkJcmV0dXJuIHRydWU7CisKKwlwZWVyX2JjbnQgPSB1ZG1hX3RjaGFucnRfcmVh ZCh1Yy0+dGNoYW4sIFVETUFfVENIQU5fUlRfUEVFUl9CQ05UX1JFRyk7CisJYmNudCA9IHVkbWFf dGNoYW5ydF9yZWFkKHVjLT50Y2hhbiwgVURNQV9UQ0hBTl9SVF9CQ05UX1JFRyk7CisKKwlpZiAo cGVlcl9iY250IDwgYmNudCkgeworCQl1Yy0+dHhfZHJhaW4ucmVzaWR1ZSA9IGJjbnQgLSBwZWVy X2JjbnQ7CisJCXVjLT50eF9kcmFpbi5qaWZmaWUgPSBqaWZmaWVzOworCQlyZXR1cm4gZmFsc2U7 CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHVkbWFfY2hlY2tfdHhfY29t cGxldGlvbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHVkbWFfY2hhbiAq dWMgPSBjb250YWluZXJfb2Yod29yaywgdHlwZW9mKCp1YyksCisJCQkJCSAgICB0eF9kcmFpbi53 b3JrLndvcmspOworCWJvb2wgZGVzY19kb25lID0gdHJ1ZTsKKwl1MzIgcmVzaWR1ZV9kaWZmOwor CXVuc2lnbmVkIGxvbmcgamlmZmllX2RpZmYsIGRlbGF5OworCisJaWYgKHVjLT5kZXNjKSB7CisJ CXJlc2lkdWVfZGlmZiA9IHVjLT50eF9kcmFpbi5yZXNpZHVlOworCQlqaWZmaWVfZGlmZiA9IHVj LT50eF9kcmFpbi5qaWZmaWU7CisJCWRlc2NfZG9uZSA9IHVkbWFfaXNfZGVzY19yZWFsbHlfZG9u ZSh1YywgdWMtPmRlc2MpOworCX0KKworCWlmICghZGVzY19kb25lKSB7CisJCWppZmZpZV9kaWZm ID0gdWMtPnR4X2RyYWluLmppZmZpZSAtIGppZmZpZV9kaWZmOworCQlyZXNpZHVlX2RpZmYgLT0g dWMtPnR4X2RyYWluLnJlc2lkdWU7CisJCWlmIChyZXNpZHVlX2RpZmYpIHsKKwkJCS8qIFRyeSB0 byBndWVzcyB3aGVuIHdlIHNob3VsZCBjaGVjayBuZXh0IHRpbWUgKi8KKwkJCXJlc2lkdWVfZGlm ZiAvPSBqaWZmaWVfZGlmZjsKKwkJCWRlbGF5ID0gdWMtPnR4X2RyYWluLnJlc2lkdWUgLyByZXNp ZHVlX2RpZmYgLyAzOworCQkJaWYgKGppZmZpZXNfdG9fbXNlY3MoZGVsYXkpIDwgNSkKKwkJCQlk ZWxheSA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBObyBwcm9ncmVzcywgY2hlY2sgYWdhaW4gaW4g MSBzZWNvbmQgICovCisJCQlkZWxheSA9IEhaOworCQl9CisKKwkJc2NoZWR1bGVfZGVsYXllZF93 b3JrKCZ1Yy0+dHhfZHJhaW4ud29yaywgZGVsYXkpOworCX0gZWxzZSBpZiAodWMtPmRlc2MpIHsK KwkJc3RydWN0IHVkbWFfZGVzYyAqZCA9IHVjLT5kZXNjOworCisJCXVjLT5iY250ICs9IGQtPnJl c2lkdWU7CisJCXVkbWFfc3RhcnQodWMpOworCQl2Y2hhbl9jb29raWVfY29tcGxldGUoJmQtPnZk KTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB1ZG1hX3JpbmdfaXJxX2hhbmRsZXIoaW50 IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IGRhdGE7CisJc3Ry dWN0IHVkbWFfZGVzYyAqZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRtYV9hZGRyX3QgcGFk ZHIgPSAwOworCisJaWYgKHVkbWFfcG9wX2Zyb21fcmluZyh1YywgJnBhZGRyKSB8fCAhcGFkZHIp CisJCXJldHVybiBJUlFfSEFORExFRDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1Yy0+dmMubG9j aywgZmxhZ3MpOworCisJLyogVGVhcmRvd24gY29tcGxldGlvbiBtZXNzYWdlICovCisJaWYgKGNw cGk1X2Rlc2NfaXNfdGRjbShwYWRkcikpIHsKKwkJLyogQ29tcGVuc2F0ZSBvdXIgaW50ZXJuYWwg cG9wL3B1c2ggY291bnRlciAqLworCQl1Yy0+aW5fcmluZ19jbnQrKzsKKworCQljb21wbGV0ZV9h bGwoJnVjLT50ZWFyZG93bl9jb21wbGV0ZWQpOworCisJCWlmICh1Yy0+dGVybWluYXRlZF9kZXNj KSB7CisJCQl1ZG1hX2Rlc2NfZnJlZSgmdWMtPnRlcm1pbmF0ZWRfZGVzYy0+dmQpOworCQkJdWMt PnRlcm1pbmF0ZWRfZGVzYyA9IE5VTEw7CisJCX0KKworCQlpZiAoIXVjLT5kZXNjKQorCQkJdWRt YV9zdGFydCh1Yyk7CisKKwkJZ290byBvdXQ7CisJfQorCisJZCA9IHVkbWFfdWRtYV9kZXNjX2Zy b21fcGFkZHIodWMsIHBhZGRyKTsKKworCWlmIChkKSB7CisJCWRtYV9hZGRyX3QgZGVzY19wYWRk ciA9IHVkbWFfY3Vycl9jcHBpNV9kZXNjX3BhZGRyKGQsCisJCQkJCQkJCSAgIGQtPmRlc2NfaWR4 KTsKKwkJaWYgKGRlc2NfcGFkZHIgIT0gcGFkZHIpIHsKKwkJCWRldl9lcnIodWMtPnVkLT5kZXYs ICJub3QgbWF0Y2hpbmcgZGVzY3JpcHRvcnMhXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJ aWYgKHVjLT5jeWNsaWMpIHsKKwkJCS8qIHB1c2ggdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUg cmluZyAqLworCQkJaWYgKGQgPT0gdWMtPmRlc2MpIHsKKwkJCQl1ZG1hX2N5Y2xpY19wYWNrZXRf ZWxhcHNlZCh1Yyk7CisJCQkJdmNoYW5fY3ljbGljX2NhbGxiYWNrKCZkLT52ZCk7CisJCQl9CisJ CX0gZWxzZSB7CisJCQlib29sIGRlc2NfZG9uZSA9IGZhbHNlOworCisJCQlpZiAoZCA9PSB1Yy0+ ZGVzYykgeworCQkJCWRlc2NfZG9uZSA9IHVkbWFfaXNfZGVzY19yZWFsbHlfZG9uZSh1YywgZCk7 CisKKwkJCQlpZiAoZGVzY19kb25lKSB7CisJCQkJCXVjLT5iY250ICs9IGQtPnJlc2lkdWU7CisJ CQkJCXVkbWFfc3RhcnQodWMpOworCQkJCX0gZWxzZSB7CisJCQkJCXNjaGVkdWxlX2RlbGF5ZWRf d29yaygmdWMtPnR4X2RyYWluLndvcmssCisJCQkJCQkJICAgICAgMCk7CisJCQkJfQorCQkJfQor CisJCQlpZiAoZGVzY19kb25lKQorCQkJCXZjaGFuX2Nvb2tpZV9jb21wbGV0ZSgmZC0+dmQpOwor CQl9CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVjLT52Yy5sb2NrLCBmbGFn cyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB1ZG1h X3VkbWFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdWRtYV9j aGFuICp1YyA9IGRhdGE7CisJc3RydWN0IHVkbWFfZGVzYyAqZDsKKwl1bnNpZ25lZCBsb25nIGZs YWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVjLT52Yy5sb2NrLCBmbGFncyk7CisJZCA9IHVj LT5kZXNjOworCWlmIChkKSB7CisJCWQtPnRyX2lkeCA9IChkLT50cl9pZHggKyAxKSAlIGQtPnNn bGVuOworCisJCWlmICh1Yy0+Y3ljbGljKSB7CisJCQl2Y2hhbl9jeWNsaWNfY2FsbGJhY2soJmQt PnZkKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFRPRE86IGZpZ3VyZSBvdXQgdGhlIHJlYWwgYW1vdW50 IG9mIGRhdGEgKi8KKwkJCXVjLT5iY250ICs9IGQtPnJlc2lkdWU7CisJCQl1ZG1hX3N0YXJ0KHVj KTsKKwkJCXZjaGFuX2Nvb2tpZV9jb21wbGV0ZSgmZC0+dmQpOworCQl9CisJfQorCisJc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmdWMtPnZjLmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfSEFO RExFRDsKK30KKworc3RhdGljIHN0cnVjdCB1ZG1hX3JmbG93ICpfX3VkbWFfZ2V0X3JmbG93KHN0 cnVjdCB1ZG1hX2RldiAqdWQsIGludCBpZCkKK3sKKwkvKgorCSAqIEF0dGVtcHQgdG8gcmVxdWVz dCByZmxvdyBieSBJRCBjYW4gYmUgbWFkZSBmb3IgYW55IHJmbG93CisJICogaWYgbm90IGluIHVz ZSB3aXRoIGFzc3VtcHRpb24gdGhhdCBjYWxsZXIga25vd3Mgd2hhdCdzIGRvaW5nLgorCSAqIFRJ LVNDSSBGVyB3aWxsIHBlcmZvcm0gYWRkaXRpb25hbCBwZXJtaXNzaW9uIGNoZWNrIGFudCB3YXks IGl0J3MKKwkgKiBzYWZlCisJICovCisKKwlpZiAoaWQgPCAwIHx8IGlkID49IHVkLT5yZmxvd19j bnQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCisJaWYgKHRlc3RfYml0KGlkLCB1ZC0+ cmZsb3dfaW5fdXNlKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisKKwkvKiBHUCByZmxv dyBoYXMgdG8gYmUgYWxsb2NhdGVkIGZpcnN0ICovCisJaWYgKCF0ZXN0X2JpdChpZCwgdWQtPnJm bG93X2dwX21hcCkgJiYKKwkgICAgIXRlc3RfYml0KGlkLCB1ZC0+cmZsb3dfZ3BfbWFwX2FsbG9j YXRlZCkpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJZGV2X2RiZyh1ZC0+ZGV2LCAi Z2V0IHJmbG93JWRcbiIsIGlkKTsKKwlzZXRfYml0KGlkLCB1ZC0+cmZsb3dfaW5fdXNlKTsKKwly ZXR1cm4gJnVkLT5yZmxvd3NbaWRdOworfQorCitzdGF0aWMgdm9pZCBfX3VkbWFfcHV0X3JmbG93 KHN0cnVjdCB1ZG1hX2RldiAqdWQsIHN0cnVjdCB1ZG1hX3JmbG93ICpyZmxvdykKK3sKKwlpZiAo IXRlc3RfYml0KHJmbG93LT5pZCwgdWQtPnJmbG93X2luX3VzZSkpIHsKKwkJZGV2X2Vycih1ZC0+ ZGV2LCAiYXR0ZW1wdCB0byBwdXQgdW51c2VkIHJmbG93JWRcbiIsIHJmbG93LT5pZCk7CisJCXJl dHVybjsKKwl9CisKKwlkZXZfZGJnKHVkLT5kZXYsICJwdXQgcmZsb3clZFxuIiwgcmZsb3ctPmlk KTsKKwljbGVhcl9iaXQocmZsb3ctPmlkLCB1ZC0+cmZsb3dfaW5fdXNlKTsKK30KKworI2RlZmlu ZSBVRE1BX1JFU0VSVkVfUkVTT1VSQ0UocmVzKQkJCQkJXAorc3RhdGljIHN0cnVjdCB1ZG1hXyMj cmVzICpfX3VkbWFfcmVzZXJ2ZV8jI3JlcyhzdHJ1Y3QgdWRtYV9kZXYgKnVkLAlcCisJCQkJCSAg ICAgICBlbnVtIHVkbWFfdHBfbGV2ZWwgdHBsLAlcCisJCQkJCSAgICAgICBpbnQgaWQpCQkJXAor ewkJCQkJCQkJCVwKKwlpZiAoaWQgPj0gMCkgewkJCQkJCQlcCisJCWlmICh0ZXN0X2JpdChpZCwg dWQtPnJlcyMjX21hcCkpIHsJCQlcCisJCQlkZXZfZXJyKHVkLT5kZXYsICJyZXMjIyVkIGlzIGlu IHVzZVxuIiwgaWQpOwlcCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsJCQlcCisJCX0JCQkJ CQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJaW50IHN0YXJ0OwkJCQkJCVwKKwkJCQkJCQkJCVwK KwkJaWYgKHRwbCA+PSB1ZC0+bWF0Y2hfZGF0YS0+dHBsX2xldmVscykJCQlcCisJCQl0cGwgPSB1 ZC0+bWF0Y2hfZGF0YS0+dHBsX2xldmVscyAtIDE7CQlcCisJCQkJCQkJCQlcCisJCXN0YXJ0ID0g dWQtPm1hdGNoX2RhdGEtPmxldmVsX3N0YXJ0X2lkeFt0cGxdOwkJXAorCQkJCQkJCQkJXAorCQlp ZCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh1ZC0+cmVzIyNfbWFwLCB1ZC0+cmVzIyNfY250LAlcCisJ CQkJCXN0YXJ0KTsJCQkJXAorCQlpZiAoaWQgPT0gdWQtPnJlcyMjX2NudCkgewkJCQlcCisJCQly ZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsJCQlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwkJ CQkJCQkJCVwKKwlzZXRfYml0KGlkLCB1ZC0+cmVzIyNfbWFwKTsJCQkJCVwKKwlyZXR1cm4gJnVk LT5yZXMjI3NbaWRdOwkJCQkJCVwKK30KKworVURNQV9SRVNFUlZFX1JFU09VUkNFKHRjaGFuKTsK K1VETUFfUkVTRVJWRV9SRVNPVVJDRShyY2hhbik7CisKK3N0YXRpYyBpbnQgdWRtYV9nZXRfdGNo YW4oc3RydWN0IHVkbWFfY2hhbiAqdWMpCit7CisJc3RydWN0IHVkbWFfZGV2ICp1ZCA9IHVjLT51 ZDsKKworCWlmICh1Yy0+dGNoYW4pIHsKKwkJZGV2X2RiZyh1ZC0+ZGV2LCAiY2hhbiVkOiBhbHJl YWR5IGhhdmUgdGNoYW4lZCBhbGxvY2F0ZWRcbiIsCisJCQl1Yy0+aWQsIHVjLT50Y2hhbi0+aWQp OworCQlyZXR1cm4gMDsKKwl9CisKKwl1Yy0+dGNoYW4gPSBfX3VkbWFfcmVzZXJ2ZV90Y2hhbih1 ZCwgdWMtPmNvbmZpZy5jaGFubmVsX3RwbCwgLTEpOworCWlmIChJU19FUlIodWMtPnRjaGFuKSkK KwkJcmV0dXJuIFBUUl9FUlIodWMtPnRjaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50IHVkbWFfZ2V0X3JjaGFuKHN0cnVjdCB1ZG1hX2NoYW4gKnVjKQoreworCXN0cnVjdCB1ZG1h X2RldiAqdWQgPSB1Yy0+dWQ7CisKKwlpZiAodWMtPnJjaGFuKSB7CisJCWRldl9kYmcodWQtPmRl diwgImNoYW4lZDogYWxyZWFkeSBoYXZlIHJjaGFuJWQgYWxsb2NhdGVkXG4iLAorCQkJdWMtPmlk LCB1Yy0+cmNoYW4tPmlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdWMtPnJjaGFuID0gX191ZG1h X3Jlc2VydmVfcmNoYW4odWQsIHVjLT5jb25maWcuY2hhbm5lbF90cGwsIC0xKTsKKwlpZiAoSVNf RVJSKHVjLT5yY2hhbikpCisJCXJldHVybiBQVFJfRVJSKHVjLT5yY2hhbik7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludCB1ZG1hX2dldF9jaGFuX3BhaXIoc3RydWN0IHVkbWFfY2hhbiAq dWMpCit7CisJc3RydWN0IHVkbWFfZGV2ICp1ZCA9IHVjLT51ZDsKKwljb25zdCBzdHJ1Y3QgdWRt YV9tYXRjaF9kYXRhICptYXRjaF9kYXRhID0gdWQtPm1hdGNoX2RhdGE7CisJaW50IGNoYW5faWQs IGVuZDsKKworCWlmICgodWMtPnRjaGFuICYmIHVjLT5yY2hhbikgJiYgdWMtPnRjaGFuLT5pZCA9 PSB1Yy0+cmNoYW4tPmlkKSB7CisJCWRldl9pbmZvKHVkLT5kZXYsICJjaGFuJWQ6IGFscmVhZHkg aGF2ZSAlZCBwYWlyIGFsbG9jYXRlZFxuIiwKKwkJCSB1Yy0+aWQsIHVjLT50Y2hhbi0+aWQpOwor CQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodWMtPnRjaGFuKSB7CisJCWRldl9lcnIodWQtPmRldiwg ImNoYW4lZDogYWxyZWFkeSBoYXZlIHRjaGFuJWQgYWxsb2NhdGVkXG4iLAorCQkJdWMtPmlkLCB1 Yy0+dGNoYW4tPmlkKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9IGVsc2UgaWYgKHVjLT5yY2hhbikg eworCQlkZXZfZXJyKHVkLT5kZXYsICJjaGFuJWQ6IGFscmVhZHkgaGF2ZSByY2hhbiVkIGFsbG9j YXRlZFxuIiwKKwkJCXVjLT5pZCwgdWMtPnJjaGFuLT5pZCk7CisJCXJldHVybiAtRUJVU1k7CisJ fQorCisJLyogQ2FuIGJlIG9wdGltaXplZCwgYnV0IGxldCdzIGhhdmUgaXQgbGlrZSB0aGlzIGZv ciBub3cgKi8KKwllbmQgPSBtaW4odWQtPnRjaGFuX2NudCwgdWQtPnJjaGFuX2NudCk7CisJLyog VHJ5IHRvIHVzZSB0aGUgaGlnaGVzdCBUUEwgY2hhbm5lbCBwYWlyIGZvciBNRU1fVE9fTUVNIGNo YW5uZWxzICovCisJY2hhbl9pZCA9IG1hdGNoX2RhdGEtPmxldmVsX3N0YXJ0X2lkeFttYXRjaF9k YXRhLT50cGxfbGV2ZWxzIC0gMV07CisJZm9yICg7IGNoYW5faWQgPCBlbmQ7IGNoYW5faWQrKykg eworCQlpZiAoIXRlc3RfYml0KGNoYW5faWQsIHVkLT50Y2hhbl9tYXApICYmCisJCSAgICAhdGVz dF9iaXQoY2hhbl9pZCwgdWQtPnJjaGFuX21hcCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoY2hh bl9pZCA9PSBlbmQpCisJCXJldHVybiAtRU5PRU5UOworCisJc2V0X2JpdChjaGFuX2lkLCB1ZC0+ dGNoYW5fbWFwKTsKKwlzZXRfYml0KGNoYW5faWQsIHVkLT5yY2hhbl9tYXApOworCXVjLT50Y2hh biA9ICZ1ZC0+dGNoYW5zW2NoYW5faWRdOworCXVjLT5yY2hhbiA9ICZ1ZC0+cmNoYW5zW2NoYW5f aWRdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWRtYV9nZXRfcmZsb3coc3RydWN0 IHVkbWFfY2hhbiAqdWMsIGludCBmbG93X2lkKQoreworCXN0cnVjdCB1ZG1hX2RldiAqdWQgPSB1 Yy0+dWQ7CisKKwlpZiAoIXVjLT5yY2hhbikgeworCQlkZXZfZXJyKHVkLT5kZXYsICJjaGFuJWQ6 IGRvZXMgbm90IGhhdmUgcmNoYW4/P1xuIiwgdWMtPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCisJaWYgKHVjLT5yZmxvdykgeworCQlkZXZfZGJnKHVkLT5kZXYsICJjaGFuJWQ6IGFscmVh ZHkgaGF2ZSByZmxvdyVkIGFsbG9jYXRlZFxuIiwKKwkJCXVjLT5pZCwgdWMtPnJmbG93LT5pZCk7 CisJCXJldHVybiAwOworCX0KKworCXVjLT5yZmxvdyA9IF9fdWRtYV9nZXRfcmZsb3codWQsIGZs b3dfaWQpOworCWlmIChJU19FUlIodWMtPnJmbG93KSkKKwkJcmV0dXJuIFBUUl9FUlIodWMtPnJm bG93KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1ZG1hX3B1dF9yY2hhbihzdHJ1 Y3QgdWRtYV9jaGFuICp1YykKK3sKKwlzdHJ1Y3QgdWRtYV9kZXYgKnVkID0gdWMtPnVkOworCisJ aWYgKHVjLT5yY2hhbikgeworCQlkZXZfZGJnKHVkLT5kZXYsICJjaGFuJWQ6IHB1dCByY2hhbiVk XG4iLCB1Yy0+aWQsCisJCQl1Yy0+cmNoYW4tPmlkKTsKKwkJY2xlYXJfYml0KHVjLT5yY2hhbi0+ aWQsIHVkLT5yY2hhbl9tYXApOworCQl1Yy0+cmNoYW4gPSBOVUxMOworCX0KK30KKworc3RhdGlj IHZvaWQgdWRtYV9wdXRfdGNoYW4oc3RydWN0IHVkbWFfY2hhbiAqdWMpCit7CisJc3RydWN0IHVk bWFfZGV2ICp1ZCA9IHVjLT51ZDsKKworCWlmICh1Yy0+dGNoYW4pIHsKKwkJZGV2X2RiZyh1ZC0+ ZGV2LCAiY2hhbiVkOiBwdXQgdGNoYW4lZFxuIiwgdWMtPmlkLAorCQkJdWMtPnRjaGFuLT5pZCk7 CisJCWNsZWFyX2JpdCh1Yy0+dGNoYW4tPmlkLCB1ZC0+dGNoYW5fbWFwKTsKKwkJdWMtPnRjaGFu ID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVkbWFfcHV0X3JmbG93KHN0cnVjdCB1ZG1h X2NoYW4gKnVjKQoreworCXN0cnVjdCB1ZG1hX2RldiAqdWQgPSB1Yy0+dWQ7CisKKwlpZiAodWMt PnJmbG93KSB7CisJCWRldl9kYmcodWQtPmRldiwgImNoYW4lZDogcHV0IHJmbG93JWRcbiIsIHVj LT5pZCwKKwkJCXVjLT5yZmxvdy0+aWQpOworCQlfX3VkbWFfcHV0X3JmbG93KHVkLCB1Yy0+cmZs b3cpOworCQl1Yy0+cmZsb3cgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgdWRtYV9mcmVl X3R4X3Jlc291cmNlcyhzdHJ1Y3QgdWRtYV9jaGFuICp1YykKK3sKKwlpZiAoIXVjLT50Y2hhbikK KwkJcmV0dXJuOworCisJazNfcmluZ2FjY19yaW5nX2ZyZWUodWMtPnRjaGFuLT50X3JpbmcpOwor CWszX3JpbmdhY2NfcmluZ19mcmVlKHVjLT50Y2hhbi0+dGNfcmluZyk7CisJdWMtPnRjaGFuLT50 X3JpbmcgPSBOVUxMOworCXVjLT50Y2hhbi0+dGNfcmluZyA9IE5VTEw7CisKKwl1ZG1hX3B1dF90 Y2hhbih1Yyk7Cit9CisKK3N0YXRpYyBpbnQgdWRtYV9hbGxvY190eF9yZXNvdXJjZXMoc3RydWN0 IHVkbWFfY2hhbiAqdWMpCit7CisJc3RydWN0IGszX3JpbmdfY2ZnIHJpbmdfY2ZnOworCXN0cnVj dCB1ZG1hX2RldiAqdWQgPSB1Yy0+dWQ7CisJaW50IHJldDsKKworCXJldCA9IHVkbWFfZ2V0X3Rj aGFuKHVjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdWMtPnRjaGFuLT50X3Jpbmcg PSBrM19yaW5nYWNjX3JlcXVlc3RfcmluZyh1ZC0+cmluZ2FjYywKKwkJCQkJCSAgICB1Yy0+dGNo YW4tPmlkLCAwKTsKKwlpZiAoIXVjLT50Y2hhbi0+dF9yaW5nKSB7CisJCXJldCA9IC1FQlVTWTsK KwkJZ290byBlcnJfdHhfcmluZzsKKwl9CisKKwl1Yy0+dGNoYW4tPnRjX3JpbmcgPSBrM19yaW5n YWNjX3JlcXVlc3RfcmluZyh1ZC0+cmluZ2FjYywgLTEsIDApOworCWlmICghdWMtPnRjaGFuLT50 Y19yaW5nKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfdHhjX3Jpbmc7CisJfQorCisJ bWVtc2V0KCZyaW5nX2NmZywgMCwgc2l6ZW9mKHJpbmdfY2ZnKSk7CisJcmluZ19jZmcuc2l6ZSA9 IEszX1VETUFfREVGQVVMVF9SSU5HX1NJWkU7CisJcmluZ19jZmcuZWxtX3NpemUgPSBLM19SSU5H QUNDX1JJTkdfRUxTSVpFXzg7CisJcmluZ19jZmcubW9kZSA9IEszX1JJTkdBQ0NfUklOR19NT0RF X01FU1NBR0U7CisKKwlyZXQgPSBrM19yaW5nYWNjX3JpbmdfY2ZnKHVjLT50Y2hhbi0+dF9yaW5n LCAmcmluZ19jZmcpOworCXJldCB8PSBrM19yaW5nYWNjX3JpbmdfY2ZnKHVjLT50Y2hhbi0+dGNf cmluZywgJnJpbmdfY2ZnKTsKKworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JpbmdjZmc7CisKKwly ZXR1cm4gMDsKKworZXJyX3JpbmdjZmc6CisJazNfcmluZ2FjY19yaW5nX2ZyZWUodWMtPnRjaGFu LT50Y19yaW5nKTsKKwl1Yy0+dGNoYW4tPnRjX3JpbmcgPSBOVUxMOworZXJyX3R4Y19yaW5nOgor CWszX3JpbmdhY2NfcmluZ19mcmVlKHVjLT50Y2hhbi0+dF9yaW5nKTsKKwl1Yy0+dGNoYW4tPnRf cmluZyA9IE5VTEw7CitlcnJfdHhfcmluZzoKKwl1ZG1hX3B1dF90Y2hhbih1Yyk7CisKKwlyZXR1 cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB1ZG1hX2ZyZWVfcnhfcmVzb3VyY2VzKHN0cnVjdCB1 ZG1hX2NoYW4gKnVjKQoreworCWlmICghdWMtPnJjaGFuKQorCQlyZXR1cm47CisKKwlpZiAodWMt PnJmbG93KSB7CisJCXN0cnVjdCB1ZG1hX3JmbG93ICpyZmxvdyA9IHVjLT5yZmxvdzsKKworCQlr M19yaW5nYWNjX3JpbmdfZnJlZShyZmxvdy0+ZmRfcmluZyk7CisJCWszX3JpbmdhY2NfcmluZ19m cmVlKHJmbG93LT5yX3JpbmcpOworCQlyZmxvdy0+ZmRfcmluZyA9IE5VTEw7CisJCXJmbG93LT5y X3JpbmcgPSBOVUxMOworCisJCXVkbWFfcHV0X3JmbG93KHVjKTsKKwl9CisKKwl1ZG1hX3B1dF9y Y2hhbih1Yyk7Cit9CisKK3N0YXRpYyBpbnQgdWRtYV9hbGxvY19yeF9yZXNvdXJjZXMoc3RydWN0 IHVkbWFfY2hhbiAqdWMpCit7CisJc3RydWN0IHVkbWFfZGV2ICp1ZCA9IHVjLT51ZDsKKwlzdHJ1 Y3QgazNfcmluZ19jZmcgcmluZ19jZmc7CisJc3RydWN0IHVkbWFfcmZsb3cgKnJmbG93OworCWlu dCBmZF9yaW5nX2lkOworCWludCByZXQ7CisKKwlyZXQgPSB1ZG1hX2dldF9yY2hhbih1Yyk7CisJ aWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEZvciBNRU1fVE9fTUVNIHdlIGRvbid0IG5l ZWQgcmZsb3cgb3IgcmluZ3MgKi8KKwlpZiAodWMtPmNvbmZpZy5kaXIgPT0gRE1BX01FTV9UT19N RU0pCisJCXJldHVybiAwOworCisJcmV0ID0gdWRtYV9nZXRfcmZsb3codWMsIHVjLT5yY2hhbi0+ aWQpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9yZmxvdzsKKwl9 CisKKwlyZmxvdyA9IHVjLT5yZmxvdzsKKwlmZF9yaW5nX2lkID0gdWQtPnRjaGFuX2NudCArIHVk LT5lY2hhbl9jbnQgKyB1Yy0+cmNoYW4tPmlkOworCXJmbG93LT5mZF9yaW5nID0gazNfcmluZ2Fj Y19yZXF1ZXN0X3JpbmcodWQtPnJpbmdhY2MsIGZkX3JpbmdfaWQsIDApOworCWlmICghcmZsb3ct PmZkX3JpbmcpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9yeF9yaW5nOworCX0KKwor CXJmbG93LT5yX3JpbmcgPSBrM19yaW5nYWNjX3JlcXVlc3RfcmluZyh1ZC0+cmluZ2FjYywgLTEs IDApOworCWlmICghcmZsb3ctPnJfcmluZykgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJy X3J4Y19yaW5nOworCX0KKworCW1lbXNldCgmcmluZ19jZmcsIDAsIHNpemVvZihyaW5nX2NmZykp OworCisJaWYgKHVjLT5jb25maWcucGt0X21vZGUpCisJCXJpbmdfY2ZnLnNpemUgPSBTR19NQVhf U0VHTUVOVFM7CisJZWxzZQorCQlyaW5nX2NmZy5zaXplID0gSzNfVURNQV9ERUZBVUxUX1JJTkdf U0laRTsKKworCXJpbmdfY2ZnLmVsbV9zaXplID0gSzNfUklOR0FDQ19SSU5HX0VMU0laRV84Owor CXJpbmdfY2ZnLm1vZGUgPSBLM19SSU5HQUNDX1JJTkdfTU9ERV9NRVNTQUdFOworCisJcmV0ID0g azNfcmluZ2FjY19yaW5nX2NmZyhyZmxvdy0+ZmRfcmluZywgJnJpbmdfY2ZnKTsKKwlyaW5nX2Nm Zy5zaXplID0gSzNfVURNQV9ERUZBVUxUX1JJTkdfU0laRTsKKwlyZXQgfD0gazNfcmluZ2FjY19y aW5nX2NmZyhyZmxvdy0+cl9yaW5nLCAmcmluZ19jZmcpOworCisJaWYgKHJldCkKKwkJZ290byBl cnJfcmluZ2NmZzsKKworCXJldHVybiAwOworCitlcnJfcmluZ2NmZzoKKwlrM19yaW5nYWNjX3Jp bmdfZnJlZShyZmxvdy0+cl9yaW5nKTsKKwlyZmxvdy0+cl9yaW5nID0gTlVMTDsKK2Vycl9yeGNf cmluZzoKKwlrM19yaW5nYWNjX3JpbmdfZnJlZShyZmxvdy0+ZmRfcmluZyk7CisJcmZsb3ctPmZk X3JpbmcgPSBOVUxMOworZXJyX3J4X3Jpbmc6CisJdWRtYV9wdXRfcmZsb3codWMpOworZXJyX3Jm bG93OgorCXVkbWFfcHV0X3JjaGFuKHVjKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUg VElTQ0lfVENIQU5fVkFMSURfUEFSQU1TICgJCQkJXAorCVRJX1NDSV9NU0dfVkFMVUVfUk1fVURN QVBfQ0hfUEFVU0VfT05fRVJSX1ZBTElEIHwJXAorCVRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBf Q0hfVFhfRklMVF9FSU5GT19WQUxJRCB8CVwKKwlUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0NI X1RYX0ZJTFRfUFNXT1JEU19WQUxJRCB8CVwKKwlUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0NI X0NIQU5fVFlQRV9WQUxJRCB8CQlcCisJVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9DSF9UWF9T VVBSX1REUEtUX1ZBTElEIHwJXAorCVRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfQ0hfRkVUQ0hf U0laRV9WQUxJRCB8CQlcCisJVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9DSF9DUV9RTlVNX1ZB TElEKQorCisjZGVmaW5lIFRJU0NJX1JDSEFOX1ZBTElEX1BBUkFNUyAoCQkJCVwKKwlUSV9TQ0lf TVNHX1ZBTFVFX1JNX1VETUFQX0NIX1BBVVNFX09OX0VSUl9WQUxJRCB8CVwKKwlUSV9TQ0lfTVNH X1ZBTFVFX1JNX1VETUFQX0NIX0ZFVENIX1NJWkVfVkFMSUQgfAkJXAorCVRJX1NDSV9NU0dfVkFM VUVfUk1fVURNQVBfQ0hfQ1FfUU5VTV9WQUxJRCB8CQlcCisJVElfU0NJX01TR19WQUxVRV9STV9V RE1BUF9DSF9DSEFOX1RZUEVfVkFMSUQgfAkJXAorCVRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBf Q0hfUlhfSUdOT1JFX1NIT1JUX1ZBTElEIHwJXAorCVRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBf Q0hfUlhfSUdOT1JFX0xPTkdfVkFMSUQgfAlcCisJVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9D SF9SWF9GTE9XSURfU1RBUlRfVkFMSUQgfAlcCisJVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9D SF9SWF9GTE9XSURfQ05UX1ZBTElEKQorCitzdGF0aWMgaW50IHVkbWFfdGlzY2lfbTJtX2NoYW5u ZWxfY29uZmlnKHN0cnVjdCB1ZG1hX2NoYW4gKnVjKQoreworCXN0cnVjdCB1ZG1hX2RldiAqdWQg PSB1Yy0+dWQ7CisJc3RydWN0IHVkbWFfdGlzY2lfcm0gKnRpc2NpX3JtID0gJnVkLT50aXNjaV9y bTsKKwljb25zdCBzdHJ1Y3QgdGlfc2NpX3JtX3VkbWFwX29wcyAqdGlzY2lfb3BzID0gdGlzY2lf cm0tPnRpc2NpX3VkbWFwX29wczsKKwlzdHJ1Y3QgdWRtYV90Y2hhbiAqdGNoYW4gPSB1Yy0+dGNo YW47CisJc3RydWN0IHVkbWFfcmNoYW4gKnJjaGFuID0gdWMtPnJjaGFuOworCWludCByZXQgPSAw OworCisJLyogTm9uIHN5bmNocm9uaXplZCAtIG1lbSB0byBtZW0gdHlwZSBvZiB0cmFuc2ZlciAq LworCWludCB0Y19yaW5nID0gazNfcmluZ2FjY19nZXRfcmluZ19pZCh0Y2hhbi0+dGNfcmluZyk7 CisJc3RydWN0IHRpX3NjaV9tc2dfcm1fdWRtYXBfdHhfY2hfY2ZnIHJlcV90eCA9IHsgMCB9Owor CXN0cnVjdCB0aV9zY2lfbXNnX3JtX3VkbWFwX3J4X2NoX2NmZyByZXFfcnggPSB7IDAgfTsKKwor CXJlcV90eC52YWxpZF9wYXJhbXMgPSBUSVNDSV9UQ0hBTl9WQUxJRF9QQVJBTVM7CisJcmVxX3R4 Lm5hdl9pZCA9IHRpc2NpX3JtLT50aXNjaV9kZXZfaWQ7CisJcmVxX3R4LmluZGV4ID0gdGNoYW4t PmlkOworCXJlcV90eC50eF9jaGFuX3R5cGUgPSBUSV9TQ0lfUk1fVURNQVBfQ0hBTl9UWVBFXzNS RFBfQkNPUFlfUEJSUjsKKwlyZXFfdHgudHhfZmV0Y2hfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY3Bw aTVfZGVzY19oZHJfdCkgPj4gMjsKKwlyZXFfdHgudHhjcV9xbnVtID0gdGNfcmluZzsKKworCXJl dCA9IHRpc2NpX29wcy0+dHhfY2hfY2ZnKHRpc2NpX3JtLT50aXNjaSwgJnJlcV90eCk7CisJaWYg KHJldCkgeworCQlkZXZfZXJyKHVkLT5kZXYsICJ0Y2hhbiVkIGNmZyBmYWlsZWQgJWRcbiIsIHRj aGFuLT5pZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXFfcngudmFsaWRfcGFyYW1z ID0gVElTQ0lfUkNIQU5fVkFMSURfUEFSQU1TOworCXJlcV9yeC5uYXZfaWQgPSB0aXNjaV9ybS0+ dGlzY2lfZGV2X2lkOworCXJlcV9yeC5pbmRleCA9IHJjaGFuLT5pZDsKKwlyZXFfcngucnhfZmV0 Y2hfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY3BwaTVfZGVzY19oZHJfdCkgPj4gMjsKKwlyZXFfcngu cnhjcV9xbnVtID0gdGNfcmluZzsKKwlyZXFfcngucnhfY2hhbl90eXBlID0gVElfU0NJX1JNX1VE TUFQX0NIQU5fVFlQRV8zUkRQX0JDT1BZX1BCUlI7CisKKwlyZXQgPSB0aXNjaV9vcHMtPnJ4X2No X2NmZyh0aXNjaV9ybS0+dGlzY2ksICZyZXFfcngpOworCWlmIChyZXQpCisJCWRldl9lcnIodWQt PmRldiwgInJjaGFuJWQgYWxsb2MgZmFpbGVkICVkXG4iLCByY2hhbi0+aWQsIHJldCk7CisKKwly ZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHVkbWFfdGlzY2lfdHhfY2hhbm5lbF9jb25maWco c3RydWN0IHVkbWFfY2hhbiAqdWMpCit7CisJc3RydWN0IHVkbWFfZGV2ICp1ZCA9IHVjLT51ZDsK KwlzdHJ1Y3QgdWRtYV90aXNjaV9ybSAqdGlzY2lfcm0gPSAmdWQtPnRpc2NpX3JtOworCWNvbnN0 IHN0cnVjdCB0aV9zY2lfcm1fdWRtYXBfb3BzICp0aXNjaV9vcHMgPSB0aXNjaV9ybS0+dGlzY2lf dWRtYXBfb3BzOworCXN0cnVjdCB1ZG1hX3RjaGFuICp0Y2hhbiA9IHVjLT50Y2hhbjsKKwlpbnQg dGNfcmluZyA9IGszX3JpbmdhY2NfZ2V0X3JpbmdfaWQodGNoYW4tPnRjX3JpbmcpOworCXN0cnVj dCB0aV9zY2lfbXNnX3JtX3VkbWFwX3R4X2NoX2NmZyByZXFfdHggPSB7IDAgfTsKKwl1MzIgbW9k ZSwgZmV0Y2hfc2l6ZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh1Yy0+Y29uZmlnLnBrdF9tb2Rl KSB7CisJCW1vZGUgPSBUSV9TQ0lfUk1fVURNQVBfQ0hBTl9UWVBFX1BLVF9QQlJSOworCQlmZXRj aF9zaXplID0gY3BwaTVfaGRlc2NfY2FsY19zaXplKHVjLT5jb25maWcubmVlZHNfZXBpYiwKKwkJ CQkJCSAgIHVjLT5jb25maWcucHNkX3NpemUsIDApOworCX0gZWxzZSB7CisJCW1vZGUgPSBUSV9T Q0lfUk1fVURNQVBfQ0hBTl9UWVBFXzNSRFBfUEJSUjsKKwkJZmV0Y2hfc2l6ZSA9IHNpemVvZihz dHJ1Y3QgY3BwaTVfZGVzY19oZHJfdCk7CisJfQorCisJcmVxX3R4LnZhbGlkX3BhcmFtcyA9IFRJ U0NJX1RDSEFOX1ZBTElEX1BBUkFNUzsKKwlyZXFfdHgubmF2X2lkID0gdGlzY2lfcm0tPnRpc2Np X2Rldl9pZDsKKwlyZXFfdHguaW5kZXggPSB0Y2hhbi0+aWQ7CisJcmVxX3R4LnR4X2NoYW5fdHlw ZSA9IG1vZGU7CisJcmVxX3R4LnR4X3N1cHJfdGRwa3QgPSB1Yy0+Y29uZmlnLm5vdGRwa3Q7CisJ cmVxX3R4LnR4X2ZldGNoX3NpemUgPSBmZXRjaF9zaXplID4+IDI7CisJcmVxX3R4LnR4Y3FfcW51 bSA9IHRjX3Jpbmc7CisKKwlyZXQgPSB0aXNjaV9vcHMtPnR4X2NoX2NmZyh0aXNjaV9ybS0+dGlz Y2ksICZyZXFfdHgpOworCWlmIChyZXQpCisJCWRldl9lcnIodWQtPmRldiwgInRjaGFuJWQgY2Zn IGZhaWxlZCAlZFxuIiwgdGNoYW4tPmlkLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3Rh dGljIGludCB1ZG1hX3Rpc2NpX3J4X2NoYW5uZWxfY29uZmlnKHN0cnVjdCB1ZG1hX2NoYW4gKnVj KQoreworCXN0cnVjdCB1ZG1hX2RldiAqdWQgPSB1Yy0+dWQ7CisJc3RydWN0IHVkbWFfdGlzY2lf cm0gKnRpc2NpX3JtID0gJnVkLT50aXNjaV9ybTsKKwljb25zdCBzdHJ1Y3QgdGlfc2NpX3JtX3Vk bWFwX29wcyAqdGlzY2lfb3BzID0gdGlzY2lfcm0tPnRpc2NpX3VkbWFwX29wczsKKwlzdHJ1Y3Qg dWRtYV9yY2hhbiAqcmNoYW4gPSB1Yy0+cmNoYW47CisJaW50IGZkX3JpbmcgPSBrM19yaW5nYWNj X2dldF9yaW5nX2lkKHVjLT5yZmxvdy0+ZmRfcmluZyk7CisJaW50IHJ4X3JpbmcgPSBrM19yaW5n YWNjX2dldF9yaW5nX2lkKHVjLT5yZmxvdy0+cl9yaW5nKTsKKwlzdHJ1Y3QgdGlfc2NpX21zZ19y bV91ZG1hcF9yeF9jaF9jZmcgcmVxX3J4ID0geyAwIH07CisJc3RydWN0IHRpX3NjaV9tc2dfcm1f dWRtYXBfZmxvd19jZmcgZmxvd19yZXEgPSB7IDAgfTsKKwl1MzIgbW9kZSwgZmV0Y2hfc2l6ZTsK KwlpbnQgcmV0ID0gMDsKKworCWlmICh1Yy0+Y29uZmlnLnBrdF9tb2RlKSB7CisJCW1vZGUgPSBU SV9TQ0lfUk1fVURNQVBfQ0hBTl9UWVBFX1BLVF9QQlJSOworCQlmZXRjaF9zaXplID0gY3BwaTVf aGRlc2NfY2FsY19zaXplKHVjLT5jb25maWcubmVlZHNfZXBpYiwKKwkJCQkJCSAgIHVjLT5jb25m aWcucHNkX3NpemUsIDApOworCX0gZWxzZSB7CisJCW1vZGUgPSBUSV9TQ0lfUk1fVURNQVBfQ0hB Tl9UWVBFXzNSRFBfUEJSUjsKKwkJZmV0Y2hfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY3BwaTVfZGVz Y19oZHJfdCk7CisJfQorCisJcmVxX3J4LnZhbGlkX3BhcmFtcyA9IFRJU0NJX1JDSEFOX1ZBTElE X1BBUkFNUzsKKwlyZXFfcngubmF2X2lkID0gdGlzY2lfcm0tPnRpc2NpX2Rldl9pZDsKKwlyZXFf cnguaW5kZXggPSByY2hhbi0+aWQ7CisJcmVxX3J4LnJ4X2ZldGNoX3NpemUgPSAgZmV0Y2hfc2l6 ZSA+PiAyOworCXJlcV9yeC5yeGNxX3FudW0gPSByeF9yaW5nOworCXJlcV9yeC5yeF9jaGFuX3R5 cGUgPSBtb2RlOworCisJcmV0ID0gdGlzY2lfb3BzLT5yeF9jaF9jZmcodGlzY2lfcm0tPnRpc2Np LCAmcmVxX3J4KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIodWQtPmRldiwgInJjaGFuJWQgY2Zn IGZhaWxlZCAlZFxuIiwgcmNoYW4tPmlkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZs b3dfcmVxLnZhbGlkX3BhcmFtcyA9CisJCVRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfRkxPV19F SU5GT19QUkVTRU5UX1ZBTElEIHwKKwkJVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9GTE9XX1BT SU5GT19QUkVTRU5UX1ZBTElEIHwKKwkJVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9GTE9XX0VS Uk9SX0hBTkRMSU5HX1ZBTElEIHwKKwkJVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9GTE9XX0RF U0NfVFlQRV9WQUxJRCB8CisJCVRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfRkxPV19ERVNUX1FO VU1fVkFMSUQgfAorCQlUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0ZMT1dfU1JDX1RBR19ISV9T RUxfVkFMSUQgfAorCQlUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0ZMT1dfU1JDX1RBR19MT19T RUxfVkFMSUQgfAorCQlUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0ZMT1dfREVTVF9UQUdfSElf U0VMX1ZBTElEIHwKKwkJVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9GTE9XX0RFU1RfVEFHX0xP X1NFTF9WQUxJRCB8CisJCVRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfRkxPV19GRFEwX1NaMF9R TlVNX1ZBTElEIHwKKwkJVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9GTE9XX0ZEUTFfUU5VTV9W QUxJRCB8CisJCVRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfRkxPV19GRFEyX1FOVU1fVkFMSUQg fAorCQlUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0ZMT1dfRkRRM19RTlVNX1ZBTElEOworCisJ Zmxvd19yZXEubmF2X2lkID0gdGlzY2lfcm0tPnRpc2NpX2Rldl9pZDsKKwlmbG93X3JlcS5mbG93 X2luZGV4ID0gcmNoYW4tPmlkOworCisJaWYgKHVjLT5jb25maWcubmVlZHNfZXBpYikKKwkJZmxv d19yZXEucnhfZWluZm9fcHJlc2VudCA9IDE7CisJZWxzZQorCQlmbG93X3JlcS5yeF9laW5mb19w cmVzZW50ID0gMDsKKwlpZiAodWMtPmNvbmZpZy5wc2Rfc2l6ZSkKKwkJZmxvd19yZXEucnhfcHNp bmZvX3ByZXNlbnQgPSAxOworCWVsc2UKKwkJZmxvd19yZXEucnhfcHNpbmZvX3ByZXNlbnQgPSAw OworCWZsb3dfcmVxLnJ4X2Vycm9yX2hhbmRsaW5nID0gMTsKKwlmbG93X3JlcS5yeF9kZXN0X3Fu dW0gPSByeF9yaW5nOworCWZsb3dfcmVxLnJ4X3NyY190YWdfaGlfc2VsID0gVURNQV9SRkxPV19T UkNUQUdfTk9ORTsKKwlmbG93X3JlcS5yeF9zcmNfdGFnX2xvX3NlbCA9IFVETUFfUkZMT1dfU1JD VEFHX1NSQ19UQUc7CisJZmxvd19yZXEucnhfZGVzdF90YWdfaGlfc2VsID0gVURNQV9SRkxPV19E U1RUQUdfRFNUX1RBR19ISTsKKwlmbG93X3JlcS5yeF9kZXN0X3RhZ19sb19zZWwgPSBVRE1BX1JG TE9XX0RTVFRBR19EU1RfVEFHX0xPOworCWZsb3dfcmVxLnJ4X2ZkcTBfc3owX3FudW0gPSBmZF9y aW5nOworCWZsb3dfcmVxLnJ4X2ZkcTFfcW51bSA9IGZkX3Jpbmc7CisJZmxvd19yZXEucnhfZmRx Ml9xbnVtID0gZmRfcmluZzsKKwlmbG93X3JlcS5yeF9mZHEzX3FudW0gPSBmZF9yaW5nOworCisJ cmV0ID0gdGlzY2lfb3BzLT5yeF9mbG93X2NmZyh0aXNjaV9ybS0+dGlzY2ksICZmbG93X3JlcSk7 CisKKwlpZiAocmV0KQorCQlkZXZfZXJyKHVkLT5kZXYsICJmbG93JWQgY29uZmlnIGZhaWxlZDog JWRcbiIsIHJjaGFuLT5pZCwgcmV0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVk bWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVj dCB1ZG1hX2NoYW4gKnVjID0gdG9fdWRtYV9jaGFuKGNoYW4pOworCXN0cnVjdCB1ZG1hX2RldiAq dWQgPSB0b191ZG1hX2RldihjaGFuLT5kZXZpY2UpOworCWNvbnN0IHN0cnVjdCB1ZG1hX21hdGNo X2RhdGEgKm1hdGNoX2RhdGEgPSB1ZC0+bWF0Y2hfZGF0YTsKKwlzdHJ1Y3QgazNfcmluZyAqaXJx X3Jpbmc7CisJdTMyIGlycV91ZG1hX2lkeDsKKwlpbnQgcmV0OworCisJaWYgKHVjLT5jb25maWcu cGt0X21vZGUgfHwgdWMtPmNvbmZpZy5kaXIgPT0gRE1BX01FTV9UT19NRU0pIHsKKwkJdWMtPnVz ZV9kbWFfcG9vbCA9IHRydWU7CisJCS8qIGluIGNhc2Ugb2YgTUVNX1RPX01FTSB3ZSBoYXZlIG1h eGltdW0gb2YgdHdvIFRScyAqLworCQlpZiAodWMtPmNvbmZpZy5kaXIgPT0gRE1BX01FTV9UT19N RU0pIHsKKwkJCXVjLT5jb25maWcuaGRlc2Nfc2l6ZSA9IGNwcGk1X3RyZGVzY19jYWxjX3NpemUo CisJCQkJCXNpemVvZihzdHJ1Y3QgY3BwaTVfdHJfdHlwZTE1X3QpLCAyKTsKKwkJCXVjLT5jb25m aWcucGt0X21vZGUgPSBmYWxzZTsKKwkJfQorCX0KKworCWlmICh1Yy0+dXNlX2RtYV9wb29sKSB7 CisJCXVjLT5oZGVzY19wb29sID0gZG1hX3Bvb2xfY3JlYXRlKHVjLT5uYW1lLCB1ZC0+ZGRldi5k ZXYsCisJCQkJCQkgdWMtPmNvbmZpZy5oZGVzY19zaXplLAorCQkJCQkJIHVkLT5kZXNjX2FsaWdu LAorCQkJCQkJIDApOworCQlpZiAoIXVjLT5oZGVzY19wb29sKSB7CisJCQlkZXZfZXJyKHVkLT5k ZGV2LmRldiwKKwkJCQkiRGVzY3JpcHRvciBwb29sIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJ CXVjLT51c2VfZG1hX3Bvb2wgPSBmYWxzZTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQor CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgY29tcGxldGlvbiBpcyBpbiBhIGtub3duIHN0 YXRlOgorCSAqIE5vIHRlYXJkb3duLCB0aGUgY2hhbm5lbCBpcyBpZGxlCisJICovCisJcmVpbml0 X2NvbXBsZXRpb24oJnVjLT50ZWFyZG93bl9jb21wbGV0ZWQpOworCWNvbXBsZXRlX2FsbCgmdWMt PnRlYXJkb3duX2NvbXBsZXRlZCk7CisJdWMtPnN0YXRlID0gVURNQV9DSEFOX0lTX0lETEU7CisK Kwlzd2l0Y2ggKHVjLT5jb25maWcuZGlyKSB7CisJY2FzZSBETUFfTUVNX1RPX01FTToKKwkJLyog Tm9uIHN5bmNocm9uaXplZCAtIG1lbSB0byBtZW0gdHlwZSBvZiB0cmFuc2ZlciAqLworCQlkZXZf ZGJnKHVjLT51ZC0+ZGV2LCAiJXM6IGNoYW4lZCBhcyBNRU0tdG8tTUVNXG4iLCBfX2Z1bmNfXywK KwkJCXVjLT5pZCk7CisKKwkJcmV0ID0gdWRtYV9nZXRfY2hhbl9wYWlyKHVjKTsKKwkJaWYgKHJl dCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gdWRtYV9hbGxvY190eF9yZXNvdXJjZXModWMp OworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSB1ZG1hX2FsbG9jX3J4X3Jl c291cmNlcyh1Yyk7CisJCWlmIChyZXQpIHsKKwkJCXVkbWFfZnJlZV90eF9yZXNvdXJjZXModWMp OworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXVjLT5jb25maWcuc3JjX3RocmVhZCA9IHVkLT5w c2lsX2Jhc2UgKyB1Yy0+dGNoYW4tPmlkOworCQl1Yy0+Y29uZmlnLmRzdF90aHJlYWQgPSAodWQt PnBzaWxfYmFzZSArIHVjLT5yY2hhbi0+aWQpIHwKKwkJCQkJSzNfUFNJTF9EU1RfVEhSRUFEX0lE X09GRlNFVDsKKworCQlpcnFfcmluZyA9IHVjLT50Y2hhbi0+dGNfcmluZzsKKwkJaXJxX3VkbWFf aWR4ID0gdWMtPnRjaGFuLT5pZDsKKworCQlyZXQgPSB1ZG1hX3Rpc2NpX20ybV9jaGFubmVsX2Nv bmZpZyh1Yyk7CisJCWJyZWFrOworCWNhc2UgRE1BX01FTV9UT19ERVY6CisJCS8qIFNsYXZlIHRy YW5zZmVyIHN5bmNocm9uaXplZCAtIG1lbSB0byBkZXYgKFRYKSB0cmFzbmZlciAqLworCQlkZXZf ZGJnKHVjLT51ZC0+ZGV2LCAiJXM6IGNoYW4lZCBhcyBNRU0tdG8tREVWXG4iLCBfX2Z1bmNfXywK KwkJCXVjLT5pZCk7CisKKwkJcmV0ID0gdWRtYV9hbGxvY190eF9yZXNvdXJjZXModWMpOworCQlp ZiAocmV0KSB7CisJCQl1Yy0+Y29uZmlnLnJlbW90ZV90aHJlYWRfaWQgPSAtMTsKKwkJCXJldHVy biByZXQ7CisJCX0KKworCQl1Yy0+Y29uZmlnLnNyY190aHJlYWQgPSB1ZC0+cHNpbF9iYXNlICsg dWMtPnRjaGFuLT5pZDsKKwkJdWMtPmNvbmZpZy5kc3RfdGhyZWFkID0gdWMtPmNvbmZpZy5yZW1v dGVfdGhyZWFkX2lkOworCQl1Yy0+Y29uZmlnLmRzdF90aHJlYWQgfD0gSzNfUFNJTF9EU1RfVEhS RUFEX0lEX09GRlNFVDsKKworCQlpcnFfcmluZyA9IHVjLT50Y2hhbi0+dGNfcmluZzsKKwkJaXJx X3VkbWFfaWR4ID0gdWMtPnRjaGFuLT5pZDsKKworCQlyZXQgPSB1ZG1hX3Rpc2NpX3R4X2NoYW5u ZWxfY29uZmlnKHVjKTsKKwkJYnJlYWs7CisJY2FzZSBETUFfREVWX1RPX01FTToKKwkJLyogU2xh dmUgdHJhbnNmZXIgc3luY2hyb25pemVkIC0gZGV2IHRvIG1lbSAoUlgpIHRyYXNuZmVyICovCisJ CWRldl9kYmcodWMtPnVkLT5kZXYsICIlczogY2hhbiVkIGFzIERFVi10by1NRU1cbiIsIF9fZnVu Y19fLAorCQkJdWMtPmlkKTsKKworCQlyZXQgPSB1ZG1hX2FsbG9jX3J4X3Jlc291cmNlcyh1Yyk7 CisJCWlmIChyZXQpIHsKKwkJCXVjLT5jb25maWcucmVtb3RlX3RocmVhZF9pZCA9IC0xOworCQkJ cmV0dXJuIHJldDsKKwkJfQorCisJCXVjLT5jb25maWcuc3JjX3RocmVhZCA9IHVjLT5jb25maWcu cmVtb3RlX3RocmVhZF9pZDsKKwkJdWMtPmNvbmZpZy5kc3RfdGhyZWFkID0gKHVkLT5wc2lsX2Jh c2UgKyB1Yy0+cmNoYW4tPmlkKSB8CisJCQkJCUszX1BTSUxfRFNUX1RIUkVBRF9JRF9PRkZTRVQ7 CisKKwkJaXJxX3JpbmcgPSB1Yy0+cmZsb3ctPnJfcmluZzsKKwkJaXJxX3VkbWFfaWR4ID0gbWF0 Y2hfZGF0YS0+cmNoYW5fb2VzX29mZnNldCArIHVjLT5yY2hhbi0+aWQ7CisKKwkJcmV0ID0gdWRt YV90aXNjaV9yeF9jaGFubmVsX2NvbmZpZyh1Yyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8q IENhbiBub3QgaGFwcGVuICovCisJCWRldl9lcnIodWMtPnVkLT5kZXYsICIlczogY2hhbiVkIGlu dmFsaWQgZGlyZWN0aW9uICgldSlcbiIsCisJCQlfX2Z1bmNfXywgdWMtPmlkLCB1Yy0+Y29uZmln LmRpcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNoZWNrIGlmIHRoZSBjaGFubmVs IGNvbmZpZ3VyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgKi8KKwlpZiAocmV0KQorCQlnb3RvIGVycl9y ZXNfZnJlZTsKKworCWlmICh1ZG1hX2lzX2NoYW5fcnVubmluZyh1YykpIHsKKwkJZGV2X3dhcm4o dWQtPmRldiwgImNoYW4lZDogaXMgcnVubmluZyFcbiIsIHVjLT5pZCk7CisJCXVkbWFfc3RvcCh1 Yyk7CisJCWlmICh1ZG1hX2lzX2NoYW5fcnVubmluZyh1YykpIHsKKwkJCWRldl9lcnIodWQtPmRl diwgImNoYW4lZDogd29uJ3Qgc3RvcCFcbiIsIHVjLT5pZCk7CisJCQlnb3RvIGVycl9yZXNfZnJl ZTsKKwkJfQorCX0KKworCS8qIFBTSS1MIHBhaXJpbmcgKi8KKwlyZXQgPSBuYXZzc19wc2lsX3Bh aXIodWQsIHVjLT5jb25maWcuc3JjX3RocmVhZCwgdWMtPmNvbmZpZy5kc3RfdGhyZWFkKTsKKwlp ZiAocmV0KSB7CisJCWRldl9lcnIodWQtPmRldiwgIlBTSS1MIHBhaXJpbmcgZmFpbGVkOiAweCUw NHggLT4gMHglMDR4XG4iLAorCQkJdWMtPmNvbmZpZy5zcmNfdGhyZWFkLCB1Yy0+Y29uZmlnLmRz dF90aHJlYWQpOworCQlnb3RvIGVycl9yZXNfZnJlZTsKKwl9CisKKwl1Yy0+cHNpbF9wYWlyZWQg PSB0cnVlOworCisJdWMtPmlycV9udW1fcmluZyA9IGszX3JpbmdhY2NfZ2V0X3JpbmdfaXJxX251 bShpcnFfcmluZyk7CisJaWYgKHVjLT5pcnFfbnVtX3JpbmcgPD0gMCkgeworCQlkZXZfZXJyKHVk LT5kZXYsICJGYWlsZWQgdG8gZ2V0IHJpbmcgaXJxIChpbmRleDogJXUpXG4iLAorCQkJazNfcmlu Z2FjY19nZXRfcmluZ19pZChpcnFfcmluZykpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVy cl9wc2lfZnJlZTsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycSh1Yy0+aXJxX251bV9yaW5nLCB1 ZG1hX3JpbmdfaXJxX2hhbmRsZXIsCisJCQkgIElSUUZfVFJJR0dFUl9ISUdILCB1Yy0+bmFtZSwg dWMpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycih1ZC0+ZGV2LCAiY2hhbiVkOiByaW5nIGlycSBy ZXF1ZXN0IGZhaWxlZFxuIiwgdWMtPmlkKTsKKwkJZ290byBlcnJfaXJxX2ZyZWU7CisJfQorCisJ LyogRXZlbnQgZnJvbSBVRE1BIChUUiBldmVudHMpIG9ubHkgbmVlZGVkIGZvciBzbGF2ZSBUUiBt b2RlIGNoYW5uZWxzICovCisJaWYgKGlzX3NsYXZlX2RpcmVjdGlvbih1Yy0+Y29uZmlnLmRpcikg JiYgIXVjLT5jb25maWcucGt0X21vZGUpIHsKKwkJdWMtPmlycV9udW1fdWRtYSA9IHRpX3NjaV9p bnRhX21zaV9nZXRfdmlycSh1ZC0+ZGV2LAorCQkJCQkJCSAgICBpcnFfdWRtYV9pZHgpOworCQlp ZiAodWMtPmlycV9udW1fdWRtYSA8PSAwKSB7CisJCQlkZXZfZXJyKHVkLT5kZXYsICJGYWlsZWQg dG8gZ2V0IHVkbWEgaXJxIChpbmRleDogJXUpXG4iLAorCQkJCWlycV91ZG1hX2lkeCk7CisJCQlm cmVlX2lycSh1Yy0+aXJxX251bV9yaW5nLCB1Yyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290 byBlcnJfaXJxX2ZyZWU7CisJCX0KKworCQlyZXQgPSByZXF1ZXN0X2lycSh1Yy0+aXJxX251bV91 ZG1hLCB1ZG1hX3VkbWFfaXJxX2hhbmRsZXIsIDAsCisJCQkJICB1Yy0+bmFtZSwgdWMpOworCQlp ZiAocmV0KSB7CisJCQlkZXZfZXJyKHVkLT5kZXYsICJjaGFuJWQ6IFVETUEgaXJxIHJlcXVlc3Qg ZmFpbGVkXG4iLAorCQkJCXVjLT5pZCk7CisJCQlmcmVlX2lycSh1Yy0+aXJxX251bV9yaW5nLCB1 Yyk7CisJCQlnb3RvIGVycl9pcnFfZnJlZTsKKwkJfQorCX0gZWxzZSB7CisJCXVjLT5pcnFfbnVt X3VkbWEgPSAwOworCX0KKworCXVkbWFfcmVzZXRfcmluZ3ModWMpOworCisJSU5JVF9ERUxBWUVE X1dPUktfT05TVEFDSygmdWMtPnR4X2RyYWluLndvcmssCisJCQkJICB1ZG1hX2NoZWNrX3R4X2Nv bXBsZXRpb24pOworCXJldHVybiAwOworCitlcnJfaXJxX2ZyZWU6CisJdWMtPmlycV9udW1fcmlu ZyA9IDA7CisJdWMtPmlycV9udW1fdWRtYSA9IDA7CitlcnJfcHNpX2ZyZWU6CisJbmF2c3NfcHNp bF91bnBhaXIodWQsIHVjLT5jb25maWcuc3JjX3RocmVhZCwgdWMtPmNvbmZpZy5kc3RfdGhyZWFk KTsKKwl1Yy0+cHNpbF9wYWlyZWQgPSBmYWxzZTsKK2Vycl9yZXNfZnJlZToKKwl1ZG1hX2ZyZWVf dHhfcmVzb3VyY2VzKHVjKTsKKwl1ZG1hX2ZyZWVfcnhfcmVzb3VyY2VzKHVjKTsKKworCXVkbWFf cmVzZXRfdWNoYW4odWMpOworCisJaWYgKHVjLT51c2VfZG1hX3Bvb2wpIHsKKwkJZG1hX3Bvb2xf ZGVzdHJveSh1Yy0+aGRlc2NfcG9vbCk7CisJCXVjLT51c2VfZG1hX3Bvb2wgPSBmYWxzZTsKKwl9 CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHVkbWFfc2xhdmVfY29uZmlnKHN0cnVj dCBkbWFfY2hhbiAqY2hhbiwKKwkJCSAgICAgc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKmNmZykK K3sKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IHRvX3VkbWFfY2hhbihjaGFuKTsKKworCW1lbWNw eSgmdWMtPmNmZywgY2ZnLCBzaXplb2YodWMtPmNmZykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBzdHJ1Y3QgdWRtYV9kZXNjICp1ZG1hX2FsbG9jX3RyX2Rlc2Moc3RydWN0IHVkbWFfY2hh biAqdWMsCisJCQkJCSAgICBzaXplX3QgdHJfc2l6ZSwgaW50IHRyX2NvdW50LAorCQkJCQkgICAg ZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpcikKK3sKKwlzdHJ1Y3QgdWRtYV9od2Rlc2Mg Kmh3ZGVzYzsKKwlzdHJ1Y3QgY3BwaTVfZGVzY19oZHJfdCAqdHJfZGVzYzsKKwlzdHJ1Y3QgdWRt YV9kZXNjICpkOworCXUzMiByZWxvYWRfY291bnQgPSAwOworCXUzMiByaW5nX2lkOworCisJc3dp dGNoICh0cl9zaXplKSB7CisJY2FzZSAxNjoKKwljYXNlIDMyOgorCWNhc2UgNjQ6CisJY2FzZSAx Mjg6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIodWMtPnVkLT5kZXYsICJVbnN1cHBv cnRlZCBUUiBzaXplIG9mICV6dVxuIiwgdHJfc2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKwor CS8qIFdlIGhhdmUgb25seSBvbmUgZGVzY3JpcHRvciBjb250YWluaW5nIG11bHRpcGxlIFRScyAq LworCWQgPSBremFsbG9jKHNpemVvZigqZCkgKyBzaXplb2YoZC0+aHdkZXNjWzBdKSwgR0ZQX05P V0FJVCk7CisJaWYgKCFkKQorCQlyZXR1cm4gTlVMTDsKKworCWQtPnNnbGVuID0gdHJfY291bnQ7 CisKKwlkLT5od2Rlc2NfY291bnQgPSAxOworCWh3ZGVzYyA9ICZkLT5od2Rlc2NbMF07CisKKwkv KiBBbGxvY2F0ZSBtZW1vcnkgZm9yIERNQSByaW5nIGRlc2NyaXB0b3IgKi8KKwlpZiAodWMtPnVz ZV9kbWFfcG9vbCkgeworCQlod2Rlc2MtPmNwcGk1X2Rlc2Nfc2l6ZSA9IHVjLT5jb25maWcuaGRl c2Nfc2l6ZTsKKwkJaHdkZXNjLT5jcHBpNV9kZXNjX3ZhZGRyID0gZG1hX3Bvb2xfemFsbG9jKHVj LT5oZGVzY19wb29sLAorCQkJCQkJR0ZQX05PV0FJVCwKKwkJCQkJCSZod2Rlc2MtPmNwcGk1X2Rl c2NfcGFkZHIpOworCX0gZWxzZSB7CisJCWh3ZGVzYy0+Y3BwaTVfZGVzY19zaXplID0gY3BwaTVf dHJkZXNjX2NhbGNfc2l6ZSh0cl9zaXplLAorCQkJCQkJCQkgdHJfY291bnQpOworCQlod2Rlc2Mt PmNwcGk1X2Rlc2Nfc2l6ZSA9IEFMSUdOKGh3ZGVzYy0+Y3BwaTVfZGVzY19zaXplLAorCQkJCQkJ dWMtPnVkLT5kZXNjX2FsaWduKTsKKwkJaHdkZXNjLT5jcHBpNV9kZXNjX3ZhZGRyID0gZG1hX2Fs bG9jX2NvaGVyZW50KHVjLT51ZC0+ZGV2LAorCQkJCQkJaHdkZXNjLT5jcHBpNV9kZXNjX3NpemUs CisJCQkJCQkmaHdkZXNjLT5jcHBpNV9kZXNjX3BhZGRyLAorCQkJCQkJR0ZQX05PV0FJVCk7CisJ fQorCisJaWYgKCFod2Rlc2MtPmNwcGk1X2Rlc2NfdmFkZHIpIHsKKwkJa2ZyZWUoZCk7CisJCXJl dHVybiBOVUxMOworCX0KKworCS8qIFN0YXJ0IG9mIHRoZSBUUiByZXEgcmVjb3JkcyAqLworCWh3 ZGVzYy0+dHJfcmVxX2Jhc2UgPSBod2Rlc2MtPmNwcGk1X2Rlc2NfdmFkZHIgKyB0cl9zaXplOwor CS8qIFN0YXJ0IGFkZHJlc3Mgb2YgdGhlIFRSIHJlc3BvbnNlIGFycmF5ICovCisJaHdkZXNjLT50 cl9yZXNwX2Jhc2UgPSBod2Rlc2MtPnRyX3JlcV9iYXNlICsgdHJfc2l6ZSAqIHRyX2NvdW50Owor CisJdHJfZGVzYyA9IGh3ZGVzYy0+Y3BwaTVfZGVzY192YWRkcjsKKworCWlmICh1Yy0+Y3ljbGlj KQorCQlyZWxvYWRfY291bnQgPSBDUFBJNV9JTkZPMF9UUkRFU0NfUkxEQ05UX0lORklOSVRFOwor CisJaWYgKGRpciA9PSBETUFfREVWX1RPX01FTSkKKwkJcmluZ19pZCA9IGszX3JpbmdhY2NfZ2V0 X3JpbmdfaWQodWMtPnJmbG93LT5yX3JpbmcpOworCWVsc2UKKwkJcmluZ19pZCA9IGszX3Jpbmdh Y2NfZ2V0X3JpbmdfaWQodWMtPnRjaGFuLT50Y19yaW5nKTsKKworCWNwcGk1X3RyZGVzY19pbml0 KHRyX2Rlc2MsIHRyX2NvdW50LCB0cl9zaXplLCAwLCByZWxvYWRfY291bnQpOworCWNwcGk1X2Rl c2Nfc2V0X3BrdGlkcyh0cl9kZXNjLCB1Yy0+aWQsCisJCQkgICAgICBDUFBJNV9JTkZPMV9ERVND X0ZMT1dJRF9ERUZBVUxUKTsKKwljcHBpNV9kZXNjX3NldF9yZXRwb2xpY3kodHJfZGVzYywgMCwg cmluZ19pZCk7CisKKwlyZXR1cm4gZDsKK30KKworc3RhdGljIHN0cnVjdCB1ZG1hX2Rlc2MgKgor dWRtYV9wcmVwX3NsYXZlX3NnX3RyKHN0cnVjdCB1ZG1hX2NoYW4gKnVjLCBzdHJ1Y3Qgc2NhdHRl cmxpc3QgKnNnbCwKKwkJICAgICAgdW5zaWduZWQgaW50IHNnbGVuLCBlbnVtIGRtYV90cmFuc2Zl cl9kaXJlY3Rpb24gZGlyLAorCQkgICAgICB1bnNpZ25lZCBsb25nIHR4X2ZsYWdzLCB2b2lkICpj b250ZXh0KQoreworCWVudW0gZG1hX3NsYXZlX2J1c3dpZHRoIGRldl93aWR0aDsKKwlzdHJ1Y3Qg c2NhdHRlcmxpc3QgKnNnZW50OworCXN0cnVjdCB1ZG1hX2Rlc2MgKmQ7CisJc2l6ZV90IHRyX3Np emU7CisJc3RydWN0IGNwcGk1X3RyX3R5cGUxX3QgKnRyX3JlcSA9IE5VTEw7CisJdW5zaWduZWQg aW50IGk7CisJdTMyIGJ1cnN0OworCisJaWYgKGRpciA9PSBETUFfREVWX1RPX01FTSkgeworCQlk ZXZfd2lkdGggPSB1Yy0+Y2ZnLnNyY19hZGRyX3dpZHRoOworCQlidXJzdCA9IHVjLT5jZmcuc3Jj X21heGJ1cnN0OworCX0gZWxzZSBpZiAoZGlyID09IERNQV9NRU1fVE9fREVWKSB7CisJCWRldl93 aWR0aCA9IHVjLT5jZmcuZHN0X2FkZHJfd2lkdGg7CisJCWJ1cnN0ID0gdWMtPmNmZy5kc3RfbWF4 YnVyc3Q7CisJfSBlbHNlIHsKKwkJZGV2X2Vycih1Yy0+dWQtPmRldiwgIiVzOiBiYWQgZGlyZWN0 aW9uP1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWJ1cnN0KQor CQlidXJzdCA9IDE7CisKKwkvKiBOb3cgYWxsb2NhdGUgYW5kIHNldHVwIHRoZSBkZXNjcmlwdG9y LiAqLworCXRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGNwcGk1X3RyX3R5cGUxX3QpOworCWQgPSB1 ZG1hX2FsbG9jX3RyX2Rlc2ModWMsIHRyX3NpemUsIHNnbGVuLCBkaXIpOworCWlmICghZCkKKwkJ cmV0dXJuIE5VTEw7CisKKwlkLT5zZ2xlbiA9IHNnbGVuOworCisJdHJfcmVxID0gZC0+aHdkZXNj WzBdLnRyX3JlcV9iYXNlOworCWZvcl9lYWNoX3NnKHNnbCwgc2dlbnQsIHNnbGVuLCBpKSB7CisJ CWQtPnJlc2lkdWUgKz0gc2dfZG1hX2xlbihzZ2VudCk7CisKKwkJY3BwaTVfdHJfaW5pdCgmdHJf cmVxW2ldLmZsYWdzLCBDUFBJNV9UUl9UWVBFMSwgZmFsc2UsIGZhbHNlLAorCQkJICAgICAgQ1BQ STVfVFJfRVZFTlRfU0laRV9DT01QTEVUSU9OLCAwKTsKKwkJY3BwaTVfdHJfY3NmX3NldCgmdHJf cmVxW2ldLmZsYWdzLCBDUFBJNV9UUl9DU0ZfU1VQUl9FVlQpOworCisJCXRyX3JlcVtpXS5hZGRy ID0gc2dfZG1hX2FkZHJlc3Moc2dlbnQpOworCQl0cl9yZXFbaV0uaWNudDAgPSBidXJzdCAqIGRl dl93aWR0aDsKKwkJdHJfcmVxW2ldLmRpbTEgPSBidXJzdCAqIGRldl93aWR0aDsKKwkJdHJfcmVx W2ldLmljbnQxID0gc2dfZG1hX2xlbihzZ2VudCkgLyB0cl9yZXFbaV0uaWNudDA7CisJfQorCisJ Y3BwaTVfdHJfY3NmX3NldCgmdHJfcmVxW2kgLSAxXS5mbGFncywgQ1BQSTVfVFJfQ1NGX0VPUCk7 CisKKwlyZXR1cm4gZDsKK30KKworc3RhdGljIGludCB1ZG1hX2NvbmZpZ3VyZV9zdGF0aWN0cihz dHJ1Y3QgdWRtYV9jaGFuICp1Yywgc3RydWN0IHVkbWFfZGVzYyAqZCwKKwkJCQkgICBlbnVtIGRt YV9zbGF2ZV9idXN3aWR0aCBkZXZfd2lkdGgsCisJCQkJICAgdTE2IGVsY250KQoreworCWlmICh1 Yy0+Y29uZmlnLmVwX3R5cGUgIT0gUFNJTF9FUF9QRE1BX1hZKQorCQlyZXR1cm4gMDsKKworCS8q IEJ1cyB3aWR0aCB0cmFuc2xhdGVzIHRvIHRoZSBlbGVtZW50IHNpemUgKEVTKSAqLworCXN3aXRj aCAoZGV2X3dpZHRoKSB7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOgorCQlkLT5z dGF0aWNfdHIuZWxzaXplID0gMDsKKwkJYnJlYWs7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhf Ml9CWVRFUzoKKwkJZC0+c3RhdGljX3RyLmVsc2l6ZSA9IDE7CisJCWJyZWFrOworCWNhc2UgRE1B X1NMQVZFX0JVU1dJRFRIXzNfQllURVM6CisJCWQtPnN0YXRpY190ci5lbHNpemUgPSAyOworCQli cmVhazsKKwljYXNlIERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOgorCQlkLT5zdGF0aWNfdHIu ZWxzaXplID0gMzsKKwkJYnJlYWs7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfOF9CWVRFUzoK KwkJZC0+c3RhdGljX3RyLmVsc2l6ZSA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIG5vdCBy ZWFjaGVkICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWQtPnN0YXRpY190ci5lbGNudCA9 IGVsY250OworCisJLyoKKwkgKiBQRE1BIG11c3QgdG8gY2xvc2UgdGhlIHBhY2tldCB3aGVuIHRo ZSBjaGFubmVsIGlzIGluIHBhY2tldCBtb2RlLgorCSAqIEZvciBUUiBtb2RlIHdoZW4gdGhlIGNo YW5uZWwgaXMgbm90IGN5Y2xpYyB3ZSBhbHNvIG5lZWQgUERNQSB0byBjbG9zZQorCSAqIHRoZSBw YWNrZXQgb3RoZXJ3aXNlIHRoZSB0cmFuc2ZlciB3aWxsIHN0YWxsIGJlY2F1c2UgUERNQSBob2xk cyBvbgorCSAqIHRoZSBkYXRhIGl0IGhhcyByZWNlaXZlZCBmcm9tIHRoZSBwZXJpcGhlcmFsLgor CSAqLworCWlmICh1Yy0+Y29uZmlnLnBrdF9tb2RlIHx8ICF1Yy0+Y3ljbGljKSB7CisJCXVuc2ln bmVkIGludCBkaXYgPSBkZXZfd2lkdGggKiBlbGNudDsKKworCQlpZiAodWMtPmN5Y2xpYykKKwkJ CWQtPnN0YXRpY190ci5ic3RjbnQgPSBkLT5yZXNpZHVlIC8gZC0+c2dsZW4gLyBkaXY7CisJCWVs c2UKKwkJCWQtPnN0YXRpY190ci5ic3RjbnQgPSBkLT5yZXNpZHVlIC8gZGl2OworCisJCWlmICh1 Yy0+Y29uZmlnLmRpciA9PSBETUFfREVWX1RPX01FTSAmJgorCQkgICAgZC0+c3RhdGljX3RyLmJz dGNudCA+IHVjLT51ZC0+bWF0Y2hfZGF0YS0+c3RhdGljdHJfel9tYXNrKQorCQkJcmV0dXJuIC1F SU5WQUw7CisJfSBlbHNlIHsKKwkJZC0+c3RhdGljX3RyLmJzdGNudCA9IDA7CisJfQorCisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWRtYV9kZXNjICoKK3VkbWFfcHJlcF9zbGF2ZV9z Z19wa3Qoc3RydWN0IHVkbWFfY2hhbiAqdWMsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLAorCQkg ICAgICAgdW5zaWduZWQgaW50IHNnbGVuLCBlbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGly LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyB0eF9mbGFncywgdm9pZCAqY29udGV4dCkKK3sKKwlz dHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnZW50OworCXN0cnVjdCBjcHBpNV9ob3N0X2Rlc2NfdCAqaF9k ZXNjID0gTlVMTDsKKwlzdHJ1Y3QgdWRtYV9kZXNjICpkOworCXUzMiByaW5nX2lkOworCXVuc2ln bmVkIGludCBpOworCisJZCA9IGt6YWxsb2Moc2l6ZW9mKCpkKSArIHNnbGVuICogc2l6ZW9mKGQt Pmh3ZGVzY1swXSksIEdGUF9OT1dBSVQpOworCWlmICghZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlk LT5zZ2xlbiA9IHNnbGVuOworCWQtPmh3ZGVzY19jb3VudCA9IHNnbGVuOworCisJaWYgKGRpciA9 PSBETUFfREVWX1RPX01FTSkKKwkJcmluZ19pZCA9IGszX3JpbmdhY2NfZ2V0X3JpbmdfaWQodWMt PnJmbG93LT5yX3JpbmcpOworCWVsc2UKKwkJcmluZ19pZCA9IGszX3JpbmdhY2NfZ2V0X3Jpbmdf aWQodWMtPnRjaGFuLT50Y19yaW5nKTsKKworCWZvcl9lYWNoX3NnKHNnbCwgc2dlbnQsIHNnbGVu LCBpKSB7CisJCXN0cnVjdCB1ZG1hX2h3ZGVzYyAqaHdkZXNjID0gJmQtPmh3ZGVzY1tpXTsKKwkJ ZG1hX2FkZHJfdCBzZ19hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2dlbnQpOworCQlzdHJ1Y3QgY3Bw aTVfaG9zdF9kZXNjX3QgKmRlc2M7CisJCXNpemVfdCBzZ19sZW4gPSBzZ19kbWFfbGVuKHNnZW50 KTsKKworCQlod2Rlc2MtPmNwcGk1X2Rlc2NfdmFkZHIgPSBkbWFfcG9vbF96YWxsb2ModWMtPmhk ZXNjX3Bvb2wsCisJCQkJCQlHRlBfTk9XQUlULAorCQkJCQkJJmh3ZGVzYy0+Y3BwaTVfZGVzY19w YWRkcik7CisJCWlmICghaHdkZXNjLT5jcHBpNV9kZXNjX3ZhZGRyKSB7CisJCQlkZXZfZXJyKHVj LT51ZC0+ZGV2LAorCQkJCSJkZXNjcmlwdG9yJWQgYWxsb2NhdGlvbiBmYWlsZWRcbiIsIGkpOwor CisJCQl1ZG1hX2ZyZWVfaHdkZXNjKHVjLCBkKTsKKwkJCWtmcmVlKGQpOworCQkJcmV0dXJuIE5V TEw7CisJCX0KKworCQlkLT5yZXNpZHVlICs9IHNnX2xlbjsKKwkJaHdkZXNjLT5jcHBpNV9kZXNj X3NpemUgPSB1Yy0+Y29uZmlnLmhkZXNjX3NpemU7CisJCWRlc2MgPSBod2Rlc2MtPmNwcGk1X2Rl c2NfdmFkZHI7CisKKwkJaWYgKGkgPT0gMCkgeworCQkJY3BwaTVfaGRlc2NfaW5pdChkZXNjLCAw LCAwKTsKKwkJCS8qIEZsb3cgYW5kIFBhY2tlZCBJRCAqLworCQkJY3BwaTVfZGVzY19zZXRfcGt0 aWRzKCZkZXNjLT5oZHIsIHVjLT5pZCwKKwkJCQkJICAgICAgQ1BQSTVfSU5GTzFfREVTQ19GTE9X SURfREVGQVVMVCk7CisJCQljcHBpNV9kZXNjX3NldF9yZXRwb2xpY3koJmRlc2MtPmhkciwgMCwg cmluZ19pZCk7CisJCX0gZWxzZSB7CisJCQljcHBpNV9oZGVzY19yZXNldF9oYmRlc2MoZGVzYyk7 CisJCQljcHBpNV9kZXNjX3NldF9yZXRwb2xpY3koJmRlc2MtPmhkciwgMCwgMHhmZmZmKTsKKwkJ fQorCisJCS8qIGF0dGFjaCB0aGUgc2cgYnVmZmVyIHRvIHRoZSBkZXNjcmlwdG9yICovCisJCWNw cGk1X2hkZXNjX2F0dGFjaF9idWYoZGVzYywgc2dfYWRkciwgc2dfbGVuLCBzZ19hZGRyLCBzZ19s ZW4pOworCisJCS8qIEF0dGFjaCBsaW5rIGFzIGhvc3QgYnVmZmVyIGRlc2NyaXB0b3IgKi8KKwkJ aWYgKGhfZGVzYykKKwkJCWNwcGk1X2hkZXNjX2xpbmtfaGJkZXNjKGhfZGVzYywKKwkJCQkJCWh3 ZGVzYy0+Y3BwaTVfZGVzY19wYWRkcik7CisKKwkJaWYgKGRpciA9PSBETUFfTUVNX1RPX0RFVikK KwkJCWhfZGVzYyA9IGRlc2M7CisJfQorCisJaWYgKGQtPnJlc2lkdWUgPj0gU1pfNE0pIHsKKwkJ ZGV2X2Vycih1Yy0+dWQtPmRldiwKKwkJCSIlczogVHJhbnNmZXIgc2l6ZSAldSBpcyBvdmVyIHRo ZSBzdXBwb3J0ZWQgNE0gcmFuZ2VcbiIsCisJCQlfX2Z1bmNfXywgZC0+cmVzaWR1ZSk7CisJCXVk bWFfZnJlZV9od2Rlc2ModWMsIGQpOworCQlrZnJlZShkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQor CisJaF9kZXNjID0gZC0+aHdkZXNjWzBdLmNwcGk1X2Rlc2NfdmFkZHI7CisJY3BwaTVfaGRlc2Nf c2V0X3BrdGxlbihoX2Rlc2MsIGQtPnJlc2lkdWUpOworCisJcmV0dXJuIGQ7Cit9CisKK3N0YXRp YyBpbnQgdWRtYV9hdHRhY2hfbWV0YWRhdGEoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9y ICpkZXNjLAorCQkJCXZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHVkbWFfZGVz YyAqZCA9IHRvX3VkbWFfZGVzYyhkZXNjKTsKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IHRvX3Vk bWFfY2hhbihkZXNjLT5jaGFuKTsKKwlzdHJ1Y3QgY3BwaTVfaG9zdF9kZXNjX3QgKmhfZGVzYzsK Kwl1MzIgcHNkX3NpemUgPSBsZW47CisJdTMyIGZsYWdzID0gMDsKKworCWlmICghdWMtPmNvbmZp Zy5wa3RfbW9kZSB8fCAhdWMtPmNvbmZpZy5tZXRhZGF0YV9zaXplKQorCQlyZXR1cm4gLUVOT1RT VVBQOworCisJaWYgKCFkYXRhIHx8IGxlbiA+IHVjLT5jb25maWcubWV0YWRhdGFfc2l6ZSkKKwkJ cmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodWMtPmNvbmZpZy5uZWVkc19lcGliICYmIGxlbiA8IENQ UEk1X0lORk8wX0hERVNDX0VQSUJfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwloX2Rlc2Mg PSBkLT5od2Rlc2NbMF0uY3BwaTVfZGVzY192YWRkcjsKKwlpZiAoZC0+ZGlyID09IERNQV9NRU1f VE9fREVWKQorCQltZW1jcHkoaF9kZXNjLT5lcGliLCBkYXRhLCBsZW4pOworCisJaWYgKHVjLT5j b25maWcubmVlZHNfZXBpYikKKwkJcHNkX3NpemUgLT0gQ1BQSTVfSU5GTzBfSERFU0NfRVBJQl9T SVpFOworCisJZC0+bWV0YWRhdGEgPSBkYXRhOworCWQtPm1ldGFkYXRhX3NpemUgPSBsZW47CisJ aWYgKHVjLT5jb25maWcubmVlZHNfZXBpYikKKwkJZmxhZ3MgfD0gQ1BQSTVfSU5GTzBfSERFU0Nf RVBJQl9QUkVTRU5UOworCisJY3BwaTVfaGRlc2NfdXBkYXRlX2ZsYWdzKGhfZGVzYywgZmxhZ3Mp OworCWNwcGk1X2hkZXNjX3VwZGF0ZV9wc2RhdGFfc2l6ZShoX2Rlc2MsIHBzZF9zaXplKTsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqdWRtYV9nZXRfbWV0YWRhdGFfcHRyKHN0cnVj dCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYywKKwkJCQkgICBzaXplX3QgKnBheWxvYWRf bGVuLCBzaXplX3QgKm1heF9sZW4pCit7CisJc3RydWN0IHVkbWFfZGVzYyAqZCA9IHRvX3VkbWFf ZGVzYyhkZXNjKTsKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IHRvX3VkbWFfY2hhbihkZXNjLT5j aGFuKTsKKwlzdHJ1Y3QgY3BwaTVfaG9zdF9kZXNjX3QgKmhfZGVzYzsKKworCWlmICghdWMtPmNv bmZpZy5wa3RfbW9kZSB8fCAhdWMtPmNvbmZpZy5tZXRhZGF0YV9zaXplKQorCQlyZXR1cm4gRVJS X1BUUigtRU5PVFNVUFApOworCisJaF9kZXNjID0gZC0+aHdkZXNjWzBdLmNwcGk1X2Rlc2NfdmFk ZHI7CisKKwkqbWF4X2xlbiA9IHVjLT5jb25maWcubWV0YWRhdGFfc2l6ZTsKKworCSpwYXlsb2Fk X2xlbiA9IGNwcGk1X2hkZXNjX2VwaWJfcHJlc2VudCgmaF9kZXNjLT5oZHIpID8KKwkJICAgICAg IENQUEk1X0lORk8wX0hERVNDX0VQSUJfU0laRSA6IDA7CisJKnBheWxvYWRfbGVuICs9IGNwcGk1 X2hkZXNjX2dldF9wc2RhdGFfc2l6ZShoX2Rlc2MpOworCisJcmV0dXJuIGhfZGVzYy0+ZXBpYjsK K30KKworc3RhdGljIGludCB1ZG1hX3NldF9tZXRhZGF0YV9sZW4oc3RydWN0IGRtYV9hc3luY190 eF9kZXNjcmlwdG9yICpkZXNjLAorCQkJCSBzaXplX3QgcGF5bG9hZF9sZW4pCit7CisJc3RydWN0 IHVkbWFfZGVzYyAqZCA9IHRvX3VkbWFfZGVzYyhkZXNjKTsKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1 YyA9IHRvX3VkbWFfY2hhbihkZXNjLT5jaGFuKTsKKwlzdHJ1Y3QgY3BwaTVfaG9zdF9kZXNjX3Qg KmhfZGVzYzsKKwl1MzIgcHNkX3NpemUgPSBwYXlsb2FkX2xlbjsKKwl1MzIgZmxhZ3MgPSAwOwor CisJaWYgKCF1Yy0+Y29uZmlnLnBrdF9tb2RlIHx8ICF1Yy0+Y29uZmlnLm1ldGFkYXRhX3NpemUp CisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlpZiAocGF5bG9hZF9sZW4gPiB1Yy0+Y29uZmlnLm1l dGFkYXRhX3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVjLT5jb25maWcubmVlZHNf ZXBpYiAmJiBwYXlsb2FkX2xlbiA8IENQUEk1X0lORk8wX0hERVNDX0VQSUJfU0laRSkKKwkJcmV0 dXJuIC1FSU5WQUw7CisKKwloX2Rlc2MgPSBkLT5od2Rlc2NbMF0uY3BwaTVfZGVzY192YWRkcjsK KworCWlmICh1Yy0+Y29uZmlnLm5lZWRzX2VwaWIpIHsKKwkJcHNkX3NpemUgLT0gQ1BQSTVfSU5G TzBfSERFU0NfRVBJQl9TSVpFOworCQlmbGFncyB8PSBDUFBJNV9JTkZPMF9IREVTQ19FUElCX1BS RVNFTlQ7CisJfQorCisJY3BwaTVfaGRlc2NfdXBkYXRlX2ZsYWdzKGhfZGVzYywgZmxhZ3MpOwor CWNwcGk1X2hkZXNjX3VwZGF0ZV9wc2RhdGFfc2l6ZShoX2Rlc2MsIHBzZF9zaXplKTsKKworCXJl dHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9kZXNjcmlwdG9yX21ldGFkYXRhX29wcyBt ZXRhZGF0YV9vcHMgPSB7CisJLmF0dGFjaCA9IHVkbWFfYXR0YWNoX21ldGFkYXRhLAorCS5nZXRf cHRyID0gdWRtYV9nZXRfbWV0YWRhdGFfcHRyLAorCS5zZXRfbGVuID0gdWRtYV9zZXRfbWV0YWRh dGFfbGVuLAorfTsKKworc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCit1 ZG1hX3ByZXBfc2xhdmVfc2coc3RydWN0IGRtYV9jaGFuICpjaGFuLCBzdHJ1Y3Qgc2NhdHRlcmxp c3QgKnNnbCwKKwkJICAgdW5zaWduZWQgaW50IHNnbGVuLCBlbnVtIGRtYV90cmFuc2Zlcl9kaXJl Y3Rpb24gZGlyLAorCQkgICB1bnNpZ25lZCBsb25nIHR4X2ZsYWdzLCB2b2lkICpjb250ZXh0KQor eworCXN0cnVjdCB1ZG1hX2NoYW4gKnVjID0gdG9fdWRtYV9jaGFuKGNoYW4pOworCWVudW0gZG1h X3NsYXZlX2J1c3dpZHRoIGRldl93aWR0aDsKKwlzdHJ1Y3QgdWRtYV9kZXNjICpkOworCXUzMiBi dXJzdDsKKworCWlmIChkaXIgIT0gdWMtPmNvbmZpZy5kaXIpIHsKKwkJZGV2X2VycihjaGFuLT5k ZXZpY2UtPmRldiwKKwkJCSIlczogY2hhbiVkIGlzIGZvciAlcywgbm90IHN1cHBvcnRpbmcgJXNc biIsCisJCQlfX2Z1bmNfXywgdWMtPmlkLAorCQkJZG1hZW5naW5lX2dldF9kaXJlY3Rpb25fdGV4 dCh1Yy0+Y29uZmlnLmRpciksCisJCQlkbWFlbmdpbmVfZ2V0X2RpcmVjdGlvbl90ZXh0KGRpcikp OworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoZGlyID09IERNQV9ERVZfVE9fTUVNKSB7CisJ CWRldl93aWR0aCA9IHVjLT5jZmcuc3JjX2FkZHJfd2lkdGg7CisJCWJ1cnN0ID0gdWMtPmNmZy5z cmNfbWF4YnVyc3Q7CisJfSBlbHNlIGlmIChkaXIgPT0gRE1BX01FTV9UT19ERVYpIHsKKwkJZGV2 X3dpZHRoID0gdWMtPmNmZy5kc3RfYWRkcl93aWR0aDsKKwkJYnVyc3QgPSB1Yy0+Y2ZnLmRzdF9t YXhidXJzdDsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGNoYW4tPmRldmljZS0+ZGV2LCAiJXM6IGJh ZCBkaXJlY3Rpb24/XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICgh YnVyc3QpCisJCWJ1cnN0ID0gMTsKKworCWlmICh1Yy0+Y29uZmlnLnBrdF9tb2RlKQorCQlkID0g dWRtYV9wcmVwX3NsYXZlX3NnX3BrdCh1Yywgc2dsLCBzZ2xlbiwgZGlyLCB0eF9mbGFncywKKwkJ CQkJICAgY29udGV4dCk7CisJZWxzZQorCQlkID0gdWRtYV9wcmVwX3NsYXZlX3NnX3RyKHVjLCBz Z2wsIHNnbGVuLCBkaXIsIHR4X2ZsYWdzLAorCQkJCQkgIGNvbnRleHQpOworCisJaWYgKCFkKQor CQlyZXR1cm4gTlVMTDsKKworCWQtPmRpciA9IGRpcjsKKwlkLT5kZXNjX2lkeCA9IDA7CisJZC0+ dHJfaWR4ID0gMDsKKworCS8qIHN0YXRpYyBUUiBmb3IgcmVtb3RlIFBETUEgKi8KKwlpZiAodWRt YV9jb25maWd1cmVfc3RhdGljdHIodWMsIGQsIGRldl93aWR0aCwgYnVyc3QpKSB7CisJCWRldl9l cnIodWMtPnVkLT5kZXYsCisJCQkiJXM6IFN0YXRpY1RSIFogaXMgbGltdGVkIHRvIG1heGltdW0g NDA5NSAoJXUpXG4iLAorCQkJX19mdW5jX18sIGQtPnN0YXRpY190ci5ic3RjbnQpOworCisJCXVk bWFfZnJlZV9od2Rlc2ModWMsIGQpOworCQlrZnJlZShkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQor CisJaWYgKHVjLT5jb25maWcubWV0YWRhdGFfc2l6ZSkKKwkJZC0+dmQudHgubWV0YWRhdGFfb3Bz ID0gJm1ldGFkYXRhX29wczsKKworCXJldHVybiB2Y2hhbl90eF9wcmVwKCZ1Yy0+dmMsICZkLT52 ZCwgdHhfZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHVkbWFfZGVzYyAqCit1ZG1hX3ByZXBf ZG1hX2N5Y2xpY190cihzdHJ1Y3QgdWRtYV9jaGFuICp1YywgZG1hX2FkZHJfdCBidWZfYWRkciwK KwkJCXNpemVfdCBidWZfbGVuLCBzaXplX3QgcGVyaW9kX2xlbiwKKwkJCWVudW0gZG1hX3RyYW5z ZmVyX2RpcmVjdGlvbiBkaXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJZW51bSBkbWFfc2xh dmVfYnVzd2lkdGggZGV2X3dpZHRoOworCXN0cnVjdCB1ZG1hX2Rlc2MgKmQ7CisJc2l6ZV90IHRy X3NpemU7CisJc3RydWN0IGNwcGk1X3RyX3R5cGUxX3QgKnRyX3JlcTsKKwl1bnNpZ25lZCBpbnQg aTsKKwl1bnNpZ25lZCBpbnQgcGVyaW9kcyA9IGJ1Zl9sZW4gLyBwZXJpb2RfbGVuOworCXUzMiBi dXJzdDsKKworCWlmIChkaXIgPT0gRE1BX0RFVl9UT19NRU0pIHsKKwkJZGV2X3dpZHRoID0gdWMt PmNmZy5zcmNfYWRkcl93aWR0aDsKKwkJYnVyc3QgPSB1Yy0+Y2ZnLnNyY19tYXhidXJzdDsKKwl9 IGVsc2UgaWYgKGRpciA9PSBETUFfTUVNX1RPX0RFVikgeworCQlkZXZfd2lkdGggPSB1Yy0+Y2Zn LmRzdF9hZGRyX3dpZHRoOworCQlidXJzdCA9IHVjLT5jZmcuZHN0X21heGJ1cnN0OworCX0gZWxz ZSB7CisJCWRldl9lcnIodWMtPnVkLT5kZXYsICIlczogYmFkIGRpcmVjdGlvbj9cbiIsIF9fZnVu Y19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFidXJzdCkKKwkJYnVyc3QgPSAxOwor CisJLyogTm93IGFsbG9jYXRlIGFuZCBzZXR1cCB0aGUgZGVzY3JpcHRvci4gKi8KKwl0cl9zaXpl ID0gc2l6ZW9mKHN0cnVjdCBjcHBpNV90cl90eXBlMV90KTsKKwlkID0gdWRtYV9hbGxvY190cl9k ZXNjKHVjLCB0cl9zaXplLCBwZXJpb2RzLCBkaXIpOworCWlmICghZCkKKwkJcmV0dXJuIE5VTEw7 CisKKwl0cl9yZXEgPSBkLT5od2Rlc2NbMF0udHJfcmVxX2Jhc2U7CisJZm9yIChpID0gMDsgaSA8 IHBlcmlvZHM7IGkrKykgeworCQljcHBpNV90cl9pbml0KCZ0cl9yZXFbaV0uZmxhZ3MsIENQUEk1 X1RSX1RZUEUxLCBmYWxzZSwgZmFsc2UsCisJCQkgICAgICBDUFBJNV9UUl9FVkVOVF9TSVpFX0NP TVBMRVRJT04sIDApOworCisJCXRyX3JlcVtpXS5hZGRyID0gYnVmX2FkZHIgKyBwZXJpb2RfbGVu ICogaTsKKwkJdHJfcmVxW2ldLmljbnQwID0gZGV2X3dpZHRoOworCQl0cl9yZXFbaV0uaWNudDEg PSBwZXJpb2RfbGVuIC8gZGV2X3dpZHRoOworCQl0cl9yZXFbaV0uZGltMSA9IGRldl93aWR0aDsK KworCQlpZiAoIShmbGFncyAmIERNQV9QUkVQX0lOVEVSUlVQVCkpCisJCQljcHBpNV90cl9jc2Zf c2V0KCZ0cl9yZXFbaV0uZmxhZ3MsCisJCQkJCSBDUFBJNV9UUl9DU0ZfU1VQUl9FVlQpOworCX0K KworCXJldHVybiBkOworfQorCitzdGF0aWMgc3RydWN0IHVkbWFfZGVzYyAqCit1ZG1hX3ByZXBf ZG1hX2N5Y2xpY19wa3Qoc3RydWN0IHVkbWFfY2hhbiAqdWMsIGRtYV9hZGRyX3QgYnVmX2FkZHIs CisJCQkgc2l6ZV90IGJ1Zl9sZW4sIHNpemVfdCBwZXJpb2RfbGVuLAorCQkJIGVudW0gZG1hX3Ry YW5zZmVyX2RpcmVjdGlvbiBkaXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHVk bWFfZGVzYyAqZDsKKwl1MzIgcmluZ19pZDsKKwlpbnQgaTsKKwlpbnQgcGVyaW9kcyA9IGJ1Zl9s ZW4gLyBwZXJpb2RfbGVuOworCisJaWYgKHBlcmlvZHMgPiAoSzNfVURNQV9ERUZBVUxUX1JJTkdf U0laRSAtIDEpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChwZXJpb2RfbGVuID49IFNaXzRNKQor CQlyZXR1cm4gTlVMTDsKKworCWQgPSBremFsbG9jKHNpemVvZigqZCkgKyBwZXJpb2RzICogc2l6 ZW9mKGQtPmh3ZGVzY1swXSksIEdGUF9OT1dBSVQpOworCWlmICghZCkKKwkJcmV0dXJuIE5VTEw7 CisKKwlkLT5od2Rlc2NfY291bnQgPSBwZXJpb2RzOworCisJLyogVE9ETzogcmUtY2hlY2sgdGhp cy4uLiAqLworCWlmIChkaXIgPT0gRE1BX0RFVl9UT19NRU0pCisJCXJpbmdfaWQgPSBrM19yaW5n YWNjX2dldF9yaW5nX2lkKHVjLT5yZmxvdy0+cl9yaW5nKTsKKwllbHNlCisJCXJpbmdfaWQgPSBr M19yaW5nYWNjX2dldF9yaW5nX2lkKHVjLT50Y2hhbi0+dGNfcmluZyk7CisKKwlmb3IgKGkgPSAw OyBpIDwgcGVyaW9kczsgaSsrKSB7CisJCXN0cnVjdCB1ZG1hX2h3ZGVzYyAqaHdkZXNjID0gJmQt Pmh3ZGVzY1tpXTsKKwkJZG1hX2FkZHJfdCBwZXJpb2RfYWRkciA9IGJ1Zl9hZGRyICsgKHBlcmlv ZF9sZW4gKiBpKTsKKwkJc3RydWN0IGNwcGk1X2hvc3RfZGVzY190ICpoX2Rlc2M7CisKKwkJaHdk ZXNjLT5jcHBpNV9kZXNjX3ZhZGRyID0gZG1hX3Bvb2xfemFsbG9jKHVjLT5oZGVzY19wb29sLAor CQkJCQkJR0ZQX05PV0FJVCwKKwkJCQkJCSZod2Rlc2MtPmNwcGk1X2Rlc2NfcGFkZHIpOworCQlp ZiAoIWh3ZGVzYy0+Y3BwaTVfZGVzY192YWRkcikgeworCQkJZGV2X2Vycih1Yy0+dWQtPmRldiwK KwkJCQkiZGVzY3JpcHRvciVkIGFsbG9jYXRpb24gZmFpbGVkXG4iLCBpKTsKKworCQkJdWRtYV9m cmVlX2h3ZGVzYyh1YywgZCk7CisJCQlrZnJlZShkKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisK KwkJaHdkZXNjLT5jcHBpNV9kZXNjX3NpemUgPSB1Yy0+Y29uZmlnLmhkZXNjX3NpemU7CisJCWhf ZGVzYyA9IGh3ZGVzYy0+Y3BwaTVfZGVzY192YWRkcjsKKworCQljcHBpNV9oZGVzY19pbml0KGhf ZGVzYywgMCwgMCk7CisJCWNwcGk1X2hkZXNjX3NldF9wa3RsZW4oaF9kZXNjLCBwZXJpb2RfbGVu KTsKKworCQkvKiBGbG93IGFuZCBQYWNrZWQgSUQgKi8KKwkJY3BwaTVfZGVzY19zZXRfcGt0aWRz KCZoX2Rlc2MtPmhkciwgdWMtPmlkLAorCQkJCSAgICAgIENQUEk1X0lORk8xX0RFU0NfRkxPV0lE X0RFRkFVTFQpOworCQljcHBpNV9kZXNjX3NldF9yZXRwb2xpY3koJmhfZGVzYy0+aGRyLCAwLCBy aW5nX2lkKTsKKworCQkvKiBhdHRhY2ggZWFjaCBwZXJpb2QgdG8gYSBuZXcgZGVzY3JpcHRvciAq LworCQljcHBpNV9oZGVzY19hdHRhY2hfYnVmKGhfZGVzYywKKwkJCQkgICAgICAgcGVyaW9kX2Fk ZHIsIHBlcmlvZF9sZW4sCisJCQkJICAgICAgIHBlcmlvZF9hZGRyLCBwZXJpb2RfbGVuKTsKKwl9 CisKKwlyZXR1cm4gZDsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRv ciAqCit1ZG1hX3ByZXBfZG1hX2N5Y2xpYyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRy X3QgYnVmX2FkZHIsIHNpemVfdCBidWZfbGVuLAorCQkgICAgIHNpemVfdCBwZXJpb2RfbGVuLCBl bnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgZmxh Z3MpCit7CisJc3RydWN0IHVkbWFfY2hhbiAqdWMgPSB0b191ZG1hX2NoYW4oY2hhbik7CisJZW51 bSBkbWFfc2xhdmVfYnVzd2lkdGggZGV2X3dpZHRoOworCXN0cnVjdCB1ZG1hX2Rlc2MgKmQ7CisJ dTMyIGJ1cnN0OworCisJaWYgKGRpciAhPSB1Yy0+Y29uZmlnLmRpcikgeworCQlkZXZfZXJyKGNo YW4tPmRldmljZS0+ZGV2LAorCQkJIiVzOiBjaGFuJWQgaXMgZm9yICVzLCBub3Qgc3VwcG9ydGlu ZyAlc1xuIiwKKwkJCV9fZnVuY19fLCB1Yy0+aWQsCisJCQlkbWFlbmdpbmVfZ2V0X2RpcmVjdGlv bl90ZXh0KHVjLT5jb25maWcuZGlyKSwKKwkJCWRtYWVuZ2luZV9nZXRfZGlyZWN0aW9uX3RleHQo ZGlyKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXVjLT5jeWNsaWMgPSB0cnVlOworCisJaWYg KGRpciA9PSBETUFfREVWX1RPX01FTSkgeworCQlkZXZfd2lkdGggPSB1Yy0+Y2ZnLnNyY19hZGRy X3dpZHRoOworCQlidXJzdCA9IHVjLT5jZmcuc3JjX21heGJ1cnN0OworCX0gZWxzZSBpZiAoZGly ID09IERNQV9NRU1fVE9fREVWKSB7CisJCWRldl93aWR0aCA9IHVjLT5jZmcuZHN0X2FkZHJfd2lk dGg7CisJCWJ1cnN0ID0gdWMtPmNmZy5kc3RfbWF4YnVyc3Q7CisJfSBlbHNlIHsKKwkJZGV2X2Vy cih1Yy0+dWQtPmRldiwgIiVzOiBiYWQgZGlyZWN0aW9uP1xuIiwgX19mdW5jX18pOworCQlyZXR1 cm4gTlVMTDsKKwl9CisKKwlpZiAoIWJ1cnN0KQorCQlidXJzdCA9IDE7CisKKwlpZiAodWMtPmNv bmZpZy5wa3RfbW9kZSkKKwkJZCA9IHVkbWFfcHJlcF9kbWFfY3ljbGljX3BrdCh1YywgYnVmX2Fk ZHIsIGJ1Zl9sZW4sIHBlcmlvZF9sZW4sCisJCQkJCSAgICAgZGlyLCBmbGFncyk7CisJZWxzZQor CQlkID0gdWRtYV9wcmVwX2RtYV9jeWNsaWNfdHIodWMsIGJ1Zl9hZGRyLCBidWZfbGVuLCBwZXJp b2RfbGVuLAorCQkJCQkgICAgZGlyLCBmbGFncyk7CisKKwlpZiAoIWQpCisJCXJldHVybiBOVUxM OworCisJZC0+c2dsZW4gPSBidWZfbGVuIC8gcGVyaW9kX2xlbjsKKworCWQtPmRpciA9IGRpcjsK KwlkLT5yZXNpZHVlID0gYnVmX2xlbjsKKworCS8qIHN0YXRpYyBUUiBmb3IgcmVtb3RlIFBETUEg Ki8KKwlpZiAodWRtYV9jb25maWd1cmVfc3RhdGljdHIodWMsIGQsIGRldl93aWR0aCwgYnVyc3Qp KSB7CisJCWRldl9lcnIodWMtPnVkLT5kZXYsCisJCQkiJXM6IFN0YXRpY1RSIFogaXMgbGltdGVk IHRvIG1heGltdW0gNDA5NSAoJXUpXG4iLAorCQkJX19mdW5jX18sIGQtPnN0YXRpY190ci5ic3Rj bnQpOworCisJCXVkbWFfZnJlZV9od2Rlc2ModWMsIGQpOworCQlrZnJlZShkKTsKKwkJcmV0dXJu IE5VTEw7CisJfQorCisJaWYgKHVjLT5jb25maWcubWV0YWRhdGFfc2l6ZSkKKwkJZC0+dmQudHgu bWV0YWRhdGFfb3BzID0gJm1ldGFkYXRhX29wczsKKworCXJldHVybiB2Y2hhbl90eF9wcmVwKCZ1 Yy0+dmMsICZkLT52ZCwgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9k ZXNjcmlwdG9yICoKK3VkbWFfcHJlcF9kbWFfbWVtY3B5KHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwg ZG1hX2FkZHJfdCBkZXN0LCBkbWFfYWRkcl90IHNyYywKKwkJICAgICBzaXplX3QgbGVuLCB1bnNp Z25lZCBsb25nIHR4X2ZsYWdzKQoreworCXN0cnVjdCB1ZG1hX2NoYW4gKnVjID0gdG9fdWRtYV9j aGFuKGNoYW4pOworCXN0cnVjdCB1ZG1hX2Rlc2MgKmQ7CisJc3RydWN0IGNwcGk1X3RyX3R5cGUx NV90ICp0cl9yZXE7CisJaW50IG51bV90cjsKKwlzaXplX3QgdHJfc2l6ZSA9IHNpemVvZihzdHJ1 Y3QgY3BwaTVfdHJfdHlwZTE1X3QpOworCXUxNiB0cjBfY250MCwgdHIwX2NudDEsIHRyMV9jbnQw OworCisJaWYgKHVjLT5jb25maWcuZGlyICE9IERNQV9NRU1fVE9fTUVNKSB7CisJCWRldl9lcnIo Y2hhbi0+ZGV2aWNlLT5kZXYsCisJCQkiJXM6IGNoYW4lZCBpcyBmb3IgJXMsIG5vdCBzdXBwb3J0 aW5nICVzXG4iLAorCQkJX19mdW5jX18sIHVjLT5pZCwKKwkJCWRtYWVuZ2luZV9nZXRfZGlyZWN0 aW9uX3RleHQodWMtPmNvbmZpZy5kaXIpLAorCQkJZG1hZW5naW5lX2dldF9kaXJlY3Rpb25fdGV4 dChETUFfTUVNX1RPX01FTSkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAobGVuIDwgU1pf NjRLKSB7CisJCW51bV90ciA9IDE7CisJCXRyMF9jbnQwID0gbGVuOworCQl0cjBfY250MSA9IDE7 CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBhbGlnbl90byA9IF9fZmZzKHNyYyB8IGRlc3Qp OworCisJCWlmIChhbGlnbl90byA+IDMpCisJCQlhbGlnbl90byA9IDM7CisJCS8qCisJCSAqIEtl ZXAgc2ltcGxlOiB0cjA6IFNaXzY0Sy1hbGlnbm1lbnQgYmxvY2tzLAorCQkgKgkJdHIxOiB0aGUg cmVtYWluaW5nCisJCSAqLworCQludW1fdHIgPSAyOworCQl0cjBfY250MCA9IChTWl82NEsgLSBC SVQoYWxpZ25fdG8pKTsKKwkJaWYgKGxlbiAvIHRyMF9jbnQwID49IFNaXzY0SykgeworCQkJZGV2 X2Vycih1Yy0+dWQtPmRldiwgInNpemUgJXp1IGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJbGVu KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJdHIwX2NudDEgPSBsZW4gLyB0cjBfY250MDsK KwkJdHIxX2NudDAgPSBsZW4gJSB0cjBfY250MDsKKwl9CisKKwlkID0gdWRtYV9hbGxvY190cl9k ZXNjKHVjLCB0cl9zaXplLCBudW1fdHIsIERNQV9NRU1fVE9fTUVNKTsKKwlpZiAoIWQpCisJCXJl dHVybiBOVUxMOworCisJZC0+ZGlyID0gRE1BX01FTV9UT19NRU07CisJZC0+ZGVzY19pZHggPSAw OworCWQtPnRyX2lkeCA9IDA7CisJZC0+cmVzaWR1ZSA9IGxlbjsKKworCXRyX3JlcSA9IGQtPmh3 ZGVzY1swXS50cl9yZXFfYmFzZTsKKworCWNwcGk1X3RyX2luaXQoJnRyX3JlcVswXS5mbGFncywg Q1BQSTVfVFJfVFlQRTE1LCBmYWxzZSwgdHJ1ZSwKKwkJICAgICAgQ1BQSTVfVFJfRVZFTlRfU0la RV9DT01QTEVUSU9OLCAwKTsKKwljcHBpNV90cl9jc2Zfc2V0KCZ0cl9yZXFbMF0uZmxhZ3MsIENQ UEk1X1RSX0NTRl9TVVBSX0VWVCk7CisKKwl0cl9yZXFbMF0uYWRkciA9IHNyYzsKKwl0cl9yZXFb MF0uaWNudDAgPSB0cjBfY250MDsKKwl0cl9yZXFbMF0uaWNudDEgPSB0cjBfY250MTsKKwl0cl9y ZXFbMF0uaWNudDIgPSAxOworCXRyX3JlcVswXS5pY250MyA9IDE7CisJdHJfcmVxWzBdLmRpbTEg PSB0cjBfY250MDsKKworCXRyX3JlcVswXS5kYWRkciA9IGRlc3Q7CisJdHJfcmVxWzBdLmRpY250 MCA9IHRyMF9jbnQwOworCXRyX3JlcVswXS5kaWNudDEgPSB0cjBfY250MTsKKwl0cl9yZXFbMF0u ZGljbnQyID0gMTsKKwl0cl9yZXFbMF0uZGljbnQzID0gMTsKKwl0cl9yZXFbMF0uZGRpbTEgPSB0 cjBfY250MDsKKworCWlmIChudW1fdHIgPT0gMikgeworCQljcHBpNV90cl9pbml0KCZ0cl9yZXFb MV0uZmxhZ3MsIENQUEk1X1RSX1RZUEUxNSwgZmFsc2UsIHRydWUsCisJCQkgICAgICBDUFBJNV9U Ul9FVkVOVF9TSVpFX0NPTVBMRVRJT04sIDApOworCQljcHBpNV90cl9jc2Zfc2V0KCZ0cl9yZXFb MV0uZmxhZ3MsIENQUEk1X1RSX0NTRl9TVVBSX0VWVCk7CisKKwkJdHJfcmVxWzFdLmFkZHIgPSBz cmMgKyB0cjBfY250MSAqIHRyMF9jbnQwOworCQl0cl9yZXFbMV0uaWNudDAgPSB0cjFfY250MDsK KwkJdHJfcmVxWzFdLmljbnQxID0gMTsKKwkJdHJfcmVxWzFdLmljbnQyID0gMTsKKwkJdHJfcmVx WzFdLmljbnQzID0gMTsKKworCQl0cl9yZXFbMV0uZGFkZHIgPSBkZXN0ICsgdHIwX2NudDEgKiB0 cjBfY250MDsKKwkJdHJfcmVxWzFdLmRpY250MCA9IHRyMV9jbnQwOworCQl0cl9yZXFbMV0uZGlj bnQxID0gMTsKKwkJdHJfcmVxWzFdLmRpY250MiA9IDE7CisJCXRyX3JlcVsxXS5kaWNudDMgPSAx OworCX0KKworCWNwcGk1X3RyX2NzZl9zZXQoJnRyX3JlcVtudW1fdHIgLSAxXS5mbGFncywgQ1BQ STVfVFJfQ1NGX0VPUCk7CisKKwlpZiAodWMtPmNvbmZpZy5tZXRhZGF0YV9zaXplKQorCQlkLT52 ZC50eC5tZXRhZGF0YV9vcHMgPSAmbWV0YWRhdGFfb3BzOworCisJcmV0dXJuIHZjaGFuX3R4X3By ZXAoJnVjLT52YywgJmQtPnZkLCB0eF9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHVkbWFfaXNz dWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IHVkbWFfY2hhbiAq dWMgPSB0b191ZG1hX2NoYW4oY2hhbik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5f bG9ja19pcnFzYXZlKCZ1Yy0+dmMubG9jaywgZmxhZ3MpOworCisJLyogSWYgd2UgaGF2ZSBzb21l dGhpbmcgcGVuZGluZyBhbmQgbm8gYWN0aXZlIGRlc2NyaXB0b3IsIHRoZW4gKi8KKwlpZiAodmNo YW5faXNzdWVfcGVuZGluZygmdWMtPnZjKSAmJiAhdWMtPmRlc2MpIHsKKwkJLyoKKwkJICogc3Rh cnQgYSBkZXNjcmlwdG9yIGlmIHRoZSBjaGFubmVsIGlzIE5PVCBbbWFya2VkIGFzCisJCSAqIHRl cm1pbmF0aW5nIF9hbmRfIGl0IGlzIHN0aWxsIHJ1bm5pbmcgKHRlYXJkb3duIGhhcyBub3QKKwkJ ICogY29tcGxldGVkIHlldCldLgorCQkgKi8KKwkJaWYgKCEodWMtPnN0YXRlID09IFVETUFfQ0hB Tl9JU19URVJNSU5BVElORyAmJgorCQkgICAgICB1ZG1hX2lzX2NoYW5fcnVubmluZyh1YykpKQor CQkJdWRtYV9zdGFydCh1Yyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWMtPnZj LmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGVudW0gZG1hX3N0YXR1cyB1ZG1hX3R4X3N0YXR1 cyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCisJCQkJICAgICAgZG1hX2Nvb2tpZV90IGNvb2tpZSwK KwkJCQkgICAgICBzdHJ1Y3QgZG1hX3R4X3N0YXRlICp0eHN0YXRlKQoreworCXN0cnVjdCB1ZG1h X2NoYW4gKnVjID0gdG9fdWRtYV9jaGFuKGNoYW4pOworCWVudW0gZG1hX3N0YXR1cyByZXQ7CisJ dW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1Yy0+dmMubG9jaywg ZmxhZ3MpOworCisJcmV0ID0gZG1hX2Nvb2tpZV9zdGF0dXMoY2hhbiwgY29va2llLCB0eHN0YXRl KTsKKworCWlmIChyZXQgPT0gRE1BX0lOX1BST0dSRVNTICYmIHVkbWFfaXNfY2hhbl9wYXVzZWQo dWMpKQorCQlyZXQgPSBETUFfUEFVU0VEOworCisJaWYgKHJldCA9PSBETUFfQ09NUExFVEUgfHwg IXR4c3RhdGUpCisJCWdvdG8gb3V0OworCisJaWYgKHVjLT5kZXNjICYmIHVjLT5kZXNjLT52ZC50 eC5jb29raWUgPT0gY29va2llKSB7CisJCXUzMiBwZWVyX2JjbnQgPSAwOworCQl1MzIgYmNudCA9 IDA7CisJCXUzMiByZXNpZHVlID0gdWMtPmRlc2MtPnJlc2lkdWU7CisJCXUzMiBkZWxheSA9IDA7 CisKKwkJaWYgKHVjLT5kZXNjLT5kaXIgPT0gRE1BX01FTV9UT19ERVYpIHsKKwkJCWJjbnQgPSB1 ZG1hX3RjaGFucnRfcmVhZCh1Yy0+dGNoYW4sCisJCQkJCQkgVURNQV9UQ0hBTl9SVF9TQkNOVF9S RUcpOworCisJCQlpZiAodWMtPmNvbmZpZy5lcF90eXBlICE9IFBTSUxfRVBfTkFUSVZFKSB7CisJ CQkJcGVlcl9iY250ID0gdWRtYV90Y2hhbnJ0X3JlYWQodWMtPnRjaGFuLAorCQkJCQkJVURNQV9U Q0hBTl9SVF9QRUVSX0JDTlRfUkVHKTsKKworCQkJCWlmIChiY250ID4gcGVlcl9iY250KQorCQkJ CQlkZWxheSA9IGJjbnQgLSBwZWVyX2JjbnQ7CisJCQl9CisJCX0gZWxzZSBpZiAodWMtPmRlc2Mt PmRpciA9PSBETUFfREVWX1RPX01FTSkgeworCQkJYmNudCA9IHVkbWFfcmNoYW5ydF9yZWFkKHVj LT5yY2hhbiwKKwkJCQkJCSBVRE1BX1JDSEFOX1JUX0JDTlRfUkVHKTsKKworCQkJaWYgKHVjLT5j b25maWcuZXBfdHlwZSAhPSBQU0lMX0VQX05BVElWRSkgeworCQkJCXBlZXJfYmNudCA9IHVkbWFf cmNoYW5ydF9yZWFkKHVjLT5yY2hhbiwKKwkJCQkJCVVETUFfUkNIQU5fUlRfUEVFUl9CQ05UX1JF Ryk7CisKKwkJCQlpZiAocGVlcl9iY250ID4gYmNudCkKKwkJCQkJZGVsYXkgPSBwZWVyX2JjbnQg LSBiY250OworCQkJfQorCQl9IGVsc2UgeworCQkJYmNudCA9IHVkbWFfdGNoYW5ydF9yZWFkKHVj LT50Y2hhbiwKKwkJCQkJCSBVRE1BX1RDSEFOX1JUX0JDTlRfUkVHKTsKKwkJfQorCisJCWJjbnQg LT0gdWMtPmJjbnQ7CisJCWlmIChiY250ICYmICEoYmNudCAlIHVjLT5kZXNjLT5yZXNpZHVlKSkK KwkJCXJlc2lkdWUgPSAwOworCQllbHNlCisJCQlyZXNpZHVlIC09IGJjbnQgJSB1Yy0+ZGVzYy0+ cmVzaWR1ZTsKKworCQlpZiAoIXJlc2lkdWUgJiYgKHVjLT5jb25maWcuZGlyID09IERNQV9ERVZf VE9fTUVNIHx8ICFkZWxheSkpIHsKKwkJCXJldCA9IERNQV9DT01QTEVURTsKKwkJCWRlbGF5ID0g MDsKKwkJfQorCisJCWRtYV9zZXRfcmVzaWR1ZSh0eHN0YXRlLCByZXNpZHVlKTsKKwkJZG1hX3Nl dF9pbl9mbGlnaHRfYnl0ZXModHhzdGF0ZSwgZGVsYXkpOworCisJfSBlbHNlIHsKKwkJcmV0ID0g RE1BX0NPTVBMRVRFOworCX0KKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVjLT52 Yy5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1ZG1hX3BhdXNl KHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IHRvX3Vk bWFfY2hhbihjaGFuKTsKKworCWlmICghdWMtPmRlc2MpCisJCXJldHVybiAtRUlOVkFMOworCisJ LyogcGF1c2UgdGhlIGNoYW5uZWwgKi8KKwlzd2l0Y2ggKHVjLT5kZXNjLT5kaXIpIHsKKwljYXNl IERNQV9ERVZfVE9fTUVNOgorCQl1ZG1hX3JjaGFucnRfdXBkYXRlX2JpdHModWMtPnJjaGFuLAor CQkJCQkgVURNQV9SQ0hBTl9SVF9QRUVSX1JUX0VOX1JFRywKKwkJCQkJIFVETUFfUEVFUl9SVF9F Tl9QQVVTRSwKKwkJCQkJIFVETUFfUEVFUl9SVF9FTl9QQVVTRSk7CisJCWJyZWFrOworCWNhc2Ug RE1BX01FTV9UT19ERVY6CisJCXVkbWFfdGNoYW5ydF91cGRhdGVfYml0cyh1Yy0+dGNoYW4sCisJ CQkJCSBVRE1BX1RDSEFOX1JUX1BFRVJfUlRfRU5fUkVHLAorCQkJCQkgVURNQV9QRUVSX1JUX0VO X1BBVVNFLAorCQkJCQkgVURNQV9QRUVSX1JUX0VOX1BBVVNFKTsKKwkJYnJlYWs7CisJY2FzZSBE TUFfTUVNX1RPX01FTToKKwkJdWRtYV90Y2hhbnJ0X3VwZGF0ZV9iaXRzKHVjLT50Y2hhbiwgVURN QV9UQ0hBTl9SVF9DVExfUkVHLAorCQkJCQkgVURNQV9DSEFOX1JUX0NUTF9QQVVTRSwKKwkJCQkJ IFVETUFfQ0hBTl9SVF9DVExfUEFVU0UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4g LUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1ZG1hX3Jlc3VtZShz dHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IHVkbWFfY2hhbiAqdWMgPSB0b191ZG1h X2NoYW4oY2hhbik7CisKKwlpZiAoIXVjLT5kZXNjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8q IHJlc3VtZSB0aGUgY2hhbm5lbCAqLworCXN3aXRjaCAodWMtPmRlc2MtPmRpcikgeworCWNhc2Ug RE1BX0RFVl9UT19NRU06CisJCXVkbWFfcmNoYW5ydF91cGRhdGVfYml0cyh1Yy0+cmNoYW4sCisJ CQkJCSBVRE1BX1JDSEFOX1JUX1BFRVJfUlRfRU5fUkVHLAorCQkJCQkgVURNQV9QRUVSX1JUX0VO X1BBVVNFLCAwKTsKKworCQlicmVhazsKKwljYXNlIERNQV9NRU1fVE9fREVWOgorCQl1ZG1hX3Rj aGFucnRfdXBkYXRlX2JpdHModWMtPnRjaGFuLAorCQkJCQkgVURNQV9UQ0hBTl9SVF9QRUVSX1JU X0VOX1JFRywKKwkJCQkJIFVETUFfUEVFUl9SVF9FTl9QQVVTRSwgMCk7CisJCWJyZWFrOworCWNh c2UgRE1BX01FTV9UT19NRU06CisJCXVkbWFfdGNoYW5ydF91cGRhdGVfYml0cyh1Yy0+dGNoYW4s IFVETUFfVENIQU5fUlRfQ1RMX1JFRywKKwkJCQkJIFVETUFfQ0hBTl9SVF9DVExfUEFVU0UsIDAp OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludCB1ZG1hX3Rlcm1pbmF0ZV9hbGwoc3RydWN0IGRtYV9jaGFuICpj aGFuKQoreworCXN0cnVjdCB1ZG1hX2NoYW4gKnVjID0gdG9fdWRtYV9jaGFuKGNoYW4pOworCXVu c2lnbmVkIGxvbmcgZmxhZ3M7CisJTElTVF9IRUFEKGhlYWQpOworCisJc3Bpbl9sb2NrX2lycXNh dmUoJnVjLT52Yy5sb2NrLCBmbGFncyk7CisKKwlpZiAodWRtYV9pc19jaGFuX3J1bm5pbmcodWMp KQorCQl1ZG1hX3N0b3AodWMpOworCisJaWYgKHVjLT5kZXNjKSB7CisJCXVjLT50ZXJtaW5hdGVk X2Rlc2MgPSB1Yy0+ZGVzYzsKKwkJdWMtPmRlc2MgPSBOVUxMOworCQl1Yy0+dGVybWluYXRlZF9k ZXNjLT50ZXJtaW5hdGVkID0gdHJ1ZTsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmdWMtPnR4X2Ry YWluLndvcmspOworCX0KKworCXVjLT5wYXVzZWQgPSBmYWxzZTsKKworCXZjaGFuX2dldF9hbGxf ZGVzY3JpcHRvcnMoJnVjLT52YywgJmhlYWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVj LT52Yy5sb2NrLCBmbGFncyk7CisJdmNoYW5fZG1hX2Rlc2NfZnJlZV9saXN0KCZ1Yy0+dmMsICZo ZWFkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1ZG1hX3N5bmNocm9uaXplKHN0 cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IHRvX3VkbWFf Y2hhbihjaGFuKTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDEw MDApOworCisJdmNoYW5fc3luY2hyb25pemUoJnVjLT52Yyk7CisKKwlpZiAodWMtPnN0YXRlID09 IFVETUFfQ0hBTl9JU19URVJNSU5BVElORykgeworCQl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxl dGlvbl90aW1lb3V0KCZ1Yy0+dGVhcmRvd25fY29tcGxldGVkLAorCQkJCQkJICAgICAgdGltZW91 dCk7CisJCWlmICghdGltZW91dCkgeworCQkJZGV2X3dhcm4odWMtPnVkLT5kZXYsICJjaGFuJWQg dGVhcmRvd24gdGltZW91dCFcbiIsCisJCQkJIHVjLT5pZCk7CisJCQl1ZG1hX2R1bXBfY2hhbl9z dGRhdGEodWMpOworCQkJdWRtYV9yZXNldF9jaGFuKHVjLCB0cnVlKTsKKwkJfQorCX0KKworCXVk bWFfcmVzZXRfY2hhbih1YywgZmFsc2UpOworCWlmICh1ZG1hX2lzX2NoYW5fcnVubmluZyh1Yykp CisJCWRldl93YXJuKHVjLT51ZC0+ZGV2LCAiY2hhbiVkIHJlZnVzZWQgdG8gc3RvcCFcbiIsIHVj LT5pZCk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnVjLT50eF9kcmFpbi53b3JrKTsK Kwl1ZG1hX3Jlc2V0X3JpbmdzKHVjKTsKK30KKworc3RhdGljIHZvaWQgdWRtYV9kZXNjX3ByZV9j YWxsYmFjayhzdHJ1Y3QgdmlydF9kbWFfY2hhbiAqdmMsCisJCQkJICAgc3RydWN0IHZpcnRfZG1h X2Rlc2MgKnZkLAorCQkJCSAgIHN0cnVjdCBkbWFlbmdpbmVfcmVzdWx0ICpyZXN1bHQpCit7CisJ c3RydWN0IHVkbWFfY2hhbiAqdWMgPSB0b191ZG1hX2NoYW4oJnZjLT5jaGFuKTsKKwlzdHJ1Y3Qg dWRtYV9kZXNjICpkOworCisJaWYgKCF2ZCkKKwkJcmV0dXJuOworCisJZCA9IHRvX3VkbWFfZGVz YygmdmQtPnR4KTsKKworCWlmIChkLT5tZXRhZGF0YV9zaXplKQorCQl1ZG1hX2ZldGNoX2VwaWIo dWMsIGQpOworCisJLyogUHJvdmlkZSByZXNpZHVlIGluZm9ybWF0aW9uIGZvciB0aGUgY2xpZW50 ICovCisJaWYgKHJlc3VsdCkgeworCQl2b2lkICpkZXNjX3ZhZGRyID0gdWRtYV9jdXJyX2NwcGk1 X2Rlc2NfdmFkZHIoZCwgZC0+ZGVzY19pZHgpOworCisJCWlmIChjcHBpNV9kZXNjX2dldF90eXBl KGRlc2NfdmFkZHIpID09CisJCSAgICBDUFBJNV9JTkZPMF9ERVNDX1RZUEVfVkFMX0hPU1QpIHsK KwkJCXJlc3VsdC0+cmVzaWR1ZSA9IGQtPnJlc2lkdWUgLQorCQkJCQkgIGNwcGk1X2hkZXNjX2dl dF9wa3RsZW4oZGVzY192YWRkcik7CisJCQlpZiAocmVzdWx0LT5yZXNpZHVlKQorCQkJCXJlc3Vs dC0+cmVzdWx0ID0gRE1BX1RSQU5TX0FCT1JURUQ7CisJCQllbHNlCisJCQkJcmVzdWx0LT5yZXN1 bHQgPSBETUFfVFJBTlNfTk9FUlJPUjsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdC0+cmVzaWR1ZSA9 IDA7CisJCQlyZXN1bHQtPnJlc3VsdCA9IERNQV9UUkFOU19OT0VSUk9SOworCQl9CisJfQorfQor CisvKgorICogVGhpcyB0YXNrbGV0IGhhbmRsZXMgdGhlIGNvbXBsZXRpb24gb2YgYSBETUEgZGVz Y3JpcHRvciBieQorICogY2FsbGluZyBpdHMgY2FsbGJhY2sgYW5kIGZyZWVpbmcgaXQuCisgKi8K K3N0YXRpYyB2b2lkIHVkbWFfdmNoYW5fY29tcGxldGUodW5zaWduZWQgbG9uZyBhcmcpCit7CisJ c3RydWN0IHZpcnRfZG1hX2NoYW4gKnZjID0gKHN0cnVjdCB2aXJ0X2RtYV9jaGFuICopYXJnOwor CXN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCwgKl92ZDsKKwlzdHJ1Y3QgZG1hZW5naW5lX2Rlc2Nf Y2FsbGJhY2sgY2I7CisJTElTVF9IRUFEKGhlYWQpOworCisJc3Bpbl9sb2NrX2lycSgmdmMtPmxv Y2spOworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmdmMtPmRlc2NfY29tcGxldGVkLCAmaGVhZCk7 CisJdmQgPSB2Yy0+Y3ljbGljOworCWlmICh2ZCkgeworCQl2Yy0+Y3ljbGljID0gTlVMTDsKKwkJ ZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKCZ2ZC0+dHgsICZjYik7CisJfSBlbHNlIHsKKwkJ bWVtc2V0KCZjYiwgMCwgc2l6ZW9mKGNiKSk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmdmMtPmxv Y2spOworCisJdWRtYV9kZXNjX3ByZV9jYWxsYmFjayh2YywgdmQsIE5VTEwpOworCWRtYWVuZ2lu ZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOworCisJbGlzdF9mb3JfZWFjaF9lbnRy eV9zYWZlKHZkLCBfdmQsICZoZWFkLCBub2RlKSB7CisJCXN0cnVjdCBkbWFlbmdpbmVfcmVzdWx0 IHJlc3VsdDsKKworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJnZkLT50eCwgJmNiKTsK KworCQlsaXN0X2RlbCgmdmQtPm5vZGUpOworCisJCXVkbWFfZGVzY19wcmVfY2FsbGJhY2sodmMs IHZkLCAmcmVzdWx0KTsKKwkJZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlKCZjYiwgJnJl c3VsdCk7CisKKwkJdmNoYW5fdmRlc2NfZmluaSh2ZCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB1 ZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVj dCB1ZG1hX2NoYW4gKnVjID0gdG9fdWRtYV9jaGFuKGNoYW4pOworCXN0cnVjdCB1ZG1hX2RldiAq dWQgPSB0b191ZG1hX2RldihjaGFuLT5kZXZpY2UpOworCisJdWRtYV90ZXJtaW5hdGVfYWxsKGNo YW4pOworCWlmICh1Yy0+dGVybWluYXRlZF9kZXNjKSB7CisJCXVkbWFfcmVzZXRfY2hhbih1Yywg ZmFsc2UpOworCQl1ZG1hX3Jlc2V0X3JpbmdzKHVjKTsKKwl9CisKKwljYW5jZWxfZGVsYXllZF93 b3JrX3N5bmMoJnVjLT50eF9kcmFpbi53b3JrKTsKKwlkZXN0cm95X2RlbGF5ZWRfd29ya19vbl9z dGFjaygmdWMtPnR4X2RyYWluLndvcmspOworCisJaWYgKHVjLT5pcnFfbnVtX3JpbmcgPiAwKSB7 CisJCWZyZWVfaXJxKHVjLT5pcnFfbnVtX3JpbmcsIHVjKTsKKworCQl1Yy0+aXJxX251bV9yaW5n ID0gMDsKKwl9CisJaWYgKHVjLT5pcnFfbnVtX3VkbWEgPiAwKSB7CisJCWZyZWVfaXJxKHVjLT5p cnFfbnVtX3VkbWEsIHVjKTsKKworCQl1Yy0+aXJxX251bV91ZG1hID0gMDsKKwl9CisKKwkvKiBS ZWxlYXNlIFBTSS1MIHBhaXJpbmcgKi8KKwlpZiAodWMtPnBzaWxfcGFpcmVkKSB7CisJCW5hdnNz X3BzaWxfdW5wYWlyKHVkLCB1Yy0+Y29uZmlnLnNyY190aHJlYWQsCisJCQkJICB1Yy0+Y29uZmln LmRzdF90aHJlYWQpOworCQl1Yy0+cHNpbF9wYWlyZWQgPSBmYWxzZTsKKwl9CisKKwl2Y2hhbl9m cmVlX2NoYW5fcmVzb3VyY2VzKCZ1Yy0+dmMpOworCXRhc2tsZXRfa2lsbCgmdWMtPnZjLnRhc2sp OworCisJdWRtYV9mcmVlX3R4X3Jlc291cmNlcyh1Yyk7CisJdWRtYV9mcmVlX3J4X3Jlc291cmNl cyh1Yyk7CisJdWRtYV9yZXNldF91Y2hhbih1Yyk7CisKKwlpZiAodWMtPnVzZV9kbWFfcG9vbCkg eworCQlkbWFfcG9vbF9kZXN0cm95KHVjLT5oZGVzY19wb29sKTsKKwkJdWMtPnVzZV9kbWFfcG9v bCA9IGZhbHNlOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdWRtYV9k cml2ZXI7CisKK3N0YXRpYyBib29sIHVkbWFfZG1hX2ZpbHRlcl9mbihzdHJ1Y3QgZG1hX2NoYW4g KmNoYW4sIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCB1ZG1hX2NoYW5fY29uZmlnICp1Y2M7CisJ c3RydWN0IHBzaWxfZW5kcG9pbnRfY29uZmlnICplcF9jb25maWc7CisJc3RydWN0IHVkbWFfY2hh biAqdWM7CisJc3RydWN0IHVkbWFfZGV2ICp1ZDsKKwl1MzIgKmFyZ3M7CisKKwlpZiAoY2hhbi0+ ZGV2aWNlLT5kZXYtPmRyaXZlciAhPSAmdWRtYV9kcml2ZXIuZHJpdmVyKQorCQlyZXR1cm4gZmFs c2U7CisKKwl1YyA9IHRvX3VkbWFfY2hhbihjaGFuKTsKKwl1Y2MgPSAmdWMtPmNvbmZpZzsKKwl1 ZCA9IHVjLT51ZDsKKwlhcmdzID0gcGFyYW07CisKKwl1Y2MtPnJlbW90ZV90aHJlYWRfaWQgPSBh cmdzWzBdOworCisJaWYgKHVjYy0+cmVtb3RlX3RocmVhZF9pZCAmIEszX1BTSUxfRFNUX1RIUkVB RF9JRF9PRkZTRVQpCisJCXVjYy0+ZGlyID0gRE1BX01FTV9UT19ERVY7CisJZWxzZQorCQl1Y2Mt PmRpciA9IERNQV9ERVZfVE9fTUVNOworCisJZXBfY29uZmlnID0gcHNpbF9nZXRfZXBfY29uZmln KHVjYy0+cmVtb3RlX3RocmVhZF9pZCk7CisJaWYgKElTX0VSUihlcF9jb25maWcpKSB7CisJCWRl dl9lcnIodWQtPmRldiwgIk5vIGNvbmZpZ3VyYXRpb24gZm9yIHBzaS1sIHRocmVhZCAweCUwNHhc biIsCisJCQl1Y2MtPnJlbW90ZV90aHJlYWRfaWQpOworCQl1Y2MtPmRpciA9IERNQV9NRU1fVE9f TUVNOworCQl1Y2MtPnJlbW90ZV90aHJlYWRfaWQgPSAtMTsKKwkJcmV0dXJuIGZhbHNlOworCX0K KworCXVjYy0+cGt0X21vZGUgPSBlcF9jb25maWctPnBrdF9tb2RlOworCXVjYy0+Y2hhbm5lbF90 cGwgPSBlcF9jb25maWctPmNoYW5uZWxfdHBsOworCXVjYy0+bm90ZHBrdCA9IGVwX2NvbmZpZy0+ bm90ZHBrdDsKKwl1Y2MtPmVwX3R5cGUgPSBlcF9jb25maWctPmVwX3R5cGU7CisKKwlpZiAodWNj LT5lcF90eXBlICE9IFBTSUxfRVBfTkFUSVZFKSB7CisJCWNvbnN0IHN0cnVjdCB1ZG1hX21hdGNo X2RhdGEgKm1hdGNoX2RhdGEgPSB1ZC0+bWF0Y2hfZGF0YTsKKworCQlpZiAobWF0Y2hfZGF0YS0+ ZmxhZ3MgJiBVRE1BX0ZMQUdfUERNQV9BQ0MzMikKKwkJCXVjYy0+ZW5hYmxlX2FjYzMyID0gZXBf Y29uZmlnLT5wZG1hX2FjYzMyOworCQlpZiAobWF0Y2hfZGF0YS0+ZmxhZ3MgJiBVRE1BX0ZMQUdf UERNQV9CVVJTVCkKKwkJCXVjYy0+ZW5hYmxlX2J1cnN0ID0gZXBfY29uZmlnLT5wZG1hX2J1cnN0 OworCX0KKworCXVjYy0+bmVlZHNfZXBpYiA9IGVwX2NvbmZpZy0+bmVlZHNfZXBpYjsKKwl1Y2Mt PnBzZF9zaXplID0gZXBfY29uZmlnLT5wc2Rfc2l6ZTsKKwl1Y2MtPm1ldGFkYXRhX3NpemUgPQor CQkJKHVjYy0+bmVlZHNfZXBpYiA/IENQUEk1X0lORk8wX0hERVNDX0VQSUJfU0laRSA6IDApICsK KwkJCXVjYy0+cHNkX3NpemU7CisKKwlpZiAodWNjLT5wa3RfbW9kZSkKKwkJdWNjLT5oZGVzY19z aXplID0gQUxJR04oc2l6ZW9mKHN0cnVjdCBjcHBpNV9ob3N0X2Rlc2NfdCkgKworCQkJCSB1Y2Mt Pm1ldGFkYXRhX3NpemUsIHVkLT5kZXNjX2FsaWduKTsKKworCWRldl9kYmcodWQtPmRldiwgImNo YW4lZDogUmVtb3RlIHRocmVhZDogMHglMDR4ICglcylcbiIsIHVjLT5pZCwKKwkJdWNjLT5yZW1v dGVfdGhyZWFkX2lkLCBkbWFlbmdpbmVfZ2V0X2RpcmVjdGlvbl90ZXh0KHVjYy0+ZGlyKSk7CisK KwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfY2hhbiAqdWRtYV9vZl94bGF0 ZShzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpkbWFfc3BlYywKKwkJCQkgICAgICBzdHJ1Y3Qgb2Zf ZG1hICpvZmRtYSkKK3sKKwlzdHJ1Y3QgdWRtYV9kZXYgKnVkID0gb2ZkbWEtPm9mX2RtYV9kYXRh OworCWRtYV9jYXBfbWFza190IG1hc2sgPSB1ZC0+ZGRldi5jYXBfbWFzazsKKwlzdHJ1Y3QgZG1h X2NoYW4gKmNoYW47CisKKwlpZiAoZG1hX3NwZWMtPmFyZ3NfY291bnQgIT0gMSkKKwkJcmV0dXJu IE5VTEw7CisKKwljaGFuID0gX19kbWFfcmVxdWVzdF9jaGFubmVsKCZtYXNrLCB1ZG1hX2RtYV9m aWx0ZXJfZm4sCisJCQkJICAgICAmZG1hX3NwZWMtPmFyZ3NbMF0sIG9mZG1hLT5vZl9ub2RlKTsK KwlpZiAoIWNoYW4pIHsKKwkJZGV2X2Vycih1ZC0+ZGV2LCAiZ2V0IGNoYW5uZWwgZmFpbCBpbiAl cy5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0 dXJuIGNoYW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWRtYV9tYXRjaF9kYXRhIGFtNjU0X21haW5f ZGF0YSA9IHsKKwkucHNpbF9iYXNlID0gMHgxMDAwLAorCS5lbmFibGVfbWVtY3B5X3N1cHBvcnQg PSB0cnVlLAorCS5zdGF0aWN0cl96X21hc2sgPSBHRU5NQVNLKDExLCAwKSwKKwkucmNoYW5fb2Vz X29mZnNldCA9IDB4MjAwMCwKKwkudHBsX2xldmVscyA9IDIsCisJLmxldmVsX3N0YXJ0X2lkeCA9 IHsKKwkJWzBdID0gOCwgLyogTm9ybWFsIGNoYW5uZWxzICovCisJCVsxXSA9IDAsIC8qIEhpZ2gg VGhyb3VnaHB1dCBjaGFubmVscyAqLworCX0sCit9OworCitzdGF0aWMgc3RydWN0IHVkbWFfbWF0 Y2hfZGF0YSBhbTY1NF9tY3VfZGF0YSA9IHsKKwkucHNpbF9iYXNlID0gMHg2MDAwLAorCS5lbmFi bGVfbWVtY3B5X3N1cHBvcnQgPSBmYWxzZSwgLyogTUVNX1RPX01FTSBpcyBzbG93IHZpYSBNQ1Ug VURNQSAqLworCS5zdGF0aWN0cl96X21hc2sgPSBHRU5NQVNLKDExLCAwKSwKKwkucmNoYW5fb2Vz X29mZnNldCA9IDB4MjAwMCwKKwkudHBsX2xldmVscyA9IDIsCisJLmxldmVsX3N0YXJ0X2lkeCA9 IHsKKwkJWzBdID0gMiwgLyogTm9ybWFsIGNoYW5uZWxzICovCisJCVsxXSA9IDAsIC8qIEhpZ2gg VGhyb3VnaHB1dCBjaGFubmVscyAqLworCX0sCit9OworCitzdGF0aWMgc3RydWN0IHVkbWFfbWF0 Y2hfZGF0YSBqNzIxZV9tYWluX2RhdGEgPSB7CisJLnBzaWxfYmFzZSA9IDB4MTAwMCwKKwkuZW5h YmxlX21lbWNweV9zdXBwb3J0ID0gdHJ1ZSwKKwkuZmxhZ3MgPSBVRE1BX0ZMQUdfUERNQV9BQ0Mz MiB8IFVETUFfRkxBR19QRE1BX0JVUlNULAorCS5zdGF0aWN0cl96X21hc2sgPSBHRU5NQVNLKDIz LCAwKSwKKwkucmNoYW5fb2VzX29mZnNldCA9IDB4NDAwLAorCS50cGxfbGV2ZWxzID0gMywKKwku bGV2ZWxfc3RhcnRfaWR4ID0geworCQlbMF0gPSAxNiwgLyogTm9ybWFsIGNoYW5uZWxzICovCisJ CVsxXSA9IDQsIC8qIEhpZ2ggVGhyb3VnaHB1dCBjaGFubmVscyAqLworCQlbMl0gPSAwLCAvKiBV bHRyYSBIaWdoIFRocm91Z2hwdXQgY2hhbm5lbHMgKi8KKwl9LAorfTsKKworc3RhdGljIHN0cnVj dCB1ZG1hX21hdGNoX2RhdGEgajcyMWVfbWN1X2RhdGEgPSB7CisJLnBzaWxfYmFzZSA9IDB4NjAw MCwKKwkuZW5hYmxlX21lbWNweV9zdXBwb3J0ID0gZmFsc2UsIC8qIE1FTV9UT19NRU0gaXMgc2xv dyB2aWEgTUNVIFVETUEgKi8KKwkuZmxhZ3MgPSBVRE1BX0ZMQUdfUERNQV9BQ0MzMiB8IFVETUFf RkxBR19QRE1BX0JVUlNULAorCS5zdGF0aWN0cl96X21hc2sgPSBHRU5NQVNLKDIzLCAwKSwKKwku cmNoYW5fb2VzX29mZnNldCA9IDB4NDAwLAorCS50cGxfbGV2ZWxzID0gMiwKKwkubGV2ZWxfc3Rh cnRfaWR4ID0geworCQlbMF0gPSAyLCAvKiBOb3JtYWwgY2hhbm5lbHMgKi8KKwkJWzFdID0gMCwg LyogSGlnaCBUaHJvdWdocHV0IGNoYW5uZWxzICovCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBz dHJ1Y3Qgb2ZfZGV2aWNlX2lkIHVkbWFfb2ZfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxl ID0gInRpLGFtNjU0LW5hdnNzLW1haW4tdWRtYXAiLAorCQkuZGF0YSA9ICZhbTY1NF9tYWluX2Rh dGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInRpLGFtNjU0LW5hdnNzLW1jdS11ZG1hcCIs CisJCS5kYXRhID0gJmFtNjU0X21jdV9kYXRhLAorCX0sIHsKKwkJLmNvbXBhdGlibGUgPSAidGks ajcyMWUtbmF2c3MtbWFpbi11ZG1hcCIsCisJCS5kYXRhID0gJmo3MjFlX21haW5fZGF0YSwKKwl9 LCB7CisJCS5jb21wYXRpYmxlID0gInRpLGo3MjFlLW5hdnNzLW1jdS11ZG1hcCIsCisJCS5kYXRh ID0gJmo3MjFlX21jdV9kYXRhLAorCX0sCisJeyAvKiBTZW50aW5lbCAqLyB9LAorfTsKKworc3Rh dGljIGludCB1ZG1hX2dldF9tbXJzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVj dCB1ZG1hX2RldiAqdWQpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGk7CisKKwlm b3IgKGkgPSAwOyBpIDwgTU1SX0xBU1Q7IGkrKykgeworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVz b3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAorCQkJCQkJICAgbW1yX25hbWVzW2ld KTsKKwkJdWQtPm1tcnNbaV0gPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVz KTsKKwkJaWYgKElTX0VSUih1ZC0+bW1yc1tpXSkpCisJCQlyZXR1cm4gUFRSX0VSUih1ZC0+bW1y c1tpXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWRtYV9zZXR1cF9yZXNv dXJjZXMoc3RydWN0IHVkbWFfZGV2ICp1ZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB1ZC0+ ZGV2OworCWludCBjaF9jb3VudCwgcmV0LCBpLCBqOworCXUzMiBjYXAyLCBjYXAzOworCXN0cnVj dCB0aV9zY2lfcmVzb3VyY2VfZGVzYyAqcm1fZGVzYzsKKwlzdHJ1Y3QgdGlfc2NpX3Jlc291cmNl ICpybV9yZXMsIGlycV9yZXM7CisJc3RydWN0IHVkbWFfdGlzY2lfcm0gKnRpc2NpX3JtID0gJnVk LT50aXNjaV9ybTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJhbmdlX25hbWVzW10gPSB7 ICJ0aSxzY2ktcm0tcmFuZ2UtdGNoYW4iLAorCQkJCQkJICAgICJ0aSxzY2ktcm0tcmFuZ2UtcmNo YW4iLAorCQkJCQkJICAgICJ0aSxzY2ktcm0tcmFuZ2UtcmZsb3ciIH07CisKKwljYXAyID0gdWRt YV9yZWFkKHVkLT5tbXJzW01NUl9HQ0ZHXSwgMHgyOCk7CisJY2FwMyA9IHVkbWFfcmVhZCh1ZC0+ bW1yc1tNTVJfR0NGR10sIDB4MmMpOworCisJdWQtPnJmbG93X2NudCA9IGNhcDMgJiAweDNmZmY7 CisJdWQtPnRjaGFuX2NudCA9IGNhcDIgJiAweDFmZjsKKwl1ZC0+ZWNoYW5fY250ID0gKGNhcDIg Pj4gOSkgJiAweDFmZjsKKwl1ZC0+cmNoYW5fY250ID0gKGNhcDIgPj4gMTgpICYgMHgxZmY7CisJ Y2hfY291bnQgID0gdWQtPnRjaGFuX2NudCArIHVkLT5yY2hhbl9jbnQ7CisKKwl1ZC0+dGNoYW5f bWFwID0gZGV2bV9rbWFsbG9jX2FycmF5KGRldiwgQklUU19UT19MT05HUyh1ZC0+dGNoYW5fY250 KSwKKwkJCQkJICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfS0VSTkVMKTsKKwl1ZC0+dGNo YW5zID0gZGV2bV9rY2FsbG9jKGRldiwgdWQtPnRjaGFuX2NudCwgc2l6ZW9mKCp1ZC0+dGNoYW5z KSwKKwkJCQkgIEdGUF9LRVJORUwpOworCXVkLT5yY2hhbl9tYXAgPSBkZXZtX2ttYWxsb2NfYXJy YXkoZGV2LCBCSVRTX1RPX0xPTkdTKHVkLT5yY2hhbl9jbnQpLAorCQkJCQkgICBzaXplb2YodW5z aWduZWQgbG9uZyksIEdGUF9LRVJORUwpOworCXVkLT5yY2hhbnMgPSBkZXZtX2tjYWxsb2MoZGV2 LCB1ZC0+cmNoYW5fY250LCBzaXplb2YoKnVkLT5yY2hhbnMpLAorCQkJCSAgR0ZQX0tFUk5FTCk7 CisJdWQtPnJmbG93X2dwX21hcCA9IGRldm1fa21hbGxvY19hcnJheShkZXYsIEJJVFNfVE9fTE9O R1ModWQtPnJmbG93X2NudCksCisJCQkJCSAgICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJ CQkJICAgICAgR0ZQX0tFUk5FTCk7CisJdWQtPnJmbG93X2dwX21hcF9hbGxvY2F0ZWQgPSBkZXZt X2tjYWxsb2MoZGV2LAorCQkJCQkJICBCSVRTX1RPX0xPTkdTKHVkLT5yZmxvd19jbnQpLAorCQkJ CQkJICBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCQkJCQkgIEdGUF9LRVJORUwpOworCXVkLT5y Zmxvd19pbl91c2UgPSBkZXZtX2tjYWxsb2MoZGV2LCBCSVRTX1RPX0xPTkdTKHVkLT5yZmxvd19j bnQpLAorCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyksCisJCQkJCUdGUF9LRVJORUwpOworCXVk LT5yZmxvd3MgPSBkZXZtX2tjYWxsb2MoZGV2LCB1ZC0+cmZsb3dfY250LCBzaXplb2YoKnVkLT5y Zmxvd3MpLAorCQkJCSAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXVkLT50Y2hhbl9tYXAgfHwgIXVk LT5yY2hhbl9tYXAgfHwgIXVkLT5yZmxvd19ncF9tYXAgfHwKKwkgICAgIXVkLT5yZmxvd19ncF9t YXBfYWxsb2NhdGVkIHx8ICF1ZC0+dGNoYW5zIHx8ICF1ZC0+cmNoYW5zIHx8CisJICAgICF1ZC0+ cmZsb3dzIHx8ICF1ZC0+cmZsb3dfaW5fdXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJ ICogUlggZmxvd3Mgd2l0aCB0aGUgc2FtZSBJZHMgYXMgUlggY2hhbm5lbHMgYXJlIHJlc2VydmVk IHRvIGJlIHVzZWQKKwkgKiBhcyBkZWZhdWx0IGZsb3dzIGlmIHJlbW90ZSBIVyBjYW4ndCBnZW5l cmF0ZSBmbG93X2lkcy4gVGhvc2UKKwkgKiBSWCBmbG93cyBjYW4gYmUgcmVxdWVzdGVkIG9ubHkg ZXhwbGljaXRseSBieSBpZC4KKwkgKi8KKwliaXRtYXBfc2V0KHVkLT5yZmxvd19ncF9tYXBfYWxs b2NhdGVkLCAwLCB1ZC0+cmNoYW5fY250KTsKKworCS8qIGJ5IGRlZmF1bHQgbm8gR1AgcmZsb3dz IGFyZSBhc3NpZ25lZCB0byBMaW51eCAqLworCWJpdG1hcF9zZXQodWQtPnJmbG93X2dwX21hcCwg MCwgdWQtPnJmbG93X2NudCk7CisKKwkvKiBHZXQgcmVzb3VyY2UgcmFuZ2VzIGZyb20gdGlzY2kg Ki8KKwlmb3IgKGkgPSAwOyBpIDwgUk1fUkFOR0VfTEFTVDsgaSsrKQorCQl0aXNjaV9ybS0+cm1f cmFuZ2VzW2ldID0KKwkJCWRldm1fdGlfc2NpX2dldF9vZl9yZXNvdXJjZSh0aXNjaV9ybS0+dGlz Y2ksIGRldiwKKwkJCQkJCSAgICB0aXNjaV9ybS0+dGlzY2lfZGV2X2lkLAorCQkJCQkJICAgIChj aGFyICopcmFuZ2VfbmFtZXNbaV0pOworCisJLyogdGNoYW4gcmFuZ2VzICovCisJcm1fcmVzID0g dGlzY2lfcm0tPnJtX3Jhbmdlc1tSTV9SQU5HRV9UQ0hBTl07CisJaWYgKElTX0VSUihybV9yZXMp KSB7CisJCWJpdG1hcF96ZXJvKHVkLT50Y2hhbl9tYXAsIHVkLT50Y2hhbl9jbnQpOworCX0gZWxz ZSB7CisJCWJpdG1hcF9maWxsKHVkLT50Y2hhbl9tYXAsIHVkLT50Y2hhbl9jbnQpOworCQlmb3Ig KGkgPSAwOyBpIDwgcm1fcmVzLT5zZXRzOyBpKyspIHsKKwkJCXJtX2Rlc2MgPSAmcm1fcmVzLT5k ZXNjW2ldOworCQkJYml0bWFwX2NsZWFyKHVkLT50Y2hhbl9tYXAsIHJtX2Rlc2MtPnN0YXJ0LAor CQkJCSAgICAgcm1fZGVzYy0+bnVtKTsKKwkJCWRldl9kYmcoZGV2LCAidGktc2NpLXJlczogdGNo YW46ICVkOiVkXG4iLAorCQkJCXJtX2Rlc2MtPnN0YXJ0LCBybV9kZXNjLT5udW0pOworCQl9CisJ fQorCWlycV9yZXMuc2V0cyA9IHJtX3Jlcy0+c2V0czsKKworCS8qIHJjaGFuIGFuZCBtYXRjaGlu ZyBkZWZhdWx0IGZsb3cgcmFuZ2VzICovCisJcm1fcmVzID0gdGlzY2lfcm0tPnJtX3Jhbmdlc1tS TV9SQU5HRV9SQ0hBTl07CisJaWYgKElTX0VSUihybV9yZXMpKSB7CisJCWJpdG1hcF96ZXJvKHVk LT5yY2hhbl9tYXAsIHVkLT5yY2hhbl9jbnQpOworCX0gZWxzZSB7CisJCWJpdG1hcF9maWxsKHVk LT5yY2hhbl9tYXAsIHVkLT5yY2hhbl9jbnQpOworCQlmb3IgKGkgPSAwOyBpIDwgcm1fcmVzLT5z ZXRzOyBpKyspIHsKKwkJCXJtX2Rlc2MgPSAmcm1fcmVzLT5kZXNjW2ldOworCQkJYml0bWFwX2Ns ZWFyKHVkLT5yY2hhbl9tYXAsIHJtX2Rlc2MtPnN0YXJ0LAorCQkJCSAgICAgcm1fZGVzYy0+bnVt KTsKKwkJCWRldl9kYmcoZGV2LCAidGktc2NpLXJlczogcmNoYW46ICVkOiVkXG4iLAorCQkJCXJt X2Rlc2MtPnN0YXJ0LCBybV9kZXNjLT5udW0pOworCQl9CisJfQorCisJaXJxX3Jlcy5zZXRzICs9 IHJtX3Jlcy0+c2V0czsKKwlpcnFfcmVzLmRlc2MgPSBrY2FsbG9jKGlycV9yZXMuc2V0cywgc2l6 ZW9mKCppcnFfcmVzLmRlc2MpLCBHRlBfS0VSTkVMKTsKKwlybV9yZXMgPSB0aXNjaV9ybS0+cm1f cmFuZ2VzW1JNX1JBTkdFX1RDSEFOXTsKKwlmb3IgKGkgPSAwOyBpIDwgcm1fcmVzLT5zZXRzOyBp KyspIHsKKwkJaXJxX3Jlcy5kZXNjW2ldLnN0YXJ0ID0gcm1fcmVzLT5kZXNjW2ldLnN0YXJ0Owor CQlpcnFfcmVzLmRlc2NbaV0ubnVtID0gcm1fcmVzLT5kZXNjW2ldLm51bTsKKwl9CisJcm1fcmVz ID0gdGlzY2lfcm0tPnJtX3Jhbmdlc1tSTV9SQU5HRV9SQ0hBTl07CisJZm9yIChqID0gMDsgaiA8 IHJtX3Jlcy0+c2V0czsgaisrLCBpKyspIHsKKwkJaXJxX3Jlcy5kZXNjW2ldLnN0YXJ0ID0gcm1f cmVzLT5kZXNjW2pdLnN0YXJ0ICsKKwkJCQkJdWQtPm1hdGNoX2RhdGEtPnJjaGFuX29lc19vZmZz ZXQ7CisJCWlycV9yZXMuZGVzY1tpXS5udW0gPSBybV9yZXMtPmRlc2Nbal0ubnVtOworCX0KKwly ZXQgPSB0aV9zY2lfaW50YV9tc2lfZG9tYWluX2FsbG9jX2lycXModWQtPmRldiwgJmlycV9yZXMp OworCWtmcmVlKGlycV9yZXMuZGVzYyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHVkLT5kZXYs ICJGYWlsZWQgdG8gYWxsb2NhdGUgTVNJIGludGVycnVwdHNcbiIpOworCQlyZXR1cm4gcmV0Owor CX0KKworCS8qIEdQIHJmbG93IHJhbmdlcyAqLworCXJtX3JlcyA9IHRpc2NpX3JtLT5ybV9yYW5n ZXNbUk1fUkFOR0VfUkZMT1ddOworCWlmIChJU19FUlIocm1fcmVzKSkgeworCQkvKiBhbGwgZ3Ag Zmxvd3MgYXJlIGFzc2lnbmVkIGV4Y2x1c2l2ZWx5IHRvIExpbnV4ICovCisJCWJpdG1hcF9jbGVh cih1ZC0+cmZsb3dfZ3BfbWFwLCB1ZC0+cmNoYW5fY250LAorCQkJICAgICB1ZC0+cmZsb3dfY250 IC0gdWQtPnJjaGFuX2NudCk7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IHJtX3Jlcy0+ c2V0czsgaSsrKSB7CisJCQlybV9kZXNjID0gJnJtX3Jlcy0+ZGVzY1tpXTsKKwkJCWJpdG1hcF9j bGVhcih1ZC0+cmZsb3dfZ3BfbWFwLCBybV9kZXNjLT5zdGFydCwKKwkJCQkgICAgIHJtX2Rlc2Mt Pm51bSk7CisJCQlkZXZfZGJnKGRldiwgInRpLXNjaS1yZXM6IHJmbG93OiAlZDolZFxuIiwKKwkJ CQlybV9kZXNjLT5zdGFydCwgcm1fZGVzYy0+bnVtKTsKKwkJfQorCX0KKworCWNoX2NvdW50IC09 IGJpdG1hcF93ZWlnaHQodWQtPnRjaGFuX21hcCwgdWQtPnRjaGFuX2NudCk7CisJY2hfY291bnQg LT0gYml0bWFwX3dlaWdodCh1ZC0+cmNoYW5fbWFwLCB1ZC0+cmNoYW5fY250KTsKKwlpZiAoIWNo X2NvdW50KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXVkLT5jaGFubmVscyA9IGRldm1fa2NhbGxv YyhkZXYsIGNoX2NvdW50LCBzaXplb2YoKnVkLT5jaGFubmVscyksCisJCQkJICAgIEdGUF9LRVJO RUwpOworCWlmICghdWQtPmNoYW5uZWxzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9pbmZv KGRldiwgIkNoYW5uZWxzOiAlZCAodGNoYW46ICV1LCByY2hhbjogJXUsIGdwLXJmbG93OiAldSlc biIsCisJCSBjaF9jb3VudCwKKwkJIHVkLT50Y2hhbl9jbnQgLSBiaXRtYXBfd2VpZ2h0KHVkLT50 Y2hhbl9tYXAsIHVkLT50Y2hhbl9jbnQpLAorCQkgdWQtPnJjaGFuX2NudCAtIGJpdG1hcF93ZWln aHQodWQtPnJjaGFuX21hcCwgdWQtPnJjaGFuX2NudCksCisJCSB1ZC0+cmZsb3dfY250IC0gYml0 bWFwX3dlaWdodCh1ZC0+cmZsb3dfZ3BfbWFwLAorCQkJCQkgICAgICAgdWQtPnJmbG93X2NudCkp OworCisJcmV0dXJuIGNoX2NvdW50OworfQorCisjZGVmaW5lIFRJX1VETUFDX0JVU1dJRFRIUwko QklUKERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEUpIHwgXAorCQkJCSBCSVQoRE1BX1NMQVZFX0JV U1dJRFRIXzJfQllURVMpIHwgXAorCQkJCSBCSVQoRE1BX1NMQVZFX0JVU1dJRFRIXzNfQllURVMp IHwgXAorCQkJCSBCSVQoRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVMpIHwgXAorCQkJCSBCSVQo RE1BX1NMQVZFX0JVU1dJRFRIXzhfQllURVMpKQorCitzdGF0aWMgaW50IHVkbWFfcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5hdnNz X25vZGUgPSBwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2UgKmRldiA9 ICZwZGV2LT5kZXY7CisJc3RydWN0IHVkbWFfZGV2ICp1ZDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2 aWNlX2lkICptYXRjaDsKKwlpbnQgaSwgcmV0OworCWludCBjaF9jb3VudDsKKworCXJldCA9IGRt YV9jb2VyY2VfbWFza19hbmRfY29oZXJlbnQoZGV2LCBETUFfQklUX01BU0soNDgpKTsKKwlpZiAo cmV0KQorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzZXQgZG1hIG1hc2sgc3R1ZmZcbiIpOwor CisJdWQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnVkKSwgR0ZQX0tFUk5FTCk7CisJaWYg KCF1ZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSB1ZG1hX2dldF9tbXJzKHBkZXYsIHVk KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdWQtPnRpc2NpX3JtLnRpc2NpID0gdGlf c2NpX2dldF9ieV9waGFuZGxlKGRldi0+b2Zfbm9kZSwgInRpLHNjaSIpOworCWlmIChJU19FUlIo dWQtPnRpc2NpX3JtLnRpc2NpKSkKKwkJcmV0dXJuIFBUUl9FUlIodWQtPnRpc2NpX3JtLnRpc2Np KTsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgInRpLHNjaS1k ZXYtaWQiLAorCQkJCSAgICZ1ZC0+dGlzY2lfcm0udGlzY2lfZGV2X2lkKTsKKwlpZiAocmV0KSB7 CisJCWRldl9lcnIoZGV2LCAidGksc2NpLWRldi1pZCByZWFkIGZhaWx1cmUgJWRcbiIsIHJldCk7 CisJCXJldHVybiByZXQ7CisJfQorCXBkZXYtPmlkID0gdWQtPnRpc2NpX3JtLnRpc2NpX2Rldl9p ZDsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5hdnNzX25vZGUsICJ0aSxzY2ktZGV2 LWlkIiwKKwkJCQkgICAmdWQtPnRpc2NpX3JtLnRpc2NpX25hdnNzX2Rldl9pZCk7CisJaWYgKHJl dCkgeworCQlkZXZfZXJyKGRldiwgIk5BVlNTIHRpLHNjaS1kZXYtaWQgcmVhZCBmYWlsdXJlICVk XG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXVkLT50aXNjaV9ybS50aXNjaV91ZG1h cF9vcHMgPSAmdWQtPnRpc2NpX3JtLnRpc2NpLT5vcHMucm1fdWRtYXBfb3BzOworCXVkLT50aXNj aV9ybS50aXNjaV9wc2lsX29wcyA9ICZ1ZC0+dGlzY2lfcm0udGlzY2ktPm9wcy5ybV9wc2lsX29w czsKKworCXVkLT5yaW5nYWNjID0gb2ZfazNfcmluZ2FjY19nZXRfYnlfcGhhbmRsZShkZXYtPm9m X25vZGUsICJ0aSxyaW5nYWNjIik7CisJaWYgKElTX0VSUih1ZC0+cmluZ2FjYykpCisJCXJldHVy biBQVFJfRVJSKHVkLT5yaW5nYWNjKTsKKworCWRldi0+bXNpX2RvbWFpbiA9IG9mX21zaV9nZXRf ZG9tYWluKGRldiwgZGV2LT5vZl9ub2RlLAorCQkJCQkgICAgRE9NQUlOX0JVU19USV9TQ0lfSU5U QV9NU0kpOworCWlmICghZGV2LT5tc2lfZG9tYWluKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVk IHRvIGdldCBNU0kgZG9tYWluXG4iKTsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCisJ bWF0Y2ggPSBvZl9tYXRjaF9ub2RlKHVkbWFfb2ZfbWF0Y2gsIGRldi0+b2Zfbm9kZSk7CisJaWYg KCFtYXRjaCkgeworCQlkZXZfZXJyKGRldiwgIk5vIGNvbXBhdGlibGUgbWF0Y2ggZm91bmRcbiIp OworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdWQtPm1hdGNoX2RhdGEgPSBtYXRjaC0+ZGF0YTsK KworCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgdWQtPmRkZXYuY2FwX21hc2spOworCWRtYV9jYXBf c2V0KERNQV9DWUNMSUMsIHVkLT5kZGV2LmNhcF9tYXNrKTsKKworCXVkLT5kZGV2LmRldmljZV9h bGxvY19jaGFuX3Jlc291cmNlcyA9IHVkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXM7CisJdWQtPmRk ZXYuZGV2aWNlX2NvbmZpZyA9IHVkbWFfc2xhdmVfY29uZmlnOworCXVkLT5kZGV2LmRldmljZV9w cmVwX3NsYXZlX3NnID0gdWRtYV9wcmVwX3NsYXZlX3NnOworCXVkLT5kZGV2LmRldmljZV9wcmVw X2RtYV9jeWNsaWMgPSB1ZG1hX3ByZXBfZG1hX2N5Y2xpYzsKKwl1ZC0+ZGRldi5kZXZpY2VfaXNz dWVfcGVuZGluZyA9IHVkbWFfaXNzdWVfcGVuZGluZzsKKwl1ZC0+ZGRldi5kZXZpY2VfdHhfc3Rh dHVzID0gdWRtYV90eF9zdGF0dXM7CisJdWQtPmRkZXYuZGV2aWNlX3BhdXNlID0gdWRtYV9wYXVz ZTsKKwl1ZC0+ZGRldi5kZXZpY2VfcmVzdW1lID0gdWRtYV9yZXN1bWU7CisJdWQtPmRkZXYuZGV2 aWNlX3Rlcm1pbmF0ZV9hbGwgPSB1ZG1hX3Rlcm1pbmF0ZV9hbGw7CisJdWQtPmRkZXYuZGV2aWNl X3N5bmNocm9uaXplID0gdWRtYV9zeW5jaHJvbml6ZTsKKworCXVkLT5kZGV2LmRldmljZV9mcmVl X2NoYW5fcmVzb3VyY2VzID0gdWRtYV9mcmVlX2NoYW5fcmVzb3VyY2VzOworCXVkLT5kZGV2LnNy Y19hZGRyX3dpZHRocyA9IFRJX1VETUFDX0JVU1dJRFRIUzsKKwl1ZC0+ZGRldi5kc3RfYWRkcl93 aWR0aHMgPSBUSV9VRE1BQ19CVVNXSURUSFM7CisJdWQtPmRkZXYuZGlyZWN0aW9ucyA9IEJJVChE TUFfREVWX1RPX01FTSkgfCBCSVQoRE1BX01FTV9UT19ERVYpOworCXVkLT5kZGV2LnJlc2lkdWVf Z3JhbnVsYXJpdHkgPSBETUFfUkVTSURVRV9HUkFOVUxBUklUWV9CVVJTVDsKKwl1ZC0+ZGRldi5j b3B5X2FsaWduID0gRE1BRU5HSU5FX0FMSUdOXzhfQllURVM7CisJdWQtPmRkZXYuZGVzY19tZXRh ZGF0YV9tb2RlcyA9IERFU0NfTUVUQURBVEFfQ0xJRU5UIHwKKwkJCQkgICAgICAgREVTQ19NRVRB REFUQV9FTkdJTkU7CisJaWYgKHVkLT5tYXRjaF9kYXRhLT5lbmFibGVfbWVtY3B5X3N1cHBvcnQp IHsKKwkJZG1hX2NhcF9zZXQoRE1BX01FTUNQWSwgdWQtPmRkZXYuY2FwX21hc2spOworCQl1ZC0+ ZGRldi5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5ID0gdWRtYV9wcmVwX2RtYV9tZW1jcHk7CisJCXVk LT5kZGV2LmRpcmVjdGlvbnMgfD0gQklUKERNQV9NRU1fVE9fTUVNKTsKKwl9CisKKwl1ZC0+ZGRl di5kZXYgPSBkZXY7CisJdWQtPmRldiA9IGRldjsKKwl1ZC0+cHNpbF9iYXNlID0gdWQtPm1hdGNo X2RhdGEtPnBzaWxfYmFzZTsKKworCUlOSVRfTElTVF9IRUFEKCZ1ZC0+ZGRldi5jaGFubmVscyk7 CisJSU5JVF9MSVNUX0hFQUQoJnVkLT5kZXNjX3RvX3B1cmdlKTsKKworCWNoX2NvdW50ID0gdWRt YV9zZXR1cF9yZXNvdXJjZXModWQpOworCWlmIChjaF9jb3VudCA8PSAwKQorCQlyZXR1cm4gY2hf Y291bnQ7CisKKwlzcGluX2xvY2tfaW5pdCgmdWQtPmxvY2spOworCUlOSVRfV09SSygmdWQtPnB1 cmdlX3dvcmssIHVkbWFfcHVyZ2VfZGVzY193b3JrKTsKKworCXVkLT5kZXNjX2FsaWduID0gNjQ7 CisJaWYgKHVkLT5kZXNjX2FsaWduIDwgZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQoKSkKKwkJdWQt PmRlc2NfYWxpZ24gPSBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCgpOworCisJZm9yIChpID0gMDsg aSA8IHVkLT50Y2hhbl9jbnQ7IGkrKykgeworCQlzdHJ1Y3QgdWRtYV90Y2hhbiAqdGNoYW4gPSAm dWQtPnRjaGFuc1tpXTsKKworCQl0Y2hhbi0+aWQgPSBpOworCQl0Y2hhbi0+cmVnX3J0ID0gdWQt Pm1tcnNbTU1SX1RDSEFOUlRdICsgaSAqIDB4MTAwMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwg dWQtPnJjaGFuX2NudDsgaSsrKSB7CisJCXN0cnVjdCB1ZG1hX3JjaGFuICpyY2hhbiA9ICZ1ZC0+ cmNoYW5zW2ldOworCisJCXJjaGFuLT5pZCA9IGk7CisJCXJjaGFuLT5yZWdfcnQgPSB1ZC0+bW1y c1tNTVJfUkNIQU5SVF0gKyBpICogMHgxMDAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCB1ZC0+ cmZsb3dfY250OyBpKyspIHsKKwkJc3RydWN0IHVkbWFfcmZsb3cgKnJmbG93ID0gJnVkLT5yZmxv d3NbaV07CisKKwkJcmZsb3ctPmlkID0gaTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hfY291 bnQ7IGkrKykgeworCQlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9ICZ1ZC0+Y2hhbm5lbHNbaV07CisK KwkJdWMtPnVkID0gdWQ7CisJCXVjLT52Yy5kZXNjX2ZyZWUgPSB1ZG1hX2Rlc2NfZnJlZTsKKwkJ dWMtPmlkID0gaTsKKwkJdWMtPnRjaGFuID0gTlVMTDsKKwkJdWMtPnJjaGFuID0gTlVMTDsKKwkJ dWMtPmNvbmZpZy5yZW1vdGVfdGhyZWFkX2lkID0gLTE7CisJCXVjLT5jb25maWcuZGlyID0gRE1B X01FTV9UT19NRU07CisJCXVjLT5uYW1lID0gZGV2bV9rYXNwcmludGYoZGV2LCBHRlBfS0VSTkVM LCAiJXMgY2hhbiVkIiwKKwkJCQkJICBkZXZfbmFtZShkZXYpLCBpKTsKKworCQl2Y2hhbl9pbml0 KCZ1Yy0+dmMsICZ1ZC0+ZGRldik7CisJCS8qIFVzZSBjdXN0b20gdmNoYW4gY29tcGxldGlvbiBo YW5kbGluZyAqLworCQl0YXNrbGV0X2luaXQoJnVjLT52Yy50YXNrLCB1ZG1hX3ZjaGFuX2NvbXBs ZXRlLAorCQkJICAgICAodW5zaWduZWQgbG9uZykmdWMtPnZjKTsKKwkJaW5pdF9jb21wbGV0aW9u KCZ1Yy0+dGVhcmRvd25fY29tcGxldGVkKTsKKwl9CisKKwlyZXQgPSBkbWFfYXN5bmNfZGV2aWNl X3JlZ2lzdGVyKCZ1ZC0+ZGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxl ZCB0byByZWdpc3RlciBzbGF2ZSBETUEgZW5naW5lOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJl dDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB1ZCk7CisKKwlyZXQgPSBvZl9k bWFfY29udHJvbGxlcl9yZWdpc3RlcihkZXYtPm9mX25vZGUsIHVkbWFfb2ZfeGxhdGUsIHVkKTsK KwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIG9mX2RtYSBj b250cm9sbGVyXG4iKTsKKwkJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKCZ1ZC0+ZGRldik7 CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIg dWRtYV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAidGktdWRtYSIsCisJCS5v Zl9tYXRjaF90YWJsZSA9IHVkbWFfb2ZfbWF0Y2gsCisJCS5zdXBwcmVzc19iaW5kX2F0dHJzID0g dHJ1ZSwKKwl9LAorCS5wcm9iZQkJPSB1ZG1hX3Byb2JlLAorfTsKK2J1aWx0aW5fcGxhdGZvcm1f ZHJpdmVyKHVkbWFfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3RpL2szLXVkbWEu aCBiL2RyaXZlcnMvZG1hL3RpL2szLXVkbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMDAuLmZmNDI4ZjgyM2U2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZG1h L3RpL2szLXVkbWEuaApAQCAtMCwwICsxLDEyMCBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IEdQTC0yLjAgKi8KKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDE5IFRleGFzIEluc3RydW1l bnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tCisgKi8KKworI2lmbmRlZiBLM19V RE1BX0hfCisjZGVmaW5lIEszX1VETUFfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NvYy90aS90aV9z Y2lfcHJvdG9jb2wuaD4KKworLyogR2xvYmFsIHJlZ2lzdGVycyAqLworI2RlZmluZSBVRE1BX1JF Vl9SRUcJCQkweDAKKyNkZWZpbmUgVURNQV9QRVJGX0NUTF9SRUcJCTB4NAorI2RlZmluZSBVRE1B X0VNVV9DVExfUkVHCQkweDgKKyNkZWZpbmUgVURNQV9QU0lMX1RPX1JFRwkJMHgxMAorI2RlZmlu ZSBVRE1BX1VUQ19DVExfUkVHCQkweDFjCisjZGVmaW5lIFVETUFfQ0FQX1JFRyhpKQkJCSgweDIw ICsgKChpKSAqIDQpKQorI2RlZmluZSBVRE1BX1JYX0ZMT1dfSURfRldfT0VTX1JFRwkweDgwCisj ZGVmaW5lIFVETUFfUlhfRkxPV19JRF9GV19TVEFUVVNfUkVHCTB4ODgKKworLyogVFggY2hhbiBS VCByZWdzICovCisjZGVmaW5lIFVETUFfVENIQU5fUlRfQ1RMX1JFRwkJMHgwCisjZGVmaW5lIFVE TUFfVENIQU5fUlRfU1dUUklHX1JFRwkweDgKKyNkZWZpbmUgVURNQV9UQ0hBTl9SVF9TVERBVEFf UkVHCTB4ODAKKworI2RlZmluZSBVRE1BX1RDSEFOX1JUX1BFRVJfUkVHKGkpCSgweDIwMCArICgo aSkgKiAweDQpKQorI2RlZmluZSBVRE1BX1RDSEFOX1JUX1BFRVJfU1RBVElDX1RSX1hZX1JFRwlc CisJVURNQV9UQ0hBTl9SVF9QRUVSX1JFRygwKQkvKiBQU0ktTDogMHg0MDAgKi8KKyNkZWZpbmUg VURNQV9UQ0hBTl9SVF9QRUVSX1NUQVRJQ19UUl9aX1JFRwlcCisJVURNQV9UQ0hBTl9SVF9QRUVS X1JFRygxKQkvKiBQU0ktTDogMHg0MDEgKi8KKyNkZWZpbmUgVURNQV9UQ0hBTl9SVF9QRUVSX0JD TlRfUkVHCQlcCisJVURNQV9UQ0hBTl9SVF9QRUVSX1JFRyg0KQkvKiBQU0ktTDogMHg0MDQgKi8K KyNkZWZpbmUgVURNQV9UQ0hBTl9SVF9QRUVSX1JUX0VOX1JFRwkJXAorCVVETUFfVENIQU5fUlRf UEVFUl9SRUcoOCkJLyogUFNJLUw6IDB4NDA4ICovCisKKyNkZWZpbmUgVURNQV9UQ0hBTl9SVF9Q Q05UX1JFRwkJMHg0MDAKKyNkZWZpbmUgVURNQV9UQ0hBTl9SVF9CQ05UX1JFRwkJMHg0MDgKKyNk ZWZpbmUgVURNQV9UQ0hBTl9SVF9TQkNOVF9SRUcJCTB4NDEwCisKKy8qIFJYIGNoYW4gUlQgcmVn cyAqLworI2RlZmluZSBVRE1BX1JDSEFOX1JUX0NUTF9SRUcJCTB4MAorI2RlZmluZSBVRE1BX1JD SEFOX1JUX1NXVFJJR19SRUcJMHg4CisjZGVmaW5lIFVETUFfUkNIQU5fUlRfU1REQVRBX1JFRwkw eDgwCisKKyNkZWZpbmUgVURNQV9SQ0hBTl9SVF9QRUVSX1JFRyhpKQkoMHgyMDAgKyAoKGkpICog MHg0KSkKKyNkZWZpbmUgVURNQV9SQ0hBTl9SVF9QRUVSX1NUQVRJQ19UUl9YWV9SRUcJXAorCVVE TUFfUkNIQU5fUlRfUEVFUl9SRUcoMCkJLyogUFNJLUw6IDB4NDAwICovCisjZGVmaW5lIFVETUFf UkNIQU5fUlRfUEVFUl9TVEFUSUNfVFJfWl9SRUcJXAorCVVETUFfUkNIQU5fUlRfUEVFUl9SRUco MSkJLyogUFNJLUw6IDB4NDAxICovCisjZGVmaW5lIFVETUFfUkNIQU5fUlRfUEVFUl9CQ05UX1JF RwkJXAorCVVETUFfUkNIQU5fUlRfUEVFUl9SRUcoNCkJLyogUFNJLUw6IDB4NDA0ICovCisjZGVm aW5lIFVETUFfUkNIQU5fUlRfUEVFUl9SVF9FTl9SRUcJCVwKKwlVRE1BX1JDSEFOX1JUX1BFRVJf UkVHKDgpCS8qIFBTSS1MOiAweDQwOCAqLworCisjZGVmaW5lIFVETUFfUkNIQU5fUlRfUENOVF9S RUcJCTB4NDAwCisjZGVmaW5lIFVETUFfUkNIQU5fUlRfQkNOVF9SRUcJCTB4NDA4CisjZGVmaW5l IFVETUFfUkNIQU5fUlRfU0JDTlRfUkVHCQkweDQxMAorCisvKiBVRE1BX1RDSEFOX1JUX0NUTF9S RUcvVURNQV9SQ0hBTl9SVF9DVExfUkVHICovCisjZGVmaW5lIFVETUFfQ0hBTl9SVF9DVExfRU4J CUJJVCgzMSkKKyNkZWZpbmUgVURNQV9DSEFOX1JUX0NUTF9URE9XTgkJQklUKDMwKQorI2RlZmlu ZSBVRE1BX0NIQU5fUlRfQ1RMX1BBVVNFCQlCSVQoMjkpCisjZGVmaW5lIFVETUFfQ0hBTl9SVF9D VExfRlRET1dOCQlCSVQoMjgpCisjZGVmaW5lIFVETUFfQ0hBTl9SVF9DVExfRVJST1IJCUJJVCgw KQorCisvKiBVRE1BX1RDSEFOX1JUX1BFRVJfUlRfRU5fUkVHL1VETUFfUkNIQU5fUlRfUEVFUl9S VF9FTl9SRUcgKFBTSS1MOiAweDQwOCkgKi8KKyNkZWZpbmUgVURNQV9QRUVSX1JUX0VOX0VOQUJM RQkJQklUKDMxKQorI2RlZmluZSBVRE1BX1BFRVJfUlRfRU5fVEVBUkRPV04JQklUKDMwKQorI2Rl ZmluZSBVRE1BX1BFRVJfUlRfRU5fUEFVU0UJCUJJVCgyOSkKKyNkZWZpbmUgVURNQV9QRUVSX1JU X0VOX0ZMVVNICQlCSVQoMjgpCisjZGVmaW5lIFVETUFfUEVFUl9SVF9FTl9JRExFCQlCSVQoMSkK KworLyoKKyAqIFVETUFfVENIQU5fUlRfUEVFUl9TVEFUSUNfVFJfWFlfUkVHIC8KKyAqIFVETUFf UkNIQU5fUlRfUEVFUl9TVEFUSUNfVFJfWFlfUkVHCisgKi8KKyNkZWZpbmUgUERNQV9TVEFUSUNf VFJfWF9NQVNLCQlHRU5NQVNLKDI2LCAyNCkKKyNkZWZpbmUgUERNQV9TVEFUSUNfVFJfWF9TSElG VAkJKDI0KQorI2RlZmluZSBQRE1BX1NUQVRJQ19UUl9ZX01BU0sJCUdFTk1BU0soMTEsIDApCisj ZGVmaW5lIFBETUFfU1RBVElDX1RSX1lfU0hJRlQJCSgwKQorCisjZGVmaW5lIFBETUFfU1RBVElD X1RSX1koeCkJXAorCSgoKHgpIDw8IFBETUFfU1RBVElDX1RSX1lfU0hJRlQpICYgUERNQV9TVEFU SUNfVFJfWV9NQVNLKQorI2RlZmluZSBQRE1BX1NUQVRJQ19UUl9YKHgpCVwKKwkoKCh4KSA8PCBQ RE1BX1NUQVRJQ19UUl9YX1NISUZUKSAmIFBETUFfU1RBVElDX1RSX1hfTUFTSykKKworI2RlZmlu ZSBQRE1BX1NUQVRJQ19UUl9YWV9BQ0MzMgkJQklUKDMwKQorI2RlZmluZSBQRE1BX1NUQVRJQ19U Ul9YWV9CVVJTVAkJQklUKDMxKQorCisvKgorICogVURNQV9UQ0hBTl9SVF9QRUVSX1NUQVRJQ19U Ul9aX1JFRyAvCisgKiBVRE1BX1JDSEFOX1JUX1BFRVJfU1RBVElDX1RSX1pfUkVHCisgKi8KKyNk ZWZpbmUgUERNQV9TVEFUSUNfVFJfWih4LCBtYXNrKQkoKHgpICYgKG1hc2spKQorCitzdHJ1Y3Qg dWRtYV9kZXY7CitzdHJ1Y3QgdWRtYV90Y2hhbjsKK3N0cnVjdCB1ZG1hX3JjaGFuOworc3RydWN0 IHVkbWFfcmZsb3c7CisKK2VudW0gdWRtYV9ybV9yYW5nZSB7CisJUk1fUkFOR0VfVENIQU4gPSAw LAorCVJNX1JBTkdFX1JDSEFOLAorCVJNX1JBTkdFX1JGTE9XLAorCVJNX1JBTkdFX0xBU1QsCit9 OworCitzdHJ1Y3QgdWRtYV90aXNjaV9ybSB7CisJY29uc3Qgc3RydWN0IHRpX3NjaV9oYW5kbGUg KnRpc2NpOworCWNvbnN0IHN0cnVjdCB0aV9zY2lfcm1fdWRtYXBfb3BzICp0aXNjaV91ZG1hcF9v cHM7CisJdTMyICB0aXNjaV9kZXZfaWQ7CisKKwkvKiB0aXNjaSBpbmZvcm1hdGlvbiBmb3IgUFNJ LUwgdGhyZWFkIHBhaXJpbmcvdW5wYWlyaW5nICovCisJY29uc3Qgc3RydWN0IHRpX3NjaV9ybV9w c2lsX29wcyAqdGlzY2lfcHNpbF9vcHM7CisJdTMyICB0aXNjaV9uYXZzc19kZXZfaWQ7CisKKwlz dHJ1Y3QgdGlfc2NpX3Jlc291cmNlICpybV9yYW5nZXNbUk1fUkFOR0VfTEFTVF07Cit9OworCisj ZW5kaWYgLyogSzNfVURNQV9IXyAqLwotLSAKUGV0ZXIKClRleGFzIEluc3RydW1lbnRzIEZpbmxh bmQgT3ksIFBvcmtrYWxhbmthdHUgMjIsIDAwMTgwIEhlbHNpbmtpLgpZLXR1bm51cy9CdXNpbmVz cyBJRDogMDYxNTUyMS00LiBLb3RpcGFpa2thL0RvbWljaWxlOiBIZWxzaW5raQoKCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwg bWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8v bGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK