From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jerome Anand Subject: [PATCH V2 4/7] ALSA: x86: hdmi: Add audio support for BYT and CHT Date: Sat, 7 Jan 2017 06:51:06 +0530 Message-ID: <20170107012109.25744-5-jerome.anand@intel.com> References: <20170107012109.25744-1-jerome.anand@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20170107012109.25744-1-jerome.anand@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org, alsa-devel@alsa-project.org Cc: tiwai@suse.de, broonie@kernel.org, rakesh.a.ughreja@intel.com List-Id: alsa-devel@alsa-project.org SGRtaSBhdWRpbyBkcml2ZXIgYmFzZWQgb24gdGhlIGNoaWxkIHBsYXRmb3JtIGRldmljZQpjcmVh dGVkIGJ5IGdmeCBkcml2ZXIgaXMgaW1wbGVtZW50ZWQuClRoaXMgYXVkaW8gZHJpdmVyIGlzIGRl cml2ZWQgZnJvbSBsZWdhY3kgaW50ZWwKaGRtaSBhdWRpbyBkcml2ZXIuCgpUaGUgaW50ZXJmYWNl cyBmb3IgaW50ZXJhY3Rpb24gYmV0d2VlbiBnZnggYW5kIGF1ZGlvCmFyZSB1cGRhdGVkIGFuZCB0 aGUgZHJpdmVyIGltcGxlbWVudGF0aW9uIHVwZGF0ZWQgdG8KZGVyaXZlIGludGVycnVwdHMgaW4g aXRzIG93biBhZGRyZXNzIHNwYWNlIGJhc2VkIG9uCmlycSBjaGlwIGZyYW1ld29yawoKU2lnbmVk LW9mZi1ieTogUGllcnJlLUxvdWlzIEJvc3NhcnQgPHBpZXJyZS1sb3Vpcy5ib3NzYXJ0QGxpbnV4 LmludGVsLmNvbT4KU2lnbmVkLW9mZi1ieTogSmVyb21lIEFuYW5kIDxqZXJvbWUuYW5hbmRAaW50 ZWwuY29tPgotLS0KIHNvdW5kL3g4Ni9NYWtlZmlsZSAgICAgICAgICAgICAgIHwgICAgMiArCiBz b3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpby5jICAgICB8IDE5MDMgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysKIHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvLmggICAgIHwg IDIwMSArKysrCiBzb3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpb19pZi5jICB8ICA1NTEgKysrKysr KysrKysKIHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2xwZV9hdWRpby5jIHwgICAxNiArLQogNSBmaWxl cyBjaGFuZ2VkLCAyNjY3IGluc2VydGlvbnMoKyksIDYgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9k ZSAxMDA2NDQgc291bmQveDg2L2ludGVsX2hkbWlfYXVkaW8uYwogY3JlYXRlIG1vZGUgMTAwNjQ0 IHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC94 ODYvaW50ZWxfaGRtaV9hdWRpb19pZi5jCgpkaWZmIC0tZ2l0IGEvc291bmQveDg2L01ha2VmaWxl IGIvc291bmQveDg2L01ha2VmaWxlCmluZGV4IGJhYTYzMzMuLmU0MDUyODAgMTAwNjQ0Ci0tLSBh L3NvdW5kL3g4Ni9NYWtlZmlsZQorKysgYi9zb3VuZC94ODYvTWFrZWZpbGUKQEAgLTEsNiArMSw4 IEBACiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL2dwdS9kcm0vaTkxNQogCiBzbmQtaGRtaS1scGUt YXVkaW8tb2JqcyArPSBcCisJaW50ZWxfaGRtaV9hdWRpby5vIFwKKwlpbnRlbF9oZG1pX2F1ZGlv X2lmLm8gXAogCWludGVsX2hkbWlfbHBlX2F1ZGlvLm8KIAogb2JqLSQoQ09ORklHX0hETUlfTFBF X0FVRElPKSArPSBzbmQtaGRtaS1scGUtYXVkaW8ubwpkaWZmIC0tZ2l0IGEvc291bmQveDg2L2lu dGVsX2hkbWlfYXVkaW8uYyBiL3NvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvLmMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiNTc2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9z b3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpby5jCkBAIC0wLDAgKzEsMTkwMyBAQAorLyoKKyAqICAg aW50ZWxfaGRtaV9hdWRpby5jIC0gSW50ZWwgSERNSSBhdWRpbyBkcml2ZXIKKyAqCisgKiAgQ29w eXJpZ2h0IChDKSAyMDE2IEludGVsIENvcnAKKyAqICBBdXRob3JzOglTYWlsYWphIEJhbmRhcnVw YWxsaSA8c2FpbGFqYS5iYW5kYXJ1cGFsbGlAaW50ZWwuY29tPgorICoJCVJhbWVzaCBCYWJ1IEsg Vgk8cmFtZXNoLmJhYnVAaW50ZWwuY29tPgorICoJCVZhaWJoYXYgQWdhcndhbCA8dmFpYmhhdi5h Z2Fyd2FsQGludGVsLmNvbT4KKyAqCQlKZXJvbWUgQW5hbmQgPGplcm9tZS5hbmFuZEBpbnRlbC5j b20+CisgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1 bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxp c2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0 aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJ VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICog IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiB+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fgorICogQUxTQSBkcml2ZXIgZm9yIEludGVsIEhETUkgYXVkaW8KKyAqLworCisj ZGVmaW5lIHByX2ZtdChmbXQpCSJoYWQ6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9y bV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIu aD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+Cisj aW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNs dWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1 ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5jbHVk ZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgImludGVsX2hkbWlfYXVkaW8uaCIKKworc3Rh dGljIERFRklORV9NVVRFWChoYWRfbXV0ZXgpOworCisvKnN0YW5kYXJkIG1vZHVsZSBvcHRpb25z IGZvciBBTFNBLiBUaGlzIG1vZHVsZSBzdXBwb3J0cyBvbmx5IG9uZSBjYXJkKi8KK3N0YXRpYyBp bnQgaGRtaV9jYXJkX2luZGV4ID0gU05EUlZfREVGQVVMVF9JRFgxOworc3RhdGljIGNoYXIgKmhk bWlfY2FyZF9pZCA9IFNORFJWX0RFRkFVTFRfU1RSMTsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2ludGVs aGFkICpoYWRfZGF0YTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGluZGV4LCBoZG1pX2NhcmRfaW5k ZXgsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LAorCQkiSW5kZXggdmFsdWUg Zm9yIElOVEVMIEludGVsIEhETUkgQXVkaW8gY29udHJvbGxlci4iKTsKK21vZHVsZV9wYXJhbV9u YW1lZChpZCwgaGRtaV9jYXJkX2lkLCBjaGFycCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlk LAorCQkiSUQgc3RyaW5nIGZvciBJTlRFTCBJbnRlbCBIRE1JIEF1ZGlvIGNvbnRyb2xsZXIuIik7 CisKKy8qCisgKiBFTEQgU0EgYml0cyBpbiB0aGUgQ0VBIFNwZWFrZXIgQWxsb2NhdGlvbiBkYXRh IGJsb2NrCisqLworc3RhdGljIGludCBlbGRfc3BlYWtlcl9hbGxvY2F0aW9uX2JpdHNbXSA9IHsK KwlbMF0gPSBGTCB8IEZSLAorCVsxXSA9IExGRSwKKwlbMl0gPSBGQywKKwlbM10gPSBSTCB8IFJS LAorCVs0XSA9IFJDLAorCVs1XSA9IEZMQyB8IEZSQywKKwlbNl0gPSBSTEMgfCBSUkMsCisJLyog dGhlIGZvbGxvd2luZyBhcmUgbm90IGRlZmluZWQgaW4gRUxEIHlldCAqLworCVs3XSA9IDAsCit9 OworCisvKgorICogVGhpcyBpcyBhbiBvcmRlcmVkIGxpc3QhCisgKgorICogVGhlIHByZWNlZGlu ZyBvbmVzIGhhdmUgYmV0dGVyIGNoYW5jZXMgdG8gYmUgc2VsZWN0ZWQgYnkKKyAqIGhkbWlfY2hh bm5lbF9hbGxvY2F0aW9uKCkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2VhX2NoYW5uZWxfc3BlYWtl cl9hbGxvY2F0aW9uIGNoYW5uZWxfYWxsb2NhdGlvbnNbXSA9IHsKKy8qICAgICAgICAgICAgICAg ICAgICAgICAgY2hhbm5lbDogICA3ICAgICA2ICAgIDUgICAgNCAgICAzICAgICAyICAgIDEgICAg MCAgKi8KK3sgLmNhX2luZGV4ID0gMHgwMCwgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgIDAs ICAgMCwgICAwLCAgICAwLCAgRlIsICBGTCB9IH0sCisJCQkJLyogMi4xICovCit7IC5jYV9pbmRl eCA9IDB4MDEsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgIExGRSwg IEZSLCAgRkwgfSB9LAorCQkJCS8qIERvbGJ5IFN1cnJvdW5kICovCit7IC5jYV9pbmRleCA9IDB4 MDIsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgIDAsICBGQywgICAgMCwgIEZSLCAg RkwgfSB9LAorCQkJCS8qIHN1cnJvdW5kNDAgKi8KK3sgLmNhX2luZGV4ID0gMHgwOCwgIC5zcGVh a2VycyA9IHsgICAwLCAgICAwLCAgUlIsICBSTCwgICAwLCAgICAwLCAgRlIsICBGTCB9IH0sCisJ CQkJLyogc3Vycm91bmQ0MSAqLworeyAuY2FfaW5kZXggPSAweDA5LCAgLnNwZWFrZXJzID0geyAg IDAsICAgIDAsICBSUiwgIFJMLCAgIDAsICBMRkUsICBGUiwgIEZMIH0gfSwKKwkJCQkvKiBzdXJy b3VuZDUwICovCit7IC5jYV9pbmRleCA9IDB4MGEsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwg IFJSLCAgUkwsICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAorCQkJCS8qIHN1cnJvdW5kNTEgKi8K K3sgLmNhX2luZGV4ID0gMHgwYiwgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgUlIsICBSTCwg IEZDLCAgTEZFLCAgRlIsICBGTCB9IH0sCisJCQkJLyogNi4xICovCit7IC5jYV9pbmRleCA9IDB4 MGYsICAuc3BlYWtlcnMgPSB7ICAgMCwgICBSQywgIFJSLCAgUkwsICBGQywgIExGRSwgIEZSLCAg RkwgfSB9LAorCQkJCS8qIHN1cnJvdW5kNzEgKi8KK3sgLmNhX2luZGV4ID0gMHgxMywgIC5zcGVh a2VycyA9IHsgUlJDLCAgUkxDLCAgUlIsICBSTCwgIEZDLCAgTEZFLCAgRlIsICBGTCB9IH0sCisK K3sgLmNhX2luZGV4ID0gMHgwMywgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgIDAsICAgMCwg IEZDLCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MDQsICAuc3BlYWtlcnMg PSB7ICAgMCwgICAgMCwgICAwLCAgUkMsICAgMCwgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2Ff aW5kZXggPSAweDA1LCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICAgMCwgIFJDLCAgIDAsICBM RkUsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgwNiwgIC5zcGVha2VycyA9IHsgICAw LCAgICAwLCAgIDAsICBSQywgIEZDLCAgICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9 IDB4MDcsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgUkMsICBGQywgIExGRSwgIEZS LCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDBjLCAgLnNwZWFrZXJzID0geyAgIDAsICAgUkMs ICBSUiwgIFJMLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgwZCwg IC5zcGVha2VycyA9IHsgICAwLCAgIFJDLCAgUlIsICBSTCwgICAwLCAgTEZFLCAgRlIsICBGTCB9 IH0sCit7IC5jYV9pbmRleCA9IDB4MGUsICAuc3BlYWtlcnMgPSB7ICAgMCwgICBSQywgIFJSLCAg UkwsICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDEwLCAgLnNwZWFr ZXJzID0geyBSUkMsICBSTEMsICBSUiwgIFJMLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sg LmNhX2luZGV4ID0gMHgxMSwgIC5zcGVha2VycyA9IHsgUlJDLCAgUkxDLCAgUlIsICBSTCwgICAw LCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MTIsICAuc3BlYWtlcnMgPSB7 IFJSQywgIFJMQywgIFJSLCAgUkwsICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5k ZXggPSAweDE0LCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICAgMCwgICAwLCAgIDAsICAgIDAs ICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxNSwgIC5zcGVha2VycyA9IHsgRlJDLCAg RkxDLCAgIDAsICAgMCwgICAwLCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4 MTYsICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgICAwLCAgIDAsICBGQywgICAgMCwgIEZSLCAg RkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDE3LCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICAg MCwgICAwLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxOCwgIC5z cGVha2VycyA9IHsgRlJDLCAgRkxDLCAgIDAsICBSQywgICAwLCAgICAwLCAgRlIsICBGTCB9IH0s Cit7IC5jYV9pbmRleCA9IDB4MTksICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgICAwLCAgUkMs ICAgMCwgIExGRSwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDFhLCAgLnNwZWFrZXJz ID0geyBGUkMsICBGTEMsICAgMCwgIFJDLCAgRkMsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sgLmNh X2luZGV4ID0gMHgxYiwgIC5zcGVha2VycyA9IHsgRlJDLCAgRkxDLCAgIDAsICBSQywgIEZDLCAg TEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MWMsICAuc3BlYWtlcnMgPSB7IEZS QywgIEZMQywgIFJSLCAgUkwsICAgMCwgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXgg PSAweDFkLCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICBSUiwgIFJMLCAgIDAsICBMRkUsICBG UiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxZSwgIC5zcGVha2VycyA9IHsgRlJDLCAgRkxD LCAgUlIsICBSTCwgIEZDLCAgICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MWYs ICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgIFJSLCAgUkwsICBGQywgIExGRSwgIEZSLCAgRkwg fSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaGFubmVsX21hcF90YWJsZSBtYXBfdGFibGVzW10g PSB7CisJeyBTTkRSVl9DSE1BUF9GTCwgICAgICAgMHgwMCwgICBGTCB9LAorCXsgU05EUlZfQ0hN QVBfRlIsICAgICAgIDB4MDEsICAgRlIgfSwKKwl7IFNORFJWX0NITUFQX1JMLCAgICAgICAweDA0 LCAgIFJMIH0sCisJeyBTTkRSVl9DSE1BUF9SUiwgICAgICAgMHgwNSwgICBSUiB9LAorCXsgU05E UlZfQ0hNQVBfTEZFLCAgICAgIDB4MDIsICAgTEZFIH0sCisJeyBTTkRSVl9DSE1BUF9GQywgICAg ICAgMHgwMywgICBGQyB9LAorCXsgU05EUlZfQ0hNQVBfUkxDLCAgICAgIDB4MDYsICAgUkxDIH0s CisJeyBTTkRSVl9DSE1BUF9SUkMsICAgICAgMHgwNywgICBSUkMgfSwKKwl7fSAvKiB0ZXJtaW5h dG9yICovCit9OworCisvKiBoYXJkd2FyZSBjYXBhYmlsaXR5IHN0cnVjdHVyZSAqLworc3RhdGlj IGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pbnRlbF9oYWRzdHJlYW0gPSB7CisJ LmluZm8gPQkoU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQlTTkRSVl9QQ01fSU5GT19E T1VCTEUgfAorCQlTTkRSVl9QQ01fSU5GT19NTUFQfAorCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZB TElEIHwKKwkJU05EUlZfUENNX0lORk9fQkFUQ0gpLAorCS5mb3JtYXRzID0gKFNORFJWX1BDTV9G TVRCSVRfUzI0IHwKKwkJU05EUlZfUENNX0ZNVEJJVF9VMjQpLAorCS5yYXRlcyA9IFNORFJWX1BD TV9SQVRFXzMyMDAwIHwKKwkJU05EUlZfUENNX1JBVEVfNDQxMDAgfAorCQlTTkRSVl9QQ01fUkFU RV80ODAwMCB8CisJCVNORFJWX1BDTV9SQVRFXzg4MjAwIHwKKwkJU05EUlZfUENNX1JBVEVfOTYw MDAgfAorCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfAorCQlTTkRSVl9QQ01fUkFURV8xOTIwMDAs CisJLnJhdGVfbWluID0gSEFEX01JTl9SQVRFLAorCS5yYXRlX21heCA9IEhBRF9NQVhfUkFURSwK KwkuY2hhbm5lbHNfbWluID0gSEFEX01JTl9DSEFOTkVMLAorCS5jaGFubmVsc19tYXggPSBIQURf TUFYX0NIQU5ORUwsCisJLmJ1ZmZlcl9ieXRlc19tYXggPSBIQURfTUFYX0JVRkZFUiwKKwkucGVy aW9kX2J5dGVzX21pbiA9IEhBRF9NSU5fUEVSSU9EX0JZVEVTLAorCS5wZXJpb2RfYnl0ZXNfbWF4 ID0gSEFEX01BWF9QRVJJT0RfQllURVMsCisJLnBlcmlvZHNfbWluID0gSEFEX01JTl9QRVJJT0RT LAorCS5wZXJpb2RzX21heCA9IEhBRF9NQVhfUEVSSU9EUywKKwkuZmlmb19zaXplID0gSEFEX0ZJ Rk9fU0laRSwKK307CisKKy8qIFJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMgKi8KKworaW5saW5l IGludCBoYWRfZ2V0X2h3c3RhdGUoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQor eworCS8qIENoZWNrIGZvciBkZXZpY2UgcHJlc2VuY2UgLVNXIHN0YXRlICovCisJaWYgKGludGVs aGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX0RJU0NPTk5FQ1RFRCkgeworCQlwcl9kZWJ1 ZygiJXM6RGV2aWNlIG5vdCBjb25uZWN0ZWQ6JWRcbiIsIF9fZnVuY19fLAorCQkJCWludGVsaGFk ZGF0YS0+ZHJ2X3N0YXR1cyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOwor fQorCitpbmxpbmUgaW50IGhhZF9nZXRfY2FwcyhlbnVtIGhhZF9jYXBzX2xpc3QgcXVlcnksIHZv aWQgKmNhcHMpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhh ZGRhdGEgPSBoYWRfZGF0YTsKKworCXJldHZhbCA9IGhhZF9nZXRfaHdzdGF0ZShpbnRlbGhhZGRh dGEpOworCWlmICghcmV0dmFsKQorCQlyZXR2YWwgPSBpbnRlbGhhZGRhdGEtPnF1ZXJ5X29wcy5o ZG1pX2F1ZGlvX2dldF9jYXBzKHF1ZXJ5LAorCQkJCWNhcHMpOworCisJcmV0dXJuIHJldHZhbDsK K30KKworaW5saW5lIGludCBoYWRfc2V0X2NhcHMoZW51bSBoYWRfY2Fwc19saXN0IHNldF9lbGVt ZW50LCB2b2lkICpjYXBzKQoreworCWludCByZXR2YWw7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAq aW50ZWxoYWRkYXRhID0gaGFkX2RhdGE7CisKKwlyZXR2YWwgPSBoYWRfZ2V0X2h3c3RhdGUoaW50 ZWxoYWRkYXRhKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gaW50ZWxoYWRkYXRhLT5xdWVy eV9vcHMuaGRtaV9hdWRpb19zZXRfY2FwcygKKwkJCQlzZXRfZWxlbWVudCwgY2Fwcyk7CisKKwly ZXR1cm4gcmV0dmFsOworfQorCitpbmxpbmUgaW50IGhhZF9yZWFkX3JlZ2lzdGVyKHVpbnQzMl90 IG9mZnNldCwgdWludDMyX3QgKmRhdGEpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgc25kX2lu dGVsaGFkICppbnRlbGhhZGRhdGEgPSBoYWRfZGF0YTsKKworCXJldHZhbCA9IGhhZF9nZXRfaHdz dGF0ZShpbnRlbGhhZGRhdGEpOworCWlmICghcmV0dmFsKQorCQlyZXR2YWwgPSBpbnRlbGhhZGRh dGEtPnJlZ19vcHMuaGRtaV9hdWRpb19yZWFkX3JlZ2lzdGVyKAorCQkJCW9mZnNldCArIGludGVs aGFkZGF0YS0+YXVkaW9fY2ZnX29mZnNldCwgZGF0YSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQor CitpbmxpbmUgaW50IGhhZF93cml0ZV9yZWdpc3Rlcih1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90 IGRhdGEpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRh dGEgPSBoYWRfZGF0YTsKKworCXJldHZhbCA9IGhhZF9nZXRfaHdzdGF0ZShpbnRlbGhhZGRhdGEp OworCWlmICghcmV0dmFsKQorCQlyZXR2YWwgPSBpbnRlbGhhZGRhdGEtPnJlZ19vcHMuaGRtaV9h dWRpb193cml0ZV9yZWdpc3RlcigKKwkJCQlvZmZzZXQgKyBpbnRlbGhhZGRhdGEtPmF1ZGlvX2Nm Z19vZmZzZXQsIGRhdGEpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworaW5saW5lIGludCBoYWRf cmVhZF9tb2RpZnkodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBkYXRhLCB1aW50MzJfdCBtYXNr KQoreworCWludCByZXR2YWw7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0g aGFkX2RhdGE7CisKKwlyZXR2YWwgPSBoYWRfZ2V0X2h3c3RhdGUoaW50ZWxoYWRkYXRhKTsKKwlp ZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gaW50ZWxoYWRkYXRhLT5yZWdfb3BzLmhkbWlfYXVkaW9f cmVhZF9tb2RpZnkoCisJCQkJb2Zmc2V0ICsgaW50ZWxoYWRkYXRhLT5hdWRpb19jZmdfb2Zmc2V0 LAorCQkJCWRhdGEsIG1hc2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKy8qKgorICogaGFkX3Jl YWRfbW9kaWZ5X2F1ZF9jb25maWdfdjIgLSBTcGVjaWZpYyBmdW5jdGlvbiB0byByZWFkLW1vZGlm eQorICogQVVEX0NPTkZJRyByZWdpc3RlciBvbiBWTFYyLlRoZSBoYWRfcmVhZF9tb2RpZnkoKSBm dW5jdGlvbiBzaG91bGQgbm90CisgKiBkaXJlY3RseSBiZSB1c2VkIG9uIFZMVjIgZm9yIHVwZGF0 aW5nIEFVRF9DT05GSUcgcmVnaXN0ZXIuCisgKiBUaGlzIGlzIGJlY2F1c2U6CisgKiBCaXQ2IG9m IEFVRF9DT05GSUcgcmVnaXN0ZXIgaXMgd3JpdGVvbmx5IGR1ZSB0byBhIHNpbGljb24gYnVnIG9u IFZMVjIKKyAqIEhETUkgSVAuIEFzIGEgcmVzdWx0IGEgcmVhZC1tb2RpZnkgb2YgQVVEX0NPTkZJ RyByZWdpdGVyIHdpbGwgYWx3YXlzCisgKiBjbGVhciBiaXQ2LiBBVURfQ09ORklHWzY6NF0gcmVw cmVzZW50cyB0aGUgImNoYW5uZWxzIiBmaWVsZCBvZiB0aGUKKyAqIHJlZ2lzdGVyLiBUaGlzIGZp ZWxkIHNob3VsZCBiZSAxeHkgYmluYXJ5IGZvciBjb25maWd1cmF0aW9uIHdpdGggNiBvcgorICog bW9yZSBjaGFubmVscy4gUmVhZC1tb2RpZnkgb2YgQVVEX0NPTkZJRyAoRWcuIGZvciBlbmFibGlu ZyBhdWRpbykKKyAqIGNhdXNlcyB0aGUgImNoYW5uZWxzIiBmaWVsZCB0byBiZSB1cGRhdGVkIGFz IDB4eSBiaW5hcnkgcmVzdWx0aW5nIGluCisgKiBiYWQgYXVkaW8uIFRoZSBmaXggaXMgdG8gYWx3 YXlzIHdyaXRlIHRoZSBBVURfQ09ORklHWzY6NF0gd2l0aAorICogYXBwcm9wcmlhdGUgdmFsdWUg d2hlbiBkb2luZyByZWFkLW1vZGlmeSBvZiBBVURfQ09ORklHIHJlZ2lzdGVyLgorICoKKyAqIEBz dWJzdHJlYW06IHRoZSBjdXJyZW50IHN1YnN0cmVhbSBvciBOVUxMIGlmIG5vIGFjdGl2ZSBzdWJz dHJlYW0KKyAqIEBkYXRhIDogZGF0YSB0byBiZSB3cml0dGVuCisgKiBAbWFzayA6IG1hc2sKKyAq CisgKi8KK2lubGluZSBpbnQgaGFkX3JlYWRfbW9kaWZ5X2F1ZF9jb25maWdfdjIoc3RydWN0IHNu ZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCXVpbnQzMl90IGRhdGEsIHVpbnQzMl90 IG1hc2spCit7CisJdW5pb24gYXVkX2NmZyBjZmdfdmFsID0gey5jZmdfcmVndmFsID0gMH07CisJ dTggY2hhbm5lbHM7CisKKwkvKgorCSAqIElmIHN1YnN0cmVhbSBpcyBOVUxMLCB0aGVyZSBpcyBu byBhY3RpdmUgc3RyZWFtLgorCSAqIEluIHRoaXMgY2FzZSBqdXN0IHNldCBjaGFubmVscyB0byAy CisJICovCisJaWYgKHN1YnN0cmVhbSkKKwkJY2hhbm5lbHMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUt PmNoYW5uZWxzOworCWVsc2UKKwkJY2hhbm5lbHMgPSAyOworCWNmZ192YWwuY2ZnX3JlZ3hfdjIu bnVtX2NoID0gY2hhbm5lbHMgLSAyOworCisJZGF0YSA9IGRhdGEgfCBjZmdfdmFsLmNmZ19yZWd2 YWw7CisJbWFzayA9IG1hc2sgfCBBVURfQ09ORklHX0NIX01BU0tfVjI7CisKKwlwcl9kZWJ1Zygi JXMgOiBkYXRhID0gJXgsIG1hc2sgPSV4XG4iLCBfX2Z1bmNfXywgZGF0YSwgbWFzayk7CisKKwly ZXR1cm4gaGFkX3JlYWRfbW9kaWZ5KEFVRF9DT05GSUcsIGRhdGEsIG1hc2spOworfQorCisvKioK KyAqIHNuZF9pbnRlbGhhZF9lbmFibGVfYXVkaW9fdjEgLSB0byBlbmFibGUgYXVkaW8KKyAqCisg KiBAc3Vic3RyZWFtOiBDdXJyZW50IHN1YnN0cmVhbSBvciBOVUxMIGlmIG5vIGFjdGl2ZSBzdWJz dHJlYW0uCisgKiBAZW5hYmxlOiAxIGlmIGF1ZGlvIGlzIHRvIGJlIGVuYWJsZWQ7IDAgaWYgYXVk aW8gaXMgdG8gYmUgZGlzYWJsZWQuCisgKgorICovCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRf ZW5hYmxlX2F1ZGlvX3YxKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJ CQl1OCBlbmFibGUpCit7CisJaGFkX3JlYWRfbW9kaWZ5KEFVRF9DT05GSUcsIGVuYWJsZSwgQklU KDApKTsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfZW5hYmxlX2F1ZGlvX3YyIC0gdG8gZW5h YmxlIGF1ZGlvCisgKgorICogQHN1YnN0cmVhbTogQ3VycmVudCBzdWJzdHJlYW0gb3IgTlVMTCBp ZiBubyBhY3RpdmUgc3Vic3RyZWFtLgorICogQGVuYWJsZTogMSBpZiBhdWRpbyBpcyB0byBiZSBl bmFibGVkOyAwIGlmIGF1ZGlvIGlzIHRvIGJlIGRpc2FibGVkLgorICovCitzdGF0aWMgdm9pZCBz bmRfaW50ZWxoYWRfZW5hYmxlX2F1ZGlvX3YyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vi c3RyZWFtLAorCQkJCQl1OCBlbmFibGUpCit7CisJaGFkX3JlYWRfbW9kaWZ5X2F1ZF9jb25maWdf djIoc3Vic3RyZWFtLCBlbmFibGUsIEJJVCgwKSk7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFk X3Jlc2V0X2F1ZGlvX3YxIC0gdG8gcmVzZXQgYXVkaW8gc3Vic3lzdGVtCisgKgorICogQHJlc2V0 OiAxIHRvIHJlc2V0IGF1ZGlvOyAwIHRvIGJyaW5nIGF1ZGlvIG91dCBvZiByZXNldC4KKyAqCisg Ki8KK3N0YXRpYyB2b2lkIHNuZF9pbnRlbGhhZF9yZXNldF9hdWRpb192MSh1OCByZXNldCkKK3sK KwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTLCByZXNldCk7Cit9CisKKy8qKgor ICogc25kX2ludGVsaGFkX3Jlc2V0X2F1ZGlvX3YyIC0gdG8gcmVzZXQgYXVkaW8gc3Vic3lzdGVt CisgKgorICogQHJlc2V0OiAxIHRvIHJlc2V0IGF1ZGlvOyAwIHRvIGJyaW5nIGF1ZGlvIG91dCBv ZiByZXNldC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9pbnRlbGhhZF9yZXNldF9hdWRpb192 Mih1OCByZXNldCkKK3sKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTX3YyLCBy ZXNldCk7Cit9CisKKy8qKgorICogaGFkX3Byb2dfc3RhdHVzX3JlZyAtIHRvIGluaXRpYWxpemUg YXVkaW8gY2hhbm5lbCBzdGF0dXMgcmVnaXN0ZXJzCisgKgorICogQHN1YnN0cmVhbTpzdWJzdHJl YW0gZm9yIHdoaWNoIHRoZSBwcmVwYXJlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogQGludGVsaGFk ZGF0YTpzdWJzdHJlYW0gcHJpdmF0ZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxs ZWQgaW4gdGhlIHByZXBhcmUgY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBoYWRfcHJvZ19zdGF0 dXNfcmVnKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJc3RydWN0IHNu ZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXVuaW9uIGF1ZF9jaF9zdGF0dXNfMCBjaF9z dGF0MCA9IHsuc3RhdHVzXzBfcmVndmFsID0gMH07CisJdW5pb24gYXVkX2NoX3N0YXR1c18xIGNo X3N0YXQxID0gey5zdGF0dXNfMV9yZWd2YWwgPSAwfTsKKwlpbnQgZm9ybWF0OworCisJcHJfZGVi dWcoIkVudHJ5ICVzXG4iLCBfX2Z1bmNfXyk7CisKKwljaF9zdGF0MC5zdGF0dXNfMF9yZWd4Lmxw Y21faWQgPSAoaW50ZWxoYWRkYXRhLT5hZXNfYml0cyAmCisJCQkJCQlJRUM5NThfQUVTMF9OT05B VURJTyk+PjE7CisJY2hfc3RhdDAuc3RhdHVzXzBfcmVneC5jbGtfYWNjID0gKGludGVsaGFkZGF0 YS0+YWVzX2JpdHMgJgorCQkJCQkJSUVDOTU4X0FFUzNfQ09OX0NMT0NLKT4+NDsKKworCXN3aXRj aCAoc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKSB7CisJY2FzZSBBVURfU0FNUExFX1JBVEVfMzI6 CisJCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVTX01BUF8zMktI WjsKKwkJYnJlYWs7CisKKwljYXNlIEFVRF9TQU1QTEVfUkFURV80NF8xOgorCQljaF9zdGF0MC5z dGF0dXNfMF9yZWd4LnNhbXBfZnJlcSA9IENIX1NUQVRVU19NQVBfNDRLSFo7CisJCWJyZWFrOwor CWNhc2UgQVVEX1NBTVBMRV9SQVRFXzQ4OgorCQljaF9zdGF0MC5zdGF0dXNfMF9yZWd4LnNhbXBf ZnJlcSA9IENIX1NUQVRVU19NQVBfNDhLSFo7CisJCWJyZWFrOworCWNhc2UgQVVEX1NBTVBMRV9S QVRFXzg4XzI6CisJCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVT X01BUF84OEtIWjsKKwkJYnJlYWs7CisJY2FzZSBBVURfU0FNUExFX1JBVEVfOTY6CisJCWNoX3N0 YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVTX01BUF85NktIWjsKKwkJYnJl YWs7CisJY2FzZSBBVURfU0FNUExFX1JBVEVfMTc2XzQ6CisJCWNoX3N0YXQwLnN0YXR1c18wX3Jl Z3guc2FtcF9mcmVxID0gQ0hfU1RBVFVTX01BUF8xNzZLSFo7CisJCWJyZWFrOworCWNhc2UgQVVE X1NBTVBMRV9SQVRFXzE5MjoKKwkJY2hfc3RhdDAuc3RhdHVzXzBfcmVneC5zYW1wX2ZyZXEgPSBD SF9TVEFUVVNfTUFQXzE5MktIWjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBjb250cm9s IHNob3VsZCBuZXZlciBjb21lIGhlcmUgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJYnJlYWs7CisK Kwl9CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DSF9TVEFUVVNfMCwgY2hfc3RhdDAuc3RhdHVz XzBfcmVndmFsKTsKKworCWZvcm1hdCA9IHN1YnN0cmVhbS0+cnVudGltZS0+Zm9ybWF0OworCisJ aWYgKGZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSkgeworCQljaF9zdGF0MS5zdGF0 dXNfMV9yZWd4Lm1heF93cmRfbGVuID0gTUFYX1NNUExfV0lEVEhfMjA7CisJCWNoX3N0YXQxLnN0 YXR1c18xX3JlZ3gud3JkX2xlbiA9IFNNUExfV0lEVEhfMTZCSVRTOworCX0gZWxzZSBpZiAoZm9y bWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKSB7CisJCWNoX3N0YXQxLnN0YXR1c18xX3Jl Z3gubWF4X3dyZF9sZW4gPSBNQVhfU01QTF9XSURUSF8yNDsKKwkJY2hfc3RhdDEuc3RhdHVzXzFf cmVneC53cmRfbGVuID0gU01QTF9XSURUSF8yNEJJVFM7CisJfSBlbHNlIHsKKwkJY2hfc3RhdDEu c3RhdHVzXzFfcmVneC5tYXhfd3JkX2xlbiA9IDA7CisJCWNoX3N0YXQxLnN0YXR1c18xX3JlZ3gu d3JkX2xlbiA9IDA7CisJfQorCWhhZF93cml0ZV9yZWdpc3RlcihBVURfQ0hfU1RBVFVTXzEsIGNo X3N0YXQxLnN0YXR1c18xX3JlZ3ZhbCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc25kX2lu dGVsaGFkX3Byb2dfYXVkaW9fY3RybF92MiAtIHRvIGluaXRpYWxpemUgYXVkaW8KKyAqIHJlZ2lz dGVycyBhbmQgYnVmZmVyIGNvbmZnaXVyYXRpb24gcmVnaXN0ZXJzCisgKgorICogQHN1YnN0cmVh bTpzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBwcmVwYXJlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICog QGludGVsaGFkZGF0YTpzdWJzdHJlYW0gcHJpdmF0ZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlv biBpcyBjYWxsZWQgaW4gdGhlIHByZXBhcmUgY2FsbGJhY2sKKyAqLworaW50IHNuZF9pbnRlbGhh ZF9wcm9nX2F1ZGlvX2N0cmxfdjIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0s CisJCQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwl1bmlvbiBhdWRf Y2ZnIGNmZ192YWwgPSB7LmNmZ19yZWd2YWwgPSAwfTsKKwl1bmlvbiBhdWRfYnVmX2NvbmZpZyBi dWZfY2ZnID0gey5idWZfY2ZndmFsID0gMH07CisJdTggY2hhbm5lbHM7CisKKwloYWRfcHJvZ19z dGF0dXNfcmVnKHN1YnN0cmVhbSwgaW50ZWxoYWRkYXRhKTsKKworCWJ1Zl9jZmcuYnVmX2NmZ19y ZWd4X3YyLmF1ZGlvX2ZpZm9fd2F0ZXJtYXJrID0gRklGT19USFJFU0hPTEQ7CisJYnVmX2NmZy5i dWZfY2ZnX3JlZ3hfdjIuZG1hX2ZpZm9fd2F0ZXJtYXJrID0gRE1BX0ZJRk9fVEhSRVNIT0xEOwor CWJ1Zl9jZmcuYnVmX2NmZ19yZWd4X3YyLmF1ZF9kZWxheSA9IDA7CisJaGFkX3dyaXRlX3JlZ2lz dGVyKEFVRF9CVUZfQ09ORklHLCBidWZfY2ZnLmJ1Zl9jZmd2YWwpOworCisJY2hhbm5lbHMgPSBz dWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzOworCWNmZ192YWwuY2ZnX3JlZ3hfdjIubnVtX2No ID0gY2hhbm5lbHMgLSAyOworCWlmIChjaGFubmVscyA8PSAyKQorCQljZmdfdmFsLmNmZ19yZWd4 X3YyLmxheW91dCA9IExBWU9VVDA7CisJZWxzZQorCQljZmdfdmFsLmNmZ19yZWd4X3YyLmxheW91 dCA9IExBWU9VVDE7CisKKwljZmdfdmFsLmNmZ19yZWd4X3YyLnZhbF9iaXQgPSAxOworCWhhZF93 cml0ZV9yZWdpc3RlcihBVURfQ09ORklHLCBjZmdfdmFsLmNmZ19yZWd2YWwpOworCXJldHVybiAw OworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9wcm9nX2F1ZGlvX2N0cmxfdjEgLSB0byBpbml0 aWFsaXplIGF1ZGlvCisgKiByZWdpc3RlcnMgYW5kIGJ1ZmZlciBjb25mZ2l1cmF0aW9uIHJlZ2lz dGVycworICoKKyAqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgcHJlcGFyZSBm dW5jdGlvbiBpcyBjYWxsZWQKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3RyZWFtIHByaXZhdGUgZGF0 YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwcmVwYXJlIGNhbGxiYWNr CisgKi8KK2ludCBzbmRfaW50ZWxoYWRfcHJvZ19hdWRpb19jdHJsX3YxKHN0cnVjdCBzbmRfcGNt X3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhh ZGRhdGEpCit7CisJdW5pb24gYXVkX2NmZyBjZmdfdmFsID0gey5jZmdfcmVndmFsID0gMH07CisJ dW5pb24gYXVkX2J1Zl9jb25maWcgYnVmX2NmZyA9IHsuYnVmX2NmZ3ZhbCA9IDB9OworCXU4IGNo YW5uZWxzOworCisJaGFkX3Byb2dfc3RhdHVzX3JlZyhzdWJzdHJlYW0sIGludGVsaGFkZGF0YSk7 CisKKwlidWZfY2ZnLmJ1Zl9jZmdfcmVneC5maWZvX3dpZHRoID0gRklGT19USFJFU0hPTEQ7CisJ YnVmX2NmZy5idWZfY2ZnX3JlZ3guYXVkX2RlbGF5ID0gMDsKKwloYWRfd3JpdGVfcmVnaXN0ZXIo QVVEX0JVRl9DT05GSUcsIGJ1Zl9jZmcuYnVmX2NmZ3ZhbCk7CisKKwljaGFubmVscyA9IHN1YnN0 cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CisKKwlzd2l0Y2ggKGNoYW5uZWxzKSB7CisJY2FzZSAx OgorCWNhc2UgMjoKKwkJY2ZnX3ZhbC5jZmdfcmVneC5udW1fY2ggPSBDSF9TVEVSRU87CisJCWNm Z192YWwuY2ZnX3JlZ3gubGF5b3V0ID0gTEFZT1VUMDsKKwlicmVhazsKKworCWNhc2UgMzoKKwlj YXNlIDQ6CisJCWNmZ192YWwuY2ZnX3JlZ3gubnVtX2NoID0gQ0hfVEhSRUVfRk9VUjsKKwkJY2Zn X3ZhbC5jZmdfcmVneC5sYXlvdXQgPSBMQVlPVVQxOworCWJyZWFrOworCisJY2FzZSA1OgorCWNh c2UgNjoKKwkJY2ZnX3ZhbC5jZmdfcmVneC5udW1fY2ggPSBDSF9GSVZFX1NJWDsKKwkJY2ZnX3Zh bC5jZmdfcmVneC5sYXlvdXQgPSBMQVlPVVQxOworCWJyZWFrOworCisJY2FzZSA3OgorCWNhc2Ug ODoKKwkJY2ZnX3ZhbC5jZmdfcmVneC5udW1fY2ggPSBDSF9TRVZFTl9FSUdIVDsKKwkJY2ZnX3Zh bC5jZmdfcmVneC5sYXlvdXQgPSBMQVlPVVQxOworCWJyZWFrOworCisJfQorCisJY2ZnX3ZhbC5j ZmdfcmVneC52YWxfYml0ID0gMTsKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0NPTkZJRywgY2Zn X3ZhbC5jZmdfcmVndmFsKTsKKwlyZXR1cm4gMDsKK30KKy8qCisgKiBDb21wdXRlIGRlcml2ZWQg dmFsdWVzIGluIGNoYW5uZWxfYWxsb2NhdGlvbnNbXS4KKyAqLworc3RhdGljIHZvaWQgaW5pdF9j aGFubmVsX2FsbG9jYXRpb25zKHZvaWQpCit7CisJaW50IGksIGo7CisJc3RydWN0IGNlYV9jaGFu bmVsX3NwZWFrZXJfYWxsb2NhdGlvbiAqcDsKKworCXByX2RlYnVnKCIlczogRW50ZXJcbiIsIF9f ZnVuY19fKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoYW5uZWxfYWxsb2NhdGlv bnMpOyBpKyspIHsKKwkJcCA9IGNoYW5uZWxfYWxsb2NhdGlvbnMgKyBpOworCQlwLT5jaGFubmVs cyA9IDA7CisJCXAtPnNwa19tYXNrID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUo cC0+c3BlYWtlcnMpOyBqKyspCisJCQlpZiAocC0+c3BlYWtlcnNbal0pIHsKKwkJCQlwLT5jaGFu bmVscysrOworCQkJCXAtPnNwa19tYXNrIHw9IHAtPnNwZWFrZXJzW2pdOworCQkJfQorCX0KK30K KworLyoKKyAqIFRoZSB0cmFuc2Zvcm1hdGlvbiB0YWtlcyB0d28gc3RlcHM6CisgKgorICogICAg ICBlbGQtPnNwa19hbGxvYyA9PiAoZWxkX3NwZWFrZXJfYWxsb2NhdGlvbl9iaXRzW10pID0+IHNw a19tYXNrCisgKiAgICAgICAgICAgIHNwa19tYXNrID0+IChjaGFubmVsX2FsbG9jYXRpb25zW10p ICAgICAgICAgPT4gYWktPkNBCisgKgorICogVE9ETzogaXQgY291bGQgc2VsZWN0IHRoZSB3cm9u ZyBDQSBmcm9tIG11bHRpcGxlIGNhbmRpZGF0ZXMuCisqLworc3RhdGljIGludCBzbmRfaW50ZWxo YWRfY2hhbm5lbF9hbGxvY2F0aW9uKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSwK KwkJCQkJaW50IGNoYW5uZWxzKQoreworCWludCBpOworCWludCBjYSA9IDA7CisJaW50IHNwa19t YXNrID0gMDsKKworCS8qCisJKiBDQSBkZWZhdWx0cyB0byAwIGZvciBiYXNpYyBzdGVyZW8gYXVk aW8KKwkqLworCWlmIChjaGFubmVscyA8PSAyKQorCQlyZXR1cm4gMDsKKworCS8qCisJKiBleHBh bmQgRUxEJ3Mgc3BlYWtlciBhbGxvY2F0aW9uIG1hc2sKKwkqCisJKiBFTEQgdGVsbHMgdGhlIHNw ZWFrZXIgbWFzayBpbiBhIGNvbXBhY3QocGFpcmVkKSBmb3JtLAorCSogZXhwYW5kIEVMRCdzIG5v dGlvbnMgdG8gbWF0Y2ggdGhlIG9uZXMgdXNlZCBieSBBdWRpbyBJbmZvRnJhbWUuCisJKi8KKwor CWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVsZF9zcGVha2VyX2FsbG9jYXRpb25fYml0cyk7 IGkrKykgeworCQlpZiAoaW50ZWxoYWRkYXRhLT5lZWxkLnNwZWFrZXJfYWxsb2NhdGlvbl9ibG9j ayAmICgxIDw8IGkpKQorCQkJc3BrX21hc2sgfD0gZWxkX3NwZWFrZXJfYWxsb2NhdGlvbl9iaXRz W2ldOworCX0KKworCS8qIHNlYXJjaCBmb3IgdGhlIGZpcnN0IHdvcmtpbmcgbWF0Y2ggaW4gdGhl IENBIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbm5lbF9hbGxvY2F0 aW9ucyk7IGkrKykgeworCQlpZiAoY2hhbm5lbHMgPT0gY2hhbm5lbF9hbGxvY2F0aW9uc1tpXS5j aGFubmVscyAmJgorCQkoc3BrX21hc2sgJiBjaGFubmVsX2FsbG9jYXRpb25zW2ldLnNwa19tYXNr KSA9PQorCQkJCWNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uc3BrX21hc2spIHsKKwkJCWNhID0gY2hh bm5lbF9hbGxvY2F0aW9uc1tpXS5jYV9pbmRleDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcHJf ZGVidWcoIkhETUk6IHNlbGVjdCBDQSAweCV4IGZvciAlZFxuIiwgY2EsIGNoYW5uZWxzKTsKKwor CXJldHVybiBjYTsKK30KKworLyogZnJvbSBzcGVha2VyIGJpdCBtYXNrIHRvIEFMU0EgQVBJIGNo YW5uZWwgcG9zaXRpb24gKi8KK3N0YXRpYyBpbnQgc3BrX3RvX2NobWFwKGludCBzcGspCit7CisJ c3RydWN0IGNoYW5uZWxfbWFwX3RhYmxlICp0ID0gbWFwX3RhYmxlczsKKworCWZvciAoOyB0LT5t YXA7IHQrKykgeworCQlpZiAodC0+c3BrX21hc2sgPT0gc3BrKQorCQkJcmV0dXJuIHQtPm1hcDsK Kwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGFkX2J1aWxkX2NoYW5uZWxfYWxsb2NhdGlvbl9t YXAoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCWludCBpID0gMCwgYyA9 IDA7CisJaW50IHNwa19tYXNrID0gMDsKKwlzdHJ1Y3Qgc25kX3BjbV9jaG1hcF9lbGVtICpjaG1h cDsKKwl1aW50OF90IGVsZF9oaWdoLCBlbGRfaGlnaF9tYXNrID0gMHhGMDsKKwl1aW50OF90IGhp Z2hfbXNiOworCisJY2htYXAgPSBremFsbG9jKHNpemVvZigqY2htYXApLCBHRlBfS0VSTkVMKTsK KwlpZiAoY2htYXAgPT0gTlVMTCkgeworCQlpbnRlbGhhZGRhdGEtPmNobWFwLT5jaG1hcCA9IE5V TEw7CisJCXJldHVybjsKKwl9CisKKwloYWRfZ2V0X2NhcHMoSEFEX0dFVF9FTEQsICZpbnRlbGhh ZGRhdGEtPmVlbGQpOworCisJcHJfZGVidWcoImVlbGQuc3BlYWtlcl9hbGxvY2F0aW9uX2Jsb2Nr ID0gJXhcbiIsCisJCQlpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9hbGxvY2F0aW9uX2Jsb2Nr KTsKKworCS8qIFdBOiBGaXggdGhlIG1heCBjaGFubmVsIHN1cHBvcnRlZCB0byA4ICovCisKKwkv KgorCSAqIFNpbmsgbWF5IHN1cHBvcnQgbW9yZSB0aGFuIDggY2hhbm5lbHMsIGlmIGVsZF9oaWdo IGhhcyBtb3JlIHRoYW4KKwkgKiBvbmUgYml0IHNldC4gU09DIHN1cHBvcnRzIG1heCA4IGNoYW5u ZWxzLgorCSAqIFJlZmVyIGVsZF9zcGVha2VyX2FsbG9jYXRpb25fYml0cywgZm9yIHNpbmsgc3Bl YWtlciBhbGxvY2F0aW9uCisJICovCisKKwkvKiBpZiAweDJGIDwgZWxkIDwgMHg0RiBmYWxsIGJh Y2sgdG8gMHgyZiwgZWxzZSBmYWxsIGJhY2sgdG8gMHg0RiAqLworCWVsZF9oaWdoID0gaW50ZWxo YWRkYXRhLT5lZWxkLnNwZWFrZXJfYWxsb2NhdGlvbl9ibG9jayAmIGVsZF9oaWdoX21hc2s7CisJ aWYgKChlbGRfaGlnaCAmIChlbGRfaGlnaC0xKSkgJiYgKGVsZF9oaWdoID4gMHgxRikpIHsKKwkJ LyogZWxkX2hpZ2ggJiAoZWxkX2hpZ2gtMSk6IGlmIG1vcmUgdGhhbiAxIGJpdCBzZXQgKi8KKwkJ LyogMHgxRjogNyBjaGFubmVscyAqLworCQlmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKSB7CisJCQlo aWdoX21zYiA9IGVsZF9oaWdoICYgKDB4ODAgPj4gaSk7CisJCQlpZiAoaGlnaF9tc2IpIHsKKwkJ CQlpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9hbGxvY2F0aW9uX2Jsb2NrICY9CisJCQkJCWhp Z2hfbXNiIHwgMHhGOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJZm9yIChpID0gMDsg aSA8IEFSUkFZX1NJWkUoZWxkX3NwZWFrZXJfYWxsb2NhdGlvbl9iaXRzKTsgaSsrKSB7CisJCWlm IChpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9hbGxvY2F0aW9uX2Jsb2NrICYgKDEgPDwgaSkp CisJCQlzcGtfbWFzayB8PSBlbGRfc3BlYWtlcl9hbGxvY2F0aW9uX2JpdHNbaV07CisJfQorCisJ Zm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbm5lbF9hbGxvY2F0aW9ucyk7IGkrKykgewor CQlpZiAoc3BrX21hc2sgPT0gY2hhbm5lbF9hbGxvY2F0aW9uc1tpXS5zcGtfbWFzaykgeworCQkJ Zm9yIChjID0gMDsgYyA8IGNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uY2hhbm5lbHM7IGMrKykgewor CQkJCWNobWFwLT5tYXBbY10gPSBzcGtfdG9fY2htYXAoCisJCQkJCWNoYW5uZWxfYWxsb2NhdGlv bnNbaV0uc3BlYWtlcnNbCisJCQkJCQkoTUFYX1NQRUFLRVJTIC0gMSktY10pOworCQkJfQorCQkJ Y2htYXAtPmNoYW5uZWxzID0gY2hhbm5lbF9hbGxvY2F0aW9uc1tpXS5jaGFubmVsczsKKwkJCWlu dGVsaGFkZGF0YS0+Y2htYXAtPmNobWFwID0gY2htYXA7CisJCQlicmVhazsKKwkJfQorCX0KKwlp ZiAoaSA+PSBBUlJBWV9TSVpFKGNoYW5uZWxfYWxsb2NhdGlvbnMpKSB7CisJCWludGVsaGFkZGF0 YS0+Y2htYXAtPmNobWFwID0gTlVMTDsKKwkJa2ZyZWUoY2htYXApOworCX0KK30KKworLyoKKyAq KiBBTFNBIEFQSSBjaGFubmVsLW1hcCBjb250cm9sIGNhbGxiYWNrcworICoqLworc3RhdGljIGlu dCBoYWRfY2htYXBfY3RsX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJ c3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9jaG1h cCAqaW5mbyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX2ludGVs aGFkICppbnRlbGhhZGRhdGEgPSBpbmZvLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoaW50ZWxoYWRk YXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZfRElTQ09OTkVDVEVEKQorCQlyZXR1cm4gLUVOT0RF VjsKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+ Y291bnQgPSBIQURfTUFYX0NIQU5ORUw7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsK Kwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBTTkRSVl9DSE1BUF9MQVNUOworCXJldHVybiAw OworfQorCisjaWZuZGVmIFVTRV9BTFNBX0RFRkFVTFRfVExWCitzdGF0aWMgaW50IGhhZF9jaG1h cF9jdGxfdGx2KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgb3BfZmxhZywKKwkJ CQl1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IF9fdXNlciAqdGx2KQoreworCXN0cnVj dCBzbmRfcGNtX2NobWFwICppbmZvID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0 cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IGluZm8tPnByaXZhdGVfZGF0YTsKKwor CWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPT0gSEFEX0RSVl9ESVNDT05ORUNURUQpCisJ CXJldHVybiAtRU5PREVWOworCisJLyogVE9ETzogRml4IGZvciBxdWVyeSBjaGFubmVsIG1hcCAq LworCXJldHVybiAtRVBFUk07Cit9CisjZW5kaWYKKworc3RhdGljIGludCBoYWRfY2htYXBfY3Rs X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9l bGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9jaG1hcCAqaW5mbyA9IHNu ZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhh ZGRhdGEgPSBpbmZvLT5wcml2YXRlX2RhdGE7CisJaW50IGkgPSAwOworCWNvbnN0IHN0cnVjdCBz bmRfcGNtX2NobWFwX2VsZW0gKmNobWFwOworCisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1 cyA9PSBIQURfRFJWX0RJU0NPTk5FQ1RFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGludGVs aGFkZGF0YS0+Y2htYXAtPmNobWFwID09ICBOVUxMKQorCQlyZXR1cm4gLUVOT0RBVEE7CisJY2ht YXAgPSBpbnRlbGhhZGRhdGEtPmNobWFwLT5jaG1hcDsKKwlmb3IgKGkgPSAwOyBpIDwgY2htYXAt PmNoYW5uZWxzOyBpKyspIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gPSBj aG1hcC0+bWFwW2ldOworCQlwcl9kZWJ1ZygiY2htYXAtPm1hcFslZF0gPSAlZFxuIiwgaSwgY2ht YXAtPm1hcFtpXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFkX2NobWFw X2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9j dGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJLyogVE9ETzogR2V0IGNoYW5uZWwgbWFwIGFu ZCBzZXQgc3dhcCByZWdpc3RlciAqLworCXJldHVybiAtRVBFUk07Cit9CisKK3N0YXRpYyBpbnQg aGFkX3JlZ2lzdGVyX2NobWFwX2N0bHMoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRh LAorCQkJCQkJc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciA9 IHNuZF9wY21fYWRkX2NobWFwX2N0bHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAor CQkJTlVMTCwgMCwgKHVuc2lnbmVkIGxvbmcpaW50ZWxoYWRkYXRhLAorCQkJJmludGVsaGFkZGF0 YS0+Y2htYXApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaW50ZWxoYWRkYXRh LT5jaG1hcC0+cHJpdmF0ZV9kYXRhID0gaW50ZWxoYWRkYXRhOworCWludGVsaGFkZGF0YS0+a2N0 bCA9IGludGVsaGFkZGF0YS0+Y2htYXAtPmtjdGw7CisJaW50ZWxoYWRkYXRhLT5rY3RsLT5pbmZv ID0gaGFkX2NobWFwX2N0bF9pbmZvOworCWludGVsaGFkZGF0YS0+a2N0bC0+Z2V0ID0gaGFkX2No bWFwX2N0bF9nZXQ7CisJaW50ZWxoYWRkYXRhLT5rY3RsLT5wdXQgPSBoYWRfY2htYXBfY3RsX3B1 dDsKKyNpZm5kZWYgVVNFX0FMU0FfREVGQVVMVF9UTFYKKwlpbnRlbGhhZGRhdGEtPmtjdGwtPnRs di5jID0gaGFkX2NobWFwX2N0bF90bHY7CisjZW5kaWYKKwlpbnRlbGhhZGRhdGEtPmNobWFwLT5j aG1hcCA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX3Byb2df ZGlwX3YxIC0gdG8gaW5pdGlhbGl6ZSBEYXRhIElzbGFuZCBQYWNrZXRzIHJlZ2lzdGVycworICoK KyAqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgcHJlcGFyZSBmdW5jdGlvbiBp cyBjYWxsZWQKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3RyZWFtIHByaXZhdGUgZGF0YQorICoKKyAq IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwcmVwYXJlIGNhbGxiYWNrCisgKi8KK3N0 YXRpYyB2b2lkIHNuZF9pbnRlbGhhZF9wcm9nX2RpcF92MShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJl YW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7 CisJaW50IGk7CisJdW5pb24gYXVkX2N0cmxfc3QgY3RybF9zdGF0ZSA9IHsuY3RybF92YWwgPSAw fTsKKwl1bmlvbiBhdWRfaW5mb19mcmFtZTIgZnJhbWUyID0gey5mcjJfdmFsID0gMH07CisJdW5p b24gYXVkX2luZm9fZnJhbWUzIGZyYW1lMyA9IHsuZnIzX3ZhbCA9IDB9OworCXU4IGNoZWNrc3Vt ID0gMDsKKwlpbnQgY2hhbm5lbHM7CisKKwljaGFubmVscyA9IHN1YnN0cmVhbS0+cnVudGltZS0+ Y2hhbm5lbHM7CisKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0NOVExfU1QsIGN0cmxfc3RhdGUu Y3RybF92YWwpOworCisJZnJhbWUyLmZyMl9yZWd4LmNobmxfY250ID0gc3Vic3RyZWFtLT5ydW50 aW1lLT5jaGFubmVscyAtIDE7CisKKwlmcmFtZTMuZnIzX3JlZ3guY2hubF9hbGxvYyA9IHNuZF9p bnRlbGhhZF9jaGFubmVsX2FsbG9jYXRpb24oCisJCQkJCWludGVsaGFkZGF0YSwgY2hhbm5lbHMp OworCisJLypDYWxjdWx0ZSB0aGUgYnl0ZSB3aWRlIGNoZWNrc3VtIGZvciBhbGwgdmFsaWQgRElQ IHdvcmRzKi8KKwlmb3IgKGkgPSAwOyBpIDwgQllURVNfUEVSX1dPUkQ7IGkrKykKKwkJY2hlY2tz dW0gKz0gKElORk9fRlJBTUVfV09SRDEgPj4gaSpCSVRTX1BFUl9CWVRFKSAmIE1BU0tfQllURTA7 CisJZm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBpKyspCisJCWNoZWNrc3VtICs9IChm cmFtZTIuZnIyX3ZhbCA+PiBpKkJJVFNfUEVSX0JZVEUpICYgTUFTS19CWVRFMDsKKwlmb3IgKGkg PSAwOyBpIDwgQllURVNfUEVSX1dPUkQ7IGkrKykKKwkJY2hlY2tzdW0gKz0gKGZyYW1lMy5mcjNf dmFsID4+IGkqQklUU19QRVJfQllURSkgJiBNQVNLX0JZVEUwOworCisJZnJhbWUyLmZyMl9yZWd4 LmNoa3N1bSA9IC0oY2hlY2tzdW0pOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JV19J TkZPRlIsIElORk9fRlJBTUVfV09SRDEpOworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSVdf SU5GT0ZSLCBmcmFtZTIuZnIyX3ZhbCk7CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JV19J TkZPRlIsIGZyYW1lMy5mcjNfdmFsKTsKKworCS8qIHByb2dyYW0gcmVtYWluaW5nIERJUCB3b3Jk cyB3aXRoIHplcm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgSEFEX01BWF9ESVBfV09SRFMtVkFMSURf RElQX1dPUkRTOyBpKyspCisJCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSVdfSU5GT0ZSLCAw eDApOworCisJY3RybF9zdGF0ZS5jdHJsX3JlZ3guZGlwX2ZyZXEgPSAxOworCWN0cmxfc3RhdGUu Y3RybF9yZWd4LmRpcF9lbl9zdGEgPSAxOworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfQ05UTF9T VCwgY3RybF9zdGF0ZS5jdHJsX3ZhbCk7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX3Byb2df ZGlwX3YyIC0gdG8gaW5pdGlhbGl6ZSBEYXRhIElzbGFuZCBQYWNrZXRzIHJlZ2lzdGVycworICoK KyAqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgcHJlcGFyZSBmdW5jdGlvbiBp cyBjYWxsZWQKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3RyZWFtIHByaXZhdGUgZGF0YQorICoKKyAq IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwcmVwYXJlIGNhbGxiYWNrCisgKi8KK3N0 YXRpYyB2b2lkIHNuZF9pbnRlbGhhZF9wcm9nX2RpcF92MihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJl YW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7 CisJaW50IGk7CisJdW5pb24gYXVkX2N0cmxfc3QgY3RybF9zdGF0ZSA9IHsuY3RybF92YWwgPSAw fTsKKwl1bmlvbiBhdWRfaW5mb19mcmFtZTIgZnJhbWUyID0gey5mcjJfdmFsID0gMH07CisJdW5p b24gYXVkX2luZm9fZnJhbWUzIGZyYW1lMyA9IHsuZnIzX3ZhbCA9IDB9OworCXU4IGNoZWNrc3Vt ID0gMDsKKwlpbnQgY2hhbm5lbHM7CisKKwljaGFubmVscyA9IHN1YnN0cmVhbS0+cnVudGltZS0+ Y2hhbm5lbHM7CisKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0NOVExfU1QsIGN0cmxfc3RhdGUu Y3RybF92YWwpOworCisJZnJhbWUyLmZyMl9yZWd4LmNobmxfY250ID0gc3Vic3RyZWFtLT5ydW50 aW1lLT5jaGFubmVscyAtIDE7CisKKwlmcmFtZTMuZnIzX3JlZ3guY2hubF9hbGxvYyA9IHNuZF9p bnRlbGhhZF9jaGFubmVsX2FsbG9jYXRpb24oCisJCQkJCWludGVsaGFkZGF0YSwgY2hhbm5lbHMp OworCisJLypDYWxjdWx0ZSB0aGUgYnl0ZSB3aWRlIGNoZWNrc3VtIGZvciBhbGwgdmFsaWQgRElQ IHdvcmRzKi8KKwlmb3IgKGkgPSAwOyBpIDwgQllURVNfUEVSX1dPUkQ7IGkrKykKKwkJY2hlY2tz dW0gKz0gKElORk9fRlJBTUVfV09SRDEgPj4gaSpCSVRTX1BFUl9CWVRFKSAmIE1BU0tfQllURTA7 CisJZm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBpKyspCisJCWNoZWNrc3VtICs9IChm cmFtZTIuZnIyX3ZhbCA+PiBpKkJJVFNfUEVSX0JZVEUpICYgTUFTS19CWVRFMDsKKwlmb3IgKGkg PSAwOyBpIDwgQllURVNfUEVSX1dPUkQ7IGkrKykKKwkJY2hlY2tzdW0gKz0gKGZyYW1lMy5mcjNf dmFsID4+IGkqQklUU19QRVJfQllURSkgJiBNQVNLX0JZVEUwOworCisJZnJhbWUyLmZyMl9yZWd4 LmNoa3N1bSA9IC0oY2hlY2tzdW0pOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JV19J TkZPRlJfdjIsIElORk9fRlJBTUVfV09SRDEpOworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERN SVdfSU5GT0ZSX3YyLCBmcmFtZTIuZnIyX3ZhbCk7CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9I RE1JV19JTkZPRlJfdjIsIGZyYW1lMy5mcjNfdmFsKTsKKworCS8qIHByb2dyYW0gcmVtYWluaW5n IERJUCB3b3JkcyB3aXRoIHplcm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgSEFEX01BWF9ESVBfV09S RFMtVkFMSURfRElQX1dPUkRTOyBpKyspCisJCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSVdf SU5GT0ZSX3YyLCAweDApOworCisJY3RybF9zdGF0ZS5jdHJsX3JlZ3guZGlwX2ZyZXEgPSAxOwor CWN0cmxfc3RhdGUuY3RybF9yZWd4LmRpcF9lbl9zdGEgPSAxOworCWhhZF93cml0ZV9yZWdpc3Rl cihBVURfQ05UTF9TVCwgY3RybF9zdGF0ZS5jdHJsX3ZhbCk7Cit9CisKKy8qKgorICogc25kX2lu dGVsaGFkX3Byb2dfYnVmZmVyIC0gcHJvZ3JhbXMgYnVmZmVyCisgKiBhZGRyZXNzIGFuZCBsZW5n dGggcmVnaXN0ZXJzCisgKgorICogQHN1YnN0cmVhbTpzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBw cmVwYXJlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogQGludGVsaGFkZGF0YTpzdWJzdHJlYW0gcHJp dmF0ZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBwcm9ncmFtcyByaW5nIGJ1ZmZlciBhZGRy ZXNzIGFuZCBsZW5ndGggaW50byByZWdpc3RlcnMuCisgKi8KK2ludCBzbmRfaW50ZWxoYWRfcHJv Z19idWZmZXIoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhLAorCQkJCQlpbnQgc3Rh cnQsIGludCBlbmQpCit7CisJdTMyIHJpbmdfYnVmX2FkZHIsIHJpbmdfYnVmX3NpemUsIHBlcmlv ZF9ieXRlczsKKwl1OCBpLCBudW1fcGVyaW9kczsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0g KnN1YnN0cmVhbTsKKworCXN1YnN0cmVhbSA9IGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uaGFk X3N1YnN0cmVhbTsKKwlpZiAoIXN1YnN0cmVhbSkgeworCQlwcl9lcnIoInN1YnN0cmVhbSBpcyBO VUxMXG4iKTsKKwkJZHVtcF9zdGFjaygpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyaW5nX2J1Zl9h ZGRyID0gc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYWRkcjsKKwlyaW5nX2J1Zl9zaXplID0gc25k X3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJaW50ZWxoYWRkYXRhLT5zdHJlYW1f aW5mby5yaW5nX2J1Zl9zaXplID0gcmluZ19idWZfc2l6ZTsKKwlwZXJpb2RfYnl0ZXMgPSBmcmFt ZXNfdG9fYnl0ZXMoc3Vic3RyZWFtLT5ydW50aW1lLAorCQkJCXN1YnN0cmVhbS0+cnVudGltZS0+ cGVyaW9kX3NpemUpOworCW51bV9wZXJpb2RzID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2Rz OworCisJLyoKKwkgKiBidWZmZXIgYWRkciBzaG91bGQgIGJlIDY0IGJ5dGUgYWxpZ25lZCwgcGVy aW9kIGJ5dGVzCisJICogd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSBhZGRyIG9mZnNldAorCSAq LworCXBlcmlvZF9ieXRlcyAmPSB+MHgzRjsKKworCS8qIEhhcmR3YXJlIHN1cHBvcnRzIE1BWF9Q RVJJT0RTIGJ1ZmZlcnMgKi8KKwlpZiAoZW5kID49IEhBRF9NQVhfUEVSSU9EUykKKwkJcmV0dXJu IC1FSU5WQUw7CisKKwlmb3IgKGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykgeworCQkvKiBQcm9n cmFtIHRoZSBidWYgcmVnaXN0ZXJzIHdpdGggYWRkciBhbmQgbGVuICovCisJCWludGVsaGFkZGF0 YS0+YnVmX2luZm9baV0uYnVmX2FkZHIgPSByaW5nX2J1Zl9hZGRyICsKKwkJCQkJCQkgKGkgKiBw ZXJpb2RfYnl0ZXMpOworCQlpZiAoaSA8IG51bV9wZXJpb2RzLTEpCisJCQlpbnRlbGhhZGRhdGEt PmJ1Zl9pbmZvW2ldLmJ1Zl9zaXplID0gcGVyaW9kX2J5dGVzOworCQllbHNlCisJCQlpbnRlbGhh ZGRhdGEtPmJ1Zl9pbmZvW2ldLmJ1Zl9zaXplID0gcmluZ19idWZfc2l6ZSAtCisJCQkJCQkJKHBl cmlvZF9ieXRlcyppKTsKKworCQloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9BX0FERFIgKyAo aSAqIEhBRF9SRUdfV0lEVEgpLAorCQkJCQlpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2ldLmJ1Zl9h ZGRyIHwKKwkJCQkJQklUKDApIHwgQklUKDEpKTsKKwkJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9C VUZfQV9MRU5HVEggKyAoaSAqIEhBRF9SRUdfV0lEVEgpLAorCQkJCQlwZXJpb2RfYnl0ZXMpOwor CQlpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2ldLmlzX3ZhbGlkID0gdHJ1ZTsKKwl9CisJcHJfZGVi dWcoIiVzOmJ1ZlslZC0lZF0gYWRkcj0lI3ggIGFuZCBzaXplPSVkXG4iLCBfX2Z1bmNfXywgc3Rh cnQsIGVuZCwKKwkJCWludGVsaGFkZGF0YS0+YnVmX2luZm9bc3RhcnRdLmJ1Zl9hZGRyLAorCQkJ aW50ZWxoYWRkYXRhLT5idWZfaW5mb1tzdGFydF0uYnVmX3NpemUpOworCWludGVsaGFkZGF0YS0+ dmFsaWRfYnVmX2NudCA9IG51bV9wZXJpb2RzOworCXJldHVybiAwOworfQorCitpbmxpbmUgaW50 IHNuZF9pbnRlbGhhZF9yZWFkX2xlbihzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEp Cit7CisJaW50IGksIHJldHZhbCA9IDA7CisJdTMyIGxlbls0XTsKKworCWZvciAoaSA9IDA7IGkg PCA0IDsgaSsrKSB7CisJCWhhZF9yZWFkX3JlZ2lzdGVyKEFVRF9CVUZfQV9MRU5HVEggKyAoaSAq IEhBRF9SRUdfV0lEVEgpLAorCQkJCQkmbGVuW2ldKTsKKwkJaWYgKCFsZW5baV0pCisJCQlyZXR2 YWwrKzsKKwl9CisJaWYgKHJldHZhbCAhPSAxKSB7CisJCWZvciAoaSA9IDA7IGkgPCA0IDsgaSsr KQorCQkJcHJfZGVidWcoImJ1ZlslZF0gc2l6ZT0lZFxuIiwgaSwgbGVuW2ldKTsKKwl9CisKKwly ZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9wcm9nX2N0c192MSAtIFBy b2dyYW0gSERNSSBhdWRpbyBDVFMgdmFsdWUKKyAqCisgKiBAYXVkX3NhbXBfZnJlcTogc2FtcGxp bmcgZnJlcXVlbmN5IG9mIGF1ZGlvIGRhdGEKKyAqIEB0bWRzOiBzYW1wbGluZyBmcmVxdWVuY3kg b2YgdGhlIGRpc3BsYXkgZGF0YQorICogQG5fcGFyYW06IE4gdmFsdWUsIGRlcGVuZHMgb24gYXVk X3NhbXBfZnJlcQorICogQGludGVsaGFkZGF0YTpzdWJzdHJlYW0gcHJpdmF0ZSBkYXRhCisgKgor ICogUHJvZ3JhbSBDVFMgcmVnaXN0ZXIgYmFzZWQgb24gdGhlIGF1ZGlvIGFuZCBkaXNwbGF5IHNh bXBsaW5nIGZyZXF1ZW5jeQorICovCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRfcHJvZ19jdHNf djEodTMyIGF1ZF9zYW1wX2ZyZXEsIHUzMiB0bWRzLCB1MzIgbl9wYXJhbSwKKwkJCQlzdHJ1Y3Qg c25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJdTMyIGN0c192YWw7CisJdTY0IGRpdmlk ZW5kLCBkaXZpc29yOworCisJLyogQ2FsY3VsYXRlIENUUyBhY2NvcmRpbmcgdG8gSERNSSAxLjNh IHNwZWMqLworCWRpdmlkZW5kID0gKHU2NCl0bWRzICogbl9wYXJhbSoxMDAwOworCWRpdmlzb3Ig PSAxMjggKiBhdWRfc2FtcF9mcmVxOworCWN0c192YWwgPSBkaXY2NF91NjQoZGl2aWRlbmQsIGRp dmlzb3IpOworCXByX2RlYnVnKCJUTURTIHZhbHVlPSVkLCBOIHZhbHVlPSVkLCBDVFMgVmFsdWU9 JWRcbiIsCisJCQl0bWRzLCBuX3BhcmFtLCBjdHNfdmFsKTsKKwloYWRfd3JpdGVfcmVnaXN0ZXIo QVVEX0hETUlfQ1RTLCAoQklUKDIwKSB8IGN0c192YWwpKTsKK30KKworLyoqCisgKiBzbmRfaW50 ZWxoYWRfcHJvZ19jdHNfdjIgLSBQcm9ncmFtIEhETUkgYXVkaW8gQ1RTIHZhbHVlCisgKgorICog QGF1ZF9zYW1wX2ZyZXE6IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiBhdWRpbyBkYXRhCisgKiBAdG1k czogc2FtcGxpbmcgZnJlcXVlbmN5IG9mIHRoZSBkaXNwbGF5IGRhdGEKKyAqIEBuX3BhcmFtOiBO IHZhbHVlLCBkZXBlbmRzIG9uIGF1ZF9zYW1wX2ZyZXEKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3Ry ZWFtIHByaXZhdGUgZGF0YQorICoKKyAqIFByb2dyYW0gQ1RTIHJlZ2lzdGVyIGJhc2VkIG9uIHRo ZSBhdWRpbyBhbmQgZGlzcGxheSBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworc3RhdGljIHZvaWQg c25kX2ludGVsaGFkX3Byb2dfY3RzX3YyKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgdG1kcywgdTMy IG5fcGFyYW0sCisJCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXUz MiBjdHNfdmFsOworCXU2NCBkaXZpZGVuZCwgZGl2aXNvcjsKKworCS8qIENhbGN1bGF0ZSBDVFMg YWNjb3JkaW5nIHRvIEhETUkgMS4zYSBzcGVjKi8KKwlkaXZpZGVuZCA9ICh1NjQpdG1kcyAqIG5f cGFyYW0qMTAwMDsKKwlkaXZpc29yID0gMTI4ICogYXVkX3NhbXBfZnJlcTsKKwljdHNfdmFsID0g ZGl2NjRfdTY0KGRpdmlkZW5kLCBkaXZpc29yKTsKKwlwcl9kZWJ1ZygiVE1EUyB2YWx1ZT0lZCwg TiB2YWx1ZT0lZCwgQ1RTIFZhbHVlPSVkXG4iLAorCQkJdG1kcywgbl9wYXJhbSwgY3RzX3ZhbCk7 CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX0NUUywgKEJJVCgyNCkgfCBjdHNfdmFsKSk7 Cit9CisKK3N0YXRpYyBpbnQgaGFkX2NhbGN1bGF0ZV9uX3ZhbHVlKHUzMiBhdWRfc2FtcF9mcmVx KQoreworCXMzMiBuX3ZhbDsKKworCS8qIFNlbGVjdCBOIGFjY29yZGluZyB0byBIRE1JIDEuM2Eg c3BlYyovCisJc3dpdGNoIChhdWRfc2FtcF9mcmVxKSB7CisJY2FzZSBBVURfU0FNUExFX1JBVEVf MzI6CisJCW5fdmFsID0gNDA5NjsKKwlicmVhazsKKworCWNhc2UgQVVEX1NBTVBMRV9SQVRFXzQ0 XzE6CisJCW5fdmFsID0gNjI3MjsKKwlicmVhazsKKworCWNhc2UgQVVEX1NBTVBMRV9SQVRFXzQ4 OgorCQluX3ZhbCA9IDYxNDQ7CisJYnJlYWs7CisKKwljYXNlIEFVRF9TQU1QTEVfUkFURV84OF8y OgorCQluX3ZhbCA9IDEyNTQ0OworCWJyZWFrOworCisJY2FzZSBBVURfU0FNUExFX1JBVEVfOTY6 CisJCW5fdmFsID0gMTIyODg7CisJYnJlYWs7CisKKwljYXNlIEFVRF9TQU1QTEVfUkFURV8xNzZf NDoKKwkJbl92YWwgPSAyNTA4ODsKKwlicmVhazsKKworCWNhc2UgSEFEX01BWF9SQVRFOgorCQlu X3ZhbCA9IDI0NTc2OworCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbl92YWwgPSAtRUlOVkFMOwor CWJyZWFrOworCX0KKwlyZXR1cm4gbl92YWw7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX3By b2dfbl92MSAtIFByb2dyYW0gSERNSSBhdWRpbyBOIHZhbHVlCisgKgorICogQGF1ZF9zYW1wX2Zy ZXE6IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiBhdWRpbyBkYXRhCisgKiBAbl9wYXJhbTogTiB2YWx1 ZSwgZGVwZW5kcyBvbiBhdWRfc2FtcF9mcmVxCisgKiBAaW50ZWxoYWRkYXRhOnN1YnN0cmVhbSBw cml2YXRlIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgcHJlcGFy ZSBjYWxsYmFjay4KKyAqIEl0IHByb2dyYW1zIGJhc2VkIG9uIHRoZSBhdWRpbyBhbmQgZGlzcGxh eSBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCBzbmRfaW50ZWxoYWRfcHJvZ19u X3YxKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgKm5fcGFyYW0sCisJCQkJc3RydWN0IHNuZF9pbnRl bGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXMzMiBuX3ZhbDsKKworCW5fdmFsID0JaGFkX2NhbGN1 bGF0ZV9uX3ZhbHVlKGF1ZF9zYW1wX2ZyZXEpOworCisJaWYgKG5fdmFsIDwgMCkKKwkJcmV0dXJu IG5fdmFsOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9OX0VOQUJMRSwgKEJJVCgyMCkgfCBu X3ZhbCkpOworCSpuX3BhcmFtID0gbl92YWw7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc25k X2ludGVsaGFkX3Byb2dfbl92MiAtIFByb2dyYW0gSERNSSBhdWRpbyBOIHZhbHVlCisgKgorICog QGF1ZF9zYW1wX2ZyZXE6IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiBhdWRpbyBkYXRhCisgKiBAbl9w YXJhbTogTiB2YWx1ZSwgZGVwZW5kcyBvbiBhdWRfc2FtcF9mcmVxCisgKiBAaW50ZWxoYWRkYXRh OnN1YnN0cmVhbSBwcml2YXRlIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBp biB0aGUgcHJlcGFyZSBjYWxsYmFjay4KKyAqIEl0IHByb2dyYW1zIGJhc2VkIG9uIHRoZSBhdWRp byBhbmQgZGlzcGxheSBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCBzbmRfaW50 ZWxoYWRfcHJvZ19uX3YyKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgKm5fcGFyYW0sCisJCQkJc3Ry dWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXMzMiBuX3ZhbDsKKworCW5fdmFs ID0JaGFkX2NhbGN1bGF0ZV9uX3ZhbHVlKGF1ZF9zYW1wX2ZyZXEpOworCisJaWYgKG5fdmFsIDwg MCkKKwkJcmV0dXJuIG5fdmFsOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9OX0VOQUJMRSwg KEJJVCgyNCkgfCBuX3ZhbCkpOworCSpuX3BhcmFtID0gbl92YWw7CisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyB2b2lkIGhhZF9jbGVhcl91bmRlcnJ1bl9pbnRyX3YxKHN0cnVjdCBzbmRfaW50ZWxo YWQgKmludGVsaGFkZGF0YSkKK3sKKwl1MzIgaGRtaV9zdGF0dXMsIGkgPSAwOworCisJLyogSGFu ZGxlIFVuZGVycnVuIGludGVycnVwdCB3aXRoaW4gQXVkaW8gVW5pdCAqLworCWhhZF93cml0ZV9y ZWdpc3RlcihBVURfQ09ORklHLCAwKTsKKwkvKiBSZXNldCBidWZmZXIgcG9pbnRlcnMgKi8KKwlo YWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTLCAxKTsKKwloYWRfd3JpdGVfcmVnaXN0 ZXIoQVVEX0hETUlfU1RBVFVTLCAwKTsKKwkvKioKKwkgKiBUaGUgaW50ZXJydXB0IHN0YXR1cyAn c3RpY2t5JyBiaXRzIG1pZ2h0IG5vdCBiZSBjbGVhcmVkIGJ5CisJICogc2V0dGluZyAnMScgdG8g dGhhdCBiaXQgb25jZS4uLgorCSAqLworCWRvIHsgLyogY2xlYXIgYml0MzAsIDMxIEFVRF9IRE1J X1NUQVRVUyAqLworCQloYWRfcmVhZF9yZWdpc3RlcihBVURfSERNSV9TVEFUVVMsICZoZG1pX3N0 YXR1cyk7CisJCXByX2RlYnVnKCJIRE1JIHN0YXR1cyA9MHgleFxuIiwgaGRtaV9zdGF0dXMpOwor CQlpZiAoaGRtaV9zdGF0dXMgJiBBVURfQ09ORklHX01BU0tfVU5ERVJSVU4pIHsKKwkJCWkrKzsK KwkJCWhkbWlfc3RhdHVzICY9IChBVURfQ09ORklHX01BU0tfU1JEQkcgfAorCQkJCQlBVURfQ09O RklHX01BU0tfRlVOQ1JTVCk7CisJCQloZG1pX3N0YXR1cyB8PSB+QVVEX0NPTkZJR19NQVNLX1VO REVSUlVOOworCQkJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX1NUQVRVUywgaGRtaV9zdGF0 dXMpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0gd2hpbGUgKGkgPCBNQVhfQ05UKTsKKwlpZiAo aSA+PSBNQVhfQ05UKQorCQlwcl9lcnIoIlVuYWJsZSB0byBjbGVhciBVTkRFUlJVTiBiaXRzXG4i KTsKK30KKworc3RhdGljIHZvaWQgaGFkX2NsZWFyX3VuZGVycnVuX2ludHJfdjIoc3RydWN0IHNu ZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXUzMiBoZG1pX3N0YXR1cywgaSA9IDA7CisK KwkvKiBIYW5kbGUgVW5kZXJydW4gaW50ZXJydXB0IHdpdGhpbiBBdWRpbyBVbml0ICovCisJaGFk X3dyaXRlX3JlZ2lzdGVyKEFVRF9DT05GSUcsIDApOworCS8qIFJlc2V0IGJ1ZmZlciBwb2ludGVy cyAqLworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSV9TVEFUVVNfdjIsIDEpOworCWhhZF93 cml0ZV9yZWdpc3RlcihBVURfSERNSV9TVEFUVVNfdjIsIDApOworCS8qKgorCSAqIFRoZSBpbnRl cnJ1cHQgc3RhdHVzICdzdGlja3knIGJpdHMgbWlnaHQgbm90IGJlIGNsZWFyZWQgYnkKKwkgKiBz ZXR0aW5nICcxJyB0byB0aGF0IGJpdCBvbmNlLi4uCisJICovCisJZG8geyAvKiBjbGVhciBiaXQz MCwgMzEgQVVEX0hETUlfU1RBVFVTICovCisJCWhhZF9yZWFkX3JlZ2lzdGVyKEFVRF9IRE1JX1NU QVRVU192MiwgJmhkbWlfc3RhdHVzKTsKKwkJcHJfZGVidWcoIkhETUkgc3RhdHVzID0weCV4XG4i LCBoZG1pX3N0YXR1cyk7CisJCWlmIChoZG1pX3N0YXR1cyAmIEFVRF9DT05GSUdfTUFTS19VTkRF UlJVTikgeworCQkJaSsrOworCQkJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX1NUQVRVU192 MiwgaGRtaV9zdGF0dXMpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0gd2hpbGUgKGkgPCBNQVhf Q05UKTsKKwlpZiAoaSA+PSBNQVhfQ05UKQorCQlwcl9lcnIoIlVuYWJsZSB0byBjbGVhciBVTkRF UlJVTiBiaXRzXG4iKTsKK30KKworLyoqCisqIHNuZF9pbnRlbGhhZF9vcGVuIC0gc3RyZWFtIGlu aXRpYWxpemF0aW9ucyBhcmUgZG9uZSBoZXJlCisqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3 aGljaCB0aGUgc3RyZWFtIGZ1bmN0aW9uIGlzIGNhbGxlZAorKgorKiBUaGlzIGZ1bmN0aW9uIGlz IGNhbGxlZCB3aGVuZXZlciBhIFBDTSBzdHJlYW0gaXMgb3BlbmVkCisqLworc3RhdGljIGludCBz bmRfaW50ZWxoYWRfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sK KwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisJc3RydWN0IHNuZF9wY21fcnVu dGltZSAqcnVudGltZTsKKwlzdHJ1Y3QgaGFkX3N0cmVhbV9wdnQgKnN0cmVhbTsKKwlzdHJ1Y3Qg aGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCWludCByZXR2YWw7CisKKwlwcl9kZWJ1Zygic25k X2ludGVsaGFkX29wZW4gY2FsbGVkXG4iKTsKKwlpbnRlbGhhZGRhdGEgPSBzbmRfcGNtX3N1YnN0 cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0YS0+cHJpdmF0 ZV9kYXRhOworCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlwbV9ydW50aW1lX2dl dChpbnRlbGhhZGRhdGEtPmRldik7CisKKwlpZiAoaGFkX2dldF9od3N0YXRlKGludGVsaGFkZGF0 YSkpIHsKKwkJcHJfZXJyKCIlczogSERNSSBjYWJsZSBwbHVnZ2VkLW91dFxuIiwgX19mdW5jX18p OworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfcHV0X2hhbmRsZTsKKwl9CisKKwkv KiBDaGVjaywgaWYgZGV2aWNlIGFscmVhZHkgaW4gdXNlICovCisJaWYgKHJ1bnRpbWUtPnByaXZh dGVfZGF0YSkgeworCQlwcl9lcnIoIkRldmljZSBhbHJlYWR5IGluIHVzZVxuIik7CisJCXJldHZh bCA9IC1FQlVTWTsKKwkJZ290byBleGl0X3B1dF9oYW5kbGU7CisJfQorCisJLyogc2V0IHRoZSBy dW50aW1lIGh3IHBhcmFtZXRlciB3aXRoIGxvY2FsIHNuZF9wY21faGFyZHdhcmUgc3RydWN0ICov CisJcnVudGltZS0+aHcgPSBzbmRfaW50ZWxfaGFkc3RyZWFtOworCisJc3RyZWFtID0ga3phbGxv YyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOworCWlmICghc3RyZWFtKSB7CisJCXJldHZh bCA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9wdXRfaGFuZGxlOworCX0KKwlzdHJlYW0tPnN0cmVh bV9zdGF0dXMgPSBTVFJFQU1fSU5JVDsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBzdHJlYW07 CisKKwlyZXR2YWwgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAorCQkJ IFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBl eGl0X2VycjsKKworCS8qIE1ha2Ugc3VyZSwgdGhhdCB0aGUgcGVyaW9kIHNpemUgaXMgYWx3YXlz IGFsaWduZWQKKwkgKiA2NGJ5dGUgYm91bmRhcnkKKwkgKi8KKwlyZXR2YWwgPSBzbmRfcGNtX2h3 X2NvbnN0cmFpbnRfc3RlcChzdWJzdHJlYW0tPnJ1bnRpbWUsIDAsCisJCQlTTkRSVl9QQ01fSFdf UEFSQU1fUEVSSU9EX0JZVEVTLCA2NCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcHJfZXJyKCIl czpzdGVwX3NpemU9NjQgZmFpbGVkLGVycj0lZFxuIiwgX19mdW5jX18sIHJldHZhbCk7CisJCWdv dG8gZXhpdF9lcnI7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK2V4aXRfZXJyOgorCWtmcmVlKHN0 cmVhbSk7CitleGl0X3B1dF9oYW5kbGU6CisJcG1fcnVudGltZV9wdXQoaW50ZWxoYWRkYXRhLT5k ZXYpOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcmV0dXJuIHJldHZhbDsKK30K KworLyoqCisqIGhhZF9wZXJpb2RfZWxhcHNlZCAtIHVwZGF0ZXMgdGhlIGhhcmR3YXJlIHBvaW50 ZXIgc3RhdHVzCisqIEBoYWRfc3Vic3RyZWFtOnN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIHN0cmVh bSBmdW5jdGlvbiBpcyBjYWxsZWQKKyoKKyovCitzdGF0aWMgdm9pZCBoYWRfcGVyaW9kX2VsYXBz ZWQodm9pZCAqaGFkX3N1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1 YnN0cmVhbSA9IGhhZF9zdWJzdHJlYW07CisJc3RydWN0IGhhZF9zdHJlYW1fcHZ0ICpzdHJlYW07 CisKKwkvKiBwcl9kZWJ1ZygiaGFkX3BlcmlvZF9lbGFwc2VkIGNhbGxlZFxuIik7ICovCisKKwlp ZiAoIXN1YnN0cmVhbSB8fCAhc3Vic3RyZWFtLT5ydW50aW1lKQorCQlyZXR1cm47CisJc3RyZWFt ID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaWYgKCFzdHJlYW0pCisJCXJl dHVybjsKKworCWlmIChzdHJlYW0tPnN0cmVhbV9zdGF0dXMgIT0gU1RSRUFNX1JVTk5JTkcpCisJ CXJldHVybjsKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Cit9CisKKy8qKgor KiBzbmRfaW50ZWxoYWRfaW5pdF9zdHJlYW0gLSBpbnRlcm5hbCBmdW5jdGlvbiB0byBpbml0aWFs aXplIHN0cmVhbSBpbmZvCisqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgc3Ry ZWFtIGZ1bmN0aW9uIGlzIGNhbGxlZAorKgorKi8KK3N0YXRpYyBpbnQgc25kX2ludGVsaGFkX2lu aXRfc3RyZWFtKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVj dCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vi c3RyZWFtKTsKKworCXByX2RlYnVnKCJzbmRfaW50ZWxoYWRfaW5pdF9zdHJlYW0gY2FsbGVkXG4i KTsKKworCXByX2RlYnVnKCJzZXR0aW5nIGJ1ZmZlciBwdHIgcGFyYW1cbiIpOworCWludGVsaGFk ZGF0YS0+c3RyZWFtX2luZm8ucGVyaW9kX2VsYXBzZWQgPSBoYWRfcGVyaW9kX2VsYXBzZWQ7CisJ aW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCWlu dGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3B0ciA9IDA7CisJaW50ZWxoYWRkYXRhLT5z dHJlYW1faW5mby5idWZmZXJfcmVuZGVyZWQgPSAwOworCWludGVsaGFkZGF0YS0+c3RyZWFtX2lu Zm8uc2ZyZXEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGU7CisJcmV0dXJuIDA7Cit9CisKKy8q KgorICogc25kX2ludGVsaGFkX2Nsb3NlLSB0byBmcmVlIHBhcmFtZXRlcmVzIHdoZW4gc3RyZWFt IGlzIHN0b3BwZWQKKyAqCisgKiBAc3Vic3RyZWFtOiAgc3Vic3RyZWFtIGZvciB3aGljaCB0aGUg ZnVuY3Rpb24gaXMgY2FsbGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQUxT QSBmcmFtZXdvcmsgd2hlbiBzdHJlYW0gaXMgc3RvcHBlZAorICovCitzdGF0aWMgaW50IHNuZF9p bnRlbGhhZF9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlz dHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisJc3RydWN0IHNuZF9wY21fcnVudGlt ZSAqcnVudGltZTsKKworCXByX2RlYnVnKCJzbmRfaW50ZWxoYWRfY2xvc2UgY2FsbGVkXG4iKTsK KworCWludGVsaGFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwly dW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJaWYgKCFydW50aW1lLT5wcml2YXRlX2Rh dGEpIHsKKwkJcHJfZGVidWcoImNsb3NlKCkgbWlnaHQgaGF2ZSBjYWxsZWQgYWZ0ZXIgZmFpbGVk IG9wZW4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5i dWZmZXJfcmVuZGVyZWQgPSAwOworCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3B0 ciA9IDA7CisJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5zdHJfaWQgPSAwOworCWludGVsaGFk ZGF0YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVhbSA9IE5VTEw7CisKKwkvKiBDaGVjayBpZiBm b2xsb3dpbmcgZHJ2X3N0YXR1cyBtb2RpZmljYXRpb24gaXMgcmVxdWlyZWQgLSBWQSAqLworCWlm IChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgIT0gSEFEX0RSVl9ESVNDT05ORUNURUQpIHsKKwkJ aW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID0gSEFEX0RSVl9DT05ORUNURUQ7CisJCXByX2RlYnVn KCIlcyBAICVkOkRFQlVHIFBMVUcvVU5QTFVHIDogSEFEX0RSVl9DT05ORUNURURcbiIsCisJCQlf X2Z1bmNfXywgX19MSU5FX18pOworCX0KKwlrZnJlZShydW50aW1lLT5wcml2YXRlX2RhdGEpOwor CXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcG1fcnVudGltZV9wdXQoaW50ZWxoYWRk YXRhLT5kZXYpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9od19wYXJh bXMtIHRvIHNldHVwIHRoZSBoYXJkd2FyZSBwYXJhbWV0ZXJzCisgKiBsaWtlIGFsbG9jYXRpbmcg dGhlIGJ1ZmZlcnMKKyAqCisgKiBAc3Vic3RyZWFtOiAgc3Vic3RyZWFtIGZvciB3aGljaCB0aGUg ZnVuY3Rpb24gaXMgY2FsbGVkCisgKiBAaHdfcGFyYW1zOiBoYXJkd2FyZSBwYXJhbWV0ZXJzCisg KgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQUxTQSBmcmFtZXdvcmsgd2hlbiBoYXJk d2FyZSBwYXJhbXMgYXJlIHNldAorICovCitzdGF0aWMgaW50IHNuZF9pbnRlbGhhZF9od19wYXJh bXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJICAgIHN0cnVjdCBz bmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlp bnQgcGFnZXMsIGJ1Zl9zaXplLCByZXR2YWw7CisKKwlwcl9kZWJ1Zygic25kX2ludGVsaGFkX2h3 X3BhcmFtcyBjYWxsZWRcbiIpOworCisJaWYgKCFod19wYXJhbXMpCisJCXJldHVybiAtRUlOVkFM OworCisJYnVmX3NpemUgPSBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcyk7CisJcmV0dmFs ID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgYnVmX3NpemUpOworCWlmIChy ZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCXByX2RlYnVnKCIlczphbGxvY2F0ZWQgbWVt b3J5ID0gJWRcbiIsIF9fZnVuY19fLCBidWZfc2l6ZSk7CisJLyogbWFyayB0aGUgcGFnZXMgYXMg dW5jYWNoZWQgcmVnaW9uICovCisJYWRkciA9ICh1bnNpZ25lZCBsb25nKSBzdWJzdHJlYW0tPnJ1 bnRpbWUtPmRtYV9hcmVhOworCXBhZ2VzID0gKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2J5dGVz ICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJcmV0dmFsID0gc2V0X21lbW9yeV91Yyhh ZGRyLCBwYWdlcyk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoInNldF9tZW1vcnlfdWMgZmFp bGVkLkVycm9yOiVkXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwltZW1zZXQo c3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSwgMCwgYnVmX3NpemUpOworCisJcmV0dXJuIHJl dHZhbDsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfaHdfZnJlZS0gdG8gcmVsZWFzZSB0aGUg cmVzb3VyY2VzIGFsbG9jYXRlZCBkdXJpbmcKKyAqIGhhcmR3YXJlIHBhcmFtcyBzZXR1cAorICoK KyAqIEBzdWJzdHJlYW06ICBzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBjYWxs ZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBBTFNBIGZyYW1ld29yayBiZWZv cmUgY2xvc2UgY2FsbGJhY2suCisgKgorICovCitzdGF0aWMgaW50IHNuZF9pbnRlbGhhZF9od19m cmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXVuc2lnbmVkIGxv bmcgYWRkcjsKKwl1MzIgcGFnZXM7CisKKwlwcl9kZWJ1Zygic25kX2ludGVsaGFkX2h3X2ZyZWUg Y2FsbGVkXG4iKTsKKworCS8qIG1hcmsgYmFjayB0aGUgcGFnZXMgYXMgY2FjaGVkL3dyaXRlYmFj ayByZWdpb24gYmVmb3JlIHRoZSBmcmVlICovCisJaWYgKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1h X2FyZWEgIT0gTlVMTCkgeworCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHN1YnN0cmVhbS0+cnVu dGltZS0+ZG1hX2FyZWE7CisJCXBhZ2VzID0gKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2J5dGVz ICsgUEFHRV9TSVpFIC0gMSkgLworCQkJCQkJCQlQQUdFX1NJWkU7CisJCXNldF9tZW1vcnlfd2Io YWRkciwgcGFnZXMpOworCQlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0p OworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisqIHNuZF9pbnRlbGhhZF9wY21fdHJpZ2dlciAt IHN0cmVhbSBhY3Rpdml0aWVzIGFyZSBoYW5kbGVkIGhlcmUKKyogQHN1YnN0cmVhbTpzdWJzdHJl YW0gZm9yIHdoaWNoIHRoZSBzdHJlYW0gZnVuY3Rpb24gaXMgY2FsbGVkCisqIEBjbWQ6dGhlIHN0 cmVhbSBjb21tYW1kIHRoYXRzIHJlcXVlc3RlZCBmcm9tIHVwcGVyIGxheWVyCisqIFRoaXMgZnVu Y3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGEgc3RyZWFtIGFjdGl2aXR5IGlzIGludm9rZWQK KyovCitzdGF0aWMgaW50IHNuZF9pbnRlbGhhZF9wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9z dWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJaW50IGNtZCkKK3sKKwlpbnQgY2FwcywgcmV0dmFs ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxOworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmlu dGVsaGFkZGF0YTsKKwlzdHJ1Y3QgaGFkX3N0cmVhbV9wdnQgKnN0cmVhbTsKKwlzdHJ1Y3QgaGFk X3B2dF9kYXRhICpoYWRfc3RyZWFtOworCisJcHJfZGVidWcoInNuZF9pbnRlbGhhZF9wY21fdHJp Z2dlciBjYWxsZWRcbiIpOworCisJaW50ZWxoYWRkYXRhID0gc25kX3BjbV9zdWJzdHJlYW1fY2hp cChzdWJzdHJlYW0pOworCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRh OworCWhhZF9zdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAo Y21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJcHJfZGVidWcoIlRyaWdn ZXIgU3RhcnRcbiIpOworCisJCS8qIERpc2FibGUgbG9jYWwgSU5UUnMgdGlsbCByZWdpc3RlciBw cmdtbmcgaXMgZG9uZSAqLworCQlpZiAoaGFkX2dldF9od3N0YXRlKGludGVsaGFkZGF0YSkpIHsK KwkJCXByX2VycigiX1NUQVJUOiBIRE1JIGNhYmxlIHBsdWdnZWQtb3V0XG4iKTsKKwkJCXJldHZh bCA9IC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQorCQlzdHJlYW0tPnN0cmVhbV9zdGF0dXMgPSBT VFJFQU1fUlVOTklORzsKKworCQloYWRfc3RyZWFtLT5zdHJlYW1fdHlwZSA9IEhBRF9SVU5OSU5H X1NUUkVBTTsKKworCQkvKiBFbmFibGUgQXVkaW8gKi8KKwkJLyoKKwkJICogVG9EbzogTmVlZCB0 byBlbmFibGUgVU5ERVJSVU4gaW50ZXJydXB0cyBhcyB3ZWxsCisJCSAqICAgY2FwcyA9IEhETUlf QVVESU9fVU5ERVJSVU4gfCBIRE1JX0FVRElPX0JVRkZFUl9ET05FOworCQkgKi8KKwkJY2FwcyA9 IEhETUlfQVVESU9fQlVGRkVSX0RPTkU7CisJCXJldHZhbCA9IGhhZF9zZXRfY2FwcyhIQURfU0VU X0VOQUJMRV9BVURJT19JTlQsICZjYXBzKTsKKwkJcmV0dmFsID0gaGFkX3NldF9jYXBzKEhBRF9T RVRfRU5BQkxFX0FVRElPLCBOVUxMKTsKKwkJaW50ZWxoYWRkYXRhLT5vcHMtPmVuYWJsZV9hdWRp byhzdWJzdHJlYW0sIDEpOworCisJCXByX2RlYnVnKCJQcm9jZXNzZWQgX1N0YXJ0XG4iKTsKKwor CQlicmVhazsKKworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJcHJfZGVidWcoIlRy aWdnZXIgU3RvcFxuIik7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9z cGlubG9jaywgZmxhZ19pcnEpOworCQlpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLnN0cl9pZCA9 IDA7CisJCWludGVsaGFkZGF0YS0+Y3Vycl9idWYgPSAwOworCisJCS8qIFN0b3AgcmVwb3J0aW5n IEJVRkZFUl9ET05FL1VOREVSUlVOIHRvIGFib3ZlIGxheWVycyovCisKKwkJaGFkX3N0cmVhbS0+ c3RyZWFtX3R5cGUgPSBIQURfSU5JVDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxo YWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxKTsKKwkJLyogRGlzYWJsZSBBdWRpbyAqLwor CQkvKgorCQkgKiBUb0RvOiBOZWVkIHRvIGRpc2FibGUgVU5ERVJSVU4gaW50ZXJydXB0cyBhcyB3 ZWxsCisJCSAqICAgY2FwcyA9IEhETUlfQVVESU9fVU5ERVJSVU4gfCBIRE1JX0FVRElPX0JVRkZF Ul9ET05FOworCQkgKi8KKwkJY2FwcyA9IEhETUlfQVVESU9fQlVGRkVSX0RPTkU7CisJCWhhZF9z ZXRfY2FwcyhIQURfU0VUX0RJU0FCTEVfQVVESU9fSU5ULCAmY2Fwcyk7CisJCWludGVsaGFkZGF0 YS0+b3BzLT5lbmFibGVfYXVkaW8oc3Vic3RyZWFtLCAwKTsKKwkJLyogUmVzZXQgYnVmZmVyIHBv aW50ZXJzICovCisJCWludGVsaGFkZGF0YS0+b3BzLT5yZXNldF9hdWRpbygxKTsKKwkJaW50ZWxo YWRkYXRhLT5vcHMtPnJlc2V0X2F1ZGlvKDApOworCQlzdHJlYW0tPnN0cmVhbV9zdGF0dXMgPSBT VFJFQU1fRFJPUFBFRDsKKwkJaGFkX3NldF9jYXBzKEhBRF9TRVRfRElTQUJMRV9BVURJTywgTlVM TCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwl9CisJcmV0 dXJuIHJldHZhbDsKK30KKworLyoqCisqIHNuZF9pbnRlbGhhZF9wY21fcHJlcGFyZS0gaW50ZXJu YWwgcHJlcGFyYXRpb24gYmVmb3JlIHN0YXJ0aW5nIGEgc3RyZWFtCisqCisqIEBzdWJzdHJlYW06 ICBzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyoKKyogVGhpcyBm dW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBzdGFydGVkIGZvciBpbnRlcm5hbCBw cmVwYXJhdGlvbi4KKyovCitzdGF0aWMgaW50IHNuZF9pbnRlbGhhZF9wY21fcHJlcGFyZShzdHJ1 Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlpbnQgcmV0dmFsOworCXUzMiBk aXNwX3NhbXBfZnJlcSwgbl9wYXJhbTsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRh dGE7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKKwlzdHJ1Y3QgaGFkX3B2dF9k YXRhICpoYWRfc3RyZWFtOworCisJcHJfZGVidWcoInNuZF9pbnRlbGhhZF9wY21fcHJlcGFyZSBj YWxsZWRcbiIpOworCisJaW50ZWxoYWRkYXRhID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJz dHJlYW0pOworCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJaGFkX3N0cmVhbSA9IGlu dGVsaGFkZGF0YS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGhhZF9nZXRfaHdzdGF0ZShpbnRlbGhh ZGRhdGEpKSB7CisJCXByX2VycigiJXM6IEhETUkgY2FibGUgcGx1Z2dlZC1vdXRcbiIsIF9fZnVu Y19fKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBwcmVwX2VuZDsKKwl9CisKKwlwcl9k ZWJ1ZygicGVyaW9kX3NpemU9JWRcbiIsCisJCShpbnQpZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUs IHJ1bnRpbWUtPnBlcmlvZF9zaXplKSk7CisJcHJfZGVidWcoInBlcmlvZHM9JWRcbiIsIHJ1bnRp bWUtPnBlcmlvZHMpOworCXByX2RlYnVnKCJidWZmZXJfc2l6ZT0lZFxuIiwgKGludClzbmRfcGNt X2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKSk7CisJcHJfZGVidWcoInJhdGU9JWRcbiIsIHJ1 bnRpbWUtPnJhdGUpOworCXByX2RlYnVnKCJjaGFubmVscz0lZFxuIiwgcnVudGltZS0+Y2hhbm5l bHMpOworCisJaWYgKGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uc3RyX2lkKSB7CisJCXByX2Rl YnVnKCJfcHJlcGFyZSBpcyBjYWxsZWQgZm9yIGV4aXN0aW5nIHN0cl9pZCMlZFxuIiwKKwkJCQkJ aW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5zdHJfaWQpOworCQlyZXR2YWwgPSBzbmRfaW50ZWxo YWRfcGNtX3RyaWdnZXIoc3Vic3RyZWFtLAorCQkJCQkJU05EUlZfUENNX1RSSUdHRVJfU1RPUCk7 CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dmFsID0gc25kX2ludGVsaGFkX2luaXRfc3Ry ZWFtKHN1YnN0cmVhbSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBwcmVwX2VuZDsKKworCisJLyog R2V0IE4gdmFsdWUgaW4gS0h6ICovCisJcmV0dmFsID0gaGFkX2dldF9jYXBzKEhBRF9HRVRfRElT UExBWV9SQVRFLCAmZGlzcF9zYW1wX2ZyZXEpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJx dWVyeWluZyBkaXNwbGF5IHNhbXBsaW5nIGZyZXEgZmFpbGVkICUjeFxuIiwgcmV0dmFsKTsKKwkJ Z290byBwcmVwX2VuZDsKKwl9CisKKwloYWRfZ2V0X2NhcHMoSEFEX0dFVF9FTEQsICZpbnRlbGhh ZGRhdGEtPmVlbGQpOworCisJcmV0dmFsID0gaW50ZWxoYWRkYXRhLT5vcHMtPnByb2dfbihzdWJz dHJlYW0tPnJ1bnRpbWUtPnJhdGUsICZuX3BhcmFtLAorCQkJCQkJCQlpbnRlbGhhZGRhdGEpOwor CWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJwcm9ncmFtbWluZyBOIHZhbHVlIGZhaWxlZCAlI3hc biIsIHJldHZhbCk7CisJCWdvdG8gcHJlcF9lbmQ7CisJfQorCWludGVsaGFkZGF0YS0+b3BzLT5w cm9nX2N0cyhzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGUsCisJCQkJCWRpc3Bfc2FtcF9mcmVxLCBu X3BhcmFtLCBpbnRlbGhhZGRhdGEpOworCisJaW50ZWxoYWRkYXRhLT5vcHMtPnByb2dfZGlwKHN1 YnN0cmVhbSwgaW50ZWxoYWRkYXRhKTsKKworCXJldHZhbCA9IGludGVsaGFkZGF0YS0+b3BzLT5h dWRpb19jdHJsKHN1YnN0cmVhbSwgaW50ZWxoYWRkYXRhKTsKKworCS8qIFByb2cgYnVmZmVyIGFk ZHJlc3MgKi8KKwlyZXR2YWwgPSBzbmRfaW50ZWxoYWRfcHJvZ19idWZmZXIoaW50ZWxoYWRkYXRh LAorCQkJSEFEX0JVRl9UWVBFX0EsIEhBRF9CVUZfVFlQRV9EKTsKKworCS8qCisJICogUHJvZ3Jh bSBjaGFubmVsIG1hcHBpbmcgaW4gZm9sbG93aW5nIG9yZGVyOgorCSAqIEZMLCBGUiwgQywgTEZF LCBSTCwgUlIKKwkgKi8KKworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfQlVGX0NIX1NXQVAsIFNX QVBfTEZFX0NFTlRFUik7CisKK3ByZXBfZW5kOgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgor ICogc25kX2ludGVsaGFkX3BjbV9wb2ludGVyLSB0byBzZW5kIHRoZSBjdXJyZW50IGJ1ZmZlciBw b2ludGVycHJvY2Vzc2VkIGJ5IGh3CisgKgorICogQHN1YnN0cmVhbTogIHN1YnN0cmVhbSBmb3Ig d2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2Fs bGVkIGJ5IEFMU0EgZnJhbWV3b3JrIHRvIGdldCB0aGUgY3VycmVudCBodyBidWZmZXIgcHRyCisg KiB3aGVuIGEgcGVyaW9kIGlzIGVsYXBzZWQKKyAqLworc3RhdGljIHNuZF9wY21fdWZyYW1lc190 IHNuZF9pbnRlbGhhZF9wY21fcG9pbnRlcigKKwkJCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFt ICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhOworCXUz MiBieXRlc19yZW5kZXJlZCA9IDA7CisKKwkvKiBwcl9kZWJ1Zygic25kX2ludGVsaGFkX3BjbV9w b2ludGVyIGNhbGxlZFxuIik7ICovCisKKwlpbnRlbGhhZGRhdGEgPSBzbmRfcGNtX3N1YnN0cmVh bV9jaGlwKHN1YnN0cmVhbSk7CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5mbGFnX3VuZGVycnVuKSB7 CisJCWludGVsaGFkZGF0YS0+ZmxhZ191bmRlcnJ1biA9IDA7CisJCXJldHVybiBTTkRSVl9QQ01f UE9TX1hSVU47CisJfQorCisJaWYgKGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3Jl bmRlcmVkKQorCQlkaXZfdTY0X3JlbShpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmJ1ZmZlcl9y ZW5kZXJlZCwKKwkJCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8ucmluZ19idWZfc2l6ZSwKKwkJ CSYoYnl0ZXNfcmVuZGVyZWQpKTsKKworCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVy X3B0ciA9IGJ5dGVzX3RvX2ZyYW1lcygKKwkJCQkJCXN1YnN0cmVhbS0+cnVudGltZSwKKwkJCQkJ CWJ5dGVzX3JlbmRlcmVkKTsKKwlyZXR1cm4gaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5idWZm ZXJfcHRyOworfQorCisvKioKKyogc25kX2ludGVsaGFkX3BjbV9tbWFwLSBtbWFwcyBhIGtlcm5l bCBidWZmZXIgdG8gdXNlciBzcGFjZSBmb3IgY29weWluZyBkYXRhCisqCisqIEBzdWJzdHJlYW06 ICBzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyogQHZtYToJCXN0 cnVjdCBpbnN0YW5jZSBvZiBtZW1vcnkgVk1NIG1lbW9yeSBhcmVhCisqCisqIFRoaXMgZnVuY3Rp b24gaXMgY2FsbGVkIGJ5IE9TIHdoZW4gYSB1c2VyIHNwYWNlIGNvbXBvbmVudAorKiB0cmllcyB0 byBnZXQgbW1hcCBtZW1vcnkgZnJvbSBkcml2ZXIKKyovCitzdGF0aWMgaW50IHNuZF9pbnRlbGhh ZF9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qg dm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKworCXByX2RlYnVnKCJzbmRfaW50ZWxoYWRfcGNtX21t YXAgY2FsbGVkXG4iKTsKKworCXByX2RlYnVnKCJlbnRyeSB3aXRoIHByb3Q6JXNcbiIsIF9fZnVu Y19fKTsKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdl X3Byb3QpOworCXJldHVybiByZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJ c3Vic3RyZWFtLT5kbWFfYnVmZmVyLmFkZHIgPj4gUEFHRV9TSElGVCwKKwkJCXZtYS0+dm1fZW5k IC0gdm1hLT52bV9zdGFydCwgdm1hLT52bV9wYWdlX3Byb3QpOworfQorCitpbnQgaGRtaV9hdWRp b19tb2RlX2NoYW5nZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlp bnQgcmV0dmFsID0gMDsKKwl1MzIgZGlzcF9zYW1wX2ZyZXEsIG5fcGFyYW07CisJc3RydWN0IHNu ZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhOworCisJaW50ZWxoYWRkYXRhID0gc25kX3BjbV9zdWJz dHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJLyogRGlzYWJsZSBBdWRpbyAqLworCWludGVsaGFk ZGF0YS0+b3BzLT5lbmFibGVfYXVkaW8oc3Vic3RyZWFtLCAwKTsKKworCS8qIFVwZGF0ZSBDVFMg dmFsdWUgKi8KKwlyZXR2YWwgPSBoYWRfZ2V0X2NhcHMoSEFEX0dFVF9ESVNQTEFZX1JBVEUsICZk aXNwX3NhbXBfZnJlcSk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoInF1ZXJ5aW5nIGRpc3Bs YXkgc2FtcGxpbmcgZnJlcSBmYWlsZWQgJSN4XG4iLCByZXR2YWwpOworCQlnb3RvIG91dDsKKwl9 CisKKwlyZXR2YWwgPSBpbnRlbGhhZGRhdGEtPm9wcy0+cHJvZ19uKHN1YnN0cmVhbS0+cnVudGlt ZS0+cmF0ZSwgJm5fcGFyYW0sCisJCQkJCQkJCWludGVsaGFkZGF0YSk7CisJaWYgKHJldHZhbCkg eworCQlwcl9lcnIoInByb2dyYW1taW5nIE4gdmFsdWUgZmFpbGVkICUjeFxuIiwgcmV0dmFsKTsK KwkJZ290byBvdXQ7CisJfQorCWludGVsaGFkZGF0YS0+b3BzLT5wcm9nX2N0cyhzdWJzdHJlYW0t PnJ1bnRpbWUtPnJhdGUsCisJCQkJCWRpc3Bfc2FtcF9mcmVxLCBuX3BhcmFtLCBpbnRlbGhhZGRh dGEpOworCisJLyogRW5hYmxlIEF1ZGlvICovCisJaW50ZWxoYWRkYXRhLT5vcHMtPmVuYWJsZV9h dWRpbyhzdWJzdHJlYW0sIDEpOworCitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLypQQ00g b3BlcmF0aW9ucyBzdHJ1Y3R1cmUgYW5kIHRoZSBjYWxscyBiYWNrIGZvciB0aGUgc2FtZSAqLwor c3RydWN0IHNuZF9wY21fb3BzIHNuZF9pbnRlbGhhZF9wbGF5YmFja19vcHMgPSB7CisJLm9wZW4g PQkJc25kX2ludGVsaGFkX29wZW4sCisJLmNsb3NlID0Jc25kX2ludGVsaGFkX2Nsb3NlLAorCS5p b2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMgPQlzbmRfaW50ZWxoYWRfaHdf cGFyYW1zLAorCS5od19mcmVlID0Jc25kX2ludGVsaGFkX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlz bmRfaW50ZWxoYWRfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfaW50ZWxoYWRfcGNtX3Ry aWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfaW50ZWxoYWRfcGNtX3BvaW50ZXIsCisJLm1tYXAgPQlz bmRfaW50ZWxoYWRfcGNtX21tYXAsCit9OworCisvKioKKyAqIHNuZF9pbnRlbGhhZF9jcmVhdGUg LSB0byBjcmV0ZSBhbHNhIGNhcmQgaW5zdGFuY2UKKyAqCisgKiBAaW50ZWxoYWRkYXRhOiBwb2lu dGVyIHRvIGludGVybmFsIGNvbnRleHQKKyAqIEBjYXJkOiBwb2ludGVyIHRvIGNhcmQKKyAqCisg KiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBoZG1pIGNhYmxlIGlzIHBsdWdnZWQg aW4KKyAqLworc3RhdGljIGludCBzbmRfaW50ZWxoYWRfY3JlYXRlKAorCQlzdHJ1Y3Qgc25kX2lu dGVsaGFkICppbnRlbGhhZGRhdGEsCisJCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKK3sKKwlpbnQg cmV0dmFsOworCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgb3BzID0geworCX07CisKKwlw cl9kZWJ1Zygic25kX2ludGVsaGFkX2NyZWF0ZSBjYWxsZWRcbiIpOworCisJaWYgKCFpbnRlbGhh ZGRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQUxTQSBhcGkgdG8gcmVnaXN0ZXIgdGhl IGRldmljZSAqLworCXJldHZhbCA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dM RVZFTCwgaW50ZWxoYWRkYXRhLCAmb3BzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorLyoqCisgKiBz bmRfaW50ZWxoYWRfcGNtX2ZyZWUgLSB0byBmcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkCisgKgor ICogQHBjbTogcG9pbnRlciB0byBwY20gaW5zdGFuY2UKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2Fs bGVkIHdoZW4gdGhlIGRldmljZSBpcyByZW1vdmVkCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9pbnRl bGhhZF9wY21fZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCXByX2RlYnVnKCJGcmVlaW5n IFBDTSBwcmVhbGxvY2F0ZWQgcGFnZXNcbiIpOworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2Zy ZWVfZm9yX2FsbChwY20pOworfQorCitzdGF0aWMgaW50IGhhZF9pZWM5NThfaW5mbyhzdHJ1Y3Qg c25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVp bmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWlu Zm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYWRfaWVjOTU4X2dl dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVt X3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEg PSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4 LnN0YXR1c1swXSA9IChpbnRlbGhhZGRhdGEtPmFlc19iaXRzID4+IDApICYgMHhmZjsKKwl1Y29u dHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IChpbnRlbGhhZGRhdGEtPmFlc19iaXRzID4+ IDgpICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA9CisJCQkJCShp bnRlbGhhZGRhdGEtPmFlc19iaXRzID4+IDE2KSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmll Yzk1OC5zdGF0dXNbM10gPQorCQkJCQkoaW50ZWxoYWRkYXRhLT5hZXNfYml0cyA+PiAyNCkgJiAw eGZmOworCXJldHVybiAwOworfQorc3RhdGljIGludCBoYWRfaWVjOTU4X21hc2tfZ2V0KHN0cnVj dCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUg KnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gMHhmZjsK Kwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IDB4ZmY7CisJdWNvbnRyb2wtPnZh bHVlLmllYzk1OC5zdGF0dXNbMl0gPSAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3Rh dHVzWzNdID0gMHhmZjsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgaGFkX2llYzk1OF9wdXQo c3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92 YWx1ZSAqdWNvbnRyb2wpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3Qgc25kX2ludGVs aGFkICppbnRlbGhhZGRhdGEgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlwcl9k ZWJ1ZygiZW50ZXJlZCBoYWRfaWVjOTU4X3B1dFxuIik7CisJdmFsID0gKHVjb250cm9sLT52YWx1 ZS5pZWM5NTguc3RhdHVzWzBdIDw8IDApIHwKKwkJKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3Rh dHVzWzFdIDw8IDgpIHwKKwkJKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzJdIDw8IDE2 KSB8CisJCSh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA8PCAyNCk7CisJaWYgKGlu dGVsaGFkZGF0YS0+YWVzX2JpdHMgIT0gdmFsKSB7CisJCWludGVsaGFkZGF0YS0+YWVzX2JpdHMg PSB2YWw7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBz bmRfa2NvbnRyb2xfbmV3IGhhZF9jb250cm9sX2llYzk1OF9tYXNrID0geworCS5hY2Nlc3MgPSAg IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCS5pZmFjZSA9ICAgIFNORFJWX0NUTF9FTEVN X0lGQUNFX1BDTSwKKwkubmFtZSA9ICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBMQVlC QUNLLCBNQVNLKSwKKwkuaW5mbyA9ICAgICBoYWRfaWVjOTU4X2luZm8sIC8qIHNoYXJlZCAqLwor CS5nZXQgPSAgICAgIGhhZF9pZWM5NThfbWFza19nZXQsCit9OworCitzdGF0aWMgc3RydWN0IHNu ZF9rY29udHJvbF9uZXcgaGFkX2NvbnRyb2xfaWVjOTU4ID0geworCS5pZmFjZSA9ICAgIFNORFJW X0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVD OTU4KCIiLCBQTEFZQkFDSywgREVGQVVMVCksCisJLmluZm8gPSAgICAgICAgIGhhZF9pZWM5NThf aW5mbywKKwkuZ2V0ID0gICAgICAgICAgaGFkX2llYzk1OF9nZXQsCisJLnB1dCA9ICAgICAgICAg IGhhZF9pZWM5NThfcHV0Cit9OworCitzdGF0aWMgc3RydWN0IHNuZF9pbnRlbF9oYWRfaW50ZXJm YWNlIGhhZF9pbnRlcmZhY2UgPSB7CisJLm5hbWUgPSAgICAgICAgICJoZG1pLWF1ZGlvIiwKKwku cXVlcnkgPSAgICAgICAgaGRtaV9hdWRpb19xdWVyeSwKKwkuc3VzcGVuZCA9ICAgICAgaGRtaV9h dWRpb19zdXNwZW5kLAorCS5yZXN1bWUgPSAgICAgICBoZG1pX2F1ZGlvX3Jlc3VtZSwKK307CisK K3N0YXRpYyBzdHJ1Y3QgaGFkX29wcyBoYWRfb3BzX3YxID0geworCS5lbmFibGVfYXVkaW8gPSBz bmRfaW50ZWxoYWRfZW5hYmxlX2F1ZGlvX3YxLAorCS5yZXNldF9hdWRpbyA9IHNuZF9pbnRlbGhh ZF9yZXNldF9hdWRpb192MSwKKwkucHJvZ19uID0Jc25kX2ludGVsaGFkX3Byb2dfbl92MSwKKwku cHJvZ19jdHMgPQlzbmRfaW50ZWxoYWRfcHJvZ19jdHNfdjEsCisJLmF1ZGlvX2N0cmwgPQlzbmRf aW50ZWxoYWRfcHJvZ19hdWRpb19jdHJsX3YxLAorCS5wcm9nX2RpcCA9CXNuZF9pbnRlbGhhZF9w cm9nX2RpcF92MSwKKwkuaGFuZGxlX3VuZGVycnVuID0gIGhhZF9jbGVhcl91bmRlcnJ1bl9pbnRy X3YxLAorfTsKKworc3RhdGljIHN0cnVjdCBoYWRfb3BzIGhhZF9vcHNfdjIgPSB7CisJLmVuYWJs ZV9hdWRpbyA9IHNuZF9pbnRlbGhhZF9lbmFibGVfYXVkaW9fdjIsCisJLnJlc2V0X2F1ZGlvID0g c25kX2ludGVsaGFkX3Jlc2V0X2F1ZGlvX3YyLAorCS5wcm9nX24gPQlzbmRfaW50ZWxoYWRfcHJv Z19uX3YyLAorCS5wcm9nX2N0cyA9CXNuZF9pbnRlbGhhZF9wcm9nX2N0c192MiwKKwkuYXVkaW9f Y3RybCA9CXNuZF9pbnRlbGhhZF9wcm9nX2F1ZGlvX2N0cmxfdjIsCisJLnByb2dfZGlwID0Jc25k X2ludGVsaGFkX3Byb2dfZGlwX3YyLAorCS5oYW5kbGVfdW5kZXJydW4gPSBoYWRfY2xlYXJfdW5k ZXJydW5faW50cl92MiwKK307CisvKioKKyAqIGhkbWlfYXVkaW9fcHJvYmUgLSB0byBjcmVhdGUg c291bmQgY2FyZCBpbnN0YW5jZSBmb3IgSERNSSBhdWRpbyBwbGF5YWJjaworICoKKyAqQGhhZGRh dGE6IHBvaW50ZXIgdG8gSEFEIHByaXZhdGUgZGF0YQorICpAY2FyZF9pZDogY2FyZCBmb3Igd2hp Y2ggcHJvYmUgaXMgY2FsbGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0 aGUgaGRtaSBjYWJsZSBpcyBwbHVnZ2VkIGluLiBUaGlzIGZ1bmN0aW9uCisgKiBjcmVhdGVzIGFu ZCByZWdpc3RlcnMgdGhlIHNvdW5kIGNhcmQgd2l0aCBBTFNBCisgKi8KK2ludCBoZG1pX2F1ZGlv X3Byb2JlKHZvaWQgKmRldmljZXB0cikKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBzbmRfcGNt ICpwY207CisJc3RydWN0IHNuZF9jYXJkICpjYXJkOworCXN0cnVjdCBoYWRfY2FsbGJhY2tfb3Bz IG9wc19jYjsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisJc3RydWN0IGhh ZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZwdHIg PSBkZXZpY2VwdHI7CisKKwlwcl9kZWJ1ZygiRW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKKworCXBy X2RlYnVnKCJoZG1pX2F1ZGlvX3Byb2JlIGRtYV9tYXNrOiAlcFxuIiwgZGV2cHRyLT5kZXYuZG1h X21hc2spOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBzYXZpbmcgaW50ZXJuYWwgY29udGV4 dCBhbmQgd29ya2luZyAqLworCWludGVsaGFkZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCppbnRlbGhh ZGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWludGVsaGFkZGF0YSkKKwkJcmV0dXJuIC1FTk9N RU07CisKKwloYWRfc3RyZWFtID0ga3phbGxvYyhzaXplb2YoKmhhZF9zdHJlYW0pLCBHRlBfS0VS TkVMKTsKKwlpZiAoIWhhZF9zdHJlYW0pIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBm cmVlX2hhZGRhdGE7CisJfQorCisJaGFkX2RhdGEgPSBpbnRlbGhhZGRhdGE7CisJb3BzX2NiLmlu dGVsX2hhZF9ldmVudF9jYWxsX2JhY2sgPSBoYWRfZXZlbnRfaGFuZGxlcjsKKworCS8qIHJlZ2lz dGVyaW5nIHdpdGggZGlzcGxheSBkcml2ZXIgdG8gZ2V0IGFjY2VzcyB0byBkaXNwbGF5IEFQSXMg Ki8KKworCXJldHZhbCA9IG1pZF9oZG1pX2F1ZGlvX3NldHVwKAorCQkJb3BzX2NiLmludGVsX2hh ZF9ldmVudF9jYWxsX2JhY2ssCisJCQkmKGludGVsaGFkZGF0YS0+cmVnX29wcyksCisJCQkmKGlu dGVsaGFkZGF0YS0+cXVlcnlfb3BzKSk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoInF1ZXJ5 aW5nIGRpc3BsYXkgZHJpdmVyIEFQSXMgZmFpbGVkICUjeFxuIiwgcmV0dmFsKTsKKwkJZ290byBm cmVlX2hhZHN0cmVhbTsKKwl9CisJbXV0ZXhfbG9jaygmaGFkX211dGV4KTsKKwlzcGluX2xvY2tf aW5pdCgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2spOworCWludGVsaGFkZGF0YS0+ZHJ2X3N0 YXR1cyA9IEhBRF9EUlZfRElTQ09OTkVDVEVEOworCXByX2RlYnVnKCIlcyBAICVkOkRFQlVHIFBM VUcvVU5QTFVHIDogSEFEX0RSVl9ESVNDT05ORUNURURcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5F X18pOworCisJLyogY3JlYXRlIGEgY2FyZCBpbnN0YW5jZSB3aXRoIEFMU0EgZnJhbWV3b3JrICov CisJcmV0dmFsID0gc25kX2NhcmRfbmV3KCZkZXZwdHItPmRldiwgaGRtaV9jYXJkX2luZGV4LCBo ZG1pX2NhcmRfaWQsCisJCQkJVEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKworCWlmIChyZXR2YWwp CisJCWdvdG8gdW5sb2NrX211dGV4OworCWludGVsaGFkZGF0YS0+Y2FyZCA9IGNhcmQ7CisJaW50 ZWxoYWRkYXRhLT5jYXJkX2lkID0gaGRtaV9jYXJkX2lkOworCWludGVsaGFkZGF0YS0+Y2FyZF9p bmRleCA9IGNhcmQtPm51bWJlcjsKKwlpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YSA9IGhhZF9z dHJlYW07CisJaW50ZWxoYWRkYXRhLT5mbGFnX3VuZGVycnVuID0gMDsKKwlpbnRlbGhhZGRhdGEt PmFlc19iaXRzID0gU05EUlZfUENNX0RFRkFVTFRfQ09OX1NQRElGOworCXN0cm5jcHkoY2FyZC0+ ZHJpdmVyLCBJTlRFTF9IQUQsIHN0cmxlbihJTlRFTF9IQUQpKTsKKwlzdHJuY3B5KGNhcmQtPnNo b3J0bmFtZSwgSU5URUxfSEFELCBzdHJsZW4oSU5URUxfSEFEKSk7CisKKwlyZXR2YWwgPSBzbmRf cGNtX25ldyhjYXJkLCBJTlRFTF9IQUQsIFBDTV9JTkRFWCwgTUFYX1BCX1NUUkVBTVMsCisJCQkJ CQlNQVhfQ0FQX1NUUkVBTVMsICZwY20pOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyOworCisJ Lyogc2V0dXAgcHJpdmF0ZSBkYXRhIHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgd2hlbiByZXF1aXJl ZCAqLworCXBjbS0+cHJpdmF0ZV9kYXRhID0gaW50ZWxoYWRkYXRhOworCXBjbS0+cHJpdmF0ZV9m cmVlID0gc25kX2ludGVsaGFkX3BjbV9mcmVlOworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJc3Ry bmNweShwY20tPm5hbWUsIGNhcmQtPnNob3J0bmFtZSwgc3RybGVuKGNhcmQtPnNob3J0bmFtZSkp OworCS8qIHNldHVwIHRoZSBvcHMgZm9yIHBhbHlhYmNrICovCisJc25kX3BjbV9zZXRfb3BzKHBj bSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKKwkJCSAgICAmc25kX2ludGVsaGFkX3BsYXli YWNrX29wcyk7CisJLyogYWxsb2NhdGUgZG1hIHBhZ2VzIGZvciBBTFNBIHN0cmVhbSBvcGVyYXRp b25zCisJICogbWVtb3J5IGFsbG9jYXRlZCBpcyBiYXNlZCBvbiBzaXplLCBub3QgbWF4IHZhbHVl CisJICogdGh1cyB1c2luZyBzYW1lIGFyZ3VtZW50IGZvciBtYXggJiBzaXplCisJICovCisJcmV0 dmFsID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sCisJCQlTTkRS Vl9ETUFfVFlQRV9ERVYsIE5VTEwsCisJCQlIQURfTUFYX0JVRkZFUiwgSEFEX01BWF9CVUZGRVIp OworCisJaWYgKGNhcmQtPmRldiA9PSBOVUxMKQorCQlwcl9kZWJ1ZygiY2FyZC0+ZGV2IGlzIE5V TEwhISEhISBTaG91bGQgbm90IGJlIHRoaXMgY2FzZVxuIik7CisJZWxzZSBpZiAoY2FyZC0+ZGV2 LT5kbWFfbWFzayA9PSBOVUxMKQorCQlwcl9kZWJ1ZygiaGRtaV9hdWRpb19wcm9iZSBkbWFfbWFz ayBpcyBOVUxMISEhISFcbiIpOworCWVsc2UKKwkJcHJfZGVidWcoImhkbWlfYXVkaW9fcHJvYmUg ZG1hX21hc2sgaXMgOiAlcFxuIiwKKwkJCQljYXJkLT5kZXYtPmRtYV9tYXNrKTsKKworCWlmIChy ZXR2YWwpCisJCWdvdG8gZXJyOworCisJLyogaW50ZXJuYWwgZnVuY3Rpb24gY2FsbCB0byByZWdp c3RlciBkZXZpY2Ugd2l0aCBBTFNBICovCisJcmV0dmFsID0gc25kX2ludGVsaGFkX2NyZWF0ZShp bnRlbGhhZGRhdGEsIGNhcmQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyOworCisJY2FyZC0+ cHJpdmF0ZV9kYXRhID0gJmludGVsaGFkZGF0YTsKKwlyZXR2YWwgPSBzbmRfY2FyZF9yZWdpc3Rl cihjYXJkKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycjsKKworCS8qIElFQzk1OCBjb250cm9s cyAqLworCXJldHZhbCA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmaGFkX2NvbnRy b2xfaWVjOTU4X21hc2ssCisJCQkJCQlpbnRlbGhhZGRhdGEpKTsKKwlpZiAocmV0dmFsIDwgMCkK KwkJZ290byBlcnI7CisJcmV0dmFsID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZo YWRfY29udHJvbF9pZWM5NTgsCisJCQkJCQlpbnRlbGhhZGRhdGEpKTsKKwlpZiAocmV0dmFsIDwg MCkKKwkJZ290byBlcnI7CisKKwlpbml0X2NoYW5uZWxfYWxsb2NhdGlvbnMoKTsKKworCS8qIFJl Z2lzdGVyIGNoYW5uZWwgbWFwIGNvbnRyb2xzICovCisJcmV0dmFsID0gaGFkX3JlZ2lzdGVyX2No bWFwX2N0bHMoaW50ZWxoYWRkYXRhLCBwY20pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVy cjsKKworCWludGVsaGFkZGF0YS0+ZGV2ID0gJmRldnB0ci0+ZGV2OworCXBtX3J1bnRpbWVfc2V0 X2FjdGl2ZShpbnRlbGhhZGRhdGEtPmRldik7CisJcG1fcnVudGltZV9lbmFibGUoaW50ZWxoYWRk YXRhLT5kZXYpOworCisJbXV0ZXhfdW5sb2NrKCZoYWRfbXV0ZXgpOworCXJldHZhbCA9IG1pZF9o ZG1pX2F1ZGlvX3JlZ2lzdGVyKCZoYWRfaW50ZXJmYWNlLCBpbnRlbGhhZGRhdGEpOworCWlmIChy ZXR2YWwpIHsKKwkJcHJfZXJyKCJyZWdpc3RlcmluZyB3aXRoIGRpc3BsYXkgZHJpdmVyIGZhaWxl ZCAlI3hcbiIsIHJldHZhbCk7CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCWdvdG8gZnJlZV9o YWRzdHJlYW07CisJfQorCisJaW50ZWxoYWRkYXRhLT5od19zaWxlbmNlID0gMTsKKwloYWRfb3Bz X3YxID0gaGFkX29wc192MTsJLyogdW51c2VkICovCisJaW50ZWxoYWRkYXRhLT5vcHMgPSAmaGFk X29wc192MjsKKworCXJldHVybiByZXR2YWw7CitlcnI6CisJc25kX2NhcmRfZnJlZShjYXJkKTsK K3VubG9ja19tdXRleDoKKwltdXRleF91bmxvY2soJmhhZF9tdXRleCk7CitmcmVlX2hhZHN0cmVh bToKKwlrZnJlZShoYWRfc3RyZWFtKTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoaW50ZWxoYWRkYXRh LT5kZXYpOworCWludGVsaGFkZGF0YS0+ZGV2ID0gTlVMTDsKK2ZyZWVfaGFkZGF0YToKKwlrZnJl ZShpbnRlbGhhZGRhdGEpOworCWludGVsaGFkZGF0YSA9IE5VTEw7CisJcHJfZXJyKCJFcnJvciBy ZXR1cm5lZCBmcm9tICVzIGFwaSAlI3hcbiIsIF9fZnVuY19fLCByZXR2YWwpOworCXJldHVybiBy ZXR2YWw7Cit9CisKKy8qKgorICogaGRtaV9hdWRpb19yZW1vdmUgLSByZW1vdmVzIHRoZSBhbHNh IGNhcmQKKyAqCisgKkBoYWRkYXRhOiBwb2ludGVyIHRvIEhBRCBwcml2YXRlIGRhdGEKKyAqCisg KiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBoZG1pIGNhYmxlIGlzIHVuLXBsdWdn ZWQuIFRoaXMgZnVuY3Rpb24KKyAqIGZyZWUgdGhlIHNvdW5kIGNhcmQuCisgKi8KK2ludCBoZG1p X2F1ZGlvX3JlbW92ZSh2b2lkICpwZGV2cHRyKQoreworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmlu dGVsaGFkZGF0YSA9IGhhZF9kYXRhOworCWludCBjYXBzOworCisJcHJfZGVidWcoIkVudGVyICVz XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIWludGVsaGFkZGF0YSkKKwkJcmV0dXJuIDA7CisKKwlp ZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzICE9IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7CisJ CWNhcHMgPSBIRE1JX0FVRElPX1VOREVSUlVOIHwgSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwkJ aGFkX3NldF9jYXBzKEhBRF9TRVRfRElTQUJMRV9BVURJT19JTlQsICZjYXBzKTsKKwkJaGFkX3Nl dF9jYXBzKEhBRF9TRVRfRElTQUJMRV9BVURJTywgTlVMTCk7CisJfQorCXNuZF9jYXJkX2ZyZWUo aW50ZWxoYWRkYXRhLT5jYXJkKTsKKwlrZnJlZShpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YSk7 CisJa2ZyZWUoaW50ZWxoYWRkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigi U2FpbGFqYSBCYW5kYXJ1cGFsbGkgPHNhaWxhamEuYmFuZGFydXBhbGxpQGludGVsLmNvbT4iKTsK K01PRFVMRV9BVVRIT1IoIlJhbWVzaCBCYWJ1IEsgViA8cmFtZXNoLmJhYnVAaW50ZWwuY29tPiIp OworTU9EVUxFX0FVVEhPUigiVmFpYmhhdiBBZ2Fyd2FsIDx2YWliaGF2LmFnYXJ3YWxAaW50ZWwu Y29tPiIpOworTU9EVUxFX0FVVEhPUigiSmVyb21lIEFuYW5kIDxqZXJvbWUuYW5hbmRAaW50ZWwu Y29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBIRE1JIEF1ZGlvIGRyaXZlciIpOwor TU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIntJbnRl bCxJbnRlbF9IQUR9Iik7CmRpZmYgLS1naXQgYS9zb3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpby5o IGIvc291bmQveDg2L2ludGVsX2hkbWlfYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwLi4xZWYyNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQveDg2L2ludGVsX2hk bWlfYXVkaW8uaApAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBJ bnRlbCBDb3Jwb3JhdGlvbgorICogIEF1dGhvcnM6CVNhaWxhamEgQmFuZGFydXBhbGxpIDxzYWls YWphLmJhbmRhcnVwYWxsaUBpbnRlbC5jb20+CisgKgkJUmFtZXNoIEJhYnUgSyBWCTxyYW1lc2gu YmFidUBpbnRlbC5jb20+CisgKgkJVmFpYmhhdiBBZ2Fyd2FsIDx2YWliaGF2LmFnYXJ3YWxAaW50 ZWwuY29tPgorICoJCUplcm9tZSBBbmFuZCA8amVyb21lLmFuYW5kQGludGVsLmNvbT4KKyAqCisg KiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBl cnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVk IGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhl IFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1p dGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlz aCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0 d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBm dXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u czoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9u IG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1 ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0 d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBX QVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJV VCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4g IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBC RSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRI RVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJ TkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9S IFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisj aWZuZGVmIF9JTlRFTF9IRE1JX0FVRElPX0hfCisjZGVmaW5lIF9JTlRFTF9IRE1JX0FVRElPX0hf CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4K KyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5o PgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5o PgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgImludGVsX2hkbWlfbHBlX2F1ZGlv LmgiCisKKyNkZWZpbmUgUENNX0lOREVYCQkwCisjZGVmaW5lIE1BWF9QQl9TVFJFQU1TCQkxCisj ZGVmaW5lIE1BWF9DQVBfU1RSRUFNUwkJMAorI2RlZmluZSBIRE1JX0FVRElPX0RSSVZFUgkiaGRt aS1hdWRpbyIKKworI2RlZmluZSBJTkZPX0ZSQU1FX1dPUkQxCTB4MDAwYTAxODQKKyNkZWZpbmUg RklGT19USFJFU0hPTEQJCTB4RkUKKyNkZWZpbmUgRE1BX0ZJRk9fVEhSRVNIT0xECTB4NworI2Rl ZmluZSBCWVRFU19QRVJfV09SRAkJMHg0CisKKy8qIFNhbXBsaW5nIHJhdGUgYXMgcGVyIElFQzYw OTU4IFZlciAzICovCisjZGVmaW5lIENIX1NUQVRVU19NQVBfMzJLSFoJMHgzCisjZGVmaW5lIENI X1NUQVRVU19NQVBfNDRLSFoJMHgwCisjZGVmaW5lIENIX1NUQVRVU19NQVBfNDhLSFoJMHgyCisj ZGVmaW5lIENIX1NUQVRVU19NQVBfODhLSFoJMHg4CisjZGVmaW5lIENIX1NUQVRVU19NQVBfOTZL SFoJMHhBCisjZGVmaW5lIENIX1NUQVRVU19NQVBfMTc2S0haCTB4QworI2RlZmluZSBDSF9TVEFU VVNfTUFQXzE5MktIWgkweEUKKworI2RlZmluZSBNQVhfU01QTF9XSURUSF8yMAkweDAKKyNkZWZp bmUgTUFYX1NNUExfV0lEVEhfMjQJMHgxCisjZGVmaW5lIFNNUExfV0lEVEhfMTZCSVRTCTB4MQor I2RlZmluZSBTTVBMX1dJRFRIXzI0QklUUwkweDUKKyNkZWZpbmUgQ0hBTk5FTF9BTExPQ0FUSU9O CTB4MUYKKyNkZWZpbmUgTUFTS19CWVRFMAkJMHgwMDAwMDBGRgorI2RlZmluZSBWQUxJRF9ESVBf V09SRFMJCTMKKyNkZWZpbmUgTEFZT1VUMAkJCTAKKyNkZWZpbmUgTEFZT1VUMQkJCTEKKyNkZWZp bmUgU1dBUF9MRkVfQ0VOVEVSCQkweDAwZmFjNGM4CisjZGVmaW5lIEFVRF9DT05GSUdfQ0hfTUFT S19WMgkweDcwCisKK3N0cnVjdCBwY21fc3RyZWFtX2luZm8geworCWludAkJc3RyX2lkOworCXZv aWQJKmhhZF9zdWJzdHJlYW07CisJdm9pZAkoKnBlcmlvZF9lbGFwc2VkKSh2b2lkICpoYWRfc3Vi c3RyZWFtKTsKKwl1MzIJCWJ1ZmZlcl9wdHI7CisJdTY0CQlidWZmZXJfcmVuZGVyZWQ7CisJdTMy CQlyaW5nX2J1Zl9zaXplOworCWludAkJc2ZyZXE7Cit9OworCitzdHJ1Y3QgcmluZ19idWZfaW5m byB7CisJdWludDMyX3QJYnVmX2FkZHI7CisJdWludDMyX3QJYnVmX3NpemU7CisJdWludDhfdAkJ aXNfdmFsaWQ7Cit9OworCitzdHJ1Y3QgaGFkX3N0cmVhbV9wdnQgeworCWVudW0gaGFkX3N0cmVh bV9zdGF0dXMJCXN0cmVhbV9zdGF0dXM7CisJaW50CQkJCXN0cmVhbV9vcHM7CisJc3NpemVfdAkJ CQlkYmdfY3VtX2J5dGVzOworfTsKKworc3RydWN0IGhhZF9wdnRfZGF0YSB7CisJZW51bSBoYWRf c3RhdHVzX3N0cmVhbQkJc3RyZWFtX3R5cGU7Cit9OworCitzdHJ1Y3QgaGFkX2NhbGxiYWNrX29w cyB7CisJaGFkX2V2ZW50X2NhbGxfYmFjayBpbnRlbF9oYWRfZXZlbnRfY2FsbF9iYWNrOworfTsK KworLyoqCisgKiBzdHJ1Y3Qgc25kX2ludGVsaGFkIC0gaW50ZWxoYWQgZHJpdmVyIHN0cnVjdHVy ZQorICoKKyAqIEBjYXJkOiBwdHIgdG8gaG9sZCBjYXJkIGRldGFpbHMKKyAqIEBjYXJkX2luZGV4 OiBzb3VuZCBjYXJkIGluZGV4CisgKiBAY2FyZF9pZDogZGV0ZWN0ZWQgc291bmQgY2FyZCBpZAor ICogQHJlZ19vcHM6IHJlZ2lzdGVyIG9wZXJhdGlvbnMgdG8gcHJvZ3JhbSByZWdpc3RlcnMKKyAq IEBxdWVyeV9vcHM6IGNhcHMgY2FsbCBiYWNrcyBmb3IgZ2V0L3NldCBvcGVyYXRpb25zCisgKiBA ZHJ2X3N0YXR1czogZHJpdmVyIHN0YXR1cworICogQGJ1Zl9pbmZvOiByaW5nIGJ1ZmZlciBpbmZv CisgKiBAc3RyZWFtX2luZm86IHN0cmVhbSBpbmZvcm1hdGlvbgorICogQGVlbGQ6IGhvbGRzIEVF TEQgaW5mbworICogQGN1cnJfYnVmOiBwb2ludGVyIHRvIGhvbGQgY3VycmVudCBhY3RpdmUgcmlu ZyBidWYKKyAqIEB2YWxpZF9idWZfY250OiByaW5nIGJ1ZmZlciBjb3VudCBmb3Igc3RyZWFtCisg KiBAaGFkX3NwaW5sb2NrOiBkcml2ZXIgbG9jaworICogQGFlc19iaXRzOiBJRUM5NTggc3RhdHVz IGJpdHMKKyAqIEBidWZmX2RvbmU6IGlkIG9mIGN1cnJlbnQgYnVmZmVyIGRvbmUgaW50cgorICog QGRldjogcGxhdG9mb3JtIGRldmljZSBoYW5kbGUKKyAqIEBrY3RsOiBob2xkcyBrY3RsIHB0cnMg dXNlZCBmb3IgY2hhbm5lbCBtYXAKKyAqIEBjaG1hcDogaG9sZHMgY2hhbm5lbCBtYXAgaW5mbwor ICogQGF1ZGlvX3JlZ19iYXNlOiBoZG1pIGF1ZGlvIHJlZ2lzdGVyIGJhc2Ugb2Zmc2V0CisgKiBA aHdfc2lsZW5jZTogZmxhZyBpbmRpY2F0ZXMgU29DIHN1cHBvcnQgZm9yIEhXIHNpbGVuY2UvS2Vl cCBhbGl2ZQorICogQG9wczogaG9sZHMgb3BzIGZ1bmN0aW9ucyBiYXNlZCBvbiBwbGF0Zm9ybQor ICovCitzdHJ1Y3Qgc25kX2ludGVsaGFkIHsKKwlzdHJ1Y3Qgc25kX2NhcmQJKmNhcmQ7CisJaW50 CQljYXJkX2luZGV4OworCWNoYXIJCSpjYXJkX2lkOworCXN0cnVjdCBoZG1pX2F1ZGlvX3JlZ2lz dGVyc19vcHMJcmVnX29wczsKKwlzdHJ1Y3QgaGRtaV9hdWRpb19xdWVyeV9zZXRfb3BzCXF1ZXJ5 X29wczsKKwllbnVtIGhhZF9kcnZfc3RhdHVzCWRydl9zdGF0dXM7CisJc3RydWN0CQlyaW5nX2J1 Zl9pbmZvIGJ1Zl9pbmZvW0hBRF9OVU1fT0ZfUklOR19CVUZTXTsKKwlzdHJ1Y3QJCXBjbV9zdHJl YW1faW5mbyBzdHJlYW1faW5mbzsKKwl1bmlvbiBvdG1faGRtaV9lbGRfdAllZWxkOworCWVudW0J CWludGVsX2hhZF9hdWRfYnVmX3R5cGUgY3Vycl9idWY7CisJaW50CQl2YWxpZF9idWZfY250Owor CXVuc2lnbmVkIGludAlhZXNfYml0czsKKwlpbnQgZmxhZ191bmRlcnJ1bjsKKwlzdHJ1Y3QgaGFk X3B2dF9kYXRhICpwcml2YXRlX2RhdGE7CisJc3BpbmxvY2tfdCBoYWRfc3BpbmxvY2s7CisJZW51 bQkJaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZmX2RvbmU7CisJc3RydWN0IGRldmljZSAqZGV2 OworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CisJc3RydWN0IHNuZF9wY21fY2htYXAgKmNo bWFwOworCXVuc2lnbmVkIGludAkqYXVkaW9fcmVnX2Jhc2U7CisJdW5zaWduZWQgaW50CWF1ZGlv X2NmZ19vZmZzZXQ7CisJYm9vbAkJaHdfc2lsZW5jZTsKKwlzdHJ1Y3QgaGFkX29wcwkqb3BzOwor fTsKKworc3RydWN0IGhhZF9vcHMgeworCXZvaWQgKCplbmFibGVfYXVkaW8pKHN0cnVjdCBzbmRf cGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJdTggZW5hYmxlKTsKKwl2b2lkICgqcmVzZXRf YXVkaW8pKHU4IHJlc2V0KTsKKwlpbnQgKCpwcm9nX24pKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIg Km5fcGFyYW0sCisJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpOworCXZvaWQg KCpwcm9nX2N0cykodTMyIGF1ZF9zYW1wX2ZyZXEsIHUzMiB0bWRzLCB1MzIgbl9wYXJhbSwKKwkJ CXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSk7CisJaW50ICgqYXVkaW9fY3RybCko c3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9pbnRl bGhhZCAqaW50ZWxoYWRkYXRhKTsKKwl2b2lkICgqcHJvZ19kaXApKHN0cnVjdCBzbmRfcGNtX3N1 YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0 YSk7CisJdm9pZCAoKmhhbmRsZV91bmRlcnJ1bikoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxo YWRkYXRhKTsKK307CisKKworaW50IGhhZF9ldmVudF9oYW5kbGVyKGVudW0gaGFkX2V2ZW50X3R5 cGUgZXZlbnRfdHlwZSwgdm9pZCAqZGF0YSk7CisKK2ludCBoZG1pX2F1ZGlvX3F1ZXJ5KHZvaWQg KmRydl9kYXRhLCBzdHJ1Y3QgaGRtaV9hdWRpb19ldmVudCBldmVudCk7CitpbnQgaGRtaV9hdWRp b19zdXNwZW5kKHZvaWQgKmRydl9kYXRhLCBzdHJ1Y3QgaGRtaV9hdWRpb19ldmVudCBldmVudCk7 CitpbnQgaGRtaV9hdWRpb19yZXN1bWUodm9pZCAqZHJ2X2RhdGEpOworaW50IGhkbWlfYXVkaW9f bW9kZV9jaGFuZ2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pOworZXh0ZXJu IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaW50ZWxoYWRfcGxheWJhY2tfb3BzOworCitpbnQgc25k X2ludGVsaGFkX2luaXRfYXVkaW9fY3RybChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0 cmVhbSwKKwkJCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhLAorCQkJCQlpbnQg ZmxhZ19zaWxlbmNlKTsKK2ludCBzbmRfaW50ZWxoYWRfcHJvZ19idWZmZXIoc3RydWN0IHNuZF9p bnRlbGhhZCAqaW50ZWxoYWRkYXRhLAorCQkJCQlpbnQgc3RhcnQsIGludCBlbmQpOworaW50IHNu ZF9pbnRlbGhhZF9pbnZkX2J1ZmZlcihpbnQgc3RhcnQsIGludCBlbmQpOworaW5saW5lIGludCBz bmRfaW50ZWxoYWRfcmVhZF9sZW4oc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKTsK K3ZvaWQgaGFkX2J1aWxkX2NoYW5uZWxfYWxsb2NhdGlvbl9tYXAoc3RydWN0IHNuZF9pbnRlbGhh ZCAqaW50ZWxoYWRkYXRhKTsKKworLyogUmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucyAqLworaW5s aW5lIGludCBoYWRfZ2V0X2h3c3RhdGUoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRh KTsKK2lubGluZSBpbnQgaGFkX2dldF9jYXBzKGVudW0gaGFkX2NhcHNfbGlzdCBxdWVyeV9lbGVt ZW50LAorCQkJCQkJdm9pZCAqY2FwYWJpbHRpZXMpOworaW5saW5lIGludCBoYWRfc2V0X2NhcHMo ZW51bSBoYWRfY2Fwc19saXN0IHNldF9lbGVtZW50LAorCQkJCQkJdm9pZCAqY2FwYWJpbHRpZXMp OworaW5saW5lIGludCBoYWRfcmVhZF9yZWdpc3Rlcih1aW50MzJfdCByZWdfYWRkciwgdWludDMy X3QgKmRhdGEpOworaW5saW5lIGludCBoYWRfd3JpdGVfcmVnaXN0ZXIodWludDMyX3QgcmVnX2Fk ZHIsIHVpbnQzMl90IGRhdGEpOworaW5saW5lIGludCBoYWRfcmVhZF9tb2RpZnkodWludDMyX3Qg cmVnX2FkZHIsIHVpbnQzMl90IGRhdGEsCisJCQkJCQkJdWludDMyX3QgbWFzayk7CisKKy8qKi8K K2ludCBoZG1pX2F1ZGlvX3Byb2JlKHZvaWQgKmRldnB0cik7CitpbnQgaGRtaV9hdWRpb19yZW1v dmUodm9pZCAqcGRldik7CisKKyNlbmRpZiAvKiBfSU5URUxfSERNSV9BVURJT18gKi8KZGlmZiAt LWdpdCBhL3NvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvX2lmLmMgYi9zb3VuZC94ODYvaW50ZWxf aGRtaV9hdWRpb19pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NTBi YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpb19pZi5jCkBA IC0wLDAgKzEsNTUxIEBACisvKgorICogICBpbnRlbF9oZG1pX2F1ZGlvX2lmLmMgLSBJbnRlbCBI RE1JIGF1ZGlvIGRyaXZlciBmb3IgTUlECisgKgorICogIENvcHlyaWdodCAoQykgMjAxNiBJbnRl bCBDb3JwCisgKiAgQXV0aG9yczoJU2FpbGFqYSBCYW5kYXJ1cGFsbGkgPHNhaWxhamEuYmFuZGFy dXBhbGxpQGludGVsLmNvbT4KKyAqCQlSYW1lc2ggQmFidSBLIFYgPHJhbWVzaC5iYWJ1QGludGVs LmNvbT4KKyAqCQlWYWliaGF2IEFnYXJ3YWwgPHZhaWJoYXYuYWdhcndhbEBpbnRlbC5jb20+Cisg KgkJSmVyb21lIEFuYW5kIDxqZXJvbWUuYW5hbmRAaW50ZWwuY29tPgorICogIH5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl ZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICog IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg dXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqIEFMU0Eg ZHJpdmVyIGZvciBJbnRlbCBNSUQgSERNSSBhdWRpbyBjb250cm9sbGVyLiAgVGhpcyBmaWxlIGNv bnRhaW5zCisgKiBpbnRlcmZhY2UgZnVuY3Rpb25zIGV4cG9zZWQgdG8gSERNSSBEaXNwbGF5IGRy aXZlciBhbmQgY29kZSB0byByZWdpc3RlcgorICogd2l0aCBBTFNBIGZyYW1ld29yay4uCisgKi8K KworI2RlZmluZSBwcl9mbXQoZm10KQkJImhhZDogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2lv Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4K KyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVk ZSAiaW50ZWxfaGRtaV9hdWRpby5oIgorI2luY2x1ZGUgImludGVsX2hkbWlfbHBlX2F1ZGlvLmgi CisKKy8qKgorICogaGRtaV9hdWRpb19xdWVyeSAtIGhkbWkgYXVkaW8gcXVlcnkgZnVuY3Rpb24K KyAqCisgKkBoYWRkYXRhOiBwb2ludGVyIHRvIEhBRCBwcml2YXRlIGRhdGEKKyAqQGV2ZW50OiBh dWRpbyBldmVudCBmb3Igd2hpY2ggdGhpcyBtZXRob2QgaXMgaW52b2tlZAorICoKKyAqIFRoaXMg ZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGNsaWVudCBkcml2ZXIgdG8gcXVlcnkgdGhlCisgKiBoZG1p IGF1ZGlvLgorICovCitpbnQgaGRtaV9hdWRpb19xdWVyeSh2b2lkICpoYWRkYXRhLCBzdHJ1Y3Qg aGRtaV9hdWRpb19ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1 YnN0cmVhbSA9IE5VTEw7CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKwl1bnNp Z25lZCBsb25nIGZsYWdfaXJxczsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEg PSAoc3RydWN0IHNuZF9pbnRlbGhhZCAqKWhhZGRhdGE7CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5z dHJlYW1faW5mby5oYWRfc3Vic3RyZWFtKQorCQlzdWJzdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnN0 cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW07CisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0YS0+cHJp dmF0ZV9kYXRhOworCXN3aXRjaCAoZXZlbnQudHlwZSkgeworCWNhc2UgSEFEX0VWRU5UX1FVRVJZ X0lTX0FVRElPX0JVU1k6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9z cGlubG9jaywgZmxhZ19pcnFzKTsKKworCQlpZiAoKGhhZF9zdHJlYW0tPnN0cmVhbV90eXBlID09 IEhBRF9SVU5OSU5HX1NUUkVBTSkgfHwKKwkJCXN1YnN0cmVhbSkgeworCQkJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssCisJCQkJCQlmbGFnX2lycXMp OworCQkJcHJfZGVidWcoIkF1ZGlvIHN0cmVhbSBhY3RpdmVcbiIpOworCQkJcmV0dXJuIC1FQlVT WTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlu bG9jaywgZmxhZ19pcnFzKTsKKwlicmVhazsKKworCWNhc2UgSEFEX0VWRU5UX1FVRVJZX0lTX0FV RElPX1NVU1BFTkRFRDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3Nw aW5sb2NrLCBmbGFnX2lycXMpOworCQlpZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID09IEhB RF9EUlZfU1VTUEVOREVEKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRh dGEtPmhhZF9zcGlubG9jaywKKwkJCQkJCWZsYWdfaXJxcyk7CisJCQlwcl9kZWJ1ZygiQXVkaW8g aXMgc3VzcGVuZGVkXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCWJyZWFrOwor CisJZGVmYXVsdDoKKwkJcHJfZGVidWcoImVycm9yIHVuLWhhbmRsZWQgZXZlbnQgISFcbiIpOwor CQlyZXR1cm4gLUVJTlZBTDsKKwlicmVhazsKKworCX0KKworCXJldHVybiAwOworfQorCisvKioK KyAqIGhkbWlfYXVkaW9fc3VzcGVuZCAtIHBvd2VyIG1hbmFnZW1lbnQgc3VzcGVuZCBmdW5jdGlv bgorICoKKyAqQGhhZGRhdGE6IHBvaW50ZXIgdG8gSEFEIHByaXZhdGUgZGF0YQorICpAZXZlbnQ6 IHBtIGV2ZW50IGZvciB3aGljaCB0aGlzIG1ldGhvZCBpcyBpbnZva2VkCisgKgorICogVGhpcyBm dW5jdGlvbiBpcyBjYWxsZWQgYnkgY2xpZW50IGRyaXZlciB0byBzdXNwZW5kIHRoZQorICogaGRt aSBhdWRpby4KKyAqLworaW50IGhkbWlfYXVkaW9fc3VzcGVuZCh2b2lkICpoYWRkYXRhLCBzdHJ1 Y3QgaGRtaV9hdWRpb19ldmVudCBldmVudCkKK3sKKwlpbnQgY2FwcywgcmV0dmFsID0gMDsKKwlz dHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ19pcnFz OworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfaW50 ZWxoYWQgKmludGVsaGFkZGF0YSA9IChzdHJ1Y3Qgc25kX2ludGVsaGFkICopaGFkZGF0YTsKKwor CXByX2RlYnVnKCJFbnRlcjolc1xuIiwgX19mdW5jX18pOworCisJaGFkX3N0cmVhbSA9IGludGVs aGFkZGF0YS0+cHJpdmF0ZV9kYXRhOworCXN1YnN0cmVhbSA9IGludGVsaGFkZGF0YS0+c3RyZWFt X2luZm8uaGFkX3N1YnN0cmVhbTsKKworCWlmIChpbnRlbGhhZGRhdGEtPmRldi0+cG93ZXIucnVu dGltZV9zdGF0dXMgIT0gUlBNX1NVU1BFTkRFRCkgeworCQlwcl9lcnIoImF1ZGlvIHN0cmVhbSBp cyBhY3RpdmVcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKworCXNwaW5fbG9ja19pcnFz YXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwlpZiAoaW50ZWxo YWRkYXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7CisJCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOwor CQlwcl9kZWJ1ZygiaGFkIG5vdCBjb25uZWN0ZWRcbiIpOworCQlyZXR1cm4gcmV0dmFsOworCX0K KworCWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPT0gSEFEX0RSVl9TVVNQRU5ERUQpIHsK KwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZs YWdfaXJxcyk7CisJCXByX2RlYnVnKCJoYWQgYWxyZWFkeSBzdXNwZW5kZWRcbiIpOworCQlyZXR1 cm4gcmV0dmFsOworCX0KKworCWludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9IEhBRF9EUlZfU1VT UEVOREVEOworCXByX2RlYnVnKCIlcyBAICVkOkRFQlVHIFBMVUcvVU5QTFVHIDogSEFEX0RSVl9T VVNQRU5ERURcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCisJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJLyoKKwkg KiBUb0RvOiBOZWVkIHRvIGRpc2FibGUgVU5ERVJSVU4gaW50ZXJydXB0cyBhcyB3ZWxsCisJICog IGNhcHMgPSBIRE1JX0FVRElPX1VOREVSUlVOIHwgSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwkg Ki8KKwljYXBzID0gSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwloYWRfc2V0X2NhcHMoSEFEX1NF VF9ESVNBQkxFX0FVRElPX0lOVCwgJmNhcHMpOworCWhhZF9zZXRfY2FwcyhIQURfU0VUX0RJU0FC TEVfQVVESU8sIE5VTEwpOworCXByX2RlYnVnKCJFeGl0OiVzIiwgX19mdW5jX18pOworCXJldHVy biByZXR2YWw7Cit9CisKKy8qKgorICogaGRtaV9hdWRpb19yZXN1bWUgLSBwb3dlciBtYW5hZ2Vt ZW50IHJlc3VtZSBmdW5jdGlvbgorICoKKyAqQGhhZGRhdGE6IHBvaW50ZXIgdG8gSEFEIHByaXZh dGUgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGNsaWVudCBkcml2ZXIg dG8gcmVzdW1lIHRoZQorICogaGRtaSBhdWRpby4KKyAqLworaW50IGhkbWlfYXVkaW9fcmVzdW1l KHZvaWQgKmhhZGRhdGEpCit7CisJaW50IGNhcHMsIHJldHZhbCA9IDA7CisJc3RydWN0IHNuZF9p bnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gKHN0cnVjdCBzbmRfaW50ZWxoYWQgKiloYWRkYXRhOwor CXVuc2lnbmVkIGxvbmcgZmxhZ19pcnFzOworCisJcHJfZGVidWcoIkVudGVyOiVzXG4iLCBfX2Z1 bmNfXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ss IGZsYWdfaXJxcyk7CisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX0RJ U0NPTk5FQ1RFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhh ZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZGVidWcoImhhZCBub3QgY29ubmVjdGVkXG4i KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyAhPSBI QURfRFJWX1NVU1BFTkRFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRh dGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZXJyKCJoYWQgaXMgbm90IGluIHN1 c3BlbmRlZCBzdGF0ZVxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChoYWRfZ2V0X2h3c3Rh dGUoaW50ZWxoYWRkYXRhKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRh dGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcmVzdW1l LiBEZXZpY2Ugbm90IGFjY2Vzc2libGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlp bnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPSBIQURfRFJWX0NPTk5FQ1RFRDsKKwlwcl9kZWJ1Zygi JXMgQCAlZDpERUJVRyBQTFVHL1VOUExVRyA6IEhBRF9EUlZfRElTQ09OTkVDVEVEXG4iLAorCQkJ X19mdW5jX18sIF9fTElORV9fKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRh dGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkvKgorCSAqIFRvRG86IE5lZWQgdG8gZW5h YmxlIFVOREVSUlVOIGludGVycnVwdHMgYXMgd2VsbAorCSAqIGNhcHMgPSBIRE1JX0FVRElPX1VO REVSUlVOIHwgSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwkgKi8KKwljYXBzID0gSERNSV9BVURJ T19CVUZGRVJfRE9ORTsKKwlyZXR2YWwgPSBoYWRfc2V0X2NhcHMoSEFEX1NFVF9FTkFCTEVfQVVE SU9fSU5ULCAmY2Fwcyk7CisJcmV0dmFsID0gaGFkX3NldF9jYXBzKEhBRF9TRVRfRU5BQkxFX0FV RElPLCBOVUxMKTsKKwlwcl9kZWJ1ZygiRXhpdDolcyIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcmV0 dmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCBoYWRfY2hrX2ludHJtaXNzKHN0cnVjdCBzbmRf aW50ZWxoYWQgKmludGVsaGFkZGF0YSwKKwkJZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIGJ1 Zl9pZCkKK3sKKwlpbnQgaSwgaW50cl9jb3VudCA9IDA7CisJZW51bSBpbnRlbF9oYWRfYXVkX2J1 Zl90eXBlIGJ1ZmZfZG9uZTsKKwl1MzIgYnVmX3NpemUsIGJ1Zl9hZGRyOworCXN0cnVjdCBoYWRf cHZ0X2RhdGEgKmhhZF9zdHJlYW07CisJdW5zaWduZWQgbG9uZyBmbGFnX2lycXM7CisKKwloYWRf c3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisKKwlidWZmX2RvbmUgPSBidWZf aWQ7CisKKwlpbnRyX2NvdW50ID0gc25kX2ludGVsaGFkX3JlYWRfbGVuKGludGVsaGFkZGF0YSk7 CisJaWYgKGludHJfY291bnQgPiAxKSB7CisJCS8qIEluIGNhc2Ugb2YgYWN0aXZlIHBsYXliYWNr ICovCisJCXByX2VycigiRHJpdmVyIGRldGVjdGVkICVkIG1pc3NlZCBidWZmZXIgZG9uZSBpbnRl cnJ1cHQocykhISEhXG4iLAorCQkJCShpbnRyX2NvdW50IC0gMSkpOworCQlpZiAoaW50cl9jb3Vu dCA+IDMpCisJCQlyZXR1cm4gaW50cl9jb3VudDsKKworCQlidWZfaWQgKz0gKGludHJfY291bnQg LSAxKTsKKwkJLyogUmVwcm9ncmFtIHJlZ2lzdGVycyovCisJCWZvciAoaSA9IGJ1ZmZfZG9uZTsg aSA8IGJ1Zl9pZDsgaSsrKSB7CisJCQlpbnQgaiA9IGkgJSA0OworCisJCQlidWZfc2l6ZSA9IGlu dGVsaGFkZGF0YS0+YnVmX2luZm9bal0uYnVmX3NpemU7CisJCQlidWZfYWRkciA9IGludGVsaGFk ZGF0YS0+YnVmX2luZm9bal0uYnVmX2FkZHI7CisJCQloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JV Rl9BX0xFTkdUSCArCisJCQkJCShqICogSEFEX1JFR19XSURUSCksIGJ1Zl9zaXplKTsKKwkJCWhh ZF93cml0ZV9yZWdpc3RlcigKKwkJCQkJQVVEX0JVRl9BX0FERFIrKGogKiBIQURfUkVHX1dJRFRI KSwKKwkJCQkJKGJ1Zl9hZGRyIHwgQklUKDApIHwgQklUKDEpKSk7CisJCX0KKwkJYnVmX2lkID0g YnVmX2lkICUgNDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5s b2NrLCBmbGFnX2lycXMpOworCQlpbnRlbGhhZGRhdGEtPmJ1ZmZfZG9uZSA9IGJ1Zl9pZDsKKwkJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdf aXJxcyk7CisJfQorCisJcmV0dXJuIGludHJfY291bnQ7Cit9CisKK2ludCBoYWRfcHJvY2Vzc19i dWZmZXJfZG9uZShzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJaW50IHJl dHZhbCA9IDA7CisJdTMyIGxlbiA9IDE7CisJZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIGJ1 Zl9pZDsKKwllbnVtIGludGVsX2hhZF9hdWRfYnVmX3R5cGUgYnVmZl9kb25lOworCXN0cnVjdCBw Y21fc3RyZWFtX2luZm8gKnN0cmVhbTsKKwl1MzIgYnVmX3NpemU7CisJc3RydWN0IGhhZF9wdnRf ZGF0YSAqaGFkX3N0cmVhbTsKKwlpbnQgaW50cl9jb3VudDsKKwllbnVtIGhhZF9zdGF0dXNfc3Ry ZWFtCQlzdHJlYW1fdHlwZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxczsKKworCWhhZF9zdHJl YW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKwlzdHJlYW0gPSAmaW50ZWxoYWRkYXRh LT5zdHJlYW1faW5mbzsKKwlpbnRyX2NvdW50ID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZp bnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwlpZiAoaW50ZWxoYWRkYXRh LT5kcnZfc3RhdHVzID09IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7CisJCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlwcl9l cnIoIiVzOkRldmljZSBhbHJlYWR5IGRpc2Nvbm5lY3RlZFxuIiwgX19mdW5jX18pOworCQlyZXR1 cm4gcmV0dmFsOworCX0KKwlidWZfaWQgPSBpbnRlbGhhZGRhdGEtPmN1cnJfYnVmOworCWludGVs aGFkZGF0YS0+YnVmZl9kb25lID0gYnVmX2lkOworCWJ1ZmZfZG9uZSA9IGludGVsaGFkZGF0YS0+ YnVmZl9kb25lOworCWJ1Zl9zaXplID0gaW50ZWxoYWRkYXRhLT5idWZfaW5mb1tidWZfaWRdLmJ1 Zl9zaXplOworCXN0cmVhbV90eXBlID0gaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGU7CisKKwlwcl9k ZWJ1ZygiRW50ZXI6JXMgYnVmX2lkPSVkXG4iLCBfX2Z1bmNfXywgYnVmX2lkKTsKKworCS8qIEV2 ZXJ5IGRlYnVnIHN0YXRlbWVudCBoYXMgYW4gaW1wbGljYXRpb24KKwkgKiBvZiB+NW1zZWMuIFRo dXMsIGF2b2lkIGhhdmluZyA+MyBkZWJ1ZyBzdGF0ZW1lbnRzCisJICogZm9yIGVhY2ggYnVmZmVy X2RvbmUgaGFuZGxpbmcuCisJICovCisKKwkvKiBDaGVjayBmb3IgYW55IGludHJfbWlzcyBpbiBj YXNlIG9mIGFjdGl2ZSBwbGF5YmFjayAqLworCWlmIChoYWRfc3RyZWFtLT5zdHJlYW1fdHlwZSA9 PSBIQURfUlVOTklOR19TVFJFQU0pIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxo YWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJCWludHJfY291bnQgPSBoYWRfY2hr X2ludHJtaXNzKGludGVsaGFkZGF0YSwgYnVmX2lkKTsKKwkJaWYgKCFpbnRyX2NvdW50IHx8IChp bnRyX2NvdW50ID4gMykpIHsKKwkJCXByX2VycigiSEFEIFNXIHN0YXRlIGluIG5vbi1yZWNvdmVy YWJsZSEhISBtb2RlXG4iKTsKKwkJCXByX2VycigiQWxyZWFkeSBwbGF5ZWQgc3RhbGUgZGF0YVxu Iik7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCWJ1Zl9pZCArPSAoaW50cl9jb3VudCAtIDEp OworCQlidWZfaWQgPSBidWZfaWQgJSA0OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRk YXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJfQorCisJaW50ZWxoYWRkYXRhLT5idWZf aW5mb1tidWZfaWRdLmlzX3ZhbGlkID0gdHJ1ZTsKKwlpZiAoaW50ZWxoYWRkYXRhLT52YWxpZF9i dWZfY250LTEgPT0gYnVmX2lkKSB7CisJCWlmIChoYWRfc3RyZWFtLT5zdHJlYW1fdHlwZSA+PSBI QURfUlVOTklOR19TVFJFQU0pCisJCQlpbnRlbGhhZGRhdGEtPmN1cnJfYnVmID0gSEFEX0JVRl9U WVBFX0E7CisJfSBlbHNlCisJCWludGVsaGFkZGF0YS0+Y3Vycl9idWYgPSBidWZfaWQgKyAxOwor CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZs YWdfaXJxcyk7CisKKwlpZiAoaGFkX2dldF9od3N0YXRlKGludGVsaGFkZGF0YSkpIHsKKwkJcHJf ZXJyKCJIRE1JIGNhYmxlIHBsdWdnZWQtb3V0XG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisK KwkvKlJlcHJvZ3JhbSB0aGUgcmVnaXN0ZXJzIHdpdGggYWRkciBhbmQgbGVuZ3RoKi8KKwloYWRf d3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9BX0xFTkdUSCArCisJCQkoYnVmX2lkICogSEFEX1JFR19X SURUSCksIGJ1Zl9zaXplKTsKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9BX0FERFIrKGJ1 Zl9pZCAqIEhBRF9SRUdfV0lEVEgpLAorCQkJaW50ZWxoYWRkYXRhLT5idWZfaW5mb1tidWZfaWRd LmJ1Zl9hZGRyfAorCQkJQklUKDApIHwgQklUKDEpKTsKKworCWhhZF9yZWFkX3JlZ2lzdGVyKEFV RF9CVUZfQV9MRU5HVEggKyAoYnVmX2lkICogSEFEX1JFR19XSURUSCksCisJCQkJCSZsZW4pOwor CXByX2RlYnVnKCIlczpFbmFibGVkIGJ1ZlslZF1cbiIsIF9fZnVuY19fLCBidWZfaWQpOworCisJ LyogSW4gY2FzZSBvZiBhY3R1YWwgZGF0YSwKKwkgKiByZXBvcnQgYnVmZmVyX2RvbmUgdG8gYWJv dmUgQUxTQSBsYXllcgorCSAqLworCWJ1Zl9zaXplID0gIGludGVsaGFkZGF0YS0+YnVmX2luZm9b YnVmX2lkXS5idWZfc2l6ZTsKKwlpZiAoc3RyZWFtX3R5cGUgPj0gSEFEX1JVTk5JTkdfU1RSRUFN KSB7CisJCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3JlbmRlcmVkICs9CisJCQko aW50cl9jb3VudCAqIGJ1Zl9zaXplKTsKKwkJc3RyZWFtLT5wZXJpb2RfZWxhcHNlZChzdHJlYW0t PmhhZF9zdWJzdHJlYW0pOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBoYWRfcHJv Y2Vzc19idWZmZXJfdW5kZXJydW4oc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQor eworCWludCByZXR2YWwgPSAwOworCWVudW0gaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZfaWQ7 CisJc3RydWN0IHBjbV9zdHJlYW1faW5mbyAqc3RyZWFtOworCXN0cnVjdCBoYWRfcHZ0X2RhdGEg KmhhZF9zdHJlYW07CisJZW51bSBoYWRfc3RhdHVzX3N0cmVhbSBzdHJlYW1fdHlwZTsKKwl1bnNp Z25lZCBsb25nIGZsYWdfaXJxczsKKwlpbnQgZHJ2X3N0YXR1czsKKworCWhhZF9zdHJlYW0gPSBp bnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKwlzdHJlYW0gPSAmaW50ZWxoYWRkYXRhLT5zdHJl YW1faW5mbzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9j aywgZmxhZ19pcnFzKTsKKwlidWZfaWQgPSBpbnRlbGhhZGRhdGEtPmN1cnJfYnVmOworCXN0cmVh bV90eXBlID0gaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGU7CisJaW50ZWxoYWRkYXRhLT5idWZmX2Rv bmUgPSBidWZfaWQ7CisJZHJ2X3N0YXR1cyA9IGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1czsKKwlp ZiAoc3RyZWFtX3R5cGUgPT0gSEFEX1JVTk5JTkdfU1RSRUFNKQorCQlpbnRlbGhhZGRhdGEtPmN1 cnJfYnVmID0gSEFEX0JVRl9UWVBFX0E7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRl bGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKworCXByX2RlYnVnKCJFbnRlcjol cyBidWZfaWQ9JWQsIHN0cmVhbV90eXBlPSVkXG4iLAorCQkJX19mdW5jX18sIGJ1Zl9pZCwgc3Ry ZWFtX3R5cGUpOworCisJaW50ZWxoYWRkYXRhLT5vcHMtPmhhbmRsZV91bmRlcnJ1bihpbnRlbGhh ZGRhdGEpOworCisJaWYgKGRydl9zdGF0dXMgPT0gSEFEX0RSVl9ESVNDT05ORUNURUQpIHsKKwkJ cHJfZXJyKCIlczpEZXZpY2UgYWxyZWFkeSBkaXNjb25uZWN0ZWRcbiIsIF9fZnVuY19fKTsKKwkJ cmV0dXJuIHJldHZhbDsKKwl9CisKKwlpZiAoc3RyZWFtX3R5cGUgPT0gSEFEX1JVTk5JTkdfU1RS RUFNKSB7CisJCS8qIFJlcG9ydCBVTkRFUlJVTiBlcnJvciB0byBhYm92ZSBsYXllcnMgKi8KKwkJ aW50ZWxoYWRkYXRhLT5mbGFnX3VuZGVycnVuID0gMTsKKwkJc3RyZWFtLT5wZXJpb2RfZWxhcHNl ZChzdHJlYW0tPmhhZF9zdWJzdHJlYW0pOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK2lu dCBoYWRfcHJvY2Vzc19ob3RfcGx1ZyhzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEp Cit7CisJaW50IHJldHZhbCA9IDA7CisJZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIGJ1Zl9p ZDsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlzdHJ1Y3QgaGFkX3B2 dF9kYXRhICpoYWRfc3RyZWFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ19pcnFzOworCisJcHJfZGVi dWcoIkVudGVyOiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlzdWJzdHJlYW0gPSBpbnRlbGhhZGRhdGEt PnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW07CisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0YS0+ cHJpdmF0ZV9kYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3Nw aW5sb2NrLCBmbGFnX2lycXMpOworCWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPT0gSEFE X0RSVl9DT05ORUNURUQpIHsKKwkJcHJfZGVidWcoIkRldmljZSBhbHJlYWR5IGNvbm5lY3RlZFxu Iik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2Nr LCBmbGFnX2lycXMpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlidWZfaWQgPSBpbnRlbGhhZGRh dGEtPmN1cnJfYnVmOworCWludGVsaGFkZGF0YS0+YnVmZl9kb25lID0gYnVmX2lkOworCWludGVs aGFkZGF0YS0+ZHJ2X3N0YXR1cyA9IEhBRF9EUlZfQ09OTkVDVEVEOworCXByX2RlYnVnKCIlcyBA ICVkOkRFQlVHIFBMVUcvVU5QTFVHIDogSEFEX0RSVl9DT05ORUNURURcbiIsCisJCQlfX2Z1bmNf XywgX19MSU5FX18pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFk X3NwaW5sb2NrLCBmbGFnX2lycXMpOworCisJcHJfZGVidWcoIlByb2Nlc3NpbmcgSE9UX1BMVUcs IGJ1Zl9pZCA9ICVkXG4iLCBidWZfaWQpOworCisJIC8qIFF1ZXJ5IGRpc3BsYXkgZHJpdmVyIGZv ciBhdWRpbyByZWdpc3RlciBiYXNlICovCisJaWYgKGludGVsaGFkZGF0YS0+cmVnX29wcy5oZG1p X2F1ZGlvX2dldF9yZWdpc3Rlcl9iYXNlKAorCQkmaW50ZWxoYWRkYXRhLT5hdWRpb19yZWdfYmFz ZSwKKwkJJmludGVsaGFkZGF0YS0+YXVkaW9fY2ZnX29mZnNldCkpIHsKKwkJcHJfZXJyKCJVbmFi bGUgdG8gZ2V0IGF1ZGlvIHJlZyBiYXNlIGZyb20gRGlzcGxheSBkcml2ZXJcbiIpOworCQlnb3Rv IGVycjsKKwl9CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5hdWRpb19yZWdfYmFzZSA9PSBOVUxMKSB7 CisJCXByX2VycigiYXVkaW8gcmVnIGJhc2UgdmFsdWUgaXMgTlVMTFxuIik7CisJCWdvdG8gZXJy OworCX0KKworCXByX2RlYnVnKCIlcyBhdWRpb19yZWdfYmFzZSA9IDB4JXBcbiIsIF9fZnVuY19f LAorCQkJaW50ZWxoYWRkYXRhLT5hdWRpb19yZWdfYmFzZSk7CisKKwkvKiBTYWZldHkgY2hlY2sg Ki8KKwlpZiAoc3Vic3RyZWFtKSB7CisJCXByX2RlYnVnKCJUaGVyZSBzaG91bGQgbm90IGJlIGFj dGl2ZSBQQiBmcm9tIEFMU0FcbiIpOworCQlwcl9kZWJ1ZygiU2lnbmlmaWVzLCBjYWJsZSBpcyBw bHVnZ2VkLWluIGV2ZW4gYmVmb3JlXG4iKTsKKwkJcHJfZGVidWcoInByb2Nlc3Npbmcgc25kX3Bj bV9kaXNjb25uZWN0XG4iKTsKKwkJLyogU2V0IHJ1bnRpbWUtPnN0YXRlIHRvIGh3X3BhcmFtcyBk b25lICovCisJCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9TRVRVUCk7 CisJfQorCisJaGFkX2J1aWxkX2NoYW5uZWxfYWxsb2NhdGlvbl9tYXAoaW50ZWxoYWRkYXRhKTsK KworCXJldHVybiByZXR2YWw7CisKK2VycjoKKwlwbV9ydW50aW1lX2Rpc2FibGUoaW50ZWxoYWRk YXRhLT5kZXYpOworCWludGVsaGFkZGF0YS0+ZGV2ID0gTlVMTDsKKwlyZXR1cm4gcmV0dmFsOwor fQorCitpbnQgaGFkX3Byb2Nlc3NfaG90X3VucGx1ZyhzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRl bGhhZGRhdGEpCit7CisJaW50IGNhcHMsIHJldHZhbCA9IDA7CisJZW51bSBpbnRlbF9oYWRfYXVk X2J1Zl90eXBlIGJ1Zl9pZDsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCXVu c2lnbmVkIGxvbmcgZmxhZ19pcnFzOworCisJcHJfZGVidWcoIkVudGVyOiVzXG4iLCBfX2Z1bmNf Xyk7CisKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisJYnVmX2lk ID0gaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlbGhh ZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKworCWlmIChpbnRlbGhhZGRhdGEtPmRy dl9zdGF0dXMgPT0gSEFEX0RSVl9ESVNDT05ORUNURUQpIHsKKwkJcHJfZGVidWcoIkRldmljZSBh bHJlYWR5IGRpc2Nvbm5lY3RlZFxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVs aGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlyZXR1cm4gcmV0dmFsOworCisJ fSBlbHNlIHsKKwkJLyogRGlzYWJsZSBBdWRpbyAqLworCQljYXBzID0gSERNSV9BVURJT19CVUZG RVJfRE9ORTsKKwkJcmV0dmFsID0gaGFkX3NldF9jYXBzKEhBRF9TRVRfRElTQUJMRV9BVURJT19J TlQsICZjYXBzKTsKKwkJcmV0dmFsID0gaGFkX3NldF9jYXBzKEhBRF9TRVRfRElTQUJMRV9BVURJ TywgTlVMTCk7CisJCWludGVsaGFkZGF0YS0+b3BzLT5lbmFibGVfYXVkaW8oCisJCQlpbnRlbGhh ZGRhdGEtPnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW0sIDApOworCX0KKworCWludGVsaGFkZGF0 YS0+ZHJ2X3N0YXR1cyA9IEhBRF9EUlZfRElTQ09OTkVDVEVEOworCXByX2RlYnVnKCIlcyBAICVk OkRFQlVHIFBMVUcvVU5QTFVHIDogSEFEX0RSVl9ESVNDT05ORUNURURcbiIsCisJCQlfX2Z1bmNf XywgX19MSU5FX18pOworCisJLyogUmVwb3J0IHRvIGFib3ZlIEFMU0EgbGF5ZXIgKi8KKwlpZiAo aW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFtICE9IE5VTEwpIHsKKwkJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJx cyk7CisJCXByX2RlYnVnKCIlczogdW5sb2NrIC0+IHNlbmRpbmcgcGNtX3N0b3AgLT4gbG9ja1xu IiwgX19mdW5jX18pOworCQlzbmRfcGNtX3N0b3AoaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5o YWRfc3Vic3RyZWFtLAorCQkJCVNORFJWX1BDTV9TVEFURV9ESVNDT05ORUNURUQpOworCQlzcGlu X2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJ fQorCisJaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGUgPSBIQURfSU5JVDsKKwlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwlrZnJl ZShpbnRlbGhhZGRhdGEtPmNobWFwLT5jaG1hcCk7CisJaW50ZWxoYWRkYXRhLT5jaG1hcC0+Y2ht YXAgPSBOVUxMOworCWludGVsaGFkZGF0YS0+YXVkaW9fcmVnX2Jhc2UgPSBOVUxMOworCXByX2Rl YnVnKCIlczogdW5sb2NrZWQgLT4gcmV0dXJuZWRcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiBy ZXR2YWw7Cit9CisKKy8qKgorICogaGFkX2V2ZW50X2hhbmRsZXIgLSBDYWxsIGJhY2sgZnVuY3Rp b24gdG8gaGFuZGxlIGV2ZW50cworICoKKyAqIEBldmVudF90eXBlOiBFdmVudCB0eXBlIHRvIGhh bmRsZQorICogQGRhdGE6IGRhdGEgcmVsYXRlZCB0byB0aGUgZXZlbnRfdHlwZQorICoKKyAqIFRo aXMgZnVuY3Rpb24gaXMgaW52b2tlZCB0byBoYW5kbGUgSERNSSBldmVudHMgZnJvbSBjbGllbnQg ZHJpdmVyLgorICovCitpbnQgaGFkX2V2ZW50X2hhbmRsZXIoZW51bSBoYWRfZXZlbnRfdHlwZSBl dmVudF90eXBlLCB2b2lkICpkYXRhKQoreworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBzbmRf aW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IGRhdGE7CisJZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90 eXBlIGJ1Zl9pZDsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlzdHJ1 Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ19pcnFzOwor CisJYnVmX2lkID0gaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZjsKKwloYWRfc3RyZWFtID0gaW50ZWxo YWRkYXRhLT5wcml2YXRlX2RhdGE7CisKKwkvKiBTd2l0Y2hpbmcgdG8gYSBmdW5jdGlvbiBjYW4g ZHJvcCBhdG9taWNpdHkgZXZlbiBpbiBJTlRSIGNvbnRleHQuCisJICogVGh1cywgYSBiaWcgbG9j ayBpcyBhY3F1aXJlZCB0byBtYWludGFpbiBhdG9taWNpdHkuCisJICogVGhpcyBjYW4gYmUgb3B0 aW1pemVkIGxhdGVyLgorCSAqIEN1cnJlbnRseSwgb25seSBidWZmZXJfZG9uZS9fdW5kZXJydW4g ZXhlY3V0ZXMgaW4gSU5UUiBjb250ZXh0LgorCSAqIEFsc28sIGxvY2tpbmcgaXMgaW1wbGVtZW50 ZWQgc2VwYXJhdGVseSB0byBhdm9pZCByZWFsIGNvbnRlbnRpb24KKwkgKiBvZiBkYXRhKHN0cnVj dCBpbnRlbGhhZGRhdGEpIGJldHdlZW4gSVJRL1NPRlRfSVJRL1BST0NFU1MgY29udGV4dC4KKwkg Ki8KKwlzdWJzdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW07 CisJc3dpdGNoIChldmVudF90eXBlKSB7CisJY2FzZSBIQURfRVZFTlRfQVVESU9fQlVGRkVSX0RP TkU6CisJCXJldHZhbCA9IGhhZF9wcm9jZXNzX2J1ZmZlcl9kb25lKGludGVsaGFkZGF0YSk7CisJ YnJlYWs7CisKKwljYXNlIEhBRF9FVkVOVF9BVURJT19CVUZGRVJfVU5ERVJSVU46CisJCXJldHZh bCA9IGhhZF9wcm9jZXNzX2J1ZmZlcl91bmRlcnJ1bihpbnRlbGhhZGRhdGEpOworCWJyZWFrOwor CisJY2FzZSBIQURfRVZFTlRfSE9UX1BMVUc6CisJCXJldHZhbCA9IGhhZF9wcm9jZXNzX2hvdF9w bHVnKGludGVsaGFkZGF0YSk7CisJYnJlYWs7CisKKwljYXNlIEhBRF9FVkVOVF9IT1RfVU5QTFVH OgorCQlyZXR2YWwgPSBoYWRfcHJvY2Vzc19ob3RfdW5wbHVnKGludGVsaGFkZGF0YSk7CisJYnJl YWs7CisKKwljYXNlIEhBRF9FVkVOVF9NT0RFX0NIQU5HSU5HOgorCQlwcl9kZWJ1ZygiIGNhbGxl ZCBfZXZlbnRfaGFuZGxlciB3aXRoIF9NT0RFX0NIQU5HRSBldmVudFxuIik7CisJCS8qIFByb2Nl c3Mgb25seSBpZiBzdHJlYW0gaXMgYWN0aXZlICYgY2FibGUgUGx1Z2dlZC1pbiAqLworCQlzcGlu X2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJ CWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPj0gSEFEX0RSVl9ESVNDT05ORUNURUQpIHsK KwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLAor CQkJCQlmbGFnX2lycXMpOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJCWlmICgoaGFkX3N0 cmVhbS0+c3RyZWFtX3R5cGUgPT0gSEFEX1JVTk5JTkdfU1RSRUFNKQorCQkJCSYmIHN1YnN0cmVh bSkKKwkJCXJldHZhbCA9IGhkbWlfYXVkaW9fbW9kZV9jaGFuZ2Uoc3Vic3RyZWFtKTsKKwlicmVh azsKKworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCJlcnJvciB1bi1oYW5kbGVkIGV2ZW50ICEhXG4i KTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwlicmVhazsKKworCX0KKwlyZXR1cm4gcmV0dmFsOwor fQpkaWZmIC0tZ2l0IGEvc291bmQveDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlvLmMgYi9zb3VuZC94 ODYvaW50ZWxfaGRtaV9scGVfYXVkaW8uYwppbmRleCA2MTM0N2FiLi5iZWUxYmI0IDEwMDY0NAot LS0gYS9zb3VuZC94ODYvaW50ZWxfaGRtaV9scGVfYXVkaW8uYworKysgYi9zb3VuZC94ODYvaW50 ZWxfaGRtaV9scGVfYXVkaW8uYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2lu aXR2YWwuaD4KICNpbmNsdWRlIDxkcm0vaW50ZWxfbHBlX2F1ZGlvLmg+CiAjaW5jbHVkZSAiaW50 ZWxfaGRtaV9scGVfYXVkaW8uaCIKKyNpbmNsdWRlICJpbnRlbF9oZG1pX2F1ZGlvLmgiCiAKIC8q IGdsb2JhbHMqLwogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaGxwZV9wZGV2OwpAQCAtNDYyLDkg KzQ2Myw5IEBAIHN0YXRpYyB2b2lkIG5vdGlmeV9hdWRpb19scGUodm9pZCAqYXVkaW9fcHRyKQog LyoqCiAgKiBoZG1pX2xwZV9hdWRpb19wcm9iZSAtIHN0YXJ0IGJyaWRnZSB3aXRoIGk5MTUKICAq Ci0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBpOTE1IGRyaXZlciBjcmVhdGVz IHRoZSBoZG1pLWxwZS1hdWRpbwotICogcGxhdGZvcm0gZGV2aWNlLiBDYXJkIGNyZWF0aW9uIGlz IGRlZmVycmVkIHVudGlsIGEgaG90IHBsdWcgZXZlbnQgaXMKLSAqIHJlY2VpdmVkCisgKiBUaGlz IGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBpOTE1IGRyaXZlciBjcmVhdGVzIHRoZQorICog aGRtaS1scGUtYXVkaW8gcGxhdGZvcm0gZGV2aWNlLiBDYXJkIGNyZWF0aW9uIGlzIGRlZmVycmVk IHVudGlsIGEKKyAqIGhvdCBwbHVnIGV2ZW50IGlzIHJlY2VpdmVkCiAgKi8KIHN0YXRpYyBpbnQg aGRtaV9scGVfYXVkaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKQEAg LTUwNiw4ICs1MDcsOCBAQCBzdGF0aWMgaW50IGhkbWlfbHBlX2F1ZGlvX3Byb2JlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAJCSh1bnNpZ25lZCBpbnQpcmVzX21taW8tPnN0YXJ0LCAo dW5zaWduZWQgaW50KXJlc19tbWlvLT5lbmQpOwogCiAJbW1pb19zdGFydCA9IGlvcmVtYXBfbm9j YWNoZShyZXNfbW1pby0+c3RhcnQsCi0JCQkJKHNpemVfdCkoKHJlc19tbWlvLT5lbmQgLSByZXNf bW1pby0+c3RhcnQpCi0JCQkJCQkrIDEpKTsKKwkJCQkoc2l6ZV90KSgocmVzX21taW8tPmVuZCAt CisJCQkJCXJlc19tbWlvLT5zdGFydCkgKyAxKSk7CiAJaWYgKCFtbWlvX3N0YXJ0KSB7CiAJCXBy X2VycigiQ291bGQgbm90IGdldCBpb3JlbWFwXG4iKTsKIAkJcmV0dXJuIC1FQUNDRVM7CkBAIC01 NTcsMTEgKzU1OCwxMiBAQCBzdGF0aWMgaW50IGhkbWlfbHBlX2F1ZGlvX3Byb2JlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjdHgp OwogCisJcmV0ID0gaGRtaV9hdWRpb19wcm9iZSgodm9pZCAqKXBkZXYpOworCiAJcHJfZGVidWco ImhkbWkgbHBlIGF1ZGlvOiBzZXR0aW5nIHBpbiBlbGQgbm90aWZ5IGNhbGxiYWNrXG4iKTsKIAog CXNwaW5fbG9ja19pcnFzYXZlKCZwZGF0YS0+bHBlX2F1ZGlvX3Nsb2NrLCBmbGFnX2lycSk7CiAJ cGRhdGEtPm5vdGlmeV9hdWRpb19scGUgPSBub3RpZnlfYXVkaW9fbHBlOwotCiAJaWYgKHBkYXRh LT5ub3RpZnlfcGVuZGluZykgewogCiAJCXByX2RlYnVnKCIlczogaGFuZGxlIHBlbmRpbmcgbm90 aWZpY2F0aW9uXG4iLCBfX2Z1bmNfXyk7CkBAIC01ODUsNiArNTg3LDggQEAgc3RhdGljIGludCBo ZG1pX2xwZV9hdWRpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAogCXBy X2RlYnVnKCJFbnRlciAlc1xuIiwgX19mdW5jX18pOwogCisJaGRtaV9hdWRpb19yZW1vdmUocGRl dik7CisKIAkvKiBnZXQgY29udGV4dCwgcmVsZWFzZSByZXNvdXJjZXMgKi8KIAljdHggPSBwbGF0 Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpb3VubWFwKGN0eC0+bW1pb19zdGFydCk7Ci0tIAoy LjkuMwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50 ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBz Oi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==