From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH i-g-t v14 2/2] tests/gem_ctx_sseu: Dynamic (sub)slice programming tests Date: Mon, 17 Sep 2018 12:28:12 +0100 Message-ID: <20180917112812.28886-1-tvrtko.ursulin@linux.intel.com> References: <153694186725.4114.333645262093742066@skylake-alporthouse-com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm1-x341.google.com (mail-wm1-x341.google.com [IPv6:2a00:1450:4864:20::341]) by gabe.freedesktop.org (Postfix) with ESMTPS id 1234B89F47 for ; Mon, 17 Sep 2018 11:28:20 +0000 (UTC) Received: by mail-wm1-x341.google.com with SMTP id j25-v6so4473600wmc.1 for ; Mon, 17 Sep 2018 04:28:20 -0700 (PDT) In-Reply-To: <153694186725.4114.333645262093742066@skylake-alporthouse-com> 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 RnJvbTogTGlvbmVsIExhbmR3ZXJsaW4gPGxpb25lbC5nLmxhbmR3ZXJsaW5AaW50ZWwuY29tPgoK VmVyaWZ5IHRoYXQgdGhlIHBlci1jb250ZXh0IGR5bmFtaWMgU1NFVSB1QVBJIHdvcmtzIGFzIGV4 cGVjdGVkLgoKVG8gYWNoaWV2ZSB0aGF0LCBpbiB0aGUgYWJzZW5jZSBvZiBhIGJldHRlciBtZWNo YW1pc20sIHdlIHJlYWQgdGhlIHZhbHVlCm9mIFBXUl9DTEtfU1RBVEUgcmVnaXN0ZXIsIG9yIHVz ZSBNSV9TRVRfUFJFRElDQVRFIG9uIHBsYXRmb3JtcyBiZWZvcmUKQ2Fubm9ubGFrZS4KClRoaXMg cmVnaXN0ZXIgaXMgd3JpdHRlbiB0byBieSB0aGUgR1BVIG9uIGNvbnRleHQgcmVzdG9yZSBzbyB0 aGlzIHdheQp3ZSB2ZXJpZnkgaTkxNSBpcyBjb3JyZWN0bHkgdXBkYXRpbmcgdGhlIGNvbnRleHQg aW1hZ2UgaW4gYWxsCmNpcmN1bXN0YW5jZXMuCgp2MjogQWRkIHN1YnNsaWNlIHRlc3RzIChMaW9u ZWwpCiAgICBVc2UgTUlfU0VUX1BSRURJQ0FURSBmb3IgZnVydGhlciB2ZXJpZmljYXRpb24gd2hl biBhdmFpbGFibGUgKExpb25lbCkKCnYzOiBSZW5hbWUgdG8gZ2VtX2N0eF9ycGNzIChMaW9uZWwp Cgp2NDogVXBkYXRlIGtlcm5lbCBBUEkgKExpb25lbCkKICAgIEFkZCAwIHZhbHVlIHRlc3QgKExp b25lbCkKICAgIEV4ZXJjaXNlIGludmFsaWQgdmFsdWVzIChMaW9uZWwpCgp2NTogQWRkIHBlcmYg dGVzdHMgKExpb25lbCkKCnY2OiBBZGQgbmV3IHN5c2ZzIGVudHJ5IHRlc3RzIChMaW9uZWwpCgp2 NzogVGVzdCByc3ZkIGZpZWxkcwogICAgVXBkYXRlIGZvciBrZXJuZWwgc2VyaWVzIGNoYW5nZXMK CnY4OiBEcm9wIHRlc3Rfbm9fc3NldV9zdXBwb3J0KCkgdGVzdCAoS2VsdmluKQogICAgRHJvcCBk cm1faW50ZWxfKigpIGFwaXMgKENocmlzKQoKdjk6IGJ5IENocmlzOgogICAgRHJvcCBhbGwgZG9f aW9jdGwvZG9faW9jdGxfZXJyKCkKICAgIFVzZSBnZW1fY29udGV4dF9bZ3NdZXRfcGFyYW0oKQog ICAgVXNlIGdlbV9yZWFkKCkgaW5zdGVhZCBvZiBtYXBwaW5nIG1lbW9yeQogICAgYnkgTGlvbmVs OgogICAgVGVzdCBkeW5hbWljIHNzZXUgb24vb2ZmIG1vcmUKClR2cnRrbyBVcnN1bGluOgoKdjEw OgogKiBWYXJpb3VzIHN0eWxlIHR3ZWFrcyBhbmQgcmVmYWN0b3JpbmdzLgogKiBOZXcgdGVzdCBj b3ZlcmFnZS4KCnYxMToKICogQ2hhbmdlIHBsYXRmb3JtIHN1cHBvcnQgdG8ganVzdCBHZW4xMS4K ICogU2ltcGxpZnkgYXZhaWxhYmlsaXR5IHRlc3QuIChDaHJpcyBXaWxzb24pCiAqIE1vcmUgaW52 YWxpZCBwb2ludGVyIHRlc3RzLiAoQ2hyaXMgV2lsc29uKQoKdjEyOgogKiBGaXggTUFQX0ZJWEVE IHVzZSAoZG9oISkuCiAqIEZpeCBnZXQvc2V0IGNvcHkmcGFzdGUgZXJyb3JzLgogKiBEcm9wIHN1 cHBvcnRlZCBwbGF0Zm9ybSB0ZXN0LiAoQ2hyaXMgV2lsc29uKQogKiBBZGQgbW1hcF9fZ3R0IHRl c3QuIChDaHJpcyBXaWxzb24pCgp2MTM6CiAqIENvbW1pdCBtZXNzYWdlIHR3ZWFrcy4KICogQWRk ZWQgcmVzZXQvaGFuZy9zdXNwZW5kIHRlc3RzLiAoQ2hyaXMgV2lsc29uKQogKiBBc3NlcnQgc3Bp bm5lciBpcyBidXN5LiAoQ2hyaXMgV2lsc29uKQogKiBSZW1vdmUgc29tZSBtb3JlIEFCSSBhc3N1 bXB0aW9ucy4gKENocmlzIFdpbHNvbikKCnYxNDoKICogVXNlIGRlZmF1bHQgcmVzdW1lIHRpbWUu IChDaHJpcyBXaWxzb24pCiAqIFRyaWdnZXIgaGFuZyBhZnRlciBycGNzIHJlYWQgYmF0Y2ggaGFz IGJlZW4gc3VibWl0dGVkLiAoQ2hyaXMgV2lsc29uKQoKU2lnbmVkLW9mZi1ieTogTGlvbmVsIExh bmR3ZXJsaW4gPGxpb25lbC5nLmxhbmR3ZXJsaW5AaW50ZWwuY29tPgpTaWduZWQtb2ZmLWJ5OiBU dnJ0a28gVXJzdWxpbiA8dHZydGtvLnVyc3VsaW5AaW50ZWwuY29tPgotLS0KIHRlc3RzL01ha2Vm aWxlLmFtICAgICAgfCAgICAxICsKIHRlc3RzL01ha2VmaWxlLnNvdXJjZXMgfCAgICAxICsKIHRl c3RzL2dlbV9jdHhfcGFyYW0uYyAgfCAgICA0ICstCiB0ZXN0cy9nZW1fY3R4X3NzZXUuYyAgIHwg MTEyMCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiB0ZXN0cy9tZXNv bi5idWlsZCAgICAgIHwgICAgNyArCiA1IGZpbGVzIGNoYW5nZWQsIDExMzIgaW5zZXJ0aW9ucygr KSwgMSBkZWxldGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHRlc3RzL2dlbV9jdHhfc3NldS5j CgpkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuYW0gYi90ZXN0cy9NYWtlZmlsZS5hbQppbmRl eCBlZTVhN2M1ZTgzYjguLjZiNjdiZDJjYzE3YSAxMDA2NDQKLS0tIGEvdGVzdHMvTWFrZWZpbGUu YW0KKysrIGIvdGVzdHMvTWFrZWZpbGUuYW0KQEAgLTEwNyw2ICsxMDcsNyBAQCBnZW1fY2xvc2Vf cmFjZV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChUSFJFQURfQ0ZMQUdTKQogZ2VtX2Nsb3NlX3Jh Y2VfTERBREQgPSAkKExEQUREKSAtbHB0aHJlYWQKIGdlbV9jdHhfdGhyYXNoX0NGTEFHUyA9ICQo QU1fQ0ZMQUdTKSAkKFRIUkVBRF9DRkxBR1MpCiBnZW1fY3R4X3RocmFzaF9MREFERCA9ICQoTERB REQpIC1scHRocmVhZAorZ2VtX2N0eF9zc2V1X0xEQUREID0gJChMREFERCkgJCh0b3BfYnVpbGRk aXIpL2xpYi9saWJpZ3RfcGVyZi5sYQogZ2VtX2V4ZWNfcGFyYWxsZWxfQ0ZMQUdTID0gJChBTV9D RkxBR1MpICQoVEhSRUFEX0NGTEFHUykKIGdlbV9leGVjX3BhcmFsbGVsX0xEQUREID0gJChMREFE RCkgLWxwdGhyZWFkCiBnZW1fZmVuY2VfdGhyYXNoX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKFRI UkVBRF9DRkxBR1MpCmRpZmYgLS1naXQgYS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzIGIvdGVzdHMv TWFrZWZpbGUuc291cmNlcwppbmRleCBjODQ5MzNmMWQ5NzEuLmY4ZjJjOGQ2N2Q3MiAxMDA2NDQK LS0tIGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcworKysgYi90ZXN0cy9NYWtlZmlsZS5zb3VyY2Vz CkBAIC01Niw2ICs1Niw3IEBAIFRFU1RTX3Byb2dzID0gXAogCWdlbV9jdHhfZXhlYyBcCiAJZ2Vt X2N0eF9pc29sYXRpb24gXAogCWdlbV9jdHhfcGFyYW0gXAorCWdlbV9jdHhfc3NldSBcCiAJZ2Vt X2N0eF9zd2l0Y2ggXAogCWdlbV9jdHhfdGhyYXNoIFwKIAlnZW1fZG91YmxlX2lycV9sb29wIFwK ZGlmZiAtLWdpdCBhL3Rlc3RzL2dlbV9jdHhfcGFyYW0uYyBiL3Rlc3RzL2dlbV9jdHhfcGFyYW0u YwppbmRleCBjNDZmZDcwOWIwZDcuLmFmMWFmZWFhMmYyZiAxMDA2NDQKLS0tIGEvdGVzdHMvZ2Vt X2N0eF9wYXJhbS5jCisrKyBiL3Rlc3RzL2dlbV9jdHhfcGFyYW0uYwpAQCAtMjk0LDExICsyOTQs MTMgQEAgaWd0X21haW4KIAkJCXNldF9wcmlvcml0eShmZCk7CiAJfQogCisJLyogSTkxNV9DT05U RVhUX1BBUkFNX1NTRVUgdGVzdHMgYXJlIGxvY2F0ZWQgaW4gZ2VtX2N0eF9zc2V1LmMgKi8KKwog CS8qIE5PVEU6IFRoaXMgdGVzdGNhc2UgaW50ZW50aW9uYWxseSB0ZXN0cyBmb3IgdGhlIG5leHQg ZnJlZSBwYXJhbWV0ZXIKIAkgKiB0byBjYXRjaCBBQkkgZXh0ZW5zaW9ucy4gRG9uJ3QgImZpeCIg dGhpcyB0ZXN0Y2FzZSB3aXRob3V0IGFkZGluZyBhbGwKIAkgKiB0aGUgdGVzdHMgZm9yIHRoZSBu ZXcgcGFyYW0gZmlyc3QuCiAJICovCi0JYXJnLnBhcmFtID0gSTkxNV9DT05URVhUX1BBUkFNX1BS SU9SSVRZICsgMTsKKwlhcmcucGFyYW0gPSBJOTE1X0NPTlRFWFRfUEFSQU1fU1NFVSArIDE7CiAK IAlpZ3Rfc3VidGVzdCgiaW52YWxpZC1wYXJhbS1nZXQiKSB7CiAJCWFyZy5jdHhfaWQgPSBjdHg7 CmRpZmYgLS1naXQgYS90ZXN0cy9nZW1fY3R4X3NzZXUuYyBiL3Rlc3RzL2dlbV9jdHhfc3NldS5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uOWRkZTNlNDU3YjcxCi0t LSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ2VtX2N0eF9zc2V1LmMKQEAgLTAsMCArMSwxMTIwIEBA CisvKgorICogQ29weXJpZ2h0IMKpIDIwMTctMjAxOCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAq IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVy c29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQg ZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUg U29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlv bgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRp c3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3 YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1 cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cisg KgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3Rp Y2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBp biBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUu CisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFO VFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9U IExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVW RU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUg Rk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElO IEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZS T00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0Ug T1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgor ICogICAgTGlvbmVsIExhbmR3ZXJsaW4gPGxpb25lbC5nLmxhbmR3ZXJsaW5AaW50ZWwuY29tPgor ICoKKyAqLworCisjaW5jbHVkZSAiaWd0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRl IDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNp bmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGVycm5vLmg+ CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lz L3dhaXQuaD4KKworI2luY2x1ZGUgImlndF9kdW1teWxvYWQuaCIKKyNpbmNsdWRlICJpZ3RfcGVy Zi5oIgorI2luY2x1ZGUgImlndF9zeXNmcy5oIgorI2luY2x1ZGUgImlvY3RsX3dyYXBwZXJzLmgi CisKK0lHVF9URVNUX0RFU0NSSVBUSU9OKCJUZXN0IGNvbnRleHQgcmVuZGVyIHBvd2VyZ2F0aW5n IHByb2dyYW1taW5nLiIpOworCisjZGVmaW5lIE1JX1NUT1JFX1JFR0lTVEVSX01FTSAoMHgyNCA8 PCAyMykKKworI2RlZmluZSBNSV9TRVRfUFJFRElDQVRFICAgICAgKDB4MSA8PCAyMykKKyNkZWZp bmUgIE1JX1NFVF9QUkVESUNBVEVfTk9PUF9ORVZFUiAgICAgICAgICgwKQorI2RlZmluZSAgTUlf U0VUX1BSRURJQ0FURV9OT09QX1JFU1VMVDJfQ0xFQVIgKDEpCisjZGVmaW5lICBNSV9TRVRfUFJF RElDQVRFX05PT1BfUkVTVUxUMl9TRVQgICAoMikKKyNkZWZpbmUgIE1JX1NFVF9QUkVESUNBVEVf Tk9PUF9SRVNVTFRfQ0xFQVIgICgzKQorI2RlZmluZSAgTUlfU0VUX1BSRURJQ0FURV9OT09QX1JF U1VMVF9TRVQgICAgKDQpCisjZGVmaW5lICBNSV9TRVRfUFJFRElDQVRFXzFfU0xJQ0VTICAgICAg ICAgICAoNSkKKyNkZWZpbmUgIE1JX1NFVF9QUkVESUNBVEVfMl9TTElDRVMgICAgICAgICAgICg2 KQorI2RlZmluZSAgTUlfU0VUX1BSRURJQ0FURV8zX1NMSUNFUyAgICAgICAgICAgKDcpCisKKyNk ZWZpbmUgR0VOOF9SX1BXUl9DTEtfU1RBVEUJCTB4MjBDOAorI2RlZmluZSAgIEdFTjhfUlBDU19F TkFCTEUJCSgxIDw8IDMxKQorI2RlZmluZSAgIEdFTjhfUlBDU19TX0NOVF9FTkFCTEUJKDEgPDwg MTgpCisjZGVmaW5lICAgR0VOOF9SUENTX1NfQ05UX1NISUZUCQkxNQorI2RlZmluZSAgIEdFTjhf UlBDU19TX0NOVF9NQVNLCQkoMHg3IDw8IEdFTjhfUlBDU19TX0NOVF9TSElGVCkKKyNkZWZpbmUg ICBHRU4xMV9SUENTX1NfQ05UX1NISUZUCTEyCisjZGVmaW5lICAgR0VOMTFfUlBDU19TX0NOVF9N QVNLCQkoMHgzZiA8PCBHRU4xMV9SUENTX1NfQ05UX1NISUZUKQorI2RlZmluZSAgIEdFTjhfUlBD U19TU19DTlRfRU5BQkxFCSgxIDw8IDExKQorI2RlZmluZSAgIEdFTjhfUlBDU19TU19DTlRfU0hJ RlQJOAorI2RlZmluZSAgIEdFTjhfUlBDU19TU19DTlRfTUFTSwkJKDB4NyA8PCBHRU44X1JQQ1Nf U1NfQ05UX1NISUZUKQorI2RlZmluZSAgIEdFTjhfUlBDU19FVV9NQVhfU0hJRlQJNAorI2RlZmlu ZSAgIEdFTjhfUlBDU19FVV9NQVhfTUFTSwkJKDB4ZiA8PCBHRU44X1JQQ1NfRVVfTUFYX1NISUZU KQorI2RlZmluZSAgIEdFTjhfUlBDU19FVV9NSU5fU0hJRlQJMAorI2RlZmluZSAgIEdFTjhfUlBD U19FVV9NSU5fTUFTSwkJKDB4ZiA8PCBHRU44X1JQQ1NfRVVfTUlOX1NISUZUKQorCisjZGVmaW5l IFJDU19USU1FU1RBTVAgKDB4MjAwMCArIDB4MzU4KQorCitzdGF0aWMgdW5zaWduZWQgaW50IF9f aW50ZWxfZ2VuX18sIF9faW50ZWxfZGV2aWRfXzsKK3N0YXRpYyB1aW50NjRfdCBfX3NsaWNlX21h c2tfXywgX19zdWJzbGljZV9tYXNrX187CitzdGF0aWMgdW5zaWduZWQgaW50IF9fc2xpY2VfY291 bnRfXywgX19zdWJzbGljZV9jb3VudF9fOworCitzdGF0aWMgdWludDY0X3QgbWFza19taW51c19v bmUodWludDY0X3QgbWFzaykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkg PCAoc2l6ZW9mKG1hc2spICogOCAtIDEpOyBpKyspIHsKKwkJaWYgKCgxVUxMIDw8IGkpICYgbWFz aykKKwkJCXJldHVybiBtYXNrICYgfigxVUxMIDw8IGkpOworCX0KKworCWlndF9hc3NlcnQoMCk7 CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBtYXNrX3BsdXNfb25lKHVpbnQ2NF90 IG1hc2spCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZiht YXNrKSAqIDggLSAxKTsgaSsrKSB7CisJCWlmICgoKDFVTEwgPDwgaSkgJiBtYXNrKSA9PSAwKQor CQkJcmV0dXJuIG1hc2sgfCAoMVVMTCA8PCBpKTsKKwl9CisKKwlpZ3RfYXNzZXJ0KDApOworCXJl dHVybiAwOworfQorCitzdGF0aWMgdWludDY0X3QgbWFza19taW51cyh1aW50NjRfdCBtYXNrLCBp bnQgbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJ CW1hc2sgPSBtYXNrX21pbnVzX29uZShtYXNrKTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0 aWMgdWludDY0X3QgbWFza19wbHVzKHVpbnQ2NF90IG1hc2ssIGludCBuKQoreworCXVuc2lnbmVk IGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJbWFzayA9IG1hc2tfcGx1c19v bmUobWFzayk7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIHVpbnQzMl90ICoKK2ZpbGxf cmVsb2NhdGlvbih1aW50MzJfdCAqYmF0Y2gsCisJCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2Nh dGlvbl9lbnRyeSAqcmVsb2MsCisJCXVpbnQzMl90IGdlbV9oYW5kbGUsIHVpbnQzMl90IGRlbHRh LCAvKiBpbiBieXRlcyAqLworCQl1aW50MzJfdCBvZmZzZXQsIC8qIGluIGR3b3JkcyAqLworCQl1 aW50MzJfdCByZWFkX2RvbWFpbnMsIHVpbnQzMl90IHdyaXRlX2RvbWFpbnMpCit7CisJcmVsb2Mt PnRhcmdldF9oYW5kbGUgPSBnZW1faGFuZGxlOworCXJlbG9jLT5kZWx0YSA9IGRlbHRhOworCXJl bG9jLT5vZmZzZXQgPSBvZmZzZXQgKiBzaXplb2YodWludDMyX3QpOworCXJlbG9jLT5wcmVzdW1l ZF9vZmZzZXQgPSAwOworCXJlbG9jLT5yZWFkX2RvbWFpbnMgPSByZWFkX2RvbWFpbnM7CisJcmVs b2MtPndyaXRlX2RvbWFpbiA9IHdyaXRlX2RvbWFpbnM7CisKKwkqYmF0Y2grKyA9IGRlbHRhOwor CSpiYXRjaCsrID0gMDsKKworCXJldHVybiBiYXRjaDsKK30KKworCitzdGF0aWMgdWludDMyX3QK K3JlYWRfcnBjc19yZWcoaW50IGZkLCB1aW50MzJfdCBjdHgsIHVpbnQzMl90IGV4cGVjdGVkX3Ns aWNlcywgaWd0X3NwaW5fdCAqc3BpbikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZm ZXIyIGV4ZWNidWYgPSB7IH07CisJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5 IHJlbG9jc1syXTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBvYmpbMl07CisJ dWludDMyX3QgKmJhdGNoLCAqYiwgZGF0YVsyXTsKKwl1bnNpZ25lZCBpbnQgbl9yZWxvY3MgPSAw OworCXVpbnQzMl90IHJwY3M7CisKKwltZW1zZXQob2JqLCAwLCBzaXplb2Yob2JqKSk7CisJb2Jq WzBdLmhhbmRsZSA9IGdlbV9jcmVhdGUoZmQsIDQwOTYpOworCW9ialsxXS5oYW5kbGUgPSBnZW1f Y3JlYXRlKGZkLCA0MDk2KTsKKworCWJhdGNoID0gYiA9CisJICAgICAgZ2VtX21tYXBfX2NwdShm ZCwgb2JqWzFdLmhhbmRsZSwgMCwgNDA5NiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CisKKwlp ZiAoZXhwZWN0ZWRfc2xpY2VzICE9IDAgJiYgX19pbnRlbF9nZW5fXyA8IDEwKQorCQkqYisrID0g TUlfU0VUX1BSRURJQ0FURSB8ICgxIC0gMSkgfAorCQkgICAgICAgKE1JX1NFVF9QUkVESUNBVEVf MV9TTElDRVMgKyBleHBlY3RlZF9zbGljZXMgLSAxKTsKKworCSpiKysgPSBNSV9TVE9SRV9SRUdJ U1RFUl9NRU0gfCAoNCAtIDIpOworCSpiKysgPSBSQ1NfVElNRVNUQU1QOworCWIgPSBmaWxsX3Jl bG9jYXRpb24oYiwgJnJlbG9jc1tuX3JlbG9jcysrXSwgb2JqWzBdLmhhbmRsZSwKKwkJCSAgICAw LCBiIC0gYmF0Y2gsCisJCQkgICAgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUiwgSTkxNV9HRU1fRE9N QUlOX1JFTkRFUik7CisKKwkqYisrID0gTUlfU1RPUkVfUkVHSVNURVJfTUVNIHwgKDQgLSAyKTsK KwkqYisrID0gR0VOOF9SX1BXUl9DTEtfU1RBVEU7CisJYiA9IGZpbGxfcmVsb2NhdGlvbihiLCAm cmVsb2NzW25fcmVsb2NzKytdLCBvYmpbMF0uaGFuZGxlLAorCQkJICAgIDQsIGIgLSBiYXRjaCwK KwkJCSAgICBJOTE1X0dFTV9ET01BSU5fUkVOREVSLCBJOTE1X0dFTV9ET01BSU5fUkVOREVSKTsK KworCWlmIChleHBlY3RlZF9zbGljZXMgIT0gMCAmJiBfX2ludGVsX2dlbl9fIDwgMTApCisJCSpi KysgPSBNSV9TRVRfUFJFRElDQVRFIHwgKDEgLSAxKSB8IE1JX1NFVF9QUkVESUNBVEVfTk9PUF9O RVZFUjsKKworCSpiKysgPSBNSV9CQVRDSF9CVUZGRVJfRU5EOworCisJZ2VtX211bm1hcChiYXRj aCwgNDA5Nik7CisKKwlvYmpbMV0ucmVsb2NhdGlvbl9jb3VudCA9IG5fcmVsb2NzOworCW9ialsx XS5yZWxvY3NfcHRyID0gdG9fdXNlcl9wb2ludGVyKHJlbG9jcyk7CisKKwlleGVjYnVmLmJ1ZmZl cnNfcHRyID0gdG9fdXNlcl9wb2ludGVyKG9iaik7CisJZXhlY2J1Zi5idWZmZXJfY291bnQgPSBB UlJBWV9TSVpFKG9iaik7CisJaTkxNV9leGVjYnVmZmVyMl9zZXRfY29udGV4dF9pZChleGVjYnVm LCBjdHgpOworCisJZ2VtX2V4ZWNidWYoZmQsICZleGVjYnVmKTsKKworCWlmIChzcGluKSB7CisJ CWlndF9hc3NlcnQoZ2VtX2JvX2J1c3koZmQsIHNwaW4tPmhhbmRsZSkpOworCQlpZ3Rfc3Bpbl9i YXRjaF9lbmQoc3Bpbik7CisJfQorCisJZ2VtX3JlYWQoZmQsIG9ialswXS5oYW5kbGUsIDAsIGRh dGEsIHNpemVvZihkYXRhKSk7CisKKwlycGNzID0gZGF0YVsxXTsKKworCWlndF9kZWJ1ZygicmNz X3RpbWVzdGFtcD0weCV4IHJwY3M9MHgleFxuIiwgZGF0YVswXSwgZGF0YVsxXSk7CisKKwlnZW1f Y2xvc2UoZmQsIG9ialswXS5oYW5kbGUpOworCWdlbV9jbG9zZShmZCwgb2JqWzFdLmhhbmRsZSk7 CisKKwlyZXR1cm4gcnBjczsKK30KKwordHlwZWRlZiB1aW50MzJfdCAoKnJlYWRfc2xpY2VfY291 bnRfZikoaW50IGZkLCB1aW50MzJfdCBjdHgsIHVpbnQzMl90IGV4cGVjdGVkLAorCQkJCSAgICAg ICBpZ3Rfc3Bpbl90ICpzcGluKTsKKworc3RhdGljIHJlYWRfc2xpY2VfY291bnRfZiBfX3JlYWRf c2xpY2VfY291bnQ7CisKK3N0YXRpYyB1aW50MzJfdAorcmVhZF9zbGljZV9jb3VudChpbnQgZmQs IHVpbnQzMl90IGN0eCwgdWludDMyX3QgZXhwZWN0ZWRfc2xpY2VfY291bnQpCit7CisJcmV0dXJu IF9fcmVhZF9zbGljZV9jb3VudChmZCwgY3R4LCBleHBlY3RlZF9zbGljZV9jb3VudCwgTlVMTCk7 Cit9CisKK3N0YXRpYyB1aW50MzJfdAorZ2VuOF9yZWFkX3NsaWNlX2NvdW50KGludCBmZCwgdWlu dDMyX3QgY3R4LCB1aW50MzJfdCBleHBlY3RlZF9zbGljZV9jb3VudCwKKwkJICAgICAgaWd0X3Nw aW5fdCAqc3BpbikKK3sKKwlyZXR1cm4gKHJlYWRfcnBjc19yZWcoZmQsIGN0eCwgZXhwZWN0ZWRf c2xpY2VfY291bnQsIHNwaW4pICYKKwkJR0VOOF9SUENTX1NfQ05UX01BU0spID4+IEdFTjhfUlBD U19TX0NOVF9TSElGVDsKK30KKworc3RhdGljIHVpbnQzMl90CitnZW4xMV9yZWFkX3NsaWNlX2Nv dW50KGludCBmZCwgdWludDMyX3QgY3R4LCB1aW50MzJfdCBleHBlY3RlZF9zbGljZV9jb3VudCwK KwkJICAgICAgIGlndF9zcGluX3QgKnNwaW4pCit7CisJcmV0dXJuIChyZWFkX3JwY3NfcmVnKGZk LCBjdHgsIGV4cGVjdGVkX3NsaWNlX2NvdW50LCBzcGluKSAmCisJCUdFTjExX1JQQ1NfU19DTlRf TUFTSykgPj4gR0VOMTFfUlBDU19TX0NOVF9TSElGVDsKK30KKworc3RhdGljIHVpbnQzMl90City ZWFkX3N1YnNsaWNlX2NvdW50KGludCBmZCwgdWludDMyX3QgY3R4KQoreworCXJldHVybiAocmVh ZF9ycGNzX3JlZyhmZCwgY3R4LCAwLCBOVUxMKSAmIEdFTjhfUlBDU19TU19DTlRfTUFTSykgPj4K KwkgICAgICAgR0VOOF9SUENTX1NTX0NOVF9TSElGVDsKK30KKworc3RhdGljIGJvb2wKK2tlcm5l bF9oYXNfcGVyX2NvbnRleHRfc3NldV9zdXBwb3J0KGludCBmZCkKK3sKKwlzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX2NvbnRleHRfcGFyYW1fc3NldSBzc2V1ID0geyB9OworCXN0cnVjdCBkcm1faTkxNV9n ZW1fY29udGV4dF9wYXJhbSBhcmcgPQorCQl7CisJCSAgLnBhcmFtID0gSTkxNV9DT05URVhUX1BB UkFNX1NTRVUsCisJCSAgLnNpemUgPSBzaXplb2Yoc3NldSksCisJCSAgLnZhbHVlID0gdG9fdXNl cl9wb2ludGVyKCZzc2V1KSwKKwkJfTsKKwlpbnQgcmV0OworCisJaWYgKF9fZ2VtX2NvbnRleHRf Z2V0X3BhcmFtKGZkLCAmYXJnKSkKKwkJcmV0dXJuIGZhbHNlOworCisJYXJnLnZhbHVlID0gdG9f dXNlcl9wb2ludGVyKCZzc2V1KTsKKworCXJldCA9IF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZk LCAmYXJnKTsKKworCWlndF9hc3NlcnQocmV0ID09IDAgfHwgcmV0ID09IC1FTk9ERVYgfHwgcmV0 ID09IC1FSU5WQUwpOworCisJcmV0dXJuIHJldCA9PSAwOworfQorCitzdGF0aWMgdm9pZAorY29u dGV4dF9nZXRfc3NldV9tYXNrcyhpbnQgZmQsIHVpbnQzMl90IGN0eCwKKwkJICAgICAgIHVpbnQ2 NF90ICpzbGljZV9tYXNrLAorCQkgICAgICAgdWludDY0X3QgKnN1YnNsaWNlX21hc2spCit7CisJ c3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X3BhcmFtX3NzZXUgc3NldSA9IHsgfTsKKwlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0gYXJnID0KKwkJeyAucGFyYW0gPSBJOTE1X0NP TlRFWFRfUEFSQU1fU1NFVSwKKwkJICAuY3R4X2lkID0gY3R4LAorCQkgIC5zaXplID0gc2l6ZW9m KHNzZXUpLAorCQkgIC52YWx1ZSA9IHRvX3VzZXJfcG9pbnRlcigmc3NldSkgfTsKKworCWdlbV9j b250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyk7CisKKwlpZiAoc2xpY2VfbWFzaykKKwkJKnNsaWNl X21hc2sgPSBzc2V1LnNsaWNlX21hc2s7CisKKwlpZiAoc3Vic2xpY2VfbWFzaykKKwkJKnN1YnNs aWNlX21hc2sgPSBzc2V1LnN1YnNsaWNlX21hc2s7Cit9CisKK3N0YXRpYyB2b2lkCitjb250ZXh0 X3NldF9zbGljZV9tYXNrKGludCBmZCwgdWludDMyX3QgY3R4LCB1aW50NjRfdCBzbGljZV9tYXNr KQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fY29udGV4dF9wYXJhbV9zc2V1IHNzZXUgPSB7IH07 CisJc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X3BhcmFtIGFyZyA9CisJCXsgLnBhcmFtID0g STkxNV9DT05URVhUX1BBUkFNX1NTRVUsCisJCSAgLmN0eF9pZCA9IGN0eCwKKwkJICAuc2l6ZSA9 IHNpemVvZihzc2V1KSwKKwkJICAudmFsdWUgPSB0b191c2VyX3BvaW50ZXIoJnNzZXUpIH07CisK KwlnZW1fY29udGV4dF9nZXRfcGFyYW0oZmQsICZhcmcpOworCXNzZXUuc2xpY2VfbWFzayA9IHNs aWNlX21hc2s7CisJZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJnKTsKK30KKworc3RhdGlj IHZvaWQKK2NvbnRleHRfc2V0X3N1YnNsaWNlX21hc2soaW50IGZkLCB1aW50MzJfdCBjdHgsIHVp bnQ2NF90IHN1YnNsaWNlX21hc2spCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X3Bh cmFtX3NzZXUgc3NldSA9IHsgfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0g YXJnID0KKwkJeyAucGFyYW0gPSBJOTE1X0NPTlRFWFRfUEFSQU1fU1NFVSwKKwkJICAuY3R4X2lk ID0gY3R4LAorCQkgIC5zaXplID0gc2l6ZW9mKHNzZXUpLAorCQkgIC52YWx1ZSA9IHRvX3VzZXJf cG9pbnRlcigmc3NldSkgfTsKKworCWdlbV9jb250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyk7CisJ c3NldS5zdWJzbGljZV9tYXNrID0gc3Vic2xpY2VfbWFzazsKKwlnZW1fY29udGV4dF9zZXRfcGFy YW0oZmQsICZhcmcpOworfQorCisvKgorICogVmVyaWZ5IHRoYXQgd2UgY2FuIHByb2dyYW0gdGhl IHNsaWNlIGNvdW50LgorICovCitzdGF0aWMgdm9pZAordGVzdF9zbGljZV9wZyhpbnQgZmQsIHVp bnQzMl90IHBnX3NsaWNlX2NvdW50KQoreworCXVpbnQ2NF90IHBnX3NsaWNlX21hc2sgPSBtYXNr X21pbnVzKF9fc2xpY2VfbWFza19fLCBwZ19zbGljZV9jb3VudCk7CisJdW5zaWduZWQgaW50IHNs aWNlX2NvdW50ID0gX19zbGljZV9jb3VudF9fIC0gcGdfc2xpY2VfY291bnQ7CisJdWludDY0X3Qg c2xpY2VfbWFzazsKKwl1aW50MzJfdCBjdHg7CisKKwlpZ3RfYXNzZXJ0X2VxKHNsaWNlX2NvdW50 LCBfX2J1aWx0aW5fcG9wY291bnQocGdfc2xpY2VfbWFzaykpOworCisJY3R4ID0gZ2VtX2NvbnRl eHRfY3JlYXRlKGZkKTsKKwljb250ZXh0X3NldF9zbGljZV9tYXNrKGZkLCBjdHgsIHBnX3NsaWNl X21hc2spOworCWNvbnRleHRfZ2V0X3NzZXVfbWFza3MoZmQsIGN0eCwgJnNsaWNlX21hc2ssIE5V TEwpOworCWlndF9hc3NlcnRfZXEocGdfc2xpY2VfbWFzaywgc2xpY2VfbWFzayk7CisKKwkvKgor CSAqIFRlc3QgZmFsc2UgcG9zaXRpdmVzIHdpdGggcHJlZGljYXRlcyAob25seSBhdmFpbGFibGUg b24KKwkgKiBiZWZvcmUgR2VuMTApLgorCSAqLworCWlmIChfX2ludGVsX2dlbl9fIDwgMTApCisJ CWlndF9hc3NlcnRfZXEocmVhZF9zbGljZV9jb3VudChmZCwgY3R4LCBfX3NsaWNlX2NvdW50X18p LCAwKTsKKworCWlndF9hc3NlcnRfZXEocmVhZF9zbGljZV9jb3VudChmZCwgY3R4LCAwKSwgc2xp Y2VfY291bnQpOworCisJZ2VtX2NvbnRleHRfZGVzdHJveShmZCwgY3R4KTsKK30KKworLyoKKyAq IFZlcmlmeSB0aGF0IHdlIGNhbiBwcm9ncmFtIHRoZSBzdWJzbGljZSBjb3VudC4KKyAqLworc3Rh dGljIHZvaWQKK3Rlc3Rfc3Vic2xpY2VfcGcoaW50IGZkLCBpbnQgcGdfc3Vic2xpY2VfY291bnQp Cit7CisJdWludDY0X3QgcGdfc3Vic2xpY2VfbWFzayA9CisJCW1hc2tfbWludXMoX19zdWJzbGlj ZV9tYXNrX18sIHBnX3N1YnNsaWNlX2NvdW50KTsKKwl1bnNpZ25lZCBpbnQgc3Vic2xpY2VfY291 bnQgPSBfX3N1YnNsaWNlX2NvdW50X18gLSBwZ19zdWJzbGljZV9jb3VudDsKKwl1aW50NjRfdCBz dWJzbGljZV9tYXNrOworCXVpbnQzMl90IGN0eDsKKworCWlndF9hc3NlcnRfZXEoc3Vic2xpY2Vf Y291bnQsIF9fYnVpbHRpbl9wb3Bjb3VudChwZ19zdWJzbGljZV9tYXNrKSk7CisKKwljdHggPSBn ZW1fY29udGV4dF9jcmVhdGUoZmQpOworCWNvbnRleHRfc2V0X3N1YnNsaWNlX21hc2soZmQsIGN0 eCwgcGdfc3Vic2xpY2VfbWFzayk7CisJY29udGV4dF9nZXRfc3NldV9tYXNrcyhmZCwgY3R4LCBO VUxMLCAmc3Vic2xpY2VfbWFzayk7CisJaWd0X2Fzc2VydF9lcShwZ19zdWJzbGljZV9tYXNrLCBz dWJzbGljZV9tYXNrKTsKKworCWlndF9hc3NlcnRfZXEocmVhZF9zdWJzbGljZV9jb3VudChmZCwg Y3R4KSwgc3Vic2xpY2VfY291bnQpOworCisJZ2VtX2NvbnRleHRfZGVzdHJveShmZCwgY3R4KTsK K30KKworc3RhdGljIGJvb2wgaGFzX2VuZ2luZShpbnQgZmQsIHVuc2lnbmVkIGludCBjbGFzcywg dW5zaWduZWQgaW50IGluc3RhbmNlKQoreworCWludCBwbXUgPSBwZXJmX2k5MTVfb3BlbihJOTE1 X1BNVV9FTkdJTkVfQlVTWShjbGFzcywgaW5zdGFuY2UpKTsKKworCWlmIChwbXUgPj0gMCkKKwkJ Y2xvc2UocG11KTsKKworCXJldHVybiBwbXUgPj0gMDsKK30KKworLyoKKyAqIFZlcmlmeSB0aGF0 IGludmFsaWQgZW5naW5lcyBhcmUgcmVqZWN0ZWQgYW5kIHZhbGlkIG9uZXMgYXJlIGFjY2VwdGVk LgorICovCitzdGF0aWMgdm9pZCB0ZXN0X2VuZ2luZXMoaW50IGZkKQoreworCXN0cnVjdCBkcm1f aTkxNV9nZW1fY29udGV4dF9wYXJhbV9zc2V1IHNzZXUgPSB7IH07CisJc3RydWN0IGRybV9pOTE1 X2dlbV9jb250ZXh0X3BhcmFtIGFyZyA9CisJCXsgLnBhcmFtID0gSTkxNV9DT05URVhUX1BBUkFN X1NTRVUsCisJCSAgLmN0eF9pZCA9IGdlbV9jb250ZXh0X2NyZWF0ZShmZCksCisJCSAgLnNpemUg PSBzaXplb2Yoc3NldSksCisJCSAgLnZhbHVlID0gdG9fdXNlcl9wb2ludGVyKCZzc2V1KSB9Owor CXVuc2lnbmVkIGludCBjbGFzcywgaW5zdGFuY2U7CisJaW50IGxhc3Rfd2l0aF9lbmdpbmVzOwor CisJLyogZ2V0X3BhcmFtICovCisKKwlzc2V1Lmluc3RhbmNlID0gLTE7IC8qIEFzc3VtZWQgaW52 YWxpZC4gKi8KKwlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfZ2V0X3BhcmFtKGZkLCAmYXJn KSwgLUVJTlZBTCk7CisKKwlzc2V1LmNsYXNzID0gSTkxNV9FTkdJTkVfQ0xBU1NfSU5WQUxJRDsg LyogQm90aCBpbnZhbGlkLiAqLworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9nZXRfcGFy YW0oZmQsICZhcmcpLCAtRUlOVkFMKTsKKworCXNzZXUuaW5zdGFuY2UgPSAwOyAvKiBDbGFzcyBp bnZhbGlkLiAqLworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9nZXRfcGFyYW0oZmQsICZh cmcpLCAtRUlOVkFMKTsKKwlzc2V1LmNsYXNzID0gSTkxNV9FTkdJTkVfQ0xBU1NfUkVOREVSOwor CisJbGFzdF93aXRoX2VuZ2luZXMgPSAtMTsKKwlmb3IgKGNsYXNzID0gMDsgY2xhc3MgPCB+MDsg Y2xhc3MrKykgeworCQlmb3IgKGluc3RhbmNlID0gMDsgaW5zdGFuY2UgPCB+MDsgaW5zdGFuY2Ur KykgeworCQkJaW50IHJldDsKKworCQkJc3NldS5jbGFzcyA9IGNsYXNzOworCQkJc3NldS5pbnN0 YW5jZSA9IGluc3RhbmNlOworCisJCQlyZXQgPSBfX2dlbV9jb250ZXh0X2dldF9wYXJhbShmZCwg JmFyZyk7CisKKwkJCWlmIChoYXNfZW5naW5lKGZkLCBjbGFzcywgaW5zdGFuY2UpKSB7CisJCQkJ aWd0X2Fzc2VydF9lcShyZXQsIDApOworCQkJCWxhc3Rfd2l0aF9lbmdpbmVzID0gY2xhc3M7CisJ CQl9IGVsc2UgeworCQkJCWlndF9hc3NlcnRfZXEocmV0LCAtRUlOVkFMKTsKKwkJCQlpZiAoaW5z dGFuY2UgPiA4KSAvKiBTa2lwIG92ZXIgc29tZSBpbnN0YW5jZSBob2xlcy4gKi8KKwkJCQkJYnJl YWs7CisJCQl9CisJCX0KKworCQlpZiAoY2xhc3MgLSBsYXN0X3dpdGhfZW5naW5lcyA+IDgpIC8q IFNraXAgb3ZlciBzb21lIGNsYXNzIGhvbGVzLiAqLworCQkJYnJlYWs7CisJfQorCisJLyoKKwkg KiBHZXQgc29tZSBwcm9wZXIgdmFsdWVzIGJlZm9yZSB0cnlpbmcgdG8gcmVwcm9ncmFtIHRoZW0g b250bworCSAqIGFuIGludmFsaWQgZW5naW5lLgorCSAqLworCXNzZXUuY2xhc3MgPSAwOworCXNz ZXUuaW5zdGFuY2UgPSAwOworCWdlbV9jb250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyk7CisKKwkv KiBzZXRfcGFyYW0gKi8KKworCXNzZXUuaW5zdGFuY2UgPSAtMTsgLyogQXNzdW1lZCBpbnZhbGlk LiAqLworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcpLCAt RUlOVkFMKTsKKworCXNzZXUuY2xhc3MgPSBJOTE1X0VOR0lORV9DTEFTU19JTlZBTElEOyAvKiBC b3RoIGludmFsaWQuICovCisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJhbShm ZCwgJmFyZyksIC1FSU5WQUwpOworCisJc3NldS5pbnN0YW5jZSA9IDA7IC8qIENsYXNzIGludmFs aWQuICovCisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJhbShmZCwgJmFyZyks IC1FSU5WQUwpOworCisJbGFzdF93aXRoX2VuZ2luZXMgPSAtMTsKKwlmb3IgKGNsYXNzID0gMDsg Y2xhc3MgPCB+MDsgY2xhc3MrKykgeworCQlmb3IgKGluc3RhbmNlID0gMDsgaW5zdGFuY2UgPCB+ MDsgaW5zdGFuY2UrKykgeworCQkJaW50IHJldDsKKworCQkJc3NldS5jbGFzcyA9IGNsYXNzOwor CQkJc3NldS5pbnN0YW5jZSA9IGluc3RhbmNlOworCisJCQlyZXQgPSBfX2dlbV9jb250ZXh0X3Nl dF9wYXJhbShmZCwgJmFyZyk7CisKKwkJCWlmIChoYXNfZW5naW5lKGZkLCBjbGFzcywgaW5zdGFu Y2UpKSB7CisJCQkJaWd0X2Fzc2VydChyZXQgPT0gMCB8fCByZXQgPT0gLUVOT0RFVik7CisJCQkJ bGFzdF93aXRoX2VuZ2luZXMgPSBjbGFzczsKKwkJCX0gZWxzZSB7CisJCQkJaWd0X2Fzc2VydF9l cShyZXQsIC1FSU5WQUwpOworCQkJCWlmIChpbnN0YW5jZSA+IDgpIC8qIFNraXAgb3ZlciBzb21l IGluc3RhbmNlIGhvbGVzLiAqLworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChjbGFz cyAtIGxhc3Rfd2l0aF9lbmdpbmVzID4gOCkgLyogU2tpcCBvdmVyIHNvbWUgY2xhc3MgaG9sZXMu ICovCisJCQlicmVhazsKKwl9CisKKwlnZW1fY29udGV4dF9kZXN0cm95KGZkLCBhcmcuY3R4X2lk KTsKK30KKworLyoKKyAqIFZlcmlmeSB0aGF0IGludmFsaWQgYXJndW1lbnRzIGFyZSByZWplY3Rl ZC4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfaW52YWxpZF9hcmdzKGludCBmZCkKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0gYXJnID0KKwkJeyAucGFyYW0gPSBJOTE1X0NP TlRFWFRfUEFSQU1fU1NFVSwKKwkJICAuY3R4X2lkID0gZ2VtX2NvbnRleHRfY3JlYXRlKGZkKSwK KwkJfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW1fc3NldSBzc2V1ID0geyB9 OworCXVuc2lnbmVkIGNoYXIgKnBhZ2VbMl07CisJdW5zaWduZWQgY2hhciAqYWRkcjsKKwl1bnNp Z25lZCBpbnQgc3o7CisKKwkvKiBnZXQgcGFyYW0gKi8KKworCS8qIEludmFsaWQgc2l6ZS4gKi8K Kwlhcmcuc2l6ZSA9IDE7CisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X2dldF9wYXJhbShm ZCwgJmFyZyksIC1FSU5WQUwpOworCisJLyogUXVlcnkgc2l6ZS4gKi8KKwlhcmcuc2l6ZSA9IDA7 CisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyksIDApOwor CXN6ID0gYXJnLnNpemU7CisKKwkvKiBCYWQgcG9pbnRlcnMuICovCisJaWd0X2Fzc2VydF9lcShf X2dlbV9jb250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyksIC1FRkFVTFQpOworCWFyZy52YWx1ZSA9 IC0xOworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9nZXRfcGFyYW0oZmQsICZhcmcpLCAt RUZBVUxUKTsKKwlhcmcudmFsdWUgPSAxOworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9n ZXRfcGFyYW0oZmQsICZhcmcpLCAtRUZBVUxUKTsKKworCS8qIFVubWFwcGVkLiAqLworCXBhZ2Vb MF0gPSBtbWFwKDAsIDQwOTYsIFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT04sIC0x LCAwKTsKKwlpZ3RfYXNzZXJ0KHBhZ2VbMF0gIT0gTUFQX0ZBSUxFRCk7CisJbWVtc2V0KHBhZ2Vb MF0sIDAsIHNpemVvZihzc2V1KSk7CisJbXVubWFwKHBhZ2VbMF0sIDQwOTYpOworCWFyZy52YWx1 ZSA9IHRvX3VzZXJfcG9pbnRlcihwYWdlWzBdKTsKKwlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRl eHRfZ2V0X3BhcmFtKGZkLCAmYXJnKSwgLUVGQVVMVCk7CisKKwkvKiBTdHJhZGRsZSBpbnRvIHVu bWFwcGVkIGFyZWEuICovCisJcGFnZVswXSA9IG1tYXAoMCwgODE5MiwgUFJPVF9XUklURSwgTUFQ X1BSSVZBVEUgfCBNQVBfQU5PTiwgLTEsIDApOworCWlndF9hc3NlcnQocGFnZVswXSAhPSBNQVBf RkFJTEVEKTsKKwltdW5tYXAocGFnZVswXSwgODE5Mik7CisJcGFnZVswXSA9IG1tYXAocGFnZVsw XSwgNDA5NiwKKwkJICAgICAgIFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT04gfCBN QVBfRklYRUQsIC0xLCAwKTsKKwlpZ3RfYXNzZXJ0KHBhZ2VbMF0gIT0gTUFQX0ZBSUxFRCk7CisJ bWVtc2V0KHBhZ2VbMF0sIDAsIHNpemVvZihzc2V1KSk7CisJcGFnZVsxXSA9IG1tYXAoKHZvaWQg KikoKHVuc2lnbmVkIGxvbmcpcGFnZVswXSArIDQwOTYpLCA0MDk2LAorCQkgICAgICAgUFJPVF9X UklURSwgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiB8IE1BUF9GSVhFRCwgLTEsIDApOworCWlndF9h c3NlcnQocGFnZVsxXSAhPSBNQVBfRkFJTEVEKTsKKwltZW1zZXQocGFnZVsxXSwgMCwgc2l6ZW9m KHNzZXUpKTsKKwltdW5tYXAocGFnZVsxXSwgNDA5Nik7CisJYXJnLnZhbHVlID0gdG9fdXNlcl9w b2ludGVyKHBhZ2VbMV0pIC0KKwkJICAgIHNpemVvZihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRl eHRfcGFyYW1fc3NldSkgKyA0OworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9nZXRfcGFy YW0oZmQsICZhcmcpLCAtRUZBVUxUKTsKKwltdW5tYXAocGFnZVswXSwgNDA5Nik7CisKKwkvKiBT dHJhZGRsZSBpbnRvIHJlYWQtb25seSBhcmVhLiAqLworCXBhZ2VbMF0gPSBtbWFwKDAsIDgxOTIs IFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT04sIC0xLCAwKTsKKwlpZ3RfYXNzZXJ0 KHBhZ2VbMF0gIT0gTUFQX0ZBSUxFRCk7CisJbXVubWFwKHBhZ2VbMF0sIDgxOTIpOworCXBhZ2Vb MF0gPSBtbWFwKHBhZ2VbMF0sIDQwOTYsCisJCSAgICAgICBQUk9UX1dSSVRFLCBNQVBfUFJJVkFU RSB8IE1BUF9BTk9OIHwgTUFQX0ZJWEVELCAtMSwgMCk7CisJaWd0X2Fzc2VydChwYWdlWzBdICE9 IE1BUF9GQUlMRUQpOworCW1lbXNldChwYWdlWzBdLCAwLCBzaXplb2Yoc3NldSkpOworCXBhZ2Vb MV0gPSBtbWFwKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKXBhZ2VbMF0gKyA0MDk2KSwgNDA5NiwK KwkJICAgICAgIFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT04gfCBNQVBfRklYRUQs IC0xLCAwKTsKKwlpZ3RfYXNzZXJ0KHBhZ2VbMV0gIT0gTUFQX0ZBSUxFRCk7CisJbWVtc2V0KHBh Z2VbMV0sIDAsIHNpemVvZihzc2V1KSk7CisJaWd0X2Fzc2VydChtcHJvdGVjdChwYWdlWzFdLCA0 MDk2LCBQUk9UX1JFQUQpID09IDApOworCWFyZy52YWx1ZSA9IHRvX3VzZXJfcG9pbnRlcihwYWdl WzFdIC0gc2l6ZW9mKHNzZXUpICsgNCk7CisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X2dl dF9wYXJhbShmZCwgJmFyZyksIC1FRkFVTFQpOworCW11bm1hcChwYWdlWzBdLCA0MDk2KTsKKwlt dW5tYXAocGFnZVsxXSwgNDA5Nik7CisKKwkvKiBzZXQgcGFyYW0gKi8KKworCS8qIEludmFsaWQg c2l6ZXMuICovCisJYXJnLnNpemUgPSAxOworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9z ZXRfcGFyYW0oZmQsICZhcmcpLCAtRUlOVkFMKTsKKworCWFyZy5zaXplID0gMDsKKwlpZ3RfYXNz ZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJnKSwgLUVJTlZBTCk7CisJYXJn LnNpemUgPSBzejsKKworCS8qIEJhZCBwb2ludGVycy4gKi8KKwlhcmcudmFsdWUgPSAwOworCWln dF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcpLCAtRUZBVUxUKTsK KwlhcmcudmFsdWUgPSAtMTsKKwlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFt KGZkLCAmYXJnKSwgLUVGQVVMVCk7CisJYXJnLnZhbHVlID0gMTsKKwlpZ3RfYXNzZXJ0X2VxKF9f Z2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJnKSwgLUVGQVVMVCk7CisKKwkvKiBHZXQgdmFs aWQgU1NFVS4gKi8KKwlhcmcudmFsdWUgPSB0b191c2VyX3BvaW50ZXIoJnNzZXUpOworCWlndF9h c3NlcnRfZXEoX19nZW1fY29udGV4dF9nZXRfcGFyYW0oZmQsICZhcmcpLCAwKTsKKworCS8qIFVu bWFwcGVkLiAqLworCXBhZ2VbMF0gPSBtbWFwKDAsIDQwOTYsIFBST1RfV1JJVEUsIE1BUF9QUklW QVRFIHwgTUFQX0FOT04sIC0xLCAwKTsKKwlpZ3RfYXNzZXJ0KHBhZ2VbMF0gIT0gTUFQX0ZBSUxF RCk7CisJbWVtY3B5KHBhZ2VbMF0sICZzc2V1LCBzaXplb2Yoc3NldSkpOworCW11bm1hcChwYWdl WzBdLCA0MDk2KTsKKwlhcmcudmFsdWUgPSB0b191c2VyX3BvaW50ZXIocGFnZVswXSk7CisJaWd0 X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJhbShmZCwgJmFyZyksIC1FRkFVTFQpOwor CisJLyogU3RyYWRkbGUgaW50byB1bm1hcHBlZCBhcmVhLiAqLworCXBhZ2VbMF0gPSBtbWFwKDAs IDgxOTIsIFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT04sIC0xLCAwKTsKKwlpZ3Rf YXNzZXJ0KHBhZ2VbMF0gIT0gTUFQX0ZBSUxFRCk7CisJbXVubWFwKHBhZ2VbMF0sIDgxOTIpOwor CXBhZ2VbMF0gPSBtbWFwKHBhZ2VbMF0sIDQwOTYsCisJCSAgICAgICBQUk9UX1dSSVRFLCBNQVBf UFJJVkFURSB8IE1BUF9BTk9OIHwgTUFQX0ZJWEVELCAtMSwgMCk7CisJaWd0X2Fzc2VydChwYWdl WzBdICE9IE1BUF9GQUlMRUQpOworCXBhZ2VbMV0gPSBtbWFwKCh2b2lkICopKCh1bnNpZ25lZCBs b25nKXBhZ2VbMF0gKyA0MDk2KSwgNDA5NiwKKwkJICAgICAgIFBST1RfV1JJVEUsIE1BUF9QUklW QVRFIHwgTUFQX0FOT04gfCBNQVBfRklYRUQsIC0xLCAwKTsKKwlpZ3RfYXNzZXJ0KHBhZ2VbMV0g IT0gTUFQX0ZBSUxFRCk7CisJYWRkciA9IHBhZ2VbMV0gLSBzaXplb2Yoc3NldSkgKyA0OworCW1l bWNweShhZGRyLCAmc3NldSwgc2l6ZW9mKHNzZXUpKTsKKwltdW5tYXAocGFnZVsxXSwgNDA5Nik7 CisJYXJnLnZhbHVlID0gdG9fdXNlcl9wb2ludGVyKGFkZHIpOworCWlndF9hc3NlcnRfZXEoX19n ZW1fY29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcpLCAtRUZBVUxUKTsKKwltdW5tYXAocGFnZVsw XSwgNDA5Nik7CisKKwlnZW1fY29udGV4dF9kZXN0cm95KGZkLCBhcmcuY3R4X2lkKTsKK30KKwor LyoKKyAqIFZlcmlmeSB0aGF0IGdndHQgbWFwcGVkIGFyZWEgY2FuIGJlIHVzZWQgYXMgdGhlIHNz ZXUgcG9pbnRlci4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfZ2d0dF9hcmdzKGludCBmZCkKK3sK KwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW1fc3NldSAqc3NldTsKKwlzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0gYXJnID0KKwkJeyAucGFyYW0gPSBJOTE1X0NPTlRF WFRfUEFSQU1fU1NFVSwKKwkJICAuY3R4X2lkID0gZ2VtX2NvbnRleHRfY3JlYXRlKGZkKSwKKwkJ ICAuc2l6ZSA9IHNpemVvZigqc3NldSksCisJCX07CisJdWludDMyX3QgYm87CisKKwlibyA9IGdl bV9jcmVhdGUoZmQsIDQwOTYpOworCWFyZy52YWx1ZSA9IHRvX3VzZXJfcG9pbnRlcihnZW1fbW1h cF9fZ3R0KGZkLCBibywgNDA5NiwKKwkJCQkJCSAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSkpOwor CisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyksIDApOwor CWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcpLCAwKTsKKwor CW11bm1hcCgodm9pZCAqKWFyZy52YWx1ZSwgNDA5Nik7CisJZ2VtX2Nsb3NlKGZkLCBibyk7CisJ Z2VtX2NvbnRleHRfZGVzdHJveShmZCwgYXJnLmN0eF9pZCk7Cit9CisKKy8qCisgKiBWZXJpZnkg dGhhdCBpbnZhbGlkIFNTRVUgdmFsdWVzIGFyZSByZWplY3RlZC4KKyAqLworc3RhdGljIHZvaWQK K3Rlc3RfaW52YWxpZF9zc2V1KGludCBmZCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRl eHRfcGFyYW1fc3NldSBkZWZhdWx0X3NzZXUgPSB7IH07CisJc3RydWN0IGRybV9pOTE1X2dlbV9j b250ZXh0X3BhcmFtX3NzZXUgc3NldSA9IHsgfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRl eHRfcGFyYW0gYXJnID0KKwkJeyAucGFyYW0gPSBJOTE1X0NPTlRFWFRfUEFSQU1fU1NFVSwKKwkJ ICAuY3R4X2lkID0gZ2VtX2NvbnRleHRfY3JlYXRlKGZkKSwKKwkJICAuc2l6ZSA9IHNpemVvZihz c2V1KSwKKwkJfTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEZldGNoIHRoZSBkZXZpY2UgZGVm YXVsdHMuICovCisJYXJnLnZhbHVlID0gdG9fdXNlcl9wb2ludGVyKCZkZWZhdWx0X3NzZXUpOwor CWdlbV9jb250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyk7CisKKwlhcmcudmFsdWUgPSB0b191c2Vy X3BvaW50ZXIoJnNzZXUpOworCisJLyogVHJ5IGFsbCBzbGljZSBtYXNrcyBrbm93biB0byBiZSBp bnZhbGlkLiAqLworCXNzZXUgPSBkZWZhdWx0X3NzZXU7CisJZm9yIChpID0gMTsgaSA8PSAoOCAt IF9fc2xpY2VfY291bnRfXyk7IGkrKykgeworCQlzc2V1LnNsaWNlX21hc2sgPSBtYXNrX3BsdXMo X19zbGljZV9tYXNrX18sIGkpOworCQlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3Bh cmFtKGZkLCAmYXJnKSwgLUVJTlZBTCk7CisJfQorCisJLyogMCBzbGljZXMuICovCisJc3NldS5z bGljZV9tYXNrID0gMDsKKwlpZ3RfYXNzZXJ0X2VxKC1FSU5WQUwsIF9fZ2VtX2NvbnRleHRfc2V0 X3BhcmFtKGZkLCAmYXJnKSk7CisKKwkvKiBUcnkgYWxsIHN1YnNsaWNlIG1hc2tzIGtub3duIHRv IGJlIGludmFsaWQuICovCisJc3NldSA9IGRlZmF1bHRfc3NldTsKKwlmb3IgKGkgPSAxOyBpIDw9 ICg4IC0gX19zdWJzbGljZV9jb3VudF9fKTsgaSsrKSB7CisJCXNzZXUuc3Vic2xpY2VfbWFzayA9 IG1hc2tfcGx1cyhfX3N1YnNsaWNlX21hc2tfXywgaSk7CisJCWlndF9hc3NlcnRfZXEoX19nZW1f Y29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcpLCAtRUlOVkFMKTsKKwl9CisKKwkvKiAwIHN1YnNs aWNlcy4gKi8KKwlzc2V1LnN1YnNsaWNlX21hc2sgPSAwOworCWlndF9hc3NlcnRfZXEoX19nZW1f Y29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcpLCAtRUlOVkFMKTsKKworCS8qIFRyeSBudW1iZXIg b2YgRVVzIHN1cGVyaW9yIHRvIHRoZSBtYXggYXZhaWxhYmxlLiAqLworCXNzZXUgPSBkZWZhdWx0 X3NzZXU7CisJc3NldS5taW5fZXVzX3Blcl9zdWJzbGljZSA9IGRlZmF1bHRfc3NldS5tYXhfZXVz X3Blcl9zdWJzbGljZSArIDE7CisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJh bShmZCwgJmFyZyksIC1FSU5WQUwpOworCisJc3NldSA9IGRlZmF1bHRfc3NldTsKKwlzc2V1Lm1h eF9ldXNfcGVyX3N1YnNsaWNlID0gZGVmYXVsdF9zc2V1Lm1heF9ldXNfcGVyX3N1YnNsaWNlICsg MTsKKwlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJnKSwgLUVJ TlZBTCk7CisKKwkvKiBUcnkgdG8gcHJvZ3JhbSAwIG1heCBFVXMuICovCisJc3NldSA9IGRlZmF1 bHRfc3NldTsKKwlzc2V1Lm1heF9ldXNfcGVyX3N1YnNsaWNlID0gMDsKKwlpZ3RfYXNzZXJ0X2Vx KF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJnKSwgLUVJTlZBTCk7CisKKwkvKiBNaW4g PiBtYXggKi8KKwlzc2V1ID0gZGVmYXVsdF9zc2V1OworCXNzZXUubWluX2V1c19wZXJfc3Vic2xp Y2UgPSBzc2V1Lm1heF9ldXNfcGVyX3N1YnNsaWNlOworCXNzZXUubWF4X2V1c19wZXJfc3Vic2xp Y2UgPSAxOworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcp LCAtRUlOVkFMKTsKKworCWlmIChfX2ludGVsX2dlbl9fICE9IDExKQorCQlnb3RvIG91dDsKKwor CS8qIFN1YnNldCBvZiBzdWJzbGljZXMgYnV0IHNsaWNlIG1hc2sgZ3JlYXRlciB0aGFuIG9uZS4g Ki8KKwlpZiAoX19zbGljZV9jb3VudF9fID4gMSkgeworCQlzc2V1ID0gZGVmYXVsdF9zc2V1Owor CQlzc2V1LnN1YnNsaWNlX21hc2sgPSBtYXNrX21pbnVzX29uZShzc2V1LnN1YnNsaWNlX21hc2sp OworCQlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJnKSwgLUVJ TlZBTCk7CisJfQorCisJLyogT2RkIHN1YnNsaWNlcyBhYm92ZSBmb3VyLiAqLworCXNzZXUgPSBk ZWZhdWx0X3NzZXU7CisJc3NldS5zbGljZV9tYXNrID0gMHgxOworCXNzZXUuc3Vic2xpY2VfbWFz ayA9IG1hc2tfbWludXNfb25lKHNzZXUuc3Vic2xpY2VfbWFzayk7CisJaWd0X2Fzc2VydF9lcShf X2dlbV9jb250ZXh0X3NldF9wYXJhbShmZCwgJmFyZyksIC1FSU5WQUwpOworCisJLyogTW9yZSB0 aGFuIGhhbGYgc3Vic2xpY2VzIHdpdGggb25lIHNsaWNlLiAqLworCXNzZXUgPSBkZWZhdWx0X3Nz ZXU7CisJc3NldS5zbGljZV9tYXNrID0gMHgxOworCXNzZXUuc3Vic2xpY2VfbWFzayA9IG1hc2tf bWludXMoc3NldS5zdWJzbGljZV9tYXNrLAorCQkJCQlfX3N1YnNsaWNlX2NvdW50X18gLyAyIC0g MSk7CisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJhbShmZCwgJmFyZyksIC1F SU5WQUwpOworCitvdXQ6CisJZ2VtX2NvbnRleHRfZGVzdHJveShmZCwgYXJnLmN0eF9pZCk7Cit9 CisKKy8qIFZlcmlmeSB0aGF0IHRoZSBrZXJuZWwgcmV0dXJucyBhIGNvcnJlY3QgZXJyb3IgdmFs dWUgb24gR2VuIDwgOC4gKi8KK3N0YXRpYyB2b2lkCitpbml0X2NvbnRleHRzKGludCBmZCwgdWlu dDMyX3QgKmN0eCwgdW5zaWduZWQgaW50IG51bSwKKwkgICAgICB1aW50NjRfdCBtYXNrMCwgdWlu dDY0X3QgbWFzazEpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZ3RfYXNzZXJ0X2VxKG51bSwg Mik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCWN0eFtpXSA9IGdlbV9jb250ZXh0 X2NyZWF0ZShmZCk7CisKKwljb250ZXh0X3NldF9zbGljZV9tYXNrKGZkLCBjdHhbMF0sIG1hc2sw KTsKKwljb250ZXh0X3NldF9zbGljZV9tYXNrKGZkLCBjdHhbMV0sIG1hc2sxKTsKK30KKworLyoK KyAqIFZlcmlmeSB0aGF0IHBvd2VyZ2F0aW5nIHNldHRpbmdzIGFyZSBwdXQgb24gaG9sZCB3aGls ZSBpOTE1L3BlcmYgaXMKKyAqIGFjdGl2ZS4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfcGVyZl9v YShpbnQgZmQpCit7CisJdWludDY0X3QgcHJvcGVydGllc1tdID0geworCQkvKiBJbmNsdWRlIE9B IHJlcG9ydHMgaW4gc2FtcGxlcyAqLworCQlEUk1fSTkxNV9QRVJGX1BST1BfU0FNUExFX09BLCB0 cnVlLAorCisJCS8qIE9BIHVuaXQgY29uZmlndXJhdGlvbiAqLworCQlEUk1fSTkxNV9QRVJGX1BS T1BfT0FfTUVUUklDU19TRVQsIDEsIC8qIHRlc3QgbWV0cmljICovCisJCURSTV9JOTE1X1BFUkZf UFJPUF9PQV9GT1JNQVQsIEk5MTVfT0FfRk9STUFUX0EzMnU0MF9BNHUzMl9COF9DOCwKKwkJRFJN X0k5MTVfUEVSRl9QUk9QX09BX0VYUE9ORU5ULCAyMCwKKwl9OworCXN0cnVjdCBkcm1faTkxNV9w ZXJmX29wZW5fcGFyYW0gcGFyYW0gPSB7CisJCS5mbGFncyA9IEk5MTVfUEVSRl9GTEFHX0ZEX0NM T0VYRUMgfAorCQlJOTE1X1BFUkZfRkxBR19GRF9OT05CTE9DSywKKwkJLm51bV9wcm9wZXJ0aWVz ID0gQVJSQVlfU0laRShwcm9wZXJ0aWVzKSAvIDIsCisJCS5wcm9wZXJ0aWVzX3B0ciA9IHRvX3Vz ZXJfcG9pbnRlcihwcm9wZXJ0aWVzKSwKKwl9OworCXVpbnQ2NF90IHBnX3NsaWNlX21hc2sgPSBt YXNrX21pbnVzX29uZShfX3NsaWNlX21hc2tfXyk7CisJdW5zaWduZWQgaW50IHNsaWNlX2NvdW50 ID0gX19zbGljZV9jb3VudF9fIC0gMTsKKwl1aW50MzJfdCBjdHhbMl07CisJdW5zaWduZWQgaW50 IGk7CisJaW50IHBlcmZfZmQ7CisKKwlpbml0X2NvbnRleHRzKGZkLCBjdHgsIEFSUkFZX1NJWkUo Y3R4KSwgX19zbGljZV9tYXNrX18sIHBnX3NsaWNlX21hc2spOworCisJLyoKKwkgKiBUZXN0IGZh bHNlIHBvc2l0aXZlcyB3aXRoIHByZWRpY2F0ZXMgKG9ubHkgYXZhaWxhYmxlIG9uCisJICogYmVm b3JlIEdlbjEwKS4KKwkgKi8KKwlpZiAoX19pbnRlbF9nZW5fXyA8IDEwKQorCQlpZ3RfYXNzZXJ0 X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFsxXSwgX19zbGljZV9jb3VudF9fKSwKKwkJCSAg ICAgIDApOworCisJaWd0X2Fzc2VydF9lcShyZWFkX3NsaWNlX2NvdW50KGZkLCBjdHhbMF0sIDAp LCBfX3NsaWNlX2NvdW50X18pOworCWlndF9hc3NlcnRfZXEocmVhZF9zbGljZV9jb3VudChmZCwg Y3R4WzFdLCAwKSwgc2xpY2VfY291bnQpOworCisJLyoKKwkgKiBOb3cgb3BlbiBpOTE1L3BlcmYg YW5kIHZlcmlmeSB0aGF0IGFsbCBjb250ZXh0cyBoYXZlIGJlZW4KKwkgKiByZWNvbmZpZ3VyZWQg dG8gdGhlIGRldmljZSdzIGRlZmF1bHQuCisJICovCisJcGVyZl9mZCA9IGlndF9pb2N0bChmZCwg RFJNX0lPQ1RMX0k5MTVfUEVSRl9PUEVOLCAmcGFyYW0pOworCWlndF9hc3NlcnRfZmQocGVyZl9m ZCk7CisKKwlpZiAoX19pbnRlbF9nZW5fXyAhPSAxMSkgeworCQlpZiAoX19pbnRlbF9nZW5fXyA8 IDEwKQorCQkJaWd0X2Fzc2VydF9lcShyZWFkX3NsaWNlX2NvdW50KGZkLCBjdHhbMV0sIHNsaWNl X2NvdW50KSwKKwkJCQkgICAgICAwKTsKKworCQlpZ3RfYXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291 bnQoZmQsIGN0eFswXSwgMCksIF9fc2xpY2VfY291bnRfXyk7CisJCWlndF9hc3NlcnRfZXEocmVh ZF9zbGljZV9jb3VudChmZCwgY3R4WzFdLCAwKSwgX19zbGljZV9jb3VudF9fKTsKKwl9IGVsc2Ug eworCQlpZ3RfYXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFswXSwgMCksIDEpOwor CQlpZ3RfYXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFsxXSwgMCksIDEpOworCQlp Z3RfYXNzZXJ0X2VxKHJlYWRfc3Vic2xpY2VfY291bnQoZmQsIGN0eFswXSksCisJCQkgICAgICBf X3N1YnNsaWNlX2NvdW50X18gLyAyKTsKKwkJaWd0X2Fzc2VydF9lcShyZWFkX3N1YnNsaWNlX2Nv dW50KGZkLCBjdHhbMV0pLAorCQkJICAgICAgX19zdWJzbGljZV9jb3VudF9fIC8gMik7CisJfQor CisJY2xvc2UocGVyZl9mZCk7CisKKwkvKgorCSAqIEFmdGVyIGNsb3NpbmcgdGhlIHBlcmYgc3Ry ZWFtLCBjb25maWd1cmF0aW9ucyBzaG91bGQgYmUKKwkgKiBiYWNrIHRvIHRoZSBwcm9ncmFtbWVk IHZhbHVlcy4KKwkgKi8KKwlpZiAoX19pbnRlbF9nZW5fXyA8IDEwKQorCQlpZ3RfYXNzZXJ0X2Vx KHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFsxXSwgX19zbGljZV9jb3VudF9fKSwgMCk7CisJaWd0 X2Fzc2VydF9lcShyZWFkX3NsaWNlX2NvdW50KGZkLCBjdHhbMF0sIDApLCBfX3NsaWNlX2NvdW50 X18pOworCWlndF9hc3NlcnRfZXEocmVhZF9zbGljZV9jb3VudChmZCwgY3R4WzFdLCAwKSwgc2xp Y2VfY291bnQpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3R4KTsgaSsrKQorCQln ZW1fY29udGV4dF9kZXN0cm95KGZkLCBjdHhbaV0pOworCisJLyoKKwkgKiBPcGVuIGk5MTUvcGVy ZiBmaXJzdCBhbmQgdmVyaWZ5IHRoYXQgYWxsIGNvbnRleHRzIGNyZWF0ZWQKKwkgKiBhZnRlcndh cmQgYXJlIGNvbmZpZ3VyZWQgdG8gdGhlIGRldmljZSdzIGRlZmF1bHQuCisJICovCisJcGVyZl9m ZCA9IGlndF9pb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfUEVSRl9PUEVOLCAmcGFyYW0pOworCWln dF9hc3NlcnRfZmQocGVyZl9mZCk7CisKKwlpbml0X2NvbnRleHRzKGZkLCBjdHgsIEFSUkFZX1NJ WkUoY3R4KSwgX19zbGljZV9tYXNrX18sIHBnX3NsaWNlX21hc2spOworCisJLyoKKwkgKiBDaGVj ayB0aGUgZGV2aWNlJ3MgZGVmYXVsdCB2YWx1ZXMsIGRlc3BpdGUgc2V0dGluZworCSAqIG90aGVy d2lzZS4KKwkgKi8KKwlpZiAoX19pbnRlbF9nZW5fXyAhPSAxMSkgeworCQlpZiAoX19pbnRlbF9n ZW5fXyA8IDEwKQorCQkJaWd0X2Fzc2VydF9lcShyZWFkX3NsaWNlX2NvdW50KGZkLCBjdHhbMV0s CisJCQkJCQkgICAgICAgc2xpY2VfY291bnQpLCAwKTsKKworCQlpZ3RfYXNzZXJ0X2VxKHJlYWRf c2xpY2VfY291bnQoZmQsIGN0eFswXSwgMCksIF9fc2xpY2VfY291bnRfXyk7CisJCWlndF9hc3Nl cnRfZXEocmVhZF9zbGljZV9jb3VudChmZCwgY3R4WzFdLCAwKSwgX19zbGljZV9jb3VudF9fKTsK Kwl9IGVsc2UgeworCQlpZ3RfYXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFswXSwg MCksIDEpOworCQlpZ3RfYXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFsxXSwgMCks IDEpOworCQlpZ3RfYXNzZXJ0X2VxKHJlYWRfc3Vic2xpY2VfY291bnQoZmQsIGN0eFswXSksCisJ CQkgICAgICBfX3N1YnNsaWNlX2NvdW50X18gLyAyKTsKKwkJaWd0X2Fzc2VydF9lcShyZWFkX3N1 YnNsaWNlX2NvdW50KGZkLCBjdHhbMV0pLAorCQkJICAgICAgX19zdWJzbGljZV9jb3VudF9fIC8g Mik7CisJfQorCisJY2xvc2UocGVyZl9mZCk7CisKKwkvKgorCSAqIEFmdGVyIGNsb3NpbmcgdGhl IHBlcmYgc3RyZWFtLCBjb25maWd1cmF0aW9ucyBzaG91bGQgYmUKKwkgKiBiYWNrIHRvIHRoZSBw cm9ncmFtbWVkIHZhbHVlcy4KKwkgKi8KKwlpZiAoX19pbnRlbF9nZW5fXyA8IDEwKQorCQlpZ3Rf YXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFsxXSwgX19zbGljZV9jb3VudF9fKSwK KwkJCSAgICAgIDApOworCisJaWd0X2Fzc2VydF9lcShyZWFkX3NsaWNlX2NvdW50KGZkLCBjdHhb MF0sIDApLCBfX3NsaWNlX2NvdW50X18pOworCWlndF9hc3NlcnRfZXEocmVhZF9zbGljZV9jb3Vu dChmZCwgY3R4WzFdLCAwKSwgc2xpY2VfY291bnQpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZ X1NJWkUoY3R4KTsgaSsrKQorCQlnZW1fY29udGV4dF9kZXN0cm95KGZkLCBjdHhbaV0pOworfQor CitzdGF0aWMgaWd0X3NwaW5fdCAqIF9fc3Bpbl9wb2xsKGludCBmZCwgdWludDMyX3QgY3R4LCB1 bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBpZ3Rfc3Bpbl9mYWN0b3J5IG9wdHMgPSB7 CisJCS5jdHggPSBjdHgsCisJCS5lbmdpbmUgPSBmbGFncywKKwl9OworCisJaWYgKGdlbV9jYW5f c3RvcmVfZHdvcmQoZmQsIGZsYWdzKSkKKwkJb3B0cy5mbGFncyB8PSBJR1RfU1BJTl9QT0xMX1JV TjsKKworCXJldHVybiBfX2lndF9zcGluX2JhdGNoX2ZhY3RvcnkoZmQsICZvcHRzKTsKK30KKwor c3RhdGljIHVuc2lnbmVkIGxvbmcgX19zcGluX3dhaXQoaW50IGZkLCBpZ3Rfc3Bpbl90ICpzcGlu KQoreworCXN0cnVjdCB0aW1lc3BlYyBzdGFydCA9IHsgfTsKKworCWlndF9uc2VjX2VsYXBzZWQo JnN0YXJ0KTsKKworCWlmIChzcGluLT5ydW5uaW5nKSB7CisJCXVuc2lnbmVkIGxvbmcgdGltZW91 dCA9IDA7CisKKwkJd2hpbGUgKCFSRUFEX09OQ0UoKnNwaW4tPnJ1bm5pbmcpKSB7CisJCQl1bnNp Z25lZCBsb25nIHQgPSBpZ3RfbnNlY19lbGFwc2VkKCZzdGFydCk7CisKKwkJCWlmICgodCAtIHRp bWVvdXQpID4gMjUwZTYpIHsKKwkJCQl0aW1lb3V0ID0gdDsKKwkJCQlpZ3Rfd2FybigiU3Bpbm5l ciBub3QgcnVubmluZyBhZnRlciAlLjJmbXNcbiIsCisJCQkJCSAoZG91YmxlKXQgLyAxZTYpOwor CQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWd0X2RlYnVnKCJfX3NwaW5fd2FpdCAtIHVzbGVlcCBt b2RlXG4iKTsKKwkJdXNsZWVwKDUwMGUzKTsgLyogQmV0dGVyIHRoYW4gbm90aGluZyEgKi8KKwl9 CisKKwlyZXR1cm4gaWd0X25zZWNfZWxhcHNlZCgmc3RhcnQpOworfQorCitzdGF0aWMgaWd0X3Nw aW5fdCAqIF9fc3Bpbl9zeW5jKGludCBmZCwgdWludDMyX3QgY3R4LCB1bnNpZ25lZCBsb25nIGZs YWdzKQoreworCWlndF9zcGluX3QgKnNwaW4gPSBfX3NwaW5fcG9sbChmZCwgY3R4LCBmbGFncyk7 CisKKwlfX3NwaW5fd2FpdChmZCwgc3Bpbik7CisKKwlyZXR1cm4gc3BpbjsKK30KKworc3RhdGlj IHVpbnQzMl90CityZWFkX3NsaWNlX2NvdW50X2J1c3koaW50IGZkLCB1aW50MzJfdCBjb250ZXh0 LCB1aW50MzJfdCBleHBlY3RlZCwKKwkJICAgICAgaWd0X3NwaW5fdCAqc3BpbikKK3sKKwlyZXR1 cm4gX19yZWFkX3NsaWNlX2NvdW50KGZkLCBjb250ZXh0LCBleHBlY3RlZCwgc3Bpbik7Cit9CisK KyNkZWZpbmUgVEVTVF9JRExFCSgxKQorI2RlZmluZSBURVNUX0JVU1kJKDIpCisjZGVmaW5lIFRF U1RfUkVTRVQJKDQpCisjZGVmaW5lIFRFU1RfSEFORwkoOCkKKyNkZWZpbmUgVEVTVF9TVVNQRU5E CSgxNikKKworc3RhdGljIGlndF9zcGluX3QgKgorX19wcmVfc2V0KGludCBmZCwgdW5zaWduZWQg ZmxhZ3MsIHVpbnQzMl90IGN0eCkKK3sKKwlpZiAoZmxhZ3MgJiBURVNUX0JVU1kpCisJCXJldHVy biBfX3NwaW5fc3luYyhmZCwgY3R4LCBJOTE1X0VYRUNfUkVOREVSKTsKKworCXJldHVybiBOVUxM OworfQorCitzdGF0aWMgaWd0X3NwaW5fdCAqCitfX3Bvc3Rfc2V0KGludCBmZCwgdW5zaWduZWQg aW50IGZsYWdzLCB1aW50MzJfdCBjdHgsIGlndF9zcGluX3QgKnNwaW4sCisJICAgdW5zaWduZWQg aW50IGV4cGVjdGVkKQoreworCWlmIChmbGFncyAmIFRFU1RfUkVTRVQpCisJCWlndF9mb3JjZV9n cHVfcmVzZXQoZmQpOworCisJaWYgKChmbGFncyAmIFRFU1RfQlVTWSkgJiYgIShmbGFncyAmIChU RVNUX1JFU0VUIHwgVEVTVF9IQU5HKSkpCisJCWlndF9hc3NlcnRfZXEocmVhZF9zbGljZV9jb3Vu dF9idXN5KGZkLCBjdHgsIDAsIHNwaW4pLAorCQkJICAgICAgZXhwZWN0ZWQpOworCWVsc2UKKwkJ aWd0X2Fzc2VydF9lcShyZWFkX3NsaWNlX2NvdW50KGZkLCBjdHgsIDApLCBleHBlY3RlZCk7CisK KwlpZ3RfYXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIDAsIDApLCBfX3NsaWNlX2NvdW50 X18pOworCisJaWYgKHNwaW4pCisJCWlndF9zcGluX2JhdGNoX2ZyZWUoZmQsIHNwaW4pOworCisJ aWYgKGZsYWdzICYgVEVTVF9JRExFKQorCQlpZ3RfZHJvcF9jYWNoZXNfc2V0KGZkLCBEUk9QX1JF VElSRSB8IERST1BfSURMRSB8IERST1BfQUNUSVZFKTsKKworCWlmIChmbGFncyAmIFRFU1RfU1VT UEVORCkKKwkJaWd0X3N5c3RlbV9zdXNwZW5kX2F1dG9yZXN1bWUoU1VTUEVORF9TVEFURV9NRU0s CisJCQkJCSAgICAgIFNVU1BFTkRfVEVTVF9OT05FKTsKKworCWlndF9hc3NlcnRfZXEocmVhZF9z bGljZV9jb3VudChmZCwgY3R4LCAwKSwgZXhwZWN0ZWQpOworCWlndF9hc3NlcnRfZXEocmVhZF9z bGljZV9jb3VudChmZCwgMCwgMCksIF9fc2xpY2VfY291bnRfXyk7CisKKwlyZXR1cm4gTlVMTDsK K30KKworLyoKKyAqIFRlc3QgY29udGV4dCByZS1jb25maWd1cmF0aW9uIHdpdGggZWl0aGVyIGlk bGUgb3IgYnVzeSBjb250ZXh0cy4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfZHluYW1pYyhpbnQg ZmQsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwl1aW50NjRfdCBwZ19zbGljZV9tYXNrID0gbWFz a19taW51c19vbmUoX19zbGljZV9tYXNrX18pOworCXVuc2lnbmVkIGludCBwZ19zbGljZV9jb3Vu dCA9IF9fc2xpY2VfY291bnRfXyAtIDE7CisJc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X3Bh cmFtX3NzZXUgc3NldSA9IHsgfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0g YXJnID0KKwkJeyAucGFyYW0gPSBJOTE1X0NPTlRFWFRfUEFSQU1fU1NFVSwKKwkJICAuY3R4X2lk ID0gZ2VtX2NvbnRleHRfY3JlYXRlKGZkKSwKKwkJICAuc2l6ZSA9IHNpemVvZihzc2V1KSwKKwkJ ICAudmFsdWUgPSB0b191c2VyX3BvaW50ZXIoJnNzZXUpIH07CisJaWd0X3NwaW5fdCAqc3BpbiA9 IE5VTEw7CisKKwlpZ3RfcmVxdWlyZShfX3NsaWNlX2NvdW50X18gPiAxKTsKKworCWdlbV9jb250 ZXh0X2dldF9wYXJhbShmZCwgJmFyZyk7CisKKwkvKiBGaXJzdCBzZXQgdGhlIGRlZmF1bHQgbWFz ayAqLworCXNwaW4gPSBfX3ByZV9zZXQoZmQsIGZsYWdzLCBhcmcuY3R4X2lkKTsKKwlzc2V1LnNs aWNlX21hc2sgPSBfX3NsaWNlX21hc2tfXzsKKwlnZW1fY29udGV4dF9zZXRfcGFyYW0oZmQsICZh cmcpOworCXNwaW4gPSBfX3Bvc3Rfc2V0KGZkLCBmbGFncywgYXJnLmN0eF9pZCwgc3BpbiwgX19z bGljZV9jb3VudF9fKTsKKworCS8qIFRoZW4gc2V0IGEgcG93ZXJnYXRlZCBjb25maWd1cmF0aW9u ICovCisJc3BpbiA9IF9fcHJlX3NldChmZCwgZmxhZ3MsIGFyZy5jdHhfaWQpOworCXNzZXUuc2xp Y2VfbWFzayA9IHBnX3NsaWNlX21hc2s7CisJZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJn KTsKKwlzcGluID0gX19wb3N0X3NldChmZCwgZmxhZ3MsIGFyZy5jdHhfaWQsIHNwaW4sIHBnX3Ns aWNlX2NvdW50KTsKKworCS8qIFB1dCB0aGUgZGV2aWNlJ3MgZGVmYXVsdCBiYWNrIGFnYWluICov CisJc3BpbiA9IF9fcHJlX3NldChmZCwgZmxhZ3MsIGFyZy5jdHhfaWQpOworCXNzZXUuc2xpY2Vf bWFzayA9IF9fc2xpY2VfbWFza19fOworCWdlbV9jb250ZXh0X3NldF9wYXJhbShmZCwgJmFyZyk7 CisJc3BpbiA9IF9fcG9zdF9zZXQoZmQsIGZsYWdzLCBhcmcuY3R4X2lkLCBzcGluLCBfX3NsaWNl X2NvdW50X18pOworCisJLyogT25lIGxhc3QgcG93ZXJnYXRlZCBjb25maWcgZm9yIHRoZSByb2Fk Li4uICovCisJc3BpbiA9IF9fcHJlX3NldChmZCwgZmxhZ3MsIGFyZy5jdHhfaWQpOworCXNzZXUu c2xpY2VfbWFzayA9IHBnX3NsaWNlX21hc2s7CisJZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAm YXJnKTsKKwlzcGluID0gX19wb3N0X3NldChmZCwgZmxhZ3MsIGFyZy5jdHhfaWQsIHNwaW4sIHBn X3NsaWNlX2NvdW50KTsKKworCWdlbV9jb250ZXh0X2Rlc3Ryb3koZmQsIGFyZy5jdHhfaWQpOwor fQorCitpZ3RfbWFpbgoreworCXVuc2lnbmVkIGludCBtYXhfc2xpY2VzID0gMywgbWF4X3N1YnNs aWNlcyA9IDM7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGZkOworCisJaWd0X2ZpeHR1cmUgewor CQlmZCA9IGRybV9vcGVuX2RyaXZlcihEUklWRVJfSU5URUwpOworCQlpZ3RfcmVxdWlyZV9nZW0o ZmQpOworCisJCV9faW50ZWxfZGV2aWRfXyA9IGludGVsX2dldF9kcm1fZGV2aWQoZmQpOworCQlf X2ludGVsX2dlbl9fID0gaW50ZWxfZ2VuKF9faW50ZWxfZGV2aWRfXyk7CisKKwkJaWd0X3JlcXVp cmUoa2VybmVsX2hhc19wZXJfY29udGV4dF9zc2V1X3N1cHBvcnQoZmQpKTsKKworCQlpZiAoX19p bnRlbF9nZW5fXyA+PSAxMSkKKwkJCV9fcmVhZF9zbGljZV9jb3VudCA9IGdlbjExX3JlYWRfc2xp Y2VfY291bnQ7CisJCWVsc2UKKwkJCV9fcmVhZF9zbGljZV9jb3VudCA9IGdlbjhfcmVhZF9zbGlj ZV9jb3VudDsKKwl9CisKKwlpZ3Rfc3VidGVzdF9ncm91cCB7CisJCWlndF9maXh0dXJlIHsKKwkJ CWRybV9pOTE1X2dldHBhcmFtX3QgZ3A7CisKKwkJCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9TTElD RV9NQVNLOworCQkJZ3AudmFsdWUgPSAoaW50ICopICZfX3NsaWNlX21hc2tfXzsKKwkJCWRvX2lv Y3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKTsKKwkJCV9fc2xpY2VfY291bnRf XyA9IF9fYnVpbHRpbl9wb3Bjb3VudChfX3NsaWNlX21hc2tfXyk7CisKKwkJCWdwLnBhcmFtID0g STkxNV9QQVJBTV9TVUJTTElDRV9NQVNLOworCQkJZ3AudmFsdWUgPSAoaW50ICopICZfX3N1YnNs aWNlX21hc2tfXzsKKwkJCWRvX2lvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdw KTsKKwkJCV9fc3Vic2xpY2VfY291bnRfXyA9CisJCQkJX19idWlsdGluX3BvcGNvdW50KF9fc3Vi c2xpY2VfbWFza19fKTsKKwkJfQorCisJCWlndF9zdWJ0ZXN0KCJpbnZhbGlkLWFyZ3MiKQorCQkJ dGVzdF9pbnZhbGlkX2FyZ3MoZmQpOworCisJCWlndF9zdWJ0ZXN0KCJpbnZhbGlkLXNzZXUiKQor CQkJdGVzdF9pbnZhbGlkX3NzZXUoZmQpOworCisJCWlndF9zdWJ0ZXN0KCJnZ3R0LWFyZ3MiKQor CQkJdGVzdF9nZ3R0X2FyZ3MoZmQpOworCisJCWlndF9zdWJ0ZXN0KCJlbmdpbmVzIikKKwkJCXRl c3RfZW5naW5lcyhmZCk7CisKKwkJZm9yIChpID0gMTsgaSA8IG1heF9zbGljZXM7IGkrKykgewor CQkJaWd0X3N1YnRlc3RfZigic2xpY2UtcGctJWkiLCBpKSB7CisJCQkJaWd0X3JlcXVpcmUoX19z bGljZV9jb3VudF9fID4gaSk7CisKKwkJCQl0ZXN0X3NsaWNlX3BnKGZkLCBpKTsKKwkJCX0KKwkJ fQorCisJCWZvciAoaSA9IDE7IGkgPCBtYXhfc3Vic2xpY2VzOyBpKyspIHsKKwkJCWlndF9zdWJ0 ZXN0X2YoInN1YnNsaWNlLXBnLSVpIiwgaSkgeworCQkJCWlndF9yZXF1aXJlKF9fc3Vic2xpY2Vf Y291bnRfXyA+PSAyKTsKKworCQkJCS8qCisJCQkJICogT25seSBhdmFpbGFibGUgb24gc29tZSBB dG9tIHBsYXRmb3JtcyBhbmQKKwkJCQkgKiBHZW4xMCsuCisJCQkJICovCisJCQkJaWd0X3JlcXVp cmUoSVNfQlJPWFRPTihfX2ludGVsX2RldmlkX18pIHx8CisJCQkJCSAgICBJU19HRU1JTklMQUtF KF9faW50ZWxfZGV2aWRfXykgfHwKKwkJCQkJICAgIF9faW50ZWxfZ2VuX18gPj0gMTApOworCisJ CQkJdGVzdF9zdWJzbGljZV9wZyhmZCwgaSk7CisJCQl9CisJCX0KKworCQlpZ3Rfc3VidGVzdCgi cGVyZi1vYSIpIHsKKwkJCWlndF9yZXF1aXJlKF9fc2xpY2VfY291bnRfXyA+IDEpOworCisJCQl0 ZXN0X3BlcmZfb2EoZmQpOworCQl9CisKKwkJaWd0X3N1YnRlc3QoImR5bmFtaWMiKQorCQkJdGVz dF9keW5hbWljKGZkLCAwKTsKKworCQlpZ3Rfc3VidGVzdCgiZHluYW1pYy1idXN5IikKKwkJCXRl c3RfZHluYW1pYyhmZCwgVEVTVF9CVVNZKTsKKworCQlpZ3Rfc3VidGVzdCgiZHluYW1pYy1yZXNl dCIpCisJCQl0ZXN0X2R5bmFtaWMoZmQsIFRFU1RfUkVTRVQpOworCisJCWlndF9zdWJ0ZXN0KCJk eW5hbWljLWJ1c3ktcmVzZXQiKQorCQkJdGVzdF9keW5hbWljKGZkLCBURVNUX0JVU1kgfCBURVNU X1JFU0VUKTsKKworCQlpZ3Rfc3VidGVzdCgiZHluYW1pYy1idXN5LWhhbmciKQorCQkJdGVzdF9k eW5hbWljKGZkLCBURVNUX0JVU1kgfCBURVNUX0hBTkcpOworCisJCWlndF9zdWJ0ZXN0KCJkeW5h bWljLWlkbGUiKQorCQkJdGVzdF9keW5hbWljKGZkLCBURVNUX0lETEUpOworCisJCWlndF9zdWJ0 ZXN0KCJkeW5hbWljLXN1c3BlbmQiKQorCQkJdGVzdF9keW5hbWljKGZkLCBURVNUX1NVU1BFTkQp OworCisJCWlndF9zdWJ0ZXN0KCJkeW5hbWljLWlkbGUtc3VzcGVuZCIpCisJCQl0ZXN0X2R5bmFt aWMoZmQsIFRFU1RfSURMRSB8IFRFU1RfU1VTUEVORCk7CisJfQorCisJaWd0X2ZpeHR1cmUgewor CQljbG9zZShmZCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzb24uYnVpbGQgYi90ZXN0 cy9tZXNvbi5idWlsZAppbmRleCAxN2RlYjk0NWVjOTUuLjkzMTlmYTRlMTliNCAxMDA2NDQKLS0t IGEvdGVzdHMvbWVzb24uYnVpbGQKKysrIGIvdGVzdHMvbWVzb24uYnVpbGQKQEAgLTI0OSw2ICsy NDksMTMgQEAgZm9yZWFjaCBwcm9nIDogdGVzdF9wcm9ncwogCQkgICBpbnN0YWxsIDogdHJ1ZSkK IGVuZGZvcmVhY2gKIAordGVzdF9leGVjdXRhYmxlcyArPSBleGVjdXRhYmxlKCdnZW1fY3R4X3Nz ZXUnLCAnZ2VtX2N0eF9zc2V1LmMnLAorCSAgIGRlcGVuZGVuY2llcyA6IHRlc3RfZGVwcyArIFsg bGliX2lndF9wZXJmIF0sCisJICAgaW5zdGFsbF9kaXIgOiBsaWJleGVjZGlyLAorCSAgIGluc3Rh bGxfcnBhdGggOiBsaWJleGVjZGlyX3JwYXRoZGlyLAorCSAgIGluc3RhbGwgOiB0cnVlKQordGVz dF9wcm9ncyArPSAnZ2VtX2N0eF9zc2V1JworCiB0ZXN0X2V4ZWN1dGFibGVzICs9IGV4ZWN1dGFi bGUoJ2dlbV9laW8nLCAnZ2VtX2Vpby5jJywKIAkgICBkZXBlbmRlbmNpZXMgOiB0ZXN0X2RlcHMg KyBbIHJlYWx0aW1lIF0sCiAJICAgaW5zdGFsbF9kaXIgOiBsaWJleGVjZGlyLAotLSAKMi4xNy4x CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1n ZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Tvrtko Ursulin Date: Mon, 17 Sep 2018 12:28:12 +0100 Message-Id: <20180917112812.28886-1-tvrtko.ursulin@linux.intel.com> In-Reply-To: <153694186725.4114.333645262093742066@skylake-alporthouse-com> References: <153694186725.4114.333645262093742066@skylake-alporthouse-com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH i-g-t v14 2/2] tests/gem_ctx_sseu: Dynamic (sub)slice programming tests 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: RnJvbTogTGlvbmVsIExhbmR3ZXJsaW4gPGxpb25lbC5nLmxhbmR3ZXJsaW5AaW50ZWwuY29tPgoK VmVyaWZ5IHRoYXQgdGhlIHBlci1jb250ZXh0IGR5bmFtaWMgU1NFVSB1QVBJIHdvcmtzIGFzIGV4 cGVjdGVkLgoKVG8gYWNoaWV2ZSB0aGF0LCBpbiB0aGUgYWJzZW5jZSBvZiBhIGJldHRlciBtZWNo YW1pc20sIHdlIHJlYWQgdGhlIHZhbHVlCm9mIFBXUl9DTEtfU1RBVEUgcmVnaXN0ZXIsIG9yIHVz ZSBNSV9TRVRfUFJFRElDQVRFIG9uIHBsYXRmb3JtcyBiZWZvcmUKQ2Fubm9ubGFrZS4KClRoaXMg cmVnaXN0ZXIgaXMgd3JpdHRlbiB0byBieSB0aGUgR1BVIG9uIGNvbnRleHQgcmVzdG9yZSBzbyB0 aGlzIHdheQp3ZSB2ZXJpZnkgaTkxNSBpcyBjb3JyZWN0bHkgdXBkYXRpbmcgdGhlIGNvbnRleHQg aW1hZ2UgaW4gYWxsCmNpcmN1bXN0YW5jZXMuCgp2MjogQWRkIHN1YnNsaWNlIHRlc3RzIChMaW9u ZWwpCiAgICBVc2UgTUlfU0VUX1BSRURJQ0FURSBmb3IgZnVydGhlciB2ZXJpZmljYXRpb24gd2hl biBhdmFpbGFibGUgKExpb25lbCkKCnYzOiBSZW5hbWUgdG8gZ2VtX2N0eF9ycGNzIChMaW9uZWwp Cgp2NDogVXBkYXRlIGtlcm5lbCBBUEkgKExpb25lbCkKICAgIEFkZCAwIHZhbHVlIHRlc3QgKExp b25lbCkKICAgIEV4ZXJjaXNlIGludmFsaWQgdmFsdWVzIChMaW9uZWwpCgp2NTogQWRkIHBlcmYg dGVzdHMgKExpb25lbCkKCnY2OiBBZGQgbmV3IHN5c2ZzIGVudHJ5IHRlc3RzIChMaW9uZWwpCgp2 NzogVGVzdCByc3ZkIGZpZWxkcwogICAgVXBkYXRlIGZvciBrZXJuZWwgc2VyaWVzIGNoYW5nZXMK CnY4OiBEcm9wIHRlc3Rfbm9fc3NldV9zdXBwb3J0KCkgdGVzdCAoS2VsdmluKQogICAgRHJvcCBk cm1faW50ZWxfKigpIGFwaXMgKENocmlzKQoKdjk6IGJ5IENocmlzOgogICAgRHJvcCBhbGwgZG9f aW9jdGwvZG9faW9jdGxfZXJyKCkKICAgIFVzZSBnZW1fY29udGV4dF9bZ3NdZXRfcGFyYW0oKQog ICAgVXNlIGdlbV9yZWFkKCkgaW5zdGVhZCBvZiBtYXBwaW5nIG1lbW9yeQogICAgYnkgTGlvbmVs OgogICAgVGVzdCBkeW5hbWljIHNzZXUgb24vb2ZmIG1vcmUKClR2cnRrbyBVcnN1bGluOgoKdjEw OgogKiBWYXJpb3VzIHN0eWxlIHR3ZWFrcyBhbmQgcmVmYWN0b3JpbmdzLgogKiBOZXcgdGVzdCBj b3ZlcmFnZS4KCnYxMToKICogQ2hhbmdlIHBsYXRmb3JtIHN1cHBvcnQgdG8ganVzdCBHZW4xMS4K ICogU2ltcGxpZnkgYXZhaWxhYmlsaXR5IHRlc3QuIChDaHJpcyBXaWxzb24pCiAqIE1vcmUgaW52 YWxpZCBwb2ludGVyIHRlc3RzLiAoQ2hyaXMgV2lsc29uKQoKdjEyOgogKiBGaXggTUFQX0ZJWEVE IHVzZSAoZG9oISkuCiAqIEZpeCBnZXQvc2V0IGNvcHkmcGFzdGUgZXJyb3JzLgogKiBEcm9wIHN1 cHBvcnRlZCBwbGF0Zm9ybSB0ZXN0LiAoQ2hyaXMgV2lsc29uKQogKiBBZGQgbW1hcF9fZ3R0IHRl c3QuIChDaHJpcyBXaWxzb24pCgp2MTM6CiAqIENvbW1pdCBtZXNzYWdlIHR3ZWFrcy4KICogQWRk ZWQgcmVzZXQvaGFuZy9zdXNwZW5kIHRlc3RzLiAoQ2hyaXMgV2lsc29uKQogKiBBc3NlcnQgc3Bp bm5lciBpcyBidXN5LiAoQ2hyaXMgV2lsc29uKQogKiBSZW1vdmUgc29tZSBtb3JlIEFCSSBhc3N1 bXB0aW9ucy4gKENocmlzIFdpbHNvbikKCnYxNDoKICogVXNlIGRlZmF1bHQgcmVzdW1lIHRpbWUu IChDaHJpcyBXaWxzb24pCiAqIFRyaWdnZXIgaGFuZyBhZnRlciBycGNzIHJlYWQgYmF0Y2ggaGFz IGJlZW4gc3VibWl0dGVkLiAoQ2hyaXMgV2lsc29uKQoKU2lnbmVkLW9mZi1ieTogTGlvbmVsIExh bmR3ZXJsaW4gPGxpb25lbC5nLmxhbmR3ZXJsaW5AaW50ZWwuY29tPgpTaWduZWQtb2ZmLWJ5OiBU dnJ0a28gVXJzdWxpbiA8dHZydGtvLnVyc3VsaW5AaW50ZWwuY29tPgotLS0KIHRlc3RzL01ha2Vm aWxlLmFtICAgICAgfCAgICAxICsKIHRlc3RzL01ha2VmaWxlLnNvdXJjZXMgfCAgICAxICsKIHRl c3RzL2dlbV9jdHhfcGFyYW0uYyAgfCAgICA0ICstCiB0ZXN0cy9nZW1fY3R4X3NzZXUuYyAgIHwg MTEyMCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiB0ZXN0cy9tZXNv bi5idWlsZCAgICAgIHwgICAgNyArCiA1IGZpbGVzIGNoYW5nZWQsIDExMzIgaW5zZXJ0aW9ucygr KSwgMSBkZWxldGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHRlc3RzL2dlbV9jdHhfc3NldS5j CgpkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuYW0gYi90ZXN0cy9NYWtlZmlsZS5hbQppbmRl eCBlZTVhN2M1ZTgzYjguLjZiNjdiZDJjYzE3YSAxMDA2NDQKLS0tIGEvdGVzdHMvTWFrZWZpbGUu YW0KKysrIGIvdGVzdHMvTWFrZWZpbGUuYW0KQEAgLTEwNyw2ICsxMDcsNyBAQCBnZW1fY2xvc2Vf cmFjZV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChUSFJFQURfQ0ZMQUdTKQogZ2VtX2Nsb3NlX3Jh Y2VfTERBREQgPSAkKExEQUREKSAtbHB0aHJlYWQKIGdlbV9jdHhfdGhyYXNoX0NGTEFHUyA9ICQo QU1fQ0ZMQUdTKSAkKFRIUkVBRF9DRkxBR1MpCiBnZW1fY3R4X3RocmFzaF9MREFERCA9ICQoTERB REQpIC1scHRocmVhZAorZ2VtX2N0eF9zc2V1X0xEQUREID0gJChMREFERCkgJCh0b3BfYnVpbGRk aXIpL2xpYi9saWJpZ3RfcGVyZi5sYQogZ2VtX2V4ZWNfcGFyYWxsZWxfQ0ZMQUdTID0gJChBTV9D RkxBR1MpICQoVEhSRUFEX0NGTEFHUykKIGdlbV9leGVjX3BhcmFsbGVsX0xEQUREID0gJChMREFE RCkgLWxwdGhyZWFkCiBnZW1fZmVuY2VfdGhyYXNoX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKFRI UkVBRF9DRkxBR1MpCmRpZmYgLS1naXQgYS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzIGIvdGVzdHMv TWFrZWZpbGUuc291cmNlcwppbmRleCBjODQ5MzNmMWQ5NzEuLmY4ZjJjOGQ2N2Q3MiAxMDA2NDQK LS0tIGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcworKysgYi90ZXN0cy9NYWtlZmlsZS5zb3VyY2Vz CkBAIC01Niw2ICs1Niw3IEBAIFRFU1RTX3Byb2dzID0gXAogCWdlbV9jdHhfZXhlYyBcCiAJZ2Vt X2N0eF9pc29sYXRpb24gXAogCWdlbV9jdHhfcGFyYW0gXAorCWdlbV9jdHhfc3NldSBcCiAJZ2Vt X2N0eF9zd2l0Y2ggXAogCWdlbV9jdHhfdGhyYXNoIFwKIAlnZW1fZG91YmxlX2lycV9sb29wIFwK ZGlmZiAtLWdpdCBhL3Rlc3RzL2dlbV9jdHhfcGFyYW0uYyBiL3Rlc3RzL2dlbV9jdHhfcGFyYW0u YwppbmRleCBjNDZmZDcwOWIwZDcuLmFmMWFmZWFhMmYyZiAxMDA2NDQKLS0tIGEvdGVzdHMvZ2Vt X2N0eF9wYXJhbS5jCisrKyBiL3Rlc3RzL2dlbV9jdHhfcGFyYW0uYwpAQCAtMjk0LDExICsyOTQs MTMgQEAgaWd0X21haW4KIAkJCXNldF9wcmlvcml0eShmZCk7CiAJfQogCisJLyogSTkxNV9DT05U RVhUX1BBUkFNX1NTRVUgdGVzdHMgYXJlIGxvY2F0ZWQgaW4gZ2VtX2N0eF9zc2V1LmMgKi8KKwog CS8qIE5PVEU6IFRoaXMgdGVzdGNhc2UgaW50ZW50aW9uYWxseSB0ZXN0cyBmb3IgdGhlIG5leHQg ZnJlZSBwYXJhbWV0ZXIKIAkgKiB0byBjYXRjaCBBQkkgZXh0ZW5zaW9ucy4gRG9uJ3QgImZpeCIg dGhpcyB0ZXN0Y2FzZSB3aXRob3V0IGFkZGluZyBhbGwKIAkgKiB0aGUgdGVzdHMgZm9yIHRoZSBu ZXcgcGFyYW0gZmlyc3QuCiAJICovCi0JYXJnLnBhcmFtID0gSTkxNV9DT05URVhUX1BBUkFNX1BS SU9SSVRZICsgMTsKKwlhcmcucGFyYW0gPSBJOTE1X0NPTlRFWFRfUEFSQU1fU1NFVSArIDE7CiAK IAlpZ3Rfc3VidGVzdCgiaW52YWxpZC1wYXJhbS1nZXQiKSB7CiAJCWFyZy5jdHhfaWQgPSBjdHg7 CmRpZmYgLS1naXQgYS90ZXN0cy9nZW1fY3R4X3NzZXUuYyBiL3Rlc3RzL2dlbV9jdHhfc3NldS5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uOWRkZTNlNDU3YjcxCi0t LSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ2VtX2N0eF9zc2V1LmMKQEAgLTAsMCArMSwxMTIwIEBA CisvKgorICogQ29weXJpZ2h0IMKpIDIwMTctMjAxOCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAq IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVy c29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQg ZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUg U29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlv bgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRp c3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3 YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1 cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cisg KgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3Rp Y2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBp biBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUu CisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFO VFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9U IExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVW RU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUg Rk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElO IEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZS T00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0Ug T1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgor ICogICAgTGlvbmVsIExhbmR3ZXJsaW4gPGxpb25lbC5nLmxhbmR3ZXJsaW5AaW50ZWwuY29tPgor ICoKKyAqLworCisjaW5jbHVkZSAiaWd0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRl IDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNp bmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGVycm5vLmg+ CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lz L3dhaXQuaD4KKworI2luY2x1ZGUgImlndF9kdW1teWxvYWQuaCIKKyNpbmNsdWRlICJpZ3RfcGVy Zi5oIgorI2luY2x1ZGUgImlndF9zeXNmcy5oIgorI2luY2x1ZGUgImlvY3RsX3dyYXBwZXJzLmgi CisKK0lHVF9URVNUX0RFU0NSSVBUSU9OKCJUZXN0IGNvbnRleHQgcmVuZGVyIHBvd2VyZ2F0aW5n IHByb2dyYW1taW5nLiIpOworCisjZGVmaW5lIE1JX1NUT1JFX1JFR0lTVEVSX01FTSAoMHgyNCA8 PCAyMykKKworI2RlZmluZSBNSV9TRVRfUFJFRElDQVRFICAgICAgKDB4MSA8PCAyMykKKyNkZWZp bmUgIE1JX1NFVF9QUkVESUNBVEVfTk9PUF9ORVZFUiAgICAgICAgICgwKQorI2RlZmluZSAgTUlf U0VUX1BSRURJQ0FURV9OT09QX1JFU1VMVDJfQ0xFQVIgKDEpCisjZGVmaW5lICBNSV9TRVRfUFJF RElDQVRFX05PT1BfUkVTVUxUMl9TRVQgICAoMikKKyNkZWZpbmUgIE1JX1NFVF9QUkVESUNBVEVf Tk9PUF9SRVNVTFRfQ0xFQVIgICgzKQorI2RlZmluZSAgTUlfU0VUX1BSRURJQ0FURV9OT09QX1JF U1VMVF9TRVQgICAgKDQpCisjZGVmaW5lICBNSV9TRVRfUFJFRElDQVRFXzFfU0xJQ0VTICAgICAg ICAgICAoNSkKKyNkZWZpbmUgIE1JX1NFVF9QUkVESUNBVEVfMl9TTElDRVMgICAgICAgICAgICg2 KQorI2RlZmluZSAgTUlfU0VUX1BSRURJQ0FURV8zX1NMSUNFUyAgICAgICAgICAgKDcpCisKKyNk ZWZpbmUgR0VOOF9SX1BXUl9DTEtfU1RBVEUJCTB4MjBDOAorI2RlZmluZSAgIEdFTjhfUlBDU19F TkFCTEUJCSgxIDw8IDMxKQorI2RlZmluZSAgIEdFTjhfUlBDU19TX0NOVF9FTkFCTEUJKDEgPDwg MTgpCisjZGVmaW5lICAgR0VOOF9SUENTX1NfQ05UX1NISUZUCQkxNQorI2RlZmluZSAgIEdFTjhf UlBDU19TX0NOVF9NQVNLCQkoMHg3IDw8IEdFTjhfUlBDU19TX0NOVF9TSElGVCkKKyNkZWZpbmUg ICBHRU4xMV9SUENTX1NfQ05UX1NISUZUCTEyCisjZGVmaW5lICAgR0VOMTFfUlBDU19TX0NOVF9N QVNLCQkoMHgzZiA8PCBHRU4xMV9SUENTX1NfQ05UX1NISUZUKQorI2RlZmluZSAgIEdFTjhfUlBD U19TU19DTlRfRU5BQkxFCSgxIDw8IDExKQorI2RlZmluZSAgIEdFTjhfUlBDU19TU19DTlRfU0hJ RlQJOAorI2RlZmluZSAgIEdFTjhfUlBDU19TU19DTlRfTUFTSwkJKDB4NyA8PCBHRU44X1JQQ1Nf U1NfQ05UX1NISUZUKQorI2RlZmluZSAgIEdFTjhfUlBDU19FVV9NQVhfU0hJRlQJNAorI2RlZmlu ZSAgIEdFTjhfUlBDU19FVV9NQVhfTUFTSwkJKDB4ZiA8PCBHRU44X1JQQ1NfRVVfTUFYX1NISUZU KQorI2RlZmluZSAgIEdFTjhfUlBDU19FVV9NSU5fU0hJRlQJMAorI2RlZmluZSAgIEdFTjhfUlBD U19FVV9NSU5fTUFTSwkJKDB4ZiA8PCBHRU44X1JQQ1NfRVVfTUlOX1NISUZUKQorCisjZGVmaW5l IFJDU19USU1FU1RBTVAgKDB4MjAwMCArIDB4MzU4KQorCitzdGF0aWMgdW5zaWduZWQgaW50IF9f aW50ZWxfZ2VuX18sIF9faW50ZWxfZGV2aWRfXzsKK3N0YXRpYyB1aW50NjRfdCBfX3NsaWNlX21h c2tfXywgX19zdWJzbGljZV9tYXNrX187CitzdGF0aWMgdW5zaWduZWQgaW50IF9fc2xpY2VfY291 bnRfXywgX19zdWJzbGljZV9jb3VudF9fOworCitzdGF0aWMgdWludDY0X3QgbWFza19taW51c19v bmUodWludDY0X3QgbWFzaykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkg PCAoc2l6ZW9mKG1hc2spICogOCAtIDEpOyBpKyspIHsKKwkJaWYgKCgxVUxMIDw8IGkpICYgbWFz aykKKwkJCXJldHVybiBtYXNrICYgfigxVUxMIDw8IGkpOworCX0KKworCWlndF9hc3NlcnQoMCk7 CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBtYXNrX3BsdXNfb25lKHVpbnQ2NF90 IG1hc2spCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZiht YXNrKSAqIDggLSAxKTsgaSsrKSB7CisJCWlmICgoKDFVTEwgPDwgaSkgJiBtYXNrKSA9PSAwKQor CQkJcmV0dXJuIG1hc2sgfCAoMVVMTCA8PCBpKTsKKwl9CisKKwlpZ3RfYXNzZXJ0KDApOworCXJl dHVybiAwOworfQorCitzdGF0aWMgdWludDY0X3QgbWFza19taW51cyh1aW50NjRfdCBtYXNrLCBp bnQgbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJ CW1hc2sgPSBtYXNrX21pbnVzX29uZShtYXNrKTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0 aWMgdWludDY0X3QgbWFza19wbHVzKHVpbnQ2NF90IG1hc2ssIGludCBuKQoreworCXVuc2lnbmVk IGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJbWFzayA9IG1hc2tfcGx1c19v bmUobWFzayk7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIHVpbnQzMl90ICoKK2ZpbGxf cmVsb2NhdGlvbih1aW50MzJfdCAqYmF0Y2gsCisJCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2Nh dGlvbl9lbnRyeSAqcmVsb2MsCisJCXVpbnQzMl90IGdlbV9oYW5kbGUsIHVpbnQzMl90IGRlbHRh LCAvKiBpbiBieXRlcyAqLworCQl1aW50MzJfdCBvZmZzZXQsIC8qIGluIGR3b3JkcyAqLworCQl1 aW50MzJfdCByZWFkX2RvbWFpbnMsIHVpbnQzMl90IHdyaXRlX2RvbWFpbnMpCit7CisJcmVsb2Mt PnRhcmdldF9oYW5kbGUgPSBnZW1faGFuZGxlOworCXJlbG9jLT5kZWx0YSA9IGRlbHRhOworCXJl bG9jLT5vZmZzZXQgPSBvZmZzZXQgKiBzaXplb2YodWludDMyX3QpOworCXJlbG9jLT5wcmVzdW1l ZF9vZmZzZXQgPSAwOworCXJlbG9jLT5yZWFkX2RvbWFpbnMgPSByZWFkX2RvbWFpbnM7CisJcmVs b2MtPndyaXRlX2RvbWFpbiA9IHdyaXRlX2RvbWFpbnM7CisKKwkqYmF0Y2grKyA9IGRlbHRhOwor CSpiYXRjaCsrID0gMDsKKworCXJldHVybiBiYXRjaDsKK30KKworCitzdGF0aWMgdWludDMyX3QK K3JlYWRfcnBjc19yZWcoaW50IGZkLCB1aW50MzJfdCBjdHgsIHVpbnQzMl90IGV4cGVjdGVkX3Ns aWNlcywgaWd0X3NwaW5fdCAqc3BpbikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZm ZXIyIGV4ZWNidWYgPSB7IH07CisJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5 IHJlbG9jc1syXTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBvYmpbMl07CisJ dWludDMyX3QgKmJhdGNoLCAqYiwgZGF0YVsyXTsKKwl1bnNpZ25lZCBpbnQgbl9yZWxvY3MgPSAw OworCXVpbnQzMl90IHJwY3M7CisKKwltZW1zZXQob2JqLCAwLCBzaXplb2Yob2JqKSk7CisJb2Jq WzBdLmhhbmRsZSA9IGdlbV9jcmVhdGUoZmQsIDQwOTYpOworCW9ialsxXS5oYW5kbGUgPSBnZW1f Y3JlYXRlKGZkLCA0MDk2KTsKKworCWJhdGNoID0gYiA9CisJICAgICAgZ2VtX21tYXBfX2NwdShm ZCwgb2JqWzFdLmhhbmRsZSwgMCwgNDA5NiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CisKKwlp ZiAoZXhwZWN0ZWRfc2xpY2VzICE9IDAgJiYgX19pbnRlbF9nZW5fXyA8IDEwKQorCQkqYisrID0g TUlfU0VUX1BSRURJQ0FURSB8ICgxIC0gMSkgfAorCQkgICAgICAgKE1JX1NFVF9QUkVESUNBVEVf MV9TTElDRVMgKyBleHBlY3RlZF9zbGljZXMgLSAxKTsKKworCSpiKysgPSBNSV9TVE9SRV9SRUdJ U1RFUl9NRU0gfCAoNCAtIDIpOworCSpiKysgPSBSQ1NfVElNRVNUQU1QOworCWIgPSBmaWxsX3Jl bG9jYXRpb24oYiwgJnJlbG9jc1tuX3JlbG9jcysrXSwgb2JqWzBdLmhhbmRsZSwKKwkJCSAgICAw LCBiIC0gYmF0Y2gsCisJCQkgICAgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUiwgSTkxNV9HRU1fRE9N QUlOX1JFTkRFUik7CisKKwkqYisrID0gTUlfU1RPUkVfUkVHSVNURVJfTUVNIHwgKDQgLSAyKTsK KwkqYisrID0gR0VOOF9SX1BXUl9DTEtfU1RBVEU7CisJYiA9IGZpbGxfcmVsb2NhdGlvbihiLCAm cmVsb2NzW25fcmVsb2NzKytdLCBvYmpbMF0uaGFuZGxlLAorCQkJICAgIDQsIGIgLSBiYXRjaCwK KwkJCSAgICBJOTE1X0dFTV9ET01BSU5fUkVOREVSLCBJOTE1X0dFTV9ET01BSU5fUkVOREVSKTsK KworCWlmIChleHBlY3RlZF9zbGljZXMgIT0gMCAmJiBfX2ludGVsX2dlbl9fIDwgMTApCisJCSpi KysgPSBNSV9TRVRfUFJFRElDQVRFIHwgKDEgLSAxKSB8IE1JX1NFVF9QUkVESUNBVEVfTk9PUF9O RVZFUjsKKworCSpiKysgPSBNSV9CQVRDSF9CVUZGRVJfRU5EOworCisJZ2VtX211bm1hcChiYXRj aCwgNDA5Nik7CisKKwlvYmpbMV0ucmVsb2NhdGlvbl9jb3VudCA9IG5fcmVsb2NzOworCW9ialsx XS5yZWxvY3NfcHRyID0gdG9fdXNlcl9wb2ludGVyKHJlbG9jcyk7CisKKwlleGVjYnVmLmJ1ZmZl cnNfcHRyID0gdG9fdXNlcl9wb2ludGVyKG9iaik7CisJZXhlY2J1Zi5idWZmZXJfY291bnQgPSBB UlJBWV9TSVpFKG9iaik7CisJaTkxNV9leGVjYnVmZmVyMl9zZXRfY29udGV4dF9pZChleGVjYnVm LCBjdHgpOworCisJZ2VtX2V4ZWNidWYoZmQsICZleGVjYnVmKTsKKworCWlmIChzcGluKSB7CisJ CWlndF9hc3NlcnQoZ2VtX2JvX2J1c3koZmQsIHNwaW4tPmhhbmRsZSkpOworCQlpZ3Rfc3Bpbl9i YXRjaF9lbmQoc3Bpbik7CisJfQorCisJZ2VtX3JlYWQoZmQsIG9ialswXS5oYW5kbGUsIDAsIGRh dGEsIHNpemVvZihkYXRhKSk7CisKKwlycGNzID0gZGF0YVsxXTsKKworCWlndF9kZWJ1ZygicmNz X3RpbWVzdGFtcD0weCV4IHJwY3M9MHgleFxuIiwgZGF0YVswXSwgZGF0YVsxXSk7CisKKwlnZW1f Y2xvc2UoZmQsIG9ialswXS5oYW5kbGUpOworCWdlbV9jbG9zZShmZCwgb2JqWzFdLmhhbmRsZSk7 CisKKwlyZXR1cm4gcnBjczsKK30KKwordHlwZWRlZiB1aW50MzJfdCAoKnJlYWRfc2xpY2VfY291 bnRfZikoaW50IGZkLCB1aW50MzJfdCBjdHgsIHVpbnQzMl90IGV4cGVjdGVkLAorCQkJCSAgICAg ICBpZ3Rfc3Bpbl90ICpzcGluKTsKKworc3RhdGljIHJlYWRfc2xpY2VfY291bnRfZiBfX3JlYWRf c2xpY2VfY291bnQ7CisKK3N0YXRpYyB1aW50MzJfdAorcmVhZF9zbGljZV9jb3VudChpbnQgZmQs IHVpbnQzMl90IGN0eCwgdWludDMyX3QgZXhwZWN0ZWRfc2xpY2VfY291bnQpCit7CisJcmV0dXJu IF9fcmVhZF9zbGljZV9jb3VudChmZCwgY3R4LCBleHBlY3RlZF9zbGljZV9jb3VudCwgTlVMTCk7 Cit9CisKK3N0YXRpYyB1aW50MzJfdAorZ2VuOF9yZWFkX3NsaWNlX2NvdW50KGludCBmZCwgdWlu dDMyX3QgY3R4LCB1aW50MzJfdCBleHBlY3RlZF9zbGljZV9jb3VudCwKKwkJICAgICAgaWd0X3Nw aW5fdCAqc3BpbikKK3sKKwlyZXR1cm4gKHJlYWRfcnBjc19yZWcoZmQsIGN0eCwgZXhwZWN0ZWRf c2xpY2VfY291bnQsIHNwaW4pICYKKwkJR0VOOF9SUENTX1NfQ05UX01BU0spID4+IEdFTjhfUlBD U19TX0NOVF9TSElGVDsKK30KKworc3RhdGljIHVpbnQzMl90CitnZW4xMV9yZWFkX3NsaWNlX2Nv dW50KGludCBmZCwgdWludDMyX3QgY3R4LCB1aW50MzJfdCBleHBlY3RlZF9zbGljZV9jb3VudCwK KwkJICAgICAgIGlndF9zcGluX3QgKnNwaW4pCit7CisJcmV0dXJuIChyZWFkX3JwY3NfcmVnKGZk LCBjdHgsIGV4cGVjdGVkX3NsaWNlX2NvdW50LCBzcGluKSAmCisJCUdFTjExX1JQQ1NfU19DTlRf TUFTSykgPj4gR0VOMTFfUlBDU19TX0NOVF9TSElGVDsKK30KKworc3RhdGljIHVpbnQzMl90City ZWFkX3N1YnNsaWNlX2NvdW50KGludCBmZCwgdWludDMyX3QgY3R4KQoreworCXJldHVybiAocmVh ZF9ycGNzX3JlZyhmZCwgY3R4LCAwLCBOVUxMKSAmIEdFTjhfUlBDU19TU19DTlRfTUFTSykgPj4K KwkgICAgICAgR0VOOF9SUENTX1NTX0NOVF9TSElGVDsKK30KKworc3RhdGljIGJvb2wKK2tlcm5l bF9oYXNfcGVyX2NvbnRleHRfc3NldV9zdXBwb3J0KGludCBmZCkKK3sKKwlzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX2NvbnRleHRfcGFyYW1fc3NldSBzc2V1ID0geyB9OworCXN0cnVjdCBkcm1faTkxNV9n ZW1fY29udGV4dF9wYXJhbSBhcmcgPQorCQl7CisJCSAgLnBhcmFtID0gSTkxNV9DT05URVhUX1BB UkFNX1NTRVUsCisJCSAgLnNpemUgPSBzaXplb2Yoc3NldSksCisJCSAgLnZhbHVlID0gdG9fdXNl cl9wb2ludGVyKCZzc2V1KSwKKwkJfTsKKwlpbnQgcmV0OworCisJaWYgKF9fZ2VtX2NvbnRleHRf Z2V0X3BhcmFtKGZkLCAmYXJnKSkKKwkJcmV0dXJuIGZhbHNlOworCisJYXJnLnZhbHVlID0gdG9f dXNlcl9wb2ludGVyKCZzc2V1KTsKKworCXJldCA9IF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZk LCAmYXJnKTsKKworCWlndF9hc3NlcnQocmV0ID09IDAgfHwgcmV0ID09IC1FTk9ERVYgfHwgcmV0 ID09IC1FSU5WQUwpOworCisJcmV0dXJuIHJldCA9PSAwOworfQorCitzdGF0aWMgdm9pZAorY29u dGV4dF9nZXRfc3NldV9tYXNrcyhpbnQgZmQsIHVpbnQzMl90IGN0eCwKKwkJICAgICAgIHVpbnQ2 NF90ICpzbGljZV9tYXNrLAorCQkgICAgICAgdWludDY0X3QgKnN1YnNsaWNlX21hc2spCit7CisJ c3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X3BhcmFtX3NzZXUgc3NldSA9IHsgfTsKKwlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0gYXJnID0KKwkJeyAucGFyYW0gPSBJOTE1X0NP TlRFWFRfUEFSQU1fU1NFVSwKKwkJICAuY3R4X2lkID0gY3R4LAorCQkgIC5zaXplID0gc2l6ZW9m KHNzZXUpLAorCQkgIC52YWx1ZSA9IHRvX3VzZXJfcG9pbnRlcigmc3NldSkgfTsKKworCWdlbV9j b250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyk7CisKKwlpZiAoc2xpY2VfbWFzaykKKwkJKnNsaWNl X21hc2sgPSBzc2V1LnNsaWNlX21hc2s7CisKKwlpZiAoc3Vic2xpY2VfbWFzaykKKwkJKnN1YnNs aWNlX21hc2sgPSBzc2V1LnN1YnNsaWNlX21hc2s7Cit9CisKK3N0YXRpYyB2b2lkCitjb250ZXh0 X3NldF9zbGljZV9tYXNrKGludCBmZCwgdWludDMyX3QgY3R4LCB1aW50NjRfdCBzbGljZV9tYXNr KQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fY29udGV4dF9wYXJhbV9zc2V1IHNzZXUgPSB7IH07 CisJc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X3BhcmFtIGFyZyA9CisJCXsgLnBhcmFtID0g STkxNV9DT05URVhUX1BBUkFNX1NTRVUsCisJCSAgLmN0eF9pZCA9IGN0eCwKKwkJICAuc2l6ZSA9 IHNpemVvZihzc2V1KSwKKwkJICAudmFsdWUgPSB0b191c2VyX3BvaW50ZXIoJnNzZXUpIH07CisK KwlnZW1fY29udGV4dF9nZXRfcGFyYW0oZmQsICZhcmcpOworCXNzZXUuc2xpY2VfbWFzayA9IHNs aWNlX21hc2s7CisJZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJnKTsKK30KKworc3RhdGlj IHZvaWQKK2NvbnRleHRfc2V0X3N1YnNsaWNlX21hc2soaW50IGZkLCB1aW50MzJfdCBjdHgsIHVp bnQ2NF90IHN1YnNsaWNlX21hc2spCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X3Bh cmFtX3NzZXUgc3NldSA9IHsgfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0g YXJnID0KKwkJeyAucGFyYW0gPSBJOTE1X0NPTlRFWFRfUEFSQU1fU1NFVSwKKwkJICAuY3R4X2lk ID0gY3R4LAorCQkgIC5zaXplID0gc2l6ZW9mKHNzZXUpLAorCQkgIC52YWx1ZSA9IHRvX3VzZXJf cG9pbnRlcigmc3NldSkgfTsKKworCWdlbV9jb250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyk7CisJ c3NldS5zdWJzbGljZV9tYXNrID0gc3Vic2xpY2VfbWFzazsKKwlnZW1fY29udGV4dF9zZXRfcGFy YW0oZmQsICZhcmcpOworfQorCisvKgorICogVmVyaWZ5IHRoYXQgd2UgY2FuIHByb2dyYW0gdGhl IHNsaWNlIGNvdW50LgorICovCitzdGF0aWMgdm9pZAordGVzdF9zbGljZV9wZyhpbnQgZmQsIHVp bnQzMl90IHBnX3NsaWNlX2NvdW50KQoreworCXVpbnQ2NF90IHBnX3NsaWNlX21hc2sgPSBtYXNr X21pbnVzKF9fc2xpY2VfbWFza19fLCBwZ19zbGljZV9jb3VudCk7CisJdW5zaWduZWQgaW50IHNs aWNlX2NvdW50ID0gX19zbGljZV9jb3VudF9fIC0gcGdfc2xpY2VfY291bnQ7CisJdWludDY0X3Qg c2xpY2VfbWFzazsKKwl1aW50MzJfdCBjdHg7CisKKwlpZ3RfYXNzZXJ0X2VxKHNsaWNlX2NvdW50 LCBfX2J1aWx0aW5fcG9wY291bnQocGdfc2xpY2VfbWFzaykpOworCisJY3R4ID0gZ2VtX2NvbnRl eHRfY3JlYXRlKGZkKTsKKwljb250ZXh0X3NldF9zbGljZV9tYXNrKGZkLCBjdHgsIHBnX3NsaWNl X21hc2spOworCWNvbnRleHRfZ2V0X3NzZXVfbWFza3MoZmQsIGN0eCwgJnNsaWNlX21hc2ssIE5V TEwpOworCWlndF9hc3NlcnRfZXEocGdfc2xpY2VfbWFzaywgc2xpY2VfbWFzayk7CisKKwkvKgor CSAqIFRlc3QgZmFsc2UgcG9zaXRpdmVzIHdpdGggcHJlZGljYXRlcyAob25seSBhdmFpbGFibGUg b24KKwkgKiBiZWZvcmUgR2VuMTApLgorCSAqLworCWlmIChfX2ludGVsX2dlbl9fIDwgMTApCisJ CWlndF9hc3NlcnRfZXEocmVhZF9zbGljZV9jb3VudChmZCwgY3R4LCBfX3NsaWNlX2NvdW50X18p LCAwKTsKKworCWlndF9hc3NlcnRfZXEocmVhZF9zbGljZV9jb3VudChmZCwgY3R4LCAwKSwgc2xp Y2VfY291bnQpOworCisJZ2VtX2NvbnRleHRfZGVzdHJveShmZCwgY3R4KTsKK30KKworLyoKKyAq IFZlcmlmeSB0aGF0IHdlIGNhbiBwcm9ncmFtIHRoZSBzdWJzbGljZSBjb3VudC4KKyAqLworc3Rh dGljIHZvaWQKK3Rlc3Rfc3Vic2xpY2VfcGcoaW50IGZkLCBpbnQgcGdfc3Vic2xpY2VfY291bnQp Cit7CisJdWludDY0X3QgcGdfc3Vic2xpY2VfbWFzayA9CisJCW1hc2tfbWludXMoX19zdWJzbGlj ZV9tYXNrX18sIHBnX3N1YnNsaWNlX2NvdW50KTsKKwl1bnNpZ25lZCBpbnQgc3Vic2xpY2VfY291 bnQgPSBfX3N1YnNsaWNlX2NvdW50X18gLSBwZ19zdWJzbGljZV9jb3VudDsKKwl1aW50NjRfdCBz dWJzbGljZV9tYXNrOworCXVpbnQzMl90IGN0eDsKKworCWlndF9hc3NlcnRfZXEoc3Vic2xpY2Vf Y291bnQsIF9fYnVpbHRpbl9wb3Bjb3VudChwZ19zdWJzbGljZV9tYXNrKSk7CisKKwljdHggPSBn ZW1fY29udGV4dF9jcmVhdGUoZmQpOworCWNvbnRleHRfc2V0X3N1YnNsaWNlX21hc2soZmQsIGN0 eCwgcGdfc3Vic2xpY2VfbWFzayk7CisJY29udGV4dF9nZXRfc3NldV9tYXNrcyhmZCwgY3R4LCBO VUxMLCAmc3Vic2xpY2VfbWFzayk7CisJaWd0X2Fzc2VydF9lcShwZ19zdWJzbGljZV9tYXNrLCBz dWJzbGljZV9tYXNrKTsKKworCWlndF9hc3NlcnRfZXEocmVhZF9zdWJzbGljZV9jb3VudChmZCwg Y3R4KSwgc3Vic2xpY2VfY291bnQpOworCisJZ2VtX2NvbnRleHRfZGVzdHJveShmZCwgY3R4KTsK K30KKworc3RhdGljIGJvb2wgaGFzX2VuZ2luZShpbnQgZmQsIHVuc2lnbmVkIGludCBjbGFzcywg dW5zaWduZWQgaW50IGluc3RhbmNlKQoreworCWludCBwbXUgPSBwZXJmX2k5MTVfb3BlbihJOTE1 X1BNVV9FTkdJTkVfQlVTWShjbGFzcywgaW5zdGFuY2UpKTsKKworCWlmIChwbXUgPj0gMCkKKwkJ Y2xvc2UocG11KTsKKworCXJldHVybiBwbXUgPj0gMDsKK30KKworLyoKKyAqIFZlcmlmeSB0aGF0 IGludmFsaWQgZW5naW5lcyBhcmUgcmVqZWN0ZWQgYW5kIHZhbGlkIG9uZXMgYXJlIGFjY2VwdGVk LgorICovCitzdGF0aWMgdm9pZCB0ZXN0X2VuZ2luZXMoaW50IGZkKQoreworCXN0cnVjdCBkcm1f aTkxNV9nZW1fY29udGV4dF9wYXJhbV9zc2V1IHNzZXUgPSB7IH07CisJc3RydWN0IGRybV9pOTE1 X2dlbV9jb250ZXh0X3BhcmFtIGFyZyA9CisJCXsgLnBhcmFtID0gSTkxNV9DT05URVhUX1BBUkFN X1NTRVUsCisJCSAgLmN0eF9pZCA9IGdlbV9jb250ZXh0X2NyZWF0ZShmZCksCisJCSAgLnNpemUg PSBzaXplb2Yoc3NldSksCisJCSAgLnZhbHVlID0gdG9fdXNlcl9wb2ludGVyKCZzc2V1KSB9Owor CXVuc2lnbmVkIGludCBjbGFzcywgaW5zdGFuY2U7CisJaW50IGxhc3Rfd2l0aF9lbmdpbmVzOwor CisJLyogZ2V0X3BhcmFtICovCisKKwlzc2V1Lmluc3RhbmNlID0gLTE7IC8qIEFzc3VtZWQgaW52 YWxpZC4gKi8KKwlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfZ2V0X3BhcmFtKGZkLCAmYXJn KSwgLUVJTlZBTCk7CisKKwlzc2V1LmNsYXNzID0gSTkxNV9FTkdJTkVfQ0xBU1NfSU5WQUxJRDsg LyogQm90aCBpbnZhbGlkLiAqLworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9nZXRfcGFy YW0oZmQsICZhcmcpLCAtRUlOVkFMKTsKKworCXNzZXUuaW5zdGFuY2UgPSAwOyAvKiBDbGFzcyBp bnZhbGlkLiAqLworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9nZXRfcGFyYW0oZmQsICZh cmcpLCAtRUlOVkFMKTsKKwlzc2V1LmNsYXNzID0gSTkxNV9FTkdJTkVfQ0xBU1NfUkVOREVSOwor CisJbGFzdF93aXRoX2VuZ2luZXMgPSAtMTsKKwlmb3IgKGNsYXNzID0gMDsgY2xhc3MgPCB+MDsg Y2xhc3MrKykgeworCQlmb3IgKGluc3RhbmNlID0gMDsgaW5zdGFuY2UgPCB+MDsgaW5zdGFuY2Ur KykgeworCQkJaW50IHJldDsKKworCQkJc3NldS5jbGFzcyA9IGNsYXNzOworCQkJc3NldS5pbnN0 YW5jZSA9IGluc3RhbmNlOworCisJCQlyZXQgPSBfX2dlbV9jb250ZXh0X2dldF9wYXJhbShmZCwg JmFyZyk7CisKKwkJCWlmIChoYXNfZW5naW5lKGZkLCBjbGFzcywgaW5zdGFuY2UpKSB7CisJCQkJ aWd0X2Fzc2VydF9lcShyZXQsIDApOworCQkJCWxhc3Rfd2l0aF9lbmdpbmVzID0gY2xhc3M7CisJ CQl9IGVsc2UgeworCQkJCWlndF9hc3NlcnRfZXEocmV0LCAtRUlOVkFMKTsKKwkJCQlpZiAoaW5z dGFuY2UgPiA4KSAvKiBTa2lwIG92ZXIgc29tZSBpbnN0YW5jZSBob2xlcy4gKi8KKwkJCQkJYnJl YWs7CisJCQl9CisJCX0KKworCQlpZiAoY2xhc3MgLSBsYXN0X3dpdGhfZW5naW5lcyA+IDgpIC8q IFNraXAgb3ZlciBzb21lIGNsYXNzIGhvbGVzLiAqLworCQkJYnJlYWs7CisJfQorCisJLyoKKwkg KiBHZXQgc29tZSBwcm9wZXIgdmFsdWVzIGJlZm9yZSB0cnlpbmcgdG8gcmVwcm9ncmFtIHRoZW0g b250bworCSAqIGFuIGludmFsaWQgZW5naW5lLgorCSAqLworCXNzZXUuY2xhc3MgPSAwOworCXNz ZXUuaW5zdGFuY2UgPSAwOworCWdlbV9jb250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyk7CisKKwkv KiBzZXRfcGFyYW0gKi8KKworCXNzZXUuaW5zdGFuY2UgPSAtMTsgLyogQXNzdW1lZCBpbnZhbGlk LiAqLworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcpLCAt RUlOVkFMKTsKKworCXNzZXUuY2xhc3MgPSBJOTE1X0VOR0lORV9DTEFTU19JTlZBTElEOyAvKiBC b3RoIGludmFsaWQuICovCisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJhbShm ZCwgJmFyZyksIC1FSU5WQUwpOworCisJc3NldS5pbnN0YW5jZSA9IDA7IC8qIENsYXNzIGludmFs aWQuICovCisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJhbShmZCwgJmFyZyks IC1FSU5WQUwpOworCisJbGFzdF93aXRoX2VuZ2luZXMgPSAtMTsKKwlmb3IgKGNsYXNzID0gMDsg Y2xhc3MgPCB+MDsgY2xhc3MrKykgeworCQlmb3IgKGluc3RhbmNlID0gMDsgaW5zdGFuY2UgPCB+ MDsgaW5zdGFuY2UrKykgeworCQkJaW50IHJldDsKKworCQkJc3NldS5jbGFzcyA9IGNsYXNzOwor CQkJc3NldS5pbnN0YW5jZSA9IGluc3RhbmNlOworCisJCQlyZXQgPSBfX2dlbV9jb250ZXh0X3Nl dF9wYXJhbShmZCwgJmFyZyk7CisKKwkJCWlmIChoYXNfZW5naW5lKGZkLCBjbGFzcywgaW5zdGFu Y2UpKSB7CisJCQkJaWd0X2Fzc2VydChyZXQgPT0gMCB8fCByZXQgPT0gLUVOT0RFVik7CisJCQkJ bGFzdF93aXRoX2VuZ2luZXMgPSBjbGFzczsKKwkJCX0gZWxzZSB7CisJCQkJaWd0X2Fzc2VydF9l cShyZXQsIC1FSU5WQUwpOworCQkJCWlmIChpbnN0YW5jZSA+IDgpIC8qIFNraXAgb3ZlciBzb21l IGluc3RhbmNlIGhvbGVzLiAqLworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChjbGFz cyAtIGxhc3Rfd2l0aF9lbmdpbmVzID4gOCkgLyogU2tpcCBvdmVyIHNvbWUgY2xhc3MgaG9sZXMu ICovCisJCQlicmVhazsKKwl9CisKKwlnZW1fY29udGV4dF9kZXN0cm95KGZkLCBhcmcuY3R4X2lk KTsKK30KKworLyoKKyAqIFZlcmlmeSB0aGF0IGludmFsaWQgYXJndW1lbnRzIGFyZSByZWplY3Rl ZC4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfaW52YWxpZF9hcmdzKGludCBmZCkKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0gYXJnID0KKwkJeyAucGFyYW0gPSBJOTE1X0NP TlRFWFRfUEFSQU1fU1NFVSwKKwkJICAuY3R4X2lkID0gZ2VtX2NvbnRleHRfY3JlYXRlKGZkKSwK KwkJfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW1fc3NldSBzc2V1ID0geyB9 OworCXVuc2lnbmVkIGNoYXIgKnBhZ2VbMl07CisJdW5zaWduZWQgY2hhciAqYWRkcjsKKwl1bnNp Z25lZCBpbnQgc3o7CisKKwkvKiBnZXQgcGFyYW0gKi8KKworCS8qIEludmFsaWQgc2l6ZS4gKi8K Kwlhcmcuc2l6ZSA9IDE7CisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X2dldF9wYXJhbShm ZCwgJmFyZyksIC1FSU5WQUwpOworCisJLyogUXVlcnkgc2l6ZS4gKi8KKwlhcmcuc2l6ZSA9IDA7 CisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyksIDApOwor CXN6ID0gYXJnLnNpemU7CisKKwkvKiBCYWQgcG9pbnRlcnMuICovCisJaWd0X2Fzc2VydF9lcShf X2dlbV9jb250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyksIC1FRkFVTFQpOworCWFyZy52YWx1ZSA9 IC0xOworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9nZXRfcGFyYW0oZmQsICZhcmcpLCAt RUZBVUxUKTsKKwlhcmcudmFsdWUgPSAxOworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9n ZXRfcGFyYW0oZmQsICZhcmcpLCAtRUZBVUxUKTsKKworCS8qIFVubWFwcGVkLiAqLworCXBhZ2Vb MF0gPSBtbWFwKDAsIDQwOTYsIFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT04sIC0x LCAwKTsKKwlpZ3RfYXNzZXJ0KHBhZ2VbMF0gIT0gTUFQX0ZBSUxFRCk7CisJbWVtc2V0KHBhZ2Vb MF0sIDAsIHNpemVvZihzc2V1KSk7CisJbXVubWFwKHBhZ2VbMF0sIDQwOTYpOworCWFyZy52YWx1 ZSA9IHRvX3VzZXJfcG9pbnRlcihwYWdlWzBdKTsKKwlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRl eHRfZ2V0X3BhcmFtKGZkLCAmYXJnKSwgLUVGQVVMVCk7CisKKwkvKiBTdHJhZGRsZSBpbnRvIHVu bWFwcGVkIGFyZWEuICovCisJcGFnZVswXSA9IG1tYXAoMCwgODE5MiwgUFJPVF9XUklURSwgTUFQ X1BSSVZBVEUgfCBNQVBfQU5PTiwgLTEsIDApOworCWlndF9hc3NlcnQocGFnZVswXSAhPSBNQVBf RkFJTEVEKTsKKwltdW5tYXAocGFnZVswXSwgODE5Mik7CisJcGFnZVswXSA9IG1tYXAocGFnZVsw XSwgNDA5NiwKKwkJICAgICAgIFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT04gfCBN QVBfRklYRUQsIC0xLCAwKTsKKwlpZ3RfYXNzZXJ0KHBhZ2VbMF0gIT0gTUFQX0ZBSUxFRCk7CisJ bWVtc2V0KHBhZ2VbMF0sIDAsIHNpemVvZihzc2V1KSk7CisJcGFnZVsxXSA9IG1tYXAoKHZvaWQg KikoKHVuc2lnbmVkIGxvbmcpcGFnZVswXSArIDQwOTYpLCA0MDk2LAorCQkgICAgICAgUFJPVF9X UklURSwgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiB8IE1BUF9GSVhFRCwgLTEsIDApOworCWlndF9h c3NlcnQocGFnZVsxXSAhPSBNQVBfRkFJTEVEKTsKKwltZW1zZXQocGFnZVsxXSwgMCwgc2l6ZW9m KHNzZXUpKTsKKwltdW5tYXAocGFnZVsxXSwgNDA5Nik7CisJYXJnLnZhbHVlID0gdG9fdXNlcl9w b2ludGVyKHBhZ2VbMV0pIC0KKwkJICAgIHNpemVvZihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRl eHRfcGFyYW1fc3NldSkgKyA0OworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9nZXRfcGFy YW0oZmQsICZhcmcpLCAtRUZBVUxUKTsKKwltdW5tYXAocGFnZVswXSwgNDA5Nik7CisKKwkvKiBT dHJhZGRsZSBpbnRvIHJlYWQtb25seSBhcmVhLiAqLworCXBhZ2VbMF0gPSBtbWFwKDAsIDgxOTIs IFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT04sIC0xLCAwKTsKKwlpZ3RfYXNzZXJ0 KHBhZ2VbMF0gIT0gTUFQX0ZBSUxFRCk7CisJbXVubWFwKHBhZ2VbMF0sIDgxOTIpOworCXBhZ2Vb MF0gPSBtbWFwKHBhZ2VbMF0sIDQwOTYsCisJCSAgICAgICBQUk9UX1dSSVRFLCBNQVBfUFJJVkFU RSB8IE1BUF9BTk9OIHwgTUFQX0ZJWEVELCAtMSwgMCk7CisJaWd0X2Fzc2VydChwYWdlWzBdICE9 IE1BUF9GQUlMRUQpOworCW1lbXNldChwYWdlWzBdLCAwLCBzaXplb2Yoc3NldSkpOworCXBhZ2Vb MV0gPSBtbWFwKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKXBhZ2VbMF0gKyA0MDk2KSwgNDA5NiwK KwkJICAgICAgIFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT04gfCBNQVBfRklYRUQs IC0xLCAwKTsKKwlpZ3RfYXNzZXJ0KHBhZ2VbMV0gIT0gTUFQX0ZBSUxFRCk7CisJbWVtc2V0KHBh Z2VbMV0sIDAsIHNpemVvZihzc2V1KSk7CisJaWd0X2Fzc2VydChtcHJvdGVjdChwYWdlWzFdLCA0 MDk2LCBQUk9UX1JFQUQpID09IDApOworCWFyZy52YWx1ZSA9IHRvX3VzZXJfcG9pbnRlcihwYWdl WzFdIC0gc2l6ZW9mKHNzZXUpICsgNCk7CisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X2dl dF9wYXJhbShmZCwgJmFyZyksIC1FRkFVTFQpOworCW11bm1hcChwYWdlWzBdLCA0MDk2KTsKKwlt dW5tYXAocGFnZVsxXSwgNDA5Nik7CisKKwkvKiBzZXQgcGFyYW0gKi8KKworCS8qIEludmFsaWQg c2l6ZXMuICovCisJYXJnLnNpemUgPSAxOworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9z ZXRfcGFyYW0oZmQsICZhcmcpLCAtRUlOVkFMKTsKKworCWFyZy5zaXplID0gMDsKKwlpZ3RfYXNz ZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJnKSwgLUVJTlZBTCk7CisJYXJn LnNpemUgPSBzejsKKworCS8qIEJhZCBwb2ludGVycy4gKi8KKwlhcmcudmFsdWUgPSAwOworCWln dF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcpLCAtRUZBVUxUKTsK KwlhcmcudmFsdWUgPSAtMTsKKwlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFt KGZkLCAmYXJnKSwgLUVGQVVMVCk7CisJYXJnLnZhbHVlID0gMTsKKwlpZ3RfYXNzZXJ0X2VxKF9f Z2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJnKSwgLUVGQVVMVCk7CisKKwkvKiBHZXQgdmFs aWQgU1NFVS4gKi8KKwlhcmcudmFsdWUgPSB0b191c2VyX3BvaW50ZXIoJnNzZXUpOworCWlndF9h c3NlcnRfZXEoX19nZW1fY29udGV4dF9nZXRfcGFyYW0oZmQsICZhcmcpLCAwKTsKKworCS8qIFVu bWFwcGVkLiAqLworCXBhZ2VbMF0gPSBtbWFwKDAsIDQwOTYsIFBST1RfV1JJVEUsIE1BUF9QUklW QVRFIHwgTUFQX0FOT04sIC0xLCAwKTsKKwlpZ3RfYXNzZXJ0KHBhZ2VbMF0gIT0gTUFQX0ZBSUxF RCk7CisJbWVtY3B5KHBhZ2VbMF0sICZzc2V1LCBzaXplb2Yoc3NldSkpOworCW11bm1hcChwYWdl WzBdLCA0MDk2KTsKKwlhcmcudmFsdWUgPSB0b191c2VyX3BvaW50ZXIocGFnZVswXSk7CisJaWd0 X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJhbShmZCwgJmFyZyksIC1FRkFVTFQpOwor CisJLyogU3RyYWRkbGUgaW50byB1bm1hcHBlZCBhcmVhLiAqLworCXBhZ2VbMF0gPSBtbWFwKDAs IDgxOTIsIFBST1RfV1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT04sIC0xLCAwKTsKKwlpZ3Rf YXNzZXJ0KHBhZ2VbMF0gIT0gTUFQX0ZBSUxFRCk7CisJbXVubWFwKHBhZ2VbMF0sIDgxOTIpOwor CXBhZ2VbMF0gPSBtbWFwKHBhZ2VbMF0sIDQwOTYsCisJCSAgICAgICBQUk9UX1dSSVRFLCBNQVBf UFJJVkFURSB8IE1BUF9BTk9OIHwgTUFQX0ZJWEVELCAtMSwgMCk7CisJaWd0X2Fzc2VydChwYWdl WzBdICE9IE1BUF9GQUlMRUQpOworCXBhZ2VbMV0gPSBtbWFwKCh2b2lkICopKCh1bnNpZ25lZCBs b25nKXBhZ2VbMF0gKyA0MDk2KSwgNDA5NiwKKwkJICAgICAgIFBST1RfV1JJVEUsIE1BUF9QUklW QVRFIHwgTUFQX0FOT04gfCBNQVBfRklYRUQsIC0xLCAwKTsKKwlpZ3RfYXNzZXJ0KHBhZ2VbMV0g IT0gTUFQX0ZBSUxFRCk7CisJYWRkciA9IHBhZ2VbMV0gLSBzaXplb2Yoc3NldSkgKyA0OworCW1l bWNweShhZGRyLCAmc3NldSwgc2l6ZW9mKHNzZXUpKTsKKwltdW5tYXAocGFnZVsxXSwgNDA5Nik7 CisJYXJnLnZhbHVlID0gdG9fdXNlcl9wb2ludGVyKGFkZHIpOworCWlndF9hc3NlcnRfZXEoX19n ZW1fY29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcpLCAtRUZBVUxUKTsKKwltdW5tYXAocGFnZVsw XSwgNDA5Nik7CisKKwlnZW1fY29udGV4dF9kZXN0cm95KGZkLCBhcmcuY3R4X2lkKTsKK30KKwor LyoKKyAqIFZlcmlmeSB0aGF0IGdndHQgbWFwcGVkIGFyZWEgY2FuIGJlIHVzZWQgYXMgdGhlIHNz ZXUgcG9pbnRlci4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfZ2d0dF9hcmdzKGludCBmZCkKK3sK KwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW1fc3NldSAqc3NldTsKKwlzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0gYXJnID0KKwkJeyAucGFyYW0gPSBJOTE1X0NPTlRF WFRfUEFSQU1fU1NFVSwKKwkJICAuY3R4X2lkID0gZ2VtX2NvbnRleHRfY3JlYXRlKGZkKSwKKwkJ ICAuc2l6ZSA9IHNpemVvZigqc3NldSksCisJCX07CisJdWludDMyX3QgYm87CisKKwlibyA9IGdl bV9jcmVhdGUoZmQsIDQwOTYpOworCWFyZy52YWx1ZSA9IHRvX3VzZXJfcG9pbnRlcihnZW1fbW1h cF9fZ3R0KGZkLCBibywgNDA5NiwKKwkJCQkJCSAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSkpOwor CisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyksIDApOwor CWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcpLCAwKTsKKwor CW11bm1hcCgodm9pZCAqKWFyZy52YWx1ZSwgNDA5Nik7CisJZ2VtX2Nsb3NlKGZkLCBibyk7CisJ Z2VtX2NvbnRleHRfZGVzdHJveShmZCwgYXJnLmN0eF9pZCk7Cit9CisKKy8qCisgKiBWZXJpZnkg dGhhdCBpbnZhbGlkIFNTRVUgdmFsdWVzIGFyZSByZWplY3RlZC4KKyAqLworc3RhdGljIHZvaWQK K3Rlc3RfaW52YWxpZF9zc2V1KGludCBmZCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRl eHRfcGFyYW1fc3NldSBkZWZhdWx0X3NzZXUgPSB7IH07CisJc3RydWN0IGRybV9pOTE1X2dlbV9j b250ZXh0X3BhcmFtX3NzZXUgc3NldSA9IHsgfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRl eHRfcGFyYW0gYXJnID0KKwkJeyAucGFyYW0gPSBJOTE1X0NPTlRFWFRfUEFSQU1fU1NFVSwKKwkJ ICAuY3R4X2lkID0gZ2VtX2NvbnRleHRfY3JlYXRlKGZkKSwKKwkJICAuc2l6ZSA9IHNpemVvZihz c2V1KSwKKwkJfTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEZldGNoIHRoZSBkZXZpY2UgZGVm YXVsdHMuICovCisJYXJnLnZhbHVlID0gdG9fdXNlcl9wb2ludGVyKCZkZWZhdWx0X3NzZXUpOwor CWdlbV9jb250ZXh0X2dldF9wYXJhbShmZCwgJmFyZyk7CisKKwlhcmcudmFsdWUgPSB0b191c2Vy X3BvaW50ZXIoJnNzZXUpOworCisJLyogVHJ5IGFsbCBzbGljZSBtYXNrcyBrbm93biB0byBiZSBp bnZhbGlkLiAqLworCXNzZXUgPSBkZWZhdWx0X3NzZXU7CisJZm9yIChpID0gMTsgaSA8PSAoOCAt IF9fc2xpY2VfY291bnRfXyk7IGkrKykgeworCQlzc2V1LnNsaWNlX21hc2sgPSBtYXNrX3BsdXMo X19zbGljZV9tYXNrX18sIGkpOworCQlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3Bh cmFtKGZkLCAmYXJnKSwgLUVJTlZBTCk7CisJfQorCisJLyogMCBzbGljZXMuICovCisJc3NldS5z bGljZV9tYXNrID0gMDsKKwlpZ3RfYXNzZXJ0X2VxKC1FSU5WQUwsIF9fZ2VtX2NvbnRleHRfc2V0 X3BhcmFtKGZkLCAmYXJnKSk7CisKKwkvKiBUcnkgYWxsIHN1YnNsaWNlIG1hc2tzIGtub3duIHRv IGJlIGludmFsaWQuICovCisJc3NldSA9IGRlZmF1bHRfc3NldTsKKwlmb3IgKGkgPSAxOyBpIDw9 ICg4IC0gX19zdWJzbGljZV9jb3VudF9fKTsgaSsrKSB7CisJCXNzZXUuc3Vic2xpY2VfbWFzayA9 IG1hc2tfcGx1cyhfX3N1YnNsaWNlX21hc2tfXywgaSk7CisJCWlndF9hc3NlcnRfZXEoX19nZW1f Y29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcpLCAtRUlOVkFMKTsKKwl9CisKKwkvKiAwIHN1YnNs aWNlcy4gKi8KKwlzc2V1LnN1YnNsaWNlX21hc2sgPSAwOworCWlndF9hc3NlcnRfZXEoX19nZW1f Y29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcpLCAtRUlOVkFMKTsKKworCS8qIFRyeSBudW1iZXIg b2YgRVVzIHN1cGVyaW9yIHRvIHRoZSBtYXggYXZhaWxhYmxlLiAqLworCXNzZXUgPSBkZWZhdWx0 X3NzZXU7CisJc3NldS5taW5fZXVzX3Blcl9zdWJzbGljZSA9IGRlZmF1bHRfc3NldS5tYXhfZXVz X3Blcl9zdWJzbGljZSArIDE7CisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJh bShmZCwgJmFyZyksIC1FSU5WQUwpOworCisJc3NldSA9IGRlZmF1bHRfc3NldTsKKwlzc2V1Lm1h eF9ldXNfcGVyX3N1YnNsaWNlID0gZGVmYXVsdF9zc2V1Lm1heF9ldXNfcGVyX3N1YnNsaWNlICsg MTsKKwlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJnKSwgLUVJ TlZBTCk7CisKKwkvKiBUcnkgdG8gcHJvZ3JhbSAwIG1heCBFVXMuICovCisJc3NldSA9IGRlZmF1 bHRfc3NldTsKKwlzc2V1Lm1heF9ldXNfcGVyX3N1YnNsaWNlID0gMDsKKwlpZ3RfYXNzZXJ0X2Vx KF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJnKSwgLUVJTlZBTCk7CisKKwkvKiBNaW4g PiBtYXggKi8KKwlzc2V1ID0gZGVmYXVsdF9zc2V1OworCXNzZXUubWluX2V1c19wZXJfc3Vic2xp Y2UgPSBzc2V1Lm1heF9ldXNfcGVyX3N1YnNsaWNlOworCXNzZXUubWF4X2V1c19wZXJfc3Vic2xp Y2UgPSAxOworCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9zZXRfcGFyYW0oZmQsICZhcmcp LCAtRUlOVkFMKTsKKworCWlmIChfX2ludGVsX2dlbl9fICE9IDExKQorCQlnb3RvIG91dDsKKwor CS8qIFN1YnNldCBvZiBzdWJzbGljZXMgYnV0IHNsaWNlIG1hc2sgZ3JlYXRlciB0aGFuIG9uZS4g Ki8KKwlpZiAoX19zbGljZV9jb3VudF9fID4gMSkgeworCQlzc2V1ID0gZGVmYXVsdF9zc2V1Owor CQlzc2V1LnN1YnNsaWNlX21hc2sgPSBtYXNrX21pbnVzX29uZShzc2V1LnN1YnNsaWNlX21hc2sp OworCQlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJnKSwgLUVJ TlZBTCk7CisJfQorCisJLyogT2RkIHN1YnNsaWNlcyBhYm92ZSBmb3VyLiAqLworCXNzZXUgPSBk ZWZhdWx0X3NzZXU7CisJc3NldS5zbGljZV9tYXNrID0gMHgxOworCXNzZXUuc3Vic2xpY2VfbWFz ayA9IG1hc2tfbWludXNfb25lKHNzZXUuc3Vic2xpY2VfbWFzayk7CisJaWd0X2Fzc2VydF9lcShf X2dlbV9jb250ZXh0X3NldF9wYXJhbShmZCwgJmFyZyksIC1FSU5WQUwpOworCisJLyogTW9yZSB0 aGFuIGhhbGYgc3Vic2xpY2VzIHdpdGggb25lIHNsaWNlLiAqLworCXNzZXUgPSBkZWZhdWx0X3Nz ZXU7CisJc3NldS5zbGljZV9tYXNrID0gMHgxOworCXNzZXUuc3Vic2xpY2VfbWFzayA9IG1hc2tf bWludXMoc3NldS5zdWJzbGljZV9tYXNrLAorCQkJCQlfX3N1YnNsaWNlX2NvdW50X18gLyAyIC0g MSk7CisJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJhbShmZCwgJmFyZyksIC1F SU5WQUwpOworCitvdXQ6CisJZ2VtX2NvbnRleHRfZGVzdHJveShmZCwgYXJnLmN0eF9pZCk7Cit9 CisKKy8qIFZlcmlmeSB0aGF0IHRoZSBrZXJuZWwgcmV0dXJucyBhIGNvcnJlY3QgZXJyb3IgdmFs dWUgb24gR2VuIDwgOC4gKi8KK3N0YXRpYyB2b2lkCitpbml0X2NvbnRleHRzKGludCBmZCwgdWlu dDMyX3QgKmN0eCwgdW5zaWduZWQgaW50IG51bSwKKwkgICAgICB1aW50NjRfdCBtYXNrMCwgdWlu dDY0X3QgbWFzazEpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZ3RfYXNzZXJ0X2VxKG51bSwg Mik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCWN0eFtpXSA9IGdlbV9jb250ZXh0 X2NyZWF0ZShmZCk7CisKKwljb250ZXh0X3NldF9zbGljZV9tYXNrKGZkLCBjdHhbMF0sIG1hc2sw KTsKKwljb250ZXh0X3NldF9zbGljZV9tYXNrKGZkLCBjdHhbMV0sIG1hc2sxKTsKK30KKworLyoK KyAqIFZlcmlmeSB0aGF0IHBvd2VyZ2F0aW5nIHNldHRpbmdzIGFyZSBwdXQgb24gaG9sZCB3aGls ZSBpOTE1L3BlcmYgaXMKKyAqIGFjdGl2ZS4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfcGVyZl9v YShpbnQgZmQpCit7CisJdWludDY0X3QgcHJvcGVydGllc1tdID0geworCQkvKiBJbmNsdWRlIE9B IHJlcG9ydHMgaW4gc2FtcGxlcyAqLworCQlEUk1fSTkxNV9QRVJGX1BST1BfU0FNUExFX09BLCB0 cnVlLAorCisJCS8qIE9BIHVuaXQgY29uZmlndXJhdGlvbiAqLworCQlEUk1fSTkxNV9QRVJGX1BS T1BfT0FfTUVUUklDU19TRVQsIDEsIC8qIHRlc3QgbWV0cmljICovCisJCURSTV9JOTE1X1BFUkZf UFJPUF9PQV9GT1JNQVQsIEk5MTVfT0FfRk9STUFUX0EzMnU0MF9BNHUzMl9COF9DOCwKKwkJRFJN X0k5MTVfUEVSRl9QUk9QX09BX0VYUE9ORU5ULCAyMCwKKwl9OworCXN0cnVjdCBkcm1faTkxNV9w ZXJmX29wZW5fcGFyYW0gcGFyYW0gPSB7CisJCS5mbGFncyA9IEk5MTVfUEVSRl9GTEFHX0ZEX0NM T0VYRUMgfAorCQlJOTE1X1BFUkZfRkxBR19GRF9OT05CTE9DSywKKwkJLm51bV9wcm9wZXJ0aWVz ID0gQVJSQVlfU0laRShwcm9wZXJ0aWVzKSAvIDIsCisJCS5wcm9wZXJ0aWVzX3B0ciA9IHRvX3Vz ZXJfcG9pbnRlcihwcm9wZXJ0aWVzKSwKKwl9OworCXVpbnQ2NF90IHBnX3NsaWNlX21hc2sgPSBt YXNrX21pbnVzX29uZShfX3NsaWNlX21hc2tfXyk7CisJdW5zaWduZWQgaW50IHNsaWNlX2NvdW50 ID0gX19zbGljZV9jb3VudF9fIC0gMTsKKwl1aW50MzJfdCBjdHhbMl07CisJdW5zaWduZWQgaW50 IGk7CisJaW50IHBlcmZfZmQ7CisKKwlpbml0X2NvbnRleHRzKGZkLCBjdHgsIEFSUkFZX1NJWkUo Y3R4KSwgX19zbGljZV9tYXNrX18sIHBnX3NsaWNlX21hc2spOworCisJLyoKKwkgKiBUZXN0IGZh bHNlIHBvc2l0aXZlcyB3aXRoIHByZWRpY2F0ZXMgKG9ubHkgYXZhaWxhYmxlIG9uCisJICogYmVm b3JlIEdlbjEwKS4KKwkgKi8KKwlpZiAoX19pbnRlbF9nZW5fXyA8IDEwKQorCQlpZ3RfYXNzZXJ0 X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFsxXSwgX19zbGljZV9jb3VudF9fKSwKKwkJCSAg ICAgIDApOworCisJaWd0X2Fzc2VydF9lcShyZWFkX3NsaWNlX2NvdW50KGZkLCBjdHhbMF0sIDAp LCBfX3NsaWNlX2NvdW50X18pOworCWlndF9hc3NlcnRfZXEocmVhZF9zbGljZV9jb3VudChmZCwg Y3R4WzFdLCAwKSwgc2xpY2VfY291bnQpOworCisJLyoKKwkgKiBOb3cgb3BlbiBpOTE1L3BlcmYg YW5kIHZlcmlmeSB0aGF0IGFsbCBjb250ZXh0cyBoYXZlIGJlZW4KKwkgKiByZWNvbmZpZ3VyZWQg dG8gdGhlIGRldmljZSdzIGRlZmF1bHQuCisJICovCisJcGVyZl9mZCA9IGlndF9pb2N0bChmZCwg RFJNX0lPQ1RMX0k5MTVfUEVSRl9PUEVOLCAmcGFyYW0pOworCWlndF9hc3NlcnRfZmQocGVyZl9m ZCk7CisKKwlpZiAoX19pbnRlbF9nZW5fXyAhPSAxMSkgeworCQlpZiAoX19pbnRlbF9nZW5fXyA8 IDEwKQorCQkJaWd0X2Fzc2VydF9lcShyZWFkX3NsaWNlX2NvdW50KGZkLCBjdHhbMV0sIHNsaWNl X2NvdW50KSwKKwkJCQkgICAgICAwKTsKKworCQlpZ3RfYXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291 bnQoZmQsIGN0eFswXSwgMCksIF9fc2xpY2VfY291bnRfXyk7CisJCWlndF9hc3NlcnRfZXEocmVh ZF9zbGljZV9jb3VudChmZCwgY3R4WzFdLCAwKSwgX19zbGljZV9jb3VudF9fKTsKKwl9IGVsc2Ug eworCQlpZ3RfYXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFswXSwgMCksIDEpOwor CQlpZ3RfYXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFsxXSwgMCksIDEpOworCQlp Z3RfYXNzZXJ0X2VxKHJlYWRfc3Vic2xpY2VfY291bnQoZmQsIGN0eFswXSksCisJCQkgICAgICBf X3N1YnNsaWNlX2NvdW50X18gLyAyKTsKKwkJaWd0X2Fzc2VydF9lcShyZWFkX3N1YnNsaWNlX2Nv dW50KGZkLCBjdHhbMV0pLAorCQkJICAgICAgX19zdWJzbGljZV9jb3VudF9fIC8gMik7CisJfQor CisJY2xvc2UocGVyZl9mZCk7CisKKwkvKgorCSAqIEFmdGVyIGNsb3NpbmcgdGhlIHBlcmYgc3Ry ZWFtLCBjb25maWd1cmF0aW9ucyBzaG91bGQgYmUKKwkgKiBiYWNrIHRvIHRoZSBwcm9ncmFtbWVk IHZhbHVlcy4KKwkgKi8KKwlpZiAoX19pbnRlbF9nZW5fXyA8IDEwKQorCQlpZ3RfYXNzZXJ0X2Vx KHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFsxXSwgX19zbGljZV9jb3VudF9fKSwgMCk7CisJaWd0 X2Fzc2VydF9lcShyZWFkX3NsaWNlX2NvdW50KGZkLCBjdHhbMF0sIDApLCBfX3NsaWNlX2NvdW50 X18pOworCWlndF9hc3NlcnRfZXEocmVhZF9zbGljZV9jb3VudChmZCwgY3R4WzFdLCAwKSwgc2xp Y2VfY291bnQpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3R4KTsgaSsrKQorCQln ZW1fY29udGV4dF9kZXN0cm95KGZkLCBjdHhbaV0pOworCisJLyoKKwkgKiBPcGVuIGk5MTUvcGVy ZiBmaXJzdCBhbmQgdmVyaWZ5IHRoYXQgYWxsIGNvbnRleHRzIGNyZWF0ZWQKKwkgKiBhZnRlcndh cmQgYXJlIGNvbmZpZ3VyZWQgdG8gdGhlIGRldmljZSdzIGRlZmF1bHQuCisJICovCisJcGVyZl9m ZCA9IGlndF9pb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfUEVSRl9PUEVOLCAmcGFyYW0pOworCWln dF9hc3NlcnRfZmQocGVyZl9mZCk7CisKKwlpbml0X2NvbnRleHRzKGZkLCBjdHgsIEFSUkFZX1NJ WkUoY3R4KSwgX19zbGljZV9tYXNrX18sIHBnX3NsaWNlX21hc2spOworCisJLyoKKwkgKiBDaGVj ayB0aGUgZGV2aWNlJ3MgZGVmYXVsdCB2YWx1ZXMsIGRlc3BpdGUgc2V0dGluZworCSAqIG90aGVy d2lzZS4KKwkgKi8KKwlpZiAoX19pbnRlbF9nZW5fXyAhPSAxMSkgeworCQlpZiAoX19pbnRlbF9n ZW5fXyA8IDEwKQorCQkJaWd0X2Fzc2VydF9lcShyZWFkX3NsaWNlX2NvdW50KGZkLCBjdHhbMV0s CisJCQkJCQkgICAgICAgc2xpY2VfY291bnQpLCAwKTsKKworCQlpZ3RfYXNzZXJ0X2VxKHJlYWRf c2xpY2VfY291bnQoZmQsIGN0eFswXSwgMCksIF9fc2xpY2VfY291bnRfXyk7CisJCWlndF9hc3Nl cnRfZXEocmVhZF9zbGljZV9jb3VudChmZCwgY3R4WzFdLCAwKSwgX19zbGljZV9jb3VudF9fKTsK Kwl9IGVsc2UgeworCQlpZ3RfYXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFswXSwg MCksIDEpOworCQlpZ3RfYXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFsxXSwgMCks IDEpOworCQlpZ3RfYXNzZXJ0X2VxKHJlYWRfc3Vic2xpY2VfY291bnQoZmQsIGN0eFswXSksCisJ CQkgICAgICBfX3N1YnNsaWNlX2NvdW50X18gLyAyKTsKKwkJaWd0X2Fzc2VydF9lcShyZWFkX3N1 YnNsaWNlX2NvdW50KGZkLCBjdHhbMV0pLAorCQkJICAgICAgX19zdWJzbGljZV9jb3VudF9fIC8g Mik7CisJfQorCisJY2xvc2UocGVyZl9mZCk7CisKKwkvKgorCSAqIEFmdGVyIGNsb3NpbmcgdGhl IHBlcmYgc3RyZWFtLCBjb25maWd1cmF0aW9ucyBzaG91bGQgYmUKKwkgKiBiYWNrIHRvIHRoZSBw cm9ncmFtbWVkIHZhbHVlcy4KKwkgKi8KKwlpZiAoX19pbnRlbF9nZW5fXyA8IDEwKQorCQlpZ3Rf YXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIGN0eFsxXSwgX19zbGljZV9jb3VudF9fKSwK KwkJCSAgICAgIDApOworCisJaWd0X2Fzc2VydF9lcShyZWFkX3NsaWNlX2NvdW50KGZkLCBjdHhb MF0sIDApLCBfX3NsaWNlX2NvdW50X18pOworCWlndF9hc3NlcnRfZXEocmVhZF9zbGljZV9jb3Vu dChmZCwgY3R4WzFdLCAwKSwgc2xpY2VfY291bnQpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZ X1NJWkUoY3R4KTsgaSsrKQorCQlnZW1fY29udGV4dF9kZXN0cm95KGZkLCBjdHhbaV0pOworfQor CitzdGF0aWMgaWd0X3NwaW5fdCAqIF9fc3Bpbl9wb2xsKGludCBmZCwgdWludDMyX3QgY3R4LCB1 bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBpZ3Rfc3Bpbl9mYWN0b3J5IG9wdHMgPSB7 CisJCS5jdHggPSBjdHgsCisJCS5lbmdpbmUgPSBmbGFncywKKwl9OworCisJaWYgKGdlbV9jYW5f c3RvcmVfZHdvcmQoZmQsIGZsYWdzKSkKKwkJb3B0cy5mbGFncyB8PSBJR1RfU1BJTl9QT0xMX1JV TjsKKworCXJldHVybiBfX2lndF9zcGluX2JhdGNoX2ZhY3RvcnkoZmQsICZvcHRzKTsKK30KKwor c3RhdGljIHVuc2lnbmVkIGxvbmcgX19zcGluX3dhaXQoaW50IGZkLCBpZ3Rfc3Bpbl90ICpzcGlu KQoreworCXN0cnVjdCB0aW1lc3BlYyBzdGFydCA9IHsgfTsKKworCWlndF9uc2VjX2VsYXBzZWQo JnN0YXJ0KTsKKworCWlmIChzcGluLT5ydW5uaW5nKSB7CisJCXVuc2lnbmVkIGxvbmcgdGltZW91 dCA9IDA7CisKKwkJd2hpbGUgKCFSRUFEX09OQ0UoKnNwaW4tPnJ1bm5pbmcpKSB7CisJCQl1bnNp Z25lZCBsb25nIHQgPSBpZ3RfbnNlY19lbGFwc2VkKCZzdGFydCk7CisKKwkJCWlmICgodCAtIHRp bWVvdXQpID4gMjUwZTYpIHsKKwkJCQl0aW1lb3V0ID0gdDsKKwkJCQlpZ3Rfd2FybigiU3Bpbm5l ciBub3QgcnVubmluZyBhZnRlciAlLjJmbXNcbiIsCisJCQkJCSAoZG91YmxlKXQgLyAxZTYpOwor CQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWd0X2RlYnVnKCJfX3NwaW5fd2FpdCAtIHVzbGVlcCBt b2RlXG4iKTsKKwkJdXNsZWVwKDUwMGUzKTsgLyogQmV0dGVyIHRoYW4gbm90aGluZyEgKi8KKwl9 CisKKwlyZXR1cm4gaWd0X25zZWNfZWxhcHNlZCgmc3RhcnQpOworfQorCitzdGF0aWMgaWd0X3Nw aW5fdCAqIF9fc3Bpbl9zeW5jKGludCBmZCwgdWludDMyX3QgY3R4LCB1bnNpZ25lZCBsb25nIGZs YWdzKQoreworCWlndF9zcGluX3QgKnNwaW4gPSBfX3NwaW5fcG9sbChmZCwgY3R4LCBmbGFncyk7 CisKKwlfX3NwaW5fd2FpdChmZCwgc3Bpbik7CisKKwlyZXR1cm4gc3BpbjsKK30KKworc3RhdGlj IHVpbnQzMl90CityZWFkX3NsaWNlX2NvdW50X2J1c3koaW50IGZkLCB1aW50MzJfdCBjb250ZXh0 LCB1aW50MzJfdCBleHBlY3RlZCwKKwkJICAgICAgaWd0X3NwaW5fdCAqc3BpbikKK3sKKwlyZXR1 cm4gX19yZWFkX3NsaWNlX2NvdW50KGZkLCBjb250ZXh0LCBleHBlY3RlZCwgc3Bpbik7Cit9CisK KyNkZWZpbmUgVEVTVF9JRExFCSgxKQorI2RlZmluZSBURVNUX0JVU1kJKDIpCisjZGVmaW5lIFRF U1RfUkVTRVQJKDQpCisjZGVmaW5lIFRFU1RfSEFORwkoOCkKKyNkZWZpbmUgVEVTVF9TVVNQRU5E CSgxNikKKworc3RhdGljIGlndF9zcGluX3QgKgorX19wcmVfc2V0KGludCBmZCwgdW5zaWduZWQg ZmxhZ3MsIHVpbnQzMl90IGN0eCkKK3sKKwlpZiAoZmxhZ3MgJiBURVNUX0JVU1kpCisJCXJldHVy biBfX3NwaW5fc3luYyhmZCwgY3R4LCBJOTE1X0VYRUNfUkVOREVSKTsKKworCXJldHVybiBOVUxM OworfQorCitzdGF0aWMgaWd0X3NwaW5fdCAqCitfX3Bvc3Rfc2V0KGludCBmZCwgdW5zaWduZWQg aW50IGZsYWdzLCB1aW50MzJfdCBjdHgsIGlndF9zcGluX3QgKnNwaW4sCisJICAgdW5zaWduZWQg aW50IGV4cGVjdGVkKQoreworCWlmIChmbGFncyAmIFRFU1RfUkVTRVQpCisJCWlndF9mb3JjZV9n cHVfcmVzZXQoZmQpOworCisJaWYgKChmbGFncyAmIFRFU1RfQlVTWSkgJiYgIShmbGFncyAmIChU RVNUX1JFU0VUIHwgVEVTVF9IQU5HKSkpCisJCWlndF9hc3NlcnRfZXEocmVhZF9zbGljZV9jb3Vu dF9idXN5KGZkLCBjdHgsIDAsIHNwaW4pLAorCQkJICAgICAgZXhwZWN0ZWQpOworCWVsc2UKKwkJ aWd0X2Fzc2VydF9lcShyZWFkX3NsaWNlX2NvdW50KGZkLCBjdHgsIDApLCBleHBlY3RlZCk7CisK KwlpZ3RfYXNzZXJ0X2VxKHJlYWRfc2xpY2VfY291bnQoZmQsIDAsIDApLCBfX3NsaWNlX2NvdW50 X18pOworCisJaWYgKHNwaW4pCisJCWlndF9zcGluX2JhdGNoX2ZyZWUoZmQsIHNwaW4pOworCisJ aWYgKGZsYWdzICYgVEVTVF9JRExFKQorCQlpZ3RfZHJvcF9jYWNoZXNfc2V0KGZkLCBEUk9QX1JF VElSRSB8IERST1BfSURMRSB8IERST1BfQUNUSVZFKTsKKworCWlmIChmbGFncyAmIFRFU1RfU1VT UEVORCkKKwkJaWd0X3N5c3RlbV9zdXNwZW5kX2F1dG9yZXN1bWUoU1VTUEVORF9TVEFURV9NRU0s CisJCQkJCSAgICAgIFNVU1BFTkRfVEVTVF9OT05FKTsKKworCWlndF9hc3NlcnRfZXEocmVhZF9z bGljZV9jb3VudChmZCwgY3R4LCAwKSwgZXhwZWN0ZWQpOworCWlndF9hc3NlcnRfZXEocmVhZF9z bGljZV9jb3VudChmZCwgMCwgMCksIF9fc2xpY2VfY291bnRfXyk7CisKKwlyZXR1cm4gTlVMTDsK K30KKworLyoKKyAqIFRlc3QgY29udGV4dCByZS1jb25maWd1cmF0aW9uIHdpdGggZWl0aGVyIGlk bGUgb3IgYnVzeSBjb250ZXh0cy4KKyAqLworc3RhdGljIHZvaWQKK3Rlc3RfZHluYW1pYyhpbnQg ZmQsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwl1aW50NjRfdCBwZ19zbGljZV9tYXNrID0gbWFz a19taW51c19vbmUoX19zbGljZV9tYXNrX18pOworCXVuc2lnbmVkIGludCBwZ19zbGljZV9jb3Vu dCA9IF9fc2xpY2VfY291bnRfXyAtIDE7CisJc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X3Bh cmFtX3NzZXUgc3NldSA9IHsgfTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0g YXJnID0KKwkJeyAucGFyYW0gPSBJOTE1X0NPTlRFWFRfUEFSQU1fU1NFVSwKKwkJICAuY3R4X2lk ID0gZ2VtX2NvbnRleHRfY3JlYXRlKGZkKSwKKwkJICAuc2l6ZSA9IHNpemVvZihzc2V1KSwKKwkJ ICAudmFsdWUgPSB0b191c2VyX3BvaW50ZXIoJnNzZXUpIH07CisJaWd0X3NwaW5fdCAqc3BpbiA9 IE5VTEw7CisKKwlpZ3RfcmVxdWlyZShfX3NsaWNlX2NvdW50X18gPiAxKTsKKworCWdlbV9jb250 ZXh0X2dldF9wYXJhbShmZCwgJmFyZyk7CisKKwkvKiBGaXJzdCBzZXQgdGhlIGRlZmF1bHQgbWFz ayAqLworCXNwaW4gPSBfX3ByZV9zZXQoZmQsIGZsYWdzLCBhcmcuY3R4X2lkKTsKKwlzc2V1LnNs aWNlX21hc2sgPSBfX3NsaWNlX21hc2tfXzsKKwlnZW1fY29udGV4dF9zZXRfcGFyYW0oZmQsICZh cmcpOworCXNwaW4gPSBfX3Bvc3Rfc2V0KGZkLCBmbGFncywgYXJnLmN0eF9pZCwgc3BpbiwgX19z bGljZV9jb3VudF9fKTsKKworCS8qIFRoZW4gc2V0IGEgcG93ZXJnYXRlZCBjb25maWd1cmF0aW9u ICovCisJc3BpbiA9IF9fcHJlX3NldChmZCwgZmxhZ3MsIGFyZy5jdHhfaWQpOworCXNzZXUuc2xp Y2VfbWFzayA9IHBnX3NsaWNlX21hc2s7CisJZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAmYXJn KTsKKwlzcGluID0gX19wb3N0X3NldChmZCwgZmxhZ3MsIGFyZy5jdHhfaWQsIHNwaW4sIHBnX3Ns aWNlX2NvdW50KTsKKworCS8qIFB1dCB0aGUgZGV2aWNlJ3MgZGVmYXVsdCBiYWNrIGFnYWluICov CisJc3BpbiA9IF9fcHJlX3NldChmZCwgZmxhZ3MsIGFyZy5jdHhfaWQpOworCXNzZXUuc2xpY2Vf bWFzayA9IF9fc2xpY2VfbWFza19fOworCWdlbV9jb250ZXh0X3NldF9wYXJhbShmZCwgJmFyZyk7 CisJc3BpbiA9IF9fcG9zdF9zZXQoZmQsIGZsYWdzLCBhcmcuY3R4X2lkLCBzcGluLCBfX3NsaWNl X2NvdW50X18pOworCisJLyogT25lIGxhc3QgcG93ZXJnYXRlZCBjb25maWcgZm9yIHRoZSByb2Fk Li4uICovCisJc3BpbiA9IF9fcHJlX3NldChmZCwgZmxhZ3MsIGFyZy5jdHhfaWQpOworCXNzZXUu c2xpY2VfbWFzayA9IHBnX3NsaWNlX21hc2s7CisJZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGZkLCAm YXJnKTsKKwlzcGluID0gX19wb3N0X3NldChmZCwgZmxhZ3MsIGFyZy5jdHhfaWQsIHNwaW4sIHBn X3NsaWNlX2NvdW50KTsKKworCWdlbV9jb250ZXh0X2Rlc3Ryb3koZmQsIGFyZy5jdHhfaWQpOwor fQorCitpZ3RfbWFpbgoreworCXVuc2lnbmVkIGludCBtYXhfc2xpY2VzID0gMywgbWF4X3N1YnNs aWNlcyA9IDM7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGZkOworCisJaWd0X2ZpeHR1cmUgewor CQlmZCA9IGRybV9vcGVuX2RyaXZlcihEUklWRVJfSU5URUwpOworCQlpZ3RfcmVxdWlyZV9nZW0o ZmQpOworCisJCV9faW50ZWxfZGV2aWRfXyA9IGludGVsX2dldF9kcm1fZGV2aWQoZmQpOworCQlf X2ludGVsX2dlbl9fID0gaW50ZWxfZ2VuKF9faW50ZWxfZGV2aWRfXyk7CisKKwkJaWd0X3JlcXVp cmUoa2VybmVsX2hhc19wZXJfY29udGV4dF9zc2V1X3N1cHBvcnQoZmQpKTsKKworCQlpZiAoX19p bnRlbF9nZW5fXyA+PSAxMSkKKwkJCV9fcmVhZF9zbGljZV9jb3VudCA9IGdlbjExX3JlYWRfc2xp Y2VfY291bnQ7CisJCWVsc2UKKwkJCV9fcmVhZF9zbGljZV9jb3VudCA9IGdlbjhfcmVhZF9zbGlj ZV9jb3VudDsKKwl9CisKKwlpZ3Rfc3VidGVzdF9ncm91cCB7CisJCWlndF9maXh0dXJlIHsKKwkJ CWRybV9pOTE1X2dldHBhcmFtX3QgZ3A7CisKKwkJCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9TTElD RV9NQVNLOworCQkJZ3AudmFsdWUgPSAoaW50ICopICZfX3NsaWNlX21hc2tfXzsKKwkJCWRvX2lv Y3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKTsKKwkJCV9fc2xpY2VfY291bnRf XyA9IF9fYnVpbHRpbl9wb3Bjb3VudChfX3NsaWNlX21hc2tfXyk7CisKKwkJCWdwLnBhcmFtID0g STkxNV9QQVJBTV9TVUJTTElDRV9NQVNLOworCQkJZ3AudmFsdWUgPSAoaW50ICopICZfX3N1YnNs aWNlX21hc2tfXzsKKwkJCWRvX2lvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdw KTsKKwkJCV9fc3Vic2xpY2VfY291bnRfXyA9CisJCQkJX19idWlsdGluX3BvcGNvdW50KF9fc3Vi c2xpY2VfbWFza19fKTsKKwkJfQorCisJCWlndF9zdWJ0ZXN0KCJpbnZhbGlkLWFyZ3MiKQorCQkJ dGVzdF9pbnZhbGlkX2FyZ3MoZmQpOworCisJCWlndF9zdWJ0ZXN0KCJpbnZhbGlkLXNzZXUiKQor CQkJdGVzdF9pbnZhbGlkX3NzZXUoZmQpOworCisJCWlndF9zdWJ0ZXN0KCJnZ3R0LWFyZ3MiKQor CQkJdGVzdF9nZ3R0X2FyZ3MoZmQpOworCisJCWlndF9zdWJ0ZXN0KCJlbmdpbmVzIikKKwkJCXRl c3RfZW5naW5lcyhmZCk7CisKKwkJZm9yIChpID0gMTsgaSA8IG1heF9zbGljZXM7IGkrKykgewor CQkJaWd0X3N1YnRlc3RfZigic2xpY2UtcGctJWkiLCBpKSB7CisJCQkJaWd0X3JlcXVpcmUoX19z bGljZV9jb3VudF9fID4gaSk7CisKKwkJCQl0ZXN0X3NsaWNlX3BnKGZkLCBpKTsKKwkJCX0KKwkJ fQorCisJCWZvciAoaSA9IDE7IGkgPCBtYXhfc3Vic2xpY2VzOyBpKyspIHsKKwkJCWlndF9zdWJ0 ZXN0X2YoInN1YnNsaWNlLXBnLSVpIiwgaSkgeworCQkJCWlndF9yZXF1aXJlKF9fc3Vic2xpY2Vf Y291bnRfXyA+PSAyKTsKKworCQkJCS8qCisJCQkJICogT25seSBhdmFpbGFibGUgb24gc29tZSBB dG9tIHBsYXRmb3JtcyBhbmQKKwkJCQkgKiBHZW4xMCsuCisJCQkJICovCisJCQkJaWd0X3JlcXVp cmUoSVNfQlJPWFRPTihfX2ludGVsX2RldmlkX18pIHx8CisJCQkJCSAgICBJU19HRU1JTklMQUtF KF9faW50ZWxfZGV2aWRfXykgfHwKKwkJCQkJICAgIF9faW50ZWxfZ2VuX18gPj0gMTApOworCisJ CQkJdGVzdF9zdWJzbGljZV9wZyhmZCwgaSk7CisJCQl9CisJCX0KKworCQlpZ3Rfc3VidGVzdCgi cGVyZi1vYSIpIHsKKwkJCWlndF9yZXF1aXJlKF9fc2xpY2VfY291bnRfXyA+IDEpOworCisJCQl0 ZXN0X3BlcmZfb2EoZmQpOworCQl9CisKKwkJaWd0X3N1YnRlc3QoImR5bmFtaWMiKQorCQkJdGVz dF9keW5hbWljKGZkLCAwKTsKKworCQlpZ3Rfc3VidGVzdCgiZHluYW1pYy1idXN5IikKKwkJCXRl c3RfZHluYW1pYyhmZCwgVEVTVF9CVVNZKTsKKworCQlpZ3Rfc3VidGVzdCgiZHluYW1pYy1yZXNl dCIpCisJCQl0ZXN0X2R5bmFtaWMoZmQsIFRFU1RfUkVTRVQpOworCisJCWlndF9zdWJ0ZXN0KCJk eW5hbWljLWJ1c3ktcmVzZXQiKQorCQkJdGVzdF9keW5hbWljKGZkLCBURVNUX0JVU1kgfCBURVNU X1JFU0VUKTsKKworCQlpZ3Rfc3VidGVzdCgiZHluYW1pYy1idXN5LWhhbmciKQorCQkJdGVzdF9k eW5hbWljKGZkLCBURVNUX0JVU1kgfCBURVNUX0hBTkcpOworCisJCWlndF9zdWJ0ZXN0KCJkeW5h bWljLWlkbGUiKQorCQkJdGVzdF9keW5hbWljKGZkLCBURVNUX0lETEUpOworCisJCWlndF9zdWJ0 ZXN0KCJkeW5hbWljLXN1c3BlbmQiKQorCQkJdGVzdF9keW5hbWljKGZkLCBURVNUX1NVU1BFTkQp OworCisJCWlndF9zdWJ0ZXN0KCJkeW5hbWljLWlkbGUtc3VzcGVuZCIpCisJCQl0ZXN0X2R5bmFt aWMoZmQsIFRFU1RfSURMRSB8IFRFU1RfU1VTUEVORCk7CisJfQorCisJaWd0X2ZpeHR1cmUgewor CQljbG9zZShmZCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzb24uYnVpbGQgYi90ZXN0 cy9tZXNvbi5idWlsZAppbmRleCAxN2RlYjk0NWVjOTUuLjkzMTlmYTRlMTliNCAxMDA2NDQKLS0t IGEvdGVzdHMvbWVzb24uYnVpbGQKKysrIGIvdGVzdHMvbWVzb24uYnVpbGQKQEAgLTI0OSw2ICsy NDksMTMgQEAgZm9yZWFjaCBwcm9nIDogdGVzdF9wcm9ncwogCQkgICBpbnN0YWxsIDogdHJ1ZSkK IGVuZGZvcmVhY2gKIAordGVzdF9leGVjdXRhYmxlcyArPSBleGVjdXRhYmxlKCdnZW1fY3R4X3Nz ZXUnLCAnZ2VtX2N0eF9zc2V1LmMnLAorCSAgIGRlcGVuZGVuY2llcyA6IHRlc3RfZGVwcyArIFsg bGliX2lndF9wZXJmIF0sCisJICAgaW5zdGFsbF9kaXIgOiBsaWJleGVjZGlyLAorCSAgIGluc3Rh bGxfcnBhdGggOiBsaWJleGVjZGlyX3JwYXRoZGlyLAorCSAgIGluc3RhbGwgOiB0cnVlKQordGVz dF9wcm9ncyArPSAnZ2VtX2N0eF9zc2V1JworCiB0ZXN0X2V4ZWN1dGFibGVzICs9IGV4ZWN1dGFi bGUoJ2dlbV9laW8nLCAnZ2VtX2Vpby5jJywKIAkgICBkZXBlbmRlbmNpZXMgOiB0ZXN0X2RlcHMg KyBbIHJlYWx0aW1lIF0sCiAJICAgaW5zdGFsbF9kaXIgOiBsaWJleGVjZGlyLAotLSAKMi4xNy4x CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1n ZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK