From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH i-g-t 18/19] i915: Add gem_exec_balancer Date: Fri, 8 Mar 2019 18:11:28 +0000 Message-ID: <20190308181129.15562-18-chris@chris-wilson.co.uk> References: <20190308181129.15562-1-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from fireflyinternet.com (mail.fireflyinternet.com [109.228.58.192]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7EEB06E413 for ; Fri, 8 Mar 2019 18:18:23 +0000 (UTC) In-Reply-To: <20190308181129.15562-1-chris@chris-wilson.co.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RXhlcmNpc2UgdGhlIGluLWtlcm5lbCBsb2FkIGJhbGFuY2VyIGNoZWNraW5nIHRoYXQgd2UgY2Fu IGRpc3RyaWJ1dGUKYmF0Y2hlcyBhY3Jvc3MgdGhlIHNldCBvZiBjdHgtPmVuZ2luZXMgdG8gYXZv aWQgbG9hZC4KClNpZ25lZC1vZmYtYnk6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29u LmNvLnVrPgotLS0KIHRlc3RzL01ha2VmaWxlLmFtICAgICAgICAgICAgICB8ICAgMSArCiB0ZXN0 cy9NYWtlZmlsZS5zb3VyY2VzICAgICAgICAgfCAgIDEgKwogdGVzdHMvaTkxNS9nZW1fZXhlY19i YWxhbmNlci5jIHwgNjI3ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogdGVzdHMv bWVzb24uYnVpbGQgICAgICAgICAgICAgIHwgICA3ICsKIDQgZmlsZXMgY2hhbmdlZCwgNjM2IGlu c2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0cy9pOTE1L2dlbV9leGVjX2JhbGFu Y2VyLmMKCmRpZmYgLS1naXQgYS90ZXN0cy9NYWtlZmlsZS5hbSBiL3Rlc3RzL01ha2VmaWxlLmFt CmluZGV4IDI4OTI0OWI0Mi4uNjhhOWMxNGJmIDEwMDY0NAotLS0gYS90ZXN0cy9NYWtlZmlsZS5h bQorKysgYi90ZXN0cy9NYWtlZmlsZS5hbQpAQCAtMTAyLDYgKzEwMiw3IEBAIGdlbV9jbG9zZV9y YWNlX0xEQUREID0gJChMREFERCkgLWxwdGhyZWFkCiBnZW1fY3R4X3RocmFzaF9DRkxBR1MgPSAk KEFNX0NGTEFHUykgJChUSFJFQURfQ0ZMQUdTKQogZ2VtX2N0eF90aHJhc2hfTERBREQgPSAkKExE QUREKSAtbHB0aHJlYWQKIGdlbV9jdHhfc3NldV9MREFERCA9ICQoTERBREQpICQodG9wX2J1aWxk ZGlyKS9saWIvbGliaWd0X3BlcmYubGEKK2k5MTVfZ2VtX2V4ZWNfYmFsYW5jZXJfTERBREQgPSAk KExEQUREKSAkKHRvcF9idWlsZGRpcikvbGliL2xpYmlndF9wZXJmLmxhCiBnZW1fZXhlY19jYXB0 dXJlX0xEQUREID0gJChMREFERCkgLWx6CiBnZW1fZXhlY19wYXJhbGxlbF9DRkxBR1MgPSAkKEFN X0NGTEFHUykgJChUSFJFQURfQ0ZMQUdTKQogZ2VtX2V4ZWNfcGFyYWxsZWxfTERBREQgPSAkKExE QUREKSAtbHB0aHJlYWQKZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMgYi90ZXN0 cy9NYWtlZmlsZS5zb3VyY2VzCmluZGV4IDQxZTc1NmYxNS4uZjZjMjFhMWFhIDEwMDY0NAotLS0g YS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCisrKyBiL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKQEAg LTIzLDYgKzIzLDcgQEAgVEVTVFNfcHJvZ3MgPSBcCiAJZHJtX3JlYWQgXAogCWk5MTUvZ2VtX2N0 eF9lbmdpbmVzIFwKIAlpOTE1L2dlbV9jdHhfc2hhcmVkIFwKKwlpOTE1L2dlbV9leGVjX2JhbGFu Y2VyIFwKIAlrbXNfM2QgXAogCWttc19hZGRmYl9iYXNpYyBcCiAJa21zX2F0b21pYyBcCmRpZmYg LS1naXQgYS90ZXN0cy9pOTE1L2dlbV9leGVjX2JhbGFuY2VyLmMgYi90ZXN0cy9pOTE1L2dlbV9l eGVjX2JhbGFuY2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwLi5kOWZk ZmZlNjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pOTE1L2dlbV9leGVjX2JhbGFuY2VyLmMK QEAgLTAsMCArMSw2MjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxOCBJbnRlbCBDb3Jwb3Jh dGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdl LCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5k IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8g ZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhv dXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2Us IHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMg b2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNv ZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNv bmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVy bWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBi ZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQor ICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJ VEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xV RElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ LAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVO VC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVS UyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZ LCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFS SVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJF IE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLwor CisjaW5jbHVkZSA8c2NoZWQuaD4KKworI2luY2x1ZGUgImlndC5oIgorI2luY2x1ZGUgImlndF9w ZXJmLmgiCisjaW5jbHVkZSAiaTkxNS9nZW1fcmluZy5oIgorI2luY2x1ZGUgInN3X3N5bmMuaCIK KworSUdUX1RFU1RfREVTQ1JJUFRJT04oIkV4ZXJjaXNlIGluLWtlcm5lbCBsb2FkLWJhbGFuY2lu ZyIpOworCitzdHJ1Y3QgY2xhc3NfaW5zdGFuY2UgeworCXVpbnQxNl90IGNsYXNzOworCXVpbnQx Nl90IGluc3RhbmNlOworfTsKKyNkZWZpbmUgSU5TVEFOQ0VfQ09VTlQgKDEgPDwgSTkxNV9QTVVf U0FNUExFX0lOU1RBTkNFX0JJVFMpCisKK3N0YXRpYyBib29sIGhhc19jbGFzc19pbnN0YW5jZShp bnQgaTkxNSwgdWludDE2X3QgY2xhc3MsIHVpbnQxNl90IGluc3RhbmNlKQoreworCWludCBmZDsK KworCWZkID0gcGVyZl9pOTE1X29wZW4oSTkxNV9QTVVfRU5HSU5FX0JVU1koY2xhc3MsIGluc3Rh bmNlKSk7CisJaWYgKGZkICE9IC0xKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIHRydWU7CisJ fQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2luc3RhbmNlICoK K2xpc3RfZW5naW5lcyhpbnQgaTkxNSwgdWludDMyX3QgY2xhc3NfbWFzaywgdW5zaWduZWQgaW50 ICpvdXQpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMCwgc2l6ZSA9IDY0OworCXN0cnVjdCBj bGFzc19pbnN0YW5jZSAqZW5naW5lczsKKworCWVuZ2luZXMgPSBtYWxsb2Moc2l6ZSAqIHNpemVv ZigqZW5naW5lcykpOworCWlmICghZW5naW5lcykgeworCQkqb3V0ID0gMDsKKwkJcmV0dXJuIE5V TEw7CisJfQorCisJZm9yIChlbnVtIGRybV9pOTE1X2dlbV9lbmdpbmVfY2xhc3MgY2xhc3MgPSBJ OTE1X0VOR0lORV9DTEFTU19SRU5ERVI7CisJICAgICBjbGFzc19tYXNrOworCSAgICAgY2xhc3Mr KywgY2xhc3NfbWFzayA+Pj0gMSkgeworCQlpZiAoIShjbGFzc19tYXNrICYgMSkpCisJCQljb250 aW51ZTsKKworCQlmb3IgKHVuc2lnbmVkIGludCBpbnN0YW5jZSA9IDA7CisJCSAgICAgaW5zdGFu Y2UgPCBJTlNUQU5DRV9DT1VOVDsKKwkJICAgICBpbnN0YW5jZSsrKSB7CisJCSAgICAgaWYgKCFo YXNfY2xhc3NfaW5zdGFuY2UoaTkxNSwgY2xhc3MsIGluc3RhbmNlKSkKKwkJCSAgICAgY29udGlu dWU7CisKKwkJCWlmIChjb3VudCA9PSBzaXplKSB7CisJCQkJc3RydWN0IGNsYXNzX2luc3RhbmNl ICplOworCisJCQkJc2l6ZSAqPSAyOworCQkJCWUgPSByZWFsbG9jKGVuZ2luZXMsIHNpemUqc2l6 ZW9mKCplbmdpbmVzKSk7CisJCQkJaWYgKCFlKSB7CisJCQkJCSpvdXQgPSBjb3VudDsKKwkJCQkJ cmV0dXJuIGVuZ2luZXM7CisJCQkJfQorCisJCQkJZW5naW5lcyA9IGU7CisJCQl9CisKKwkJCWVu Z2luZXNbY291bnQrK10gPSAoc3RydWN0IGNsYXNzX2luc3RhbmNlKXsKKwkJCQkuY2xhc3MgPSBj bGFzcywKKwkJCQkuaW5zdGFuY2UgPSBpbnN0YW5jZSwKKwkJCX07CisJCX0KKwl9CisKKwlpZiAo IWNvdW50KSB7CisJCWZyZWUoZW5naW5lcyk7CisJCWVuZ2luZXMgPSBOVUxMOworCX0KKworCSpv dXQgPSBjb3VudDsKKwlyZXR1cm4gZW5naW5lczsKK30KKworc3RhdGljIGludCBfX3NldF9sb2Fk X2JhbGFuY2VyKGludCBpOTE1LCB1aW50MzJfdCBjdHgsCisJCQkgICAgICAgY29uc3Qgc3RydWN0 IGNsYXNzX2luc3RhbmNlICpjaSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJ c3RydWN0IGk5MTVfY29udGV4dF9lbmdpbmVzX2xvYWRfYmFsYW5jZSBiYWxhbmNlciA9IHsKKwkJ eyAubmFtZSA9IEk5MTVfQ09OVEVYVF9FTkdJTkVTX0VYVF9MT0FEX0JBTEFOQ0UgfSwKKwkJLmVu Z2luZXNfbWFzayA9IH4wdWxsLAorCX07CisJSTkxNV9ERUZJTkVfQ09OVEVYVF9QQVJBTV9FTkdJ TkVTKGVuZ2luZXMsIGNvdW50ICsgMSk7CisJc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X3Bh cmFtIHAgPSB7CisJCS5jdHhfaWQgPSBjdHgsCisJCS5wYXJhbSA9IEk5MTVfQ09OVEVYVF9QQVJB TV9FTkdJTkVTLAorCQkuc2l6ZSA9IHNpemVvZigmZW5naW5lcyksCisJCS52YWx1ZSA9IHRvX3Vz ZXJfcG9pbnRlcigmZW5naW5lcykKKwl9OworCisJZW5naW5lcy5leHRlbnNpb25zID0gdG9fdXNl cl9wb2ludGVyKCZiYWxhbmNlciksCisJZW5naW5lcy5jbGFzc19pbnN0YW5jZVswXS5lbmdpbmVf Y2xhc3MgPSBJOTE1X0VOR0lORV9DTEFTU19JTlZBTElEOworCWVuZ2luZXMuY2xhc3NfaW5zdGFu Y2VbMF0uZW5naW5lX2luc3RhbmNlID0gSTkxNV9FTkdJTkVfQ0xBU1NfSU5WQUxJRF9OT05FOwor CW1lbWNweShlbmdpbmVzLmNsYXNzX2luc3RhbmNlICsgMSwgY2ksIGNvdW50ICogc2l6ZW9mKHVp bnQzMl90KSk7CisKKwlyZXR1cm4gX19nZW1fY29udGV4dF9zZXRfcGFyYW0oaTkxNSwgJnApOwor fQorCitzdGF0aWMgdm9pZCBzZXRfbG9hZF9iYWxhbmNlcihpbnQgaTkxNSwgdWludDMyX3QgY3R4 LAorCQkJICAgICAgY29uc3Qgc3RydWN0IGNsYXNzX2luc3RhbmNlICpjaSwKKwkJCSAgICAgIHVu c2lnbmVkIGludCBjb3VudCkKK3sKKwlpZ3RfYXNzZXJ0X2VxKF9fc2V0X2xvYWRfYmFsYW5jZXIo aTkxNSwgY3R4LCBjaSwgY291bnQpLCAwKTsKK30KKworc3RhdGljIHVpbnQzMl90IGxvYWRfYmFs YW5jZXJfY3JlYXRlKGludCBpOTE1LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGNsYXNzX2luc3Rh bmNlICpjaSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl1aW50MzJfdCBjdHg7 CisKKwljdHggPSBnZW1fY29udGV4dF9jcmVhdGUoaTkxNSk7CisJc2V0X2xvYWRfYmFsYW5jZXIo aTkxNSwgY3R4LCBjaSwgY291bnQpOworCisJcmV0dXJuIGN0eDsKK30KKworc3RhdGljIHZvaWQg a2lja19rdGhyZWFkcyhpbnQgcGVyaW9kX3VzKQoreworCXNjaGVkX3lpZWxkKCk7CisJdXNsZWVw KHBlcmlvZF91cyk7Cit9CisKK3N0YXRpYyBkb3VibGUgbWVhc3VyZV9sb2FkKGludCBwbXUsIGlu dCBwZXJpb2RfdXMpCit7CisJdWludDY0X3QgZGF0YVsyXTsKKwl1aW50NjRfdCBkX3QsIGRfdjsK KworCWtpY2tfa3RocmVhZHMocGVyaW9kX3VzKTsKKworCWlndF9hc3NlcnRfZXEocmVhZChwbXUs IGRhdGEsIHNpemVvZihkYXRhKSksIHNpemVvZihkYXRhKSk7CisJZF92ID0gLWRhdGFbMF07CisJ ZF90ID0gLWRhdGFbMV07CisKKwl1c2xlZXAocGVyaW9kX3VzKTsKKworCWlndF9hc3NlcnRfZXEo cmVhZChwbXUsIGRhdGEsIHNpemVvZihkYXRhKSksIHNpemVvZihkYXRhKSk7CisJZF92ICs9IGRh dGFbMF07CisJZF90ICs9IGRhdGFbMV07CisKKwlyZXR1cm4gZF92IC8gKGRvdWJsZSlkX3Q7Cit9 CisKK3N0YXRpYyBkb3VibGUgbWVhc3VyZV9taW5fbG9hZChpbnQgcG11LCB1bnNpZ25lZCBpbnQg bnVtLCBpbnQgcGVyaW9kX3VzKQoreworCXVpbnQ2NF90IGRhdGFbMiArIG51bV07CisJdWludDY0 X3QgZF90LCBkX3ZbbnVtXTsKKwl1aW50NjRfdCBtaW4gPSAtMSwgbWF4ID0gMDsKKworCWtpY2tf a3RocmVhZHMocGVyaW9kX3VzKTsKKworCWlndF9hc3NlcnRfZXEocmVhZChwbXUsIGRhdGEsIHNp emVvZihkYXRhKSksIHNpemVvZihkYXRhKSk7CisJZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4g PCBudW07IG4rKykKKwkJZF92W25dID0gLWRhdGFbMiArIG5dOworCWRfdCA9IC1kYXRhWzFdOwor CisJdXNsZWVwKHBlcmlvZF91cyk7CisKKwlpZ3RfYXNzZXJ0X2VxKHJlYWQocG11LCBkYXRhLCBz aXplb2YoZGF0YSkpLCBzaXplb2YoZGF0YSkpOworCisJZF90ICs9IGRhdGFbMV07CisJZm9yICh1 bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCBudW07IG4rKykgeworCQlkX3Zbbl0gKz0gZGF0YVsyICsg bl07CisJCWlndF9kZWJ1ZygiZW5naW5lWyVkXTogJS4xZiUlXG4iLAorCQkJICBuLCBkX3Zbbl0g LyAoZG91YmxlKWRfdCAqIDEwMCk7CisJCWlmIChkX3Zbbl0gPCBtaW4pCisJCQltaW4gPSBkX3Zb bl07CisJCWlmIChkX3Zbbl0gPiBtYXgpCisJCQltYXggPSBkX3Zbbl07CisJfQorCisJaWd0X2Rl YnVnKCJlbGFwc2VkOiAlIlBSSXU2NCJucywgbG9hZCBbJS4xZiwgJS4xZl0lJVxuIiwKKwkJICBk X3QsIG1pbiAvIChkb3VibGUpZF90ICogMTAwLCAgbWF4IC8gKGRvdWJsZSlkX3QgKiAxMDApOwor CisJcmV0dXJuIG1pbiAvIChkb3VibGUpZF90OworfQorCitzdGF0aWMgdm9pZCBjaGVja19pbmRp dmlkdWFsX2VuZ2luZShpbnQgaTkxNSwKKwkJCQkgICAgdWludDMyX3QgY3R4LAorCQkJCSAgICBj b25zdCBzdHJ1Y3QgY2xhc3NfaW5zdGFuY2UgKmNpLAorCQkJCSAgICBpbnQgaWR4KQoreworCWln dF9zcGluX3QgKnNwaW47CisJZG91YmxlIGxvYWQ7CisJaW50IHBtdTsKKworCXBtdSA9IHBlcmZf aTkxNV9vcGVuKEk5MTVfUE1VX0VOR0lORV9CVVNZKGNpW2lkeF0uY2xhc3MsCisJCQkJCQkgIGNp W2lkeF0uaW5zdGFuY2UpKTsKKworCXNwaW4gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoaTkxNSwgLmN0 eCA9IGN0eCwgLmVuZ2luZSA9IGlkeCArIDEpOworCWxvYWQgPSBtZWFzdXJlX2xvYWQocG11LCAx MDAwMCk7CisJaWd0X3NwaW5fYmF0Y2hfZnJlZShpOTE1LCBzcGluKTsKKworCWNsb3NlKHBtdSk7 CisKKwlpZ3RfYXNzZXJ0X2YobG9hZCA+IDAuOTAsCisJCSAgICAgImVuZ2luZSAlZCAoY2xhc3M6 aW5zdGFuY2UgJWQ6JWQpIHdhcyBmb3VuZCB0byBiZSBvbmx5ICUuMWYlJSBidXN5XG4iLAorCQkg ICAgIGlkeCwgY2lbaWR4XS5jbGFzcywgY2lbaWR4XS5pbnN0YW5jZSwgbG9hZCoxMDApOworfQor CitzdGF0aWMgdm9pZCBpbmRpdmlkdWFsKGludCBpOTE1KQoreworCXVpbnQzMl90IGN0eDsKKwor CS8qCisJICogSTkxNV9DT05URVhUX1BBUkFNX0VOR0lORSBhbGxvd3MgdXMgdG8gaW5kZXggaW50 byB0aGUgdXNlcgorCSAqIHN1cHBsaWVkIGFycmF5IGZyb20gZ2VtX2V4ZWNidWYoKS4gT3VyIGNo ZWNrIGlzIHRvIGJ1aWxkIHRoZQorCSAqIGN0eC0+ZW5naW5lW10gd2l0aCB2YXJpb3VzIGRpZmZl cmVudCBlbmdpbmUgY2xhc3NlcywgZmVlZCBpbgorCSAqIGEgc3Bpbm5lciBhbmQgdGhlbiBhc2sg cG11IHRvIGNvbmZpcm0gaXQgdGhlIGV4cGVjdGVkIGVuZ2luZQorCSAqIHdhcyBidXN5LgorCSAq LworCisJY3R4ID0gZ2VtX2NvbnRleHRfY3JlYXRlKGk5MTUpOworCisJZm9yIChpbnQgbWFzayA9 IDA7IG1hc2sgPCAzMjsgbWFzaysrKSB7CisJCXN0cnVjdCBjbGFzc19pbnN0YW5jZSAqY2k7CisJ CXVuc2lnbmVkIGludCBjb3VudDsKKworCQljaSA9IGxpc3RfZW5naW5lcyhpOTE1LCAxdSA8PCBt YXNrLCAmY291bnQpOworCQlpZiAoIWNpKQorCQkJY29udGludWU7CisKKwkJaWd0X2RlYnVnKCJG b3VuZCAlZCBlbmdpbmVzIG9mIGNsYXNzICVkXG4iLCBjb3VudCwgbWFzayk7CisKKwkJZm9yIChp bnQgcGFzcyA9IDA7IHBhc3MgPCBjb3VudDsgcGFzcysrKSB7IC8qIGFwcHJveC4gY291bnQhICov CisJCQlpZ3RfcGVybXV0ZV9hcnJheShjaSwgY291bnQsIGlndF9leGNoYW5nZV9pbnQ2NCk7CisJ CQlzZXRfbG9hZF9iYWxhbmNlcihpOTE1LCBjdHgsIGNpLCBjb3VudCk7CisJCQlmb3IgKHVuc2ln bmVkIGludCBuID0gMDsgbiA8IGNvdW50OyBuKyspCisJCQkJY2hlY2tfaW5kaXZpZHVhbF9lbmdp bmUoaTkxNSwgY3R4LCBjaSwgbik7CisJCX0KKworCQlmcmVlKGNpKTsKKwl9CisKKwlnZW1fY29u dGV4dF9kZXN0cm95KGk5MTUsIGN0eCk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3BtdShpbnQgcG11 LCBjb25zdCBzdHJ1Y3QgY2xhc3NfaW5zdGFuY2UgKmNpKQoreworCXJldHVybiBwZXJmX2k5MTVf b3Blbl9ncm91cChJOTE1X1BNVV9FTkdJTkVfQlVTWShjaS0+Y2xhc3MsCisJCQkJCQkJIGNpLT5p bnN0YW5jZSksCisJCQkJICAgIHBtdSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBfX2JhdGNoX2Ny ZWF0ZShpbnQgaTkxNSwgdWludDMyX3Qgb2Zmc2V0KQoreworCWNvbnN0IHVpbnQzMl90IGJiZSA9 IE1JX0JBVENIX0JVRkZFUl9FTkQ7CisJdWludDMyX3QgaGFuZGxlOworCisJaGFuZGxlID0gZ2Vt X2NyZWF0ZShpOTE1LCBBTElHTihvZmZzZXQgKyA0LCA0MDk2KSk7CisJZ2VtX3dyaXRlKGk5MTUs IGhhbmRsZSwgb2Zmc2V0LCAmYmJlLCBzaXplb2YoYmJlKSk7CisKKwlyZXR1cm4gaGFuZGxlOwor fQorCitzdGF0aWMgdWludDMyX3QgYmF0Y2hfY3JlYXRlKGludCBpOTE1KQoreworCXJldHVybiBf X2JhdGNoX2NyZWF0ZShpOTE1LCAwKTsKK30KKworc3RhdGljIHZvaWQgZnVsbChpbnQgaTkxNSwg dW5zaWduZWQgaW50IGZsYWdzKQorI2RlZmluZSBQVUxTRSAweDEKKyNkZWZpbmUgTEFURSAweDIK K3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBiYXRjaCA9IHsKKwkJLmhhbmRs ZSA9IGJhdGNoX2NyZWF0ZShpOTE1KSwKKwl9OworCisJaWYgKGZsYWdzICYgTEFURSkKKwkJaWd0 X3JlcXVpcmVfc3dfc3luYygpOworCisJLyoKKwkgKiBJOTE1X0NPTlRFWFRfUEFSQU1fRU5HSU5F IGNoYW5nZXMgdGhlIG1lYW5pbmcgb2YgSTkxNV9FWEVDX0RFRkFVTFQKKwkgKiB0byBwcm92aWRl IGFuIGF1dG9tYXRpYyBzZWxlY3Rpb24gZnJvbSB0aGUgY3R4LT5lbmdpbmVbXS4gSXQKKwkgKiBl bXBsb3lzIGxvYWQtYmFsYW5jaW5nIHRvIGV2ZW5seSBkaXN0cmlidXRlIHRoZSB3b3JrbG9hZCB0 aGUKKwkgKiBhcnJheS4gSWYgd2Ugc3VibWl0IE4gc3Bpbm5lcnMsIHdlIGV4cGVjdCB0aGVtIHRv IGJlIHNpbXVsdGFuZW91c2x5CisJICogcnVubmluZyBhY3Jvc3MgTiBlbmdpbmVzIGFuZCB1c2Ug UE1VIHRvIGNvbmZpcm0gdGhhdCB0aGUgZW50aXJlCisJICogc2V0IG9mIGVuZ2luZXMgYXJlIGJ1 c3kuCisJICoKKwkgKiBXZSBjb21wbGljYXRlIG1hdHRlcnMgYnkgaW50ZXJwZXJzaW5nIHNob3J0 bGl2ZWQgdGFza3MgdG8gY2hhbGxlbmdlCisJICogdGhlIGtlcm5lbCB0byBzZWFyY2ggZm9yIHNw YWNlIGluIHdoaWNoIHRvIGluc2VydCBuZXcgYmF0Y2hlcy4KKwkgKi8KKworCisJZm9yIChpbnQg bWFzayA9IDA7IG1hc2sgPCAzMjsgbWFzaysrKSB7CisJCXN0cnVjdCBjbGFzc19pbnN0YW5jZSAq Y2k7CisJCWlndF9zcGluX3QgKnNwaW4gPSBOVUxMOworCQl1bnNpZ25lZCBpbnQgY291bnQ7CisJ CUlHVF9DT1JLX0ZFTkNFKGNvcmspOworCQlkb3VibGUgbG9hZDsKKwkJaW50IGZlbmNlID0gLTE7 CisJCWludCAqcG11OworCisJCWNpID0gbGlzdF9lbmdpbmVzKGk5MTUsIDF1IDw8IG1hc2ssICZj b3VudCk7CisJCWlmICghY2kpCisJCQljb250aW51ZTsKKworCQlpZ3RfZGVidWcoIkZvdW5kICVk IGVuZ2luZXMgb2YgY2xhc3MgJWRcbiIsIGNvdW50LCBtYXNrKTsKKworCQlwbXUgPSBtYWxsb2Mo c2l6ZW9mKCpwbXUpICogY291bnQpOworCQlpZ3RfYXNzZXJ0KHBtdSk7CisKKwkJaWYgKGZsYWdz ICYgTEFURSkKKwkJCWZlbmNlID0gaWd0X2NvcmtfcGx1ZygmY29yaywgaTkxNSk7CisKKwkJcG11 WzBdID0gLTE7CisJCWZvciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwgY291bnQ7IG4rKykgewor CQkJdWludDMyX3QgY3R4OworCisJCQlwbXVbbl0gPSBhZGRfcG11KHBtdVswXSwgJmNpW25dKTsK KworCQkJaWYgKGZsYWdzICYgUFVMU0UpIHsKKwkJCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNi dWZmZXIyIGViID0geworCQkJCQkuYnVmZmVyc19wdHIgPSB0b191c2VyX3BvaW50ZXIoJmJhdGNo KSwKKwkJCQkJLmJ1ZmZlcl9jb3VudCA9IDEsCisJCQkJCS5yc3ZkMiA9IGZlbmNlLAorCQkJCQku ZmxhZ3MgPSBmbGFncyAmIExBVEUgPyBJOTE1X0VYRUNfRkVOQ0VfSU4gOiAwLAorCQkJCX07CisK KwkJCQlnZW1fZXhlY2J1ZihpOTE1LCAmZWIpOworCQkJfQorCisJCQkvKgorCQkJICogRWFjaCBz cGlubmVyIG5lZWRzIHRvIGJlIG9uZSBhIG5ldyB0aW1lbGluZSwKKwkJCSAqIG90aGVyd2lzZSB0 aGV5IHdpbGwganVzdCBzaXQgaW4gdGhlIHNpbmdsZSBxdWV1ZQorCQkJICogYW5kIG5vdCBydW4g Y29uY3VycmVudGx5LgorCQkJICovCisJCQljdHggPSBsb2FkX2JhbGFuY2VyX2NyZWF0ZShpOTE1 LCBjaSwgY291bnQpOworCisJCQlpZiAoc3BpbiA9PSBOVUxMKSB7CisJCQkJc3BpbiA9IF9faWd0 X3NwaW5fYmF0Y2hfbmV3KGk5MTUsIGN0eCwgMCwgMCk7CisJCQl9IGVsc2UgeworCQkJCXN0cnVj dCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyIG9iaiA9IHsKKwkJCQkJLmhhbmRsZSA9IHNwaW4t PmhhbmRsZSwKKwkJCQl9OworCQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgZWIg PSB7CisJCQkJCS5idWZmZXJzX3B0ciA9IHRvX3VzZXJfcG9pbnRlcigmb2JqKSwKKwkJCQkJLmJ1 ZmZlcl9jb3VudCA9IDEsCisJCQkJCS5yc3ZkMSA9IGN0eCwKKwkJCQkJLnJzdmQyID0gZmVuY2Us CisJCQkJCS5mbGFncyA9IGZsYWdzICYgTEFURSA/IEk5MTVfRVhFQ19GRU5DRV9JTiA6IDAsCisJ CQkJfTsKKworCQkJCWdlbV9leGVjYnVmKGk5MTUsICZlYik7CisJCQl9CisKKwkJCWdlbV9jb250 ZXh0X2Rlc3Ryb3koaTkxNSwgY3R4KTsKKwkJfQorCisJCWlmIChmbGFncyAmIExBVEUpIHsKKwkJ CWlndF9jb3JrX3VucGx1ZygmY29yayk7CisJCQljbG9zZShmZW5jZSk7CisJCX0KKworCQlsb2Fk ID0gbWVhc3VyZV9taW5fbG9hZChwbXVbMF0sIGNvdW50LCAxMDAwMCk7CisJCWlndF9zcGluX2Jh dGNoX2ZyZWUoaTkxNSwgc3Bpbik7CisKKwkJY2xvc2UocG11WzBdKTsKKwkJZnJlZShwbXUpOwor CisJCWZyZWUoY2kpOworCisJCWlndF9hc3NlcnRfZihsb2FkID4gMC45MCwKKwkJCSAgICAgIm1p bmltdW0gbG9hZCBmb3IgJWQgeCBjbGFzczolZCB3YXMgZm91bmQgdG8gYmUgb25seSAlLjFmJSUg YnVzeVxuIiwKKwkJCSAgICAgY291bnQsIG1hc2ssIGxvYWQqMTAwKTsKKwl9CisKKwlnZW1fY2xv c2UoaTkxNSwgYmF0Y2guaGFuZGxlKTsKK30KKworc3RhdGljIHZvaWQgcGluZyhpbnQgaTkxNSwg dWludDMyX3QgY3R4LCB1bnNpZ25lZCBpbnQgZW5naW5lKQoreworCXN0cnVjdCBkcm1faTkxNV9n ZW1fZXhlY19vYmplY3QyIG9iaiA9IHsKKwkJLmhhbmRsZSA9IGJhdGNoX2NyZWF0ZShpOTE1KSwK Kwl9OworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgZXhlY2J1ZiA9IHsKKwkJLmJ1 ZmZlcnNfcHRyID0gdG9fdXNlcl9wb2ludGVyKCZvYmopLAorCQkuYnVmZmVyX2NvdW50ID0gMSwK KwkJLmZsYWdzID0gZW5naW5lLAorCQkucnN2ZDEgPSBjdHgsCisJfTsKKwlnZW1fZXhlY2J1Zihp OTE1LCAmZXhlY2J1Zik7CisJZ2VtX3N5bmMoaTkxNSwgb2JqLmhhbmRsZSk7CisJZ2VtX2Nsb3Nl KGk5MTUsIG9iai5oYW5kbGUpOworfQorCitzdGF0aWMgdm9pZCBzZW1hcGhvcmUoaW50IGk5MTUp Cit7CisJdWludDMyX3QgYmxvY2tbMl0sIHNjcmF0Y2g7CisJaWd0X3NwaW5fdCAqc3BpblszXTsK KworCS8qCisJICogSWYgd2UgYXJlIHVzaW5nIEhXIHNlbWFwaG9yZXMgdG8gbGF1bmNoIHNlcmlh bGlzZWQgcmVxdWVzdHMKKwkgKiBvbiBkaWZmZXJlbnQgZW5naW5lIGNvbmN1cnJlbnRseSwgd2Ug d2FudCB0byB2ZXJpZnkgdGhhdCByZWFsCisJICogd29yayBpcyB1bmltcGVkZWQuCisJICovCisJ aWd0X3JlcXVpcmUoZ2VtX3NjaGVkdWxlcl9oYXNfcHJlZW1wdGlvbihpOTE1KSk7CisKKwlibG9j a1swXSA9IGdlbV9jb250ZXh0X2NyZWF0ZShpOTE1KTsKKwlibG9ja1sxXSA9IGdlbV9jb250ZXh0 X2NyZWF0ZShpOTE1KTsKKworCXNjcmF0Y2ggPSBnZW1fY3JlYXRlKGk5MTUsIDQwOTYpOworCXNw aW5bMl0gPSBpZ3Rfc3Bpbl9iYXRjaF9uZXcoaTkxNSwgLmRlcGVuZGVuY3kgPSBzY3JhdGNoKTsK Kwlmb3IgKGludCBtYXNrID0gMTsgbWFzayA8IDMyOyBtYXNrKyspIHsKKwkJc3RydWN0IGNsYXNz X2luc3RhbmNlICpjaTsKKwkJdW5zaWduZWQgaW50IGNvdW50OworCQl1aW50MzJfdCB2aXA7CisK KwkJY2kgPSBsaXN0X2VuZ2luZXMoaTkxNSwgMXUgPDwgbWFzaywgJmNvdW50KTsKKwkJaWYgKCFj aSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjb3VudCA8IEFSUkFZX1NJWkUoYmxvY2spKQorCQkJ Y29udGludWU7CisKKwkJLyogRW5zdXJlIHRoYXQgd2UgY29tcGxldGVseSBvY2N1cHkgYWxsIGVu Z2luZXMgaW4gdGhpcyBncm91cCAqLworCQljb3VudCA9IEFSUkFZX1NJWkUoYmxvY2spOworCisJ CWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJc2V0X2xvYWRfYmFsYW5jZXIo aTkxNSwgYmxvY2tbaV0sIGNpLCBjb3VudCk7CisJCQlzcGluW2ldID0gX19pZ3Rfc3Bpbl9iYXRj aF9uZXcoaTkxNSwKKwkJCQkJCSAgICAgICAuY3R4ID0gYmxvY2tbaV0sCisJCQkJCQkgICAgICAg LmRlcGVuZGVuY3kgPSBzY3JhdGNoKTsKKwkJfQorCisJCS8qCisJCSAqIEVpdGhlciB3ZSBoYXZl bid0IGJsb2NrZWQgYm90aCBlbmdpbmVzIHdpdGggc2VtYXBob3JlcywKKwkJICogb3Igd2UgbGV0 IHRoZSB2aXAgdGhyb3VnaC4gSWYgbm90LCB3ZSBoYW5nLgorCQkgKi8KKwkJdmlwID0gZ2VtX2Nv bnRleHRfY3JlYXRlKGk5MTUpOworCQlzZXRfbG9hZF9iYWxhbmNlcihpOTE1LCB2aXAsIGNpLCBj b3VudCk7CisJCXBpbmcoaTkxNSwgdmlwLCAwKTsKKwkJZ2VtX2NvbnRleHRfZGVzdHJveShpOTE1 LCB2aXApOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCWlndF9zcGlu X2JhdGNoX2ZyZWUoaTkxNSwgc3BpbltpXSk7CisKKwkJZnJlZShjaSk7CisJfQorCWlndF9zcGlu X2JhdGNoX2ZyZWUoaTkxNSwgc3BpblsyXSk7CisJZ2VtX2Nsb3NlKGk5MTUsIHNjcmF0Y2gpOwor CisJZ2VtX2NvbnRleHRfZGVzdHJveShpOTE1LCBibG9ja1sxXSk7CisJZ2VtX2NvbnRleHRfZGVz dHJveShpOTE1LCBibG9ja1swXSk7Cit9CisKK3N0YXRpYyB2b2lkIHNtb2tldGVzdChpbnQgaTkx NSwgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgYmF0 Y2hbMl0gPSB7CisJCXsgLmhhbmRsZSA9IF9fYmF0Y2hfY3JlYXRlKGk5MTUsIDE2MzgwKSB9CisJ fTsKKwl1bnNpZ25lZCBpbnQgbmNvbnRleHQgPSAwOworCXVpbnQzMl90ICpjb250ZXh0cyA9IE5V TEw7CisJdWludDMyX3QgKmhhbmRsZXMgPSBOVUxMOworCisJaWd0X3JlcXVpcmVfc3dfc3luYygp OworCisJZm9yIChpbnQgbWFzayA9IDA7IG1hc2sgPCAzMjsgbWFzaysrKSB7CisJCXN0cnVjdCBj bGFzc19pbnN0YW5jZSAqY2k7CisJCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisKKwkJY2kgPSBs aXN0X2VuZ2luZXMoaTkxNSwgMXUgPDwgbWFzaywgJmNvdW50KTsKKwkJaWYgKCFjaSB8fCBjb3Vu dCA8IDIpIHsKKwkJCWZyZWUoY2kpOworCQkJY29udGludWU7CisJCX0KKworCQlpZ3RfZGVidWco IkZvdW5kICVkIGVuZ2luZXMgb2YgY2xhc3MgJWRcbiIsIGNvdW50LCBtYXNrKTsKKworCQluY29u dGV4dCArPSAxMjg7CisJCWNvbnRleHRzID0gcmVhbGxvYyhjb250ZXh0cywgc2l6ZW9mKCpjb250 ZXh0cykgKiBuY29udGV4dCk7CisJCWlndF9hc3NlcnQoY29udGV4dHMpOworCisJCWZvciAodW5z aWduZWQgaW50IG4gPSBuY29udGV4dCAtIDEyODsgbiA8IG5jb250ZXh0OyBuKyspIHsKKwkJCWNv bnRleHRzW25dID0gbG9hZF9iYWxhbmNlcl9jcmVhdGUoaTkxNSwgY2ksIGNvdW50KTsKKwkJCWln dF9hc3NlcnQoY29udGV4dHNbbl0pOworCQl9CisKKwkJZnJlZShjaSk7CisJfQorCWlndF9kZWJ1 ZygiQ3JlYXRlZCAlZCB2aXJ0dWFsIGVuZ2luZXMgKG9uZSBwZXIgY29udGV4dClcbiIsIG5jb250 ZXh0KTsKKwlpZ3RfcmVxdWlyZShuY29udGV4dCk7CisKKwljb250ZXh0cyA9IHJlYWxsb2MoY29u dGV4dHMsIHNpemVvZigqY29udGV4dHMpICogbmNvbnRleHQgKiA0KTsKKwlpZ3RfYXNzZXJ0KGNv bnRleHRzKTsKKwltZW1jcHkoY29udGV4dHMgKyBuY29udGV4dCwgY29udGV4dHMsIG5jb250ZXh0 ICogc2l6ZW9mKCpjb250ZXh0cykpOworCW5jb250ZXh0ICo9IDI7CisJbWVtY3B5KGNvbnRleHRz ICsgbmNvbnRleHQsIGNvbnRleHRzLCBuY29udGV4dCAqIHNpemVvZigqY29udGV4dHMpKTsKKwlu Y29udGV4dCAqPSAyOworCisJaGFuZGxlcyA9IG1hbGxvYyhzaXplb2YoKmhhbmRsZXMpICogbmNv bnRleHQpOworCWlndF9hc3NlcnQoaGFuZGxlcyk7CisJZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7 IG4gPCBuY29udGV4dDsgbisrKQorCQloYW5kbGVzW25dID0gZ2VtX2NyZWF0ZShpOTE1LCA0MDk2 KTsKKworCWlndF91bnRpbF90aW1lb3V0KHRpbWVvdXQpIHsKKwkJdW5zaWduZWQgaW50IGNvdW50 ID0gMSArIChyYW5kKCkgJSAobmNvbnRleHQgLSAxKSk7CisJCUlHVF9DT1JLX0ZFTkNFKGNvcmsp OworCQlpbnQgZmVuY2UgPSBpZ3RfY29ya19wbHVnKCZjb3JrLCBpOTE1KTsKKworCQlmb3IgKHVu c2lnbmVkIGludCBuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKKwkJCXN0cnVjdCBkcm1faTkxNV9n ZW1fZXhlY2J1ZmZlcjIgZWIgPSB7CisJCQkJLmJ1ZmZlcnNfcHRyID0gdG9fdXNlcl9wb2ludGVy KGJhdGNoKSwKKwkJCQkuYnVmZmVyX2NvdW50ID0gQVJSQVlfU0laRShiYXRjaCksCisJCQkJLnJz dmQxID0gY29udGV4dHNbbl0sCisJCQkJLnJzdmQyID0gZmVuY2UsCisJCQkJLmZsYWdzID0gSTkx NV9FWEVDX0JBVENIX0ZJUlNUIHwgSTkxNV9FWEVDX0ZFTkNFX0lOLAorCQkJfTsKKwkJCWJhdGNo WzFdLmhhbmRsZSA9IGhhbmRsZXNbbl07CisJCQlnZW1fZXhlY2J1ZihpOTE1LCAmZWIpOworCQl9 CisJCWlndF9wZXJtdXRlX2FycmF5KGhhbmRsZXMsIGNvdW50LCBpZ3RfZXhjaGFuZ2VfaW50KTsK KworCQlpZ3RfY29ya191bnBsdWcoJmNvcmspOworCQlmb3IgKHVuc2lnbmVkIGludCBuID0gMDsg biA8IGNvdW50OyBuKyspCisJCQlnZW1fc3luYyhpOTE1LCBoYW5kbGVzW25dKTsKKworCQljbG9z ZShmZW5jZSk7CisJfQorCisJZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCBuY29udGV4dDsg bisrKSB7CisJCWdlbV9jbG9zZShpOTE1LCBoYW5kbGVzW25dKTsKKwkJX19nZW1fY29udGV4dF9k ZXN0cm95KGk5MTUsIGNvbnRleHRzW25dKTsKKwl9CisJZnJlZShoYW5kbGVzKTsKKwlmcmVlKGNv bnRleHRzKTsKKwlnZW1fY2xvc2UoaTkxNSwgYmF0Y2hbMF0uaGFuZGxlKTsKK30KKworc3RhdGlj IGJvb2wgaGFzX2NvbnRleHRfZW5naW5lcyhpbnQgaTkxNSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVf Z2VtX2NvbnRleHRfcGFyYW0gcCA9IHsKKwkJLnBhcmFtID0gSTkxNV9DT05URVhUX1BBUkFNX0VO R0lORVMsCisJfTsKKworCXJldHVybiBfX2dlbV9jb250ZXh0X3NldF9wYXJhbShpOTE1LCAmcCkg PT0gMDsKK30KKworc3RhdGljIGJvb2wgaGFzX2xvYWRfYmFsYW5jZXIoaW50IGk5MTUpCit7CisJ c3RydWN0IGNsYXNzX2luc3RhbmNlIGNpID0ge307CisJdWludDMyX3QgY3R4OworCWludCBlcnI7 CisKKwljdHggPSBnZW1fY29udGV4dF9jcmVhdGUoaTkxNSk7CisJZXJyID0gX19zZXRfbG9hZF9i YWxhbmNlcihpOTE1LCBjdHgsICZjaSwgMSk7CisJZ2VtX2NvbnRleHRfZGVzdHJveShpOTE1LCBj dHgpOworCisJcmV0dXJuIGVyciA9PSAwOworfQorCitpZ3RfbWFpbgoreworCWludCBpOTE1ID0g LTE7CisKKwlpZ3Rfc2tpcF9vbl9zaW11bGF0aW9uKCk7CisKKwlpZ3RfZml4dHVyZSB7CisJCWk5 MTUgPSBkcm1fb3Blbl9kcml2ZXIoRFJJVkVSX0lOVEVMKTsKKwkJaWd0X3JlcXVpcmVfZ2VtKGk5 MTUpOworCisJCWdlbV9yZXF1aXJlX2NvbnRleHRzKGk5MTUpOworCQlpZ3RfcmVxdWlyZShoYXNf Y29udGV4dF9lbmdpbmVzKGk5MTUpKTsKKwkJaWd0X3JlcXVpcmUoaGFzX2xvYWRfYmFsYW5jZXIo aTkxNSkpOworCisJCWlndF9mb3JrX2hhbmdfZGV0ZWN0b3IoaTkxNSk7CisJfQorCisJaWd0X3N1 YnRlc3QoImluZGl2aWR1YWwiKQorCQlpbmRpdmlkdWFsKGk5MTUpOworCisJaWd0X3N1YnRlc3Rf Z3JvdXAgeworCQlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJCWNvbnN0IGNoYXIgKm5hbWU7CisJ CQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJCX0gcGhhc2VzW10gPSB7CisJCQl7ICIiLCAwIH0sCisJ CQl7ICItcHVsc2UiLCBQVUxTRSB9LAorCQkJeyAiLWxhdGUiLCBMQVRFIH0sCisJCQl7ICItbGF0 ZS1wdWxzZSIsIFBVTFNFIHwgTEFURSB9LAorCQkJeyB9CisJCX07CisJCWZvciAodHlwZW9mKCpw aGFzZXMpICpwID0gcGhhc2VzOyBwLT5uYW1lOyBwKyspCisJCQlpZ3Rfc3VidGVzdF9mKCJmdWxs JXMiLCBwLT5uYW1lKQorCQkJCWZ1bGwoaTkxNSwgcC0+ZmxhZ3MpOworCX0KKworCWlndF9zdWJ0 ZXN0KCJzZW1hcGhvcmUiKQorCQlzZW1hcGhvcmUoaTkxNSk7CisKKwlpZ3Rfc3VidGVzdCgic21v a2UiKQorCQlzbW9rZXRlc3QoaTkxNSwgMjApOworCisJaWd0X2ZpeHR1cmUgeworCQlpZ3Rfc3Rv cF9oYW5nX2RldGVjdG9yKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzb24uYnVpbGQg Yi90ZXN0cy9tZXNvbi5idWlsZAppbmRleCAwNTM5YzIwYzguLmJkMmRiODI1ZSAxMDA2NDQKLS0t IGEvdGVzdHMvbWVzb24uYnVpbGQKKysrIGIvdGVzdHMvbWVzb24uYnVpbGQKQEAgLTI5Myw2ICsy OTMsMTMgQEAgdGVzdF9leGVjdXRhYmxlcyArPSBleGVjdXRhYmxlKCdnZW1fZWlvJywKIAkgICBp bnN0YWxsIDogdHJ1ZSkKIHRlc3RfbGlzdCArPSAnZ2VtX2VpbycKIAordGVzdF9leGVjdXRhYmxl cyArPSBleGVjdXRhYmxlKCdnZW1fZXhlY19iYWxhbmNlcicsICdpOTE1L2dlbV9leGVjX2JhbGFu Y2VyLmMnLAorCSAgIGRlcGVuZGVuY2llcyA6IHRlc3RfZGVwcyArIFsgbGliX2lndF9wZXJmIF0s CisJICAgaW5zdGFsbF9kaXIgOiBsaWJleGVjZGlyLAorCSAgIGluc3RhbGxfcnBhdGggOiBsaWJl eGVjZGlyX3JwYXRoZGlyLAorCSAgIGluc3RhbGwgOiB0cnVlKQordGVzdF9wcm9ncyArPSAnZ2Vt X2V4ZWNfYmFsYW5jZXInCisKIHRlc3RfZXhlY3V0YWJsZXMgKz0gZXhlY3V0YWJsZSgnZ2VtX21v Y3Nfc2V0dGluZ3MnLAogCSAgIGpvaW5fcGF0aHMoJ2k5MTUnLCAnZ2VtX21vY3Nfc2V0dGluZ3Mu YycpLAogCSAgIGRlcGVuZGVuY2llcyA6IHRlc3RfZGVwcyArIFsgbGliX2lndF9wZXJmIF0sCi0t IAoyLjIwLjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpo dHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeA==