From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH 16/33] drm/i915: Move mmap and friends to its own file Date: Mon, 20 May 2019 09:01:10 +0100 Message-ID: <20190520080127.18255-16-chris@chris-wilson.co.uk> References: <20190520080127.18255-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 4A9088925B for ; Mon, 20 May 2019 08:03:29 +0000 (UTC) In-Reply-To: <20190520080127.18255-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 X2dlbV9tbWFuLmMgICAgICB8IDUwNCArKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0v aTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMgICAgfCAgNTYgKysKIGRyaXZlcnMvZ3B1L2RybS9p OTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuaCAgICB8ICAgNyArCiAuLi4vZHJtL2k5MTUvZ2VtL3Nl bGZ0ZXN0cy9pOTE1X2dlbV9tbWFuLmMgICAgfCA1MDMgKysrKysrKysrKysrKysrKwogZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCAgICAgICAgICAgICAgIHwgICAxIC0KIGRyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgICAgICAgICAgICAgICB8IDU2MSArLS0tLS0tLS0tLS0t LS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jICAgICAgICB8ICAg MiArLQogLi4uL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9nZW1fb2JqZWN0LmMgIHwgNDg3 IC0tLS0tLS0tLS0tLS0tLQogLi4uL2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRl c3RzLmggIHwgICAxICsKIDEwIGZpbGVzIGNoYW5nZWQsIDEwODcgaW5zZXJ0aW9ucygrKSwgMTAz NiBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9n ZW0vaTkxNV9nZW1fbW1hbi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5 MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1X2dlbV9tbWFuLmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCmluZGV4 IGJhM2I4MmYzY2Q0OS4uZDA1NzU3YzUyNDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQpAQCAtODgs NiArODgsNyBAQCBpOTE1LXkgKz0gJChndC15KQogb2JqLXkgKz0gZ2VtLwogZ2VtLXkgKz0gXAog CWdlbS9pOTE1X2dlbV9vYmplY3QubyBcCisJZ2VtL2k5MTVfZ2VtX21tYW4ubyBcCiAJZ2VtL2k5 MTVfZ2VtX3BhZ2VzLm8gXAogCWdlbS9pOTE1X2dlbV9waHlzLm8gXAogCWdlbS9pOTE1X2dlbV9z aG1lbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fbW1h bi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX21tYW4uYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjBkYTQwMTgzZjYzYwotLS0gL2Rldi9udWxs CisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9tbWFuLmMKQEAgLTAsMCAr MSw1MDQgQEAKKy8qCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCisgKgorICogQ29w eXJpZ2h0IMKpIDIwMTQtMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNpbmNsdWRlIDxs aW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KKworI2luY2x1ZGUgImk5MTVf ZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV9nZW1fZ3R0LmgiCisjaW5jbHVkZSAiaTkxNV9nZW1faW9j dGxzLmgiCisjaW5jbHVkZSAiaTkxNV9nZW1fb2JqZWN0LmgiCisjaW5jbHVkZSAiaTkxNV92bWEu aCIKKyNpbmNsdWRlICJpbnRlbF9kcnYuaCIKKworc3RhdGljIGlubGluZSBib29sCitfX3ZtYV9t YXRjaGVzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkg ICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAodm1h LT52bV9maWxlICE9IGZpbHApCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB2bWEtPnZtX3N0 YXJ0ID09IGFkZHIgJiYKKwkgICAgICAgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPT0g UEFHRV9BTElHTihzaXplKTsKK30KKworLyoqCisgKiBpOTE1X2dlbV9tbWFwX2lvY3RsIC0gTWFw cyB0aGUgY29udGVudHMgb2YgYW4gb2JqZWN0LCByZXR1cm5pbmcgdGhlIGFkZHJlc3MKKyAqCQkJ IGl0IGlzIG1hcHBlZCB0by4KKyAqIEBkZXY6IGRybSBkZXZpY2UKKyAqIEBkYXRhOiBpb2N0bCBk YXRhIGJsb2IKKyAqIEBmaWxlOiBkcm0gZmlsZQorICoKKyAqIFdoaWxlIHRoZSBtYXBwaW5nIGhv bGRzIGEgcmVmZXJlbmNlIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0LCBpdCBkb2Vzbid0 CisgKiBpbXBseSBhIHJlZiBvbiB0aGUgb2JqZWN0IGl0c2VsZi4KKyAqCisgKiBJTVBPUlRBTlQ6 CisgKgorICogRFJNIGRyaXZlciB3cml0ZXJzIHdobyBsb29rIGEgdGhpcyBmdW5jdGlvbiBhcyBh biBleGFtcGxlIGZvciBob3cgdG8gZG8gR0VNCisgKiBtbWFwIHN1cHBvcnQsIHBsZWFzZSBkb24n dCBpbXBsZW1lbnQgbW1hcCBzdXBwb3J0IGxpa2UgaGVyZS4gVGhlIG1vZGVybiB3YXkKKyAqIHRv IGltcGxlbWVudCBEUk0gbW1hcCBzdXBwb3J0IGlzIHdpdGggYW4gbW1hcCBvZmZzZXQgaW9jdGwg KGxpa2UKKyAqIGk5MTVfZ2VtX21tYXBfZ3R0KSBhbmQgdGhlbiB1c2luZyB0aGUgbW1hcCBzeXNj YWxsIG9uIHRoZSBEUk0gZmQgZGlyZWN0bHkuCisgKiBUaGF0IHdheSBkZWJ1ZyB0b29saW5nIGxp a2UgdmFsZ3JpbmQgd2lsbCB1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbiwgaGlkaW5nCisgKiB0 aGUgbW1hcCBjYWxsIGluIGEgZHJpdmVyIHByaXZhdGUgaW9jdGwgd2lsbCBicmVhayB0aGF0LiBU aGUgaTkxNSBkcml2ZXIgb25seQorICogZG9lcyBjcHUgbW1hcHMgdGhpcyB3YXkgYmVjYXVzZSB3 ZSBkaWRuJ3Qga25vdyBiZXR0ZXIuCisgKi8KK2ludAoraTkxNV9nZW1fbW1hcF9pb2N0bChzdHJ1 Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkgICAgc3RydWN0IGRybV9maWxlICpm aWxlKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcCAqYXJncyA9IGRhdGE7CisJc3RydWN0 IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAo YXJncy0+ZmxhZ3MgJiB+KEk5MTVfTU1BUF9XQykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYg KGFyZ3MtPmZsYWdzICYgSTkxNV9NTUFQX1dDICYmICFib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVf UEFUKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvYmogPSBpOTE1X2dlbV9vYmplY3RfbG9va3Vw KGZpbGUsIGFyZ3MtPmhhbmRsZSk7CisJaWYgKCFvYmopCisJCXJldHVybiAtRU5PRU5UOworCisJ LyogcHJpbWUgb2JqZWN0cyBoYXZlIG5vIGJhY2tpbmcgZmlscCB0byBHRU0gbW1hcAorCSAqIHBh Z2VzIGZyb20uCisJICovCisJaWYgKCFvYmotPmJhc2UuZmlscCkgeworCQlhZGRyID0gLUVOWElP OworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAocmFuZ2Vfb3ZlcmZsb3dzKGFyZ3MtPm9mZnNldCwg YXJncy0+c2l6ZSwgKHU2NClvYmotPmJhc2Uuc2l6ZSkpIHsKKwkJYWRkciA9IC1FSU5WQUw7CisJ CWdvdG8gZXJyOworCX0KKworCWFkZHIgPSB2bV9tbWFwKG9iai0+YmFzZS5maWxwLCAwLCBhcmdz LT5zaXplLAorCQkgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKKwkJ ICAgICAgIGFyZ3MtPm9mZnNldCk7CisJaWYgKElTX0VSUl9WQUxVRShhZGRyKSkKKwkJZ290byBl cnI7CisKKwlpZiAoYXJncy0+ZmxhZ3MgJiBJOTE1X01NQVBfV0MpIHsKKwkJc3RydWN0IG1tX3N0 cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisK KwkJaWYgKGRvd25fd3JpdGVfa2lsbGFibGUoJm1tLT5tbWFwX3NlbSkpIHsKKwkJCWFkZHIgPSAt RUlOVFI7CisJCQlnb3RvIGVycjsKKwkJfQorCQl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7CisJ CWlmICh2bWEgJiYgX192bWFfbWF0Y2hlcyh2bWEsIG9iai0+YmFzZS5maWxwLCBhZGRyLCBhcmdz LT5zaXplKSkKKwkJCXZtYS0+dm1fcGFnZV9wcm90ID0KKwkJCQlwZ3Byb3Rfd3JpdGVjb21iaW5l KHZtX2dldF9wYWdlX3Byb3Qodm1hLT52bV9mbGFncykpOworCQllbHNlCisJCQlhZGRyID0gLUVO T01FTTsKKwkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJCWlmIChJU19FUlJfVkFMVUUoYWRk cikpCisJCQlnb3RvIGVycjsKKworCQkvKiBUaGlzIG1heSByYWNlLCBidXQgdGhhdCdzIG9rLCBp dCBvbmx5IGdldHMgc2V0ICovCisJCVdSSVRFX09OQ0Uob2JqLT5mcm9udGJ1ZmZlcl9nZ3R0X29y aWdpbiwgT1JJR0lOX0NQVSk7CisJfQorCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKworCWFy Z3MtPmFkZHJfcHRyID0gKHU2NClhZGRyOworCXJldHVybiAwOworCitlcnI6CisJaTkxNV9nZW1f b2JqZWN0X3B1dChvYmopOworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50 IHRpbGVfcm93X3BhZ2VzKGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7 CisJcmV0dXJuIGk5MTVfZ2VtX29iamVjdF9nZXRfdGlsZV9yb3dfc2l6ZShvYmopID4+IFBBR0Vf U0hJRlQ7Cit9CisKKy8qKgorICogaTkxNV9nZW1fbW1hcF9ndHRfdmVyc2lvbiAtIHJlcG9ydCB0 aGUgY3VycmVudCBmZWF0dXJlIHNldCBmb3IgR1RUIG1tYXBzCisgKgorICogQSBoaXN0b3J5IG9m IHRoZSBHVFQgbW1hcCBpbnRlcmZhY2U6CisgKgorICogMCAtIEV2ZXJ5dGhpbmcgaGFkIHRvIGZp dCBpbnRvIHRoZSBHVFQuIEJvdGggcGFydGllcyBvZiBhIG1lbWNweSBoYWQgdG8KKyAqICAgICBh bGlnbmVkIGFuZCBzdWl0YWJsZSBmb3IgZmVuY2luZywgYW5kIHN0aWxsIGZpdCBpbnRvIHRoZSBh dmFpbGFibGUKKyAqICAgICBtYXBwYWJsZSBzcGFjZSBsZWZ0IGJ5IHRoZSBwaW5uZWQgZGlzcGxh eSBvYmplY3RzLiBBIGNsYXNzaWMgcHJvYmxlbQorICogICAgIHdlIGNhbGxlZCB0aGUgcGFnZS1m YXVsdC1vZi1kb29tIHdoZXJlIHdlIHdvdWxkIHBpbmctcG9uZyBiZXR3ZWVuCisgKiAgICAgdHdv IG9iamVjdHMgdGhhdCBjb3VsZCBub3QgZml0IGluc2lkZSB0aGUgR1RUIGFuZCBzbyB0aGUgbWVt Y3B5CisgKiAgICAgd291bGQgcGFnZSBvbmUgb2JqZWN0IGluIGF0IHRoZSBleHBlbnNlIG9mIHRo ZSBvdGhlciBiZXR3ZWVuIGV2ZXJ5CisgKiAgICAgc2luZ2xlIGJ5dGUuCisgKgorICogMSAtIE9i amVjdHMgY2FuIGJlIGFueSBzaXplLCBhbmQgaGF2ZSBhbnkgY29tcGF0aWJsZSBmZW5jaW5nIChY IFksIG9yIG5vbmUKKyAqICAgICBhcyBzZXQgdmlhIGk5MTVfZ2VtX3NldF90aWxpbmcoKSBbRFJN X0k5MTVfR0VNX1NFVF9USUxJTkddKS4gSWYgdGhlCisgKiAgICAgb2JqZWN0IGlzIHRvbyBsYXJn ZSBmb3IgdGhlIGF2YWlsYWJsZSBzcGFjZSAob3Igc2ltcGx5IHRvbyBsYXJnZQorICogICAgIGZv ciB0aGUgbWFwcGFibGUgYXBlcnR1cmUhKSwgYSB2aWV3IGlzIGNyZWF0ZWQgaW5zdGVhZCBhbmQg ZmF1bHRlZAorICogICAgIGludG8gdXNlcnNwYWNlLiAoVGhpcyB2aWV3IGlzIGFsaWduZWQgYW5k IHNpemVkIGFwcHJvcHJpYXRlbHkgZm9yCisgKiAgICAgZmVuY2VkIGFjY2Vzcy4pCisgKgorICog MiAtIFJlY29nbmlzZSBXQyBhcyBhIHNlcGFyYXRlIGNhY2hlIGRvbWFpbiBzbyB0aGF0IHdlIGNh biBmbHVzaCB0aGUKKyAqICAgICBkZWxheWVkIHdyaXRlcyB2aWEgR1RUIGJlZm9yZSBwZXJmb3Jt aW5nIGRpcmVjdCBhY2Nlc3MgdmlhIFdDLgorICoKKyAqIDMgLSBSZW1vdmUgaW1wbGljaXQgc2V0 LWRvbWFpbihHVFQpIGFuZCBzeW5jaHJvbmlzYXRpb24gb24gaW5pdGlhbAorICogICAgIHBhZ2Vm YXVsdDsgc3dhcGluIHJlbWFpbnMgdHJhbnNwYXJlbnQuCisgKgorICogUmVzdHJpY3Rpb25zOgor ICoKKyAqICAqIHNub29wYWJsZSBvYmplY3RzIGNhbm5vdCBiZSBhY2Nlc3NlZCB2aWEgdGhlIEdU VC4gSXQgY2FuIGNhdXNlIG1hY2hpbmUKKyAqICAgIGhhbmdzIG9uIHNvbWUgYXJjaGl0ZWN0dXJl cywgY29ycnVwdGlvbiBvbiBvdGhlcnMuIEFuIGF0dGVtcHQgdG8gc2VydmljZQorICogICAgYSBH VFQgcGFnZSBmYXVsdCBmcm9tIGEgc25vb3BhYmxlIG9iamVjdCB3aWxsIGdlbmVyYXRlIGEgU0lH QlVTLgorICoKKyAqICAqIHRoZSBvYmplY3QgbXVzdCBiZSBhYmxlIHRvIGZpdCBpbnRvIFJBTSAo cGh5c2ljYWwgbWVtb3J5LCB0aG91Z2ggbm8KKyAqICAgIGxpbWl0ZWQgdG8gdGhlIG1hcHBhYmxl IGFwZXJ0dXJlKS4KKyAqCisgKgorICogQ2F2ZWF0czoKKyAqCisgKiAgKiBhIG5ldyBHVFQgcGFn ZSBmYXVsdCB3aWxsIHN5bmNocm9uaXplIHJlbmRlcmluZyBmcm9tIHRoZSBHUFUgYW5kIGZsdXNo CisgKiAgICBhbGwgZGF0YSB0byBzeXN0ZW0gbWVtb3J5LiBTdWJzZXF1ZW50IGFjY2VzcyB3aWxs IG5vdCBiZSBzeW5jaHJvbml6ZWQuCisgKgorICogICogYWxsIG1hcHBpbmdzIGFyZSByZXZva2Vk IG9uIHJ1bnRpbWUgZGV2aWNlIHN1c3BlbmQuCisgKgorICogICogdGhlcmUgYXJlIG9ubHkgOCwg MTYgb3IgMzIgZmVuY2UgcmVnaXN0ZXJzIHRvIHNoYXJlIGJldHdlZW4gYWxsIHVzZXJzCisgKiAg ICAob2xkZXIgbWFjaGluZXMgcmVxdWlyZSBmZW5jZSByZWdpc3RlciBmb3IgZGlzcGxheSBhbmQg YmxpdHRlciBhY2Nlc3MKKyAqICAgIGFzIHdlbGwpLiBDb250ZW50aW9uIG9mIHRoZSBmZW5jZSBy ZWdpc3RlcnMgd2lsbCBjYXVzZSB0aGUgcHJldmlvdXMgdXNlcnMKKyAqICAgIHRvIGJlIHVubWFw cGVkIGFuZCBhbnkgbmV3IGFjY2VzcyB3aWxsIGdlbmVyYXRlIG5ldyBwYWdlIGZhdWx0cy4KKyAq CisgKiAgKiBydW5uaW5nIG91dCBvZiBtZW1vcnkgd2hpbGUgc2VydmljaW5nIGEgZmF1bHQgbWF5 IGdlbmVyYXRlIGEgU0lHQlVTLAorICogICAgcmF0aGVyIHRoYW4gdGhlIGV4cGVjdGVkIFNJR1NF R1YuCisgKi8KK2ludCBpOTE1X2dlbV9tbWFwX2d0dF92ZXJzaW9uKHZvaWQpCit7CisJcmV0dXJu IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGk5MTVfZ2d0dF92aWV3Citjb21wdXRlX3Bh cnRpYWxfdmlldyhjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkgICAg IHBnb2ZmX3QgcGFnZV9vZmZzZXQsCisJCSAgICAgdW5zaWduZWQgaW50IGNodW5rKQoreworCXN0 cnVjdCBpOTE1X2dndHRfdmlldyB2aWV3OworCisJaWYgKGk5MTVfZ2VtX29iamVjdF9pc190aWxl ZChvYmopKQorCQljaHVuayA9IHJvdW5kdXAoY2h1bmssIHRpbGVfcm93X3BhZ2VzKG9iaikpOwor CisJdmlldy50eXBlID0gSTkxNV9HR1RUX1ZJRVdfUEFSVElBTDsKKwl2aWV3LnBhcnRpYWwub2Zm c2V0ID0gcm91bmRkb3duKHBhZ2Vfb2Zmc2V0LCBjaHVuayk7CisJdmlldy5wYXJ0aWFsLnNpemUg PQorCQltaW5fdCh1bnNpZ25lZCBpbnQsIGNodW5rLAorCQkgICAgICAob2JqLT5iYXNlLnNpemUg Pj4gUEFHRV9TSElGVCkgLSB2aWV3LnBhcnRpYWwub2Zmc2V0KTsKKworCS8qIElmIHRoZSBwYXJ0 aWFsIGNvdmVycyB0aGUgZW50aXJlIG9iamVjdCwganVzdCBjcmVhdGUgYSBub3JtYWwgVk1BLiAq LworCWlmIChjaHVuayA+PSBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZUKQorCQl2aWV3LnR5 cGUgPSBJOTE1X0dHVFRfVklFV19OT1JNQUw7CisKKwlyZXR1cm4gdmlldzsKK30KKworLyoqCisg KiBpOTE1X2dlbV9mYXVsdCAtIGZhdWx0IGEgcGFnZSBpbnRvIHRoZSBHVFQKKyAqIEB2bWY6IGZh dWx0IGluZm8KKyAqCisgKiBUaGUgZmF1bHQgaGFuZGxlciBpcyBzZXQgdXAgYnkgZHJtX2dlbV9t bWFwKCkgd2hlbiBhIG9iamVjdCBpcyBHVFQgbWFwcGVkCisgKiBmcm9tIHVzZXJzcGFjZS4gIFRo ZSBmYXVsdCBoYW5kbGVyIHRha2VzIGNhcmUgb2YgYmluZGluZyB0aGUgb2JqZWN0IHRvCisgKiB0 aGUgR1RUIChpZiBuZWVkZWQpLCBhbGxvY2F0aW5nIGFuZCBwcm9ncmFtbWluZyBhIGZlbmNlIHJl Z2lzdGVyIChhZ2FpbiwKKyAqIG9ubHkgaWYgbmVlZGVkIGJhc2VkIG9uIHdoZXRoZXIgdGhlIG9s ZCByZWcgaXMgc3RpbGwgdmFsaWQgb3IgdGhlIG9iamVjdAorICogaXMgdGlsZWQpIGFuZCBpbnNl cnRpbmcgYSBuZXcgUFRFIGludG8gdGhlIGZhdWx0aW5nIHByb2Nlc3MuCisgKgorICogTm90ZSB0 aGF0IHRoZSBmYXVsdGluZyBwcm9jZXNzIG1heSBpbnZvbHZlIGV2aWN0aW5nIGV4aXN0aW5nIG9i amVjdHMKKyAqIGZyb20gdGhlIEdUVCBhbmQvb3IgZmVuY2UgcmVnaXN0ZXJzIHRvIG1ha2Ugcm9v bS4gIFNvIHBlcmZvcm1hbmNlIG1heQorICogc3VmZmVyIGlmIHRoZSBHVFQgd29ya2luZyBzZXQg aXMgbGFyZ2Ugb3IgdGhlcmUgYXJlIGZldyBmZW5jZSByZWdpc3RlcnMKKyAqIGxlZnQuCisgKgor ICogVGhlIGN1cnJlbnQgZmVhdHVyZSBzZXQgc3VwcG9ydGVkIGJ5IGk5MTVfZ2VtX2ZhdWx0KCkg YW5kIHRodXMgR1RUIG1tYXBzCisgKiBpcyBleHBvc2VkIHZpYSBJOTE1X1BBUkFNX01NQVBfR1RU X1ZFUlNJT04gKHNlZSBpOTE1X2dlbV9tbWFwX2d0dF92ZXJzaW9uKS4KKyAqLwordm1fZmF1bHRf dCBpOTE1X2dlbV9mYXVsdChzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKK3sKKyNkZWZpbmUgTUlOX0NI VU5LX1BBR0VTIChTWl8xTSA+PiBQQUdFX1NISUZUKQorCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAq YXJlYSA9IHZtZi0+dm1hOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB0b19p bnRlbF9ibyhhcmVhLT52bV9wcml2YXRlX2RhdGEpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYg PSBvYmotPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdG9faTkx NShkZXYpOworCXN0cnVjdCBpOTE1X2dndHQgKmdndHQgPSAmaTkxNS0+Z2d0dDsKKwlib29sIHdy aXRlID0gYXJlYS0+dm1fZmxhZ3MgJiBWTV9XUklURTsKKwlpbnRlbF93YWtlcmVmX3Qgd2FrZXJl ZjsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKwlwZ29mZl90IHBhZ2Vfb2Zmc2V0OworCWludCBz cmN1OworCWludCByZXQ7CisKKwkvKiBTYW5pdHkgY2hlY2sgdGhhdCB3ZSBhbGxvdyB3cml0aW5n IGludG8gdGhpcyBvYmplY3QgKi8KKwlpZiAoaTkxNV9nZW1fb2JqZWN0X2lzX3JlYWRvbmx5KG9i aikgJiYgd3JpdGUpCisJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CisKKwkvKiBXZSBkb24ndCB1 c2Ugdm1mLT5wZ29mZiBzaW5jZSB0aGF0IGhhcyB0aGUgZmFrZSBvZmZzZXQgKi8KKwlwYWdlX29m ZnNldCA9ICh2bWYtPmFkZHJlc3MgLSBhcmVhLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKKwor CXRyYWNlX2k5MTVfZ2VtX29iamVjdF9mYXVsdChvYmosIHBhZ2Vfb2Zmc2V0LCB0cnVlLCB3cml0 ZSk7CisKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7CisJaWYgKHJldCkK KwkJZ290byBlcnI7CisKKwl3YWtlcmVmID0gaW50ZWxfcnVudGltZV9wbV9nZXQoaTkxNSk7CisK KwlzcmN1ID0gaTkxNV9yZXNldF90cnlsb2NrKGk5MTUpOworCWlmIChzcmN1IDwgMCkgeworCQly ZXQgPSBzcmN1OworCQlnb3RvIGVycl9ycG07CisJfQorCisJcmV0ID0gaTkxNV9tdXRleF9sb2Nr X2ludGVycnVwdGlibGUoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXNldDsKKworCS8q IEFjY2VzcyB0byBzbm9vcGFibGUgcGFnZXMgdGhyb3VnaCB0aGUgR1RUIGlzIGluY29oZXJlbnQu ICovCisJaWYgKG9iai0+Y2FjaGVfbGV2ZWwgIT0gSTkxNV9DQUNIRV9OT05FICYmICFIQVNfTExD KGk5MTUpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX3VubG9jazsKKwl9CisKKwkv KiBOb3cgcGluIGl0IGludG8gdGhlIEdUVCBhcyBuZWVkZWQgKi8KKwl2bWEgPSBpOTE1X2dlbV9v YmplY3RfZ2d0dF9waW4ob2JqLCBOVUxMLCAwLCAwLAorCQkJCSAgICAgICBQSU5fTUFQUEFCTEUg fAorCQkJCSAgICAgICBQSU5fTk9OQkxPQ0sgfAorCQkJCSAgICAgICBQSU5fTk9ORkFVTFQpOwor CWlmIChJU19FUlIodm1hKSkgeworCQkvKiBVc2UgYSBwYXJ0aWFsIHZpZXcgaWYgaXQgaXMgYmln Z2VyIHRoYW4gYXZhaWxhYmxlIHNwYWNlICovCisJCXN0cnVjdCBpOTE1X2dndHRfdmlldyB2aWV3 ID0KKwkJCWNvbXB1dGVfcGFydGlhbF92aWV3KG9iaiwgcGFnZV9vZmZzZXQsIE1JTl9DSFVOS19Q QUdFUyk7CisJCXVuc2lnbmVkIGludCBmbGFnczsKKworCQlmbGFncyA9IFBJTl9NQVBQQUJMRTsK KwkJaWYgKHZpZXcudHlwZSA9PSBJOTE1X0dHVFRfVklFV19OT1JNQUwpCisJCQlmbGFncyB8PSBQ SU5fTk9OQkxPQ0s7IC8qIGF2b2lkIHdhcm5pbmdzIGZvciBwaW5uZWQgKi8KKworCQkvKgorCQkg KiBVc2Vyc3BhY2UgaXMgbm93IHdyaXRpbmcgdGhyb3VnaCBhbiB1bnRyYWNrZWQgVk1BLCBhYmFu ZG9uCisJCSAqIGFsbCBob3BlIHRoYXQgdGhlIGhhcmR3YXJlIGlzIGFibGUgdG8gdHJhY2sgZnV0 dXJlIHdyaXRlcy4KKwkJICovCisJCW9iai0+ZnJvbnRidWZmZXJfZ2d0dF9vcmlnaW4gPSBPUklH SU5fQ1BVOworCisJCXZtYSA9IGk5MTVfZ2VtX29iamVjdF9nZ3R0X3BpbihvYmosICZ2aWV3LCAw LCAwLCBmbGFncyk7CisJCWlmIChJU19FUlIodm1hKSAmJiAhdmlldy50eXBlKSB7CisJCQlmbGFn cyA9IFBJTl9NQVBQQUJMRTsKKwkJCXZpZXcudHlwZSA9IEk5MTVfR0dUVF9WSUVXX1BBUlRJQUw7 CisJCQl2bWEgPSBpOTE1X2dlbV9vYmplY3RfZ2d0dF9waW4ob2JqLCAmdmlldywgMCwgMCwgZmxh Z3MpOworCQl9CisJfQorCWlmIChJU19FUlIodm1hKSkgeworCQlyZXQgPSBQVFJfRVJSKHZtYSk7 CisJCWdvdG8gZXJyX3VubG9jazsKKwl9CisKKwlyZXQgPSBpOTE1X3ZtYV9waW5fZmVuY2Uodm1h KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bnBpbjsKKworCS8qIEZpbmFsbHksIHJlbWFwIGl0 IHVzaW5nIHRoZSBuZXcgR1RUIG9mZnNldCAqLworCXJldCA9IHJlbWFwX2lvX21hcHBpbmcoYXJl YSwKKwkJCSAgICAgICBhcmVhLT52bV9zdGFydCArICh2bWEtPmdndHRfdmlldy5wYXJ0aWFsLm9m ZnNldCA8PCBQQUdFX1NISUZUKSwKKwkJCSAgICAgICAoZ2d0dC0+Z21hZHIuc3RhcnQgKyB2bWEt Pm5vZGUuc3RhcnQpID4+IFBBR0VfU0hJRlQsCisJCQkgICAgICAgbWluX3QodTY0LCB2bWEtPnNp emUsIGFyZWEtPnZtX2VuZCAtIGFyZWEtPnZtX3N0YXJ0KSwKKwkJCSAgICAgICAmZ2d0dC0+aW9t YXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZlbmNlOworCisJLyogTWFyayBhcyBiZWluZyBt bWFwcGVkIGludG8gdXNlcnNwYWNlIGZvciBsYXRlciByZXZvY2F0aW9uICovCisJYXNzZXJ0X3Jw bV93YWtlbG9ja19oZWxkKGk5MTUpOworCWlmICghaTkxNV92bWFfc2V0X3VzZXJmYXVsdCh2bWEp ICYmICFvYmotPnVzZXJmYXVsdF9jb3VudCsrKQorCQlsaXN0X2FkZCgmb2JqLT51c2VyZmF1bHRf bGluaywgJmk5MTUtPm1tLnVzZXJmYXVsdF9saXN0KTsKKwlHRU1fQlVHX09OKCFvYmotPnVzZXJm YXVsdF9jb3VudCk7CisKKwlpOTE1X3ZtYV9zZXRfZ2d0dF93cml0ZSh2bWEpOworCitlcnJfZmVu Y2U6CisJaTkxNV92bWFfdW5waW5fZmVuY2Uodm1hKTsKK2Vycl91bnBpbjoKKwlfX2k5MTVfdm1h X3VucGluKHZtYSk7CitlcnJfdW5sb2NrOgorCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0 ZXgpOworZXJyX3Jlc2V0OgorCWk5MTVfcmVzZXRfdW5sb2NrKGk5MTUsIHNyY3UpOworZXJyX3Jw bToKKwlpbnRlbF9ydW50aW1lX3BtX3B1dChpOTE1LCB3YWtlcmVmKTsKKwlpOTE1X2dlbV9vYmpl Y3RfdW5waW5fcGFnZXMob2JqKTsKK2VycjoKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgLUVJTzoK KwkJLyoKKwkJICogV2UgZWF0IGVycm9ycyB3aGVuIHRoZSBncHUgaXMgdGVybWluYWxseSB3ZWRn ZWQgdG8gYXZvaWQKKwkJICogdXNlcnNwYWNlIHVuZHVseSBjcmFzaGluZyAoZ2wgaGFzIG5vIHBy b3Zpc2lvbnMgZm9yIG1tYXBzIHRvCisJCSAqIGZhaWwpLiBCdXQgYW55IG90aGVyIC1FSU8gaXNu J3Qgb3VycyAoZS5nLiBzd2FwIGluIGZhaWx1cmUpCisJCSAqIGFuZCBzbyBuZWVkcyB0byBiZSBy ZXBvcnRlZC4KKwkJICovCisJCWlmICghaTkxNV90ZXJtaW5hbGx5X3dlZGdlZChpOTE1KSkKKwkJ CXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CisJCS8qIGVsc2U6IGZhbGwgdGhyb3VnaCAqLworCWNh c2UgLUVBR0FJTjoKKwkJLyoKKwkJICogRUFHQUlOIG1lYW5zIHRoZSBncHUgaXMgaHVuZyBhbmQg d2UnbGwgd2FpdCBmb3IgdGhlIGVycm9yCisJCSAqIGhhbmRsZXIgdG8gcmVzZXQgZXZlcnl0aGlu ZyB3aGVuIHJlLWZhdWx0aW5nIGluCisJCSAqIGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxl LgorCQkgKi8KKwljYXNlIDA6CisJY2FzZSAtRVJFU1RBUlRTWVM6CisJY2FzZSAtRUlOVFI6CisJ Y2FzZSAtRUJVU1k6CisJCS8qCisJCSAqIEVCVVNZIGlzIG9rOiB0aGlzIGp1c3QgbWVhbnMgdGhh dCBhbm90aGVyIHRocmVhZAorCQkgKiBhbHJlYWR5IGRpZCB0aGUgam9iLgorCQkgKi8KKwkJcmV0 dXJuIFZNX0ZBVUxUX05PUEFHRTsKKwljYXNlIC1FTk9NRU06CisJCXJldHVybiBWTV9GQVVMVF9P T007CisJY2FzZSAtRU5PU1BDOgorCWNhc2UgLUVGQVVMVDoKKwkJcmV0dXJuIFZNX0ZBVUxUX1NJ R0JVUzsKKwlkZWZhdWx0OgorCQlXQVJOX09OQ0UocmV0LCAidW5oYW5kbGVkIGVycm9yIGluICVz OiAlaVxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CisJfQor fQorCit2b2lkIF9faTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCisJR0VNX0JVR19P Tighb2JqLT51c2VyZmF1bHRfY291bnQpOworCisJb2JqLT51c2VyZmF1bHRfY291bnQgPSAwOwor CWxpc3RfZGVsKCZvYmotPnVzZXJmYXVsdF9saW5rKTsKKwlkcm1fdm1hX25vZGVfdW5tYXAoJm9i ai0+YmFzZS52bWFfbm9kZSwKKwkJCSAgIG9iai0+YmFzZS5kZXYtPmFub25faW5vZGUtPmlfbWFw cGluZyk7CisKKwlmb3JfZWFjaF9nZ3R0X3ZtYSh2bWEsIG9iaikKKwkJaTkxNV92bWFfdW5zZXRf dXNlcmZhdWx0KHZtYSk7Cit9CisKKy8qKgorICogaTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfbW1h cCAtIHJlbW92ZSBwaHlzaWNhbCBwYWdlIG1hcHBpbmdzCisgKiBAb2JqOiBvYmogaW4gcXVlc3Rp b24KKyAqCisgKiBQcmVzZXJ2ZSB0aGUgcmVzZXJ2YXRpb24gb2YgdGhlIG1tYXBwaW5nIHdpdGgg dGhlIERSTSBjb3JlIGNvZGUsIGJ1dAorICogcmVsaW5xdWlzaCBvd25lcnNoaXAgb2YgdGhlIHBh Z2VzIGJhY2sgdG8gdGhlIHN5c3RlbS4KKyAqCisgKiBJdCBpcyB2aXRhbCB0aGF0IHdlIHJlbW92 ZSB0aGUgcGFnZSBtYXBwaW5nIGlmIHdlIGhhdmUgbWFwcGVkIGEgdGlsZWQKKyAqIG9iamVjdCB0 aHJvdWdoIHRoZSBHVFQgYW5kIHRoZW4gbG9zZSB0aGUgZmVuY2UgcmVnaXN0ZXIgZHVlIHRvCisg KiByZXNvdXJjZSBwcmVzc3VyZS4gU2ltaWxhcmx5IGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW92 ZWQgb3V0IG9mIHRoZQorICogYXBlcnR1cmUsIHRoYW4gcGFnZXMgbWFwcGVkIGludG8gdXNlcnNw YWNlIG11c3QgYmUgcmV2b2tlZC4gUmVtb3ZpbmcgdGhlCisgKiBtYXBwaW5nIHdpbGwgdGhlbiB0 cmlnZ2VyIGEgcGFnZSBmYXVsdCBvbiB0aGUgbmV4dCB1c2VyIGFjY2VzcywgYWxsb3dpbmcKKyAq IGZpeHVwIGJ5IGk5MTVfZ2VtX2ZhdWx0KCkuCisgKi8KK3ZvaWQgaTkxNV9nZW1fb2JqZWN0X3Jl bGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICppOTE1ID0gdG9faTkxNShvYmotPmJhc2UuZGV2KTsKKwlpbnRlbF93 YWtlcmVmX3Qgd2FrZXJlZjsKKworCS8qIFNlcmlhbGlzYXRpb24gYmV0d2VlbiB1c2VyIEdUVCBh Y2Nlc3MgYW5kIG91ciBjb2RlIGRlcGVuZHMgdXBvbgorCSAqIHJldm9raW5nIHRoZSBDUFUncyBQ VEUgd2hpbHN0IHRoZSBtdXRleCBpcyBoZWxkLiBUaGUgbmV4dCB1c2VyCisJICogcGFnZWZhdWx0 IHRoZW4gaGFzIHRvIHdhaXQgdW50aWwgd2UgcmVsZWFzZSB0aGUgbXV0ZXguCisJICoKKwkgKiBO b3RlIHRoYXQgUlBNIGNvbXBsaWNhdGVzIHNvbWV3aGF0IGJ5IGFkZGluZyBhbiBhZGRpdGlvbmFs CisJICogcmVxdWlyZW1lbnQgdGhhdCBvcGVyYXRpb25zIHRvIHRoZSBHR1RUIGJlIG1hZGUgaG9s ZGluZyB0aGUgUlBNCisJICogd2FrZXJlZi4KKwkgKi8KKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZp OTE1LT5kcm0uc3RydWN0X211dGV4KTsKKwl3YWtlcmVmID0gaW50ZWxfcnVudGltZV9wbV9nZXQo aTkxNSk7CisKKwlpZiAoIW9iai0+dXNlcmZhdWx0X2NvdW50KQorCQlnb3RvIG91dDsKKworCV9f aTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfbW1hcChvYmopOworCisJLyogRW5zdXJlIHRoYXQgdGhl IENQVSdzIFBURSBhcmUgcmV2b2tlZCBhbmQgdGhlcmUgYXJlIG5vdCBvdXRzdGFuZGluZworCSAq IG1lbW9yeSB0cmFuc2FjdGlvbnMgZnJvbSB1c2Vyc3BhY2UgYmVmb3JlIHdlIHJldHVybi4gVGhl IFRMQgorCSAqIGZsdXNoaW5nIGltcGxpZWQgYWJvdmUgYnkgY2hhbmdpbmcgdGhlIFBURSBhYm92 ZSAqc2hvdWxkKiBiZQorCSAqIHN1ZmZpY2llbnQsIGFuIGV4dHJhIGJhcnJpZXIgaGVyZSBqdXN0 IHByb3ZpZGVzIHVzIHdpdGggYSBiaXQKKwkgKiBvZiBwYXJhbm9pZCBkb2N1bWVudGF0aW9uIGFi b3V0IG91ciByZXF1aXJlbWVudCB0byBzZXJpYWxpc2UKKwkgKiBtZW1vcnkgd3JpdGVzIGJlZm9y ZSB0b3VjaGluZyByZWdpc3RlcnMgLyBHU00uCisJICovCisJd21iKCk7CisKK291dDoKKwlpbnRl bF9ydW50aW1lX3BtX3B1dChpOTE1LCB3YWtlcmVmKTsKK30KKworc3RhdGljIGludCBjcmVhdGVf bW1hcF9vZmZzZXQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5MTUob2JqLT5iYXNlLmRldik7CisJaW50IGVy cjsKKworCWVyciA9IGRybV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KCZvYmotPmJhc2UpOworCWlm IChsaWtlbHkoIWVycikpCisJCXJldHVybiAwOworCisJLyogQXR0ZW1wdCB0byByZWFwIHNvbWUg bW1hcCBzcGFjZSBmcm9tIGRlYWQgb2JqZWN0cyAqLworCWRvIHsKKwkJZXJyID0gaTkxNV9nZW1f d2FpdF9mb3JfaWRsZShpOTE1LAorCQkJCQkgICAgIEk5MTVfV0FJVF9JTlRFUlJVUFRJQkxFLAor CQkJCQkgICAgIE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOwor CisJCWk5MTVfZ2VtX2RyYWluX2ZyZWVkX29iamVjdHMoaTkxNSk7CisJCWVyciA9IGRybV9nZW1f Y3JlYXRlX21tYXBfb2Zmc2V0KCZvYmotPmJhc2UpOworCQlpZiAoIWVycikKKwkJCWJyZWFrOwor CisJfSB3aGlsZSAoZmx1c2hfZGVsYXllZF93b3JrKCZpOTE1LT5nZW0ucmV0aXJlX3dvcmspKTsK KworCXJldHVybiBlcnI7Cit9CisKK2ludAoraTkxNV9nZW1fbW1hcF9ndHQoc3RydWN0IGRybV9m aWxlICpmaWxlLAorCQkgIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCSAgdTMyIGhhbmRsZSwK KwkJICB1NjQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwor CWludCByZXQ7CisKKwlvYmogPSBpOTE1X2dlbV9vYmplY3RfbG9va3VwKGZpbGUsIGhhbmRsZSk7 CisJaWYgKCFvYmopCisJCXJldHVybiAtRU5PRU5UOworCisJcmV0ID0gY3JlYXRlX21tYXBfb2Zm c2V0KG9iaik7CisJaWYgKHJldCA9PSAwKQorCQkqb2Zmc2V0ID0gZHJtX3ZtYV9ub2RlX29mZnNl dF9hZGRyKCZvYmotPmJhc2Uudm1hX25vZGUpOworCisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmop OworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaTkxNV9nZW1fbW1hcF9ndHRfaW9jdGwgLSBw cmVwYXJlIGFuIG9iamVjdCBmb3IgR1RUIG1tYXAnaW5nCisgKiBAZGV2OiBEUk0gZGV2aWNlCisg KiBAZGF0YTogR1RUIG1hcHBpbmcgaW9jdGwgZGF0YQorICogQGZpbGU6IEdFTSBvYmplY3QgaW5m bworICoKKyAqIFNpbXBseSByZXR1cm5zIHRoZSBmYWtlIG9mZnNldCB0byB1c2Vyc3BhY2Ugc28g aXQgY2FuIG1tYXAgaXQuCisgKiBUaGUgbW1hcCBjYWxsIHdpbGwgZW5kIHVwIGluIGRybV9nZW1f bW1hcCgpLCB3aGljaCB3aWxsIHNldCB0aGluZ3MKKyAqIHVwIHNvIHdlIGNhbiBnZXQgZmF1bHRz IGluIHRoZSBoYW5kbGVyIGFib3ZlLgorICoKKyAqIFRoZSBmYXVsdCBoYW5kbGVyIHdpbGwgdGFr ZSBjYXJlIG9mIGJpbmRpbmcgdGhlIG9iamVjdCBpbnRvIHRoZSBHVFQKKyAqIChzaW5jZSBpdCBt YXkgaGF2ZSBiZWVuIGV2aWN0ZWQgdG8gbWFrZSByb29tIGZvciBzb21ldGhpbmcpLCBhbGxvY2F0 aW5nCisgKiBhIGZlbmNlIHJlZ2lzdGVyLCBhbmQgbWFwcGluZyB0aGUgYXBwcm9wcmlhdGUgYXBl cnR1cmUgYWRkcmVzcyBpbnRvCisgKiB1c2Vyc3BhY2UuCisgKi8KK2ludAoraTkxNV9nZW1fbW1h cF9ndHRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCXN0cnVj dCBkcm1fZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXBfZ3R0ICphcmdz ID0gZGF0YTsKKworCXJldHVybiBpOTE1X2dlbV9tbWFwX2d0dChmaWxlLCBkZXYsIGFyZ3MtPmhh bmRsZSwgJmFyZ3MtPm9mZnNldCk7Cit9CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fSTkx NV9TRUxGVEVTVCkKKyNpbmNsdWRlICJzZWxmdGVzdHMvaTkxNV9nZW1fbW1hbi5jIgorI2VuZGlm CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMKaW5kZXggOWNkODgw NzEzZTI3Li5kZGY0NWY4ZjljYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dl bS9pOTE1X2dlbV9vYmplY3QuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9n ZW1fb2JqZWN0LmMKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiAj aW5jbHVkZSAiaTkxNV9nZW1fb2JqZWN0LmgiCisjaW5jbHVkZSAiaTkxNV9nZW1fY2xmbHVzaC5o IgogI2luY2x1ZGUgImk5MTVfZ2xvYmFscy5oIgogI2luY2x1ZGUgImludGVsX2Zyb250YnVmZmVy LmgiCiAKQEAgLTM1Niw2ICszNTcsNjEgQEAgdm9pZCBfX2k5MTVfZ2VtX29iamVjdF9yZWxlYXNl X3VubGVzc19hY3RpdmUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIAkJaTkxNV9n ZW1fb2JqZWN0X3B1dChvYmopOwogfQogCitzdGF0aWMgaW5saW5lIGVudW0gZmJfb3Bfb3JpZ2lu CitmYl93cml0ZV9vcmlnaW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgdW5zaWdu ZWQgaW50IGRvbWFpbikKK3sKKwlyZXR1cm4gKGRvbWFpbiA9PSBJOTE1X0dFTV9ET01BSU5fR1RU ID8KKwkJb2JqLT5mcm9udGJ1ZmZlcl9nZ3R0X29yaWdpbiA6IE9SSUdJTl9DUFUpOworfQorCitz dGF0aWMgYm9vbCBncHVfd3JpdGVfbmVlZHNfY2xmbHVzaChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqKQoreworCXJldHVybiAhKG9iai0+Y2FjaGVfbGV2ZWwgPT0gSTkxNV9DQUNIRV9O T05FIHx8CisJCSBvYmotPmNhY2hlX2xldmVsID09IEk5MTVfQ0FDSEVfV1QpOworfQorCit2b2lk CitpOTE1X2dlbV9vYmplY3RfZmx1c2hfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmosCisJCQkJICAgdW5zaWduZWQgaW50IGZsdXNoX2RvbWFpbnMpCit7CisJc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShvYmotPmJhc2UuZGV2KTsK KwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKworCWlmICghKG9iai0+d3JpdGVfZG9tYWluICYgZmx1 c2hfZG9tYWlucykpCisJCXJldHVybjsKKworCXN3aXRjaCAob2JqLT53cml0ZV9kb21haW4pIHsK KwljYXNlIEk5MTVfR0VNX0RPTUFJTl9HVFQ6CisJCWk5MTVfZ2VtX2ZsdXNoX2dndHRfd3JpdGVz KGRldl9wcml2KTsKKworCQlpbnRlbF9mYl9vYmpfZmx1c2gob2JqLAorCQkJCSAgIGZiX3dyaXRl X29yaWdpbihvYmosIEk5MTVfR0VNX0RPTUFJTl9HVFQpKTsKKworCQlmb3JfZWFjaF9nZ3R0X3Zt YSh2bWEsIG9iaikgeworCQkJaWYgKHZtYS0+aW9tYXApCisJCQkJY29udGludWU7CisKKwkJCWk5 MTVfdm1hX3Vuc2V0X2dndHRfd3JpdGUodm1hKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSTkx NV9HRU1fRE9NQUlOX1dDOgorCQl3bWIoKTsKKwkJYnJlYWs7CisKKwljYXNlIEk5MTVfR0VNX0RP TUFJTl9DUFU6CisJCWk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaiwgSTkxNV9DTEZMVVNIX1NZ TkMpOworCQlicmVhazsKKworCWNhc2UgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjoKKwkJaWYgKGdw dV93cml0ZV9uZWVkc19jbGZsdXNoKG9iaikpCisJCQlvYmotPmNhY2hlX2RpcnR5ID0gdHJ1ZTsK KwkJYnJlYWs7CisJfQorCisJb2JqLT53cml0ZV9kb21haW4gPSAwOworfQorCiB2b2lkIGk5MTVf Z2VtX2luaXRfX29iamVjdHMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCiB7CiAJSU5J VF9XT1JLKCZpOTE1LT5tbS5mcmVlX3dvcmssIF9faTkxNV9nZW1fZnJlZV93b3JrKTsKZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuaCBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuaAppbmRleCAyZTk2M2E1OTMyNDUu LjliZjgxNTVkMjdkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVf Z2VtX29iamVjdC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmpl Y3QuaApAQCAtMzQ2LDYgKzM0NiwxMyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaTkxNV9nZW1fb2Jq ZWN0X3VucGluX21hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogCWk5MTVfZ2Vt X29iamVjdF91bnBpbl9wYWdlcyhvYmopOwogfQogCit2b2lkIF9faTkxNV9nZW1fb2JqZWN0X3Jl bGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKK3ZvaWQgaTkxNV9n ZW1fb2JqZWN0X3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsK Kwordm9pZAoraTkxNV9nZW1fb2JqZWN0X2ZsdXNoX3dyaXRlX2RvbWFpbihzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgIHVuc2lnbmVkIGludCBmbHVzaF9kb21haW5zKTsK Kwogc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICoKIGk5MTVfZ2VtX29iamVj dF9sYXN0X3dyaXRlX2VuZ2luZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewpk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1X2dlbV9t bWFuLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vc2VsZnRlc3RzL2k5MTVfZ2VtX21tYW4u YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjg3ZGEwMTIzMDE3OQot LS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9zZWxmdGVzdHMvaTkx NV9nZW1fbW1hbi5jCkBAIC0wLDAgKzEsNTAzIEBACisvKgorICogU1BEWC1MaWNlbnNlLUlkZW50 aWZpZXI6IE1JVAorICoKKyAqIENvcHlyaWdodCDCqSAyMDE2IEludGVsIENvcnBvcmF0aW9uCisg Ki8KKworI2luY2x1ZGUgPGxpbnV4L3ByaW1lX251bWJlcnMuaD4KKworI2luY2x1ZGUgImd0L2lu dGVsX2d0X3BtLmgiCisjaW5jbHVkZSAiaTkxNV9zZWxmdGVzdC5oIgorI2luY2x1ZGUgInNlbGZ0 ZXN0cy9odWdlX2dlbV9vYmplY3QuaCIKKyNpbmNsdWRlICJzZWxmdGVzdHMvaWd0X2ZsdXNoX3Rl c3QuaCIKKworc3RydWN0IHRpbGUgeworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBp bnQgaGVpZ2h0OworCXVuc2lnbmVkIGludCBzdHJpZGU7CisJdW5zaWduZWQgaW50IHNpemU7CisJ dW5zaWduZWQgaW50IHRpbGluZzsKKwl1bnNpZ25lZCBpbnQgc3dpenpsZTsKK307CisKK3N0YXRp YyB1NjQgc3dpenpsZV9iaXQodW5zaWduZWQgaW50IGJpdCwgdTY0IG9mZnNldCkKK3sKKwlyZXR1 cm4gKG9mZnNldCAmIEJJVF9VTEwoYml0KSkgPj4gKGJpdCAtIDYpOworfQorCitzdGF0aWMgdTY0 IHRpbGVkX29mZnNldChjb25zdCBzdHJ1Y3QgdGlsZSAqdGlsZSwgdTY0IHYpCit7CisJdTY0IHgs IHk7CisKKwlpZiAodGlsZS0+dGlsaW5nID09IEk5MTVfVElMSU5HX05PTkUpCisJCXJldHVybiB2 OworCisJeSA9IGRpdjY0X3U2NF9yZW0odiwgdGlsZS0+c3RyaWRlLCAmeCk7CisJdiA9IGRpdjY0 X3U2NF9yZW0oeSwgdGlsZS0+aGVpZ2h0LCAmeSkgKiB0aWxlLT5zdHJpZGUgKiB0aWxlLT5oZWln aHQ7CisKKwlpZiAodGlsZS0+dGlsaW5nID09IEk5MTVfVElMSU5HX1gpIHsKKwkJdiArPSB5ICog dGlsZS0+d2lkdGg7CisJCXYgKz0gZGl2NjRfdTY0X3JlbSh4LCB0aWxlLT53aWR0aCwgJngpIDw8 IHRpbGUtPnNpemU7CisJCXYgKz0geDsKKwl9IGVsc2UgaWYgKHRpbGUtPndpZHRoID09IDEyOCkg eworCQljb25zdCB1bnNpZ25lZCBpbnQgeXRpbGVfc3BhbiA9IDE2OworCQljb25zdCB1bnNpZ25l ZCBpbnQgeXRpbGVfaGVpZ2h0ID0gNTEyOworCisJCXYgKz0geSAqIHl0aWxlX3NwYW47CisJCXYg Kz0gZGl2NjRfdTY0X3JlbSh4LCB5dGlsZV9zcGFuLCAmeCkgKiB5dGlsZV9oZWlnaHQ7CisJCXYg Kz0geDsKKwl9IGVsc2UgeworCQljb25zdCB1bnNpZ25lZCBpbnQgeXRpbGVfc3BhbiA9IDMyOwor CQljb25zdCB1bnNpZ25lZCBpbnQgeXRpbGVfaGVpZ2h0ID0gMjU2OworCisJCXYgKz0geSAqIHl0 aWxlX3NwYW47CisJCXYgKz0gZGl2NjRfdTY0X3JlbSh4LCB5dGlsZV9zcGFuLCAmeCkgKiB5dGls ZV9oZWlnaHQ7CisJCXYgKz0geDsKKwl9CisKKwlzd2l0Y2ggKHRpbGUtPnN3aXp6bGUpIHsKKwlj YXNlIEk5MTVfQklUXzZfU1dJWlpMRV85OgorCQl2IF49IHN3aXp6bGVfYml0KDksIHYpOworCQli cmVhazsKKwljYXNlIEk5MTVfQklUXzZfU1dJWlpMRV85XzEwOgorCQl2IF49IHN3aXp6bGVfYml0 KDksIHYpIF4gc3dpenpsZV9iaXQoMTAsIHYpOworCQlicmVhazsKKwljYXNlIEk5MTVfQklUXzZf U1dJWlpMRV85XzExOgorCQl2IF49IHN3aXp6bGVfYml0KDksIHYpIF4gc3dpenpsZV9iaXQoMTEs IHYpOworCQlicmVhazsKKwljYXNlIEk5MTVfQklUXzZfU1dJWlpMRV85XzEwXzExOgorCQl2IF49 IHN3aXp6bGVfYml0KDksIHYpIF4gc3dpenpsZV9iaXQoMTAsIHYpIF4gc3dpenpsZV9iaXQoMTEs IHYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGludCBjaGVja19w YXJ0aWFsX21hcHBpbmcoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgY29u c3Qgc3RydWN0IHRpbGUgKnRpbGUsCisJCQkJIHVuc2lnbmVkIGxvbmcgZW5kX3RpbWUpCit7CisJ Y29uc3QgdW5zaWduZWQgaW50IG5yZWFsID0gb2JqLT5zY3JhdGNoIC8gUEFHRV9TSVpFOworCWNv bnN0IHVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkU7CisJ c3RydWN0IGk5MTVfdm1hICp2bWE7CisJdW5zaWduZWQgbG9uZyBwYWdlOworCWludCBlcnI7CisK KwlpZiAoaWd0X3RpbWVvdXQoZW5kX3RpbWUsCisJCQkiJXM6IHRpbWVkIG91dCBiZWZvcmUgdGls aW5nPSVkIHN0cmlkZT0lZFxuIiwKKwkJCV9fZnVuY19fLCB0aWxlLT50aWxpbmcsIHRpbGUtPnN0 cmlkZSkpCisJCXJldHVybiAtRUlOVFI7CisKKwllcnIgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3Rp bGluZyhvYmosIHRpbGUtPnRpbGluZywgdGlsZS0+c3RyaWRlKTsKKwlpZiAoZXJyKSB7CisJCXBy X2VycigiRmFpbGVkIHRvIHNldCB0aWxpbmcgbW9kZT0ldSwgc3RyaWRlPSV1LCBlcnI9JWRcbiIs CisJCSAgICAgICB0aWxlLT50aWxpbmcsIHRpbGUtPnN0cmlkZSwgZXJyKTsKKwkJcmV0dXJuIGVy cjsKKwl9CisKKwlHRU1fQlVHX09OKGk5MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5nKG9iaikgIT0g dGlsZS0+dGlsaW5nKTsKKwlHRU1fQlVHX09OKGk5MTVfZ2VtX29iamVjdF9nZXRfc3RyaWRlKG9i aikgIT0gdGlsZS0+c3RyaWRlKTsKKworCWZvcl9lYWNoX3ByaW1lX251bWJlcl9mcm9tKHBhZ2Us IDEsIG5wYWdlcykgeworCQlzdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgdmlldyA9CisJCQljb21wdXRl X3BhcnRpYWxfdmlldyhvYmosIHBhZ2UsIE1JTl9DSFVOS19QQUdFUyk7CisJCXUzMiBfX2lvbWVt ICppbzsKKwkJc3RydWN0IHBhZ2UgKnA7CisJCXVuc2lnbmVkIGludCBuOworCQl1NjQgb2Zmc2V0 OworCQl1MzIgKmNwdTsKKworCQlHRU1fQlVHX09OKHZpZXcucGFydGlhbC5zaXplID4gbnJlYWwp OworCQljb25kX3Jlc2NoZWQoKTsKKworCQllcnIgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0 dF9kb21haW4ob2JqLCB0cnVlKTsKKwkJaWYgKGVycikgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8g Zmx1c2ggdG8gR1RUIHdyaXRlIGRvbWFpbjsgZXJyPSVkXG4iLAorCQkJICAgICAgIGVycik7CisJ CQlyZXR1cm4gZXJyOworCQl9CisKKwkJdm1hID0gaTkxNV9nZW1fb2JqZWN0X2dndHRfcGluKG9i aiwgJnZpZXcsIDAsIDAsIFBJTl9NQVBQQUJMRSk7CisJCWlmIChJU19FUlIodm1hKSkgeworCQkJ cHJfZXJyKCJGYWlsZWQgdG8gcGluIHBhcnRpYWwgdmlldzogb2Zmc2V0PSVsdTsgZXJyPSVkXG4i LAorCQkJICAgICAgIHBhZ2UsIChpbnQpUFRSX0VSUih2bWEpKTsKKwkJCXJldHVybiBQVFJfRVJS KHZtYSk7CisJCX0KKworCQluID0gcGFnZSAtIHZpZXcucGFydGlhbC5vZmZzZXQ7CisJCUdFTV9C VUdfT04obiA+PSB2aWV3LnBhcnRpYWwuc2l6ZSk7CisKKwkJaW8gPSBpOTE1X3ZtYV9waW5faW9t YXAodm1hKTsKKwkJaTkxNV92bWFfdW5waW4odm1hKTsKKwkJaWYgKElTX0VSUihpbykpIHsKKwkJ CXByX2VycigiRmFpbGVkIHRvIGlvbWFwIHBhcnRpYWwgdmlldzogb2Zmc2V0PSVsdTsgZXJyPSVk XG4iLAorCQkJICAgICAgIHBhZ2UsIChpbnQpUFRSX0VSUihpbykpOworCQkJcmV0dXJuIFBUUl9F UlIoaW8pOworCQl9CisKKwkJaW93cml0ZTMyKHBhZ2UsIGlvICsgbiAqIFBBR0VfU0laRSAvIHNp emVvZigqaW8pKTsKKwkJaTkxNV92bWFfdW5waW5faW9tYXAodm1hKTsKKworCQlvZmZzZXQgPSB0 aWxlZF9vZmZzZXQodGlsZSwgcGFnZSA8PCBQQUdFX1NISUZUKTsKKwkJaWYgKG9mZnNldCA+PSBv YmotPmJhc2Uuc2l6ZSkKKwkJCWNvbnRpbnVlOworCisJCWk5MTVfZ2VtX29iamVjdF9mbHVzaF93 cml0ZV9kb21haW4ob2JqLCB+STkxNV9HRU1fRE9NQUlOX0NQVSk7CisKKwkJcCA9IGk5MTVfZ2Vt X29iamVjdF9nZXRfcGFnZShvYmosIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKKwkJY3B1ID0ga21h cChwKSArIG9mZnNldF9pbl9wYWdlKG9mZnNldCk7CisJCWRybV9jbGZsdXNoX3ZpcnRfcmFuZ2Uo Y3B1LCBzaXplb2YoKmNwdSkpOworCQlpZiAoKmNwdSAhPSAodTMyKXBhZ2UpIHsKKwkJCXByX2Vy cigiUGFydGlhbCB2aWV3IGZvciAlbHUgWyV1XSAob2Zmc2V0PSVsbHUsIHNpemU9JXUgWyVsbHUs IHJvdyBzaXplICV1XSwgZmVuY2U9JWQsIHRpbGluZz0lZCwgc3RyaWRlPSVkKSBtaXNhbGlnbm1l bnQsIGV4cGVjdGVkIHdyaXRlIHRvIHBhZ2UgKCVsbHUgKyAldSBbMHglbGx4XSkgb2YgMHgleCwg Zm91bmQgMHgleFxuIiwKKwkJCSAgICAgICBwYWdlLCBuLAorCQkJICAgICAgIHZpZXcucGFydGlh bC5vZmZzZXQsCisJCQkgICAgICAgdmlldy5wYXJ0aWFsLnNpemUsCisJCQkgICAgICAgdm1hLT5z aXplID4+IFBBR0VfU0hJRlQsCisJCQkgICAgICAgdGlsZS0+dGlsaW5nID8gdGlsZV9yb3dfcGFn ZXMob2JqKSA6IDAsCisJCQkgICAgICAgdm1hLT5mZW5jZSA/IHZtYS0+ZmVuY2UtPmlkIDogLTEs IHRpbGUtPnRpbGluZywgdGlsZS0+c3RyaWRlLAorCQkJICAgICAgIG9mZnNldCA+PiBQQUdFX1NI SUZULAorCQkJICAgICAgICh1bnNpZ25lZCBpbnQpb2Zmc2V0X2luX3BhZ2Uob2Zmc2V0KSwKKwkJ CSAgICAgICBvZmZzZXQsCisJCQkgICAgICAgKHUzMilwYWdlLCAqY3B1KTsKKwkJCWVyciA9IC1F SU5WQUw7CisJCX0KKwkJKmNwdSA9IDA7CisJCWRybV9jbGZsdXNoX3ZpcnRfcmFuZ2UoY3B1LCBz aXplb2YoKmNwdSkpOworCQlrdW5tYXAocCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwor CisJCWk5MTVfdm1hX2Rlc3Ryb3kodm1hKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBpZ3RfcGFydGlhbF90aWxpbmcodm9pZCAqYXJnKQoreworCWNvbnN0IHVuc2lnbmVkIGlu dCBucmVhbCA9IDEgPDwgMTI7IC8qIGxhcmdlc3QgdGlsZSByb3cgeDIgKi8KKwlzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqOworCWludGVsX3dha2VyZWZfdCB3YWtlcmVmOworCWludCB0aWxpbmc7CisJaW50IGVycjsK KworCS8qIFdlIHdhbnQgdG8gY2hlY2sgdGhlIHBhZ2UgbWFwcGluZyBhbmQgZmVuY2luZyBvZiBh IGxhcmdlIG9iamVjdAorCSAqIG1tYXBwZWQgdGhyb3VnaCB0aGUgR1RULiBUaGUgb2JqZWN0IHdl IGNyZWF0ZSBpcyBsYXJnZXIgdGhhbiBjYW4KKwkgKiBwb3NzaWJseSBiZSBtbWFwZWQgYXMgYSB3 aG9sZSwgYW5kIHNvIHdlIG11c3QgdXNlIHBhcnRpYWwgR0dUVCB2bWEuCisJICogV2UgdGhlbiBj aGVjayB0aGF0IGEgd3JpdGUgdGhyb3VnaCBlYWNoIHBhcnRpYWwgR0dUVCB2bWEgZW5kcyB1cAor CSAqIGluIHRoZSByaWdodCBzZXQgb2YgcGFnZXMgd2l0aGluIHRoZSBvYmplY3QsIGFuZCB3aXRo IHRoZSBleHBlY3RlZAorCSAqIHRpbGluZywgd2hpY2ggd2UgdmVyaWZ5IGJ5IG1hbnVhbCBzd2l6 emxpbmcuCisJICovCisKKwlvYmogPSBodWdlX2dlbV9vYmplY3QoaTkxNSwKKwkJCSAgICAgIG5y ZWFsIDw8IFBBR0VfU0hJRlQsCisJCQkgICAgICAoMSArIG5leHRfcHJpbWVfbnVtYmVyKGk5MTUt PmdndHQudm0udG90YWwgPj4gUEFHRV9TSElGVCkpIDw8IFBBR0VfU0hJRlQpOworCWlmIChJU19F UlIob2JqKSkKKwkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCWVyciA9IGk5MTVfZ2VtX29iamVj dF9waW5fcGFnZXMob2JqKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGFsbG9j YXRlICV1IHBhZ2VzICglbHUgdG90YWwpLCBlcnI9JWRcbiIsCisJCSAgICAgICBucmVhbCwgb2Jq LT5iYXNlLnNpemUgLyBQQUdFX1NJWkUsIGVycik7CisJCWdvdG8gb3V0OworCX0KKworCW11dGV4 X2xvY2soJmk5MTUtPmRybS5zdHJ1Y3RfbXV0ZXgpOworCXdha2VyZWYgPSBpbnRlbF9ydW50aW1l X3BtX2dldChpOTE1KTsKKworCWlmICgxKSB7CisJCUlHVF9USU1FT1VUKGVuZCk7CisJCXN0cnVj dCB0aWxlIHRpbGU7CisKKwkJdGlsZS5oZWlnaHQgPSAxOworCQl0aWxlLndpZHRoID0gMTsKKwkJ dGlsZS5zaXplID0gMDsKKwkJdGlsZS5zdHJpZGUgPSAwOworCQl0aWxlLnN3aXp6bGUgPSBJOTE1 X0JJVF82X1NXSVpaTEVfTk9ORTsKKwkJdGlsZS50aWxpbmcgPSBJOTE1X1RJTElOR19OT05FOwor CisJCWVyciA9IGNoZWNrX3BhcnRpYWxfbWFwcGluZyhvYmosICZ0aWxlLCBlbmQpOworCQlpZiAo ZXJyICYmIGVyciAhPSAtRUlOVFIpCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZm9yICh0 aWxpbmcgPSBJOTE1X1RJTElOR19YOyB0aWxpbmcgPD0gSTkxNV9USUxJTkdfWTsgdGlsaW5nKysp IHsKKwkJSUdUX1RJTUVPVVQoZW5kKTsKKwkJdW5zaWduZWQgaW50IG1heF9waXRjaDsKKwkJdW5z aWduZWQgaW50IHBpdGNoOworCQlzdHJ1Y3QgdGlsZSB0aWxlOworCisJCWlmIChpOTE1LT5xdWly a3MgJiBRVUlSS19QSU5fU1dJWlpMRURfUEFHRVMpCisJCQkvKgorCQkJICogVGhlIHN3aXp6bGlu ZyBwYXR0ZXJuIGlzIGFjdHVhbGx5IHVua25vd24gYXMgaXQKKwkJCSAqIHZhcmllcyBiYXNlZCBv biBwaHlzaWNhbCBhZGRyZXNzIG9mIGVhY2ggcGFnZS4KKwkJCSAqIFNlZSBpOTE1X2dlbV9kZXRl Y3RfYml0XzZfc3dpenpsZSgpLgorCQkJICovCisJCQlicmVhazsKKworCQl0aWxlLnRpbGluZyA9 IHRpbGluZzsKKwkJc3dpdGNoICh0aWxpbmcpIHsKKwkJY2FzZSBJOTE1X1RJTElOR19YOgorCQkJ dGlsZS5zd2l6emxlID0gaTkxNS0+bW0uYml0XzZfc3dpenpsZV94OworCQkJYnJlYWs7CisJCWNh c2UgSTkxNV9USUxJTkdfWToKKwkJCXRpbGUuc3dpenpsZSA9IGk5MTUtPm1tLmJpdF82X3N3aXp6 bGVfeTsKKwkJCWJyZWFrOworCQl9CisKKwkJR0VNX0JVR19PTih0aWxlLnN3aXp6bGUgPT0gSTkx NV9CSVRfNl9TV0laWkxFX1VOS05PV04pOworCQlpZiAodGlsZS5zd2l6emxlID09IEk5MTVfQklU XzZfU1dJWlpMRV85XzE3IHx8CisJCSAgICB0aWxlLnN3aXp6bGUgPT0gSTkxNV9CSVRfNl9TV0la WkxFXzlfMTBfMTcpCisJCQljb250aW51ZTsKKworCQlpZiAoSU5URUxfR0VOKGk5MTUpIDw9IDIp IHsKKwkJCXRpbGUuaGVpZ2h0ID0gMTY7CisJCQl0aWxlLndpZHRoID0gMTI4OworCQkJdGlsZS5z aXplID0gMTE7CisJCX0gZWxzZSBpZiAodGlsZS50aWxpbmcgPT0gSTkxNV9USUxJTkdfWSAmJgor CQkJICAgSEFTXzEyOF9CWVRFX1lfVElMSU5HKGk5MTUpKSB7CisJCQl0aWxlLmhlaWdodCA9IDMy OworCQkJdGlsZS53aWR0aCA9IDEyODsKKwkJCXRpbGUuc2l6ZSA9IDEyOworCQl9IGVsc2Ugewor CQkJdGlsZS5oZWlnaHQgPSA4OworCQkJdGlsZS53aWR0aCA9IDUxMjsKKwkJCXRpbGUuc2l6ZSA9 IDEyOworCQl9CisKKwkJaWYgKElOVEVMX0dFTihpOTE1KSA8IDQpCisJCQltYXhfcGl0Y2ggPSA4 MTkyIC8gdGlsZS53aWR0aDsKKwkJZWxzZSBpZiAoSU5URUxfR0VOKGk5MTUpIDwgNykKKwkJCW1h eF9waXRjaCA9IDEyOCAqIEk5NjVfRkVOQ0VfTUFYX1BJVENIX1ZBTCAvIHRpbGUud2lkdGg7CisJ CWVsc2UKKwkJCW1heF9waXRjaCA9IDEyOCAqIEdFTjdfRkVOQ0VfTUFYX1BJVENIX1ZBTCAvIHRp bGUud2lkdGg7CisKKwkJZm9yIChwaXRjaCA9IG1heF9waXRjaDsgcGl0Y2g7IHBpdGNoID4+PSAx KSB7CisJCQl0aWxlLnN0cmlkZSA9IHRpbGUud2lkdGggKiBwaXRjaDsKKwkJCWVyciA9IGNoZWNr X3BhcnRpYWxfbWFwcGluZyhvYmosICZ0aWxlLCBlbmQpOworCQkJaWYgKGVyciA9PSAtRUlOVFIp CisJCQkJZ290byBuZXh0X3RpbGluZzsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXRfdW5sb2Nr OworCisJCQlpZiAocGl0Y2ggPiAyICYmIElOVEVMX0dFTihpOTE1KSA+PSA0KSB7CisJCQkJdGls ZS5zdHJpZGUgPSB0aWxlLndpZHRoICogKHBpdGNoIC0gMSk7CisJCQkJZXJyID0gY2hlY2tfcGFy dGlhbF9tYXBwaW5nKG9iaiwgJnRpbGUsIGVuZCk7CisJCQkJaWYgKGVyciA9PSAtRUlOVFIpCisJ CQkJCWdvdG8gbmV4dF90aWxpbmc7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBvdXRfdW5sb2Nr OworCQkJfQorCisJCQlpZiAocGl0Y2ggPCBtYXhfcGl0Y2ggJiYgSU5URUxfR0VOKGk5MTUpID49 IDQpIHsKKwkJCQl0aWxlLnN0cmlkZSA9IHRpbGUud2lkdGggKiAocGl0Y2ggKyAxKTsKKwkJCQll cnIgPSBjaGVja19wYXJ0aWFsX21hcHBpbmcob2JqLCAmdGlsZSwgZW5kKTsKKwkJCQlpZiAoZXJy ID09IC1FSU5UUikKKwkJCQkJZ290byBuZXh0X3RpbGluZzsKKwkJCQlpZiAoZXJyKQorCQkJCQln b3RvIG91dF91bmxvY2s7CisJCQl9CisJCX0KKworCQlpZiAoSU5URUxfR0VOKGk5MTUpID49IDQp IHsKKwkJCWZvcl9lYWNoX3ByaW1lX251bWJlcihwaXRjaCwgbWF4X3BpdGNoKSB7CisJCQkJdGls ZS5zdHJpZGUgPSB0aWxlLndpZHRoICogcGl0Y2g7CisJCQkJZXJyID0gY2hlY2tfcGFydGlhbF9t YXBwaW5nKG9iaiwgJnRpbGUsIGVuZCk7CisJCQkJaWYgKGVyciA9PSAtRUlOVFIpCisJCQkJCWdv dG8gbmV4dF90aWxpbmc7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBvdXRfdW5sb2NrOworCQkJ fQorCQl9CisKK25leHRfdGlsaW5nOiA7CisJfQorCitvdXRfdW5sb2NrOgorCWludGVsX3J1bnRp bWVfcG1fcHV0KGk5MTUsIHdha2VyZWYpOworCW11dGV4X3VubG9jaygmaTkxNS0+ZHJtLnN0cnVj dF9tdXRleCk7CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CitvdXQ6CisJaTkx NV9nZW1fb2JqZWN0X3B1dChvYmopOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWFr ZV9vYmpfYnVzeShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICppOTE1ID0gdG9faTkxNShvYmotPmJhc2UuZGV2KTsKKwlzdHJ1Y3Qg aTkxNV9yZXF1ZXN0ICpycTsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKwlpbnQgZXJyOworCisJ dm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCAmaTkxNS0+Z2d0dC52bSwgTlVMTCk7CisJaWYg KElTX0VSUih2bWEpKQorCQlyZXR1cm4gUFRSX0VSUih2bWEpOworCisJZXJyID0gaTkxNV92bWFf cGluKHZtYSwgMCwgMCwgUElOX1VTRVIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwly cSA9IGk5MTVfcmVxdWVzdF9jcmVhdGUoaTkxNS0+ZW5naW5lW1JDUzBdLT5rZXJuZWxfY29udGV4 dCk7CisJaWYgKElTX0VSUihycSkpIHsKKwkJaTkxNV92bWFfdW5waW4odm1hKTsKKwkJcmV0dXJu IFBUUl9FUlIocnEpOworCX0KKworCWVyciA9IGk5MTVfdm1hX21vdmVfdG9fYWN0aXZlKHZtYSwg cnEsIEVYRUNfT0JKRUNUX1dSSVRFKTsKKworCWk5MTVfcmVxdWVzdF9hZGQocnEpOworCisJX19p OTE1X2dlbV9vYmplY3RfcmVsZWFzZV91bmxlc3NfYWN0aXZlKG9iaik7CisJaTkxNV92bWFfdW5w aW4odm1hKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBib29sIGFzc2VydF9tbWFwX29m ZnNldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKKwkJCSAgICAgICB1bnNpZ25lZCBs b25nIHNpemUsCisJCQkgICAgICAgaW50IGV4cGVjdGVkKQoreworCXN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICpvYmo7CisJaW50IGVycjsKKworCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVh dGVfaW50ZXJuYWwoaTkxNSwgc2l6ZSk7CisJaWYgKElTX0VSUihvYmopKQorCQlyZXR1cm4gUFRS X0VSUihvYmopOworCisJZXJyID0gY3JlYXRlX21tYXBfb2Zmc2V0KG9iaik7CisJaTkxNV9nZW1f b2JqZWN0X3B1dChvYmopOworCisJcmV0dXJuIGVyciA9PSBleHBlY3RlZDsKK30KKworc3RhdGlj IHZvaWQgZGlzYWJsZV9yZXRpcmVfd29ya2VyKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1 KQoreworCWk5MTVfZ2VtX3Nocmlua2VyX3VucmVnaXN0ZXIoaTkxNSk7CisKKwlpbnRlbF9ndF9w bV9nZXQoaTkxNSk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmk5MTUtPmdlbS5yZXRp cmVfd29yayk7CisJZmx1c2hfd29yaygmaTkxNS0+Z2VtLmlkbGVfd29yayk7Cit9CisKK3N0YXRp YyB2b2lkIHJlc3RvcmVfcmV0aXJlX3dvcmtlcihzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkx NSkKK3sKKwlpbnRlbF9ndF9wbV9wdXQoaTkxNSk7CisKKwltdXRleF9sb2NrKCZpOTE1LT5kcm0u c3RydWN0X211dGV4KTsKKwlpZ3RfZmx1c2hfdGVzdChpOTE1LCBJOTE1X1dBSVRfTE9DS0VEKTsK KwltdXRleF91bmxvY2soJmk5MTUtPmRybS5zdHJ1Y3RfbXV0ZXgpOworCisJaTkxNV9nZW1fc2hy aW5rZXJfcmVnaXN0ZXIoaTkxNSk7Cit9CisKK3N0YXRpYyBpbnQgaWd0X21tYXBfb2Zmc2V0X2V4 aGF1c3Rpb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0g YXJnOworCXN0cnVjdCBkcm1fbW0gKm1tID0gJmk5MTUtPmRybS52bWFfb2Zmc2V0X21hbmFnZXIt PnZtX2FkZHJfc3BhY2VfbW07CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlz dHJ1Y3QgZHJtX21tX25vZGUgcmVzdiwgKmhvbGU7CisJdTY0IGhvbGVfc3RhcnQsIGhvbGVfZW5k OworCWludCBsb29wLCBlcnI7CisKKwkvKiBEaXNhYmxlIGJhY2tncm91bmQgcmVhcGVyICovCisJ ZGlzYWJsZV9yZXRpcmVfd29ya2VyKGk5MTUpOworCUdFTV9CVUdfT04oIWk5MTUtPmd0LmF3YWtl KTsKKworCS8qIFRyaW0gdGhlIGRldmljZSBtbWFwIHNwYWNlIHRvIG9ubHkgYSBwYWdlICovCisJ bWVtc2V0KCZyZXN2LCAwLCBzaXplb2YocmVzdikpOworCWRybV9tbV9mb3JfZWFjaF9ob2xlKGhv bGUsIG1tLCBob2xlX3N0YXJ0LCBob2xlX2VuZCkgeworCQlyZXN2LnN0YXJ0ID0gaG9sZV9zdGFy dDsKKwkJcmVzdi5zaXplID0gaG9sZV9lbmQgLSBob2xlX3N0YXJ0IC0gMTsgLyogUEFHRV9TSVpF IHVuaXRzICovCisJCWVyciA9IGRybV9tbV9yZXNlcnZlX25vZGUobW0sICZyZXN2KTsKKwkJaWYg KGVycikgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gdHJpbSBWTUEgbWFuYWdlciwgZXJyPSVkXG4i LCBlcnIpOworCQkJZ290byBvdXRfcGFyazsKKwkJfQorCQlicmVhazsKKwl9CisKKwkvKiBKdXN0 IGZpdHMhICovCisJaWYgKCFhc3NlcnRfbW1hcF9vZmZzZXQoaTkxNSwgUEFHRV9TSVpFLCAwKSkg eworCQlwcl9lcnIoIlVuYWJsZSB0byBpbnNlcnQgb2JqZWN0IGludG8gc2luZ2xlIHBhZ2UgaG9s ZVxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFRvbyBsYXJn ZSAqLworCWlmICghYXNzZXJ0X21tYXBfb2Zmc2V0KGk5MTUsIDIgKiBQQUdFX1NJWkUsIC1FTk9T UEMpKSB7CisJCXByX2VycigiVW5leHBlY3RlZGx5IHN1Y2NlZWRlZCBpbiBpbnNlcnRpbmcgdG9v IGxhcmdlIG9iamVjdCBpbnRvIHNpbmdsZSBwYWdlIGhvbGVcbiIpOworCQllcnIgPSAtRUlOVkFM OworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBGaWxsIHRoZSBob2xlLCBmdXJ0aGVyIGFsbG9jYXRp b24gYXR0ZW1wdHMgc2hvdWxkIHRoZW4gZmFpbCAqLworCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9j cmVhdGVfaW50ZXJuYWwoaTkxNSwgUEFHRV9TSVpFKTsKKwlpZiAoSVNfRVJSKG9iaikpIHsKKwkJ ZXJyID0gUFRSX0VSUihvYmopOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBjcmVhdGVfbW1h cF9vZmZzZXQob2JqKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGluc2VydCBv YmplY3QgaW50byByZWNsYWltZWQgaG9sZVxuIik7CisJCWdvdG8gZXJyX29iajsKKwl9CisKKwlp ZiAoIWFzc2VydF9tbWFwX29mZnNldChpOTE1LCBQQUdFX1NJWkUsIC1FTk9TUEMpKSB7CisJCXBy X2VycigiVW5leHBlY3RlZGx5IHN1Y2NlZWRlZCBpbiBpbnNlcnRpbmcgb2JqZWN0IGludG8gbm8g aG9sZXMhXG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnJfb2JqOworCX0KKworCWk5 MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKworCS8qIE5vdyBmaWxsIHdpdGggYnVzeSBkZWFkIG9i amVjdHMgdGhhdCB3ZSBleHBlY3QgdG8gcmVhcCAqLworCWZvciAobG9vcCA9IDA7IGxvb3AgPCAz OyBsb29wKyspIHsKKwkJaWYgKGk5MTVfdGVybWluYWxseV93ZWRnZWQoaTkxNSkpCisJCQlicmVh azsKKworCQlvYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX2ludGVybmFsKGk5MTUsIFBBR0Vf U0laRSk7CisJCWlmIChJU19FUlIob2JqKSkgeworCQkJZXJyID0gUFRSX0VSUihvYmopOworCQkJ Z290byBvdXQ7CisJCX0KKworCQltdXRleF9sb2NrKCZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsK KwkJZXJyID0gbWFrZV9vYmpfYnVzeShvYmopOworCQltdXRleF91bmxvY2soJmk5MTUtPmRybS5z dHJ1Y3RfbXV0ZXgpOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoIltsb29wICVkXSBGYWlsZWQg dG8gYnVzeSB0aGUgb2JqZWN0XG4iLCBsb29wKTsKKwkJCWdvdG8gZXJyX29iajsKKwkJfQorCisJ CS8qIE5CIHdlIHJlbHkgb24gdGhlIF9hY3RpdmVfIHJlZmVyZW5jZSB0byBhY2Nlc3Mgb2JqIG5v dyAqLworCQlHRU1fQlVHX09OKCFpOTE1X2dlbV9vYmplY3RfaXNfYWN0aXZlKG9iaikpOworCQll cnIgPSBjcmVhdGVfbW1hcF9vZmZzZXQob2JqKTsKKwkJaWYgKGVycikgeworCQkJcHJfZXJyKCJb bG9vcCAlZF0gY3JlYXRlX21tYXBfb2Zmc2V0IGZhaWxlZCB3aXRoIGVycj0lZFxuIiwKKwkJCSAg ICAgICBsb29wLCBlcnIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK291dDoKKwlkcm1fbW1f cmVtb3ZlX25vZGUoJnJlc3YpOworb3V0X3Bhcms6CisJcmVzdG9yZV9yZXRpcmVfd29ya2VyKGk5 MTUpOworCXJldHVybiBlcnI7CitlcnJfb2JqOgorCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsK Kwlnb3RvIG91dDsKK30KKworaW50IGk5MTVfZ2VtX21tYW5fbGl2ZV9zZWxmdGVzdHMoc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBpOTE1X3N1 YnRlc3QgdGVzdHNbXSA9IHsKKwkJU1VCVEVTVChpZ3RfcGFydGlhbF90aWxpbmcpLAorCQlTVUJU RVNUKGlndF9tbWFwX29mZnNldF9leGhhdXN0aW9uKSwKKwl9OworCisJcmV0dXJuIGk5MTVfc3Vi dGVzdHModGVzdHMsIGk5MTUpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv aTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKaW5kZXggMTA3NDQ3 Mjg3YjIyLi5jNWIyZTM5YTg4YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaApAQCAtMjc5NSw3 ICsyNzk1LDYgQEAgaTkxNV9nZW1fb2JqZWN0X2dndHRfcGluKHN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmosCiAJCQkgdTY0IGZsYWdzKTsKIAogaW50IGk5MTVfZ2VtX29iamVjdF91bmJp bmQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Ci12b2lkIGk5MTVfZ2VtX3JlbGVh c2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIAogdm9pZCBpOTE1X2dl bV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKIApk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfZ2VtLmMKaW5kZXggMDU0OWI3M2YwMWZmLi43OGQ5OTg0MWNmNzYgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKKysrIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9nZW0uYwpAQCAtMzgwLDEyICszODAsNiBAQCBpOTE1X2dlbV9kdW1i X2NyZWF0ZShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCiAJCQkgICAgICAgJmFyZ3MtPnNpemUsICZh cmdzLT5oYW5kbGUpOwogfQogCi1zdGF0aWMgYm9vbCBncHVfd3JpdGVfbmVlZHNfY2xmbHVzaChz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQotewotCXJldHVybiAhKG9iai0+Y2FjaGVf bGV2ZWwgPT0gSTkxNV9DQUNIRV9OT05FIHx8Ci0JCSBvYmotPmNhY2hlX2xldmVsID09IEk5MTVf Q0FDSEVfV1QpOwotfQotCiAvKioKICAqIENyZWF0ZXMgYSBuZXcgbW0gb2JqZWN0IGFuZCByZXR1 cm5zIGEgaGFuZGxlIHRvIGl0LgogICogQGRldjogZHJtIGRldmljZSBwb2ludGVyCkBAIC00MDUs MTMgKzM5OSw2IEBAIGk5MTVfZ2VtX2NyZWF0ZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 LCB2b2lkICpkYXRhLAogCQkJICAgICAgICZhcmdzLT5zaXplLCAmYXJncy0+aGFuZGxlKTsKIH0K IAotc3RhdGljIGlubGluZSBlbnVtIGZiX29wX29yaWdpbgotZmJfd3JpdGVfb3JpZ2luKHN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIHVuc2lnbmVkIGludCBkb21haW4pCi17Ci0JcmV0 dXJuIChkb21haW4gPT0gSTkxNV9HRU1fRE9NQUlOX0dUVCA/Ci0JCW9iai0+ZnJvbnRidWZmZXJf Z2d0dF9vcmlnaW4gOiBPUklHSU5fQ1BVKTsKLX0KLQogdm9pZCBpOTE1X2dlbV9mbHVzaF9nZ3R0 X3dyaXRlcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7CiAJaW50ZWxfd2Fr ZXJlZl90IHdha2VyZWY7CkBAIC00NTEsNDcgKzQzOCw2IEBAIHZvaWQgaTkxNV9nZW1fZmx1c2hf Z2d0dF93cml0ZXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogCX0KIH0KIAot c3RhdGljIHZvaWQKLWZsdXNoX3dyaXRlX2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqb2JqLCB1bnNpZ25lZCBpbnQgZmx1c2hfZG9tYWlucykKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOwotCXN0cnVjdCBpOTE1 X3ZtYSAqdm1hOwotCi0JaWYgKCEob2JqLT53cml0ZV9kb21haW4gJiBmbHVzaF9kb21haW5zKSkK LQkJcmV0dXJuOwotCi0Jc3dpdGNoIChvYmotPndyaXRlX2RvbWFpbikgewotCWNhc2UgSTkxNV9H RU1fRE9NQUlOX0dUVDoKLQkJaTkxNV9nZW1fZmx1c2hfZ2d0dF93cml0ZXMoZGV2X3ByaXYpOwot Ci0JCWludGVsX2ZiX29ial9mbHVzaChvYmosCi0JCQkJICAgZmJfd3JpdGVfb3JpZ2luKG9iaiwg STkxNV9HRU1fRE9NQUlOX0dUVCkpOwotCi0JCWZvcl9lYWNoX2dndHRfdm1hKHZtYSwgb2JqKSB7 Ci0JCQlpZiAodm1hLT5pb21hcCkKLQkJCQljb250aW51ZTsKLQotCQkJaTkxNV92bWFfdW5zZXRf Z2d0dF93cml0ZSh2bWEpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBJOTE1X0dFTV9ET01BSU5f V0M6Ci0JCXdtYigpOwotCQlicmVhazsKLQotCWNhc2UgSTkxNV9HRU1fRE9NQUlOX0NQVToKLQkJ aTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qob2JqLCBJOTE1X0NMRkxVU0hfU1lOQyk7Ci0JCWJyZWFr OwotCi0JY2FzZSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOgotCQlpZiAoZ3B1X3dyaXRlX25lZWRz X2NsZmx1c2gob2JqKSkKLQkJCW9iai0+Y2FjaGVfZGlydHkgPSB0cnVlOwotCQlicmVhazsKLQl9 Ci0KLQlvYmotPndyaXRlX2RvbWFpbiA9IDA7Ci19Ci0KIC8qCiAgKiBQaW5zIHRoZSBzcGVjaWZp ZWQgb2JqZWN0J3MgcGFnZXMgYW5kIHN5bmNocm9uaXplcyB0aGUgb2JqZWN0IHdpdGgKICAqIEdQ VSBhY2Nlc3Nlcy4gU2V0cyBuZWVkc19jbGZsdXNoIHRvIG5vbi16ZXJvIGlmIHRoZSBjYWxsZXIg c2hvdWxkCkBAIC01MjgsNyArNDc0LDcgQEAgaW50IGk5MTVfZ2VtX29ial9wcmVwYXJlX3NobWVt X3JlYWQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCWdvdG8gb3V0OwogCX0K IAotCWZsdXNoX3dyaXRlX2RvbWFpbihvYmosIH5JOTE1X0dFTV9ET01BSU5fQ1BVKTsKKwlpOTE1 X2dlbV9vYmplY3RfZmx1c2hfd3JpdGVfZG9tYWluKG9iaiwgfkk5MTVfR0VNX0RPTUFJTl9DUFUp OwogCiAJLyogSWYgd2UncmUgbm90IGluIHRoZSBjcHUgcmVhZCBkb21haW4sIHNldCBvdXJzZWxm IGludG8gdGhlIGd0dAogCSAqIHJlYWQgZG9tYWluIGFuZCBtYW51YWxseSBmbHVzaCBjYWNoZWxp bmVzIChpZiByZXF1aXJlZCkuIFRoaXMKQEAgLTU4MCw3ICs1MjYsNyBAQCBpbnQgaTkxNV9nZW1f b2JqX3ByZXBhcmVfc2htZW1fd3JpdGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwK IAkJCWdvdG8gb3V0OwogCX0KIAotCWZsdXNoX3dyaXRlX2RvbWFpbihvYmosIH5JOTE1X0dFTV9E T01BSU5fQ1BVKTsKKwlpOTE1X2dlbV9vYmplY3RfZmx1c2hfd3JpdGVfZG9tYWluKG9iaiwgfkk5 MTVfR0VNX0RPTUFJTl9DUFUpOwogCiAJLyogSWYgd2UncmUgbm90IGluIHRoZSBjcHUgd3JpdGUg ZG9tYWluLCBzZXQgb3Vyc2VsZiBpbnRvIHRoZQogCSAqIGd0dCB3cml0ZSBkb21haW4gYW5kIG1h bnVhbGx5IGZsdXNoIGNhY2hlbGluZXMgKGFzIHJlcXVpcmVkKS4KQEAgLTExODMsNiArMTEyOSwx MyBAQCBzdGF0aWMgdm9pZCBpOTE1X2dlbV9vYmplY3RfYnVtcF9pbmFjdGl2ZV9nZ3R0KHN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiAJc3Bpbl91bmxvY2soJmk5MTUtPm1tLm9ial9s b2NrKTsKIH0KIAorc3RhdGljIGlubGluZSBlbnVtIGZiX29wX29yaWdpbgorZmJfd3JpdGVfb3Jp Z2luKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIHVuc2lnbmVkIGludCBkb21haW4p Cit7CisJcmV0dXJuIChkb21haW4gPT0gSTkxNV9HRU1fRE9NQUlOX0dUVCA/CisJCW9iai0+ZnJv bnRidWZmZXJfZ2d0dF9vcmlnaW4gOiBPUklHSU5fQ1BVKTsKK30KKwogLyoqCiAgKiBDYWxsZWQg d2hlbiB1c2VyIHNwYWNlIHByZXBhcmVzIHRvIHVzZSBhbiBvYmplY3Qgd2l0aCB0aGUgQ1BVLCBl aXRoZXIKICAqIHRocm91Z2ggdGhlIG1tYXAgaW9jdGwncyBtYXBwaW5nIG9yIGEgR1RUIG1hcHBp bmcuCkBAIC0xMzI2LDQyMCArMTI3OSw2IEBAIGk5MTVfZ2VtX3N3X2ZpbmlzaF9pb2N0bChzdHJ1 Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCXJldHVybiAwOwogfQogCi1zdGF0aWMg aW5saW5lIGJvb2wKLV9fdm1hX21hdGNoZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0 cnVjdCBmaWxlICpmaWxwLAotCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9u ZyBzaXplKQotewotCWlmICh2bWEtPnZtX2ZpbGUgIT0gZmlscCkKLQkJcmV0dXJuIGZhbHNlOwot Ci0JcmV0dXJuIHZtYS0+dm1fc3RhcnQgPT0gYWRkciAmJgotCSAgICAgICAodm1hLT52bV9lbmQg LSB2bWEtPnZtX3N0YXJ0KSA9PSBQQUdFX0FMSUdOKHNpemUpOwotfQotCi0vKioKLSAqIGk5MTVf Z2VtX21tYXBfaW9jdGwgLSBNYXBzIHRoZSBjb250ZW50cyBvZiBhbiBvYmplY3QsIHJldHVybmlu ZyB0aGUgYWRkcmVzcwotICoJCQkgaXQgaXMgbWFwcGVkIHRvLgotICogQGRldjogZHJtIGRldmlj ZQotICogQGRhdGE6IGlvY3RsIGRhdGEgYmxvYgotICogQGZpbGU6IGRybSBmaWxlCi0gKgotICog V2hpbGUgdGhlIG1hcHBpbmcgaG9sZHMgYSByZWZlcmVuY2Ugb24gdGhlIGNvbnRlbnRzIG9mIHRo ZSBvYmplY3QsIGl0IGRvZXNuJ3QKLSAqIGltcGx5IGEgcmVmIG9uIHRoZSBvYmplY3QgaXRzZWxm LgotICoKLSAqIElNUE9SVEFOVDoKLSAqCi0gKiBEUk0gZHJpdmVyIHdyaXRlcnMgd2hvIGxvb2sg YSB0aGlzIGZ1bmN0aW9uIGFzIGFuIGV4YW1wbGUgZm9yIGhvdyB0byBkbyBHRU0KLSAqIG1tYXAg c3VwcG9ydCwgcGxlYXNlIGRvbid0IGltcGxlbWVudCBtbWFwIHN1cHBvcnQgbGlrZSBoZXJlLiBU aGUgbW9kZXJuIHdheQotICogdG8gaW1wbGVtZW50IERSTSBtbWFwIHN1cHBvcnQgaXMgd2l0aCBh biBtbWFwIG9mZnNldCBpb2N0bCAobGlrZQotICogaTkxNV9nZW1fbW1hcF9ndHQpIGFuZCB0aGVu IHVzaW5nIHRoZSBtbWFwIHN5c2NhbGwgb24gdGhlIERSTSBmZCBkaXJlY3RseS4KLSAqIFRoYXQg d2F5IGRlYnVnIHRvb2xpbmcgbGlrZSB2YWxncmluZCB3aWxsIHVuZGVyc3RhbmQgd2hhdCdzIGdv aW5nIG9uLCBoaWRpbmcKLSAqIHRoZSBtbWFwIGNhbGwgaW4gYSBkcml2ZXIgcHJpdmF0ZSBpb2N0 bCB3aWxsIGJyZWFrIHRoYXQuIFRoZSBpOTE1IGRyaXZlciBvbmx5Ci0gKiBkb2VzIGNwdSBtbWFw cyB0aGlzIHdheSBiZWNhdXNlIHdlIGRpZG4ndCBrbm93IGJldHRlci4KLSAqLwotaW50Ci1pOTE1 X2dlbV9tbWFwX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAg ICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9tbWFwICph cmdzID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwotCXVuc2lnbmVk IGxvbmcgYWRkcjsKLQotCWlmIChhcmdzLT5mbGFncyAmIH4oSTkxNV9NTUFQX1dDKSkKLQkJcmV0 dXJuIC1FSU5WQUw7Ci0KLQlpZiAoYXJncy0+ZmxhZ3MgJiBJOTE1X01NQVBfV0MgJiYgIWJvb3Rf Y3B1X2hhcyhYODZfRkVBVFVSRV9QQVQpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW9iaiA9IGk5 MTVfZ2VtX29iamVjdF9sb29rdXAoZmlsZSwgYXJncy0+aGFuZGxlKTsKLQlpZiAoIW9iaikKLQkJ cmV0dXJuIC1FTk9FTlQ7Ci0KLQkvKiBwcmltZSBvYmplY3RzIGhhdmUgbm8gYmFja2luZyBmaWxw IHRvIEdFTSBtbWFwCi0JICogcGFnZXMgZnJvbS4KLQkgKi8KLQlpZiAoIW9iai0+YmFzZS5maWxw KSB7Ci0JCWFkZHIgPSAtRU5YSU87Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmIChyYW5nZV9vdmVy Zmxvd3MoYXJncy0+b2Zmc2V0LCBhcmdzLT5zaXplLCAodTY0KW9iai0+YmFzZS5zaXplKSkgewot CQlhZGRyID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JYWRkciA9IHZtX21tYXAob2Jq LT5iYXNlLmZpbHAsIDAsIGFyZ3MtPnNpemUsCi0JCSAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dS SVRFLCBNQVBfU0hBUkVELAotCQkgICAgICAgYXJncy0+b2Zmc2V0KTsKLQlpZiAoSVNfRVJSX1ZB TFVFKGFkZHIpKQotCQlnb3RvIGVycjsKLQotCWlmIChhcmdzLT5mbGFncyAmIEk5MTVfTU1BUF9X QykgewotCQlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwotCQlzdHJ1Y3Qgdm1f YXJlYV9zdHJ1Y3QgKnZtYTsKLQotCQlpZiAoZG93bl93cml0ZV9raWxsYWJsZSgmbW0tPm1tYXBf c2VtKSkgewotCQkJYWRkciA9IC1FSU5UUjsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCXZtYSA9IGZp bmRfdm1hKG1tLCBhZGRyKTsKLQkJaWYgKHZtYSAmJiBfX3ZtYV9tYXRjaGVzKHZtYSwgb2JqLT5i YXNlLmZpbHAsIGFkZHIsIGFyZ3MtPnNpemUpKQotCQkJdm1hLT52bV9wYWdlX3Byb3QgPQotCQkJ CXBncHJvdF93cml0ZWNvbWJpbmUodm1fZ2V0X3BhZ2VfcHJvdCh2bWEtPnZtX2ZsYWdzKSk7Ci0J CWVsc2UKLQkJCWFkZHIgPSAtRU5PTUVNOwotCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQkJ aWYgKElTX0VSUl9WQUxVRShhZGRyKSkKLQkJCWdvdG8gZXJyOwotCi0JCS8qIFRoaXMgbWF5IHJh Y2UsIGJ1dCB0aGF0J3Mgb2ssIGl0IG9ubHkgZ2V0cyBzZXQgKi8KLQkJV1JJVEVfT05DRShvYmot PmZyb250YnVmZmVyX2dndHRfb3JpZ2luLCBPUklHSU5fQ1BVKTsKLQl9Ci0JaTkxNV9nZW1fb2Jq ZWN0X3B1dChvYmopOwotCi0JYXJncy0+YWRkcl9wdHIgPSAodTY0KWFkZHI7Ci0JcmV0dXJuIDA7 Ci0KLWVycjoKLQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7Ci0JcmV0dXJuIGFkZHI7Ci19Ci0K LXN0YXRpYyB1bnNpZ25lZCBpbnQgdGlsZV9yb3dfcGFnZXMoY29uc3Qgc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iaikKLXsKLQlyZXR1cm4gaTkxNV9nZW1fb2JqZWN0X2dldF90aWxlX3Jv d19zaXplKG9iaikgPj4gUEFHRV9TSElGVDsKLX0KLQotLyoqCi0gKiBpOTE1X2dlbV9tbWFwX2d0 dF92ZXJzaW9uIC0gcmVwb3J0IHRoZSBjdXJyZW50IGZlYXR1cmUgc2V0IGZvciBHVFQgbW1hcHMK LSAqCi0gKiBBIGhpc3Rvcnkgb2YgdGhlIEdUVCBtbWFwIGludGVyZmFjZToKLSAqCi0gKiAwIC0g RXZlcnl0aGluZyBoYWQgdG8gZml0IGludG8gdGhlIEdUVC4gQm90aCBwYXJ0aWVzIG9mIGEgbWVt Y3B5IGhhZCB0bwotICogICAgIGFsaWduZWQgYW5kIHN1aXRhYmxlIGZvciBmZW5jaW5nLCBhbmQg c3RpbGwgZml0IGludG8gdGhlIGF2YWlsYWJsZQotICogICAgIG1hcHBhYmxlIHNwYWNlIGxlZnQg YnkgdGhlIHBpbm5lZCBkaXNwbGF5IG9iamVjdHMuIEEgY2xhc3NpYyBwcm9ibGVtCi0gKiAgICAg d2UgY2FsbGVkIHRoZSBwYWdlLWZhdWx0LW9mLWRvb20gd2hlcmUgd2Ugd291bGQgcGluZy1wb25n IGJldHdlZW4KLSAqICAgICB0d28gb2JqZWN0cyB0aGF0IGNvdWxkIG5vdCBmaXQgaW5zaWRlIHRo ZSBHVFQgYW5kIHNvIHRoZSBtZW1jcHkKLSAqICAgICB3b3VsZCBwYWdlIG9uZSBvYmplY3QgaW4g YXQgdGhlIGV4cGVuc2Ugb2YgdGhlIG90aGVyIGJldHdlZW4gZXZlcnkKLSAqICAgICBzaW5nbGUg Ynl0ZS4KLSAqCi0gKiAxIC0gT2JqZWN0cyBjYW4gYmUgYW55IHNpemUsIGFuZCBoYXZlIGFueSBj b21wYXRpYmxlIGZlbmNpbmcgKFggWSwgb3Igbm9uZQotICogICAgIGFzIHNldCB2aWEgaTkxNV9n ZW1fc2V0X3RpbGluZygpIFtEUk1fSTkxNV9HRU1fU0VUX1RJTElOR10pLiBJZiB0aGUKLSAqICAg ICBvYmplY3QgaXMgdG9vIGxhcmdlIGZvciB0aGUgYXZhaWxhYmxlIHNwYWNlIChvciBzaW1wbHkg dG9vIGxhcmdlCi0gKiAgICAgZm9yIHRoZSBtYXBwYWJsZSBhcGVydHVyZSEpLCBhIHZpZXcgaXMg Y3JlYXRlZCBpbnN0ZWFkIGFuZCBmYXVsdGVkCi0gKiAgICAgaW50byB1c2Vyc3BhY2UuIChUaGlz IHZpZXcgaXMgYWxpZ25lZCBhbmQgc2l6ZWQgYXBwcm9wcmlhdGVseSBmb3IKLSAqICAgICBmZW5j ZWQgYWNjZXNzLikKLSAqCi0gKiAyIC0gUmVjb2duaXNlIFdDIGFzIGEgc2VwYXJhdGUgY2FjaGUg ZG9tYWluIHNvIHRoYXQgd2UgY2FuIGZsdXNoIHRoZQotICogICAgIGRlbGF5ZWQgd3JpdGVzIHZp YSBHVFQgYmVmb3JlIHBlcmZvcm1pbmcgZGlyZWN0IGFjY2VzcyB2aWEgV0MuCi0gKgotICogMyAt IFJlbW92ZSBpbXBsaWNpdCBzZXQtZG9tYWluKEdUVCkgYW5kIHN5bmNocm9uaXNhdGlvbiBvbiBp bml0aWFsCi0gKiAgICAgcGFnZWZhdWx0OyBzd2FwaW4gcmVtYWlucyB0cmFuc3BhcmVudC4KLSAq Ci0gKiBSZXN0cmljdGlvbnM6Ci0gKgotICogICogc25vb3BhYmxlIG9iamVjdHMgY2Fubm90IGJl IGFjY2Vzc2VkIHZpYSB0aGUgR1RULiBJdCBjYW4gY2F1c2UgbWFjaGluZQotICogICAgaGFuZ3Mg b24gc29tZSBhcmNoaXRlY3R1cmVzLCBjb3JydXB0aW9uIG9uIG90aGVycy4gQW4gYXR0ZW1wdCB0 byBzZXJ2aWNlCi0gKiAgICBhIEdUVCBwYWdlIGZhdWx0IGZyb20gYSBzbm9vcGFibGUgb2JqZWN0 IHdpbGwgZ2VuZXJhdGUgYSBTSUdCVVMuCi0gKgotICogICogdGhlIG9iamVjdCBtdXN0IGJlIGFi bGUgdG8gZml0IGludG8gUkFNIChwaHlzaWNhbCBtZW1vcnksIHRob3VnaCBubwotICogICAgbGlt aXRlZCB0byB0aGUgbWFwcGFibGUgYXBlcnR1cmUpLgotICoKLSAqCi0gKiBDYXZlYXRzOgotICoK LSAqICAqIGEgbmV3IEdUVCBwYWdlIGZhdWx0IHdpbGwgc3luY2hyb25pemUgcmVuZGVyaW5nIGZy b20gdGhlIEdQVSBhbmQgZmx1c2gKLSAqICAgIGFsbCBkYXRhIHRvIHN5c3RlbSBtZW1vcnkuIFN1 YnNlcXVlbnQgYWNjZXNzIHdpbGwgbm90IGJlIHN5bmNocm9uaXplZC4KLSAqCi0gKiAgKiBhbGwg bWFwcGluZ3MgYXJlIHJldm9rZWQgb24gcnVudGltZSBkZXZpY2Ugc3VzcGVuZC4KLSAqCi0gKiAg KiB0aGVyZSBhcmUgb25seSA4LCAxNiBvciAzMiBmZW5jZSByZWdpc3RlcnMgdG8gc2hhcmUgYmV0 d2VlbiBhbGwgdXNlcnMKLSAqICAgIChvbGRlciBtYWNoaW5lcyByZXF1aXJlIGZlbmNlIHJlZ2lz dGVyIGZvciBkaXNwbGF5IGFuZCBibGl0dGVyIGFjY2VzcwotICogICAgYXMgd2VsbCkuIENvbnRl bnRpb24gb2YgdGhlIGZlbmNlIHJlZ2lzdGVycyB3aWxsIGNhdXNlIHRoZSBwcmV2aW91cyB1c2Vy cwotICogICAgdG8gYmUgdW5tYXBwZWQgYW5kIGFueSBuZXcgYWNjZXNzIHdpbGwgZ2VuZXJhdGUg bmV3IHBhZ2UgZmF1bHRzLgotICoKLSAqICAqIHJ1bm5pbmcgb3V0IG9mIG1lbW9yeSB3aGlsZSBz ZXJ2aWNpbmcgYSBmYXVsdCBtYXkgZ2VuZXJhdGUgYSBTSUdCVVMsCi0gKiAgICByYXRoZXIgdGhh biB0aGUgZXhwZWN0ZWQgU0lHU0VHVi4KLSAqLwotaW50IGk5MTVfZ2VtX21tYXBfZ3R0X3ZlcnNp b24odm9pZCkKLXsKLQlyZXR1cm4gMzsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaTkxNV9n Z3R0X3ZpZXcKLWNvbXB1dGVfcGFydGlhbF92aWV3KGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmosCi0JCSAgICAgcGdvZmZfdCBwYWdlX29mZnNldCwKLQkJICAgICB1bnNpZ25l ZCBpbnQgY2h1bmspCi17Ci0Jc3RydWN0IGk5MTVfZ2d0dF92aWV3IHZpZXc7Ci0KLQlpZiAoaTkx NV9nZW1fb2JqZWN0X2lzX3RpbGVkKG9iaikpCi0JCWNodW5rID0gcm91bmR1cChjaHVuaywgdGls ZV9yb3dfcGFnZXMob2JqKSk7Ci0KLQl2aWV3LnR5cGUgPSBJOTE1X0dHVFRfVklFV19QQVJUSUFM OwotCXZpZXcucGFydGlhbC5vZmZzZXQgPSByb3VuZGRvd24ocGFnZV9vZmZzZXQsIGNodW5rKTsK LQl2aWV3LnBhcnRpYWwuc2l6ZSA9Ci0JCW1pbl90KHVuc2lnbmVkIGludCwgY2h1bmssCi0JCSAg ICAgIChvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZUKSAtIHZpZXcucGFydGlhbC5vZmZzZXQp OwotCi0JLyogSWYgdGhlIHBhcnRpYWwgY292ZXJzIHRoZSBlbnRpcmUgb2JqZWN0LCBqdXN0IGNy ZWF0ZSBhIG5vcm1hbCBWTUEuICovCi0JaWYgKGNodW5rID49IG9iai0+YmFzZS5zaXplID4+IFBB R0VfU0hJRlQpCi0JCXZpZXcudHlwZSA9IEk5MTVfR0dUVF9WSUVXX05PUk1BTDsKLQotCXJldHVy biB2aWV3OwotfQotCi0vKioKLSAqIGk5MTVfZ2VtX2ZhdWx0IC0gZmF1bHQgYSBwYWdlIGludG8g dGhlIEdUVAotICogQHZtZjogZmF1bHQgaW5mbwotICoKLSAqIFRoZSBmYXVsdCBoYW5kbGVyIGlz IHNldCB1cCBieSBkcm1fZ2VtX21tYXAoKSB3aGVuIGEgb2JqZWN0IGlzIEdUVCBtYXBwZWQKLSAq IGZyb20gdXNlcnNwYWNlLiAgVGhlIGZhdWx0IGhhbmRsZXIgdGFrZXMgY2FyZSBvZiBiaW5kaW5n IHRoZSBvYmplY3QgdG8KLSAqIHRoZSBHVFQgKGlmIG5lZWRlZCksIGFsbG9jYXRpbmcgYW5kIHBy b2dyYW1taW5nIGEgZmVuY2UgcmVnaXN0ZXIgKGFnYWluLAotICogb25seSBpZiBuZWVkZWQgYmFz ZWQgb24gd2hldGhlciB0aGUgb2xkIHJlZyBpcyBzdGlsbCB2YWxpZCBvciB0aGUgb2JqZWN0Ci0g KiBpcyB0aWxlZCkgYW5kIGluc2VydGluZyBhIG5ldyBQVEUgaW50byB0aGUgZmF1bHRpbmcgcHJv Y2Vzcy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlIGZhdWx0aW5nIHByb2Nlc3MgbWF5IGludm9sdmUg ZXZpY3RpbmcgZXhpc3Rpbmcgb2JqZWN0cwotICogZnJvbSB0aGUgR1RUIGFuZC9vciBmZW5jZSBy ZWdpc3RlcnMgdG8gbWFrZSByb29tLiAgU28gcGVyZm9ybWFuY2UgbWF5Ci0gKiBzdWZmZXIgaWYg dGhlIEdUVCB3b3JraW5nIHNldCBpcyBsYXJnZSBvciB0aGVyZSBhcmUgZmV3IGZlbmNlIHJlZ2lz dGVycwotICogbGVmdC4KLSAqCi0gKiBUaGUgY3VycmVudCBmZWF0dXJlIHNldCBzdXBwb3J0ZWQg YnkgaTkxNV9nZW1fZmF1bHQoKSBhbmQgdGh1cyBHVFQgbW1hcHMKLSAqIGlzIGV4cG9zZWQgdmlh IEk5MTVfUEFSQU1fTU1BUF9HVFRfVkVSU0lPTiAoc2VlIGk5MTVfZ2VtX21tYXBfZ3R0X3ZlcnNp b24pLgotICovCi12bV9mYXVsdF90IGk5MTVfZ2VtX2ZhdWx0KHN0cnVjdCB2bV9mYXVsdCAqdm1m KQotewotI2RlZmluZSBNSU5fQ0hVTktfUEFHRVMgKFNaXzFNID4+IFBBR0VfU0hJRlQpCi0Jc3Ry dWN0IHZtX2FyZWFfc3RydWN0ICphcmVhID0gdm1mLT52bWE7Ci0Jc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iaiA9IHRvX2ludGVsX2JvKGFyZWEtPnZtX3ByaXZhdGVfZGF0YSk7Ci0Jc3Ry dWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOwotCXN0cnVjdCBpOTE1X2dndHQgKmdndHQg PSAmZGV2X3ByaXYtPmdndHQ7Ci0JYm9vbCB3cml0ZSA9IGFyZWEtPnZtX2ZsYWdzICYgVk1fV1JJ VEU7Ci0JaW50ZWxfd2FrZXJlZl90IHdha2VyZWY7Ci0Jc3RydWN0IGk5MTVfdm1hICp2bWE7Ci0J cGdvZmZfdCBwYWdlX29mZnNldDsKLQlpbnQgc3JjdTsKLQlpbnQgcmV0OwotCi0JLyogU2FuaXR5 IGNoZWNrIHRoYXQgd2UgYWxsb3cgd3JpdGluZyBpbnRvIHRoaXMgb2JqZWN0ICovCi0JaWYgKGk5 MTVfZ2VtX29iamVjdF9pc19yZWFkb25seShvYmopICYmIHdyaXRlKQotCQlyZXR1cm4gVk1fRkFV TFRfU0lHQlVTOwotCi0JLyogV2UgZG9uJ3QgdXNlIHZtZi0+cGdvZmYgc2luY2UgdGhhdCBoYXMg dGhlIGZha2Ugb2Zmc2V0ICovCi0JcGFnZV9vZmZzZXQgPSAodm1mLT5hZGRyZXNzIC0gYXJlYS0+ dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQ7Ci0KLQl0cmFjZV9pOTE1X2dlbV9vYmplY3RfZmF1bHQo b2JqLCBwYWdlX29mZnNldCwgdHJ1ZSwgd3JpdGUpOwotCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0 X3Bpbl9wYWdlcyhvYmopOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0Jd2FrZXJlZiA9IGlu dGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKLQotCXNyY3UgPSBpOTE1X3Jlc2V0X3RyeWxv Y2soZGV2X3ByaXYpOwotCWlmIChzcmN1IDwgMCkgewotCQlyZXQgPSBzcmN1OwotCQlnb3RvIGVy cl9ycG07Ci0JfQotCi0JcmV0ID0gaTkxNV9tdXRleF9sb2NrX2ludGVycnVwdGlibGUoZGV2KTsK LQlpZiAocmV0KQotCQlnb3RvIGVycl9yZXNldDsKLQotCS8qIEFjY2VzcyB0byBzbm9vcGFibGUg cGFnZXMgdGhyb3VnaCB0aGUgR1RUIGlzIGluY29oZXJlbnQuICovCi0JaWYgKG9iai0+Y2FjaGVf bGV2ZWwgIT0gSTkxNV9DQUNIRV9OT05FICYmICFIQVNfTExDKGRldl9wcml2KSkgewotCQlyZXQg PSAtRUZBVUxUOwotCQlnb3RvIGVycl91bmxvY2s7Ci0JfQotCi0JLyogTm93IHBpbiBpdCBpbnRv IHRoZSBHVFQgYXMgbmVlZGVkICovCi0Jdm1hID0gaTkxNV9nZW1fb2JqZWN0X2dndHRfcGluKG9i aiwgTlVMTCwgMCwgMCwKLQkJCQkgICAgICAgUElOX01BUFBBQkxFIHwKLQkJCQkgICAgICAgUElO X05PTkJMT0NLIHwKLQkJCQkgICAgICAgUElOX05PTkZBVUxUKTsKLQlpZiAoSVNfRVJSKHZtYSkp IHsKLQkJLyogVXNlIGEgcGFydGlhbCB2aWV3IGlmIGl0IGlzIGJpZ2dlciB0aGFuIGF2YWlsYWJs ZSBzcGFjZSAqLwotCQlzdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgdmlldyA9Ci0JCQljb21wdXRlX3Bh cnRpYWxfdmlldyhvYmosIHBhZ2Vfb2Zmc2V0LCBNSU5fQ0hVTktfUEFHRVMpOwotCQl1bnNpZ25l ZCBpbnQgZmxhZ3M7Ci0KLQkJZmxhZ3MgPSBQSU5fTUFQUEFCTEU7Ci0JCWlmICh2aWV3LnR5cGUg PT0gSTkxNV9HR1RUX1ZJRVdfTk9STUFMKQotCQkJZmxhZ3MgfD0gUElOX05PTkJMT0NLOyAvKiBh dm9pZCB3YXJuaW5ncyBmb3IgcGlubmVkICovCi0KLQkJLyoKLQkJICogVXNlcnNwYWNlIGlzIG5v dyB3cml0aW5nIHRocm91Z2ggYW4gdW50cmFja2VkIFZNQSwgYWJhbmRvbgotCQkgKiBhbGwgaG9w ZSB0aGF0IHRoZSBoYXJkd2FyZSBpcyBhYmxlIHRvIHRyYWNrIGZ1dHVyZSB3cml0ZXMuCi0JCSAq LwotCQlvYmotPmZyb250YnVmZmVyX2dndHRfb3JpZ2luID0gT1JJR0lOX0NQVTsKLQotCQl2bWEg PSBpOTE1X2dlbV9vYmplY3RfZ2d0dF9waW4ob2JqLCAmdmlldywgMCwgMCwgZmxhZ3MpOwotCQlp ZiAoSVNfRVJSKHZtYSkgJiYgIXZpZXcudHlwZSkgewotCQkJZmxhZ3MgPSBQSU5fTUFQUEFCTEU7 Ci0JCQl2aWV3LnR5cGUgPSBJOTE1X0dHVFRfVklFV19QQVJUSUFMOwotCQkJdm1hID0gaTkxNV9n ZW1fb2JqZWN0X2dndHRfcGluKG9iaiwgJnZpZXcsIDAsIDAsIGZsYWdzKTsKLQkJfQotCX0KLQlp ZiAoSVNfRVJSKHZtYSkpIHsKLQkJcmV0ID0gUFRSX0VSUih2bWEpOwotCQlnb3RvIGVycl91bmxv Y2s7Ci0JfQotCi0JcmV0ID0gaTkxNV92bWFfcGluX2ZlbmNlKHZtYSk7Ci0JaWYgKHJldCkKLQkJ Z290byBlcnJfdW5waW47Ci0KLQkvKiBGaW5hbGx5LCByZW1hcCBpdCB1c2luZyB0aGUgbmV3IEdU VCBvZmZzZXQgKi8KLQlyZXQgPSByZW1hcF9pb19tYXBwaW5nKGFyZWEsCi0JCQkgICAgICAgYXJl YS0+dm1fc3RhcnQgKyAodm1hLT5nZ3R0X3ZpZXcucGFydGlhbC5vZmZzZXQgPDwgUEFHRV9TSElG VCksCi0JCQkgICAgICAgKGdndHQtPmdtYWRyLnN0YXJ0ICsgdm1hLT5ub2RlLnN0YXJ0KSA+PiBQ QUdFX1NISUZULAotCQkJICAgICAgIG1pbl90KHU2NCwgdm1hLT5zaXplLCBhcmVhLT52bV9lbmQg LSBhcmVhLT52bV9zdGFydCksCi0JCQkgICAgICAgJmdndHQtPmlvbWFwKTsKLQlpZiAocmV0KQot CQlnb3RvIGVycl9mZW5jZTsKLQotCS8qIE1hcmsgYXMgYmVpbmcgbW1hcHBlZCBpbnRvIHVzZXJz cGFjZSBmb3IgbGF0ZXIgcmV2b2NhdGlvbiAqLwotCWFzc2VydF9ycG1fd2FrZWxvY2tfaGVsZChk ZXZfcHJpdik7Ci0JaWYgKCFpOTE1X3ZtYV9zZXRfdXNlcmZhdWx0KHZtYSkgJiYgIW9iai0+dXNl cmZhdWx0X2NvdW50KyspCi0JCWxpc3RfYWRkKCZvYmotPnVzZXJmYXVsdF9saW5rLCAmZGV2X3By aXYtPm1tLnVzZXJmYXVsdF9saXN0KTsKLQlHRU1fQlVHX09OKCFvYmotPnVzZXJmYXVsdF9jb3Vu dCk7Ci0KLQlpOTE1X3ZtYV9zZXRfZ2d0dF93cml0ZSh2bWEpOwotCi1lcnJfZmVuY2U6Ci0JaTkx NV92bWFfdW5waW5fZmVuY2Uodm1hKTsKLWVycl91bnBpbjoKLQlfX2k5MTVfdm1hX3VucGluKHZt YSk7Ci1lcnJfdW5sb2NrOgotCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotZXJy X3Jlc2V0OgotCWk5MTVfcmVzZXRfdW5sb2NrKGRldl9wcml2LCBzcmN1KTsKLWVycl9ycG06Ci0J aW50ZWxfcnVudGltZV9wbV9wdXQoZGV2X3ByaXYsIHdha2VyZWYpOwotCWk5MTVfZ2VtX29iamVj dF91bnBpbl9wYWdlcyhvYmopOwotZXJyOgotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAtRUlPOgot CQkvKgotCQkgKiBXZSBlYXQgZXJyb3JzIHdoZW4gdGhlIGdwdSBpcyB0ZXJtaW5hbGx5IHdlZGdl ZCB0byBhdm9pZAotCQkgKiB1c2Vyc3BhY2UgdW5kdWx5IGNyYXNoaW5nIChnbCBoYXMgbm8gcHJv dmlzaW9ucyBmb3IgbW1hcHMgdG8KLQkJICogZmFpbCkuIEJ1dCBhbnkgb3RoZXIgLUVJTyBpc24n dCBvdXJzIChlLmcuIHN3YXAgaW4gZmFpbHVyZSkKLQkJICogYW5kIHNvIG5lZWRzIHRvIGJlIHJl cG9ydGVkLgotCQkgKi8KLQkJaWYgKCFpOTE1X3Rlcm1pbmFsbHlfd2VkZ2VkKGRldl9wcml2KSkK LQkJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7Ci0JCS8qIGVsc2U6IGZhbGwgdGhyb3VnaCAqLwot CWNhc2UgLUVBR0FJTjoKLQkJLyoKLQkJICogRUFHQUlOIG1lYW5zIHRoZSBncHUgaXMgaHVuZyBh bmQgd2UnbGwgd2FpdCBmb3IgdGhlIGVycm9yCi0JCSAqIGhhbmRsZXIgdG8gcmVzZXQgZXZlcnl0 aGluZyB3aGVuIHJlLWZhdWx0aW5nIGluCi0JCSAqIGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRp YmxlLgotCQkgKi8KLQljYXNlIDA6Ci0JY2FzZSAtRVJFU1RBUlRTWVM6Ci0JY2FzZSAtRUlOVFI6 Ci0JY2FzZSAtRUJVU1k6Ci0JCS8qCi0JCSAqIEVCVVNZIGlzIG9rOiB0aGlzIGp1c3QgbWVhbnMg dGhhdCBhbm90aGVyIHRocmVhZAotCQkgKiBhbHJlYWR5IGRpZCB0aGUgam9iLgotCQkgKi8KLQkJ cmV0dXJuIFZNX0ZBVUxUX05PUEFHRTsKLQljYXNlIC1FTk9NRU06Ci0JCXJldHVybiBWTV9GQVVM VF9PT007Ci0JY2FzZSAtRU5PU1BDOgotCWNhc2UgLUVGQVVMVDoKLQkJcmV0dXJuIFZNX0ZBVUxU X1NJR0JVUzsKLQlkZWZhdWx0OgotCQlXQVJOX09OQ0UocmV0LCAidW5oYW5kbGVkIGVycm9yIGlu IGk5MTVfZ2VtX2ZhdWx0OiAlaVxuIiwgcmV0KTsKLQkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsK LQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfbW1hcChzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQotewotCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOwot Ci0JR0VNX0JVR19PTighb2JqLT51c2VyZmF1bHRfY291bnQpOwotCi0Jb2JqLT51c2VyZmF1bHRf Y291bnQgPSAwOwotCWxpc3RfZGVsKCZvYmotPnVzZXJmYXVsdF9saW5rKTsKLQlkcm1fdm1hX25v ZGVfdW5tYXAoJm9iai0+YmFzZS52bWFfbm9kZSwKLQkJCSAgIG9iai0+YmFzZS5kZXYtPmFub25f aW5vZGUtPmlfbWFwcGluZyk7Ci0KLQlmb3JfZWFjaF9nZ3R0X3ZtYSh2bWEsIG9iaikKLQkJaTkx NV92bWFfdW5zZXRfdXNlcmZhdWx0KHZtYSk7Ci19Ci0KLS8qKgotICogaTkxNV9nZW1fcmVsZWFz ZV9tbWFwIC0gcmVtb3ZlIHBoeXNpY2FsIHBhZ2UgbWFwcGluZ3MKLSAqIEBvYmo6IG9iaiBpbiBx dWVzdGlvbgotICoKLSAqIFByZXNlcnZlIHRoZSByZXNlcnZhdGlvbiBvZiB0aGUgbW1hcHBpbmcg d2l0aCB0aGUgRFJNIGNvcmUgY29kZSwgYnV0Ci0gKiByZWxpbnF1aXNoIG93bmVyc2hpcCBvZiB0 aGUgcGFnZXMgYmFjayB0byB0aGUgc3lzdGVtLgotICoKLSAqIEl0IGlzIHZpdGFsIHRoYXQgd2Ug cmVtb3ZlIHRoZSBwYWdlIG1hcHBpbmcgaWYgd2UgaGF2ZSBtYXBwZWQgYSB0aWxlZAotICogb2Jq ZWN0IHRocm91Z2ggdGhlIEdUVCBhbmQgdGhlbiBsb3NlIHRoZSBmZW5jZSByZWdpc3RlciBkdWUg dG8KLSAqIHJlc291cmNlIHByZXNzdXJlLiBTaW1pbGFybHkgaWYgdGhlIG9iamVjdCBoYXMgYmVl biBtb3ZlZCBvdXQgb2YgdGhlCi0gKiBhcGVydHVyZSwgdGhhbiBwYWdlcyBtYXBwZWQgaW50byB1 c2Vyc3BhY2UgbXVzdCBiZSByZXZva2VkLiBSZW1vdmluZyB0aGUKLSAqIG1hcHBpbmcgd2lsbCB0 aGVuIHRyaWdnZXIgYSBwYWdlIGZhdWx0IG9uIHRoZSBuZXh0IHVzZXIgYWNjZXNzLCBhbGxvd2lu ZwotICogZml4dXAgYnkgaTkxNV9nZW1fZmF1bHQoKS4KLSAqLwotdm9pZAotaTkxNV9nZW1fcmVs ZWFzZV9tbWFwKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCi17Ci0Jc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOwotCWludGVsX3dh a2VyZWZfdCB3YWtlcmVmOwotCi0JLyogU2VyaWFsaXNhdGlvbiBiZXR3ZWVuIHVzZXIgR1RUIGFj Y2VzcyBhbmQgb3VyIGNvZGUgZGVwZW5kcyB1cG9uCi0JICogcmV2b2tpbmcgdGhlIENQVSdzIFBU RSB3aGlsc3QgdGhlIG11dGV4IGlzIGhlbGQuIFRoZSBuZXh0IHVzZXIKLQkgKiBwYWdlZmF1bHQg dGhlbiBoYXMgdG8gd2FpdCB1bnRpbCB3ZSByZWxlYXNlIHRoZSBtdXRleC4KLQkgKgotCSAqIE5v dGUgdGhhdCBSUE0gY29tcGxpY2F0ZXMgc29tZXdoYXQgYnkgYWRkaW5nIGFuIGFkZGl0aW9uYWwK LQkgKiByZXF1aXJlbWVudCB0aGF0IG9wZXJhdGlvbnMgdG8gdGhlIEdHVFQgYmUgbWFkZSBob2xk aW5nIHRoZSBSUE0KLQkgKiB3YWtlcmVmLgotCSAqLwotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmk5 MTUtPmRybS5zdHJ1Y3RfbXV0ZXgpOwotCXdha2VyZWYgPSBpbnRlbF9ydW50aW1lX3BtX2dldChp OTE1KTsKLQotCWlmICghb2JqLT51c2VyZmF1bHRfY291bnQpCi0JCWdvdG8gb3V0OwotCi0JX19p OTE1X2dlbV9vYmplY3RfcmVsZWFzZV9tbWFwKG9iaik7Ci0KLQkvKiBFbnN1cmUgdGhhdCB0aGUg Q1BVJ3MgUFRFIGFyZSByZXZva2VkIGFuZCB0aGVyZSBhcmUgbm90IG91dHN0YW5kaW5nCi0JICog bWVtb3J5IHRyYW5zYWN0aW9ucyBmcm9tIHVzZXJzcGFjZSBiZWZvcmUgd2UgcmV0dXJuLiBUaGUg VExCCi0JICogZmx1c2hpbmcgaW1wbGllZCBhYm92ZSBieSBjaGFuZ2luZyB0aGUgUFRFIGFib3Zl ICpzaG91bGQqIGJlCi0JICogc3VmZmljaWVudCwgYW4gZXh0cmEgYmFycmllciBoZXJlIGp1c3Qg cHJvdmlkZXMgdXMgd2l0aCBhIGJpdAotCSAqIG9mIHBhcmFub2lkIGRvY3VtZW50YXRpb24gYWJv dXQgb3VyIHJlcXVpcmVtZW50IHRvIHNlcmlhbGlzZQotCSAqIG1lbW9yeSB3cml0ZXMgYmVmb3Jl IHRvdWNoaW5nIHJlZ2lzdGVycyAvIEdTTS4KLQkgKi8KLQl3bWIoKTsKLQotb3V0OgotCWludGVs X3J1bnRpbWVfcG1fcHV0KGk5MTUsIHdha2VyZWYpOwotfQotCiB2b2lkIGk5MTVfZ2VtX3J1bnRp bWVfc3VzcGVuZChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7CiAJc3RydWN0 IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgKm9uOwpAQCAtMTc4Miw3OCArMTMyMSw2IEBAIHZv aWQgaTkxNV9nZW1fcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdikKIAl9CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9tbWFwX29m ZnNldChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQotewotCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUob2JqLT5iYXNlLmRldik7Ci0JaW50IGVycjsK LQotCWVyciA9IGRybV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KCZvYmotPmJhc2UpOwotCWlmIChs aWtlbHkoIWVycikpCi0JCXJldHVybiAwOwotCi0JLyogQXR0ZW1wdCB0byByZWFwIHNvbWUgbW1h cCBzcGFjZSBmcm9tIGRlYWQgb2JqZWN0cyAqLwotCWRvIHsKLQkJZXJyID0gaTkxNV9nZW1fd2Fp dF9mb3JfaWRsZShkZXZfcHJpdiwKLQkJCQkJICAgICBJOTE1X1dBSVRfSU5URVJSVVBUSUJMRSwK LQkJCQkJICAgICBNQVhfU0NIRURVTEVfVElNRU9VVCk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsK LQotCQlpOTE1X2dlbV9kcmFpbl9mcmVlZF9vYmplY3RzKGRldl9wcml2KTsKLQkJZXJyID0gZHJt X2dlbV9jcmVhdGVfbW1hcF9vZmZzZXQoJm9iai0+YmFzZSk7Ci0JCWlmICghZXJyKQotCQkJYnJl YWs7Ci0KLQl9IHdoaWxlIChmbHVzaF9kZWxheWVkX3dvcmsoJmRldl9wcml2LT5nZW0ucmV0aXJl X3dvcmspKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLWludAotaTkxNV9nZW1fbW1hcF9ndHQoc3Ry dWN0IGRybV9maWxlICpmaWxlLAotCQkgIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCSAgdTMy IGhhbmRsZSwKLQkJICB1NjQgKm9mZnNldCkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqb2JqOwotCWludCByZXQ7Ci0KLQlvYmogPSBpOTE1X2dlbV9vYmplY3RfbG9va3VwKGZpbGUs IGhhbmRsZSk7Ci0JaWYgKCFvYmopCi0JCXJldHVybiAtRU5PRU5UOwotCi0JcmV0ID0gaTkxNV9n ZW1fb2JqZWN0X2NyZWF0ZV9tbWFwX29mZnNldChvYmopOwotCWlmIChyZXQgPT0gMCkKLQkJKm9m ZnNldCA9IGRybV92bWFfbm9kZV9vZmZzZXRfYWRkcigmb2JqLT5iYXNlLnZtYV9ub2RlKTsKLQot CWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGk5 MTVfZ2VtX21tYXBfZ3R0X2lvY3RsIC0gcHJlcGFyZSBhbiBvYmplY3QgZm9yIEdUVCBtbWFwJ2lu ZwotICogQGRldjogRFJNIGRldmljZQotICogQGRhdGE6IEdUVCBtYXBwaW5nIGlvY3RsIGRhdGEK LSAqIEBmaWxlOiBHRU0gb2JqZWN0IGluZm8KLSAqCi0gKiBTaW1wbHkgcmV0dXJucyB0aGUgZmFr ZSBvZmZzZXQgdG8gdXNlcnNwYWNlIHNvIGl0IGNhbiBtbWFwIGl0LgotICogVGhlIG1tYXAgY2Fs bCB3aWxsIGVuZCB1cCBpbiBkcm1fZ2VtX21tYXAoKSwgd2hpY2ggd2lsbCBzZXQgdGhpbmdzCi0g KiB1cCBzbyB3ZSBjYW4gZ2V0IGZhdWx0cyBpbiB0aGUgaGFuZGxlciBhYm92ZS4KLSAqCi0gKiBU aGUgZmF1bHQgaGFuZGxlciB3aWxsIHRha2UgY2FyZSBvZiBiaW5kaW5nIHRoZSBvYmplY3QgaW50 byB0aGUgR1RUCi0gKiAoc2luY2UgaXQgbWF5IGhhdmUgYmVlbiBldmljdGVkIHRvIG1ha2Ugcm9v bSBmb3Igc29tZXRoaW5nKSwgYWxsb2NhdGluZwotICogYSBmZW5jZSByZWdpc3RlciwgYW5kIG1h cHBpbmcgdGhlIGFwcHJvcHJpYXRlIGFwZXJ0dXJlIGFkZHJlc3MgaW50bwotICogdXNlcnNwYWNl LgotICovCi1pbnQKLWk5MTVfZ2VtX21tYXBfZ3R0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpk ZXYsIHZvaWQgKmRhdGEsCi0JCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGRy bV9pOTE1X2dlbV9tbWFwX2d0dCAqYXJncyA9IGRhdGE7Ci0KLQlyZXR1cm4gaTkxNV9nZW1fbW1h cF9ndHQoZmlsZSwgZGV2LCBhcmdzLT5oYW5kbGUsICZhcmdzLT5vZmZzZXQpOwotfQotCiBib29s IGk5MTVfc2dfdHJpbShzdHJ1Y3Qgc2dfdGFibGUgKm9yaWdfc3QpCiB7CiAJc3RydWN0IHNnX3Rh YmxlIG5ld19zdDsKQEAgLTIwNTcsNyArMTUyNCw3IEBAIHN0YXRpYyB2b2lkIF9faTkxNV9nZW1f b2JqZWN0X2ZsdXNoX2Zvcl9kaXNwbGF5KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmop CiAJICogV2UgbWFudWFsbHkgZmx1c2ggdGhlIENQVSBkb21haW4gc28gdGhhdCB3ZSBjYW4gb3Zl cnJpZGUgYW5kCiAJICogZm9yY2UgdGhlIGZsdXNoIGZvciB0aGUgZGlzcGxheSwgYW5kIHBlcmZv cm0gaXQgYXN5bmNyaG9ub3VzbHkuCiAJICovCi0JZmx1c2hfd3JpdGVfZG9tYWluKG9iaiwgfkk5 MTVfR0VNX0RPTUFJTl9DUFUpOworCWk5MTVfZ2VtX29iamVjdF9mbHVzaF93cml0ZV9kb21haW4o b2JqLCB+STkxNV9HRU1fRE9NQUlOX0NQVSk7CiAJaWYgKG9iai0+Y2FjaGVfZGlydHkpCiAJCWk5 MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaiwgSTkxNV9DTEZMVVNIX0ZPUkNFKTsKIAlvYmotPndy aXRlX2RvbWFpbiA9IDA7CkBAIC0yMTExLDcgKzE1NzgsNyBAQCBpOTE1X2dlbV9vYmplY3Rfc2V0 X3RvX3djX2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBib29sIHdyaXRl KQogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlmbHVzaF93cml0ZV9kb21haW4ob2JqLCB+ STkxNV9HRU1fRE9NQUlOX1dDKTsKKwlpOTE1X2dlbV9vYmplY3RfZmx1c2hfd3JpdGVfZG9tYWlu KG9iaiwgfkk5MTVfR0VNX0RPTUFJTl9XQyk7CiAKIAkvKiBTZXJpYWxpc2UgZGlyZWN0IGFjY2Vz cyB0byB0aGlzIG9iamVjdCB3aXRoIHRoZSBiYXJyaWVycyBmb3IKIAkgKiBjb2hlcmVudCB3cml0 ZXMgZnJvbSB0aGUgR1BVLCBieSBlZmZlY3RpdmVseSBpbnZhbGlkYXRpbmcgdGhlCkBAIC0yMTcz LDcgKzE2NDAsNyBAQCBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4oc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgYm9vbCB3cml0ZSkKIAlpZiAocmV0KQogCQlyZXR1cm4g cmV0OwogCi0JZmx1c2hfd3JpdGVfZG9tYWluKG9iaiwgfkk5MTVfR0VNX0RPTUFJTl9HVFQpOwor CWk5MTVfZ2VtX29iamVjdF9mbHVzaF93cml0ZV9kb21haW4ob2JqLCB+STkxNV9HRU1fRE9NQUlO X0dUVCk7CiAKIAkvKiBTZXJpYWxpc2UgZGlyZWN0IGFjY2VzcyB0byB0aGlzIG9iamVjdCB3aXRo IHRoZSBiYXJyaWVycyBmb3IKIAkgKiBjb2hlcmVudCB3cml0ZXMgZnJvbSB0aGUgR1BVLCBieSBl ZmZlY3RpdmVseSBpbnZhbGlkYXRpbmcgdGhlCkBAIC0yMjgyLDcgKzE3NDksNyBAQCBpbnQgaTkx NV9nZW1fb2JqZWN0X3NldF9jYWNoZV9sZXZlbChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqLAogCQkJICogdGhlbiBkb3VibGUgY2hlY2sgaWYgdGhlIEdUVCBtYXBwaW5nIGlzIHN0aWxs CiAJCQkgKiB2YWxpZCBmb3IgdGhhdCBwb2ludGVyIGFjY2Vzcy4KIAkJCSAqLwotCQkJaTkxNV9n ZW1fcmVsZWFzZV9tbWFwKG9iaik7CisJCQlpOTE1X2dlbV9vYmplY3RfcmVsZWFzZV9tbWFwKG9i aik7CiAKIAkJCS8qIEFzIHdlIG5vIGxvbmdlciBuZWVkIGEgZmVuY2UgZm9yIEdUVCBhY2Nlc3Ms CiAJCQkgKiB3ZSBjYW4gcmVsaW5xdWlzaCBpdCBub3cgKGFuZCBzbyBwcmV2ZW50IGhhdmluZwpA QCAtMjUzNyw3ICsyMDA0LDcgQEAgaTkxNV9nZW1fb2JqZWN0X3NldF90b19jcHVfZG9tYWluKHN0 cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIGJvb2wgd3JpdGUpCiAJaWYgKHJldCkKIAkJ cmV0dXJuIHJldDsKIAotCWZsdXNoX3dyaXRlX2RvbWFpbihvYmosIH5JOTE1X0dFTV9ET01BSU5f Q1BVKTsKKwlpOTE1X2dlbV9vYmplY3RfZmx1c2hfd3JpdGVfZG9tYWluKG9iaiwgfkk5MTVfR0VN X0RPTUFJTl9DUFUpOwogCiAJLyogRmx1c2ggdGhlIENQVSBjYWNoZSBpZiBpdCdzIHN0aWxsIGlu dmFsaWQuICovCiAJaWYgKChvYmotPnJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DUFUp ID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGlu Zy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKaW5kZXggN2Q1Y2M5 Y2NmNmRkLi44NmQ2ZDkyY2NiYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ2VtX3RpbGluZy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGlu Zy5jCkBAIC0yOTksNyArMjk5LDcgQEAgaTkxNV9nZW1fb2JqZWN0X3NldF90aWxpbmcoc3RydWN0 IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAlpOTE1X2dlbV9vYmplY3RfdW5sb2NrKG9iaik7 CiAKIAkvKiBGb3JjZSB0aGUgZmVuY2UgdG8gYmUgcmVhY3F1aXJlZCBmb3IgR1RUIGFjY2VzcyAq LwotCWk5MTVfZ2VtX3JlbGVhc2VfbW1hcChvYmopOworCWk5MTVfZ2VtX29iamVjdF9yZWxlYXNl X21tYXAob2JqKTsKIAogCS8qIFRyeSB0byBwcmVhbGxvY2F0ZSBtZW1vcnkgcmVxdWlyZWQgdG8g c2F2ZSBzd2l6emxpbmcgb24gcHV0LXBhZ2VzICovCiAJaWYgKGk5MTVfZ2VtX29iamVjdF9uZWVk c19iaXQxN19zd2l6emxlKG9iaikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L3NlbGZ0ZXN0cy9pOTE1X2dlbV9vYmplY3QuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0 ZXN0cy9pOTE1X2dlbV9vYmplY3QuYwppbmRleCBiOThhMjg2YThiZTUuLmEzZGQyZjFiZTk1YiAx MDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfZ2VtX29iamVj dC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2dlbV9vYmplY3Qu YwpAQCAtODksNDkxICs4OSw2IEBAIHN0YXRpYyBpbnQgaWd0X2dlbV9odWdlKHZvaWQgKmFyZykK IAlyZXR1cm4gZXJyOwogfQogCi1zdHJ1Y3QgdGlsZSB7Ci0JdW5zaWduZWQgaW50IHdpZHRoOwot CXVuc2lnbmVkIGludCBoZWlnaHQ7Ci0JdW5zaWduZWQgaW50IHN0cmlkZTsKLQl1bnNpZ25lZCBp bnQgc2l6ZTsKLQl1bnNpZ25lZCBpbnQgdGlsaW5nOwotCXVuc2lnbmVkIGludCBzd2l6emxlOwot fTsKLQotc3RhdGljIHU2NCBzd2l6emxlX2JpdCh1bnNpZ25lZCBpbnQgYml0LCB1NjQgb2Zmc2V0 KQotewotCXJldHVybiAob2Zmc2V0ICYgQklUX1VMTChiaXQpKSA+PiAoYml0IC0gNik7Ci19Ci0K LXN0YXRpYyB1NjQgdGlsZWRfb2Zmc2V0KGNvbnN0IHN0cnVjdCB0aWxlICp0aWxlLCB1NjQgdikK LXsKLQl1NjQgeCwgeTsKLQotCWlmICh0aWxlLT50aWxpbmcgPT0gSTkxNV9USUxJTkdfTk9ORSkK LQkJcmV0dXJuIHY7Ci0KLQl5ID0gZGl2NjRfdTY0X3JlbSh2LCB0aWxlLT5zdHJpZGUsICZ4KTsK LQl2ID0gZGl2NjRfdTY0X3JlbSh5LCB0aWxlLT5oZWlnaHQsICZ5KSAqIHRpbGUtPnN0cmlkZSAq IHRpbGUtPmhlaWdodDsKLQotCWlmICh0aWxlLT50aWxpbmcgPT0gSTkxNV9USUxJTkdfWCkgewot CQl2ICs9IHkgKiB0aWxlLT53aWR0aDsKLQkJdiArPSBkaXY2NF91NjRfcmVtKHgsIHRpbGUtPndp ZHRoLCAmeCkgPDwgdGlsZS0+c2l6ZTsKLQkJdiArPSB4OwotCX0gZWxzZSBpZiAodGlsZS0+d2lk dGggPT0gMTI4KSB7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCB5dGlsZV9zcGFuID0gMTY7Ci0JCWNv bnN0IHVuc2lnbmVkIGludCB5dGlsZV9oZWlnaHQgPSA1MTI7Ci0KLQkJdiArPSB5ICogeXRpbGVf c3BhbjsKLQkJdiArPSBkaXY2NF91NjRfcmVtKHgsIHl0aWxlX3NwYW4sICZ4KSAqIHl0aWxlX2hl aWdodDsKLQkJdiArPSB4OwotCX0gZWxzZSB7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCB5dGlsZV9z cGFuID0gMzI7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCB5dGlsZV9oZWlnaHQgPSAyNTY7Ci0KLQkJ diArPSB5ICogeXRpbGVfc3BhbjsKLQkJdiArPSBkaXY2NF91NjRfcmVtKHgsIHl0aWxlX3NwYW4s ICZ4KSAqIHl0aWxlX2hlaWdodDsKLQkJdiArPSB4OwotCX0KLQotCXN3aXRjaCAodGlsZS0+c3dp enpsZSkgewotCWNhc2UgSTkxNV9CSVRfNl9TV0laWkxFXzk6Ci0JCXYgXj0gc3dpenpsZV9iaXQo OSwgdik7Ci0JCWJyZWFrOwotCWNhc2UgSTkxNV9CSVRfNl9TV0laWkxFXzlfMTA6Ci0JCXYgXj0g c3dpenpsZV9iaXQoOSwgdikgXiBzd2l6emxlX2JpdCgxMCwgdik7Ci0JCWJyZWFrOwotCWNhc2Ug STkxNV9CSVRfNl9TV0laWkxFXzlfMTE6Ci0JCXYgXj0gc3dpenpsZV9iaXQoOSwgdikgXiBzd2l6 emxlX2JpdCgxMSwgdik7Ci0JCWJyZWFrOwotCWNhc2UgSTkxNV9CSVRfNl9TV0laWkxFXzlfMTBf MTE6Ci0JCXYgXj0gc3dpenpsZV9iaXQoOSwgdikgXiBzd2l6emxlX2JpdCgxMCwgdikgXiBzd2l6 emxlX2JpdCgxMSwgdik7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiB2OwotfQotCi1zdGF0aWMg aW50IGNoZWNrX3BhcnRpYWxfbWFwcGluZyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2Jq LAotCQkJCSBjb25zdCBzdHJ1Y3QgdGlsZSAqdGlsZSwKLQkJCQkgdW5zaWduZWQgbG9uZyBlbmRf dGltZSkKLXsKLQljb25zdCB1bnNpZ25lZCBpbnQgbnJlYWwgPSBvYmotPnNjcmF0Y2ggLyBQQUdF X1NJWkU7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyBucGFnZXMgPSBvYmotPmJhc2Uuc2l6ZSAvIFBB R0VfU0laRTsKLQlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKLQl1bnNpZ25lZCBsb25nIHBhZ2U7Ci0J aW50IGVycjsKLQotCWlmIChpZ3RfdGltZW91dChlbmRfdGltZSwKLQkJCSIlczogdGltZWQgb3V0 IGJlZm9yZSB0aWxpbmc9JWQgc3RyaWRlPSVkXG4iLAotCQkJX19mdW5jX18sIHRpbGUtPnRpbGlu ZywgdGlsZS0+c3RyaWRlKSkKLQkJcmV0dXJuIC1FSU5UUjsKLQotCWVyciA9IGk5MTVfZ2VtX29i amVjdF9zZXRfdGlsaW5nKG9iaiwgdGlsZS0+dGlsaW5nLCB0aWxlLT5zdHJpZGUpOwotCWlmIChl cnIpIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0IHRpbGluZyBtb2RlPSV1LCBzdHJpZGU9JXUs IGVycj0lZFxuIiwKLQkJICAgICAgIHRpbGUtPnRpbGluZywgdGlsZS0+c3RyaWRlLCBlcnIpOwot CQlyZXR1cm4gZXJyOwotCX0KLQotCUdFTV9CVUdfT04oaTkxNV9nZW1fb2JqZWN0X2dldF90aWxp bmcob2JqKSAhPSB0aWxlLT50aWxpbmcpOwotCUdFTV9CVUdfT04oaTkxNV9nZW1fb2JqZWN0X2dl dF9zdHJpZGUob2JqKSAhPSB0aWxlLT5zdHJpZGUpOwotCi0JZm9yX2VhY2hfcHJpbWVfbnVtYmVy X2Zyb20ocGFnZSwgMSwgbnBhZ2VzKSB7Ci0JCXN0cnVjdCBpOTE1X2dndHRfdmlldyB2aWV3ID0K LQkJCWNvbXB1dGVfcGFydGlhbF92aWV3KG9iaiwgcGFnZSwgTUlOX0NIVU5LX1BBR0VTKTsKLQkJ dTMyIF9faW9tZW0gKmlvOwotCQlzdHJ1Y3QgcGFnZSAqcDsKLQkJdW5zaWduZWQgaW50IG47Ci0J CXU2NCBvZmZzZXQ7Ci0JCXUzMiAqY3B1OwotCi0JCUdFTV9CVUdfT04odmlldy5wYXJ0aWFsLnNp emUgPiBucmVhbCk7Ci0JCWNvbmRfcmVzY2hlZCgpOwotCi0JCWVyciA9IGk5MTVfZ2VtX29iamVj dF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIHRydWUpOwotCQlpZiAoZXJyKSB7Ci0JCQlwcl9lcnIo IkZhaWxlZCB0byBmbHVzaCB0byBHVFQgd3JpdGUgZG9tYWluOyBlcnI9JWRcbiIsCi0JCQkgICAg ICAgZXJyKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQotCQl2bWEgPSBpOTE1X2dlbV9vYmplY3Rf Z2d0dF9waW4ob2JqLCAmdmlldywgMCwgMCwgUElOX01BUFBBQkxFKTsKLQkJaWYgKElTX0VSUih2 bWEpKSB7Ci0JCQlwcl9lcnIoIkZhaWxlZCB0byBwaW4gcGFydGlhbCB2aWV3OiBvZmZzZXQ9JWx1 OyBlcnI9JWRcbiIsCi0JCQkgICAgICAgcGFnZSwgKGludClQVFJfRVJSKHZtYSkpOwotCQkJcmV0 dXJuIFBUUl9FUlIodm1hKTsKLQkJfQotCi0JCW4gPSBwYWdlIC0gdmlldy5wYXJ0aWFsLm9mZnNl dDsKLQkJR0VNX0JVR19PTihuID49IHZpZXcucGFydGlhbC5zaXplKTsKLQotCQlpbyA9IGk5MTVf dm1hX3Bpbl9pb21hcCh2bWEpOwotCQlpOTE1X3ZtYV91bnBpbih2bWEpOwotCQlpZiAoSVNfRVJS KGlvKSkgewotCQkJcHJfZXJyKCJGYWlsZWQgdG8gaW9tYXAgcGFydGlhbCB2aWV3OiBvZmZzZXQ9 JWx1OyBlcnI9JWRcbiIsCi0JCQkgICAgICAgcGFnZSwgKGludClQVFJfRVJSKGlvKSk7Ci0JCQly ZXR1cm4gUFRSX0VSUihpbyk7Ci0JCX0KLQotCQlpb3dyaXRlMzIocGFnZSwgaW8gKyBuICogUEFH RV9TSVpFL3NpemVvZigqaW8pKTsKLQkJaTkxNV92bWFfdW5waW5faW9tYXAodm1hKTsKLQotCQlv ZmZzZXQgPSB0aWxlZF9vZmZzZXQodGlsZSwgcGFnZSA8PCBQQUdFX1NISUZUKTsKLQkJaWYgKG9m ZnNldCA+PSBvYmotPmJhc2Uuc2l6ZSkKLQkJCWNvbnRpbnVlOwotCi0JCWZsdXNoX3dyaXRlX2Rv bWFpbihvYmosIH5JOTE1X0dFTV9ET01BSU5fQ1BVKTsKLQotCQlwID0gaTkxNV9nZW1fb2JqZWN0 X2dldF9wYWdlKG9iaiwgb2Zmc2V0ID4+IFBBR0VfU0hJRlQpOwotCQljcHUgPSBrbWFwKHApICsg b2Zmc2V0X2luX3BhZ2Uob2Zmc2V0KTsKLQkJZHJtX2NsZmx1c2hfdmlydF9yYW5nZShjcHUsIHNp emVvZigqY3B1KSk7Ci0JCWlmICgqY3B1ICE9ICh1MzIpcGFnZSkgewotCQkJcHJfZXJyKCJQYXJ0 aWFsIHZpZXcgZm9yICVsdSBbJXVdIChvZmZzZXQ9JWxsdSwgc2l6ZT0ldSBbJWxsdSwgcm93IHNp emUgJXVdLCBmZW5jZT0lZCwgdGlsaW5nPSVkLCBzdHJpZGU9JWQpIG1pc2FsaWdubWVudCwgZXhw ZWN0ZWQgd3JpdGUgdG8gcGFnZSAoJWxsdSArICV1IFsweCVsbHhdKSBvZiAweCV4LCBmb3VuZCAw eCV4XG4iLAotCQkJICAgICAgIHBhZ2UsIG4sCi0JCQkgICAgICAgdmlldy5wYXJ0aWFsLm9mZnNl dCwKLQkJCSAgICAgICB2aWV3LnBhcnRpYWwuc2l6ZSwKLQkJCSAgICAgICB2bWEtPnNpemUgPj4g UEFHRV9TSElGVCwKLQkJCSAgICAgICB0aWxlLT50aWxpbmcgPyB0aWxlX3Jvd19wYWdlcyhvYmop IDogMCwKLQkJCSAgICAgICB2bWEtPmZlbmNlID8gdm1hLT5mZW5jZS0+aWQgOiAtMSwgdGlsZS0+ dGlsaW5nLCB0aWxlLT5zdHJpZGUsCi0JCQkgICAgICAgb2Zmc2V0ID4+IFBBR0VfU0hJRlQsCi0J CQkgICAgICAgKHVuc2lnbmVkIGludClvZmZzZXRfaW5fcGFnZShvZmZzZXQpLAotCQkJICAgICAg IG9mZnNldCwKLQkJCSAgICAgICAodTMyKXBhZ2UsICpjcHUpOwotCQkJZXJyID0gLUVJTlZBTDsK LQkJfQotCQkqY3B1ID0gMDsKLQkJZHJtX2NsZmx1c2hfdmlydF9yYW5nZShjcHUsIHNpemVvZigq Y3B1KSk7Ci0JCWt1bm1hcChwKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJaTkx NV92bWFfZGVzdHJveSh2bWEpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGln dF9wYXJ0aWFsX3RpbGluZyh2b2lkICphcmcpCi17Ci0JY29uc3QgdW5zaWduZWQgaW50IG5yZWFs ID0gMSA8PCAxMjsgLyogbGFyZ2VzdCB0aWxlIHJvdyB4MiAqLwotCXN0cnVjdCBkcm1faTkxNV9w cml2YXRlICppOTE1ID0gYXJnOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7Ci0J aW50ZWxfd2FrZXJlZl90IHdha2VyZWY7Ci0JaW50IHRpbGluZzsKLQlpbnQgZXJyOwotCi0JLyog V2Ugd2FudCB0byBjaGVjayB0aGUgcGFnZSBtYXBwaW5nIGFuZCBmZW5jaW5nIG9mIGEgbGFyZ2Ug b2JqZWN0Ci0JICogbW1hcHBlZCB0aHJvdWdoIHRoZSBHVFQuIFRoZSBvYmplY3Qgd2UgY3JlYXRl IGlzIGxhcmdlciB0aGFuIGNhbgotCSAqIHBvc3NpYmx5IGJlIG1tYXBlZCBhcyBhIHdob2xlLCBh bmQgc28gd2UgbXVzdCB1c2UgcGFydGlhbCBHR1RUIHZtYS4KLQkgKiBXZSB0aGVuIGNoZWNrIHRo YXQgYSB3cml0ZSB0aHJvdWdoIGVhY2ggcGFydGlhbCBHR1RUIHZtYSBlbmRzIHVwCi0JICogaW4g dGhlIHJpZ2h0IHNldCBvZiBwYWdlcyB3aXRoaW4gdGhlIG9iamVjdCwgYW5kIHdpdGggdGhlIGV4 cGVjdGVkCi0JICogdGlsaW5nLCB3aGljaCB3ZSB2ZXJpZnkgYnkgbWFudWFsIHN3aXp6bGluZy4K LQkgKi8KLQotCW9iaiA9IGh1Z2VfZ2VtX29iamVjdChpOTE1LAotCQkJICAgICAgbnJlYWwgPDwg UEFHRV9TSElGVCwKLQkJCSAgICAgICgxICsgbmV4dF9wcmltZV9udW1iZXIoaTkxNS0+Z2d0dC52 bS50b3RhbCA+PiBQQUdFX1NISUZUKSkgPDwgUEFHRV9TSElGVCk7Ci0JaWYgKElTX0VSUihvYmop KQotCQlyZXR1cm4gUFRSX0VSUihvYmopOwotCi0JZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9w YWdlcyhvYmopOwotCWlmIChlcnIpIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgJXUg cGFnZXMgKCVsdSB0b3RhbCksIGVycj0lZFxuIiwKLQkJICAgICAgIG5yZWFsLCBvYmotPmJhc2Uu c2l6ZSAvIFBBR0VfU0laRSwgZXJyKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbXV0ZXhfbG9jaygm aTkxNS0+ZHJtLnN0cnVjdF9tdXRleCk7Ci0Jd2FrZXJlZiA9IGludGVsX3J1bnRpbWVfcG1fZ2V0 KGk5MTUpOwotCi0JaWYgKDEpIHsKLQkJSUdUX1RJTUVPVVQoZW5kKTsKLQkJc3RydWN0IHRpbGUg dGlsZTsKLQotCQl0aWxlLmhlaWdodCA9IDE7Ci0JCXRpbGUud2lkdGggPSAxOwotCQl0aWxlLnNp emUgPSAwOwotCQl0aWxlLnN0cmlkZSA9IDA7Ci0JCXRpbGUuc3dpenpsZSA9IEk5MTVfQklUXzZf U1dJWlpMRV9OT05FOwotCQl0aWxlLnRpbGluZyA9IEk5MTVfVElMSU5HX05PTkU7Ci0KLQkJZXJy ID0gY2hlY2tfcGFydGlhbF9tYXBwaW5nKG9iaiwgJnRpbGUsIGVuZCk7Ci0JCWlmIChlcnIgJiYg ZXJyICE9IC1FSU5UUikKLQkJCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQlmb3IgKHRpbGluZyA9 IEk5MTVfVElMSU5HX1g7IHRpbGluZyA8PSBJOTE1X1RJTElOR19ZOyB0aWxpbmcrKykgewotCQlJ R1RfVElNRU9VVChlbmQpOwotCQl1bnNpZ25lZCBpbnQgbWF4X3BpdGNoOwotCQl1bnNpZ25lZCBp bnQgcGl0Y2g7Ci0JCXN0cnVjdCB0aWxlIHRpbGU7Ci0KLQkJaWYgKGk5MTUtPnF1aXJrcyAmIFFV SVJLX1BJTl9TV0laWkxFRF9QQUdFUykKLQkJCS8qCi0JCQkgKiBUaGUgc3dpenpsaW5nIHBhdHRl cm4gaXMgYWN0dWFsbHkgdW5rbm93biBhcyBpdAotCQkJICogdmFyaWVzIGJhc2VkIG9uIHBoeXNp Y2FsIGFkZHJlc3Mgb2YgZWFjaCBwYWdlLgotCQkJICogU2VlIGk5MTVfZ2VtX2RldGVjdF9iaXRf Nl9zd2l6emxlKCkuCi0JCQkgKi8KLQkJCWJyZWFrOwotCi0JCXRpbGUudGlsaW5nID0gdGlsaW5n OwotCQlzd2l0Y2ggKHRpbGluZykgewotCQljYXNlIEk5MTVfVElMSU5HX1g6Ci0JCQl0aWxlLnN3 aXp6bGUgPSBpOTE1LT5tbS5iaXRfNl9zd2l6emxlX3g7Ci0JCQlicmVhazsKLQkJY2FzZSBJOTE1 X1RJTElOR19ZOgotCQkJdGlsZS5zd2l6emxlID0gaTkxNS0+bW0uYml0XzZfc3dpenpsZV95Owot CQkJYnJlYWs7Ci0JCX0KLQotCQlHRU1fQlVHX09OKHRpbGUuc3dpenpsZSA9PSBJOTE1X0JJVF82 X1NXSVpaTEVfVU5LTk9XTik7Ci0JCWlmICh0aWxlLnN3aXp6bGUgPT0gSTkxNV9CSVRfNl9TV0la WkxFXzlfMTcgfHwKLQkJICAgIHRpbGUuc3dpenpsZSA9PSBJOTE1X0JJVF82X1NXSVpaTEVfOV8x MF8xNykKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChJTlRFTF9HRU4oaTkxNSkgPD0gMikgewotCQkJ dGlsZS5oZWlnaHQgPSAxNjsKLQkJCXRpbGUud2lkdGggPSAxMjg7Ci0JCQl0aWxlLnNpemUgPSAx MTsKLQkJfSBlbHNlIGlmICh0aWxlLnRpbGluZyA9PSBJOTE1X1RJTElOR19ZICYmCi0JCQkgICBI QVNfMTI4X0JZVEVfWV9USUxJTkcoaTkxNSkpIHsKLQkJCXRpbGUuaGVpZ2h0ID0gMzI7Ci0JCQl0 aWxlLndpZHRoID0gMTI4OwotCQkJdGlsZS5zaXplID0gMTI7Ci0JCX0gZWxzZSB7Ci0JCQl0aWxl LmhlaWdodCA9IDg7Ci0JCQl0aWxlLndpZHRoID0gNTEyOwotCQkJdGlsZS5zaXplID0gMTI7Ci0J CX0KLQotCQlpZiAoSU5URUxfR0VOKGk5MTUpIDwgNCkKLQkJCW1heF9waXRjaCA9IDgxOTIgLyB0 aWxlLndpZHRoOwotCQllbHNlIGlmIChJTlRFTF9HRU4oaTkxNSkgPCA3KQotCQkJbWF4X3BpdGNo ID0gMTI4ICogSTk2NV9GRU5DRV9NQVhfUElUQ0hfVkFMIC8gdGlsZS53aWR0aDsKLQkJZWxzZQot CQkJbWF4X3BpdGNoID0gMTI4ICogR0VON19GRU5DRV9NQVhfUElUQ0hfVkFMIC8gdGlsZS53aWR0 aDsKLQotCQlmb3IgKHBpdGNoID0gbWF4X3BpdGNoOyBwaXRjaDsgcGl0Y2ggPj49IDEpIHsKLQkJ CXRpbGUuc3RyaWRlID0gdGlsZS53aWR0aCAqIHBpdGNoOwotCQkJZXJyID0gY2hlY2tfcGFydGlh bF9tYXBwaW5nKG9iaiwgJnRpbGUsIGVuZCk7Ci0JCQlpZiAoZXJyID09IC1FSU5UUikKLQkJCQln b3RvIG5leHRfdGlsaW5nOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIG91dF91bmxvY2s7Ci0KLQkJ CWlmIChwaXRjaCA+IDIgJiYgSU5URUxfR0VOKGk5MTUpID49IDQpIHsKLQkJCQl0aWxlLnN0cmlk ZSA9IHRpbGUud2lkdGggKiAocGl0Y2ggLSAxKTsKLQkJCQllcnIgPSBjaGVja19wYXJ0aWFsX21h cHBpbmcob2JqLCAmdGlsZSwgZW5kKTsKLQkJCQlpZiAoZXJyID09IC1FSU5UUikKLQkJCQkJZ290 byBuZXh0X3RpbGluZzsKLQkJCQlpZiAoZXJyKQotCQkJCQlnb3RvIG91dF91bmxvY2s7Ci0JCQl9 Ci0KLQkJCWlmIChwaXRjaCA8IG1heF9waXRjaCAmJiBJTlRFTF9HRU4oaTkxNSkgPj0gNCkgewot CQkJCXRpbGUuc3RyaWRlID0gdGlsZS53aWR0aCAqIChwaXRjaCArIDEpOwotCQkJCWVyciA9IGNo ZWNrX3BhcnRpYWxfbWFwcGluZyhvYmosICZ0aWxlLCBlbmQpOwotCQkJCWlmIChlcnIgPT0gLUVJ TlRSKQotCQkJCQlnb3RvIG5leHRfdGlsaW5nOwotCQkJCWlmIChlcnIpCi0JCQkJCWdvdG8gb3V0 X3VubG9jazsKLQkJCX0KLQkJfQotCi0JCWlmIChJTlRFTF9HRU4oaTkxNSkgPj0gNCkgewotCQkJ Zm9yX2VhY2hfcHJpbWVfbnVtYmVyKHBpdGNoLCBtYXhfcGl0Y2gpIHsKLQkJCQl0aWxlLnN0cmlk ZSA9IHRpbGUud2lkdGggKiBwaXRjaDsKLQkJCQllcnIgPSBjaGVja19wYXJ0aWFsX21hcHBpbmco b2JqLCAmdGlsZSwgZW5kKTsKLQkJCQlpZiAoZXJyID09IC1FSU5UUikKLQkJCQkJZ290byBuZXh0 X3RpbGluZzsKLQkJCQlpZiAoZXJyKQotCQkJCQlnb3RvIG91dF91bmxvY2s7Ci0JCQl9Ci0JCX0K LQotbmV4dF90aWxpbmc6IDsKLQl9Ci0KLW91dF91bmxvY2s6Ci0JaW50ZWxfcnVudGltZV9wbV9w dXQoaTkxNSwgd2FrZXJlZik7Ci0JbXV0ZXhfdW5sb2NrKCZpOTE1LT5kcm0uc3RydWN0X211dGV4 KTsKLQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKLW91dDoKLQlpOTE1X2dlbV9v YmplY3RfcHV0KG9iaik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBtYWtlX29ial9i dXN5KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCi17Ci0Jc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmk5MTUgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOwotCXN0cnVjdCBpOTE1X3Jl cXVlc3QgKnJxOwotCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOwotCWludCBlcnI7Ci0KLQl2bWEgPSBp OTE1X3ZtYV9pbnN0YW5jZShvYmosICZpOTE1LT5nZ3R0LnZtLCBOVUxMKTsKLQlpZiAoSVNfRVJS KHZtYSkpCi0JCXJldHVybiBQVFJfRVJSKHZtYSk7Ci0KLQllcnIgPSBpOTE1X3ZtYV9waW4odm1h LCAwLCAwLCBQSU5fVVNFUik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXJxID0gaTkx NV9yZXF1ZXN0X2NyZWF0ZShpOTE1LT5lbmdpbmVbUkNTMF0tPmtlcm5lbF9jb250ZXh0KTsKLQlp ZiAoSVNfRVJSKHJxKSkgewotCQlpOTE1X3ZtYV91bnBpbih2bWEpOwotCQlyZXR1cm4gUFRSX0VS UihycSk7Ci0JfQotCi0JZXJyID0gaTkxNV92bWFfbW92ZV90b19hY3RpdmUodm1hLCBycSwgRVhF Q19PQkpFQ1RfV1JJVEUpOwotCi0JaTkxNV9yZXF1ZXN0X2FkZChycSk7Ci0KLQlfX2k5MTVfZ2Vt X29iamVjdF9yZWxlYXNlX3VubGVzc19hY3RpdmUob2JqKTsKLQlpOTE1X3ZtYV91bnBpbih2bWEp OwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGJvb2wgYXNzZXJ0X21tYXBfb2Zmc2V0KHN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6 ZSwKLQkJCSAgICAgICBpbnQgZXhwZWN0ZWQpCi17Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iajsKLQlpbnQgZXJyOwotCi0Jb2JqID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9pbnRl cm5hbChpOTE1LCBzaXplKTsKLQlpZiAoSVNfRVJSKG9iaikpCi0JCXJldHVybiBQVFJfRVJSKG9i aik7Ci0KLQllcnIgPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX21tYXBfb2Zmc2V0KG9iaik7Ci0J aTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwotCi0JcmV0dXJuIGVyciA9PSBleHBlY3RlZDsKLX0K LQotc3RhdGljIHZvaWQgZGlzYWJsZV9yZXRpcmVfd29ya2VyKHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICppOTE1KQotewotCWk5MTVfZ2VtX3Nocmlua2VyX3VucmVnaXN0ZXIoaTkxNSk7Ci0KLQlp bnRlbF9ndF9wbV9nZXQoaTkxNSk7Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmk5MTUt PmdlbS5yZXRpcmVfd29yayk7Ci0JZmx1c2hfd29yaygmaTkxNS0+Z2VtLmlkbGVfd29yayk7Ci19 Ci0KLXN0YXRpYyB2b2lkIHJlc3RvcmVfcmV0aXJlX3dvcmtlcihzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqaTkxNSkKLXsKLQlpbnRlbF9ndF9wbV9wdXQoaTkxNSk7Ci0KLQltdXRleF9sb2NrKCZp OTE1LT5kcm0uc3RydWN0X211dGV4KTsKLQlpZ3RfZmx1c2hfdGVzdChpOTE1LCBJOTE1X1dBSVRf TE9DS0VEKTsKLQltdXRleF91bmxvY2soJmk5MTUtPmRybS5zdHJ1Y3RfbXV0ZXgpOwotCi0JaTkx NV9nZW1fc2hyaW5rZXJfcmVnaXN0ZXIoaTkxNSk7Ci19Ci0KLXN0YXRpYyBpbnQgaWd0X21tYXBf b2Zmc2V0X2V4aGF1c3Rpb24odm9pZCAqYXJnKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICppOTE1ID0gYXJnOwotCXN0cnVjdCBkcm1fbW0gKm1tID0gJmk5MTUtPmRybS52bWFfb2Zmc2V0 X21hbmFnZXItPnZtX2FkZHJfc3BhY2VfbW07Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iajsKLQlzdHJ1Y3QgZHJtX21tX25vZGUgcmVzdiwgKmhvbGU7Ci0JdTY0IGhvbGVfc3RhcnQs IGhvbGVfZW5kOwotCWludCBsb29wLCBlcnI7Ci0KLQkvKiBEaXNhYmxlIGJhY2tncm91bmQgcmVh cGVyICovCi0JZGlzYWJsZV9yZXRpcmVfd29ya2VyKGk5MTUpOwotCUdFTV9CVUdfT04oIWk5MTUt Pmd0LmF3YWtlKTsKLQotCS8qIFRyaW0gdGhlIGRldmljZSBtbWFwIHNwYWNlIHRvIG9ubHkgYSBw YWdlICovCi0JbWVtc2V0KCZyZXN2LCAwLCBzaXplb2YocmVzdikpOwotCWRybV9tbV9mb3JfZWFj aF9ob2xlKGhvbGUsIG1tLCBob2xlX3N0YXJ0LCBob2xlX2VuZCkgewotCQlyZXN2LnN0YXJ0ID0g aG9sZV9zdGFydDsKLQkJcmVzdi5zaXplID0gaG9sZV9lbmQgLSBob2xlX3N0YXJ0IC0gMTsgLyog UEFHRV9TSVpFIHVuaXRzICovCi0JCWVyciA9IGRybV9tbV9yZXNlcnZlX25vZGUobW0sICZyZXN2 KTsKLQkJaWYgKGVycikgewotCQkJcHJfZXJyKCJGYWlsZWQgdG8gdHJpbSBWTUEgbWFuYWdlciwg ZXJyPSVkXG4iLCBlcnIpOwotCQkJZ290byBvdXRfcGFyazsKLQkJfQotCQlicmVhazsKLQl9Ci0K LQkvKiBKdXN0IGZpdHMhICovCi0JaWYgKCFhc3NlcnRfbW1hcF9vZmZzZXQoaTkxNSwgUEFHRV9T SVpFLCAwKSkgewotCQlwcl9lcnIoIlVuYWJsZSB0byBpbnNlcnQgb2JqZWN0IGludG8gc2luZ2xl IHBhZ2UgaG9sZVxuIik7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8q IFRvbyBsYXJnZSAqLwotCWlmICghYXNzZXJ0X21tYXBfb2Zmc2V0KGk5MTUsIDIqUEFHRV9TSVpF LCAtRU5PU1BDKSkgewotCQlwcl9lcnIoIlVuZXhwZWN0ZWRseSBzdWNjZWVkZWQgaW4gaW5zZXJ0 aW5nIHRvbyBsYXJnZSBvYmplY3QgaW50byBzaW5nbGUgcGFnZSBob2xlXG4iKTsKLQkJZXJyID0g LUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogRmlsbCB0aGUgaG9sZSwgZnVydGhlciBh bGxvY2F0aW9uIGF0dGVtcHRzIHNob3VsZCB0aGVuIGZhaWwgKi8KLQlvYmogPSBpOTE1X2dlbV9v YmplY3RfY3JlYXRlX2ludGVybmFsKGk5MTUsIFBBR0VfU0laRSk7Ci0JaWYgKElTX0VSUihvYmop KSB7Ci0JCWVyciA9IFBUUl9FUlIob2JqKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZXJyID0gaTkx NV9nZW1fb2JqZWN0X2NyZWF0ZV9tbWFwX29mZnNldChvYmopOwotCWlmIChlcnIpIHsKLQkJcHJf ZXJyKCJVbmFibGUgdG8gaW5zZXJ0IG9iamVjdCBpbnRvIHJlY2xhaW1lZCBob2xlXG4iKTsKLQkJ Z290byBlcnJfb2JqOwotCX0KLQotCWlmICghYXNzZXJ0X21tYXBfb2Zmc2V0KGk5MTUsIFBBR0Vf U0laRSwgLUVOT1NQQykpIHsKLQkJcHJfZXJyKCJVbmV4cGVjdGVkbHkgc3VjY2VlZGVkIGluIGlu c2VydGluZyBvYmplY3QgaW50byBubyBob2xlcyFcbiIpOwotCQllcnIgPSAtRUlOVkFMOwotCQln b3RvIGVycl9vYmo7Ci0JfQotCi0JaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwotCi0JLyogTm93 IGZpbGwgd2l0aCBidXN5IGRlYWQgb2JqZWN0cyB0aGF0IHdlIGV4cGVjdCB0byByZWFwICovCi0J Zm9yIChsb29wID0gMDsgbG9vcCA8IDM7IGxvb3ArKykgewotCQlpbnRlbF93YWtlcmVmX3Qgd2Fr ZXJlZjsKLQotCQlpZiAoaTkxNV90ZXJtaW5hbGx5X3dlZGdlZChpOTE1KSkKLQkJCWJyZWFrOwot Ci0JCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50ZXJuYWwoaTkxNSwgUEFHRV9TSVpF KTsKLQkJaWYgKElTX0VSUihvYmopKSB7Ci0JCQllcnIgPSBQVFJfRVJSKG9iaik7Ci0JCQlnb3Rv IG91dDsKLQkJfQotCi0JCWVyciA9IDA7Ci0JCW11dGV4X2xvY2soJmk5MTUtPmRybS5zdHJ1Y3Rf bXV0ZXgpOwotCQl3aXRoX2ludGVsX3J1bnRpbWVfcG0oaTkxNSwgd2FrZXJlZikKLQkJCWVyciA9 IG1ha2Vfb2JqX2J1c3kob2JqKTsKLQkJbXV0ZXhfdW5sb2NrKCZpOTE1LT5kcm0uc3RydWN0X211 dGV4KTsKLQkJaWYgKGVycikgewotCQkJcHJfZXJyKCJbbG9vcCAlZF0gRmFpbGVkIHRvIGJ1c3kg dGhlIG9iamVjdFxuIiwgbG9vcCk7Ci0JCQlnb3RvIGVycl9vYmo7Ci0JCX0KLQotCQkvKiBOQiB3 ZSByZWx5IG9uIHRoZSBfYWN0aXZlXyByZWZlcmVuY2UgdG8gYWNjZXNzIG9iaiBub3cgKi8KLQkJ R0VNX0JVR19PTighaTkxNV9nZW1fb2JqZWN0X2lzX2FjdGl2ZShvYmopKTsKLQkJZXJyID0gaTkx NV9nZW1fb2JqZWN0X2NyZWF0ZV9tbWFwX29mZnNldChvYmopOwotCQlpZiAoZXJyKSB7Ci0JCQlw cl9lcnIoIltsb29wICVkXSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX21tYXBfb2Zmc2V0IGZhaWxl ZCB3aXRoIGVycj0lZFxuIiwKLQkJCSAgICAgICBsb29wLCBlcnIpOwotCQkJZ290byBvdXQ7Ci0J CX0KLQl9Ci0KLW91dDoKLQlkcm1fbW1fcmVtb3ZlX25vZGUoJnJlc3YpOwotb3V0X3Bhcms6Ci0J cmVzdG9yZV9yZXRpcmVfd29ya2VyKGk5MTUpOwotCXJldHVybiBlcnI7Ci1lcnJfb2JqOgotCWk5 MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKLQlnb3RvIG91dDsKLX0KLQogaW50IGk5MTVfZ2VtX29i amVjdF9tb2NrX3NlbGZ0ZXN0cyh2b2lkKQogewogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTkxNV9z dWJ0ZXN0IHRlc3RzW10gPSB7CkBAIC01OTYsOCArMTExLDYgQEAgaW50IGk5MTVfZ2VtX29iamVj dF9saXZlX3NlbGZ0ZXN0cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKIHsKIAlzdGF0 aWMgY29uc3Qgc3RydWN0IGk5MTVfc3VidGVzdCB0ZXN0c1tdID0gewogCQlTVUJURVNUKGlndF9n ZW1faHVnZSksCi0JCVNVQlRFU1QoaWd0X3BhcnRpYWxfdGlsaW5nKSwKLQkJU1VCVEVTVChpZ3Rf bW1hcF9vZmZzZXRfZXhoYXVzdGlvbiksCiAJfTsKIAogCXJldHVybiBpOTE1X3N1YnRlc3RzKHRl c3RzLCBpOTE1KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9p OTE1X2xpdmVfc2VsZnRlc3RzLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkx NV9saXZlX3NlbGZ0ZXN0cy5oCmluZGV4IDZkNzY2OTI1YWQwNC4uYmJmMzg3ZGU4ZGIzIDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0 cy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRl c3RzLmgKQEAgLTE2LDYgKzE2LDcgQEAgc2VsZnRlc3QodGltZWxpbmVzLCBpOTE1X3RpbWVsaW5l X2xpdmVfc2VsZnRlc3RzKQogc2VsZnRlc3QocmVxdWVzdHMsIGk5MTVfcmVxdWVzdF9saXZlX3Nl bGZ0ZXN0cykKIHNlbGZ0ZXN0KGFjdGl2ZSwgaTkxNV9hY3RpdmVfbGl2ZV9zZWxmdGVzdHMpCiBz ZWxmdGVzdChvYmplY3RzLCBpOTE1X2dlbV9vYmplY3RfbGl2ZV9zZWxmdGVzdHMpCitzZWxmdGVz dChtbWFuLCBpOTE1X2dlbV9tbWFuX2xpdmVfc2VsZnRlc3RzKQogc2VsZnRlc3QoZG1hYnVmLCBp OTE1X2dlbV9kbWFidWZfbGl2ZV9zZWxmdGVzdHMpCiBzZWxmdGVzdChjb2hlcmVuY3ksIGk5MTVf Z2VtX2NvaGVyZW5jeV9saXZlX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KGd0dCwgaTkxNV9nZW1fZ3R0 X2xpdmVfc2VsZnRlc3RzKQotLSAKMi4yMC4xCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9pbnRlbC1nZng=