From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr0-x243.google.com (mail-wr0-x243.google.com [IPv6:2a00:1450:400c:c0c::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4F8286E15C for ; Thu, 29 Mar 2018 10:33:45 +0000 (UTC) Received: by mail-wr0-x243.google.com with SMTP id f14so4912591wre.8 for ; Thu, 29 Mar 2018 03:33:45 -0700 (PDT) From: Tvrtko Ursulin Date: Thu, 29 Mar 2018 11:33:34 +0100 Message-Id: <20180329103334.766-1-tvrtko.ursulin@linux.intel.com> In-Reply-To: <20180328182948.27494-1-tvrtko.ursulin@linux.intel.com> References: <20180328182948.27494-1-tvrtko.ursulin@linux.intel.com> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t v2] intel-gpu-top: Rewrite the tool to be safe to use List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: igt-dev@lists.freedesktop.org Cc: Tvrtko Ursulin , Eero Tamminen , Intel-gfx@lists.freedesktop.org List-ID: RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KCmludGVsLWdw dS10b3AgaXMgYSBkYW5nZXJvdXMgdG9vbCB3aGljaCBjYW4gaGFuZyBtYWNoaW5lcyBkdWUgdW5z YWZlIG1taW8KcmVnaXN0ZXIgYWNjZXNzLiBUaGlzIHBhdGNoIHJld3JpdGVzIGl0IHRvIHVzZSBv bmx5IFBNVS4KCk9ubHkgb3ZlcmFsbCBjb21tYW5kIHN0cmVhbWVyIGJ1c3luZXNzIGFuZCBHUFUg Z2xvYmFsIGRhdGEgc3VjaCBhcyBwb3dlcgphbmQgZnJlcXVlbmNpZXMgYXJlIGluY2x1ZGVkIGlu IHRoaXMgbmV3IHZlcnNpb24uCgpGb3IgYWNjZXNzIHRvIG1vcmUgR1BVIGZ1bmN0aW9uYWwgdW5p dCBsZXZlbCBkYXRhLCBhbiBPQSBtZXRyaWMgYmFzZWQgdG9vbApsaWtlIGdwdS10b3Agc2hvdWxk IGJlIHVzZWQgaW5zdGVhZC4KCnYyOgogKiBTb3J0IGVuZ2luZXMgYnkgY2xhc3MgYW5kIGluc3Rh bmNlLgogKiBEbyBub3Qgd2FpdCBmb3Igb25lIHNhbXBsaW5nIHBlcmlvZCB0byBkaXNwbGF5IHNv bWV0aGluZyBvbiBzY3JlZW4uCiAqIE1vdmUgY29kZSBvdXQgb2YgdGhlIGFzc2VydHMuIChSaW5h dCBJYnJhZ2ltb3YpCiAqIENvbnRpbnVvdXNseSBhZGFwdCB0byB0ZXJtaW5hbCBzaXplLiAoUmlu YXQgSWJncmFnaW1vdikKClNpZ25lZC1vZmYtYnk6IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28udXJz dWxpbkBpbnRlbC5jb20+CkNjOiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5jby51 az4KQ2M6IExpb25lbCBMYW5kd2VybGluIDxsaW9uZWwuZy5sYW5kd2VybGluQGludGVsLmNvbT4K Q2M6IFBldHJpIExhdHZhbGEgPHBldHJpLmxhdHZhbGFAaW50ZWwuY29tPgpDYzogRWVybyBUYW1t aW5lbiA8ZWVyby50LnRhbW1pbmVuQGludGVsLmNvbT4KQ2M6IFJpbmF0IElicmFnaW1vdiA8aWJy YWdpbW92cmluYXRAbWFpbC5ydT4KUmV2aWV3ZWQtYnk6IExpb25lbCBMYW5kd2VybGluIDxsaW9u ZWwuZy5sYW5kd2VybGluQGludGVsLmNvbT4gIyB2MQpSZXZpZXdlZC1ieTogQ2hyaXMgV2lsc29u IDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+ICMgdjAuNQotLS0KIHRvb2xzL01ha2VmaWxlLmFt ICAgICB8ICAgIDIgKwogdG9vbHMvaW50ZWxfZ3B1X3RvcC5jIHwgMTAwOSArKysrKysrKysrKysr KysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB0b29scy9tZXNvbi5idWlsZCAg ICAgfCAgICA2ICstCiAzIGZpbGVzIGNoYW5nZWQsIDQ0MSBpbnNlcnRpb25zKCspLCA1NzYgZGVs ZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvdG9vbHMvTWFrZWZpbGUuYW0gYi90b29scy9NYWtlZmls ZS5hbQppbmRleCAwOWI2ZGJjYzNlY2UuLmEwYjAxNmRkZDdmZiAxMDA2NDQKLS0tIGEvdG9vbHMv TWFrZWZpbGUuYW0KKysrIGIvdG9vbHMvTWFrZWZpbGUuYW0KQEAgLTI4LDYgKzI4LDggQEAgaW50 ZWxfYXViZHVtcF9sYV9MREZMQUdTID0gLW1vZHVsZSAtYXZvaWQtdmVyc2lvbiAtbm8tdW5kZWZp bmVkCiBpbnRlbF9hdWJkdW1wX2xhX1NPVVJDRVMgPSBhdWJkdW1wLmMKIGludGVsX2F1YmR1bXBf bGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9saWJpbnRlbF90b29scy5sYSAtbGRsCiAK K2ludGVsX2dwdV90b3BfTERBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2xpYmlndF9wZXJmLmxh CisKIGJpbl9TQ1JJUFRTID0gaW50ZWxfYXViZHVtcAogQ0xFQU5GSUxFUyA9ICQoYmluX1NDUklQ VFMpCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2ludGVsX2dwdV90b3AuYyBiL3Rvb2xzL2ludGVsX2dw dV90b3AuYwppbmRleCAwOThlNmNlM2ZmODYuLjk0MDkxZDk3YzRhMyAxMDA2NDQKLS0tIGEvdG9v bHMvaW50ZWxfZ3B1X3RvcC5jCisrKyBiL3Rvb2xzL2ludGVsX2dwdV90b3AuYwpAQCAtMSw2ICsx LDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgwqkgMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbgotICogQ29w eXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDE4IElu dGVsIENvcnBvcmF0aW9uCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJl ZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICAqIGNvcHkgb2YgdGhpcyBz b2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJl IiksCkBAIC0xOCw3MDEgKzE3LDU2MSBAQAogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAgKiBUSEUgQVVU SE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdF UyBPUiBPVEhFUgogICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFD VCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKLSAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05O RUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKLSAqIERFQUxJTkdT IElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKiBBdXRob3JzOgotICogICAgRXJpYyBBbmhvbHQgPGVy aWNAYW5ob2x0Lm5ldD4KLSAqICAgIEV1Z2VuaSBEb2Rvbm92IDxldWdlbmkuZG9kb25vdkBpbnRl bC5jb20+Ci0gKgorICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09G VFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgog ICovCiAKLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5j bHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4K LSNpbmNsdWRlIDxlcnIuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMv dGltZS5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cisj aW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8YXNzZXJ0 Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZkZWYgSEFWRV9URVJNSU9TX0gKLSNpbmNsdWRl IDx0ZXJtaW9zLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJpbnRlbF9pby5oIgotI2luY2x1ZGUgImlu c3Rkb25lLmgiCi0jaW5jbHVkZSAiaW50ZWxfcmVnLmgiCi0jaW5jbHVkZSAiaW50ZWxfY2hpcHNl dC5oIgotI2luY2x1ZGUgImRybXRlc3QuaCIKLQotI2RlZmluZSAgRk9SQ0VXQUtFCSAgICAweEEx OEMKLSNkZWZpbmUgIEZPUkNFV0FLRV9BQ0sJICAgIDB4MTMwMDkwCi0KLSNkZWZpbmUgU0FNUExF U19QRVJfU0VDICAgICAgICAgICAgIDEwMDAwCi0jZGVmaW5lIFNBTVBMRVNfVE9fUEVSQ0VOVF9S QVRJTyAgICAoU0FNUExFU19QRVJfU0VDIC8gMTAwKQotCi0jZGVmaW5lIE1BWF9OVU1fVE9QX0JJ VFMgICAgICAgICAgICAxMDAKLQotI2RlZmluZSBIQVNfU1RBVFNfUkVHUyhkZXZpZCkJCUlTXzk2 NShkZXZpZCkKLQotc3RydWN0IHRvcF9iaXQgewotCXN0cnVjdCBpbnN0ZG9uZV9iaXQgKmJpdDsK LQlpbnQgY291bnQ7Ci19IHRvcF9iaXRzW01BWF9OVU1fVE9QX0JJVFNdOwotc3RydWN0IHRvcF9i aXQgKnRvcF9iaXRzX3NvcnRlZFtNQVhfTlVNX1RPUF9CSVRTXTsKLQotc3RhdGljIHVpbnQzMl90 IGluc3Rkb25lLCBpbnN0ZG9uZTE7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpiYXJzW10gPSB7Ci0J IiAiLAotCSLilo8iLAotCSLilo4iLAotCSLilo0iLAotCSLilowiLAotCSLilosiLAotCSLilooi LAotCSLilokiLAotCSLilogiCi19OworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3Rk bGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNs dWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3Rs Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bG9j YWxlLmg+CisKKyNpbmNsdWRlICJpZ3RfcGVyZi5oIgogCi1lbnVtIHN0YXRzX2NvdW50cyB7Ci0J SUFfVkVSVElDRVMsCi0JSUFfUFJJTUlUSVZFUywKLQlWU19JTlZPQ0FUSU9OLAotCUdTX0lOVk9D QVRJT04sCi0JR1NfUFJJTUlUSVZFUywKLQlDTF9JTlZPQ0FUSU9OLAotCUNMX1BSSU1JVElWRVMs Ci0JUFNfSU5WT0NBVElPTiwKLQlQU19ERVBUSCwKLQlTVEFUU19DT1VOVAorc3RydWN0IHBtdV9w YWlyIHsKKwl1aW50NjRfdCBjdXI7CisJdWludDY0X3QgcHJldjsKIH07CiAKLWNvbnN0IHVpbnQz Ml90IHN0YXRzX3JlZ3NbU1RBVFNfQ09VTlRdID0gewotCUlBX1ZFUlRJQ0VTX0NPVU5UX1FXLAot CUlBX1BSSU1JVElWRVNfQ09VTlRfUVcsCi0JVlNfSU5WT0NBVElPTl9DT1VOVF9RVywKLQlHU19J TlZPQ0FUSU9OX0NPVU5UX1FXLAotCUdTX1BSSU1JVElWRVNfQ09VTlRfUVcsCi0JQ0xfSU5WT0NB VElPTl9DT1VOVF9RVywKLQlDTF9QUklNSVRJVkVTX0NPVU5UX1FXLAotCVBTX0lOVk9DQVRJT05f Q09VTlRfUVcsCi0JUFNfREVQVEhfQ09VTlRfUVcsCitzdHJ1Y3QgcG11X2NvdW50ZXIgeworCXVp bnQ2NF90IGNvbmZpZzsKKwl1bnNpZ25lZCBpbnQgaWR4OworCXN0cnVjdCBwbXVfcGFpciB2YWw7 CiB9OwogCi1jb25zdCBjaGFyICpzdGF0c19yZWdfbmFtZXNbU1RBVFNfQ09VTlRdID0gewotCSJ2 ZXJ0IGZldGNoIiwKLQkicHJpbSBmZXRjaCIsCi0JIlZTIGludm9jYXRpb25zIiwKLQkiR1MgaW52 b2NhdGlvbnMiLAotCSJHUyBwcmltcyIsCi0JIkNMIGludm9jYXRpb25zIiwKLQkiQ0wgcHJpbXMi LAotCSJQUyBpbnZvY2F0aW9ucyIsCi0JIlBTIGRlcHRoIHBhc3MiLAorc3RydWN0IGVuZ2luZSB7 CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgcG11X2NvdW50ZXIgYnVzeTsKKwlzdHJ1Y3Qg cG11X2NvdW50ZXIgd2FpdDsKKwlzdHJ1Y3QgcG11X2NvdW50ZXIgc2VtYTsKIH07CiAKLXVpbnQ2 NF90IHN0YXRzW1NUQVRTX0NPVU5UXTsKLXVpbnQ2NF90IGxhc3Rfc3RhdHNbU1RBVFNfQ09VTlRd Oworc3RydWN0IGVuZ2luZXMgeworCXVuc2lnbmVkIGludCBudW1fZW5naW5lczsKKwl1bnNpZ25l ZCBpbnQgbnVtX2NvdW50ZXJzOworCURJUiAqcm9vdDsKKwlpbnQgZmQ7CisJc3RydWN0IHBtdV9w YWlyIHRzOwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZ2V0dGltZSh2b2lkKQotewotICAgIHN0 cnVjdCB0aW1ldmFsIHQ7Ci0gICAgZ2V0dGltZW9mZGF5KCZ0LCBOVUxMKTsKLSAgICByZXR1cm4g KHQudHZfdXNlYyArICh0LnR2X3NlYyAqIDEwMDAwMDApKTsKLX0KKwlpbnQgcmFwbF9mZDsKKwlk b3VibGUgcmFwbF9zY2FsZTsKIAotc3RhdGljIGludAotdG9wX2JpdHNfc29ydChjb25zdCB2b2lk ICphLCBjb25zdCB2b2lkICpiKQorCXN0cnVjdCBwbXVfY291bnRlciBmcmVxX3JlcTsKKwlzdHJ1 Y3QgcG11X2NvdW50ZXIgZnJlcV9hY3Q7CisJc3RydWN0IHBtdV9jb3VudGVyIGlycTsKKwlzdHJ1 Y3QgcG11X2NvdW50ZXIgcmM2OworCXN0cnVjdCBwbXVfY291bnRlciByYXBsOworCisJc3RydWN0 IGVuZ2luZSBlbmdpbmU7Cit9OworCitzdGF0aWMgdWludDY0X3QKK2dldF9wbXVfY29uZmlnKGlu dCBkaXJmZCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqY291bnRlcikKIHsKLQlzdHJ1 Y3QgdG9wX2JpdCAqIGNvbnN0ICpiaXRfYSA9IGE7Ci0Jc3RydWN0IHRvcF9iaXQgKiBjb25zdCAq Yml0X2IgPSBiOwotCWludCBhX2NvdW50ID0gKCpiaXRfYSktPmNvdW50OwotCWludCBiX2NvdW50 ID0gKCpiaXRfYiktPmNvdW50OworCWNoYXIgYnVmWzEyOF0sICpwOworCWludCBmZCwgcmV0Owog Ci0JaWYgKGFfY291bnQgPCBiX2NvdW50KQotCQlyZXR1cm4gMTsKLQllbHNlIGlmIChhX2NvdW50 ID09IGJfY291bnQpCi0JCXJldHVybiAwOwotCWVsc2UKKwlyZXQgPSBzbnByaW50ZihidWYsIHNp emVvZihidWYpLCAiJXMtJXMiLCBuYW1lLCBjb3VudGVyKTsKKwlpZiAocmV0IDwgMCB8fCByZXQg PT0gc2l6ZW9mKGJ1ZikpCiAJCXJldHVybiAtMTsKLX0KIAotc3RhdGljIHZvaWQKLXVwZGF0ZV9p ZGxlX2JpdChzdHJ1Y3QgdG9wX2JpdCAqdG9wX2JpdCkKLXsKLQl1aW50MzJfdCByZWdfdmFsOwor CWZkID0gb3BlbmF0KGRpcmZkLCBidWYsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1 cm4gLTE7CiAKLQlpZiAodG9wX2JpdC0+Yml0LT5yZWcgPT0gSU5TVERPTkVfMSkKLQkJcmVnX3Zh bCA9IGluc3Rkb25lMTsKLQllbHNlCi0JCXJlZ192YWwgPSBpbnN0ZG9uZTsKKwlyZXQgPSByZWFk KGZkLCBidWYsIHNpemVvZihidWYpKTsKKwljbG9zZShmZCk7CisJaWYgKHJldCA8PSAwKQorCQly ZXR1cm4gLTE7CisKKwlwID0gaW5kZXgoYnVmLCAnMCcpOworCWlmICghcCkKKwkJcmV0dXJuIC0x OwogCi0JaWYgKChyZWdfdmFsICYgdG9wX2JpdC0+Yml0LT5iaXQpID09IDApCi0JCXRvcF9iaXQt PmNvdW50Kys7CisJcmV0dXJuIHN0cnRvdWwocCwgTlVMTCwgMCk7CiB9CiAKLXN0YXRpYyB2b2lk Ci1wcmludF9jbG9jayhjb25zdCBjaGFyICpuYW1lLCBpbnQgY2xvY2spIHsKLQlpZiAoY2xvY2sg PT0gLTEpCi0JCXByaW50ZigiJXMgY2xvY2s6IHVua25vd24iLCBuYW1lKTsKKyNkZWZpbmUgZW5n aW5lX3B0cihlbmdpbmVzLCBuKSBcCisJKChzdHJ1Y3QgZW5naW5lICopKCh1bnNpZ25lZCBjaGFy ICopKCZlbmdpbmVzLT5lbmdpbmUpICsgKG4pICogc2l6ZW9mKHN0cnVjdCBlbmdpbmUpKSkKKwor c3RhdGljIGludCBlbmdpbmVfY21wKGNvbnN0IHZvaWQgKl9fYSwgY29uc3Qgdm9pZCAqX19iKQor eworCWNvbnN0IHN0cnVjdCBlbmdpbmUgKmEgPSAoc3RydWN0IGVuZ2luZSAqKV9fYTsKKwljb25z dCBzdHJ1Y3QgZW5naW5lICpiID0gKHN0cnVjdCBlbmdpbmUgKilfX2I7CisJaW50IGNsYXNzX2Eg PSAoYS0+YnVzeS5jb25maWcgJiAoX19JOTE1X1BNVV9PVEhFUigwKSAtIDEpKSA+PgorCQkgICAg ICBJOTE1X1BNVV9DTEFTU19TSElGVDsKKwlpbnQgY2xhc3NfYiA9IChiLT5idXN5LmNvbmZpZyAm IChfX0k5MTVfUE1VX09USEVSKDApIC0gMSkpID4+CisJCSAgICAgIEk5MTVfUE1VX0NMQVNTX1NI SUZUOworCWludCBpbnN0YW5jZV9hID0gKGEtPmJ1c3kuY29uZmlnID4+IEk5MTVfUE1VX1NBTVBM RV9CSVRTKSAmCisJCQkgKCgxIDw8IEk5MTVfUE1VX1NBTVBMRV9JTlNUQU5DRV9CSVRTKSAtIDEp OworCWludCBpbnN0YW5jZV9iID0gKGItPmJ1c3kuY29uZmlnID4+IEk5MTVfUE1VX1NBTVBMRV9C SVRTKSAmCisJCQkgKCgxIDw8IEk5MTVfUE1VX1NBTVBMRV9JTlNUQU5DRV9CSVRTKSAtIDEpOwor CisJaWYgKGNsYXNzX2EgIT0gY2xhc3NfYikKKwkJcmV0dXJuIGNsYXNzX2EgLSBjbGFzc19iOwog CWVsc2UKLQkJcHJpbnRmKCIlcyBjbG9jazogJWQgTWh6IiwgbmFtZSwgY2xvY2spOworCQlyZXR1 cm4gaW5zdGFuY2VfYSAtIGluc3RhbmNlX2I7CiB9CiAKLXN0YXRpYyBpbnQKLXByaW50X2Nsb2Nr X2luZm8oc3RydWN0IHBjaV9kZXZpY2UgKnBjaV9kZXYpCitzdGF0aWMgc3RydWN0IGVuZ2luZXMg KmRpc2NvdmVyX2VuZ2luZXModm9pZCkKIHsKLQl1aW50MzJfdCBkZXZpZCA9IHBjaV9kZXYtPmRl dmljZV9pZDsKLQl1aW50MTZfdCBnY2ZnYzsKKwljb25zdCBjaGFyICpzeXNmc19yb290ID0gIi9z eXMvZGV2aWNlcy9pOTE1L2V2ZW50cyI7CisJc3RydWN0IGVuZ2luZXMgKmVuZ2luZXM7CisJc3Ry dWN0IGRpcmVudCAqZGVudDsKKwlpbnQgcmV0ID0gMDsKKwlESVIgKmQ7CiAKLQlpZiAoSVNfR000 NShkZXZpZCkpIHsKLQkJaW50IGNvcmVfY2xvY2sgPSAtMTsKKwllbmdpbmVzID0gbWFsbG9jKHNp emVvZihzdHJ1Y3QgZW5naW5lcykpOworCWlmICghZW5naW5lcykKKwkJcmV0dXJuIE5VTEw7CiAK LQkJcGNpX2RldmljZV9jZmdfcmVhZF91MTYocGNpX2RldiwgJmdjZmdjLCBJOTE1X0dDRkdDKTsK KwltZW1zZXQoZW5naW5lcywgMCwgc2l6ZW9mKCplbmdpbmVzKSk7CiAKLQkJc3dpdGNoIChnY2Zn YyAmIDB4ZikgewotCQljYXNlIDg6Ci0JCQljb3JlX2Nsb2NrID0gMjY2OwotCQkJYnJlYWs7Ci0J CWNhc2UgOToKLQkJCWNvcmVfY2xvY2sgPSAzMjA7Ci0JCQlicmVhazsKLQkJY2FzZSAxMToKLQkJ CWNvcmVfY2xvY2sgPSA0MDA7Ci0JCQlicmVhazsKLQkJY2FzZSAxMzoKLQkJCWNvcmVfY2xvY2sg PSA1MzM7Ci0JCQlicmVhazsKLQkJfQotCQlwcmludF9jbG9jaygiY29yZSIsIGNvcmVfY2xvY2sp OwotCX0gZWxzZSBpZiAoSVNfOTY1KGRldmlkKSAmJiBJU19NT0JJTEUoZGV2aWQpKSB7Ci0JCWlu dCByZW5kZXJfY2xvY2sgPSAtMSwgc2FtcGxlcl9jbG9jayA9IC0xOworCWVuZ2luZXMtPm51bV9l bmdpbmVzID0gMDsKIAotCQlwY2lfZGV2aWNlX2NmZ19yZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2Ms IEk5MTVfR0NGR0MpOworCWQgPSBvcGVuZGlyKHN5c2ZzX3Jvb3QpOworCWlmICghZCkKKwkJcmV0 dXJuIE5VTEw7CiAKLQkJc3dpdGNoIChnY2ZnYyAmIDB4ZikgewotCQljYXNlIDI6Ci0JCQlyZW5k ZXJfY2xvY2sgPSAyNTA7IHNhbXBsZXJfY2xvY2sgPSAyNjc7Ci0JCQlicmVhazsKLQkJY2FzZSAz OgotCQkJcmVuZGVyX2Nsb2NrID0gMzIwOyBzYW1wbGVyX2Nsb2NrID0gMzMzOwotCQkJYnJlYWs7 Ci0JCWNhc2UgNDoKLQkJCXJlbmRlcl9jbG9jayA9IDQwMDsgc2FtcGxlcl9jbG9jayA9IDQ0NDsK LQkJCWJyZWFrOwotCQljYXNlIDU6Ci0JCQlyZW5kZXJfY2xvY2sgPSA1MDA7IHNhbXBsZXJfY2xv Y2sgPSA1MzM7Ci0JCQlicmVhazsKLQkJfQotCi0JCXByaW50X2Nsb2NrKCJyZW5kZXIiLCByZW5k ZXJfY2xvY2spOwotCQlwcmludGYoIiAgIik7Ci0JCXByaW50X2Nsb2NrKCJzYW1wbGVyIiwgc2Ft cGxlcl9jbG9jayk7Ci0JfSBlbHNlIGlmIChJU185NDUoZGV2aWQpICYmIElTX01PQklMRShkZXZp ZCkpIHsKLQkJaW50IHJlbmRlcl9jbG9jayA9IC0xLCBkaXNwbGF5X2Nsb2NrID0gLTE7CisJd2hp bGUgKChkZW50ID0gcmVhZGRpcihkKSkgIT0gTlVMTCkgeworCQljb25zdCBjaGFyICplbmRzd2l0 aCA9ICItYnVzeSI7CisJCWNvbnN0IHVuc2lnbmVkIGludCBlbmRsZW4gPSBzdHJsZW4oZW5kc3dp dGgpOworCQlzdHJ1Y3QgZW5naW5lICplbmdpbmUgPQorCQkJCWVuZ2luZV9wdHIoZW5naW5lcywg ZW5naW5lcy0+bnVtX2VuZ2luZXMpOworCQljaGFyIGJ1ZlsyNTZdOwogCi0JCXBjaV9kZXZpY2Vf Y2ZnX3JlYWRfdTE2KHBjaV9kZXYsICZnY2ZnYywgSTkxNV9HQ0ZHQyk7CisJCWlmIChkZW50LT5k X3R5cGUgIT0gRFRfUkVHKQorCQkJY29udGludWU7CiAKLQkJc3dpdGNoIChnY2ZnYyAmIDB4Nykg ewotCQljYXNlIDA6Ci0JCQlyZW5kZXJfY2xvY2sgPSAxNjY7Ci0JCQlicmVhazsKLQkJY2FzZSAx OgotCQkJcmVuZGVyX2Nsb2NrID0gMjAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCXJlbmRl cl9jbG9jayA9IDI1MDsKLQkJCWJyZWFrOwotCQljYXNlIDU6Ci0JCQlyZW5kZXJfY2xvY2sgPSA0 MDA7CisJCWlmIChzdHJsZW4oZGVudC0+ZF9uYW1lKSA+PSBzaXplb2YoYnVmKSkgeworCQkJcmV0 ID0gLTE7CiAJCQlicmVhazsKIAkJfQogCi0JCXN3aXRjaCAoZ2NmZ2MgJiAweDcwKSB7Ci0JCWNh c2UgMDoKLQkJCWRpc3BsYXlfY2xvY2sgPSAyMDA7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJ ZGlzcGxheV9jbG9jayA9IDMyMDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChnY2ZnYyAmICgxIDw8 IDcpKQotCQkgICAgZGlzcGxheV9jbG9jayA9IDEzMzsKKwkJc3RyY3B5KGJ1ZiwgZGVudC0+ZF9u YW1lKTsKIAotCQlwcmludF9jbG9jaygicmVuZGVyIiwgcmVuZGVyX2Nsb2NrKTsKLQkJcHJpbnRm KCIgICIpOwotCQlwcmludF9jbG9jaygiZGlzcGxheSIsIGRpc3BsYXlfY2xvY2spOwotCX0gZWxz ZSBpZiAoSVNfOTE1KGRldmlkKSAmJiBJU19NT0JJTEUoZGV2aWQpKSB7Ci0JCWludCByZW5kZXJf Y2xvY2sgPSAtMSwgZGlzcGxheV9jbG9jayA9IC0xOworCQkvKiB4eHhOLWJ1c3kgKi8KKwkJaWYg KHN0cmxlbihidWYpIDwgKGVuZGxlbiArIDQpKQorCQkJY29udGludWU7CisJCWlmIChzdHJjbXAo JmJ1ZltzdHJsZW4oYnVmKSAtIGVuZGxlbl0sIGVuZHN3aXRoKSkKKwkJCWNvbnRpbnVlOwogCi0J CXBjaV9kZXZpY2VfY2ZnX3JlYWRfdTE2KHBjaV9kZXYsICZnY2ZnYywgSTkxNV9HQ0ZHQyk7CisJ CW1lbXNldChlbmdpbmUsIDAsIHNpemVvZigqZW5naW5lKSk7CiAKLQkJc3dpdGNoIChnY2ZnYyAm IDB4NykgewotCQljYXNlIDA6Ci0JCQlyZW5kZXJfY2xvY2sgPSAxNjA7Ci0JCQlicmVhazsKLQkJ Y2FzZSAxOgotCQkJcmVuZGVyX2Nsb2NrID0gMTkwOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJ CXJlbmRlcl9jbG9jayA9IDMzMzsKKwkJYnVmW3N0cmxlbihidWYpIC0gZW5kbGVuXSA9IDA7CisJ CWVuZ2luZS0+bmFtZSA9IHN0cmR1cChidWYpOworCQlpZiAoIWVuZ2luZS0+bmFtZSkgeworCQkJ cmV0ID0gLTE7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoZ2NmZ2MgJiAoMSA8PCAxMykpCi0JCSAg ICByZW5kZXJfY2xvY2sgPSAxMzM7CiAKLQkJc3dpdGNoIChnY2ZnYyAmIDB4NzApIHsKLQkJY2Fz ZSAwOgotCQkJZGlzcGxheV9jbG9jayA9IDE5MDsKKwkJZW5naW5lLT5idXN5LmNvbmZpZyA9IGdl dF9wbXVfY29uZmlnKGRpcmZkKGQpLCBlbmdpbmUtPm5hbWUsCisJCQkJCQkgICAgICJidXN5Iik7 CisJCWlmIChlbmdpbmUtPmJ1c3kuY29uZmlnID09IC0xKSB7CisJCQlyZXQgPSAtMTsKIAkJCWJy ZWFrOwotCQljYXNlIDQ6Ci0JCQlkaXNwbGF5X2Nsb2NrID0gMzMzOworCQl9CisKKwkJZW5naW5l cy0+bnVtX2VuZ2luZXMrKzsKKwkJZW5naW5lcyA9IHJlYWxsb2MoZW5naW5lcywgc2l6ZW9mKHN0 cnVjdCBlbmdpbmVzKSArCisJCQkJICBlbmdpbmVzLT5udW1fZW5naW5lcyAqIHNpemVvZihzdHJ1 Y3QgZW5naW5lKSk7CisJCWlmICghZW5naW5lcykgeworCQkJcmV0ID0gLUVOT01FTTsKIAkJCWJy ZWFrOwogCQl9Ci0JCWlmIChnY2ZnYyAmICgxIDw8IDcpKQotCQkgICAgZGlzcGxheV9jbG9jayA9 IDEzMzsKKwl9CisKKwlpZiAocmV0KQorCQlmcmVlKGVuZ2luZXMpOworCWVsc2UgeworCQlxc29y dChlbmdpbmVfcHRyKGVuZ2luZXMsIDApLCBlbmdpbmVzLT5udW1fZW5naW5lcywKKwkJICAgICAg c2l6ZW9mKHN0cnVjdCBlbmdpbmUpLCBlbmdpbmVfY21wKTsKIAotCQlwcmludF9jbG9jaygicmVu ZGVyIiwgcmVuZGVyX2Nsb2NrKTsKLQkJcHJpbnRmKCIgICIpOwotCQlwcmludF9jbG9jaygiZGlz cGxheSIsIGRpc3BsYXlfY2xvY2spOworCQllbmdpbmVzLT5yb290ID0gZDsKIAl9CiAKKwlyZXR1 cm4gcmV0ID09IDAgPyBlbmdpbmVzIDogTlVMTDsKK30KKworc3RhdGljIGludAorZmlsZW5hbWVf dG9fYnVmKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBidWZz aXplKQoreworCWludCBmZDsKKwlzc2l6ZV90IHJldDsKKworCWZkID0gb3BlbihmaWxlbmFtZSwg T19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKworCXJldCA9IHJlYWQoZmQs IGJ1ZiwgYnVmc2l6ZSAtIDEpOworCWNsb3NlKGZkKTsKKwlpZiAocmV0IDwgMSkKKwkJcmV0dXJu IC0xOworCisJYnVmW3JldF0gPSAnXDAnOwogCi0JcHJpbnRmKCJcbiIpOwotCXJldHVybiAtMTsK KwlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBTVEFUU19MRU4gKDIwKQotI2RlZmluZSBQRVJDRU5U QUdFX0JBUl9FTkQJKDc5IC0gU1RBVFNfTEVOKQorc3RhdGljIHVpbnQ2NF90IGZpbGVuYW1lX3Rv X3U2NChjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGJhc2UpCit7CisJY2hhciBidWZbNjRdLCAq YjsKIAotc3RhdGljIHZvaWQKLXByaW50X3BlcmNlbnRhZ2VfYmFyKGZsb2F0IHBlcmNlbnQsIGlu dCBjdXJfbGluZV9sZW4pCisJaWYgKGZpbGVuYW1lX3RvX2J1ZihmaWxlbmFtZSwgYnVmLCBzaXpl b2YoYnVmKSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBIYW5kbGUgYm90aCBzaW5nbGUgaW50 ZWdlciBhbmQga2V5PXZhbHVlIGZvcm1hdHMgYnkgc2tpcHBpbmcKKwkgKiBsZWFkaW5nIG5vbi1k aWdpdHMuCisJICovCisJYiA9IGJ1ZjsKKwl3aGlsZSAoKmIgJiYgIWlzZGlnaXQoKmIpKQorCQli Kys7CisKKwlyZXR1cm4gc3RydG91bGwoYiwgTlVMTCwgYmFzZSk7Cit9CisKK3N0YXRpYyB1aW50 NjRfdCByYXBsX3R5cGVfaWQodm9pZCkKIHsKLQlpbnQgYmFyX2F2YWlsX2xlbiA9IChQRVJDRU5U QUdFX0JBUl9FTkQgLSBjdXJfbGluZV9sZW4gLSAxKSAqIDg7Ci0JaW50IGJhcl9sZW4gPSBiYXJf YXZhaWxfbGVuICogKHBlcmNlbnQgKyAuNSkgLyAxMDAuMDsKLQlpbnQgaTsKKwlyZXR1cm4gZmls ZW5hbWVfdG9fdTY0KCIvc3lzL2RldmljZXMvcG93ZXIvdHlwZSIsIDEwKTsKK30KIAotCWZvciAo aSA9IGJhcl9sZW47IGkgPj0gODsgaSAtPSA4KSB7Ci0JCXByaW50ZigiJXMiLCBiYXJzWzhdKTsK LQkJY3VyX2xpbmVfbGVuKys7Ci0JfQotCWlmIChpKSB7Ci0JCXByaW50ZigiJXMiLCBiYXJzW2ld KTsKLQkJY3VyX2xpbmVfbGVuKys7Ci0JfQorc3RhdGljIHVpbnQ2NF90IHJhcGxfZ3B1X3Bvd2Vy KHZvaWQpCit7CisJcmV0dXJuIGZpbGVuYW1lX3RvX3U2NCgiL3N5cy9kZXZpY2VzL3Bvd2VyL2V2 ZW50cy9lbmVyZ3ktZ3B1IiwgMCk7Cit9CisKK3N0YXRpYyBkb3VibGUgZmlsZW5hbWVfdG9fZG91 YmxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWNoYXIgKm9sZGxvY2FsZTsKKwljaGFyIGJ1 Zls4MF07CisJZG91YmxlIHY7CisKKwlpZiAoZmlsZW5hbWVfdG9fYnVmKGZpbGVuYW1lLCBidWYs IHNpemVvZihidWYpKSkKKwkJcmV0dXJuIDA7CiAKLQkvKiBOQjogV2UgY2FuJ3QgdXNlIGEgZmll bGQgd2lkdGggd2l0aCB1dGY4IHNvIHdlIG1hbnVhbGx5Ci0JKiBndWFyYW50ZWUgYSBmaWVsZCB3 aXRoIG9mIDQ1IGNoYXJzIGZvciBhbnkgYmFyLiAqLwotCXByaW50ZigiJSpzIiwgUEVSQ0VOVEFH RV9CQVJfRU5EIC0gY3VyX2xpbmVfbGVuLCAiIik7CisJb2xkbG9jYWxlID0gc2V0bG9jYWxlKExD X0FMTCwgIkMiKTsKKwl2ID0gc3RydG9kKGJ1ZiwgTlVMTCk7CisJc2V0bG9jYWxlKExDX0FMTCwg b2xkbG9jYWxlKTsKKworCXJldHVybiB2OwogfQogCi1zdHJ1Y3QgcmluZyB7Ci0JY29uc3QgY2hh ciAqbmFtZTsKLQl1aW50MzJfdCBtbWlvOwotCWludCBoZWFkLCB0YWlsLCBzaXplOwotCXVpbnQ2 NF90IGZ1bGw7Ci0JaW50IGlkbGU7Ci19Oworc3RhdGljIGRvdWJsZSByYXBsX2dwdV9wb3dlcl9z Y2FsZSh2b2lkKQoreworCXJldHVybiBmaWxlbmFtZV90b19kb3VibGUoIi9zeXMvZGV2aWNlcy9w b3dlci9ldmVudHMvZW5lcmd5LWdwdS5zY2FsZSIpOworfQogCi1zdGF0aWMgdWludDMyX3Qgcmlu Z19yZWFkKHN0cnVjdCByaW5nICpyaW5nLCB1aW50MzJfdCByZWcpCisjZGVmaW5lIF9fb3Blbl9w bXUoZW5naW5lcywgcG11LCBpZHgpIFwKKyh7IFwKKwlpbnQgZmRfXzsgXAorXAorCWZkX18gPSBw ZXJmX2k5MTVfb3Blbl9ncm91cCgocG11KS0+Y29uZmlnLCAoZW5naW5lcyktPmZkKTsgXAorCWlm IChmZF9fID49IDApIHsgXAorCQlpZiAoKGVuZ2luZXMpLT5mZCA9PSAtMSkgXAorCQkJKGVuZ2lu ZXMpLT5mZCA9IGZkX187IFwKKwkJKHBtdSktPmlkeCA9IChpZHgpKys7IFwKKwkJKGVuZ2luZXMp LT5udW1fY291bnRlcnMrKzsgXAorCX0gXAorXAorCWZkX187IFwKK30pCisKK3N0YXRpYyBpbnQg cG11X2luaXQoc3RydWN0IGVuZ2luZXMgKmVuZ2luZXMpCiB7Ci0JcmV0dXJuIElOUkVHKHJpbmct Pm1taW8gKyByZWcpOworCXVuc2lnbmVkIGludCBpZHggPSAwOworCXVuc2lnbmVkIGludCBpOwor CWludCBmZDsKKworCWVuZ2luZXMtPmZkID0gLTE7CisJZW5naW5lcy0+bnVtX2NvdW50ZXJzID0g MDsKKworCWVuZ2luZXMtPmZyZXFfcmVxLmNvbmZpZyA9IEk5MTVfUE1VX1JFUVVFU1RFRF9GUkVR VUVOQ1k7CisJZmQgPSBfX29wZW5fcG11KGVuZ2luZXMsICZlbmdpbmVzLT5mcmVxX3JlcSwgaWR4 KTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwllbmdpbmVzLT5mcmVxX2FjdC5jb25m aWcgPSBJOTE1X1BNVV9BQ1RVQUxfRlJFUVVFTkNZOworCWZkID0gX19vcGVuX3BtdShlbmdpbmVz LCAmZW5naW5lcy0+ZnJlcV9hY3QsIGlkeCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOwor CisJZW5naW5lcy0+aXJxLmNvbmZpZyA9IEk5MTVfUE1VX0lOVEVSUlVQVFM7CisJZmQgPSBfX29w ZW5fcG11KGVuZ2luZXMsICZlbmdpbmVzLT5pcnEsIGlkeCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0 dXJuIC0xOworCisJZW5naW5lcy0+cmM2LmNvbmZpZyA9IEk5MTVfUE1VX1JDNl9SRVNJREVOQ1k7 CisJZmQgPSBfX29wZW5fcG11KGVuZ2luZXMsICZlbmdpbmVzLT5yYzYsIGlkeCk7CisJaWYgKGZk IDwgMCkKKwkJcmV0dXJuIC0xOworCisJZm9yIChpID0gMDsgaSA8IGVuZ2luZXMtPm51bV9lbmdp bmVzOyBpKyspIHsKKwkJc3RydWN0IGVuZ2luZSAqZW5naW5lID0gZW5naW5lX3B0cihlbmdpbmVz LCBpKTsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBwbXVfY291bnRlciAqcG11OworCQkJY29uc3Qg Y2hhciAqY291bnRlcjsKKwkJfSAqY250LCBjb3VudGVyc1tdID0geworCQkJeyAucG11ID0gJmVu Z2luZS0+YnVzeSwgLmNvdW50ZXIgPSAiYnVzeSIgfSwKKwkJCXsgLnBtdSA9ICZlbmdpbmUtPndh aXQsIC5jb3VudGVyID0gIndhaXQiIH0sCisJCQl7IC5wbXUgPSAmZW5naW5lLT5zZW1hLCAuY291 bnRlciA9ICJzZW1hIiB9LAorCQkJeyAucG11ID0gTlVMTCwgLmNvdW50ZXIgPSBOVUxMIH0sCisJ CX07CisKKwkJZm9yIChjbnQgPSBjb3VudGVyczsgY250LT5wbXU7IGNudCsrKSB7CisJCQlpZiAo IWNudC0+cG11LT5jb25maWcpCisJCQkJY250LT5wbXUtPmNvbmZpZyA9CisJCQkJCWdldF9wbXVf Y29uZmlnKGRpcmZkKGVuZ2luZXMtPnJvb3QpLAorCQkJCQkJICAgICAgIGVuZ2luZS0+bmFtZSwK KwkJCQkJCSAgICAgICBjbnQtPmNvdW50ZXIpOworCQkJZmQgPSBfX29wZW5fcG11KGVuZ2luZXMs IGNudC0+cG11LCBpZHgpOworCQkJaWYgKGZkIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9 CisKKwllbmdpbmVzLT5yYXBsX3NjYWxlID0gcmFwbF9ncHVfcG93ZXJfc2NhbGUoKTsKKwlpZiAo ZW5naW5lcy0+cmFwbF9zY2FsZSAhPSBOQU4pCisJCWVuZ2luZXMtPnJhcGxfc2NhbGUgKj0gMWUz OyAvKiBmcm9tIG5hbm8gdG8gbWljcm8gKi8KKwllbmdpbmVzLT5yYXBsLmNvbmZpZyA9IHJhcGxf Z3B1X3Bvd2VyKCk7CisJZW5naW5lcy0+cmFwbF9mZCA9IGlndF9wZXJmX29wZW4ocmFwbF90eXBl X2lkKCksIGVuZ2luZXMtPnJhcGwuY29uZmlnKTsKKwlpZiAoZW5naW5lcy0+cmFwbF9mZCA8IDAp CisJCXJldHVybiAtMTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByaW5nX2luaXQo c3RydWN0IHJpbmcgKnJpbmcpCitzdGF0aWMgdWludDY0X3QgcG11X3JlYWRfbXVsdGkoaW50IGZk LCB1bnNpZ25lZCBpbnQgbnVtLCB1aW50NjRfdCAqdmFsKQogewotCXJpbmctPnNpemUgPSAoKChy aW5nX3JlYWQocmluZywgUklOR19MRU4pICYgUklOR19OUl9QQUdFUykgPj4gMTIpICsgMSkgKiA0 MDk2OworCXVpbnQ2NF90IGJ1ZlsyICsgbnVtXTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzc2l6ZV90 IGxlbjsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKworCWxlbiA9IHJlYWQoZmQs IGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWFzc2VydChsZW4gPT0gc2l6ZW9mKGJ1ZikpOworCisJZm9y IChpID0gMDsgaSA8IG51bTsgaSsrKQorCQl2YWxbaV0gPSBidWZbMiArIGldOworCisJcmV0dXJu IGJ1ZlsxXTsKIH0KIAotc3RhdGljIHZvaWQgcmluZ19yZXNldChzdHJ1Y3QgcmluZyAqcmluZykK K3N0YXRpYyBkb3VibGUgcG11X2NhbGMoc3RydWN0IHBtdV9wYWlyICpwLCBkb3VibGUgZCwgZG91 YmxlIHQsIGRvdWJsZSBzKQogewotCXJpbmctPmlkbGUgPSByaW5nLT5mdWxsID0gMDsKKwlkb3Vi bGUgcGN0OworCisJcGN0ID0gcC0+Y3VyIC0gcC0+cHJldjsKKwlwY3QgLz0gZDsKKwlwY3QgLz0g dDsKKwlwY3QgKj0gczsKKworCWlmIChzID09IDEwMC4wICYmIHBjdCA+IDEwMC4wKQorCQlwY3Qg PSAxMDAuMDsKKworCXJldHVybiBwY3Q7CiB9CiAKLXN0YXRpYyB2b2lkIHJpbmdfc2FtcGxlKHN0 cnVjdCByaW5nICpyaW5nKQorc3RhdGljIHVpbnQ2NF90IF9fcG11X3JlYWRfc2luZ2xlKGludCBm ZCwgdWludDY0X3QgKnRzKQogewotCWludCBmdWxsOworCXVpbnQ2NF90IGRhdGFbMl0gPSB7IH07 CisJc3NpemVfdCBsZW47CiAKLQlpZiAoIXJpbmctPnNpemUpCi0JCXJldHVybjsKKwlsZW4gPSBy ZWFkKGZkLCBkYXRhLCBzaXplb2YoZGF0YSkpOworCWFzc2VydChsZW4gPT0gc2l6ZW9mKGRhdGEp KTsKIAotCXJpbmctPmhlYWQgPSByaW5nX3JlYWQocmluZywgUklOR19IRUFEKSAmIEhFQURfQURE UjsKLQlyaW5nLT50YWlsID0gcmluZ19yZWFkKHJpbmcsIFJJTkdfVEFJTCkgJiBUQUlMX0FERFI7 CisJaWYgKHRzKQorCQkqdHMgPSBkYXRhWzFdOworCisJcmV0dXJuIGRhdGFbMF07Cit9CiAKLQlp ZiAocmluZy0+dGFpbCA9PSByaW5nLT5oZWFkKQotCQlyaW5nLT5pZGxlKys7CitzdGF0aWMgdWlu dDY0X3QgcG11X3JlYWRfc2luZ2xlKGludCBmZCkKK3sKKwlyZXR1cm4gX19wbXVfcmVhZF9zaW5n bGUoZmQsIE5VTEwpOworfQogCi0JZnVsbCA9IHJpbmctPnRhaWwgLSByaW5nLT5oZWFkOwotCWlm IChmdWxsIDwgMCkKLQkJZnVsbCArPSByaW5nLT5zaXplOwotCXJpbmctPmZ1bGwgKz0gZnVsbDsK K3N0YXRpYyB2b2lkIF9fdXBkYXRlX3NhbXBsZShzdHJ1Y3QgcG11X2NvdW50ZXIgKmNvdW50ZXIs IHVpbnQ2NF90IHZhbCkKK3sKKwljb3VudGVyLT52YWwucHJldiA9IGNvdW50ZXItPnZhbC5jdXI7 CisJY291bnRlci0+dmFsLmN1ciA9IHZhbDsKIH0KIAotc3RhdGljIHZvaWQgcmluZ19wcmludF9o ZWFkZXIoRklMRSAqb3V0LCBzdHJ1Y3QgcmluZyAqcmluZykKK3N0YXRpYyB2b2lkIHVwZGF0ZV9z YW1wbGUoc3RydWN0IHBtdV9jb3VudGVyICpjb3VudGVyLCB1aW50NjRfdCAqdmFsKQogewotICAg IGZwcmludGYob3V0LCAiJS42cyUlXHRvcHNcdCIsCi0gICAgICAgICAgICByaW5nLT5uYW1lCi0g ICAgICAgICAgKTsKKwlfX3VwZGF0ZV9zYW1wbGUoY291bnRlciwgdmFsW2NvdW50ZXItPmlkeF0p OwogfQogCi1zdGF0aWMgdm9pZCByaW5nX3ByaW50KHN0cnVjdCByaW5nICpyaW5nLCB1bnNpZ25l ZCBsb25nIHNhbXBsZXNfcGVyX3NlYykKK3N0YXRpYyB2b2lkIHBtdV9zYW1wbGUoc3RydWN0IGVu Z2luZXMgKmVuZ2luZXMpCiB7Ci0JaW50IHBlcmNlbnRfYnVzeSwgbGVuOworCWNvbnN0IGludCBu dW1fdmFsID0gZW5naW5lcy0+bnVtX2NvdW50ZXJzOworCXVpbnQ2NF90IHZhbFtudW1fdmFsXTsK Kwl1bnNpZ25lZCBpbnQgaTsKKworCWVuZ2luZXMtPnRzLnByZXYgPSBlbmdpbmVzLT50cy5jdXI7 CisJZW5naW5lcy0+dHMuY3VyID0gcG11X3JlYWRfbXVsdGkoZW5naW5lcy0+ZmQsIG51bV92YWws IHZhbCk7CisKKwlfX3VwZGF0ZV9zYW1wbGUoJmVuZ2luZXMtPnJhcGwsIHBtdV9yZWFkX3Npbmds ZShlbmdpbmVzLT5yYXBsX2ZkKSk7CiAKLQlpZiAoIXJpbmctPnNpemUpCi0JCXJldHVybjsKKwl1 cGRhdGVfc2FtcGxlKCZlbmdpbmVzLT5mcmVxX3JlcSwgdmFsKTsKKwl1cGRhdGVfc2FtcGxlKCZl bmdpbmVzLT5mcmVxX2FjdCwgdmFsKTsKKwl1cGRhdGVfc2FtcGxlKCZlbmdpbmVzLT5pcnEsIHZh bCk7CisJdXBkYXRlX3NhbXBsZSgmZW5naW5lcy0+cmM2LCB2YWwpOwogCi0JcGVyY2VudF9idXN5 ID0gMTAwIC0gMTAwICogcmluZy0+aWRsZSAvIHNhbXBsZXNfcGVyX3NlYzsKKwlmb3IgKGkgPSAw OyBpIDwgZW5naW5lcy0+bnVtX2VuZ2luZXM7IGkrKykgeworCQlzdHJ1Y3QgZW5naW5lICplbmdp bmUgPSBlbmdpbmVfcHRyKGVuZ2luZXMsIGkpOwogCi0JbGVuID0gcHJpbnRmKCIlMjVzIGJ1c3k6 ICUzZCUlOiAiLCByaW5nLT5uYW1lLCBwZXJjZW50X2J1c3kpOwotCXByaW50X3BlcmNlbnRhZ2Vf YmFyIChwZXJjZW50X2J1c3ksIGxlbik7Ci0JcHJpbnRmKCIlMjRzIHNwYWNlOiAlZC8lZFxuIiwK LQkJICAgcmluZy0+bmFtZSwKLQkJICAgKGludCkocmluZy0+ZnVsbCAvIHNhbXBsZXNfcGVyX3Nl YyksCi0JCSAgIHJpbmctPnNpemUpOworCQl1cGRhdGVfc2FtcGxlKCZlbmdpbmUtPmJ1c3ksIHZh bCk7CisJCXVwZGF0ZV9zYW1wbGUoJmVuZ2luZS0+c2VtYSwgdmFsKTsKKwkJdXBkYXRlX3NhbXBs ZSgmZW5naW5lLT53YWl0LCB2YWwpOworCX0KIH0KIAotc3RhdGljIHZvaWQgcmluZ19sb2coc3Ry dWN0IHJpbmcgKnJpbmcsIHVuc2lnbmVkIGxvbmcgc2FtcGxlc19wZXJfc2VjLAotCQlGSUxFICpv dXRwdXQpCitzdGF0aWMgY29uc3QgY2hhciAqYmFyc1tdID0geyAiICIsICLilo8iLCAi4paOIiwg IuKWjSIsICLilowiLCAi4paLIiwgIuKWiiIsICLilokiLCAi4paIIiB9OworCitzdGF0aWMgdm9p ZAorcHJpbnRfcGVyY2VudGFnZV9iYXIoZG91YmxlIHBlcmNlbnQsIGludCBtYXhfbGVuKQogewot CWlmIChyaW5nLT5zaXplKQotCQlmcHJpbnRmKG91dHB1dCwgIiUzZFx0JWRcdCIsCi0JCQkoaW50 KSgxMDAgLSAxMDAgKiByaW5nLT5pZGxlIC8gc2FtcGxlc19wZXJfc2VjKSwKLQkJCShpbnQpKHJp bmctPmZ1bGwgLyBzYW1wbGVzX3Blcl9zZWMpKTsKLQllbHNlCi0JCWZwcmludGYob3V0cHV0LCAi LTFcdC0xXHQiKTsKKwlpbnQgYmFyX2xlbiA9IHBlcmNlbnQgKiAoOCAqIChtYXhfbGVuIC0gMikp IC8gMTAwLjA7CisJaW50IGk7CisKKwlwdXRjaGFyKCd8Jyk7CisKKwlmb3IgKGkgPSBiYXJfbGVu OyBpID49IDg7IGkgLT0gOCkKKwkJcHJpbnRmKCIlcyIsIGJhcnNbOF0pOworCWlmIChpKQorCQlw cmludGYoIiVzIiwgYmFyc1tpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKG1heF9sZW4gLSAyIC0g KGJhcl9sZW4gKyA3KSAvIDgpOyBpKyspCisJCXB1dGNoYXIoJyAnKTsKKworCXB1dGNoYXIoJ3wn KTsKIH0KIAorI2RlZmluZSBERUZBVUxUX1BFUklPRF9NUyAoMTAwMCkKKwogc3RhdGljIHZvaWQK IHVzYWdlKGNvbnN0IGNoYXIgKmFwcG5hbWUpCiB7CiAJcHJpbnRmKCJpbnRlbF9ncHVfdG9wIC0g RGlzcGxheSBhIHRvcC1saWtlIHN1bW1hcnkgb2YgSW50ZWwgR1BVIHVzYWdlXG4iCi0JCQkiXG4i Ci0JCQkidXNhZ2U6ICVzIFtwYXJhbWV0ZXJzXVxuIgotCQkJIlxuIgotCQkJIlRoZSBmb2xsb3dp bmcgcGFyYW1ldGVycyBhcHBseTpcbiIKLQkJCSJbLXMgPHNhbXBsZXM+XSAgICAgICBzYW1wbGVz IHBlciBzZWNvbmRzIChkZWZhdWx0ICVkKVxuIgotCQkJIlstZSA8Y29tbWFuZD5dICAgICAgIGNv bW1hbmQgdG8gcHJvZmlsZVxuIgotCQkJIlstbyA8ZmlsZT5dICAgICAgICAgIG91dHB1dCBzdGF0 aXN0aWNzIHRvIGZpbGUuIElmIGZpbGUgaXMgJy0nLCIKLQkJCSIgICAgICAgICAgICAgICAgICAg ICBydW4gaW4gYmF0Y2ggbW9kZSBhbmQgb3V0cHV0IHN0YXRpc3RpY3MgdG8gc3RkaW8gb25seSBc biIKLQkJCSJbLWhdICAgICAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBzY3JlZW5cbiIKLQkJ CSJcbiIsCi0JCQlhcHBuYW1lLAotCQkJU0FNUExFU19QRVJfU0VDCi0JCSAgKTsKLQlyZXR1cm47 CisJCSJcbiIKKwkJIlVzYWdlOiAlcyBbcGFyYW1ldGVyc11cbiIKKwkJIlxuIgorCQkiXHRUaGUg Zm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsOlxuIgorCQkiXHRbLXMgPHNhbXBsZXM+ XSAgICAgICByZWZyZXNoIHBlcmlvZCBpbiBtcyAoZGVmYXVsdCAldW1zKVxuIgorCQkiXHRbLWhd ICAgICAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCB0ZXh0XG4iCisJCSJcbiIsCisJCWFwcG5h bWUsIERFRkFVTFRfUEVSSU9EX01TKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiph cmd2KQogewotCXVpbnQzMl90IGRldmlkOwotCXN0cnVjdCBwY2lfZGV2aWNlICpwY2lfZGV2Owot CXN0cnVjdCByaW5nIHJlbmRlcl9yaW5nID0gewotCQkubmFtZSA9ICJyZW5kZXIiLAotCQkubW1p byA9IDB4MjAzMCwKLQl9LCBic2RfcmluZyA9IHsKLQkJLm5hbWUgPSAiYml0c3RyZWFtIiwKLQkJ Lm1taW8gPSAweDQwMzAsCi0JfSwgYnNkNl9yaW5nID0gewotCQkubmFtZSA9ICJiaXRzdHJlYW0i LAotCQkubW1pbyA9IDB4MTIwMzAsCi0JfSwgYmx0X3JpbmcgPSB7Ci0JCS5uYW1lID0gImJsaXR0 ZXIiLAotCQkubW1pbyA9IDB4MjIwMzAsCi0JfTsKLQlpbnQgaSwgY2g7Ci0JaW50IHNhbXBsZXNf cGVyX3NlYyA9IFNBTVBMRVNfUEVSX1NFQzsKLQlGSUxFICpvdXRwdXQgPSBOVUxMOwotCWRvdWJs ZSBlbGFwc2VkX3RpbWU9MDsKLQlpbnQgcHJpbnRfaGVhZGVycz0xOwotCXBpZF90IGNoaWxkX3Bp ZD0tMTsKLQlpbnQgY2hpbGRfc3RhdDsKLQljaGFyICpjbWQ9TlVMTDsKLQlpbnQgaW50ZXJhY3Rp dmU9MTsKLQotCS8qIFBhcnNlIG9wdGlvbnM/ICovCi0Jd2hpbGUgKChjaCA9IGdldG9wdChhcmdj LCBhcmd2LCAiczpvOmU6aCIpKSAhPSAtMSkgeworCXVuc2lnbmVkIGludCBwZXJpb2RfdXMgPSBE RUZBVUxUX1BFUklPRF9NUyAqIDEwMDA7CisJaW50IGNvbl93ID0gLTEsIGNvbl9oID0gLTE7CisJ c3RydWN0IGVuZ2luZXMgKmVuZ2luZXM7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldCwgY2g7 CisKKwkvKiBQYXJzZSBvcHRpb25zICovCisJd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2 LCAiczpoIikpICE9IC0xKSB7CiAJCXN3aXRjaCAoY2gpIHsKLQkJY2FzZSAnZSc6IGNtZCA9IHN0 cmR1cChvcHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3MnOiBzYW1wbGVzX3Blcl9zZWMgPSBh dG9pKG9wdGFyZyk7Ci0JCQlpZiAoc2FtcGxlc19wZXJfc2VjIDwgMTAwKSB7Ci0JCQkJZnByaW50 ZihzdGRlcnIsICJFcnJvcjogc2FtcGxlcyBwZXIgc2Vjb25kIG11c3QgYmUgPj0gMTAwXG4iKTsK LQkJCQlleGl0KDEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ28nOgotCQkJaWYgKCFzdHJj bXAob3B0YXJnLCAiLSIpKSB7Ci0JCQkJLyogUnVubmluZyBpbiBub24taW50ZXJhY3RpdmUgbW9k ZSAqLwotCQkJCWludGVyYWN0aXZlID0gMDsKLQkJCQlvdXRwdXQgPSBzdGRvdXQ7Ci0JCQl9Ci0J CQllbHNlCi0JCQkJb3V0cHV0ID0gZm9wZW4ob3B0YXJnLCAidyIpOwotCQkJaWYgKCFvdXRwdXQp Ci0JCQl7Ci0JCQkJcGVycm9yKCJmb3BlbiIpOwotCQkJCWV4aXQoMSk7Ci0JCQl9CisJCWNhc2Ug J3MnOgorCQkJcGVyaW9kX3VzID0gYXRvaShvcHRhcmcpICogMTAwMDsKIAkJCWJyZWFrOwogCQlj YXNlICdoJzoKIAkJCXVzYWdlKGFyZ3ZbMF0pOwogCQkJZXhpdCgwKTsKLQkJCWJyZWFrOwogCQlk ZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGZsYWcgJWMhXG4iLCAoY2hhcilv cHRvcHQpOworCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIG9wdGlvbiAlYyFcbiIsIChjaGFy KW9wdG9wdCk7CiAJCQl1c2FnZShhcmd2WzBdKTsKIAkJCWV4aXQoMSk7Ci0JCQlicmVhazsKIAkJ fQogCX0KIAotCXBjaV9kZXYgPSBpbnRlbF9nZXRfcGNpX2RldmljZSgpOwotCWRldmlkID0gcGNp X2Rldi0+ZGV2aWNlX2lkOwotCWludGVsX21taW9fdXNlX3BjaV9iYXIocGNpX2Rldik7Ci0JaW5p dF9pbnN0ZG9uZV9kZWZpbml0aW9ucyhkZXZpZCk7Ci0KLQkvKiBEbyB3ZSBoYXZlIGEgY29tbWFu ZCB0byBydW4/ICovCi0JaWYgKGNtZCAhPSBOVUxMKSB7Ci0JCWlmIChvdXRwdXQpIHsKLQkJCWZw cmludGYob3V0cHV0LCAiIyBQcm9maWxpbmc6ICVzXG4iLCBjbWQpOwotCQkJZmZsdXNoKG91dHB1 dCk7Ci0JCX0KLQkJY2hpbGRfcGlkID0gZm9yaygpOwotCQlpZiAoY2hpbGRfcGlkIDwgMCkgewot CQkJcGVycm9yKCJmb3JrIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWVsc2UgaWYgKGNoaWxkX3Bp ZCA9PSAwKSB7Ci0JCQlpbnQgcmVzOwotCQkJcmVzID0gc3lzdGVtKGNtZCk7Ci0JCQlpZiAocmVz IDwgMCkKLQkJCQlwZXJyb3IoInJ1bm5pbmcgY29tbWFuZCIpOwotCQkJaWYgKG91dHB1dCkgewot CQkJCWZmbHVzaChvdXRwdXQpOwotCQkJCWZwcmludGYob3V0cHV0LCAiIyAlcyBleGl0ZWQgd2l0 aCBzdGF0dXMgJWRcbiIsIGNtZCwgcmVzKTsKLQkJCQlmZmx1c2gob3V0cHV0KTsKLQkJCX0KLQkJ CWZyZWUoY21kKTsKLQkJCWV4aXQoMCk7Ci0JCX0gZWxzZSB7Ci0JCQlmcmVlKGNtZCk7Ci0JCX0K KwllbmdpbmVzID0gZGlzY292ZXJfZW5naW5lcygpOworCWlmICghZW5naW5lcykgeworCQlmcHJp bnRmKHN0ZGVyciwgIkZhaWxlZCB0byBkZXRlY3QgZW5naW5lcyFcbiIpOworCQlyZXR1cm4gMTsK IAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2luc3Rkb25lX2JpdHM7IGkrKykgewotCQl0b3Bf Yml0c1tpXS5iaXQgPSAmaW5zdGRvbmVfYml0c1tpXTsKLQkJdG9wX2JpdHNbaV0uY291bnQgPSAw OwotCQl0b3BfYml0c19zb3J0ZWRbaV0gPSAmdG9wX2JpdHNbaV07CisJcmV0ID0gcG11X2luaXQo ZW5naW5lcyk7CisJaWYgKHJldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBpbml0 aWFsaXplIFBNVSFcbiIpOworCQlyZXR1cm4gMTsKIAl9CiAKLQkvKiBHcmFiIGFjY2VzcyB0byB0 aGUgcmVnaXN0ZXJzICovCi0JaW50ZWxfcmVnaXN0ZXJfYWNjZXNzX2luaXQocGNpX2RldiwgMCwg LTEpOworCXBtdV9zYW1wbGUoZW5naW5lcyk7CiAKLQlyaW5nX2luaXQoJnJlbmRlcl9yaW5nKTsK LQlpZiAoSVNfR0VONChkZXZpZCkgfHwgSVNfR0VONShkZXZpZCkpCi0JCXJpbmdfaW5pdCgmYnNk X3JpbmcpOwotCWlmIChJU19HRU42KGRldmlkKSB8fCBJU19HRU43KGRldmlkKSkgewotCQlyaW5n X2luaXQoJmJzZDZfcmluZyk7Ci0JCXJpbmdfaW5pdCgmYmx0X3JpbmcpOwotCX0KKwlmb3IgKDs7 KSB7CisJCWRvdWJsZSB0LCBmcmVxWzJdLCBpcnEsIHJjNiwgcG93ZXI7CisJCXN0cnVjdCB3aW5z aXplIHdzOworCQlpbnQgbGluZXMgPSAwOwogCi0JLyogSW5pdGlhbGl6ZSBHUFUgc3RhdHMgKi8K LQlpZiAoSEFTX1NUQVRTX1JFR1MoZGV2aWQpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBTVEFUU19D T1VOVDsgaSsrKSB7Ci0JCQl1aW50MzJfdCBzdGF0c19oaWdoLCBzdGF0c19sb3csIHN0YXRzX2hp Z2hfMjsKKwkJLyogVXBkYXRlIHRlcm1pbmFsIHNpemUuICovCisJCWlmIChpb2N0bCgwLCBUSU9D R1dJTlNaLCAmd3MpICE9IC0xKSB7CisJCQljb25fdyA9IHdzLndzX2NvbDsKKwkJCWNvbl9oID0g d3Mud3Nfcm93OworCQl9CiAKLQkJCWRvIHsKLQkJCQlzdGF0c19oaWdoID0gSU5SRUcoc3RhdHNf cmVnc1tpXSArIDQpOwotCQkJCXN0YXRzX2xvdyA9IElOUkVHKHN0YXRzX3JlZ3NbaV0pOwotCQkJ CXN0YXRzX2hpZ2hfMiA9IElOUkVHKHN0YXRzX3JlZ3NbaV0gKyA0KTsKLQkJCX0gd2hpbGUgKHN0 YXRzX2hpZ2ggIT0gc3RhdHNfaGlnaF8yKTsKKwkJcG11X3NhbXBsZShlbmdpbmVzKTsKKwkJdCA9 IChkb3VibGUpKGVuZ2luZXMtPnRzLmN1ciAtIGVuZ2luZXMtPnRzLnByZXYpIC8gMWU5OwogCi0J CQlsYXN0X3N0YXRzW2ldID0gKHVpbnQ2NF90KXN0YXRzX2hpZ2ggPDwgMzIgfAotCQkJCXN0YXRz X2xvdzsKLQkJfQotCX0KKwkJcHJpbnRmKCJcMDMzW0hcMDMzW0oiKTsKIAotCWZvciAoOzspIHsK LQkJaW50IGo7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyB0MSwgdGksIHRmLCB0MjsKLQkJdW5zaWdu ZWQgbG9uZyBsb25nIGRlZl9zbGVlcCA9IDEwMDAwMDAgLyBzYW1wbGVzX3Blcl9zZWM7Ci0JCXVu c2lnbmVkIGxvbmcgbG9uZyBsYXN0X3NhbXBsZXNfcGVyX3NlYyA9IHNhbXBsZXNfcGVyX3NlYzsK LQkJdW5zaWduZWQgc2hvcnQgaW50IG1heF9saW5lczsKLQkJc3RydWN0IHdpbnNpemUgd3M7Ci0J CWNoYXIgY2xlYXJfc2NyZWVuW10gPSB7MHgxYiwgJ1snLCAnSCcsCi0JCQkJICAgICAgIDB4MWIs ICdbJywgJ0onLAotCQkJCSAgICAgICAweDB9OwotCQlpbnQgcGVyY2VudDsKLQkJaW50IGxlbjsK LQotCQl0MSA9IGdldHRpbWUoKTsKLQotCQlyaW5nX3Jlc2V0KCZyZW5kZXJfcmluZyk7Ci0JCXJp bmdfcmVzZXQoJmJzZF9yaW5nKTsKLQkJcmluZ19yZXNldCgmYnNkNl9yaW5nKTsKLQkJcmluZ19y ZXNldCgmYmx0X3JpbmcpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBzYW1wbGVzX3Blcl9zZWM7IGkr KykgewotCQkJbG9uZyBsb25nIGludGVydmFsOwotCQkJdGkgPSBnZXR0aW1lKCk7Ci0JCQlpZiAo SVNfOTY1KGRldmlkKSkgewotCQkJCWluc3Rkb25lID0gSU5SRUcoSU5TVERPTkVfSTk2NSk7Ci0J CQkJaW5zdGRvbmUxID0gSU5SRUcoSU5TVERPTkVfMSk7Ci0JCQl9IGVsc2UKLQkJCQlpbnN0ZG9u ZSA9IElOUkVHKElOU1RET05FKTsKLQotCQkJZm9yIChqID0gMDsgaiA8IG51bV9pbnN0ZG9uZV9i aXRzOyBqKyspCi0JCQkJdXBkYXRlX2lkbGVfYml0KCZ0b3BfYml0c1tqXSk7Ci0KLQkJCXJpbmdf c2FtcGxlKCZyZW5kZXJfcmluZyk7Ci0JCQlyaW5nX3NhbXBsZSgmYnNkX3JpbmcpOwotCQkJcmlu Z19zYW1wbGUoJmJzZDZfcmluZyk7Ci0JCQlyaW5nX3NhbXBsZSgmYmx0X3JpbmcpOwotCi0JCQl0 ZiA9IGdldHRpbWUoKTsKLQkJCWlmICh0ZiAtIHQxID49IDEwMDAwMDApIHsKLQkJCQkvKiBXZSBh cmUgb3V0IG9mIHN5bmMsIGJhaWwgb3V0ICovCi0JCQkJbGFzdF9zYW1wbGVzX3Blcl9zZWMgPSBp KzE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpbnRlcnZhbCA9IGRlZl9zbGVlcCAtICh0ZiAtIHRp KTsKLQkJCWlmIChpbnRlcnZhbCA+IDApCi0JCQkJdXNsZWVwKGludGVydmFsKTsKLQkJfQorCQlm cmVxWzBdID0gcG11X2NhbGMoJmVuZ2luZXMtPmZyZXFfcmVxLnZhbCwgMS4wLCB0LCAxKTsKKwkJ ZnJlcVsxXSA9IHBtdV9jYWxjKCZlbmdpbmVzLT5mcmVxX2FjdC52YWwsIDEuMCwgdCwgMSk7CisJ CWlycSA9IHBtdV9jYWxjKCZlbmdpbmVzLT5pcnEudmFsLCAxLjAsIHQsIDEpOworCQlyYzYgPSBw bXVfY2FsYygmZW5naW5lcy0+cmM2LnZhbCwgMWU5LCB0LCAxMDApOworCQlwb3dlciA9IHBtdV9j YWxjKCZlbmdpbmVzLT5yYXBsLnZhbCwgMS4wLCB0LAorCQkJCSBlbmdpbmVzLT5yYXBsX3NjYWxl KTsKIAotCQlpZiAoSEFTX1NUQVRTX1JFR1MoZGV2aWQpKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwg U1RBVFNfQ09VTlQ7IGkrKykgewotCQkJCXVpbnQzMl90IHN0YXRzX2hpZ2gsIHN0YXRzX2xvdywg c3RhdHNfaGlnaF8yOworCQlwcmludGYoImludGVsLWdwdS10b3AgLSAlNC4wZi8lNC4wZiBNSHo7 ICAlMy4wZiUlIFJDNjsgJTYuMGZtVzsgJTguMGYgaXJxcy9zXG4iLAorCQkgICAgICAgZnJlcVsw XSwgZnJlcVsxXSwgcmM2LCBwb3dlciwgaXJxKTsKKwkJbGluZXMrKzsKIAotCQkJCWRvIHsKLQkJ CQkJc3RhdHNfaGlnaCA9IElOUkVHKHN0YXRzX3JlZ3NbaV0gKyA0KTsKLQkJCQkJc3RhdHNfbG93 ID0gSU5SRUcoc3RhdHNfcmVnc1tpXSk7Ci0JCQkJCXN0YXRzX2hpZ2hfMiA9IElOUkVHKHN0YXRz X3JlZ3NbaV0gKyA0KTsKLQkJCQl9IHdoaWxlIChzdGF0c19oaWdoICE9IHN0YXRzX2hpZ2hfMik7 CisJCXByaW50ZigiXG4iKTsKKwkJbGluZXMrKzsKIAotCQkJCXN0YXRzW2ldID0gKHVpbnQ2NF90 KXN0YXRzX2hpZ2ggPDwgMzIgfAotCQkJCQlzdGF0c19sb3c7Ci0JCQl9Ci0JCX0KKwkJZm9yIChp ID0gMDsgaSA8IGVuZ2luZXMtPm51bV9lbmdpbmVzICYmIGxpbmVzIDwgY29uX2g7IGkrKykgewor CQkJc3RydWN0IGVuZ2luZSAqZW5naW5lID0gZW5naW5lX3B0cihlbmdpbmVzLCBpKTsKKwkJCXVu c2lnbmVkIGludCBtYXhfdyA9IGNvbl93IC0gMTsKKwkJCXVuc2lnbmVkIGludCBsZW47CisJCQlk b3VibGUgdmFsWzJdOworCQkJY2hhciBidWZbMTI4XTsKIAotCQlxc29ydCh0b3BfYml0c19zb3J0 ZWQsIG51bV9pbnN0ZG9uZV9iaXRzLAotCQkgICAgICBzaXplb2Yoc3RydWN0IHRvcF9iaXQgKiks IHRvcF9iaXRzX3NvcnQpOwotCi0JCS8qIExpbWl0IHRoZSBudW1iZXIgb2YgbGluZXMgcHJpbnRl ZCB0byB0aGUgdGVybWluYWwgaGVpZ2h0IHNvIHRoZQotCQkgKiBtb3N0IGltcG9ydGFudCBpbmZv IChhdCB0aGUgdG9wKSB3aWxsIHN0YXkgb24gc2NyZWVuLiAqLwotCQltYXhfbGluZXMgPSAtMTsK LQkJaWYgKGlvY3RsKDAsIFRJT0NHV0lOU1osICZ3cykgIT0gLTEpCi0JCQltYXhfbGluZXMgPSB3 cy53c19yb3cgLSA2OyAvKiBleGNsdWRlIGhlYWRlciBsaW5lcyAqLwotCQlpZiAobWF4X2xpbmVz ID49IG51bV9pbnN0ZG9uZV9iaXRzKQotCQkJbWF4X2xpbmVzID0gbnVtX2luc3Rkb25lX2JpdHM7 Ci0KLQkJdDIgPSBnZXR0aW1lKCk7Ci0JCWVsYXBzZWRfdGltZSArPSAodDIgLSB0MSkgLyAxMDAw MDAwLjA7Ci0KLQkJaWYgKGludGVyYWN0aXZlKSB7Ci0JCQlwcmludGYoIiVzIiwgY2xlYXJfc2Ny ZWVuKTsKLQkJCXByaW50X2Nsb2NrX2luZm8ocGNpX2Rldik7Ci0KLQkJCXJpbmdfcHJpbnQoJnJl bmRlcl9yaW5nLCBsYXN0X3NhbXBsZXNfcGVyX3NlYyk7Ci0JCQlyaW5nX3ByaW50KCZic2Rfcmlu ZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMpOwotCQkJcmluZ19wcmludCgmYnNkNl9yaW5nLCBsYXN0 X3NhbXBsZXNfcGVyX3NlYyk7Ci0JCQlyaW5nX3ByaW50KCZibHRfcmluZywgbGFzdF9zYW1wbGVz X3Blcl9zZWMpOwotCi0JCQlwcmludGYoIlxuJTMwcyAgJXNcbiIsICJ0YXNrIiwgInBlcmNlbnQg YnVzeSIpOwotCQkJZm9yIChpID0gMDsgaSA8IG1heF9saW5lczsgaSsrKSB7Ci0JCQkJaWYgKHRv cF9iaXRzX3NvcnRlZFtpXS0+Y291bnQgPiAwKSB7Ci0JCQkJCXBlcmNlbnQgPSAodG9wX2JpdHNf c29ydGVkW2ldLT5jb3VudCAqIDEwMCkgLwotCQkJCQkJbGFzdF9zYW1wbGVzX3Blcl9zZWM7Ci0J CQkJCWxlbiA9IHByaW50ZigiJTMwczogJTNkJSU6ICIsCi0JCQkJCQkJIHRvcF9iaXRzX3NvcnRl ZFtpXS0+Yml0LT5uYW1lLAotCQkJCQkJCSBwZXJjZW50KTsKLQkJCQkJcHJpbnRfcGVyY2VudGFn ZV9iYXIgKHBlcmNlbnQsIGxlbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJpbnRmKCIlKnMiLCBQ RVJDRU5UQUdFX0JBUl9FTkQsICIiKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaSA8IFNUQVRTX0NPVU5U ICYmIEhBU19TVEFUU19SRUdTKGRldmlkKSkgewotCQkJCQlwcmludGYoIiUxM3M6ICVsbHUgKCVs bGQvc2VjKSIsCi0JCQkJCQkgICBzdGF0c19yZWdfbmFtZXNbaV0sCi0JCQkJCQkgICAobG9uZyBs b25nKXN0YXRzW2ldLAotCQkJCQkJICAgKGxvbmcgbG9uZykoc3RhdHNbaV0gLSBsYXN0X3N0YXRz W2ldKSk7Ci0JCQkJCWxhc3Rfc3RhdHNbaV0gPSBzdGF0c1tpXTsKLQkJCQl9IGVsc2UgewotCQkJ CQlpZiAoIXRvcF9iaXRzX3NvcnRlZFtpXS0+Y291bnQpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0J CQkJcHJpbnRmKCJcbiIpOwotCQkJfQotCQl9Ci0JCWlmIChvdXRwdXQpIHsKLQkJCS8qIFByaW50 IGhlYWRlcnMgZm9yIGNvbHVtbnMgYXQgZmlyc3QgcnVuICovCi0JCQlpZiAocHJpbnRfaGVhZGVy cykgewotCQkJCWZwcmludGYob3V0cHV0LCAiIyB0aW1lXHQiKTsKLQkJCQlyaW5nX3ByaW50X2hl YWRlcihvdXRwdXQsICZyZW5kZXJfcmluZyk7Ci0JCQkJcmluZ19wcmludF9oZWFkZXIob3V0cHV0 LCAmYnNkX3JpbmcpOwotCQkJCXJpbmdfcHJpbnRfaGVhZGVyKG91dHB1dCwgJmJzZDZfcmluZyk7 Ci0JCQkJcmluZ19wcmludF9oZWFkZXIob3V0cHV0LCAmYmx0X3JpbmcpOwotCQkJCWZvciAoaSA9 IDA7IGkgPCBNQVhfTlVNX1RPUF9CSVRTOyBpKyspIHsKLQkJCQkJaWYgKGkgPCBTVEFUU19DT1VO VCAmJiBIQVNfU1RBVFNfUkVHUyhkZXZpZCkpIHsKLQkJCQkJCWZwcmludGYob3V0cHV0LCAiJS42 c1x0IiwKLQkJCQkJCQkgICBzdGF0c19yZWdfbmFtZXNbaV0KLQkJCQkJCQkgICApOwotCQkJCQl9 Ci0JCQkJCWlmICghdG9wX2JpdHNbaV0uY291bnQpCi0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0J CQkJZnByaW50ZihvdXRwdXQsICJcbiIpOwotCQkJCXByaW50X2hlYWRlcnMgPSAwOwotCQkJfQot Ci0JCQkvKiBQcmludCBzdGF0aXN0aWNzICovCi0JCQlmcHJpbnRmKG91dHB1dCwgIiUuMmZcdCIs IGVsYXBzZWRfdGltZSk7Ci0JCQlyaW5nX2xvZygmcmVuZGVyX3JpbmcsIGxhc3Rfc2FtcGxlc19w ZXJfc2VjLCBvdXRwdXQpOwotCQkJcmluZ19sb2coJmJzZF9yaW5nLCBsYXN0X3NhbXBsZXNfcGVy X3NlYywgb3V0cHV0KTsKLQkJCXJpbmdfbG9nKCZic2Q2X3JpbmcsIGxhc3Rfc2FtcGxlc19wZXJf c2VjLCBvdXRwdXQpOwotCQkJcmluZ19sb2coJmJsdF9yaW5nLCBsYXN0X3NhbXBsZXNfcGVyX3Nl Yywgb3V0cHV0KTsKLQotCQkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVE9QX0JJVFM7IGkrKykg ewotCQkJCWlmIChpIDwgU1RBVFNfQ09VTlQgJiYgSEFTX1NUQVRTX1JFR1MoZGV2aWQpKSB7Ci0J CQkJCWZwcmludGYob3V0cHV0LCAiJSJQUkl1NjQiXHQiLAotCQkJCQkJICAgc3RhdHNbaV0gLSBs YXN0X3N0YXRzW2ldKTsKLQkJCQkJbGFzdF9zdGF0c1tpXSA9IHN0YXRzW2ldOwotCQkJCX0KLQkJ CQkJaWYgKCF0b3BfYml0c1tpXS5jb3VudCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZnBy aW50ZihvdXRwdXQsICJcbiIpOwotCQkJZmZsdXNoKG91dHB1dCk7Ci0JCX0KKwkJCXZhbFswXSA9 IHBtdV9jYWxjKCZlbmdpbmUtPndhaXQudmFsLCAxZTksIHQsIDEwMCk7CisJCQl2YWxbMV0gPSBw bXVfY2FsYygmZW5naW5lLT5zZW1hLnZhbCwgMWU5LCB0LCAxMDApOworCQkJbGVuID0gc25wcmlu dGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJCQkgICAgICAgIiU2LjJmJSUgd2FpdCwgJTYuMmYlJSBz ZW1hIiwKKwkJCQkgICAgICAgdmFsWzBdLCB2YWxbMV0pOwogCi0JCWZvciAoaSA9IDA7IGkgPCBu dW1faW5zdGRvbmVfYml0czsgaSsrKSB7Ci0JCQl0b3BfYml0c19zb3J0ZWRbaV0tPmNvdW50ID0g MDsKKwkJCXZhbFswXSA9IHBtdV9jYWxjKCZlbmdpbmUtPmJ1c3kudmFsLCAxZTksIHQsIDEwMCk7 CisJCQlsZW4gKz0gcHJpbnRmKCIlOHMgJTYuMmYlJSAiLAorCQkJCSAgICAgIGVuZ2luZS0+bmFt ZSwgdmFsWzBdKTsKKwkJCXByaW50X3BlcmNlbnRhZ2VfYmFyKHZhbFswXSwgbWF4X3cgLSBsZW4p OwogCi0JCQlpZiAoaSA8IFNUQVRTX0NPVU5UKQotCQkJCWxhc3Rfc3RhdHNbaV0gPSBzdGF0c1tp XTsKLQkJfQorCQkJcHJpbnRmKCIlc1xuIiwgYnVmKTsKIAotCQkvKiBDaGVjayBpZiBjaGlsZCBo YXMgZ29uZSAqLwotCQlpZiAoY2hpbGRfcGlkID4gMCkgewotCQkJaW50IHJlczsKLQkJCWlmICgo cmVzID0gd2FpdHBpZChjaGlsZF9waWQsICZjaGlsZF9zdGF0LCBXTk9IQU5HKSkgPT0gLTEpIHsK LQkJCQlwZXJyb3IoIndhaXRwaWQiKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJaWYgKHJlcyA9 PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKFdJRkVYSVRFRChjaGlsZF9zdGF0KSkKLQkJCQli cmVhazsKKwkJCWxpbmVzKys7CiAJCX0KLQl9CiAKLQlmY2xvc2Uob3V0cHV0KTsKKwkJcHJpbnRm KCJcbiIpOworCisJCXVzbGVlcChwZXJpb2RfdXMpOworCX0KIAotCWludGVsX3JlZ2lzdGVyX2Fj Y2Vzc19maW5pKCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90b29scy9tZXNvbi5idWls ZCBiL3Rvb2xzL21lc29uLmJ1aWxkCmluZGV4IGJkMmQzMTNkNTE1Ni4uYTkxOGVlYjBiZWYxIDEw MDY0NAotLS0gYS90b29scy9tZXNvbi5idWlsZAorKysgYi90b29scy9tZXNvbi5idWlsZApAQCAt MjMsNyArMjMsNiBAQCB0b29sc19wcm9ncyA9IFsKIAknaW50ZWxfZ3B1X2ZyZXF1ZW5jeScsCiAJ J2ludGVsX2Zpcm13YXJlX2RlY29kZScsCiAJJ2ludGVsX2dwdV90aW1lJywKLQknaW50ZWxfZ3B1 X3RvcCcsCiAJJ2ludGVsX2d0dCcsCiAJJ2ludGVsX2d1Y19sb2dnZXInLAogCSdpbnRlbF9pbmZv ZnJhbWVzJywKQEAgLTExNyw2ICsxMTYsMTEgQEAgc2hhcmVkX2xpYnJhcnkoJ2ludGVsX2F1YmR1 bXAnLCAnYXViZHVtcC5jJywKIAkgICAgICAgbmFtZV9wcmVmaXggOiAnJywKIAkgICAgICAgaW5z dGFsbCA6IHRydWUpCiAKK2V4ZWN1dGFibGUoJ2ludGVsX2dwdV90b3AnLCAnaW50ZWxfZ3B1X3Rv cC5jJywKKwkgICBpbnN0YWxsIDogdHJ1ZSwKKwkgICBpbnN0YWxsX3JwYXRoIDogcnBhdGhkaXIs CisJICAgZGVwZW5kZW5jaWVzIDogdG9vbF9kZXBzICsgWyBsaWJfaWd0X3BlcmYgXSkKKwogY29u Zl9kYXRhID0gY29uZmlndXJhdGlvbl9kYXRhKCkKIGNvbmZfZGF0YS5zZXQoJ3ByZWZpeCcsIHBy ZWZpeCkKIGNvbmZfZGF0YS5zZXQoJ2V4ZWNfcHJlZml4JywgJyR7cHJlZml4fScpCi0tIAoyLjE0 LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmlndC1k ZXYgbWFpbGluZyBsaXN0CmlndC1kZXZAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaWd0LWRldgo=