From owner-freebsd-arm@FreeBSD.ORG Thu Apr 23 18:07:25 2015 Return-Path: Delivered-To: freebsd-arm@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 98B4E1A9 for ; Thu, 23 Apr 2015 18:07:25 +0000 (UTC) Received: from phabric-backend.isc.freebsd.org (phabric-backend.isc.freebsd.org [IPv6:2001:4f8:3:ffe0:406a:0:50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 79EF11F94 for ; Thu, 23 Apr 2015 18:07:25 +0000 (UTC) Received: from phabric-backend.isc.freebsd.org (phabric-backend.isc.freebsd.org [127.0.1.5]) by phabric-backend.isc.freebsd.org (8.14.9/8.14.9) with ESMTP id t3NI7PGD092958 for ; Thu, 23 Apr 2015 18:07:25 GMT (envelope-from daemon-user@phabric-backend.isc.freebsd.org) Received: (from daemon-user@localhost) by phabric-backend.isc.freebsd.org (8.14.9/8.14.9/Submit) id t3NI7PQb092957; Thu, 23 Apr 2015 18:07:25 GMT (envelope-from daemon-user) Date: Thu, 23 Apr 2015 18:07:25 +0000 To: freebsd-arm@freebsd.org From: "zbb (Zbigniew Bodek)" Subject: [Differential] [Request, 1, 520 lines] D2357: Port x86 busdma to ARM64 Message-ID: X-Priority: 3 Thread-Topic: D2357: Port x86 busdma to ARM64 X-Herald-Rules: <34> X-Phabricator-To: X-Phabricator-To: X-Phabricator-To: X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: Thread-Index: MGY3ZjQ1YWY5OGJjZWFlYzE0YWJhYTBhN2U5 Precedence: bulk X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: , , , MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_8438b44d4f3b7e535062a5c7553b260f" X-BeenThere: freebsd-arm@freebsd.org X-Mailman-Version: 2.1.20 List-Id: "Porting FreeBSD to ARM processors." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Apr 2015 18:07:25 -0000 --b1_8438b44d4f3b7e535062a5c7553b260f Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: 8bit zbb created this revision. zbb added reviewers: emaste, ian, imp, andrew. zbb added a subscriber: freebsd-arm. Herald added a subscriber: emaste. REVISION SUMMARY The x86 busdma subsystem allows using multiple implementations. By default the classic bounce buffer approach is used, however on systems with IOMMU it could be in runtime switched to more efficient hardware accelerated implementation. This commit adds ARM64 port of the x86 busdma framework and bounce buffer backend. It is ready to use on IO coherent systems. If the IO coherency cannot be guaranteed, the cache management operations have to be added to this code in places marked by /* XXX ARM64TODO (...) */ comments. Also IOMMU support might be added by registering another busdma implementation like it is already done on the x86. Obtained from: Semihalf Sponsored by: The FreeBSD Foundation REVISION DETAIL https://reviews.freebsd.org/D2357 AFFECTED FILES sys/arm64/arm64/busdma_bounce.c sys/arm64/arm64/busdma_machdep.c sys/arm64/include/bus_dma.h sys/arm64/include/bus_dma_impl.h sys/conf/files.arm64 EMAIL PREFERENCES https://reviews.freebsd.org/settings/panel/emailpreferences/ To: zbb, emaste, ian, imp, andrew Cc: emaste, freebsd-arm --b1_8438b44d4f3b7e535062a5c7553b260f Content-Type: text/x-patch; charset=utf-8; name="D2357.4971.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D2357.4971.patch" ZGlmZiAtLWdpdCBhL3N5cy9jb25mL2ZpbGVzLmFybTY0IGIvc3lzL2NvbmYvZmlsZXMuYXJtNjQK LS0tIGEvc3lzL2NvbmYvZmlsZXMuYXJtNjQKKysrIGIvc3lzL2NvbmYvZmlsZXMuYXJtNjQKQEAg LTUsNiArNSw3IEBACiBhcm02NC9hcm02NC9iY29weS5jCQlzdGFuZGFyZAogYXJtNjQvYXJtNjQv YnVzX21hY2hkZXAuYwlzdGFuZGFyZAogYXJtNjQvYXJtNjQvYnVzX3NwYWNlX2FzbS5TCXN0YW5k YXJkCithcm02NC9hcm02NC9idXNkbWFfYm91bmNlLmMJc3RhbmRhcmQKIGFybTY0L2FybTY0L2J1 c2RtYV9tYWNoZGVwLmMJc3RhbmRhcmQKIGFybTY0L2FybTY0L2Nsb2NrLmMJCXN0YW5kYXJkCiBh cm02NC9hcm02NC9jb3B5aW5vdXQuUwkJc3RhbmRhcmQKZGlmZiAtLWdpdCBhL3N5cy9hcm02NC9p bmNsdWRlL2J1c19kbWFfaW1wbC5oIGIvc3lzL2FybTY0L2luY2x1ZGUvYnVzX2RtYV9pbXBsLmgK bmV3IGZpbGUgbW9kZSAxMDA2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvYXJtNjQvaW5jbHVk ZS9idXNfZG1hX2ltcGwuaApAQCAtMCwwICsxLDk2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykg MjAxMyBUaGUgRnJlZUJTRCBGb3VuZGF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK KyAqIFRoaXMgc29mdHdhcmUgd2FzIGRldmVsb3BlZCBieSBLb25zdGFudGluIEJlbG91c292IDxr aWJARnJlZUJTRC5vcmc+CisgKiB1bmRlciBzcG9uc29yc2hpcCBmcm9tIHRoZSBGcmVlQlNEIEZv dW5kYXRpb24uCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0 ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU SEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1Mg T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI QUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJF Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF TlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FV U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg U1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERB TUFHRS4KKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaWZuZGVmCV9fQVJNNjRfQlVTX0RNQV9J TVBMX0gKKyNkZWZpbmUJX19BUk02NF9CVVNfRE1BX0lNUExfSAorCitzdHJ1Y3QgYnVzX2RtYV90 YWdfY29tbW9uIHsKKwlzdHJ1Y3QgYnVzX2RtYV9pbXBsICppbXBsOworCXN0cnVjdCBidXNfZG1h X3RhZ19jb21tb24gKnBhcmVudDsKKwlidXNfc2l6ZV90CSAgYWxpZ25tZW50OworCWJ1c19hZGRy X3QJICBib3VuZGFyeTsKKwlidXNfYWRkcl90CSAgbG93YWRkcjsKKwlidXNfYWRkcl90CSAgaGln aGFkZHI7CisJYnVzX2RtYV9maWx0ZXJfdCAqZmlsdGVyOworCXZvaWQJCSAqZmlsdGVyYXJnOwor CWJ1c19zaXplX3QJICBtYXhzaXplOworCXVfaW50CQkgIG5zZWdtZW50czsKKwlidXNfc2l6ZV90 CSAgbWF4c2Vnc3o7CisJaW50CQkgIGZsYWdzOworCWJ1c19kbWFfbG9ja190CSAqbG9ja2Z1bmM7 CisJdm9pZAkJICpsb2NrZnVuY2FyZzsKKwlpbnQJCSAgcmVmX2NvdW50OworfTsKKworc3RydWN0 IGJ1c19kbWFfaW1wbCB7CisJaW50ICgqdGFnX2NyZWF0ZSkoYnVzX2RtYV90YWdfdCBwYXJlbnQs CisJICAgIGJ1c19zaXplX3QgYWxpZ25tZW50LCBidXNfYWRkcl90IGJvdW5kYXJ5LCBidXNfYWRk cl90IGxvd2FkZHIsCisJICAgIGJ1c19hZGRyX3QgaGlnaGFkZHIsIGJ1c19kbWFfZmlsdGVyX3Qg KmZpbHRlciwKKwkgICAgdm9pZCAqZmlsdGVyYXJnLCBidXNfc2l6ZV90IG1heHNpemUsIGludCBu c2VnbWVudHMsCisJICAgIGJ1c19zaXplX3QgbWF4c2Vnc3osIGludCBmbGFncywgYnVzX2RtYV9s b2NrX3QgKmxvY2tmdW5jLAorCSAgICB2b2lkICpsb2NrZnVuY2FyZywgYnVzX2RtYV90YWdfdCAq ZG1hdCk7CisJaW50ICgqdGFnX2Rlc3Ryb3kpKGJ1c19kbWFfdGFnX3QgZG1hdCk7CisJaW50ICgq bWFwX2NyZWF0ZSkoYnVzX2RtYV90YWdfdCBkbWF0LCBpbnQgZmxhZ3MsIGJ1c19kbWFtYXBfdCAq bWFwcCk7CisJaW50ICgqbWFwX2Rlc3Ryb3kpKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1h cF90IG1hcCk7CisJaW50ICgqbWVtX2FsbG9jKShidXNfZG1hX3RhZ190IGRtYXQsIHZvaWQqKiB2 YWRkciwgaW50IGZsYWdzLAorCSAgICBidXNfZG1hbWFwX3QgKm1hcHApOworCXZvaWQgKCptZW1f ZnJlZSkoYnVzX2RtYV90YWdfdCBkbWF0LCB2b2lkICp2YWRkciwgYnVzX2RtYW1hcF90IG1hcCk7 CisJaW50ICgqbG9hZF9tYSkoYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLAor CSAgICBzdHJ1Y3Qgdm1fcGFnZSAqKm1hLCBidXNfc2l6ZV90IHRsZW4sIGludCBtYV9vZmZzLCBp bnQgZmxhZ3MsCisJICAgIGJ1c19kbWFfc2VnbWVudF90ICpzZWdzLCBpbnQgKnNlZ3ApOworCWlu dCAoKmxvYWRfcGh5cykoYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLAorCSAg ICB2bV9wYWRkcl90IGJ1ZiwgYnVzX3NpemVfdCBidWZsZW4sIGludCBmbGFncywKKwkgICAgYnVz X2RtYV9zZWdtZW50X3QgKnNlZ3MsIGludCAqc2VncCk7CisJaW50ICgqbG9hZF9idWZmZXIpKGJ1 c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwKKwkgICAgdm9pZCAqYnVmLCBidXNf c2l6ZV90IGJ1ZmxlbiwgcG1hcF90IHBtYXAsIGludCBmbGFncywKKwkgICAgYnVzX2RtYV9zZWdt ZW50X3QgKnNlZ3MsIGludCAqc2VncCk7CisJdm9pZCAoKm1hcF93YWl0b2spKGJ1c19kbWFfdGFn X3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwKKwkgICAgc3RydWN0IG1lbWRlc2MgKm1lbSwgYnVz X2RtYW1hcF9jYWxsYmFja190ICpjYWxsYmFjaywKKwkgICAgdm9pZCAqY2FsbGJhY2tfYXJnKTsK KwlidXNfZG1hX3NlZ21lbnRfdCAqKCptYXBfY29tcGxldGUpKGJ1c19kbWFfdGFnX3QgZG1hdCwg YnVzX2RtYW1hcF90IG1hcCwKKwkgICAgYnVzX2RtYV9zZWdtZW50X3QgKnNlZ3MsIGludCBuc2Vn cywgaW50IGVycm9yKTsKKwl2b2lkICgqbWFwX3VubG9hZCkoYnVzX2RtYV90YWdfdCBkbWF0LCBi dXNfZG1hbWFwX3QgbWFwKTsKKwl2b2lkICgqbWFwX3N5bmMpKGJ1c19kbWFfdGFnX3QgZG1hdCwg YnVzX2RtYW1hcF90IG1hcCwKKwkgICAgYnVzX2RtYXN5bmNfb3BfdCBvcCk7Cit9OworCit2b2lk IGJ1c19kbWFfZGZsdF9sb2NrKHZvaWQgKmFyZywgYnVzX2RtYV9sb2NrX29wX3Qgb3ApOworaW50 IGJ1c19kbWFfcnVuX2ZpbHRlcihzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICpkbWF0LCBidXNf YWRkcl90IHBhZGRyKTsKK2ludCBjb21tb25fYnVzX2RtYV90YWdfY3JlYXRlKHN0cnVjdCBidXNf ZG1hX3RhZ19jb21tb24gKnBhcmVudCwKKyAgICBidXNfc2l6ZV90IGFsaWdubWVudCwKKyAgICBi dXNfYWRkcl90IGJvdW5kYXJ5LCBidXNfYWRkcl90IGxvd2FkZHIsIGJ1c19hZGRyX3QgaGlnaGFk ZHIsCisgICAgYnVzX2RtYV9maWx0ZXJfdCAqZmlsdGVyLCB2b2lkICpmaWx0ZXJhcmcsIGJ1c19z aXplX3QgbWF4c2l6ZSwKKyAgICBpbnQgbnNlZ21lbnRzLCBidXNfc2l6ZV90IG1heHNlZ3N6LCBp bnQgZmxhZ3MsIGJ1c19kbWFfbG9ja190ICpsb2NrZnVuYywKKyAgICB2b2lkICpsb2NrZnVuY2Fy Zywgc2l6ZV90IHN6LCB2b2lkICoqZG1hdCk7CisKK2V4dGVybiBzdHJ1Y3QgYnVzX2RtYV9pbXBs IGJ1c19kbWFfYm91bmNlX2ltcGw7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzL2FybTY0L2lu Y2x1ZGUvYnVzX2RtYS5oIGIvc3lzL2FybTY0L2luY2x1ZGUvYnVzX2RtYS5oCi0tLSBhL3N5cy9h cm02NC9pbmNsdWRlL2J1c19kbWEuaAorKysgYi9zeXMvYXJtNjQvaW5jbHVkZS9idXNfZG1hLmgK QEAgLTEsOCArMSwzNCBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU2NvdHQgTG9uZwor ICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT IFBST1ZJREVEIEJZIFRIRSBORVRCU0QgRk9VTkRBVElPTiwgSU5DLiBBTkQgQ09OVFJJQlVUT1JT CisgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D TFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5EQVRJT04gT1IgQ09O VFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVU RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV U0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcg SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT RUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCiAvKiAkRnJl ZUJTRCQgKi8KIAotI2lmbmRlZiBfTUFDSElORV9CVVNfRE1BX0hfCi0jZGVmaW5lCV9NQUNISU5F X0JVU19ETUFfSF8KKyNpZm5kZWYgX0FSTTY0X0JVU19ETUFfSF8KKyNkZWZpbmUgX0FSTTY0X0JV U19ETUFfSF8KIAogI2luY2x1ZGUgPHN5cy9idXNfZG1hLmg+CiAKLSNlbmRpZiAvKiAhX01BQ0hJ TkVfQlVTX0RNQV9IXyAqLworI2VuZGlmIC8qIF9BUk02NF9CVVNfRE1BX0hfICovCmRpZmYgLS1n aXQgYS9zeXMvYXJtNjQvYXJtNjQvYnVzZG1hX21hY2hkZXAuYyBiL3N5cy9hcm02NC9hcm02NC9i dXNkbWFfbWFjaGRlcC5jCi0tLSBhL3N5cy9hcm02NC9hcm02NC9idXNkbWFfbWFjaGRlcC5jCisr KyBiL3N5cy9hcm02NC9hcm02NC9idXNkbWFfbWFjaGRlcC5jCkBAIC0xLDY4ICsxLDM1NSBAQAot LyogJEZyZWVCU0QkICovCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMTk5OCBKdXN0aW4g VC4gR2liYnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTUgVGhlIEZyZWVCU0QgRm91bmRh dGlvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIHdhcyBk ZXZlbG9wZWQgYnkgS29uc3RhbnRpbiBCZWxvdXNvdiA8a2liQEZyZWVCU0Qub3JnPgorICogdW5k ZXIgc3BvbnNvcnNoaXAgZnJvbSB0aGUgRnJlZUJTRCBGb3VuZGF0aW9uLgorICoKKyAqIFBvcnRp b25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBkZXZlbG9wZWQgYnkgU2VtaWhhbGYKKyAqIHVuZGVy IHNwb25zb3JzaGlwIG9mIHRoZSBGcmVlQlNEIEZvdW5kYXRpb24uCisgKgorICogUmVkaXN0cmli dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0 CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93 aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291 cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0 aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAq ICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBpbW1lZGlhdGVseSBhdCB0aGUgYmVnaW5uaW5nIG9m IHRoZSBmaWxlLgorICogMi4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQg dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBz b2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisg KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9S UyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisg KiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklC VVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVE SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMK KyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F U1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1Ig VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX QVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP RiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCiAKICNpbmNsdWRlIDxz eXMvY2RlZnMuaD4KIF9fRkJTRElEKCIkRnJlZUJTRCQiKTsKIAogI2luY2x1ZGUgPHN5cy9wYXJh bS5oPgogI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgotCisjaW5jbHVkZSA8c3lzL21hbGxvYy5oPgor I2luY2x1ZGUgPHN5cy9idXMuaD4KKyNpbmNsdWRlIDxzeXMva2VybmVsLmg+CisjaW5jbHVkZSA8 c3lzL2t0ci5oPgorI2luY2x1ZGUgPHN5cy9sb2NrLmg+CisjaW5jbHVkZSA8c3lzL21lbWRlc2Mu aD4KKyNpbmNsdWRlIDxzeXMvbXV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CiAjaW5jbHVk ZSA8dm0vdm0uaD4KKyNpbmNsdWRlIDx2bS92bV9leHRlcm4uaD4KICNpbmNsdWRlIDx2bS9wbWFw Lmg+CiAKICNpbmNsdWRlIDxtYWNoaW5lL2J1cy5oPgorI2luY2x1ZGUgPGFybTY0L2luY2x1ZGUv YnVzX2RtYV9pbXBsLmg+CisKKy8qCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgbWFuaXB1 bGF0aW5nIGRyaXZlciBsb2NrcyBmcm9tIGJ1c2RtYSAoZHVyaW5nCisgKiBidXNkbWFfc3dpLCBm b3IgZXhhbXBsZSkuICBEcml2ZXJzIHRoYXQgZG9uJ3QgcHJvdmlkZSB0aGVpciBvd24gbG9ja3MK KyAqIHNob3VsZCBzcGVjaWZ5ICZHaWFudCB0byBkbWF0LT5sb2NrZnVuY2FyZy4gIERyaXZlcnMg dGhhdCB1c2UgdGhlaXIgb3duCisgKiBub24tbXV0ZXggbG9ja2luZyBzY2hlbWUgZG9uJ3QgaGF2 ZSB0byB1c2UgdGhpcyBhdCBhbGwuCisgKi8KK3ZvaWQKK2J1c2RtYV9sb2NrX211dGV4KHZvaWQg KmFyZywgYnVzX2RtYV9sb2NrX29wX3Qgb3ApCit7CisJc3RydWN0IG10eCAqZG10eDsKKworCWRt dHggPSAoc3RydWN0IG10eCAqKWFyZzsKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBCVVNfRE1BX0xP Q0s6CisJCW10eF9sb2NrKGRtdHgpOworCQlicmVhazsKKwljYXNlIEJVU19ETUFfVU5MT0NLOgor CQltdHhfdW5sb2NrKGRtdHgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwYW5pYygiVW5rbm93 biBvcGVyYXRpb24gMHgleCBmb3IgYnVzZG1hX2xvY2tfbXV0ZXghIiwgb3ApOworCX0KK30KKwor LyoKKyAqIGRmbHRfbG9jayBzaG91bGQgbmV2ZXIgZ2V0IGNhbGxlZC4gIEl0IGdldHMgcHV0IGlu dG8gdGhlIGRtYSB0YWcgd2hlbgorICogbG9ja2Z1bmMgPT0gTlVMTCwgd2hpY2ggaXMgb25seSB2 YWxpZCBpZiB0aGUgbWFwcyB0aGF0IGFyZSBhc3NvY2lhdGVkCisgKiB3aXRoIHRoZSB0YWcgYXJl IG1lYW50IHRvIG5ldmVyIGJlIGRlZmVyZWQuCisgKiBYWFggU2hvdWxkIGhhdmUgYSB3YXkgdG8g aWRlbnRpZnkgd2hpY2ggZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGhlcmUuCisgKi8KK3ZvaWQKK2J1 c19kbWFfZGZsdF9sb2NrKHZvaWQgKmFyZywgYnVzX2RtYV9sb2NrX29wX3Qgb3ApCit7CisKKwlw YW5pYygiZHJpdmVyIGVycm9yOiBidXNkbWEgZGZsdF9sb2NrIGNhbGxlZCIpOworfQorCisvKgor ICogUmV0dXJuIHRydWUgaWYgYSBtYXRjaCBpcyBtYWRlLgorICoKKyAqIFRvIGZpbmQgYSBtYXRj aCB3YWxrIHRoZSBjaGFpbiBvZiBidXNfZG1hX3RhZ190J3MgbG9va2luZyBmb3IgJ3BhZGRyJy4K KyAqCisgKiBJZiBwYWRkciBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgZG1hIHRhZyB0aGVu IGNhbGwgdGhlIGZpbHRlciBjYWxsYmFjaworICogdG8gY2hlY2sgZm9yIGEgbWF0Y2gsIGlmIHRo ZXJlIGlzIG5vIGZpbHRlciBjYWxsYmFjayB0aGVuIGFzc3VtZSBhIG1hdGNoLgorICovCitpbnQK K2J1c19kbWFfcnVuX2ZpbHRlcihzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICp0YywgYnVzX2Fk ZHJfdCBwYWRkcikKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gMDsKKwlkbyB7CisJCWlm ICgoKHBhZGRyID4gdGMtPmxvd2FkZHIgJiYgcGFkZHIgPD0gdGMtPmhpZ2hhZGRyKSB8fAorCQkg ICAgKChwYWRkciAmICh0Yy0+YWxpZ25tZW50IC0gMSkpICE9IDApKSAmJgorCQkgICAgKHRjLT5m aWx0ZXIgPT0gTlVMTCB8fAorCQkgICAgKCp0Yy0+ZmlsdGVyKSh0Yy0+ZmlsdGVyYXJnLCBwYWRk cikgIT0gMCkpCisJCQlyZXR2YWwgPSAxOworCisJCXRjID0gdGMtPnBhcmVudDsJCQorCX0gd2hp bGUgKHJldHZhbCA9PSAwICYmIHRjICE9IE5VTEwpOworCXJldHVybiAocmV0dmFsKTsKK30KKwor aW50Citjb21tb25fYnVzX2RtYV90YWdfY3JlYXRlKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24g KnBhcmVudCwKKyAgICBidXNfc2l6ZV90IGFsaWdubWVudCwgYnVzX2FkZHJfdCBib3VuZGFyeSwg YnVzX2FkZHJfdCBsb3dhZGRyLAorICAgIGJ1c19hZGRyX3QgaGlnaGFkZHIsIGJ1c19kbWFfZmls dGVyX3QgKmZpbHRlciwgdm9pZCAqZmlsdGVyYXJnLAorICAgIGJ1c19zaXplX3QgbWF4c2l6ZSwg aW50IG5zZWdtZW50cywgYnVzX3NpemVfdCBtYXhzZWdzeiwgaW50IGZsYWdzLAorICAgIGJ1c19k bWFfbG9ja190ICpsb2NrZnVuYywgdm9pZCAqbG9ja2Z1bmNhcmcsIHNpemVfdCBzeiwgdm9pZCAq KmRtYXQpCit7CisJdm9pZCAqbmV3dGFnOworCXN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKmNv bW1vbjsKKworCUtBU1NFUlQoc3ogPj0gc2l6ZW9mKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24p LCAoInN6IikpOworCS8qIEJhc2ljIHNhbml0eSBjaGVja2luZyAqLworCWlmIChib3VuZGFyeSAh PSAwICYmIGJvdW5kYXJ5IDwgbWF4c2Vnc3opCisJCW1heHNlZ3N6ID0gYm91bmRhcnk7CisJaWYg KG1heHNlZ3N6ID09IDApCisJCXJldHVybiAoRUlOVkFMKTsKKwkvKiBSZXR1cm4gYSBOVUxMIHRh ZyBvbiBmYWlsdXJlICovCisJKmRtYXQgPSBOVUxMOworCisJbmV3dGFnID0gbWFsbG9jKHN6LCBN X0RFVkJVRiwgTV9aRVJPIHwgTV9OT1dBSVQpOworCWlmIChuZXd0YWcgPT0gTlVMTCkgeworCQlD VFI0KEtUUl9CVVNETUEsICIlcyByZXR1cm5lZCB0YWcgJXAgdGFnIGZsYWdzIDB4JXggZXJyb3Ig JWQiLAorCQkgICAgX19mdW5jX18sIG5ld3RhZywgMCwgRU5PTUVNKTsKKwkJcmV0dXJuIChFTk9N RU0pOworCX0KKworCWNvbW1vbiA9IG5ld3RhZzsKKwljb21tb24tPmltcGwgPSAmYnVzX2RtYV9i b3VuY2VfaW1wbDsKKwljb21tb24tPnBhcmVudCA9IHBhcmVudDsKKwljb21tb24tPmFsaWdubWVu dCA9IGFsaWdubWVudDsKKwljb21tb24tPmJvdW5kYXJ5ID0gYm91bmRhcnk7CisJY29tbW9uLT5s b3dhZGRyID0gdHJ1bmNfcGFnZSgodm1fcGFkZHJfdClsb3dhZGRyKSArIChQQUdFX1NJWkUgLSAx KTsKKwljb21tb24tPmhpZ2hhZGRyID0gdHJ1bmNfcGFnZSgodm1fcGFkZHJfdCloaWdoYWRkcikg KyAoUEFHRV9TSVpFIC0gMSk7CisJY29tbW9uLT5maWx0ZXIgPSBmaWx0ZXI7CisJY29tbW9uLT5m aWx0ZXJhcmcgPSBmaWx0ZXJhcmc7CisJY29tbW9uLT5tYXhzaXplID0gbWF4c2l6ZTsKKwljb21t b24tPm5zZWdtZW50cyA9IG5zZWdtZW50czsKKwljb21tb24tPm1heHNlZ3N6ID0gbWF4c2Vnc3o7 CisJY29tbW9uLT5mbGFncyA9IGZsYWdzOworCWNvbW1vbi0+cmVmX2NvdW50ID0gMTsgLyogQ291 bnQgb3Vyc2VsZiAqLworCWlmIChsb2NrZnVuYyAhPSBOVUxMKSB7CisJCWNvbW1vbi0+bG9ja2Z1 bmMgPSBsb2NrZnVuYzsKKwkJY29tbW9uLT5sb2NrZnVuY2FyZyA9IGxvY2tmdW5jYXJnOworCX0g ZWxzZSB7CisJCWNvbW1vbi0+bG9ja2Z1bmMgPSBidXNfZG1hX2RmbHRfbG9jazsKKwkJY29tbW9u LT5sb2NrZnVuY2FyZyA9IE5VTEw7CisJfQorCisJLyogVGFrZSBpbnRvIGFjY291bnQgYW55IHJl c3RyaWN0aW9ucyBpbXBvc2VkIGJ5IG91ciBwYXJlbnQgdGFnICovCisJaWYgKHBhcmVudCAhPSBO VUxMKSB7CisJCWNvbW1vbi0+aW1wbCA9IHBhcmVudC0+aW1wbDsKKwkJY29tbW9uLT5sb3dhZGRy ID0gTUlOKHBhcmVudC0+bG93YWRkciwgY29tbW9uLT5sb3dhZGRyKTsKKwkJY29tbW9uLT5oaWdo YWRkciA9IE1BWChwYXJlbnQtPmhpZ2hhZGRyLCBjb21tb24tPmhpZ2hhZGRyKTsKKwkJaWYgKGNv bW1vbi0+Ym91bmRhcnkgPT0gMCkKKwkJCWNvbW1vbi0+Ym91bmRhcnkgPSBwYXJlbnQtPmJvdW5k YXJ5OworCQllbHNlIGlmIChwYXJlbnQtPmJvdW5kYXJ5ICE9IDApIHsKKwkJCWNvbW1vbi0+Ym91 bmRhcnkgPSBNSU4ocGFyZW50LT5ib3VuZGFyeSwKKwkJCSAgICBjb21tb24tPmJvdW5kYXJ5KTsK KwkJfQorCQlpZiAoY29tbW9uLT5maWx0ZXIgPT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIFNob3J0 IGNpcmN1aXQgbG9va2luZyBhdCBvdXIgcGFyZW50IGRpcmVjdGx5CisJCQkgKiBzaW5jZSB3ZSBo YXZlIGVuY2Fwc3VsYXRlZCBhbGwgb2YgaXRzIGluZm9ybWF0aW9uCisJCQkgKi8KKwkJCWNvbW1v bi0+ZmlsdGVyID0gcGFyZW50LT5maWx0ZXI7CisJCQljb21tb24tPmZpbHRlcmFyZyA9IHBhcmVu dC0+ZmlsdGVyYXJnOworCQkJY29tbW9uLT5wYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKKwkJfQor CQlhdG9taWNfYWRkX2ludCgmcGFyZW50LT5yZWZfY291bnQsIDEpOworCX0KKwkqZG1hdCA9IGNv bW1vbjsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogQWxsb2NhdGUgYSBkZXZpY2Ugc3BlY2lm aWMgZG1hX3RhZy4KKyAqLworaW50CitidXNfZG1hX3RhZ19jcmVhdGUoYnVzX2RtYV90YWdfdCBw YXJlbnQsIGJ1c19zaXplX3QgYWxpZ25tZW50LAorICAgIGJ1c19hZGRyX3QgYm91bmRhcnksIGJ1 c19hZGRyX3QgbG93YWRkciwgYnVzX2FkZHJfdCBoaWdoYWRkciwKKyAgICBidXNfZG1hX2ZpbHRl cl90ICpmaWx0ZXIsIHZvaWQgKmZpbHRlcmFyZywgYnVzX3NpemVfdCBtYXhzaXplLAorICAgIGlu dCBuc2VnbWVudHMsIGJ1c19zaXplX3QgbWF4c2Vnc3osIGludCBmbGFncywgYnVzX2RtYV9sb2Nr X3QgKmxvY2tmdW5jLAorICAgIHZvaWQgKmxvY2tmdW5jYXJnLCBidXNfZG1hX3RhZ190ICpkbWF0 KQoreworCXN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKnRjOworCWludCBlcnJvcjsKKworCWlm IChwYXJlbnQgPT0gTlVMTCkgeworCQllcnJvciA9IGJ1c19kbWFfYm91bmNlX2ltcGwudGFnX2Ny ZWF0ZShwYXJlbnQsIGFsaWdubWVudCwKKwkJICAgIGJvdW5kYXJ5LCBsb3dhZGRyLCBoaWdoYWRk ciwgZmlsdGVyLCBmaWx0ZXJhcmcsIG1heHNpemUsCisJCSAgICBuc2VnbWVudHMsIG1heHNlZ3N6 LCBmbGFncywgbG9ja2Z1bmMsIGxvY2tmdW5jYXJnLCBkbWF0KTsKKwl9IGVsc2UgeworCQl0YyA9 IChzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICopcGFyZW50OworCQllcnJvciA9IHRjLT5pbXBs LT50YWdfY3JlYXRlKHBhcmVudCwgYWxpZ25tZW50LAorCQkgICAgYm91bmRhcnksIGxvd2FkZHIs IGhpZ2hhZGRyLCBmaWx0ZXIsIGZpbHRlcmFyZywgbWF4c2l6ZSwKKwkJICAgIG5zZWdtZW50cywg bWF4c2Vnc3osIGZsYWdzLCBsb2NrZnVuYywgbG9ja2Z1bmNhcmcsIGRtYXQpOworCX0KKwlyZXR1 cm4gKGVycm9yKTsKK30KKworaW50CitidXNfZG1hX3RhZ19kZXN0cm95KGJ1c19kbWFfdGFnX3Qg ZG1hdCkKK3sKKwlzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICp0YzsKKworCXRjID0gKHN0cnVj dCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXJldHVybiAodGMtPmltcGwtPnRhZ19kZXN0 cm95KGRtYXQpKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgaGFuZGxlIGZvciBtYXBwaW5nIGZy b20ga3ZhL3V2YS9waHlzaWNhbAorICogYWRkcmVzcyBzcGFjZSBpbnRvIGJ1cyBkZXZpY2Ugc3Bh Y2UuCisgKi8KK2ludAorYnVzX2RtYW1hcF9jcmVhdGUoYnVzX2RtYV90YWdfdCBkbWF0LCBpbnQg ZmxhZ3MsIGJ1c19kbWFtYXBfdCAqbWFwcCkKK3sKKwlzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9u ICp0YzsKKworCXRjID0gKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXJldHVy biAodGMtPmltcGwtPm1hcF9jcmVhdGUoZG1hdCwgZmxhZ3MsIG1hcHApKTsKK30KKworLyoKKyAq IERlc3Ryb3kgYSBoYW5kbGUgZm9yIG1hcHBpbmcgZnJvbSBrdmEvdXZhL3BoeXNpY2FsCisgKiBh ZGRyZXNzIHNwYWNlIGludG8gYnVzIGRldmljZSBzcGFjZS4KKyAqLworaW50CitidXNfZG1hbWFw X2Rlc3Ryb3koYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwKQoreworCXN0cnVj dCBidXNfZG1hX3RhZ19jb21tb24gKnRjOworCisJdGMgPSAoc3RydWN0IGJ1c19kbWFfdGFnX2Nv bW1vbiAqKWRtYXQ7CisJcmV0dXJuICh0Yy0+aW1wbC0+bWFwX2Rlc3Ryb3koZG1hdCwgbWFwKSk7 Cit9CisKKworLyoKKyAqIEFsbG9jYXRlIGEgcGllY2Ugb2YgbWVtb3J5IHRoYXQgY2FuIGJlIGVm ZmljaWVudGx5IG1hcHBlZCBpbnRvCisgKiBidXMgZGV2aWNlIHNwYWNlIGJhc2VkIG9uIHRoZSBj b25zdHJhaW50cyBsaXN0ZWQgaW4gdGhlIGRtYSB0YWcuCisgKiBBIGRtYW1hcCB0byBmb3IgdXNl IHdpdGggZG1hbWFwX2xvYWQgaXMgYWxzbyBhbGxvY2F0ZWQuCisgKi8KK2ludAorYnVzX2RtYW1l bV9hbGxvYyhidXNfZG1hX3RhZ190IGRtYXQsIHZvaWQqKiB2YWRkciwgaW50IGZsYWdzLAorICAg IGJ1c19kbWFtYXBfdCAqbWFwcCkKK3sKKwlzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICp0YzsK KworCXRjID0gKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXJldHVybiAodGMt PmltcGwtPm1lbV9hbGxvYyhkbWF0LCB2YWRkciwgZmxhZ3MsIG1hcHApKTsKK30KKworLyoKKyAq IEZyZWUgYSBwaWVjZSBvZiBtZW1vcnkgYW5kIGl0J3MgYWxsb2NpYXRlZCBkbWFtYXAsIHRoYXQg d2FzIGFsbG9jYXRlZAorICogdmlhIGJ1c19kbWFtZW1fYWxsb2MuICBNYWtlIHRoZSBzYW1lIGNo b2ljZSBmb3IgZnJlZS9jb250aWdmcmVlLgorICovCit2b2lkCitidXNfZG1hbWVtX2ZyZWUoYnVz X2RtYV90YWdfdCBkbWF0LCB2b2lkICp2YWRkciwgYnVzX2RtYW1hcF90IG1hcCkKK3sKKwlzdHJ1 Y3QgYnVzX2RtYV90YWdfY29tbW9uICp0YzsKKworCXRjID0gKHN0cnVjdCBidXNfZG1hX3RhZ19j b21tb24gKilkbWF0OworCXRjLT5pbXBsLT5tZW1fZnJlZShkbWF0LCB2YWRkciwgbWFwKTsKK30K IAogaW50CiBfYnVzX2RtYW1hcF9sb2FkX3BoeXMoYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1h bWFwX3QgbWFwLCB2bV9wYWRkcl90IGJ1ZiwKICAgICBidXNfc2l6ZV90IGJ1ZmxlbiwgaW50IGZs YWdzLCBidXNfZG1hX3NlZ21lbnRfdCAqc2VncywgaW50ICpzZWdwKQogeworCXN0cnVjdCBidXNf ZG1hX3RhZ19jb21tb24gKnRjOwogCi0JcGFuaWMoIl9idXNfZG1hbWFwX2xvYWRfcGh5cyIpOwor CXRjID0gKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXJldHVybiAodGMtPmlt cGwtPmxvYWRfcGh5cyhkbWF0LCBtYXAsIGJ1ZiwgYnVmbGVuLCBmbGFncywgc2VncywKKwkgICAg c2VncCkpOwogfQogCiBpbnQKIF9idXNfZG1hbWFwX2xvYWRfbWEoYnVzX2RtYV90YWdfdCBkbWF0 LCBidXNfZG1hbWFwX3QgbWFwLCBzdHJ1Y3Qgdm1fcGFnZSAqKm1hLAogICAgIGJ1c19zaXplX3Qg dGxlbiwgaW50IG1hX29mZnMsIGludCBmbGFncywgYnVzX2RtYV9zZWdtZW50X3QgKnNlZ3MsCiAg ICAgaW50ICpzZWdwKQogeworCXN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKnRjOwogCi0JcGFu aWMoIl9idXNfZG1hbWFwX2xvYWRfbWEiKTsKKwl0YyA9IChzdHJ1Y3QgYnVzX2RtYV90YWdfY29t bW9uICopZG1hdDsKKwlyZXR1cm4gKHRjLT5pbXBsLT5sb2FkX21hKGRtYXQsIG1hcCwgbWEsIHRs ZW4sIG1hX29mZnMsIGZsYWdzLAorCSAgICBzZWdzLCBzZWdwKSk7CiB9CiAKIGludAogX2J1c19k bWFtYXBfbG9hZF9idWZmZXIoYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLCB2 b2lkICpidWYsCiAgICAgYnVzX3NpemVfdCBidWZsZW4sIHBtYXBfdCBwbWFwLCBpbnQgZmxhZ3Ms IGJ1c19kbWFfc2VnbWVudF90ICpzZWdzLAogICAgIGludCAqc2VncCkKIHsKKwlzdHJ1Y3QgYnVz X2RtYV90YWdfY29tbW9uICp0YzsKIAotCXBhbmljKCJfYnVzX2RtYW1hcF9sb2FkX2J1ZmZlciIp OworCXRjID0gKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXJldHVybiAodGMt PmltcGwtPmxvYWRfYnVmZmVyKGRtYXQsIG1hcCwgYnVmLCBidWZsZW4sIHBtYXAsIGZsYWdzLCBz ZWdzLAorCSAgICBzZWdwKSk7CiB9CiAKIHZvaWQKIF9fYnVzX2RtYW1hcF93YWl0b2soYnVzX2Rt YV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLAogICAgIHN0cnVjdCBtZW1kZXNjICptZW0s IGJ1c19kbWFtYXBfY2FsbGJhY2tfdCAqY2FsbGJhY2ssIHZvaWQgKmNhbGxiYWNrX2FyZykKIHsK KwlzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICp0YzsKIAotCXBhbmljKCJfX2J1c19kbWFtYXBf d2FpdG9rIik7CisJdGMgPSAoc3RydWN0IGJ1c19kbWFfdGFnX2NvbW1vbiAqKWRtYXQ7CisJdGMt PmltcGwtPm1hcF93YWl0b2soZG1hdCwgbWFwLCBtZW0sIGNhbGxiYWNrLCBjYWxsYmFja19hcmcp OwogfQogCiBidXNfZG1hX3NlZ21lbnRfdCAqCiBfYnVzX2RtYW1hcF9jb21wbGV0ZShidXNfZG1h X3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsCiAgICAgYnVzX2RtYV9zZWdtZW50X3QgKnNl Z3MsIGludCBuc2VncywgaW50IGVycm9yKQogeworCXN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24g KnRjOwogCi0JcGFuaWMoIl9idXNfZG1hbWFwX2NvbXBsZXRlIik7CisJdGMgPSAoc3RydWN0IGJ1 c19kbWFfdGFnX2NvbW1vbiAqKWRtYXQ7CisJcmV0dXJuICh0Yy0+aW1wbC0+bWFwX2NvbXBsZXRl KGRtYXQsIG1hcCwgc2VncywgbnNlZ3MsIGVycm9yKSk7CiB9CiAKKy8qCisgKiBSZWxlYXNlIHRo ZSBtYXBwaW5nIGhlbGQgYnkgbWFwLgorICovCiB2b2lkCiBfYnVzX2RtYW1hcF91bmxvYWQoYnVz X2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwKQogeworCXN0cnVjdCBidXNfZG1hX3Rh Z19jb21tb24gKnRjOwogCi0JcGFuaWMoIl9idXNfZG1hbWFwX3VubG9hZCIpOworCXRjID0gKHN0 cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXRjLT5pbXBsLT5tYXBfdW5sb2FkKGRt YXQsIG1hcCk7CiB9CiAKIHZvaWQKIF9idXNfZG1hbWFwX3N5bmMoYnVzX2RtYV90YWdfdCBkbWF0 LCBidXNfZG1hbWFwX3QgbWFwLCBidXNfZG1hc3luY19vcF90IG9wKQogeworCXN0cnVjdCBidXNf ZG1hX3RhZ19jb21tb24gKnRjOwogCi0JcGFuaWMoIl9idXNfZG1hbWFwX3N5bmMiKTsKKwl0YyA9 IChzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICopZG1hdDsKKwl0Yy0+aW1wbC0+bWFwX3N5bmMo ZG1hdCwgbWFwLCBvcCk7CiB9CmRpZmYgLS1naXQgYS9zeXMvYXJtNjQvYXJtNjQvYnVzZG1hX2Jv dW5jZS5jIGIvc3lzL2FybTY0L2FybTY0L2J1c2RtYV9ib3VuY2UuYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9hcm02NC9hcm02NC9idXNkbWFfYm91bmNlLmMK QEAgLTAsMCArMSwxMDg2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMTk5OCBKdXN0 aW4gVC4gR2liYnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIEZyZWVCU0QgRm91bmRhdGlv bgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3 YXJlIHdlcmUgZGV2ZWxvcGVkIGJ5IFNlbWloYWxmCisgKiB1bmRlciBzcG9uc29yc2hpcCBvZiB0 aGUgRnJlZUJTRCBGb3VuZGF0aW9uLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0 YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp dGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlm aWNhdGlvbiwgaW1tZWRpYXRlbHkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAqIDIu IFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv bW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ UyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAor ICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQu IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG T1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB UlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsg TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikK KyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF UiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhF IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ IE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZC U0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxz eXMvc3lzdG0uaD4KKyNpbmNsdWRlIDxzeXMvbWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzL2J1cy5o PgorI2luY2x1ZGUgPHN5cy9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxzeXMva2VybmVsLmg+Cisj aW5jbHVkZSA8c3lzL2t0ci5oPgorI2luY2x1ZGUgPHN5cy9sb2NrLmg+CisjaW5jbHVkZSA8c3lz L3Byb2MuaD4KKyNpbmNsdWRlIDxzeXMvbWVtZGVzYy5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5o PgorI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKKyNpbmNs dWRlIDx2bS92bS5oPgorI2luY2x1ZGUgPHZtL3ZtX2V4dGVybi5oPgorI2luY2x1ZGUgPHZtL3Zt X2tlcm4uaD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlLmg+CisjaW5jbHVkZSA8dm0vdm1fbWFwLmg+ CisKKyNpbmNsdWRlIDxtYWNoaW5lL2F0b21pYy5oPgorI2luY2x1ZGUgPG1hY2hpbmUvYnVzLmg+ CisjaW5jbHVkZSA8bWFjaGluZS9tZF92YXIuaD4KKyNpbmNsdWRlIDxhcm02NC9pbmNsdWRlL2J1 c19kbWFfaW1wbC5oPgorCisjZGVmaW5lIE1BWF9CUEFHRVMgNDA5NgorCitlbnVtIHsKKwlCVVNf RE1BX0NPVUxEX0JPVU5DRQk9IDB4MDEsCisJQlVTX0RNQV9NSU5fQUxMT0NfQ09NUAk9IDB4MDIs CisJQlVTX0RNQV9LTUVNX0FMTE9DCT0gMHgwNCwKK307CisKK3N0cnVjdCBib3VuY2Vfem9uZTsK Kworc3RydWN0IGJ1c19kbWFfdGFnIHsKKwlzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uIGNvbW1v bjsKKwlpbnQJCQltYXBfY291bnQ7CisJaW50CQkJYm91bmNlX2ZsYWdzOworCWJ1c19kbWFfc2Vn bWVudF90CSpzZWdtZW50czsKKwlzdHJ1Y3QgYm91bmNlX3pvbmUJKmJvdW5jZV96b25lOworfTsK Kworc3RydWN0IGJvdW5jZV9wYWdlIHsKKwl2bV9vZmZzZXRfdAl2YWRkcjsJCS8qIGt2YSBvZiBi b3VuY2UgYnVmZmVyICovCisJYnVzX2FkZHJfdAlidXNhZGRyOwkvKiBQaHlzaWNhbCBhZGRyZXNz ICovCisJdm1fb2Zmc2V0X3QJZGF0YXZhZGRyOwkvKiBrdmEgb2YgY2xpZW50IGRhdGEgKi8KKwli dXNfYWRkcl90CWRhdGFhZGRyOwkvKiBjbGllbnQgcGh5c2ljYWwgYWRkcmVzcyAqLworCWJ1c19z aXplX3QJZGF0YWNvdW50OwkvKiBjbGllbnQgZGF0YSBjb3VudCAqLworCVNUQUlMUV9FTlRSWShi b3VuY2VfcGFnZSkgbGlua3M7Cit9OworCitpbnQgYnVzZG1hX3N3aV9wZW5kaW5nOworCitzdHJ1 Y3QgYm91bmNlX3pvbmUgeworCVNUQUlMUV9FTlRSWShib3VuY2Vfem9uZSkgbGlua3M7CisJU1RB SUxRX0hFQUQoYnBfbGlzdCwgYm91bmNlX3BhZ2UpIGJvdW5jZV9wYWdlX2xpc3Q7CisJaW50CQl0 b3RhbF9icGFnZXM7CisJaW50CQlmcmVlX2JwYWdlczsKKwlpbnQJCXJlc2VydmVkX2JwYWdlczsK KwlpbnQJCWFjdGl2ZV9icGFnZXM7CisJaW50CQl0b3RhbF9ib3VuY2VkOworCWludAkJdG90YWxf ZGVmZXJyZWQ7CisJaW50CQltYXBfY291bnQ7CisJYnVzX3NpemVfdAlhbGlnbm1lbnQ7CisJYnVz X2FkZHJfdAlsb3dhZGRyOworCWNoYXIJCXpvbmVpZFs4XTsKKwljaGFyCQlsb3dhZGRyaWRbMjBd OworCXN0cnVjdCBzeXNjdGxfY3R4X2xpc3Qgc3lzY3RsX3RyZWU7CisJc3RydWN0IHN5c2N0bF9v aWQgKnN5c2N0bF90cmVlX3RvcDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXR4IGJvdW5jZV9sb2Nr Oworc3RhdGljIGludCB0b3RhbF9icGFnZXM7CitzdGF0aWMgaW50IGJ1c2RtYV96b25lY291bnQ7 CitzdGF0aWMgU1RBSUxRX0hFQUQoLCBib3VuY2Vfem9uZSkgYm91bmNlX3pvbmVfbGlzdDsKKwor c3RhdGljIFNZU0NUTF9OT0RFKF9odywgT0lEX0FVVE8sIGJ1c2RtYSwgQ1RMRkxBR19SRCwgMCwg IkJ1c2RtYSBwYXJhbWV0ZXJzIik7CitTWVNDVExfSU5UKF9od19idXNkbWEsIE9JRF9BVVRPLCB0 b3RhbF9icGFnZXMsIENUTEZMQUdfUkQsICZ0b3RhbF9icGFnZXMsIDAsCisJICAgIlRvdGFsIGJv dW5jZSBwYWdlcyIpOworCitzdHJ1Y3QgYnVzX2RtYW1hcCB7CisJc3RydWN0IGJwX2xpc3QJICAg ICAgIGJwYWdlczsKKwlpbnQJCSAgICAgICBwYWdlc25lZWRlZDsKKwlpbnQJCSAgICAgICBwYWdl c3Jlc2VydmVkOworCWJ1c19kbWFfdGFnX3QJICAgICAgIGRtYXQ7CisJc3RydWN0IG1lbWRlc2MJ ICAgICAgIG1lbTsKKwlidXNfZG1hbWFwX2NhbGxiYWNrX3QgKmNhbGxiYWNrOworCXZvaWQJCSAg ICAgICpjYWxsYmFja19hcmc7CisJU1RBSUxRX0VOVFJZKGJ1c19kbWFtYXApIGxpbmtzOworfTsK Kworc3RhdGljIFNUQUlMUV9IRUFEKCwgYnVzX2RtYW1hcCkgYm91bmNlX21hcF93YWl0aW5nbGlz dDsKK3N0YXRpYyBTVEFJTFFfSEVBRCgsIGJ1c19kbWFtYXApIGJvdW5jZV9tYXBfY2FsbGJhY2ts aXN0Oworc3RhdGljIHN0cnVjdCBidXNfZG1hbWFwIG5vYm91bmNlX2RtYW1hcDsKKworc3RhdGlj IHZvaWQgaW5pdF9ib3VuY2VfcGFnZXModm9pZCAqZHVtbXkpOworc3RhdGljIGludCBhbGxvY19i b3VuY2Vfem9uZShidXNfZG1hX3RhZ190IGRtYXQpOworc3RhdGljIGludCBhbGxvY19ib3VuY2Vf cGFnZXMoYnVzX2RtYV90YWdfdCBkbWF0LCB1X2ludCBudW1wYWdlcyk7CitzdGF0aWMgaW50IHJl c2VydmVfYm91bmNlX3BhZ2VzKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwK KwkJCQlpbnQgY29tbWl0KTsKK3N0YXRpYyBidXNfYWRkcl90IGFkZF9ib3VuY2VfcGFnZShidXNf ZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsCisJCQkJICB2bV9vZmZzZXRfdCB2YWRk ciwgYnVzX2FkZHJfdCBhZGRyLAorCQkJCSAgYnVzX3NpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lk IGZyZWVfYm91bmNlX3BhZ2UoYnVzX2RtYV90YWdfdCBkbWF0LCBzdHJ1Y3QgYm91bmNlX3BhZ2Ug KmJwYWdlKTsKK2ludCBydW5fZmlsdGVyKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2FkZHJfdCBw YWRkcik7CitzdGF0aWMgdm9pZCBfYnVzX2RtYW1hcF9jb3VudF9wYWdlcyhidXNfZG1hX3RhZ190 IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsCisJCQkJICAgIHBtYXBfdCBwbWFwLCB2b2lkICpidWYs IGJ1c19zaXplX3QgYnVmbGVuLAorCQkJCSAgICBpbnQgZmxhZ3MpOworc3RhdGljIHZvaWQgX2J1 c19kbWFtYXBfY291bnRfcGh5cyhidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAs CisJCQkJICAgdm1fcGFkZHJfdCBidWYsIGJ1c19zaXplX3QgYnVmbGVuLAorCQkJCSAgIGludCBm bGFncyk7CitzdGF0aWMgaW50IF9idXNfZG1hbWFwX3Jlc2VydmVfcGFnZXMoYnVzX2RtYV90YWdf dCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLAorCQkJCSAgICAgaW50IGZsYWdzKTsKKworLyoKKyAq IEFsbG9jYXRlIGEgZGV2aWNlIHNwZWNpZmljIGRtYV90YWcuCisgKi8KK3N0YXRpYyBpbnQKK2Jv dW5jZV9idXNfZG1hX3RhZ19jcmVhdGUoYnVzX2RtYV90YWdfdCBwYXJlbnQsIGJ1c19zaXplX3Qg YWxpZ25tZW50LAorICAgIGJ1c19hZGRyX3QgYm91bmRhcnksIGJ1c19hZGRyX3QgbG93YWRkciwg YnVzX2FkZHJfdCBoaWdoYWRkciwKKyAgICBidXNfZG1hX2ZpbHRlcl90ICpmaWx0ZXIsIHZvaWQg KmZpbHRlcmFyZywgYnVzX3NpemVfdCBtYXhzaXplLAorICAgIGludCBuc2VnbWVudHMsIGJ1c19z aXplX3QgbWF4c2Vnc3osIGludCBmbGFncywgYnVzX2RtYV9sb2NrX3QgKmxvY2tmdW5jLAorICAg IHZvaWQgKmxvY2tmdW5jYXJnLCBidXNfZG1hX3RhZ190ICpkbWF0KQoreworCWJ1c19kbWFfdGFn X3QgbmV3dGFnOworCWludCBlcnJvcjsKKworCSpkbWF0ID0gTlVMTDsKKwllcnJvciA9IGNvbW1v bl9idXNfZG1hX3RhZ19jcmVhdGUocGFyZW50ICE9IE5VTEwgPyAmcGFyZW50LT5jb21tb24gOgor CSAgICBOVUxMLCBhbGlnbm1lbnQsIGJvdW5kYXJ5LCBsb3dhZGRyLCBoaWdoYWRkciwgZmlsdGVy LCBmaWx0ZXJhcmcsCisJICAgIG1heHNpemUsIG5zZWdtZW50cywgbWF4c2Vnc3osIGZsYWdzLCBs b2NrZnVuYywgbG9ja2Z1bmNhcmcsCisJICAgIHNpemVvZiAoc3RydWN0IGJ1c19kbWFfdGFnKSwg KHZvaWQgKiopJm5ld3RhZyk7CisJaWYgKGVycm9yICE9IDApCisJCXJldHVybiAoZXJyb3IpOwor CisJbmV3dGFnLT5jb21tb24uaW1wbCA9ICZidXNfZG1hX2JvdW5jZV9pbXBsOworCW5ld3RhZy0+ bWFwX2NvdW50ID0gMDsKKwluZXd0YWctPnNlZ21lbnRzID0gTlVMTDsKKworCWlmIChwYXJlbnQg IT0gTlVMTCAmJiAoKG5ld3RhZy0+Y29tbW9uLmZpbHRlciAhPSBOVUxMKSB8fAorCSAgICAoKHBh cmVudC0+Ym91bmNlX2ZsYWdzICYgQlVTX0RNQV9DT1VMRF9CT1VOQ0UpICE9IDApKSkKKwkJbmV3 dGFnLT5ib3VuY2VfZmxhZ3MgfD0gQlVTX0RNQV9DT1VMRF9CT1VOQ0U7CisKKwlpZiAobmV3dGFn LT5jb21tb24ubG93YWRkciA8IHB0b2EoKHZtX3BhZGRyX3QpTWF4bWVtKSB8fAorCSAgICBuZXd0 YWctPmNvbW1vbi5hbGlnbm1lbnQgPiAxKQorCQluZXd0YWctPmJvdW5jZV9mbGFncyB8PSBCVVNf RE1BX0NPVUxEX0JPVU5DRTsKKworCWlmICgoKG5ld3RhZy0+Ym91bmNlX2ZsYWdzICYgQlVTX0RN QV9DT1VMRF9CT1VOQ0UpICE9IDApICYmCisJICAgIChmbGFncyAmIEJVU19ETUFfQUxMT0NOT1cp ICE9IDApIHsKKwkJc3RydWN0IGJvdW5jZV96b25lICpiejsKKworCQkvKiBNdXN0IGJvdW5jZSAq LworCQlpZiAoKGVycm9yID0gYWxsb2NfYm91bmNlX3pvbmUobmV3dGFnKSkgIT0gMCkgeworCQkJ ZnJlZShuZXd0YWcsIE1fREVWQlVGKTsKKwkJCXJldHVybiAoZXJyb3IpOworCQl9CisJCWJ6ID0g bmV3dGFnLT5ib3VuY2Vfem9uZTsKKworCQlpZiAocHRvYShiei0+dG90YWxfYnBhZ2VzKSA8IG1h eHNpemUpIHsKKwkJCWludCBwYWdlczsKKworCQkJcGFnZXMgPSBhdG9wKG1heHNpemUpIC0gYnot PnRvdGFsX2JwYWdlczsKKworCQkJLyogQWRkIHBhZ2VzIHRvIG91ciBib3VuY2UgcG9vbCAqLwor CQkJaWYgKGFsbG9jX2JvdW5jZV9wYWdlcyhuZXd0YWcsIHBhZ2VzKSA8IHBhZ2VzKQorCQkJCWVy cm9yID0gRU5PTUVNOworCQl9CisJCS8qIFBlcmZvcm1lZCBpbml0aWFsIGFsbG9jYXRpb24gKi8K KwkJbmV3dGFnLT5ib3VuY2VfZmxhZ3MgfD0gQlVTX0RNQV9NSU5fQUxMT0NfQ09NUDsKKwl9IGVs c2UKKwkJZXJyb3IgPSAwOworCQorCWlmIChlcnJvciAhPSAwKQorCQlmcmVlKG5ld3RhZywgTV9E RVZCVUYpOworCWVsc2UKKwkJKmRtYXQgPSBuZXd0YWc7CisJQ1RSNChLVFJfQlVTRE1BLCAiJXMg cmV0dXJuZWQgdGFnICVwIHRhZyBmbGFncyAweCV4IGVycm9yICVkIiwKKwkgICAgX19mdW5jX18s IG5ld3RhZywgKG5ld3RhZyAhPSBOVUxMID8gbmV3dGFnLT5jb21tb24uZmxhZ3MgOiAwKSwKKwkg ICAgZXJyb3IpOworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50Citib3VuY2VfYnVz X2RtYV90YWdfZGVzdHJveShidXNfZG1hX3RhZ190IGRtYXQpCit7CisJYnVzX2RtYV90YWdfdCBk bWF0X2NvcHksIHBhcmVudDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IDA7CisJZG1hdF9jb3B5 ID0gZG1hdDsKKworCWlmIChkbWF0ICE9IE5VTEwpIHsKKwkJaWYgKGRtYXQtPm1hcF9jb3VudCAh PSAwKSB7CisJCQllcnJvciA9IEVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwkJd2hpbGUgKGRt YXQgIT0gTlVMTCkgeworCQkJcGFyZW50ID0gKGJ1c19kbWFfdGFnX3QpZG1hdC0+Y29tbW9uLnBh cmVudDsKKwkJCWF0b21pY19zdWJ0cmFjdF9pbnQoJmRtYXQtPmNvbW1vbi5yZWZfY291bnQsIDEp OworCQkJaWYgKGRtYXQtPmNvbW1vbi5yZWZfY291bnQgPT0gMCkgeworCQkJCWlmIChkbWF0LT5z ZWdtZW50cyAhPSBOVUxMKQorCQkJCQlmcmVlKGRtYXQtPnNlZ21lbnRzLCBNX0RFVkJVRik7CisJ CQkJZnJlZShkbWF0LCBNX0RFVkJVRik7CisJCQkJLyoKKwkJCQkgKiBMYXN0IHJlZmVyZW5jZSBj b3VudCwgc28KKwkJCQkgKiByZWxlYXNlIG91ciByZWZlcmVuY2UKKwkJCQkgKiBjb3VudCBvbiBv dXIgcGFyZW50LgorCQkJCSAqLworCQkJCWRtYXQgPSBwYXJlbnQ7CisJCQl9IGVsc2UKKwkJCQlk bWF0ID0gTlVMTDsKKwkJfQorCX0KK291dDoKKwlDVFIzKEtUUl9CVVNETUEsICIlcyB0YWcgJXAg ZXJyb3IgJWQiLCBfX2Z1bmNfXywgZG1hdF9jb3B5LCBlcnJvcik7CisJcmV0dXJuIChlcnJvcik7 Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIGhhbmRsZSBmb3IgbWFwcGluZyBmcm9tIGt2YS91dmEv cGh5c2ljYWwKKyAqIGFkZHJlc3Mgc3BhY2UgaW50byBidXMgZGV2aWNlIHNwYWNlLgorICovCitz dGF0aWMgaW50Citib3VuY2VfYnVzX2RtYW1hcF9jcmVhdGUoYnVzX2RtYV90YWdfdCBkbWF0LCBp bnQgZmxhZ3MsIGJ1c19kbWFtYXBfdCAqbWFwcCkKK3sKKwlzdHJ1Y3QgYm91bmNlX3pvbmUgKmJ6 OworCWludCBlcnJvciwgbWF4cGFnZXMsIHBhZ2VzOworCisJZXJyb3IgPSAwOworCisJaWYgKGRt YXQtPnNlZ21lbnRzID09IE5VTEwpIHsKKwkJZG1hdC0+c2VnbWVudHMgPSAoYnVzX2RtYV9zZWdt ZW50X3QgKiltYWxsb2MoCisJCSAgICBzaXplb2YoYnVzX2RtYV9zZWdtZW50X3QpICogZG1hdC0+ Y29tbW9uLm5zZWdtZW50cywKKwkJICAgIE1fREVWQlVGLCBNX05PV0FJVCk7CisJCWlmIChkbWF0 LT5zZWdtZW50cyA9PSBOVUxMKSB7CisJCQlDVFIzKEtUUl9CVVNETUEsICIlczogdGFnICVwIGVy cm9yICVkIiwKKwkJCSAgICBfX2Z1bmNfXywgZG1hdCwgRU5PTUVNKTsKKwkJCXJldHVybiAoRU5P TUVNKTsKKwkJfQorCX0KKworCS8qCisJICogQm91bmNpbmcgbWlnaHQgYmUgcmVxdWlyZWQgaWYg dGhlIGRyaXZlciBhc2tzIGZvciBhbiBhY3RpdmUKKwkgKiBleGNsdXNpb24gcmVnaW9uLCBhIGRh dGEgYWxpZ25tZW50IHRoYXQgaXMgc3RyaWN0ZXIgdGhhbiAxLCBhbmQvb3IKKwkgKiBhbiBhY3Rp dmUgYWRkcmVzcyBib3VuZGFyeS4KKwkgKi8KKwlpZiAoZG1hdC0+Ym91bmNlX2ZsYWdzICYgQlVT X0RNQV9DT1VMRF9CT1VOQ0UpIHsKKwkJLyogTXVzdCBib3VuY2UgKi8KKwkJaWYgKGRtYXQtPmJv dW5jZV96b25lID09IE5VTEwpIHsKKwkJCWlmICgoZXJyb3IgPSBhbGxvY19ib3VuY2Vfem9uZShk bWF0KSkgIT0gMCkKKwkJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCQlieiA9IGRtYXQtPmJvdW5j ZV96b25lOworCisJCSptYXBwID0gKGJ1c19kbWFtYXBfdCltYWxsb2Moc2l6ZW9mKCoqbWFwcCks IE1fREVWQlVGLAorCQkgICAgTV9OT1dBSVQgfCBNX1pFUk8pOworCQlpZiAoKm1hcHAgPT0gTlVM TCkgeworCQkJQ1RSMyhLVFJfQlVTRE1BLCAiJXM6IHRhZyAlcCBlcnJvciAlZCIsCisJCQkgICAg X19mdW5jX18sIGRtYXQsIEVOT01FTSk7CisJCQlyZXR1cm4gKEVOT01FTSk7CisJCX0KKworCQkv KiBJbml0aWFsaXplIHRoZSBuZXcgbWFwICovCisJCVNUQUlMUV9JTklUKCYoKCptYXBwKS0+YnBh Z2VzKSk7CisKKwkJLyoKKwkJICogQXR0ZW1wdCB0byBhZGQgcGFnZXMgdG8gb3VyIHBvb2wgb24g YSBwZXItaW5zdGFuY2UKKwkJICogYmFzaXMgdXAgdG8gYSBzYW5lIGxpbWl0LgorCQkgKi8KKwkJ aWYgKGRtYXQtPmNvbW1vbi5hbGlnbm1lbnQgPiAxKQorCQkJbWF4cGFnZXMgPSBNQVhfQlBBR0VT OworCQllbHNlCisJCQltYXhwYWdlcyA9IE1JTihNQVhfQlBBR0VTLCBNYXhtZW0gLQorCQkJICAg IGF0b3AoZG1hdC0+Y29tbW9uLmxvd2FkZHIpKTsKKwkJaWYgKChkbWF0LT5ib3VuY2VfZmxhZ3Mg JiBCVVNfRE1BX01JTl9BTExPQ19DT01QKSA9PSAwIHx8CisJCSAgICAoYnotPm1hcF9jb3VudCA+ IDAgJiYgYnotPnRvdGFsX2JwYWdlcyA8IG1heHBhZ2VzKSkgeworCQkJcGFnZXMgPSBNQVgoYXRv cChkbWF0LT5jb21tb24ubWF4c2l6ZSksIDEpOworCQkJcGFnZXMgPSBNSU4obWF4cGFnZXMgLSBi ei0+dG90YWxfYnBhZ2VzLCBwYWdlcyk7CisJCQlwYWdlcyA9IE1BWChwYWdlcywgMSk7CisJCQlp ZiAoYWxsb2NfYm91bmNlX3BhZ2VzKGRtYXQsIHBhZ2VzKSA8IHBhZ2VzKQorCQkJCWVycm9yID0g RU5PTUVNOworCQkJaWYgKChkbWF0LT5ib3VuY2VfZmxhZ3MgJiBCVVNfRE1BX01JTl9BTExPQ19D T01QKQorCQkJICAgID09IDApIHsKKwkJCQlpZiAoZXJyb3IgPT0gMCkgeworCQkJCQlkbWF0LT5i b3VuY2VfZmxhZ3MgfD0KKwkJCQkJICAgIEJVU19ETUFfTUlOX0FMTE9DX0NPTVA7CisJCQkJfQor CQkJfSBlbHNlCisJCQkJZXJyb3IgPSAwOworCQl9CisJCWJ6LT5tYXBfY291bnQrKzsKKwl9IGVs c2UgeworCQkqbWFwcCA9IE5VTEw7CisJfQorCWlmIChlcnJvciA9PSAwKQorCQlkbWF0LT5tYXBf Y291bnQrKzsKKwlDVFI0KEtUUl9CVVNETUEsICIlczogdGFnICVwIHRhZyBmbGFncyAweCV4IGVy cm9yICVkIiwKKwkgICAgX19mdW5jX18sIGRtYXQsIGRtYXQtPmNvbW1vbi5mbGFncywgZXJyb3Ip OworCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogRGVzdHJveSBhIGhhbmRsZSBmb3IgbWFw cGluZyBmcm9tIGt2YS91dmEvcGh5c2ljYWwKKyAqIGFkZHJlc3Mgc3BhY2UgaW50byBidXMgZGV2 aWNlIHNwYWNlLgorICovCitzdGF0aWMgaW50Citib3VuY2VfYnVzX2RtYW1hcF9kZXN0cm95KGJ1 c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCkKK3sKKworCWlmIChtYXAgIT0gTlVM TCAmJiBtYXAgIT0gJm5vYm91bmNlX2RtYW1hcCkgeworCQlpZiAoU1RBSUxRX0ZJUlNUKCZtYXAt PmJwYWdlcykgIT0gTlVMTCkgeworCQkJQ1RSMyhLVFJfQlVTRE1BLCAiJXM6IHRhZyAlcCBlcnJv ciAlZCIsCisJCQkgICAgX19mdW5jX18sIGRtYXQsIEVCVVNZKTsKKwkJCXJldHVybiAoRUJVU1kp OworCQl9CisJCWlmIChkbWF0LT5ib3VuY2Vfem9uZSkKKwkJCWRtYXQtPmJvdW5jZV96b25lLT5t YXBfY291bnQtLTsKKwkJZnJlZShtYXAsIE1fREVWQlVGKTsKKwl9CisJZG1hdC0+bWFwX2NvdW50 LS07CisJQ1RSMihLVFJfQlVTRE1BLCAiJXM6IHRhZyAlcCBlcnJvciAwIiwgX19mdW5jX18sIGRt YXQpOworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIEFsbG9jYXRlIGEgcGllY2Ugb2YgbWVt b3J5IHRoYXQgY2FuIGJlIGVmZmljaWVudGx5IG1hcHBlZCBpbnRvCisgKiBidXMgZGV2aWNlIHNw YWNlIGJhc2VkIG9uIHRoZSBjb25zdHJhaW50cyBsaXRlZCBpbiB0aGUgZG1hIHRhZy4KKyAqIEEg ZG1hbWFwIHRvIGZvciB1c2Ugd2l0aCBkbWFtYXBfbG9hZCBpcyBhbHNvIGFsbG9jYXRlZC4KKyAq Lworc3RhdGljIGludAorYm91bmNlX2J1c19kbWFtZW1fYWxsb2MoYnVzX2RtYV90YWdfdCBkbWF0 LCB2b2lkKiogdmFkZHIsIGludCBmbGFncywKKyAgICBidXNfZG1hbWFwX3QgKm1hcHApCit7CisJ LyoKKwkgKiBYWFggQVJNNjRUT0RPOgorCSAqIFRoaXMgYnVzX2RtYSBpbXBsZW1lbnRhdGlvbiBy ZXF1aXJlcyBJTy1Db2hlcmVudCBhcmNoaXRlY3V0cmUuCisJICogSWYgSU8tQ29oZXJlbmN5IGlz IG5vdCBndWFyYW50ZWVkLCB0aGUgQlVTX0RNQV9DT0hFUkVOVCBmbGFnIGhhcworCSAqIHRvIGJl IGltcGxlbnRlZCB1c2luZyBub24tY2FjaGVhYmxlIG1lbW9yeS4KKwkgKi8KKworCXZtX21lbWF0 dHJfdCBhdHRyOworCWludCBtZmxhZ3M7CisKKwlpZiAoZmxhZ3MgJiBCVVNfRE1BX05PV0FJVCkK KwkJbWZsYWdzID0gTV9OT1dBSVQ7CisJZWxzZQorCQltZmxhZ3MgPSBNX1dBSVRPSzsKKworCS8q IElmIHdlIHN1Y2NlZWQsIG5vIG1hcHBpbmcvYm91bmNpbmcgd2lsbCBiZSByZXF1aXJlZCAqLwor CSptYXBwID0gTlVMTDsKKworCWlmIChkbWF0LT5zZWdtZW50cyA9PSBOVUxMKSB7CisJCWRtYXQt PnNlZ21lbnRzID0gKGJ1c19kbWFfc2VnbWVudF90ICopbWFsbG9jKAorCQkgICAgc2l6ZW9mKGJ1 c19kbWFfc2VnbWVudF90KSAqIGRtYXQtPmNvbW1vbi5uc2VnbWVudHMsCisJCSAgICBNX0RFVkJV RiwgbWZsYWdzKTsKKwkJaWYgKGRtYXQtPnNlZ21lbnRzID09IE5VTEwpIHsKKwkJCUNUUjQoS1RS X0JVU0RNQSwgIiVzOiB0YWcgJXAgdGFnIGZsYWdzIDB4JXggZXJyb3IgJWQiLAorCQkJICAgIF9f ZnVuY19fLCBkbWF0LCBkbWF0LT5jb21tb24uZmxhZ3MsIEVOT01FTSk7CisJCQlyZXR1cm4gKEVO T01FTSk7CisJCX0KKwl9CisJaWYgKGZsYWdzICYgQlVTX0RNQV9aRVJPKQorCQltZmxhZ3MgfD0g TV9aRVJPOworCWlmIChmbGFncyAmIEJVU19ETUFfTk9DQUNIRSkKKwkJYXR0ciA9IFZNX01FTUFU VFJfVU5DQUNIRUFCTEU7CisJZWxzZQorCQlhdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxUOworCisJ LyogCisJICogWFhYOgorCSAqIChkbWF0LT5hbGlnbm1lbnQgPCBkbWF0LT5tYXhzaXplKSBpcyBq dXN0IGEgcXVpY2sgaGFjazsgdGhlIGV4YWN0CisJICogYWxpZ25tZW50IGd1YXJhbnRlZXMgb2Yg bWFsbG9jIG5lZWQgdG8gYmUgbmFpbGVkIGRvd24sIGFuZCB0aGUKKwkgKiBjb2RlIGJlbG93IHNo b3VsZCBiZSByZXdyaXR0ZW4gdG8gdGFrZSB0aGF0IGludG8gYWNjb3VudC4KKwkgKgorCSAqIElu IHRoZSBtZWFudGltZSwgd2UnbGwgd2FybiB0aGUgdXNlciBpZiBtYWxsb2MgZ2V0cyBpdCB3cm9u Zy4KKwkgKi8KKwlpZiAoKGRtYXQtPmNvbW1vbi5tYXhzaXplIDw9IFBBR0VfU0laRSkgJiYKKwkg ICAoZG1hdC0+Y29tbW9uLmFsaWdubWVudCA8IGRtYXQtPmNvbW1vbi5tYXhzaXplKSAmJgorCSAg ICBkbWF0LT5jb21tb24ubG93YWRkciA+PSBwdG9hKCh2bV9wYWRkcl90KU1heG1lbSkgJiYKKwkg ICAgYXR0ciA9PSBWTV9NRU1BVFRSX0RFRkFVTFQpIHsKKwkJKnZhZGRyID0gbWFsbG9jKGRtYXQt PmNvbW1vbi5tYXhzaXplLCBNX0RFVkJVRiwgbWZsYWdzKTsKKwl9IGVsc2UgaWYgKGRtYXQtPmNv bW1vbi5uc2VnbWVudHMgPj0gYnRvYyhkbWF0LT5jb21tb24ubWF4c2l6ZSkgJiYKKwkgICAgZG1h dC0+Y29tbW9uLmFsaWdubWVudCA8PSBQQUdFX1NJWkUgJiYKKwkgICAgKGRtYXQtPmNvbW1vbi5i b3VuZGFyeSA9PSAwIHx8CisJICAgIGRtYXQtPmNvbW1vbi5ib3VuZGFyeSA+PSBkbWF0LT5jb21t b24ubG93YWRkcikpIHsKKwkJLyogUGFnZS1iYXNlZCBtdWx0aS1zZWdtZW50IGFsbG9jYXRpb25z IGFsbG93ZWQgKi8KKwkJKnZhZGRyID0gKHZvaWQgKilrbWVtX2FsbG9jX2F0dHIoa2VybmVsX2Fy ZW5hLAorCQkgICAgZG1hdC0+Y29tbW9uLm1heHNpemUsIG1mbGFncywgMHVsLCBkbWF0LT5jb21t b24ubG93YWRkciwKKwkJICAgIGF0dHIpOworCQlkbWF0LT5ib3VuY2VfZmxhZ3MgfD0gQlVTX0RN QV9LTUVNX0FMTE9DOworCX0gZWxzZSB7CisJCSp2YWRkciA9ICh2b2lkICopa21lbV9hbGxvY19j b250aWcoa2VybmVsX2FyZW5hLAorCQkgICAgZG1hdC0+Y29tbW9uLm1heHNpemUsIG1mbGFncywg MHVsLCBkbWF0LT5jb21tb24ubG93YWRkciwKKwkJICAgIGRtYXQtPmNvbW1vbi5hbGlnbm1lbnQg IT0gMCA/IGRtYXQtPmNvbW1vbi5hbGlnbm1lbnQgOiAxdWwsCisJCSAgICBkbWF0LT5jb21tb24u Ym91bmRhcnksIGF0dHIpOworCQlkbWF0LT5ib3VuY2VfZmxhZ3MgfD0gQlVTX0RNQV9LTUVNX0FM TE9DOworCX0KKwlpZiAoKnZhZGRyID09IE5VTEwpIHsKKwkJQ1RSNChLVFJfQlVTRE1BLCAiJXM6 IHRhZyAlcCB0YWcgZmxhZ3MgMHgleCBlcnJvciAlZCIsCisJCSAgICBfX2Z1bmNfXywgZG1hdCwg ZG1hdC0+Y29tbW9uLmZsYWdzLCBFTk9NRU0pOworCQlyZXR1cm4gKEVOT01FTSk7CisJfSBlbHNl IGlmICh2dG9waHlzKCp2YWRkcikgJiAoZG1hdC0+Y29tbW9uLmFsaWdubWVudCAtIDEpKSB7CisJ CXByaW50ZigiYnVzX2RtYW1lbV9hbGxvYyBmYWlsZWQgdG8gYWxpZ24gbWVtb3J5IHByb3Blcmx5 LlxuIik7CisJfQorCUNUUjQoS1RSX0JVU0RNQSwgIiVzOiB0YWcgJXAgdGFnIGZsYWdzIDB4JXgg ZXJyb3IgJWQiLAorCSAgICBfX2Z1bmNfXywgZG1hdCwgZG1hdC0+Y29tbW9uLmZsYWdzLCAwKTsK KwlyZXR1cm4gKDApOworfQorCisvKgorICogRnJlZSBhIHBpZWNlIG9mIG1lbW9yeSBhbmQgaXQn cyBhbGxvY2lhdGVkIGRtYW1hcCwgdGhhdCB3YXMgYWxsb2NhdGVkCisgKiB2aWEgYnVzX2RtYW1l bV9hbGxvYy4gIE1ha2UgdGhlIHNhbWUgY2hvaWNlIGZvciBmcmVlL2NvbnRpZ2ZyZWUuCisgKi8K K3N0YXRpYyB2b2lkCitib3VuY2VfYnVzX2RtYW1lbV9mcmVlKGJ1c19kbWFfdGFnX3QgZG1hdCwg dm9pZCAqdmFkZHIsIGJ1c19kbWFtYXBfdCBtYXApCit7CisJLyoKKwkgKiBkbWFtZW0gZG9lcyBu b3QgbmVlZCB0byBiZSBib3VuY2VkLCBzbyB0aGUgbWFwIHNob3VsZCBiZQorCSAqIE5VTEwgYW5k IHRoZSBCVVNfRE1BX0tNRU1fQUxMT0MgZmxhZyBjbGVhcmVkIGlmIG1hbGxvYygpCisJICogd2Fz IHVzZWQgYW5kIHNldCBpZiBrbWVtX2FsbG9jX2NvbnRpZygpIHdhcyB1c2VkLgorCSAqLworCWlm IChtYXAgIT0gTlVMTCkKKwkJcGFuaWMoImJ1c19kbWFtZW1fZnJlZTogSW52YWxpZCBtYXAgZnJl ZWRcbiIpOworCWlmICgoZG1hdC0+Ym91bmNlX2ZsYWdzICYgQlVTX0RNQV9LTUVNX0FMTE9DKSA9 PSAwKQorCQlmcmVlKHZhZGRyLCBNX0RFVkJVRik7CisJZWxzZQorCQlrbWVtX2ZyZWUoa2VybmVs X2FyZW5hLCAodm1fb2Zmc2V0X3QpdmFkZHIsCisJCSAgICBkbWF0LT5jb21tb24ubWF4c2l6ZSk7 CisJQ1RSMyhLVFJfQlVTRE1BLCAiJXM6IHRhZyAlcCBmbGFncyAweCV4IiwgX19mdW5jX18sIGRt YXQsCisJICAgIGRtYXQtPmJvdW5jZV9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitfYnVzX2Rt YW1hcF9jb3VudF9waHlzKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwgdm1f cGFkZHJfdCBidWYsCisgICAgYnVzX3NpemVfdCBidWZsZW4sIGludCBmbGFncykKK3sKKwlidXNf YWRkcl90IGN1cmFkZHI7CisJYnVzX3NpemVfdCBzZ3NpemU7CisKKwlpZiAoKG1hcCAhPSAmbm9i b3VuY2VfZG1hbWFwICYmIG1hcC0+cGFnZXNuZWVkZWQgPT0gMCkpIHsKKwkJLyoKKwkJICogQ291 bnQgdGhlIG51bWJlciBvZiBib3VuY2UgcGFnZXMKKwkJICogbmVlZGVkIGluIG9yZGVyIHRvIGNv bXBsZXRlIHRoaXMgdHJhbnNmZXIKKwkJICovCisJCWN1cmFkZHIgPSBidWY7CisJCXdoaWxlIChi dWZsZW4gIT0gMCkgeworCQkJc2dzaXplID0gTUlOKGJ1ZmxlbiwgZG1hdC0+Y29tbW9uLm1heHNl Z3N6KTsKKwkJCWlmIChidXNfZG1hX3J1bl9maWx0ZXIoJmRtYXQtPmNvbW1vbiwgY3VyYWRkcikp IHsKKwkJCQlzZ3NpemUgPSBNSU4oc2dzaXplLCBQQUdFX1NJWkUpOworCQkJCW1hcC0+cGFnZXNu ZWVkZWQrKzsKKwkJCX0KKwkJCWN1cmFkZHIgKz0gc2dzaXplOworCQkJYnVmbGVuIC09IHNnc2l6 ZTsKKwkJfQorCQlDVFIxKEtUUl9CVVNETUEsICJwYWdlc25lZWRlZD0gJWRcbiIsIG1hcC0+cGFn ZXNuZWVkZWQpOworCX0KK30KKworc3RhdGljIHZvaWQKK19idXNfZG1hbWFwX2NvdW50X3BhZ2Vz KGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwgcG1hcF90IHBtYXAsCisgICAg dm9pZCAqYnVmLCBidXNfc2l6ZV90IGJ1ZmxlbiwgaW50IGZsYWdzKQoreworCXZtX29mZnNldF90 IHZhZGRyOworCXZtX29mZnNldF90IHZlbmRhZGRyOworCWJ1c19hZGRyX3QgcGFkZHI7CisJYnVz X3NpemVfdCBzZ19sZW47CisKKwlpZiAoKG1hcCAhPSAmbm9ib3VuY2VfZG1hbWFwICYmIG1hcC0+ cGFnZXNuZWVkZWQgPT0gMCkpIHsKKwkJQ1RSNChLVFJfQlVTRE1BLCAibG93YWRkcj0gJWQgTWF4 bWVtPSAlZCwgYm91bmRhcnk9ICVkLCAiCisJCSAgICAiYWxpZ25tZW50PSAlZCIsIGRtYXQtPmNv bW1vbi5sb3dhZGRyLAorCQkgICAgcHRvYSgodm1fcGFkZHJfdClNYXhtZW0pLAorCQkgICAgZG1h dC0+Y29tbW9uLmJvdW5kYXJ5LCBkbWF0LT5jb21tb24uYWxpZ25tZW50KTsKKwkJQ1RSMyhLVFJf QlVTRE1BLCAibWFwPSAlcCwgbm9ib3VuY2VtYXA9ICVwLCBwYWdlc25lZWRlZD0gJWQiLAorCQkg ICAgbWFwLCAmbm9ib3VuY2VfZG1hbWFwLCBtYXAtPnBhZ2VzbmVlZGVkKTsKKwkJLyoKKwkJICog Q291bnQgdGhlIG51bWJlciBvZiBib3VuY2UgcGFnZXMKKwkJICogbmVlZGVkIGluIG9yZGVyIHRv IGNvbXBsZXRlIHRoaXMgdHJhbnNmZXIKKwkJICovCisJCXZhZGRyID0gKHZtX29mZnNldF90KWJ1 ZjsKKwkJdmVuZGFkZHIgPSAodm1fb2Zmc2V0X3QpYnVmICsgYnVmbGVuOworCisJCXdoaWxlICh2 YWRkciA8IHZlbmRhZGRyKSB7CisJCQlzZ19sZW4gPSBQQUdFX1NJWkUgLSAoKHZtX29mZnNldF90 KXZhZGRyICYgUEFHRV9NQVNLKTsKKwkJCWlmIChwbWFwID09IGtlcm5lbF9wbWFwKQorCQkJCXBh ZGRyID0gcG1hcF9rZXh0cmFjdCh2YWRkcik7CisJCQllbHNlCisJCQkJcGFkZHIgPSBwbWFwX2V4 dHJhY3QocG1hcCwgdmFkZHIpOworCQkJaWYgKGJ1c19kbWFfcnVuX2ZpbHRlcigmZG1hdC0+Y29t bW9uLCBwYWRkcikgIT0gMCkgeworCQkJCXNnX2xlbiA9IHJvdW5kdXAyKHNnX2xlbiwKKwkJCQkg ICAgZG1hdC0+Y29tbW9uLmFsaWdubWVudCk7CisJCQkJbWFwLT5wYWdlc25lZWRlZCsrOworCQkJ fQorCQkJdmFkZHIgKz0gc2dfbGVuOworCQl9CisJCUNUUjEoS1RSX0JVU0RNQSwgInBhZ2VzbmVl ZGVkPSAlZFxuIiwgbWFwLT5wYWdlc25lZWRlZCk7CisJfQorfQorCitzdGF0aWMgaW50CitfYnVz X2RtYW1hcF9yZXNlcnZlX3BhZ2VzKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1h cCwgaW50IGZsYWdzKQoreworCisJLyogUmVzZXJ2ZSBOZWNlc3NhcnkgQm91bmNlIFBhZ2VzICov CisJbXR4X2xvY2soJmJvdW5jZV9sb2NrKTsKKwlpZiAoZmxhZ3MgJiBCVVNfRE1BX05PV0FJVCkg eworCQlpZiAocmVzZXJ2ZV9ib3VuY2VfcGFnZXMoZG1hdCwgbWFwLCAwKSAhPSAwKSB7CisJCQlt dHhfdW5sb2NrKCZib3VuY2VfbG9jayk7CisJCQlyZXR1cm4gKEVOT01FTSk7CisJCX0KKwl9IGVs c2UgeworCQlpZiAocmVzZXJ2ZV9ib3VuY2VfcGFnZXMoZG1hdCwgbWFwLCAxKSAhPSAwKSB7CisJ CQkvKiBRdWV1ZSB1cyBmb3IgcmVzb3VyY2VzICovCisJCQlTVEFJTFFfSU5TRVJUX1RBSUwoJmJv dW5jZV9tYXBfd2FpdGluZ2xpc3QsIG1hcCwgbGlua3MpOworCQkJbXR4X3VubG9jaygmYm91bmNl X2xvY2spOworCQkJcmV0dXJuIChFSU5QUk9HUkVTUyk7CisJCX0KKwl9CisJbXR4X3VubG9jaygm Ym91bmNlX2xvY2spOworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEFkZCBhIHNpbmdsZSBj b250aWd1b3VzIHBoeXNpY2FsIHJhbmdlIHRvIHRoZSBzZWdtZW50IGxpc3QuCisgKi8KK3N0YXRp YyBpbnQKK19idXNfZG1hbWFwX2FkZHNlZyhidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBf dCBtYXAsIGJ1c19hZGRyX3QgY3VyYWRkciwKKyAgICBidXNfc2l6ZV90IHNnc2l6ZSwgYnVzX2Rt YV9zZWdtZW50X3QgKnNlZ3MsIGludCAqc2VncCkKK3sKKwlidXNfYWRkcl90IGJhZGRyLCBibWFz azsKKwlpbnQgc2VnOworCisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgZG9uJ3QgY3Jvc3MgYW55IGJv dW5kYXJpZXMuCisJICovCisJYm1hc2sgPSB+KGRtYXQtPmNvbW1vbi5ib3VuZGFyeSAtIDEpOwor CWlmIChkbWF0LT5jb21tb24uYm91bmRhcnkgPiAwKSB7CisJCWJhZGRyID0gKGN1cmFkZHIgKyBk bWF0LT5jb21tb24uYm91bmRhcnkpICYgYm1hc2s7CisJCWlmIChzZ3NpemUgPiAoYmFkZHIgLSBj dXJhZGRyKSkKKwkJCXNnc2l6ZSA9IChiYWRkciAtIGN1cmFkZHIpOworCX0KKworCS8qCisJICog SW5zZXJ0IGNodW5rIGludG8gYSBzZWdtZW50LCBjb2FsZXNjaW5nIHdpdGgKKwkgKiBwcmV2aW91 cyBzZWdtZW50IGlmIHBvc3NpYmxlLgorCSAqLworCXNlZyA9ICpzZWdwOworCWlmIChzZWcgPT0g LTEpIHsKKwkJc2VnID0gMDsKKwkJc2Vnc1tzZWddLmRzX2FkZHIgPSBjdXJhZGRyOworCQlzZWdz W3NlZ10uZHNfbGVuID0gc2dzaXplOworCX0gZWxzZSB7CisJCWlmIChjdXJhZGRyID09IHNlZ3Nb c2VnXS5kc19hZGRyICsgc2Vnc1tzZWddLmRzX2xlbiAmJgorCQkgICAgKHNlZ3Nbc2VnXS5kc19s ZW4gKyBzZ3NpemUpIDw9IGRtYXQtPmNvbW1vbi5tYXhzZWdzeiAmJgorCQkgICAgKGRtYXQtPmNv bW1vbi5ib3VuZGFyeSA9PSAwIHx8CisJCSAgICAgKHNlZ3Nbc2VnXS5kc19hZGRyICYgYm1hc2sp ID09IChjdXJhZGRyICYgYm1hc2spKSkKKwkJCXNlZ3Nbc2VnXS5kc19sZW4gKz0gc2dzaXplOwor CQllbHNlIHsKKwkJCWlmICgrK3NlZyA+PSBkbWF0LT5jb21tb24ubnNlZ21lbnRzKQorCQkJCXJl dHVybiAoMCk7CisJCQlzZWdzW3NlZ10uZHNfYWRkciA9IGN1cmFkZHI7CisJCQlzZWdzW3NlZ10u ZHNfbGVuID0gc2dzaXplOworCQl9CisJfQorCSpzZWdwID0gc2VnOworCXJldHVybiAoc2dzaXpl KTsKK30KKworLyoKKyAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gbG9hZCBhIHBoeXNpY2FsIGJ1ZmZl ci4gIHNlZ3AgY29udGFpbnMKKyAqIHRoZSBzdGFydGluZyBzZWdtZW50IG9uIGVudHJhY2UsIGFu ZCB0aGUgZW5kaW5nIHNlZ21lbnQgb24gZXhpdC4KKyAqLworc3RhdGljIGludAorYm91bmNlX2J1 c19kbWFtYXBfbG9hZF9waHlzKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwK KyAgICB2bV9wYWRkcl90IGJ1ZiwgYnVzX3NpemVfdCBidWZsZW4sIGludCBmbGFncywgYnVzX2Rt YV9zZWdtZW50X3QgKnNlZ3MsCisgICAgaW50ICpzZWdwKQoreworCWJ1c19zaXplX3Qgc2dzaXpl OworCWJ1c19hZGRyX3QgY3VyYWRkcjsKKwlpbnQgZXJyb3I7CisKKwlpZiAobWFwID09IE5VTEwp CisJCW1hcCA9ICZub2JvdW5jZV9kbWFtYXA7CisKKwlpZiAoc2VncyA9PSBOVUxMKQorCQlzZWdz ID0gZG1hdC0+c2VnbWVudHM7CisKKwlpZiAoKGRtYXQtPmJvdW5jZV9mbGFncyAmIEJVU19ETUFf Q09VTERfQk9VTkNFKSAhPSAwKSB7CisJCV9idXNfZG1hbWFwX2NvdW50X3BoeXMoZG1hdCwgbWFw LCBidWYsIGJ1ZmxlbiwgZmxhZ3MpOworCQlpZiAobWFwLT5wYWdlc25lZWRlZCAhPSAwKSB7CisJ CQllcnJvciA9IF9idXNfZG1hbWFwX3Jlc2VydmVfcGFnZXMoZG1hdCwgbWFwLCBmbGFncyk7CisJ CQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuIChlcnJvcik7CisJCX0KKwl9CisKKwl3aGlsZSAoYnVm bGVuID4gMCkgeworCQljdXJhZGRyID0gYnVmOworCQlzZ3NpemUgPSBNSU4oYnVmbGVuLCBkbWF0 LT5jb21tb24ubWF4c2Vnc3opOworCQlpZiAoKChkbWF0LT5ib3VuY2VfZmxhZ3MgJiBCVVNfRE1B X0NPVUxEX0JPVU5DRSkgIT0gMCkgJiYKKwkJICAgIG1hcC0+cGFnZXNuZWVkZWQgIT0gMCAmJgor CQkgICAgYnVzX2RtYV9ydW5fZmlsdGVyKCZkbWF0LT5jb21tb24sIGN1cmFkZHIpKSB7CisJCQlz Z3NpemUgPSBNSU4oc2dzaXplLCBQQUdFX1NJWkUpOworCQkJY3VyYWRkciA9IGFkZF9ib3VuY2Vf cGFnZShkbWF0LCBtYXAsIDAsIGN1cmFkZHIsCisJCQkgICAgc2dzaXplKTsKKwkJfQorCQlzZ3Np emUgPSBfYnVzX2RtYW1hcF9hZGRzZWcoZG1hdCwgbWFwLCBjdXJhZGRyLCBzZ3NpemUsIHNlZ3Ms CisJCSAgICBzZWdwKTsKKwkJaWYgKHNnc2l6ZSA9PSAwKQorCQkJYnJlYWs7CisJCWJ1ZiArPSBz Z3NpemU7CisJCWJ1ZmxlbiAtPSBzZ3NpemU7CisJfQorCisJLyoKKwkgKiBEaWQgd2UgZml0Pwor CSAqLworCXJldHVybiAoYnVmbGVuICE9IDAgPyBFRkJJRyA6IDApOyAvKiBYWFggYmV0dGVyIHJl dHVybiB2YWx1ZSBoZXJlPyAqLworfQorCisvKgorICogVXRpbGl0eSBmdW5jdGlvbiB0byBsb2Fk IGEgbGluZWFyIGJ1ZmZlci4gIHNlZ3AgY29udGFpbnMKKyAqIHRoZSBzdGFydGluZyBzZWdtZW50 IG9uIGVudHJhY2UsIGFuZCB0aGUgZW5kaW5nIHNlZ21lbnQgb24gZXhpdC4KKyAqLworc3RhdGlj IGludAorYm91bmNlX2J1c19kbWFtYXBfbG9hZF9idWZmZXIoYnVzX2RtYV90YWdfdCBkbWF0LCBi dXNfZG1hbWFwX3QgbWFwLCB2b2lkICpidWYsCisgICAgYnVzX3NpemVfdCBidWZsZW4sIHBtYXBf dCBwbWFwLCBpbnQgZmxhZ3MsIGJ1c19kbWFfc2VnbWVudF90ICpzZWdzLAorICAgIGludCAqc2Vn cCkKK3sKKwlidXNfc2l6ZV90IHNnc2l6ZSwgbWF4X3Nnc2l6ZTsKKwlidXNfYWRkcl90IGN1cmFk ZHI7CisJdm1fb2Zmc2V0X3QgdmFkZHI7CisJaW50IGVycm9yOworCisJaWYgKG1hcCA9PSBOVUxM KQorCQltYXAgPSAmbm9ib3VuY2VfZG1hbWFwOworCisJaWYgKHNlZ3MgPT0gTlVMTCkKKwkJc2Vn cyA9IGRtYXQtPnNlZ21lbnRzOworCisJaWYgKChkbWF0LT5ib3VuY2VfZmxhZ3MgJiBCVVNfRE1B X0NPVUxEX0JPVU5DRSkgIT0gMCkgeworCQlfYnVzX2RtYW1hcF9jb3VudF9wYWdlcyhkbWF0LCBt YXAsIHBtYXAsIGJ1ZiwgYnVmbGVuLCBmbGFncyk7CisJCWlmIChtYXAtPnBhZ2VzbmVlZGVkICE9 IDApIHsKKwkJCWVycm9yID0gX2J1c19kbWFtYXBfcmVzZXJ2ZV9wYWdlcyhkbWF0LCBtYXAsIGZs YWdzKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCX0KKworCXZh ZGRyID0gKHZtX29mZnNldF90KWJ1ZjsKKwl3aGlsZSAoYnVmbGVuID4gMCkgeworCQkvKgorCQkg KiBHZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoaXMgc2VnbWVudC4KKwkJICovCisJCWlm IChwbWFwID09IGtlcm5lbF9wbWFwKQorCQkJY3VyYWRkciA9IHBtYXBfa2V4dHJhY3QodmFkZHIp OworCQllbHNlCisJCQljdXJhZGRyID0gcG1hcF9leHRyYWN0KHBtYXAsIHZhZGRyKTsKKworCQkv KgorCQkgKiBDb21wdXRlIHRoZSBzZWdtZW50IHNpemUsIGFuZCBhZGp1c3QgY291bnRzLgorCQkg Ki8KKwkJbWF4X3Nnc2l6ZSA9IE1JTihidWZsZW4sIGRtYXQtPmNvbW1vbi5tYXhzZWdzeik7CisJ CXNnc2l6ZSA9IFBBR0VfU0laRSAtICgodm1fb2Zmc2V0X3QpY3VyYWRkciAmIFBBR0VfTUFTSyk7 CisJCWlmICgoKGRtYXQtPmJvdW5jZV9mbGFncyAmIEJVU19ETUFfQ09VTERfQk9VTkNFKSAhPSAw KSAmJgorCQkgICAgbWFwLT5wYWdlc25lZWRlZCAhPSAwICYmCisJCSAgICBidXNfZG1hX3J1bl9m aWx0ZXIoJmRtYXQtPmNvbW1vbiwgY3VyYWRkcikpIHsKKwkJCXNnc2l6ZSA9IHJvdW5kdXAyKHNn c2l6ZSwgZG1hdC0+Y29tbW9uLmFsaWdubWVudCk7CisJCQlzZ3NpemUgPSBNSU4oc2dzaXplLCBt YXhfc2dzaXplKTsKKwkJCWN1cmFkZHIgPSBhZGRfYm91bmNlX3BhZ2UoZG1hdCwgbWFwLCB2YWRk ciwgY3VyYWRkciwKKwkJCSAgICBzZ3NpemUpOworCQl9IGVsc2UgeworCQkJc2dzaXplID0gTUlO KHNnc2l6ZSwgbWF4X3Nnc2l6ZSk7CisJCX0KKwkJc2dzaXplID0gX2J1c19kbWFtYXBfYWRkc2Vn KGRtYXQsIG1hcCwgY3VyYWRkciwgc2dzaXplLCBzZWdzLAorCQkgICAgc2VncCk7CisJCWlmIChz Z3NpemUgPT0gMCkKKwkJCWJyZWFrOworCQl2YWRkciArPSBzZ3NpemU7CisJCWJ1ZmxlbiAtPSBz Z3NpemU7CisJfQorCisJLyoKKwkgKiBEaWQgd2UgZml0PworCSAqLworCXJldHVybiAoYnVmbGVu ICE9IDAgPyBFRkJJRyA6IDApOyAvKiBYWFggYmV0dGVyIHJldHVybiB2YWx1ZSBoZXJlPyAqLwor fQorCitzdGF0aWMgdm9pZAorYm91bmNlX2J1c19kbWFtYXBfd2FpdG9rKGJ1c19kbWFfdGFnX3Qg ZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwKKyAgICBzdHJ1Y3QgbWVtZGVzYyAqbWVtLCBidXNfZG1h bWFwX2NhbGxiYWNrX3QgKmNhbGxiYWNrLCB2b2lkICpjYWxsYmFja19hcmcpCit7CisKKwlpZiAo bWFwID09IE5VTEwpCisJCXJldHVybjsKKwltYXAtPm1lbSA9ICptZW07CisJbWFwLT5kbWF0ID0g ZG1hdDsKKwltYXAtPmNhbGxiYWNrID0gY2FsbGJhY2s7CisJbWFwLT5jYWxsYmFja19hcmcgPSBj YWxsYmFja19hcmc7Cit9CisKK3N0YXRpYyBidXNfZG1hX3NlZ21lbnRfdCAqCitib3VuY2VfYnVz X2RtYW1hcF9jb21wbGV0ZShidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsCisg ICAgYnVzX2RtYV9zZWdtZW50X3QgKnNlZ3MsIGludCBuc2VncywgaW50IGVycm9yKQoreworCisJ aWYgKHNlZ3MgPT0gTlVMTCkKKwkJc2VncyA9IGRtYXQtPnNlZ21lbnRzOworCXJldHVybiAoc2Vn cyk7Cit9CisKKy8qCisgKiBSZWxlYXNlIHRoZSBtYXBwaW5nIGhlbGQgYnkgbWFwLgorICovCitz dGF0aWMgdm9pZAorYm91bmNlX2J1c19kbWFtYXBfdW5sb2FkKGJ1c19kbWFfdGFnX3QgZG1hdCwg YnVzX2RtYW1hcF90IG1hcCkKK3sKKwlzdHJ1Y3QgYm91bmNlX3BhZ2UgKmJwYWdlOworCisJd2hp bGUgKChicGFnZSA9IFNUQUlMUV9GSVJTVCgmbWFwLT5icGFnZXMpKSAhPSBOVUxMKSB7CisJCVNU QUlMUV9SRU1PVkVfSEVBRCgmbWFwLT5icGFnZXMsIGxpbmtzKTsKKwkJZnJlZV9ib3VuY2VfcGFn ZShkbWF0LCBicGFnZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYm91bmNlX2J1c19kbWFtYXBf c3luYyhidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsCisgICAgYnVzX2RtYXN5 bmNfb3BfdCBvcCkKK3sKKwlzdHJ1Y3QgYm91bmNlX3BhZ2UgKmJwYWdlOworCisJLyoKKwkgKiBY WFggQVJNNjRUT0RPOgorCSAqIFRoaXMgYnVzX2RtYSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyBJ Ty1Db2hlcmVudCBhcmNoaXRlY3V0cmUuCisJICogSWYgSU8tQ29oZXJlbmN5IGlzIG5vdCBndWFy YW50ZWVkLCBjYWNoZSBvcGVyYXRpb25zIGhhdmUgdG8gYmUKKwkgKiBhZGRlZCB0byB0aGlzIGZ1 bmN0aW9uLgorCSAqLworCisJaWYgKChicGFnZSA9IFNUQUlMUV9GSVJTVCgmbWFwLT5icGFnZXMp KSAhPSBOVUxMKSB7CisJCS8qCisJCSAqIEhhbmRsZSBkYXRhIGJvdW5jaW5nLiAgV2UgbWlnaHQg YWxzbworCQkgKiB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBpbnZhbGlkYXRpbmcKKwkJICogdGhl IGNhY2hlcyBvbiBicm9rZW4gaGFyZHdhcmUKKwkJICovCisJCUNUUjQoS1RSX0JVU0RNQSwgIiVz OiB0YWcgJXAgdGFnIGZsYWdzIDB4JXggb3AgMHgleCAiCisJCSAgICAicGVyZm9ybWluZyBib3Vu Y2UiLCBfX2Z1bmNfXywgZG1hdCwKKwkJICAgIGRtYXQtPmNvbW1vbi5mbGFncywgb3ApOworCisJ CWlmICgob3AgJiBCVVNfRE1BU1lOQ19QUkVXUklURSkgIT0gMCkgeworCQkJd2hpbGUgKGJwYWdl ICE9IE5VTEwpIHsKKwkJCQlpZiAoYnBhZ2UtPmRhdGF2YWRkciAhPSAwKSB7CisJCQkJCWJjb3B5 KCh2b2lkICopYnBhZ2UtPmRhdGF2YWRkciwKKwkJCQkJICAgICh2b2lkICopYnBhZ2UtPnZhZGRy LAorCQkJCQkgICAgYnBhZ2UtPmRhdGFjb3VudCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcGh5c2Nv cHlvdXQoYnBhZ2UtPmRhdGFhZGRyLAorCQkJCQkgICAgKHZvaWQgKilicGFnZS0+dmFkZHIsCisJ CQkJCSAgICBicGFnZS0+ZGF0YWNvdW50KTsKKwkJCQl9CisJCQkJYnBhZ2UgPSBTVEFJTFFfTkVY VChicGFnZSwgbGlua3MpOworCQkJfQorCQkJZG1hdC0+Ym91bmNlX3pvbmUtPnRvdGFsX2JvdW5j ZWQrKzsKKwkJfQorCisJCWlmICgob3AgJiBCVVNfRE1BU1lOQ19QT1NUUkVBRCkgIT0gMCkgewor CQkJd2hpbGUgKGJwYWdlICE9IE5VTEwpIHsKKwkJCQlpZiAoYnBhZ2UtPmRhdGF2YWRkciAhPSAw KSB7CisJCQkJCWJjb3B5KCh2b2lkICopYnBhZ2UtPnZhZGRyLAorCQkJCQkgICAgKHZvaWQgKili cGFnZS0+ZGF0YXZhZGRyLAorCQkJCQkgICAgYnBhZ2UtPmRhdGFjb3VudCk7CisJCQkJfSBlbHNl IHsKKwkJCQkJcGh5c2NvcHlpbigodm9pZCAqKWJwYWdlLT52YWRkciwKKwkJCQkJICAgIGJwYWdl LT5kYXRhYWRkciwKKwkJCQkJICAgIGJwYWdlLT5kYXRhY291bnQpOworCQkJCX0KKwkJCQlicGFn ZSA9IFNUQUlMUV9ORVhUKGJwYWdlLCBsaW5rcyk7CisJCQl9CisJCQlkbWF0LT5ib3VuY2Vfem9u ZS0+dG90YWxfYm91bmNlZCsrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAoraW5pdF9ib3Vu Y2VfcGFnZXModm9pZCAqZHVtbXkgX191bnVzZWQpCit7CisKKwl0b3RhbF9icGFnZXMgPSAwOwor CVNUQUlMUV9JTklUKCZib3VuY2Vfem9uZV9saXN0KTsKKwlTVEFJTFFfSU5JVCgmYm91bmNlX21h cF93YWl0aW5nbGlzdCk7CisJU1RBSUxRX0lOSVQoJmJvdW5jZV9tYXBfY2FsbGJhY2tsaXN0KTsK KwltdHhfaW5pdCgmYm91bmNlX2xvY2ssICJib3VuY2UgcGFnZXMgbG9jayIsIE5VTEwsIE1UWF9E RUYpOworfQorU1lTSU5JVChicGFnZXMsIFNJX1NVQl9MT0NLLCBTSV9PUkRFUl9BTlksIGluaXRf Ym91bmNlX3BhZ2VzLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBzeXNjdGxfY3R4X2xpc3QgKgor YnVzZG1hX3N5c2N0bF90cmVlKHN0cnVjdCBib3VuY2Vfem9uZSAqYnopCit7CisJcmV0dXJuICgm YnotPnN5c2N0bF90cmVlKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNjdGxfb2lkICoKK2J1c2Rt YV9zeXNjdGxfdHJlZV90b3Aoc3RydWN0IGJvdW5jZV96b25lICpieikKK3sKKwlyZXR1cm4gKGJ6 LT5zeXNjdGxfdHJlZV90b3ApOworfQorCitzdGF0aWMgaW50CithbGxvY19ib3VuY2Vfem9uZShi dXNfZG1hX3RhZ190IGRtYXQpCit7CisJc3RydWN0IGJvdW5jZV96b25lICpiejsKKworCS8qIENo ZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBzdWl0YWJsZSB6b25lICovCisJU1RBSUxR X0ZPUkVBQ0goYnosICZib3VuY2Vfem9uZV9saXN0LCBsaW5rcykgeworCQlpZiAoKGRtYXQtPmNv bW1vbi5hbGlnbm1lbnQgPD0gYnotPmFsaWdubWVudCkgJiYKKwkJICAgIChkbWF0LT5jb21tb24u bG93YWRkciA+PSBiei0+bG93YWRkcikpIHsKKwkJCWRtYXQtPmJvdW5jZV96b25lID0gYno7CisJ CQlyZXR1cm4gKDApOworCQl9CisJfQorCisJaWYgKChieiA9IChzdHJ1Y3QgYm91bmNlX3pvbmUg KiltYWxsb2Moc2l6ZW9mKCpieiksIE1fREVWQlVGLAorCSAgICBNX05PV0FJVCB8IE1fWkVSTykp ID09IE5VTEwpCisJCXJldHVybiAoRU5PTUVNKTsKKworCVNUQUlMUV9JTklUKCZiei0+Ym91bmNl X3BhZ2VfbGlzdCk7CisJYnotPmZyZWVfYnBhZ2VzID0gMDsKKwliei0+cmVzZXJ2ZWRfYnBhZ2Vz ID0gMDsKKwliei0+YWN0aXZlX2JwYWdlcyA9IDA7CisJYnotPmxvd2FkZHIgPSBkbWF0LT5jb21t b24ubG93YWRkcjsKKwliei0+YWxpZ25tZW50ID0gTUFYKGRtYXQtPmNvbW1vbi5hbGlnbm1lbnQs IFBBR0VfU0laRSk7CisJYnotPm1hcF9jb3VudCA9IDA7CisJc25wcmludGYoYnotPnpvbmVpZCwg OCwgInpvbmUlZCIsIGJ1c2RtYV96b25lY291bnQpOworCWJ1c2RtYV96b25lY291bnQrKzsKKwlz bnByaW50Zihiei0+bG93YWRkcmlkLCAxOCwgIiUjangiLCAodWludG1heF90KWJ6LT5sb3dhZGRy KTsKKwlTVEFJTFFfSU5TRVJUX1RBSUwoJmJvdW5jZV96b25lX2xpc3QsIGJ6LCBsaW5rcyk7CisJ ZG1hdC0+Ym91bmNlX3pvbmUgPSBiejsKKworCXN5c2N0bF9jdHhfaW5pdCgmYnotPnN5c2N0bF90 cmVlKTsKKwliei0+c3lzY3RsX3RyZWVfdG9wID0gU1lTQ1RMX0FERF9OT0RFKCZiei0+c3lzY3Rs X3RyZWUsCisJICAgIFNZU0NUTF9TVEFUSUNfQ0hJTERSRU4oX2h3X2J1c2RtYSksIE9JRF9BVVRP LCBiei0+em9uZWlkLAorCSAgICBDVExGTEFHX1JELCAwLCAiIik7CisJaWYgKGJ6LT5zeXNjdGxf dHJlZV90b3AgPT0gTlVMTCkgeworCQlzeXNjdGxfY3R4X2ZyZWUoJmJ6LT5zeXNjdGxfdHJlZSk7 CisJCXJldHVybiAoMCk7CS8qIFhYWCBlcnJvciBjb2RlPyAqLworCX0KKworCVNZU0NUTF9BRERf SU5UKGJ1c2RtYV9zeXNjdGxfdHJlZShieiksCisJICAgIFNZU0NUTF9DSElMRFJFTihidXNkbWFf c3lzY3RsX3RyZWVfdG9wKGJ6KSksIE9JRF9BVVRPLAorCSAgICAidG90YWxfYnBhZ2VzIiwgQ1RM RkxBR19SRCwgJmJ6LT50b3RhbF9icGFnZXMsIDAsCisJICAgICJUb3RhbCBib3VuY2UgcGFnZXMi KTsKKwlTWVNDVExfQUREX0lOVChidXNkbWFfc3lzY3RsX3RyZWUoYnopLAorCSAgICBTWVNDVExf Q0hJTERSRU4oYnVzZG1hX3N5c2N0bF90cmVlX3RvcChieikpLCBPSURfQVVUTywKKwkgICAgImZy ZWVfYnBhZ2VzIiwgQ1RMRkxBR19SRCwgJmJ6LT5mcmVlX2JwYWdlcywgMCwKKwkgICAgIkZyZWUg Ym91bmNlIHBhZ2VzIik7CisJU1lTQ1RMX0FERF9JTlQoYnVzZG1hX3N5c2N0bF90cmVlKGJ6KSwK KwkgICAgU1lTQ1RMX0NISUxEUkVOKGJ1c2RtYV9zeXNjdGxfdHJlZV90b3AoYnopKSwgT0lEX0FV VE8sCisJICAgICJyZXNlcnZlZF9icGFnZXMiLCBDVExGTEFHX1JELCAmYnotPnJlc2VydmVkX2Jw YWdlcywgMCwKKwkgICAgIlJlc2VydmVkIGJvdW5jZSBwYWdlcyIpOworCVNZU0NUTF9BRERfSU5U KGJ1c2RtYV9zeXNjdGxfdHJlZShieiksCisJICAgIFNZU0NUTF9DSElMRFJFTihidXNkbWFfc3lz Y3RsX3RyZWVfdG9wKGJ6KSksIE9JRF9BVVRPLAorCSAgICAiYWN0aXZlX2JwYWdlcyIsIENUTEZM QUdfUkQsICZiei0+YWN0aXZlX2JwYWdlcywgMCwKKwkgICAgIkFjdGl2ZSBib3VuY2UgcGFnZXMi KTsKKwlTWVNDVExfQUREX0lOVChidXNkbWFfc3lzY3RsX3RyZWUoYnopLAorCSAgICBTWVNDVExf Q0hJTERSRU4oYnVzZG1hX3N5c2N0bF90cmVlX3RvcChieikpLCBPSURfQVVUTywKKwkgICAgInRv dGFsX2JvdW5jZWQiLCBDVExGTEFHX1JELCAmYnotPnRvdGFsX2JvdW5jZWQsIDAsCisJICAgICJU b3RhbCBib3VuY2UgcmVxdWVzdHMiKTsKKwlTWVNDVExfQUREX0lOVChidXNkbWFfc3lzY3RsX3Ry ZWUoYnopLAorCSAgICBTWVNDVExfQ0hJTERSRU4oYnVzZG1hX3N5c2N0bF90cmVlX3RvcChieikp LCBPSURfQVVUTywKKwkgICAgInRvdGFsX2RlZmVycmVkIiwgQ1RMRkxBR19SRCwgJmJ6LT50b3Rh bF9kZWZlcnJlZCwgMCwKKwkgICAgIlRvdGFsIGJvdW5jZSByZXF1ZXN0cyB0aGF0IHdlcmUgZGVm ZXJyZWQiKTsKKwlTWVNDVExfQUREX1NUUklORyhidXNkbWFfc3lzY3RsX3RyZWUoYnopLAorCSAg ICBTWVNDVExfQ0hJTERSRU4oYnVzZG1hX3N5c2N0bF90cmVlX3RvcChieikpLCBPSURfQVVUTywK KwkgICAgImxvd2FkZHIiLCBDVExGTEFHX1JELCBiei0+bG93YWRkcmlkLCAwLCAiIik7CisJU1lT Q1RMX0FERF9VQVVUTyhidXNkbWFfc3lzY3RsX3RyZWUoYnopLAorCSAgICBTWVNDVExfQ0hJTERS RU4oYnVzZG1hX3N5c2N0bF90cmVlX3RvcChieikpLCBPSURfQVVUTywKKwkgICAgImFsaWdubWVu dCIsIENUTEZMQUdfUkQsICZiei0+YWxpZ25tZW50LCAiIik7CisKKwlyZXR1cm4gKDApOworfQor CitzdGF0aWMgaW50CithbGxvY19ib3VuY2VfcGFnZXMoYnVzX2RtYV90YWdfdCBkbWF0LCB1X2lu dCBudW1wYWdlcykKK3sKKwlzdHJ1Y3QgYm91bmNlX3pvbmUgKmJ6OworCWludCBjb3VudDsKKwor CWJ6ID0gZG1hdC0+Ym91bmNlX3pvbmU7CisJY291bnQgPSAwOworCXdoaWxlIChudW1wYWdlcyA+ IDApIHsKKwkJc3RydWN0IGJvdW5jZV9wYWdlICpicGFnZTsKKworCQlicGFnZSA9IChzdHJ1Y3Qg Ym91bmNlX3BhZ2UgKiltYWxsb2Moc2l6ZW9mKCpicGFnZSksIE1fREVWQlVGLAorCQkJCQkJICAg ICBNX05PV0FJVCB8IE1fWkVSTyk7CisKKwkJaWYgKGJwYWdlID09IE5VTEwpCisJCQlicmVhazsK KwkJYnBhZ2UtPnZhZGRyID0gKHZtX29mZnNldF90KWNvbnRpZ21hbGxvYyhQQUdFX1NJWkUsIE1f REVWQlVGLAorCQkJCQkJCSBNX05PV0FJVCwgMHVsLAorCQkJCQkJCSBiei0+bG93YWRkciwKKwkJ CQkJCQkgUEFHRV9TSVpFLAorCQkJCQkJCSAwKTsKKwkJaWYgKGJwYWdlLT52YWRkciA9PSAwKSB7 CisJCQlmcmVlKGJwYWdlLCBNX0RFVkJVRik7CisJCQlicmVhazsKKwkJfQorCQlicGFnZS0+YnVz YWRkciA9IHBtYXBfa2V4dHJhY3QoYnBhZ2UtPnZhZGRyKTsKKwkJbXR4X2xvY2soJmJvdW5jZV9s b2NrKTsKKwkJU1RBSUxRX0lOU0VSVF9UQUlMKCZiei0+Ym91bmNlX3BhZ2VfbGlzdCwgYnBhZ2Us IGxpbmtzKTsKKwkJdG90YWxfYnBhZ2VzKys7CisJCWJ6LT50b3RhbF9icGFnZXMrKzsKKwkJYnot PmZyZWVfYnBhZ2VzKys7CisJCW10eF91bmxvY2soJmJvdW5jZV9sb2NrKTsKKwkJY291bnQrKzsK KwkJbnVtcGFnZXMtLTsKKwl9CisJcmV0dXJuIChjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQKK3Jl c2VydmVfYm91bmNlX3BhZ2VzKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwg aW50IGNvbW1pdCkKK3sKKwlzdHJ1Y3QgYm91bmNlX3pvbmUgKmJ6OworCWludCBwYWdlczsKKwor CW10eF9hc3NlcnQoJmJvdW5jZV9sb2NrLCBNQV9PV05FRCk7CisJYnogPSBkbWF0LT5ib3VuY2Vf em9uZTsKKwlwYWdlcyA9IE1JTihiei0+ZnJlZV9icGFnZXMsIG1hcC0+cGFnZXNuZWVkZWQgLSBt YXAtPnBhZ2VzcmVzZXJ2ZWQpOworCWlmIChjb21taXQgPT0gMCAmJiBtYXAtPnBhZ2VzbmVlZGVk ID4gKG1hcC0+cGFnZXNyZXNlcnZlZCArIHBhZ2VzKSkKKwkJcmV0dXJuIChtYXAtPnBhZ2VzbmVl ZGVkIC0gKG1hcC0+cGFnZXNyZXNlcnZlZCArIHBhZ2VzKSk7CisJYnotPmZyZWVfYnBhZ2VzIC09 IHBhZ2VzOworCWJ6LT5yZXNlcnZlZF9icGFnZXMgKz0gcGFnZXM7CisJbWFwLT5wYWdlc3Jlc2Vy dmVkICs9IHBhZ2VzOworCXBhZ2VzID0gbWFwLT5wYWdlc25lZWRlZCAtIG1hcC0+cGFnZXNyZXNl cnZlZDsKKworCXJldHVybiAocGFnZXMpOworfQorCitzdGF0aWMgYnVzX2FkZHJfdAorYWRkX2Jv dW5jZV9wYWdlKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwgdm1fb2Zmc2V0 X3QgdmFkZHIsCisJCWJ1c19hZGRyX3QgYWRkciwgYnVzX3NpemVfdCBzaXplKQoreworCXN0cnVj dCBib3VuY2Vfem9uZSAqYno7CisJc3RydWN0IGJvdW5jZV9wYWdlICpicGFnZTsKKworCUtBU1NF UlQoZG1hdC0+Ym91bmNlX3pvbmUgIT0gTlVMTCwgKCJubyBib3VuY2Ugem9uZSBpbiBkbWEgdGFn IikpOworCUtBU1NFUlQobWFwICE9IE5VTEwgJiYgbWFwICE9ICZub2JvdW5jZV9kbWFtYXAsCisJ ICAgICgiYWRkX2JvdW5jZV9wYWdlOiBiYWQgbWFwICVwIiwgbWFwKSk7CisKKwlieiA9IGRtYXQt PmJvdW5jZV96b25lOworCWlmIChtYXAtPnBhZ2VzbmVlZGVkID09IDApCisJCXBhbmljKCJhZGRf Ym91bmNlX3BhZ2U6IG1hcCBkb2Vzbid0IG5lZWQgYW55IHBhZ2VzIik7CisJbWFwLT5wYWdlc25l ZWRlZC0tOworCisJaWYgKG1hcC0+cGFnZXNyZXNlcnZlZCA9PSAwKQorCQlwYW5pYygiYWRkX2Jv dW5jZV9wYWdlOiBtYXAgZG9lc24ndCBuZWVkIGFueSBwYWdlcyIpOworCW1hcC0+cGFnZXNyZXNl cnZlZC0tOworCisJbXR4X2xvY2soJmJvdW5jZV9sb2NrKTsKKwlicGFnZSA9IFNUQUlMUV9GSVJT VCgmYnotPmJvdW5jZV9wYWdlX2xpc3QpOworCWlmIChicGFnZSA9PSBOVUxMKQorCQlwYW5pYygi YWRkX2JvdW5jZV9wYWdlOiBmcmVlIHBhZ2UgbGlzdCBpcyBlbXB0eSIpOworCisJU1RBSUxRX1JF TU9WRV9IRUFEKCZiei0+Ym91bmNlX3BhZ2VfbGlzdCwgbGlua3MpOworCWJ6LT5yZXNlcnZlZF9i cGFnZXMtLTsKKwliei0+YWN0aXZlX2JwYWdlcysrOworCW10eF91bmxvY2soJmJvdW5jZV9sb2Nr KTsKKworCWlmIChkbWF0LT5jb21tb24uZmxhZ3MgJiBCVVNfRE1BX0tFRVBfUEdfT0ZGU0VUKSB7 CisJCS8qIFBhZ2Ugb2Zmc2V0IG5lZWRzIHRvIGJlIHByZXNlcnZlZC4gKi8KKwkJYnBhZ2UtPnZh ZGRyIHw9IHZhZGRyICYgUEFHRV9NQVNLOworCQlicGFnZS0+YnVzYWRkciB8PSB2YWRkciAmIFBB R0VfTUFTSzsKKwl9CisJYnBhZ2UtPmRhdGF2YWRkciA9IHZhZGRyOworCWJwYWdlLT5kYXRhYWRk ciA9IGFkZHI7CisJYnBhZ2UtPmRhdGFjb3VudCA9IHNpemU7CisJU1RBSUxRX0lOU0VSVF9UQUlM KCYobWFwLT5icGFnZXMpLCBicGFnZSwgbGlua3MpOworCXJldHVybiAoYnBhZ2UtPmJ1c2FkZHIp OworfQorCitzdGF0aWMgdm9pZAorZnJlZV9ib3VuY2VfcGFnZShidXNfZG1hX3RhZ190IGRtYXQs IHN0cnVjdCBib3VuY2VfcGFnZSAqYnBhZ2UpCit7CisJc3RydWN0IGJ1c19kbWFtYXAgKm1hcDsK KwlzdHJ1Y3QgYm91bmNlX3pvbmUgKmJ6OworCisJYnogPSBkbWF0LT5ib3VuY2Vfem9uZTsKKwli cGFnZS0+ZGF0YXZhZGRyID0gMDsKKwlicGFnZS0+ZGF0YWNvdW50ID0gMDsKKwlpZiAoZG1hdC0+ Y29tbW9uLmZsYWdzICYgQlVTX0RNQV9LRUVQX1BHX09GRlNFVCkgeworCQkvKgorCQkgKiBSZXNl dCB0aGUgYm91bmNlIHBhZ2UgdG8gc3RhcnQgYXQgb2Zmc2V0IDAuICBPdGhlciB1c2VzCisJCSAq IG9mIHRoaXMgYm91bmNlIHBhZ2UgbWF5IG5lZWQgdG8gc3RvcmUgYSBmdWxsIHBhZ2Ugb2YKKwkJ ICogZGF0YSBhbmQvb3IgYXNzdW1lIGl0IHN0YXJ0cyBvbiBhIHBhZ2UgYm91bmRhcnkuCisJCSAq LworCQlicGFnZS0+dmFkZHIgJj0gflBBR0VfTUFTSzsKKwkJYnBhZ2UtPmJ1c2FkZHIgJj0gflBB R0VfTUFTSzsKKwl9CisKKwltdHhfbG9jaygmYm91bmNlX2xvY2spOworCVNUQUlMUV9JTlNFUlRf SEVBRCgmYnotPmJvdW5jZV9wYWdlX2xpc3QsIGJwYWdlLCBsaW5rcyk7CisJYnotPmZyZWVfYnBh Z2VzKys7CisJYnotPmFjdGl2ZV9icGFnZXMtLTsKKwlpZiAoKG1hcCA9IFNUQUlMUV9GSVJTVCgm Ym91bmNlX21hcF93YWl0aW5nbGlzdCkpICE9IE5VTEwpIHsKKwkJaWYgKHJlc2VydmVfYm91bmNl X3BhZ2VzKG1hcC0+ZG1hdCwgbWFwLCAxKSA9PSAwKSB7CisJCQlTVEFJTFFfUkVNT1ZFX0hFQUQo JmJvdW5jZV9tYXBfd2FpdGluZ2xpc3QsIGxpbmtzKTsKKwkJCVNUQUlMUV9JTlNFUlRfVEFJTCgm Ym91bmNlX21hcF9jYWxsYmFja2xpc3QsCisJCQkgICAgbWFwLCBsaW5rcyk7CisJCQlidXNkbWFf c3dpX3BlbmRpbmcgPSAxOworCQkJYnotPnRvdGFsX2RlZmVycmVkKys7CisJCQlzd2lfc2NoZWQo dm1faWgsIDApOworCQl9CisJfQorCW10eF91bmxvY2soJmJvdW5jZV9sb2NrKTsKK30KKwordm9p ZAorYnVzZG1hX3N3aSh2b2lkKQoreworCWJ1c19kbWFfdGFnX3QgZG1hdDsKKwlzdHJ1Y3QgYnVz X2RtYW1hcCAqbWFwOworCisJbXR4X2xvY2soJmJvdW5jZV9sb2NrKTsKKwl3aGlsZSAoKG1hcCA9 IFNUQUlMUV9GSVJTVCgmYm91bmNlX21hcF9jYWxsYmFja2xpc3QpKSAhPSBOVUxMKSB7CisJCVNU QUlMUV9SRU1PVkVfSEVBRCgmYm91bmNlX21hcF9jYWxsYmFja2xpc3QsIGxpbmtzKTsKKwkJbXR4 X3VubG9jaygmYm91bmNlX2xvY2spOworCQlkbWF0ID0gbWFwLT5kbWF0OworCQkoZG1hdC0+Y29t bW9uLmxvY2tmdW5jKShkbWF0LT5jb21tb24ubG9ja2Z1bmNhcmcsIEJVU19ETUFfTE9DSyk7CisJ CWJ1c19kbWFtYXBfbG9hZF9tZW0obWFwLT5kbWF0LCBtYXAsICZtYXAtPm1lbSwKKwkJICAgIG1h cC0+Y2FsbGJhY2ssIG1hcC0+Y2FsbGJhY2tfYXJnLCBCVVNfRE1BX1dBSVRPSyk7CisJCShkbWF0 LT5jb21tb24ubG9ja2Z1bmMpKGRtYXQtPmNvbW1vbi5sb2NrZnVuY2FyZywKKwkJICAgIEJVU19E TUFfVU5MT0NLKTsKKwkJbXR4X2xvY2soJmJvdW5jZV9sb2NrKTsKKwl9CisJbXR4X3VubG9jaygm Ym91bmNlX2xvY2spOworfQorCitzdHJ1Y3QgYnVzX2RtYV9pbXBsIGJ1c19kbWFfYm91bmNlX2lt cGwgPSB7CisJLnRhZ19jcmVhdGUgPSBib3VuY2VfYnVzX2RtYV90YWdfY3JlYXRlLAorCS50YWdf ZGVzdHJveSA9IGJvdW5jZV9idXNfZG1hX3RhZ19kZXN0cm95LAorCS5tYXBfY3JlYXRlID0gYm91 bmNlX2J1c19kbWFtYXBfY3JlYXRlLAorCS5tYXBfZGVzdHJveSA9IGJvdW5jZV9idXNfZG1hbWFw X2Rlc3Ryb3ksCisJLm1lbV9hbGxvYyA9IGJvdW5jZV9idXNfZG1hbWVtX2FsbG9jLAorCS5tZW1f ZnJlZSA9IGJvdW5jZV9idXNfZG1hbWVtX2ZyZWUsCisJLmxvYWRfcGh5cyA9IGJvdW5jZV9idXNf ZG1hbWFwX2xvYWRfcGh5cywKKwkubG9hZF9idWZmZXIgPSBib3VuY2VfYnVzX2RtYW1hcF9sb2Fk X2J1ZmZlciwKKwkubG9hZF9tYSA9IGJ1c19kbWFtYXBfbG9hZF9tYV90cml2LAorCS5tYXBfd2Fp dG9rID0gYm91bmNlX2J1c19kbWFtYXBfd2FpdG9rLAorCS5tYXBfY29tcGxldGUgPSBib3VuY2Vf YnVzX2RtYW1hcF9jb21wbGV0ZSwKKwkubWFwX3VubG9hZCA9IGJvdW5jZV9idXNfZG1hbWFwX3Vu bG9hZCwKKwkubWFwX3N5bmMgPSBib3VuY2VfYnVzX2RtYW1hcF9zeW5jCit9OwoK --b1_8438b44d4f3b7e535062a5c7553b260f--