From owner-freebsd-arm@FreeBSD.ORG Thu May 7 12:07:40 2015 Return-Path: Delivered-To: freebsd-arm@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 95BE294C for ; Thu, 7 May 2015 12:07:40 +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 6EAC21C00 for ; Thu, 7 May 2015 12:07:40 +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 t47C7etB070891 for ; Thu, 7 May 2015 12:07:40 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 t47C7e2E070890; Thu, 7 May 2015 12:07:40 GMT (envelope-from daemon-user) Date: Thu, 7 May 2015 12:07:40 +0000 To: freebsd-arm@freebsd.org From: "zbb (Zbigniew Bodek)" Subject: [Differential] [Updated, 1, 482 lines] D2357: Port x86 busdma to ARM64 Message-ID: <0898dab31300b56c7a2404adbbcb53b3@localhost.localdomain> 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: X-Phabricator-Cc: In-Reply-To: References: Thread-Index: MGY3ZjQ1YWY5OGJjZWFlYzE0YWJhYTBhN2U5IFVLVYw= 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_0898dab31300b56c7a2404adbbcb53b3" 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, 07 May 2015 12:07:40 -0000 --b1_0898dab31300b56c7a2404adbbcb53b3 Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: 8bit zbb updated this revision to Diff 5257. CHANGES SINCE LAST UPDATE https://reviews.freebsd.org/D2357?vs=5182&id=5257 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_impl.h sys/conf/files.arm64 EMAIL PREFERENCES https://reviews.freebsd.org/settings/panel/emailpreferences/ To: zbb, emaste, ian, imp, andrew Cc: onwahe-gmail-com, emaste, freebsd-arm --b1_0898dab31300b56c7a2404adbbcb53b3 Content-Type: text/x-patch; charset=utf-8; name="D2357.5257.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D2357.5257.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 TUFHRS4KKyAqCisgKiAkRnJlZUJTRCQKKyAqLworCisjaWZuZGVmCV9NQUNISU5FX0JVU19ETUFf SU1QTF9IXworI2RlZmluZQlfTUFDSElORV9CVVNfRE1BX0lNUExfSF8KKworc3RydWN0IGJ1c19k bWFfdGFnX2NvbW1vbiB7CisJc3RydWN0IGJ1c19kbWFfaW1wbCAqaW1wbDsKKwlzdHJ1Y3QgYnVz X2RtYV90YWdfY29tbW9uICpwYXJlbnQ7CisJYnVzX3NpemVfdAkgIGFsaWdubWVudDsKKwlidXNf YWRkcl90CSAgYm91bmRhcnk7CisJYnVzX2FkZHJfdAkgIGxvd2FkZHI7CisJYnVzX2FkZHJfdAkg IGhpZ2hhZGRyOworCWJ1c19kbWFfZmlsdGVyX3QgKmZpbHRlcjsKKwl2b2lkCQkgKmZpbHRlcmFy ZzsKKwlidXNfc2l6ZV90CSAgbWF4c2l6ZTsKKwl1X2ludAkJICBuc2VnbWVudHM7CisJYnVzX3Np emVfdAkgIG1heHNlZ3N6OworCWludAkJICBmbGFnczsKKwlidXNfZG1hX2xvY2tfdAkgKmxvY2tm dW5jOworCXZvaWQJCSAqbG9ja2Z1bmNhcmc7CisJaW50CQkgIHJlZl9jb3VudDsKK307CisKK3N0 cnVjdCBidXNfZG1hX2ltcGwgeworCWludCAoKnRhZ19jcmVhdGUpKGJ1c19kbWFfdGFnX3QgcGFy ZW50LAorCSAgICBidXNfc2l6ZV90IGFsaWdubWVudCwgYnVzX2FkZHJfdCBib3VuZGFyeSwgYnVz X2FkZHJfdCBsb3dhZGRyLAorCSAgICBidXNfYWRkcl90IGhpZ2hhZGRyLCBidXNfZG1hX2ZpbHRl cl90ICpmaWx0ZXIsCisJICAgIHZvaWQgKmZpbHRlcmFyZywgYnVzX3NpemVfdCBtYXhzaXplLCBp bnQgbnNlZ21lbnRzLAorCSAgICBidXNfc2l6ZV90IG1heHNlZ3N6LCBpbnQgZmxhZ3MsIGJ1c19k bWFfbG9ja190ICpsb2NrZnVuYywKKwkgICAgdm9pZCAqbG9ja2Z1bmNhcmcsIGJ1c19kbWFfdGFn X3QgKmRtYXQpOworCWludCAoKnRhZ19kZXN0cm95KShidXNfZG1hX3RhZ190IGRtYXQpOworCWlu dCAoKm1hcF9jcmVhdGUpKGJ1c19kbWFfdGFnX3QgZG1hdCwgaW50IGZsYWdzLCBidXNfZG1hbWFw X3QgKm1hcHApOworCWludCAoKm1hcF9kZXN0cm95KShidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19k bWFtYXBfdCBtYXApOworCWludCAoKm1lbV9hbGxvYykoYnVzX2RtYV90YWdfdCBkbWF0LCB2b2lk KiogdmFkZHIsIGludCBmbGFncywKKwkgICAgYnVzX2RtYW1hcF90ICptYXBwKTsKKwl2b2lkICgq bWVtX2ZyZWUpKGJ1c19kbWFfdGFnX3QgZG1hdCwgdm9pZCAqdmFkZHIsIGJ1c19kbWFtYXBfdCBt YXApOworCWludCAoKmxvYWRfbWEpKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1h cCwKKwkgICAgc3RydWN0IHZtX3BhZ2UgKiptYSwgYnVzX3NpemVfdCB0bGVuLCBpbnQgbWFfb2Zm cywgaW50IGZsYWdzLAorCSAgICBidXNfZG1hX3NlZ21lbnRfdCAqc2VncywgaW50ICpzZWdwKTsK KwlpbnQgKCpsb2FkX3BoeXMpKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwK KwkgICAgdm1fcGFkZHJfdCBidWYsIGJ1c19zaXplX3QgYnVmbGVuLCBpbnQgZmxhZ3MsCisJICAg IGJ1c19kbWFfc2VnbWVudF90ICpzZWdzLCBpbnQgKnNlZ3ApOworCWludCAoKmxvYWRfYnVmZmVy KShidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsCisJICAgIHZvaWQgKmJ1Ziwg YnVzX3NpemVfdCBidWZsZW4sIHBtYXBfdCBwbWFwLCBpbnQgZmxhZ3MsCisJICAgIGJ1c19kbWFf c2VnbWVudF90ICpzZWdzLCBpbnQgKnNlZ3ApOworCXZvaWQgKCptYXBfd2FpdG9rKShidXNfZG1h X3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsCisJICAgIHN0cnVjdCBtZW1kZXNjICptZW0s IGJ1c19kbWFtYXBfY2FsbGJhY2tfdCAqY2FsbGJhY2ssCisJICAgIHZvaWQgKmNhbGxiYWNrX2Fy Zyk7CisJYnVzX2RtYV9zZWdtZW50X3QgKigqbWFwX2NvbXBsZXRlKShidXNfZG1hX3RhZ190IGRt YXQsIGJ1c19kbWFtYXBfdCBtYXAsCisJICAgIGJ1c19kbWFfc2VnbWVudF90ICpzZWdzLCBpbnQg bnNlZ3MsIGludCBlcnJvcik7CisJdm9pZCAoKm1hcF91bmxvYWQpKGJ1c19kbWFfdGFnX3QgZG1h dCwgYnVzX2RtYW1hcF90IG1hcCk7CisJdm9pZCAoKm1hcF9zeW5jKShidXNfZG1hX3RhZ190IGRt YXQsIGJ1c19kbWFtYXBfdCBtYXAsCisJICAgIGJ1c19kbWFzeW5jX29wX3Qgb3ApOworfTsKKwor dm9pZCBidXNfZG1hX2RmbHRfbG9jayh2b2lkICphcmcsIGJ1c19kbWFfbG9ja19vcF90IG9wKTsK K2ludCBidXNfZG1hX3J1bl9maWx0ZXIoc3RydWN0IGJ1c19kbWFfdGFnX2NvbW1vbiAqZG1hdCwg YnVzX2FkZHJfdCBwYWRkcik7CitpbnQgY29tbW9uX2J1c19kbWFfdGFnX2NyZWF0ZShzdHJ1Y3Qg YnVzX2RtYV90YWdfY29tbW9uICpwYXJlbnQsCisgICAgYnVzX3NpemVfdCBhbGlnbm1lbnQsCisg ICAgYnVzX2FkZHJfdCBib3VuZGFyeSwgYnVzX2FkZHJfdCBsb3dhZGRyLCBidXNfYWRkcl90IGhp Z2hhZGRyLAorICAgIGJ1c19kbWFfZmlsdGVyX3QgKmZpbHRlciwgdm9pZCAqZmlsdGVyYXJnLCBi dXNfc2l6ZV90IG1heHNpemUsCisgICAgaW50IG5zZWdtZW50cywgYnVzX3NpemVfdCBtYXhzZWdz eiwgaW50IGZsYWdzLCBidXNfZG1hX2xvY2tfdCAqbG9ja2Z1bmMsCisgICAgdm9pZCAqbG9ja2Z1 bmNhcmcsIHNpemVfdCBzeiwgdm9pZCAqKmRtYXQpOworCitleHRlcm4gc3RydWN0IGJ1c19kbWFf aW1wbCBidXNfZG1hX2JvdW5jZV9pbXBsOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5cy9hcm02 NC9hcm02NC9idXNkbWFfbWFjaGRlcC5jIGIvc3lzL2FybTY0L2FybTY0L2J1c2RtYV9tYWNoZGVw LmMKLS0tIGEvc3lzL2FybTY0L2FybTY0L2J1c2RtYV9tYWNoZGVwLmMKKysrIGIvc3lzL2FybTY0 L2FybTY0L2J1c2RtYV9tYWNoZGVwLmMKQEAgLTEsMjIgKzEsMjkyIEBACi0vKiAkRnJlZUJTRCQg Ki8KKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk4IEp1c3RpbiBULiBHaWJicy4KKyAq IENvcHlyaWdodCAoYykgMjAxMywgMjAxNSBUaGUgRnJlZUJTRCBGb3VuZGF0aW9uCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgd2FzIGRldmVsb3BlZCBieSBL b25zdGFudGluIEJlbG91c292IDxraWJARnJlZUJTRC5vcmc+CisgKiB1bmRlciBzcG9uc29yc2hp cCBmcm9tIHRoZSBGcmVlQlNEIEZvdW5kYXRpb24uCisgKgorICogUG9ydGlvbnMgb2YgdGhpcyBz b2Z0d2FyZSB3ZXJlIGRldmVsb3BlZCBieSBTZW1paGFsZgorICogdW5kZXIgc3BvbnNvcnNoaXAg b2YgdGhlIEZyZWVCU0QgRm91bmRhdGlvbi4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0 IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj b25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBt b2RpZmljYXRpb24sIGltbWVkaWF0ZWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisg KiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9y IHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhv dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdB UkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBB TkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJ TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFC TEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklD RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ T04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9G IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ TElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KIAogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgog X19GQlNESUQoIiRGcmVlQlNEJCIpOwogCiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAjaW5jbHVk ZSA8c3lzL3N5c3RtLmg+Ci0KKyNpbmNsdWRlIDxzeXMvbWFsbG9jLmg+CisjaW5jbHVkZSA8c3lz L2J1cy5oPgorI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KKyNpbmNsdWRlIDxzeXMva3RyLmg+Cisj aW5jbHVkZSA8c3lzL2xvY2suaD4KKyNpbmNsdWRlIDxzeXMvbWVtZGVzYy5oPgorI2luY2x1ZGUg PHN5cy9tdXRleC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KICNpbmNsdWRlIDx2bS92bS5oPgor I2luY2x1ZGUgPHZtL3ZtX2V4dGVybi5oPgogI2luY2x1ZGUgPHZtL3BtYXAuaD4KIAogI2luY2x1 ZGUgPG1hY2hpbmUvYnVzLmg+CisjaW5jbHVkZSA8YXJtNjQvaW5jbHVkZS9idXNfZG1hX2ltcGwu aD4KKworLyoKKyAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBtYW5pcHVsYXRpbmcgZHJpdmVy IGxvY2tzIGZyb20gYnVzZG1hIChkdXJpbmcKKyAqIGJ1c2RtYV9zd2ksIGZvciBleGFtcGxlKS4g IERyaXZlcnMgdGhhdCBkb24ndCBwcm92aWRlIHRoZWlyIG93biBsb2NrcworICogc2hvdWxkIHNw ZWNpZnkgJkdpYW50IHRvIGRtYXQtPmxvY2tmdW5jYXJnLiAgRHJpdmVycyB0aGF0IHVzZSB0aGVp ciBvd24KKyAqIG5vbi1tdXRleCBsb2NraW5nIHNjaGVtZSBkb24ndCBoYXZlIHRvIHVzZSB0aGlz IGF0IGFsbC4KKyAqLwordm9pZAorYnVzZG1hX2xvY2tfbXV0ZXgodm9pZCAqYXJnLCBidXNfZG1h X2xvY2tfb3BfdCBvcCkKK3sKKwlzdHJ1Y3QgbXR4ICpkbXR4OworCisJZG10eCA9IChzdHJ1Y3Qg bXR4ICopYXJnOworCXN3aXRjaCAob3ApIHsKKwljYXNlIEJVU19ETUFfTE9DSzoKKwkJbXR4X2xv Y2soZG10eCk7CisJCWJyZWFrOworCWNhc2UgQlVTX0RNQV9VTkxPQ0s6CisJCW10eF91bmxvY2so ZG10eCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBhbmljKCJVbmtub3duIG9wZXJhdGlvbiAw eCV4IGZvciBidXNkbWFfbG9ja19tdXRleCEiLCBvcCk7CisJfQorfQorCisvKgorICogZGZsdF9s b2NrIHNob3VsZCBuZXZlciBnZXQgY2FsbGVkLiAgSXQgZ2V0cyBwdXQgaW50byB0aGUgZG1hIHRh ZyB3aGVuCisgKiBsb2NrZnVuYyA9PSBOVUxMLCB3aGljaCBpcyBvbmx5IHZhbGlkIGlmIHRoZSBt YXBzIHRoYXQgYXJlIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlIHRhZyBhcmUgbWVhbnQgdG8gbmV2 ZXIgYmUgZGVmZXJlZC4KKyAqIFhYWCBTaG91bGQgaGF2ZSBhIHdheSB0byBpZGVudGlmeSB3aGlj aCBkcml2ZXIgaXMgcmVzcG9uc2libGUgaGVyZS4KKyAqLwordm9pZAorYnVzX2RtYV9kZmx0X2xv Y2sodm9pZCAqYXJnLCBidXNfZG1hX2xvY2tfb3BfdCBvcCkKK3sKKworCXBhbmljKCJkcml2ZXIg ZXJyb3I6IGJ1c2RtYSBkZmx0X2xvY2sgY2FsbGVkIik7Cit9CisKKy8qCisgKiBSZXR1cm4gdHJ1 ZSBpZiBhIG1hdGNoIGlzIG1hZGUuCisgKgorICogVG8gZmluZCBhIG1hdGNoIHdhbGsgdGhlIGNo YWluIG9mIGJ1c19kbWFfdGFnX3QncyBsb29raW5nIGZvciAncGFkZHInLgorICoKKyAqIElmIHBh ZGRyIGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBkbWEgdGFnIHRoZW4gY2FsbCB0aGUgZmls dGVyIGNhbGxiYWNrCisgKiB0byBjaGVjayBmb3IgYSBtYXRjaCwgaWYgdGhlcmUgaXMgbm8gZmls dGVyIGNhbGxiYWNrIHRoZW4gYXNzdW1lIGEgbWF0Y2guCisgKi8KK2ludAorYnVzX2RtYV9ydW5f ZmlsdGVyKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKnRjLCBidXNfYWRkcl90IHBhZGRyKQor eworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSAwOworCWRvIHsKKwkJaWYgKCgocGFkZHIgPiB0 Yy0+bG93YWRkciAmJiBwYWRkciA8PSB0Yy0+aGlnaGFkZHIpIHx8CisJCSAgICAoKHBhZGRyICYg KHRjLT5hbGlnbm1lbnQgLSAxKSkgIT0gMCkpICYmCisJCSAgICAodGMtPmZpbHRlciA9PSBOVUxM IHx8CisJCSAgICAoKnRjLT5maWx0ZXIpKHRjLT5maWx0ZXJhcmcsIHBhZGRyKSAhPSAwKSkKKwkJ CXJldHZhbCA9IDE7CisKKwkJdGMgPSB0Yy0+cGFyZW50OwkJCisJfSB3aGlsZSAocmV0dmFsID09 IDAgJiYgdGMgIT0gTlVMTCk7CisJcmV0dXJuIChyZXR2YWwpOworfQorCitpbnQKK2NvbW1vbl9i dXNfZG1hX3RhZ19jcmVhdGUoc3RydWN0IGJ1c19kbWFfdGFnX2NvbW1vbiAqcGFyZW50LAorICAg IGJ1c19zaXplX3QgYWxpZ25tZW50LCBidXNfYWRkcl90IGJvdW5kYXJ5LCBidXNfYWRkcl90IGxv d2FkZHIsCisgICAgYnVzX2FkZHJfdCBoaWdoYWRkciwgYnVzX2RtYV9maWx0ZXJfdCAqZmlsdGVy LCB2b2lkICpmaWx0ZXJhcmcsCisgICAgYnVzX3NpemVfdCBtYXhzaXplLCBpbnQgbnNlZ21lbnRz LCBidXNfc2l6ZV90IG1heHNlZ3N6LCBpbnQgZmxhZ3MsCisgICAgYnVzX2RtYV9sb2NrX3QgKmxv Y2tmdW5jLCB2b2lkICpsb2NrZnVuY2FyZywgc2l6ZV90IHN6LCB2b2lkICoqZG1hdCkKK3sKKwl2 b2lkICpuZXd0YWc7CisJc3RydWN0IGJ1c19kbWFfdGFnX2NvbW1vbiAqY29tbW9uOworCisJS0FT U0VSVChzeiA+PSBzaXplb2Yoc3RydWN0IGJ1c19kbWFfdGFnX2NvbW1vbiksICgic3oiKSk7CisJ LyogQmFzaWMgc2FuaXR5IGNoZWNraW5nICovCisJaWYgKGJvdW5kYXJ5ICE9IDAgJiYgYm91bmRh cnkgPCBtYXhzZWdzeikKKwkJbWF4c2Vnc3ogPSBib3VuZGFyeTsKKwlpZiAobWF4c2Vnc3ogPT0g MCkKKwkJcmV0dXJuIChFSU5WQUwpOworCS8qIFJldHVybiBhIE5VTEwgdGFnIG9uIGZhaWx1cmUg Ki8KKwkqZG1hdCA9IE5VTEw7CisKKwluZXd0YWcgPSBtYWxsb2Moc3osIE1fREVWQlVGLCBNX1pF Uk8gfCBNX05PV0FJVCk7CisJaWYgKG5ld3RhZyA9PSBOVUxMKSB7CisJCUNUUjQoS1RSX0JVU0RN QSwgIiVzIHJldHVybmVkIHRhZyAlcCB0YWcgZmxhZ3MgMHgleCBlcnJvciAlZCIsCisJCSAgICBf X2Z1bmNfXywgbmV3dGFnLCAwLCBFTk9NRU0pOworCQlyZXR1cm4gKEVOT01FTSk7CisJfQorCisJ Y29tbW9uID0gbmV3dGFnOworCWNvbW1vbi0+aW1wbCA9ICZidXNfZG1hX2JvdW5jZV9pbXBsOwor CWNvbW1vbi0+cGFyZW50ID0gcGFyZW50OworCWNvbW1vbi0+YWxpZ25tZW50ID0gYWxpZ25tZW50 OworCWNvbW1vbi0+Ym91bmRhcnkgPSBib3VuZGFyeTsKKwljb21tb24tPmxvd2FkZHIgPSB0cnVu Y19wYWdlKCh2bV9wYWRkcl90KWxvd2FkZHIpICsgKFBBR0VfU0laRSAtIDEpOworCWNvbW1vbi0+ aGlnaGFkZHIgPSB0cnVuY19wYWdlKCh2bV9wYWRkcl90KWhpZ2hhZGRyKSArIChQQUdFX1NJWkUg LSAxKTsKKwljb21tb24tPmZpbHRlciA9IGZpbHRlcjsKKwljb21tb24tPmZpbHRlcmFyZyA9IGZp bHRlcmFyZzsKKwljb21tb24tPm1heHNpemUgPSBtYXhzaXplOworCWNvbW1vbi0+bnNlZ21lbnRz ID0gbnNlZ21lbnRzOworCWNvbW1vbi0+bWF4c2Vnc3ogPSBtYXhzZWdzejsKKwljb21tb24tPmZs YWdzID0gZmxhZ3M7CisJY29tbW9uLT5yZWZfY291bnQgPSAxOyAvKiBDb3VudCBvdXJzZWxmICov CisJaWYgKGxvY2tmdW5jICE9IE5VTEwpIHsKKwkJY29tbW9uLT5sb2NrZnVuYyA9IGxvY2tmdW5j OworCQljb21tb24tPmxvY2tmdW5jYXJnID0gbG9ja2Z1bmNhcmc7CisJfSBlbHNlIHsKKwkJY29t bW9uLT5sb2NrZnVuYyA9IGJ1c19kbWFfZGZsdF9sb2NrOworCQljb21tb24tPmxvY2tmdW5jYXJn ID0gTlVMTDsKKwl9CisKKwkvKiBUYWtlIGludG8gYWNjb3VudCBhbnkgcmVzdHJpY3Rpb25zIGlt cG9zZWQgYnkgb3VyIHBhcmVudCB0YWcgKi8KKwlpZiAocGFyZW50ICE9IE5VTEwpIHsKKwkJY29t bW9uLT5pbXBsID0gcGFyZW50LT5pbXBsOworCQljb21tb24tPmxvd2FkZHIgPSBNSU4ocGFyZW50 LT5sb3dhZGRyLCBjb21tb24tPmxvd2FkZHIpOworCQljb21tb24tPmhpZ2hhZGRyID0gTUFYKHBh cmVudC0+aGlnaGFkZHIsIGNvbW1vbi0+aGlnaGFkZHIpOworCQlpZiAoY29tbW9uLT5ib3VuZGFy eSA9PSAwKQorCQkJY29tbW9uLT5ib3VuZGFyeSA9IHBhcmVudC0+Ym91bmRhcnk7CisJCWVsc2Ug aWYgKHBhcmVudC0+Ym91bmRhcnkgIT0gMCkgeworCQkJY29tbW9uLT5ib3VuZGFyeSA9IE1JTihw YXJlbnQtPmJvdW5kYXJ5LAorCQkJICAgIGNvbW1vbi0+Ym91bmRhcnkpOworCQl9CisJCWlmIChj b21tb24tPmZpbHRlciA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogU2hvcnQgY2lyY3VpdCBsb29r aW5nIGF0IG91ciBwYXJlbnQgZGlyZWN0bHkKKwkJCSAqIHNpbmNlIHdlIGhhdmUgZW5jYXBzdWxh dGVkIGFsbCBvZiBpdHMgaW5mb3JtYXRpb24KKwkJCSAqLworCQkJY29tbW9uLT5maWx0ZXIgPSBw YXJlbnQtPmZpbHRlcjsKKwkJCWNvbW1vbi0+ZmlsdGVyYXJnID0gcGFyZW50LT5maWx0ZXJhcmc7 CisJCQljb21tb24tPnBhcmVudCA9IHBhcmVudC0+cGFyZW50OworCQl9CisJCWF0b21pY19hZGRf aW50KCZwYXJlbnQtPnJlZl9jb3VudCwgMSk7CisJfQorCSpkbWF0ID0gY29tbW9uOworCXJldHVy biAoMCk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIGRldmljZSBzcGVjaWZpYyBkbWFfdGFnLgor ICovCitpbnQKK2J1c19kbWFfdGFnX2NyZWF0ZShidXNfZG1hX3RhZ190IHBhcmVudCwgYnVzX3Np emVfdCBhbGlnbm1lbnQsCisgICAgYnVzX2FkZHJfdCBib3VuZGFyeSwgYnVzX2FkZHJfdCBsb3dh ZGRyLCBidXNfYWRkcl90IGhpZ2hhZGRyLAorICAgIGJ1c19kbWFfZmlsdGVyX3QgKmZpbHRlciwg dm9pZCAqZmlsdGVyYXJnLCBidXNfc2l6ZV90IG1heHNpemUsCisgICAgaW50IG5zZWdtZW50cywg YnVzX3NpemVfdCBtYXhzZWdzeiwgaW50IGZsYWdzLCBidXNfZG1hX2xvY2tfdCAqbG9ja2Z1bmMs CisgICAgdm9pZCAqbG9ja2Z1bmNhcmcsIGJ1c19kbWFfdGFnX3QgKmRtYXQpCit7CisJc3RydWN0 IGJ1c19kbWFfdGFnX2NvbW1vbiAqdGM7CisJaW50IGVycm9yOworCisJaWYgKHBhcmVudCA9PSBO VUxMKSB7CisJCWVycm9yID0gYnVzX2RtYV9ib3VuY2VfaW1wbC50YWdfY3JlYXRlKHBhcmVudCwg YWxpZ25tZW50LAorCQkgICAgYm91bmRhcnksIGxvd2FkZHIsIGhpZ2hhZGRyLCBmaWx0ZXIsIGZp bHRlcmFyZywgbWF4c2l6ZSwKKwkJICAgIG5zZWdtZW50cywgbWF4c2Vnc3osIGZsYWdzLCBsb2Nr ZnVuYywgbG9ja2Z1bmNhcmcsIGRtYXQpOworCX0gZWxzZSB7CisJCXRjID0gKHN0cnVjdCBidXNf ZG1hX3RhZ19jb21tb24gKilwYXJlbnQ7CisJCWVycm9yID0gdGMtPmltcGwtPnRhZ19jcmVhdGUo cGFyZW50LCBhbGlnbm1lbnQsCisJCSAgICBib3VuZGFyeSwgbG93YWRkciwgaGlnaGFkZHIsIGZp bHRlciwgZmlsdGVyYXJnLCBtYXhzaXplLAorCQkgICAgbnNlZ21lbnRzLCBtYXhzZWdzeiwgZmxh Z3MsIGxvY2tmdW5jLCBsb2NrZnVuY2FyZywgZG1hdCk7CisJfQorCXJldHVybiAoZXJyb3IpOwor fQorCitpbnQKK2J1c19kbWFfdGFnX2Rlc3Ryb3koYnVzX2RtYV90YWdfdCBkbWF0KQoreworCXN0 cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKnRjOworCisJdGMgPSAoc3RydWN0IGJ1c19kbWFfdGFn X2NvbW1vbiAqKWRtYXQ7CisJcmV0dXJuICh0Yy0+aW1wbC0+dGFnX2Rlc3Ryb3koZG1hdCkpOwor fQorCisvKgorICogQWxsb2NhdGUgYSBoYW5kbGUgZm9yIG1hcHBpbmcgZnJvbSBrdmEvdXZhL3Bo eXNpY2FsCisgKiBhZGRyZXNzIHNwYWNlIGludG8gYnVzIGRldmljZSBzcGFjZS4KKyAqLworaW50 CitidXNfZG1hbWFwX2NyZWF0ZShidXNfZG1hX3RhZ190IGRtYXQsIGludCBmbGFncywgYnVzX2Rt YW1hcF90ICptYXBwKQoreworCXN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKnRjOworCisJdGMg PSAoc3RydWN0IGJ1c19kbWFfdGFnX2NvbW1vbiAqKWRtYXQ7CisJcmV0dXJuICh0Yy0+aW1wbC0+ bWFwX2NyZWF0ZShkbWF0LCBmbGFncywgbWFwcCkpOworfQorCisvKgorICogRGVzdHJveSBhIGhh bmRsZSBmb3IgbWFwcGluZyBmcm9tIGt2YS91dmEvcGh5c2ljYWwKKyAqIGFkZHJlc3Mgc3BhY2Ug aW50byBidXMgZGV2aWNlIHNwYWNlLgorICovCitpbnQKK2J1c19kbWFtYXBfZGVzdHJveShidXNf ZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXApCit7CisJc3RydWN0IGJ1c19kbWFfdGFn X2NvbW1vbiAqdGM7CisKKwl0YyA9IChzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uICopZG1hdDsK KwlyZXR1cm4gKHRjLT5pbXBsLT5tYXBfZGVzdHJveShkbWF0LCBtYXApKTsKK30KKworCisvKgor ICogQWxsb2NhdGUgYSBwaWVjZSBvZiBtZW1vcnkgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkgbWFw cGVkIGludG8KKyAqIGJ1cyBkZXZpY2Ugc3BhY2UgYmFzZWQgb24gdGhlIGNvbnN0cmFpbnRzIGxp c3RlZCBpbiB0aGUgZG1hIHRhZy4KKyAqIEEgZG1hbWFwIHRvIGZvciB1c2Ugd2l0aCBkbWFtYXBf bG9hZCBpcyBhbHNvIGFsbG9jYXRlZC4KKyAqLworaW50CitidXNfZG1hbWVtX2FsbG9jKGJ1c19k bWFfdGFnX3QgZG1hdCwgdm9pZCoqIHZhZGRyLCBpbnQgZmxhZ3MsCisgICAgYnVzX2RtYW1hcF90 ICptYXBwKQoreworCXN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKnRjOworCisJdGMgPSAoc3Ry dWN0IGJ1c19kbWFfdGFnX2NvbW1vbiAqKWRtYXQ7CisJcmV0dXJuICh0Yy0+aW1wbC0+bWVtX2Fs bG9jKGRtYXQsIHZhZGRyLCBmbGFncywgbWFwcCkpOworfQorCisvKgorICogRnJlZSBhIHBpZWNl IG9mIG1lbW9yeSBhbmQgaXQncyBhbGxvY2lhdGVkIGRtYW1hcCwgdGhhdCB3YXMgYWxsb2NhdGVk CisgKiB2aWEgYnVzX2RtYW1lbV9hbGxvYy4gIE1ha2UgdGhlIHNhbWUgY2hvaWNlIGZvciBmcmVl L2NvbnRpZ2ZyZWUuCisgKi8KK3ZvaWQKK2J1c19kbWFtZW1fZnJlZShidXNfZG1hX3RhZ190IGRt YXQsIHZvaWQgKnZhZGRyLCBidXNfZG1hbWFwX3QgbWFwKQoreworCXN0cnVjdCBidXNfZG1hX3Rh Z19jb21tb24gKnRjOworCisJdGMgPSAoc3RydWN0IGJ1c19kbWFfdGFnX2NvbW1vbiAqKWRtYXQ7 CisJdGMtPmltcGwtPm1lbV9mcmVlKGRtYXQsIHZhZGRyLCBtYXApOworfQogCiBpbnQKIF9idXNf ZG1hbWFwX2xvYWRfcGh5cyhidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBtYXAsIHZt X3BhZGRyX3QgYnVmLAogICAgIGJ1c19zaXplX3QgYnVmbGVuLCBpbnQgZmxhZ3MsIGJ1c19kbWFf c2VnbWVudF90ICpzZWdzLCBpbnQgKnNlZ3ApCiB7CisJc3RydWN0IGJ1c19kbWFfdGFnX2NvbW1v biAqdGM7CiAKLQlwYW5pYygiX2J1c19kbWFtYXBfbG9hZF9waHlzIik7CisJdGMgPSAoc3RydWN0 IGJ1c19kbWFfdGFnX2NvbW1vbiAqKWRtYXQ7CisJcmV0dXJuICh0Yy0+aW1wbC0+bG9hZF9waHlz KGRtYXQsIG1hcCwgYnVmLCBidWZsZW4sIGZsYWdzLCBzZWdzLAorCSAgICBzZWdwKSk7CiB9CiAK IGludApAQCAtMjQsOCArMjk0LDExIEBACiAgICAgYnVzX3NpemVfdCB0bGVuLCBpbnQgbWFfb2Zm cywgaW50IGZsYWdzLCBidXNfZG1hX3NlZ21lbnRfdCAqc2VncywKICAgICBpbnQgKnNlZ3ApCiB7 CisJc3RydWN0IGJ1c19kbWFfdGFnX2NvbW1vbiAqdGM7CiAKLQlwYW5pYygiX2J1c19kbWFtYXBf bG9hZF9tYSIpOworCXRjID0gKHN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXJl dHVybiAodGMtPmltcGwtPmxvYWRfbWEoZG1hdCwgbWFwLCBtYSwgdGxlbiwgbWFfb2ZmcywgZmxh Z3MsCisJICAgIHNlZ3MsIHNlZ3ApKTsKIH0KIAogaW50CkBAIC0zMywzNiArMzA2LDUwIEBACiAg ICAgYnVzX3NpemVfdCBidWZsZW4sIHBtYXBfdCBwbWFwLCBpbnQgZmxhZ3MsIGJ1c19kbWFfc2Vn bWVudF90ICpzZWdzLAogICAgIGludCAqc2VncCkKIHsKKwlzdHJ1Y3QgYnVzX2RtYV90YWdfY29t bW9uICp0YzsKIAotCXBhbmljKCJfYnVzX2RtYW1hcF9sb2FkX2J1ZmZlciIpOworCXRjID0gKHN0 cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKilkbWF0OworCXJldHVybiAodGMtPmltcGwtPmxvYWRf YnVmZmVyKGRtYXQsIG1hcCwgYnVmLCBidWZsZW4sIHBtYXAsIGZsYWdzLCBzZWdzLAorCSAgICBz ZWdwKSk7CiB9CiAKIHZvaWQKIF9fYnVzX2RtYW1hcF93YWl0b2soYnVzX2RtYV90YWdfdCBkbWF0 LCBidXNfZG1hbWFwX3QgbWFwLAogICAgIHN0cnVjdCBtZW1kZXNjICptZW0sIGJ1c19kbWFtYXBf Y2FsbGJhY2tfdCAqY2FsbGJhY2ssIHZvaWQgKmNhbGxiYWNrX2FyZykKIHsKKwlzdHJ1Y3QgYnVz X2RtYV90YWdfY29tbW9uICp0YzsKIAotCXBhbmljKCJfX2J1c19kbWFtYXBfd2FpdG9rIik7CisJ dGMgPSAoc3RydWN0IGJ1c19kbWFfdGFnX2NvbW1vbiAqKWRtYXQ7CisJdGMtPmltcGwtPm1hcF93 YWl0b2soZG1hdCwgbWFwLCBtZW0sIGNhbGxiYWNrLCBjYWxsYmFja19hcmcpOwogfQogCiBidXNf ZG1hX3NlZ21lbnRfdCAqCiBfYnVzX2RtYW1hcF9jb21wbGV0ZShidXNfZG1hX3RhZ190IGRtYXQs IGJ1c19kbWFtYXBfdCBtYXAsCiAgICAgYnVzX2RtYV9zZWdtZW50X3QgKnNlZ3MsIGludCBuc2Vn cywgaW50IGVycm9yKQogeworCXN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKnRjOwogCi0JcGFu aWMoIl9idXNfZG1hbWFwX2NvbXBsZXRlIik7CisJdGMgPSAoc3RydWN0IGJ1c19kbWFfdGFnX2Nv bW1vbiAqKWRtYXQ7CisJcmV0dXJuICh0Yy0+aW1wbC0+bWFwX2NvbXBsZXRlKGRtYXQsIG1hcCwg c2VncywgbnNlZ3MsIGVycm9yKSk7CiB9CiAKKy8qCisgKiBSZWxlYXNlIHRoZSBtYXBwaW5nIGhl bGQgYnkgbWFwLgorICovCiB2b2lkCiBfYnVzX2RtYW1hcF91bmxvYWQoYnVzX2RtYV90YWdfdCBk bWF0LCBidXNfZG1hbWFwX3QgbWFwKQogeworCXN0cnVjdCBidXNfZG1hX3RhZ19jb21tb24gKnRj OwogCi0JcGFuaWMoIl9idXNfZG1hbWFwX3VubG9hZCIpOworCXRjID0gKHN0cnVjdCBidXNfZG1h X3RhZ19jb21tb24gKilkbWF0OworCXRjLT5pbXBsLT5tYXBfdW5sb2FkKGRtYXQsIG1hcCk7CiB9 CiAKIHZvaWQKIF9idXNfZG1hbWFwX3N5bmMoYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFw X3QgbWFwLCBidXNfZG1hc3luY19vcF90IG9wKQogeworCXN0cnVjdCBidXNfZG1hX3RhZ19jb21t b24gKnRjOwogCi0JcGFuaWMoIl9idXNfZG1hbWFwX3N5bmMiKTsKKwl0YyA9IChzdHJ1Y3QgYnVz X2RtYV90YWdfY29tbW9uICopZG1hdDsKKwl0Yy0+aW1wbC0+bWFwX3N5bmMoZG1hdCwgbWFwLCBv cCk7CiB9CmRpZmYgLS1naXQgYS9zeXMvYXJtNjQvYXJtNjQvYnVzZG1hX2JvdW5jZS5jIGIvc3lz L2FybTY0L2FybTY0L2J1c2RtYV9ib3VuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAotLS0gL2Rl di9udWxsCisrKyBiL3N5cy9hcm02NC9hcm02NC9idXNkbWFfYm91bmNlLmMKQEAgLTAsMCArMSwx MDgwIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMTk5OCBKdXN0aW4gVC4gR2liYnMu CisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIEZyZWVCU0QgRm91bmRhdGlvbgorICogQWxsIHJp Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZGV2 ZWxvcGVkIGJ5IFNlbWloYWxmCisgKiB1bmRlciBzcG9uc29yc2hpcCBvZiB0aGUgRnJlZUJTRCBG b3VuZGF0aW9uLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0 dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92 ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0 aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgaW1t ZWRpYXRlbHkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAqIDIuIFRoZSBuYW1lIG9m IHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0 cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv ciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC WSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJF U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U IFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBE SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF UVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIg Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD VCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElT IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNI IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVC U0QkIik7CisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4K KyNpbmNsdWRlIDxzeXMvbWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzL2J1cy5oPgorI2luY2x1ZGUg PHN5cy9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxzeXMva2VybmVsLmg+CisjaW5jbHVkZSA8c3lz L2t0ci5oPgorI2luY2x1ZGUgPHN5cy9sb2NrLmg+CisjaW5jbHVkZSA8c3lzL3Byb2MuaD4KKyNp bmNsdWRlIDxzeXMvbWVtZGVzYy5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgorI2luY2x1ZGUg PHN5cy9zeXNjdGwuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKKyNpbmNsdWRlIDx2bS92bS5o PgorI2luY2x1ZGUgPHZtL3ZtX2V4dGVybi5oPgorI2luY2x1ZGUgPHZtL3ZtX2tlcm4uaD4KKyNp bmNsdWRlIDx2bS92bV9wYWdlLmg+CisjaW5jbHVkZSA8dm0vdm1fbWFwLmg+CisKKyNpbmNsdWRl IDxtYWNoaW5lL2F0b21pYy5oPgorI2luY2x1ZGUgPG1hY2hpbmUvYnVzLmg+CisjaW5jbHVkZSA8 bWFjaGluZS9tZF92YXIuaD4KKyNpbmNsdWRlIDxhcm02NC9pbmNsdWRlL2J1c19kbWFfaW1wbC5o PgorCisjZGVmaW5lIE1BWF9CUEFHRVMgNDA5NgorCitlbnVtIHsKKwlCVVNfRE1BX0NPVUxEX0JP VU5DRQk9IDB4MDEsCisJQlVTX0RNQV9NSU5fQUxMT0NfQ09NUAk9IDB4MDIsCisJQlVTX0RNQV9L TUVNX0FMTE9DCT0gMHgwNCwKK307CisKK3N0cnVjdCBib3VuY2Vfem9uZTsKKworc3RydWN0IGJ1 c19kbWFfdGFnIHsKKwlzdHJ1Y3QgYnVzX2RtYV90YWdfY29tbW9uIGNvbW1vbjsKKwlpbnQJCQlt YXBfY291bnQ7CisJaW50CQkJYm91bmNlX2ZsYWdzOworCWJ1c19kbWFfc2VnbWVudF90CSpzZWdt ZW50czsKKwlzdHJ1Y3QgYm91bmNlX3pvbmUJKmJvdW5jZV96b25lOworfTsKKworc3RydWN0IGJv dW5jZV9wYWdlIHsKKwl2bV9vZmZzZXRfdAl2YWRkcjsJCS8qIGt2YSBvZiBib3VuY2UgYnVmZmVy ICovCisJYnVzX2FkZHJfdAlidXNhZGRyOwkvKiBQaHlzaWNhbCBhZGRyZXNzICovCisJdm1fb2Zm c2V0X3QJZGF0YXZhZGRyOwkvKiBrdmEgb2YgY2xpZW50IGRhdGEgKi8KKwlidXNfYWRkcl90CWRh dGFhZGRyOwkvKiBjbGllbnQgcGh5c2ljYWwgYWRkcmVzcyAqLworCWJ1c19zaXplX3QJZGF0YWNv dW50OwkvKiBjbGllbnQgZGF0YSBjb3VudCAqLworCVNUQUlMUV9FTlRSWShib3VuY2VfcGFnZSkg bGlua3M7Cit9OworCitpbnQgYnVzZG1hX3N3aV9wZW5kaW5nOworCitzdHJ1Y3QgYm91bmNlX3pv bmUgeworCVNUQUlMUV9FTlRSWShib3VuY2Vfem9uZSkgbGlua3M7CisJU1RBSUxRX0hFQUQoYnBf bGlzdCwgYm91bmNlX3BhZ2UpIGJvdW5jZV9wYWdlX2xpc3Q7CisJaW50CQl0b3RhbF9icGFnZXM7 CisJaW50CQlmcmVlX2JwYWdlczsKKwlpbnQJCXJlc2VydmVkX2JwYWdlczsKKwlpbnQJCWFjdGl2 ZV9icGFnZXM7CisJaW50CQl0b3RhbF9ib3VuY2VkOworCWludAkJdG90YWxfZGVmZXJyZWQ7CisJ aW50CQltYXBfY291bnQ7CisJYnVzX3NpemVfdAlhbGlnbm1lbnQ7CisJYnVzX2FkZHJfdAlsb3dh ZGRyOworCWNoYXIJCXpvbmVpZFs4XTsKKwljaGFyCQlsb3dhZGRyaWRbMjBdOworCXN0cnVjdCBz eXNjdGxfY3R4X2xpc3Qgc3lzY3RsX3RyZWU7CisJc3RydWN0IHN5c2N0bF9vaWQgKnN5c2N0bF90 cmVlX3RvcDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXR4IGJvdW5jZV9sb2NrOworc3RhdGljIGlu dCB0b3RhbF9icGFnZXM7CitzdGF0aWMgaW50IGJ1c2RtYV96b25lY291bnQ7CitzdGF0aWMgU1RB SUxRX0hFQUQoLCBib3VuY2Vfem9uZSkgYm91bmNlX3pvbmVfbGlzdDsKKworc3RhdGljIFNZU0NU TF9OT0RFKF9odywgT0lEX0FVVE8sIGJ1c2RtYSwgQ1RMRkxBR19SRCwgMCwgIkJ1c2RtYSBwYXJh bWV0ZXJzIik7CitTWVNDVExfSU5UKF9od19idXNkbWEsIE9JRF9BVVRPLCB0b3RhbF9icGFnZXMs IENUTEZMQUdfUkQsICZ0b3RhbF9icGFnZXMsIDAsCisJICAgIlRvdGFsIGJvdW5jZSBwYWdlcyIp OworCitzdHJ1Y3QgYnVzX2RtYW1hcCB7CisJc3RydWN0IGJwX2xpc3QJICAgICAgIGJwYWdlczsK KwlpbnQJCSAgICAgICBwYWdlc25lZWRlZDsKKwlpbnQJCSAgICAgICBwYWdlc3Jlc2VydmVkOwor CWJ1c19kbWFfdGFnX3QJICAgICAgIGRtYXQ7CisJc3RydWN0IG1lbWRlc2MJICAgICAgIG1lbTsK KwlidXNfZG1hbWFwX2NhbGxiYWNrX3QgKmNhbGxiYWNrOworCXZvaWQJCSAgICAgICpjYWxsYmFj a19hcmc7CisJU1RBSUxRX0VOVFJZKGJ1c19kbWFtYXApIGxpbmtzOworfTsKKworc3RhdGljIFNU QUlMUV9IRUFEKCwgYnVzX2RtYW1hcCkgYm91bmNlX21hcF93YWl0aW5nbGlzdDsKK3N0YXRpYyBT VEFJTFFfSEVBRCgsIGJ1c19kbWFtYXApIGJvdW5jZV9tYXBfY2FsbGJhY2tsaXN0Oworc3RhdGlj IHN0cnVjdCBidXNfZG1hbWFwIG5vYm91bmNlX2RtYW1hcDsKKworc3RhdGljIHZvaWQgaW5pdF9i b3VuY2VfcGFnZXModm9pZCAqZHVtbXkpOworc3RhdGljIGludCBhbGxvY19ib3VuY2Vfem9uZShi dXNfZG1hX3RhZ190IGRtYXQpOworc3RhdGljIGludCBhbGxvY19ib3VuY2VfcGFnZXMoYnVzX2Rt YV90YWdfdCBkbWF0LCB1X2ludCBudW1wYWdlcyk7CitzdGF0aWMgaW50IHJlc2VydmVfYm91bmNl X3BhZ2VzKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwKKyAgICBpbnQgY29t bWl0KTsKK3N0YXRpYyBidXNfYWRkcl90IGFkZF9ib3VuY2VfcGFnZShidXNfZG1hX3RhZ190IGRt YXQsIGJ1c19kbWFtYXBfdCBtYXAsCisgICAgdm1fb2Zmc2V0X3QgdmFkZHIsIGJ1c19hZGRyX3Qg YWRkciwgYnVzX3NpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkIGZyZWVfYm91bmNlX3BhZ2UoYnVz X2RtYV90YWdfdCBkbWF0LCBzdHJ1Y3QgYm91bmNlX3BhZ2UgKmJwYWdlKTsKK2ludCBydW5fZmls dGVyKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2FkZHJfdCBwYWRkcik7CitzdGF0aWMgdm9pZCBf YnVzX2RtYW1hcF9jb3VudF9wYWdlcyhidXNfZG1hX3RhZ190IGRtYXQsIGJ1c19kbWFtYXBfdCBt YXAsCisgICAgcG1hcF90IHBtYXAsIHZvaWQgKmJ1ZiwgYnVzX3NpemVfdCBidWZsZW4sIGludCBm bGFncyk7CitzdGF0aWMgdm9pZCBfYnVzX2RtYW1hcF9jb3VudF9waHlzKGJ1c19kbWFfdGFnX3Qg ZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwKKyAgICB2bV9wYWRkcl90IGJ1ZiwgYnVzX3NpemVfdCBi dWZsZW4sIGludCBmbGFncyk7CitzdGF0aWMgaW50IF9idXNfZG1hbWFwX3Jlc2VydmVfcGFnZXMo YnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLAorICAgIGludCBmbGFncyk7CisK Ky8qCisgKiBBbGxvY2F0ZSBhIGRldmljZSBzcGVjaWZpYyBkbWFfdGFnLgorICovCitzdGF0aWMg aW50Citib3VuY2VfYnVzX2RtYV90YWdfY3JlYXRlKGJ1c19kbWFfdGFnX3QgcGFyZW50LCBidXNf c2l6ZV90IGFsaWdubWVudCwKKyAgICBidXNfYWRkcl90IGJvdW5kYXJ5LCBidXNfYWRkcl90IGxv d2FkZHIsIGJ1c19hZGRyX3QgaGlnaGFkZHIsCisgICAgYnVzX2RtYV9maWx0ZXJfdCAqZmlsdGVy LCB2b2lkICpmaWx0ZXJhcmcsIGJ1c19zaXplX3QgbWF4c2l6ZSwKKyAgICBpbnQgbnNlZ21lbnRz LCBidXNfc2l6ZV90IG1heHNlZ3N6LCBpbnQgZmxhZ3MsIGJ1c19kbWFfbG9ja190ICpsb2NrZnVu YywKKyAgICB2b2lkICpsb2NrZnVuY2FyZywgYnVzX2RtYV90YWdfdCAqZG1hdCkKK3sKKwlidXNf ZG1hX3RhZ190IG5ld3RhZzsKKwlpbnQgZXJyb3I7CisKKwkqZG1hdCA9IE5VTEw7CisJZXJyb3Ig PSBjb21tb25fYnVzX2RtYV90YWdfY3JlYXRlKHBhcmVudCAhPSBOVUxMID8gJnBhcmVudC0+Y29t bW9uIDoKKwkgICAgTlVMTCwgYWxpZ25tZW50LCBib3VuZGFyeSwgbG93YWRkciwgaGlnaGFkZHIs IGZpbHRlciwgZmlsdGVyYXJnLAorCSAgICBtYXhzaXplLCBuc2VnbWVudHMsIG1heHNlZ3N6LCBm bGFncywgbG9ja2Z1bmMsIGxvY2tmdW5jYXJnLAorCSAgICBzaXplb2YgKHN0cnVjdCBidXNfZG1h X3RhZyksICh2b2lkICoqKSZuZXd0YWcpOworCWlmIChlcnJvciAhPSAwKQorCQlyZXR1cm4gKGVy cm9yKTsKKworCW5ld3RhZy0+Y29tbW9uLmltcGwgPSAmYnVzX2RtYV9ib3VuY2VfaW1wbDsKKwlu ZXd0YWctPm1hcF9jb3VudCA9IDA7CisJbmV3dGFnLT5zZWdtZW50cyA9IE5VTEw7CisKKwlpZiAo cGFyZW50ICE9IE5VTEwgJiYgKChuZXd0YWctPmNvbW1vbi5maWx0ZXIgIT0gTlVMTCkgfHwKKwkg ICAgKChwYXJlbnQtPmJvdW5jZV9mbGFncyAmIEJVU19ETUFfQ09VTERfQk9VTkNFKSAhPSAwKSkp CisJCW5ld3RhZy0+Ym91bmNlX2ZsYWdzIHw9IEJVU19ETUFfQ09VTERfQk9VTkNFOworCisJaWYg KG5ld3RhZy0+Y29tbW9uLmxvd2FkZHIgPCBwdG9hKCh2bV9wYWRkcl90KU1heG1lbSkgfHwKKwkg ICAgbmV3dGFnLT5jb21tb24uYWxpZ25tZW50ID4gMSkKKwkJbmV3dGFnLT5ib3VuY2VfZmxhZ3Mg fD0gQlVTX0RNQV9DT1VMRF9CT1VOQ0U7CisKKwlpZiAoKChuZXd0YWctPmJvdW5jZV9mbGFncyAm IEJVU19ETUFfQ09VTERfQk9VTkNFKSAhPSAwKSAmJgorCSAgICAoZmxhZ3MgJiBCVVNfRE1BX0FM TE9DTk9XKSAhPSAwKSB7CisJCXN0cnVjdCBib3VuY2Vfem9uZSAqYno7CisKKwkJLyogTXVzdCBi b3VuY2UgKi8KKwkJaWYgKChlcnJvciA9IGFsbG9jX2JvdW5jZV96b25lKG5ld3RhZykpICE9IDAp IHsKKwkJCWZyZWUobmV3dGFnLCBNX0RFVkJVRik7CisJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQor CQlieiA9IG5ld3RhZy0+Ym91bmNlX3pvbmU7CisKKwkJaWYgKHB0b2EoYnotPnRvdGFsX2JwYWdl cykgPCBtYXhzaXplKSB7CisJCQlpbnQgcGFnZXM7CisKKwkJCXBhZ2VzID0gYXRvcChtYXhzaXpl KSAtIGJ6LT50b3RhbF9icGFnZXM7CisKKwkJCS8qIEFkZCBwYWdlcyB0byBvdXIgYm91bmNlIHBv b2wgKi8KKwkJCWlmIChhbGxvY19ib3VuY2VfcGFnZXMobmV3dGFnLCBwYWdlcykgPCBwYWdlcykK KwkJCQllcnJvciA9IEVOT01FTTsKKwkJfQorCQkvKiBQZXJmb3JtZWQgaW5pdGlhbCBhbGxvY2F0 aW9uICovCisJCW5ld3RhZy0+Ym91bmNlX2ZsYWdzIHw9IEJVU19ETUFfTUlOX0FMTE9DX0NPTVA7 CisJfSBlbHNlCisJCWVycm9yID0gMDsKKworCWlmIChlcnJvciAhPSAwKQorCQlmcmVlKG5ld3Rh ZywgTV9ERVZCVUYpOworCWVsc2UKKwkJKmRtYXQgPSBuZXd0YWc7CisJQ1RSNChLVFJfQlVTRE1B LCAiJXMgcmV0dXJuZWQgdGFnICVwIHRhZyBmbGFncyAweCV4IGVycm9yICVkIiwKKwkgICAgX19m dW5jX18sIG5ld3RhZywgKG5ld3RhZyAhPSBOVUxMID8gbmV3dGFnLT5jb21tb24uZmxhZ3MgOiAw KSwKKwkgICAgZXJyb3IpOworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50Citib3Vu Y2VfYnVzX2RtYV90YWdfZGVzdHJveShidXNfZG1hX3RhZ190IGRtYXQpCit7CisJYnVzX2RtYV90 YWdfdCBkbWF0X2NvcHksIHBhcmVudDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IDA7CisJZG1h dF9jb3B5ID0gZG1hdDsKKworCWlmIChkbWF0ICE9IE5VTEwpIHsKKwkJaWYgKGRtYXQtPm1hcF9j b3VudCAhPSAwKSB7CisJCQllcnJvciA9IEVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwkJd2hp bGUgKGRtYXQgIT0gTlVMTCkgeworCQkJcGFyZW50ID0gKGJ1c19kbWFfdGFnX3QpZG1hdC0+Y29t bW9uLnBhcmVudDsKKwkJCWF0b21pY19zdWJ0cmFjdF9pbnQoJmRtYXQtPmNvbW1vbi5yZWZfY291 bnQsIDEpOworCQkJaWYgKGRtYXQtPmNvbW1vbi5yZWZfY291bnQgPT0gMCkgeworCQkJCWlmIChk bWF0LT5zZWdtZW50cyAhPSBOVUxMKQorCQkJCQlmcmVlKGRtYXQtPnNlZ21lbnRzLCBNX0RFVkJV Rik7CisJCQkJZnJlZShkbWF0LCBNX0RFVkJVRik7CisJCQkJLyoKKwkJCQkgKiBMYXN0IHJlZmVy ZW5jZSBjb3VudCwgc28KKwkJCQkgKiByZWxlYXNlIG91ciByZWZlcmVuY2UKKwkJCQkgKiBjb3Vu dCBvbiBvdXIgcGFyZW50LgorCQkJCSAqLworCQkJCWRtYXQgPSBwYXJlbnQ7CisJCQl9IGVsc2UK KwkJCQlkbWF0ID0gTlVMTDsKKwkJfQorCX0KK291dDoKKwlDVFIzKEtUUl9CVVNETUEsICIlcyB0 YWcgJXAgZXJyb3IgJWQiLCBfX2Z1bmNfXywgZG1hdF9jb3B5LCBlcnJvcik7CisJcmV0dXJuIChl cnJvcik7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIGhhbmRsZSBmb3IgbWFwcGluZyBmcm9tIGt2 YS91dmEvcGh5c2ljYWwKKyAqIGFkZHJlc3Mgc3BhY2UgaW50byBidXMgZGV2aWNlIHNwYWNlLgor ICovCitzdGF0aWMgaW50Citib3VuY2VfYnVzX2RtYW1hcF9jcmVhdGUoYnVzX2RtYV90YWdfdCBk bWF0LCBpbnQgZmxhZ3MsIGJ1c19kbWFtYXBfdCAqbWFwcCkKK3sKKwlzdHJ1Y3QgYm91bmNlX3pv bmUgKmJ6OworCWludCBlcnJvciwgbWF4cGFnZXMsIHBhZ2VzOworCisJZXJyb3IgPSAwOworCisJ aWYgKGRtYXQtPnNlZ21lbnRzID09IE5VTEwpIHsKKwkJZG1hdC0+c2VnbWVudHMgPSAoYnVzX2Rt YV9zZWdtZW50X3QgKiltYWxsb2MoCisJCSAgICBzaXplb2YoYnVzX2RtYV9zZWdtZW50X3QpICog ZG1hdC0+Y29tbW9uLm5zZWdtZW50cywKKwkJICAgIE1fREVWQlVGLCBNX05PV0FJVCk7CisJCWlm IChkbWF0LT5zZWdtZW50cyA9PSBOVUxMKSB7CisJCQlDVFIzKEtUUl9CVVNETUEsICIlczogdGFn ICVwIGVycm9yICVkIiwKKwkJCSAgICBfX2Z1bmNfXywgZG1hdCwgRU5PTUVNKTsKKwkJCXJldHVy biAoRU5PTUVNKTsKKwkJfQorCX0KKworCS8qCisJICogQm91bmNpbmcgbWlnaHQgYmUgcmVxdWly ZWQgaWYgdGhlIGRyaXZlciBhc2tzIGZvciBhbiBhY3RpdmUKKwkgKiBleGNsdXNpb24gcmVnaW9u LCBhIGRhdGEgYWxpZ25tZW50IHRoYXQgaXMgc3RyaWN0ZXIgdGhhbiAxLCBhbmQvb3IKKwkgKiBh biBhY3RpdmUgYWRkcmVzcyBib3VuZGFyeS4KKwkgKi8KKwlpZiAoZG1hdC0+Ym91bmNlX2ZsYWdz ICYgQlVTX0RNQV9DT1VMRF9CT1VOQ0UpIHsKKwkJLyogTXVzdCBib3VuY2UgKi8KKwkJaWYgKGRt YXQtPmJvdW5jZV96b25lID09IE5VTEwpIHsKKwkJCWlmICgoZXJyb3IgPSBhbGxvY19ib3VuY2Vf em9uZShkbWF0KSkgIT0gMCkKKwkJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCQlieiA9IGRtYXQt PmJvdW5jZV96b25lOworCisJCSptYXBwID0gKGJ1c19kbWFtYXBfdCltYWxsb2Moc2l6ZW9mKCoq bWFwcCksIE1fREVWQlVGLAorCQkgICAgTV9OT1dBSVQgfCBNX1pFUk8pOworCQlpZiAoKm1hcHAg PT0gTlVMTCkgeworCQkJQ1RSMyhLVFJfQlVTRE1BLCAiJXM6IHRhZyAlcCBlcnJvciAlZCIsCisJ CQkgICAgX19mdW5jX18sIGRtYXQsIEVOT01FTSk7CisJCQlyZXR1cm4gKEVOT01FTSk7CisJCX0K KworCQkvKiBJbml0aWFsaXplIHRoZSBuZXcgbWFwICovCisJCVNUQUlMUV9JTklUKCYoKCptYXBw KS0+YnBhZ2VzKSk7CisKKwkJLyoKKwkJICogQXR0ZW1wdCB0byBhZGQgcGFnZXMgdG8gb3VyIHBv b2wgb24gYSBwZXItaW5zdGFuY2UKKwkJICogYmFzaXMgdXAgdG8gYSBzYW5lIGxpbWl0LgorCQkg Ki8KKwkJaWYgKGRtYXQtPmNvbW1vbi5hbGlnbm1lbnQgPiAxKQorCQkJbWF4cGFnZXMgPSBNQVhf QlBBR0VTOworCQllbHNlCisJCQltYXhwYWdlcyA9IE1JTihNQVhfQlBBR0VTLCBNYXhtZW0gLQor CQkJICAgIGF0b3AoZG1hdC0+Y29tbW9uLmxvd2FkZHIpKTsKKwkJaWYgKChkbWF0LT5ib3VuY2Vf ZmxhZ3MgJiBCVVNfRE1BX01JTl9BTExPQ19DT01QKSA9PSAwIHx8CisJCSAgICAoYnotPm1hcF9j b3VudCA+IDAgJiYgYnotPnRvdGFsX2JwYWdlcyA8IG1heHBhZ2VzKSkgeworCQkJcGFnZXMgPSBN QVgoYXRvcChkbWF0LT5jb21tb24ubWF4c2l6ZSksIDEpOworCQkJcGFnZXMgPSBNSU4obWF4cGFn ZXMgLSBiei0+dG90YWxfYnBhZ2VzLCBwYWdlcyk7CisJCQlwYWdlcyA9IE1BWChwYWdlcywgMSk7 CisJCQlpZiAoYWxsb2NfYm91bmNlX3BhZ2VzKGRtYXQsIHBhZ2VzKSA8IHBhZ2VzKQorCQkJCWVy cm9yID0gRU5PTUVNOworCQkJaWYgKChkbWF0LT5ib3VuY2VfZmxhZ3MgJiBCVVNfRE1BX01JTl9B TExPQ19DT01QKQorCQkJICAgID09IDApIHsKKwkJCQlpZiAoZXJyb3IgPT0gMCkgeworCQkJCQlk bWF0LT5ib3VuY2VfZmxhZ3MgfD0KKwkJCQkJICAgIEJVU19ETUFfTUlOX0FMTE9DX0NPTVA7CisJ CQkJfQorCQkJfSBlbHNlCisJCQkJZXJyb3IgPSAwOworCQl9CisJCWJ6LT5tYXBfY291bnQrKzsK Kwl9IGVsc2UgeworCQkqbWFwcCA9IE5VTEw7CisJfQorCWlmIChlcnJvciA9PSAwKQorCQlkbWF0 LT5tYXBfY291bnQrKzsKKwlDVFI0KEtUUl9CVVNETUEsICIlczogdGFnICVwIHRhZyBmbGFncyAw eCV4IGVycm9yICVkIiwKKwkgICAgX19mdW5jX18sIGRtYXQsIGRtYXQtPmNvbW1vbi5mbGFncywg ZXJyb3IpOworCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogRGVzdHJveSBhIGhhbmRsZSBm b3IgbWFwcGluZyBmcm9tIGt2YS91dmEvcGh5c2ljYWwKKyAqIGFkZHJlc3Mgc3BhY2UgaW50byBi dXMgZGV2aWNlIHNwYWNlLgorICovCitzdGF0aWMgaW50Citib3VuY2VfYnVzX2RtYW1hcF9kZXN0 cm95KGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCkKK3sKKworCWlmIChtYXAg IT0gTlVMTCAmJiBtYXAgIT0gJm5vYm91bmNlX2RtYW1hcCkgeworCQlpZiAoU1RBSUxRX0ZJUlNU KCZtYXAtPmJwYWdlcykgIT0gTlVMTCkgeworCQkJQ1RSMyhLVFJfQlVTRE1BLCAiJXM6IHRhZyAl cCBlcnJvciAlZCIsCisJCQkgICAgX19mdW5jX18sIGRtYXQsIEVCVVNZKTsKKwkJCXJldHVybiAo RUJVU1kpOworCQl9CisJCWlmIChkbWF0LT5ib3VuY2Vfem9uZSkKKwkJCWRtYXQtPmJvdW5jZV96 b25lLT5tYXBfY291bnQtLTsKKwkJZnJlZShtYXAsIE1fREVWQlVGKTsKKwl9CisJZG1hdC0+bWFw X2NvdW50LS07CisJQ1RSMihLVFJfQlVTRE1BLCAiJXM6IHRhZyAlcCBlcnJvciAwIiwgX19mdW5j X18sIGRtYXQpOworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIEFsbG9jYXRlIGEgcGllY2Ug b2YgbWVtb3J5IHRoYXQgY2FuIGJlIGVmZmljaWVudGx5IG1hcHBlZCBpbnRvCisgKiBidXMgZGV2 aWNlIHNwYWNlIGJhc2VkIG9uIHRoZSBjb25zdHJhaW50cyBsaXRlZCBpbiB0aGUgZG1hIHRhZy4K KyAqIEEgZG1hbWFwIHRvIGZvciB1c2Ugd2l0aCBkbWFtYXBfbG9hZCBpcyBhbHNvIGFsbG9jYXRl ZC4KKyAqLworc3RhdGljIGludAorYm91bmNlX2J1c19kbWFtZW1fYWxsb2MoYnVzX2RtYV90YWdf dCBkbWF0LCB2b2lkKiogdmFkZHIsIGludCBmbGFncywKKyAgICBidXNfZG1hbWFwX3QgKm1hcHAp Cit7CisJLyoKKwkgKiBYWFggQVJNNjRUT0RPOgorCSAqIFRoaXMgYnVzX2RtYSBpbXBsZW1lbnRh dGlvbiByZXF1aXJlcyBJTy1Db2hlcmVudCBhcmNoaXRlY3V0cmUuCisJICogSWYgSU8tQ29oZXJl bmN5IGlzIG5vdCBndWFyYW50ZWVkLCB0aGUgQlVTX0RNQV9DT0hFUkVOVCBmbGFnIGhhcworCSAq IHRvIGJlIGltcGxlbnRlZCB1c2luZyBub24tY2FjaGVhYmxlIG1lbW9yeS4KKwkgKi8KKworCXZt X21lbWF0dHJfdCBhdHRyOworCWludCBtZmxhZ3M7CisKKwlpZiAoZmxhZ3MgJiBCVVNfRE1BX05P V0FJVCkKKwkJbWZsYWdzID0gTV9OT1dBSVQ7CisJZWxzZQorCQltZmxhZ3MgPSBNX1dBSVRPSzsK KworCS8qIElmIHdlIHN1Y2NlZWQsIG5vIG1hcHBpbmcvYm91bmNpbmcgd2lsbCBiZSByZXF1aXJl ZCAqLworCSptYXBwID0gTlVMTDsKKworCWlmIChkbWF0LT5zZWdtZW50cyA9PSBOVUxMKSB7CisJ CWRtYXQtPnNlZ21lbnRzID0gKGJ1c19kbWFfc2VnbWVudF90ICopbWFsbG9jKAorCQkgICAgc2l6 ZW9mKGJ1c19kbWFfc2VnbWVudF90KSAqIGRtYXQtPmNvbW1vbi5uc2VnbWVudHMsCisJCSAgICBN X0RFVkJVRiwgbWZsYWdzKTsKKwkJaWYgKGRtYXQtPnNlZ21lbnRzID09IE5VTEwpIHsKKwkJCUNU UjQoS1RSX0JVU0RNQSwgIiVzOiB0YWcgJXAgdGFnIGZsYWdzIDB4JXggZXJyb3IgJWQiLAorCQkJ ICAgIF9fZnVuY19fLCBkbWF0LCBkbWF0LT5jb21tb24uZmxhZ3MsIEVOT01FTSk7CisJCQlyZXR1 cm4gKEVOT01FTSk7CisJCX0KKwl9CisJaWYgKGZsYWdzICYgQlVTX0RNQV9aRVJPKQorCQltZmxh Z3MgfD0gTV9aRVJPOworCWlmIChmbGFncyAmIEJVU19ETUFfTk9DQUNIRSkKKwkJYXR0ciA9IFZN X01FTUFUVFJfVU5DQUNIRUFCTEU7CisJZWxzZQorCQlhdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxU OworCisJLyoKKwkgKiBYWFg6CisJICogKGRtYXQtPmFsaWdubWVudCA8IGRtYXQtPm1heHNpemUp IGlzIGp1c3QgYSBxdWljayBoYWNrOyB0aGUgZXhhY3QKKwkgKiBhbGlnbm1lbnQgZ3VhcmFudGVl cyBvZiBtYWxsb2MgbmVlZCB0byBiZSBuYWlsZWQgZG93biwgYW5kIHRoZQorCSAqIGNvZGUgYmVs b3cgc2hvdWxkIGJlIHJld3JpdHRlbiB0byB0YWtlIHRoYXQgaW50byBhY2NvdW50LgorCSAqCisJ ICogSW4gdGhlIG1lYW50aW1lLCB3ZSdsbCB3YXJuIHRoZSB1c2VyIGlmIG1hbGxvYyBnZXRzIGl0 IHdyb25nLgorCSAqLworCWlmICgoZG1hdC0+Y29tbW9uLm1heHNpemUgPD0gUEFHRV9TSVpFKSAm JgorCSAgIChkbWF0LT5jb21tb24uYWxpZ25tZW50IDwgZG1hdC0+Y29tbW9uLm1heHNpemUpICYm CisJICAgIGRtYXQtPmNvbW1vbi5sb3dhZGRyID49IHB0b2EoKHZtX3BhZGRyX3QpTWF4bWVtKSAm JgorCSAgICBhdHRyID09IFZNX01FTUFUVFJfREVGQVVMVCkgeworCQkqdmFkZHIgPSBtYWxsb2Mo ZG1hdC0+Y29tbW9uLm1heHNpemUsIE1fREVWQlVGLCBtZmxhZ3MpOworCX0gZWxzZSBpZiAoZG1h dC0+Y29tbW9uLm5zZWdtZW50cyA+PSBidG9jKGRtYXQtPmNvbW1vbi5tYXhzaXplKSAmJgorCSAg ICBkbWF0LT5jb21tb24uYWxpZ25tZW50IDw9IFBBR0VfU0laRSAmJgorCSAgICAoZG1hdC0+Y29t bW9uLmJvdW5kYXJ5ID09IDAgfHwKKwkgICAgZG1hdC0+Y29tbW9uLmJvdW5kYXJ5ID49IGRtYXQt PmNvbW1vbi5sb3dhZGRyKSkgeworCQkvKiBQYWdlLWJhc2VkIG11bHRpLXNlZ21lbnQgYWxsb2Nh dGlvbnMgYWxsb3dlZCAqLworCQkqdmFkZHIgPSAodm9pZCAqKWttZW1fYWxsb2NfYXR0cihrZXJu ZWxfYXJlbmEsCisJCSAgICBkbWF0LT5jb21tb24ubWF4c2l6ZSwgbWZsYWdzLCAwdWwsIGRtYXQt PmNvbW1vbi5sb3dhZGRyLAorCQkgICAgYXR0cik7CisJCWRtYXQtPmJvdW5jZV9mbGFncyB8PSBC VVNfRE1BX0tNRU1fQUxMT0M7CisJfSBlbHNlIHsKKwkJKnZhZGRyID0gKHZvaWQgKilrbWVtX2Fs bG9jX2NvbnRpZyhrZXJuZWxfYXJlbmEsCisJCSAgICBkbWF0LT5jb21tb24ubWF4c2l6ZSwgbWZs YWdzLCAwdWwsIGRtYXQtPmNvbW1vbi5sb3dhZGRyLAorCQkgICAgZG1hdC0+Y29tbW9uLmFsaWdu bWVudCAhPSAwID8gZG1hdC0+Y29tbW9uLmFsaWdubWVudCA6IDF1bCwKKwkJICAgIGRtYXQtPmNv bW1vbi5ib3VuZGFyeSwgYXR0cik7CisJCWRtYXQtPmJvdW5jZV9mbGFncyB8PSBCVVNfRE1BX0tN RU1fQUxMT0M7CisJfQorCWlmICgqdmFkZHIgPT0gTlVMTCkgeworCQlDVFI0KEtUUl9CVVNETUEs ICIlczogdGFnICVwIHRhZyBmbGFncyAweCV4IGVycm9yICVkIiwKKwkJICAgIF9fZnVuY19fLCBk bWF0LCBkbWF0LT5jb21tb24uZmxhZ3MsIEVOT01FTSk7CisJCXJldHVybiAoRU5PTUVNKTsKKwl9 IGVsc2UgaWYgKHZ0b3BoeXMoKnZhZGRyKSAmIChkbWF0LT5jb21tb24uYWxpZ25tZW50IC0gMSkp IHsKKwkJcHJpbnRmKCJidXNfZG1hbWVtX2FsbG9jIGZhaWxlZCB0byBhbGlnbiBtZW1vcnkgcHJv cGVybHkuXG4iKTsKKwl9CisJQ1RSNChLVFJfQlVTRE1BLCAiJXM6IHRhZyAlcCB0YWcgZmxhZ3Mg MHgleCBlcnJvciAlZCIsCisJICAgIF9fZnVuY19fLCBkbWF0LCBkbWF0LT5jb21tb24uZmxhZ3Ms IDApOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBGcmVlIGEgcGllY2Ugb2YgbWVtb3J5IGFu ZCBpdCdzIGFsbG9jaWF0ZWQgZG1hbWFwLCB0aGF0IHdhcyBhbGxvY2F0ZWQKKyAqIHZpYSBidXNf ZG1hbWVtX2FsbG9jLiAgTWFrZSB0aGUgc2FtZSBjaG9pY2UgZm9yIGZyZWUvY29udGlnZnJlZS4K KyAqLworc3RhdGljIHZvaWQKK2JvdW5jZV9idXNfZG1hbWVtX2ZyZWUoYnVzX2RtYV90YWdfdCBk bWF0LCB2b2lkICp2YWRkciwgYnVzX2RtYW1hcF90IG1hcCkKK3sKKwkvKgorCSAqIGRtYW1lbSBk b2VzIG5vdCBuZWVkIHRvIGJlIGJvdW5jZWQsIHNvIHRoZSBtYXAgc2hvdWxkIGJlCisJICogTlVM TCBhbmQgdGhlIEJVU19ETUFfS01FTV9BTExPQyBmbGFnIGNsZWFyZWQgaWYgbWFsbG9jKCkKKwkg KiB3YXMgdXNlZCBhbmQgc2V0IGlmIGttZW1fYWxsb2NfY29udGlnKCkgd2FzIHVzZWQuCisJICov CisJaWYgKG1hcCAhPSBOVUxMKQorCQlwYW5pYygiYnVzX2RtYW1lbV9mcmVlOiBJbnZhbGlkIG1h cCBmcmVlZFxuIik7CisJaWYgKChkbWF0LT5ib3VuY2VfZmxhZ3MgJiBCVVNfRE1BX0tNRU1fQUxM T0MpID09IDApCisJCWZyZWUodmFkZHIsIE1fREVWQlVGKTsKKwllbHNlCisJCWttZW1fZnJlZShr ZXJuZWxfYXJlbmEsICh2bV9vZmZzZXRfdCl2YWRkciwKKwkJICAgIGRtYXQtPmNvbW1vbi5tYXhz aXplKTsKKwlDVFIzKEtUUl9CVVNETUEsICIlczogdGFnICVwIGZsYWdzIDB4JXgiLCBfX2Z1bmNf XywgZG1hdCwKKwkgICAgZG1hdC0+Ym91bmNlX2ZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK19i dXNfZG1hbWFwX2NvdW50X3BoeXMoYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFw LCB2bV9wYWRkcl90IGJ1ZiwKKyAgICBidXNfc2l6ZV90IGJ1ZmxlbiwgaW50IGZsYWdzKQorewor CWJ1c19hZGRyX3QgY3VyYWRkcjsKKwlidXNfc2l6ZV90IHNnc2l6ZTsKKworCWlmICgobWFwICE9 ICZub2JvdW5jZV9kbWFtYXAgJiYgbWFwLT5wYWdlc25lZWRlZCA9PSAwKSkgeworCQkvKgorCQkg KiBDb3VudCB0aGUgbnVtYmVyIG9mIGJvdW5jZSBwYWdlcworCQkgKiBuZWVkZWQgaW4gb3JkZXIg dG8gY29tcGxldGUgdGhpcyB0cmFuc2ZlcgorCQkgKi8KKwkJY3VyYWRkciA9IGJ1ZjsKKwkJd2hp bGUgKGJ1ZmxlbiAhPSAwKSB7CisJCQlzZ3NpemUgPSBNSU4oYnVmbGVuLCBkbWF0LT5jb21tb24u bWF4c2Vnc3opOworCQkJaWYgKGJ1c19kbWFfcnVuX2ZpbHRlcigmZG1hdC0+Y29tbW9uLCBjdXJh ZGRyKSkgeworCQkJCXNnc2l6ZSA9IE1JTihzZ3NpemUsIFBBR0VfU0laRSk7CisJCQkJbWFwLT5w YWdlc25lZWRlZCsrOworCQkJfQorCQkJY3VyYWRkciArPSBzZ3NpemU7CisJCQlidWZsZW4gLT0g c2dzaXplOworCQl9CisJCUNUUjEoS1RSX0JVU0RNQSwgInBhZ2VzbmVlZGVkPSAlZFxuIiwgbWFw LT5wYWdlc25lZWRlZCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorX2J1c19kbWFtYXBfY291bnRf cGFnZXMoYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLCBwbWFwX3QgcG1hcCwK KyAgICB2b2lkICpidWYsIGJ1c19zaXplX3QgYnVmbGVuLCBpbnQgZmxhZ3MpCit7CisJdm1fb2Zm c2V0X3QgdmFkZHI7CisJdm1fb2Zmc2V0X3QgdmVuZGFkZHI7CisJYnVzX2FkZHJfdCBwYWRkcjsK KwlidXNfc2l6ZV90IHNnX2xlbjsKKworCWlmICgobWFwICE9ICZub2JvdW5jZV9kbWFtYXAgJiYg bWFwLT5wYWdlc25lZWRlZCA9PSAwKSkgeworCQlDVFI0KEtUUl9CVVNETUEsICJsb3dhZGRyPSAl ZCBNYXhtZW09ICVkLCBib3VuZGFyeT0gJWQsICIKKwkJICAgICJhbGlnbm1lbnQ9ICVkIiwgZG1h dC0+Y29tbW9uLmxvd2FkZHIsCisJCSAgICBwdG9hKCh2bV9wYWRkcl90KU1heG1lbSksCisJCSAg ICBkbWF0LT5jb21tb24uYm91bmRhcnksIGRtYXQtPmNvbW1vbi5hbGlnbm1lbnQpOworCQlDVFIz KEtUUl9CVVNETUEsICJtYXA9ICVwLCBub2JvdW5jZW1hcD0gJXAsIHBhZ2VzbmVlZGVkPSAlZCIs CisJCSAgICBtYXAsICZub2JvdW5jZV9kbWFtYXAsIG1hcC0+cGFnZXNuZWVkZWQpOworCQkvKgor CQkgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGJvdW5jZSBwYWdlcworCQkgKiBuZWVkZWQgaW4gb3Jk ZXIgdG8gY29tcGxldGUgdGhpcyB0cmFuc2ZlcgorCQkgKi8KKwkJdmFkZHIgPSAodm1fb2Zmc2V0 X3QpYnVmOworCQl2ZW5kYWRkciA9ICh2bV9vZmZzZXRfdClidWYgKyBidWZsZW47CisKKwkJd2hp bGUgKHZhZGRyIDwgdmVuZGFkZHIpIHsKKwkJCXNnX2xlbiA9IFBBR0VfU0laRSAtICgodm1fb2Zm c2V0X3QpdmFkZHIgJiBQQUdFX01BU0spOworCQkJaWYgKHBtYXAgPT0ga2VybmVsX3BtYXApCisJ CQkJcGFkZHIgPSBwbWFwX2tleHRyYWN0KHZhZGRyKTsKKwkJCWVsc2UKKwkJCQlwYWRkciA9IHBt YXBfZXh0cmFjdChwbWFwLCB2YWRkcik7CisJCQlpZiAoYnVzX2RtYV9ydW5fZmlsdGVyKCZkbWF0 LT5jb21tb24sIHBhZGRyKSAhPSAwKSB7CisJCQkJc2dfbGVuID0gcm91bmR1cDIoc2dfbGVuLAor CQkJCSAgICBkbWF0LT5jb21tb24uYWxpZ25tZW50KTsKKwkJCQltYXAtPnBhZ2VzbmVlZGVkKys7 CisJCQl9CisJCQl2YWRkciArPSBzZ19sZW47CisJCX0KKwkJQ1RSMShLVFJfQlVTRE1BLCAicGFn ZXNuZWVkZWQ9ICVkXG4iLCBtYXAtPnBhZ2VzbmVlZGVkKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQK K19idXNfZG1hbWFwX3Jlc2VydmVfcGFnZXMoYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFw X3QgbWFwLCBpbnQgZmxhZ3MpCit7CisKKwkvKiBSZXNlcnZlIE5lY2Vzc2FyeSBCb3VuY2UgUGFn ZXMgKi8KKwltdHhfbG9jaygmYm91bmNlX2xvY2spOworCWlmIChmbGFncyAmIEJVU19ETUFfTk9X QUlUKSB7CisJCWlmIChyZXNlcnZlX2JvdW5jZV9wYWdlcyhkbWF0LCBtYXAsIDApICE9IDApIHsK KwkJCW10eF91bmxvY2soJmJvdW5jZV9sb2NrKTsKKwkJCXJldHVybiAoRU5PTUVNKTsKKwkJfQor CX0gZWxzZSB7CisJCWlmIChyZXNlcnZlX2JvdW5jZV9wYWdlcyhkbWF0LCBtYXAsIDEpICE9IDAp IHsKKwkJCS8qIFF1ZXVlIHVzIGZvciByZXNvdXJjZXMgKi8KKwkJCVNUQUlMUV9JTlNFUlRfVEFJ TCgmYm91bmNlX21hcF93YWl0aW5nbGlzdCwgbWFwLCBsaW5rcyk7CisJCQltdHhfdW5sb2NrKCZi b3VuY2VfbG9jayk7CisJCQlyZXR1cm4gKEVJTlBST0dSRVNTKTsKKwkJfQorCX0KKwltdHhfdW5s b2NrKCZib3VuY2VfbG9jayk7CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogQWRkIGEgc2lu Z2xlIGNvbnRpZ3VvdXMgcGh5c2ljYWwgcmFuZ2UgdG8gdGhlIHNlZ21lbnQgbGlzdC4KKyAqLwor c3RhdGljIGludAorX2J1c19kbWFtYXBfYWRkc2VnKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2Rt YW1hcF90IG1hcCwgYnVzX2FkZHJfdCBjdXJhZGRyLAorICAgIGJ1c19zaXplX3Qgc2dzaXplLCBi dXNfZG1hX3NlZ21lbnRfdCAqc2VncywgaW50ICpzZWdwKQoreworCWJ1c19hZGRyX3QgYmFkZHIs IGJtYXNrOworCWludCBzZWc7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBkb24ndCBjcm9zcyBh bnkgYm91bmRhcmllcy4KKwkgKi8KKwlibWFzayA9IH4oZG1hdC0+Y29tbW9uLmJvdW5kYXJ5IC0g MSk7CisJaWYgKGRtYXQtPmNvbW1vbi5ib3VuZGFyeSA+IDApIHsKKwkJYmFkZHIgPSAoY3VyYWRk ciArIGRtYXQtPmNvbW1vbi5ib3VuZGFyeSkgJiBibWFzazsKKwkJaWYgKHNnc2l6ZSA+IChiYWRk ciAtIGN1cmFkZHIpKQorCQkJc2dzaXplID0gKGJhZGRyIC0gY3VyYWRkcik7CisJfQorCisJLyoK KwkgKiBJbnNlcnQgY2h1bmsgaW50byBhIHNlZ21lbnQsIGNvYWxlc2Npbmcgd2l0aAorCSAqIHBy ZXZpb3VzIHNlZ21lbnQgaWYgcG9zc2libGUuCisJICovCisJc2VnID0gKnNlZ3A7CisJaWYgKHNl ZyA9PSAtMSkgeworCQlzZWcgPSAwOworCQlzZWdzW3NlZ10uZHNfYWRkciA9IGN1cmFkZHI7CisJ CXNlZ3Nbc2VnXS5kc19sZW4gPSBzZ3NpemU7CisJfSBlbHNlIHsKKwkJaWYgKGN1cmFkZHIgPT0g c2Vnc1tzZWddLmRzX2FkZHIgKyBzZWdzW3NlZ10uZHNfbGVuICYmCisJCSAgICAoc2Vnc1tzZWdd LmRzX2xlbiArIHNnc2l6ZSkgPD0gZG1hdC0+Y29tbW9uLm1heHNlZ3N6ICYmCisJCSAgICAoZG1h dC0+Y29tbW9uLmJvdW5kYXJ5ID09IDAgfHwKKwkJICAgICAoc2Vnc1tzZWddLmRzX2FkZHIgJiBi bWFzaykgPT0gKGN1cmFkZHIgJiBibWFzaykpKQorCQkJc2Vnc1tzZWddLmRzX2xlbiArPSBzZ3Np emU7CisJCWVsc2UgeworCQkJaWYgKCsrc2VnID49IGRtYXQtPmNvbW1vbi5uc2VnbWVudHMpCisJ CQkJcmV0dXJuICgwKTsKKwkJCXNlZ3Nbc2VnXS5kc19hZGRyID0gY3VyYWRkcjsKKwkJCXNlZ3Nb c2VnXS5kc19sZW4gPSBzZ3NpemU7CisJCX0KKwl9CisJKnNlZ3AgPSBzZWc7CisJcmV0dXJuIChz Z3NpemUpOworfQorCisvKgorICogVXRpbGl0eSBmdW5jdGlvbiB0byBsb2FkIGEgcGh5c2ljYWwg YnVmZmVyLiAgc2VncCBjb250YWlucworICogdGhlIHN0YXJ0aW5nIHNlZ21lbnQgb24gZW50cmFj ZSwgYW5kIHRoZSBlbmRpbmcgc2VnbWVudCBvbiBleGl0LgorICovCitzdGF0aWMgaW50Citib3Vu Y2VfYnVzX2RtYW1hcF9sb2FkX3BoeXMoYnVzX2RtYV90YWdfdCBkbWF0LCBidXNfZG1hbWFwX3Qg bWFwLAorICAgIHZtX3BhZGRyX3QgYnVmLCBidXNfc2l6ZV90IGJ1ZmxlbiwgaW50IGZsYWdzLCBi dXNfZG1hX3NlZ21lbnRfdCAqc2VncywKKyAgICBpbnQgKnNlZ3ApCit7CisJYnVzX3NpemVfdCBz Z3NpemU7CisJYnVzX2FkZHJfdCBjdXJhZGRyOworCWludCBlcnJvcjsKKworCWlmIChtYXAgPT0g TlVMTCkKKwkJbWFwID0gJm5vYm91bmNlX2RtYW1hcDsKKworCWlmIChzZWdzID09IE5VTEwpCisJ CXNlZ3MgPSBkbWF0LT5zZWdtZW50czsKKworCWlmICgoZG1hdC0+Ym91bmNlX2ZsYWdzICYgQlVT X0RNQV9DT1VMRF9CT1VOQ0UpICE9IDApIHsKKwkJX2J1c19kbWFtYXBfY291bnRfcGh5cyhkbWF0 LCBtYXAsIGJ1ZiwgYnVmbGVuLCBmbGFncyk7CisJCWlmIChtYXAtPnBhZ2VzbmVlZGVkICE9IDAp IHsKKwkJCWVycm9yID0gX2J1c19kbWFtYXBfcmVzZXJ2ZV9wYWdlcyhkbWF0LCBtYXAsIGZsYWdz KTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCX0KKworCXdoaWxl IChidWZsZW4gPiAwKSB7CisJCWN1cmFkZHIgPSBidWY7CisJCXNnc2l6ZSA9IE1JTihidWZsZW4s IGRtYXQtPmNvbW1vbi5tYXhzZWdzeik7CisJCWlmICgoKGRtYXQtPmJvdW5jZV9mbGFncyAmIEJV U19ETUFfQ09VTERfQk9VTkNFKSAhPSAwKSAmJgorCQkgICAgbWFwLT5wYWdlc25lZWRlZCAhPSAw ICYmCisJCSAgICBidXNfZG1hX3J1bl9maWx0ZXIoJmRtYXQtPmNvbW1vbiwgY3VyYWRkcikpIHsK KwkJCXNnc2l6ZSA9IE1JTihzZ3NpemUsIFBBR0VfU0laRSk7CisJCQljdXJhZGRyID0gYWRkX2Jv dW5jZV9wYWdlKGRtYXQsIG1hcCwgMCwgY3VyYWRkciwKKwkJCSAgICBzZ3NpemUpOworCQl9CisJ CXNnc2l6ZSA9IF9idXNfZG1hbWFwX2FkZHNlZyhkbWF0LCBtYXAsIGN1cmFkZHIsIHNnc2l6ZSwg c2VncywKKwkJICAgIHNlZ3ApOworCQlpZiAoc2dzaXplID09IDApCisJCQlicmVhazsKKwkJYnVm ICs9IHNnc2l6ZTsKKwkJYnVmbGVuIC09IHNnc2l6ZTsKKwl9CisKKwkvKgorCSAqIERpZCB3ZSBm aXQ/CisJICovCisJcmV0dXJuIChidWZsZW4gIT0gMCA/IEVGQklHIDogMCk7IC8qIFhYWCBiZXR0 ZXIgcmV0dXJuIHZhbHVlIGhlcmU/ICovCit9CisKKy8qCisgKiBVdGlsaXR5IGZ1bmN0aW9uIHRv IGxvYWQgYSBsaW5lYXIgYnVmZmVyLiAgc2VncCBjb250YWlucworICogdGhlIHN0YXJ0aW5nIHNl Z21lbnQgb24gZW50cmFjZSwgYW5kIHRoZSBlbmRpbmcgc2VnbWVudCBvbiBleGl0LgorICovCitz dGF0aWMgaW50Citib3VuY2VfYnVzX2RtYW1hcF9sb2FkX2J1ZmZlcihidXNfZG1hX3RhZ190IGRt YXQsIGJ1c19kbWFtYXBfdCBtYXAsIHZvaWQgKmJ1ZiwKKyAgICBidXNfc2l6ZV90IGJ1Zmxlbiwg cG1hcF90IHBtYXAsIGludCBmbGFncywgYnVzX2RtYV9zZWdtZW50X3QgKnNlZ3MsCisgICAgaW50 ICpzZWdwKQoreworCWJ1c19zaXplX3Qgc2dzaXplLCBtYXhfc2dzaXplOworCWJ1c19hZGRyX3Qg Y3VyYWRkcjsKKwl2bV9vZmZzZXRfdCB2YWRkcjsKKwlpbnQgZXJyb3I7CisKKwlpZiAobWFwID09 IE5VTEwpCisJCW1hcCA9ICZub2JvdW5jZV9kbWFtYXA7CisKKwlpZiAoc2VncyA9PSBOVUxMKQor CQlzZWdzID0gZG1hdC0+c2VnbWVudHM7CisKKwlpZiAoKGRtYXQtPmJvdW5jZV9mbGFncyAmIEJV U19ETUFfQ09VTERfQk9VTkNFKSAhPSAwKSB7CisJCV9idXNfZG1hbWFwX2NvdW50X3BhZ2VzKGRt YXQsIG1hcCwgcG1hcCwgYnVmLCBidWZsZW4sIGZsYWdzKTsKKwkJaWYgKG1hcC0+cGFnZXNuZWVk ZWQgIT0gMCkgeworCQkJZXJyb3IgPSBfYnVzX2RtYW1hcF9yZXNlcnZlX3BhZ2VzKGRtYXQsIG1h cCwgZmxhZ3MpOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybiAoZXJyb3IpOworCQl9CisJfQor CisJdmFkZHIgPSAodm1fb2Zmc2V0X3QpYnVmOworCXdoaWxlIChidWZsZW4gPiAwKSB7CisJCS8q CisJCSAqIEdldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhpcyBzZWdtZW50LgorCQkgKi8K KwkJaWYgKHBtYXAgPT0ga2VybmVsX3BtYXApCisJCQljdXJhZGRyID0gcG1hcF9rZXh0cmFjdCh2 YWRkcik7CisJCWVsc2UKKwkJCWN1cmFkZHIgPSBwbWFwX2V4dHJhY3QocG1hcCwgdmFkZHIpOwor CisJCS8qCisJCSAqIENvbXB1dGUgdGhlIHNlZ21lbnQgc2l6ZSwgYW5kIGFkanVzdCBjb3VudHMu CisJCSAqLworCQltYXhfc2dzaXplID0gTUlOKGJ1ZmxlbiwgZG1hdC0+Y29tbW9uLm1heHNlZ3N6 KTsKKwkJc2dzaXplID0gUEFHRV9TSVpFIC0gKCh2bV9vZmZzZXRfdCljdXJhZGRyICYgUEFHRV9N QVNLKTsKKwkJaWYgKCgoZG1hdC0+Ym91bmNlX2ZsYWdzICYgQlVTX0RNQV9DT1VMRF9CT1VOQ0Up ICE9IDApICYmCisJCSAgICBtYXAtPnBhZ2VzbmVlZGVkICE9IDAgJiYKKwkJICAgIGJ1c19kbWFf cnVuX2ZpbHRlcigmZG1hdC0+Y29tbW9uLCBjdXJhZGRyKSkgeworCQkJc2dzaXplID0gcm91bmR1 cDIoc2dzaXplLCBkbWF0LT5jb21tb24uYWxpZ25tZW50KTsKKwkJCXNnc2l6ZSA9IE1JTihzZ3Np emUsIG1heF9zZ3NpemUpOworCQkJY3VyYWRkciA9IGFkZF9ib3VuY2VfcGFnZShkbWF0LCBtYXAs IHZhZGRyLCBjdXJhZGRyLAorCQkJICAgIHNnc2l6ZSk7CisJCX0gZWxzZSB7CisJCQlzZ3NpemUg PSBNSU4oc2dzaXplLCBtYXhfc2dzaXplKTsKKwkJfQorCQlzZ3NpemUgPSBfYnVzX2RtYW1hcF9h ZGRzZWcoZG1hdCwgbWFwLCBjdXJhZGRyLCBzZ3NpemUsIHNlZ3MsCisJCSAgICBzZWdwKTsKKwkJ aWYgKHNnc2l6ZSA9PSAwKQorCQkJYnJlYWs7CisJCXZhZGRyICs9IHNnc2l6ZTsKKwkJYnVmbGVu IC09IHNnc2l6ZTsKKwl9CisKKwkvKgorCSAqIERpZCB3ZSBmaXQ/CisJICovCisJcmV0dXJuIChi dWZsZW4gIT0gMCA/IEVGQklHIDogMCk7IC8qIFhYWCBiZXR0ZXIgcmV0dXJuIHZhbHVlIGhlcmU/ ICovCit9CisKK3N0YXRpYyB2b2lkCitib3VuY2VfYnVzX2RtYW1hcF93YWl0b2soYnVzX2RtYV90 YWdfdCBkbWF0LCBidXNfZG1hbWFwX3QgbWFwLAorICAgIHN0cnVjdCBtZW1kZXNjICptZW0sIGJ1 c19kbWFtYXBfY2FsbGJhY2tfdCAqY2FsbGJhY2ssIHZvaWQgKmNhbGxiYWNrX2FyZykKK3sKKwor CWlmIChtYXAgPT0gTlVMTCkKKwkJcmV0dXJuOworCW1hcC0+bWVtID0gKm1lbTsKKwltYXAtPmRt YXQgPSBkbWF0OworCW1hcC0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKwltYXAtPmNhbGxiYWNrX2Fy ZyA9IGNhbGxiYWNrX2FyZzsKK30KKworc3RhdGljIGJ1c19kbWFfc2VnbWVudF90ICoKK2JvdW5j ZV9idXNfZG1hbWFwX2NvbXBsZXRlKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1h cCwKKyAgICBidXNfZG1hX3NlZ21lbnRfdCAqc2VncywgaW50IG5zZWdzLCBpbnQgZXJyb3IpCit7 CisKKwlpZiAoc2VncyA9PSBOVUxMKQorCQlzZWdzID0gZG1hdC0+c2VnbWVudHM7CisJcmV0dXJu IChzZWdzKTsKK30KKworLyoKKyAqIFJlbGVhc2UgdGhlIG1hcHBpbmcgaGVsZCBieSBtYXAuCisg Ki8KK3N0YXRpYyB2b2lkCitib3VuY2VfYnVzX2RtYW1hcF91bmxvYWQoYnVzX2RtYV90YWdfdCBk bWF0LCBidXNfZG1hbWFwX3QgbWFwKQoreworCXN0cnVjdCBib3VuY2VfcGFnZSAqYnBhZ2U7CisK Kwl3aGlsZSAoKGJwYWdlID0gU1RBSUxRX0ZJUlNUKCZtYXAtPmJwYWdlcykpICE9IE5VTEwpIHsK KwkJU1RBSUxRX1JFTU9WRV9IRUFEKCZtYXAtPmJwYWdlcywgbGlua3MpOworCQlmcmVlX2JvdW5j ZV9wYWdlKGRtYXQsIGJwYWdlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitib3VuY2VfYnVzX2Rt YW1hcF9zeW5jKGJ1c19kbWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwKKyAgICBidXNf ZG1hc3luY19vcF90IG9wKQoreworCXN0cnVjdCBib3VuY2VfcGFnZSAqYnBhZ2U7CisKKwkvKgor CSAqIFhYWCBBUk02NFRPRE86CisJICogVGhpcyBidXNfZG1hIGltcGxlbWVudGF0aW9uIHJlcXVp cmVzIElPLUNvaGVyZW50IGFyY2hpdGVjdXRyZS4KKwkgKiBJZiBJTy1Db2hlcmVuY3kgaXMgbm90 IGd1YXJhbnRlZWQsIGNhY2hlIG9wZXJhdGlvbnMgaGF2ZSB0byBiZQorCSAqIGFkZGVkIHRvIHRo aXMgZnVuY3Rpb24uCisJICovCisKKwlpZiAoKGJwYWdlID0gU1RBSUxRX0ZJUlNUKCZtYXAtPmJw YWdlcykpICE9IE5VTEwpIHsKKwkJLyoKKwkJICogSGFuZGxlIGRhdGEgYm91bmNpbmcuICBXZSBt aWdodCBhbHNvCisJCSAqIHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIGludmFsaWRhdGluZworCQkg KiB0aGUgY2FjaGVzIG9uIGJyb2tlbiBoYXJkd2FyZQorCQkgKi8KKwkJQ1RSNChLVFJfQlVTRE1B LCAiJXM6IHRhZyAlcCB0YWcgZmxhZ3MgMHgleCBvcCAweCV4ICIKKwkJICAgICJwZXJmb3JtaW5n IGJvdW5jZSIsIF9fZnVuY19fLCBkbWF0LAorCQkgICAgZG1hdC0+Y29tbW9uLmZsYWdzLCBvcCk7 CisKKwkJaWYgKChvcCAmIEJVU19ETUFTWU5DX1BSRVdSSVRFKSAhPSAwKSB7CisJCQl3aGlsZSAo YnBhZ2UgIT0gTlVMTCkgeworCQkJCWlmIChicGFnZS0+ZGF0YXZhZGRyICE9IDApIHsKKwkJCQkJ YmNvcHkoKHZvaWQgKilicGFnZS0+ZGF0YXZhZGRyLAorCQkJCQkgICAgKHZvaWQgKilicGFnZS0+ dmFkZHIsCisJCQkJCSAgICBicGFnZS0+ZGF0YWNvdW50KTsKKwkJCQl9IGVsc2UgeworCQkJCQlw aHlzY29weW91dChicGFnZS0+ZGF0YWFkZHIsCisJCQkJCSAgICAodm9pZCAqKWJwYWdlLT52YWRk ciwKKwkJCQkJICAgIGJwYWdlLT5kYXRhY291bnQpOworCQkJCX0KKwkJCQlicGFnZSA9IFNUQUlM UV9ORVhUKGJwYWdlLCBsaW5rcyk7CisJCQl9CisJCQlkbWF0LT5ib3VuY2Vfem9uZS0+dG90YWxf Ym91bmNlZCsrOworCQl9CisKKwkJaWYgKChvcCAmIEJVU19ETUFTWU5DX1BPU1RSRUFEKSAhPSAw KSB7CisJCQl3aGlsZSAoYnBhZ2UgIT0gTlVMTCkgeworCQkJCWlmIChicGFnZS0+ZGF0YXZhZGRy ICE9IDApIHsKKwkJCQkJYmNvcHkoKHZvaWQgKilicGFnZS0+dmFkZHIsCisJCQkJCSAgICAodm9p ZCAqKWJwYWdlLT5kYXRhdmFkZHIsCisJCQkJCSAgICBicGFnZS0+ZGF0YWNvdW50KTsKKwkJCQl9 IGVsc2UgeworCQkJCQlwaHlzY29weWluKCh2b2lkICopYnBhZ2UtPnZhZGRyLAorCQkJCQkgICAg YnBhZ2UtPmRhdGFhZGRyLAorCQkJCQkgICAgYnBhZ2UtPmRhdGFjb3VudCk7CisJCQkJfQorCQkJ CWJwYWdlID0gU1RBSUxRX05FWFQoYnBhZ2UsIGxpbmtzKTsKKwkJCX0KKwkJCWRtYXQtPmJvdW5j ZV96b25lLT50b3RhbF9ib3VuY2VkKys7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitpbml0 X2JvdW5jZV9wYWdlcyh2b2lkICpkdW1teSBfX3VudXNlZCkKK3sKKworCXRvdGFsX2JwYWdlcyA9 IDA7CisJU1RBSUxRX0lOSVQoJmJvdW5jZV96b25lX2xpc3QpOworCVNUQUlMUV9JTklUKCZib3Vu Y2VfbWFwX3dhaXRpbmdsaXN0KTsKKwlTVEFJTFFfSU5JVCgmYm91bmNlX21hcF9jYWxsYmFja2xp c3QpOworCW10eF9pbml0KCZib3VuY2VfbG9jaywgImJvdW5jZSBwYWdlcyBsb2NrIiwgTlVMTCwg TVRYX0RFRik7Cit9CitTWVNJTklUKGJwYWdlcywgU0lfU1VCX0xPQ0ssIFNJX09SREVSX0FOWSwg aW5pdF9ib3VuY2VfcGFnZXMsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IHN5c2N0bF9jdHhfbGlz dCAqCitidXNkbWFfc3lzY3RsX3RyZWUoc3RydWN0IGJvdW5jZV96b25lICpieikKK3sKKwlyZXR1 cm4gKCZiei0+c3lzY3RsX3RyZWUpOworfQorCitzdGF0aWMgc3RydWN0IHN5c2N0bF9vaWQgKgor YnVzZG1hX3N5c2N0bF90cmVlX3RvcChzdHJ1Y3QgYm91bmNlX3pvbmUgKmJ6KQoreworCXJldHVy biAoYnotPnN5c2N0bF90cmVlX3RvcCk7Cit9CisKK3N0YXRpYyBpbnQKK2FsbG9jX2JvdW5jZV96 b25lKGJ1c19kbWFfdGFnX3QgZG1hdCkKK3sKKwlzdHJ1Y3QgYm91bmNlX3pvbmUgKmJ6OworCisJ LyogQ2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHN1aXRhYmxlIHpvbmUgKi8KKwlT VEFJTFFfRk9SRUFDSChieiwgJmJvdW5jZV96b25lX2xpc3QsIGxpbmtzKSB7CisJCWlmICgoZG1h dC0+Y29tbW9uLmFsaWdubWVudCA8PSBiei0+YWxpZ25tZW50KSAmJgorCQkgICAgKGRtYXQtPmNv bW1vbi5sb3dhZGRyID49IGJ6LT5sb3dhZGRyKSkgeworCQkJZG1hdC0+Ym91bmNlX3pvbmUgPSBi ejsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwlpZiAoKGJ6ID0gKHN0cnVjdCBib3VuY2Vf em9uZSAqKW1hbGxvYyhzaXplb2YoKmJ6KSwgTV9ERVZCVUYsCisJICAgIE1fTk9XQUlUIHwgTV9a RVJPKSkgPT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCisJU1RBSUxRX0lOSVQoJmJ6LT5i b3VuY2VfcGFnZV9saXN0KTsKKwliei0+ZnJlZV9icGFnZXMgPSAwOworCWJ6LT5yZXNlcnZlZF9i cGFnZXMgPSAwOworCWJ6LT5hY3RpdmVfYnBhZ2VzID0gMDsKKwliei0+bG93YWRkciA9IGRtYXQt PmNvbW1vbi5sb3dhZGRyOworCWJ6LT5hbGlnbm1lbnQgPSBNQVgoZG1hdC0+Y29tbW9uLmFsaWdu bWVudCwgUEFHRV9TSVpFKTsKKwliei0+bWFwX2NvdW50ID0gMDsKKwlzbnByaW50Zihiei0+em9u ZWlkLCA4LCAiem9uZSVkIiwgYnVzZG1hX3pvbmVjb3VudCk7CisJYnVzZG1hX3pvbmVjb3VudCsr OworCXNucHJpbnRmKGJ6LT5sb3dhZGRyaWQsIDE4LCAiJSNqeCIsICh1aW50bWF4X3QpYnotPmxv d2FkZHIpOworCVNUQUlMUV9JTlNFUlRfVEFJTCgmYm91bmNlX3pvbmVfbGlzdCwgYnosIGxpbmtz KTsKKwlkbWF0LT5ib3VuY2Vfem9uZSA9IGJ6OworCisJc3lzY3RsX2N0eF9pbml0KCZiei0+c3lz Y3RsX3RyZWUpOworCWJ6LT5zeXNjdGxfdHJlZV90b3AgPSBTWVNDVExfQUREX05PREUoJmJ6LT5z eXNjdGxfdHJlZSwKKwkgICAgU1lTQ1RMX1NUQVRJQ19DSElMRFJFTihfaHdfYnVzZG1hKSwgT0lE X0FVVE8sIGJ6LT56b25laWQsCisJICAgIENUTEZMQUdfUkQsIDAsICIiKTsKKwlpZiAoYnotPnN5 c2N0bF90cmVlX3RvcCA9PSBOVUxMKSB7CisJCXN5c2N0bF9jdHhfZnJlZSgmYnotPnN5c2N0bF90 cmVlKTsKKwkJcmV0dXJuICgwKTsJLyogWFhYIGVycm9yIGNvZGU/ICovCisJfQorCisJU1lTQ1RM X0FERF9JTlQoYnVzZG1hX3N5c2N0bF90cmVlKGJ6KSwKKwkgICAgU1lTQ1RMX0NISUxEUkVOKGJ1 c2RtYV9zeXNjdGxfdHJlZV90b3AoYnopKSwgT0lEX0FVVE8sCisJICAgICJ0b3RhbF9icGFnZXMi LCBDVExGTEFHX1JELCAmYnotPnRvdGFsX2JwYWdlcywgMCwKKwkgICAgIlRvdGFsIGJvdW5jZSBw YWdlcyIpOworCVNZU0NUTF9BRERfSU5UKGJ1c2RtYV9zeXNjdGxfdHJlZShieiksCisJICAgIFNZ U0NUTF9DSElMRFJFTihidXNkbWFfc3lzY3RsX3RyZWVfdG9wKGJ6KSksIE9JRF9BVVRPLAorCSAg ICAiZnJlZV9icGFnZXMiLCBDVExGTEFHX1JELCAmYnotPmZyZWVfYnBhZ2VzLCAwLAorCSAgICAi RnJlZSBib3VuY2UgcGFnZXMiKTsKKwlTWVNDVExfQUREX0lOVChidXNkbWFfc3lzY3RsX3RyZWUo YnopLAorCSAgICBTWVNDVExfQ0hJTERSRU4oYnVzZG1hX3N5c2N0bF90cmVlX3RvcChieikpLCBP SURfQVVUTywKKwkgICAgInJlc2VydmVkX2JwYWdlcyIsIENUTEZMQUdfUkQsICZiei0+cmVzZXJ2 ZWRfYnBhZ2VzLCAwLAorCSAgICAiUmVzZXJ2ZWQgYm91bmNlIHBhZ2VzIik7CisJU1lTQ1RMX0FE RF9JTlQoYnVzZG1hX3N5c2N0bF90cmVlKGJ6KSwKKwkgICAgU1lTQ1RMX0NISUxEUkVOKGJ1c2Rt YV9zeXNjdGxfdHJlZV90b3AoYnopKSwgT0lEX0FVVE8sCisJICAgICJhY3RpdmVfYnBhZ2VzIiwg Q1RMRkxBR19SRCwgJmJ6LT5hY3RpdmVfYnBhZ2VzLCAwLAorCSAgICAiQWN0aXZlIGJvdW5jZSBw YWdlcyIpOworCVNZU0NUTF9BRERfSU5UKGJ1c2RtYV9zeXNjdGxfdHJlZShieiksCisJICAgIFNZ U0NUTF9DSElMRFJFTihidXNkbWFfc3lzY3RsX3RyZWVfdG9wKGJ6KSksIE9JRF9BVVRPLAorCSAg ICAidG90YWxfYm91bmNlZCIsIENUTEZMQUdfUkQsICZiei0+dG90YWxfYm91bmNlZCwgMCwKKwkg ICAgIlRvdGFsIGJvdW5jZSByZXF1ZXN0cyIpOworCVNZU0NUTF9BRERfSU5UKGJ1c2RtYV9zeXNj dGxfdHJlZShieiksCisJICAgIFNZU0NUTF9DSElMRFJFTihidXNkbWFfc3lzY3RsX3RyZWVfdG9w KGJ6KSksIE9JRF9BVVRPLAorCSAgICAidG90YWxfZGVmZXJyZWQiLCBDVExGTEFHX1JELCAmYnot PnRvdGFsX2RlZmVycmVkLCAwLAorCSAgICAiVG90YWwgYm91bmNlIHJlcXVlc3RzIHRoYXQgd2Vy ZSBkZWZlcnJlZCIpOworCVNZU0NUTF9BRERfU1RSSU5HKGJ1c2RtYV9zeXNjdGxfdHJlZShieiks CisJICAgIFNZU0NUTF9DSElMRFJFTihidXNkbWFfc3lzY3RsX3RyZWVfdG9wKGJ6KSksIE9JRF9B VVRPLAorCSAgICAibG93YWRkciIsIENUTEZMQUdfUkQsIGJ6LT5sb3dhZGRyaWQsIDAsICIiKTsK KwlTWVNDVExfQUREX1VBVVRPKGJ1c2RtYV9zeXNjdGxfdHJlZShieiksCisJICAgIFNZU0NUTF9D SElMRFJFTihidXNkbWFfc3lzY3RsX3RyZWVfdG9wKGJ6KSksIE9JRF9BVVRPLAorCSAgICAiYWxp Z25tZW50IiwgQ1RMRkxBR19SRCwgJmJ6LT5hbGlnbm1lbnQsICIiKTsKKworCXJldHVybiAoMCk7 Cit9CisKK3N0YXRpYyBpbnQKK2FsbG9jX2JvdW5jZV9wYWdlcyhidXNfZG1hX3RhZ190IGRtYXQs IHVfaW50IG51bXBhZ2VzKQoreworCXN0cnVjdCBib3VuY2Vfem9uZSAqYno7CisJaW50IGNvdW50 OworCisJYnogPSBkbWF0LT5ib3VuY2Vfem9uZTsKKwljb3VudCA9IDA7CisJd2hpbGUgKG51bXBh Z2VzID4gMCkgeworCQlzdHJ1Y3QgYm91bmNlX3BhZ2UgKmJwYWdlOworCisJCWJwYWdlID0gKHN0 cnVjdCBib3VuY2VfcGFnZSAqKW1hbGxvYyhzaXplb2YoKmJwYWdlKSwgTV9ERVZCVUYsCisJCQkJ CQkgICAgIE1fTk9XQUlUIHwgTV9aRVJPKTsKKworCQlpZiAoYnBhZ2UgPT0gTlVMTCkKKwkJCWJy ZWFrOworCQlicGFnZS0+dmFkZHIgPSAodm1fb2Zmc2V0X3QpY29udGlnbWFsbG9jKFBBR0VfU0la RSwgTV9ERVZCVUYsCisJCSAgICBNX05PV0FJVCwgMHVsLCBiei0+bG93YWRkciwgUEFHRV9TSVpF LCAwKTsKKwkJaWYgKGJwYWdlLT52YWRkciA9PSAwKSB7CisJCQlmcmVlKGJwYWdlLCBNX0RFVkJV Rik7CisJCQlicmVhazsKKwkJfQorCQlicGFnZS0+YnVzYWRkciA9IHBtYXBfa2V4dHJhY3QoYnBh Z2UtPnZhZGRyKTsKKwkJbXR4X2xvY2soJmJvdW5jZV9sb2NrKTsKKwkJU1RBSUxRX0lOU0VSVF9U QUlMKCZiei0+Ym91bmNlX3BhZ2VfbGlzdCwgYnBhZ2UsIGxpbmtzKTsKKwkJdG90YWxfYnBhZ2Vz Kys7CisJCWJ6LT50b3RhbF9icGFnZXMrKzsKKwkJYnotPmZyZWVfYnBhZ2VzKys7CisJCW10eF91 bmxvY2soJmJvdW5jZV9sb2NrKTsKKwkJY291bnQrKzsKKwkJbnVtcGFnZXMtLTsKKwl9CisJcmV0 dXJuIChjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQKK3Jlc2VydmVfYm91bmNlX3BhZ2VzKGJ1c19k bWFfdGFnX3QgZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwgaW50IGNvbW1pdCkKK3sKKwlzdHJ1Y3Qg Ym91bmNlX3pvbmUgKmJ6OworCWludCBwYWdlczsKKworCW10eF9hc3NlcnQoJmJvdW5jZV9sb2Nr LCBNQV9PV05FRCk7CisJYnogPSBkbWF0LT5ib3VuY2Vfem9uZTsKKwlwYWdlcyA9IE1JTihiei0+ ZnJlZV9icGFnZXMsIG1hcC0+cGFnZXNuZWVkZWQgLSBtYXAtPnBhZ2VzcmVzZXJ2ZWQpOworCWlm IChjb21taXQgPT0gMCAmJiBtYXAtPnBhZ2VzbmVlZGVkID4gKG1hcC0+cGFnZXNyZXNlcnZlZCAr IHBhZ2VzKSkKKwkJcmV0dXJuIChtYXAtPnBhZ2VzbmVlZGVkIC0gKG1hcC0+cGFnZXNyZXNlcnZl ZCArIHBhZ2VzKSk7CisJYnotPmZyZWVfYnBhZ2VzIC09IHBhZ2VzOworCWJ6LT5yZXNlcnZlZF9i cGFnZXMgKz0gcGFnZXM7CisJbWFwLT5wYWdlc3Jlc2VydmVkICs9IHBhZ2VzOworCXBhZ2VzID0g bWFwLT5wYWdlc25lZWRlZCAtIG1hcC0+cGFnZXNyZXNlcnZlZDsKKworCXJldHVybiAocGFnZXMp OworfQorCitzdGF0aWMgYnVzX2FkZHJfdAorYWRkX2JvdW5jZV9wYWdlKGJ1c19kbWFfdGFnX3Qg ZG1hdCwgYnVzX2RtYW1hcF90IG1hcCwgdm1fb2Zmc2V0X3QgdmFkZHIsCisJCWJ1c19hZGRyX3Qg YWRkciwgYnVzX3NpemVfdCBzaXplKQoreworCXN0cnVjdCBib3VuY2Vfem9uZSAqYno7CisJc3Ry dWN0IGJvdW5jZV9wYWdlICpicGFnZTsKKworCUtBU1NFUlQoZG1hdC0+Ym91bmNlX3pvbmUgIT0g TlVMTCwgKCJubyBib3VuY2Ugem9uZSBpbiBkbWEgdGFnIikpOworCUtBU1NFUlQobWFwICE9IE5V TEwgJiYgbWFwICE9ICZub2JvdW5jZV9kbWFtYXAsCisJICAgICgiYWRkX2JvdW5jZV9wYWdlOiBi YWQgbWFwICVwIiwgbWFwKSk7CisKKwlieiA9IGRtYXQtPmJvdW5jZV96b25lOworCWlmIChtYXAt PnBhZ2VzbmVlZGVkID09IDApCisJCXBhbmljKCJhZGRfYm91bmNlX3BhZ2U6IG1hcCBkb2Vzbid0 IG5lZWQgYW55IHBhZ2VzIik7CisJbWFwLT5wYWdlc25lZWRlZC0tOworCisJaWYgKG1hcC0+cGFn ZXNyZXNlcnZlZCA9PSAwKQorCQlwYW5pYygiYWRkX2JvdW5jZV9wYWdlOiBtYXAgZG9lc24ndCBu ZWVkIGFueSBwYWdlcyIpOworCW1hcC0+cGFnZXNyZXNlcnZlZC0tOworCisJbXR4X2xvY2soJmJv dW5jZV9sb2NrKTsKKwlicGFnZSA9IFNUQUlMUV9GSVJTVCgmYnotPmJvdW5jZV9wYWdlX2xpc3Qp OworCWlmIChicGFnZSA9PSBOVUxMKQorCQlwYW5pYygiYWRkX2JvdW5jZV9wYWdlOiBmcmVlIHBh Z2UgbGlzdCBpcyBlbXB0eSIpOworCisJU1RBSUxRX1JFTU9WRV9IRUFEKCZiei0+Ym91bmNlX3Bh Z2VfbGlzdCwgbGlua3MpOworCWJ6LT5yZXNlcnZlZF9icGFnZXMtLTsKKwliei0+YWN0aXZlX2Jw YWdlcysrOworCW10eF91bmxvY2soJmJvdW5jZV9sb2NrKTsKKworCWlmIChkbWF0LT5jb21tb24u ZmxhZ3MgJiBCVVNfRE1BX0tFRVBfUEdfT0ZGU0VUKSB7CisJCS8qIFBhZ2Ugb2Zmc2V0IG5lZWRz IHRvIGJlIHByZXNlcnZlZC4gKi8KKwkJYnBhZ2UtPnZhZGRyIHw9IGFkZHIgJiBQQUdFX01BU0s7 CisJCWJwYWdlLT5idXNhZGRyIHw9IGFkZHIgJiBQQUdFX01BU0s7CisJfQorCWJwYWdlLT5kYXRh dmFkZHIgPSB2YWRkcjsKKwlicGFnZS0+ZGF0YWFkZHIgPSBhZGRyOworCWJwYWdlLT5kYXRhY291 bnQgPSBzaXplOworCVNUQUlMUV9JTlNFUlRfVEFJTCgmKG1hcC0+YnBhZ2VzKSwgYnBhZ2UsIGxp bmtzKTsKKwlyZXR1cm4gKGJwYWdlLT5idXNhZGRyKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVf Ym91bmNlX3BhZ2UoYnVzX2RtYV90YWdfdCBkbWF0LCBzdHJ1Y3QgYm91bmNlX3BhZ2UgKmJwYWdl KQoreworCXN0cnVjdCBidXNfZG1hbWFwICptYXA7CisJc3RydWN0IGJvdW5jZV96b25lICpiejsK KworCWJ6ID0gZG1hdC0+Ym91bmNlX3pvbmU7CisJYnBhZ2UtPmRhdGF2YWRkciA9IDA7CisJYnBh Z2UtPmRhdGFjb3VudCA9IDA7CisJaWYgKGRtYXQtPmNvbW1vbi5mbGFncyAmIEJVU19ETUFfS0VF UF9QR19PRkZTRVQpIHsKKwkJLyoKKwkJICogUmVzZXQgdGhlIGJvdW5jZSBwYWdlIHRvIHN0YXJ0 IGF0IG9mZnNldCAwLiAgT3RoZXIgdXNlcworCQkgKiBvZiB0aGlzIGJvdW5jZSBwYWdlIG1heSBu ZWVkIHRvIHN0b3JlIGEgZnVsbCBwYWdlIG9mCisJCSAqIGRhdGEgYW5kL29yIGFzc3VtZSBpdCBz dGFydHMgb24gYSBwYWdlIGJvdW5kYXJ5LgorCQkgKi8KKwkJYnBhZ2UtPnZhZGRyICY9IH5QQUdF X01BU0s7CisJCWJwYWdlLT5idXNhZGRyICY9IH5QQUdFX01BU0s7CisJfQorCisJbXR4X2xvY2so JmJvdW5jZV9sb2NrKTsKKwlTVEFJTFFfSU5TRVJUX0hFQUQoJmJ6LT5ib3VuY2VfcGFnZV9saXN0 LCBicGFnZSwgbGlua3MpOworCWJ6LT5mcmVlX2JwYWdlcysrOworCWJ6LT5hY3RpdmVfYnBhZ2Vz LS07CisJaWYgKChtYXAgPSBTVEFJTFFfRklSU1QoJmJvdW5jZV9tYXBfd2FpdGluZ2xpc3QpKSAh PSBOVUxMKSB7CisJCWlmIChyZXNlcnZlX2JvdW5jZV9wYWdlcyhtYXAtPmRtYXQsIG1hcCwgMSkg PT0gMCkgeworCQkJU1RBSUxRX1JFTU9WRV9IRUFEKCZib3VuY2VfbWFwX3dhaXRpbmdsaXN0LCBs aW5rcyk7CisJCQlTVEFJTFFfSU5TRVJUX1RBSUwoJmJvdW5jZV9tYXBfY2FsbGJhY2tsaXN0LAor CQkJICAgIG1hcCwgbGlua3MpOworCQkJYnVzZG1hX3N3aV9wZW5kaW5nID0gMTsKKwkJCWJ6LT50 b3RhbF9kZWZlcnJlZCsrOworCQkJc3dpX3NjaGVkKHZtX2loLCAwKTsKKwkJfQorCX0KKwltdHhf dW5sb2NrKCZib3VuY2VfbG9jayk7Cit9CisKK3ZvaWQKK2J1c2RtYV9zd2kodm9pZCkKK3sKKwli dXNfZG1hX3RhZ190IGRtYXQ7CisJc3RydWN0IGJ1c19kbWFtYXAgKm1hcDsKKworCW10eF9sb2Nr KCZib3VuY2VfbG9jayk7CisJd2hpbGUgKChtYXAgPSBTVEFJTFFfRklSU1QoJmJvdW5jZV9tYXBf Y2FsbGJhY2tsaXN0KSkgIT0gTlVMTCkgeworCQlTVEFJTFFfUkVNT1ZFX0hFQUQoJmJvdW5jZV9t YXBfY2FsbGJhY2tsaXN0LCBsaW5rcyk7CisJCW10eF91bmxvY2soJmJvdW5jZV9sb2NrKTsKKwkJ ZG1hdCA9IG1hcC0+ZG1hdDsKKwkJKGRtYXQtPmNvbW1vbi5sb2NrZnVuYykoZG1hdC0+Y29tbW9u LmxvY2tmdW5jYXJnLCBCVVNfRE1BX0xPQ0spOworCQlidXNfZG1hbWFwX2xvYWRfbWVtKG1hcC0+ ZG1hdCwgbWFwLCAmbWFwLT5tZW0sCisJCSAgICBtYXAtPmNhbGxiYWNrLCBtYXAtPmNhbGxiYWNr X2FyZywgQlVTX0RNQV9XQUlUT0spOworCQkoZG1hdC0+Y29tbW9uLmxvY2tmdW5jKShkbWF0LT5j b21tb24ubG9ja2Z1bmNhcmcsCisJCSAgICBCVVNfRE1BX1VOTE9DSyk7CisJCW10eF9sb2NrKCZi b3VuY2VfbG9jayk7CisJfQorCW10eF91bmxvY2soJmJvdW5jZV9sb2NrKTsKK30KKworc3RydWN0 IGJ1c19kbWFfaW1wbCBidXNfZG1hX2JvdW5jZV9pbXBsID0geworCS50YWdfY3JlYXRlID0gYm91 bmNlX2J1c19kbWFfdGFnX2NyZWF0ZSwKKwkudGFnX2Rlc3Ryb3kgPSBib3VuY2VfYnVzX2RtYV90 YWdfZGVzdHJveSwKKwkubWFwX2NyZWF0ZSA9IGJvdW5jZV9idXNfZG1hbWFwX2NyZWF0ZSwKKwku bWFwX2Rlc3Ryb3kgPSBib3VuY2VfYnVzX2RtYW1hcF9kZXN0cm95LAorCS5tZW1fYWxsb2MgPSBi b3VuY2VfYnVzX2RtYW1lbV9hbGxvYywKKwkubWVtX2ZyZWUgPSBib3VuY2VfYnVzX2RtYW1lbV9m cmVlLAorCS5sb2FkX3BoeXMgPSBib3VuY2VfYnVzX2RtYW1hcF9sb2FkX3BoeXMsCisJLmxvYWRf YnVmZmVyID0gYm91bmNlX2J1c19kbWFtYXBfbG9hZF9idWZmZXIsCisJLmxvYWRfbWEgPSBidXNf ZG1hbWFwX2xvYWRfbWFfdHJpdiwKKwkubWFwX3dhaXRvayA9IGJvdW5jZV9idXNfZG1hbWFwX3dh aXRvaywKKwkubWFwX2NvbXBsZXRlID0gYm91bmNlX2J1c19kbWFtYXBfY29tcGxldGUsCisJLm1h cF91bmxvYWQgPSBib3VuY2VfYnVzX2RtYW1hcF91bmxvYWQsCisJLm1hcF9zeW5jID0gYm91bmNl X2J1c19kbWFtYXBfc3luYworfTsKCg== --b1_0898dab31300b56c7a2404adbbcb53b3--