From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [RFC i-g-t] intel-gpu-top: Rewrite the tool to be safe to use Date: Wed, 28 Mar 2018 19:29:48 +0100 Message-ID: <20180328182948.27494-1-tvrtko.ursulin@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x242.google.com (mail-wm0-x242.google.com [IPv6:2a00:1450:400c:c09::242]) by gabe.freedesktop.org (Postfix) with ESMTPS id EDF3A6E21A for ; Wed, 28 Mar 2018 18:29:58 +0000 (UTC) Received: by mail-wm0-x242.google.com with SMTP id l9so6654775wmh.2 for ; Wed, 28 Mar 2018 11:29:58 -0700 (PDT) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: igt-dev@lists.freedesktop.org Cc: Intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KCmludGVsLWdw dS10b3AgaXMgYSBkYW5nZXJvdXMgdG9vbCB3aGljaCBjYW4gaGFuZyBtYWNoaW5lcyBkdWUgdW5z YWZlIG1taW8KcmVnaXN0ZXIgYWNjZXNzLiBUaGlzIHBhdGNoIHJld3JpdGVzIGl0IHRvIHVzZSBv bmx5IFBNVS4KCk9ubHkgb3ZlcmFsbCBjb21tYW5kIHN0cmVhbWVyIGJ1c3luZXNzIGFuZCBHUFUg Z2xvYmFsIGRhdGEgc3VjaCBhcyBwb3dlcgphbmQgZnJlcXVlbmNpZXMgYXJlIGluY2x1ZGVkIGlu IHRoaXMgbmV3IHZlcnNpb24uCgpGb3IgYWNjZXNzIHRvIG1vcmUgR1BVIGZ1bmN0aW9uYWwgdW5p dCBsZXZlbCBkYXRhLCBhbiBPQSBtZXRyaWMgYmFzZWQgdG9vbApsaWtlIGdwdS10b3Agc2hvdWxk IGJlIHVzZWQgaW5zdGVhZC4KClNpZ25lZC1vZmYtYnk6IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28u dXJzdWxpbkBpbnRlbC5jb20+CkNjOiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5j by51az4KQ2M6IExpb25lbCBMYW5kd2VybGluIDxsaW9uZWwuZy5sYW5kd2VybGluQGludGVsLmNv bT4KQ2M6IFBldHJpIExhdHZhbGEgPHBldHJpLmxhdHZhbGFAaW50ZWwuY29tPgotLS0KIHRvb2xz L01ha2VmaWxlLmFtICAgICB8ICAgMiArCiB0b29scy9pbnRlbF9ncHVfdG9wLmMgfCA5ODIgKysr KysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHRvb2xzL21l c29uLmJ1aWxkICAgICB8ICAgNiArLQogMyBmaWxlcyBjaGFuZ2VkLCA0MTMgaW5zZXJ0aW9ucygr KSwgNTc3IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3Rvb2xzL01ha2VmaWxlLmFtIGIvdG9v bHMvTWFrZWZpbGUuYW0KaW5kZXggMDliNmRiY2MzZWNlLi5hMGIwMTZkZGQ3ZmYgMTAwNjQ0Ci0t LSBhL3Rvb2xzL01ha2VmaWxlLmFtCisrKyBiL3Rvb2xzL01ha2VmaWxlLmFtCkBAIC0yOCw2ICsy OCw4IEBAIGludGVsX2F1YmR1bXBfbGFfTERGTEFHUyA9IC1tb2R1bGUgLWF2b2lkLXZlcnNpb24g LW5vLXVuZGVmaW5lZAogaW50ZWxfYXViZHVtcF9sYV9TT1VSQ0VTID0gYXViZHVtcC5jCiBpbnRl bF9hdWJkdW1wX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvbGliaW50ZWxfdG9vbHMu bGEgLWxkbAogCitpbnRlbF9ncHVfdG9wX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9saWJp Z3RfcGVyZi5sYQorCiBiaW5fU0NSSVBUUyA9IGludGVsX2F1YmR1bXAKIENMRUFORklMRVMgPSAk KGJpbl9TQ1JJUFRTKQogCmRpZmYgLS1naXQgYS90b29scy9pbnRlbF9ncHVfdG9wLmMgYi90b29s cy9pbnRlbF9ncHVfdG9wLmMKaW5kZXggMDk4ZTZjZTNmZjg2Li40ZWVmNjM0ZWI0MzYgMTAwNjQ0 Ci0tLSBhL3Rvb2xzL2ludGVsX2dwdV90b3AuYworKysgYi90b29scy9pbnRlbF9ncHVfdG9wLmMK QEAgLTEsNiArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IMKpIDIwMDcgSW50ZWwgQ29ycG9yYXRp b24KLSAqIENvcHlyaWdodCDCqSAyMDExIEludGVsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQg wqkgMjAxOCBJbnRlbCBDb3Jwb3JhdGlvbgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdy YW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgKiBjb3B5 IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhl ICJTb2Z0d2FyZSIpLApAQCAtMTgsNzAxICsxNyw1MzIgQEAKICAqIEZJVE5FU1MgRk9SIEEgUEFS VElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAog ICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xB SU0sIERBTUFHRVMgT1IgT1RIRVIKICAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04g T0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCi0gKiBGUk9NLCBPVVQgT0Yg T1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCi0g KiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICogQXV0aG9yczoKLSAqICAgIEVyaWMg QW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+Ci0gKiAgICBFdWdlbmkgRG9kb25vdiA8ZXVnZW5pLmRv ZG9ub3ZAaW50ZWwuY29tPgotICoKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJ VEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBT T0ZUV0FSRS4KICAqLwogCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxpbnR0eXBl cy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUg PHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJyLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5j bHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy90 eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1 ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2lmZGVmIEhBVkVfVEVSTUlPU19I Ci0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2VuZGlmCi0jaW5jbHVkZSAiaW50ZWxfaW8uaCIKLSNp bmNsdWRlICJpbnN0ZG9uZS5oIgotI2luY2x1ZGUgImludGVsX3JlZy5oIgotI2luY2x1ZGUgImlu dGVsX2NoaXBzZXQuaCIKLSNpbmNsdWRlICJkcm10ZXN0LmgiCi0KLSNkZWZpbmUgIEZPUkNFV0FL RQkgICAgMHhBMThDCi0jZGVmaW5lICBGT1JDRVdBS0VfQUNLCSAgICAweDEzMDA5MAotCi0jZGVm aW5lIFNBTVBMRVNfUEVSX1NFQyAgICAgICAgICAgICAxMDAwMAotI2RlZmluZSBTQU1QTEVTX1RP X1BFUkNFTlRfUkFUSU8gICAgKFNBTVBMRVNfUEVSX1NFQyAvIDEwMCkKLQotI2RlZmluZSBNQVhf TlVNX1RPUF9CSVRTICAgICAgICAgICAgMTAwCi0KLSNkZWZpbmUgSEFTX1NUQVRTX1JFR1MoZGV2 aWQpCQlJU185NjUoZGV2aWQpCi0KLXN0cnVjdCB0b3BfYml0IHsKLQlzdHJ1Y3QgaW5zdGRvbmVf Yml0ICpiaXQ7Ci0JaW50IGNvdW50OwotfSB0b3BfYml0c1tNQVhfTlVNX1RPUF9CSVRTXTsKLXN0 cnVjdCB0b3BfYml0ICp0b3BfYml0c19zb3J0ZWRbTUFYX05VTV9UT1BfQklUU107Ci0KLXN0YXRp YyB1aW50MzJfdCBpbnN0ZG9uZSwgaW5zdGRvbmUxOwotCi1zdGF0aWMgY29uc3QgY2hhciAqYmFy c1tdID0gewotCSIgIiwKLQki4paPIiwKLQki4paOIiwKLQki4paNIiwKLQki4paMIiwKLQki4paL IiwKLQki4paKIiwKLQki4paJIiwKLQki4paIIgotfTsKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2lu Y2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0 Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUg PHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2lu Y2x1ZGUgPGxvY2FsZS5oPgorCisjaW5jbHVkZSAiaWd0X3BlcmYuaCIKIAotZW51bSBzdGF0c19j b3VudHMgewotCUlBX1ZFUlRJQ0VTLAotCUlBX1BSSU1JVElWRVMsCi0JVlNfSU5WT0NBVElPTiwK LQlHU19JTlZPQ0FUSU9OLAotCUdTX1BSSU1JVElWRVMsCi0JQ0xfSU5WT0NBVElPTiwKLQlDTF9Q UklNSVRJVkVTLAotCVBTX0lOVk9DQVRJT04sCi0JUFNfREVQVEgsCi0JU1RBVFNfQ09VTlQKK3N0 cnVjdCBwbXVfcGFpciB7CisJdWludDY0X3QgY3VyOworCXVpbnQ2NF90IHByZXY7CiB9OwogCi1j b25zdCB1aW50MzJfdCBzdGF0c19yZWdzW1NUQVRTX0NPVU5UXSA9IHsKLQlJQV9WRVJUSUNFU19D T1VOVF9RVywKLQlJQV9QUklNSVRJVkVTX0NPVU5UX1FXLAotCVZTX0lOVk9DQVRJT05fQ09VTlRf UVcsCi0JR1NfSU5WT0NBVElPTl9DT1VOVF9RVywKLQlHU19QUklNSVRJVkVTX0NPVU5UX1FXLAot CUNMX0lOVk9DQVRJT05fQ09VTlRfUVcsCi0JQ0xfUFJJTUlUSVZFU19DT1VOVF9RVywKLQlQU19J TlZPQ0FUSU9OX0NPVU5UX1FXLAotCVBTX0RFUFRIX0NPVU5UX1FXLAorc3RydWN0IHBtdV9jb3Vu dGVyIHsKKwl1aW50NjRfdCBjb25maWc7CisJdW5zaWduZWQgaW50IGlkeDsKKwlzdHJ1Y3QgcG11 X3BhaXIgdmFsOwogfTsKIAotY29uc3QgY2hhciAqc3RhdHNfcmVnX25hbWVzW1NUQVRTX0NPVU5U XSA9IHsKLQkidmVydCBmZXRjaCIsCi0JInByaW0gZmV0Y2giLAotCSJWUyBpbnZvY2F0aW9ucyIs Ci0JIkdTIGludm9jYXRpb25zIiwKLQkiR1MgcHJpbXMiLAotCSJDTCBpbnZvY2F0aW9ucyIsCi0J IkNMIHByaW1zIiwKLQkiUFMgaW52b2NhdGlvbnMiLAotCSJQUyBkZXB0aCBwYXNzIiwKK3N0cnVj dCBlbmdpbmUgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHBtdV9jb3VudGVyIGJ1c3k7 CisJc3RydWN0IHBtdV9jb3VudGVyIHdhaXQ7CisJc3RydWN0IHBtdV9jb3VudGVyIHNlbWE7CiB9 OwogCi11aW50NjRfdCBzdGF0c1tTVEFUU19DT1VOVF07Ci11aW50NjRfdCBsYXN0X3N0YXRzW1NU QVRTX0NPVU5UXTsKK3N0cnVjdCBlbmdpbmVzIHsKKwl1bnNpZ25lZCBpbnQgbnVtX2VuZ2luZXM7 CisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKwlESVIgKnJvb3Q7CisJaW50IGZkOworCXN0 cnVjdCBwbXVfcGFpciB0czsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldHRpbWUodm9pZCkK LXsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0OwotICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0g ICAgcmV0dXJuICh0LnR2X3VzZWMgKyAodC50dl9zZWMgKiAxMDAwMDAwKSk7Ci19CisJaW50IHJh cGxfZmQ7CisJZG91YmxlIHJhcGxfc2NhbGU7CiAKLXN0YXRpYyBpbnQKLXRvcF9iaXRzX3NvcnQo Y29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKKwlzdHJ1Y3QgcG11X2NvdW50ZXIgZnJlcV9y ZXE7CisJc3RydWN0IHBtdV9jb3VudGVyIGZyZXFfYWN0OworCXN0cnVjdCBwbXVfY291bnRlciBp cnE7CisJc3RydWN0IHBtdV9jb3VudGVyIHJjNjsKKwlzdHJ1Y3QgcG11X2NvdW50ZXIgcmFwbDsK KworCXN0cnVjdCBlbmdpbmUgZW5naW5lOworfTsKKworc3RhdGljIHVpbnQ2NF90CitnZXRfcG11 X2NvbmZpZyhpbnQgZGlyZmQsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmNvdW50ZXIp CiB7Ci0Jc3RydWN0IHRvcF9iaXQgKiBjb25zdCAqYml0X2EgPSBhOwotCXN0cnVjdCB0b3BfYml0 ICogY29uc3QgKmJpdF9iID0gYjsKLQlpbnQgYV9jb3VudCA9ICgqYml0X2EpLT5jb3VudDsKLQlp bnQgYl9jb3VudCA9ICgqYml0X2IpLT5jb3VudDsKKwljaGFyIGJ1ZlsxMjhdLCAqcDsKKwlpbnQg ZmQsIHJldDsKIAotCWlmIChhX2NvdW50IDwgYl9jb3VudCkKLQkJcmV0dXJuIDE7Ci0JZWxzZSBp ZiAoYV9jb3VudCA9PSBiX2NvdW50KQotCQlyZXR1cm4gMDsKLQllbHNlCisJcmV0ID0gc25wcmlu dGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzLSVzIiwgbmFtZSwgY291bnRlcik7CisJaWYgKHJldCA8 IDAgfHwgcmV0ID09IHNpemVvZihidWYpKQogCQlyZXR1cm4gLTE7Ci19CiAKLXN0YXRpYyB2b2lk Ci11cGRhdGVfaWRsZV9iaXQoc3RydWN0IHRvcF9iaXQgKnRvcF9iaXQpCi17Ci0JdWludDMyX3Qg cmVnX3ZhbDsKKwlmZCA9IG9wZW5hdChkaXJmZCwgYnVmLCBPX1JET05MWSk7CisJaWYgKGZkIDwg MCkKKwkJcmV0dXJuIC0xOwogCi0JaWYgKHRvcF9iaXQtPmJpdC0+cmVnID09IElOU1RET05FXzEp Ci0JCXJlZ192YWwgPSBpbnN0ZG9uZTE7Ci0JZWxzZQotCQlyZWdfdmFsID0gaW5zdGRvbmU7CisJ cmV0ID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7CisJY2xvc2UoZmQpOworCWlmIChyZXQg PD0gMCkKKwkJcmV0dXJuIC0xOwogCi0JaWYgKChyZWdfdmFsICYgdG9wX2JpdC0+Yml0LT5iaXQp ID09IDApCi0JCXRvcF9iaXQtPmNvdW50Kys7Ci19CisJcCA9IGluZGV4KGJ1ZiwgJzAnKTsKKwlp ZiAoIXApCisJCXJldHVybiAtMTsKIAotc3RhdGljIHZvaWQKLXByaW50X2Nsb2NrKGNvbnN0IGNo YXIgKm5hbWUsIGludCBjbG9jaykgewotCWlmIChjbG9jayA9PSAtMSkKLQkJcHJpbnRmKCIlcyBj bG9jazogdW5rbm93biIsIG5hbWUpOwotCWVsc2UKLQkJcHJpbnRmKCIlcyBjbG9jazogJWQgTWh6 IiwgbmFtZSwgY2xvY2spOworCXJldHVybiBzdHJ0b3VsKHAsIE5VTEwsIDApOwogfQogCi1zdGF0 aWMgaW50Ci1wcmludF9jbG9ja19pbmZvKHN0cnVjdCBwY2lfZGV2aWNlICpwY2lfZGV2KQorI2Rl ZmluZSBlbmdpbmVfcHRyKGVuZ2luZXMsIG4pIFwKKwkoKHN0cnVjdCBlbmdpbmUgKikoKHVuc2ln bmVkIGNoYXIgKikoJmVuZ2luZXMtPmVuZ2luZSkgKyAobikgKiBzaXplb2Yoc3RydWN0IGVuZ2lu ZSkpKQorCitzdGF0aWMgc3RydWN0IGVuZ2luZXMgKmRpc2NvdmVyX2VuZ2luZXModm9pZCkKIHsK LQl1aW50MzJfdCBkZXZpZCA9IHBjaV9kZXYtPmRldmljZV9pZDsKLQl1aW50MTZfdCBnY2ZnYzsK Kwljb25zdCBjaGFyICpzeXNmc19yb290ID0gIi9zeXMvZGV2aWNlcy9pOTE1L2V2ZW50cyI7CisJ c3RydWN0IGVuZ2luZXMgKmVuZ2luZXM7CisJc3RydWN0IGRpcmVudCAqZGVudDsKKwlpbnQgcmV0 ID0gMDsKKwlESVIgKmQ7CiAKLQlpZiAoSVNfR000NShkZXZpZCkpIHsKLQkJaW50IGNvcmVfY2xv Y2sgPSAtMTsKKwllbmdpbmVzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgZW5naW5lcykpOworCWlm ICghZW5naW5lcykKKwkJcmV0dXJuIE5VTEw7CiAKLQkJcGNpX2RldmljZV9jZmdfcmVhZF91MTYo cGNpX2RldiwgJmdjZmdjLCBJOTE1X0dDRkdDKTsKKwltZW1zZXQoZW5naW5lcywgMCwgc2l6ZW9m KCplbmdpbmVzKSk7CiAKLQkJc3dpdGNoIChnY2ZnYyAmIDB4ZikgewotCQljYXNlIDg6Ci0JCQlj b3JlX2Nsb2NrID0gMjY2OwotCQkJYnJlYWs7Ci0JCWNhc2UgOToKLQkJCWNvcmVfY2xvY2sgPSAz MjA7Ci0JCQlicmVhazsKLQkJY2FzZSAxMToKLQkJCWNvcmVfY2xvY2sgPSA0MDA7Ci0JCQlicmVh azsKLQkJY2FzZSAxMzoKLQkJCWNvcmVfY2xvY2sgPSA1MzM7Ci0JCQlicmVhazsKLQkJfQotCQlw cmludF9jbG9jaygiY29yZSIsIGNvcmVfY2xvY2spOwotCX0gZWxzZSBpZiAoSVNfOTY1KGRldmlk KSAmJiBJU19NT0JJTEUoZGV2aWQpKSB7Ci0JCWludCByZW5kZXJfY2xvY2sgPSAtMSwgc2FtcGxl cl9jbG9jayA9IC0xOworCWVuZ2luZXMtPm51bV9lbmdpbmVzID0gMDsKIAotCQlwY2lfZGV2aWNl X2NmZ19yZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2MsIEk5MTVfR0NGR0MpOworCWQgPSBvcGVuZGly KHN5c2ZzX3Jvb3QpOworCWlmICghZCkKKwkJcmV0dXJuIE5VTEw7CiAKLQkJc3dpdGNoIChnY2Zn YyAmIDB4ZikgewotCQljYXNlIDI6Ci0JCQlyZW5kZXJfY2xvY2sgPSAyNTA7IHNhbXBsZXJfY2xv Y2sgPSAyNjc7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJcmVuZGVyX2Nsb2NrID0gMzIwOyBz YW1wbGVyX2Nsb2NrID0gMzMzOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCXJlbmRlcl9jbG9j ayA9IDQwMDsgc2FtcGxlcl9jbG9jayA9IDQ0NDsKLQkJCWJyZWFrOwotCQljYXNlIDU6Ci0JCQly ZW5kZXJfY2xvY2sgPSA1MDA7IHNhbXBsZXJfY2xvY2sgPSA1MzM7CisJd2hpbGUgKChkZW50ID0g cmVhZGRpcihkKSkgIT0gTlVMTCkgeworCQljb25zdCBjaGFyICplbmRzd2l0aCA9ICItYnVzeSI7 CisJCWNvbnN0IHVuc2lnbmVkIGludCBlbmRsZW4gPSBzdHJsZW4oZW5kc3dpdGgpOworCQlzdHJ1 Y3QgZW5naW5lICplbmdpbmUgPQorCQkJCWVuZ2luZV9wdHIoZW5naW5lcywgZW5naW5lcy0+bnVt X2VuZ2luZXMpOworCQljaGFyIGJ1ZlsyNTZdOworCisJCWlmIChkZW50LT5kX3R5cGUgIT0gRFRf UkVHKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmxlbihkZW50LT5kX25hbWUpID49IHNpemVv ZihidWYpKSB7CisJCQlyZXQgPSAtMTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJcHJpbnRfY2xvY2so InJlbmRlciIsIHJlbmRlcl9jbG9jayk7Ci0JCXByaW50ZigiICAiKTsKLQkJcHJpbnRfY2xvY2so InNhbXBsZXIiLCBzYW1wbGVyX2Nsb2NrKTsKLQl9IGVsc2UgaWYgKElTXzk0NShkZXZpZCkgJiYg SVNfTU9CSUxFKGRldmlkKSkgewotCQlpbnQgcmVuZGVyX2Nsb2NrID0gLTEsIGRpc3BsYXlfY2xv Y2sgPSAtMTsKKwkJc3RyY3B5KGJ1ZiwgZGVudC0+ZF9uYW1lKTsKIAotCQlwY2lfZGV2aWNlX2Nm Z19yZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2MsIEk5MTVfR0NGR0MpOworCQkvKiB4eHhOLWJ1c3kg Ki8KKwkJaWYgKHN0cmxlbihidWYpIDwgKGVuZGxlbiArIDQpKQorCQkJY29udGludWU7CisJCWlm IChzdHJjbXAoJmJ1ZltzdHJsZW4oYnVmKSAtIGVuZGxlbl0sIGVuZHN3aXRoKSkKKwkJCWNvbnRp bnVlOwogCi0JCXN3aXRjaCAoZ2NmZ2MgJiAweDcpIHsKLQkJY2FzZSAwOgotCQkJcmVuZGVyX2Ns b2NrID0gMTY2OwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXJlbmRlcl9jbG9jayA9IDIwMDsK LQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlyZW5kZXJfY2xvY2sgPSAyNTA7Ci0JCQlicmVhazsK LQkJY2FzZSA1OgotCQkJcmVuZGVyX2Nsb2NrID0gNDAwOworCQltZW1zZXQoZW5naW5lLCAwLCBz aXplb2YoKmVuZ2luZSkpOworCisJCWJ1ZltzdHJsZW4oYnVmKSAtIGVuZGxlbl0gPSAwOworCQll bmdpbmUtPm5hbWUgPSBzdHJkdXAoYnVmKTsKKwkJaWYgKCFlbmdpbmUtPm5hbWUpIHsKKwkJCXJl dCA9IC0xOwogCQkJYnJlYWs7CiAJCX0KIAotCQlzd2l0Y2ggKGdjZmdjICYgMHg3MCkgewotCQlj YXNlIDA6Ci0JCQlkaXNwbGF5X2Nsb2NrID0gMjAwOworCQllbmdpbmUtPmJ1c3kuY29uZmlnID0g Z2V0X3BtdV9jb25maWcoZGlyZmQoZCksIGVuZ2luZS0+bmFtZSwKKwkJCQkJCSAgICAgImJ1c3ki KTsKKwkJaWYgKGVuZ2luZS0+YnVzeS5jb25maWcgPT0gLTEpIHsKKwkJCXJldCA9IC0xOwogCQkJ YnJlYWs7Ci0JCWNhc2UgNDoKLQkJCWRpc3BsYXlfY2xvY2sgPSAzMjA7CisJCX0KKworCQllbmdp bmVzLT5udW1fZW5naW5lcysrOworCQllbmdpbmVzID0gcmVhbGxvYyhlbmdpbmVzLCBzaXplb2Yo c3RydWN0IGVuZ2luZXMpICsKKwkJCQkgIGVuZ2luZXMtPm51bV9lbmdpbmVzICogc2l6ZW9mKHN0 cnVjdCBlbmdpbmUpKTsKKwkJaWYgKCFlbmdpbmVzKSB7CisJCQlyZXQgPSAtRU5PTUVNOwogCQkJ YnJlYWs7CiAJCX0KLQkJaWYgKGdjZmdjICYgKDEgPDwgNykpCi0JCSAgICBkaXNwbGF5X2Nsb2Nr ID0gMTMzOworCX0KIAotCQlwcmludF9jbG9jaygicmVuZGVyIiwgcmVuZGVyX2Nsb2NrKTsKLQkJ cHJpbnRmKCIgICIpOwotCQlwcmludF9jbG9jaygiZGlzcGxheSIsIGRpc3BsYXlfY2xvY2spOwot CX0gZWxzZSBpZiAoSVNfOTE1KGRldmlkKSAmJiBJU19NT0JJTEUoZGV2aWQpKSB7Ci0JCWludCBy ZW5kZXJfY2xvY2sgPSAtMSwgZGlzcGxheV9jbG9jayA9IC0xOworCWlmIChyZXQpCisJCWZyZWUo ZW5naW5lcyk7CisJZWxzZQorCQllbmdpbmVzLT5yb290ID0gZDsKIAotCQlwY2lfZGV2aWNlX2Nm Z19yZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2MsIEk5MTVfR0NGR0MpOworCXJldHVybiByZXQgPT0g MCA/IGVuZ2luZXMgOiBOVUxMOworfQogCi0JCXN3aXRjaCAoZ2NmZ2MgJiAweDcpIHsKLQkJY2Fz ZSAwOgotCQkJcmVuZGVyX2Nsb2NrID0gMTYwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXJl bmRlcl9jbG9jayA9IDE5MDsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQlyZW5kZXJfY2xvY2sg PSAzMzM7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoZ2NmZ2MgJiAoMSA8PCAxMykpCi0JCSAgICBy ZW5kZXJfY2xvY2sgPSAxMzM7CitzdGF0aWMgaW50CitmaWxlbmFtZV90b19idWYoY29uc3QgY2hh ciAqZmlsZW5hbWUsIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZnNpemUpCit7CisJaW50IGZk OworCXNzaXplX3QgcmV0OwogCi0JCXN3aXRjaCAoZ2NmZ2MgJiAweDcwKSB7Ci0JCWNhc2UgMDoK LQkJCWRpc3BsYXlfY2xvY2sgPSAxOTA7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJZGlzcGxh eV9jbG9jayA9IDMzMzsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChnY2ZnYyAmICgxIDw8IDcpKQot CQkgICAgZGlzcGxheV9jbG9jayA9IDEzMzsKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZ KTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CiAKLQkJcHJpbnRfY2xvY2soInJlbmRlciIs IHJlbmRlcl9jbG9jayk7Ci0JCXByaW50ZigiICAiKTsKLQkJcHJpbnRfY2xvY2soImRpc3BsYXki LCBkaXNwbGF5X2Nsb2NrKTsKLQl9CisJcmV0ID0gcmVhZChmZCwgYnVmLCBidWZzaXplIC0gMSk7 CisJY2xvc2UoZmQpOworCWlmIChyZXQgPCAxKQorCQlyZXR1cm4gLTE7CiAKKwlidWZbcmV0XSA9 ICdcMCc7CiAKLQlwcmludGYoIlxuIik7Ci0JcmV0dXJuIC0xOworCXJldHVybiAwOwogfQogCi0j ZGVmaW5lIFNUQVRTX0xFTiAoMjApCi0jZGVmaW5lIFBFUkNFTlRBR0VfQkFSX0VORAkoNzkgLSBT VEFUU19MRU4pCitzdGF0aWMgdWludDY0X3QgZmlsZW5hbWVfdG9fdTY0KGNvbnN0IGNoYXIgKmZp bGVuYW1lLCBpbnQgYmFzZSkKK3sKKwljaGFyIGJ1Zls2NF0sICpiOwogCi1zdGF0aWMgdm9pZAot cHJpbnRfcGVyY2VudGFnZV9iYXIoZmxvYXQgcGVyY2VudCwgaW50IGN1cl9saW5lX2xlbikKKwlp ZiAoZmlsZW5hbWVfdG9fYnVmKGZpbGVuYW1lLCBidWYsIHNpemVvZihidWYpKSkKKwkJcmV0dXJu IDA7CisKKwkvKgorCSAqIEhhbmRsZSBib3RoIHNpbmdsZSBpbnRlZ2VyIGFuZCBrZXk9dmFsdWUg Zm9ybWF0cyBieSBza2lwcGluZworCSAqIGxlYWRpbmcgbm9uLWRpZ2l0cy4KKwkgKi8KKwliID0g YnVmOworCXdoaWxlICgqYiAmJiAhaXNkaWdpdCgqYikpCisJCWIrKzsKKworCXJldHVybiBzdHJ0 b3VsbChiLCBOVUxMLCBiYXNlKTsKK30KKworc3RhdGljIHVpbnQ2NF90IHJhcGxfdHlwZV9pZCh2 b2lkKQogewotCWludCBiYXJfYXZhaWxfbGVuID0gKFBFUkNFTlRBR0VfQkFSX0VORCAtIGN1cl9s aW5lX2xlbiAtIDEpICogODsKLQlpbnQgYmFyX2xlbiA9IGJhcl9hdmFpbF9sZW4gKiAocGVyY2Vu dCArIC41KSAvIDEwMC4wOwotCWludCBpOworCXJldHVybiBmaWxlbmFtZV90b191NjQoIi9zeXMv ZGV2aWNlcy9wb3dlci90eXBlIiwgMTApOworfQogCi0JZm9yIChpID0gYmFyX2xlbjsgaSA+PSA4 OyBpIC09IDgpIHsKLQkJcHJpbnRmKCIlcyIsIGJhcnNbOF0pOwotCQljdXJfbGluZV9sZW4rKzsK LQl9Ci0JaWYgKGkpIHsKLQkJcHJpbnRmKCIlcyIsIGJhcnNbaV0pOwotCQljdXJfbGluZV9sZW4r KzsKLQl9CitzdGF0aWMgdWludDY0X3QgcmFwbF9ncHVfcG93ZXIodm9pZCkKK3sKKwlyZXR1cm4g ZmlsZW5hbWVfdG9fdTY0KCIvc3lzL2RldmljZXMvcG93ZXIvZXZlbnRzL2VuZXJneS1ncHUiLCAw KTsKK30KKworc3RhdGljIGRvdWJsZSBmaWxlbmFtZV90b19kb3VibGUoY29uc3QgY2hhciAqZmls ZW5hbWUpCit7CisJY2hhciAqb2xkbG9jYWxlOworCWNoYXIgYnVmWzgwXTsKKwlkb3VibGUgdjsK KworCWlmIChmaWxlbmFtZV90b19idWYoZmlsZW5hbWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQorCQly ZXR1cm4gMDsKIAotCS8qIE5COiBXZSBjYW4ndCB1c2UgYSBmaWVsZCB3aWR0aCB3aXRoIHV0Zjgg c28gd2UgbWFudWFsbHkKLQkqIGd1YXJhbnRlZSBhIGZpZWxkIHdpdGggb2YgNDUgY2hhcnMgZm9y IGFueSBiYXIuICovCi0JcHJpbnRmKCIlKnMiLCBQRVJDRU5UQUdFX0JBUl9FTkQgLSBjdXJfbGlu ZV9sZW4sICIiKTsKKwlvbGRsb2NhbGUgPSBzZXRsb2NhbGUoTENfQUxMLCAiQyIpOworCXYgPSBz dHJ0b2QoYnVmLCBOVUxMKTsKKwlzZXRsb2NhbGUoTENfQUxMLCBvbGRsb2NhbGUpOworCisJcmV0 dXJuIHY7CiB9CiAKLXN0cnVjdCByaW5nIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXVpbnQzMl90 IG1taW87Ci0JaW50IGhlYWQsIHRhaWwsIHNpemU7Ci0JdWludDY0X3QgZnVsbDsKLQlpbnQgaWRs ZTsKLX07CitzdGF0aWMgZG91YmxlIHJhcGxfZ3B1X3Bvd2VyX3NjYWxlKHZvaWQpCit7CisJcmV0 dXJuIGZpbGVuYW1lX3RvX2RvdWJsZSgiL3N5cy9kZXZpY2VzL3Bvd2VyL2V2ZW50cy9lbmVyZ3kt Z3B1LnNjYWxlIik7Cit9CiAKLXN0YXRpYyB1aW50MzJfdCByaW5nX3JlYWQoc3RydWN0IHJpbmcg KnJpbmcsIHVpbnQzMl90IHJlZykKKyNkZWZpbmUgX19vcGVuX3BtdShlbmdpbmVzLCBwbXUsIGlk eCkgXAorKHsgXAorCWludCBmZF9fOyBcCitcCisJZmRfXyA9IHBlcmZfaTkxNV9vcGVuX2dyb3Vw KChwbXUpLT5jb25maWcsIChlbmdpbmVzKS0+ZmQpOyBcCisJaWYgKGZkX18gPj0gMCkgeyBcCisJ CWlmICgoZW5naW5lcyktPmZkID09IC0xKSBcCisJCQkoZW5naW5lcyktPmZkID0gZmRfXzsgXAor CQkocG11KS0+aWR4ID0gKGlkeCkrKzsgXAorCQkoZW5naW5lcyktPm51bV9jb3VudGVycysrOyBc CisJfSBcCitcCisJZmRfXzsgXAorfSkKKworc3RhdGljIGludCBwbXVfaW5pdChzdHJ1Y3QgZW5n aW5lcyAqZW5naW5lcykKIHsKLQlyZXR1cm4gSU5SRUcocmluZy0+bW1pbyArIHJlZyk7CisJdW5z aWduZWQgaW50IGlkeCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGZkOworCisJZW5naW5l cy0+ZmQgPSAtMTsKKwllbmdpbmVzLT5udW1fY291bnRlcnMgPSAwOworCisJZW5naW5lcy0+ZnJl cV9yZXEuY29uZmlnID0gSTkxNV9QTVVfUkVRVUVTVEVEX0ZSRVFVRU5DWTsKKwlmZCA9IF9fb3Bl bl9wbXUoZW5naW5lcywgJmVuZ2luZXMtPmZyZXFfcmVxLCBpZHgpOworCWlmIChmZCA8IDApCisJ CXJldHVybiAtMTsKKworCWVuZ2luZXMtPmZyZXFfYWN0LmNvbmZpZyA9IEk5MTVfUE1VX0FDVFVB TF9GUkVRVUVOQ1k7CisJZmQgPSBfX29wZW5fcG11KGVuZ2luZXMsICZlbmdpbmVzLT5mcmVxX2Fj dCwgaWR4KTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwllbmdpbmVzLT5pcnEuY29u ZmlnID0gSTkxNV9QTVVfSU5URVJSVVBUUzsKKwlmZCA9IF9fb3Blbl9wbXUoZW5naW5lcywgJmVu Z2luZXMtPmlycSwgaWR4KTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwllbmdpbmVz LT5yYzYuY29uZmlnID0gSTkxNV9QTVVfUkM2X1JFU0lERU5DWTsKKwlmZCA9IF9fb3Blbl9wbXUo ZW5naW5lcywgJmVuZ2luZXMtPnJjNiwgaWR4KTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7 CisKKwlmb3IgKGkgPSAwOyBpIDwgZW5naW5lcy0+bnVtX2VuZ2luZXM7IGkrKykgeworCQlzdHJ1 Y3QgZW5naW5lICplbmdpbmUgPSBlbmdpbmVfcHRyKGVuZ2luZXMsIGkpOworCQlzdHJ1Y3Qgewor CQkJc3RydWN0IHBtdV9jb3VudGVyICpwbXU7CisJCQljb25zdCBjaGFyICpjb3VudGVyOworCQl9 ICpjbnQsIGNvdW50ZXJzW10gPSB7CisJCQl7IC5wbXUgPSAmZW5naW5lLT5idXN5LCAuY291bnRl ciA9ICJidXN5IiB9LAorCQkJeyAucG11ID0gJmVuZ2luZS0+d2FpdCwgLmNvdW50ZXIgPSAid2Fp dCIgfSwKKwkJCXsgLnBtdSA9ICZlbmdpbmUtPnNlbWEsIC5jb3VudGVyID0gInNlbWEiIH0sCisJ CQl7IC5wbXUgPSBOVUxMLCAuY291bnRlciA9IE5VTEwgfSwKKwkJfTsKKworCQlmb3IgKGNudCA9 IGNvdW50ZXJzOyBjbnQtPnBtdTsgY250KyspIHsKKwkJCWlmICghY250LT5wbXUtPmNvbmZpZykK KwkJCQljbnQtPnBtdS0+Y29uZmlnID0KKwkJCQkJZ2V0X3BtdV9jb25maWcoZGlyZmQoZW5naW5l cy0+cm9vdCksCisJCQkJCQkgICAgICAgZW5naW5lLT5uYW1lLAorCQkJCQkJICAgICAgIGNudC0+ Y291bnRlcik7CisJCQlmZCA9IF9fb3Blbl9wbXUoZW5naW5lcywgY250LT5wbXUsIGlkeCk7CisJ CQlpZiAoZmQgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWVuZ2luZXMtPnJhcGxf c2NhbGUgPSByYXBsX2dwdV9wb3dlcl9zY2FsZSgpOworCWlmIChlbmdpbmVzLT5yYXBsX3NjYWxl ICE9IE5BTikKKwkJZW5naW5lcy0+cmFwbF9zY2FsZSAqPSAxZTM7IC8qIGZyb20gbmFubyB0byBt aWNybyAqLworCWVuZ2luZXMtPnJhcGwuY29uZmlnID0gcmFwbF9ncHVfcG93ZXIoKTsKKwllbmdp bmVzLT5yYXBsX2ZkID0gaWd0X3BlcmZfb3BlbihyYXBsX3R5cGVfaWQoKSwgZW5naW5lcy0+cmFw bC5jb25maWcpOworCWlmIChlbmdpbmVzLT5yYXBsX2ZkIDwgMCkKKwkJcmV0dXJuIC0xOworCisJ cmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJpbmdfaW5pdChzdHJ1Y3QgcmluZyAqcmluZykK K3N0YXRpYyB1aW50NjRfdCBwbXVfcmVhZF9tdWx0aShpbnQgZmQsIHVuc2lnbmVkIGludCBudW0s IHVpbnQ2NF90ICp2YWwpCiB7Ci0JcmluZy0+c2l6ZSA9ICgoKHJpbmdfcmVhZChyaW5nLCBSSU5H X0xFTikgJiBSSU5HX05SX1BBR0VTKSA+PiAxMikgKyAxKSAqIDQwOTY7CisJdWludDY0X3QgYnVm WzIgKyBudW1dOworCXVuc2lnbmVkIGludCBpOworCisJYXNzZXJ0KHJlYWQoZmQsIGJ1Ziwgc2l6 ZW9mKGJ1ZikpID09IHNpemVvZihidWYpKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykK KwkJdmFsW2ldID0gYnVmWzIgKyBpXTsKKworCXJldHVybiBidWZbMV07CiB9CiAKLXN0YXRpYyB2 b2lkIHJpbmdfcmVzZXQoc3RydWN0IHJpbmcgKnJpbmcpCitzdGF0aWMgZG91YmxlIHBtdV9jYWxj KHN0cnVjdCBwbXVfcGFpciAqcCwgZG91YmxlIGQsIGRvdWJsZSB0LCBkb3VibGUgcykKIHsKLQly aW5nLT5pZGxlID0gcmluZy0+ZnVsbCA9IDA7CisJZG91YmxlIHBjdDsKKworCXBjdCA9IHAtPmN1 ciAtIHAtPnByZXY7CisJcGN0IC89IGQ7CisJcGN0IC89IHQ7CisJcGN0ICo9IHM7CisKKwlpZiAo cyA9PSAxMDAuMCAmJiBwY3QgPiAxMDAuMCkKKwkJcGN0ID0gMTAwLjA7CisKKwlyZXR1cm4gcGN0 OwogfQogCi1zdGF0aWMgdm9pZCByaW5nX3NhbXBsZShzdHJ1Y3QgcmluZyAqcmluZykKK3N0YXRp YyB1aW50NjRfdCBfX3BtdV9yZWFkX3NpbmdsZShpbnQgZmQsIHVpbnQ2NF90ICp0cykKIHsKLQlp bnQgZnVsbDsKKwl1aW50NjRfdCBkYXRhWzJdOwogCi0JaWYgKCFyaW5nLT5zaXplKQotCQlyZXR1 cm47CisJYXNzZXJ0KHJlYWQoZmQsIGRhdGEsIHNpemVvZihkYXRhKSkgPT0gc2l6ZW9mKGRhdGEp KTsKIAotCXJpbmctPmhlYWQgPSByaW5nX3JlYWQocmluZywgUklOR19IRUFEKSAmIEhFQURfQURE UjsKLQlyaW5nLT50YWlsID0gcmluZ19yZWFkKHJpbmcsIFJJTkdfVEFJTCkgJiBUQUlMX0FERFI7 CisJaWYgKHRzKQorCQkqdHMgPSBkYXRhWzFdOwogCi0JaWYgKHJpbmctPnRhaWwgPT0gcmluZy0+ aGVhZCkKLQkJcmluZy0+aWRsZSsrOworCXJldHVybiBkYXRhWzBdOworfQorCitzdGF0aWMgdWlu 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 c3RydWN0IGVuZ2luZXMgKmVuZ2luZXM7CisJc3RydWN0IHdpbnNpemUgd3M7CisJdW5zaWduZWQg aW50IGk7CisJaW50IHJldCwgY2g7CisKKwkvKiBQYXJzZSBvcHRpb25zICovCisJd2hpbGUgKChj aCA9IGdldG9wdChhcmdjLCBhcmd2LCAiczpoIikpICE9IC0xKSB7CiAJCXN3aXRjaCAoY2gpIHsK LQkJY2FzZSAnZSc6IGNtZCA9IHN0cmR1cChvcHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3Mn OiBzYW1wbGVzX3Blcl9zZWMgPSBhdG9pKG9wdGFyZyk7Ci0JCQlpZiAoc2FtcGxlc19wZXJfc2Vj IDwgMTAwKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogc2FtcGxlcyBwZXIgc2Vjb25k IG11c3QgYmUgPj0gMTAwXG4iKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNh c2UgJ28nOgotCQkJaWYgKCFzdHJjbXAob3B0YXJnLCAiLSIpKSB7Ci0JCQkJLyogUnVubmluZyBp biBub24taW50ZXJhY3RpdmUgbW9kZSAqLwotCQkJCWludGVyYWN0aXZlID0gMDsKLQkJCQlvdXRw dXQgPSBzdGRvdXQ7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJb3V0cHV0ID0gZm9wZW4ob3B0YXJnLCAi dyIpOwotCQkJaWYgKCFvdXRwdXQpCi0JCQl7Ci0JCQkJcGVycm9yKCJmb3BlbiIpOwotCQkJCWV4 aXQoMSk7Ci0JCQl9CisJCWNhc2UgJ3MnOgorCQkJcGVyaW9kX3VzID0gYXRvaShvcHRhcmcpICog MTAwMDsKIAkJCWJyZWFrOwogCQljYXNlICdoJzoKIAkJCXVzYWdlKGFyZ3ZbMF0pOwogCQkJZXhp dCgwKTsKLQkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlk IGZsYWcgJWMhXG4iLCAoY2hhcilvcHRvcHQpOworCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlk IG9wdGlvbiAlYyFcbiIsIChjaGFyKW9wdG9wdCk7CiAJCQl1c2FnZShhcmd2WzBdKTsKIAkJCWV4 aXQoMSk7Ci0JCQlicmVhazsKIAkJfQogCX0KIAotCXBjaV9kZXYgPSBpbnRlbF9nZXRfcGNpX2Rl dmljZSgpOwotCWRldmlkID0gcGNpX2Rldi0+ZGV2aWNlX2lkOwotCWludGVsX21taW9fdXNlX3Bj aV9iYXIocGNpX2Rldik7Ci0JaW5pdF9pbnN0ZG9uZV9kZWZpbml0aW9ucyhkZXZpZCk7CisJLyog R2V0IHRlcm1pbmFsIHNpemUuICovCisJaWYgKGlvY3RsKDAsIFRJT0NHV0lOU1osICZ3cykgIT0g LTEpIHsKKwkJY29uX3cgPSB3cy53c19jb2w7CisJCWNvbl9oID0gd3Mud3Nfcm93OworCX0KIAot CS8qIERvIHdlIGhhdmUgYSBjb21tYW5kIHRvIHJ1bj8gKi8KLQlpZiAoY21kICE9IE5VTEwpIHsK LQkJaWYgKG91dHB1dCkgewotCQkJZnByaW50ZihvdXRwdXQsICIjIFByb2ZpbGluZzogJXNcbiIs IGNtZCk7Ci0JCQlmZmx1c2gob3V0cHV0KTsKLQkJfQotCQljaGlsZF9waWQgPSBmb3JrKCk7Ci0J CWlmIChjaGlsZF9waWQgPCAwKSB7Ci0JCQlwZXJyb3IoImZvcmsiKTsKLQkJCWV4aXQoMSk7Ci0J CX0KLQkJZWxzZSBpZiAoY2hpbGRfcGlkID09IDApIHsKLQkJCWludCByZXM7Ci0JCQlyZXMgPSBz eXN0ZW0oY21kKTsKLQkJCWlmIChyZXMgPCAwKQotCQkJCXBlcnJvcigicnVubmluZyBjb21tYW5k Iik7Ci0JCQlpZiAob3V0cHV0KSB7Ci0JCQkJZmZsdXNoKG91dHB1dCk7Ci0JCQkJZnByaW50Zihv dXRwdXQsICIjICVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiwgY21kLCByZXMpOwotCQkJCWZm bHVzaChvdXRwdXQpOwotCQkJfQotCQkJZnJlZShjbWQpOwotCQkJZXhpdCgwKTsKLQkJfSBlbHNl IHsKLQkJCWZyZWUoY21kKTsKLQkJfQorCWVuZ2luZXMgPSBkaXNjb3Zlcl9lbmdpbmVzKCk7CisJ aWYgKCFlbmdpbmVzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGRldGVjdCBlbmdp bmVzIVxuIik7CisJCXJldHVybiAxOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBudW1faW5zdGRv bmVfYml0czsgaSsrKSB7Ci0JCXRvcF9iaXRzW2ldLmJpdCA9ICZpbnN0ZG9uZV9iaXRzW2ldOwot CQl0b3BfYml0c1tpXS5jb3VudCA9IDA7Ci0JCXRvcF9iaXRzX3NvcnRlZFtpXSA9ICZ0b3BfYml0 c1tpXTsKKwlyZXQgPSBwbXVfaW5pdChlbmdpbmVzKTsKKwlpZiAocmV0KSB7CisJCWZwcmludGYo c3RkZXJyLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgUE1VIVxuIik7CisJCXJldHVybiAxOwogCX0K IAotCS8qIEdyYWIgYWNjZXNzIHRvIHRoZSByZWdpc3RlcnMgKi8KLQlpbnRlbF9yZWdpc3Rlcl9h Y2Nlc3NfaW5pdChwY2lfZGV2LCAwLCAtMSk7CisJcG11X3NhbXBsZShlbmdpbmVzKTsKIAotCXJp bmdfaW5pdCgmcmVuZGVyX3JpbmcpOwotCWlmIChJU19HRU40KGRldmlkKSB8fCBJU19HRU41KGRl dmlkKSkKLQkJcmluZ19pbml0KCZic2RfcmluZyk7Ci0JaWYgKElTX0dFTjYoZGV2aWQpIHx8IElT X0dFTjcoZGV2aWQpKSB7Ci0JCXJpbmdfaW5pdCgmYnNkNl9yaW5nKTsKLQkJcmluZ19pbml0KCZi bHRfcmluZyk7Ci0JfQorCWZvciAoOzspIHsKKwkJZG91YmxlIHQsIGZyZXFbMl0sIGlycSwgcmM2 LCBwb3dlcjsKKwkJaW50IGxpbmVzID0gMDsKIAotCS8qIEluaXRpYWxpemUgR1BVIHN0YXRzICov Ci0JaWYgKEhBU19TVEFUU19SRUdTKGRldmlkKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgU1RBVFNf Q09VTlQ7IGkrKykgewotCQkJdWludDMyX3Qgc3RhdHNfaGlnaCwgc3RhdHNfbG93LCBzdGF0c19o aWdoXzI7CisJCXVzbGVlcChwZXJpb2RfdXMpOwogCi0JCQlkbyB7Ci0JCQkJc3RhdHNfaGlnaCA9 IElOUkVHKHN0YXRzX3JlZ3NbaV0gKyA0KTsKLQkJCQlzdGF0c19sb3cgPSBJTlJFRyhzdGF0c19y ZWdzW2ldKTsKLQkJCQlzdGF0c19oaWdoXzIgPSBJTlJFRyhzdGF0c19yZWdzW2ldICsgNCk7Ci0J CQl9IHdoaWxlIChzdGF0c19oaWdoICE9IHN0YXRzX2hpZ2hfMik7CisJCXBtdV9zYW1wbGUoZW5n aW5lcyk7CisJCXQgPSAoZG91YmxlKShlbmdpbmVzLT50cy5jdXIgLSBlbmdpbmVzLT50cy5wcmV2 KSAvIDFlOTsKIAotCQkJbGFzdF9zdGF0c1tpXSA9ICh1aW50NjRfdClzdGF0c19oaWdoIDw8IDMy IHwKLQkJCQlzdGF0c19sb3c7Ci0JCX0KLQl9CisJCXByaW50ZigiXDAzM1tIXDAzM1tKIik7CiAK LQlmb3IgKDs7KSB7Ci0JCWludCBqOwotCQl1bnNpZ25lZCBsb25nIGxvbmcgdDEsIHRpLCB0Ziwg dDI7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyBkZWZfc2xlZXAgPSAxMDAwMDAwIC8gc2FtcGxlc19w ZXJfc2VjOwotCQl1bnNpZ25lZCBsb25nIGxvbmcgbGFzdF9zYW1wbGVzX3Blcl9zZWMgPSBzYW1w bGVzX3Blcl9zZWM7Ci0JCXVuc2lnbmVkIHNob3J0IGludCBtYXhfbGluZXM7Ci0JCXN0cnVjdCB3 aW5zaXplIHdzOwotCQljaGFyIGNsZWFyX3NjcmVlbltdID0gezB4MWIsICdbJywgJ0gnLAotCQkJ CSAgICAgICAweDFiLCAnWycsICdKJywKLQkJCQkgICAgICAgMHgwfTsKLQkJaW50IHBlcmNlbnQ7 Ci0JCWludCBsZW47Ci0KLQkJdDEgPSBnZXR0aW1lKCk7Ci0KLQkJcmluZ19yZXNldCgmcmVuZGVy X3JpbmcpOwotCQlyaW5nX3Jlc2V0KCZic2RfcmluZyk7Ci0JCXJpbmdfcmVzZXQoJmJzZDZfcmlu Zyk7Ci0JCXJpbmdfcmVzZXQoJmJsdF9yaW5nKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgc2FtcGxl c19wZXJfc2VjOyBpKyspIHsKLQkJCWxvbmcgbG9uZyBpbnRlcnZhbDsKLQkJCXRpID0gZ2V0dGlt ZSgpOwotCQkJaWYgKElTXzk2NShkZXZpZCkpIHsKLQkJCQlpbnN0ZG9uZSA9IElOUkVHKElOU1RE T05FX0k5NjUpOwotCQkJCWluc3Rkb25lMSA9IElOUkVHKElOU1RET05FXzEpOwotCQkJfSBlbHNl Ci0JCQkJaW5zdGRvbmUgPSBJTlJFRyhJTlNURE9ORSk7Ci0KLQkJCWZvciAoaiA9IDA7IGogPCBu dW1faW5zdGRvbmVfYml0czsgaisrKQotCQkJCXVwZGF0ZV9pZGxlX2JpdCgmdG9wX2JpdHNbal0p OwotCi0JCQlyaW5nX3NhbXBsZSgmcmVuZGVyX3JpbmcpOwotCQkJcmluZ19zYW1wbGUoJmJzZF9y aW5nKTsKLQkJCXJpbmdfc2FtcGxlKCZic2Q2X3JpbmcpOwotCQkJcmluZ19zYW1wbGUoJmJsdF9y aW5nKTsKLQotCQkJdGYgPSBnZXR0aW1lKCk7Ci0JCQlpZiAodGYgLSB0MSA+PSAxMDAwMDAwKSB7 Ci0JCQkJLyogV2UgYXJlIG91dCBvZiBzeW5jLCBiYWlsIG91dCAqLwotCQkJCWxhc3Rfc2FtcGxl c19wZXJfc2VjID0gaSsxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaW50ZXJ2YWwgPSBkZWZfc2xl ZXAgLSAodGYgLSB0aSk7Ci0JCQlpZiAoaW50ZXJ2YWwgPiAwKQotCQkJCXVzbGVlcChpbnRlcnZh bCk7Ci0JCX0KKwkJZnJlcVswXSA9IHBtdV9jYWxjKCZlbmdpbmVzLT5mcmVxX3JlcS52YWwsIDEu MCwgdCwgMSk7CisJCWZyZXFbMV0gPSBwbXVfY2FsYygmZW5naW5lcy0+ZnJlcV9hY3QudmFsLCAx LjAsIHQsIDEpOworCQlpcnEgPSBwbXVfY2FsYygmZW5naW5lcy0+aXJxLnZhbCwgMS4wLCB0LCAx KTsKKwkJcmM2ID0gcG11X2NhbGMoJmVuZ2luZXMtPnJjNi52YWwsIDFlOSwgdCwgMTAwKTsKKwkJ cG93ZXIgPSBwbXVfY2FsYygmZW5naW5lcy0+cmFwbC52YWwsIDEuMCwgdCwKKwkJCQkgZW5naW5l cy0+cmFwbF9zY2FsZSk7CiAKLQkJaWYgKEhBU19TVEFUU19SRUdTKGRldmlkKSkgewotCQkJZm9y IChpID0gMDsgaSA8IFNUQVRTX0NPVU5UOyBpKyspIHsKLQkJCQl1aW50MzJfdCBzdGF0c19oaWdo LCBzdGF0c19sb3csIHN0YXRzX2hpZ2hfMjsKKwkJcHJpbnRmKCJpbnRlbC1ncHUtdG9wIC0gJTQu MGYvJTQuMGYgTUh6OyAgJTMuMGYlJSBSQzY7ICU2LjBmbVc7ICU4LjBmIGlycXMvc1xuIiwKKwkJ ICAgICAgIGZyZXFbMF0sIGZyZXFbMV0sIHJjNiwgcG93ZXIsIGlycSk7CisJCWxpbmVzKys7CiAK LQkJCQlkbyB7Ci0JCQkJCXN0YXRzX2hpZ2ggPSBJTlJFRyhzdGF0c19yZWdzW2ldICsgNCk7Ci0J CQkJCXN0YXRzX2xvdyA9IElOUkVHKHN0YXRzX3JlZ3NbaV0pOwotCQkJCQlzdGF0c19oaWdoXzIg PSBJTlJFRyhzdGF0c19yZWdzW2ldICsgNCk7Ci0JCQkJfSB3aGlsZSAoc3RhdHNfaGlnaCAhPSBz dGF0c19oaWdoXzIpOworCQlwcmludGYoIlxuIik7CisJCWxpbmVzKys7CiAKLQkJCQlzdGF0c1tp XSA9ICh1aW50NjRfdClzdGF0c19oaWdoIDw8IDMyIHwKLQkJCQkJc3RhdHNfbG93OwotCQkJfQot CQl9CisJCWZvciAoaSA9IDA7IGkgPCBlbmdpbmVzLT5udW1fZW5naW5lcyAmJiBsaW5lcyA8IGNv bl9oOyBpKyspIHsKKwkJCXN0cnVjdCBlbmdpbmUgKmVuZ2luZSA9IGVuZ2luZV9wdHIoZW5naW5l cywgaSk7CisJCQl1bnNpZ25lZCBpbnQgbWF4X3cgPSBjb25fdyAtIDE7CisJCQl1bnNpZ25lZCBp bnQgbGVuOworCQkJZG91YmxlIHZhbFsyXTsKKwkJCWNoYXIgYnVmWzEyOF07CiAKLQkJcXNvcnQo dG9wX2JpdHNfc29ydGVkLCBudW1faW5zdGRvbmVfYml0cywKLQkJICAgICAgc2l6ZW9mKHN0cnVj dCB0b3BfYml0ICopLCB0b3BfYml0c19zb3J0KTsKLQotCQkvKiBMaW1pdCB0aGUgbnVtYmVyIG9m IGxpbmVzIHByaW50ZWQgdG8gdGhlIHRlcm1pbmFsIGhlaWdodCBzbyB0aGUKLQkJICogbW9zdCBp bXBvcnRhbnQgaW5mbyAoYXQgdGhlIHRvcCkgd2lsbCBzdGF5IG9uIHNjcmVlbi4gKi8KLQkJbWF4 X2xpbmVzID0gLTE7Ci0JCWlmIChpb2N0bCgwLCBUSU9DR1dJTlNaLCAmd3MpICE9IC0xKQotCQkJ bWF4X2xpbmVzID0gd3Mud3Nfcm93IC0gNjsgLyogZXhjbHVkZSBoZWFkZXIgbGluZXMgKi8KLQkJ aWYgKG1heF9saW5lcyA+PSBudW1faW5zdGRvbmVfYml0cykKLQkJCW1heF9saW5lcyA9IG51bV9p bnN0ZG9uZV9iaXRzOwotCi0JCXQyID0gZ2V0dGltZSgpOwotCQllbGFwc2VkX3RpbWUgKz0gKHQy IC0gdDEpIC8gMTAwMDAwMC4wOwotCi0JCWlmIChpbnRlcmFjdGl2ZSkgewotCQkJcHJpbnRmKCIl cyIsIGNsZWFyX3NjcmVlbik7Ci0JCQlwcmludF9jbG9ja19pbmZvKHBjaV9kZXYpOwotCi0JCQly aW5nX3ByaW50KCZyZW5kZXJfcmluZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMpOwotCQkJcmluZ19w cmludCgmYnNkX3JpbmcsIGxhc3Rfc2FtcGxlc19wZXJfc2VjKTsKLQkJCXJpbmdfcHJpbnQoJmJz ZDZfcmluZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMpOwotCQkJcmluZ19wcmludCgmYmx0X3Jpbmcs IGxhc3Rfc2FtcGxlc19wZXJfc2VjKTsKLQotCQkJcHJpbnRmKCJcbiUzMHMgICVzXG4iLCAidGFz ayIsICJwZXJjZW50IGJ1c3kiKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBtYXhfbGluZXM7IGkrKykg ewotCQkJCWlmICh0b3BfYml0c19zb3J0ZWRbaV0tPmNvdW50ID4gMCkgewotCQkJCQlwZXJjZW50 ID0gKHRvcF9iaXRzX3NvcnRlZFtpXS0+Y291bnQgKiAxMDApIC8KLQkJCQkJCWxhc3Rfc2FtcGxl c19wZXJfc2VjOwotCQkJCQlsZW4gPSBwcmludGYoIiUzMHM6ICUzZCUlOiAiLAotCQkJCQkJCSB0 b3BfYml0c19zb3J0ZWRbaV0tPmJpdC0+bmFtZSwKLQkJCQkJCQkgcGVyY2VudCk7Ci0JCQkJCXBy aW50X3BlcmNlbnRhZ2VfYmFyIChwZXJjZW50LCBsZW4pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBy aW50ZigiJSpzIiwgUEVSQ0VOVEFHRV9CQVJfRU5ELCAiIik7Ci0JCQkJfQotCi0JCQkJaWYgKGkg PCBTVEFUU19DT1VOVCAmJiBIQVNfU1RBVFNfUkVHUyhkZXZpZCkpIHsKLQkJCQkJcHJpbnRmKCIl MTNzOiAlbGx1ICglbGxkL3NlYykiLAotCQkJCQkJICAgc3RhdHNfcmVnX25hbWVzW2ldLAotCQkJ CQkJICAgKGxvbmcgbG9uZylzdGF0c1tpXSwKLQkJCQkJCSAgIChsb25nIGxvbmcpKHN0YXRzW2ld IC0gbGFzdF9zdGF0c1tpXSkpOwotCQkJCQlsYXN0X3N0YXRzW2ldID0gc3RhdHNbaV07Ci0JCQkJ fSBlbHNlIHsKLQkJCQkJaWYgKCF0b3BfYml0c19zb3J0ZWRbaV0tPmNvdW50KQotCQkJCQkJYnJl YWs7Ci0JCQkJfQotCQkJCXByaW50ZigiXG4iKTsKLQkJCX0KLQkJfQotCQlpZiAob3V0cHV0KSB7 Ci0JCQkvKiBQcmludCBoZWFkZXJzIGZvciBjb2x1bW5zIGF0IGZpcnN0IHJ1biAqLwotCQkJaWYg KHByaW50X2hlYWRlcnMpIHsKLQkJCQlmcHJpbnRmKG91dHB1dCwgIiMgdGltZVx0Iik7Ci0JCQkJ cmluZ19wcmludF9oZWFkZXIob3V0cHV0LCAmcmVuZGVyX3JpbmcpOwotCQkJCXJpbmdfcHJpbnRf aGVhZGVyKG91dHB1dCwgJmJzZF9yaW5nKTsKLQkJCQlyaW5nX3ByaW50X2hlYWRlcihvdXRwdXQs ICZic2Q2X3JpbmcpOwotCQkJCXJpbmdfcHJpbnRfaGVhZGVyKG91dHB1dCwgJmJsdF9yaW5nKTsK LQkJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9UT1BfQklUUzsgaSsrKSB7Ci0JCQkJCWlmIChp IDwgU1RBVFNfQ09VTlQgJiYgSEFTX1NUQVRTX1JFR1MoZGV2aWQpKSB7Ci0JCQkJCQlmcHJpbnRm KG91dHB1dCwgIiUuNnNcdCIsCi0JCQkJCQkJICAgc3RhdHNfcmVnX25hbWVzW2ldCi0JCQkJCQkJ ICAgKTsKLQkJCQkJfQotCQkJCQlpZiAoIXRvcF9iaXRzW2ldLmNvdW50KQotCQkJCQkJY29udGlu dWU7Ci0JCQkJfQotCQkJCWZwcmludGYob3V0cHV0LCAiXG4iKTsKLQkJCQlwcmludF9oZWFkZXJz ID0gMDsKLQkJCX0KLQotCQkJLyogUHJpbnQgc3RhdGlzdGljcyAqLwotCQkJZnByaW50ZihvdXRw dXQsICIlLjJmXHQiLCBlbGFwc2VkX3RpbWUpOwotCQkJcmluZ19sb2coJnJlbmRlcl9yaW5nLCBs YXN0X3NhbXBsZXNfcGVyX3NlYywgb3V0cHV0KTsKLQkJCXJpbmdfbG9nKCZic2RfcmluZywgbGFz dF9zYW1wbGVzX3Blcl9zZWMsIG91dHB1dCk7Ci0JCQlyaW5nX2xvZygmYnNkNl9yaW5nLCBsYXN0 X3NhbXBsZXNfcGVyX3NlYywgb3V0cHV0KTsKLQkJCXJpbmdfbG9nKCZibHRfcmluZywgbGFzdF9z YW1wbGVzX3Blcl9zZWMsIG91dHB1dCk7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1RP UF9CSVRTOyBpKyspIHsKLQkJCQlpZiAoaSA8IFNUQVRTX0NPVU5UICYmIEhBU19TVEFUU19SRUdT KGRldmlkKSkgewotCQkJCQlmcHJpbnRmKG91dHB1dCwgIiUiUFJJdTY0Ilx0IiwKLQkJCQkJCSAg IHN0YXRzW2ldIC0gbGFzdF9zdGF0c1tpXSk7Ci0JCQkJCWxhc3Rfc3RhdHNbaV0gPSBzdGF0c1tp XTsKLQkJCQl9Ci0JCQkJCWlmICghdG9wX2JpdHNbaV0uY291bnQpCi0JCQkJCQljb250aW51ZTsK LQkJCX0KLQkJCWZwcmludGYob3V0cHV0LCAiXG4iKTsKLQkJCWZmbHVzaChvdXRwdXQpOwotCQl9 CisJCQl2YWxbMF0gPSBwbXVfY2FsYygmZW5naW5lLT53YWl0LnZhbCwgMWU5LCB0LCAxMDApOwor CQkJdmFsWzFdID0gcG11X2NhbGMoJmVuZ2luZS0+c2VtYS52YWwsIDFlOSwgdCwgMTAwKTsKKwkJ CWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJICAgICAgICIlNi4yZiUlIHdh aXQsICU2LjJmJSUgc2VtYSIsCisJCQkJICAgICAgIHZhbFswXSwgdmFsWzFdKTsKIAotCQlmb3Ig KGkgPSAwOyBpIDwgbnVtX2luc3Rkb25lX2JpdHM7IGkrKykgewotCQkJdG9wX2JpdHNfc29ydGVk W2ldLT5jb3VudCA9IDA7CisJCQl2YWxbMF0gPSBwbXVfY2FsYygmZW5naW5lLT5idXN5LnZhbCwg MWU5LCB0LCAxMDApOworCQkJbGVuICs9IHByaW50ZigiJThzICU2LjJmJSUgIiwKKwkJCQkgICAg ICBlbmdpbmUtPm5hbWUsIHZhbFswXSk7CisJCQlwcmludF9wZXJjZW50YWdlX2Jhcih2YWxbMF0s IG1heF93IC0gbGVuKTsKIAotCQkJaWYgKGkgPCBTVEFUU19DT1VOVCkKLQkJCQlsYXN0X3N0YXRz W2ldID0gc3RhdHNbaV07Ci0JCX0KKwkJCXByaW50ZigiJXNcbiIsIGJ1Zik7CiAKLQkJLyogQ2hl Y2sgaWYgY2hpbGQgaGFzIGdvbmUgKi8KLQkJaWYgKGNoaWxkX3BpZCA+IDApIHsKLQkJCWludCBy ZXM7Ci0JCQlpZiAoKHJlcyA9IHdhaXRwaWQoY2hpbGRfcGlkLCAmY2hpbGRfc3RhdCwgV05PSEFO RykpID09IC0xKSB7Ci0JCQkJcGVycm9yKCJ3YWl0cGlkIik7Ci0JCQkJZXhpdCgxKTsKLQkJCX0K LQkJCWlmIChyZXMgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChXSUZFWElURUQoY2hpbGRf c3RhdCkpCi0JCQkJYnJlYWs7CisJCQlsaW5lcysrOwogCQl9Ci0JfQogCi0JZmNsb3NlKG91dHB1 dCk7CisJCXByaW50ZigiXG4iKTsKKwl9CiAKLQlpbnRlbF9yZWdpc3Rlcl9hY2Nlc3NfZmluaSgp OwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWVzb24uYnVpbGQgYi90b29scy9t ZXNvbi5idWlsZAppbmRleCBiZDJkMzEzZDUxNTYuLmE5MThlZWIwYmVmMSAxMDA2NDQKLS0tIGEv dG9vbHMvbWVzb24uYnVpbGQKKysrIGIvdG9vbHMvbWVzb24uYnVpbGQKQEAgLTIzLDcgKzIzLDYg QEAgdG9vbHNfcHJvZ3MgPSBbCiAJJ2ludGVsX2dwdV9mcmVxdWVuY3knLAogCSdpbnRlbF9maXJt d2FyZV9kZWNvZGUnLAogCSdpbnRlbF9ncHVfdGltZScsCi0JJ2ludGVsX2dwdV90b3AnLAogCSdp bnRlbF9ndHQnLAogCSdpbnRlbF9ndWNfbG9nZ2VyJywKIAknaW50ZWxfaW5mb2ZyYW1lcycsCkBA IC0xMTcsNiArMTE2LDExIEBAIHNoYXJlZF9saWJyYXJ5KCdpbnRlbF9hdWJkdW1wJywgJ2F1YmR1 bXAuYycsCiAJICAgICAgIG5hbWVfcHJlZml4IDogJycsCiAJICAgICAgIGluc3RhbGwgOiB0cnVl KQogCitleGVjdXRhYmxlKCdpbnRlbF9ncHVfdG9wJywgJ2ludGVsX2dwdV90b3AuYycsCisJICAg aW5zdGFsbCA6IHRydWUsCisJICAgaW5zdGFsbF9ycGF0aCA6IHJwYXRoZGlyLAorCSAgIGRlcGVu ZGVuY2llcyA6IHRvb2xfZGVwcyArIFsgbGliX2lndF9wZXJmIF0pCisKIGNvbmZfZGF0YSA9IGNv bmZpZ3VyYXRpb25fZGF0YSgpCiBjb25mX2RhdGEuc2V0KCdwcmVmaXgnLCBwcmVmaXgpCiBjb25m X2RhdGEuc2V0KCdleGVjX3ByZWZpeCcsICcke3ByZWZpeH0nKQotLSAKMi4xNC4xCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGlu ZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Tvrtko Ursulin Date: Wed, 28 Mar 2018 19:29:48 +0100 Message-Id: <20180328182948.27494-1-tvrtko.ursulin@linux.intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [RFC i-g-t] 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: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: igt-dev@lists.freedesktop.org Cc: Intel-gfx@lists.freedesktop.org List-ID: RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KCmludGVsLWdw dS10b3AgaXMgYSBkYW5nZXJvdXMgdG9vbCB3aGljaCBjYW4gaGFuZyBtYWNoaW5lcyBkdWUgdW5z YWZlIG1taW8KcmVnaXN0ZXIgYWNjZXNzLiBUaGlzIHBhdGNoIHJld3JpdGVzIGl0IHRvIHVzZSBv bmx5IFBNVS4KCk9ubHkgb3ZlcmFsbCBjb21tYW5kIHN0cmVhbWVyIGJ1c3luZXNzIGFuZCBHUFUg Z2xvYmFsIGRhdGEgc3VjaCBhcyBwb3dlcgphbmQgZnJlcXVlbmNpZXMgYXJlIGluY2x1ZGVkIGlu IHRoaXMgbmV3IHZlcnNpb24uCgpGb3IgYWNjZXNzIHRvIG1vcmUgR1BVIGZ1bmN0aW9uYWwgdW5p dCBsZXZlbCBkYXRhLCBhbiBPQSBtZXRyaWMgYmFzZWQgdG9vbApsaWtlIGdwdS10b3Agc2hvdWxk IGJlIHVzZWQgaW5zdGVhZC4KClNpZ25lZC1vZmYtYnk6IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28u dXJzdWxpbkBpbnRlbC5jb20+CkNjOiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5j by51az4KQ2M6IExpb25lbCBMYW5kd2VybGluIDxsaW9uZWwuZy5sYW5kd2VybGluQGludGVsLmNv bT4KQ2M6IFBldHJpIExhdHZhbGEgPHBldHJpLmxhdHZhbGFAaW50ZWwuY29tPgotLS0KIHRvb2xz L01ha2VmaWxlLmFtICAgICB8ICAgMiArCiB0b29scy9pbnRlbF9ncHVfdG9wLmMgfCA5ODIgKysr KysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHRvb2xzL21l c29uLmJ1aWxkICAgICB8ICAgNiArLQogMyBmaWxlcyBjaGFuZ2VkLCA0MTMgaW5zZXJ0aW9ucygr KSwgNTc3IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3Rvb2xzL01ha2VmaWxlLmFtIGIvdG9v bHMvTWFrZWZpbGUuYW0KaW5kZXggMDliNmRiY2MzZWNlLi5hMGIwMTZkZGQ3ZmYgMTAwNjQ0Ci0t LSBhL3Rvb2xzL01ha2VmaWxlLmFtCisrKyBiL3Rvb2xzL01ha2VmaWxlLmFtCkBAIC0yOCw2ICsy OCw4IEBAIGludGVsX2F1YmR1bXBfbGFfTERGTEFHUyA9IC1tb2R1bGUgLWF2b2lkLXZlcnNpb24g LW5vLXVuZGVmaW5lZAogaW50ZWxfYXViZHVtcF9sYV9TT1VSQ0VTID0gYXViZHVtcC5jCiBpbnRl bF9hdWJkdW1wX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvbGliaW50ZWxfdG9vbHMu bGEgLWxkbAogCitpbnRlbF9ncHVfdG9wX0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9saWJp Z3RfcGVyZi5sYQorCiBiaW5fU0NSSVBUUyA9IGludGVsX2F1YmR1bXAKIENMRUFORklMRVMgPSAk KGJpbl9TQ1JJUFRTKQogCmRpZmYgLS1naXQgYS90b29scy9pbnRlbF9ncHVfdG9wLmMgYi90b29s cy9pbnRlbF9ncHVfdG9wLmMKaW5kZXggMDk4ZTZjZTNmZjg2Li40ZWVmNjM0ZWI0MzYgMTAwNjQ0 Ci0tLSBhL3Rvb2xzL2ludGVsX2dwdV90b3AuYworKysgYi90b29scy9pbnRlbF9ncHVfdG9wLmMK QEAgLTEsNiArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IMKpIDIwMDcgSW50ZWwgQ29ycG9yYXRp b24KLSAqIENvcHlyaWdodCDCqSAyMDExIEludGVsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQg wqkgMjAxOCBJbnRlbCBDb3Jwb3JhdGlvbgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdy YW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgKiBjb3B5 IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhl ICJTb2Z0d2FyZSIpLApAQCAtMTgsNzAxICsxNyw1MzIgQEAKICAqIEZJVE5FU1MgRk9SIEEgUEFS VElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAog ICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xB SU0sIERBTUFHRVMgT1IgT1RIRVIKICAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04g T0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCi0gKiBGUk9NLCBPVVQgT0Yg T1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCi0g KiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICogQXV0aG9yczoKLSAqICAgIEVyaWMg QW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+Ci0gKiAgICBFdWdlbmkgRG9kb25vdiA8ZXVnZW5pLmRv ZG9ub3ZAaW50ZWwuY29tPgotICoKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJ VEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBT T0ZUV0FSRS4KICAqLwogCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxpbnR0eXBl cy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUg PHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJyLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5j bHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy90 eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1 ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2lmZGVmIEhBVkVfVEVSTUlPU19I Ci0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2VuZGlmCi0jaW5jbHVkZSAiaW50ZWxfaW8uaCIKLSNp bmNsdWRlICJpbnN0ZG9uZS5oIgotI2luY2x1ZGUgImludGVsX3JlZy5oIgotI2luY2x1ZGUgImlu dGVsX2NoaXBzZXQuaCIKLSNpbmNsdWRlICJkcm10ZXN0LmgiCi0KLSNkZWZpbmUgIEZPUkNFV0FL RQkgICAgMHhBMThDCi0jZGVmaW5lICBGT1JDRVdBS0VfQUNLCSAgICAweDEzMDA5MAotCi0jZGVm aW5lIFNBTVBMRVNfUEVSX1NFQyAgICAgICAgICAgICAxMDAwMAotI2RlZmluZSBTQU1QTEVTX1RP X1BFUkNFTlRfUkFUSU8gICAgKFNBTVBMRVNfUEVSX1NFQyAvIDEwMCkKLQotI2RlZmluZSBNQVhf TlVNX1RPUF9CSVRTICAgICAgICAgICAgMTAwCi0KLSNkZWZpbmUgSEFTX1NUQVRTX1JFR1MoZGV2 aWQpCQlJU185NjUoZGV2aWQpCi0KLXN0cnVjdCB0b3BfYml0IHsKLQlzdHJ1Y3QgaW5zdGRvbmVf Yml0ICpiaXQ7Ci0JaW50IGNvdW50OwotfSB0b3BfYml0c1tNQVhfTlVNX1RPUF9CSVRTXTsKLXN0 cnVjdCB0b3BfYml0ICp0b3BfYml0c19zb3J0ZWRbTUFYX05VTV9UT1BfQklUU107Ci0KLXN0YXRp YyB1aW50MzJfdCBpbnN0ZG9uZSwgaW5zdGRvbmUxOwotCi1zdGF0aWMgY29uc3QgY2hhciAqYmFy c1tdID0gewotCSIgIiwKLQki4paPIiwKLQki4paOIiwKLQki4paNIiwKLQki4paMIiwKLQki4paL IiwKLQki4paKIiwKLQki4paJIiwKLQki4paIIgotfTsKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2lu Y2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0 Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUg PHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2lu Y2x1ZGUgPGxvY2FsZS5oPgorCisjaW5jbHVkZSAiaWd0X3BlcmYuaCIKIAotZW51bSBzdGF0c19j b3VudHMgewotCUlBX1ZFUlRJQ0VTLAotCUlBX1BSSU1JVElWRVMsCi0JVlNfSU5WT0NBVElPTiwK LQlHU19JTlZPQ0FUSU9OLAotCUdTX1BSSU1JVElWRVMsCi0JQ0xfSU5WT0NBVElPTiwKLQlDTF9Q UklNSVRJVkVTLAotCVBTX0lOVk9DQVRJT04sCi0JUFNfREVQVEgsCi0JU1RBVFNfQ09VTlQKK3N0 cnVjdCBwbXVfcGFpciB7CisJdWludDY0X3QgY3VyOworCXVpbnQ2NF90IHByZXY7CiB9OwogCi1j b25zdCB1aW50MzJfdCBzdGF0c19yZWdzW1NUQVRTX0NPVU5UXSA9IHsKLQlJQV9WRVJUSUNFU19D T1VOVF9RVywKLQlJQV9QUklNSVRJVkVTX0NPVU5UX1FXLAotCVZTX0lOVk9DQVRJT05fQ09VTlRf UVcsCi0JR1NfSU5WT0NBVElPTl9DT1VOVF9RVywKLQlHU19QUklNSVRJVkVTX0NPVU5UX1FXLAot CUNMX0lOVk9DQVRJT05fQ09VTlRfUVcsCi0JQ0xfUFJJTUlUSVZFU19DT1VOVF9RVywKLQlQU19J TlZPQ0FUSU9OX0NPVU5UX1FXLAotCVBTX0RFUFRIX0NPVU5UX1FXLAorc3RydWN0IHBtdV9jb3Vu dGVyIHsKKwl1aW50NjRfdCBjb25maWc7CisJdW5zaWduZWQgaW50IGlkeDsKKwlzdHJ1Y3QgcG11 X3BhaXIgdmFsOwogfTsKIAotY29uc3QgY2hhciAqc3RhdHNfcmVnX25hbWVzW1NUQVRTX0NPVU5U XSA9IHsKLQkidmVydCBmZXRjaCIsCi0JInByaW0gZmV0Y2giLAotCSJWUyBpbnZvY2F0aW9ucyIs Ci0JIkdTIGludm9jYXRpb25zIiwKLQkiR1MgcHJpbXMiLAotCSJDTCBpbnZvY2F0aW9ucyIsCi0J IkNMIHByaW1zIiwKLQkiUFMgaW52b2NhdGlvbnMiLAotCSJQUyBkZXB0aCBwYXNzIiwKK3N0cnVj dCBlbmdpbmUgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHBtdV9jb3VudGVyIGJ1c3k7 CisJc3RydWN0IHBtdV9jb3VudGVyIHdhaXQ7CisJc3RydWN0IHBtdV9jb3VudGVyIHNlbWE7CiB9 OwogCi11aW50NjRfdCBzdGF0c1tTVEFUU19DT1VOVF07Ci11aW50NjRfdCBsYXN0X3N0YXRzW1NU QVRTX0NPVU5UXTsKK3N0cnVjdCBlbmdpbmVzIHsKKwl1bnNpZ25lZCBpbnQgbnVtX2VuZ2luZXM7 CisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKwlESVIgKnJvb3Q7CisJaW50IGZkOworCXN0 cnVjdCBwbXVfcGFpciB0czsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldHRpbWUodm9pZCkK LXsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0OwotICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0g ICAgcmV0dXJuICh0LnR2X3VzZWMgKyAodC50dl9zZWMgKiAxMDAwMDAwKSk7Ci19CisJaW50IHJh cGxfZmQ7CisJZG91YmxlIHJhcGxfc2NhbGU7CiAKLXN0YXRpYyBpbnQKLXRvcF9iaXRzX3NvcnQo Y29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKKwlzdHJ1Y3QgcG11X2NvdW50ZXIgZnJlcV9y ZXE7CisJc3RydWN0IHBtdV9jb3VudGVyIGZyZXFfYWN0OworCXN0cnVjdCBwbXVfY291bnRlciBp cnE7CisJc3RydWN0IHBtdV9jb3VudGVyIHJjNjsKKwlzdHJ1Y3QgcG11X2NvdW50ZXIgcmFwbDsK KworCXN0cnVjdCBlbmdpbmUgZW5naW5lOworfTsKKworc3RhdGljIHVpbnQ2NF90CitnZXRfcG11 X2NvbmZpZyhpbnQgZGlyZmQsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmNvdW50ZXIp CiB7Ci0Jc3RydWN0IHRvcF9iaXQgKiBjb25zdCAqYml0X2EgPSBhOwotCXN0cnVjdCB0b3BfYml0 ICogY29uc3QgKmJpdF9iID0gYjsKLQlpbnQgYV9jb3VudCA9ICgqYml0X2EpLT5jb3VudDsKLQlp bnQgYl9jb3VudCA9ICgqYml0X2IpLT5jb3VudDsKKwljaGFyIGJ1ZlsxMjhdLCAqcDsKKwlpbnQg ZmQsIHJldDsKIAotCWlmIChhX2NvdW50IDwgYl9jb3VudCkKLQkJcmV0dXJuIDE7Ci0JZWxzZSBp ZiAoYV9jb3VudCA9PSBiX2NvdW50KQotCQlyZXR1cm4gMDsKLQllbHNlCisJcmV0ID0gc25wcmlu dGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzLSVzIiwgbmFtZSwgY291bnRlcik7CisJaWYgKHJldCA8 IDAgfHwgcmV0ID09IHNpemVvZihidWYpKQogCQlyZXR1cm4gLTE7Ci19CiAKLXN0YXRpYyB2b2lk Ci11cGRhdGVfaWRsZV9iaXQoc3RydWN0IHRvcF9iaXQgKnRvcF9iaXQpCi17Ci0JdWludDMyX3Qg cmVnX3ZhbDsKKwlmZCA9IG9wZW5hdChkaXJmZCwgYnVmLCBPX1JET05MWSk7CisJaWYgKGZkIDwg MCkKKwkJcmV0dXJuIC0xOwogCi0JaWYgKHRvcF9iaXQtPmJpdC0+cmVnID09IElOU1RET05FXzEp Ci0JCXJlZ192YWwgPSBpbnN0ZG9uZTE7Ci0JZWxzZQotCQlyZWdfdmFsID0gaW5zdGRvbmU7CisJ cmV0ID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7CisJY2xvc2UoZmQpOworCWlmIChyZXQg PD0gMCkKKwkJcmV0dXJuIC0xOwogCi0JaWYgKChyZWdfdmFsICYgdG9wX2JpdC0+Yml0LT5iaXQp ID09IDApCi0JCXRvcF9iaXQtPmNvdW50Kys7Ci19CisJcCA9IGluZGV4KGJ1ZiwgJzAnKTsKKwlp ZiAoIXApCisJCXJldHVybiAtMTsKIAotc3RhdGljIHZvaWQKLXByaW50X2Nsb2NrKGNvbnN0IGNo YXIgKm5hbWUsIGludCBjbG9jaykgewotCWlmIChjbG9jayA9PSAtMSkKLQkJcHJpbnRmKCIlcyBj bG9jazogdW5rbm93biIsIG5hbWUpOwotCWVsc2UKLQkJcHJpbnRmKCIlcyBjbG9jazogJWQgTWh6 IiwgbmFtZSwgY2xvY2spOworCXJldHVybiBzdHJ0b3VsKHAsIE5VTEwsIDApOwogfQogCi1zdGF0 aWMgaW50Ci1wcmludF9jbG9ja19pbmZvKHN0cnVjdCBwY2lfZGV2aWNlICpwY2lfZGV2KQorI2Rl ZmluZSBlbmdpbmVfcHRyKGVuZ2luZXMsIG4pIFwKKwkoKHN0cnVjdCBlbmdpbmUgKikoKHVuc2ln bmVkIGNoYXIgKikoJmVuZ2luZXMtPmVuZ2luZSkgKyAobikgKiBzaXplb2Yoc3RydWN0IGVuZ2lu ZSkpKQorCitzdGF0aWMgc3RydWN0IGVuZ2luZXMgKmRpc2NvdmVyX2VuZ2luZXModm9pZCkKIHsK LQl1aW50MzJfdCBkZXZpZCA9IHBjaV9kZXYtPmRldmljZV9pZDsKLQl1aW50MTZfdCBnY2ZnYzsK Kwljb25zdCBjaGFyICpzeXNmc19yb290ID0gIi9zeXMvZGV2aWNlcy9pOTE1L2V2ZW50cyI7CisJ c3RydWN0IGVuZ2luZXMgKmVuZ2luZXM7CisJc3RydWN0IGRpcmVudCAqZGVudDsKKwlpbnQgcmV0 ID0gMDsKKwlESVIgKmQ7CiAKLQlpZiAoSVNfR000NShkZXZpZCkpIHsKLQkJaW50IGNvcmVfY2xv Y2sgPSAtMTsKKwllbmdpbmVzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgZW5naW5lcykpOworCWlm ICghZW5naW5lcykKKwkJcmV0dXJuIE5VTEw7CiAKLQkJcGNpX2RldmljZV9jZmdfcmVhZF91MTYo cGNpX2RldiwgJmdjZmdjLCBJOTE1X0dDRkdDKTsKKwltZW1zZXQoZW5naW5lcywgMCwgc2l6ZW9m KCplbmdpbmVzKSk7CiAKLQkJc3dpdGNoIChnY2ZnYyAmIDB4ZikgewotCQljYXNlIDg6Ci0JCQlj b3JlX2Nsb2NrID0gMjY2OwotCQkJYnJlYWs7Ci0JCWNhc2UgOToKLQkJCWNvcmVfY2xvY2sgPSAz MjA7Ci0JCQlicmVhazsKLQkJY2FzZSAxMToKLQkJCWNvcmVfY2xvY2sgPSA0MDA7Ci0JCQlicmVh azsKLQkJY2FzZSAxMzoKLQkJCWNvcmVfY2xvY2sgPSA1MzM7Ci0JCQlicmVhazsKLQkJfQotCQlw cmludF9jbG9jaygiY29yZSIsIGNvcmVfY2xvY2spOwotCX0gZWxzZSBpZiAoSVNfOTY1KGRldmlk KSAmJiBJU19NT0JJTEUoZGV2aWQpKSB7Ci0JCWludCByZW5kZXJfY2xvY2sgPSAtMSwgc2FtcGxl cl9jbG9jayA9IC0xOworCWVuZ2luZXMtPm51bV9lbmdpbmVzID0gMDsKIAotCQlwY2lfZGV2aWNl X2NmZ19yZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2MsIEk5MTVfR0NGR0MpOworCWQgPSBvcGVuZGly KHN5c2ZzX3Jvb3QpOworCWlmICghZCkKKwkJcmV0dXJuIE5VTEw7CiAKLQkJc3dpdGNoIChnY2Zn YyAmIDB4ZikgewotCQljYXNlIDI6Ci0JCQlyZW5kZXJfY2xvY2sgPSAyNTA7IHNhbXBsZXJfY2xv Y2sgPSAyNjc7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJcmVuZGVyX2Nsb2NrID0gMzIwOyBz YW1wbGVyX2Nsb2NrID0gMzMzOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCXJlbmRlcl9jbG9j ayA9IDQwMDsgc2FtcGxlcl9jbG9jayA9IDQ0NDsKLQkJCWJyZWFrOwotCQljYXNlIDU6Ci0JCQly ZW5kZXJfY2xvY2sgPSA1MDA7IHNhbXBsZXJfY2xvY2sgPSA1MzM7CisJd2hpbGUgKChkZW50ID0g cmVhZGRpcihkKSkgIT0gTlVMTCkgeworCQljb25zdCBjaGFyICplbmRzd2l0aCA9ICItYnVzeSI7 CisJCWNvbnN0IHVuc2lnbmVkIGludCBlbmRsZW4gPSBzdHJsZW4oZW5kc3dpdGgpOworCQlzdHJ1 Y3QgZW5naW5lICplbmdpbmUgPQorCQkJCWVuZ2luZV9wdHIoZW5naW5lcywgZW5naW5lcy0+bnVt X2VuZ2luZXMpOworCQljaGFyIGJ1ZlsyNTZdOworCisJCWlmIChkZW50LT5kX3R5cGUgIT0gRFRf UkVHKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmxlbihkZW50LT5kX25hbWUpID49IHNpemVv ZihidWYpKSB7CisJCQlyZXQgPSAtMTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJcHJpbnRfY2xvY2so InJlbmRlciIsIHJlbmRlcl9jbG9jayk7Ci0JCXByaW50ZigiICAiKTsKLQkJcHJpbnRfY2xvY2so InNhbXBsZXIiLCBzYW1wbGVyX2Nsb2NrKTsKLQl9IGVsc2UgaWYgKElTXzk0NShkZXZpZCkgJiYg SVNfTU9CSUxFKGRldmlkKSkgewotCQlpbnQgcmVuZGVyX2Nsb2NrID0gLTEsIGRpc3BsYXlfY2xv Y2sgPSAtMTsKKwkJc3RyY3B5KGJ1ZiwgZGVudC0+ZF9uYW1lKTsKIAotCQlwY2lfZGV2aWNlX2Nm Z19yZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2MsIEk5MTVfR0NGR0MpOworCQkvKiB4eHhOLWJ1c3kg Ki8KKwkJaWYgKHN0cmxlbihidWYpIDwgKGVuZGxlbiArIDQpKQorCQkJY29udGludWU7CisJCWlm IChzdHJjbXAoJmJ1ZltzdHJsZW4oYnVmKSAtIGVuZGxlbl0sIGVuZHN3aXRoKSkKKwkJCWNvbnRp bnVlOwogCi0JCXN3aXRjaCAoZ2NmZ2MgJiAweDcpIHsKLQkJY2FzZSAwOgotCQkJcmVuZGVyX2Ns b2NrID0gMTY2OwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXJlbmRlcl9jbG9jayA9IDIwMDsK LQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlyZW5kZXJfY2xvY2sgPSAyNTA7Ci0JCQlicmVhazsK LQkJY2FzZSA1OgotCQkJcmVuZGVyX2Nsb2NrID0gNDAwOworCQltZW1zZXQoZW5naW5lLCAwLCBz aXplb2YoKmVuZ2luZSkpOworCisJCWJ1ZltzdHJsZW4oYnVmKSAtIGVuZGxlbl0gPSAwOworCQll bmdpbmUtPm5hbWUgPSBzdHJkdXAoYnVmKTsKKwkJaWYgKCFlbmdpbmUtPm5hbWUpIHsKKwkJCXJl dCA9IC0xOwogCQkJYnJlYWs7CiAJCX0KIAotCQlzd2l0Y2ggKGdjZmdjICYgMHg3MCkgewotCQlj YXNlIDA6Ci0JCQlkaXNwbGF5X2Nsb2NrID0gMjAwOworCQllbmdpbmUtPmJ1c3kuY29uZmlnID0g Z2V0X3BtdV9jb25maWcoZGlyZmQoZCksIGVuZ2luZS0+bmFtZSwKKwkJCQkJCSAgICAgImJ1c3ki KTsKKwkJaWYgKGVuZ2luZS0+YnVzeS5jb25maWcgPT0gLTEpIHsKKwkJCXJldCA9IC0xOwogCQkJ YnJlYWs7Ci0JCWNhc2UgNDoKLQkJCWRpc3BsYXlfY2xvY2sgPSAzMjA7CisJCX0KKworCQllbmdp bmVzLT5udW1fZW5naW5lcysrOworCQllbmdpbmVzID0gcmVhbGxvYyhlbmdpbmVzLCBzaXplb2Yo c3RydWN0IGVuZ2luZXMpICsKKwkJCQkgIGVuZ2luZXMtPm51bV9lbmdpbmVzICogc2l6ZW9mKHN0 cnVjdCBlbmdpbmUpKTsKKwkJaWYgKCFlbmdpbmVzKSB7CisJCQlyZXQgPSAtRU5PTUVNOwogCQkJ YnJlYWs7CiAJCX0KLQkJaWYgKGdjZmdjICYgKDEgPDwgNykpCi0JCSAgICBkaXNwbGF5X2Nsb2Nr ID0gMTMzOworCX0KIAotCQlwcmludF9jbG9jaygicmVuZGVyIiwgcmVuZGVyX2Nsb2NrKTsKLQkJ cHJpbnRmKCIgICIpOwotCQlwcmludF9jbG9jaygiZGlzcGxheSIsIGRpc3BsYXlfY2xvY2spOwot CX0gZWxzZSBpZiAoSVNfOTE1KGRldmlkKSAmJiBJU19NT0JJTEUoZGV2aWQpKSB7Ci0JCWludCBy ZW5kZXJfY2xvY2sgPSAtMSwgZGlzcGxheV9jbG9jayA9IC0xOworCWlmIChyZXQpCisJCWZyZWUo ZW5naW5lcyk7CisJZWxzZQorCQllbmdpbmVzLT5yb290ID0gZDsKIAotCQlwY2lfZGV2aWNlX2Nm Z19yZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2MsIEk5MTVfR0NGR0MpOworCXJldHVybiByZXQgPT0g MCA/IGVuZ2luZXMgOiBOVUxMOworfQogCi0JCXN3aXRjaCAoZ2NmZ2MgJiAweDcpIHsKLQkJY2Fz ZSAwOgotCQkJcmVuZGVyX2Nsb2NrID0gMTYwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXJl bmRlcl9jbG9jayA9IDE5MDsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQlyZW5kZXJfY2xvY2sg PSAzMzM7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoZ2NmZ2MgJiAoMSA8PCAxMykpCi0JCSAgICBy ZW5kZXJfY2xvY2sgPSAxMzM7CitzdGF0aWMgaW50CitmaWxlbmFtZV90b19idWYoY29uc3QgY2hh ciAqZmlsZW5hbWUsIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZnNpemUpCit7CisJaW50IGZk OworCXNzaXplX3QgcmV0OwogCi0JCXN3aXRjaCAoZ2NmZ2MgJiAweDcwKSB7Ci0JCWNhc2UgMDoK LQkJCWRpc3BsYXlfY2xvY2sgPSAxOTA7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJZGlzcGxh eV9jbG9jayA9IDMzMzsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChnY2ZnYyAmICgxIDw8IDcpKQot CQkgICAgZGlzcGxheV9jbG9jayA9IDEzMzsKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZ KTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CiAKLQkJcHJpbnRfY2xvY2soInJlbmRlciIs IHJlbmRlcl9jbG9jayk7Ci0JCXByaW50ZigiICAiKTsKLQkJcHJpbnRfY2xvY2soImRpc3BsYXki LCBkaXNwbGF5X2Nsb2NrKTsKLQl9CisJcmV0ID0gcmVhZChmZCwgYnVmLCBidWZzaXplIC0gMSk7 CisJY2xvc2UoZmQpOworCWlmIChyZXQgPCAxKQorCQlyZXR1cm4gLTE7CiAKKwlidWZbcmV0XSA9 ICdcMCc7CiAKLQlwcmludGYoIlxuIik7Ci0JcmV0dXJuIC0xOworCXJldHVybiAwOwogfQogCi0j ZGVmaW5lIFNUQVRTX0xFTiAoMjApCi0jZGVmaW5lIFBFUkNFTlRBR0VfQkFSX0VORAkoNzkgLSBT VEFUU19MRU4pCitzdGF0aWMgdWludDY0X3QgZmlsZW5hbWVfdG9fdTY0KGNvbnN0IGNoYXIgKmZp bGVuYW1lLCBpbnQgYmFzZSkKK3sKKwljaGFyIGJ1Zls2NF0sICpiOwogCi1zdGF0aWMgdm9pZAot cHJpbnRfcGVyY2VudGFnZV9iYXIoZmxvYXQgcGVyY2VudCwgaW50IGN1cl9saW5lX2xlbikKKwlp ZiAoZmlsZW5hbWVfdG9fYnVmKGZpbGVuYW1lLCBidWYsIHNpemVvZihidWYpKSkKKwkJcmV0dXJu IDA7CisKKwkvKgorCSAqIEhhbmRsZSBib3RoIHNpbmdsZSBpbnRlZ2VyIGFuZCBrZXk9dmFsdWUg Zm9ybWF0cyBieSBza2lwcGluZworCSAqIGxlYWRpbmcgbm9uLWRpZ2l0cy4KKwkgKi8KKwliID0g YnVmOworCXdoaWxlICgqYiAmJiAhaXNkaWdpdCgqYikpCisJCWIrKzsKKworCXJldHVybiBzdHJ0 b3VsbChiLCBOVUxMLCBiYXNlKTsKK30KKworc3RhdGljIHVpbnQ2NF90IHJhcGxfdHlwZV9pZCh2 b2lkKQogewotCWludCBiYXJfYXZhaWxfbGVuID0gKFBFUkNFTlRBR0VfQkFSX0VORCAtIGN1cl9s aW5lX2xlbiAtIDEpICogODsKLQlpbnQgYmFyX2xlbiA9IGJhcl9hdmFpbF9sZW4gKiAocGVyY2Vu dCArIC41KSAvIDEwMC4wOwotCWludCBpOworCXJldHVybiBmaWxlbmFtZV90b191NjQoIi9zeXMv ZGV2aWNlcy9wb3dlci90eXBlIiwgMTApOworfQogCi0JZm9yIChpID0gYmFyX2xlbjsgaSA+PSA4 OyBpIC09IDgpIHsKLQkJcHJpbnRmKCIlcyIsIGJhcnNbOF0pOwotCQljdXJfbGluZV9sZW4rKzsK LQl9Ci0JaWYgKGkpIHsKLQkJcHJpbnRmKCIlcyIsIGJhcnNbaV0pOwotCQljdXJfbGluZV9sZW4r KzsKLQl9CitzdGF0aWMgdWludDY0X3QgcmFwbF9ncHVfcG93ZXIodm9pZCkKK3sKKwlyZXR1cm4g ZmlsZW5hbWVfdG9fdTY0KCIvc3lzL2RldmljZXMvcG93ZXIvZXZlbnRzL2VuZXJneS1ncHUiLCAw KTsKK30KKworc3RhdGljIGRvdWJsZSBmaWxlbmFtZV90b19kb3VibGUoY29uc3QgY2hhciAqZmls ZW5hbWUpCit7CisJY2hhciAqb2xkbG9jYWxlOworCWNoYXIgYnVmWzgwXTsKKwlkb3VibGUgdjsK KworCWlmIChmaWxlbmFtZV90b19idWYoZmlsZW5hbWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQorCQly ZXR1cm4gMDsKIAotCS8qIE5COiBXZSBjYW4ndCB1c2UgYSBmaWVsZCB3aWR0aCB3aXRoIHV0Zjgg c28gd2UgbWFudWFsbHkKLQkqIGd1YXJhbnRlZSBhIGZpZWxkIHdpdGggb2YgNDUgY2hhcnMgZm9y IGFueSBiYXIuICovCi0JcHJpbnRmKCIlKnMiLCBQRVJDRU5UQUdFX0JBUl9FTkQgLSBjdXJfbGlu ZV9sZW4sICIiKTsKKwlvbGRsb2NhbGUgPSBzZXRsb2NhbGUoTENfQUxMLCAiQyIpOworCXYgPSBz dHJ0b2QoYnVmLCBOVUxMKTsKKwlzZXRsb2NhbGUoTENfQUxMLCBvbGRsb2NhbGUpOworCisJcmV0 dXJuIHY7CiB9CiAKLXN0cnVjdCByaW5nIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXVpbnQzMl90 IG1taW87Ci0JaW50IGhlYWQsIHRhaWwsIHNpemU7Ci0JdWludDY0X3QgZnVsbDsKLQlpbnQgaWRs ZTsKLX07CitzdGF0aWMgZG91YmxlIHJhcGxfZ3B1X3Bvd2VyX3NjYWxlKHZvaWQpCit7CisJcmV0 dXJuIGZpbGVuYW1lX3RvX2RvdWJsZSgiL3N5cy9kZXZpY2VzL3Bvd2VyL2V2ZW50cy9lbmVyZ3kt Z3B1LnNjYWxlIik7Cit9CiAKLXN0YXRpYyB1aW50MzJfdCByaW5nX3JlYWQoc3RydWN0IHJpbmcg KnJpbmcsIHVpbnQzMl90IHJlZykKKyNkZWZpbmUgX19vcGVuX3BtdShlbmdpbmVzLCBwbXUsIGlk eCkgXAorKHsgXAorCWludCBmZF9fOyBcCitcCisJZmRfXyA9IHBlcmZfaTkxNV9vcGVuX2dyb3Vw KChwbXUpLT5jb25maWcsIChlbmdpbmVzKS0+ZmQpOyBcCisJaWYgKGZkX18gPj0gMCkgeyBcCisJ CWlmICgoZW5naW5lcyktPmZkID09IC0xKSBcCisJCQkoZW5naW5lcyktPmZkID0gZmRfXzsgXAor CQkocG11KS0+aWR4ID0gKGlkeCkrKzsgXAorCQkoZW5naW5lcyktPm51bV9jb3VudGVycysrOyBc CisJfSBcCitcCisJZmRfXzsgXAorfSkKKworc3RhdGljIGludCBwbXVfaW5pdChzdHJ1Y3QgZW5n aW5lcyAqZW5naW5lcykKIHsKLQlyZXR1cm4gSU5SRUcocmluZy0+bW1pbyArIHJlZyk7CisJdW5z aWduZWQgaW50IGlkeCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGZkOworCisJZW5naW5l cy0+ZmQgPSAtMTsKKwllbmdpbmVzLT5udW1fY291bnRlcnMgPSAwOworCisJZW5naW5lcy0+ZnJl cV9yZXEuY29uZmlnID0gSTkxNV9QTVVfUkVRVUVTVEVEX0ZSRVFVRU5DWTsKKwlmZCA9IF9fb3Bl bl9wbXUoZW5naW5lcywgJmVuZ2luZXMtPmZyZXFfcmVxLCBpZHgpOworCWlmIChmZCA8IDApCisJ CXJldHVybiAtMTsKKworCWVuZ2luZXMtPmZyZXFfYWN0LmNvbmZpZyA9IEk5MTVfUE1VX0FDVFVB TF9GUkVRVUVOQ1k7CisJZmQgPSBfX29wZW5fcG11KGVuZ2luZXMsICZlbmdpbmVzLT5mcmVxX2Fj dCwgaWR4KTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwllbmdpbmVzLT5pcnEuY29u ZmlnID0gSTkxNV9QTVVfSU5URVJSVVBUUzsKKwlmZCA9IF9fb3Blbl9wbXUoZW5naW5lcywgJmVu Z2luZXMtPmlycSwgaWR4KTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwllbmdpbmVz LT5yYzYuY29uZmlnID0gSTkxNV9QTVVfUkM2X1JFU0lERU5DWTsKKwlmZCA9IF9fb3Blbl9wbXUo ZW5naW5lcywgJmVuZ2luZXMtPnJjNiwgaWR4KTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7 CisKKwlmb3IgKGkgPSAwOyBpIDwgZW5naW5lcy0+bnVtX2VuZ2luZXM7IGkrKykgeworCQlzdHJ1 Y3QgZW5naW5lICplbmdpbmUgPSBlbmdpbmVfcHRyKGVuZ2luZXMsIGkpOworCQlzdHJ1Y3Qgewor CQkJc3RydWN0IHBtdV9jb3VudGVyICpwbXU7CisJCQljb25zdCBjaGFyICpjb3VudGVyOworCQl9 ICpjbnQsIGNvdW50ZXJzW10gPSB7CisJCQl7IC5wbXUgPSAmZW5naW5lLT5idXN5LCAuY291bnRl ciA9ICJidXN5IiB9LAorCQkJeyAucG11ID0gJmVuZ2luZS0+d2FpdCwgLmNvdW50ZXIgPSAid2Fp dCIgfSwKKwkJCXsgLnBtdSA9ICZlbmdpbmUtPnNlbWEsIC5jb3VudGVyID0gInNlbWEiIH0sCisJ CQl7IC5wbXUgPSBOVUxMLCAuY291bnRlciA9IE5VTEwgfSwKKwkJfTsKKworCQlmb3IgKGNudCA9 IGNvdW50ZXJzOyBjbnQtPnBtdTsgY250KyspIHsKKwkJCWlmICghY250LT5wbXUtPmNvbmZpZykK KwkJCQljbnQtPnBtdS0+Y29uZmlnID0KKwkJCQkJZ2V0X3BtdV9jb25maWcoZGlyZmQoZW5naW5l cy0+cm9vdCksCisJCQkJCQkgICAgICAgZW5naW5lLT5uYW1lLAorCQkJCQkJICAgICAgIGNudC0+ Y291bnRlcik7CisJCQlmZCA9IF9fb3Blbl9wbXUoZW5naW5lcywgY250LT5wbXUsIGlkeCk7CisJ CQlpZiAoZmQgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWVuZ2luZXMtPnJhcGxf c2NhbGUgPSByYXBsX2dwdV9wb3dlcl9zY2FsZSgpOworCWlmIChlbmdpbmVzLT5yYXBsX3NjYWxl ICE9IE5BTikKKwkJZW5naW5lcy0+cmFwbF9zY2FsZSAqPSAxZTM7IC8qIGZyb20gbmFubyB0byBt aWNybyAqLworCWVuZ2luZXMtPnJhcGwuY29uZmlnID0gcmFwbF9ncHVfcG93ZXIoKTsKKwllbmdp bmVzLT5yYXBsX2ZkID0gaWd0X3BlcmZfb3BlbihyYXBsX3R5cGVfaWQoKSwgZW5naW5lcy0+cmFw bC5jb25maWcpOworCWlmIChlbmdpbmVzLT5yYXBsX2ZkIDwgMCkKKwkJcmV0dXJuIC0xOworCisJ cmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJpbmdfaW5pdChzdHJ1Y3QgcmluZyAqcmluZykK K3N0YXRpYyB1aW50NjRfdCBwbXVfcmVhZF9tdWx0aShpbnQgZmQsIHVuc2lnbmVkIGludCBudW0s IHVpbnQ2NF90ICp2YWwpCiB7Ci0JcmluZy0+c2l6ZSA9ICgoKHJpbmdfcmVhZChyaW5nLCBSSU5H X0xFTikgJiBSSU5HX05SX1BBR0VTKSA+PiAxMikgKyAxKSAqIDQwOTY7CisJdWludDY0X3QgYnVm WzIgKyBudW1dOworCXVuc2lnbmVkIGludCBpOworCisJYXNzZXJ0KHJlYWQoZmQsIGJ1Ziwgc2l6 ZW9mKGJ1ZikpID09IHNpemVvZihidWYpKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykK KwkJdmFsW2ldID0gYnVmWzIgKyBpXTsKKworCXJldHVybiBidWZbMV07CiB9CiAKLXN0YXRpYyB2 b2lkIHJpbmdfcmVzZXQoc3RydWN0IHJpbmcgKnJpbmcpCitzdGF0aWMgZG91YmxlIHBtdV9jYWxj KHN0cnVjdCBwbXVfcGFpciAqcCwgZG91YmxlIGQsIGRvdWJsZSB0LCBkb3VibGUgcykKIHsKLQly aW5nLT5pZGxlID0gcmluZy0+ZnVsbCA9IDA7CisJZG91YmxlIHBjdDsKKworCXBjdCA9IHAtPmN1 ciAtIHAtPnByZXY7CisJcGN0IC89IGQ7CisJcGN0IC89IHQ7CisJcGN0ICo9IHM7CisKKwlpZiAo cyA9PSAxMDAuMCAmJiBwY3QgPiAxMDAuMCkKKwkJcGN0ID0gMTAwLjA7CisKKwlyZXR1cm4gcGN0 OwogfQogCi1zdGF0aWMgdm9pZCByaW5nX3NhbXBsZShzdHJ1Y3QgcmluZyAqcmluZykKK3N0YXRp YyB1aW50NjRfdCBfX3BtdV9yZWFkX3NpbmdsZShpbnQgZmQsIHVpbnQ2NF90ICp0cykKIHsKLQlp bnQgZnVsbDsKKwl1aW50NjRfdCBkYXRhWzJdOwogCi0JaWYgKCFyaW5nLT5zaXplKQotCQlyZXR1 cm47CisJYXNzZXJ0KHJlYWQoZmQsIGRhdGEsIHNpemVvZihkYXRhKSkgPT0gc2l6ZW9mKGRhdGEp KTsKIAotCXJpbmctPmhlYWQgPSByaW5nX3JlYWQocmluZywgUklOR19IRUFEKSAmIEhFQURfQURE UjsKLQlyaW5nLT50YWlsID0gcmluZ19yZWFkKHJpbmcsIFJJTkdfVEFJTCkgJiBUQUlMX0FERFI7 CisJaWYgKHRzKQorCQkqdHMgPSBkYXRhWzFdOwogCi0JaWYgKHJpbmctPnRhaWwgPT0gcmluZy0+ aGVhZCkKLQkJcmluZy0+aWRsZSsrOworCXJldHVybiBkYXRhWzBdOworfQorCitzdGF0aWMgdWlu 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 c3RydWN0IGVuZ2luZXMgKmVuZ2luZXM7CisJc3RydWN0IHdpbnNpemUgd3M7CisJdW5zaWduZWQg aW50IGk7CisJaW50IHJldCwgY2g7CisKKwkvKiBQYXJzZSBvcHRpb25zICovCisJd2hpbGUgKChj aCA9IGdldG9wdChhcmdjLCBhcmd2LCAiczpoIikpICE9IC0xKSB7CiAJCXN3aXRjaCAoY2gpIHsK LQkJY2FzZSAnZSc6IGNtZCA9IHN0cmR1cChvcHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3Mn OiBzYW1wbGVzX3Blcl9zZWMgPSBhdG9pKG9wdGFyZyk7Ci0JCQlpZiAoc2FtcGxlc19wZXJfc2Vj IDwgMTAwKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogc2FtcGxlcyBwZXIgc2Vjb25k IG11c3QgYmUgPj0gMTAwXG4iKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNh c2UgJ28nOgotCQkJaWYgKCFzdHJjbXAob3B0YXJnLCAiLSIpKSB7Ci0JCQkJLyogUnVubmluZyBp biBub24taW50ZXJhY3RpdmUgbW9kZSAqLwotCQkJCWludGVyYWN0aXZlID0gMDsKLQkJCQlvdXRw dXQgPSBzdGRvdXQ7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJb3V0cHV0ID0gZm9wZW4ob3B0YXJnLCAi dyIpOwotCQkJaWYgKCFvdXRwdXQpCi0JCQl7Ci0JCQkJcGVycm9yKCJmb3BlbiIpOwotCQkJCWV4 aXQoMSk7Ci0JCQl9CisJCWNhc2UgJ3MnOgorCQkJcGVyaW9kX3VzID0gYXRvaShvcHRhcmcpICog MTAwMDsKIAkJCWJyZWFrOwogCQljYXNlICdoJzoKIAkJCXVzYWdlKGFyZ3ZbMF0pOwogCQkJZXhp dCgwKTsKLQkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlk IGZsYWcgJWMhXG4iLCAoY2hhcilvcHRvcHQpOworCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlk IG9wdGlvbiAlYyFcbiIsIChjaGFyKW9wdG9wdCk7CiAJCQl1c2FnZShhcmd2WzBdKTsKIAkJCWV4 aXQoMSk7Ci0JCQlicmVhazsKIAkJfQogCX0KIAotCXBjaV9kZXYgPSBpbnRlbF9nZXRfcGNpX2Rl dmljZSgpOwotCWRldmlkID0gcGNpX2Rldi0+ZGV2aWNlX2lkOwotCWludGVsX21taW9fdXNlX3Bj aV9iYXIocGNpX2Rldik7Ci0JaW5pdF9pbnN0ZG9uZV9kZWZpbml0aW9ucyhkZXZpZCk7CisJLyog R2V0IHRlcm1pbmFsIHNpemUuICovCisJaWYgKGlvY3RsKDAsIFRJT0NHV0lOU1osICZ3cykgIT0g LTEpIHsKKwkJY29uX3cgPSB3cy53c19jb2w7CisJCWNvbl9oID0gd3Mud3Nfcm93OworCX0KIAot CS8qIERvIHdlIGhhdmUgYSBjb21tYW5kIHRvIHJ1bj8gKi8KLQlpZiAoY21kICE9IE5VTEwpIHsK LQkJaWYgKG91dHB1dCkgewotCQkJZnByaW50ZihvdXRwdXQsICIjIFByb2ZpbGluZzogJXNcbiIs IGNtZCk7Ci0JCQlmZmx1c2gob3V0cHV0KTsKLQkJfQotCQljaGlsZF9waWQgPSBmb3JrKCk7Ci0J CWlmIChjaGlsZF9waWQgPCAwKSB7Ci0JCQlwZXJyb3IoImZvcmsiKTsKLQkJCWV4aXQoMSk7Ci0J CX0KLQkJZWxzZSBpZiAoY2hpbGRfcGlkID09IDApIHsKLQkJCWludCByZXM7Ci0JCQlyZXMgPSBz eXN0ZW0oY21kKTsKLQkJCWlmIChyZXMgPCAwKQotCQkJCXBlcnJvcigicnVubmluZyBjb21tYW5k Iik7Ci0JCQlpZiAob3V0cHV0KSB7Ci0JCQkJZmZsdXNoKG91dHB1dCk7Ci0JCQkJZnByaW50Zihv dXRwdXQsICIjICVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiwgY21kLCByZXMpOwotCQkJCWZm bHVzaChvdXRwdXQpOwotCQkJfQotCQkJZnJlZShjbWQpOwotCQkJZXhpdCgwKTsKLQkJfSBlbHNl IHsKLQkJCWZyZWUoY21kKTsKLQkJfQorCWVuZ2luZXMgPSBkaXNjb3Zlcl9lbmdpbmVzKCk7CisJ aWYgKCFlbmdpbmVzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGRldGVjdCBlbmdp bmVzIVxuIik7CisJCXJldHVybiAxOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBudW1faW5zdGRv bmVfYml0czsgaSsrKSB7Ci0JCXRvcF9iaXRzW2ldLmJpdCA9ICZpbnN0ZG9uZV9iaXRzW2ldOwot CQl0b3BfYml0c1tpXS5jb3VudCA9IDA7Ci0JCXRvcF9iaXRzX3NvcnRlZFtpXSA9ICZ0b3BfYml0 c1tpXTsKKwlyZXQgPSBwbXVfaW5pdChlbmdpbmVzKTsKKwlpZiAocmV0KSB7CisJCWZwcmludGYo c3RkZXJyLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgUE1VIVxuIik7CisJCXJldHVybiAxOwogCX0K IAotCS8qIEdyYWIgYWNjZXNzIHRvIHRoZSByZWdpc3RlcnMgKi8KLQlpbnRlbF9yZWdpc3Rlcl9h Y2Nlc3NfaW5pdChwY2lfZGV2LCAwLCAtMSk7CisJcG11X3NhbXBsZShlbmdpbmVzKTsKIAotCXJp bmdfaW5pdCgmcmVuZGVyX3JpbmcpOwotCWlmIChJU19HRU40KGRldmlkKSB8fCBJU19HRU41KGRl dmlkKSkKLQkJcmluZ19pbml0KCZic2RfcmluZyk7Ci0JaWYgKElTX0dFTjYoZGV2aWQpIHx8IElT X0dFTjcoZGV2aWQpKSB7Ci0JCXJpbmdfaW5pdCgmYnNkNl9yaW5nKTsKLQkJcmluZ19pbml0KCZi bHRfcmluZyk7Ci0JfQorCWZvciAoOzspIHsKKwkJZG91YmxlIHQsIGZyZXFbMl0sIGlycSwgcmM2 LCBwb3dlcjsKKwkJaW50IGxpbmVzID0gMDsKIAotCS8qIEluaXRpYWxpemUgR1BVIHN0YXRzICov Ci0JaWYgKEhBU19TVEFUU19SRUdTKGRldmlkKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgU1RBVFNf Q09VTlQ7IGkrKykgewotCQkJdWludDMyX3Qgc3RhdHNfaGlnaCwgc3RhdHNfbG93LCBzdGF0c19o aWdoXzI7CisJCXVzbGVlcChwZXJpb2RfdXMpOwogCi0JCQlkbyB7Ci0JCQkJc3RhdHNfaGlnaCA9 IElOUkVHKHN0YXRzX3JlZ3NbaV0gKyA0KTsKLQkJCQlzdGF0c19sb3cgPSBJTlJFRyhzdGF0c19y ZWdzW2ldKTsKLQkJCQlzdGF0c19oaWdoXzIgPSBJTlJFRyhzdGF0c19yZWdzW2ldICsgNCk7Ci0J CQl9IHdoaWxlIChzdGF0c19oaWdoICE9IHN0YXRzX2hpZ2hfMik7CisJCXBtdV9zYW1wbGUoZW5n aW5lcyk7CisJCXQgPSAoZG91YmxlKShlbmdpbmVzLT50cy5jdXIgLSBlbmdpbmVzLT50cy5wcmV2 KSAvIDFlOTsKIAotCQkJbGFzdF9zdGF0c1tpXSA9ICh1aW50NjRfdClzdGF0c19oaWdoIDw8IDMy IHwKLQkJCQlzdGF0c19sb3c7Ci0JCX0KLQl9CisJCXByaW50ZigiXDAzM1tIXDAzM1tKIik7CiAK LQlmb3IgKDs7KSB7Ci0JCWludCBqOwotCQl1bnNpZ25lZCBsb25nIGxvbmcgdDEsIHRpLCB0Ziwg dDI7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyBkZWZfc2xlZXAgPSAxMDAwMDAwIC8gc2FtcGxlc19w ZXJfc2VjOwotCQl1bnNpZ25lZCBsb25nIGxvbmcgbGFzdF9zYW1wbGVzX3Blcl9zZWMgPSBzYW1w bGVzX3Blcl9zZWM7Ci0JCXVuc2lnbmVkIHNob3J0IGludCBtYXhfbGluZXM7Ci0JCXN0cnVjdCB3 aW5zaXplIHdzOwotCQljaGFyIGNsZWFyX3NjcmVlbltdID0gezB4MWIsICdbJywgJ0gnLAotCQkJ CSAgICAgICAweDFiLCAnWycsICdKJywKLQkJCQkgICAgICAgMHgwfTsKLQkJaW50IHBlcmNlbnQ7 Ci0JCWludCBsZW47Ci0KLQkJdDEgPSBnZXR0aW1lKCk7Ci0KLQkJcmluZ19yZXNldCgmcmVuZGVy X3JpbmcpOwotCQlyaW5nX3Jlc2V0KCZic2RfcmluZyk7Ci0JCXJpbmdfcmVzZXQoJmJzZDZfcmlu Zyk7Ci0JCXJpbmdfcmVzZXQoJmJsdF9yaW5nKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgc2FtcGxl c19wZXJfc2VjOyBpKyspIHsKLQkJCWxvbmcgbG9uZyBpbnRlcnZhbDsKLQkJCXRpID0gZ2V0dGlt ZSgpOwotCQkJaWYgKElTXzk2NShkZXZpZCkpIHsKLQkJCQlpbnN0ZG9uZSA9IElOUkVHKElOU1RE T05FX0k5NjUpOwotCQkJCWluc3Rkb25lMSA9IElOUkVHKElOU1RET05FXzEpOwotCQkJfSBlbHNl Ci0JCQkJaW5zdGRvbmUgPSBJTlJFRyhJTlNURE9ORSk7Ci0KLQkJCWZvciAoaiA9IDA7IGogPCBu dW1faW5zdGRvbmVfYml0czsgaisrKQotCQkJCXVwZGF0ZV9pZGxlX2JpdCgmdG9wX2JpdHNbal0p OwotCi0JCQlyaW5nX3NhbXBsZSgmcmVuZGVyX3JpbmcpOwotCQkJcmluZ19zYW1wbGUoJmJzZF9y aW5nKTsKLQkJCXJpbmdfc2FtcGxlKCZic2Q2X3JpbmcpOwotCQkJcmluZ19zYW1wbGUoJmJsdF9y aW5nKTsKLQotCQkJdGYgPSBnZXR0aW1lKCk7Ci0JCQlpZiAodGYgLSB0MSA+PSAxMDAwMDAwKSB7 Ci0JCQkJLyogV2UgYXJlIG91dCBvZiBzeW5jLCBiYWlsIG91dCAqLwotCQkJCWxhc3Rfc2FtcGxl c19wZXJfc2VjID0gaSsxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaW50ZXJ2YWwgPSBkZWZfc2xl ZXAgLSAodGYgLSB0aSk7Ci0JCQlpZiAoaW50ZXJ2YWwgPiAwKQotCQkJCXVzbGVlcChpbnRlcnZh bCk7Ci0JCX0KKwkJZnJlcVswXSA9IHBtdV9jYWxjKCZlbmdpbmVzLT5mcmVxX3JlcS52YWwsIDEu MCwgdCwgMSk7CisJCWZyZXFbMV0gPSBwbXVfY2FsYygmZW5naW5lcy0+ZnJlcV9hY3QudmFsLCAx LjAsIHQsIDEpOworCQlpcnEgPSBwbXVfY2FsYygmZW5naW5lcy0+aXJxLnZhbCwgMS4wLCB0LCAx KTsKKwkJcmM2ID0gcG11X2NhbGMoJmVuZ2luZXMtPnJjNi52YWwsIDFlOSwgdCwgMTAwKTsKKwkJ cG93ZXIgPSBwbXVfY2FsYygmZW5naW5lcy0+cmFwbC52YWwsIDEuMCwgdCwKKwkJCQkgZW5naW5l cy0+cmFwbF9zY2FsZSk7CiAKLQkJaWYgKEhBU19TVEFUU19SRUdTKGRldmlkKSkgewotCQkJZm9y IChpID0gMDsgaSA8IFNUQVRTX0NPVU5UOyBpKyspIHsKLQkJCQl1aW50MzJfdCBzdGF0c19oaWdo LCBzdGF0c19sb3csIHN0YXRzX2hpZ2hfMjsKKwkJcHJpbnRmKCJpbnRlbC1ncHUtdG9wIC0gJTQu MGYvJTQuMGYgTUh6OyAgJTMuMGYlJSBSQzY7ICU2LjBmbVc7ICU4LjBmIGlycXMvc1xuIiwKKwkJ ICAgICAgIGZyZXFbMF0sIGZyZXFbMV0sIHJjNiwgcG93ZXIsIGlycSk7CisJCWxpbmVzKys7CiAK LQkJCQlkbyB7Ci0JCQkJCXN0YXRzX2hpZ2ggPSBJTlJFRyhzdGF0c19yZWdzW2ldICsgNCk7Ci0J CQkJCXN0YXRzX2xvdyA9IElOUkVHKHN0YXRzX3JlZ3NbaV0pOwotCQkJCQlzdGF0c19oaWdoXzIg PSBJTlJFRyhzdGF0c19yZWdzW2ldICsgNCk7Ci0JCQkJfSB3aGlsZSAoc3RhdHNfaGlnaCAhPSBz dGF0c19oaWdoXzIpOworCQlwcmludGYoIlxuIik7CisJCWxpbmVzKys7CiAKLQkJCQlzdGF0c1tp XSA9ICh1aW50NjRfdClzdGF0c19oaWdoIDw8IDMyIHwKLQkJCQkJc3RhdHNfbG93OwotCQkJfQot CQl9CisJCWZvciAoaSA9IDA7IGkgPCBlbmdpbmVzLT5udW1fZW5naW5lcyAmJiBsaW5lcyA8IGNv bl9oOyBpKyspIHsKKwkJCXN0cnVjdCBlbmdpbmUgKmVuZ2luZSA9IGVuZ2luZV9wdHIoZW5naW5l cywgaSk7CisJCQl1bnNpZ25lZCBpbnQgbWF4X3cgPSBjb25fdyAtIDE7CisJCQl1bnNpZ25lZCBp bnQgbGVuOworCQkJZG91YmxlIHZhbFsyXTsKKwkJCWNoYXIgYnVmWzEyOF07CiAKLQkJcXNvcnQo dG9wX2JpdHNfc29ydGVkLCBudW1faW5zdGRvbmVfYml0cywKLQkJICAgICAgc2l6ZW9mKHN0cnVj dCB0b3BfYml0ICopLCB0b3BfYml0c19zb3J0KTsKLQotCQkvKiBMaW1pdCB0aGUgbnVtYmVyIG9m IGxpbmVzIHByaW50ZWQgdG8gdGhlIHRlcm1pbmFsIGhlaWdodCBzbyB0aGUKLQkJICogbW9zdCBp bXBvcnRhbnQgaW5mbyAoYXQgdGhlIHRvcCkgd2lsbCBzdGF5IG9uIHNjcmVlbi4gKi8KLQkJbWF4 X2xpbmVzID0gLTE7Ci0JCWlmIChpb2N0bCgwLCBUSU9DR1dJTlNaLCAmd3MpICE9IC0xKQotCQkJ bWF4X2xpbmVzID0gd3Mud3Nfcm93IC0gNjsgLyogZXhjbHVkZSBoZWFkZXIgbGluZXMgKi8KLQkJ aWYgKG1heF9saW5lcyA+PSBudW1faW5zdGRvbmVfYml0cykKLQkJCW1heF9saW5lcyA9IG51bV9p bnN0ZG9uZV9iaXRzOwotCi0JCXQyID0gZ2V0dGltZSgpOwotCQllbGFwc2VkX3RpbWUgKz0gKHQy IC0gdDEpIC8gMTAwMDAwMC4wOwotCi0JCWlmIChpbnRlcmFjdGl2ZSkgewotCQkJcHJpbnRmKCIl cyIsIGNsZWFyX3NjcmVlbik7Ci0JCQlwcmludF9jbG9ja19pbmZvKHBjaV9kZXYpOwotCi0JCQly aW5nX3ByaW50KCZyZW5kZXJfcmluZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMpOwotCQkJcmluZ19w cmludCgmYnNkX3JpbmcsIGxhc3Rfc2FtcGxlc19wZXJfc2VjKTsKLQkJCXJpbmdfcHJpbnQoJmJz ZDZfcmluZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMpOwotCQkJcmluZ19wcmludCgmYmx0X3Jpbmcs IGxhc3Rfc2FtcGxlc19wZXJfc2VjKTsKLQotCQkJcHJpbnRmKCJcbiUzMHMgICVzXG4iLCAidGFz ayIsICJwZXJjZW50IGJ1c3kiKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBtYXhfbGluZXM7IGkrKykg ewotCQkJCWlmICh0b3BfYml0c19zb3J0ZWRbaV0tPmNvdW50ID4gMCkgewotCQkJCQlwZXJjZW50 ID0gKHRvcF9iaXRzX3NvcnRlZFtpXS0+Y291bnQgKiAxMDApIC8KLQkJCQkJCWxhc3Rfc2FtcGxl c19wZXJfc2VjOwotCQkJCQlsZW4gPSBwcmludGYoIiUzMHM6ICUzZCUlOiAiLAotCQkJCQkJCSB0 b3BfYml0c19zb3J0ZWRbaV0tPmJpdC0+bmFtZSwKLQkJCQkJCQkgcGVyY2VudCk7Ci0JCQkJCXBy aW50X3BlcmNlbnRhZ2VfYmFyIChwZXJjZW50LCBsZW4pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBy aW50ZigiJSpzIiwgUEVSQ0VOVEFHRV9CQVJfRU5ELCAiIik7Ci0JCQkJfQotCi0JCQkJaWYgKGkg PCBTVEFUU19DT1VOVCAmJiBIQVNfU1RBVFNfUkVHUyhkZXZpZCkpIHsKLQkJCQkJcHJpbnRmKCIl MTNzOiAlbGx1ICglbGxkL3NlYykiLAotCQkJCQkJICAgc3RhdHNfcmVnX25hbWVzW2ldLAotCQkJ CQkJICAgKGxvbmcgbG9uZylzdGF0c1tpXSwKLQkJCQkJCSAgIChsb25nIGxvbmcpKHN0YXRzW2ld IC0gbGFzdF9zdGF0c1tpXSkpOwotCQkJCQlsYXN0X3N0YXRzW2ldID0gc3RhdHNbaV07Ci0JCQkJ fSBlbHNlIHsKLQkJCQkJaWYgKCF0b3BfYml0c19zb3J0ZWRbaV0tPmNvdW50KQotCQkJCQkJYnJl YWs7Ci0JCQkJfQotCQkJCXByaW50ZigiXG4iKTsKLQkJCX0KLQkJfQotCQlpZiAob3V0cHV0KSB7 Ci0JCQkvKiBQcmludCBoZWFkZXJzIGZvciBjb2x1bW5zIGF0IGZpcnN0IHJ1biAqLwotCQkJaWYg KHByaW50X2hlYWRlcnMpIHsKLQkJCQlmcHJpbnRmKG91dHB1dCwgIiMgdGltZVx0Iik7Ci0JCQkJ cmluZ19wcmludF9oZWFkZXIob3V0cHV0LCAmcmVuZGVyX3JpbmcpOwotCQkJCXJpbmdfcHJpbnRf aGVhZGVyKG91dHB1dCwgJmJzZF9yaW5nKTsKLQkJCQlyaW5nX3ByaW50X2hlYWRlcihvdXRwdXQs ICZic2Q2X3JpbmcpOwotCQkJCXJpbmdfcHJpbnRfaGVhZGVyKG91dHB1dCwgJmJsdF9yaW5nKTsK LQkJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9UT1BfQklUUzsgaSsrKSB7Ci0JCQkJCWlmIChp IDwgU1RBVFNfQ09VTlQgJiYgSEFTX1NUQVRTX1JFR1MoZGV2aWQpKSB7Ci0JCQkJCQlmcHJpbnRm KG91dHB1dCwgIiUuNnNcdCIsCi0JCQkJCQkJICAgc3RhdHNfcmVnX25hbWVzW2ldCi0JCQkJCQkJ ICAgKTsKLQkJCQkJfQotCQkJCQlpZiAoIXRvcF9iaXRzW2ldLmNvdW50KQotCQkJCQkJY29udGlu dWU7Ci0JCQkJfQotCQkJCWZwcmludGYob3V0cHV0LCAiXG4iKTsKLQkJCQlwcmludF9oZWFkZXJz ID0gMDsKLQkJCX0KLQotCQkJLyogUHJpbnQgc3RhdGlzdGljcyAqLwotCQkJZnByaW50ZihvdXRw dXQsICIlLjJmXHQiLCBlbGFwc2VkX3RpbWUpOwotCQkJcmluZ19sb2coJnJlbmRlcl9yaW5nLCBs YXN0X3NhbXBsZXNfcGVyX3NlYywgb3V0cHV0KTsKLQkJCXJpbmdfbG9nKCZic2RfcmluZywgbGFz dF9zYW1wbGVzX3Blcl9zZWMsIG91dHB1dCk7Ci0JCQlyaW5nX2xvZygmYnNkNl9yaW5nLCBsYXN0 X3NhbXBsZXNfcGVyX3NlYywgb3V0cHV0KTsKLQkJCXJpbmdfbG9nKCZibHRfcmluZywgbGFzdF9z YW1wbGVzX3Blcl9zZWMsIG91dHB1dCk7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1RP UF9CSVRTOyBpKyspIHsKLQkJCQlpZiAoaSA8IFNUQVRTX0NPVU5UICYmIEhBU19TVEFUU19SRUdT KGRldmlkKSkgewotCQkJCQlmcHJpbnRmKG91dHB1dCwgIiUiUFJJdTY0Ilx0IiwKLQkJCQkJCSAg IHN0YXRzW2ldIC0gbGFzdF9zdGF0c1tpXSk7Ci0JCQkJCWxhc3Rfc3RhdHNbaV0gPSBzdGF0c1tp XTsKLQkJCQl9Ci0JCQkJCWlmICghdG9wX2JpdHNbaV0uY291bnQpCi0JCQkJCQljb250aW51ZTsK LQkJCX0KLQkJCWZwcmludGYob3V0cHV0LCAiXG4iKTsKLQkJCWZmbHVzaChvdXRwdXQpOwotCQl9 CisJCQl2YWxbMF0gPSBwbXVfY2FsYygmZW5naW5lLT53YWl0LnZhbCwgMWU5LCB0LCAxMDApOwor CQkJdmFsWzFdID0gcG11X2NhbGMoJmVuZ2luZS0+c2VtYS52YWwsIDFlOSwgdCwgMTAwKTsKKwkJ CWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJICAgICAgICIlNi4yZiUlIHdh aXQsICU2LjJmJSUgc2VtYSIsCisJCQkJICAgICAgIHZhbFswXSwgdmFsWzFdKTsKIAotCQlmb3Ig KGkgPSAwOyBpIDwgbnVtX2luc3Rkb25lX2JpdHM7IGkrKykgewotCQkJdG9wX2JpdHNfc29ydGVk W2ldLT5jb3VudCA9IDA7CisJCQl2YWxbMF0gPSBwbXVfY2FsYygmZW5naW5lLT5idXN5LnZhbCwg MWU5LCB0LCAxMDApOworCQkJbGVuICs9IHByaW50ZigiJThzICU2LjJmJSUgIiwKKwkJCQkgICAg ICBlbmdpbmUtPm5hbWUsIHZhbFswXSk7CisJCQlwcmludF9wZXJjZW50YWdlX2Jhcih2YWxbMF0s IG1heF93IC0gbGVuKTsKIAotCQkJaWYgKGkgPCBTVEFUU19DT1VOVCkKLQkJCQlsYXN0X3N0YXRz W2ldID0gc3RhdHNbaV07Ci0JCX0KKwkJCXByaW50ZigiJXNcbiIsIGJ1Zik7CiAKLQkJLyogQ2hl Y2sgaWYgY2hpbGQgaGFzIGdvbmUgKi8KLQkJaWYgKGNoaWxkX3BpZCA+IDApIHsKLQkJCWludCBy ZXM7Ci0JCQlpZiAoKHJlcyA9IHdhaXRwaWQoY2hpbGRfcGlkLCAmY2hpbGRfc3RhdCwgV05PSEFO RykpID09IC0xKSB7Ci0JCQkJcGVycm9yKCJ3YWl0cGlkIik7Ci0JCQkJZXhpdCgxKTsKLQkJCX0K LQkJCWlmIChyZXMgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChXSUZFWElURUQoY2hpbGRf c3RhdCkpCi0JCQkJYnJlYWs7CisJCQlsaW5lcysrOwogCQl9Ci0JfQogCi0JZmNsb3NlKG91dHB1 dCk7CisJCXByaW50ZigiXG4iKTsKKwl9CiAKLQlpbnRlbF9yZWdpc3Rlcl9hY2Nlc3NfZmluaSgp OwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWVzb24uYnVpbGQgYi90b29scy9t ZXNvbi5idWlsZAppbmRleCBiZDJkMzEzZDUxNTYuLmE5MThlZWIwYmVmMSAxMDA2NDQKLS0tIGEv dG9vbHMvbWVzb24uYnVpbGQKKysrIGIvdG9vbHMvbWVzb24uYnVpbGQKQEAgLTIzLDcgKzIzLDYg QEAgdG9vbHNfcHJvZ3MgPSBbCiAJJ2ludGVsX2dwdV9mcmVxdWVuY3knLAogCSdpbnRlbF9maXJt d2FyZV9kZWNvZGUnLAogCSdpbnRlbF9ncHVfdGltZScsCi0JJ2ludGVsX2dwdV90b3AnLAogCSdp bnRlbF9ndHQnLAogCSdpbnRlbF9ndWNfbG9nZ2VyJywKIAknaW50ZWxfaW5mb2ZyYW1lcycsCkBA IC0xMTcsNiArMTE2LDExIEBAIHNoYXJlZF9saWJyYXJ5KCdpbnRlbF9hdWJkdW1wJywgJ2F1YmR1 bXAuYycsCiAJICAgICAgIG5hbWVfcHJlZml4IDogJycsCiAJICAgICAgIGluc3RhbGwgOiB0cnVl KQogCitleGVjdXRhYmxlKCdpbnRlbF9ncHVfdG9wJywgJ2ludGVsX2dwdV90b3AuYycsCisJICAg aW5zdGFsbCA6IHRydWUsCisJICAgaW5zdGFsbF9ycGF0aCA6IHJwYXRoZGlyLAorCSAgIGRlcGVu ZGVuY2llcyA6IHRvb2xfZGVwcyArIFsgbGliX2lndF9wZXJmIF0pCisKIGNvbmZfZGF0YSA9IGNv bmZpZ3VyYXRpb25fZGF0YSgpCiBjb25mX2RhdGEuc2V0KCdwcmVmaXgnLCBwcmVmaXgpCiBjb25m X2RhdGEuc2V0KCdleGVjX3ByZWZpeCcsICcke3ByZWZpeH0nKQotLSAKMi4xNC4xCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGlu ZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK