From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH 24/39] drm/i915: Move mmap and friends to its own file Date: Wed, 13 Mar 2019 14:43:46 +0000 Message-ID: <20190313144401.17735-24-chris@chris-wilson.co.uk> References: <20190313144401.17735-1-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from fireflyinternet.com (mail.fireflyinternet.com [109.228.58.192]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6AF4F6E0D8 for ; Wed, 13 Mar 2019 14:45:06 +0000 (UTC) In-Reply-To: <20190313144401.17735-1-chris@chris-wilson.co.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org Cc: Matthew Auld List-Id: intel-gfx@lists.freedesktop.org Q29udGludWluZyB0aGUgZGVjbHV0dGVyaW5nIG9mIGk5MTVfZ2VtLmMsIG5vdyB0aGUgdHVybiBv ZiBkb19tbWFwIGFuZAp0aGUgZmF1bHRoYW5kbGVycwoKU2lnbmVkLW9mZi1ieTogQ2hyaXMgV2ls c29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+ClJldmlld2VkLWJ5OiBNYXR0aGV3IEF1bGQg PG1hdHRoZXcuYXVsZEBpbnRlbC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZp bGUgICAgICAgICAgICAgICAgIHwgICAxICsKIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1 X2dlbV9tbWFuLmMgICAgICB8IDUxNCArKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0v aTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMgICAgfCAgNTYgKysKIGRyaXZlcnMvZ3B1L2RybS9p OTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuaCAgICB8ICAgNyArCiAuLi4vZHJtL2k5MTUvZ2VtL3Nl bGZ0ZXN0cy9pOTE1X2dlbV9tbWFuLmMgICAgfCA1MDcgKysrKysrKysrKysrKysrKwogZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCAgICAgICAgICAgICAgIHwgICAxIC0KIGRyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgICAgICAgICAgICAgICB8IDU3MCArLS0tLS0tLS0tLS0t LS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jICAgICAgICB8ICAg MiArLQogLi4uL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9nZW1fb2JqZWN0LmMgIHwgNDg5 IC0tLS0tLS0tLS0tLS0tLQogLi4uL2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRl c3RzLmggIHwgICAxICsKIDEwIGZpbGVzIGNoYW5nZWQsIDExMDEgaW5zZXJ0aW9ucygrKSwgMTA0 NyBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9n ZW0vaTkxNV9nZW1fbW1hbi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5 MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1X2dlbV9tbWFuLmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCmluZGV4 IDhlNmVmNTRmMjQ5Ny4uYzI4MDRlZmU0ZTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQpAQCAtNzIs NiArNzIsNyBAQCBpOTE1LSQoQ09ORklHX0RSTV9JOTE1X1dFUlJPUikgKz0gXAogIyBHRU0gY29k ZQogaTkxNS15ICs9IFwKIAkgIGdlbS9pOTE1X2dlbV9vYmplY3QubyBcCisJICBnZW0vaTkxNV9n ZW1fbW1hbi5vIFwKIAkgIGdlbS9pOTE1X2dlbV9wYWdlcy5vIFwKIAkgIGdlbS9pOTE1X2dlbV9w aHlzLm8gXAogCSAgZ2VtL2k5MTVfZ2VtX3NobWVtLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX21tYW4uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dl bS9pOTE1X2dlbV9tbWFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw Li45MmEyYjljZDg3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9n ZW0vaTkxNV9nZW1fbW1hbi5jCkBAIC0wLDAgKzEsNTE0IEBACisvKgorICogU1BEWC1MaWNlbnNl LUlkZW50aWZpZXI6IE1JVAorICoKKyAqIENvcHlyaWdodCDCqSAyMDE0LTIwMTYgSW50ZWwgQ29y cG9yYXRpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4 L3NpemVzLmg+CisKKyNpbmNsdWRlICJpOTE1X2dlbV9pb2N0bHMuaCIKKyNpbmNsdWRlICJpOTE1 X2dlbV9vYmplY3QuaCIKKworI2luY2x1ZGUgIi4uL2k5MTVfZ2VtX2d0dC5oIgorI2luY2x1ZGUg Ii4uL2k5MTVfdm1hLmgiCisjaW5jbHVkZSAiLi4vaTkxNV9kcnYuaCIKKyNpbmNsdWRlICIuLi9p bnRlbF9kcnYuaCIKKworc3RhdGljIGlubGluZSBib29sCitfX3ZtYV9tYXRjaGVzKHN0cnVjdCB2 bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkgICAgICB1bnNpZ25lZCBs b25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAodm1hLT52bV9maWxlICE9IGZp bHApCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB2bWEtPnZtX3N0YXJ0ID09IGFkZHIgJiYK KwkgICAgICAgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPT0gUEFHRV9BTElHTihzaXpl KTsKK30KKworLyoqCisgKiBpOTE1X2dlbV9tbWFwX2lvY3RsIC0gTWFwcyB0aGUgY29udGVudHMg b2YgYW4gb2JqZWN0LCByZXR1cm5pbmcgdGhlIGFkZHJlc3MKKyAqCQkJIGl0IGlzIG1hcHBlZCB0 by4KKyAqIEBkZXY6IGRybSBkZXZpY2UKKyAqIEBkYXRhOiBpb2N0bCBkYXRhIGJsb2IKKyAqIEBm aWxlOiBkcm0gZmlsZQorICoKKyAqIFdoaWxlIHRoZSBtYXBwaW5nIGhvbGRzIGEgcmVmZXJlbmNl IG9uIHRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0LCBpdCBkb2Vzbid0CisgKiBpbXBseSBhIHJl ZiBvbiB0aGUgb2JqZWN0IGl0c2VsZi4KKyAqCisgKiBJTVBPUlRBTlQ6CisgKgorICogRFJNIGRy aXZlciB3cml0ZXJzIHdobyBsb29rIGEgdGhpcyBmdW5jdGlvbiBhcyBhbiBleGFtcGxlIGZvciBo b3cgdG8gZG8gR0VNCisgKiBtbWFwIHN1cHBvcnQsIHBsZWFzZSBkb24ndCBpbXBsZW1lbnQgbW1h cCBzdXBwb3J0IGxpa2UgaGVyZS4gVGhlIG1vZGVybiB3YXkKKyAqIHRvIGltcGxlbWVudCBEUk0g bW1hcCBzdXBwb3J0IGlzIHdpdGggYW4gbW1hcCBvZmZzZXQgaW9jdGwgKGxpa2UKKyAqIGk5MTVf Z2VtX21tYXBfZ3R0KSBhbmQgdGhlbiB1c2luZyB0aGUgbW1hcCBzeXNjYWxsIG9uIHRoZSBEUk0g ZmQgZGlyZWN0bHkuCisgKiBUaGF0IHdheSBkZWJ1ZyB0b29saW5nIGxpa2UgdmFsZ3JpbmQgd2ls bCB1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbiwgaGlkaW5nCisgKiB0aGUgbW1hcCBjYWxsIGlu IGEgZHJpdmVyIHByaXZhdGUgaW9jdGwgd2lsbCBicmVhayB0aGF0LiBUaGUgaTkxNSBkcml2ZXIg b25seQorICogZG9lcyBjcHUgbW1hcHMgdGhpcyB3YXkgYmVjYXVzZSB3ZSBkaWRuJ3Qga25vdyBi ZXR0ZXIuCisgKi8KK2ludAoraTkxNV9nZW1fbW1hcF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2LCB2b2lkICpkYXRhLAorCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlKQoreworCXN0cnVj dCBkcm1faTkxNV9nZW1fbW1hcCAqYXJncyA9IGRhdGE7CisJc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKm9iajsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAoYXJncy0+ZmxhZ3MgJiB+ KEk5MTVfTU1BUF9XQykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFyZ3MtPmZsYWdzICYg STkxNV9NTUFQX1dDICYmICFib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfUEFUKSkKKwkJcmV0dXJu IC1FTk9ERVY7CisKKwlvYmogPSBpOTE1X2dlbV9vYmplY3RfbG9va3VwKGZpbGUsIGFyZ3MtPmhh bmRsZSk7CisJaWYgKCFvYmopCisJCXJldHVybiAtRU5PRU5UOworCisJLyogcHJpbWUgb2JqZWN0 cyBoYXZlIG5vIGJhY2tpbmcgZmlscCB0byBHRU0gbW1hcAorCSAqIHBhZ2VzIGZyb20uCisJICov CisJaWYgKCFvYmotPmJhc2UuZmlscCkgeworCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJ CXJldHVybiAtRU5YSU87CisJfQorCisJYWRkciA9IHZtX21tYXAob2JqLT5iYXNlLmZpbHAsIDAs IGFyZ3MtPnNpemUsCisJCSAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVE LAorCQkgICAgICAgYXJncy0+b2Zmc2V0KTsKKwlpZiAoSVNfRVJSX1ZBTFVFKGFkZHIpKQorCQln b3RvIGVycjsKKworCWlmIChhcmdzLT5mbGFncyAmIEk5MTVfTU1BUF9XQykgeworCQlzdHJ1Y3Qg bW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZt YTsKKworCQlpZiAoZG93bl93cml0ZV9raWxsYWJsZSgmbW0tPm1tYXBfc2VtKSkgeworCQkJaTkx NV9nZW1fb2JqZWN0X3B1dChvYmopOworCQkJcmV0dXJuIC1FSU5UUjsKKwkJfQorCQl2bWEgPSBm aW5kX3ZtYShtbSwgYWRkcik7CisJCWlmICh2bWEgJiYgX192bWFfbWF0Y2hlcyh2bWEsIG9iai0+ YmFzZS5maWxwLCBhZGRyLCBhcmdzLT5zaXplKSkKKwkJCXZtYS0+dm1fcGFnZV9wcm90ID0KKwkJ CQlwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtX2dldF9wYWdlX3Byb3Qodm1hLT52bV9mbGFncykpOwor CQllbHNlCisJCQlhZGRyID0gLUVOT01FTTsKKwkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJ CWlmIChJU19FUlJfVkFMVUUoYWRkcikpCisJCQlnb3RvIGVycjsKKworCQkvKiBUaGlzIG1heSBy YWNlLCBidXQgdGhhdCdzIG9rLCBpdCBvbmx5IGdldHMgc2V0ICovCisJCVdSSVRFX09OQ0Uob2Jq LT5mcm9udGJ1ZmZlcl9nZ3R0X29yaWdpbiwgT1JJR0lOX0NQVSk7CisJfQorCWk5MTVfZ2VtX29i amVjdF9wdXQob2JqKTsKKworCWFyZ3MtPmFkZHJfcHRyID0gKHU2NClhZGRyOworCisJcmV0dXJu IDA7CisKK2VycjoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwlyZXR1cm4gYWRkcjsK K30KKworc3RhdGljIHVuc2lnbmVkIGludCB0aWxlX3Jvd19wYWdlcyhjb25zdCBzdHJ1Y3QgZHJt X2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXJldHVybiBpOTE1X2dlbV9vYmplY3RfZ2V0X3Rp bGVfcm93X3NpemUob2JqKSA+PiBQQUdFX1NISUZUOworfQorCisvKioKKyAqIGk5MTVfZ2VtX21t YXBfZ3R0X3ZlcnNpb24gLSByZXBvcnQgdGhlIGN1cnJlbnQgZmVhdHVyZSBzZXQgZm9yIEdUVCBt bWFwcworICoKKyAqIEEgaGlzdG9yeSBvZiB0aGUgR1RUIG1tYXAgaW50ZXJmYWNlOgorICoKKyAq IDAgLSBFdmVyeXRoaW5nIGhhZCB0byBmaXQgaW50byB0aGUgR1RULiBCb3RoIHBhcnRpZXMgb2Yg YSBtZW1jcHkgaGFkIHRvCisgKiAgICAgYWxpZ25lZCBhbmQgc3VpdGFibGUgZm9yIGZlbmNpbmcs IGFuZCBzdGlsbCBmaXQgaW50byB0aGUgYXZhaWxhYmxlCisgKiAgICAgbWFwcGFibGUgc3BhY2Ug bGVmdCBieSB0aGUgcGlubmVkIGRpc3BsYXkgb2JqZWN0cy4gQSBjbGFzc2ljIHByb2JsZW0KKyAq ICAgICB3ZSBjYWxsZWQgdGhlIHBhZ2UtZmF1bHQtb2YtZG9vbSB3aGVyZSB3ZSB3b3VsZCBwaW5n LXBvbmcgYmV0d2VlbgorICogICAgIHR3byBvYmplY3RzIHRoYXQgY291bGQgbm90IGZpdCBpbnNp ZGUgdGhlIEdUVCBhbmQgc28gdGhlIG1lbWNweQorICogICAgIHdvdWxkIHBhZ2Ugb25lIG9iamVj dCBpbiBhdCB0aGUgZXhwZW5zZSBvZiB0aGUgb3RoZXIgYmV0d2VlbiBldmVyeQorICogICAgIHNp bmdsZSBieXRlLgorICoKKyAqIDEgLSBPYmplY3RzIGNhbiBiZSBhbnkgc2l6ZSwgYW5kIGhhdmUg YW55IGNvbXBhdGlibGUgZmVuY2luZyAoWCBZLCBvciBub25lCisgKiAgICAgYXMgc2V0IHZpYSBp OTE1X2dlbV9zZXRfdGlsaW5nKCkgW0RSTV9JOTE1X0dFTV9TRVRfVElMSU5HXSkuIElmIHRoZQor ICogICAgIG9iamVjdCBpcyB0b28gbGFyZ2UgZm9yIHRoZSBhdmFpbGFibGUgc3BhY2UgKG9yIHNp bXBseSB0b28gbGFyZ2UKKyAqICAgICBmb3IgdGhlIG1hcHBhYmxlIGFwZXJ0dXJlISksIGEgdmll dyBpcyBjcmVhdGVkIGluc3RlYWQgYW5kIGZhdWx0ZWQKKyAqICAgICBpbnRvIHVzZXJzcGFjZS4g KFRoaXMgdmlldyBpcyBhbGlnbmVkIGFuZCBzaXplZCBhcHByb3ByaWF0ZWx5IGZvcgorICogICAg IGZlbmNlZCBhY2Nlc3MuKQorICoKKyAqIDIgLSBSZWNvZ25pc2UgV0MgYXMgYSBzZXBhcmF0ZSBj YWNoZSBkb21haW4gc28gdGhhdCB3ZSBjYW4gZmx1c2ggdGhlCisgKiAgICAgZGVsYXllZCB3cml0 ZXMgdmlhIEdUVCBiZWZvcmUgcGVyZm9ybWluZyBkaXJlY3QgYWNjZXNzIHZpYSBXQy4KKyAqCisg KiBSZXN0cmljdGlvbnM6CisgKgorICogICogc25vb3BhYmxlIG9iamVjdHMgY2Fubm90IGJlIGFj Y2Vzc2VkIHZpYSB0aGUgR1RULiBJdCBjYW4gY2F1c2UgbWFjaGluZQorICogICAgaGFuZ3Mgb24g c29tZSBhcmNoaXRlY3R1cmVzLCBjb3JydXB0aW9uIG9uIG90aGVycy4gQW4gYXR0ZW1wdCB0byBz ZXJ2aWNlCisgKiAgICBhIEdUVCBwYWdlIGZhdWx0IGZyb20gYSBzbm9vcGFibGUgb2JqZWN0IHdp bGwgZ2VuZXJhdGUgYSBTSUdCVVMuCisgKgorICogICogdGhlIG9iamVjdCBtdXN0IGJlIGFibGUg dG8gZml0IGludG8gUkFNIChwaHlzaWNhbCBtZW1vcnksIHRob3VnaCBubworICogICAgbGltaXRl ZCB0byB0aGUgbWFwcGFibGUgYXBlcnR1cmUpLgorICoKKyAqCisgKiBDYXZlYXRzOgorICoKKyAq ICAqIGEgbmV3IEdUVCBwYWdlIGZhdWx0IHdpbGwgc3luY2hyb25pemUgcmVuZGVyaW5nIGZyb20g dGhlIEdQVSBhbmQgZmx1c2gKKyAqICAgIGFsbCBkYXRhIHRvIHN5c3RlbSBtZW1vcnkuIFN1YnNl cXVlbnQgYWNjZXNzIHdpbGwgbm90IGJlIHN5bmNocm9uaXplZC4KKyAqCisgKiAgKiBhbGwgbWFw cGluZ3MgYXJlIHJldm9rZWQgb24gcnVudGltZSBkZXZpY2Ugc3VzcGVuZC4KKyAqCisgKiAgKiB0 aGVyZSBhcmUgb25seSA4LCAxNiBvciAzMiBmZW5jZSByZWdpc3RlcnMgdG8gc2hhcmUgYmV0d2Vl biBhbGwgdXNlcnMKKyAqICAgIChvbGRlciBtYWNoaW5lcyByZXF1aXJlIGZlbmNlIHJlZ2lzdGVy IGZvciBkaXNwbGF5IGFuZCBibGl0dGVyIGFjY2VzcworICogICAgYXMgd2VsbCkuIENvbnRlbnRp b24gb2YgdGhlIGZlbmNlIHJlZ2lzdGVycyB3aWxsIGNhdXNlIHRoZSBwcmV2aW91cyB1c2Vycwor ICogICAgdG8gYmUgdW5tYXBwZWQgYW5kIGFueSBuZXcgYWNjZXNzIHdpbGwgZ2VuZXJhdGUgbmV3 IHBhZ2UgZmF1bHRzLgorICoKKyAqICAqIHJ1bm5pbmcgb3V0IG9mIG1lbW9yeSB3aGlsZSBzZXJ2 aWNpbmcgYSBmYXVsdCBtYXkgZ2VuZXJhdGUgYSBTSUdCVVMsCisgKiAgICByYXRoZXIgdGhhbiB0 aGUgZXhwZWN0ZWQgU0lHU0VHVi4KKyAqLworaW50IGk5MTVfZ2VtX21tYXBfZ3R0X3ZlcnNpb24o dm9pZCkKK3sKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaTkxNV9nZ3R0 X3ZpZXcKK2NvbXB1dGVfcGFydGlhbF92aWV3KGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2Jq ZWN0ICpvYmosCisJCSAgICAgcGdvZmZfdCBwYWdlX29mZnNldCwKKwkJICAgICB1bnNpZ25lZCBp bnQgY2h1bmspCit7CisJc3RydWN0IGk5MTVfZ2d0dF92aWV3IHZpZXc7CisKKwlpZiAoaTkxNV9n ZW1fb2JqZWN0X2lzX3RpbGVkKG9iaikpCisJCWNodW5rID0gcm91bmR1cChjaHVuaywgdGlsZV9y b3dfcGFnZXMob2JqKSk7CisKKwl2aWV3LnR5cGUgPSBJOTE1X0dHVFRfVklFV19QQVJUSUFMOwor CXZpZXcucGFydGlhbC5vZmZzZXQgPSByb3VuZGRvd24ocGFnZV9vZmZzZXQsIGNodW5rKTsKKwl2 aWV3LnBhcnRpYWwuc2l6ZSA9CisJCW1pbl90KHVuc2lnbmVkIGludCwgY2h1bmssCisJCSAgICAg IChvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZUKSAtIHZpZXcucGFydGlhbC5vZmZzZXQpOwor CisJLyogSWYgdGhlIHBhcnRpYWwgY292ZXJzIHRoZSBlbnRpcmUgb2JqZWN0LCBqdXN0IGNyZWF0 ZSBhIG5vcm1hbCBWTUEuICovCisJaWYgKGNodW5rID49IG9iai0+YmFzZS5zaXplID4+IFBBR0Vf U0hJRlQpCisJCXZpZXcudHlwZSA9IEk5MTVfR0dUVF9WSUVXX05PUk1BTDsKKworCXJldHVybiB2 aWV3OworfQorCisvKioKKyAqIGk5MTVfZ2VtX2ZhdWx0IC0gZmF1bHQgYSBwYWdlIGludG8gdGhl IEdUVAorICogQHZtZjogZmF1bHQgaW5mbworICoKKyAqIFRoZSBmYXVsdCBoYW5kbGVyIGlzIHNl dCB1cCBieSBkcm1fZ2VtX21tYXAoKSB3aGVuIGEgb2JqZWN0IGlzIEdUVCBtYXBwZWQKKyAqIGZy b20gdXNlcnNwYWNlLiAgVGhlIGZhdWx0IGhhbmRsZXIgdGFrZXMgY2FyZSBvZiBiaW5kaW5nIHRo ZSBvYmplY3QgdG8KKyAqIHRoZSBHVFQgKGlmIG5lZWRlZCksIGFsbG9jYXRpbmcgYW5kIHByb2dy YW1taW5nIGEgZmVuY2UgcmVnaXN0ZXIgKGFnYWluLAorICogb25seSBpZiBuZWVkZWQgYmFzZWQg b24gd2hldGhlciB0aGUgb2xkIHJlZyBpcyBzdGlsbCB2YWxpZCBvciB0aGUgb2JqZWN0CisgKiBp cyB0aWxlZCkgYW5kIGluc2VydGluZyBhIG5ldyBQVEUgaW50byB0aGUgZmF1bHRpbmcgcHJvY2Vz cy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGZhdWx0aW5nIHByb2Nlc3MgbWF5IGludm9sdmUgZXZp Y3RpbmcgZXhpc3Rpbmcgb2JqZWN0cworICogZnJvbSB0aGUgR1RUIGFuZC9vciBmZW5jZSByZWdp c3RlcnMgdG8gbWFrZSByb29tLiAgU28gcGVyZm9ybWFuY2UgbWF5CisgKiBzdWZmZXIgaWYgdGhl IEdUVCB3b3JraW5nIHNldCBpcyBsYXJnZSBvciB0aGVyZSBhcmUgZmV3IGZlbmNlIHJlZ2lzdGVy cworICogbGVmdC4KKyAqCisgKiBUaGUgY3VycmVudCBmZWF0dXJlIHNldCBzdXBwb3J0ZWQgYnkg aTkxNV9nZW1fZmF1bHQoKSBhbmQgdGh1cyBHVFQgbW1hcHMKKyAqIGlzIGV4cG9zZWQgdmlhIEk5 MTVfUEFSQU1fTU1BUF9HVFRfVkVSU0lPTiAoc2VlIGk5MTVfZ2VtX21tYXBfZ3R0X3ZlcnNpb24p LgorICovCit2bV9mYXVsdF90IGk5MTVfZ2VtX2ZhdWx0KHN0cnVjdCB2bV9mYXVsdCAqdm1mKQor eworI2RlZmluZSBNSU5fQ0hVTktfUEFHRVMgKFNaXzFNID4+IFBBR0VfU0hJRlQpCisJc3RydWN0 IHZtX2FyZWFfc3RydWN0ICphcmVhID0gdm1mLT52bWE7CisJc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKm9iaiA9IHRvX2ludGVsX2JvKGFyZWEtPnZtX3ByaXZhdGVfZGF0YSk7CisJc3RydWN0 IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmk5MTUgPSB0b19pOTE1KGRldik7CisJc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9ICZpOTE1 LT5nZ3R0OworCWJvb2wgd3JpdGUgPSBhcmVhLT52bV9mbGFncyAmIFZNX1dSSVRFOworCWludGVs X3dha2VyZWZfdCB3YWtlcmVmOworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCXBnb2ZmX3QgcGFn ZV9vZmZzZXQ7CisJaW50IHNyY3U7CisJaW50IHJldDsKKworCS8qIFNhbml0eSBjaGVjayB0aGF0 IHdlIGFsbG93IHdyaXRpbmcgaW50byB0aGlzIG9iamVjdCAqLworCWlmIChpOTE1X2dlbV9vYmpl Y3RfaXNfcmVhZG9ubHkob2JqKSAmJiB3cml0ZSkKKwkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsK KworCS8qIFdlIGRvbid0IHVzZSB2bWYtPnBnb2ZmIHNpbmNlIHRoYXQgaGFzIHRoZSBmYWtlIG9m ZnNldCAqLworCXBhZ2Vfb2Zmc2V0ID0gKHZtZi0+YWRkcmVzcyAtIGFyZWEtPnZtX3N0YXJ0KSA+ PiBQQUdFX1NISUZUOworCisJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2ZhdWx0KG9iaiwgcGFnZV9v ZmZzZXQsIHRydWUsIHdyaXRlKTsKKworCS8qIFRyeSB0byBmbHVzaCB0aGUgb2JqZWN0IG9mZiB0 aGUgR1BVIGZpcnN0IHdpdGhvdXQgaG9sZGluZyB0aGUgbG9jay4KKwkgKiBVcG9uIGFjcXVpcmlu ZyB0aGUgbG9jaywgd2Ugd2lsbCBwZXJmb3JtIG91ciBzYW5pdHkgY2hlY2tzIGFuZCB0aGVuCisJ ICogcmVwZWF0IHRoZSBmbHVzaCBob2xkaW5nIHRoZSBsb2NrIGluIHRoZSBub3JtYWwgbWFubmVy IHRvIGNhdGNoIGNhc2VzCisJICogd2hlcmUgd2UgYXJlIGdhenVtcGVkLgorCSAqLworCXJldCA9 IGk5MTVfZ2VtX29iamVjdF93YWl0KG9iaiwKKwkJCQkgICBJOTE1X1dBSVRfSU5URVJSVVBUSUJM RSwKKwkJCQkgICBNQVhfU0NIRURVTEVfVElNRU9VVCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7 CisKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7CisJaWYgKHJldCkKKwkJ Z290byBlcnI7CisKKwl3YWtlcmVmID0gaW50ZWxfcnVudGltZV9wbV9nZXQoaTkxNSk7CisKKwlz cmN1ID0gaTkxNV9yZXNldF90cnlsb2NrKGk5MTUpOworCWlmIChzcmN1IDwgMCkgeworCQlyZXQg PSBzcmN1OworCQlnb3RvIGVycl9ycG07CisJfQorCisJcmV0ID0gaTkxNV9tdXRleF9sb2NrX2lu dGVycnVwdGlibGUoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXNldDsKKworCS8qIEFj Y2VzcyB0byBzbm9vcGFibGUgcGFnZXMgdGhyb3VnaCB0aGUgR1RUIGlzIGluY29oZXJlbnQuICov CisJaWYgKG9iai0+Y2FjaGVfbGV2ZWwgIT0gSTkxNV9DQUNIRV9OT05FICYmICFIQVNfTExDKGk5 MTUpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX3VubG9jazsKKwl9CisKKwkvKiBO b3cgcGluIGl0IGludG8gdGhlIEdUVCBhcyBuZWVkZWQgKi8KKwl2bWEgPSBpOTE1X2dlbV9vYmpl Y3RfZ2d0dF9waW4ob2JqLCBOVUxMLCAwLCAwLAorCQkJCSAgICAgICBQSU5fTUFQUEFCTEUgfAor CQkJCSAgICAgICBQSU5fTk9OQkxPQ0sgfAorCQkJCSAgICAgICBQSU5fTk9ORkFVTFQpOworCWlm IChJU19FUlIodm1hKSkgeworCQkvKiBVc2UgYSBwYXJ0aWFsIHZpZXcgaWYgaXQgaXMgYmlnZ2Vy IHRoYW4gYXZhaWxhYmxlIHNwYWNlICovCisJCXN0cnVjdCBpOTE1X2dndHRfdmlldyB2aWV3ID0K KwkJCWNvbXB1dGVfcGFydGlhbF92aWV3KG9iaiwgcGFnZV9vZmZzZXQsIE1JTl9DSFVOS19QQUdF Uyk7CisJCXVuc2lnbmVkIGludCBmbGFnczsKKworCQlmbGFncyA9IFBJTl9NQVBQQUJMRTsKKwkJ aWYgKHZpZXcudHlwZSA9PSBJOTE1X0dHVFRfVklFV19OT1JNQUwpCisJCQlmbGFncyB8PSBQSU5f Tk9OQkxPQ0s7IC8qIGF2b2lkIHdhcm5pbmdzIGZvciBwaW5uZWQgKi8KKworCQkvKgorCQkgKiBV c2Vyc3BhY2UgaXMgbm93IHdyaXRpbmcgdGhyb3VnaCBhbiB1bnRyYWNrZWQgVk1BLCBhYmFuZG9u CisJCSAqIGFsbCBob3BlIHRoYXQgdGhlIGhhcmR3YXJlIGlzIGFibGUgdG8gdHJhY2sgZnV0dXJl IHdyaXRlcy4KKwkJICovCisJCW9iai0+ZnJvbnRidWZmZXJfZ2d0dF9vcmlnaW4gPSBPUklHSU5f Q1BVOworCisJCXZtYSA9IGk5MTVfZ2VtX29iamVjdF9nZ3R0X3BpbihvYmosICZ2aWV3LCAwLCAw LCBmbGFncyk7CisJCWlmIChJU19FUlIodm1hKSAmJiAhdmlldy50eXBlKSB7CisJCQlmbGFncyA9 IFBJTl9NQVBQQUJMRTsKKwkJCXZpZXcudHlwZSA9IEk5MTVfR0dUVF9WSUVXX1BBUlRJQUw7CisJ CQl2bWEgPSBpOTE1X2dlbV9vYmplY3RfZ2d0dF9waW4ob2JqLCAmdmlldywgMCwgMCwgZmxhZ3Mp OworCQl9CisJfQorCWlmIChJU19FUlIodm1hKSkgeworCQlyZXQgPSBQVFJfRVJSKHZtYSk7CisJ CWdvdG8gZXJyX3VubG9jazsKKwl9CisKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0 dF9kb21haW4ob2JqLCB3cml0ZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdW5waW47CisKKwly ZXQgPSBpOTE1X3ZtYV9waW5fZmVuY2Uodm1hKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bnBp bjsKKworCS8qIEZpbmFsbHksIHJlbWFwIGl0IHVzaW5nIHRoZSBuZXcgR1RUIG9mZnNldCAqLwor CXJldCA9IHJlbWFwX2lvX21hcHBpbmcoYXJlYSwKKwkJCSAgICAgICBhcmVhLT52bV9zdGFydCAr ICh2bWEtPmdndHRfdmlldy5wYXJ0aWFsLm9mZnNldCA8PCBQQUdFX1NISUZUKSwKKwkJCSAgICAg ICAoZ2d0dC0+Z21hZHIuc3RhcnQgKyB2bWEtPm5vZGUuc3RhcnQpID4+IFBBR0VfU0hJRlQsCisJ CQkgICAgICAgbWluX3QodTY0LCB2bWEtPnNpemUsIGFyZWEtPnZtX2VuZCAtIGFyZWEtPnZtX3N0 YXJ0KSwKKwkJCSAgICAgICAmZ2d0dC0+aW9tYXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Zl bmNlOworCisJLyogTWFyayBhcyBiZWluZyBtbWFwcGVkIGludG8gdXNlcnNwYWNlIGZvciBsYXRl ciByZXZvY2F0aW9uICovCisJYXNzZXJ0X3JwbV93YWtlbG9ja19oZWxkKGk5MTUpOworCWlmICgh aTkxNV92bWFfc2V0X3VzZXJmYXVsdCh2bWEpICYmICFvYmotPnVzZXJmYXVsdF9jb3VudCsrKQor CQlsaXN0X2FkZCgmb2JqLT51c2VyZmF1bHRfbGluaywgJmk5MTUtPm1tLnVzZXJmYXVsdF9saXN0 KTsKKwlHRU1fQlVHX09OKCFvYmotPnVzZXJmYXVsdF9jb3VudCk7CisKKwlpOTE1X3ZtYV9zZXRf Z2d0dF93cml0ZSh2bWEpOworCitlcnJfZmVuY2U6CisJaTkxNV92bWFfdW5waW5fZmVuY2Uodm1h KTsKK2Vycl91bnBpbjoKKwlfX2k5MTVfdm1hX3VucGluKHZtYSk7CitlcnJfdW5sb2NrOgorCW11 dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworZXJyX3Jlc2V0OgorCWk5MTVfcmVzZXRf dW5sb2NrKGk5MTUsIHNyY3UpOworZXJyX3JwbToKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChpOTE1 LCB3YWtlcmVmKTsKKwlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKK2VycjoKKwlz d2l0Y2ggKHJldCkgeworCWNhc2UgLUVJTzoKKwkJLyoKKwkJICogV2UgZWF0IGVycm9ycyB3aGVu IHRoZSBncHUgaXMgdGVybWluYWxseSB3ZWRnZWQgdG8gYXZvaWQKKwkJICogdXNlcnNwYWNlIHVu ZHVseSBjcmFzaGluZyAoZ2wgaGFzIG5vIHByb3Zpc2lvbnMgZm9yIG1tYXBzIHRvCisJCSAqIGZh aWwpLiBCdXQgYW55IG90aGVyIC1FSU8gaXNuJ3Qgb3VycyAoZS5nLiBzd2FwIGluIGZhaWx1cmUp CisJCSAqIGFuZCBzbyBuZWVkcyB0byBiZSByZXBvcnRlZC4KKwkJICovCisJCWlmICghaTkxNV90 ZXJtaW5hbGx5X3dlZGdlZChpOTE1KSkKKwkJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CisJCS8q IGVsc2U6IGZhbGwgdGhyb3VnaCAqLworCWNhc2UgLUVBR0FJTjoKKwkJLyoKKwkJICogRUFHQUlO IG1lYW5zIHRoZSBncHUgaXMgaHVuZyBhbmQgd2UnbGwgd2FpdCBmb3IgdGhlIGVycm9yCisJCSAq IGhhbmRsZXIgdG8gcmVzZXQgZXZlcnl0aGluZyB3aGVuIHJlLWZhdWx0aW5nIGluCisJCSAqIGk5 MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlLgorCQkgKi8KKwljYXNlIDA6CisJY2FzZSAtRVJF U1RBUlRTWVM6CisJY2FzZSAtRUlOVFI6CisJY2FzZSAtRUJVU1k6CisJCS8qCisJCSAqIEVCVVNZ IGlzIG9rOiB0aGlzIGp1c3QgbWVhbnMgdGhhdCBhbm90aGVyIHRocmVhZAorCQkgKiBhbHJlYWR5 IGRpZCB0aGUgam9iLgorCQkgKi8KKwkJcmV0dXJuIFZNX0ZBVUxUX05PUEFHRTsKKwljYXNlIC1F Tk9NRU06CisJCXJldHVybiBWTV9GQVVMVF9PT007CisJY2FzZSAtRU5PU1BDOgorCWNhc2UgLUVG QVVMVDoKKwkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKKwlkZWZhdWx0OgorCQlXQVJOX09OQ0Uo cmV0LCAidW5oYW5kbGVkIGVycm9yIGluICVzOiAlaVxuIiwgX19mdW5jX18sIHJldCk7CisJCXJl dHVybiBWTV9GQVVMVF9TSUdCVVM7CisJfQorfQorCit2b2lkIF9faTkxNV9nZW1fb2JqZWN0X3Jl bGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBp OTE1X3ZtYSAqdm1hOworCisJR0VNX0JVR19PTighb2JqLT51c2VyZmF1bHRfY291bnQpOworCisJ b2JqLT51c2VyZmF1bHRfY291bnQgPSAwOworCWxpc3RfZGVsKCZvYmotPnVzZXJmYXVsdF9saW5r KTsKKwlkcm1fdm1hX25vZGVfdW5tYXAoJm9iai0+YmFzZS52bWFfbm9kZSwKKwkJCSAgIG9iai0+ YmFzZS5kZXYtPmFub25faW5vZGUtPmlfbWFwcGluZyk7CisKKwlmb3JfZWFjaF9nZ3R0X3ZtYSh2 bWEsIG9iaikKKwkJaTkxNV92bWFfdW5zZXRfdXNlcmZhdWx0KHZtYSk7Cit9CisKKy8qKgorICog aTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfbW1hcCAtIHJlbW92ZSBwaHlzaWNhbCBwYWdlIG1hcHBp bmdzCisgKiBAb2JqOiBvYmogaW4gcXVlc3Rpb24KKyAqCisgKiBQcmVzZXJ2ZSB0aGUgcmVzZXJ2 YXRpb24gb2YgdGhlIG1tYXBwaW5nIHdpdGggdGhlIERSTSBjb3JlIGNvZGUsIGJ1dAorICogcmVs aW5xdWlzaCBvd25lcnNoaXAgb2YgdGhlIHBhZ2VzIGJhY2sgdG8gdGhlIHN5c3RlbS4KKyAqCisg KiBJdCBpcyB2aXRhbCB0aGF0IHdlIHJlbW92ZSB0aGUgcGFnZSBtYXBwaW5nIGlmIHdlIGhhdmUg bWFwcGVkIGEgdGlsZWQKKyAqIG9iamVjdCB0aHJvdWdoIHRoZSBHVFQgYW5kIHRoZW4gbG9zZSB0 aGUgZmVuY2UgcmVnaXN0ZXIgZHVlIHRvCisgKiByZXNvdXJjZSBwcmVzc3VyZS4gU2ltaWxhcmx5 IGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW92ZWQgb3V0IG9mIHRoZQorICogYXBlcnR1cmUsIHRo YW4gcGFnZXMgbWFwcGVkIGludG8gdXNlcnNwYWNlIG11c3QgYmUgcmV2b2tlZC4gUmVtb3Zpbmcg dGhlCisgKiBtYXBwaW5nIHdpbGwgdGhlbiB0cmlnZ2VyIGEgcGFnZSBmYXVsdCBvbiB0aGUgbmV4 dCB1c2VyIGFjY2VzcywgYWxsb3dpbmcKKyAqIGZpeHVwIGJ5IGk5MTVfZ2VtX2ZhdWx0KCkuCisg Ki8KK3ZvaWQgaTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdG9faTkx NShvYmotPmJhc2UuZGV2KTsKKwlpbnRlbF93YWtlcmVmX3Qgd2FrZXJlZjsKKworCS8qIFNlcmlh bGlzYXRpb24gYmV0d2VlbiB1c2VyIEdUVCBhY2Nlc3MgYW5kIG91ciBjb2RlIGRlcGVuZHMgdXBv bgorCSAqIHJldm9raW5nIHRoZSBDUFUncyBQVEUgd2hpbHN0IHRoZSBtdXRleCBpcyBoZWxkLiBU aGUgbmV4dCB1c2VyCisJICogcGFnZWZhdWx0IHRoZW4gaGFzIHRvIHdhaXQgdW50aWwgd2UgcmVs ZWFzZSB0aGUgbXV0ZXguCisJICoKKwkgKiBOb3RlIHRoYXQgUlBNIGNvbXBsaWNhdGVzIHNvbWV3 aGF0IGJ5IGFkZGluZyBhbiBhZGRpdGlvbmFsCisJICogcmVxdWlyZW1lbnQgdGhhdCBvcGVyYXRp b25zIHRvIHRoZSBHR1RUIGJlIG1hZGUgaG9sZGluZyB0aGUgUlBNCisJICogd2FrZXJlZi4KKwkg Ki8KKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsKKwl3YWtl cmVmID0gaW50ZWxfcnVudGltZV9wbV9nZXQoaTkxNSk7CisKKwlpZiAoIW9iai0+dXNlcmZhdWx0 X2NvdW50KQorCQlnb3RvIG91dDsKKworCV9faTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfbW1hcChv YmopOworCisJLyogRW5zdXJlIHRoYXQgdGhlIENQVSdzIFBURSBhcmUgcmV2b2tlZCBhbmQgdGhl cmUgYXJlIG5vdCBvdXRzdGFuZGluZworCSAqIG1lbW9yeSB0cmFuc2FjdGlvbnMgZnJvbSB1c2Vy c3BhY2UgYmVmb3JlIHdlIHJldHVybi4gVGhlIFRMQgorCSAqIGZsdXNoaW5nIGltcGxpZWQgYWJv dmUgYnkgY2hhbmdpbmcgdGhlIFBURSBhYm92ZSAqc2hvdWxkKiBiZQorCSAqIHN1ZmZpY2llbnQs IGFuIGV4dHJhIGJhcnJpZXIgaGVyZSBqdXN0IHByb3ZpZGVzIHVzIHdpdGggYSBiaXQKKwkgKiBv ZiBwYXJhbm9pZCBkb2N1bWVudGF0aW9uIGFib3V0IG91ciByZXF1aXJlbWVudCB0byBzZXJpYWxp c2UKKwkgKiBtZW1vcnkgd3JpdGVzIGJlZm9yZSB0b3VjaGluZyByZWdpc3RlcnMgLyBHU00uCisJ ICovCisJd21iKCk7CisKK291dDoKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChpOTE1LCB3YWtlcmVm KTsKK30KKworc3RhdGljIGludCBjcmVhdGVfbW1hcF9vZmZzZXQoc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5 MTUob2JqLT5iYXNlLmRldik7CisJaW50IGVycjsKKworCWVyciA9IGRybV9nZW1fY3JlYXRlX21t YXBfb2Zmc2V0KCZvYmotPmJhc2UpOworCWlmIChsaWtlbHkoIWVycikpCisJCXJldHVybiAwOwor CisJLyogQXR0ZW1wdCB0byByZWFwIHNvbWUgbW1hcCBzcGFjZSBmcm9tIGRlYWQgb2JqZWN0cyAq LworCWRvIHsKKwkJZXJyID0gaTkxNV9nZW1fd2FpdF9mb3JfaWRsZShpOTE1LAorCQkJCQkgICAg IEk5MTVfV0FJVF9JTlRFUlJVUFRJQkxFLAorCQkJCQkgICAgIE1BWF9TQ0hFRFVMRV9USU1FT1VU KTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCWk5MTVfZ2VtX2RyYWluX2ZyZWVkX29iamVj dHMoaTkxNSk7CisJCWVyciA9IGRybV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KCZvYmotPmJhc2Up OworCQlpZiAoIWVycikKKwkJCWJyZWFrOworCisJfSB3aGlsZSAoZmx1c2hfZGVsYXllZF93b3Jr KCZpOTE1LT5ndC5yZXRpcmVfd29yaykpOworCisJcmV0dXJuIGVycjsKK30KKworaW50CitpOTE1 X2dlbV9tbWFwX2d0dChzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCisJCSAgc3RydWN0IGRybV9kZXZp Y2UgKmRldiwKKwkJICB1MzIgaGFuZGxlLAorCQkgIHU2NCAqb2Zmc2V0KQoreworCXN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJaW50IHJldDsKKworCW9iaiA9IGk5MTVfZ2VtX29i amVjdF9sb29rdXAoZmlsZSwgaGFuZGxlKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIC1FTk9FTlQ7 CisKKwlyZXQgPSBjcmVhdGVfbW1hcF9vZmZzZXQob2JqKTsKKwlpZiAocmV0ID09IDApCisJCSpv ZmZzZXQgPSBkcm1fdm1hX25vZGVfb2Zmc2V0X2FkZHIoJm9iai0+YmFzZS52bWFfbm9kZSk7CisK KwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBp OTE1X2dlbV9tbWFwX2d0dF9pb2N0bCAtIHByZXBhcmUgYW4gb2JqZWN0IGZvciBHVFQgbW1hcCdp bmcKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBkYXRhOiBHVFQgbWFwcGluZyBpb2N0bCBkYXRh CisgKiBAZmlsZTogR0VNIG9iamVjdCBpbmZvCisgKgorICogU2ltcGx5IHJldHVybnMgdGhlIGZh a2Ugb2Zmc2V0IHRvIHVzZXJzcGFjZSBzbyBpdCBjYW4gbW1hcCBpdC4KKyAqIFRoZSBtbWFwIGNh bGwgd2lsbCBlbmQgdXAgaW4gZHJtX2dlbV9tbWFwKCksIHdoaWNoIHdpbGwgc2V0IHRoaW5ncwor ICogdXAgc28gd2UgY2FuIGdldCBmYXVsdHMgaW4gdGhlIGhhbmRsZXIgYWJvdmUuCisgKgorICog VGhlIGZhdWx0IGhhbmRsZXIgd2lsbCB0YWtlIGNhcmUgb2YgYmluZGluZyB0aGUgb2JqZWN0IGlu dG8gdGhlIEdUVAorICogKHNpbmNlIGl0IG1heSBoYXZlIGJlZW4gZXZpY3RlZCB0byBtYWtlIHJv b20gZm9yIHNvbWV0aGluZyksIGFsbG9jYXRpbmcKKyAqIGEgZmVuY2UgcmVnaXN0ZXIsIGFuZCBt YXBwaW5nIHRoZSBhcHByb3ByaWF0ZSBhcGVydHVyZSBhZGRyZXNzIGludG8KKyAqIHVzZXJzcGFj ZS4KKyAqLworaW50CitpOTE1X2dlbV9tbWFwX2d0dF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2LCB2b2lkICpkYXRhLAorCQkJc3RydWN0IGRybV9maWxlICpmaWxlKQoreworCXN0cnVjdCBk cm1faTkxNV9nZW1fbW1hcF9ndHQgKmFyZ3MgPSBkYXRhOworCisJcmV0dXJuIGk5MTVfZ2VtX21t YXBfZ3R0KGZpbGUsIGRldiwgYXJncy0+aGFuZGxlLCAmYXJncy0+b2Zmc2V0KTsKK30KKworI2lm IElTX0VOQUJMRUQoQ09ORklHX0RSTV9JOTE1X1NFTEZURVNUKQorI2luY2x1ZGUgInNlbGZ0ZXN0 cy9pOTE1X2dlbV9tbWFuLmMiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1 X2dlbV9vYmplY3QuYwppbmRleCAwNWVmY2U4ODU5NjEuLjRhNmM1ZGRkMTI2NSAxMDA2NDQKLS0t IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdC5jCisrKyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuYwpAQCAtMjYsNiArMjYsNyBAQAog CiAjaW5jbHVkZSAiLi4vaTkxNV9kcnYuaCIKICNpbmNsdWRlICIuLi9pOTE1X2dsb2JhbHMuaCIK KyNpbmNsdWRlICIuLi9pOTE1X2dlbV9jbGZsdXNoLmgiCiAjaW5jbHVkZSAiLi4vaW50ZWxfZnJv bnRidWZmZXIuaCIKIAogc3RhdGljIHN0cnVjdCBpOTE1X2dsb2JhbF9vYmplY3QgewpAQCAtMzU3 LDYgKzM1OCw2MSBAQCB2b2lkIF9faTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfdW5sZXNzX2FjdGl2 ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogCQlpOTE1X2dlbV9vYmplY3RfcHV0 KG9iaik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgZW51bSBmYl9vcF9vcmlnaW4KK2ZiX3dyaXRlX29y aWdpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCB1bnNpZ25lZCBpbnQgZG9tYWlu KQoreworCXJldHVybiAoZG9tYWluID09IEk5MTVfR0VNX0RPTUFJTl9HVFQgPworCQlvYmotPmZy b250YnVmZmVyX2dndHRfb3JpZ2luIDogT1JJR0lOX0NQVSk7Cit9CisKK3N0YXRpYyBib29sIGdw dV93cml0ZV9uZWVkc19jbGZsdXNoKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7 CisJcmV0dXJuICEob2JqLT5jYWNoZV9sZXZlbCA9PSBJOTE1X0NBQ0hFX05PTkUgfHwKKwkJIG9i ai0+Y2FjaGVfbGV2ZWwgPT0gSTkxNV9DQUNIRV9XVCk7Cit9CisKK3ZvaWQKK2k5MTVfZ2VtX29i amVjdF9mbHVzaF93cml0ZV9kb21haW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwK KwkJCQkgICB1bnNpZ25lZCBpbnQgZmx1c2hfZG9tYWlucykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOworCXN0cnVjdCBpOTE1 X3ZtYSAqdm1hOworCisJaWYgKCEob2JqLT53cml0ZV9kb21haW4gJiBmbHVzaF9kb21haW5zKSkK KwkJcmV0dXJuOworCisJc3dpdGNoIChvYmotPndyaXRlX2RvbWFpbikgeworCWNhc2UgSTkxNV9H RU1fRE9NQUlOX0dUVDoKKwkJaTkxNV9nZW1fZmx1c2hfZ2d0dF93cml0ZXMoZGV2X3ByaXYpOwor CisJCWludGVsX2ZiX29ial9mbHVzaChvYmosCisJCQkJICAgZmJfd3JpdGVfb3JpZ2luKG9iaiwg STkxNV9HRU1fRE9NQUlOX0dUVCkpOworCisJCWZvcl9lYWNoX2dndHRfdm1hKHZtYSwgb2JqKSB7 CisJCQlpZiAodm1hLT5pb21hcCkKKwkJCQljb250aW51ZTsKKworCQkJaTkxNV92bWFfdW5zZXRf Z2d0dF93cml0ZSh2bWEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJOTE1X0dFTV9ET01BSU5f V0M6CisJCXdtYigpOworCQlicmVhazsKKworCWNhc2UgSTkxNV9HRU1fRE9NQUlOX0NQVToKKwkJ aTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qob2JqLCBJOTE1X0NMRkxVU0hfU1lOQyk7CisJCWJyZWFr OworCisJY2FzZSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOgorCQlpZiAoZ3B1X3dyaXRlX25lZWRz X2NsZmx1c2gob2JqKSkKKwkJCW9iai0+Y2FjaGVfZGlydHkgPSB0cnVlOworCQlicmVhazsKKwl9 CisKKwlvYmotPndyaXRlX2RvbWFpbiA9IDA7Cit9CisKIHZvaWQgaTkxNV9nZW1faW5pdF9fb2Jq ZWN0cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKIHsKIAlJTklUX1dPUksoJmk5MTUt Pm1tLmZyZWVfd29yaywgX19pOTE1X2dlbV9mcmVlX3dvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdC5oIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvZ2VtL2k5MTVfZ2VtX29iamVjdC5oCmluZGV4IGViYWIzNTA1ZTUxZC4uMjBiNzJjMTZjNDg2 IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmgK KysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdC5oCkBAIC0zMzcs NiArMzM3LDEzIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X2dlbV9vYmplY3RfdW5waW5fbWFw KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiAJaTkxNV9nZW1fb2JqZWN0X3VucGlu X3BhZ2VzKG9iaik7CiB9CiAKK3ZvaWQgX19pOTE1X2dlbV9vYmplY3RfcmVsZWFzZV9tbWFwKHN0 cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwordm9pZCBpOTE1X2dlbV9vYmplY3RfcmVs ZWFzZV9tbWFwKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOworCit2b2lkCitpOTE1 X2dlbV9vYmplY3RfZmx1c2hfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmosCisJCQkJICAgdW5zaWduZWQgaW50IGZsdXNoX2RvbWFpbnMpOworCiBzdGF0aWMgaW5s aW5lIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKgogaTkxNV9nZW1fb2JqZWN0X2xhc3Rfd3JpdGVf ZW5naW5lKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7CmRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vc2VsZnRlc3RzL2k5MTVfZ2VtX21tYW4uYyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2dlbS9zZWxmdGVzdHMvaTkxNV9nZW1fbW1hbi5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uYTk5YTUxYTkzZGNiCi0tLSAvZGV2L251bGwK KysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1X2dlbV9tbWFuLmMK QEAgLTAsMCArMSw1MDcgQEAKKy8qCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCisg KgorICogQ29weXJpZ2h0IMKpIDIwMTYgSW50ZWwgQ29ycG9yYXRpb24KKyAqLworCisjaW5jbHVk ZSA8bGludXgvcHJpbWVfbnVtYmVycy5oPgorCisjaW5jbHVkZSAiLi4vLi4vaTkxNV9zZWxmdGVz dC5oIgorI2luY2x1ZGUgIi4uLy4uL3NlbGZ0ZXN0cy9odWdlX2dlbV9vYmplY3QuaCIKKworc3Ry dWN0IHRpbGUgeworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0Owor CXVuc2lnbmVkIGludCBzdHJpZGU7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50 IHRpbGluZzsKKwl1bnNpZ25lZCBpbnQgc3dpenpsZTsKK307CisKK3N0YXRpYyB1NjQgc3dpenps ZV9iaXQodW5zaWduZWQgaW50IGJpdCwgdTY0IG9mZnNldCkKK3sKKwlyZXR1cm4gKG9mZnNldCAm IEJJVF9VTEwoYml0KSkgPj4gKGJpdCAtIDYpOworfQorCitzdGF0aWMgdTY0IHRpbGVkX29mZnNl dChjb25zdCBzdHJ1Y3QgdGlsZSAqdGlsZSwgdTY0IHYpCit7CisJdTY0IHgsIHk7CisKKwlpZiAo dGlsZS0+dGlsaW5nID09IEk5MTVfVElMSU5HX05PTkUpCisJCXJldHVybiB2OworCisJeSA9IGRp djY0X3U2NF9yZW0odiwgdGlsZS0+c3RyaWRlLCAmeCk7CisJdiA9IGRpdjY0X3U2NF9yZW0oeSwg dGlsZS0+aGVpZ2h0LCAmeSkgKiB0aWxlLT5zdHJpZGUgKiB0aWxlLT5oZWlnaHQ7CisKKwlpZiAo dGlsZS0+dGlsaW5nID09IEk5MTVfVElMSU5HX1gpIHsKKwkJdiArPSB5ICogdGlsZS0+d2lkdGg7 CisJCXYgKz0gZGl2NjRfdTY0X3JlbSh4LCB0aWxlLT53aWR0aCwgJngpIDw8IHRpbGUtPnNpemU7 CisJCXYgKz0geDsKKwl9IGVsc2UgaWYgKHRpbGUtPndpZHRoID09IDEyOCkgeworCQljb25zdCB1 bnNpZ25lZCBpbnQgeXRpbGVfc3BhbiA9IDE2OworCQljb25zdCB1bnNpZ25lZCBpbnQgeXRpbGVf aGVpZ2h0ID0gNTEyOworCisJCXYgKz0geSAqIHl0aWxlX3NwYW47CisJCXYgKz0gZGl2NjRfdTY0 X3JlbSh4LCB5dGlsZV9zcGFuLCAmeCkgKiB5dGlsZV9oZWlnaHQ7CisJCXYgKz0geDsKKwl9IGVs c2UgeworCQljb25zdCB1bnNpZ25lZCBpbnQgeXRpbGVfc3BhbiA9IDMyOworCQljb25zdCB1bnNp Z25lZCBpbnQgeXRpbGVfaGVpZ2h0ID0gMjU2OworCisJCXYgKz0geSAqIHl0aWxlX3NwYW47CisJ CXYgKz0gZGl2NjRfdTY0X3JlbSh4LCB5dGlsZV9zcGFuLCAmeCkgKiB5dGlsZV9oZWlnaHQ7CisJ CXYgKz0geDsKKwl9CisKKwlzd2l0Y2ggKHRpbGUtPnN3aXp6bGUpIHsKKwljYXNlIEk5MTVfQklU XzZfU1dJWlpMRV85OgorCQl2IF49IHN3aXp6bGVfYml0KDksIHYpOworCQlicmVhazsKKwljYXNl IEk5MTVfQklUXzZfU1dJWlpMRV85XzEwOgorCQl2IF49IHN3aXp6bGVfYml0KDksIHYpIF4gc3dp enpsZV9iaXQoMTAsIHYpOworCQlicmVhazsKKwljYXNlIEk5MTVfQklUXzZfU1dJWlpMRV85XzEx OgorCQl2IF49IHN3aXp6bGVfYml0KDksIHYpIF4gc3dpenpsZV9iaXQoMTEsIHYpOworCQlicmVh azsKKwljYXNlIEk5MTVfQklUXzZfU1dJWlpMRV85XzEwXzExOgorCQl2IF49IHN3aXp6bGVfYml0 KDksIHYpIF4gc3dpenpsZV9iaXQoMTAsIHYpIF4gc3dpenpsZV9iaXQoMTEsIHYpOworCQlicmVh azsKKwl9CisKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGludCBjaGVja19wYXJ0aWFsX21hcHBp bmcoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgY29uc3Qgc3RydWN0IHRp bGUgKnRpbGUsCisJCQkJIHVuc2lnbmVkIGxvbmcgZW5kX3RpbWUpCit7CisJY29uc3QgdW5zaWdu ZWQgaW50IG5yZWFsID0gb2JqLT5zY3JhdGNoIC8gUEFHRV9TSVpFOworCWNvbnN0IHVuc2lnbmVk IGxvbmcgbnBhZ2VzID0gb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkU7CisJc3RydWN0IGk5MTVf dm1hICp2bWE7CisJdW5zaWduZWQgbG9uZyBwYWdlOworCWludCBlcnI7CisKKwlpZiAoaWd0X3Rp bWVvdXQoZW5kX3RpbWUsCisJCQkiJXM6IHRpbWVkIG91dCBiZWZvcmUgdGlsaW5nPSVkIHN0cmlk ZT0lZFxuIiwKKwkJCV9fZnVuY19fLCB0aWxlLT50aWxpbmcsIHRpbGUtPnN0cmlkZSkpCisJCXJl dHVybiAtRUlOVFI7CisKKwllcnIgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RpbGluZyhvYmosIHRp bGUtPnRpbGluZywgdGlsZS0+c3RyaWRlKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiRmFpbGVk IHRvIHNldCB0aWxpbmcgbW9kZT0ldSwgc3RyaWRlPSV1LCBlcnI9JWRcbiIsCisJCSAgICAgICB0 aWxlLT50aWxpbmcsIHRpbGUtPnN0cmlkZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlH RU1fQlVHX09OKGk5MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5nKG9iaikgIT0gdGlsZS0+dGlsaW5n KTsKKwlHRU1fQlVHX09OKGk5MTVfZ2VtX29iamVjdF9nZXRfc3RyaWRlKG9iaikgIT0gdGlsZS0+ c3RyaWRlKTsKKworCWZvcl9lYWNoX3ByaW1lX251bWJlcl9mcm9tKHBhZ2UsIDEsIG5wYWdlcykg eworCQlzdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgdmlldyA9CisJCQljb21wdXRlX3BhcnRpYWxfdmll dyhvYmosIHBhZ2UsIE1JTl9DSFVOS19QQUdFUyk7CisJCXUzMiBfX2lvbWVtICppbzsKKwkJc3Ry dWN0IHBhZ2UgKnA7CisJCXVuc2lnbmVkIGludCBuOworCQl1NjQgb2Zmc2V0OworCQl1MzIgKmNw dTsKKworCQlHRU1fQlVHX09OKHZpZXcucGFydGlhbC5zaXplID4gbnJlYWwpOworCQljb25kX3Jl c2NoZWQoKTsKKworCQllcnIgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2Jq LCB0cnVlKTsKKwkJaWYgKGVycikgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gZmx1c2ggdG8gR1RU IHdyaXRlIGRvbWFpbjsgZXJyPSVkXG4iLAorCQkJICAgICAgIGVycik7CisJCQlyZXR1cm4gZXJy OworCQl9CisKKwkJdm1hID0gaTkxNV9nZW1fb2JqZWN0X2dndHRfcGluKG9iaiwgJnZpZXcsIDAs IDAsIFBJTl9NQVBQQUJMRSk7CisJCWlmIChJU19FUlIodm1hKSkgeworCQkJcHJfZXJyKCJGYWls ZWQgdG8gcGluIHBhcnRpYWwgdmlldzogb2Zmc2V0PSVsdTsgZXJyPSVkXG4iLAorCQkJICAgICAg IHBhZ2UsIChpbnQpUFRSX0VSUih2bWEpKTsKKwkJCXJldHVybiBQVFJfRVJSKHZtYSk7CisJCX0K KworCQluID0gcGFnZSAtIHZpZXcucGFydGlhbC5vZmZzZXQ7CisJCUdFTV9CVUdfT04obiA+PSB2 aWV3LnBhcnRpYWwuc2l6ZSk7CisKKwkJaW8gPSBpOTE1X3ZtYV9waW5faW9tYXAodm1hKTsKKwkJ aTkxNV92bWFfdW5waW4odm1hKTsKKwkJaWYgKElTX0VSUihpbykpIHsKKwkJCXByX2VycigiRmFp bGVkIHRvIGlvbWFwIHBhcnRpYWwgdmlldzogb2Zmc2V0PSVsdTsgZXJyPSVkXG4iLAorCQkJICAg ICAgIHBhZ2UsIChpbnQpUFRSX0VSUihpbykpOworCQkJcmV0dXJuIFBUUl9FUlIoaW8pOworCQl9 CisKKwkJaW93cml0ZTMyKHBhZ2UsIGlvICsgbiAqIFBBR0VfU0laRSAvIHNpemVvZigqaW8pKTsK KwkJaTkxNV92bWFfdW5waW5faW9tYXAodm1hKTsKKworCQlvZmZzZXQgPSB0aWxlZF9vZmZzZXQo dGlsZSwgcGFnZSA8PCBQQUdFX1NISUZUKTsKKwkJaWYgKG9mZnNldCA+PSBvYmotPmJhc2Uuc2l6 ZSkKKwkJCWNvbnRpbnVlOworCisJCWk5MTVfZ2VtX29iamVjdF9mbHVzaF93cml0ZV9kb21haW4o b2JqLCB+STkxNV9HRU1fRE9NQUlOX0NQVSk7CisKKwkJcCA9IGk5MTVfZ2VtX29iamVjdF9nZXRf cGFnZShvYmosIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKKwkJY3B1ID0ga21hcChwKSArIG9mZnNl dF9pbl9wYWdlKG9mZnNldCk7CisJCWRybV9jbGZsdXNoX3ZpcnRfcmFuZ2UoY3B1LCBzaXplb2Yo KmNwdSkpOworCQlpZiAoKmNwdSAhPSAodTMyKXBhZ2UpIHsKKwkJCXByX2VycigiUGFydGlhbCB2 aWV3IGZvciAlbHUgWyV1XSAob2Zmc2V0PSVsbHUsIHNpemU9JXUgWyVsbHUsIHJvdyBzaXplICV1 XSwgZmVuY2U9JWQsIHRpbGluZz0lZCwgc3RyaWRlPSVkKSBtaXNhbGlnbm1lbnQsIGV4cGVjdGVk IHdyaXRlIHRvIHBhZ2UgKCVsbHUgKyAldSBbMHglbGx4XSkgb2YgMHgleCwgZm91bmQgMHgleFxu IiwKKwkJCSAgICAgICBwYWdlLCBuLAorCQkJICAgICAgIHZpZXcucGFydGlhbC5vZmZzZXQsCisJ CQkgICAgICAgdmlldy5wYXJ0aWFsLnNpemUsCisJCQkgICAgICAgdm1hLT5zaXplID4+IFBBR0Vf U0hJRlQsCisJCQkgICAgICAgdGlsZS0+dGlsaW5nID8gdGlsZV9yb3dfcGFnZXMob2JqKSA6IDAs CisJCQkgICAgICAgdm1hLT5mZW5jZSA/IHZtYS0+ZmVuY2UtPmlkIDogLTEsIHRpbGUtPnRpbGlu ZywgdGlsZS0+c3RyaWRlLAorCQkJICAgICAgIG9mZnNldCA+PiBQQUdFX1NISUZULAorCQkJICAg ICAgICh1bnNpZ25lZCBpbnQpb2Zmc2V0X2luX3BhZ2Uob2Zmc2V0KSwKKwkJCSAgICAgICBvZmZz ZXQsCisJCQkgICAgICAgKHUzMilwYWdlLCAqY3B1KTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCX0K KwkJKmNwdSA9IDA7CisJCWRybV9jbGZsdXNoX3ZpcnRfcmFuZ2UoY3B1LCBzaXplb2YoKmNwdSkp OworCQlrdW5tYXAocCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWk5MTVfdm1h X2Rlc3Ryb3kodm1hKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZ3RfcGFy dGlhbF90aWxpbmcodm9pZCAqYXJnKQoreworCWNvbnN0IHVuc2lnbmVkIGludCBucmVhbCA9IDEg PDwgMTI7IC8qIGxhcmdlc3QgdGlsZSByb3cgeDIgKi8KKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqaTkxNSA9IGFyZzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCWludGVs X3dha2VyZWZfdCB3YWtlcmVmOworCWludCB0aWxpbmc7CisJaW50IGVycjsKKworCS8qIFdlIHdh bnQgdG8gY2hlY2sgdGhlIHBhZ2UgbWFwcGluZyBhbmQgZmVuY2luZyBvZiBhIGxhcmdlIG9iamVj dAorCSAqIG1tYXBwZWQgdGhyb3VnaCB0aGUgR1RULiBUaGUgb2JqZWN0IHdlIGNyZWF0ZSBpcyBs YXJnZXIgdGhhbiBjYW4KKwkgKiBwb3NzaWJseSBiZSBtbWFwZWQgYXMgYSB3aG9sZSwgYW5kIHNv IHdlIG11c3QgdXNlIHBhcnRpYWwgR0dUVCB2bWEuCisJICogV2UgdGhlbiBjaGVjayB0aGF0IGEg d3JpdGUgdGhyb3VnaCBlYWNoIHBhcnRpYWwgR0dUVCB2bWEgZW5kcyB1cAorCSAqIGluIHRoZSBy aWdodCBzZXQgb2YgcGFnZXMgd2l0aGluIHRoZSBvYmplY3QsIGFuZCB3aXRoIHRoZSBleHBlY3Rl ZAorCSAqIHRpbGluZywgd2hpY2ggd2UgdmVyaWZ5IGJ5IG1hbnVhbCBzd2l6emxpbmcuCisJICov CisKKwlvYmogPSBodWdlX2dlbV9vYmplY3QoaTkxNSwKKwkJCSAgICAgIG5yZWFsIDw8IFBBR0Vf U0hJRlQsCisJCQkgICAgICAoMSArIG5leHRfcHJpbWVfbnVtYmVyKGk5MTUtPmdndHQudm0udG90 YWwgPj4gUEFHRV9TSElGVCkpIDw8IFBBR0VfU0hJRlQpOworCWlmIChJU19FUlIob2JqKSkKKwkJ cmV0dXJuIFBUUl9FUlIob2JqKTsKKworCWVyciA9IGk5MTVfZ2VtX29iamVjdF9waW5fcGFnZXMo b2JqKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlICV1IHBhZ2Vz ICglbHUgdG90YWwpLCBlcnI9JWRcbiIsCisJCSAgICAgICBucmVhbCwgb2JqLT5iYXNlLnNpemUg LyBQQUdFX1NJWkUsIGVycik7CisJCWdvdG8gb3V0OworCX0KKworCW11dGV4X2xvY2soJmk5MTUt PmRybS5zdHJ1Y3RfbXV0ZXgpOworCXdha2VyZWYgPSBpbnRlbF9ydW50aW1lX3BtX2dldChpOTE1 KTsKKworCWlmICgxKSB7CisJCUlHVF9USU1FT1VUKGVuZCk7CisJCXN0cnVjdCB0aWxlIHRpbGU7 CisKKwkJdGlsZS5oZWlnaHQgPSAxOworCQl0aWxlLndpZHRoID0gMTsKKwkJdGlsZS5zaXplID0g MDsKKwkJdGlsZS5zdHJpZGUgPSAwOworCQl0aWxlLnN3aXp6bGUgPSBJOTE1X0JJVF82X1NXSVpa TEVfTk9ORTsKKwkJdGlsZS50aWxpbmcgPSBJOTE1X1RJTElOR19OT05FOworCisJCWVyciA9IGNo ZWNrX3BhcnRpYWxfbWFwcGluZyhvYmosICZ0aWxlLCBlbmQpOworCQlpZiAoZXJyICYmIGVyciAh PSAtRUlOVFIpCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZm9yICh0aWxpbmcgPSBJOTE1 X1RJTElOR19YOyB0aWxpbmcgPD0gSTkxNV9USUxJTkdfWTsgdGlsaW5nKyspIHsKKwkJSUdUX1RJ TUVPVVQoZW5kKTsKKwkJdW5zaWduZWQgaW50IG1heF9waXRjaDsKKwkJdW5zaWduZWQgaW50IHBp dGNoOworCQlzdHJ1Y3QgdGlsZSB0aWxlOworCisJCWlmIChpOTE1LT5xdWlya3MgJiBRVUlSS19Q SU5fU1dJWlpMRURfUEFHRVMpCisJCQkvKgorCQkJICogVGhlIHN3aXp6bGluZyBwYXR0ZXJuIGlz IGFjdHVhbGx5IHVua25vd24gYXMgaXQKKwkJCSAqIHZhcmllcyBiYXNlZCBvbiBwaHlzaWNhbCBh ZGRyZXNzIG9mIGVhY2ggcGFnZS4KKwkJCSAqIFNlZSBpOTE1X2dlbV9kZXRlY3RfYml0XzZfc3dp enpsZSgpLgorCQkJICovCisJCQlicmVhazsKKworCQl0aWxlLnRpbGluZyA9IHRpbGluZzsKKwkJ c3dpdGNoICh0aWxpbmcpIHsKKwkJY2FzZSBJOTE1X1RJTElOR19YOgorCQkJdGlsZS5zd2l6emxl ID0gaTkxNS0+bW0uYml0XzZfc3dpenpsZV94OworCQkJYnJlYWs7CisJCWNhc2UgSTkxNV9USUxJ TkdfWToKKwkJCXRpbGUuc3dpenpsZSA9IGk5MTUtPm1tLmJpdF82X3N3aXp6bGVfeTsKKwkJCWJy ZWFrOworCQl9CisKKwkJR0VNX0JVR19PTih0aWxlLnN3aXp6bGUgPT0gSTkxNV9CSVRfNl9TV0la WkxFX1VOS05PV04pOworCQlpZiAodGlsZS5zd2l6emxlID09IEk5MTVfQklUXzZfU1dJWlpMRV85 XzE3IHx8CisJCSAgICB0aWxlLnN3aXp6bGUgPT0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTBfMTcp CisJCQljb250aW51ZTsKKworCQlpZiAoSU5URUxfR0VOKGk5MTUpIDw9IDIpIHsKKwkJCXRpbGUu aGVpZ2h0ID0gMTY7CisJCQl0aWxlLndpZHRoID0gMTI4OworCQkJdGlsZS5zaXplID0gMTE7CisJ CX0gZWxzZSBpZiAodGlsZS50aWxpbmcgPT0gSTkxNV9USUxJTkdfWSAmJgorCQkJICAgSEFTXzEy OF9CWVRFX1lfVElMSU5HKGk5MTUpKSB7CisJCQl0aWxlLmhlaWdodCA9IDMyOworCQkJdGlsZS53 aWR0aCA9IDEyODsKKwkJCXRpbGUuc2l6ZSA9IDEyOworCQl9IGVsc2UgeworCQkJdGlsZS5oZWln aHQgPSA4OworCQkJdGlsZS53aWR0aCA9IDUxMjsKKwkJCXRpbGUuc2l6ZSA9IDEyOworCQl9CisK KwkJaWYgKElOVEVMX0dFTihpOTE1KSA8IDQpCisJCQltYXhfcGl0Y2ggPSA4MTkyIC8gdGlsZS53 aWR0aDsKKwkJZWxzZSBpZiAoSU5URUxfR0VOKGk5MTUpIDwgNykKKwkJCW1heF9waXRjaCA9IDEy OCAqIEk5NjVfRkVOQ0VfTUFYX1BJVENIX1ZBTCAvIHRpbGUud2lkdGg7CisJCWVsc2UKKwkJCW1h eF9waXRjaCA9IDEyOCAqIEdFTjdfRkVOQ0VfTUFYX1BJVENIX1ZBTCAvIHRpbGUud2lkdGg7CisK KwkJZm9yIChwaXRjaCA9IG1heF9waXRjaDsgcGl0Y2g7IHBpdGNoID4+PSAxKSB7CisJCQl0aWxl LnN0cmlkZSA9IHRpbGUud2lkdGggKiBwaXRjaDsKKwkJCWVyciA9IGNoZWNrX3BhcnRpYWxfbWFw cGluZyhvYmosICZ0aWxlLCBlbmQpOworCQkJaWYgKGVyciA9PSAtRUlOVFIpCisJCQkJZ290byBu ZXh0X3RpbGluZzsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXRfdW5sb2NrOworCisJCQlpZiAo cGl0Y2ggPiAyICYmIElOVEVMX0dFTihpOTE1KSA+PSA0KSB7CisJCQkJdGlsZS5zdHJpZGUgPSB0 aWxlLndpZHRoICogKHBpdGNoIC0gMSk7CisJCQkJZXJyID0gY2hlY2tfcGFydGlhbF9tYXBwaW5n KG9iaiwgJnRpbGUsIGVuZCk7CisJCQkJaWYgKGVyciA9PSAtRUlOVFIpCisJCQkJCWdvdG8gbmV4 dF90aWxpbmc7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCisJ CQlpZiAocGl0Y2ggPCBtYXhfcGl0Y2ggJiYgSU5URUxfR0VOKGk5MTUpID49IDQpIHsKKwkJCQl0 aWxlLnN0cmlkZSA9IHRpbGUud2lkdGggKiAocGl0Y2ggKyAxKTsKKwkJCQllcnIgPSBjaGVja19w YXJ0aWFsX21hcHBpbmcob2JqLCAmdGlsZSwgZW5kKTsKKwkJCQlpZiAoZXJyID09IC1FSU5UUikK KwkJCQkJZ290byBuZXh0X3RpbGluZzsKKwkJCQlpZiAoZXJyKQorCQkJCQlnb3RvIG91dF91bmxv Y2s7CisJCQl9CisJCX0KKworCQlpZiAoSU5URUxfR0VOKGk5MTUpID49IDQpIHsKKwkJCWZvcl9l YWNoX3ByaW1lX251bWJlcihwaXRjaCwgbWF4X3BpdGNoKSB7CisJCQkJdGlsZS5zdHJpZGUgPSB0 aWxlLndpZHRoICogcGl0Y2g7CisJCQkJZXJyID0gY2hlY2tfcGFydGlhbF9tYXBwaW5nKG9iaiwg JnRpbGUsIGVuZCk7CisJCQkJaWYgKGVyciA9PSAtRUlOVFIpCisJCQkJCWdvdG8gbmV4dF90aWxp bmc7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCQl9CisKK25l eHRfdGlsaW5nOiA7CisJfQorCitvdXRfdW5sb2NrOgorCWludGVsX3J1bnRpbWVfcG1fcHV0KGk5 MTUsIHdha2VyZWYpOworCW11dGV4X3VubG9jaygmaTkxNS0+ZHJtLnN0cnVjdF9tdXRleCk7CisJ aTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CitvdXQ6CisJaTkxNV9nZW1fb2JqZWN0 X3B1dChvYmopOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWFrZV9vYmpfYnVzeShz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICppOTE1ID0gdG9faTkxNShvYmotPmJhc2UuZGV2KTsKKwlzdHJ1Y3QgaTkxNV9yZXF1ZXN0 ICpycTsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKwlpbnQgZXJyOworCisJdm1hID0gaTkxNV92 bWFfaW5zdGFuY2Uob2JqLCAmaTkxNS0+Z2d0dC52bSwgTlVMTCk7CisJaWYgKElTX0VSUih2bWEp KQorCQlyZXR1cm4gUFRSX0VSUih2bWEpOworCisJZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwg MCwgUElOX1VTRVIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlycSA9IGk5MTVfcmVx dWVzdF9hbGxvYyhpOTE1LT5lbmdpbmVbUkNTMF0sIGk5MTUtPmtlcm5lbF9jb250ZXh0KTsKKwlp ZiAoSVNfRVJSKHJxKSkgeworCQlpOTE1X3ZtYV91bnBpbih2bWEpOworCQlyZXR1cm4gUFRSX0VS UihycSk7CisJfQorCisJZXJyID0gaTkxNV92bWFfbW92ZV90b19hY3RpdmUodm1hLCBycSwgRVhF Q19PQkpFQ1RfV1JJVEUpOworCisJaTkxNV9yZXF1ZXN0X2FkZChycSk7CisKKwlfX2k5MTVfZ2Vt X29iamVjdF9yZWxlYXNlX3VubGVzc19hY3RpdmUob2JqKTsKKwlpOTE1X3ZtYV91bnBpbih2bWEp OworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJvb2wgYXNzZXJ0X21tYXBfb2Zmc2V0KHN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6 ZSwKKwkJCSAgICAgICBpbnQgZXhwZWN0ZWQpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iajsKKwlpbnQgZXJyOworCisJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9pbnRl cm5hbChpOTE1LCBzaXplKTsKKwlpZiAoSVNfRVJSKG9iaikpCisJCXJldHVybiBQVFJfRVJSKG9i aik7CisKKwllcnIgPSBjcmVhdGVfbW1hcF9vZmZzZXQob2JqKTsKKwlpOTE1X2dlbV9vYmplY3Rf cHV0KG9iaik7CisKKwlyZXR1cm4gZXJyID09IGV4cGVjdGVkOworfQorCitzdGF0aWMgdm9pZCBk aXNhYmxlX3JldGlyZV93b3JrZXIoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCit7CisJ aTkxNV9nZW1fc2hyaW5rZXJfdW5yZWdpc3RlcihpOTE1KTsKKworCW11dGV4X2xvY2soJmk5MTUt PmRybS5zdHJ1Y3RfbXV0ZXgpOworCWlmICghaTkxNS0+Z3QuYWN0aXZlX3JlcXVlc3RzKyspIHsK KwkJaW50ZWxfd2FrZXJlZl90IHdha2VyZWY7CisKKwkJd2l0aF9pbnRlbF9ydW50aW1lX3BtKGk5 MTUsIHdha2VyZWYpCisJCQlpOTE1X2dlbV91bnBhcmsoaTkxNSk7CisJfQorCW11dGV4X3VubG9j aygmaTkxNS0+ZHJtLnN0cnVjdF9tdXRleCk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMo Jmk5MTUtPmd0LnJldGlyZV93b3JrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmk5MTUt Pmd0LmlkbGVfd29yayk7Cit9CisKK3N0YXRpYyBpbnQgaWd0X21tYXBfb2Zmc2V0X2V4aGF1c3Rp b24odm9pZCAqYXJnKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gYXJnOwor CXN0cnVjdCBkcm1fbW0gKm1tID0gJmk5MTUtPmRybS52bWFfb2Zmc2V0X21hbmFnZXItPnZtX2Fk ZHJfc3BhY2VfbW07CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3Qg ZHJtX21tX25vZGUgcmVzdiwgKmhvbGU7CisJdTY0IGhvbGVfc3RhcnQsIGhvbGVfZW5kOworCWlu dCBsb29wLCBlcnI7CisKKwkvKiBEaXNhYmxlIGJhY2tncm91bmQgcmVhcGVyICovCisJZGlzYWJs ZV9yZXRpcmVfd29ya2VyKGk5MTUpOworCUdFTV9CVUdfT04oIWk5MTUtPmd0LmF3YWtlKTsKKwor CS8qIFRyaW0gdGhlIGRldmljZSBtbWFwIHNwYWNlIHRvIG9ubHkgYSBwYWdlICovCisJbWVtc2V0 KCZyZXN2LCAwLCBzaXplb2YocmVzdikpOworCWRybV9tbV9mb3JfZWFjaF9ob2xlKGhvbGUsIG1t LCBob2xlX3N0YXJ0LCBob2xlX2VuZCkgeworCQlyZXN2LnN0YXJ0ID0gaG9sZV9zdGFydDsKKwkJ cmVzdi5zaXplID0gaG9sZV9lbmQgLSBob2xlX3N0YXJ0IC0gMTsgLyogUEFHRV9TSVpFIHVuaXRz ICovCisJCWVyciA9IGRybV9tbV9yZXNlcnZlX25vZGUobW0sICZyZXN2KTsKKwkJaWYgKGVycikg eworCQkJcHJfZXJyKCJGYWlsZWQgdG8gdHJpbSBWTUEgbWFuYWdlciwgZXJyPSVkXG4iLCBlcnIp OworCQkJZ290byBvdXRfcGFyazsKKwkJfQorCQlicmVhazsKKwl9CisKKwkvKiBKdXN0IGZpdHMh ICovCisJaWYgKCFhc3NlcnRfbW1hcF9vZmZzZXQoaTkxNSwgUEFHRV9TSVpFLCAwKSkgeworCQlw cl9lcnIoIlVuYWJsZSB0byBpbnNlcnQgb2JqZWN0IGludG8gc2luZ2xlIHBhZ2UgaG9sZVxuIik7 CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFRvbyBsYXJnZSAqLwor CWlmICghYXNzZXJ0X21tYXBfb2Zmc2V0KGk5MTUsIDIgKiBQQUdFX1NJWkUsIC1FTk9TUEMpKSB7 CisJCXByX2VycigiVW5leHBlY3RlZGx5IHN1Y2NlZWRlZCBpbiBpbnNlcnRpbmcgdG9vIGxhcmdl IG9iamVjdCBpbnRvIHNpbmdsZSBwYWdlIGhvbGVcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQln b3RvIG91dDsKKwl9CisKKwkvKiBGaWxsIHRoZSBob2xlLCBmdXJ0aGVyIGFsbG9jYXRpb24gYXR0 ZW1wdHMgc2hvdWxkIHRoZW4gZmFpbCAqLworCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVf aW50ZXJuYWwoaTkxNSwgUEFHRV9TSVpFKTsKKwlpZiAoSVNfRVJSKG9iaikpIHsKKwkJZXJyID0g UFRSX0VSUihvYmopOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBjcmVhdGVfbW1hcF9vZmZz ZXQob2JqKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGluc2VydCBvYmplY3Qg aW50byByZWNsYWltZWQgaG9sZVxuIik7CisJCWdvdG8gZXJyX29iajsKKwl9CisKKwlpZiAoIWFz c2VydF9tbWFwX29mZnNldChpOTE1LCBQQUdFX1NJWkUsIC1FTk9TUEMpKSB7CisJCXByX2Vycigi VW5leHBlY3RlZGx5IHN1Y2NlZWRlZCBpbiBpbnNlcnRpbmcgb2JqZWN0IGludG8gbm8gaG9sZXMh XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnJfb2JqOworCX0KKworCWk5MTVfZ2Vt X29iamVjdF9wdXQob2JqKTsKKworCS8qIE5vdyBmaWxsIHdpdGggYnVzeSBkZWFkIG9iamVjdHMg dGhhdCB3ZSBleHBlY3QgdG8gcmVhcCAqLworCWZvciAobG9vcCA9IDA7IGxvb3AgPCAzOyBsb29w KyspIHsKKwkJaW50ZWxfd2FrZXJlZl90IHdha2VyZWY7CisKKwkJaWYgKGk5MTVfdGVybWluYWxs eV93ZWRnZWQoaTkxNSkpCisJCQlicmVhazsKKworCQlvYmogPSBpOTE1X2dlbV9vYmplY3RfY3Jl YXRlX2ludGVybmFsKGk5MTUsIFBBR0VfU0laRSk7CisJCWlmIChJU19FUlIob2JqKSkgeworCQkJ ZXJyID0gUFRSX0VSUihvYmopOworCQkJZ290byBvdXQ7CisJCX0KKworCQllcnIgPSAwOworCQlt dXRleF9sb2NrKCZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsKKwkJd2l0aF9pbnRlbF9ydW50aW1l X3BtKGk5MTUsIHdha2VyZWYpCisJCQllcnIgPSBtYWtlX29ial9idXN5KG9iaik7CisJCW11dGV4 X3VubG9jaygmaTkxNS0+ZHJtLnN0cnVjdF9tdXRleCk7CisJCWlmIChlcnIpIHsKKwkJCXByX2Vy cigiW2xvb3AgJWRdIEZhaWxlZCB0byBidXN5IHRoZSBvYmplY3RcbiIsIGxvb3ApOworCQkJZ290 byBlcnJfb2JqOworCQl9CisKKwkJLyogTkIgd2UgcmVseSBvbiB0aGUgX2FjdGl2ZV8gcmVmZXJl bmNlIHRvIGFjY2VzcyBvYmogbm93ICovCisJCUdFTV9CVUdfT04oIWk5MTVfZ2VtX29iamVjdF9p c19hY3RpdmUob2JqKSk7CisJCWVyciA9IGNyZWF0ZV9tbWFwX29mZnNldChvYmopOworCQlpZiAo ZXJyKSB7CisJCQlwcl9lcnIoIltsb29wICVkXSBjcmVhdGVfbW1hcF9vZmZzZXQgZmFpbGVkIHdp dGggZXJyPSVkXG4iLAorCQkJICAgICAgIGxvb3AsIGVycik7CisJCQlnb3RvIG91dDsKKwkJfQor CX0KKworb3V0OgorCWRybV9tbV9yZW1vdmVfbm9kZSgmcmVzdik7CitvdXRfcGFyazoKKwltdXRl eF9sb2NrKCZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsKKwlpZiAoLS1pOTE1LT5ndC5hY3RpdmVf cmVxdWVzdHMpCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhpOTE1LT53cSwgJmk5MTUtPmd0LnJldGly ZV93b3JrLCAwKTsKKwllbHNlCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhpOTE1LT53cSwgJmk5MTUt Pmd0LmlkbGVfd29yaywgMCk7CisJbXV0ZXhfdW5sb2NrKCZpOTE1LT5kcm0uc3RydWN0X211dGV4 KTsKKwlpOTE1X2dlbV9zaHJpbmtlcl9yZWdpc3RlcihpOTE1KTsKKwlyZXR1cm4gZXJyOworZXJy X29iajoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJZ290byBvdXQ7Cit9CisKK2ludCBp OTE1X2dlbV9tbWFuX2xpdmVfc2VsZnRlc3RzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1 KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTkxNV9zdWJ0ZXN0IHRlc3RzW10gPSB7CisJCVNV QlRFU1QoaWd0X3BhcnRpYWxfdGlsaW5nKSwKKwkJU1VCVEVTVChpZ3RfbW1hcF9vZmZzZXRfZXho YXVzdGlvbiksCisJfTsKKworCXJldHVybiBpOTE1X3N1YnRlc3RzKHRlc3RzLCBpOTE1KTsKK30K ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmggYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pOTE1X2Rydi5oCmluZGV4IDlmNTgyZjkyYjg5YS4uZjIyMzQ1MGNjNTAwIDEw MDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTI3OTIsNyArMjc5Miw2IEBAIGk5MTVfZ2VtX29i amVjdF9nZ3R0X3BpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkJIHU2NCBm bGFncyk7CiAKIGludCBpOTE1X2dlbV9vYmplY3RfdW5iaW5kKHN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmopOwotdm9pZCBpOTE1X2dlbV9yZWxlYXNlX21tYXAoc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iaik7CiAKIHZvaWQgaTkxNV9nZW1fcnVudGltZV9zdXNwZW5kKHN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCmlu ZGV4IGU5Y2NmYTI3Yzk0Zi4uMzNkZTQ3NmQ2OWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMK QEAgLTQ3NCwxMiArNDc0LDYgQEAgaTkxNV9nZW1fZHVtYl9jcmVhdGUoc3RydWN0IGRybV9maWxl ICpmaWxlLAogCQkJICAgICAgIGFyZ3MtPnNpemUsICZhcmdzLT5oYW5kbGUpOwogfQogCi1zdGF0 aWMgYm9vbCBncHVfd3JpdGVfbmVlZHNfY2xmbHVzaChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqb2JqKQotewotCXJldHVybiAhKG9iai0+Y2FjaGVfbGV2ZWwgPT0gSTkxNV9DQUNIRV9OT05F IHx8Ci0JCSBvYmotPmNhY2hlX2xldmVsID09IEk5MTVfQ0FDSEVfV1QpOwotfQotCiAvKioKICAq IENyZWF0ZXMgYSBuZXcgbW0gb2JqZWN0IGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIGl0LgogICog QGRldjogZHJtIGRldmljZSBwb2ludGVyCkBAIC00OTksMTMgKzQ5Myw2IEBAIGk5MTVfZ2VtX2Ny ZWF0ZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJICAgICAg IGFyZ3MtPnNpemUsICZhcmdzLT5oYW5kbGUpOwogfQogCi1zdGF0aWMgaW5saW5lIGVudW0gZmJf b3Bfb3JpZ2luCi1mYl93cml0ZV9vcmlnaW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aiwgdW5zaWduZWQgaW50IGRvbWFpbikKLXsKLQlyZXR1cm4gKGRvbWFpbiA9PSBJOTE1X0dFTV9E T01BSU5fR1RUID8KLQkJb2JqLT5mcm9udGJ1ZmZlcl9nZ3R0X29yaWdpbiA6IE9SSUdJTl9DUFUp OwotfQotCiB2b2lkIGk5MTVfZ2VtX2ZsdXNoX2dndHRfd3JpdGVzKHN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdikKIHsKIAlpbnRlbF93YWtlcmVmX3Qgd2FrZXJlZjsKQEAgLTU0NSw0 NyArNTMyLDYgQEAgdm9pZCBpOTE1X2dlbV9mbHVzaF9nZ3R0X3dyaXRlcyhzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiAJfQogfQogCi1zdGF0aWMgdm9pZAotZmx1c2hfd3JpdGVf ZG9tYWluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIHVuc2lnbmVkIGludCBmbHVz aF9kb21haW5zKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5 MTUob2JqLT5iYXNlLmRldik7Ci0Jc3RydWN0IGk5MTVfdm1hICp2bWE7Ci0KLQlpZiAoIShvYmot PndyaXRlX2RvbWFpbiAmIGZsdXNoX2RvbWFpbnMpKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKG9i ai0+d3JpdGVfZG9tYWluKSB7Ci0JY2FzZSBJOTE1X0dFTV9ET01BSU5fR1RUOgotCQlpOTE1X2dl bV9mbHVzaF9nZ3R0X3dyaXRlcyhkZXZfcHJpdik7Ci0KLQkJaW50ZWxfZmJfb2JqX2ZsdXNoKG9i aiwKLQkJCQkgICBmYl93cml0ZV9vcmlnaW4ob2JqLCBJOTE1X0dFTV9ET01BSU5fR1RUKSk7Ci0K LQkJZm9yX2VhY2hfZ2d0dF92bWEodm1hLCBvYmopIHsKLQkJCWlmICh2bWEtPmlvbWFwKQotCQkJ CWNvbnRpbnVlOwotCi0JCQlpOTE1X3ZtYV91bnNldF9nZ3R0X3dyaXRlKHZtYSk7Ci0JCX0KLQkJ YnJlYWs7Ci0KLQljYXNlIEk5MTVfR0VNX0RPTUFJTl9XQzoKLQkJd21iKCk7Ci0JCWJyZWFrOwot Ci0JY2FzZSBJOTE1X0dFTV9ET01BSU5fQ1BVOgotCQlpOTE1X2dlbV9jbGZsdXNoX29iamVjdChv YmosIEk5MTVfQ0xGTFVTSF9TWU5DKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEk5MTVfR0VNX0RPTUFJ Tl9SRU5ERVI6Ci0JCWlmIChncHVfd3JpdGVfbmVlZHNfY2xmbHVzaChvYmopKQotCQkJb2JqLT5j YWNoZV9kaXJ0eSA9IHRydWU7Ci0JCWJyZWFrOwotCX0KLQotCW9iai0+d3JpdGVfZG9tYWluID0g MDsKLX0KLQogLyoKICAqIFBpbnMgdGhlIHNwZWNpZmllZCBvYmplY3QncyBwYWdlcyBhbmQgc3lu Y2hyb25pemVzIHRoZSBvYmplY3Qgd2l0aAogICogR1BVIGFjY2Vzc2VzLiBTZXRzIG5lZWRzX2Ns Zmx1c2ggdG8gbm9uLXplcm8gaWYgdGhlIGNhbGxlciBzaG91bGQKQEAgLTYyMiw3ICs1NjgsNyBA QCBpbnQgaTkxNV9nZW1fb2JqX3ByZXBhcmVfc2htZW1fcmVhZChzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqLAogCQkJZ290byBvdXQ7CiAJfQogCi0JZmx1c2hfd3JpdGVfZG9tYWluKG9i aiwgfkk5MTVfR0VNX0RPTUFJTl9DUFUpOworCWk5MTVfZ2VtX29iamVjdF9mbHVzaF93cml0ZV9k b21haW4ob2JqLCB+STkxNV9HRU1fRE9NQUlOX0NQVSk7CiAKIAkvKiBJZiB3ZSdyZSBub3QgaW4g dGhlIGNwdSByZWFkIGRvbWFpbiwgc2V0IG91cnNlbGYgaW50byB0aGUgZ3R0CiAJICogcmVhZCBk b21haW4gYW5kIG1hbnVhbGx5IGZsdXNoIGNhY2hlbGluZXMgKGlmIHJlcXVpcmVkKS4gVGhpcwpA QCAtNjc0LDcgKzYyMCw3IEBAIGludCBpOTE1X2dlbV9vYmpfcHJlcGFyZV9zaG1lbV93cml0ZShz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkJZ290byBvdXQ7CiAJfQogCi0JZmx1 c2hfd3JpdGVfZG9tYWluKG9iaiwgfkk5MTVfR0VNX0RPTUFJTl9DUFUpOworCWk5MTVfZ2VtX29i amVjdF9mbHVzaF93cml0ZV9kb21haW4ob2JqLCB+STkxNV9HRU1fRE9NQUlOX0NQVSk7CiAKIAkv KiBJZiB3ZSdyZSBub3QgaW4gdGhlIGNwdSB3cml0ZSBkb21haW4sIHNldCBvdXJzZWxmIGludG8g dGhlCiAJICogZ3R0IHdyaXRlIGRvbWFpbiBhbmQgbWFudWFsbHkgZmx1c2ggY2FjaGVsaW5lcyAo YXMgcmVxdWlyZWQpLgpAQCAtMTI3Nyw2ICsxMjIzLDEzIEBAIHN0YXRpYyB2b2lkIGk5MTVfZ2Vt X29iamVjdF9idW1wX2luYWN0aXZlX2dndHQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aikKIAlzcGluX3VubG9jaygmaTkxNS0+bW0ub2JqX2xvY2spOwogfQogCitzdGF0aWMgaW5saW5l IGVudW0gZmJfb3Bfb3JpZ2luCitmYl93cml0ZV9vcmlnaW4oc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKm9iaiwgdW5zaWduZWQgaW50IGRvbWFpbikKK3sKKwlyZXR1cm4gKGRvbWFpbiA9PSBJ OTE1X0dFTV9ET01BSU5fR1RUID8KKwkJb2JqLT5mcm9udGJ1ZmZlcl9nZ3R0X29yaWdpbiA6IE9S SUdJTl9DUFUpOworfQorCiAvKioKICAqIENhbGxlZCB3aGVuIHVzZXIgc3BhY2UgcHJlcGFyZXMg dG8gdXNlIGFuIG9iamVjdCB3aXRoIHRoZSBDUFUsIGVpdGhlcgogICogdGhyb3VnaCB0aGUgbW1h cCBpb2N0bCdzIG1hcHBpbmcgb3IgYSBHVFQgbWFwcGluZy4KQEAgLTE0MDAsNDI5ICsxMzUzLDYg QEAgaTkxNV9nZW1fc3dfZmluaXNoX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQg KmRhdGEsCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbAotX192bWFfbWF0Y2hl cyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JICAgICAg dW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JaWYgKHZtYS0+dm1f ZmlsZSAhPSBmaWxwKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4gdm1hLT52bV9zdGFydCA9 PSBhZGRyICYmCi0JICAgICAgICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID09IFBBR0Vf QUxJR04oc2l6ZSk7Ci19Ci0KLS8qKgotICogaTkxNV9nZW1fbW1hcF9pb2N0bCAtIE1hcHMgdGhl IGNvbnRlbnRzIG9mIGFuIG9iamVjdCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzCi0gKgkJCSBpdCBp cyBtYXBwZWQgdG8uCi0gKiBAZGV2OiBkcm0gZGV2aWNlCi0gKiBAZGF0YTogaW9jdGwgZGF0YSBi bG9iCi0gKiBAZmlsZTogZHJtIGZpbGUKLSAqCi0gKiBXaGlsZSB0aGUgbWFwcGluZyBob2xkcyBh IHJlZmVyZW5jZSBvbiB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdCwgaXQgZG9lc24ndAotICog aW1wbHkgYSByZWYgb24gdGhlIG9iamVjdCBpdHNlbGYuCi0gKgotICogSU1QT1JUQU5UOgotICoK LSAqIERSTSBkcml2ZXIgd3JpdGVycyB3aG8gbG9vayBhIHRoaXMgZnVuY3Rpb24gYXMgYW4gZXhh bXBsZSBmb3IgaG93IHRvIGRvIEdFTQotICogbW1hcCBzdXBwb3J0LCBwbGVhc2UgZG9uJ3QgaW1w bGVtZW50IG1tYXAgc3VwcG9ydCBsaWtlIGhlcmUuIFRoZSBtb2Rlcm4gd2F5Ci0gKiB0byBpbXBs ZW1lbnQgRFJNIG1tYXAgc3VwcG9ydCBpcyB3aXRoIGFuIG1tYXAgb2Zmc2V0IGlvY3RsIChsaWtl Ci0gKiBpOTE1X2dlbV9tbWFwX2d0dCkgYW5kIHRoZW4gdXNpbmcgdGhlIG1tYXAgc3lzY2FsbCBv biB0aGUgRFJNIGZkIGRpcmVjdGx5LgotICogVGhhdCB3YXkgZGVidWcgdG9vbGluZyBsaWtlIHZh bGdyaW5kIHdpbGwgdW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgb24sIGhpZGluZwotICogdGhlIG1t YXAgY2FsbCBpbiBhIGRyaXZlciBwcml2YXRlIGlvY3RsIHdpbGwgYnJlYWsgdGhhdC4gVGhlIGk5 MTUgZHJpdmVyIG9ubHkKLSAqIGRvZXMgY3B1IG1tYXBzIHRoaXMgd2F5IGJlY2F1c2Ugd2UgZGlk bid0IGtub3cgYmV0dGVyLgotICovCi1pbnQKLWk5MTVfZ2VtX21tYXBfaW9jdGwoc3RydWN0IGRy bV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkK LXsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXAgKmFyZ3MgPSBkYXRhOwotCXN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0ICpvYmo7Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotCi0JaWYgKGFyZ3Mt PmZsYWdzICYgfihJOTE1X01NQVBfV0MpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChhcmdz LT5mbGFncyAmIEk5MTVfTU1BUF9XQyAmJiAhYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1BBVCkp Ci0JCXJldHVybiAtRU5PREVWOwotCi0Jb2JqID0gaTkxNV9nZW1fb2JqZWN0X2xvb2t1cChmaWxl LCBhcmdzLT5oYW5kbGUpOwotCWlmICghb2JqKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCS8qIHBy aW1lIG9iamVjdHMgaGF2ZSBubyBiYWNraW5nIGZpbHAgdG8gR0VNIG1tYXAKLQkgKiBwYWdlcyBm cm9tLgotCSAqLwotCWlmICghb2JqLT5iYXNlLmZpbHApIHsKLQkJaTkxNV9nZW1fb2JqZWN0X3B1 dChvYmopOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCWFkZHIgPSB2bV9tbWFwKG9iai0+YmFz ZS5maWxwLCAwLCBhcmdzLT5zaXplLAotCQkgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwg TUFQX1NIQVJFRCwKLQkJICAgICAgIGFyZ3MtPm9mZnNldCk7Ci0JaWYgKElTX0VSUl9WQUxVRShh ZGRyKSkKLQkJZ290byBlcnI7Ci0KLQlpZiAoYXJncy0+ZmxhZ3MgJiBJOTE1X01NQVBfV0MpIHsK LQkJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKLQkJc3RydWN0IHZtX2FyZWFf c3RydWN0ICp2bWE7Ci0KLQkJaWYgKGRvd25fd3JpdGVfa2lsbGFibGUoJm1tLT5tbWFwX3NlbSkp IHsKLQkJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKLQkJCXJldHVybiAtRUlOVFI7Ci0JCX0K LQkJdm1hID0gZmluZF92bWEobW0sIGFkZHIpOwotCQlpZiAodm1hICYmIF9fdm1hX21hdGNoZXMo dm1hLCBvYmotPmJhc2UuZmlscCwgYWRkciwgYXJncy0+c2l6ZSkpCi0JCQl2bWEtPnZtX3BhZ2Vf cHJvdCA9Ci0JCQkJcGdwcm90X3dyaXRlY29tYmluZSh2bV9nZXRfcGFnZV9wcm90KHZtYS0+dm1f ZmxhZ3MpKTsKLQkJZWxzZQotCQkJYWRkciA9IC1FTk9NRU07Ci0JCXVwX3dyaXRlKCZtbS0+bW1h cF9zZW0pOwotCQlpZiAoSVNfRVJSX1ZBTFVFKGFkZHIpKQotCQkJZ290byBlcnI7Ci0KLQkJLyog VGhpcyBtYXkgcmFjZSwgYnV0IHRoYXQncyBvaywgaXQgb25seSBnZXRzIHNldCAqLwotCQlXUklU RV9PTkNFKG9iai0+ZnJvbnRidWZmZXJfZ2d0dF9vcmlnaW4sIE9SSUdJTl9DUFUpOwotCX0KLQlp OTE1X2dlbV9vYmplY3RfcHV0KG9iaik7Ci0KLQlhcmdzLT5hZGRyX3B0ciA9ICh1NjQpYWRkcjsK LQotCXJldHVybiAwOwotCi1lcnI6Ci0JaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwotCi0JcmV0 dXJuIGFkZHI7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdGlsZV9yb3dfcGFnZXMoY29uc3Qg c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQlyZXR1cm4gaTkxNV9nZW1fb2Jq ZWN0X2dldF90aWxlX3Jvd19zaXplKG9iaikgPj4gUEFHRV9TSElGVDsKLX0KLQotLyoqCi0gKiBp OTE1X2dlbV9tbWFwX2d0dF92ZXJzaW9uIC0gcmVwb3J0IHRoZSBjdXJyZW50IGZlYXR1cmUgc2V0 IGZvciBHVFQgbW1hcHMKLSAqCi0gKiBBIGhpc3Rvcnkgb2YgdGhlIEdUVCBtbWFwIGludGVyZmFj ZToKLSAqCi0gKiAwIC0gRXZlcnl0aGluZyBoYWQgdG8gZml0IGludG8gdGhlIEdUVC4gQm90aCBw YXJ0aWVzIG9mIGEgbWVtY3B5IGhhZCB0bwotICogICAgIGFsaWduZWQgYW5kIHN1aXRhYmxlIGZv ciBmZW5jaW5nLCBhbmQgc3RpbGwgZml0IGludG8gdGhlIGF2YWlsYWJsZQotICogICAgIG1hcHBh YmxlIHNwYWNlIGxlZnQgYnkgdGhlIHBpbm5lZCBkaXNwbGF5IG9iamVjdHMuIEEgY2xhc3NpYyBw cm9ibGVtCi0gKiAgICAgd2UgY2FsbGVkIHRoZSBwYWdlLWZhdWx0LW9mLWRvb20gd2hlcmUgd2Ug d291bGQgcGluZy1wb25nIGJldHdlZW4KLSAqICAgICB0d28gb2JqZWN0cyB0aGF0IGNvdWxkIG5v dCBmaXQgaW5zaWRlIHRoZSBHVFQgYW5kIHNvIHRoZSBtZW1jcHkKLSAqICAgICB3b3VsZCBwYWdl IG9uZSBvYmplY3QgaW4gYXQgdGhlIGV4cGVuc2Ugb2YgdGhlIG90aGVyIGJldHdlZW4gZXZlcnkK LSAqICAgICBzaW5nbGUgYnl0ZS4KLSAqCi0gKiAxIC0gT2JqZWN0cyBjYW4gYmUgYW55IHNpemUs IGFuZCBoYXZlIGFueSBjb21wYXRpYmxlIGZlbmNpbmcgKFggWSwgb3Igbm9uZQotICogICAgIGFz IHNldCB2aWEgaTkxNV9nZW1fc2V0X3RpbGluZygpIFtEUk1fSTkxNV9HRU1fU0VUX1RJTElOR10p LiBJZiB0aGUKLSAqICAgICBvYmplY3QgaXMgdG9vIGxhcmdlIGZvciB0aGUgYXZhaWxhYmxlIHNw YWNlIChvciBzaW1wbHkgdG9vIGxhcmdlCi0gKiAgICAgZm9yIHRoZSBtYXBwYWJsZSBhcGVydHVy ZSEpLCBhIHZpZXcgaXMgY3JlYXRlZCBpbnN0ZWFkIGFuZCBmYXVsdGVkCi0gKiAgICAgaW50byB1 c2Vyc3BhY2UuIChUaGlzIHZpZXcgaXMgYWxpZ25lZCBhbmQgc2l6ZWQgYXBwcm9wcmlhdGVseSBm b3IKLSAqICAgICBmZW5jZWQgYWNjZXNzLikKLSAqCi0gKiAyIC0gUmVjb2duaXNlIFdDIGFzIGEg c2VwYXJhdGUgY2FjaGUgZG9tYWluIHNvIHRoYXQgd2UgY2FuIGZsdXNoIHRoZQotICogICAgIGRl bGF5ZWQgd3JpdGVzIHZpYSBHVFQgYmVmb3JlIHBlcmZvcm1pbmcgZGlyZWN0IGFjY2VzcyB2aWEg V0MuCi0gKgotICogUmVzdHJpY3Rpb25zOgotICoKLSAqICAqIHNub29wYWJsZSBvYmplY3RzIGNh bm5vdCBiZSBhY2Nlc3NlZCB2aWEgdGhlIEdUVC4gSXQgY2FuIGNhdXNlIG1hY2hpbmUKLSAqICAg IGhhbmdzIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcywgY29ycnVwdGlvbiBvbiBvdGhlcnMuIEFuIGF0 dGVtcHQgdG8gc2VydmljZQotICogICAgYSBHVFQgcGFnZSBmYXVsdCBmcm9tIGEgc25vb3BhYmxl IG9iamVjdCB3aWxsIGdlbmVyYXRlIGEgU0lHQlVTLgotICoKLSAqICAqIHRoZSBvYmplY3QgbXVz dCBiZSBhYmxlIHRvIGZpdCBpbnRvIFJBTSAocGh5c2ljYWwgbWVtb3J5LCB0aG91Z2ggbm8KLSAq ICAgIGxpbWl0ZWQgdG8gdGhlIG1hcHBhYmxlIGFwZXJ0dXJlKS4KLSAqCi0gKgotICogQ2F2ZWF0 czoKLSAqCi0gKiAgKiBhIG5ldyBHVFQgcGFnZSBmYXVsdCB3aWxsIHN5bmNocm9uaXplIHJlbmRl cmluZyBmcm9tIHRoZSBHUFUgYW5kIGZsdXNoCi0gKiAgICBhbGwgZGF0YSB0byBzeXN0ZW0gbWVt b3J5LiBTdWJzZXF1ZW50IGFjY2VzcyB3aWxsIG5vdCBiZSBzeW5jaHJvbml6ZWQuCi0gKgotICog ICogYWxsIG1hcHBpbmdzIGFyZSByZXZva2VkIG9uIHJ1bnRpbWUgZGV2aWNlIHN1c3BlbmQuCi0g KgotICogICogdGhlcmUgYXJlIG9ubHkgOCwgMTYgb3IgMzIgZmVuY2UgcmVnaXN0ZXJzIHRvIHNo YXJlIGJldHdlZW4gYWxsIHVzZXJzCi0gKiAgICAob2xkZXIgbWFjaGluZXMgcmVxdWlyZSBmZW5j ZSByZWdpc3RlciBmb3IgZGlzcGxheSBhbmQgYmxpdHRlciBhY2Nlc3MKLSAqICAgIGFzIHdlbGwp LiBDb250ZW50aW9uIG9mIHRoZSBmZW5jZSByZWdpc3RlcnMgd2lsbCBjYXVzZSB0aGUgcHJldmlv dXMgdXNlcnMKLSAqICAgIHRvIGJlIHVubWFwcGVkIGFuZCBhbnkgbmV3IGFjY2VzcyB3aWxsIGdl bmVyYXRlIG5ldyBwYWdlIGZhdWx0cy4KLSAqCi0gKiAgKiBydW5uaW5nIG91dCBvZiBtZW1vcnkg d2hpbGUgc2VydmljaW5nIGEgZmF1bHQgbWF5IGdlbmVyYXRlIGEgU0lHQlVTLAotICogICAgcmF0 aGVyIHRoYW4gdGhlIGV4cGVjdGVkIFNJR1NFR1YuCi0gKi8KLWludCBpOTE1X2dlbV9tbWFwX2d0 dF92ZXJzaW9uKHZvaWQpCi17Ci0JcmV0dXJuIDI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0 IGk5MTVfZ2d0dF92aWV3Ci1jb21wdXRlX3BhcnRpYWxfdmlldyhjb25zdCBzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqLAotCQkgICAgIHBnb2ZmX3QgcGFnZV9vZmZzZXQsCi0JCSAgICAg dW5zaWduZWQgaW50IGNodW5rKQotewotCXN0cnVjdCBpOTE1X2dndHRfdmlldyB2aWV3OwotCi0J aWYgKGk5MTVfZ2VtX29iamVjdF9pc190aWxlZChvYmopKQotCQljaHVuayA9IHJvdW5kdXAoY2h1 bmssIHRpbGVfcm93X3BhZ2VzKG9iaikpOwotCi0Jdmlldy50eXBlID0gSTkxNV9HR1RUX1ZJRVdf UEFSVElBTDsKLQl2aWV3LnBhcnRpYWwub2Zmc2V0ID0gcm91bmRkb3duKHBhZ2Vfb2Zmc2V0LCBj aHVuayk7Ci0Jdmlldy5wYXJ0aWFsLnNpemUgPQotCQltaW5fdCh1bnNpZ25lZCBpbnQsIGNodW5r LAotCQkgICAgICAob2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVCkgLSB2aWV3LnBhcnRpYWwu b2Zmc2V0KTsKLQotCS8qIElmIHRoZSBwYXJ0aWFsIGNvdmVycyB0aGUgZW50aXJlIG9iamVjdCwg anVzdCBjcmVhdGUgYSBub3JtYWwgVk1BLiAqLwotCWlmIChjaHVuayA+PSBvYmotPmJhc2Uuc2l6 ZSA+PiBQQUdFX1NISUZUKQotCQl2aWV3LnR5cGUgPSBJOTE1X0dHVFRfVklFV19OT1JNQUw7Ci0K LQlyZXR1cm4gdmlldzsKLX0KLQotLyoqCi0gKiBpOTE1X2dlbV9mYXVsdCAtIGZhdWx0IGEgcGFn ZSBpbnRvIHRoZSBHVFQKLSAqIEB2bWY6IGZhdWx0IGluZm8KLSAqCi0gKiBUaGUgZmF1bHQgaGFu ZGxlciBpcyBzZXQgdXAgYnkgZHJtX2dlbV9tbWFwKCkgd2hlbiBhIG9iamVjdCBpcyBHVFQgbWFw cGVkCi0gKiBmcm9tIHVzZXJzcGFjZS4gIFRoZSBmYXVsdCBoYW5kbGVyIHRha2VzIGNhcmUgb2Yg YmluZGluZyB0aGUgb2JqZWN0IHRvCi0gKiB0aGUgR1RUIChpZiBuZWVkZWQpLCBhbGxvY2F0aW5n IGFuZCBwcm9ncmFtbWluZyBhIGZlbmNlIHJlZ2lzdGVyIChhZ2FpbiwKLSAqIG9ubHkgaWYgbmVl ZGVkIGJhc2VkIG9uIHdoZXRoZXIgdGhlIG9sZCByZWcgaXMgc3RpbGwgdmFsaWQgb3IgdGhlIG9i amVjdAotICogaXMgdGlsZWQpIGFuZCBpbnNlcnRpbmcgYSBuZXcgUFRFIGludG8gdGhlIGZhdWx0 aW5nIHByb2Nlc3MuCi0gKgotICogTm90ZSB0aGF0IHRoZSBmYXVsdGluZyBwcm9jZXNzIG1heSBp bnZvbHZlIGV2aWN0aW5nIGV4aXN0aW5nIG9iamVjdHMKLSAqIGZyb20gdGhlIEdUVCBhbmQvb3Ig ZmVuY2UgcmVnaXN0ZXJzIHRvIG1ha2Ugcm9vbS4gIFNvIHBlcmZvcm1hbmNlIG1heQotICogc3Vm ZmVyIGlmIHRoZSBHVFQgd29ya2luZyBzZXQgaXMgbGFyZ2Ugb3IgdGhlcmUgYXJlIGZldyBmZW5j ZSByZWdpc3RlcnMKLSAqIGxlZnQuCi0gKgotICogVGhlIGN1cnJlbnQgZmVhdHVyZSBzZXQgc3Vw cG9ydGVkIGJ5IGk5MTVfZ2VtX2ZhdWx0KCkgYW5kIHRodXMgR1RUIG1tYXBzCi0gKiBpcyBleHBv c2VkIHZpYSBJOTE1X1BBUkFNX01NQVBfR1RUX1ZFUlNJT04gKHNlZSBpOTE1X2dlbV9tbWFwX2d0 dF92ZXJzaW9uKS4KLSAqLwotdm1fZmF1bHRfdCBpOTE1X2dlbV9mYXVsdChzdHJ1Y3Qgdm1fZmF1 bHQgKnZtZikKLXsKLSNkZWZpbmUgTUlOX0NIVU5LX1BBR0VTIChTWl8xTSA+PiBQQUdFX1NISUZU KQotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSA9IHZtZi0+dm1hOwotCXN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0ICpvYmogPSB0b19pbnRlbF9ibyhhcmVhLT52bV9wcml2YXRlX2RhdGEp OwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwotCXN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoZGV2KTsKLQlzdHJ1Y3QgaTkxNV9nZ3R0 ICpnZ3R0ID0gJmRldl9wcml2LT5nZ3R0OwotCWJvb2wgd3JpdGUgPSBhcmVhLT52bV9mbGFncyAm IFZNX1dSSVRFOwotCWludGVsX3dha2VyZWZfdCB3YWtlcmVmOwotCXN0cnVjdCBpOTE1X3ZtYSAq dm1hOwotCXBnb2ZmX3QgcGFnZV9vZmZzZXQ7Ci0JaW50IHNyY3U7Ci0JaW50IHJldDsKLQotCS8q IFNhbml0eSBjaGVjayB0aGF0IHdlIGFsbG93IHdyaXRpbmcgaW50byB0aGlzIG9iamVjdCAqLwot CWlmIChpOTE1X2dlbV9vYmplY3RfaXNfcmVhZG9ubHkob2JqKSAmJiB3cml0ZSkKLQkJcmV0dXJu IFZNX0ZBVUxUX1NJR0JVUzsKLQotCS8qIFdlIGRvbid0IHVzZSB2bWYtPnBnb2ZmIHNpbmNlIHRo YXQgaGFzIHRoZSBmYWtlIG9mZnNldCAqLwotCXBhZ2Vfb2Zmc2V0ID0gKHZtZi0+YWRkcmVzcyAt IGFyZWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUOwotCi0JdHJhY2VfaTkxNV9nZW1fb2JqZWN0 X2ZhdWx0KG9iaiwgcGFnZV9vZmZzZXQsIHRydWUsIHdyaXRlKTsKLQotCS8qIFRyeSB0byBmbHVz aCB0aGUgb2JqZWN0IG9mZiB0aGUgR1BVIGZpcnN0IHdpdGhvdXQgaG9sZGluZyB0aGUgbG9jay4K LQkgKiBVcG9uIGFjcXVpcmluZyB0aGUgbG9jaywgd2Ugd2lsbCBwZXJmb3JtIG91ciBzYW5pdHkg Y2hlY2tzIGFuZCB0aGVuCi0JICogcmVwZWF0IHRoZSBmbHVzaCBob2xkaW5nIHRoZSBsb2NrIGlu IHRoZSBub3JtYWwgbWFubmVyIHRvIGNhdGNoIGNhc2VzCi0JICogd2hlcmUgd2UgYXJlIGdhenVt cGVkLgotCSAqLwotCXJldCA9IGk5MTVfZ2VtX29iamVjdF93YWl0KG9iaiwKLQkJCQkgICBJOTE1 X1dBSVRfSU5URVJSVVBUSUJMRSwKLQkJCQkgICBNQVhfU0NIRURVTEVfVElNRU9VVCk7Ci0JaWYg KHJldCkKLQkJZ290byBlcnI7Ci0KLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9i aik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQl3YWtlcmVmID0gaW50ZWxfcnVudGltZV9w bV9nZXQoZGV2X3ByaXYpOwotCi0Jc3JjdSA9IGk5MTVfcmVzZXRfdHJ5bG9jayhkZXZfcHJpdik7 Ci0JaWYgKHNyY3UgPCAwKSB7Ci0JCXJldCA9IHNyY3U7Ci0JCWdvdG8gZXJyX3JwbTsKLQl9Ci0K LQlyZXQgPSBpOTE1X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZShkZXYpOwotCWlmIChyZXQpCi0J CWdvdG8gZXJyX3Jlc2V0OwotCi0JLyogQWNjZXNzIHRvIHNub29wYWJsZSBwYWdlcyB0aHJvdWdo IHRoZSBHVFQgaXMgaW5jb2hlcmVudC4gKi8KLQlpZiAob2JqLT5jYWNoZV9sZXZlbCAhPSBJOTE1 X0NBQ0hFX05PTkUgJiYgIUhBU19MTEMoZGV2X3ByaXYpKSB7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0J CWdvdG8gZXJyX3VubG9jazsKLQl9Ci0KLQkvKiBOb3cgcGluIGl0IGludG8gdGhlIEdUVCBhcyBu ZWVkZWQgKi8KLQl2bWEgPSBpOTE1X2dlbV9vYmplY3RfZ2d0dF9waW4ob2JqLCBOVUxMLCAwLCAw LAotCQkJCSAgICAgICBQSU5fTUFQUEFCTEUgfAotCQkJCSAgICAgICBQSU5fTk9OQkxPQ0sgfAot CQkJCSAgICAgICBQSU5fTk9ORkFVTFQpOwotCWlmIChJU19FUlIodm1hKSkgewotCQkvKiBVc2Ug YSBwYXJ0aWFsIHZpZXcgaWYgaXQgaXMgYmlnZ2VyIHRoYW4gYXZhaWxhYmxlIHNwYWNlICovCi0J CXN0cnVjdCBpOTE1X2dndHRfdmlldyB2aWV3ID0KLQkJCWNvbXB1dGVfcGFydGlhbF92aWV3KG9i aiwgcGFnZV9vZmZzZXQsIE1JTl9DSFVOS19QQUdFUyk7Ci0JCXVuc2lnbmVkIGludCBmbGFnczsK LQotCQlmbGFncyA9IFBJTl9NQVBQQUJMRTsKLQkJaWYgKHZpZXcudHlwZSA9PSBJOTE1X0dHVFRf VklFV19OT1JNQUwpCi0JCQlmbGFncyB8PSBQSU5fTk9OQkxPQ0s7IC8qIGF2b2lkIHdhcm5pbmdz IGZvciBwaW5uZWQgKi8KLQotCQkvKgotCQkgKiBVc2Vyc3BhY2UgaXMgbm93IHdyaXRpbmcgdGhy b3VnaCBhbiB1bnRyYWNrZWQgVk1BLCBhYmFuZG9uCi0JCSAqIGFsbCBob3BlIHRoYXQgdGhlIGhh cmR3YXJlIGlzIGFibGUgdG8gdHJhY2sgZnV0dXJlIHdyaXRlcy4KLQkJICovCi0JCW9iai0+ZnJv bnRidWZmZXJfZ2d0dF9vcmlnaW4gPSBPUklHSU5fQ1BVOwotCi0JCXZtYSA9IGk5MTVfZ2VtX29i amVjdF9nZ3R0X3BpbihvYmosICZ2aWV3LCAwLCAwLCBmbGFncyk7Ci0JCWlmIChJU19FUlIodm1h KSAmJiAhdmlldy50eXBlKSB7Ci0JCQlmbGFncyA9IFBJTl9NQVBQQUJMRTsKLQkJCXZpZXcudHlw ZSA9IEk5MTVfR0dUVF9WSUVXX1BBUlRJQUw7Ci0JCQl2bWEgPSBpOTE1X2dlbV9vYmplY3RfZ2d0 dF9waW4ob2JqLCAmdmlldywgMCwgMCwgZmxhZ3MpOwotCQl9Ci0JfQotCWlmIChJU19FUlIodm1h KSkgewotCQlyZXQgPSBQVFJfRVJSKHZtYSk7Ci0JCWdvdG8gZXJyX3VubG9jazsKLQl9Ci0KLQly ZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCB3cml0ZSk7Ci0JaWYg KHJldCkKLQkJZ290byBlcnJfdW5waW47Ci0KLQlyZXQgPSBpOTE1X3ZtYV9waW5fZmVuY2Uodm1h KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl91bnBpbjsKLQotCS8qIEZpbmFsbHksIHJlbWFwIGl0 IHVzaW5nIHRoZSBuZXcgR1RUIG9mZnNldCAqLwotCXJldCA9IHJlbWFwX2lvX21hcHBpbmcoYXJl YSwKLQkJCSAgICAgICBhcmVhLT52bV9zdGFydCArICh2bWEtPmdndHRfdmlldy5wYXJ0aWFsLm9m ZnNldCA8PCBQQUdFX1NISUZUKSwKLQkJCSAgICAgICAoZ2d0dC0+Z21hZHIuc3RhcnQgKyB2bWEt Pm5vZGUuc3RhcnQpID4+IFBBR0VfU0hJRlQsCi0JCQkgICAgICAgbWluX3QodTY0LCB2bWEtPnNp emUsIGFyZWEtPnZtX2VuZCAtIGFyZWEtPnZtX3N0YXJ0KSwKLQkJCSAgICAgICAmZ2d0dC0+aW9t YXApOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2ZlbmNlOwotCi0JLyogTWFyayBhcyBiZWluZyBt bWFwcGVkIGludG8gdXNlcnNwYWNlIGZvciBsYXRlciByZXZvY2F0aW9uICovCi0JYXNzZXJ0X3Jw bV93YWtlbG9ja19oZWxkKGRldl9wcml2KTsKLQlpZiAoIWk5MTVfdm1hX3NldF91c2VyZmF1bHQo dm1hKSAmJiAhb2JqLT51c2VyZmF1bHRfY291bnQrKykKLQkJbGlzdF9hZGQoJm9iai0+dXNlcmZh dWx0X2xpbmssICZkZXZfcHJpdi0+bW0udXNlcmZhdWx0X2xpc3QpOwotCUdFTV9CVUdfT04oIW9i ai0+dXNlcmZhdWx0X2NvdW50KTsKLQotCWk5MTVfdm1hX3NldF9nZ3R0X3dyaXRlKHZtYSk7Ci0K LWVycl9mZW5jZToKLQlpOTE1X3ZtYV91bnBpbl9mZW5jZSh2bWEpOwotZXJyX3VucGluOgotCV9f aTkxNV92bWFfdW5waW4odm1hKTsKLWVycl91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPnN0 cnVjdF9tdXRleCk7Ci1lcnJfcmVzZXQ6Ci0JaTkxNV9yZXNldF91bmxvY2soZGV2X3ByaXYsIHNy Y3UpOwotZXJyX3JwbToKLQlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdiwgd2FrZXJlZik7 Ci0JaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7Ci1lcnI6Ci0Jc3dpdGNoIChyZXQp IHsKLQljYXNlIC1FSU86Ci0JCS8qCi0JCSAqIFdlIGVhdCBlcnJvcnMgd2hlbiB0aGUgZ3B1IGlz IHRlcm1pbmFsbHkgd2VkZ2VkIHRvIGF2b2lkCi0JCSAqIHVzZXJzcGFjZSB1bmR1bHkgY3Jhc2hp bmcgKGdsIGhhcyBubyBwcm92aXNpb25zIGZvciBtbWFwcyB0bwotCQkgKiBmYWlsKS4gQnV0IGFu eSBvdGhlciAtRUlPIGlzbid0IG91cnMgKGUuZy4gc3dhcCBpbiBmYWlsdXJlKQotCQkgKiBhbmQg c28gbmVlZHMgdG8gYmUgcmVwb3J0ZWQuCi0JCSAqLwotCQlpZiAoIWk5MTVfdGVybWluYWxseV93 ZWRnZWQoZGV2X3ByaXYpKQotCQkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKLQkJLyogZWxzZTog ZmFsbCB0aHJvdWdoICovCi0JY2FzZSAtRUFHQUlOOgotCQkvKgotCQkgKiBFQUdBSU4gbWVhbnMg dGhlIGdwdSBpcyBodW5nIGFuZCB3ZSdsbCB3YWl0IGZvciB0aGUgZXJyb3IKLQkJICogaGFuZGxl ciB0byByZXNldCBldmVyeXRoaW5nIHdoZW4gcmUtZmF1bHRpbmcgaW4KLQkJICogaTkxNV9tdXRl eF9sb2NrX2ludGVycnVwdGlibGUuCi0JCSAqLwotCWNhc2UgMDoKLQljYXNlIC1FUkVTVEFSVFNZ UzoKLQljYXNlIC1FSU5UUjoKLQljYXNlIC1FQlVTWToKLQkJLyoKLQkJICogRUJVU1kgaXMgb2s6 IHRoaXMganVzdCBtZWFucyB0aGF0IGFub3RoZXIgdGhyZWFkCi0JCSAqIGFscmVhZHkgZGlkIHRo ZSBqb2IuCi0JCSAqLwotCQlyZXR1cm4gVk1fRkFVTFRfTk9QQUdFOwotCWNhc2UgLUVOT01FTToK LQkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKLQljYXNlIC1FTk9TUEM6Ci0JY2FzZSAtRUZBVUxUOgot CQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOwotCWRlZmF1bHQ6Ci0JCVdBUk5fT05DRShyZXQsICJ1 bmhhbmRsZWQgZXJyb3IgaW4gaTkxNV9nZW1fZmF1bHQ6ICVpXG4iLCByZXQpOwotCQlyZXR1cm4g Vk1fRkFVTFRfU0lHQlVTOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX19pOTE1X2dlbV9vYmplY3Rf cmVsZWFzZV9tbWFwKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCi17Ci0Jc3RydWN0 IGk5MTVfdm1hICp2bWE7Ci0KLQlHRU1fQlVHX09OKCFvYmotPnVzZXJmYXVsdF9jb3VudCk7Ci0K LQlvYmotPnVzZXJmYXVsdF9jb3VudCA9IDA7Ci0JbGlzdF9kZWwoJm9iai0+dXNlcmZhdWx0X2xp bmspOwotCWRybV92bWFfbm9kZV91bm1hcCgmb2JqLT5iYXNlLnZtYV9ub2RlLAotCQkJICAgb2Jq LT5iYXNlLmRldi0+YW5vbl9pbm9kZS0+aV9tYXBwaW5nKTsKLQotCWZvcl9lYWNoX2dndHRfdm1h KHZtYSwgb2JqKQotCQlpOTE1X3ZtYV91bnNldF91c2VyZmF1bHQodm1hKTsKLX0KLQotLyoqCi0g KiBpOTE1X2dlbV9yZWxlYXNlX21tYXAgLSByZW1vdmUgcGh5c2ljYWwgcGFnZSBtYXBwaW5ncwot ICogQG9iajogb2JqIGluIHF1ZXN0aW9uCi0gKgotICogUHJlc2VydmUgdGhlIHJlc2VydmF0aW9u IG9mIHRoZSBtbWFwcGluZyB3aXRoIHRoZSBEUk0gY29yZSBjb2RlLCBidXQKLSAqIHJlbGlucXVp c2ggb3duZXJzaGlwIG9mIHRoZSBwYWdlcyBiYWNrIHRvIHRoZSBzeXN0ZW0uCi0gKgotICogSXQg aXMgdml0YWwgdGhhdCB3ZSByZW1vdmUgdGhlIHBhZ2UgbWFwcGluZyBpZiB3ZSBoYXZlIG1hcHBl ZCBhIHRpbGVkCi0gKiBvYmplY3QgdGhyb3VnaCB0aGUgR1RUIGFuZCB0aGVuIGxvc2UgdGhlIGZl bmNlIHJlZ2lzdGVyIGR1ZSB0bwotICogcmVzb3VyY2UgcHJlc3N1cmUuIFNpbWlsYXJseSBpZiB0 aGUgb2JqZWN0IGhhcyBiZWVuIG1vdmVkIG91dCBvZiB0aGUKLSAqIGFwZXJ0dXJlLCB0aGFuIHBh Z2VzIG1hcHBlZCBpbnRvIHVzZXJzcGFjZSBtdXN0IGJlIHJldm9rZWQuIFJlbW92aW5nIHRoZQot ICogbWFwcGluZyB3aWxsIHRoZW4gdHJpZ2dlciBhIHBhZ2UgZmF1bHQgb24gdGhlIG5leHQgdXNl ciBhY2Nlc3MsIGFsbG93aW5nCi0gKiBmaXh1cCBieSBpOTE1X2dlbV9mYXVsdCgpLgotICovCi12 b2lkCi1pOTE1X2dlbV9yZWxlYXNlX21tYXAoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aikKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5MTUob2JqLT5iYXNl LmRldik7Ci0JaW50ZWxfd2FrZXJlZl90IHdha2VyZWY7Ci0KLQkvKiBTZXJpYWxpc2F0aW9uIGJl dHdlZW4gdXNlciBHVFQgYWNjZXNzIGFuZCBvdXIgY29kZSBkZXBlbmRzIHVwb24KLQkgKiByZXZv a2luZyB0aGUgQ1BVJ3MgUFRFIHdoaWxzdCB0aGUgbXV0ZXggaXMgaGVsZC4gVGhlIG5leHQgdXNl cgotCSAqIHBhZ2VmYXVsdCB0aGVuIGhhcyB0byB3YWl0IHVudGlsIHdlIHJlbGVhc2UgdGhlIG11 dGV4LgotCSAqCi0JICogTm90ZSB0aGF0IFJQTSBjb21wbGljYXRlcyBzb21ld2hhdCBieSBhZGRp bmcgYW4gYWRkaXRpb25hbAotCSAqIHJlcXVpcmVtZW50IHRoYXQgb3BlcmF0aW9ucyB0byB0aGUg R0dUVCBiZSBtYWRlIGhvbGRpbmcgdGhlIFJQTQotCSAqIHdha2VyZWYuCi0JICovCi0JbG9ja2Rl cF9hc3NlcnRfaGVsZCgmaTkxNS0+ZHJtLnN0cnVjdF9tdXRleCk7Ci0Jd2FrZXJlZiA9IGludGVs X3J1bnRpbWVfcG1fZ2V0KGk5MTUpOwotCi0JaWYgKCFvYmotPnVzZXJmYXVsdF9jb3VudCkKLQkJ Z290byBvdXQ7Ci0KLQlfX2k5MTVfZ2VtX29iamVjdF9yZWxlYXNlX21tYXAob2JqKTsKLQotCS8q IEVuc3VyZSB0aGF0IHRoZSBDUFUncyBQVEUgYXJlIHJldm9rZWQgYW5kIHRoZXJlIGFyZSBub3Qg b3V0c3RhbmRpbmcKLQkgKiBtZW1vcnkgdHJhbnNhY3Rpb25zIGZyb20gdXNlcnNwYWNlIGJlZm9y ZSB3ZSByZXR1cm4uIFRoZSBUTEIKLQkgKiBmbHVzaGluZyBpbXBsaWVkIGFib3ZlIGJ5IGNoYW5n aW5nIHRoZSBQVEUgYWJvdmUgKnNob3VsZCogYmUKLQkgKiBzdWZmaWNpZW50LCBhbiBleHRyYSBi YXJyaWVyIGhlcmUganVzdCBwcm92aWRlcyB1cyB3aXRoIGEgYml0Ci0JICogb2YgcGFyYW5vaWQg ZG9jdW1lbnRhdGlvbiBhYm91dCBvdXIgcmVxdWlyZW1lbnQgdG8gc2VyaWFsaXNlCi0JICogbWVt b3J5IHdyaXRlcyBiZWZvcmUgdG91Y2hpbmcgcmVnaXN0ZXJzIC8gR1NNLgotCSAqLwotCXdtYigp OwotCi1vdXQ6Ci0JaW50ZWxfcnVudGltZV9wbV9wdXQoaTkxNSwgd2FrZXJlZik7Ci19Ci0KIHZv aWQgaTkxNV9nZW1fcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCAqb247CkBAIC0xODY1 LDc4ICsxMzk1LDYgQEAgdm9pZCBpOTE1X2dlbV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2KQogCX0KIH0KIAotc3RhdGljIGludCBpOTE1X2dlbV9vYmpl Y3RfY3JlYXRlX21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCi17 Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShvYmotPmJhc2Uu ZGV2KTsKLQlpbnQgZXJyOwotCi0JZXJyID0gZHJtX2dlbV9jcmVhdGVfbW1hcF9vZmZzZXQoJm9i ai0+YmFzZSk7Ci0JaWYgKGxpa2VseSghZXJyKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBBdHRlbXB0 IHRvIHJlYXAgc29tZSBtbWFwIHNwYWNlIGZyb20gZGVhZCBvYmplY3RzICovCi0JZG8gewotCQll cnIgPSBpOTE1X2dlbV93YWl0X2Zvcl9pZGxlKGRldl9wcml2LAotCQkJCQkgICAgIEk5MTVfV0FJ VF9JTlRFUlJVUFRJQkxFLAotCQkJCQkgICAgIE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKLQkJaWYg KGVycikKLQkJCWJyZWFrOwotCi0JCWk5MTVfZ2VtX2RyYWluX2ZyZWVkX29iamVjdHMoZGV2X3By aXYpOwotCQllcnIgPSBkcm1fZ2VtX2NyZWF0ZV9tbWFwX29mZnNldCgmb2JqLT5iYXNlKTsKLQkJ aWYgKCFlcnIpCi0JCQlicmVhazsKLQotCX0gd2hpbGUgKGZsdXNoX2RlbGF5ZWRfd29yaygmZGV2 X3ByaXYtPmd0LnJldGlyZV93b3JrKSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1pbnQKLWk5MTVf Z2VtX21tYXBfZ3R0KHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKLQkJICBzdHJ1Y3QgZHJtX2Rldmlj ZSAqZGV2LAotCQkgIHUzMiBoYW5kbGUsCi0JCSAgdTY0ICpvZmZzZXQpCi17Ci0Jc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iajsKLQlpbnQgcmV0OwotCi0Jb2JqID0gaTkxNV9nZW1fb2Jq ZWN0X2xvb2t1cChmaWxlLCBoYW5kbGUpOwotCWlmICghb2JqKQotCQlyZXR1cm4gLUVOT0VOVDsK LQotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfbW1hcF9vZmZzZXQob2JqKTsKLQlpZiAo cmV0ID09IDApCi0JCSpvZmZzZXQgPSBkcm1fdm1hX25vZGVfb2Zmc2V0X2FkZHIoJm9iai0+YmFz ZS52bWFfbm9kZSk7Ci0KLQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7Ci0JcmV0dXJuIHJldDsK LX0KLQotLyoqCi0gKiBpOTE1X2dlbV9tbWFwX2d0dF9pb2N0bCAtIHByZXBhcmUgYW4gb2JqZWN0 IGZvciBHVFQgbW1hcCdpbmcKLSAqIEBkZXY6IERSTSBkZXZpY2UKLSAqIEBkYXRhOiBHVFQgbWFw cGluZyBpb2N0bCBkYXRhCi0gKiBAZmlsZTogR0VNIG9iamVjdCBpbmZvCi0gKgotICogU2ltcGx5 IHJldHVybnMgdGhlIGZha2Ugb2Zmc2V0IHRvIHVzZXJzcGFjZSBzbyBpdCBjYW4gbW1hcCBpdC4K LSAqIFRoZSBtbWFwIGNhbGwgd2lsbCBlbmQgdXAgaW4gZHJtX2dlbV9tbWFwKCksIHdoaWNoIHdp bGwgc2V0IHRoaW5ncwotICogdXAgc28gd2UgY2FuIGdldCBmYXVsdHMgaW4gdGhlIGhhbmRsZXIg YWJvdmUuCi0gKgotICogVGhlIGZhdWx0IGhhbmRsZXIgd2lsbCB0YWtlIGNhcmUgb2YgYmluZGlu ZyB0aGUgb2JqZWN0IGludG8gdGhlIEdUVAotICogKHNpbmNlIGl0IG1heSBoYXZlIGJlZW4gZXZp Y3RlZCB0byBtYWtlIHJvb20gZm9yIHNvbWV0aGluZyksIGFsbG9jYXRpbmcKLSAqIGEgZmVuY2Ug cmVnaXN0ZXIsIGFuZCBtYXBwaW5nIHRoZSBhcHByb3ByaWF0ZSBhcGVydHVyZSBhZGRyZXNzIGlu dG8KLSAqIHVzZXJzcGFjZS4KLSAqLwotaW50Ci1pOTE1X2dlbV9tbWFwX2d0dF9pb2N0bChzdHJ1 Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkJc3RydWN0IGRybV9maWxlICpmaWxl KQotewotCXN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcF9ndHQgKmFyZ3MgPSBkYXRhOwotCi0JcmV0 dXJuIGk5MTVfZ2VtX21tYXBfZ3R0KGZpbGUsIGRldiwgYXJncy0+aGFuZGxlLCAmYXJncy0+b2Zm c2V0KTsKLX0KLQogYm9vbCBpOTE1X3NnX3RyaW0oc3RydWN0IHNnX3RhYmxlICpvcmlnX3N0KQog ewogCXN0cnVjdCBzZ190YWJsZSBuZXdfc3Q7CkBAIC0yMjY4LDcgKzE3MjYsNyBAQCBzdGF0aWMg dm9pZCBfX2k5MTVfZ2VtX29iamVjdF9mbHVzaF9mb3JfZGlzcGxheShzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqKQogCSAqIFdlIG1hbnVhbGx5IGZsdXNoIHRoZSBDUFUgZG9tYWluIHNv IHRoYXQgd2UgY2FuIG92ZXJyaWRlIGFuZAogCSAqIGZvcmNlIHRoZSBmbHVzaCBmb3IgdGhlIGRp c3BsYXksIGFuZCBwZXJmb3JtIGl0IGFzeW5jcmhvbm91c2x5LgogCSAqLwotCWZsdXNoX3dyaXRl X2RvbWFpbihvYmosIH5JOTE1X0dFTV9ET01BSU5fQ1BVKTsKKwlpOTE1X2dlbV9vYmplY3RfZmx1 c2hfd3JpdGVfZG9tYWluKG9iaiwgfkk5MTVfR0VNX0RPTUFJTl9DUFUpOwogCWlmIChvYmotPmNh Y2hlX2RpcnR5KQogCQlpOTE1X2dlbV9jbGZsdXNoX29iamVjdChvYmosIEk5MTVfQ0xGTFVTSF9G T1JDRSk7CiAJb2JqLT53cml0ZV9kb21haW4gPSAwOwpAQCAtMjMyMiw3ICsxNzgwLDcgQEAgaTkx NV9nZW1fb2JqZWN0X3NldF90b193Y19kb21haW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iaiwgYm9vbCB3cml0ZSkKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JZmx1c2hfd3Jp dGVfZG9tYWluKG9iaiwgfkk5MTVfR0VNX0RPTUFJTl9XQyk7CisJaTkxNV9nZW1fb2JqZWN0X2Zs dXNoX3dyaXRlX2RvbWFpbihvYmosIH5JOTE1X0dFTV9ET01BSU5fV0MpOwogCiAJLyogU2VyaWFs aXNlIGRpcmVjdCBhY2Nlc3MgdG8gdGhpcyBvYmplY3Qgd2l0aCB0aGUgYmFycmllcnMgZm9yCiAJ ICogY29oZXJlbnQgd3JpdGVzIGZyb20gdGhlIEdQVSwgYnkgZWZmZWN0aXZlbHkgaW52YWxpZGF0 aW5nIHRoZQpAQCAtMjM4NCw3ICsxODQyLDcgQEAgaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRf ZG9tYWluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIGJvb2wgd3JpdGUpCiAJaWYg KHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWZsdXNoX3dyaXRlX2RvbWFpbihvYmosIH5JOTE1X0dF TV9ET01BSU5fR1RUKTsKKwlpOTE1X2dlbV9vYmplY3RfZmx1c2hfd3JpdGVfZG9tYWluKG9iaiwg fkk5MTVfR0VNX0RPTUFJTl9HVFQpOwogCiAJLyogU2VyaWFsaXNlIGRpcmVjdCBhY2Nlc3MgdG8g dGhpcyBvYmplY3Qgd2l0aCB0aGUgYmFycmllcnMgZm9yCiAJICogY29oZXJlbnQgd3JpdGVzIGZy b20gdGhlIEdQVSwgYnkgZWZmZWN0aXZlbHkgaW52YWxpZGF0aW5nIHRoZQpAQCAtMjQ5Myw3ICsx OTUxLDcgQEAgaW50IGk5MTVfZ2VtX29iamVjdF9zZXRfY2FjaGVfbGV2ZWwoc3RydWN0IGRybV9p OTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCSAqIHRoZW4gZG91YmxlIGNoZWNrIGlmIHRoZSBHVFQg bWFwcGluZyBpcyBzdGlsbAogCQkJICogdmFsaWQgZm9yIHRoYXQgcG9pbnRlciBhY2Nlc3MuCiAJ CQkgKi8KLQkJCWk5MTVfZ2VtX3JlbGVhc2VfbW1hcChvYmopOworCQkJaTkxNV9nZW1fb2JqZWN0 X3JlbGVhc2VfbW1hcChvYmopOwogCiAJCQkvKiBBcyB3ZSBubyBsb25nZXIgbmVlZCBhIGZlbmNl IGZvciBHVFQgYWNjZXNzLAogCQkJICogd2UgY2FuIHJlbGlucXVpc2ggaXQgbm93IChhbmQgc28g cHJldmVudCBoYXZpbmcKQEAgLTI3NDgsNyArMjIwNiw3IEBAIGk5MTVfZ2VtX29iamVjdF9zZXRf dG9fY3B1X2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBib29sIHdyaXRl KQogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlmbHVzaF93cml0ZV9kb21haW4ob2JqLCB+ STkxNV9HRU1fRE9NQUlOX0NQVSk7CisJaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX3dyaXRlX2RvbWFp bihvYmosIH5JOTE1X0dFTV9ET01BSU5fQ1BVKTsKIAogCS8qIEZsdXNoIHRoZSBDUFUgY2FjaGUg aWYgaXQncyBzdGlsbCBpbnZhbGlkLiAqLwogCWlmICgob2JqLT5yZWFkX2RvbWFpbnMgJiBJOTE1 X0dFTV9ET01BSU5fQ1BVKSA9PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pOTE1X2dlbV90aWxpbmcuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGlu Zy5jCmluZGV4IDg2NzVhNmUyNDc4OC4uOGNlM2EzMGZiMGExIDEwMDY0NAotLS0gYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X2dlbV90aWxpbmcuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pOTE1X2dlbV90aWxpbmcuYwpAQCAtMjk5LDcgKzI5OSw3IEBAIGk5MTVfZ2VtX29iamVjdF9z ZXRfdGlsaW5nKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJaTkxNV9nZW1fb2Jq ZWN0X3VubG9jayhvYmopOwogCiAJLyogRm9yY2UgdGhlIGZlbmNlIHRvIGJlIHJlYWNxdWlyZWQg Zm9yIEdUVCBhY2Nlc3MgKi8KLQlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2JqKTsKKwlpOTE1X2dl bV9vYmplY3RfcmVsZWFzZV9tbWFwKG9iaik7CiAKIAkvKiBUcnkgdG8gcHJlYWxsb2NhdGUgbWVt b3J5IHJlcXVpcmVkIHRvIHNhdmUgc3dpenpsaW5nIG9uIHB1dC1wYWdlcyAqLwogCWlmIChpOTE1 X2dlbV9vYmplY3RfbmVlZHNfYml0MTdfc3dpenpsZShvYmopKSB7CmRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9nZW1fb2JqZWN0LmMgYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9nZW1fb2JqZWN0LmMKaW5kZXggYWI2YWU5ZWNmMDNi Li5lNGIyZWU0YzU0ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0 cy9pOTE1X2dlbV9vYmplY3QuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMv aTkxNV9nZW1fb2JqZWN0LmMKQEAgLTg4LDQ5MyArODgsNiBAQCBzdGF0aWMgaW50IGlndF9nZW1f aHVnZSh2b2lkICphcmcpCiAJcmV0dXJuIGVycjsKIH0KIAotc3RydWN0IHRpbGUgewotCXVuc2ln bmVkIGludCB3aWR0aDsKLQl1bnNpZ25lZCBpbnQgaGVpZ2h0OwotCXVuc2lnbmVkIGludCBzdHJp ZGU7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0JdW5zaWduZWQgaW50IHRpbGluZzsKLQl1bnNpZ25l ZCBpbnQgc3dpenpsZTsKLX07Ci0KLXN0YXRpYyB1NjQgc3dpenpsZV9iaXQodW5zaWduZWQgaW50 IGJpdCwgdTY0IG9mZnNldCkKLXsKLQlyZXR1cm4gKG9mZnNldCAmIEJJVF9VTEwoYml0KSkgPj4g KGJpdCAtIDYpOwotfQotCi1zdGF0aWMgdTY0IHRpbGVkX29mZnNldChjb25zdCBzdHJ1Y3QgdGls ZSAqdGlsZSwgdTY0IHYpCi17Ci0JdTY0IHgsIHk7Ci0KLQlpZiAodGlsZS0+dGlsaW5nID09IEk5 MTVfVElMSU5HX05PTkUpCi0JCXJldHVybiB2OwotCi0JeSA9IGRpdjY0X3U2NF9yZW0odiwgdGls ZS0+c3RyaWRlLCAmeCk7Ci0JdiA9IGRpdjY0X3U2NF9yZW0oeSwgdGlsZS0+aGVpZ2h0LCAmeSkg KiB0aWxlLT5zdHJpZGUgKiB0aWxlLT5oZWlnaHQ7Ci0KLQlpZiAodGlsZS0+dGlsaW5nID09IEk5 MTVfVElMSU5HX1gpIHsKLQkJdiArPSB5ICogdGlsZS0+d2lkdGg7Ci0JCXYgKz0gZGl2NjRfdTY0 X3JlbSh4LCB0aWxlLT53aWR0aCwgJngpIDw8IHRpbGUtPnNpemU7Ci0JCXYgKz0geDsKLQl9IGVs c2UgaWYgKHRpbGUtPndpZHRoID09IDEyOCkgewotCQljb25zdCB1bnNpZ25lZCBpbnQgeXRpbGVf c3BhbiA9IDE2OwotCQljb25zdCB1bnNpZ25lZCBpbnQgeXRpbGVfaGVpZ2h0ID0gNTEyOwotCi0J CXYgKz0geSAqIHl0aWxlX3NwYW47Ci0JCXYgKz0gZGl2NjRfdTY0X3JlbSh4LCB5dGlsZV9zcGFu LCAmeCkgKiB5dGlsZV9oZWlnaHQ7Ci0JCXYgKz0geDsKLQl9IGVsc2UgewotCQljb25zdCB1bnNp Z25lZCBpbnQgeXRpbGVfc3BhbiA9IDMyOwotCQljb25zdCB1bnNpZ25lZCBpbnQgeXRpbGVfaGVp Z2h0ID0gMjU2OwotCi0JCXYgKz0geSAqIHl0aWxlX3NwYW47Ci0JCXYgKz0gZGl2NjRfdTY0X3Jl bSh4LCB5dGlsZV9zcGFuLCAmeCkgKiB5dGlsZV9oZWlnaHQ7Ci0JCXYgKz0geDsKLQl9Ci0KLQlz d2l0Y2ggKHRpbGUtPnN3aXp6bGUpIHsKLQljYXNlIEk5MTVfQklUXzZfU1dJWlpMRV85OgotCQl2 IF49IHN3aXp6bGVfYml0KDksIHYpOwotCQlicmVhazsKLQljYXNlIEk5MTVfQklUXzZfU1dJWlpM RV85XzEwOgotCQl2IF49IHN3aXp6bGVfYml0KDksIHYpIF4gc3dpenpsZV9iaXQoMTAsIHYpOwot CQlicmVhazsKLQljYXNlIEk5MTVfQklUXzZfU1dJWlpMRV85XzExOgotCQl2IF49IHN3aXp6bGVf Yml0KDksIHYpIF4gc3dpenpsZV9iaXQoMTEsIHYpOwotCQlicmVhazsKLQljYXNlIEk5MTVfQklU XzZfU1dJWlpMRV85XzEwXzExOgotCQl2IF49IHN3aXp6bGVfYml0KDksIHYpIF4gc3dpenpsZV9i aXQoMTAsIHYpIF4gc3dpenpsZV9iaXQoMTEsIHYpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4g djsKLX0KLQotc3RhdGljIGludCBjaGVja19wYXJ0aWFsX21hcHBpbmcoc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iaiwKLQkJCQkgY29uc3Qgc3RydWN0IHRpbGUgKnRpbGUsCi0JCQkJIHVu c2lnbmVkIGxvbmcgZW5kX3RpbWUpCi17Ci0JY29uc3QgdW5zaWduZWQgaW50IG5yZWFsID0gb2Jq LT5zY3JhdGNoIC8gUEFHRV9TSVpFOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gb2Jq LT5iYXNlLnNpemUgLyBQQUdFX1NJWkU7Ci0Jc3RydWN0IGk5MTVfdm1hICp2bWE7Ci0JdW5zaWdu ZWQgbG9uZyBwYWdlOwotCWludCBlcnI7Ci0KLQlpZiAoaWd0X3RpbWVvdXQoZW5kX3RpbWUsCi0J CQkiJXM6IHRpbWVkIG91dCBiZWZvcmUgdGlsaW5nPSVkIHN0cmlkZT0lZFxuIiwKLQkJCV9fZnVu Y19fLCB0aWxlLT50aWxpbmcsIHRpbGUtPnN0cmlkZSkpCi0JCXJldHVybiAtRUlOVFI7Ci0KLQll cnIgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RpbGluZyhvYmosIHRpbGUtPnRpbGluZywgdGlsZS0+ c3RyaWRlKTsKLQlpZiAoZXJyKSB7Ci0JCXByX2VycigiRmFpbGVkIHRvIHNldCB0aWxpbmcgbW9k ZT0ldSwgc3RyaWRlPSV1LCBlcnI9JWRcbiIsCi0JCSAgICAgICB0aWxlLT50aWxpbmcsIHRpbGUt PnN0cmlkZSwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlHRU1fQlVHX09OKGk5MTVfZ2Vt X29iamVjdF9nZXRfdGlsaW5nKG9iaikgIT0gdGlsZS0+dGlsaW5nKTsKLQlHRU1fQlVHX09OKGk5 MTVfZ2VtX29iamVjdF9nZXRfc3RyaWRlKG9iaikgIT0gdGlsZS0+c3RyaWRlKTsKLQotCWZvcl9l YWNoX3ByaW1lX251bWJlcl9mcm9tKHBhZ2UsIDEsIG5wYWdlcykgewotCQlzdHJ1Y3QgaTkxNV9n Z3R0X3ZpZXcgdmlldyA9Ci0JCQljb21wdXRlX3BhcnRpYWxfdmlldyhvYmosIHBhZ2UsIE1JTl9D SFVOS19QQUdFUyk7Ci0JCXUzMiBfX2lvbWVtICppbzsKLQkJc3RydWN0IHBhZ2UgKnA7Ci0JCXVu c2lnbmVkIGludCBuOwotCQl1NjQgb2Zmc2V0OwotCQl1MzIgKmNwdTsKLQotCQlHRU1fQlVHX09O KHZpZXcucGFydGlhbC5zaXplID4gbnJlYWwpOwotCQljb25kX3Jlc2NoZWQoKTsKLQotCQllcnIg PSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCB0cnVlKTsKLQkJaWYgKGVy cikgewotCQkJcHJfZXJyKCJGYWlsZWQgdG8gZmx1c2ggdG8gR1RUIHdyaXRlIGRvbWFpbjsgZXJy PSVkXG4iLAotCQkJICAgICAgIGVycik7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0KLQkJdm1hID0g aTkxNV9nZW1fb2JqZWN0X2dndHRfcGluKG9iaiwgJnZpZXcsIDAsIDAsIFBJTl9NQVBQQUJMRSk7 Ci0JCWlmIChJU19FUlIodm1hKSkgewotCQkJcHJfZXJyKCJGYWlsZWQgdG8gcGluIHBhcnRpYWwg dmlldzogb2Zmc2V0PSVsdTsgZXJyPSVkXG4iLAotCQkJICAgICAgIHBhZ2UsIChpbnQpUFRSX0VS Uih2bWEpKTsKLQkJCXJldHVybiBQVFJfRVJSKHZtYSk7Ci0JCX0KLQotCQluID0gcGFnZSAtIHZp ZXcucGFydGlhbC5vZmZzZXQ7Ci0JCUdFTV9CVUdfT04obiA+PSB2aWV3LnBhcnRpYWwuc2l6ZSk7 Ci0KLQkJaW8gPSBpOTE1X3ZtYV9waW5faW9tYXAodm1hKTsKLQkJaTkxNV92bWFfdW5waW4odm1h KTsKLQkJaWYgKElTX0VSUihpbykpIHsKLQkJCXByX2VycigiRmFpbGVkIHRvIGlvbWFwIHBhcnRp YWwgdmlldzogb2Zmc2V0PSVsdTsgZXJyPSVkXG4iLAotCQkJICAgICAgIHBhZ2UsIChpbnQpUFRS X0VSUihpbykpOwotCQkJcmV0dXJuIFBUUl9FUlIoaW8pOwotCQl9Ci0KLQkJaW93cml0ZTMyKHBh Z2UsIGlvICsgbiAqIFBBR0VfU0laRS9zaXplb2YoKmlvKSk7Ci0JCWk5MTVfdm1hX3VucGluX2lv bWFwKHZtYSk7Ci0KLQkJb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0KHRpbGUsIHBhZ2UgPDwgUEFHRV9T SElGVCk7Ci0JCWlmIChvZmZzZXQgPj0gb2JqLT5iYXNlLnNpemUpCi0JCQljb250aW51ZTsKLQot CQlmbHVzaF93cml0ZV9kb21haW4ob2JqLCB+STkxNV9HRU1fRE9NQUlOX0NQVSk7Ci0KLQkJcCA9 IGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZShvYmosIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKLQkJ Y3B1ID0ga21hcChwKSArIG9mZnNldF9pbl9wYWdlKG9mZnNldCk7Ci0JCWRybV9jbGZsdXNoX3Zp cnRfcmFuZ2UoY3B1LCBzaXplb2YoKmNwdSkpOwotCQlpZiAoKmNwdSAhPSAodTMyKXBhZ2UpIHsK LQkJCXByX2VycigiUGFydGlhbCB2aWV3IGZvciAlbHUgWyV1XSAob2Zmc2V0PSVsbHUsIHNpemU9 JXUgWyVsbHUsIHJvdyBzaXplICV1XSwgZmVuY2U9JWQsIHRpbGluZz0lZCwgc3RyaWRlPSVkKSBt aXNhbGlnbm1lbnQsIGV4cGVjdGVkIHdyaXRlIHRvIHBhZ2UgKCVsbHUgKyAldSBbMHglbGx4XSkg b2YgMHgleCwgZm91bmQgMHgleFxuIiwKLQkJCSAgICAgICBwYWdlLCBuLAotCQkJICAgICAgIHZp ZXcucGFydGlhbC5vZmZzZXQsCi0JCQkgICAgICAgdmlldy5wYXJ0aWFsLnNpemUsCi0JCQkgICAg ICAgdm1hLT5zaXplID4+IFBBR0VfU0hJRlQsCi0JCQkgICAgICAgdGlsZS0+dGlsaW5nID8gdGls ZV9yb3dfcGFnZXMob2JqKSA6IDAsCi0JCQkgICAgICAgdm1hLT5mZW5jZSA/IHZtYS0+ZmVuY2Ut PmlkIDogLTEsIHRpbGUtPnRpbGluZywgdGlsZS0+c3RyaWRlLAotCQkJICAgICAgIG9mZnNldCA+ PiBQQUdFX1NISUZULAotCQkJICAgICAgICh1bnNpZ25lZCBpbnQpb2Zmc2V0X2luX3BhZ2Uob2Zm c2V0KSwKLQkJCSAgICAgICBvZmZzZXQsCi0JCQkgICAgICAgKHUzMilwYWdlLCAqY3B1KTsKLQkJ CWVyciA9IC1FSU5WQUw7Ci0JCX0KLQkJKmNwdSA9IDA7Ci0JCWRybV9jbGZsdXNoX3ZpcnRfcmFu Z2UoY3B1LCBzaXplb2YoKmNwdSkpOwotCQlrdW5tYXAocCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1 cm4gZXJyOwotCi0JCWk5MTVfdm1hX2Rlc3Ryb3kodm1hKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0K LQotc3RhdGljIGludCBpZ3RfcGFydGlhbF90aWxpbmcodm9pZCAqYXJnKQotewotCWNvbnN0IHVu c2lnbmVkIGludCBucmVhbCA9IDEgPDwgMTI7IC8qIGxhcmdlc3QgdGlsZSByb3cgeDIgKi8KLQlz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqOwotCWludGVsX3dha2VyZWZfdCB3YWtlcmVmOwotCWludCB0aWxpbmc7Ci0J aW50IGVycjsKLQotCS8qIFdlIHdhbnQgdG8gY2hlY2sgdGhlIHBhZ2UgbWFwcGluZyBhbmQgZmVu Y2luZyBvZiBhIGxhcmdlIG9iamVjdAotCSAqIG1tYXBwZWQgdGhyb3VnaCB0aGUgR1RULiBUaGUg b2JqZWN0IHdlIGNyZWF0ZSBpcyBsYXJnZXIgdGhhbiBjYW4KLQkgKiBwb3NzaWJseSBiZSBtbWFw ZWQgYXMgYSB3aG9sZSwgYW5kIHNvIHdlIG11c3QgdXNlIHBhcnRpYWwgR0dUVCB2bWEuCi0JICog V2UgdGhlbiBjaGVjayB0aGF0IGEgd3JpdGUgdGhyb3VnaCBlYWNoIHBhcnRpYWwgR0dUVCB2bWEg ZW5kcyB1cAotCSAqIGluIHRoZSByaWdodCBzZXQgb2YgcGFnZXMgd2l0aGluIHRoZSBvYmplY3Qs IGFuZCB3aXRoIHRoZSBleHBlY3RlZAotCSAqIHRpbGluZywgd2hpY2ggd2UgdmVyaWZ5IGJ5IG1h bnVhbCBzd2l6emxpbmcuCi0JICovCi0KLQlvYmogPSBodWdlX2dlbV9vYmplY3QoaTkxNSwKLQkJ CSAgICAgIG5yZWFsIDw8IFBBR0VfU0hJRlQsCi0JCQkgICAgICAoMSArIG5leHRfcHJpbWVfbnVt YmVyKGk5MTUtPmdndHQudm0udG90YWwgPj4gUEFHRV9TSElGVCkpIDw8IFBBR0VfU0hJRlQpOwot CWlmIChJU19FUlIob2JqKSkKLQkJcmV0dXJuIFBUUl9FUlIob2JqKTsKLQotCWVyciA9IGk5MTVf Z2VtX29iamVjdF9waW5fcGFnZXMob2JqKTsKLQlpZiAoZXJyKSB7Ci0JCXByX2VycigiRmFpbGVk IHRvIGFsbG9jYXRlICV1IHBhZ2VzICglbHUgdG90YWwpLCBlcnI9JWRcbiIsCi0JCSAgICAgICBu cmVhbCwgb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkUsIGVycik7Ci0JCWdvdG8gb3V0OwotCX0K LQotCW11dGV4X2xvY2soJmk5MTUtPmRybS5zdHJ1Y3RfbXV0ZXgpOwotCXdha2VyZWYgPSBpbnRl bF9ydW50aW1lX3BtX2dldChpOTE1KTsKLQotCWlmICgxKSB7Ci0JCUlHVF9USU1FT1VUKGVuZCk7 Ci0JCXN0cnVjdCB0aWxlIHRpbGU7Ci0KLQkJdGlsZS5oZWlnaHQgPSAxOwotCQl0aWxlLndpZHRo ID0gMTsKLQkJdGlsZS5zaXplID0gMDsKLQkJdGlsZS5zdHJpZGUgPSAwOwotCQl0aWxlLnN3aXp6 bGUgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKLQkJdGlsZS50aWxpbmcgPSBJOTE1X1RJTElO R19OT05FOwotCi0JCWVyciA9IGNoZWNrX3BhcnRpYWxfbWFwcGluZyhvYmosICZ0aWxlLCBlbmQp OwotCQlpZiAoZXJyICYmIGVyciAhPSAtRUlOVFIpCi0JCQlnb3RvIG91dF91bmxvY2s7Ci0JfQot Ci0JZm9yICh0aWxpbmcgPSBJOTE1X1RJTElOR19YOyB0aWxpbmcgPD0gSTkxNV9USUxJTkdfWTsg dGlsaW5nKyspIHsKLQkJSUdUX1RJTUVPVVQoZW5kKTsKLQkJdW5zaWduZWQgaW50IG1heF9waXRj aDsKLQkJdW5zaWduZWQgaW50IHBpdGNoOwotCQlzdHJ1Y3QgdGlsZSB0aWxlOwotCi0JCWlmIChp OTE1LT5xdWlya3MgJiBRVUlSS19QSU5fU1dJWlpMRURfUEFHRVMpCi0JCQkvKgotCQkJICogVGhl IHN3aXp6bGluZyBwYXR0ZXJuIGlzIGFjdHVhbGx5IHVua25vd24gYXMgaXQKLQkJCSAqIHZhcmll cyBiYXNlZCBvbiBwaHlzaWNhbCBhZGRyZXNzIG9mIGVhY2ggcGFnZS4KLQkJCSAqIFNlZSBpOTE1 X2dlbV9kZXRlY3RfYml0XzZfc3dpenpsZSgpLgotCQkJICovCi0JCQlicmVhazsKLQotCQl0aWxl LnRpbGluZyA9IHRpbGluZzsKLQkJc3dpdGNoICh0aWxpbmcpIHsKLQkJY2FzZSBJOTE1X1RJTElO R19YOgotCQkJdGlsZS5zd2l6emxlID0gaTkxNS0+bW0uYml0XzZfc3dpenpsZV94OwotCQkJYnJl YWs7Ci0JCWNhc2UgSTkxNV9USUxJTkdfWToKLQkJCXRpbGUuc3dpenpsZSA9IGk5MTUtPm1tLmJp dF82X3N3aXp6bGVfeTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJR0VNX0JVR19PTih0aWxlLnN3aXp6 bGUgPT0gSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV04pOwotCQlpZiAodGlsZS5zd2l6emxlID09 IEk5MTVfQklUXzZfU1dJWlpMRV85XzE3IHx8Ci0JCSAgICB0aWxlLnN3aXp6bGUgPT0gSTkxNV9C SVRfNl9TV0laWkxFXzlfMTBfMTcpCi0JCQljb250aW51ZTsKLQotCQlpZiAoSU5URUxfR0VOKGk5 MTUpIDw9IDIpIHsKLQkJCXRpbGUuaGVpZ2h0ID0gMTY7Ci0JCQl0aWxlLndpZHRoID0gMTI4Owot CQkJdGlsZS5zaXplID0gMTE7Ci0JCX0gZWxzZSBpZiAodGlsZS50aWxpbmcgPT0gSTkxNV9USUxJ TkdfWSAmJgotCQkJICAgSEFTXzEyOF9CWVRFX1lfVElMSU5HKGk5MTUpKSB7Ci0JCQl0aWxlLmhl aWdodCA9IDMyOwotCQkJdGlsZS53aWR0aCA9IDEyODsKLQkJCXRpbGUuc2l6ZSA9IDEyOwotCQl9 IGVsc2UgewotCQkJdGlsZS5oZWlnaHQgPSA4OwotCQkJdGlsZS53aWR0aCA9IDUxMjsKLQkJCXRp bGUuc2l6ZSA9IDEyOwotCQl9Ci0KLQkJaWYgKElOVEVMX0dFTihpOTE1KSA8IDQpCi0JCQltYXhf cGl0Y2ggPSA4MTkyIC8gdGlsZS53aWR0aDsKLQkJZWxzZSBpZiAoSU5URUxfR0VOKGk5MTUpIDwg NykKLQkJCW1heF9waXRjaCA9IDEyOCAqIEk5NjVfRkVOQ0VfTUFYX1BJVENIX1ZBTCAvIHRpbGUu d2lkdGg7Ci0JCWVsc2UKLQkJCW1heF9waXRjaCA9IDEyOCAqIEdFTjdfRkVOQ0VfTUFYX1BJVENI X1ZBTCAvIHRpbGUud2lkdGg7Ci0KLQkJZm9yIChwaXRjaCA9IG1heF9waXRjaDsgcGl0Y2g7IHBp dGNoID4+PSAxKSB7Ci0JCQl0aWxlLnN0cmlkZSA9IHRpbGUud2lkdGggKiBwaXRjaDsKLQkJCWVy ciA9IGNoZWNrX3BhcnRpYWxfbWFwcGluZyhvYmosICZ0aWxlLCBlbmQpOwotCQkJaWYgKGVyciA9 PSAtRUlOVFIpCi0JCQkJZ290byBuZXh0X3RpbGluZzsKLQkJCWlmIChlcnIpCi0JCQkJZ290byBv dXRfdW5sb2NrOwotCi0JCQlpZiAocGl0Y2ggPiAyICYmIElOVEVMX0dFTihpOTE1KSA+PSA0KSB7 Ci0JCQkJdGlsZS5zdHJpZGUgPSB0aWxlLndpZHRoICogKHBpdGNoIC0gMSk7Ci0JCQkJZXJyID0g Y2hlY2tfcGFydGlhbF9tYXBwaW5nKG9iaiwgJnRpbGUsIGVuZCk7Ci0JCQkJaWYgKGVyciA9PSAt RUlOVFIpCi0JCQkJCWdvdG8gbmV4dF90aWxpbmc7Ci0JCQkJaWYgKGVycikKLQkJCQkJZ290byBv dXRfdW5sb2NrOwotCQkJfQotCi0JCQlpZiAocGl0Y2ggPCBtYXhfcGl0Y2ggJiYgSU5URUxfR0VO KGk5MTUpID49IDQpIHsKLQkJCQl0aWxlLnN0cmlkZSA9IHRpbGUud2lkdGggKiAocGl0Y2ggKyAx KTsKLQkJCQllcnIgPSBjaGVja19wYXJ0aWFsX21hcHBpbmcob2JqLCAmdGlsZSwgZW5kKTsKLQkJ CQlpZiAoZXJyID09IC1FSU5UUikKLQkJCQkJZ290byBuZXh0X3RpbGluZzsKLQkJCQlpZiAoZXJy KQotCQkJCQlnb3RvIG91dF91bmxvY2s7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoSU5URUxfR0VOKGk5 MTUpID49IDQpIHsKLQkJCWZvcl9lYWNoX3ByaW1lX251bWJlcihwaXRjaCwgbWF4X3BpdGNoKSB7 Ci0JCQkJdGlsZS5zdHJpZGUgPSB0aWxlLndpZHRoICogcGl0Y2g7Ci0JCQkJZXJyID0gY2hlY2tf cGFydGlhbF9tYXBwaW5nKG9iaiwgJnRpbGUsIGVuZCk7Ci0JCQkJaWYgKGVyciA9PSAtRUlOVFIp Ci0JCQkJCWdvdG8gbmV4dF90aWxpbmc7Ci0JCQkJaWYgKGVycikKLQkJCQkJZ290byBvdXRfdW5s b2NrOwotCQkJfQotCQl9Ci0KLW5leHRfdGlsaW5nOiA7Ci0JfQotCi1vdXRfdW5sb2NrOgotCWlu dGVsX3J1bnRpbWVfcG1fcHV0KGk5MTUsIHdha2VyZWYpOwotCW11dGV4X3VubG9jaygmaTkxNS0+ ZHJtLnN0cnVjdF9tdXRleCk7Ci0JaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7Ci1v dXQ6Ci0JaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRp YyBpbnQgbWFrZV9vYmpfYnVzeShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQotewot CXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdG9faTkxNShvYmotPmJhc2UuZGV2KTsK LQlzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycTsKLQlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKLQlpbnQg ZXJyOwotCi0Jdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCAmaTkxNS0+Z2d0dC52bSwgTlVM TCk7Ci0JaWYgKElTX0VSUih2bWEpKQotCQlyZXR1cm4gUFRSX0VSUih2bWEpOwotCi0JZXJyID0g aTkxNV92bWFfcGluKHZtYSwgMCwgMCwgUElOX1VTRVIpOwotCWlmIChlcnIpCi0JCXJldHVybiBl cnI7Ci0KLQlycSA9IGk5MTVfcmVxdWVzdF9hbGxvYyhpOTE1LT5lbmdpbmVbUkNTMF0sIGk5MTUt Pmtlcm5lbF9jb250ZXh0KTsKLQlpZiAoSVNfRVJSKHJxKSkgewotCQlpOTE1X3ZtYV91bnBpbih2 bWEpOwotCQlyZXR1cm4gUFRSX0VSUihycSk7Ci0JfQotCi0JZXJyID0gaTkxNV92bWFfbW92ZV90 b19hY3RpdmUodm1hLCBycSwgRVhFQ19PQkpFQ1RfV1JJVEUpOwotCi0JaTkxNV9yZXF1ZXN0X2Fk ZChycSk7Ci0KLQlfX2k5MTVfZ2VtX29iamVjdF9yZWxlYXNlX3VubGVzc19hY3RpdmUob2JqKTsK LQlpOTE1X3ZtYV91bnBpbih2bWEpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGJvb2wg YXNzZXJ0X21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAotCQkJICAg ICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCSAgICAgICBpbnQgZXhwZWN0ZWQpCi17Ci0Jc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKLQlpbnQgZXJyOwotCi0Jb2JqID0gaTkxNV9n ZW1fb2JqZWN0X2NyZWF0ZV9pbnRlcm5hbChpOTE1LCBzaXplKTsKLQlpZiAoSVNfRVJSKG9iaikp Ci0JCXJldHVybiBQVFJfRVJSKG9iaik7Ci0KLQllcnIgPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRl X21tYXBfb2Zmc2V0KG9iaik7Ci0JaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwotCi0JcmV0dXJu IGVyciA9PSBleHBlY3RlZDsKLX0KLQotc3RhdGljIHZvaWQgZGlzYWJsZV9yZXRpcmVfd29ya2Vy KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQotewotCWk5MTVfZ2VtX3Nocmlua2VyX3Vu cmVnaXN0ZXIoaTkxNSk7Ci0KLQltdXRleF9sb2NrKCZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsK LQlpZiAoIWk5MTUtPmd0LmFjdGl2ZV9yZXF1ZXN0cysrKSB7Ci0JCWludGVsX3dha2VyZWZfdCB3 YWtlcmVmOwotCi0JCXdpdGhfaW50ZWxfcnVudGltZV9wbShpOTE1LCB3YWtlcmVmKQotCQkJaTkx NV9nZW1fdW5wYXJrKGk5MTUpOwotCX0KLQltdXRleF91bmxvY2soJmk5MTUtPmRybS5zdHJ1Y3Rf bXV0ZXgpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZpOTE1LT5ndC5yZXRpcmVfd29y ayk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZpOTE1LT5ndC5pZGxlX3dvcmspOwotfQot Ci1zdGF0aWMgaW50IGlndF9tbWFwX29mZnNldF9leGhhdXN0aW9uKHZvaWQgKmFyZykKLXsKLQlz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKLQlzdHJ1Y3QgZHJtX21tICptbSA9 ICZpOTE1LT5kcm0udm1hX29mZnNldF9tYW5hZ2VyLT52bV9hZGRyX3NwYWNlX21tOwotCXN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7Ci0Jc3RydWN0IGRybV9tbV9ub2RlIHJlc3YsICpo b2xlOwotCXU2NCBob2xlX3N0YXJ0LCBob2xlX2VuZDsKLQlpbnQgbG9vcCwgZXJyOwotCi0JLyog RGlzYWJsZSBiYWNrZ3JvdW5kIHJlYXBlciAqLwotCWRpc2FibGVfcmV0aXJlX3dvcmtlcihpOTE1 KTsKLQlHRU1fQlVHX09OKCFpOTE1LT5ndC5hd2FrZSk7Ci0KLQkvKiBUcmltIHRoZSBkZXZpY2Ug bW1hcCBzcGFjZSB0byBvbmx5IGEgcGFnZSAqLwotCW1lbXNldCgmcmVzdiwgMCwgc2l6ZW9mKHJl c3YpKTsKLQlkcm1fbW1fZm9yX2VhY2hfaG9sZShob2xlLCBtbSwgaG9sZV9zdGFydCwgaG9sZV9l bmQpIHsKLQkJcmVzdi5zdGFydCA9IGhvbGVfc3RhcnQ7Ci0JCXJlc3Yuc2l6ZSA9IGhvbGVfZW5k IC0gaG9sZV9zdGFydCAtIDE7IC8qIFBBR0VfU0laRSB1bml0cyAqLwotCQllcnIgPSBkcm1fbW1f cmVzZXJ2ZV9ub2RlKG1tLCAmcmVzdik7Ci0JCWlmIChlcnIpIHsKLQkJCXByX2VycigiRmFpbGVk IHRvIHRyaW0gVk1BIG1hbmFnZXIsIGVycj0lZFxuIiwgZXJyKTsKLQkJCWdvdG8gb3V0X3Bhcms7 Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JLyogSnVzdCBmaXRzISAqLwotCWlmICghYXNzZXJ0X21t YXBfb2Zmc2V0KGk5MTUsIFBBR0VfU0laRSwgMCkpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gaW5z ZXJ0IG9iamVjdCBpbnRvIHNpbmdsZSBwYWdlIGhvbGVcbiIpOwotCQllcnIgPSAtRUlOVkFMOwot CQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBUb28gbGFyZ2UgKi8KLQlpZiAoIWFzc2VydF9tbWFwX29m ZnNldChpOTE1LCAyKlBBR0VfU0laRSwgLUVOT1NQQykpIHsKLQkJcHJfZXJyKCJVbmV4cGVjdGVk bHkgc3VjY2VlZGVkIGluIGluc2VydGluZyB0b28gbGFyZ2Ugb2JqZWN0IGludG8gc2luZ2xlIHBh Z2UgaG9sZVxuIik7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIEZp bGwgdGhlIGhvbGUsIGZ1cnRoZXIgYWxsb2NhdGlvbiBhdHRlbXB0cyBzaG91bGQgdGhlbiBmYWls ICovCi0Jb2JqID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9pbnRlcm5hbChpOTE1LCBQQUdFX1NJ WkUpOwotCWlmIChJU19FUlIob2JqKSkgewotCQllcnIgPSBQVFJfRVJSKG9iaik7Ci0JCWdvdG8g b3V0OwotCX0KLQotCWVyciA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfbW1hcF9vZmZzZXQob2Jq KTsKLQlpZiAoZXJyKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGluc2VydCBvYmplY3QgaW50byBy ZWNsYWltZWQgaG9sZVxuIik7Ci0JCWdvdG8gZXJyX29iajsKLQl9Ci0KLQlpZiAoIWFzc2VydF9t bWFwX29mZnNldChpOTE1LCBQQUdFX1NJWkUsIC1FTk9TUEMpKSB7Ci0JCXByX2VycigiVW5leHBl Y3RlZGx5IHN1Y2NlZWRlZCBpbiBpbnNlcnRpbmcgb2JqZWN0IGludG8gbm8gaG9sZXMhXG4iKTsK LQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBlcnJfb2JqOwotCX0KLQotCWk5MTVfZ2VtX29iamVj dF9wdXQob2JqKTsKLQotCS8qIE5vdyBmaWxsIHdpdGggYnVzeSBkZWFkIG9iamVjdHMgdGhhdCB3 ZSBleHBlY3QgdG8gcmVhcCAqLwotCWZvciAobG9vcCA9IDA7IGxvb3AgPCAzOyBsb29wKyspIHsK LQkJaW50ZWxfd2FrZXJlZl90IHdha2VyZWY7Ci0KLQkJaWYgKGk5MTVfdGVybWluYWxseV93ZWRn ZWQoaTkxNSkpCi0JCQlicmVhazsKLQotCQlvYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX2lu dGVybmFsKGk5MTUsIFBBR0VfU0laRSk7Ci0JCWlmIChJU19FUlIob2JqKSkgewotCQkJZXJyID0g UFRSX0VSUihvYmopOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQllcnIgPSAwOwotCQltdXRleF9s b2NrKCZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsKLQkJd2l0aF9pbnRlbF9ydW50aW1lX3BtKGk5 MTUsIHdha2VyZWYpCi0JCQllcnIgPSBtYWtlX29ial9idXN5KG9iaik7Ci0JCW11dGV4X3VubG9j aygmaTkxNS0+ZHJtLnN0cnVjdF9tdXRleCk7Ci0JCWlmIChlcnIpIHsKLQkJCXByX2VycigiW2xv b3AgJWRdIEZhaWxlZCB0byBidXN5IHRoZSBvYmplY3RcbiIsIGxvb3ApOwotCQkJZ290byBlcnJf b2JqOwotCQl9Ci0KLQkJLyogTkIgd2UgcmVseSBvbiB0aGUgX2FjdGl2ZV8gcmVmZXJlbmNlIHRv IGFjY2VzcyBvYmogbm93ICovCi0JCUdFTV9CVUdfT04oIWk5MTVfZ2VtX29iamVjdF9pc19hY3Rp dmUob2JqKSk7Ci0JCWVyciA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfbW1hcF9vZmZzZXQob2Jq KTsKLQkJaWYgKGVycikgewotCQkJcHJfZXJyKCJbbG9vcCAlZF0gaTkxNV9nZW1fb2JqZWN0X2Ny ZWF0ZV9tbWFwX29mZnNldCBmYWlsZWQgd2l0aCBlcnI9JWRcbiIsCi0JCQkgICAgICAgbG9vcCwg ZXJyKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi1vdXQ6Ci0JZHJtX21tX3JlbW92ZV9ub2Rl KCZyZXN2KTsKLW91dF9wYXJrOgotCW11dGV4X2xvY2soJmk5MTUtPmRybS5zdHJ1Y3RfbXV0ZXgp OwotCWlmICgtLWk5MTUtPmd0LmFjdGl2ZV9yZXF1ZXN0cykKLQkJcXVldWVfZGVsYXllZF93b3Jr KGk5MTUtPndxLCAmaTkxNS0+Z3QucmV0aXJlX3dvcmssIDApOwotCWVsc2UKLQkJcXVldWVfZGVs YXllZF93b3JrKGk5MTUtPndxLCAmaTkxNS0+Z3QuaWRsZV93b3JrLCAwKTsKLQltdXRleF91bmxv Y2soJmk5MTUtPmRybS5zdHJ1Y3RfbXV0ZXgpOwotCWk5MTVfZ2VtX3Nocmlua2VyX3JlZ2lzdGVy KGk5MTUpOwotCXJldHVybiBlcnI7Ci1lcnJfb2JqOgotCWk5MTVfZ2VtX29iamVjdF9wdXQob2Jq KTsKLQlnb3RvIG91dDsKLX0KLQogaW50IGk5MTVfZ2VtX29iamVjdF9tb2NrX3NlbGZ0ZXN0cyh2 b2lkKQogewogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTkxNV9zdWJ0ZXN0IHRlc3RzW10gPSB7CkBA IC01OTcsOCArMTEwLDYgQEAgaW50IGk5MTVfZ2VtX29iamVjdF9saXZlX3NlbGZ0ZXN0cyhzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKIHsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IGk5MTVf c3VidGVzdCB0ZXN0c1tdID0gewogCQlTVUJURVNUKGlndF9nZW1faHVnZSksCi0JCVNVQlRFU1Qo aWd0X3BhcnRpYWxfdGlsaW5nKSwKLQkJU1VCVEVTVChpZ3RfbW1hcF9vZmZzZXRfZXhoYXVzdGlv biksCiAJfTsKIAogCXJldHVybiBpOTE1X3N1YnRlc3RzKHRlc3RzLCBpOTE1KTsKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmgg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oCmlu ZGV4IDZkNzY2OTI1YWQwNC4uYmJmMzg3ZGU4ZGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmgKQEAgLTE2LDYgKzE2LDcg QEAgc2VsZnRlc3QodGltZWxpbmVzLCBpOTE1X3RpbWVsaW5lX2xpdmVfc2VsZnRlc3RzKQogc2Vs ZnRlc3QocmVxdWVzdHMsIGk5MTVfcmVxdWVzdF9saXZlX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KGFj dGl2ZSwgaTkxNV9hY3RpdmVfbGl2ZV9zZWxmdGVzdHMpCiBzZWxmdGVzdChvYmplY3RzLCBpOTE1 X2dlbV9vYmplY3RfbGl2ZV9zZWxmdGVzdHMpCitzZWxmdGVzdChtbWFuLCBpOTE1X2dlbV9tbWFu X2xpdmVfc2VsZnRlc3RzKQogc2VsZnRlc3QoZG1hYnVmLCBpOTE1X2dlbV9kbWFidWZfbGl2ZV9z ZWxmdGVzdHMpCiBzZWxmdGVzdChjb2hlcmVuY3ksIGk5MTVfZ2VtX2NvaGVyZW5jeV9saXZlX3Nl bGZ0ZXN0cykKIHNlbGZ0ZXN0KGd0dCwgaTkxNV9nZW1fZ3R0X2xpdmVfc2VsZnRlc3RzKQotLSAK Mi4yMC4xCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJ bnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZng=