From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jerome Anand Subject: [PATCH 4/7] ALSA: x86: hdmi: Add audio support for BYT and CHT Date: Mon, 12 Dec 2016 23:40:40 +0530 Message-ID: <20161212181043.12512-5-jerome.anand@intel.com> References: <20161212181043.12512-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: <20161212181043.12512-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 b3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpby5jICAgICB8IDE5MDcgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysKIHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvLmggICAgIHwg IDIwMSArKysrCiBzb3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpb19pZi5jICB8ICA1NTEgKysrKysr KysrKysKIHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2xwZV9hdWRpby5jIHwgICAxNiArLQogNSBmaWxl cyBjaGFuZ2VkLCAyNjcxIGluc2VydGlvbnMoKyksIDYgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9k ZSAxMDA2NDQgc291bmQveDg2L2ludGVsX2hkbWlfYXVkaW8uYwogY3JlYXRlIG1vZGUgMTAwNjQ0 IHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC94 ODYvaW50ZWxfaGRtaV9hdWRpb19pZi5jCgpkaWZmIC0tZ2l0IGEvc291bmQveDg2L01ha2VmaWxl IGIvc291bmQveDg2L01ha2VmaWxlCmluZGV4IDc4YjJhZTEuLmJjMDc0ZDAgMTAwNjQ0Ci0tLSBh L3NvdW5kL3g4Ni9NYWtlZmlsZQorKysgYi9zb3VuZC94ODYvTWFrZWZpbGUKQEAgLTMsNiArMyw4 IEBAIERSSVZFUl9OQU1FIDo9IGhkbWlfbHBlX2F1ZGlvCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJz L2dwdS9kcm0vaTkxNQogCiAkKERSSVZFUl9OQU1FKS1vYmpzICs9IFwKKwlpbnRlbF9oZG1pX2F1 ZGlvLm8gXAorCWludGVsX2hkbWlfYXVkaW9faWYubyBcCiAJaW50ZWxfaGRtaV9scGVfYXVkaW8u bwogCiBvYmotJChDT05GSUdfSERNSV9MUEVfQVVESU8pICs9ICQoRFJJVkVSX05BTUUpLm8KZGlm ZiAtLWdpdCBhL3NvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvLmMgYi9zb3VuZC94ODYvaW50ZWxf aGRtaV9hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MWI3ZDcK LS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpby5jCkBAIC0wLDAg KzEsMTkwNyBAQAorLyoKKyAqICAgaW50ZWxfaGRtaV9hdWRpby5jIC0gSW50ZWwgSERNSSBhdWRp byBkcml2ZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDE2IEludGVsIENvcnAKKyAqICBBdXRo b3JzOglTYWlsYWphIEJhbmRhcnVwYWxsaSA8c2FpbGFqYS5iYW5kYXJ1cGFsbGlAaW50ZWwuY29t PgorICoJCVJhbWVzaCBCYWJ1IEsgVgk8cmFtZXNoLmJhYnVAaW50ZWwuY29tPgorICoJCVZhaWJo YXYgQWdhcndhbCA8dmFpYmhhdi5hZ2Fyd2FsQGludGVsLmNvbT4KKyAqCQlKZXJvbWUgQW5hbmQg PGplcm9tZS5hbmFuZEBpbnRlbC5jb20+CisgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAg VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlz IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICog IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg b2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0 YWlscy4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICogQUxTQSBkcml2ZXIgZm9yIEludGVs IEhETUkgYXVkaW8KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpCSJoYWQ6ICIgZm10CisKKyNp bmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgor I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNs dWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRl IDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQv cGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3Vu ZC9jb250cm9sLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgImludGVs X2hkbWlfYXVkaW8uaCIKKworc3RhdGljIERFRklORV9NVVRFWChoYWRfbXV0ZXgpOworCisvKnN0 YW5kYXJkIG1vZHVsZSBvcHRpb25zIGZvciBBTFNBLiBUaGlzIG1vZHVsZSBzdXBwb3J0cyBvbmx5 IG9uZSBjYXJkKi8KK3N0YXRpYyBpbnQgaGRtaV9jYXJkX2luZGV4ID0gU05EUlZfREVGQVVMVF9J RFgxOworc3RhdGljIGNoYXIgKmhkbWlfY2FyZF9pZCA9IFNORFJWX0RFRkFVTFRfU1RSMTsKK3N0 YXRpYyBzdHJ1Y3Qgc25kX2ludGVsaGFkICpoYWRfZGF0YTsKKworbW9kdWxlX3BhcmFtKGhkbWlf Y2FyZF9pbmRleCwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaGRtaV9jYXJkX2luZGV4 LAorCQkiSW5kZXggdmFsdWUgZm9yIElOVEVMIEludGVsIEhETUkgQXVkaW8gY29udHJvbGxlci4i KTsKK21vZHVsZV9wYXJhbShoZG1pX2NhcmRfaWQsIGNoYXJwLCAwNDQ0KTsKK01PRFVMRV9QQVJN X0RFU0MoaGRtaV9jYXJkX2lkLAorCQkiSUQgc3RyaW5nIGZvciBJTlRFTCBJbnRlbCBIRE1JIEF1 ZGlvIGNvbnRyb2xsZXIuIik7CisKKy8qCisgKiBFTEQgU0EgYml0cyBpbiB0aGUgQ0VBIFNwZWFr ZXIgQWxsb2NhdGlvbiBkYXRhIGJsb2NrCisqLworc3RhdGljIGludCBlbGRfc3BlYWtlcl9hbGxv Y2F0aW9uX2JpdHNbXSA9IHsKKwlbMF0gPSBGTCB8IEZSLAorCVsxXSA9IExGRSwKKwlbMl0gPSBG QywKKwlbM10gPSBSTCB8IFJSLAorCVs0XSA9IFJDLAorCVs1XSA9IEZMQyB8IEZSQywKKwlbNl0g PSBSTEMgfCBSUkMsCisJLyogdGhlIGZvbGxvd2luZyBhcmUgbm90IGRlZmluZWQgaW4gRUxEIHll dCAqLworCVs3XSA9IDAsCit9OworCisvKgorICogVGhpcyBpcyBhbiBvcmRlcmVkIGxpc3QhCisg KgorICogVGhlIHByZWNlZGluZyBvbmVzIGhhdmUgYmV0dGVyIGNoYW5jZXMgdG8gYmUgc2VsZWN0 ZWQgYnkKKyAqIGhkbWlfY2hhbm5lbF9hbGxvY2F0aW9uKCkuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qg Y2VhX2NoYW5uZWxfc3BlYWtlcl9hbGxvY2F0aW9uIGNoYW5uZWxfYWxsb2NhdGlvbnNbXSA9IHsK Ky8qICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogICA3ICAgICA2ICAgIDUgICAgNCAg ICAzICAgICAyICAgIDEgICAgMCAgKi8KK3sgLmNhX2luZGV4ID0gMHgwMCwgIC5zcGVha2VycyA9 IHsgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgRlIsICBGTCB9IH0sCisJCQkJLyog Mi4xICovCit7IC5jYV9pbmRleCA9IDB4MDEsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAw LCAgIDAsICAgMCwgIExGRSwgIEZSLCAgRkwgfSB9LAorCQkJCS8qIERvbGJ5IFN1cnJvdW5kICov Cit7IC5jYV9pbmRleCA9IDB4MDIsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgIDAs ICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAorCQkJCS8qIHN1cnJvdW5kNDAgKi8KK3sgLmNhX2lu ZGV4ID0gMHgwOCwgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgUlIsICBSTCwgICAwLCAgICAw LCAgRlIsICBGTCB9IH0sCisJCQkJLyogc3Vycm91bmQ0MSAqLworeyAuY2FfaW5kZXggPSAweDA5 LCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICBSUiwgIFJMLCAgIDAsICBMRkUsICBGUiwgIEZM IH0gfSwKKwkJCQkvKiBzdXJyb3VuZDUwICovCit7IC5jYV9pbmRleCA9IDB4MGEsICAuc3BlYWtl cnMgPSB7ICAgMCwgICAgMCwgIFJSLCAgUkwsICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAorCQkJ CS8qIHN1cnJvdW5kNTEgKi8KK3sgLmNhX2luZGV4ID0gMHgwYiwgIC5zcGVha2VycyA9IHsgICAw LCAgICAwLCAgUlIsICBSTCwgIEZDLCAgTEZFLCAgRlIsICBGTCB9IH0sCisJCQkJLyogNi4xICov Cit7IC5jYV9pbmRleCA9IDB4MGYsICAuc3BlYWtlcnMgPSB7ICAgMCwgICBSQywgIFJSLCAgUkws ICBGQywgIExGRSwgIEZSLCAgRkwgfSB9LAorCQkJCS8qIHN1cnJvdW5kNzEgKi8KK3sgLmNhX2lu ZGV4ID0gMHgxMywgIC5zcGVha2VycyA9IHsgUlJDLCAgUkxDLCAgUlIsICBSTCwgIEZDLCAgTEZF LCAgRlIsICBGTCB9IH0sCisKK3sgLmNhX2luZGV4ID0gMHgwMywgIC5zcGVha2VycyA9IHsgICAw LCAgICAwLCAgIDAsICAgMCwgIEZDLCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9 IDB4MDQsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgUkMsICAgMCwgICAgMCwgIEZS LCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDA1LCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAs ICAgMCwgIFJDLCAgIDAsICBMRkUsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgwNiwg IC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgIDAsICBSQywgIEZDLCAgICAwLCAgRlIsICBGTCB9 IH0sCit7IC5jYV9pbmRleCA9IDB4MDcsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAg UkMsICBGQywgIExGRSwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDBjLCAgLnNwZWFr ZXJzID0geyAgIDAsICAgUkMsICBSUiwgIFJMLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sg LmNhX2luZGV4ID0gMHgwZCwgIC5zcGVha2VycyA9IHsgICAwLCAgIFJDLCAgUlIsICBSTCwgICAw LCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MGUsICAuc3BlYWtlcnMgPSB7 ICAgMCwgICBSQywgIFJSLCAgUkwsICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5k ZXggPSAweDEwLCAgLnNwZWFrZXJzID0geyBSUkMsICBSTEMsICBSUiwgIFJMLCAgIDAsICAgIDAs ICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxMSwgIC5zcGVha2VycyA9IHsgUlJDLCAg UkxDLCAgUlIsICBSTCwgICAwLCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4 MTIsICAuc3BlYWtlcnMgPSB7IFJSQywgIFJMQywgIFJSLCAgUkwsICBGQywgICAgMCwgIEZSLCAg RkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDE0LCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICAg MCwgICAwLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxNSwgIC5z cGVha2VycyA9IHsgRlJDLCAgRkxDLCAgIDAsICAgMCwgICAwLCAgTEZFLCAgRlIsICBGTCB9IH0s Cit7IC5jYV9pbmRleCA9IDB4MTYsICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgICAwLCAgIDAs ICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDE3LCAgLnNwZWFrZXJz ID0geyBGUkMsICBGTEMsICAgMCwgICAwLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwKK3sgLmNh X2luZGV4ID0gMHgxOCwgIC5zcGVha2VycyA9IHsgRlJDLCAgRkxDLCAgIDAsICBSQywgICAwLCAg ICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MTksICAuc3BlYWtlcnMgPSB7IEZS QywgIEZMQywgICAwLCAgUkMsICAgMCwgIExGRSwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXgg PSAweDFhLCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICAgMCwgIFJDLCAgRkMsICAgIDAsICBG UiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxYiwgIC5zcGVha2VycyA9IHsgRlJDLCAgRkxD LCAgIDAsICBSQywgIEZDLCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MWMs ICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgIFJSLCAgUkwsICAgMCwgICAgMCwgIEZSLCAgRkwg fSB9LAoreyAuY2FfaW5kZXggPSAweDFkLCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICBSUiwg IFJMLCAgIDAsICBMRkUsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxZSwgIC5zcGVh a2VycyA9IHsgRlJDLCAgRkxDLCAgUlIsICBSTCwgIEZDLCAgICAwLCAgRlIsICBGTCB9IH0sCit7 IC5jYV9pbmRleCA9IDB4MWYsICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgIFJSLCAgUkwsICBG QywgIExGRSwgIEZSLCAgRkwgfSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaGFubmVsX21hcF90 YWJsZSBtYXBfdGFibGVzW10gPSB7CisJeyBTTkRSVl9DSE1BUF9GTCwgICAgICAgMHgwMCwgICBG TCB9LAorCXsgU05EUlZfQ0hNQVBfRlIsICAgICAgIDB4MDEsICAgRlIgfSwKKwl7IFNORFJWX0NI TUFQX1JMLCAgICAgICAweDA0LCAgIFJMIH0sCisJeyBTTkRSVl9DSE1BUF9SUiwgICAgICAgMHgw NSwgICBSUiB9LAorCXsgU05EUlZfQ0hNQVBfTEZFLCAgICAgIDB4MDIsICAgTEZFIH0sCisJeyBT TkRSVl9DSE1BUF9GQywgICAgICAgMHgwMywgICBGQyB9LAorCXsgU05EUlZfQ0hNQVBfUkxDLCAg ICAgIDB4MDYsICAgUkxDIH0sCisJeyBTTkRSVl9DSE1BUF9SUkMsICAgICAgMHgwNywgICBSUkMg fSwKKwl7fSAvKiB0ZXJtaW5hdG9yICovCit9OworCisvKiBoYXJkd2FyZSBjYXBhYmlsaXR5IHN0 cnVjdHVyZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pbnRl bF9oYWRzdHJlYW0gPSB7CisJLmluZm8gPQkoU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAor CQlTTkRSVl9QQ01fSU5GT19ET1VCTEUgfAorCQlTTkRSVl9QQ01fSU5GT19NTUFQfAorCQlTTkRS Vl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJU05EUlZfUENNX0lORk9fQkFUQ0gpLAorCS5mb3Jt YXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzI0IHwKKwkJU05EUlZfUENNX0ZNVEJJVF9VMjQpLAor CS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzMyMDAwIHwKKwkJU05EUlZfUENNX1JBVEVfNDQxMDAg fAorCQlTTkRSVl9QQ01fUkFURV80ODAwMCB8CisJCVNORFJWX1BDTV9SQVRFXzg4MjAwIHwKKwkJ U05EUlZfUENNX1JBVEVfOTYwMDAgfAorCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfAorCQlTTkRS Vl9QQ01fUkFURV8xOTIwMDAsCisJLnJhdGVfbWluID0gSEFEX01JTl9SQVRFLAorCS5yYXRlX21h eCA9IEhBRF9NQVhfUkFURSwKKwkuY2hhbm5lbHNfbWluID0gSEFEX01JTl9DSEFOTkVMLAorCS5j aGFubmVsc19tYXggPSBIQURfTUFYX0NIQU5ORUwsCisJLmJ1ZmZlcl9ieXRlc19tYXggPSBIQURf TUFYX0JVRkZFUiwKKwkucGVyaW9kX2J5dGVzX21pbiA9IEhBRF9NSU5fUEVSSU9EX0JZVEVTLAor CS5wZXJpb2RfYnl0ZXNfbWF4ID0gSEFEX01BWF9QRVJJT0RfQllURVMsCisJLnBlcmlvZHNfbWlu ID0gSEFEX01JTl9QRVJJT0RTLAorCS5wZXJpb2RzX21heCA9IEhBRF9NQVhfUEVSSU9EUywKKwku Zmlmb19zaXplID0gSEFEX0ZJRk9fU0laRSwKK307CisKKy8qIFJlZ2lzdGVyIGFjY2VzcyBmdW5j dGlvbnMgKi8KKworaW5saW5lIGludCBoYWRfZ2V0X2h3c3RhdGUoc3RydWN0IHNuZF9pbnRlbGhh ZCAqaW50ZWxoYWRkYXRhKQoreworCS8qIENoZWNrIGZvciBkZXZpY2UgcHJlc2VuY2UgLVNXIHN0 YXRlICovCisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX0RJU0NPTk5F Q1RFRCkgeworCQlwcl9kZWJ1ZygiJXM6RGV2aWNlIG5vdCBjb25uZWN0ZWQ6JWRcbiIsIF9fZnVu Y19fLAorCQkJCWludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyk7CisJCXJldHVybiAtRU5PREVWOwor CX0KKworCXJldHVybiAwOworfQorCitpbmxpbmUgaW50IGhhZF9nZXRfY2FwcyhlbnVtIGhhZF9j YXBzX2xpc3QgcXVlcnksIHZvaWQgKmNhcHMpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgc25k X2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBoYWRfZGF0YTsKKworCXJldHZhbCA9IGhhZF9nZXRf aHdzdGF0ZShpbnRlbGhhZGRhdGEpOworCWlmICghcmV0dmFsKQorCQlyZXR2YWwgPSBpbnRlbGhh ZGRhdGEtPnF1ZXJ5X29wcy5oZG1pX2F1ZGlvX2dldF9jYXBzKHF1ZXJ5LAorCQkJCWNhcHMpOwor CisJcmV0dXJuIHJldHZhbDsKK30KKworaW5saW5lIGludCBoYWRfc2V0X2NhcHMoZW51bSBoYWRf Y2Fwc19saXN0IHNldF9lbGVtZW50LCB2b2lkICpjYXBzKQoreworCWludCByZXR2YWw7CisJc3Ry dWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gaGFkX2RhdGE7CisKKwlyZXR2YWwgPSBo YWRfZ2V0X2h3c3RhdGUoaW50ZWxoYWRkYXRhKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0g aW50ZWxoYWRkYXRhLT5xdWVyeV9vcHMuaGRtaV9hdWRpb19zZXRfY2FwcygKKwkJCQlzZXRfZWxl bWVudCwgY2Fwcyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbmxpbmUgaW50IGhhZF9yZWFk X3JlZ2lzdGVyKHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgKmRhdGEpCit7CisJaW50IHJldHZh bDsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBoYWRfZGF0YTsKKworCXJl dHZhbCA9IGhhZF9nZXRfaHdzdGF0ZShpbnRlbGhhZGRhdGEpOworCWlmICghcmV0dmFsKQorCQly ZXR2YWwgPSBpbnRlbGhhZGRhdGEtPnJlZ19vcHMuaGRtaV9hdWRpb19yZWFkX3JlZ2lzdGVyKAor CQkJCW9mZnNldCArIGludGVsaGFkZGF0YS0+YXVkaW9fY2ZnX29mZnNldCwgZGF0YSk7CisKKwly ZXR1cm4gcmV0dmFsOworfQorCitpbmxpbmUgaW50IGhhZF93cml0ZV9yZWdpc3Rlcih1aW50MzJf dCBvZmZzZXQsIHVpbnQzMl90IGRhdGEpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgc25kX2lu dGVsaGFkICppbnRlbGhhZGRhdGEgPSBoYWRfZGF0YTsKKworCXJldHZhbCA9IGhhZF9nZXRfaHdz dGF0ZShpbnRlbGhhZGRhdGEpOworCWlmICghcmV0dmFsKQorCQlyZXR2YWwgPSBpbnRlbGhhZGRh dGEtPnJlZ19vcHMuaGRtaV9hdWRpb193cml0ZV9yZWdpc3RlcigKKwkJCQlvZmZzZXQgKyBpbnRl bGhhZGRhdGEtPmF1ZGlvX2NmZ19vZmZzZXQsIGRhdGEpOworCisJcmV0dXJuIHJldHZhbDsKK30K KworaW5saW5lIGludCBoYWRfcmVhZF9tb2RpZnkodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBk YXRhLCB1aW50MzJfdCBtYXNrKQoreworCWludCByZXR2YWw7CisJc3RydWN0IHNuZF9pbnRlbGhh ZCAqaW50ZWxoYWRkYXRhID0gaGFkX2RhdGE7CisKKwlyZXR2YWwgPSBoYWRfZ2V0X2h3c3RhdGUo aW50ZWxoYWRkYXRhKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gaW50ZWxoYWRkYXRhLT5y ZWdfb3BzLmhkbWlfYXVkaW9fcmVhZF9tb2RpZnkoCisJCQkJb2Zmc2V0ICsgaW50ZWxoYWRkYXRh LT5hdWRpb19jZmdfb2Zmc2V0LAorCQkJCWRhdGEsIG1hc2spOworCisJcmV0dXJuIHJldHZhbDsK K30KKy8qKgorICogaGFkX3JlYWRfbW9kaWZ5X2F1ZF9jb25maWdfdjIgLSBTcGVjaWZpYyBmdW5j dGlvbiB0byByZWFkLW1vZGlmeQorICogQVVEX0NPTkZJRyByZWdpc3RlciBvbiBWTFYyLlRoZSBo YWRfcmVhZF9tb2RpZnkoKSBmdW5jdGlvbiBzaG91bGQgbm90CisgKiBkaXJlY3RseSBiZSB1c2Vk IG9uIFZMVjIgZm9yIHVwZGF0aW5nIEFVRF9DT05GSUcgcmVnaXN0ZXIuCisgKiBUaGlzIGlzIGJl Y2F1c2U6CisgKiBCaXQ2IG9mIEFVRF9DT05GSUcgcmVnaXN0ZXIgaXMgd3JpdGVvbmx5IGR1ZSB0 byBhIHNpbGljb24gYnVnIG9uIFZMVjIKKyAqIEhETUkgSVAuIEFzIGEgcmVzdWx0IGEgcmVhZC1t b2RpZnkgb2YgQVVEX0NPTkZJRyByZWdpdGVyIHdpbGwgYWx3YXlzCisgKiBjbGVhciBiaXQ2LiBB VURfQ09ORklHWzY6NF0gcmVwcmVzZW50cyB0aGUgImNoYW5uZWxzIiBmaWVsZCBvZiB0aGUKKyAq IHJlZ2lzdGVyLiBUaGlzIGZpZWxkIHNob3VsZCBiZSAxeHkgYmluYXJ5IGZvciBjb25maWd1cmF0 aW9uIHdpdGggNiBvcgorICogbW9yZSBjaGFubmVscy4gUmVhZC1tb2RpZnkgb2YgQVVEX0NPTkZJ RyAoRWcuIGZvciBlbmFibGluZyBhdWRpbykKKyAqIGNhdXNlcyB0aGUgImNoYW5uZWxzIiBmaWVs ZCB0byBiZSB1cGRhdGVkIGFzIDB4eSBiaW5hcnkgcmVzdWx0aW5nIGluCisgKiBiYWQgYXVkaW8u IFRoZSBmaXggaXMgdG8gYWx3YXlzIHdyaXRlIHRoZSBBVURfQ09ORklHWzY6NF0gd2l0aAorICog YXBwcm9wcmlhdGUgdmFsdWUgd2hlbiBkb2luZyByZWFkLW1vZGlmeSBvZiBBVURfQ09ORklHIHJl Z2lzdGVyLgorICoKKyAqIEBzdWJzdHJlYW06IHRoZSBjdXJyZW50IHN1YnN0cmVhbSBvciBOVUxM IGlmIG5vIGFjdGl2ZSBzdWJzdHJlYW0KKyAqIEBkYXRhIDogZGF0YSB0byBiZSB3cml0dGVuCisg KiBAbWFzayA6IG1hc2sKKyAqCisgKi8KK2lubGluZSBpbnQgaGFkX3JlYWRfbW9kaWZ5X2F1ZF9j b25maWdfdjIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCXVpbnQz Ml90IGRhdGEsIHVpbnQzMl90IG1hc2spCit7CisJdW5pb24gYXVkX2NmZyBjZmdfdmFsID0gey5j ZmdfcmVndmFsID0gMH07CisJdTggY2hhbm5lbHM7CisKKwkvKgorCSAqIElmIHN1YnN0cmVhbSBp cyBOVUxMLCB0aGVyZSBpcyBubyBhY3RpdmUgc3RyZWFtLgorCSAqIEluIHRoaXMgY2FzZSBqdXN0 IHNldCBjaGFubmVscyB0byAyCisJICovCisJaWYgKHN1YnN0cmVhbSkKKwkJY2hhbm5lbHMgPSBz dWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzOworCWVsc2UKKwkJY2hhbm5lbHMgPSAyOworCWNm Z192YWwuY2ZnX3JlZ3hfdjIubnVtX2NoID0gY2hhbm5lbHMgLSAyOworCisJZGF0YSA9IGRhdGEg fCBjZmdfdmFsLmNmZ19yZWd2YWw7CisJbWFzayA9IG1hc2sgfCBBVURfQ09ORklHX0NIX01BU0tf VjI7CisKKwlwcl9kZWJ1ZygiJXMgOiBkYXRhID0gJXgsIG1hc2sgPSV4XG4iLCBfX2Z1bmNfXywg ZGF0YSwgbWFzayk7CisKKwlyZXR1cm4gaGFkX3JlYWRfbW9kaWZ5KEFVRF9DT05GSUcsIGRhdGEs IG1hc2spOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9lbmFibGVfYXVkaW9fdjEgLSB0byBl bmFibGUgYXVkaW8KKyAqCisgKiBAc3Vic3RyZWFtOiBDdXJyZW50IHN1YnN0cmVhbSBvciBOVUxM IGlmIG5vIGFjdGl2ZSBzdWJzdHJlYW0uCisgKiBAZW5hYmxlOiAxIGlmIGF1ZGlvIGlzIHRvIGJl IGVuYWJsZWQ7IDAgaWYgYXVkaW8gaXMgdG8gYmUgZGlzYWJsZWQuCisgKgorICovCitzdGF0aWMg dm9pZCBzbmRfaW50ZWxoYWRfZW5hYmxlX2F1ZGlvX3YxKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVh bSAqc3Vic3RyZWFtLAorCQkJCQl1OCBlbmFibGUpCit7CisJaGFkX3JlYWRfbW9kaWZ5KEFVRF9D T05GSUcsIGVuYWJsZSwgQklUKDApKTsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfZW5hYmxl X2F1ZGlvX3YyIC0gdG8gZW5hYmxlIGF1ZGlvCisgKgorICogQHN1YnN0cmVhbTogQ3VycmVudCBz dWJzdHJlYW0gb3IgTlVMTCBpZiBubyBhY3RpdmUgc3Vic3RyZWFtLgorICogQGVuYWJsZTogMSBp ZiBhdWRpbyBpcyB0byBiZSBlbmFibGVkOyAwIGlmIGF1ZGlvIGlzIHRvIGJlIGRpc2FibGVkLgor ICovCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRfZW5hYmxlX2F1ZGlvX3YyKHN0cnVjdCBzbmRf cGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQl1OCBlbmFibGUpCit7CisJaGFkX3JlYWRf bW9kaWZ5X2F1ZF9jb25maWdfdjIoc3Vic3RyZWFtLCBlbmFibGUsIEJJVCgwKSk7Cit9CisKKy8q KgorICogc25kX2ludGVsaGFkX3Jlc2V0X2F1ZGlvX3YxIC0gdG8gcmVzZXQgYXVkaW8gc3Vic3lz dGVtCisgKgorICogQHJlc2V0OiAxIHRvIHJlc2V0IGF1ZGlvOyAwIHRvIGJyaW5nIGF1ZGlvIG91 dCBvZiByZXNldC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9pbnRlbGhhZF9yZXNldF9hdWRp b192MSh1OCByZXNldCkKK3sKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTLCBy ZXNldCk7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX3Jlc2V0X2F1ZGlvX3YyIC0gdG8gcmVz ZXQgYXVkaW8gc3Vic3lzdGVtCisgKgorICogQHJlc2V0OiAxIHRvIHJlc2V0IGF1ZGlvOyAwIHRv IGJyaW5nIGF1ZGlvIG91dCBvZiByZXNldC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9pbnRl bGhhZF9yZXNldF9hdWRpb192Mih1OCByZXNldCkKK3sKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVE X0hETUlfU1RBVFVTX3YyLCByZXNldCk7Cit9CisKKy8qKgorICogaGFkX3Byb2dfc3RhdHVzX3Jl ZyAtIHRvIGluaXRpYWxpemUgYXVkaW8gY2hhbm5lbCBzdGF0dXMgcmVnaXN0ZXJzCisgKgorICog QHN1YnN0cmVhbTpzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBwcmVwYXJlIGZ1bmN0aW9uIGlzIGNh bGxlZAorICogQGludGVsaGFkZGF0YTpzdWJzdHJlYW0gcHJpdmF0ZSBkYXRhCisgKgorICogVGhp cyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIHByZXBhcmUgY2FsbGJhY2sKKyAqLworc3RhdGlj IGludCBoYWRfcHJvZ19zdGF0dXNfcmVnKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3Ry ZWFtLAorCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXVuaW9uIGF1 ZF9jaF9zdGF0dXNfMCBjaF9zdGF0MCA9IHsuc3RhdHVzXzBfcmVndmFsID0gMH07CisJdW5pb24g YXVkX2NoX3N0YXR1c18xIGNoX3N0YXQxID0gey5zdGF0dXNfMV9yZWd2YWwgPSAwfTsKKwlpbnQg Zm9ybWF0OworCisJcHJfZGVidWcoIkVudHJ5ICVzXG4iLCBfX2Z1bmNfXyk7CisKKwljaF9zdGF0 MC5zdGF0dXNfMF9yZWd4LmxwY21faWQgPSAoaW50ZWxoYWRkYXRhLT5hZXNfYml0cyAmCisJCQkJ CQlJRUM5NThfQUVTMF9OT05BVURJTyk+PjE7CisJY2hfc3RhdDAuc3RhdHVzXzBfcmVneC5jbGtf YWNjID0gKGludGVsaGFkZGF0YS0+YWVzX2JpdHMgJgorCQkJCQkJSUVDOTU4X0FFUzNfQ09OX0NM T0NLKT4+NDsKKworCXN3aXRjaCAoc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKSB7CisJY2FzZSBB VURfU0FNUExFX1JBVEVfMzI6CisJCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0g Q0hfU1RBVFVTX01BUF8zMktIWjsKKwkJYnJlYWs7CisKKwljYXNlIEFVRF9TQU1QTEVfUkFURV80 NF8xOgorCQljaF9zdGF0MC5zdGF0dXNfMF9yZWd4LnNhbXBfZnJlcSA9IENIX1NUQVRVU19NQVBf NDRLSFo7CisJCWJyZWFrOworCWNhc2UgQVVEX1NBTVBMRV9SQVRFXzQ4OgorCQljaF9zdGF0MC5z dGF0dXNfMF9yZWd4LnNhbXBfZnJlcSA9IENIX1NUQVRVU19NQVBfNDhLSFo7CisJCWJyZWFrOwor CWNhc2UgQVVEX1NBTVBMRV9SQVRFXzg4XzI6CisJCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guc2Ft cF9mcmVxID0gQ0hfU1RBVFVTX01BUF84OEtIWjsKKwkJYnJlYWs7CisJY2FzZSBBVURfU0FNUExF X1JBVEVfOTY6CisJCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVT X01BUF85NktIWjsKKwkJYnJlYWs7CisJY2FzZSBBVURfU0FNUExFX1JBVEVfMTc2XzQ6CisJCWNo X3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVTX01BUF8xNzZLSFo7CisJ CWJyZWFrOworCWNhc2UgQVVEX1NBTVBMRV9SQVRFXzE5MjoKKwkJY2hfc3RhdDAuc3RhdHVzXzBf cmVneC5zYW1wX2ZyZXEgPSBDSF9TVEFUVVNfTUFQXzE5MktIWjsKKwkJYnJlYWs7CisKKwlkZWZh dWx0OgorCQkvKiBjb250cm9sIHNob3VsZCBuZXZlciBjb21lIGhlcmUgKi8KKwkJcmV0dXJuIC1F SU5WQUw7CisJYnJlYWs7CisKKwl9CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DSF9TVEFUVVNf MCwgY2hfc3RhdDAuc3RhdHVzXzBfcmVndmFsKTsKKworCWZvcm1hdCA9IHN1YnN0cmVhbS0+cnVu dGltZS0+Zm9ybWF0OworCisJaWYgKGZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSkg eworCQljaF9zdGF0MS5zdGF0dXNfMV9yZWd4Lm1heF93cmRfbGVuID0gTUFYX1NNUExfV0lEVEhf MjA7CisJCWNoX3N0YXQxLnN0YXR1c18xX3JlZ3gud3JkX2xlbiA9IFNNUExfV0lEVEhfMTZCSVRT OworCX0gZWxzZSBpZiAoZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKSB7CisJCWNo X3N0YXQxLnN0YXR1c18xX3JlZ3gubWF4X3dyZF9sZW4gPSBNQVhfU01QTF9XSURUSF8yNDsKKwkJ Y2hfc3RhdDEuc3RhdHVzXzFfcmVneC53cmRfbGVuID0gU01QTF9XSURUSF8yNEJJVFM7CisJfSBl bHNlIHsKKwkJY2hfc3RhdDEuc3RhdHVzXzFfcmVneC5tYXhfd3JkX2xlbiA9IDA7CisJCWNoX3N0 YXQxLnN0YXR1c18xX3JlZ3gud3JkX2xlbiA9IDA7CisJfQorCWhhZF93cml0ZV9yZWdpc3RlcihB VURfQ0hfU1RBVFVTXzEsIGNoX3N0YXQxLnN0YXR1c18xX3JlZ3ZhbCk7CisJcmV0dXJuIDA7Cit9 CisKKy8qKgorICogc25kX2ludGVsaGFkX3Byb2dfYXVkaW9fY3RybF92MiAtIHRvIGluaXRpYWxp emUgYXVkaW8KKyAqIHJlZ2lzdGVycyBhbmQgYnVmZmVyIGNvbmZnaXVyYXRpb24gcmVnaXN0ZXJz CisgKgorICogQHN1YnN0cmVhbTpzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBwcmVwYXJlIGZ1bmN0 aW9uIGlzIGNhbGxlZAorICogQGludGVsaGFkZGF0YTpzdWJzdHJlYW0gcHJpdmF0ZSBkYXRhCisg KgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIHByZXBhcmUgY2FsbGJhY2sKKyAq LworaW50IHNuZF9pbnRlbGhhZF9wcm9nX2F1ZGlvX2N0cmxfdjIoc3RydWN0IHNuZF9wY21fc3Vi c3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0 YSkKK3sKKwl1bmlvbiBhdWRfY2ZnIGNmZ192YWwgPSB7LmNmZ19yZWd2YWwgPSAwfTsKKwl1bmlv biBhdWRfYnVmX2NvbmZpZyBidWZfY2ZnID0gey5idWZfY2ZndmFsID0gMH07CisJdTggY2hhbm5l bHM7CisKKwloYWRfcHJvZ19zdGF0dXNfcmVnKHN1YnN0cmVhbSwgaW50ZWxoYWRkYXRhKTsKKwor CWJ1Zl9jZmcuYnVmX2NmZ19yZWd4X3YyLmF1ZGlvX2ZpZm9fd2F0ZXJtYXJrID0gRklGT19USFJF U0hPTEQ7CisJYnVmX2NmZy5idWZfY2ZnX3JlZ3hfdjIuZG1hX2ZpZm9fd2F0ZXJtYXJrID0gRE1B X0ZJRk9fVEhSRVNIT0xEOworCWJ1Zl9jZmcuYnVmX2NmZ19yZWd4X3YyLmF1ZF9kZWxheSA9IDA7 CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9CVUZfQ09ORklHLCBidWZfY2ZnLmJ1Zl9jZmd2YWwp OworCisJY2hhbm5lbHMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzOworCWNmZ192YWwu Y2ZnX3JlZ3hfdjIubnVtX2NoID0gY2hhbm5lbHMgLSAyOworCWlmIChjaGFubmVscyA8PSAyKQor CQljZmdfdmFsLmNmZ19yZWd4X3YyLmxheW91dCA9IExBWU9VVDA7CisJZWxzZQorCQljZmdfdmFs LmNmZ19yZWd4X3YyLmxheW91dCA9IExBWU9VVDE7CisKKwljZmdfdmFsLmNmZ19yZWd4X3YyLnZh bF9iaXQgPSAxOworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfQ09ORklHLCBjZmdfdmFsLmNmZ19y ZWd2YWwpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9wcm9nX2F1ZGlv X2N0cmxfdjEgLSB0byBpbml0aWFsaXplIGF1ZGlvCisgKiByZWdpc3RlcnMgYW5kIGJ1ZmZlciBj b25mZ2l1cmF0aW9uIHJlZ2lzdGVycworICoKKyAqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3 aGljaCB0aGUgcHJlcGFyZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqIEBpbnRlbGhhZGRhdGE6c3Vi c3RyZWFtIHByaXZhdGUgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRo ZSBwcmVwYXJlIGNhbGxiYWNrCisgKi8KK2ludCBzbmRfaW50ZWxoYWRfcHJvZ19hdWRpb19jdHJs X3YxKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQlzdHJ1Y3Qgc25k X2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJdW5pb24gYXVkX2NmZyBjZmdfdmFsID0gey5j ZmdfcmVndmFsID0gMH07CisJdW5pb24gYXVkX2J1Zl9jb25maWcgYnVmX2NmZyA9IHsuYnVmX2Nm Z3ZhbCA9IDB9OworCXU4IGNoYW5uZWxzOworCisJaGFkX3Byb2dfc3RhdHVzX3JlZyhzdWJzdHJl YW0sIGludGVsaGFkZGF0YSk7CisKKwlidWZfY2ZnLmJ1Zl9jZmdfcmVneC5maWZvX3dpZHRoID0g RklGT19USFJFU0hPTEQ7CisJYnVmX2NmZy5idWZfY2ZnX3JlZ3guYXVkX2RlbGF5ID0gMDsKKwlo YWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9DT05GSUcsIGJ1Zl9jZmcuYnVmX2NmZ3ZhbCk7CisK KwljaGFubmVscyA9IHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CisKKwlzd2l0Y2ggKGNo YW5uZWxzKSB7CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJY2ZnX3ZhbC5jZmdfcmVneC5udW1fY2gg PSBDSF9TVEVSRU87CisJCWNmZ192YWwuY2ZnX3JlZ3gubGF5b3V0ID0gTEFZT1VUMDsKKwlicmVh azsKKworCWNhc2UgMzoKKwljYXNlIDQ6CisJCWNmZ192YWwuY2ZnX3JlZ3gubnVtX2NoID0gQ0hf VEhSRUVfRk9VUjsKKwkJY2ZnX3ZhbC5jZmdfcmVneC5sYXlvdXQgPSBMQVlPVVQxOworCWJyZWFr OworCisJY2FzZSA1OgorCWNhc2UgNjoKKwkJY2ZnX3ZhbC5jZmdfcmVneC5udW1fY2ggPSBDSF9G SVZFX1NJWDsKKwkJY2ZnX3ZhbC5jZmdfcmVneC5sYXlvdXQgPSBMQVlPVVQxOworCWJyZWFrOwor CisJY2FzZSA3OgorCWNhc2UgODoKKwkJY2ZnX3ZhbC5jZmdfcmVneC5udW1fY2ggPSBDSF9TRVZF Tl9FSUdIVDsKKwkJY2ZnX3ZhbC5jZmdfcmVneC5sYXlvdXQgPSBMQVlPVVQxOworCWJyZWFrOwor CisJfQorCisJY2ZnX3ZhbC5jZmdfcmVneC52YWxfYml0ID0gMTsKKwloYWRfd3JpdGVfcmVnaXN0 ZXIoQVVEX0NPTkZJRywgY2ZnX3ZhbC5jZmdfcmVndmFsKTsKKwlyZXR1cm4gMDsKK30KKy8qCisg KiBDb21wdXRlIGRlcml2ZWQgdmFsdWVzIGluIGNoYW5uZWxfYWxsb2NhdGlvbnNbXS4KKyAqLwor c3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2FsbG9jYXRpb25zKHZvaWQpCit7CisJaW50IGksIGo7 CisJc3RydWN0IGNlYV9jaGFubmVsX3NwZWFrZXJfYWxsb2NhdGlvbiAqcDsKKworCXByX2RlYnVn KCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpF KGNoYW5uZWxfYWxsb2NhdGlvbnMpOyBpKyspIHsKKwkJcCA9IGNoYW5uZWxfYWxsb2NhdGlvbnMg KyBpOworCQlwLT5jaGFubmVscyA9IDA7CisJCXAtPnNwa19tYXNrID0gMDsKKwkJZm9yIChqID0g MDsgaiA8IEFSUkFZX1NJWkUocC0+c3BlYWtlcnMpOyBqKyspCisJCQlpZiAocC0+c3BlYWtlcnNb al0pIHsKKwkJCQlwLT5jaGFubmVscysrOworCQkJCXAtPnNwa19tYXNrIHw9IHAtPnNwZWFrZXJz W2pdOworCQkJfQorCX0KK30KKworLyoKKyAqIFRoZSB0cmFuc2Zvcm1hdGlvbiB0YWtlcyB0d28g c3RlcHM6CisgKgorICogICAgICBlbGQtPnNwa19hbGxvYyA9PiAoZWxkX3NwZWFrZXJfYWxsb2Nh dGlvbl9iaXRzW10pID0+IHNwa19tYXNrCisgKiAgICAgICAgICAgIHNwa19tYXNrID0+IChjaGFu bmVsX2FsbG9jYXRpb25zW10pICAgICAgICAgPT4gYWktPkNBCisgKgorICogVE9ETzogaXQgY291 bGQgc2VsZWN0IHRoZSB3cm9uZyBDQSBmcm9tIG11bHRpcGxlIGNhbmRpZGF0ZXMuCisqLworc3Rh dGljIGludCBzbmRfaW50ZWxoYWRfY2hhbm5lbF9hbGxvY2F0aW9uKHN0cnVjdCBzbmRfaW50ZWxo YWQgKmludGVsaGFkZGF0YSwKKwkJCQkJaW50IGNoYW5uZWxzKQoreworCWludCBpOworCWludCBj YSA9IDA7CisJaW50IHNwa19tYXNrID0gMDsKKworCS8qCisJKiBDQSBkZWZhdWx0cyB0byAwIGZv ciBiYXNpYyBzdGVyZW8gYXVkaW8KKwkqLworCWlmIChjaGFubmVscyA8PSAyKQorCQlyZXR1cm4g MDsKKworCS8qCisJKiBleHBhbmQgRUxEJ3Mgc3BlYWtlciBhbGxvY2F0aW9uIG1hc2sKKwkqCisJ KiBFTEQgdGVsbHMgdGhlIHNwZWFrZXIgbWFzayBpbiBhIGNvbXBhY3QocGFpcmVkKSBmb3JtLAor CSogZXhwYW5kIEVMRCdzIG5vdGlvbnMgdG8gbWF0Y2ggdGhlIG9uZXMgdXNlZCBieSBBdWRpbyBJ bmZvRnJhbWUuCisJKi8KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVsZF9zcGVha2Vy X2FsbG9jYXRpb25fYml0cyk7IGkrKykgeworCQlpZiAoaW50ZWxoYWRkYXRhLT5lZWxkLnNwZWFr ZXJfYWxsb2NhdGlvbl9ibG9jayAmICgxIDw8IGkpKQorCQkJc3BrX21hc2sgfD0gZWxkX3NwZWFr ZXJfYWxsb2NhdGlvbl9iaXRzW2ldOworCX0KKworCS8qIHNlYXJjaCBmb3IgdGhlIGZpcnN0IHdv cmtpbmcgbWF0Y2ggaW4gdGhlIENBIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJ WkUoY2hhbm5lbF9hbGxvY2F0aW9ucyk7IGkrKykgeworCQlpZiAoY2hhbm5lbHMgPT0gY2hhbm5l bF9hbGxvY2F0aW9uc1tpXS5jaGFubmVscyAmJgorCQkoc3BrX21hc2sgJiBjaGFubmVsX2FsbG9j YXRpb25zW2ldLnNwa19tYXNrKSA9PQorCQkJCWNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uc3BrX21h c2spIHsKKwkJCWNhID0gY2hhbm5lbF9hbGxvY2F0aW9uc1tpXS5jYV9pbmRleDsKKwkJCWJyZWFr OworCQl9CisJfQorCisJcHJfZGVidWcoIkhETUk6IHNlbGVjdCBDQSAweCV4IGZvciAlZFxuIiwg Y2EsIGNoYW5uZWxzKTsKKworCXJldHVybiBjYTsKK30KKworLyogZnJvbSBzcGVha2VyIGJpdCBt YXNrIHRvIEFMU0EgQVBJIGNoYW5uZWwgcG9zaXRpb24gKi8KK3N0YXRpYyBpbnQgc3BrX3RvX2No bWFwKGludCBzcGspCit7CisJc3RydWN0IGNoYW5uZWxfbWFwX3RhYmxlICp0ID0gbWFwX3RhYmxl czsKKworCWZvciAoOyB0LT5tYXA7IHQrKykgeworCQlpZiAodC0+c3BrX21hc2sgPT0gc3BrKQor CQkJcmV0dXJuIHQtPm1hcDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGFkX2J1aWxkX2No YW5uZWxfYWxsb2NhdGlvbl9tYXAoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQor eworCWludCBpID0gMCwgYyA9IDA7CisJaW50IHNwa19tYXNrID0gMDsKKwlzdHJ1Y3Qgc25kX3Bj bV9jaG1hcF9lbGVtICpjaG1hcDsKKwl1aW50OF90IGVsZF9oaWdoLCBlbGRfaGlnaF9tYXNrID0g MHhGMDsKKwl1aW50OF90IGhpZ2hfbXNiOworCisJY2htYXAgPSBremFsbG9jKHNpemVvZigqY2ht YXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2htYXAgPT0gTlVMTCkgeworCQlpbnRlbGhhZGRhdGEt PmNobWFwLT5jaG1hcCA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKKwloYWRfZ2V0X2NhcHMoSEFE X0dFVF9FTEQsICZpbnRlbGhhZGRhdGEtPmVlbGQpOworCisJcHJfZGVidWcoImVlbGQuc3BlYWtl cl9hbGxvY2F0aW9uX2Jsb2NrID0gJXhcbiIsCisJCQlpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtl cl9hbGxvY2F0aW9uX2Jsb2NrKTsKKworCS8qIFdBOiBGaXggdGhlIG1heCBjaGFubmVsIHN1cHBv cnRlZCB0byA4ICovCisKKwkvKgorCSAqIFNpbmsgbWF5IHN1cHBvcnQgbW9yZSB0aGFuIDggY2hh bm5lbHMsIGlmIGVsZF9oaWdoIGhhcyBtb3JlIHRoYW4KKwkgKiBvbmUgYml0IHNldC4gU09DIHN1 cHBvcnRzIG1heCA4IGNoYW5uZWxzLgorCSAqIFJlZmVyIGVsZF9zcGVha2VyX2FsbG9jYXRpb25f Yml0cywgZm9yIHNpbmsgc3BlYWtlciBhbGxvY2F0aW9uCisJICovCisKKwkvKiBpZiAweDJGIDwg ZWxkIDwgMHg0RiBmYWxsIGJhY2sgdG8gMHgyZiwgZWxzZSBmYWxsIGJhY2sgdG8gMHg0RiAqLwor CWVsZF9oaWdoID0gaW50ZWxoYWRkYXRhLT5lZWxkLnNwZWFrZXJfYWxsb2NhdGlvbl9ibG9jayAm IGVsZF9oaWdoX21hc2s7CisJaWYgKChlbGRfaGlnaCAmIChlbGRfaGlnaC0xKSkgJiYgKGVsZF9o aWdoID4gMHgxRikpIHsKKwkJLyogZWxkX2hpZ2ggJiAoZWxkX2hpZ2gtMSk6IGlmIG1vcmUgdGhh biAxIGJpdCBzZXQgKi8KKwkJLyogMHgxRjogNyBjaGFubmVscyAqLworCQlmb3IgKGkgPSAxOyBp IDwgNDsgaSsrKSB7CisJCQloaWdoX21zYiA9IGVsZF9oaWdoICYgKDB4ODAgPj4gaSk7CisJCQlp ZiAoaGlnaF9tc2IpIHsKKwkJCQlpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9hbGxvY2F0aW9u X2Jsb2NrICY9CisJCQkJCWhpZ2hfbXNiIHwgMHhGOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJ fQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZWxkX3NwZWFrZXJfYWxsb2NhdGlvbl9i aXRzKTsgaSsrKSB7CisJCWlmIChpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9hbGxvY2F0aW9u X2Jsb2NrICYgKDEgPDwgaSkpCisJCQlzcGtfbWFzayB8PSBlbGRfc3BlYWtlcl9hbGxvY2F0aW9u X2JpdHNbaV07CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbm5lbF9hbGxv Y2F0aW9ucyk7IGkrKykgeworCQlpZiAoc3BrX21hc2sgPT0gY2hhbm5lbF9hbGxvY2F0aW9uc1tp XS5zcGtfbWFzaykgeworCQkJZm9yIChjID0gMDsgYyA8IGNoYW5uZWxfYWxsb2NhdGlvbnNbaV0u Y2hhbm5lbHM7IGMrKykgeworCQkJCWNobWFwLT5tYXBbY10gPSBzcGtfdG9fY2htYXAoCisJCQkJ CWNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uc3BlYWtlcnNbCisJCQkJCQkoTUFYX1NQRUFLRVJTIC0g MSktY10pOworCQkJfQorCQkJY2htYXAtPmNoYW5uZWxzID0gY2hhbm5lbF9hbGxvY2F0aW9uc1tp XS5jaGFubmVsczsKKwkJCWludGVsaGFkZGF0YS0+Y2htYXAtPmNobWFwID0gY2htYXA7CisJCQli cmVhazsKKwkJfQorCX0KKwlpZiAoaSA+PSBBUlJBWV9TSVpFKGNoYW5uZWxfYWxsb2NhdGlvbnMp KSB7CisJCWludGVsaGFkZGF0YS0+Y2htYXAtPmNobWFwID0gTlVMTDsKKwkJa2ZyZWUoY2htYXAp OworCX0KK30KKworLyoKKyAqKiBBTFNBIEFQSSBjaGFubmVsLW1hcCBjb250cm9sIGNhbGxiYWNr cworICoqLworc3RhdGljIGludCBoYWRfY2htYXBfY3RsX2luZm8oc3RydWN0IHNuZF9rY29udHJv bCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlz dHJ1Y3Qgc25kX3BjbV9jaG1hcCAqaW5mbyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsK KwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBpbmZvLT5wcml2YXRlX2RhdGE7 CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZfRElTQ09OTkVDVEVE KQorCQlyZXR1cm4gLUVOT0RFVjsKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVf SU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSBIQURfTUFYX0NIQU5ORUw7CisJdWluZm8tPnZhbHVl LmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBTTkRSVl9DSE1B UF9MQVNUOworCXJldHVybiAwOworfQorCisjaWZuZGVmIFVTRV9BTFNBX0RFRkFVTFRfVExWCitz dGF0aWMgaW50IGhhZF9jaG1hcF9jdGxfdGx2KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9s LCBpbnQgb3BfZmxhZywKKwkJCQl1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IF9fdXNl ciAqdGx2KQoreworCXN0cnVjdCBzbmRfcGNtX2NobWFwICppbmZvID0gc25kX2tjb250cm9sX2No aXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IGluZm8t PnByaXZhdGVfZGF0YTsKKworCWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPT0gSEFEX0RS Vl9ESVNDT05ORUNURUQpCisJCXJldHVybiAtRU5PREVWOworCisJLyogVE9ETzogRml4IGZvciBx dWVyeSBjaGFubmVsIG1hcCAqLworCXJldHVybiAtRVBFUk07Cit9CisjZW5kaWYKKworc3RhdGlj IGludCBoYWRfY2htYXBfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJ CQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3Bj bV9jaG1hcCAqaW5mbyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25k X2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBpbmZvLT5wcml2YXRlX2RhdGE7CisJaW50IGkgPSAw OworCWNvbnN0IHN0cnVjdCBzbmRfcGNtX2NobWFwX2VsZW0gKmNobWFwOworCisJaWYgKGludGVs aGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX0RJU0NPTk5FQ1RFRCkKKwkJcmV0dXJuIC1F Tk9ERVY7CisJaWYgKGludGVsaGFkZGF0YS0+Y2htYXAtPmNobWFwID09ICBOVUxMKQorCQlyZXR1 cm4gLUVOT0RBVEE7CisJY2htYXAgPSBpbnRlbGhhZGRhdGEtPmNobWFwLT5jaG1hcDsKKwlmb3Ig KGkgPSAwOyBpIDwgY2htYXAtPmNoYW5uZWxzOyBpKyspIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmlu dGVnZXIudmFsdWVbaV0gPSBjaG1hcC0+bWFwW2ldOworCQlwcl9kZWJ1ZygiY2htYXAtPm1hcFsl ZF0gPSAlZFxuIiwgaSwgY2htYXAtPm1hcFtpXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgaGFkX2NobWFwX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2ws CisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJLyogVE9ETzog R2V0IGNoYW5uZWwgbWFwIGFuZCBzZXQgc3dhcCByZWdpc3RlciAqLworCXJldHVybiAtRVBFUk07 Cit9CisKK3N0YXRpYyBpbnQgaGFkX3JlZ2lzdGVyX2NobWFwX2N0bHMoc3RydWN0IHNuZF9pbnRl bGhhZCAqaW50ZWxoYWRkYXRhLAorCQkJCQkJc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlpbnQg ZXJyID0gMDsKKworCWVyciA9IHNuZF9wY21fYWRkX2NobWFwX2N0bHMocGNtLCBTTkRSVl9QQ01f U1RSRUFNX1BMQVlCQUNLLAorCQkJTlVMTCwgMCwgKHVuc2lnbmVkIGxvbmcpaW50ZWxoYWRkYXRh LAorCQkJJmludGVsaGFkZGF0YS0+Y2htYXApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJy OworCisJaW50ZWxoYWRkYXRhLT5jaG1hcC0+cHJpdmF0ZV9kYXRhID0gaW50ZWxoYWRkYXRhOwor CWludGVsaGFkZGF0YS0+a2N0bCA9IGludGVsaGFkZGF0YS0+Y2htYXAtPmtjdGw7CisJaW50ZWxo YWRkYXRhLT5rY3RsLT5pbmZvID0gaGFkX2NobWFwX2N0bF9pbmZvOworCWludGVsaGFkZGF0YS0+ a2N0bC0+Z2V0ID0gaGFkX2NobWFwX2N0bF9nZXQ7CisJaW50ZWxoYWRkYXRhLT5rY3RsLT5wdXQg PSBoYWRfY2htYXBfY3RsX3B1dDsKKyNpZm5kZWYgVVNFX0FMU0FfREVGQVVMVF9UTFYKKwlpbnRl bGhhZGRhdGEtPmtjdGwtPnRsdi5jID0gaGFkX2NobWFwX2N0bF90bHY7CisjZW5kaWYKKwlpbnRl bGhhZGRhdGEtPmNobWFwLT5jaG1hcCA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICog c25kX2ludGVsaGFkX3Byb2dfZGlwX3YxIC0gdG8gaW5pdGlhbGl6ZSBEYXRhIElzbGFuZCBQYWNr ZXRzIHJlZ2lzdGVycworICoKKyAqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUg cHJlcGFyZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3RyZWFtIHBy aXZhdGUgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwcmVwYXJl IGNhbGxiYWNrCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9pbnRlbGhhZF9wcm9nX2RpcF92MShzdHJ1 Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFk ICppbnRlbGhhZGRhdGEpCit7CisJaW50IGk7CisJdW5pb24gYXVkX2N0cmxfc3QgY3RybF9zdGF0 ZSA9IHsuY3RybF92YWwgPSAwfTsKKwl1bmlvbiBhdWRfaW5mb19mcmFtZTIgZnJhbWUyID0gey5m cjJfdmFsID0gMH07CisJdW5pb24gYXVkX2luZm9fZnJhbWUzIGZyYW1lMyA9IHsuZnIzX3ZhbCA9 IDB9OworCXU4IGNoZWNrc3VtID0gMDsKKwlpbnQgY2hhbm5lbHM7CisKKwljaGFubmVscyA9IHN1 YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CisKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0NO VExfU1QsIGN0cmxfc3RhdGUuY3RybF92YWwpOworCisJZnJhbWUyLmZyMl9yZWd4LmNobmxfY250 ID0gc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVscyAtIDE7CisKKwlmcmFtZTMuZnIzX3JlZ3gu Y2hubF9hbGxvYyA9IHNuZF9pbnRlbGhhZF9jaGFubmVsX2FsbG9jYXRpb24oCisJCQkJCWludGVs aGFkZGF0YSwgY2hhbm5lbHMpOworCisJLypDYWxjdWx0ZSB0aGUgYnl0ZSB3aWRlIGNoZWNrc3Vt IGZvciBhbGwgdmFsaWQgRElQIHdvcmRzKi8KKwlmb3IgKGkgPSAwOyBpIDwgQllURVNfUEVSX1dP UkQ7IGkrKykKKwkJY2hlY2tzdW0gKz0gKElORk9fRlJBTUVfV09SRDEgPj4gaSpCSVRTX1BFUl9C WVRFKSAmIE1BU0tfQllURTA7CisJZm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBpKysp CisJCWNoZWNrc3VtICs9IChmcmFtZTIuZnIyX3ZhbCA+PiBpKkJJVFNfUEVSX0JZVEUpICYgTUFT S19CWVRFMDsKKwlmb3IgKGkgPSAwOyBpIDwgQllURVNfUEVSX1dPUkQ7IGkrKykKKwkJY2hlY2tz dW0gKz0gKGZyYW1lMy5mcjNfdmFsID4+IGkqQklUU19QRVJfQllURSkgJiBNQVNLX0JZVEUwOwor CisJZnJhbWUyLmZyMl9yZWd4LmNoa3N1bSA9IC0oY2hlY2tzdW0pOworCisJaGFkX3dyaXRlX3Jl Z2lzdGVyKEFVRF9IRE1JV19JTkZPRlIsIElORk9fRlJBTUVfV09SRDEpOworCWhhZF93cml0ZV9y ZWdpc3RlcihBVURfSERNSVdfSU5GT0ZSLCBmcmFtZTIuZnIyX3ZhbCk7CisJaGFkX3dyaXRlX3Jl Z2lzdGVyKEFVRF9IRE1JV19JTkZPRlIsIGZyYW1lMy5mcjNfdmFsKTsKKworCS8qIHByb2dyYW0g cmVtYWluaW5nIERJUCB3b3JkcyB3aXRoIHplcm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgSEFEX01B WF9ESVBfV09SRFMtVkFMSURfRElQX1dPUkRTOyBpKyspCisJCWhhZF93cml0ZV9yZWdpc3RlcihB VURfSERNSVdfSU5GT0ZSLCAweDApOworCisJY3RybF9zdGF0ZS5jdHJsX3JlZ3guZGlwX2ZyZXEg PSAxOworCWN0cmxfc3RhdGUuY3RybF9yZWd4LmRpcF9lbl9zdGEgPSAxOworCWhhZF93cml0ZV9y ZWdpc3RlcihBVURfQ05UTF9TVCwgY3RybF9zdGF0ZS5jdHJsX3ZhbCk7Cit9CisKKy8qKgorICog c25kX2ludGVsaGFkX3Byb2dfZGlwX3YyIC0gdG8gaW5pdGlhbGl6ZSBEYXRhIElzbGFuZCBQYWNr ZXRzIHJlZ2lzdGVycworICoKKyAqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUg cHJlcGFyZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3RyZWFtIHBy aXZhdGUgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwcmVwYXJl IGNhbGxiYWNrCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9pbnRlbGhhZF9wcm9nX2RpcF92MihzdHJ1 Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFk ICppbnRlbGhhZGRhdGEpCit7CisJaW50IGk7CisJdW5pb24gYXVkX2N0cmxfc3QgY3RybF9zdGF0 ZSA9IHsuY3RybF92YWwgPSAwfTsKKwl1bmlvbiBhdWRfaW5mb19mcmFtZTIgZnJhbWUyID0gey5m cjJfdmFsID0gMH07CisJdW5pb24gYXVkX2luZm9fZnJhbWUzIGZyYW1lMyA9IHsuZnIzX3ZhbCA9 IDB9OworCXU4IGNoZWNrc3VtID0gMDsKKwlpbnQgY2hhbm5lbHM7CisKKwljaGFubmVscyA9IHN1 YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CisKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0NO VExfU1QsIGN0cmxfc3RhdGUuY3RybF92YWwpOworCisJZnJhbWUyLmZyMl9yZWd4LmNobmxfY250 ID0gc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVscyAtIDE7CisKKwlmcmFtZTMuZnIzX3JlZ3gu Y2hubF9hbGxvYyA9IHNuZF9pbnRlbGhhZF9jaGFubmVsX2FsbG9jYXRpb24oCisJCQkJCWludGVs aGFkZGF0YSwgY2hhbm5lbHMpOworCisJLypDYWxjdWx0ZSB0aGUgYnl0ZSB3aWRlIGNoZWNrc3Vt IGZvciBhbGwgdmFsaWQgRElQIHdvcmRzKi8KKwlmb3IgKGkgPSAwOyBpIDwgQllURVNfUEVSX1dP UkQ7IGkrKykKKwkJY2hlY2tzdW0gKz0gKElORk9fRlJBTUVfV09SRDEgPj4gaSpCSVRTX1BFUl9C WVRFKSAmIE1BU0tfQllURTA7CisJZm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBpKysp CisJCWNoZWNrc3VtICs9IChmcmFtZTIuZnIyX3ZhbCA+PiBpKkJJVFNfUEVSX0JZVEUpICYgTUFT S19CWVRFMDsKKwlmb3IgKGkgPSAwOyBpIDwgQllURVNfUEVSX1dPUkQ7IGkrKykKKwkJY2hlY2tz dW0gKz0gKGZyYW1lMy5mcjNfdmFsID4+IGkqQklUU19QRVJfQllURSkgJiBNQVNLX0JZVEUwOwor CisJZnJhbWUyLmZyMl9yZWd4LmNoa3N1bSA9IC0oY2hlY2tzdW0pOworCisJaGFkX3dyaXRlX3Jl Z2lzdGVyKEFVRF9IRE1JV19JTkZPRlJfdjIsIElORk9fRlJBTUVfV09SRDEpOworCWhhZF93cml0 ZV9yZWdpc3RlcihBVURfSERNSVdfSU5GT0ZSX3YyLCBmcmFtZTIuZnIyX3ZhbCk7CisJaGFkX3dy aXRlX3JlZ2lzdGVyKEFVRF9IRE1JV19JTkZPRlJfdjIsIGZyYW1lMy5mcjNfdmFsKTsKKworCS8q IHByb2dyYW0gcmVtYWluaW5nIERJUCB3b3JkcyB3aXRoIHplcm8gKi8KKwlmb3IgKGkgPSAwOyBp IDwgSEFEX01BWF9ESVBfV09SRFMtVkFMSURfRElQX1dPUkRTOyBpKyspCisJCWhhZF93cml0ZV9y ZWdpc3RlcihBVURfSERNSVdfSU5GT0ZSX3YyLCAweDApOworCisJY3RybF9zdGF0ZS5jdHJsX3Jl Z3guZGlwX2ZyZXEgPSAxOworCWN0cmxfc3RhdGUuY3RybF9yZWd4LmRpcF9lbl9zdGEgPSAxOwor CWhhZF93cml0ZV9yZWdpc3RlcihBVURfQ05UTF9TVCwgY3RybF9zdGF0ZS5jdHJsX3ZhbCk7Cit9 CisKKy8qKgorICogc25kX2ludGVsaGFkX3Byb2dfYnVmZmVyIC0gcHJvZ3JhbXMgYnVmZmVyCisg KiBhZGRyZXNzIGFuZCBsZW5ndGggcmVnaXN0ZXJzCisgKgorICogQHN1YnN0cmVhbTpzdWJzdHJl YW0gZm9yIHdoaWNoIHRoZSBwcmVwYXJlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogQGludGVsaGFk ZGF0YTpzdWJzdHJlYW0gcHJpdmF0ZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBwcm9ncmFt cyByaW5nIGJ1ZmZlciBhZGRyZXNzIGFuZCBsZW5ndGggaW50byByZWdpc3RlcnMuCisgKi8KK2lu dCBzbmRfaW50ZWxoYWRfcHJvZ19idWZmZXIoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRk YXRhLAorCQkJCQlpbnQgc3RhcnQsIGludCBlbmQpCit7CisJdTMyIHJpbmdfYnVmX2FkZHIsIHJp bmdfYnVmX3NpemUsIHBlcmlvZF9ieXRlczsKKwl1OCBpLCBudW1fcGVyaW9kczsKKwlzdHJ1Y3Qg c25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKworCXN1YnN0cmVhbSA9IGludGVsaGFkZGF0 YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVhbTsKKwlpZiAoIXN1YnN0cmVhbSkgeworCQlwcl9l cnIoInN1YnN0cmVhbSBpcyBOVUxMXG4iKTsKKwkJZHVtcF9zdGFjaygpOworCQlyZXR1cm4gMDsK Kwl9CisKKwlyaW5nX2J1Zl9hZGRyID0gc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYWRkcjsKKwly aW5nX2J1Zl9zaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJaW50 ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5yaW5nX2J1Zl9zaXplID0gcmluZ19idWZfc2l6ZTsKKwlw ZXJpb2RfYnl0ZXMgPSBmcmFtZXNfdG9fYnl0ZXMoc3Vic3RyZWFtLT5ydW50aW1lLAorCQkJCXN1 YnN0cmVhbS0+cnVudGltZS0+cGVyaW9kX3NpemUpOworCW51bV9wZXJpb2RzID0gc3Vic3RyZWFt LT5ydW50aW1lLT5wZXJpb2RzOworCisJLyoKKwkgKiBidWZmZXIgYWRkciBzaG91bGQgIGJlIDY0 IGJ5dGUgYWxpZ25lZCwgcGVyaW9kIGJ5dGVzCisJICogd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0 ZSBhZGRyIG9mZnNldAorCSAqLworCXBlcmlvZF9ieXRlcyAmPSB+MHgzRjsKKworCS8qIEhhcmR3 YXJlIHN1cHBvcnRzIE1BWF9QRVJJT0RTIGJ1ZmZlcnMgKi8KKwlpZiAoZW5kID49IEhBRF9NQVhf UEVSSU9EUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSBzdGFydDsgaSA8PSBlbmQ7 IGkrKykgeworCQkvKiBQcm9ncmFtIHRoZSBidWYgcmVnaXN0ZXJzIHdpdGggYWRkciBhbmQgbGVu ICovCisJCWludGVsaGFkZGF0YS0+YnVmX2luZm9baV0uYnVmX2FkZHIgPSByaW5nX2J1Zl9hZGRy ICsKKwkJCQkJCQkgKGkgKiBwZXJpb2RfYnl0ZXMpOworCQlpZiAoaSA8IG51bV9wZXJpb2RzLTEp CisJCQlpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2ldLmJ1Zl9zaXplID0gcGVyaW9kX2J5dGVzOwor CQllbHNlCisJCQlpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2ldLmJ1Zl9zaXplID0gcmluZ19idWZf c2l6ZSAtCisJCQkJCQkJKHBlcmlvZF9ieXRlcyppKTsKKworCQloYWRfd3JpdGVfcmVnaXN0ZXIo QVVEX0JVRl9BX0FERFIgKyAoaSAqIEhBRF9SRUdfV0lEVEgpLAorCQkJCQlpbnRlbGhhZGRhdGEt PmJ1Zl9pbmZvW2ldLmJ1Zl9hZGRyIHwKKwkJCQkJQklUKDApIHwgQklUKDEpKTsKKwkJaGFkX3dy aXRlX3JlZ2lzdGVyKEFVRF9CVUZfQV9MRU5HVEggKyAoaSAqIEhBRF9SRUdfV0lEVEgpLAorCQkJ CQlwZXJpb2RfYnl0ZXMpOworCQlpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2ldLmlzX3ZhbGlkID0g dHJ1ZTsKKwl9CisJcHJfZGVidWcoIiVzOmJ1ZlslZC0lZF0gYWRkcj0lI3ggIGFuZCBzaXplPSVk XG4iLCBfX2Z1bmNfXywgc3RhcnQsIGVuZCwKKwkJCWludGVsaGFkZGF0YS0+YnVmX2luZm9bc3Rh cnRdLmJ1Zl9hZGRyLAorCQkJaW50ZWxoYWRkYXRhLT5idWZfaW5mb1tzdGFydF0uYnVmX3NpemUp OworCWludGVsaGFkZGF0YS0+dmFsaWRfYnVmX2NudCA9IG51bV9wZXJpb2RzOworCXJldHVybiAw OworfQorCitpbmxpbmUgaW50IHNuZF9pbnRlbGhhZF9yZWFkX2xlbihzdHJ1Y3Qgc25kX2ludGVs aGFkICppbnRlbGhhZGRhdGEpCit7CisJaW50IGksIHJldHZhbCA9IDA7CisJdTMyIGxlbls0XTsK KworCWZvciAoaSA9IDA7IGkgPCA0IDsgaSsrKSB7CisJCWhhZF9yZWFkX3JlZ2lzdGVyKEFVRF9C VUZfQV9MRU5HVEggKyAoaSAqIEhBRF9SRUdfV0lEVEgpLAorCQkJCQkmbGVuW2ldKTsKKwkJaWYg KCFsZW5baV0pCisJCQlyZXR2YWwrKzsKKwl9CisJaWYgKHJldHZhbCAhPSAxKSB7CisJCWZvciAo aSA9IDA7IGkgPCA0IDsgaSsrKQorCQkJcHJfZGVidWcoImJ1ZlslZF0gc2l6ZT0lZFxuIiwgaSwg bGVuW2ldKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhh ZF9wcm9nX2N0c192MSAtIFByb2dyYW0gSERNSSBhdWRpbyBDVFMgdmFsdWUKKyAqCisgKiBAYXVk X3NhbXBfZnJlcTogc2FtcGxpbmcgZnJlcXVlbmN5IG9mIGF1ZGlvIGRhdGEKKyAqIEB0bWRzOiBz YW1wbGluZyBmcmVxdWVuY3kgb2YgdGhlIGRpc3BsYXkgZGF0YQorICogQG5fcGFyYW06IE4gdmFs dWUsIGRlcGVuZHMgb24gYXVkX3NhbXBfZnJlcQorICogQGludGVsaGFkZGF0YTpzdWJzdHJlYW0g cHJpdmF0ZSBkYXRhCisgKgorICogUHJvZ3JhbSBDVFMgcmVnaXN0ZXIgYmFzZWQgb24gdGhlIGF1 ZGlvIGFuZCBkaXNwbGF5IHNhbXBsaW5nIGZyZXF1ZW5jeQorICovCitzdGF0aWMgdm9pZCBzbmRf aW50ZWxoYWRfcHJvZ19jdHNfdjEodTMyIGF1ZF9zYW1wX2ZyZXEsIHUzMiB0bWRzLCB1MzIgbl9w YXJhbSwKKwkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJdTMyIGN0 c192YWw7CisJdTY0IGRpdmlkZW5kLCBkaXZpc29yOworCisJLyogQ2FsY3VsYXRlIENUUyBhY2Nv cmRpbmcgdG8gSERNSSAxLjNhIHNwZWMqLworCWRpdmlkZW5kID0gKHU2NCl0bWRzICogbl9wYXJh bSoxMDAwOworCWRpdmlzb3IgPSAxMjggKiBhdWRfc2FtcF9mcmVxOworCWN0c192YWwgPSBkaXY2 NF91NjQoZGl2aWRlbmQsIGRpdmlzb3IpOworCXByX2RlYnVnKCJUTURTIHZhbHVlPSVkLCBOIHZh bHVlPSVkLCBDVFMgVmFsdWU9JWRcbiIsCisJCQl0bWRzLCBuX3BhcmFtLCBjdHNfdmFsKTsKKwlo YWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfQ1RTLCAoQklUKDIwKSB8IGN0c192YWwpKTsKK30K KworLyoqCisgKiBzbmRfaW50ZWxoYWRfcHJvZ19jdHNfdjIgLSBQcm9ncmFtIEhETUkgYXVkaW8g Q1RTIHZhbHVlCisgKgorICogQGF1ZF9zYW1wX2ZyZXE6IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiBh dWRpbyBkYXRhCisgKiBAdG1kczogc2FtcGxpbmcgZnJlcXVlbmN5IG9mIHRoZSBkaXNwbGF5IGRh dGEKKyAqIEBuX3BhcmFtOiBOIHZhbHVlLCBkZXBlbmRzIG9uIGF1ZF9zYW1wX2ZyZXEKKyAqIEBp bnRlbGhhZGRhdGE6c3Vic3RyZWFtIHByaXZhdGUgZGF0YQorICoKKyAqIFByb2dyYW0gQ1RTIHJl Z2lzdGVyIGJhc2VkIG9uIHRoZSBhdWRpbyBhbmQgZGlzcGxheSBzYW1wbGluZyBmcmVxdWVuY3kK KyAqLworc3RhdGljIHZvaWQgc25kX2ludGVsaGFkX3Byb2dfY3RzX3YyKHUzMiBhdWRfc2FtcF9m cmVxLCB1MzIgdG1kcywgdTMyIG5fcGFyYW0sCisJCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50 ZWxoYWRkYXRhKQoreworCXUzMiBjdHNfdmFsOworCXU2NCBkaXZpZGVuZCwgZGl2aXNvcjsKKwor CS8qIENhbGN1bGF0ZSBDVFMgYWNjb3JkaW5nIHRvIEhETUkgMS4zYSBzcGVjKi8KKwlkaXZpZGVu ZCA9ICh1NjQpdG1kcyAqIG5fcGFyYW0qMTAwMDsKKwlkaXZpc29yID0gMTI4ICogYXVkX3NhbXBf ZnJlcTsKKwljdHNfdmFsID0gZGl2NjRfdTY0KGRpdmlkZW5kLCBkaXZpc29yKTsKKwlwcl9kZWJ1 ZygiVE1EUyB2YWx1ZT0lZCwgTiB2YWx1ZT0lZCwgQ1RTIFZhbHVlPSVkXG4iLAorCQkJdG1kcywg bl9wYXJhbSwgY3RzX3ZhbCk7CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX0NUUywgKEJJ VCgyNCkgfCBjdHNfdmFsKSk7Cit9CisKK3N0YXRpYyBpbnQgaGFkX2NhbGN1bGF0ZV9uX3ZhbHVl KHUzMiBhdWRfc2FtcF9mcmVxKQoreworCXMzMiBuX3ZhbDsKKworCS8qIFNlbGVjdCBOIGFjY29y ZGluZyB0byBIRE1JIDEuM2Egc3BlYyovCisJc3dpdGNoIChhdWRfc2FtcF9mcmVxKSB7CisJY2Fz ZSBBVURfU0FNUExFX1JBVEVfMzI6CisJCW5fdmFsID0gNDA5NjsKKwlicmVhazsKKworCWNhc2Ug QVVEX1NBTVBMRV9SQVRFXzQ0XzE6CisJCW5fdmFsID0gNjI3MjsKKwlicmVhazsKKworCWNhc2Ug QVVEX1NBTVBMRV9SQVRFXzQ4OgorCQluX3ZhbCA9IDYxNDQ7CisJYnJlYWs7CisKKwljYXNlIEFV RF9TQU1QTEVfUkFURV84OF8yOgorCQluX3ZhbCA9IDEyNTQ0OworCWJyZWFrOworCisJY2FzZSBB VURfU0FNUExFX1JBVEVfOTY6CisJCW5fdmFsID0gMTIyODg7CisJYnJlYWs7CisKKwljYXNlIEFV RF9TQU1QTEVfUkFURV8xNzZfNDoKKwkJbl92YWwgPSAyNTA4ODsKKwlicmVhazsKKworCWNhc2Ug SEFEX01BWF9SQVRFOgorCQluX3ZhbCA9IDI0NTc2OworCWJyZWFrOworCisJZGVmYXVsdDoKKwkJ bl92YWwgPSAtRUlOVkFMOworCWJyZWFrOworCX0KKwlyZXR1cm4gbl92YWw7Cit9CisKKy8qKgor ICogc25kX2ludGVsaGFkX3Byb2dfbl92MSAtIFByb2dyYW0gSERNSSBhdWRpbyBOIHZhbHVlCisg KgorICogQGF1ZF9zYW1wX2ZyZXE6IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiBhdWRpbyBkYXRhCisg KiBAbl9wYXJhbTogTiB2YWx1ZSwgZGVwZW5kcyBvbiBhdWRfc2FtcF9mcmVxCisgKiBAaW50ZWxo YWRkYXRhOnN1YnN0cmVhbSBwcml2YXRlIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNh bGxlZCBpbiB0aGUgcHJlcGFyZSBjYWxsYmFjay4KKyAqIEl0IHByb2dyYW1zIGJhc2VkIG9uIHRo ZSBhdWRpbyBhbmQgZGlzcGxheSBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCBz bmRfaW50ZWxoYWRfcHJvZ19uX3YxKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgKm5fcGFyYW0sCisJ CQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXMzMiBuX3ZhbDsKKwor CW5fdmFsID0JaGFkX2NhbGN1bGF0ZV9uX3ZhbHVlKGF1ZF9zYW1wX2ZyZXEpOworCisJaWYgKG5f dmFsIDwgMCkKKwkJcmV0dXJuIG5fdmFsOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9OX0VO QUJMRSwgKEJJVCgyMCkgfCBuX3ZhbCkpOworCSpuX3BhcmFtID0gbl92YWw7CisJcmV0dXJuIDA7 Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX3Byb2dfbl92MiAtIFByb2dyYW0gSERNSSBhdWRp byBOIHZhbHVlCisgKgorICogQGF1ZF9zYW1wX2ZyZXE6IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiBh dWRpbyBkYXRhCisgKiBAbl9wYXJhbTogTiB2YWx1ZSwgZGVwZW5kcyBvbiBhdWRfc2FtcF9mcmVx CisgKiBAaW50ZWxoYWRkYXRhOnN1YnN0cmVhbSBwcml2YXRlIGRhdGEKKyAqCisgKiBUaGlzIGZ1 bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgcHJlcGFyZSBjYWxsYmFjay4KKyAqIEl0IHByb2dyYW1z IGJhc2VkIG9uIHRoZSBhdWRpbyBhbmQgZGlzcGxheSBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLwor c3RhdGljIGludCBzbmRfaW50ZWxoYWRfcHJvZ19uX3YyKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIg Km5fcGFyYW0sCisJCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXMz MiBuX3ZhbDsKKworCW5fdmFsID0JaGFkX2NhbGN1bGF0ZV9uX3ZhbHVlKGF1ZF9zYW1wX2ZyZXEp OworCisJaWYgKG5fdmFsIDwgMCkKKwkJcmV0dXJuIG5fdmFsOworCisJaGFkX3dyaXRlX3JlZ2lz dGVyKEFVRF9OX0VOQUJMRSwgKEJJVCgyNCkgfCBuX3ZhbCkpOworCSpuX3BhcmFtID0gbl92YWw7 CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhhZF9jbGVhcl91bmRlcnJ1bl9pbnRyX3Yx KHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwl1MzIgaGRtaV9zdGF0dXMs IGkgPSAwOworCisJLyogSGFuZGxlIFVuZGVycnVuIGludGVycnVwdCB3aXRoaW4gQXVkaW8gVW5p dCAqLworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfQ09ORklHLCAwKTsKKwkvKiBSZXNldCBidWZm ZXIgcG9pbnRlcnMgKi8KKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTLCAxKTsK KwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTLCAwKTsKKwkvKioKKwkgKiBUaGUg aW50ZXJydXB0IHN0YXR1cyAnc3RpY2t5JyBiaXRzIG1pZ2h0IG5vdCBiZSBjbGVhcmVkIGJ5CisJ ICogc2V0dGluZyAnMScgdG8gdGhhdCBiaXQgb25jZS4uLgorCSAqLworCWRvIHsgLyogY2xlYXIg Yml0MzAsIDMxIEFVRF9IRE1JX1NUQVRVUyAqLworCQloYWRfcmVhZF9yZWdpc3RlcihBVURfSERN SV9TVEFUVVMsICZoZG1pX3N0YXR1cyk7CisJCXByX2RlYnVnKCJIRE1JIHN0YXR1cyA9MHgleFxu IiwgaGRtaV9zdGF0dXMpOworCQlpZiAoaGRtaV9zdGF0dXMgJiBBVURfQ09ORklHX01BU0tfVU5E RVJSVU4pIHsKKwkJCWkrKzsKKwkJCWhkbWlfc3RhdHVzICY9IChBVURfQ09ORklHX01BU0tfU1JE QkcgfAorCQkJCQlBVURfQ09ORklHX01BU0tfRlVOQ1JTVCk7CisJCQloZG1pX3N0YXR1cyB8PSB+ QVVEX0NPTkZJR19NQVNLX1VOREVSUlVOOworCQkJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1J X1NUQVRVUywgaGRtaV9zdGF0dXMpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0gd2hpbGUgKGkg PCBNQVhfQ05UKTsKKwlpZiAoaSA+PSBNQVhfQ05UKQorCQlwcl9lcnIoIlVuYWJsZSB0byBjbGVh ciBVTkRFUlJVTiBiaXRzXG4iKTsKK30KKworc3RhdGljIHZvaWQgaGFkX2NsZWFyX3VuZGVycnVu X2ludHJfdjIoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXUzMiBoZG1p X3N0YXR1cywgaSA9IDA7CisKKwkvKiBIYW5kbGUgVW5kZXJydW4gaW50ZXJydXB0IHdpdGhpbiBB dWRpbyBVbml0ICovCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DT05GSUcsIDApOworCS8qIFJl c2V0IGJ1ZmZlciBwb2ludGVycyAqLworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSV9TVEFU VVNfdjIsIDEpOworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSV9TVEFUVVNfdjIsIDApOwor CS8qKgorCSAqIFRoZSBpbnRlcnJ1cHQgc3RhdHVzICdzdGlja3knIGJpdHMgbWlnaHQgbm90IGJl IGNsZWFyZWQgYnkKKwkgKiBzZXR0aW5nICcxJyB0byB0aGF0IGJpdCBvbmNlLi4uCisJICovCisJ ZG8geyAvKiBjbGVhciBiaXQzMCwgMzEgQVVEX0hETUlfU1RBVFVTICovCisJCWhhZF9yZWFkX3Jl Z2lzdGVyKEFVRF9IRE1JX1NUQVRVU192MiwgJmhkbWlfc3RhdHVzKTsKKwkJcHJfZGVidWcoIkhE TUkgc3RhdHVzID0weCV4XG4iLCBoZG1pX3N0YXR1cyk7CisJCWlmIChoZG1pX3N0YXR1cyAmIEFV RF9DT05GSUdfTUFTS19VTkRFUlJVTikgeworCQkJaSsrOworCQkJaGFkX3dyaXRlX3JlZ2lzdGVy KEFVRF9IRE1JX1NUQVRVU192MiwgaGRtaV9zdGF0dXMpOworCQl9IGVsc2UKKwkJCWJyZWFrOwor CX0gd2hpbGUgKGkgPCBNQVhfQ05UKTsKKwlpZiAoaSA+PSBNQVhfQ05UKQorCQlwcl9lcnIoIlVu YWJsZSB0byBjbGVhciBVTkRFUlJVTiBiaXRzXG4iKTsKK30KKworLyoqCisqIHNuZF9pbnRlbGhh ZF9vcGVuIC0gc3RyZWFtIGluaXRpYWxpemF0aW9ucyBhcmUgZG9uZSBoZXJlCisqIEBzdWJzdHJl YW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgc3RyZWFtIGZ1bmN0aW9uIGlzIGNhbGxlZAorKgor KiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhIFBDTSBzdHJlYW0gaXMgb3BlbmVk CisqLworc3RhdGljIGludCBzbmRfaW50ZWxoYWRfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJl YW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisJ c3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKKwlzdHJ1Y3QgaGFkX3N0cmVhbV9wdnQg KnN0cmVhbTsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCWludCByZXR2YWw7 CisKKwlwcl9kZWJ1Zygic25kX2ludGVsaGFkX29wZW4gY2FsbGVkXG4iKTsKKwlpbnRlbGhhZGRh dGEgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaGFkX3N0cmVhbSA9IGlu dGVsaGFkZGF0YS0+cHJpdmF0ZV9kYXRhOworCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7 CisKKwlwbV9ydW50aW1lX2dldChpbnRlbGhhZGRhdGEtPmRldik7CisKKwlpZiAoaGFkX2dldF9o d3N0YXRlKGludGVsaGFkZGF0YSkpIHsKKwkJcHJfZXJyKCIlczogSERNSSBjYWJsZSBwbHVnZ2Vk LW91dFxuIiwgX19mdW5jX18pOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfcHV0 X2hhbmRsZTsKKwl9CisKKwkvKiBDaGVjaywgaWYgZGV2aWNlIGFscmVhZHkgaW4gdXNlICovCisJ aWYgKHJ1bnRpbWUtPnByaXZhdGVfZGF0YSkgeworCQlwcl9lcnIoIkRldmljZSBhbHJlYWR5IGlu IHVzZVxuIik7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJZ290byBleGl0X3B1dF9oYW5kbGU7CisJ fQorCisJLyogc2V0IHRoZSBydW50aW1lIGh3IHBhcmFtZXRlciB3aXRoIGxvY2FsIHNuZF9wY21f aGFyZHdhcmUgc3RydWN0ICovCisJcnVudGltZS0+aHcgPSBzbmRfaW50ZWxfaGFkc3RyZWFtOwor CisJc3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOworCWlmICgh c3RyZWFtKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9wdXRfaGFuZGxlOwor CX0KKwlzdHJlYW0tPnN0cmVhbV9zdGF0dXMgPSBTVFJFQU1fSU5JVDsKKwlydW50aW1lLT5wcml2 YXRlX2RhdGEgPSBzdHJlYW07CisKKwlyZXR2YWwgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50 ZWdlcihydW50aW1lLAorCQkJIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAocmV0 dmFsIDwgMCkKKwkJZ290byBleGl0X2VycjsKKworCS8qIE1ha2Ugc3VyZSwgdGhhdCB0aGUgcGVy aW9kIHNpemUgaXMgYWx3YXlzIGFsaWduZWQKKwkgKiA2NGJ5dGUgYm91bmRhcnkKKwkgKi8KKwly ZXR2YWwgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChzdWJzdHJlYW0tPnJ1bnRpbWUsIDAs CisJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCA2NCk7CisJaWYgKHJldHZhbCA8 IDApIHsKKwkJcHJfZXJyKCIlczpzdGVwX3NpemU9NjQgZmFpbGVkLGVycj0lZFxuIiwgX19mdW5j X18sIHJldHZhbCk7CisJCWdvdG8gZXhpdF9lcnI7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK2V4 aXRfZXJyOgorCWtmcmVlKHN0cmVhbSk7CitleGl0X3B1dF9oYW5kbGU6CisJcG1fcnVudGltZV9w dXQoaW50ZWxoYWRkYXRhLT5kZXYpOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJ cmV0dXJuIHJldHZhbDsKK30KKworLyoqCisqIGhhZF9wZXJpb2RfZWxhcHNlZCAtIHVwZGF0ZXMg dGhlIGhhcmR3YXJlIHBvaW50ZXIgc3RhdHVzCisqIEBoYWRfc3Vic3RyZWFtOnN1YnN0cmVhbSBm b3Igd2hpY2ggdGhlIHN0cmVhbSBmdW5jdGlvbiBpcyBjYWxsZWQKKyoKKyovCitzdGF0aWMgdm9p ZCBoYWRfcGVyaW9kX2VsYXBzZWQodm9pZCAqaGFkX3N1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25k X3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGhhZF9zdWJzdHJlYW07CisJc3RydWN0IGhhZF9z dHJlYW1fcHZ0ICpzdHJlYW07CisKKwkvKiBwcl9kZWJ1ZygiaGFkX3BlcmlvZF9lbGFwc2VkIGNh bGxlZFxuIik7ICovCisKKwlpZiAoIXN1YnN0cmVhbSB8fCAhc3Vic3RyZWFtLT5ydW50aW1lKQor CQlyZXR1cm47CisJc3RyZWFtID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJ aWYgKCFzdHJlYW0pCisJCXJldHVybjsKKworCWlmIChzdHJlYW0tPnN0cmVhbV9zdGF0dXMgIT0g U1RSRUFNX1JVTk5JTkcpCisJCXJldHVybjsKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0 cmVhbSk7Cit9CisKKy8qKgorKiBzbmRfaW50ZWxoYWRfaW5pdF9zdHJlYW0gLSBpbnRlcm5hbCBm dW5jdGlvbiB0byBpbml0aWFsaXplIHN0cmVhbSBpbmZvCisqIEBzdWJzdHJlYW06c3Vic3RyZWFt IGZvciB3aGljaCB0aGUgc3RyZWFtIGZ1bmN0aW9uIGlzIGNhbGxlZAorKgorKi8KK3N0YXRpYyBp bnQgc25kX2ludGVsaGFkX2luaXRfc3RyZWFtKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vi c3RyZWFtKQoreworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IHNuZF9wY21f c3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCXByX2RlYnVnKCJzbmRfaW50ZWxoYWRfaW5p dF9zdHJlYW0gY2FsbGVkXG4iKTsKKworCXByX2RlYnVnKCJzZXR0aW5nIGJ1ZmZlciBwdHIgcGFy YW1cbiIpOworCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8ucGVyaW9kX2VsYXBzZWQgPSBoYWRf cGVyaW9kX2VsYXBzZWQ7CisJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFt ID0gc3Vic3RyZWFtOworCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3B0ciA9IDA7 CisJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5idWZmZXJfcmVuZGVyZWQgPSAwOworCWludGVs aGFkZGF0YS0+c3RyZWFtX2luZm8uc2ZyZXEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGU7CisJ cmV0dXJuIDA7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX2Nsb3NlLSB0byBmcmVlIHBhcmFt ZXRlcmVzIHdoZW4gc3RyZWFtIGlzIHN0b3BwZWQKKyAqCisgKiBAc3Vic3RyZWFtOiAgc3Vic3Ry ZWFtIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkCisgKgorICogVGhpcyBmdW5jdGlv biBpcyBjYWxsZWQgYnkgQUxTQSBmcmFtZXdvcmsgd2hlbiBzdHJlYW0gaXMgc3RvcHBlZAorICov CitzdGF0aWMgaW50IHNuZF9pbnRlbGhhZF9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0g KnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisJc3Ry dWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKKworCXByX2RlYnVnKCJzbmRfaW50ZWxoYWRf Y2xvc2UgY2FsbGVkXG4iKTsKKworCWludGVsaGFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2No aXAoc3Vic3RyZWFtKTsKKwlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJaWYgKCFy dW50aW1lLT5wcml2YXRlX2RhdGEpIHsKKwkJcHJfZGVidWcoImNsb3NlKCkgbWlnaHQgaGF2ZSBj YWxsZWQgYWZ0ZXIgZmFpbGVkIG9wZW4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW50ZWxoYWRk YXRhLT5zdHJlYW1faW5mby5idWZmZXJfcmVuZGVyZWQgPSAwOworCWludGVsaGFkZGF0YS0+c3Ry ZWFtX2luZm8uYnVmZmVyX3B0ciA9IDA7CisJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5zdHJf aWQgPSAwOworCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVhbSA9IE5VTEw7 CisKKwkvKiBDaGVjayBpZiBmb2xsb3dpbmcgZHJ2X3N0YXR1cyBtb2RpZmljYXRpb24gaXMgcmVx dWlyZWQgLSBWQSAqLworCWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgIT0gSEFEX0RSVl9E SVNDT05ORUNURUQpIHsKKwkJaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID0gSEFEX0RSVl9DT05O RUNURUQ7CisJCXByX2RlYnVnKCIlcyBAICVkOkRFQlVHIFBMVUcvVU5QTFVHIDogSEFEX0RSVl9D T05ORUNURURcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCX0KKwlrZnJlZShydW50aW1l LT5wcml2YXRlX2RhdGEpOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcG1fcnVu dGltZV9wdXQoaW50ZWxoYWRkYXRhLT5kZXYpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNu ZF9pbnRlbGhhZF9od19wYXJhbXMtIHRvIHNldHVwIHRoZSBoYXJkd2FyZSBwYXJhbWV0ZXJzCisg KiBsaWtlIGFsbG9jYXRpbmcgdGhlIGJ1ZmZlcnMKKyAqCisgKiBAc3Vic3RyZWFtOiAgc3Vic3Ry ZWFtIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkCisgKiBAaHdfcGFyYW1zOiBoYXJk d2FyZSBwYXJhbWV0ZXJzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQUxTQSBm cmFtZXdvcmsgd2hlbiBoYXJkd2FyZSBwYXJhbXMgYXJlIHNldAorICovCitzdGF0aWMgaW50IHNu ZF9pbnRlbGhhZF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0s CisJCQkJICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQoreworCXVuc2ln bmVkIGxvbmcgYWRkcjsKKwlpbnQgcGFnZXMsIGJ1Zl9zaXplLCByZXR2YWw7CisKKwlwcl9kZWJ1 Zygic25kX2ludGVsaGFkX2h3X3BhcmFtcyBjYWxsZWRcbiIpOworCisJaWYgKCFod19wYXJhbXMp CisJCXJldHVybiAtRUlOVkFMOworCisJYnVmX3NpemUgPSBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3 X3BhcmFtcyk7CisJcmV0dmFsID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwg YnVmX3NpemUpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCXByX2RlYnVn KCIlczphbGxvY2F0ZWQgbWVtb3J5ID0gJWRcbiIsIF9fZnVuY19fLCBidWZfc2l6ZSk7CisJLyog bWFyayB0aGUgcGFnZXMgYXMgdW5jYWNoZWQgcmVnaW9uICovCisJYWRkciA9ICh1bnNpZ25lZCBs b25nKSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhOworCXBhZ2VzID0gKHN1YnN0cmVhbS0+ cnVudGltZS0+ZG1hX2J5dGVzICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJcmV0dmFs ID0gc2V0X21lbW9yeV91YyhhZGRyLCBwYWdlcyk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIo InNldF9tZW1vcnlfdWMgZmFpbGVkLkVycm9yOiVkXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0 dmFsOworCX0KKwltZW1zZXQoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSwgMCwgYnVmX3Np emUpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfaHdfZnJl ZS0gdG8gcmVsZWFzZSB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZCBkdXJpbmcKKyAqIGhhcmR3YXJl IHBhcmFtcyBzZXR1cAorICoKKyAqIEBzdWJzdHJlYW06ICBzdWJzdHJlYW0gZm9yIHdoaWNoIHRo ZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBB TFNBIGZyYW1ld29yayBiZWZvcmUgY2xvc2UgY2FsbGJhY2suCisgKgorICovCitzdGF0aWMgaW50 IHNuZF9pbnRlbGhhZF9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFt KQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1MzIgcGFnZXM7CisKKwlwcl9kZWJ1Zygic25k X2ludGVsaGFkX2h3X2ZyZWUgY2FsbGVkXG4iKTsKKworCS8qIG1hcmsgYmFjayB0aGUgcGFnZXMg YXMgY2FjaGVkL3dyaXRlYmFjayByZWdpb24gYmVmb3JlIHRoZSBmcmVlICovCisJaWYgKHN1YnN0 cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgIT0gTlVMTCkgeworCQlhZGRyID0gKHVuc2lnbmVkIGxv bmcpIHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWE7CisJCXBhZ2VzID0gKHN1YnN0cmVhbS0+ cnVudGltZS0+ZG1hX2J5dGVzICsgUEFHRV9TSVpFIC0gMSkgLworCQkJCQkJCQlQQUdFX1NJWkU7 CisJCXNldF9tZW1vcnlfd2IoYWRkciwgcGFnZXMpOworCQlyZXR1cm4gc25kX3BjbV9saWJfZnJl ZV9wYWdlcyhzdWJzdHJlYW0pOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisqIHNuZF9pbnRl bGhhZF9wY21fdHJpZ2dlciAtIHN0cmVhbSBhY3Rpdml0aWVzIGFyZSBoYW5kbGVkIGhlcmUKKyog QHN1YnN0cmVhbTpzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBzdHJlYW0gZnVuY3Rpb24gaXMgY2Fs bGVkCisqIEBjbWQ6dGhlIHN0cmVhbSBjb21tYW1kIHRoYXRzIHJlcXVlc3RlZCBmcm9tIHVwcGVy IGxheWVyCisqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGEgc3RyZWFtIGFj dGl2aXR5IGlzIGludm9rZWQKKyovCitzdGF0aWMgaW50IHNuZF9pbnRlbGhhZF9wY21fdHJpZ2dl cihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJaW50IGNtZCkKK3sK KwlpbnQgY2FwcywgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxOworCXN0cnVj dCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YTsKKwlzdHJ1Y3QgaGFkX3N0cmVhbV9wdnQgKnN0 cmVhbTsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCisJcHJfZGVidWcoInNu ZF9pbnRlbGhhZF9wY21fdHJpZ2dlciBjYWxsZWRcbiIpOworCisJaW50ZWxoYWRkYXRhID0gc25k X3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVu dGltZS0+cHJpdmF0ZV9kYXRhOworCWhhZF9zdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVf ZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoK KwkJcHJfZGVidWcoIlRyaWdnZXIgU3RhcnRcbiIpOworCisJCS8qIERpc2FibGUgbG9jYWwgSU5U UnMgdGlsbCByZWdpc3RlciBwcmdtbmcgaXMgZG9uZSAqLworCQlpZiAoaGFkX2dldF9od3N0YXRl KGludGVsaGFkZGF0YSkpIHsKKwkJCXByX2VycigiX1NUQVJUOiBIRE1JIGNhYmxlIHBsdWdnZWQt b3V0XG4iKTsKKwkJCXJldHZhbCA9IC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQorCQlzdHJlYW0t PnN0cmVhbV9zdGF0dXMgPSBTVFJFQU1fUlVOTklORzsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgm aW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxKTsKKwkJaGFkX3N0cmVhbS0+c3Ry ZWFtX3R5cGUgPSBIQURfUlVOTklOR19TVFJFQU07CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycSk7CisKKwkJLyogRW5hYmxlIEF1 ZGlvICovCisJCS8qCisJCSAqIFRvRG86IE5lZWQgdG8gZW5hYmxlIFVOREVSUlVOIGludGVycnVw dHMgYXMgd2VsbAorCQkgKiAgIGNhcHMgPSBIRE1JX0FVRElPX1VOREVSUlVOIHwgSERNSV9BVURJ T19CVUZGRVJfRE9ORTsKKwkJICovCisJCWNhcHMgPSBIRE1JX0FVRElPX0JVRkZFUl9ET05FOwor CQlyZXR2YWwgPSBoYWRfc2V0X2NhcHMoSEFEX1NFVF9FTkFCTEVfQVVESU9fSU5ULCAmY2Fwcyk7 CisJCXJldHZhbCA9IGhhZF9zZXRfY2FwcyhIQURfU0VUX0VOQUJMRV9BVURJTywgTlVMTCk7CisJ CWludGVsaGFkZGF0YS0+b3BzLT5lbmFibGVfYXVkaW8oc3Vic3RyZWFtLCAxKTsKKworCQlwcl9k ZWJ1ZygiUHJvY2Vzc2VkIF9TdGFydFxuIik7CisKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BD TV9UUklHR0VSX1NUT1A6CisJCXByX2RlYnVnKCJUcmlnZ2VyIFN0b3BcbiIpOworCQlzcGluX2xv Y2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxKTsKKwkJaW50 ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5zdHJfaWQgPSAwOworCQlpbnRlbGhhZGRhdGEtPmN1cnJf YnVmID0gMDsKKworCQkvKiBTdG9wIHJlcG9ydGluZyBCVUZGRVJfRE9ORS9VTkRFUlJVTiB0byBh Ym92ZSBsYXllcnMqLworCisJCWhhZF9zdHJlYW0tPnN0cmVhbV90eXBlID0gSEFEX0lOSVQ7CisJ CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFn X2lycSk7CisJCS8qIERpc2FibGUgQXVkaW8gKi8KKwkJLyoKKwkJICogVG9EbzogTmVlZCB0byBk aXNhYmxlIFVOREVSUlVOIGludGVycnVwdHMgYXMgd2VsbAorCQkgKiAgIGNhcHMgPSBIRE1JX0FV RElPX1VOREVSUlVOIHwgSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwkJICovCisJCWNhcHMgPSBI RE1JX0FVRElPX0JVRkZFUl9ET05FOworCQloYWRfc2V0X2NhcHMoSEFEX1NFVF9ESVNBQkxFX0FV RElPX0lOVCwgJmNhcHMpOworCQlpbnRlbGhhZGRhdGEtPm9wcy0+ZW5hYmxlX2F1ZGlvKHN1YnN0 cmVhbSwgMCk7CisJCS8qIFJlc2V0IGJ1ZmZlciBwb2ludGVycyAqLworCQlpbnRlbGhhZGRhdGEt Pm9wcy0+cmVzZXRfYXVkaW8oMSk7CisJCWludGVsaGFkZGF0YS0+b3BzLT5yZXNldF9hdWRpbygw KTsKKwkJc3RyZWFtLT5zdHJlYW1fc3RhdHVzID0gU1RSRUFNX0RST1BQRUQ7CisJCWhhZF9zZXRf Y2FwcyhIQURfU0VUX0RJU0FCTEVfQVVESU8sIE5VTEwpOworCQlicmVhazsKKworCWRlZmF1bHQ6 CisJCXJldHZhbCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorKiBz bmRfaW50ZWxoYWRfcGNtX3ByZXBhcmUtIGludGVybmFsIHByZXBhcmF0aW9uIGJlZm9yZSBzdGFy dGluZyBhIHN0cmVhbQorKgorKiBAc3Vic3RyZWFtOiAgc3Vic3RyZWFtIGZvciB3aGljaCB0aGUg ZnVuY3Rpb24gaXMgY2FsbGVkCisqCisqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBz dHJlYW0gaXMgc3RhcnRlZCBmb3IgaW50ZXJuYWwgcHJlcGFyYXRpb24uCisqLworc3RhdGljIGlu dCBzbmRfaW50ZWxoYWRfcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJz dHJlYW0pCit7CisJaW50IHJldHZhbDsKKwl1MzIgZGlzcF9zYW1wX2ZyZXEsIG5fcGFyYW07CisJ c3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRp bWUgKnJ1bnRpbWU7CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKworCXByX2Rl YnVnKCJzbmRfaW50ZWxoYWRfcGNtX3ByZXBhcmUgY2FsbGVkXG4iKTsKKworCWludGVsaGFkZGF0 YSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlydW50aW1lID0gc3Vic3Ry ZWFtLT5ydW50aW1lOworCWhhZF9zdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsK KworCWlmIChoYWRfZ2V0X2h3c3RhdGUoaW50ZWxoYWRkYXRhKSkgeworCQlwcl9lcnIoIiVzOiBI RE1JIGNhYmxlIHBsdWdnZWQtb3V0XG4iLCBfX2Z1bmNfXyk7CisJCXNuZF9wY21fc3RvcChzdWJz dHJlYW0sIFNORFJWX1BDTV9TVEFURV9ESVNDT05ORUNURUQpOworCQlyZXR2YWwgPSAtRU5PREVW OworCQlnb3RvIHByZXBfZW5kOworCX0KKworCXByX2RlYnVnKCJwZXJpb2Rfc2l6ZT0lZFxuIiwK KwkJKGludClmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgcnVudGltZS0+cGVyaW9kX3NpemUpKTsK Kwlwcl9kZWJ1ZygicGVyaW9kcz0lZFxuIiwgcnVudGltZS0+cGVyaW9kcyk7CisJcHJfZGVidWco ImJ1ZmZlcl9zaXplPSVkXG4iLCAoaW50KXNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJl YW0pKTsKKwlwcl9kZWJ1ZygicmF0ZT0lZFxuIiwgcnVudGltZS0+cmF0ZSk7CisJcHJfZGVidWco ImNoYW5uZWxzPSVkXG4iLCBydW50aW1lLT5jaGFubmVscyk7CisKKwlpZiAoaW50ZWxoYWRkYXRh LT5zdHJlYW1faW5mby5zdHJfaWQpIHsKKwkJcHJfZGVidWcoIl9wcmVwYXJlIGlzIGNhbGxlZCBm b3IgZXhpc3Rpbmcgc3RyX2lkIyVkXG4iLAorCQkJCQlpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZv LnN0cl9pZCk7CisJCXJldHZhbCA9IHNuZF9pbnRlbGhhZF9wY21fdHJpZ2dlcihzdWJzdHJlYW0s CisJCQkJCQlTTkRSVl9QQ01fVFJJR0dFUl9TVE9QKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisK KwlyZXR2YWwgPSBzbmRfaW50ZWxoYWRfaW5pdF9zdHJlYW0oc3Vic3RyZWFtKTsKKwlpZiAocmV0 dmFsKQorCQlnb3RvIHByZXBfZW5kOworCisKKwkvKiBHZXQgTiB2YWx1ZSBpbiBLSHogKi8KKwly ZXR2YWwgPSBoYWRfZ2V0X2NhcHMoSEFEX0dFVF9ESVNQTEFZX1JBVEUsICZkaXNwX3NhbXBfZnJl cSk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoInF1ZXJ5aW5nIGRpc3BsYXkgc2FtcGxpbmcg ZnJlcSBmYWlsZWQgJSN4XG4iLCByZXR2YWwpOworCQlnb3RvIHByZXBfZW5kOworCX0KKworCWhh ZF9nZXRfY2FwcyhIQURfR0VUX0VMRCwgJmludGVsaGFkZGF0YS0+ZWVsZCk7CisKKwlyZXR2YWwg PSBpbnRlbGhhZGRhdGEtPm9wcy0+cHJvZ19uKHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZSwgJm5f cGFyYW0sCisJCQkJCQkJCWludGVsaGFkZGF0YSk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIo InByb2dyYW1taW5nIE4gdmFsdWUgZmFpbGVkICUjeFxuIiwgcmV0dmFsKTsKKwkJZ290byBwcmVw X2VuZDsKKwl9CisJaW50ZWxoYWRkYXRhLT5vcHMtPnByb2dfY3RzKHN1YnN0cmVhbS0+cnVudGlt ZS0+cmF0ZSwKKwkJCQkJZGlzcF9zYW1wX2ZyZXEsIG5fcGFyYW0sIGludGVsaGFkZGF0YSk7CisK KwlpbnRlbGhhZGRhdGEtPm9wcy0+cHJvZ19kaXAoc3Vic3RyZWFtLCBpbnRlbGhhZGRhdGEpOwor CisJcmV0dmFsID0gaW50ZWxoYWRkYXRhLT5vcHMtPmF1ZGlvX2N0cmwoc3Vic3RyZWFtLCBpbnRl bGhhZGRhdGEpOworCisJLyogUHJvZyBidWZmZXIgYWRkcmVzcyAqLworCXJldHZhbCA9IHNuZF9p bnRlbGhhZF9wcm9nX2J1ZmZlcihpbnRlbGhhZGRhdGEsCisJCQlIQURfQlVGX1RZUEVfQSwgSEFE X0JVRl9UWVBFX0QpOworCisJLyoKKwkgKiBQcm9ncmFtIGNoYW5uZWwgbWFwcGluZyBpbiBmb2xs b3dpbmcgb3JkZXI6CisJICogRkwsIEZSLCBDLCBMRkUsIFJMLCBSUgorCSAqLworCisJaGFkX3dy aXRlX3JlZ2lzdGVyKEFVRF9CVUZfQ0hfU1dBUCwgU1dBUF9MRkVfQ0VOVEVSKTsKKworcHJlcF9l bmQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfcGNtX3BvaW50 ZXItIHRvIHNlbmQgdGhlIGN1cnJlbnQgYnVmZmVyIHBvaW50ZXJwcm9jZXNzZWQgYnkgaHcKKyAq CisgKiBAc3Vic3RyZWFtOiAgc3Vic3RyZWFtIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gaXMgY2Fs bGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQUxTQSBmcmFtZXdvcmsgdG8g Z2V0IHRoZSBjdXJyZW50IGh3IGJ1ZmZlciBwdHIKKyAqIHdoZW4gYSBwZXJpb2QgaXMgZWxhcHNl ZAorICovCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX2ludGVsaGFkX3BjbV9wb2ludGVy KAorCQkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qg c25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisJdTMyIGJ5dGVzX3JlbmRlcmVkID0gMDsKKwor CS8qIHByX2RlYnVnKCJzbmRfaW50ZWxoYWRfcGNtX3BvaW50ZXIgY2FsbGVkXG4iKTsgKi8KKwor CWludGVsaGFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWlm IChpbnRlbGhhZGRhdGEtPmZsYWdfdW5kZXJydW4pIHsKKwkJaW50ZWxoYWRkYXRhLT5mbGFnX3Vu ZGVycnVuID0gMDsKKwkJcmV0dXJuIFNORFJWX1BDTV9QT1NfWFJVTjsKKwl9CisKKwlpZiAoaW50 ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5idWZmZXJfcmVuZGVyZWQpCisJCWRpdl91NjRfcmVtKGlu dGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3JlbmRlcmVkLAorCQkJaW50ZWxoYWRkYXRh LT5zdHJlYW1faW5mby5yaW5nX2J1Zl9zaXplLAorCQkJJihieXRlc19yZW5kZXJlZCkpOworCisJ aW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5idWZmZXJfcHRyID0gYnl0ZXNfdG9fZnJhbWVzKAor CQkJCQkJc3Vic3RyZWFtLT5ydW50aW1lLAorCQkJCQkJYnl0ZXNfcmVuZGVyZWQpOworCXJldHVy biBpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmJ1ZmZlcl9wdHI7Cit9CisKKy8qKgorKiBzbmRf aW50ZWxoYWRfcGNtX21tYXAtIG1tYXBzIGEga2VybmVsIGJ1ZmZlciB0byB1c2VyIHNwYWNlIGZv ciBjb3B5aW5nIGRhdGEKKyoKKyogQHN1YnN0cmVhbTogIHN1YnN0cmVhbSBmb3Igd2hpY2ggdGhl IGZ1bmN0aW9uIGlzIGNhbGxlZAorKiBAdm1hOgkJc3RydWN0IGluc3RhbmNlIG9mIG1lbW9yeSBW TU0gbWVtb3J5IGFyZWEKKyoKKyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgT1Mgd2hlbiBh IHVzZXIgc3BhY2UgY29tcG9uZW50CisqIHRyaWVzIHRvIGdldCBtbWFwIG1lbW9yeSBmcm9tIGRy aXZlcgorKi8KK3N0YXRpYyBpbnQgc25kX2ludGVsaGFkX3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNt X3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorewor CisJcHJfZGVidWcoInNuZF9pbnRlbGhhZF9wY21fbW1hcCBjYWxsZWRcbiIpOworCisJcHJfZGVi dWcoImVudHJ5IHdpdGggcHJvdDolc1xuIiwgX19mdW5jX18pOworCXZtYS0+dm1fcGFnZV9wcm90 ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJcmV0dXJuIHJlbWFwX3Bm bl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQlzdWJzdHJlYW0tPmRtYV9idWZmZXIuYWRk ciA+PiBQQUdFX1NISUZULAorCQkJdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZt X3BhZ2VfcHJvdCk7Cit9CisKK2ludCBoZG1pX2F1ZGlvX21vZGVfY2hhbmdlKHN0cnVjdCBzbmRf cGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWludCByZXR2YWwgPSAwOworCXUzMiBkaXNw X3NhbXBfZnJlcSwgbl9wYXJhbTsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7 CisKKwlpbnRlbGhhZGRhdGEgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisK KwkvKiBEaXNhYmxlIEF1ZGlvICovCisJaW50ZWxoYWRkYXRhLT5vcHMtPmVuYWJsZV9hdWRpbyhz dWJzdHJlYW0sIDApOworCisJLyogVXBkYXRlIENUUyB2YWx1ZSAqLworCXJldHZhbCA9IGhhZF9n ZXRfY2FwcyhIQURfR0VUX0RJU1BMQVlfUkFURSwgJmRpc3Bfc2FtcF9mcmVxKTsKKwlpZiAocmV0 dmFsKSB7CisJCXByX2VycigicXVlcnlpbmcgZGlzcGxheSBzYW1wbGluZyBmcmVxIGZhaWxlZCAl I3hcbiIsIHJldHZhbCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldHZhbCA9IGludGVsaGFkZGF0 YS0+b3BzLT5wcm9nX24oc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlLCAmbl9wYXJhbSwKKwkJCQkJ CQkJaW50ZWxoYWRkYXRhKTsKKwlpZiAocmV0dmFsKSB7CisJCXByX2VycigicHJvZ3JhbW1pbmcg TiB2YWx1ZSBmYWlsZWQgJSN4XG4iLCByZXR2YWwpOworCQlnb3RvIG91dDsKKwl9CisJaW50ZWxo YWRkYXRhLT5vcHMtPnByb2dfY3RzKHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZSwKKwkJCQkJZGlz cF9zYW1wX2ZyZXEsIG5fcGFyYW0sIGludGVsaGFkZGF0YSk7CisKKwkvKiBFbmFibGUgQXVkaW8g Ki8KKwlpbnRlbGhhZGRhdGEtPm9wcy0+ZW5hYmxlX2F1ZGlvKHN1YnN0cmVhbSwgMSk7CisKK291 dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKlBDTSBvcGVyYXRpb25zIHN0cnVjdHVyZSBhbmQg dGhlIGNhbGxzIGJhY2sgZm9yIHRoZSBzYW1lICovCitzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2lu dGVsaGFkX3BsYXliYWNrX29wcyA9IHsKKwkub3BlbiA9CQlzbmRfaW50ZWxoYWRfb3BlbiwKKwku Y2xvc2UgPQlzbmRfaW50ZWxoYWRfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGws CisJLmh3X3BhcmFtcyA9CXNuZF9pbnRlbGhhZF9od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRf aW50ZWxoYWRfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNuZF9pbnRlbGhhZF9wY21fcHJlcGFyZSwK KwkudHJpZ2dlciA9CXNuZF9pbnRlbGhhZF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9p bnRlbGhhZF9wY21fcG9pbnRlciwKKwkubW1hcCA9CXNuZF9pbnRlbGhhZF9wY21fbW1hcCwKK307 CisKKy8qKgorICogc25kX2ludGVsaGFkX2NyZWF0ZSAtIHRvIGNyZXRlIGFsc2EgY2FyZCBpbnN0 YW5jZQorICoKKyAqIEBpbnRlbGhhZGRhdGE6IHBvaW50ZXIgdG8gaW50ZXJuYWwgY29udGV4dAor ICogQGNhcmQ6IHBvaW50ZXIgdG8gY2FyZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVk IHdoZW4gdGhlIGhkbWkgY2FibGUgaXMgcGx1Z2dlZCBpbgorICovCitzdGF0aWMgaW50IHNuZF9p bnRlbGhhZF9jcmVhdGUoCisJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSwKKwkJ c3RydWN0IHNuZF9jYXJkICpjYXJkKQoreworCWludCByZXR2YWw7CisJc3RhdGljIHN0cnVjdCBz bmRfZGV2aWNlX29wcyBvcHMgPSB7CisJfTsKKworCXByX2RlYnVnKCJzbmRfaW50ZWxoYWRfY3Jl YXRlIGNhbGxlZFxuIik7CisKKwlpZiAoIWludGVsaGFkZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7 CisKKwkvKiBBTFNBIGFwaSB0byByZWdpc3RlciB0aGUgZGV2aWNlICovCisJcmV0dmFsID0gc25k X2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBpbnRlbGhhZGRhdGEsICZvcHMp OworCXJldHVybiByZXR2YWw7Cit9CisvKioKKyAqIHNuZF9pbnRlbGhhZF9wY21fZnJlZSAtIHRv IGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQKKyAqCisgKiBAcGNtOiBwb2ludGVyIHRvIHBjbSBp bnN0YW5jZQorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGlzIHJl bW92ZWQKKyAqLworc3RhdGljIHZvaWQgc25kX2ludGVsaGFkX3BjbV9mcmVlKHN0cnVjdCBzbmRf cGNtICpwY20pCit7CisJcHJfZGVidWcoIkZyZWVpbmcgUENNIHByZWFsbG9jYXRlZCBwYWdlc1xu Iik7CisJc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfZnJlZV9mb3JfYWxsKHBjbSk7Cit9CisKK3N0 YXRpYyBpbnQgaGFkX2llYzk1OF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAor CQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBT TkRSVl9DVExfRUxFTV9UWVBFX0lFQzk1ODsKKwl1aW5mby0+Y291bnQgPSAxOworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IGhhZF9pZWM5NThfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtj b250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0 cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250 cm9sKTsKKworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gKGludGVsaGFkZGF0 YS0+YWVzX2JpdHMgPj4gMCkgJiAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVz WzFdID0gKGludGVsaGFkZGF0YS0+YWVzX2JpdHMgPj4gOCkgJiAweGZmOworCXVjb250cm9sLT52 YWx1ZS5pZWM5NTguc3RhdHVzWzJdID0KKwkJCQkJKGludGVsaGFkZGF0YS0+YWVzX2JpdHMgPj4g MTYpICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA9CisJCQkJCShp bnRlbGhhZGRhdGEtPmFlc19iaXRzID4+IDI0KSAmIDB4ZmY7CisJcmV0dXJuIDA7Cit9CitzdGF0 aWMgaW50IGhhZF9pZWM5NThfbWFza19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2ws CisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdWNvbnRyb2wt PnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTgu c3RhdHVzWzFdID0gMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA9IDB4 ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPSAweGZmOworCXJldHVybiAw OworfQorc3RhdGljIGludCBoYWRfaWVjOTU4X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29u dHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1bnNp Z25lZCBpbnQgdmFsOworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IHNuZF9r Y29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXByX2RlYnVnKCJlbnRlcmVkIGhhZF9pZWM5NThf cHV0XG4iKTsKKwl2YWwgPSAodWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPDwgMCkg fAorCQkodWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPDwgOCkgfAorCQkodWNvbnRy b2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPDwgMTYpIHwKKwkJKHVjb250cm9sLT52YWx1ZS5p ZWM5NTguc3RhdHVzWzNdIDw8IDI0KTsKKwlpZiAoaW50ZWxoYWRkYXRhLT5hZXNfYml0cyAhPSB2 YWwpIHsKKwkJaW50ZWxoYWRkYXRhLT5hZXNfYml0cyA9IHZhbDsKKwkJcmV0dXJuIDE7CisJfQor CXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGFkX2NvbnRy b2xfaWVjOTU4X21hc2sgPSB7CisJLmFjY2VzcyA9ICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JF QUQsCisJLmlmYWNlID0gICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5uYW1lID0gICAg IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIiwgUExBWUJBQ0ssIE1BU0spLAorCS5pbmZvID0gICAg IGhhZF9pZWM5NThfaW5mbywgLyogc2hhcmVkICovCisJLmdldCA9ICAgICAgaGFkX2llYzk1OF9t YXNrX2dldCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBoYWRfY29udHJv bF9pZWM5NTggPSB7CisJLmlmYWNlID0gICAgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS5u YW1lID0gICAgICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBMQVlCQUNLLCBERUZBVUxU KSwKKwkuaW5mbyA9ICAgICAgICAgaGFkX2llYzk1OF9pbmZvLAorCS5nZXQgPSAgICAgICAgICBo YWRfaWVjOTU4X2dldCwKKwkucHV0ID0gICAgICAgICAgaGFkX2llYzk1OF9wdXQKK307CisKK3N0 YXRpYyBzdHJ1Y3Qgc25kX2ludGVsX2hhZF9pbnRlcmZhY2UgaGFkX2ludGVyZmFjZSA9IHsKKwku bmFtZSA9ICAgICAgICAgImhkbWktYXVkaW8iLAorCS5xdWVyeSA9ICAgICAgICBoZG1pX2F1ZGlv X3F1ZXJ5LAorCS5zdXNwZW5kID0gICAgICBoZG1pX2F1ZGlvX3N1c3BlbmQsCisJLnJlc3VtZSA9 ICAgICAgIGhkbWlfYXVkaW9fcmVzdW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBoYWRfb3BzIGhh ZF9vcHNfdjEgPSB7CisJLmVuYWJsZV9hdWRpbyA9IHNuZF9pbnRlbGhhZF9lbmFibGVfYXVkaW9f djEsCisJLnJlc2V0X2F1ZGlvID0gc25kX2ludGVsaGFkX3Jlc2V0X2F1ZGlvX3YxLAorCS5wcm9n X24gPQlzbmRfaW50ZWxoYWRfcHJvZ19uX3YxLAorCS5wcm9nX2N0cyA9CXNuZF9pbnRlbGhhZF9w cm9nX2N0c192MSwKKwkuYXVkaW9fY3RybCA9CXNuZF9pbnRlbGhhZF9wcm9nX2F1ZGlvX2N0cmxf djEsCisJLnByb2dfZGlwID0Jc25kX2ludGVsaGFkX3Byb2dfZGlwX3YxLAorCS5oYW5kbGVfdW5k ZXJydW4gPSAgaGFkX2NsZWFyX3VuZGVycnVuX2ludHJfdjEsCit9OworCitzdGF0aWMgc3RydWN0 IGhhZF9vcHMgaGFkX29wc192MiA9IHsKKwkuZW5hYmxlX2F1ZGlvID0gc25kX2ludGVsaGFkX2Vu YWJsZV9hdWRpb192MiwKKwkucmVzZXRfYXVkaW8gPSBzbmRfaW50ZWxoYWRfcmVzZXRfYXVkaW9f djIsCisJLnByb2dfbiA9CXNuZF9pbnRlbGhhZF9wcm9nX25fdjIsCisJLnByb2dfY3RzID0Jc25k X2ludGVsaGFkX3Byb2dfY3RzX3YyLAorCS5hdWRpb19jdHJsID0Jc25kX2ludGVsaGFkX3Byb2df YXVkaW9fY3RybF92MiwKKwkucHJvZ19kaXAgPQlzbmRfaW50ZWxoYWRfcHJvZ19kaXBfdjIsCisJ LmhhbmRsZV91bmRlcnJ1biA9IGhhZF9jbGVhcl91bmRlcnJ1bl9pbnRyX3YyLAorfTsKKy8qKgor ICogaGRtaV9hdWRpb19wcm9iZSAtIHRvIGNyZWF0ZSBzb3VuZCBjYXJkIGluc3RhbmNlIGZvciBI RE1JIGF1ZGlvIHBsYXlhYmNrCisgKgorICpAaGFkZGF0YTogcG9pbnRlciB0byBIQUQgcHJpdmF0 ZSBkYXRhCisgKkBjYXJkX2lkOiBjYXJkIGZvciB3aGljaCBwcm9iZSBpcyBjYWxsZWQKKyAqCisg KiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBoZG1pIGNhYmxlIGlzIHBsdWdnZWQg aW4uIFRoaXMgZnVuY3Rpb24KKyAqIGNyZWF0ZXMgYW5kIHJlZ2lzdGVycyB0aGUgc291bmQgY2Fy ZCB3aXRoIEFMU0EKKyAqLworaW50IGhkbWlfYXVkaW9fcHJvYmUodm9pZCAqZGV2aWNlcHRyKQor eworCWludCByZXR2YWw7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKKwlzdHJ1Y3Qgc25kX2NhcmQg KmNhcmQ7CisJc3RydWN0IGhhZF9jYWxsYmFja19vcHMgb3BzX2NiOworCXN0cnVjdCBzbmRfaW50 ZWxoYWQgKmludGVsaGFkZGF0YTsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOwor CXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldnB0ciA9IGRldmljZXB0cjsKKworCXByX2RlYnVn KCJFbnRlciAlc1xuIiwgX19mdW5jX18pOworCisJcHJfZGVidWcoImhkbWlfYXVkaW9fcHJvYmUg ZG1hX21hc2s6ICVwXG4iLCBkZXZwdHItPmRldi5kbWFfbWFzayk7CisKKwkvKiBhbGxvY2F0ZSBt ZW1vcnkgZm9yIHNhdmluZyBpbnRlcm5hbCBjb250ZXh0IGFuZCB3b3JraW5nICovCisJaW50ZWxo YWRkYXRhID0ga3phbGxvYyhzaXplb2YoKmludGVsaGFkZGF0YSksIEdGUF9LRVJORUwpOworCWlm ICghaW50ZWxoYWRkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhhZF9zdHJlYW0gPSBremFs bG9jKHNpemVvZigqaGFkX3N0cmVhbSksIEdGUF9LRVJORUwpOworCWlmICghaGFkX3N0cmVhbSkg eworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfaGFkZGF0YTsKKwl9CisKKwloYWRf ZGF0YSA9IGludGVsaGFkZGF0YTsKKwlvcHNfY2IuaW50ZWxfaGFkX2V2ZW50X2NhbGxfYmFjayA9 IGhhZF9ldmVudF9oYW5kbGVyOworCisJLyogcmVnaXN0ZXJpbmcgd2l0aCBkaXNwbGF5IGRyaXZl ciB0byBnZXQgYWNjZXNzIHRvIGRpc3BsYXkgQVBJcyAqLworCisJcmV0dmFsID0gbWlkX2hkbWlf YXVkaW9fc2V0dXAoCisJCQlvcHNfY2IuaW50ZWxfaGFkX2V2ZW50X2NhbGxfYmFjaywKKwkJCSYo aW50ZWxoYWRkYXRhLT5yZWdfb3BzKSwKKwkJCSYoaW50ZWxoYWRkYXRhLT5xdWVyeV9vcHMpKTsK KwlpZiAocmV0dmFsKSB7CisJCXByX2VycigicXVlcnlpbmcgZGlzcGxheSBkcml2ZXIgQVBJcyBm YWlsZWQgJSN4XG4iLCByZXR2YWwpOworCQlnb3RvIGZyZWVfaGFkc3RyZWFtOworCX0KKwltdXRl eF9sb2NrKCZoYWRfbXV0ZXgpOworCXNwaW5fbG9ja19pbml0KCZpbnRlbGhhZGRhdGEtPmhhZF9z cGlubG9jayk7CisJaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID0gSEFEX0RSVl9ESVNDT05ORUNU RUQ7CisJcHJfZGVidWcoIiVzIEAgJWQ6REVCVUcgUExVRy9VTlBMVUcgOiBIQURfRFJWX0RJU0NP Tk5FQ1RFRFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwkvKiBjcmVhdGUgYSBjYXJk IGluc3RhbmNlIHdpdGggQUxTQSBmcmFtZXdvcmsgKi8KKwlyZXR2YWwgPSBzbmRfY2FyZF9uZXco JmRldnB0ci0+ZGV2LCBoZG1pX2NhcmRfaW5kZXgsIGhkbWlfY2FyZF9pZCwKKwkJCQlUSElTX01P RFVMRSwgMCwgJmNhcmQpOworCisJaWYgKHJldHZhbCkKKwkJZ290byB1bmxvY2tfbXV0ZXg7CisJ aW50ZWxoYWRkYXRhLT5jYXJkID0gY2FyZDsKKwlpbnRlbGhhZGRhdGEtPmNhcmRfaWQgPSBoZG1p X2NhcmRfaWQ7CisJaW50ZWxoYWRkYXRhLT5jYXJkX2luZGV4ID0gY2FyZC0+bnVtYmVyOworCWlu dGVsaGFkZGF0YS0+cHJpdmF0ZV9kYXRhID0gaGFkX3N0cmVhbTsKKwlpbnRlbGhhZGRhdGEtPmZs YWdfdW5kZXJydW4gPSAwOworCWludGVsaGFkZGF0YS0+YWVzX2JpdHMgPSBTTkRSVl9QQ01fREVG QVVMVF9DT05fU1BESUY7CisJc3RybmNweShjYXJkLT5kcml2ZXIsIElOVEVMX0hBRCwgc3RybGVu KElOVEVMX0hBRCkpOworCXN0cm5jcHkoY2FyZC0+c2hvcnRuYW1lLCBJTlRFTF9IQUQsIHN0cmxl bihJTlRFTF9IQUQpKTsKKworCXJldHZhbCA9IHNuZF9wY21fbmV3KGNhcmQsIElOVEVMX0hBRCwg UENNX0lOREVYLCBNQVhfUEJfU1RSRUFNUywKKwkJCQkJCU1BWF9DQVBfU1RSRUFNUywgJnBjbSk7 CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnI7CisKKwkvKiBzZXR1cCBwcml2YXRlIGRhdGEgd2hp Y2ggY2FuIGJlIHJldHJpZXZlZCB3aGVuIHJlcXVpcmVkICovCisJcGNtLT5wcml2YXRlX2RhdGEg PSBpbnRlbGhhZGRhdGE7CisJcGNtLT5wcml2YXRlX2ZyZWUgPSBzbmRfaW50ZWxoYWRfcGNtX2Zy ZWU7CisJcGNtLT5pbmZvX2ZsYWdzID0gMDsKKwlzdHJuY3B5KHBjbS0+bmFtZSwgY2FyZC0+c2hv cnRuYW1lLCBzdHJsZW4oY2FyZC0+c2hvcnRuYW1lKSk7CisJLyogc2V0dXAgdGhlIG9wcyBmb3Ig cGFseWFiY2sgKi8KKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlC QUNLLAorCQkJICAgICZzbmRfaW50ZWxoYWRfcGxheWJhY2tfb3BzKTsKKwkvKiBhbGxvY2F0ZSBk bWEgcGFnZXMgZm9yIEFMU0Egc3RyZWFtIG9wZXJhdGlvbnMKKwkgKiBtZW1vcnkgYWxsb2NhdGVk IGlzIGJhc2VkIG9uIHNpemUsIG5vdCBtYXggdmFsdWUKKwkgKiB0aHVzIHVzaW5nIHNhbWUgYXJn dW1lbnQgZm9yIG1heCAmIHNpemUKKwkgKi8KKwlyZXR2YWwgPSBzbmRfcGNtX2xpYl9wcmVhbGxv Y2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwKKwkJCVNORFJWX0RNQV9UWVBFX0RFViwgTlVMTCwKKwkJ CUhBRF9NQVhfQlVGRkVSLCBIQURfTUFYX0JVRkZFUik7CisKKwlpZiAoY2FyZC0+ZGV2ID09IE5V TEwpCisJCXByX2RlYnVnKCJjYXJkLT5kZXYgaXMgTlVMTCEhISEhIFNob3VsZCBub3QgYmUgdGhp cyBjYXNlXG4iKTsKKwllbHNlIGlmIChjYXJkLT5kZXYtPmRtYV9tYXNrID09IE5VTEwpCisJCXBy X2RlYnVnKCJoZG1pX2F1ZGlvX3Byb2JlIGRtYV9tYXNrIGlzIE5VTEwhISEhIVxuIik7CisJZWxz ZQorCQlwcl9kZWJ1ZygiaGRtaV9hdWRpb19wcm9iZSBkbWFfbWFzayBpcyA6ICVwXG4iLAorCQkJ CWNhcmQtPmRldi0+ZG1hX21hc2spOworCisJaWYgKHJldHZhbCkKKwkJZ290byBlcnI7CisKKwkv KiBpbnRlcm5hbCBmdW5jdGlvbiBjYWxsIHRvIHJlZ2lzdGVyIGRldmljZSB3aXRoIEFMU0EgKi8K KwlyZXR2YWwgPSBzbmRfaW50ZWxoYWRfY3JlYXRlKGludGVsaGFkZGF0YSwgY2FyZCk7CisJaWYg KHJldHZhbCkKKwkJZ290byBlcnI7CisKKwljYXJkLT5wcml2YXRlX2RhdGEgPSAmaW50ZWxoYWRk YXRhOworCXJldHZhbCA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOworCWlmIChyZXR2YWwpCisJ CWdvdG8gZXJyOworCisJLyogSUVDOTU4IGNvbnRyb2xzICovCisJcmV0dmFsID0gc25kX2N0bF9h ZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZoYWRfY29udHJvbF9pZWM5NThfbWFzaywKKwkJCQkJCWlu dGVsaGFkZGF0YSkpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycjsKKwlyZXR2YWwgPSBz bmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJmhhZF9jb250cm9sX2llYzk1OCwKKwkJCQkJ CWludGVsaGFkZGF0YSkpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycjsKKworCWluaXRf Y2hhbm5lbF9hbGxvY2F0aW9ucygpOworCisJLyogUmVnaXN0ZXIgY2hhbm5lbCBtYXAgY29udHJv bHMgKi8KKwlyZXR2YWwgPSBoYWRfcmVnaXN0ZXJfY2htYXBfY3RscyhpbnRlbGhhZGRhdGEsIHBj bSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZXJyOworCisJaW50ZWxoYWRkYXRhLT5kZXYg PSAmZGV2cHRyLT5kZXY7CisJcG1fcnVudGltZV9zZXRfYWN0aXZlKGludGVsaGFkZGF0YS0+ZGV2 KTsKKwlwbV9ydW50aW1lX2VuYWJsZShpbnRlbGhhZGRhdGEtPmRldik7CisKKwltdXRleF91bmxv Y2soJmhhZF9tdXRleCk7CisJcmV0dmFsID0gbWlkX2hkbWlfYXVkaW9fcmVnaXN0ZXIoJmhhZF9p bnRlcmZhY2UsIGludGVsaGFkZGF0YSk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoInJlZ2lz dGVyaW5nIHdpdGggZGlzcGxheSBkcml2ZXIgZmFpbGVkICUjeFxuIiwgcmV0dmFsKTsKKwkJc25k X2NhcmRfZnJlZShjYXJkKTsKKwkJZ290byBmcmVlX2hhZHN0cmVhbTsKKwl9CisKKwlpbnRlbGhh ZGRhdGEtPmh3X3NpbGVuY2UgPSAxOworCWhhZF9vcHNfdjEgPSBoYWRfb3BzX3YxOwkvKiB1bnVz ZWQgKi8KKwlpbnRlbGhhZGRhdGEtPm9wcyA9ICZoYWRfb3BzX3YyOworCisJcmV0dXJuIHJldHZh bDsKK2VycjoKKwlzbmRfY2FyZF9mcmVlKGNhcmQpOwordW5sb2NrX211dGV4OgorCW11dGV4X3Vu bG9jaygmaGFkX211dGV4KTsKK2ZyZWVfaGFkc3RyZWFtOgorCWtmcmVlKGhhZF9zdHJlYW0pOwor CXBtX3J1bnRpbWVfZGlzYWJsZShpbnRlbGhhZGRhdGEtPmRldik7CisJaW50ZWxoYWRkYXRhLT5k ZXYgPSBOVUxMOworZnJlZV9oYWRkYXRhOgorCWtmcmVlKGludGVsaGFkZGF0YSk7CisJaW50ZWxo YWRkYXRhID0gTlVMTDsKKwlwcl9lcnIoIkVycm9yIHJldHVybmVkIGZyb20gJXMgYXBpICUjeFxu IiwgX19mdW5jX18sIHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBoZG1p X2F1ZGlvX3JlbW92ZSAtIHJlbW92ZXMgdGhlIGFsc2EgY2FyZAorICoKKyAqQGhhZGRhdGE6IHBv aW50ZXIgdG8gSEFEIHByaXZhdGUgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVk IHdoZW4gdGhlIGhkbWkgY2FibGUgaXMgdW4tcGx1Z2dlZC4gVGhpcyBmdW5jdGlvbgorICogZnJl ZSB0aGUgc291bmQgY2FyZC4KKyAqLworaW50IGhkbWlfYXVkaW9fcmVtb3ZlKHZvaWQgKnBkZXZw dHIpCit7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gaGFkX2RhdGE7CisJ aW50IGNhcHM7CisKKwlwcl9kZWJ1ZygiRW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKKworCWlmICgh aW50ZWxoYWRkYXRhKQorCQlyZXR1cm4gMDsKKworCWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0 dXMgIT0gSEFEX0RSVl9ESVNDT05ORUNURUQpIHsKKwkJY2FwcyA9IEhETUlfQVVESU9fVU5ERVJS VU4gfCBIRE1JX0FVRElPX0JVRkZFUl9ET05FOworCQloYWRfc2V0X2NhcHMoSEFEX1NFVF9ESVNB QkxFX0FVRElPX0lOVCwgJmNhcHMpOworCQloYWRfc2V0X2NhcHMoSEFEX1NFVF9ESVNBQkxFX0FV RElPLCBOVUxMKTsKKwl9CisJc25kX2NhcmRfZnJlZShpbnRlbGhhZGRhdGEtPmNhcmQpOworCWtm cmVlKGludGVsaGFkZGF0YS0+cHJpdmF0ZV9kYXRhKTsKKwlrZnJlZShpbnRlbGhhZGRhdGEpOwor CXJldHVybiAwOworfQorCitNT0RVTEVfQVVUSE9SKCJTYWlsYWphIEJhbmRhcnVwYWxsaSA8c2Fp bGFqYS5iYW5kYXJ1cGFsbGlAaW50ZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiUmFtZXNoIEJh YnUgSyBWIDxyYW1lc2guYmFidUBpbnRlbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJWYWliaGF2 IEFnYXJ3YWwgPHZhaWJoYXYuYWdhcndhbEBpbnRlbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJK ZXJvbWUgQW5hbmQgPGplcm9tZS5hbmFuZEBpbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJ T04oIkludGVsIEhETUkgQXVkaW8gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7 CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie0ludGVsLEludGVsX0hBRH0iKTsKK01PRFVMRV9W RVJTSU9OKEhBRF9EUklWRVJfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9zb3VuZC94ODYvaW50ZWxf aGRtaV9hdWRpby5oIGIvc291bmQveDg2L2ludGVsX2hkbWlfYXVkaW8uaApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWYyNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQv eDg2L2ludGVsX2hkbWlfYXVkaW8uaApAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdo dCAoQykgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICogIEF1dGhvcnM6CVNhaWxhamEgQmFuZGFy dXBhbGxpIDxzYWlsYWphLmJhbmRhcnVwYWxsaUBpbnRlbC5jb20+CisgKgkJUmFtZXNoIEJhYnUg SyBWCTxyYW1lc2guYmFidUBpbnRlbC5jb20+CisgKgkJVmFpYmhhdiBBZ2Fyd2FsIDx2YWliaGF2 LmFnYXJ3YWxAaW50ZWwuY29tPgorICoJCUplcm9tZSBBbmFuZCA8amVyb21lLmFuYW5kQGludGVs LmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJn ZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFu ZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRv IGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcg d2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdl LAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVz IG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBT b2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dp bmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhp cyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNo YWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25z IG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElT IiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwg SU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hB TlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklO RlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBI T0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFC SUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhF UldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhF IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FS RS4KKyAqLworCisjaWZuZGVmIF9JTlRFTF9IRE1JX0FVRElPX0hfCisjZGVmaW5lIF9JTlRFTF9I RE1JX0FVRElPX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHNvdW5k L2luaXR2YWwuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgv cG1fcnVudGltZS5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CisjaW5jbHVkZSA8c291 bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgImludGVsX2hk bWlfbHBlX2F1ZGlvLmgiCisKKyNkZWZpbmUgUENNX0lOREVYCQkwCisjZGVmaW5lIE1BWF9QQl9T VFJFQU1TCQkxCisjZGVmaW5lIE1BWF9DQVBfU1RSRUFNUwkJMAorI2RlZmluZSBIRE1JX0FVRElP X0RSSVZFUgkiaGRtaS1hdWRpbyIKKworI2RlZmluZSBJTkZPX0ZSQU1FX1dPUkQxCTB4MDAwYTAx ODQKKyNkZWZpbmUgRklGT19USFJFU0hPTEQJCTB4RkUKKyNkZWZpbmUgRE1BX0ZJRk9fVEhSRVNI T0xECTB4NworI2RlZmluZSBCWVRFU19QRVJfV09SRAkJMHg0CisKKy8qIFNhbXBsaW5nIHJhdGUg YXMgcGVyIElFQzYwOTU4IFZlciAzICovCisjZGVmaW5lIENIX1NUQVRVU19NQVBfMzJLSFoJMHgz CisjZGVmaW5lIENIX1NUQVRVU19NQVBfNDRLSFoJMHgwCisjZGVmaW5lIENIX1NUQVRVU19NQVBf NDhLSFoJMHgyCisjZGVmaW5lIENIX1NUQVRVU19NQVBfODhLSFoJMHg4CisjZGVmaW5lIENIX1NU QVRVU19NQVBfOTZLSFoJMHhBCisjZGVmaW5lIENIX1NUQVRVU19NQVBfMTc2S0haCTB4QworI2Rl ZmluZSBDSF9TVEFUVVNfTUFQXzE5MktIWgkweEUKKworI2RlZmluZSBNQVhfU01QTF9XSURUSF8y MAkweDAKKyNkZWZpbmUgTUFYX1NNUExfV0lEVEhfMjQJMHgxCisjZGVmaW5lIFNNUExfV0lEVEhf MTZCSVRTCTB4MQorI2RlZmluZSBTTVBMX1dJRFRIXzI0QklUUwkweDUKKyNkZWZpbmUgQ0hBTk5F TF9BTExPQ0FUSU9OCTB4MUYKKyNkZWZpbmUgTUFTS19CWVRFMAkJMHgwMDAwMDBGRgorI2RlZmlu ZSBWQUxJRF9ESVBfV09SRFMJCTMKKyNkZWZpbmUgTEFZT1VUMAkJCTAKKyNkZWZpbmUgTEFZT1VU MQkJCTEKKyNkZWZpbmUgU1dBUF9MRkVfQ0VOVEVSCQkweDAwZmFjNGM4CisjZGVmaW5lIEFVRF9D T05GSUdfQ0hfTUFTS19WMgkweDcwCisKK3N0cnVjdCBwY21fc3RyZWFtX2luZm8geworCWludAkJ c3RyX2lkOworCXZvaWQJKmhhZF9zdWJzdHJlYW07CisJdm9pZAkoKnBlcmlvZF9lbGFwc2VkKSh2 b2lkICpoYWRfc3Vic3RyZWFtKTsKKwl1MzIJCWJ1ZmZlcl9wdHI7CisJdTY0CQlidWZmZXJfcmVu ZGVyZWQ7CisJdTMyCQlyaW5nX2J1Zl9zaXplOworCWludAkJc2ZyZXE7Cit9OworCitzdHJ1Y3Qg cmluZ19idWZfaW5mbyB7CisJdWludDMyX3QJYnVmX2FkZHI7CisJdWludDMyX3QJYnVmX3NpemU7 CisJdWludDhfdAkJaXNfdmFsaWQ7Cit9OworCitzdHJ1Y3QgaGFkX3N0cmVhbV9wdnQgeworCWVu dW0gaGFkX3N0cmVhbV9zdGF0dXMJCXN0cmVhbV9zdGF0dXM7CisJaW50CQkJCXN0cmVhbV9vcHM7 CisJc3NpemVfdAkJCQlkYmdfY3VtX2J5dGVzOworfTsKKworc3RydWN0IGhhZF9wdnRfZGF0YSB7 CisJZW51bSBoYWRfc3RhdHVzX3N0cmVhbQkJc3RyZWFtX3R5cGU7Cit9OworCitzdHJ1Y3QgaGFk X2NhbGxiYWNrX29wcyB7CisJaGFkX2V2ZW50X2NhbGxfYmFjayBpbnRlbF9oYWRfZXZlbnRfY2Fs bF9iYWNrOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc25kX2ludGVsaGFkIC0gaW50ZWxoYWQgZHJp dmVyIHN0cnVjdHVyZQorICoKKyAqIEBjYXJkOiBwdHIgdG8gaG9sZCBjYXJkIGRldGFpbHMKKyAq IEBjYXJkX2luZGV4OiBzb3VuZCBjYXJkIGluZGV4CisgKiBAY2FyZF9pZDogZGV0ZWN0ZWQgc291 bmQgY2FyZCBpZAorICogQHJlZ19vcHM6IHJlZ2lzdGVyIG9wZXJhdGlvbnMgdG8gcHJvZ3JhbSBy ZWdpc3RlcnMKKyAqIEBxdWVyeV9vcHM6IGNhcHMgY2FsbCBiYWNrcyBmb3IgZ2V0L3NldCBvcGVy YXRpb25zCisgKiBAZHJ2X3N0YXR1czogZHJpdmVyIHN0YXR1cworICogQGJ1Zl9pbmZvOiByaW5n IGJ1ZmZlciBpbmZvCisgKiBAc3RyZWFtX2luZm86IHN0cmVhbSBpbmZvcm1hdGlvbgorICogQGVl bGQ6IGhvbGRzIEVFTEQgaW5mbworICogQGN1cnJfYnVmOiBwb2ludGVyIHRvIGhvbGQgY3VycmVu dCBhY3RpdmUgcmluZyBidWYKKyAqIEB2YWxpZF9idWZfY250OiByaW5nIGJ1ZmZlciBjb3VudCBm b3Igc3RyZWFtCisgKiBAaGFkX3NwaW5sb2NrOiBkcml2ZXIgbG9jaworICogQGFlc19iaXRzOiBJ RUM5NTggc3RhdHVzIGJpdHMKKyAqIEBidWZmX2RvbmU6IGlkIG9mIGN1cnJlbnQgYnVmZmVyIGRv bmUgaW50cgorICogQGRldjogcGxhdG9mb3JtIGRldmljZSBoYW5kbGUKKyAqIEBrY3RsOiBob2xk cyBrY3RsIHB0cnMgdXNlZCBmb3IgY2hhbm5lbCBtYXAKKyAqIEBjaG1hcDogaG9sZHMgY2hhbm5l bCBtYXAgaW5mbworICogQGF1ZGlvX3JlZ19iYXNlOiBoZG1pIGF1ZGlvIHJlZ2lzdGVyIGJhc2Ug b2Zmc2V0CisgKiBAaHdfc2lsZW5jZTogZmxhZyBpbmRpY2F0ZXMgU29DIHN1cHBvcnQgZm9yIEhX IHNpbGVuY2UvS2VlcCBhbGl2ZQorICogQG9wczogaG9sZHMgb3BzIGZ1bmN0aW9ucyBiYXNlZCBv biBwbGF0Zm9ybQorICovCitzdHJ1Y3Qgc25kX2ludGVsaGFkIHsKKwlzdHJ1Y3Qgc25kX2NhcmQJ KmNhcmQ7CisJaW50CQljYXJkX2luZGV4OworCWNoYXIJCSpjYXJkX2lkOworCXN0cnVjdCBoZG1p X2F1ZGlvX3JlZ2lzdGVyc19vcHMJcmVnX29wczsKKwlzdHJ1Y3QgaGRtaV9hdWRpb19xdWVyeV9z ZXRfb3BzCXF1ZXJ5X29wczsKKwllbnVtIGhhZF9kcnZfc3RhdHVzCWRydl9zdGF0dXM7CisJc3Ry dWN0CQlyaW5nX2J1Zl9pbmZvIGJ1Zl9pbmZvW0hBRF9OVU1fT0ZfUklOR19CVUZTXTsKKwlzdHJ1 Y3QJCXBjbV9zdHJlYW1faW5mbyBzdHJlYW1faW5mbzsKKwl1bmlvbiBvdG1faGRtaV9lbGRfdAll ZWxkOworCWVudW0JCWludGVsX2hhZF9hdWRfYnVmX3R5cGUgY3Vycl9idWY7CisJaW50CQl2YWxp ZF9idWZfY250OworCXVuc2lnbmVkIGludAlhZXNfYml0czsKKwlpbnQgZmxhZ191bmRlcnJ1bjsK KwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpwcml2YXRlX2RhdGE7CisJc3BpbmxvY2tfdCBoYWRfc3Bp bmxvY2s7CisJZW51bQkJaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZmX2RvbmU7CisJc3RydWN0 IGRldmljZSAqZGV2OworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CisJc3RydWN0IHNuZF9w Y21fY2htYXAgKmNobWFwOworCXVuc2lnbmVkIGludAkqYXVkaW9fcmVnX2Jhc2U7CisJdW5zaWdu ZWQgaW50CWF1ZGlvX2NmZ19vZmZzZXQ7CisJYm9vbAkJaHdfc2lsZW5jZTsKKwlzdHJ1Y3QgaGFk X29wcwkqb3BzOworfTsKKworc3RydWN0IGhhZF9vcHMgeworCXZvaWQgKCplbmFibGVfYXVkaW8p KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJdTggZW5hYmxlKTsKKwl2 b2lkICgqcmVzZXRfYXVkaW8pKHU4IHJlc2V0KTsKKwlpbnQgKCpwcm9nX24pKHUzMiBhdWRfc2Ft cF9mcmVxLCB1MzIgKm5fcGFyYW0sCisJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRh dGEpOworCXZvaWQgKCpwcm9nX2N0cykodTMyIGF1ZF9zYW1wX2ZyZXEsIHUzMiB0bWRzLCB1MzIg bl9wYXJhbSwKKwkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSk7CisJaW50ICgq YXVkaW9fY3RybCkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3Ry dWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKTsKKwl2b2lkICgqcHJvZ19kaXApKHN0cnVj dCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQg KmludGVsaGFkZGF0YSk7CisJdm9pZCAoKmhhbmRsZV91bmRlcnJ1bikoc3RydWN0IHNuZF9pbnRl bGhhZCAqaW50ZWxoYWRkYXRhKTsKK307CisKKworaW50IGhhZF9ldmVudF9oYW5kbGVyKGVudW0g aGFkX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSwgdm9pZCAqZGF0YSk7CisKK2ludCBoZG1pX2F1ZGlv X3F1ZXJ5KHZvaWQgKmRydl9kYXRhLCBzdHJ1Y3QgaGRtaV9hdWRpb19ldmVudCBldmVudCk7Citp bnQgaGRtaV9hdWRpb19zdXNwZW5kKHZvaWQgKmRydl9kYXRhLCBzdHJ1Y3QgaGRtaV9hdWRpb19l dmVudCBldmVudCk7CitpbnQgaGRtaV9hdWRpb19yZXN1bWUodm9pZCAqZHJ2X2RhdGEpOworaW50 IGhkbWlfYXVkaW9fbW9kZV9jaGFuZ2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJl YW0pOworZXh0ZXJuIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaW50ZWxoYWRfcGxheWJhY2tfb3Bz OworCitpbnQgc25kX2ludGVsaGFkX2luaXRfYXVkaW9fY3RybChzdHJ1Y3Qgc25kX3BjbV9zdWJz dHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRh LAorCQkJCQlpbnQgZmxhZ19zaWxlbmNlKTsKK2ludCBzbmRfaW50ZWxoYWRfcHJvZ19idWZmZXIo c3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhLAorCQkJCQlpbnQgc3RhcnQsIGludCBl bmQpOworaW50IHNuZF9pbnRlbGhhZF9pbnZkX2J1ZmZlcihpbnQgc3RhcnQsIGludCBlbmQpOwor aW5saW5lIGludCBzbmRfaW50ZWxoYWRfcmVhZF9sZW4oc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50 ZWxoYWRkYXRhKTsKK3ZvaWQgaGFkX2J1aWxkX2NoYW5uZWxfYWxsb2NhdGlvbl9tYXAoc3RydWN0 IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKTsKKworLyogUmVnaXN0ZXIgYWNjZXNzIGZ1bmN0 aW9ucyAqLworaW5saW5lIGludCBoYWRfZ2V0X2h3c3RhdGUoc3RydWN0IHNuZF9pbnRlbGhhZCAq aW50ZWxoYWRkYXRhKTsKK2lubGluZSBpbnQgaGFkX2dldF9jYXBzKGVudW0gaGFkX2NhcHNfbGlz dCBxdWVyeV9lbGVtZW50LAorCQkJCQkJdm9pZCAqY2FwYWJpbHRpZXMpOworaW5saW5lIGludCBo YWRfc2V0X2NhcHMoZW51bSBoYWRfY2Fwc19saXN0IHNldF9lbGVtZW50LAorCQkJCQkJdm9pZCAq Y2FwYWJpbHRpZXMpOworaW5saW5lIGludCBoYWRfcmVhZF9yZWdpc3Rlcih1aW50MzJfdCByZWdf YWRkciwgdWludDMyX3QgKmRhdGEpOworaW5saW5lIGludCBoYWRfd3JpdGVfcmVnaXN0ZXIodWlu dDMyX3QgcmVnX2FkZHIsIHVpbnQzMl90IGRhdGEpOworaW5saW5lIGludCBoYWRfcmVhZF9tb2Rp ZnkodWludDMyX3QgcmVnX2FkZHIsIHVpbnQzMl90IGRhdGEsCisJCQkJCQkJdWludDMyX3QgbWFz ayk7CisKKy8qKi8KK2ludCBoZG1pX2F1ZGlvX3Byb2JlKHZvaWQgKmRldnB0cik7CitpbnQgaGRt aV9hdWRpb19yZW1vdmUodm9pZCAqcGRldik7CisKKyNlbmRpZiAvKiBfSU5URUxfSERNSV9BVURJ T18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvX2lmLmMgYi9zb3Vu ZC94ODYvaW50ZWxfaGRtaV9hdWRpb19pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAuLmM2NTBiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC94ODYvaW50ZWxfaGRtaV9h dWRpb19pZi5jCkBAIC0wLDAgKzEsNTUxIEBACisvKgorICogICBpbnRlbF9oZG1pX2F1ZGlvX2lm LmMgLSBJbnRlbCBIRE1JIGF1ZGlvIGRyaXZlciBmb3IgTUlECisgKgorICogIENvcHlyaWdodCAo QykgMjAxNiBJbnRlbCBDb3JwCisgKiAgQXV0aG9yczoJU2FpbGFqYSBCYW5kYXJ1cGFsbGkgPHNh aWxhamEuYmFuZGFydXBhbGxpQGludGVsLmNvbT4KKyAqCQlSYW1lc2ggQmFidSBLIFYgPHJhbWVz aC5iYWJ1QGludGVsLmNvbT4KKyAqCQlWYWliaGF2IEFnYXJ3YWwgPHZhaWJoYXYuYWdhcndhbEBp bnRlbC5jb20+CisgKgkJSmVyb21lIEFuYW5kIDxqZXJvbWUuYW5hbmRAaW50ZWwuY29tPgorICog IH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkK KyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu c2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91 dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogfn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn4KKyAqIEFMU0EgZHJpdmVyIGZvciBJbnRlbCBNSUQgSERNSSBhdWRpbyBjb250cm9sbGVyLiAg VGhpcyBmaWxlIGNvbnRhaW5zCisgKiBpbnRlcmZhY2UgZnVuY3Rpb25zIGV4cG9zZWQgdG8gSERN SSBEaXNwbGF5IGRyaXZlciBhbmQgY29kZSB0byByZWdpc3RlcgorICogd2l0aCBBTFNBIGZyYW1l d29yay4uCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KQkJImhhZDogIiBmbXQKKworI2luY2x1 ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxp bnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3Jl Lmg+CisjaW5jbHVkZSAiaW50ZWxfaGRtaV9hdWRpby5oIgorI2luY2x1ZGUgImludGVsX2hkbWlf bHBlX2F1ZGlvLmgiCisKKy8qKgorICogaGRtaV9hdWRpb19xdWVyeSAtIGhkbWkgYXVkaW8gcXVl cnkgZnVuY3Rpb24KKyAqCisgKkBoYWRkYXRhOiBwb2ludGVyIHRvIEhBRCBwcml2YXRlIGRhdGEK KyAqQGV2ZW50OiBhdWRpbyBldmVudCBmb3Igd2hpY2ggdGhpcyBtZXRob2QgaXMgaW52b2tlZAor ICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGNsaWVudCBkcml2ZXIgdG8gcXVlcnkg dGhlCisgKiBoZG1pIGF1ZGlvLgorICovCitpbnQgaGRtaV9hdWRpb19xdWVyeSh2b2lkICpoYWRk YXRhLCBzdHJ1Y3QgaGRtaV9hdWRpb19ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9z dWJzdHJlYW0gKnN1YnN0cmVhbSA9IE5VTEw7CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0 cmVhbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxczsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICpp bnRlbGhhZGRhdGEgPSAoc3RydWN0IHNuZF9pbnRlbGhhZCAqKWhhZGRhdGE7CisKKwlpZiAoaW50 ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFtKQorCQlzdWJzdHJlYW0gPSBpbnRl bGhhZGRhdGEtPnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW07CisJaGFkX3N0cmVhbSA9IGludGVs aGFkZGF0YS0+cHJpdmF0ZV9kYXRhOworCXN3aXRjaCAoZXZlbnQudHlwZSkgeworCWNhc2UgSEFE X0VWRU5UX1FVRVJZX0lTX0FVRElPX0JVU1k6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlbGhh ZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKworCQlpZiAoKGhhZF9zdHJlYW0tPnN0 cmVhbV90eXBlID09IEhBRF9SVU5OSU5HX1NUUkVBTSkgfHwKKwkJCXN1YnN0cmVhbSkgeworCQkJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssCisJCQkJ CQlmbGFnX2lycXMpOworCQkJcHJfZGVidWcoIkF1ZGlvIHN0cmVhbSBhY3RpdmVcbiIpOworCQkJ cmV0dXJuIC1FQlVTWTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRh dGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwlicmVhazsKKworCWNhc2UgSEFEX0VWRU5U X1FVRVJZX0lTX0FVRElPX1NVU1BFTkRFRDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFk ZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlpZiAoaW50ZWxoYWRkYXRhLT5kcnZf c3RhdHVzID09IEhBRF9EUlZfU1VTUEVOREVEKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywKKwkJCQkJCWZsYWdfaXJxcyk7CisJCQlwcl9k ZWJ1ZygiQXVkaW8gaXMgc3VzcGVuZGVkXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMp OworCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJfZGVidWcoImVycm9yIHVuLWhhbmRsZWQgZXZl bnQgISFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwlicmVhazsKKworCX0KKworCXJldHVybiAw OworfQorCisvKioKKyAqIGhkbWlfYXVkaW9fc3VzcGVuZCAtIHBvd2VyIG1hbmFnZW1lbnQgc3Vz cGVuZCBmdW5jdGlvbgorICoKKyAqQGhhZGRhdGE6IHBvaW50ZXIgdG8gSEFEIHByaXZhdGUgZGF0 YQorICpAZXZlbnQ6IHBtIGV2ZW50IGZvciB3aGljaCB0aGlzIG1ldGhvZCBpcyBpbnZva2VkCisg KgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgY2xpZW50IGRyaXZlciB0byBzdXNwZW5k IHRoZQorICogaGRtaSBhdWRpby4KKyAqLworaW50IGhkbWlfYXVkaW9fc3VzcGVuZCh2b2lkICpo YWRkYXRhLCBzdHJ1Y3QgaGRtaV9hdWRpb19ldmVudCBldmVudCkKK3sKKwlpbnQgY2FwcywgcmV0 dmFsID0gMDsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCXVuc2lnbmVkIGxv bmcgZmxhZ19pcnFzOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0 cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IChzdHJ1Y3Qgc25kX2ludGVsaGFkICop aGFkZGF0YTsKKworCXByX2RlYnVnKCJFbnRlcjolc1xuIiwgX19mdW5jX18pOworCisJaGFkX3N0 cmVhbSA9IGludGVsaGFkZGF0YS0+cHJpdmF0ZV9kYXRhOworCXN1YnN0cmVhbSA9IGludGVsaGFk ZGF0YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVhbTsKKworCWlmIChpbnRlbGhhZGRhdGEtPmRl di0+cG93ZXIucnVudGltZV9zdGF0dXMgIT0gUlBNX1NVU1BFTkRFRCkgeworCQlwcl9lcnIoImF1 ZGlvIHN0cmVhbSBpcyBhY3RpdmVcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKworCXNw aW5fbG9ja19pcnFzYXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsK KwlpZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7 CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBm bGFnX2lycXMpOworCQlwcl9kZWJ1ZygiaGFkIG5vdCBjb25uZWN0ZWRcbiIpOworCQlyZXR1cm4g cmV0dmFsOworCX0KKworCWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPT0gSEFEX0RSVl9T VVNQRU5ERUQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRf c3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJCXByX2RlYnVnKCJoYWQgYWxyZWFkeSBzdXNwZW5kZWRc biIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9 IEhBRF9EUlZfU1VTUEVOREVEOworCXByX2RlYnVnKCIlcyBAICVkOkRFQlVHIFBMVUcvVU5QTFVH IDogSEFEX0RSVl9TVVNQRU5ERURcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCisJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJx cyk7CisJLyoKKwkgKiBUb0RvOiBOZWVkIHRvIGRpc2FibGUgVU5ERVJSVU4gaW50ZXJydXB0cyBh cyB3ZWxsCisJICogIGNhcHMgPSBIRE1JX0FVRElPX1VOREVSUlVOIHwgSERNSV9BVURJT19CVUZG RVJfRE9ORTsKKwkgKi8KKwljYXBzID0gSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwloYWRfc2V0 X2NhcHMoSEFEX1NFVF9ESVNBQkxFX0FVRElPX0lOVCwgJmNhcHMpOworCWhhZF9zZXRfY2FwcyhI QURfU0VUX0RJU0FCTEVfQVVESU8sIE5VTEwpOworCXByX2RlYnVnKCJFeGl0OiVzIiwgX19mdW5j X18pOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogaGRtaV9hdWRpb19yZXN1bWUgLSBw b3dlciBtYW5hZ2VtZW50IHJlc3VtZSBmdW5jdGlvbgorICoKKyAqQGhhZGRhdGE6IHBvaW50ZXIg dG8gSEFEIHByaXZhdGUgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGNs aWVudCBkcml2ZXIgdG8gcmVzdW1lIHRoZQorICogaGRtaSBhdWRpby4KKyAqLworaW50IGhkbWlf YXVkaW9fcmVzdW1lKHZvaWQgKmhhZGRhdGEpCit7CisJaW50IGNhcHMsIHJldHZhbCA9IDA7CisJ c3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gKHN0cnVjdCBzbmRfaW50ZWxoYWQg KiloYWRkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ19pcnFzOworCisJcHJfZGVidWcoIkVudGVy OiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5o YWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9 PSBIQURfRFJWX0RJU0NPTk5FQ1RFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRl bGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZGVidWcoImhhZCBub3Qg Y29ubmVjdGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2 X3N0YXR1cyAhPSBIQURfRFJWX1NVU1BFTkRFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZXJyKCJoYWQg aXMgbm90IGluIHN1c3BlbmRlZCBzdGF0ZVxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICho YWRfZ2V0X2h3c3RhdGUoaW50ZWxoYWRkYXRhKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZXJyKCJGYWls ZWQgdG8gcmVzdW1lLiBEZXZpY2Ugbm90IGFjY2Vzc2libGVcbiIpOworCQlyZXR1cm4gLUVOT0RF VjsKKwl9CisKKwlpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPSBIQURfRFJWX0NPTk5FQ1RFRDsK Kwlwcl9kZWJ1ZygiJXMgQCAlZDpERUJVRyBQTFVHL1VOUExVRyA6IEhBRF9EUlZfRElTQ09OTkVD VEVEXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkvKgorCSAqIFRvRG86 IE5lZWQgdG8gZW5hYmxlIFVOREVSUlVOIGludGVycnVwdHMgYXMgd2VsbAorCSAqIGNhcHMgPSBI RE1JX0FVRElPX1VOREVSUlVOIHwgSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwkgKi8KKwljYXBz ID0gSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwlyZXR2YWwgPSBoYWRfc2V0X2NhcHMoSEFEX1NF VF9FTkFCTEVfQVVESU9fSU5ULCAmY2Fwcyk7CisJcmV0dmFsID0gaGFkX3NldF9jYXBzKEhBRF9T RVRfRU5BQkxFX0FVRElPLCBOVUxMKTsKKwlwcl9kZWJ1ZygiRXhpdDolcyIsIF9fZnVuY19fKTsK KwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCBoYWRfY2hrX2ludHJtaXNz KHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSwKKwkJZW51bSBpbnRlbF9oYWRfYXVk X2J1Zl90eXBlIGJ1Zl9pZCkKK3sKKwlpbnQgaSwgaW50cl9jb3VudCA9IDA7CisJZW51bSBpbnRl bF9oYWRfYXVkX2J1Zl90eXBlIGJ1ZmZfZG9uZTsKKwl1MzIgYnVmX3NpemUsIGJ1Zl9hZGRyOwor CXN0cnVjdCBoYWRfcHZ0X2RhdGEgKmhhZF9zdHJlYW07CisJdW5zaWduZWQgbG9uZyBmbGFnX2ly cXM7CisKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisKKwlidWZm X2RvbmUgPSBidWZfaWQ7CisKKwlpbnRyX2NvdW50ID0gc25kX2ludGVsaGFkX3JlYWRfbGVuKGlu dGVsaGFkZGF0YSk7CisJaWYgKGludHJfY291bnQgPiAxKSB7CisJCS8qIEluIGNhc2Ugb2YgYWN0 aXZlIHBsYXliYWNrICovCisJCXByX2VycigiRHJpdmVyIGRldGVjdGVkICVkIG1pc3NlZCBidWZm ZXIgZG9uZSBpbnRlcnJ1cHQocykhISEhXG4iLAorCQkJCShpbnRyX2NvdW50IC0gMSkpOworCQlp ZiAoaW50cl9jb3VudCA+IDMpCisJCQlyZXR1cm4gaW50cl9jb3VudDsKKworCQlidWZfaWQgKz0g KGludHJfY291bnQgLSAxKTsKKwkJLyogUmVwcm9ncmFtIHJlZ2lzdGVycyovCisJCWZvciAoaSA9 IGJ1ZmZfZG9uZTsgaSA8IGJ1Zl9pZDsgaSsrKSB7CisJCQlpbnQgaiA9IGkgJSA0OworCisJCQli dWZfc2l6ZSA9IGludGVsaGFkZGF0YS0+YnVmX2luZm9bal0uYnVmX3NpemU7CisJCQlidWZfYWRk ciA9IGludGVsaGFkZGF0YS0+YnVmX2luZm9bal0uYnVmX2FkZHI7CisJCQloYWRfd3JpdGVfcmVn aXN0ZXIoQVVEX0JVRl9BX0xFTkdUSCArCisJCQkJCShqICogSEFEX1JFR19XSURUSCksIGJ1Zl9z aXplKTsKKwkJCWhhZF93cml0ZV9yZWdpc3RlcigKKwkJCQkJQVVEX0JVRl9BX0FERFIrKGogKiBI QURfUkVHX1dJRFRIKSwKKwkJCQkJKGJ1Zl9hZGRyIHwgQklUKDApIHwgQklUKDEpKSk7CisJCX0K KwkJYnVmX2lkID0gYnVmX2lkICUgNDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFkZGF0 YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlpbnRlbGhhZGRhdGEtPmJ1ZmZfZG9uZSA9 IGJ1Zl9pZDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3Bp bmxvY2ssIGZsYWdfaXJxcyk7CisJfQorCisJcmV0dXJuIGludHJfY291bnQ7Cit9CisKK2ludCBo YWRfcHJvY2Vzc19idWZmZXJfZG9uZShzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEp Cit7CisJaW50IHJldHZhbCA9IDA7CisJdTMyIGxlbiA9IDE7CisJZW51bSBpbnRlbF9oYWRfYXVk X2J1Zl90eXBlIGJ1Zl9pZDsKKwllbnVtIGludGVsX2hhZF9hdWRfYnVmX3R5cGUgYnVmZl9kb25l OworCXN0cnVjdCBwY21fc3RyZWFtX2luZm8gKnN0cmVhbTsKKwl1MzIgYnVmX3NpemU7CisJc3Ry dWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKwlpbnQgaW50cl9jb3VudDsKKwllbnVtIGhh ZF9zdGF0dXNfc3RyZWFtCQlzdHJlYW1fdHlwZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxczsK KworCWhhZF9zdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKwlzdHJlYW0gPSAm aW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mbzsKKwlpbnRyX2NvdW50ID0gMTsKKworCXNwaW5fbG9j a19pcnFzYXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwlpZiAo aW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7CisJCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2ly cXMpOworCQlwcl9lcnIoIiVzOkRldmljZSBhbHJlYWR5IGRpc2Nvbm5lY3RlZFxuIiwgX19mdW5j X18pOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlidWZfaWQgPSBpbnRlbGhhZGRhdGEtPmN1cnJf YnVmOworCWludGVsaGFkZGF0YS0+YnVmZl9kb25lID0gYnVmX2lkOworCWJ1ZmZfZG9uZSA9IGlu dGVsaGFkZGF0YS0+YnVmZl9kb25lOworCWJ1Zl9zaXplID0gaW50ZWxoYWRkYXRhLT5idWZfaW5m b1tidWZfaWRdLmJ1Zl9zaXplOworCXN0cmVhbV90eXBlID0gaGFkX3N0cmVhbS0+c3RyZWFtX3R5 cGU7CisKKwlwcl9kZWJ1ZygiRW50ZXI6JXMgYnVmX2lkPSVkXG4iLCBfX2Z1bmNfXywgYnVmX2lk KTsKKworCS8qIEV2ZXJ5IGRlYnVnIHN0YXRlbWVudCBoYXMgYW4gaW1wbGljYXRpb24KKwkgKiBv ZiB+NW1zZWMuIFRodXMsIGF2b2lkIGhhdmluZyA+MyBkZWJ1ZyBzdGF0ZW1lbnRzCisJICogZm9y IGVhY2ggYnVmZmVyX2RvbmUgaGFuZGxpbmcuCisJICovCisKKwkvKiBDaGVjayBmb3IgYW55IGlu dHJfbWlzcyBpbiBjYXNlIG9mIGFjdGl2ZSBwbGF5YmFjayAqLworCWlmIChoYWRfc3RyZWFtLT5z dHJlYW1fdHlwZSA9PSBIQURfUlVOTklOR19TVFJFQU0pIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJCWludHJfY291 bnQgPSBoYWRfY2hrX2ludHJtaXNzKGludGVsaGFkZGF0YSwgYnVmX2lkKTsKKwkJaWYgKCFpbnRy X2NvdW50IHx8IChpbnRyX2NvdW50ID4gMykpIHsKKwkJCXByX2VycigiSEFEIFNXIHN0YXRlIGlu IG5vbi1yZWNvdmVyYWJsZSEhISBtb2RlXG4iKTsKKwkJCXByX2VycigiQWxyZWFkeSBwbGF5ZWQg c3RhbGUgZGF0YVxuIik7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCWJ1Zl9pZCArPSAoaW50 cl9jb3VudCAtIDEpOworCQlidWZfaWQgPSBidWZfaWQgJSA0OworCQlzcGluX2xvY2tfaXJxc2F2 ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJfQorCisJaW50ZWxo YWRkYXRhLT5idWZfaW5mb1tidWZfaWRdLmlzX3ZhbGlkID0gdHJ1ZTsKKwlpZiAoaW50ZWxoYWRk YXRhLT52YWxpZF9idWZfY250LTEgPT0gYnVmX2lkKSB7CisJCWlmIChoYWRfc3RyZWFtLT5zdHJl YW1fdHlwZSA+PSBIQURfUlVOTklOR19TVFJFQU0pCisJCQlpbnRlbGhhZGRhdGEtPmN1cnJfYnVm ID0gSEFEX0JVRl9UWVBFX0E7CisJfSBlbHNlCisJCWludGVsaGFkZGF0YS0+Y3Vycl9idWYgPSBi dWZfaWQgKyAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRf c3BpbmxvY2ssIGZsYWdfaXJxcyk7CisKKwlpZiAoaGFkX2dldF9od3N0YXRlKGludGVsaGFkZGF0 YSkpIHsKKwkJcHJfZXJyKCJIRE1JIGNhYmxlIHBsdWdnZWQtb3V0XG4iKTsKKwkJcmV0dXJuIHJl dHZhbDsKKwl9CisKKwkvKlJlcHJvZ3JhbSB0aGUgcmVnaXN0ZXJzIHdpdGggYWRkciBhbmQgbGVu Z3RoKi8KKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9BX0xFTkdUSCArCisJCQkoYnVmX2lk ICogSEFEX1JFR19XSURUSCksIGJ1Zl9zaXplKTsKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JV Rl9BX0FERFIrKGJ1Zl9pZCAqIEhBRF9SRUdfV0lEVEgpLAorCQkJaW50ZWxoYWRkYXRhLT5idWZf aW5mb1tidWZfaWRdLmJ1Zl9hZGRyfAorCQkJQklUKDApIHwgQklUKDEpKTsKKworCWhhZF9yZWFk X3JlZ2lzdGVyKEFVRF9CVUZfQV9MRU5HVEggKyAoYnVmX2lkICogSEFEX1JFR19XSURUSCksCisJ CQkJCSZsZW4pOworCXByX2RlYnVnKCIlczpFbmFibGVkIGJ1ZlslZF1cbiIsIF9fZnVuY19fLCBi dWZfaWQpOworCisJLyogSW4gY2FzZSBvZiBhY3R1YWwgZGF0YSwKKwkgKiByZXBvcnQgYnVmZmVy X2RvbmUgdG8gYWJvdmUgQUxTQSBsYXllcgorCSAqLworCWJ1Zl9zaXplID0gIGludGVsaGFkZGF0 YS0+YnVmX2luZm9bYnVmX2lkXS5idWZfc2l6ZTsKKwlpZiAoc3RyZWFtX3R5cGUgPj0gSEFEX1JV Tk5JTkdfU1RSRUFNKSB7CisJCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3JlbmRl cmVkICs9CisJCQkoaW50cl9jb3VudCAqIGJ1Zl9zaXplKTsKKwkJc3RyZWFtLT5wZXJpb2RfZWxh cHNlZChzdHJlYW0tPmhhZF9zdWJzdHJlYW0pOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisK K2ludCBoYWRfcHJvY2Vzc19idWZmZXJfdW5kZXJydW4oc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50 ZWxoYWRkYXRhKQoreworCWludCByZXR2YWwgPSAwOworCWVudW0gaW50ZWxfaGFkX2F1ZF9idWZf dHlwZSBidWZfaWQ7CisJc3RydWN0IHBjbV9zdHJlYW1faW5mbyAqc3RyZWFtOworCXN0cnVjdCBo YWRfcHZ0X2RhdGEgKmhhZF9zdHJlYW07CisJZW51bSBoYWRfc3RhdHVzX3N0cmVhbSBzdHJlYW1f dHlwZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxczsKKwlpbnQgZHJ2X3N0YXR1czsKKworCWhh ZF9zdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKwlzdHJlYW0gPSAmaW50ZWxo YWRkYXRhLT5zdHJlYW1faW5mbzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlbGhhZGRhdGEt PmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwlidWZfaWQgPSBpbnRlbGhhZGRhdGEtPmN1cnJf YnVmOworCXN0cmVhbV90eXBlID0gaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGU7CisJaW50ZWxoYWRk YXRhLT5idWZmX2RvbmUgPSBidWZfaWQ7CisJZHJ2X3N0YXR1cyA9IGludGVsaGFkZGF0YS0+ZHJ2 X3N0YXR1czsKKwlpZiAoc3RyZWFtX3R5cGUgPT0gSEFEX1JVTk5JTkdfU1RSRUFNKQorCQlpbnRl bGhhZGRhdGEtPmN1cnJfYnVmID0gSEFEX0JVRl9UWVBFX0E7CisKKwlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKworCXByX2Rl YnVnKCJFbnRlcjolcyBidWZfaWQ9JWQsIHN0cmVhbV90eXBlPSVkXG4iLAorCQkJX19mdW5jX18s IGJ1Zl9pZCwgc3RyZWFtX3R5cGUpOworCisJaW50ZWxoYWRkYXRhLT5vcHMtPmhhbmRsZV91bmRl cnJ1bihpbnRlbGhhZGRhdGEpOworCisJaWYgKGRydl9zdGF0dXMgPT0gSEFEX0RSVl9ESVNDT05O RUNURUQpIHsKKwkJcHJfZXJyKCIlczpEZXZpY2UgYWxyZWFkeSBkaXNjb25uZWN0ZWRcbiIsIF9f ZnVuY19fKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlpZiAoc3RyZWFtX3R5cGUgPT0gSEFE X1JVTk5JTkdfU1RSRUFNKSB7CisJCS8qIFJlcG9ydCBVTkRFUlJVTiBlcnJvciB0byBhYm92ZSBs YXllcnMgKi8KKwkJaW50ZWxoYWRkYXRhLT5mbGFnX3VuZGVycnVuID0gMTsKKwkJc3RyZWFtLT5w ZXJpb2RfZWxhcHNlZChzdHJlYW0tPmhhZF9zdWJzdHJlYW0pOworCX0KKworCXJldHVybiByZXR2 YWw7Cit9CisKK2ludCBoYWRfcHJvY2Vzc19ob3RfcGx1ZyhzdHJ1Y3Qgc25kX2ludGVsaGFkICpp bnRlbGhhZGRhdGEpCit7CisJaW50IHJldHZhbCA9IDA7CisJZW51bSBpbnRlbF9oYWRfYXVkX2J1 Zl90eXBlIGJ1Zl9pZDsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlz dHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ19pcnFz OworCisJcHJfZGVidWcoIkVudGVyOiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlzdWJzdHJlYW0gPSBp bnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW07CisJaGFkX3N0cmVhbSA9IGlu dGVsaGFkZGF0YS0+cHJpdmF0ZV9kYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFk ZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCWlmIChpbnRlbGhhZGRhdGEtPmRydl9z dGF0dXMgPT0gSEFEX0RSVl9DT05ORUNURUQpIHsKKwkJcHJfZGVidWcoIkRldmljZSBhbHJlYWR5 IGNvbm5lY3RlZFxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+ aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlidWZfaWQg PSBpbnRlbGhhZGRhdGEtPmN1cnJfYnVmOworCWludGVsaGFkZGF0YS0+YnVmZl9kb25lID0gYnVm X2lkOworCWludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9IEhBRF9EUlZfQ09OTkVDVEVEOworCXBy X2RlYnVnKCIlcyBAICVkOkRFQlVHIFBMVUcvVU5QTFVHIDogSEFEX0RSVl9DT05ORUNURURcbiIs CisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVs aGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCisJcHJfZGVidWcoIlByb2Nlc3Np bmcgSE9UX1BMVUcsIGJ1Zl9pZCA9ICVkXG4iLCBidWZfaWQpOworCisJIC8qIFF1ZXJ5IGRpc3Bs YXkgZHJpdmVyIGZvciBhdWRpbyByZWdpc3RlciBiYXNlICovCisJaWYgKGludGVsaGFkZGF0YS0+ cmVnX29wcy5oZG1pX2F1ZGlvX2dldF9yZWdpc3Rlcl9iYXNlKAorCQkmaW50ZWxoYWRkYXRhLT5h dWRpb19yZWdfYmFzZSwKKwkJJmludGVsaGFkZGF0YS0+YXVkaW9fY2ZnX29mZnNldCkpIHsKKwkJ cHJfZXJyKCJVbmFibGUgdG8gZ2V0IGF1ZGlvIHJlZyBiYXNlIGZyb20gRGlzcGxheSBkcml2ZXJc biIpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5hdWRpb19yZWdfYmFz ZSA9PSBOVUxMKSB7CisJCXByX2VycigiYXVkaW8gcmVnIGJhc2UgdmFsdWUgaXMgTlVMTFxuIik7 CisJCWdvdG8gZXJyOworCX0KKworCXByX2RlYnVnKCIlcyBhdWRpb19yZWdfYmFzZSA9IDB4JXBc biIsIF9fZnVuY19fLAorCQkJaW50ZWxoYWRkYXRhLT5hdWRpb19yZWdfYmFzZSk7CisKKwkvKiBT YWZldHkgY2hlY2sgKi8KKwlpZiAoc3Vic3RyZWFtKSB7CisJCXByX2RlYnVnKCJUaGVyZSBzaG91 bGQgbm90IGJlIGFjdGl2ZSBQQiBmcm9tIEFMU0FcbiIpOworCQlwcl9kZWJ1ZygiU2lnbmlmaWVz LCBjYWJsZSBpcyBwbHVnZ2VkLWluIGV2ZW4gYmVmb3JlXG4iKTsKKwkJcHJfZGVidWcoInByb2Nl c3Npbmcgc25kX3BjbV9kaXNjb25uZWN0XG4iKTsKKwkJLyogU2V0IHJ1bnRpbWUtPnN0YXRlIHRv IGh3X3BhcmFtcyBkb25lICovCisJCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9T VEFURV9TRVRVUCk7CisJfQorCisJaGFkX2J1aWxkX2NoYW5uZWxfYWxsb2NhdGlvbl9tYXAoaW50 ZWxoYWRkYXRhKTsKKworCXJldHVybiByZXR2YWw7CisKK2VycjoKKwlwbV9ydW50aW1lX2Rpc2Fi bGUoaW50ZWxoYWRkYXRhLT5kZXYpOworCWludGVsaGFkZGF0YS0+ZGV2ID0gTlVMTDsKKwlyZXR1 cm4gcmV0dmFsOworfQorCitpbnQgaGFkX3Byb2Nlc3NfaG90X3VucGx1ZyhzdHJ1Y3Qgc25kX2lu dGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJaW50IGNhcHMsIHJldHZhbCA9IDA7CisJZW51bSBp bnRlbF9oYWRfYXVkX2J1Zl90eXBlIGJ1Zl9pZDsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRf c3RyZWFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ19pcnFzOworCisJcHJfZGVidWcoIkVudGVyOiVz XG4iLCBfX2Z1bmNfXyk7CisKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2Rh dGE7CisJYnVmX2lkID0gaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZjsKKworCXNwaW5fbG9ja19pcnFz YXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKworCWlmIChpbnRl bGhhZGRhdGEtPmRydl9zdGF0dXMgPT0gSEFEX0RSVl9ESVNDT05ORUNURUQpIHsKKwkJcHJfZGVi dWcoIkRldmljZSBhbHJlYWR5IGRpc2Nvbm5lY3RlZFxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlyZXR1cm4g cmV0dmFsOworCisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBBdWRpbyAqLworCQljYXBzID0gSERN SV9BVURJT19CVUZGRVJfRE9ORTsKKwkJcmV0dmFsID0gaGFkX3NldF9jYXBzKEhBRF9TRVRfRElT QUJMRV9BVURJT19JTlQsICZjYXBzKTsKKwkJcmV0dmFsID0gaGFkX3NldF9jYXBzKEhBRF9TRVRf RElTQUJMRV9BVURJTywgTlVMTCk7CisJCWludGVsaGFkZGF0YS0+b3BzLT5lbmFibGVfYXVkaW8o CisJCQlpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW0sIDApOworCX0KKwor CWludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9IEhBRF9EUlZfRElTQ09OTkVDVEVEOworCXByX2Rl YnVnKCIlcyBAICVkOkRFQlVHIFBMVUcvVU5QTFVHIDogSEFEX0RSVl9ESVNDT05ORUNURURcbiIs CisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCisJLyogUmVwb3J0IHRvIGFib3ZlIEFMU0EgbGF5 ZXIgKi8KKwlpZiAoaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFtICE9IE5V TEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3Bpbmxv Y2ssIGZsYWdfaXJxcyk7CisJCXByX2RlYnVnKCIlczogdW5sb2NrIC0+IHNlbmRpbmcgcGNtX3N0 b3AgLT4gbG9ja1xuIiwgX19mdW5jX18pOworCQlzbmRfcGNtX3N0b3AoaW50ZWxoYWRkYXRhLT5z dHJlYW1faW5mby5oYWRfc3Vic3RyZWFtLAorCQkJCVNORFJWX1BDTV9TVEFURV9ESVNDT05ORUNU RUQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZs YWdfaXJxcyk7CisJfQorCisJaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGUgPSBIQURfSU5JVDsKKwlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19p cnFzKTsKKwlrZnJlZShpbnRlbGhhZGRhdGEtPmNobWFwLT5jaG1hcCk7CisJaW50ZWxoYWRkYXRh LT5jaG1hcC0+Y2htYXAgPSBOVUxMOworCWludGVsaGFkZGF0YS0+YXVkaW9fcmVnX2Jhc2UgPSBO VUxMOworCXByX2RlYnVnKCIlczogdW5sb2NrZWQgLT4gcmV0dXJuZWRcbiIsIF9fZnVuY19fKTsK KworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogaGFkX2V2ZW50X2hhbmRsZXIgLSBDYWxs IGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGV2ZW50cworICoKKyAqIEBldmVudF90eXBlOiBFdmVu dCB0eXBlIHRvIGhhbmRsZQorICogQGRhdGE6IGRhdGEgcmVsYXRlZCB0byB0aGUgZXZlbnRfdHlw ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB0byBoYW5kbGUgSERNSSBldmVudHMg ZnJvbSBjbGllbnQgZHJpdmVyLgorICovCitpbnQgaGFkX2V2ZW50X2hhbmRsZXIoZW51bSBoYWRf ZXZlbnRfdHlwZSBldmVudF90eXBlLCB2b2lkICpkYXRhKQoreworCWludCByZXR2YWwgPSAwOwor CXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IGRhdGE7CisJZW51bSBpbnRlbF9o YWRfYXVkX2J1Zl90eXBlIGJ1Zl9pZDsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0 cmVhbTsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCXVuc2lnbmVkIGxvbmcg ZmxhZ19pcnFzOworCisJYnVmX2lkID0gaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZjsKKwloYWRfc3Ry ZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisKKwkvKiBTd2l0Y2hpbmcgdG8gYSBm dW5jdGlvbiBjYW4gZHJvcCBhdG9taWNpdHkgZXZlbiBpbiBJTlRSIGNvbnRleHQuCisJICogVGh1 cywgYSBiaWcgbG9jayBpcyBhY3F1aXJlZCB0byBtYWludGFpbiBhdG9taWNpdHkuCisJICogVGhp cyBjYW4gYmUgb3B0aW1pemVkIGxhdGVyLgorCSAqIEN1cnJlbnRseSwgb25seSBidWZmZXJfZG9u ZS9fdW5kZXJydW4gZXhlY3V0ZXMgaW4gSU5UUiBjb250ZXh0LgorCSAqIEFsc28sIGxvY2tpbmcg aXMgaW1wbGVtZW50ZWQgc2VwYXJhdGVseSB0byBhdm9pZCByZWFsIGNvbnRlbnRpb24KKwkgKiBv ZiBkYXRhKHN0cnVjdCBpbnRlbGhhZGRhdGEpIGJldHdlZW4gSVJRL1NPRlRfSVJRL1BST0NFU1Mg Y29udGV4dC4KKwkgKi8KKwlzdWJzdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmhh ZF9zdWJzdHJlYW07CisJc3dpdGNoIChldmVudF90eXBlKSB7CisJY2FzZSBIQURfRVZFTlRfQVVE SU9fQlVGRkVSX0RPTkU6CisJCXJldHZhbCA9IGhhZF9wcm9jZXNzX2J1ZmZlcl9kb25lKGludGVs aGFkZGF0YSk7CisJYnJlYWs7CisKKwljYXNlIEhBRF9FVkVOVF9BVURJT19CVUZGRVJfVU5ERVJS VU46CisJCXJldHZhbCA9IGhhZF9wcm9jZXNzX2J1ZmZlcl91bmRlcnJ1bihpbnRlbGhhZGRhdGEp OworCWJyZWFrOworCisJY2FzZSBIQURfRVZFTlRfSE9UX1BMVUc6CisJCXJldHZhbCA9IGhhZF9w cm9jZXNzX2hvdF9wbHVnKGludGVsaGFkZGF0YSk7CisJYnJlYWs7CisKKwljYXNlIEhBRF9FVkVO VF9IT1RfVU5QTFVHOgorCQlyZXR2YWwgPSBoYWRfcHJvY2Vzc19ob3RfdW5wbHVnKGludGVsaGFk ZGF0YSk7CisJYnJlYWs7CisKKwljYXNlIEhBRF9FVkVOVF9NT0RFX0NIQU5HSU5HOgorCQlwcl9k ZWJ1ZygiIGNhbGxlZCBfZXZlbnRfaGFuZGxlciB3aXRoIF9NT0RFX0NIQU5HRSBldmVudFxuIik7 CisJCS8qIFByb2Nlc3Mgb25seSBpZiBzdHJlYW0gaXMgYWN0aXZlICYgY2FibGUgUGx1Z2dlZC1p biAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZs YWdfaXJxcyk7CisJCWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPj0gSEFEX0RSVl9ESVND T05ORUNURUQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFk X3NwaW5sb2NrLAorCQkJCQlmbGFnX2lycXMpOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJ CWlmICgoaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGUgPT0gSEFEX1JVTk5JTkdfU1RSRUFNKQorCQkJ CSYmIHN1YnN0cmVhbSkKKwkJCXJldHZhbCA9IGhkbWlfYXVkaW9fbW9kZV9jaGFuZ2Uoc3Vic3Ry ZWFtKTsKKwlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCJlcnJvciB1bi1oYW5kbGVk IGV2ZW50ICEhXG4iKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwlicmVhazsKKworCX0KKwlyZXR1 cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvc291bmQveDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlv LmMgYi9zb3VuZC94ODYvaW50ZWxfaGRtaV9scGVfYXVkaW8uYwppbmRleCBmMzFhYjcyLi4xNjE5 NGM2IDEwMDY0NAotLS0gYS9zb3VuZC94ODYvaW50ZWxfaGRtaV9scGVfYXVkaW8uYworKysgYi9z b3VuZC94ODYvaW50ZWxfaGRtaV9scGVfYXVkaW8uYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1 ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxkcm0vaW50ZWxfbHBlX2F1ZGlvLmg+CiAj aW5jbHVkZSAiaW50ZWxfaGRtaV9scGVfYXVkaW8uaCIKKyNpbmNsdWRlICJpbnRlbF9oZG1pX2F1 ZGlvLmgiCiAKIC8qIGdsb2JhbHMqLwogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZ3BkZXY7CkBA IC00NjEsOSArNDYyLDkgQEAgc3RhdGljIHZvaWQgbm90aWZ5X2F1ZGlvX2xwZSh2b2lkICphdWRp b19wdHIpCiAvKioKICAqIGhkbWlfbHBlX2F1ZGlvX3Byb2JlIC0gc3RhcnQgYnJpZGdlIHdpdGgg aTkxNQogICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGk5MTUgZHJpdmVy IGNyZWF0ZXMgdGhlIGhkbWktbHBlLWF1ZGlvCi0gKiBwbGF0Zm9ybSBkZXZpY2UuIENhcmQgY3Jl YXRpb24gaXMgZGVmZXJyZWQgdW50aWwgYSBob3QgcGx1ZyBldmVudCBpcwotICogcmVjZWl2ZWQK KyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGk5MTUgZHJpdmVyIGNyZWF0ZXMg dGhlCisgKiBoZG1pLWxwZS1hdWRpbyBwbGF0Zm9ybSBkZXZpY2UuIENhcmQgY3JlYXRpb24gaXMg ZGVmZXJyZWQgdW50aWwgYQorICogaG90IHBsdWcgZXZlbnQgaXMgcmVjZWl2ZWQKICAqLwogc3Rh dGljIGludCBoZG1pX2xwZV9hdWRpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 KQogewpAQCAtNTA1LDggKzUwNiw4IEBAIHN0YXRpYyBpbnQgaGRtaV9scGVfYXVkaW9fcHJvYmUo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAkJKHVuc2lnbmVkIGludClyZXNfbW1pby0+ c3RhcnQsICh1bnNpZ25lZCBpbnQpcmVzX21taW8tPmVuZCk7CiAKIAltbWlvX3N0YXJ0ID0gaW9y ZW1hcF9ub2NhY2hlKHJlc19tbWlvLT5zdGFydCwKLQkJCQkoc2l6ZV90KSgocmVzX21taW8tPmVu ZCAtIHJlc19tbWlvLT5zdGFydCkKLQkJCQkJCSsgMSkpOworCQkJCShzaXplX3QpKChyZXNfbW1p by0+ZW5kIC0KKwkJCQkJcmVzX21taW8tPnN0YXJ0KSArIDEpKTsKIAlpZiAoIW1taW9fc3RhcnQp IHsKIAkJcHJfZXJyKCJDb3VsZCBub3QgZ2V0IGlvcmVtYXBcbiIpOwogCQlyZXR1cm4gLUVBQ0NF UzsKQEAgLTU1NiwxMSArNTU3LDEyIEBAIHN0YXRpYyBpbnQgaGRtaV9scGVfYXVkaW9fcHJvYmUo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBk ZXYsIGN0eCk7CiAKKwlyZXQgPSBoZG1pX2F1ZGlvX3Byb2JlKCh2b2lkICopcGRldik7CisKIAlw cl9kZWJ1ZygiaGRtaSBscGUgYXVkaW86IHNldHRpbmcgcGluIGVsZCBub3RpZnkgY2FsbGJhY2tc biIpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBkYXRhLT5scGVfYXVkaW9fc2xvY2ssIGZsYWdf aXJxKTsKIAlwZGF0YS0+bm90aWZ5X2F1ZGlvX2xwZSA9IG5vdGlmeV9hdWRpb19scGU7Ci0KIAlp ZiAocGRhdGEtPm5vdGlmeV9wZW5kaW5nKSB7CiAKIAkJcHJfZGVidWcoIiVzOiBoYW5kbGUgcGVu ZGluZyBub3RpZmljYXRpb25cbiIsIF9fZnVuY19fKTsKQEAgLTU4NCw2ICs1ODYsOCBAQCBzdGF0 aWMgaW50IGhkbWlfbHBlX2F1ZGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 KQogCiAJcHJfZGVidWcoIkVudGVyICVzXG4iLCBfX2Z1bmNfXyk7CiAKKwloZG1pX2F1ZGlvX3Jl bW92ZShwZGV2KTsKKwogCS8qIGdldCBjb250ZXh0LCByZWxlYXNlIHJlc291cmNlcyAqLwogCWN0 eCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCWlvdW5tYXAoY3R4LT5tbWlvX3N0YXJ0 KTsKLS0gCjIuOS4zCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5v cmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1n ZngK