From mboxrd@z Thu Jan 1 00:00:00 1970 From: Joonas Lahtinen Subject: [PATCH v2] drm/i915: Split out i915_vma.c Date: Thu, 10 Nov 2016 12:05:04 +0200 Message-ID: <1478772304-29773-1-git-send-email-joonas.lahtinen@linux.intel.com> References: <1478768144-11087-1-git-send-email-joonas.lahtinen@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by gabe.freedesktop.org (Postfix) with ESMTPS id B30346E7A4 for ; Thu, 10 Nov 2016 10:05:56 +0000 (UTC) In-Reply-To: <1478768144-11087-1-git-send-email-joonas.lahtinen@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Intel graphics driver community testing & development List-Id: intel-gfx@lists.freedesktop.org QXMgYSBzaWRlIHByb2R1Y3QsIGhhZCB0byBzcGxpdCB0d28gb3RoZXIgZmlsZXM7Ci0gaTkxNV9n ZW1fZmVuY2VfcmVnLmgKLSBpOTE1X2dlbV9vYmplY3QuaCAob25seSBwYXJ0cyB0aGF0IG5lZWRl ZCBpbW1lZGlhdGUgdW50YW5nbGVtZW50KQoKSSB0cmllZCB0byBtb3ZlIGNvZGUgaW4gYXMgYmln IGNodW5rcyBhcyBwb3NzaWJsZSwgdG8gbWFrZSByZXZpZXcKZWFzaWVyLiBpOTE1X3ZtYV9jb21w YXJlIHdhcyBtb3ZlZCB0byBhIGhlYWRlci4KCnYyOgotIFVzZSBpOTE1X2dlbV9mZW5jZV9yZWcu e2MsaH0KCkNjOiBUdnJ0a28gVXJzdWxpbiA8dHZydGtvLnVyc3VsaW5AaW50ZWwuY29tPgpDYzog Q2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+ClNpZ25lZC1vZmYtYnk6IEpv b25hcyBMYWh0aW5lbiA8am9vbmFzLmxhaHRpbmVuQGxpbnV4LmludGVsLmNvbT4KLS0tCiBkcml2 ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZSAgICAgICAgICAgICB8ICAgMyArLQogZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9kcnYuaCAgICAgICAgICAgfCAzODUgKy0tLS0tLS0tLS0tLS0tLQog ZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyAgICAgICAgICAgfCAzNzAgLS0tLS0tLS0t LS0tLS0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9mZW5jZS5jICAgICB8IDcyMiAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf Z2VtX2ZlbmNlX3JlZy5jIHwgNzIyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2VfcmVnLmggfCAgNTEgKysrCiBkcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYyAgICAgICB8IDI3NiArLS0tLS0tLS0tLS0KIGRy aXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5oICAgICAgIHwgMjI1ICstLS0tLS0tLS0K IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVjdC5oICAgIHwgMzM3ICsrKysrKysr KysrKysrCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9yZXF1ZXN0LmggICB8ICAgMyAr CiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3ZtYS5jICAgICAgICAgICB8IDY0OCArKysrKysr KysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdm1hLmggICAg ICAgICAgIHwgMzQyICsrKysrKysrKysrKysrCiAxMiBmaWxlcyBjaGFuZ2VkLCAyMTI0IGluc2Vy dGlvbnMoKyksIDE5NjAgZGVsZXRpb25zKC0pCiBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2UuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZ2VtX2ZlbmNlX3JlZy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2VfcmVnLmgKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9vYmplY3QuaAogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdm1hLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3ZtYS5oCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQppbmRleCAw ODU3ZTUwLi4zZGVhNDZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmls ZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQpAQCAtMzMsNyArMzMsNyBAQCBp OTE1LXkgKz0gaTkxNV9jbWRfcGFyc2VyLm8gXAogCSAgaTkxNV9nZW1fZG1hYnVmLm8gXAogCSAg aTkxNV9nZW1fZXZpY3QubyBcCiAJICBpOTE1X2dlbV9leGVjYnVmZmVyLm8gXAotCSAgaTkxNV9n ZW1fZmVuY2UubyBcCisJICBpOTE1X2dlbV9mZW5jZV9yZWcubyBcCiAJICBpOTE1X2dlbV9ndHQu byBcCiAJICBpOTE1X2dlbV9pbnRlcm5hbC5vIFwKIAkgIGk5MTVfZ2VtLm8gXApAQCAtNDUsNiAr NDUsNyBAQCBpOTE1LXkgKz0gaTkxNV9jbWRfcGFyc2VyLm8gXAogCSAgaTkxNV9nZW1fdGltZWxp bmUubyBcCiAJICBpOTE1X2dlbV91c2VycHRyLm8gXAogCSAgaTkxNV90cmFjZV9wb2ludHMubyBc CisJICBpOTE1X3ZtYS5vIFwKIAkgIGludGVsX2JyZWFkY3J1bWJzLm8gXAogCSAgaW50ZWxfZW5n aW5lX2NzLm8gXAogCSAgaW50ZWxfaGFuZ2NoZWNrLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgK aW5kZXggZDg2ODk3OS4uNDE0YTViMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv aTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCkBAIC02MCwx MSArNjAsMTUgQEAKICNpbmNsdWRlICJpbnRlbF9yaW5nYnVmZmVyLmgiCiAKICNpbmNsdWRlICJp OTE1X2dlbS5oIgorI2luY2x1ZGUgImk5MTVfZ2VtX2ZlbmNlX3JlZy5oIgorI2luY2x1ZGUgImk5 MTVfZ2VtX29iamVjdC5oIgogI2luY2x1ZGUgImk5MTVfZ2VtX2d0dC5oIgogI2luY2x1ZGUgImk5 MTVfZ2VtX3JlbmRlcl9zdGF0ZS5oIgogI2luY2x1ZGUgImk5MTVfZ2VtX3JlcXVlc3QuaCIKICNp bmNsdWRlICJpOTE1X2dlbV90aW1lbGluZS5oIgogCisjaW5jbHVkZSAiaTkxNV92bWEuaCIKKwog I2luY2x1ZGUgImludGVsX2d2dC5oIgogCiAvKiBHZW5lcmFsIGN1c3RvbWl6YXRpb246CkBAIC00 NTksMjMgKzQ2Myw2IEBAIHN0cnVjdCBpbnRlbF9vcHJlZ2lvbiB7CiBzdHJ1Y3QgaW50ZWxfb3Zl cmxheTsKIHN0cnVjdCBpbnRlbF9vdmVybGF5X2Vycm9yX3N0YXRlOwogCi1zdHJ1Y3QgZHJtX2k5 MTVfZmVuY2VfcmVnIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7Ci0Jc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmk5MTU7Ci0Jc3RydWN0IGk5MTVfdm1hICp2bWE7Ci0JaW50IHBpbl9jb3VudDsK LQlpbnQgaWQ7Ci0JLyoqCi0JICogV2hldGhlciB0aGUgdGlsaW5nIHBhcmFtZXRlcnMgZm9yIHRo ZSBjdXJyZW50bHkKLQkgKiBhc3NvY2lhdGVkIGZlbmNlIHJlZ2lzdGVyIGhhdmUgY2hhbmdlZC4g Tm90ZSB0aGF0Ci0JICogZm9yIHRoZSBwdXJwb3NlcyBvZiB0cmFja2luZyB0aWxpbmcgY2hhbmdl cyB3ZSBhbHNvCi0JICogdHJlYXQgdGhlIHVuZmVuY2VkIHJlZ2lzdGVyLCB0aGUgcmVnaXN0ZXIg c2xvdCB0aGF0Ci0JICogdGhlIG9iamVjdCBvY2N1cGllcyB3aGlsc3QgaXQgZXhlY3V0ZXMgYSBm ZW5jZWQKLQkgKiBjb21tYW5kIChzdWNoIGFzIEJMVCBvbiBnZW4yLzMpLCBhcyBhICJmZW5jZSIu Ci0JICovCi0JYm9vbCBkaXJ0eTsKLX07Ci0KIHN0cnVjdCBzZHZvX2RldmljZV9tYXBwaW5nIHsK IAl1OCBpbml0aWFsaXplZDsKIAl1OCBkdm9fcG9ydDsKQEAgLTIxNzgsMzEgKzIxNjUsNiBAQCBl bnVtIGhkbWlfZm9yY2VfYXVkaW8gewogCiAjZGVmaW5lIEk5MTVfR1RUX09GRlNFVF9OT05FICgo dTMyKS0xKQogCi1zdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdF9vcHMgewotCXVuc2lnbmVkIGlu dCBmbGFnczsKLSNkZWZpbmUgSTkxNV9HRU1fT0JKRUNUX0hBU19TVFJVQ1RfUEFHRSAweDEKLSNk ZWZpbmUgSTkxNV9HRU1fT0JKRUNUX0lTX1NIUklOS0FCTEUgICAweDIKLQotCS8qIEludGVyZmFj ZSBiZXR3ZWVuIHRoZSBHRU0gb2JqZWN0IGFuZCBpdHMgYmFja2luZyBzdG9yYWdlLgotCSAqIGdl dF9wYWdlcygpIGlzIGNhbGxlZCBvbmNlIHByaW9yIHRvIHRoZSB1c2Ugb2YgdGhlIGFzc29jaWF0 ZWQgc2V0Ci0JICogb2YgcGFnZXMgYmVmb3JlIHRvIGJpbmRpbmcgdGhlbSBpbnRvIHRoZSBHVFQs IGFuZCBwdXRfcGFnZXMoKSBpcwotCSAqIGNhbGxlZCBhZnRlciB3ZSBubyBsb25nZXIgbmVlZCB0 aGVtLiBBcyB3ZSBleHBlY3QgdGhlcmUgdG8gYmUKLQkgKiBhc3NvY2lhdGVkIGNvc3Qgd2l0aCBt aWdyYXRpbmcgcGFnZXMgYmV0d2VlbiB0aGUgYmFja2luZyBzdG9yYWdlCi0JICogYW5kIG1ha2lu ZyB0aGVtIGF2YWlsYWJsZSBmb3IgdGhlIEdQVSAoZS5nLiBjbGZsdXNoKSwgd2UgbWF5IGhvbGQK LQkgKiBvbnRvIHRoZSBwYWdlcyBhZnRlciB0aGV5IGFyZSBubyBsb25nZXIgcmVmZXJlbmNlZCBi eSB0aGUgR1BVCi0JICogaW4gY2FzZSB0aGV5IG1heSBiZSB1c2VkIGFnYWluIHNob3J0bHkgKGZv ciBleGFtcGxlIG1pZ3JhdGluZyB0aGUKLQkgKiBwYWdlcyB0byBhIGRpZmZlcmVudCBtZW1vcnkg ZG9tYWluIHdpdGhpbiB0aGUgR1RUKS4gcHV0X3BhZ2VzKCkKLQkgKiB3aWxsIHRoZXJlZm9yZSBt b3N0IGxpa2VseSBiZSBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGl0c2VsZiBpcwotCSAqIGJlaW5n IHJlbGVhc2VkIG9yIHVuZGVyIG1lbW9yeSBwcmVzc3VyZSAod2hlcmUgd2UgYXR0ZW1wdCB0bwot CSAqIHJlYXAgcGFnZXMgZm9yIHRoZSBzaHJpbmtlcikuCi0JICovCi0Jc3RydWN0IHNnX3RhYmxl ICooKmdldF9wYWdlcykoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKik7Ci0Jdm9pZCAoKnB1 dF9wYWdlcykoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKiwgc3RydWN0IHNnX3RhYmxlICop OwotCi0JaW50ICgqZG1hYnVmX2V4cG9ydCkoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKik7 Ci0Jdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICopOwotfTsKLQog LyoKICAqIEZyb250YnVmZmVyIHRyYWNraW5nIGJpdHMuIFNldCBpbiBvYmotPmZyb250YnVmZmVy X2JpdHMgd2hpbGUgYSBnZW0gYm8gaXMKICAqIGNvbnNpZGVyZWQgdG8gYmUgdGhlIGZyb250YnVm ZmVyIGZvciB0aGUgZ2l2ZW4gcGxhbmUgaW50ZXJmYWNlLXdpc2UuIFRoaXMKQEAgLTIyMjQsMjky ICsyMTg2LDYgQEAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Rfb3BzIHsKICNkZWZpbmUgSU5U RUxfRlJPTlRCVUZGRVJfQUxMX01BU0socGlwZSkgXAogCSgweGZmIDw8IChJTlRFTF9GUk9OVEJV RkZFUl9CSVRTX1BFUl9QSVBFICogKHBpcGUpKSkKIAotc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgewotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCBiYXNlOwotCi0JY29uc3Qgc3RydWN0IGRybV9p OTE1X2dlbV9vYmplY3Rfb3BzICpvcHM7Ci0KLQkvKiogTGlzdCBvZiBWTUFzIGJhY2tlZCBieSB0 aGlzIG9iamVjdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgdm1hX2xpc3Q7Ci0Jc3RydWN0IHJiX3Jv b3Qgdm1hX3RyZWU7Ci0KLQkvKiogU3RvbGVuIG1lbW9yeSBmb3IgdGhpcyBvYmplY3QsIGluc3Rl YWQgb2YgYmVpbmcgYmFja2VkIGJ5IHNobWVtLiAqLwotCXN0cnVjdCBkcm1fbW1fbm9kZSAqc3Rv bGVuOwotCXN0cnVjdCBsaXN0X2hlYWQgZ2xvYmFsX2xpc3Q7Ci0JdW5pb24gewotCQlzdHJ1Y3Qg cmN1X2hlYWQgcmN1OwotCQlzdHJ1Y3QgbGxpc3Rfbm9kZSBmcmVlZDsKLQl9OwotCi0JLyoqCi0J ICogV2hldGhlciB0aGUgb2JqZWN0IGlzIGN1cnJlbnRseSBpbiB0aGUgR0dUVCBtbWFwLgotCSAq LwotCXN0cnVjdCBsaXN0X2hlYWQgdXNlcmZhdWx0X2xpbms7Ci0KLQkvKiogVXNlZCBpbiBleGVj YnVmIHRvIHRlbXBvcmFyaWx5IGhvbGQgYSByZWYgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIG9ial9l eGVjX2xpbms7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGJhdGNoX3Bvb2xfbGluazsKLQotCXVuc2ln bmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKioKLQkgKiBIYXZlIHdlIHRha2VuIGEgcmVmZXJlbmNlIGZv ciB0aGUgb2JqZWN0IGZvciBpbmNvbXBsZXRlIEdQVQotCSAqIGFjdGl2aXR5PwotCSAqLwotI2Rl ZmluZSBJOTE1X0JPX0FDVElWRV9SRUYgMAotCi0JLyoKLQkgKiBJcyB0aGUgb2JqZWN0IHRvIGJl IG1hcHBlZCBhcyByZWFkLW9ubHkgdG8gdGhlIEdQVQotCSAqIE9ubHkgaG9ub3VyZWQgaWYgaGFy ZHdhcmUgaGFzIHJlbGV2YW50IHB0ZSBiaXQKLQkgKi8KLQl1bnNpZ25lZCBsb25nIGd0X3JvOjE7 Ci0JdW5zaWduZWQgaW50IGNhY2hlX2xldmVsOjM7Ci0JdW5zaWduZWQgaW50IGNhY2hlX2RpcnR5 OjE7Ci0KLQlhdG9taWNfdCBmcm9udGJ1ZmZlcl9iaXRzOwotCXVuc2lnbmVkIGludCBmcm9udGJ1 ZmZlcl9nZ3R0X29yaWdpbjsgLyogd3JpdGUgb25jZSAqLwotCi0JLyoqIEN1cnJlbnQgdGlsaW5n IHN0cmlkZSBmb3IgdGhlIG9iamVjdCwgaWYgaXQncyB0aWxlZC4gKi8KLQl1bnNpZ25lZCBpbnQg dGlsaW5nX2FuZF9zdHJpZGU7Ci0jZGVmaW5lIEZFTkNFX01JTklNVU1fU1RSSURFIDEyOCAvKiBT ZWUgaTkxNV90aWxpbmdfb2soKSAqLwotI2RlZmluZSBUSUxJTkdfTUFTSyAoRkVOQ0VfTUlOSU1V TV9TVFJJREUtMSkKLSNkZWZpbmUgU1RSSURFX01BU0sgKH5USUxJTkdfTUFTSykKLQotCS8qKiBD b3VudCBvZiBWTUEgYWN0dWFsbHkgYm91bmQgYnkgdGhpcyBvYmplY3QgKi8KLQl1bnNpZ25lZCBp bnQgYmluZF9jb3VudDsKLQl1bnNpZ25lZCBpbnQgYWN0aXZlX2NvdW50OwotCXVuc2lnbmVkIGlu dCBwaW5fZGlzcGxheTsKLQotCXN0cnVjdCB7Ci0JCXN0cnVjdCBtdXRleCBsb2NrOyAvKiBwcm90 ZWN0cyB0aGUgcGFnZXMgYW5kIHRoZWlyIHVzZSAqLwotCQlhdG9taWNfdCBwYWdlc19waW5fY291 bnQ7Ci0KLQkJc3RydWN0IHNnX3RhYmxlICpwYWdlczsKLQkJdm9pZCAqbWFwcGluZzsKLQotCQlz dHJ1Y3QgaTkxNV9nZW1fb2JqZWN0X3BhZ2VfaXRlciB7Ci0JCQlzdHJ1Y3Qgc2NhdHRlcmxpc3Qg KnNnX3BvczsKLQkJCXVuc2lnbmVkIGludCBzZ19pZHg7IC8qIGluIHBhZ2VzLCBidXQgMzJiaXQg ZWVrISAqLwotCi0JCQlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290IHJhZGl4OwotCQkJc3RydWN0IG11 dGV4IGxvY2s7IC8qIHByb3RlY3RzIHRoaXMgY2FjaGUgKi8KLQkJfSBnZXRfcGFnZTsKLQotCQkv KioKLQkJICogQWR2aWNlOiBhcmUgdGhlIGJhY2tpbmcgcGFnZXMgcHVyZ2VhYmxlPwotCQkgKi8K LQkJdW5zaWduZWQgaW50IG1hZHY6MjsKLQotCQkvKioKLQkJICogVGhpcyBpcyBzZXQgaWYgdGhl IG9iamVjdCBoYXMgYmVlbiB3cml0dGVuIHRvIHNpbmNlIHRoZQotCQkgKiBwYWdlcyB3ZXJlIGxh c3QgYWNxdWlyZWQuCi0JCSAqLwotCQlib29sIGRpcnR5OjE7Ci0KLQkJLyoqCi0JCSAqIFRoaXMg aXMgc2V0IGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gcGlubmVkIGR1ZSB0byB1bmtub3duCi0JCSAq IHN3aXp6bGluZy4KLQkJICovCi0JCWJvb2wgcXVpcmtlZDoxOwotCX0gbW07Ci0KLQkvKiogQnJl YWRjcnVtYiBvZiBsYXN0IHJlbmRlcmluZyB0byB0aGUgYnVmZmVyLgotCSAqIFRoZXJlIGNhbiBv bmx5IGJlIG9uZSB3cml0ZXIsIGJ1dCB3ZSBhbGxvdyBmb3IgbXVsdGlwbGUgcmVhZGVycy4KLQkg KiBJZiB0aGVyZSBpcyBhIHdyaXRlciB0aGF0IG5lY2Vzc2FyaWx5IGltcGxpZXMgdGhhdCBhbGwg b3RoZXIKLQkgKiByZWFkIHJlcXVlc3RzIGFyZSBjb21wbGV0ZSAtIGJ1dCB3ZSBtYXkgb25seSBi ZSBsYXppbHkgY2xlYXJpbmcKLQkgKiB0aGUgcmVhZCByZXF1ZXN0cy4gQSByZWFkIHJlcXVlc3Qg aXMgbmF0dXJhbGx5IHRoZSBtb3N0IHJlY2VudAotCSAqIHJlcXVlc3Qgb24gYSByaW5nLCBzbyB3 ZSBtYXkgaGF2ZSB0d28gZGlmZmVyZW50IHdyaXRlIGFuZCByZWFkCi0JICogcmVxdWVzdHMgb24g b25lIHJpbmcgd2hlcmUgdGhlIHdyaXRlIHJlcXVlc3QgaXMgb2xkZXIgdGhhbiB0aGUKLQkgKiBy ZWFkIHJlcXVlc3QuIFRoaXMgYWxsb3dzIGZvciB0aGUgQ1BVIHRvIHJlYWQgZnJvbSBhbiBhY3Rp dmUKLQkgKiBidWZmZXIgYnkgb25seSB3YWl0aW5nIGZvciB0aGUgd3JpdGUgdG8gY29tcGxldGUu Ci0JICovCi0Jc3RydWN0IHJlc2VydmF0aW9uX29iamVjdCAqcmVzdjsKLQotCS8qKiBSZWZlcmVu Y2VzIGZyb20gZnJhbWVidWZmZXJzLCBsb2NrcyBvdXQgdGlsaW5nIGNoYW5nZXMuICovCi0JdW5z aWduZWQgbG9uZyBmcmFtZWJ1ZmZlcl9yZWZlcmVuY2VzOwotCi0JLyoqIFJlY29yZCBvZiBhZGRy ZXNzIGJpdCAxNyBvZiBlYWNoIHBhZ2UgYXQgbGFzdCB1bmJpbmQuICovCi0JdW5zaWduZWQgbG9u ZyAqYml0XzE3OwotCi0Jc3RydWN0IGk5MTVfZ2VtX3VzZXJwdHIgewotCQl1aW50cHRyX3QgcHRy OwotCQl1bnNpZ25lZCByZWFkX29ubHkgOjE7Ci0KLQkJc3RydWN0IGk5MTVfbW1fc3RydWN0ICpt bTsKLQkJc3RydWN0IGk5MTVfbW11X29iamVjdCAqbW11X29iamVjdDsKLQkJc3RydWN0IHdvcmtf c3RydWN0ICp3b3JrOwotCX0gdXNlcnB0cjsKLQotCS8qKiBmb3IgcGh5cyBhbGxvY2F0ZWQgb2Jq ZWN0cyAqLwotCXN0cnVjdCBkcm1fZG1hX2hhbmRsZSAqcGh5c19oYW5kbGU7Ci0KLQlzdHJ1Y3Qg cmVzZXJ2YXRpb25fb2JqZWN0IF9fYnVpbHRpbl9yZXN2OwotfTsKLQotc3RhdGljIGlubGluZSBz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCi10b19pbnRlbF9ibyhzdHJ1Y3QgZHJtX2dlbV9v YmplY3QgKmdlbSkKLXsKLQkvKiBBc3NlcnQgdGhhdCB0b19pbnRlbF9ibyhOVUxMKSA9PSBOVUxM ICovCi0JQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LCBi YXNlKSk7Ci0KLQlyZXR1cm4gY29udGFpbmVyX29mKGdlbSwgc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QsIGJhc2UpOwotfQotCi0vKioKLSAqIGk5MTVfZ2VtX29iamVjdF9sb29rdXBfcmN1IC0g bG9vayB1cCBhIHRlbXBvcmFyeSBHRU0gb2JqZWN0IGZyb20gaXRzIGhhbmRsZQotICogQGZpbHA6 IERSTSBmaWxlIHByaXZhdGUgZGF0ZQotICogQGhhbmRsZTogdXNlcnNwYWNlIGhhbmRsZQotICoK LSAqIFJldHVybnM6Ci0gKgotICogQSBwb2ludGVyIHRvIHRoZSBvYmplY3QgbmFtZWQgYnkgdGhl IGhhbmRsZSBpZiBzdWNoIGV4aXN0cyBvbiBAZmlscCwgTlVMTAotICogb3RoZXJ3aXNlLiBUaGlz IG9iamVjdCBpcyBvbmx5IHZhbGlkIHdoaWxzdCB1bmRlciB0aGUgUkNVIHJlYWQgbG9jaywgYW5k Ci0gKiBub3RlIGNhcmVmdWxseSB0aGUgb2JqZWN0IG1heSBiZSBpbiB0aGUgcHJvY2VzcyBvZiBi ZWluZyBkZXN0cm95ZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKgotaTkxNV9nZW1fb2JqZWN0X2xvb2t1cF9yY3Uoc3RydWN0IGRybV9maWxlICpmaWxl LCB1MzIgaGFuZGxlKQotewotI2lmZGVmIENPTkZJR19MT0NLREVQCi0JV0FSTl9PTihkZWJ1Z19s b2NrcyAmJiAhbG9ja19pc19oZWxkKCZyY3VfbG9ja19tYXApKTsKLSNlbmRpZgotCXJldHVybiBp ZHJfZmluZCgmZmlsZS0+b2JqZWN0X2lkciwgaGFuZGxlKTsKLX0KLQotc3RhdGljIGlubGluZSBz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCi1pOTE1X2dlbV9vYmplY3RfbG9va3VwKHN0cnVj dCBkcm1fZmlsZSAqZmlsZSwgdTMyIGhhbmRsZSkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9s b29rdXBfcmN1KGZpbGUsIGhhbmRsZSk7Ci0JaWYgKG9iaiAmJiAha3JlZl9nZXRfdW5sZXNzX3pl cm8oJm9iai0+YmFzZS5yZWZjb3VudCkpCi0JCW9iaiA9IE5VTEw7Ci0JcmN1X3JlYWRfdW5sb2Nr KCk7Ci0KLQlyZXR1cm4gb2JqOwotfQotCi1fX2RlcHJlY2F0ZWQKLWV4dGVybiBzdHJ1Y3QgZHJt X2dlbV9vYmplY3QgKgotZHJtX2dlbV9vYmplY3RfbG9va3VwKHN0cnVjdCBkcm1fZmlsZSAqZmls ZSwgdTMyIGhhbmRsZSk7Ci0KLV9fYXR0cmlidXRlX18oKG5vbm51bGwpKQotc3RhdGljIGlubGlu ZSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCi1pOTE1X2dlbV9vYmplY3RfZ2V0KHN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCi17Ci0JZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNl KCZvYmotPmJhc2UpOwotCXJldHVybiBvYmo7Ci19Ci0KLV9fZGVwcmVjYXRlZAotZXh0ZXJuIHZv aWQgZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKTsKLQot X19hdHRyaWJ1dGVfXygobm9ubnVsbCkpCi1zdGF0aWMgaW5saW5lIHZvaWQKLWk5MTVfZ2VtX29i amVjdF9wdXQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQlfX2RybV9nZW1f b2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwotfQotCi1fX2RlcHJlY2F0ZWQKLWV4dGVy biB2b2lkIGRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAq KTsKLQotX19kZXByZWNhdGVkCi1leHRlcm4gdm9pZCBkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5j ZV91bmxvY2tlZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKik7Ci0KLXN0YXRpYyBpbmxpbmUgYm9v bAotaTkxNV9nZW1fb2JqZWN0X2lzX2RlYWQoY29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iaikKLXsKLQlyZXR1cm4gYXRvbWljX3JlYWQoJm9iai0+YmFzZS5yZWZjb3VudC5yZWZj b3VudCkgPT0gMDsKLX0KLQotc3RhdGljIGlubGluZSBib29sCi1pOTE1X2dlbV9vYmplY3RfaGFz X3N0cnVjdF9wYWdlKGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCi17Ci0J cmV0dXJuIG9iai0+b3BzLT5mbGFncyAmIEk5MTVfR0VNX09CSkVDVF9IQVNfU1RSVUNUX1BBR0U7 Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotaTkxNV9nZW1fb2JqZWN0X2lzX3Nocmlua2FibGUo Y29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQlyZXR1cm4gb2JqLT5v cHMtPmZsYWdzICYgSTkxNV9HRU1fT0JKRUNUX0lTX1NIUklOS0FCTEU7Ci19Ci0KLXN0YXRpYyBp bmxpbmUgYm9vbAotaTkxNV9nZW1fb2JqZWN0X2lzX2FjdGl2ZShjb25zdCBzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqKQotewotCXJldHVybiBvYmotPmFjdGl2ZV9jb3VudDsKLX0KLQot c3RhdGljIGlubGluZSBib29sCi1pOTE1X2dlbV9vYmplY3RfaGFzX2FjdGl2ZV9yZWZlcmVuY2Uo Y29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQlyZXR1cm4gdGVzdF9i aXQoSTkxNV9CT19BQ1RJVkVfUkVGLCAmb2JqLT5mbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUg dm9pZAotaTkxNV9nZW1fb2JqZWN0X3NldF9hY3RpdmVfcmVmZXJlbmNlKHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmopCi17Ci0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmb2JqLT5iYXNlLmRl di0+c3RydWN0X211dGV4KTsKLQlfX3NldF9iaXQoSTkxNV9CT19BQ1RJVkVfUkVGLCAmb2JqLT5m bGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotaTkxNV9nZW1fb2JqZWN0X2NsZWFyX2Fj dGl2ZV9yZWZlcmVuY2Uoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQlsb2Nr ZGVwX2Fzc2VydF9oZWxkKCZvYmotPmJhc2UuZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCV9fY2xlYXJf Yml0KEk5MTVfQk9fQUNUSVZFX1JFRiwgJm9iai0+ZmxhZ3MpOwotfQotCi12b2lkIF9faTkxNV9n ZW1fb2JqZWN0X3JlbGVhc2VfdW5sZXNzX2FjdGl2ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqb2JqKTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWk5MTVfZ2VtX29iamVjdF9n ZXRfdGlsaW5nKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCi17Ci0JcmV0dXJuIG9i ai0+dGlsaW5nX2FuZF9zdHJpZGUgJiBUSUxJTkdfTUFTSzsKLX0KLQotc3RhdGljIGlubGluZSBi b29sCi1pOTE1X2dlbV9vYmplY3RfaXNfdGlsZWQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iaikKLXsKLQlyZXR1cm4gaTkxNV9nZW1fb2JqZWN0X2dldF90aWxpbmcob2JqKSAhPSBJOTE1 X1RJTElOR19OT05FOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotaTkxNV9nZW1f b2JqZWN0X2dldF9zdHJpZGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQly ZXR1cm4gb2JqLT50aWxpbmdfYW5kX3N0cmlkZSAmIFNUUklERV9NQVNLOwotfQotCi1zdGF0aWMg aW5saW5lIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKgotaTkxNV9nZW1fb2JqZWN0X2xhc3Rfd3Jp dGVfZW5naW5lKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCi17Ci0Jc3RydWN0IGlu dGVsX2VuZ2luZV9jcyAqZW5naW5lID0gTlVMTDsKLQlzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZTsK LQotCXJjdV9yZWFkX2xvY2soKTsKLQlmZW5jZSA9IHJlc2VydmF0aW9uX29iamVjdF9nZXRfZXhj bF9yY3Uob2JqLT5yZXN2KTsKLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCWlmIChmZW5jZSAmJiBk bWFfZmVuY2VfaXNfaTkxNShmZW5jZSkgJiYgIWRtYV9mZW5jZV9pc19zaWduYWxlZChmZW5jZSkp Ci0JCWVuZ2luZSA9IHRvX3JlcXVlc3QoZmVuY2UpLT5lbmdpbmU7Ci0JZG1hX2ZlbmNlX3B1dChm ZW5jZSk7Ci0KLQlyZXR1cm4gZW5naW5lOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpOTE1 X3ZtYSAqaTkxNV92bWFfZ2V0KHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCWk5MTVfZ2VtX29i amVjdF9nZXQodm1hLT5vYmopOwotCXJldHVybiB2bWE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9p ZCBpOTE1X3ZtYV9wdXQoc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JaTkxNV9nZW1fb2JqZWN0 X3B1dCh2bWEtPm9iaik7Ci19Ci0KIC8qCiAgKiBPcHRpbWlzZWQgU0dMIGl0ZXJhdG9yIGZvciBH RU0gb2JqZWN0cwogICovCkBAIC0zMjE3LDEzICsyODkzLDYgQEAgaTkxNV9nZW1fb2JqZWN0X2dn dHRfcGluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkgdTY0IGFsaWdubWVu dCwKIAkJCSB1NjQgZmxhZ3MpOwogCi1pbnQgaTkxNV92bWFfYmluZChzdHJ1Y3QgaTkxNV92bWEg KnZtYSwgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVsLAotCQkgIHUzMiBmbGFncyk7 Ci12b2lkIF9faTkxNV92bWFfc2V0X21hcF9hbmRfZmVuY2VhYmxlKHN0cnVjdCBpOTE1X3ZtYSAq dm1hKTsKLWludCBfX211c3RfY2hlY2sgaTkxNV92bWFfdW5iaW5kKHN0cnVjdCBpOTE1X3ZtYSAq dm1hKTsKLXZvaWQgaTkxNV92bWFfY2xvc2Uoc3RydWN0IGk5MTVfdm1hICp2bWEpOwotdm9pZCBp OTE1X3ZtYV9kZXN0cm95KHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsKLQogaW50IGk5MTVfZ2VtX29i amVjdF91bmJpbmQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CiB2b2lkIGk5MTVf Z2VtX3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIApAQCAt MzQ3Myw1NCArMzE0MiwxMCBAQCBpOTE1X2dlbV9vYmplY3RfZ2d0dF9vZmZzZXQoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm8sCiAJcmV0dXJuIGk5MTVfZ2d0dF9vZmZzZXQoaTkxNV9nZW1f b2JqZWN0X3RvX2dndHQobywgdmlldykpOwogfQogCi0vKiBpOTE1X2dlbV9mZW5jZS5jICovCisv KiBpOTE1X2dlbV9mZW5jZV9yZWcuYyAqLwogaW50IF9fbXVzdF9jaGVjayBpOTE1X3ZtYV9nZXRf ZmVuY2Uoc3RydWN0IGk5MTVfdm1hICp2bWEpOwogaW50IF9fbXVzdF9jaGVjayBpOTE1X3ZtYV9w dXRfZmVuY2Uoc3RydWN0IGk5MTVfdm1hICp2bWEpOwogCi0vKioKLSAqIGk5MTVfdm1hX3Bpbl9m ZW5jZSAtIHBpbiBmZW5jaW5nIHN0YXRlCi0gKiBAdm1hOiB2bWEgdG8gcGluIGZlbmNpbmcgZm9y Ci0gKgotICogVGhpcyBwaW5zIHRoZSBmZW5jaW5nIHN0YXRlICh3aGV0aGVyIHRpbGVkIG9yIHVu dGlsZWQpIHRvIG1ha2Ugc3VyZSB0aGUKLSAqIHZtYSAoYW5kIGl0cyBvYmplY3QpIGlzIHJlYWR5 IHRvIGJlIHVzZWQgYXMgYSBzY2Fub3V0IHRhcmdldC4gRmVuY2luZwotICogc3RhdHVzIG11c3Qg YmUgc3luY2hyb25pemUgZmlyc3QgYnkgY2FsbGluZyBpOTE1X3ZtYV9nZXRfZmVuY2UoKToKLSAq Ci0gKiBUaGUgcmVzdWx0aW5nIGZlbmNlIHBpbiByZWZlcmVuY2UgbXVzdCBiZSByZWxlYXNlZCBh Z2FpbiB3aXRoCi0gKiBpOTE1X3ZtYV91bnBpbl9mZW5jZSgpLgotICoKLSAqIFJldHVybnM6Ci0g KgotICogVHJ1ZSBpZiB0aGUgdm1hIGhhcyBhIGZlbmNlLCBmYWxzZSBvdGhlcndpc2UuCi0gKi8K LXN0YXRpYyBpbmxpbmUgYm9vbAotaTkxNV92bWFfcGluX2ZlbmNlKHN0cnVjdCBpOTE1X3ZtYSAq dm1hKQotewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnZtYS0+dm0tPmRldi0+c3RydWN0X211dGV4 KTsKLQlpZiAodm1hLT5mZW5jZSkgewotCQl2bWEtPmZlbmNlLT5waW5fY291bnQrKzsKLQkJcmV0 dXJuIHRydWU7Ci0JfSBlbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBpOTE1X3Zt YV91bnBpbl9mZW5jZSAtIHVucGluIGZlbmNpbmcgc3RhdGUKLSAqIEB2bWE6IHZtYSB0byB1bnBp biBmZW5jaW5nIGZvcgotICoKLSAqIFRoaXMgcmVsZWFzZXMgdGhlIGZlbmNlIHBpbiByZWZlcmVu Y2UgYWNxdWlyZWQgdGhyb3VnaAotICogaTkxNV92bWFfcGluX2ZlbmNlLiBJdCB3aWxsIGhhbmRs ZSBib3RoIG9iamVjdHMgd2l0aCBhbmQgd2l0aG91dCBhbgotICogYXR0YWNoZWQgZmVuY2UgY29y cmVjdGx5LCBjYWxsZXJzIGRvIG5vdCBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoaXMuCi0gKi8KLXN0 YXRpYyBpbmxpbmUgdm9pZAotaTkxNV92bWFfdW5waW5fZmVuY2Uoc3RydWN0IGk5MTVfdm1hICp2 bWEpCi17Ci0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmdm1hLT52bS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgp OwotCWlmICh2bWEtPmZlbmNlKSB7Ci0JCUdFTV9CVUdfT04odm1hLT5mZW5jZS0+cGluX2NvdW50 IDw9IDApOwotCQl2bWEtPmZlbmNlLT5waW5fY291bnQtLTsKLQl9Ci19Ci0KIHZvaWQgaTkxNV9n ZW1fcmVzdG9yZV9mZW5jZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIHZvaWQgaTkxNV9n ZW1fZGV0ZWN0X2JpdF82X3N3aXp6bGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV9nZW0uYwppbmRleCBhOTdmZGZhLi42NTdhNzJiIDEwMDY0NAotLS0gYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf Z2VtLmMKQEAgLTI4NzIsMTE3ICsyODcyLDYgQEAgaTkxNV9nZW1fd2FpdF9pb2N0bChzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiAJcmV0 dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgX19pOTE1X3ZtYV9pb3VubWFwKHN0cnVjdCBpOTE1 X3ZtYSAqdm1hKQotewotCUdFTV9CVUdfT04oaTkxNV92bWFfaXNfcGlubmVkKHZtYSkpOwotCi0J aWYgKHZtYS0+aW9tYXAgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JaW9fbWFwcGluZ191bm1hcCh2 bWEtPmlvbWFwKTsKLQl2bWEtPmlvbWFwID0gTlVMTDsKLX0KLQotaW50IGk5MTVfdm1hX3VuYmlu ZChzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqID0gdm1hLT5vYmo7Ci0JdW5zaWduZWQgbG9uZyBhY3RpdmU7Ci0JaW50IHJldDsKLQotCWxv Y2tkZXBfYXNzZXJ0X2hlbGQoJm9iai0+YmFzZS5kZXYtPnN0cnVjdF9tdXRleCk7Ci0KLQkvKiBG aXJzdCB3YWl0IHVwb24gYW55IGFjdGl2aXR5IGFzIHJldGlyaW5nIHRoZSByZXF1ZXN0IG1heQot CSAqIGhhdmUgc2lkZS1lZmZlY3RzIHN1Y2ggYXMgdW5waW5uaW5nIG9yIGV2ZW4gdW5iaW5kaW5n IHRoaXMgdm1hLgotCSAqLwotCWFjdGl2ZSA9IGk5MTVfdm1hX2dldF9hY3RpdmUodm1hKTsKLQlp ZiAoYWN0aXZlKSB7Ci0JCWludCBpZHg7Ci0KLQkJLyogV2hlbiBhIGNsb3NlZCBWTUEgaXMgcmV0 aXJlZCwgaXQgaXMgdW5ib3VuZCAtIGVlay4KLQkJICogSW4gb3JkZXIgdG8gcHJldmVudCBpdCBm cm9tIGJlaW5nIHJlY3Vyc2l2ZWx5IGNsb3NlZCwKLQkJICogdGFrZSBhIHBpbiBvbiB0aGUgdm1h IHNvIHRoYXQgdGhlIHNlY29uZCB1bmJpbmQgaXMKLQkJICogYWJvcnRlZC4KLQkJICoKLQkJICog RXZlbiBtb3JlIHNjYXJ5IGlzIHRoYXQgdGhlIHJldGlyZSBjYWxsYmFjayBtYXkgZnJlZQotCQkg KiB0aGUgb2JqZWN0IChsYXN0IGFjdGl2ZSB2bWEpLiBUbyBwcmV2ZW50IHRoZSBleHBsb3Npb24K LQkJICogd2UgZGVmZXIgdGhlIGFjdHVhbCBvYmplY3QgZnJlZSB0byBhIHdvcmtlciB0aGF0IGNh bgotCQkgKiBvbmx5IHByb2NlZWQgb25jZSBpdCBhY3F1aXJlcyB0aGUgc3RydWN0X211dGV4ICh3 aGljaAotCQkgKiB3ZSBjdXJyZW50bHkgaG9sZCwgdGhlcmVmb3JlIGl0IGNhbm5vdCBmcmVlIHRo aXMgb2JqZWN0Ci0JCSAqIGJlZm9yZSB3ZSBhcmUgZmluaXNoZWQpLgotCQkgKi8KLQkJX19pOTE1 X3ZtYV9waW4odm1hKTsKLQotCQlmb3JfZWFjaF9hY3RpdmUoYWN0aXZlLCBpZHgpIHsKLQkJCXJl dCA9IGk5MTVfZ2VtX2FjdGl2ZV9yZXRpcmUoJnZtYS0+bGFzdF9yZWFkW2lkeF0sCi0JCQkJCQkg ICAmdm1hLT52bS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQkJaWYgKHJldCkKLQkJCQlicmVhazsK LQkJfQotCi0JCV9faTkxNV92bWFfdW5waW4odm1hKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiBy ZXQ7Ci0KLQkJR0VNX0JVR19PTihpOTE1X3ZtYV9pc19hY3RpdmUodm1hKSk7Ci0JfQotCi0JaWYg KGk5MTVfdm1hX2lzX3Bpbm5lZCh2bWEpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JaWYgKCFkcm1f bW1fbm9kZV9hbGxvY2F0ZWQoJnZtYS0+bm9kZSkpCi0JCWdvdG8gZGVzdHJveTsKLQotCUdFTV9C VUdfT04ob2JqLT5iaW5kX2NvdW50ID09IDApOwotCUdFTV9CVUdfT04oIW9iai0+bW0ucGFnZXMp OwotCi0JaWYgKGk5MTVfdm1hX2lzX21hcF9hbmRfZmVuY2VhYmxlKHZtYSkpIHsKLQkJLyogcmVs ZWFzZSB0aGUgZmVuY2UgcmVnIF9hZnRlcl8gZmx1c2hpbmcgKi8KLQkJcmV0ID0gaTkxNV92bWFf cHV0X2ZlbmNlKHZtYSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCS8qIEZvcmNl IGEgcGFnZWZhdWx0IGZvciBkb21haW4gdHJhY2tpbmcgb24gbmV4dCB1c2VyIGFjY2VzcyAqLwot CQlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2JqKTsKLQotCQlfX2k5MTVfdm1hX2lvdW5tYXAodm1h KTsKLQkJdm1hLT5mbGFncyAmPSB+STkxNV9WTUFfQ0FOX0ZFTkNFOwotCX0KLQotCWlmIChsaWtl bHkoIXZtYS0+dm0tPmNsb3NlZCkpIHsKLQkJdHJhY2VfaTkxNV92bWFfdW5iaW5kKHZtYSk7Ci0J CXZtYS0+dm0tPnVuYmluZF92bWEodm1hKTsKLQl9Ci0Jdm1hLT5mbGFncyAmPSB+KEk5MTVfVk1B X0dMT0JBTF9CSU5EIHwgSTkxNV9WTUFfTE9DQUxfQklORCk7Ci0KLQlkcm1fbW1fcmVtb3ZlX25v ZGUoJnZtYS0+bm9kZSk7Ci0JbGlzdF9tb3ZlX3RhaWwoJnZtYS0+dm1fbGluaywgJnZtYS0+dm0t PnVuYm91bmRfbGlzdCk7Ci0KLQlpZiAodm1hLT5wYWdlcyAhPSBvYmotPm1tLnBhZ2VzKSB7Ci0J CUdFTV9CVUdfT04oIXZtYS0+cGFnZXMpOwotCQlzZ19mcmVlX3RhYmxlKHZtYS0+cGFnZXMpOwot CQlrZnJlZSh2bWEtPnBhZ2VzKTsKLQl9Ci0Jdm1hLT5wYWdlcyA9IE5VTEw7Ci0KLQkvKiBTaW5j ZSB0aGUgdW5ib3VuZCBsaXN0IGlzIGdsb2JhbCwgb25seSBtb3ZlIHRvIHRoYXQgbGlzdCBpZgot CSAqIG5vIG1vcmUgVk1BcyBleGlzdC4gKi8KLQlpZiAoLS1vYmotPmJpbmRfY291bnQgPT0gMCkK LQkJbGlzdF9tb3ZlX3RhaWwoJm9iai0+Z2xvYmFsX2xpc3QsCi0JCQkgICAgICAgJnRvX2k5MTUo b2JqLT5iYXNlLmRldiktPm1tLnVuYm91bmRfbGlzdCk7Ci0KLQkvKiBBbmQgZmluYWxseSBub3cg dGhlIG9iamVjdCBpcyBjb21wbGV0ZWx5IGRlY291cGxlZCBmcm9tIHRoaXMgdm1hLAotCSAqIHdl IGNhbiBkcm9wIGl0cyBob2xkIG9uIHRoZSBiYWNraW5nIHN0b3JhZ2UgYW5kIGFsbG93IGl0IHRv IGJlCi0JICogcmVhcGVkIGJ5IHRoZSBzaHJpbmtlci4KLQkgKi8KLQlpOTE1X2dlbV9vYmplY3Rf dW5waW5fcGFnZXMob2JqKTsKLQotZGVzdHJveToKLQlpZiAodW5saWtlbHkoaTkxNV92bWFfaXNf Y2xvc2VkKHZtYSkpKQotCQlpOTE1X3ZtYV9kZXN0cm95KHZtYSk7Ci0KLQlyZXR1cm4gMDsKLX0K LQogc3RhdGljIGludCB3YWl0X2Zvcl90aW1lbGluZShzdHJ1Y3QgaTkxNV9nZW1fdGltZWxpbmUg KnRsLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJaW50IHJldCwgaTsKQEAgLTMwMTAsMTcxICsy ODk5LDYgQEAgaW50IGk5MTVfZ2VtX3dhaXRfZm9yX2lkbGUoc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmk5MTUsIHVuc2lnbmVkIGludCBmbGFncykKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJv b2wgaTkxNV9nZW1fdmFsaWRfZ3R0X3NwYWNlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkJCSAg ICAgdW5zaWduZWQgbG9uZyBjYWNoZV9sZXZlbCkKLXsKLQlzdHJ1Y3QgZHJtX21tX25vZGUgKmd0 dF9zcGFjZSA9ICZ2bWEtPm5vZGU7Ci0Jc3RydWN0IGRybV9tbV9ub2RlICpvdGhlcjsKLQotCS8q Ci0JICogT24gc29tZSBtYWNoaW5lcyB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgd2hlbiBwdXR0aW5n IGRpZmZlcmluZyB0eXBlcwotCSAqIG9mIHNub29wYWJsZSBtZW1vcnkgdG9nZXRoZXIgdG8gYXZv aWQgdGhlIHByZWZldGNoZXIgY3Jvc3NpbmcgbWVtb3J5Ci0JICogZG9tYWlucyBhbmQgZHlpbmcu IER1cmluZyB2bSBpbml0aWFsaXNhdGlvbiwgd2UgZGVjaWRlIHdoZXRoZXIgb3Igbm90Ci0JICog dGhlc2UgY29uc3RyYWludHMgYXBwbHkgYW5kIHNldCB0aGUgZHJtX21tLmNvbG9yX2FkanVzdAot CSAqIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JaWYgKHZtYS0+dm0tPm1tLmNvbG9yX2FkanVzdCA9 PSBOVUxMKQotCQlyZXR1cm4gdHJ1ZTsKLQotCWlmICghZHJtX21tX25vZGVfYWxsb2NhdGVkKGd0 dF9zcGFjZSkpCi0JCXJldHVybiB0cnVlOwotCi0JaWYgKGxpc3RfZW1wdHkoJmd0dF9zcGFjZS0+ bm9kZV9saXN0KSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlvdGhlciA9IGxpc3RfZW50cnkoZ3R0X3Nw YWNlLT5ub2RlX2xpc3QucHJldiwgc3RydWN0IGRybV9tbV9ub2RlLCBub2RlX2xpc3QpOwotCWlm IChvdGhlci0+YWxsb2NhdGVkICYmICFvdGhlci0+aG9sZV9mb2xsb3dzICYmIG90aGVyLT5jb2xv ciAhPSBjYWNoZV9sZXZlbCkKLQkJcmV0dXJuIGZhbHNlOwotCi0Jb3RoZXIgPSBsaXN0X2VudHJ5 KGd0dF9zcGFjZS0+bm9kZV9saXN0Lm5leHQsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbm9kZV9saXN0 KTsKLQlpZiAob3RoZXItPmFsbG9jYXRlZCAmJiAhZ3R0X3NwYWNlLT5ob2xlX2ZvbGxvd3MgJiYg b3RoZXItPmNvbG9yICE9IGNhY2hlX2xldmVsKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4g dHJ1ZTsKLX0KLQotLyoqCi0gKiBpOTE1X3ZtYV9pbnNlcnQgLSBmaW5kcyBhIHNsb3QgZm9yIHRo ZSB2bWEgaW4gaXRzIGFkZHJlc3Mgc3BhY2UKLSAqIEB2bWE6IHRoZSB2bWEKLSAqIEBzaXplOiBy ZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcyAoY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBWTUEpCi0gKiBA YWxpZ25tZW50OiByZXF1aXJlZCBhbGlnbm1lbnQKLSAqIEBmbGFnczogbWFzayBvZiBQSU5fKiBm bGFncyB0byB1c2UKLSAqCi0gKiBGaXJzdCB3ZSB0cnkgdG8gYWxsb2NhdGUgc29tZSBmcmVlIHNw YWNlIHRoYXQgbWVldHMgdGhlIHJlcXVpcmVtZW50cyBmb3IKLSAqIHRoZSBWTUEuIEZhaWxpaW5n IHRoYXQsIGlmIHRoZSBmbGFncyBwZXJtaXQsIGl0IHdpbGwgZXZpY3QgYW4gb2xkIFZNQSwKLSAq IHByZWZlcnJhYmx5IHRoZSBvbGRlc3QgaWRsZSBlbnRyeSB0byBtYWtlIHJvb20gZm9yIHRoZSBu ZXcgVk1BLgotICoKLSAqIFJldHVybnM6Ci0gKiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9y IGNvZGUgb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgaW50Ci1pOTE1X3ZtYV9pbnNlcnQoc3RydWN0 IGk5MTVfdm1hICp2bWEsIHU2NCBzaXplLCB1NjQgYWxpZ25tZW50LCB1NjQgZmxhZ3MpCi17Ci0J c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNSh2bWEtPnZtLT5kZXYp OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPm9iajsKLQl1NjQgc3Rh cnQsIGVuZDsKLQlpbnQgcmV0OwotCi0JR0VNX0JVR19PTih2bWEtPmZsYWdzICYgKEk5MTVfVk1B X0dMT0JBTF9CSU5EIHwgSTkxNV9WTUFfTE9DQUxfQklORCkpOwotCUdFTV9CVUdfT04oZHJtX21t X25vZGVfYWxsb2NhdGVkKCZ2bWEtPm5vZGUpKTsKLQotCXNpemUgPSBtYXgoc2l6ZSwgdm1hLT5z aXplKTsKLQlpZiAoZmxhZ3MgJiBQSU5fTUFQUEFCTEUpCi0JCXNpemUgPSBpOTE1X2dlbV9nZXRf Z2d0dF9zaXplKGRldl9wcml2LCBzaXplLAotCQkJCQkgICAgICBpOTE1X2dlbV9vYmplY3RfZ2V0 X3RpbGluZyhvYmopKTsKLQotCWFsaWdubWVudCA9IG1heChtYXgoYWxpZ25tZW50LCB2bWEtPmRp c3BsYXlfYWxpZ25tZW50KSwKLQkJCWk5MTVfZ2VtX2dldF9nZ3R0X2FsaWdubWVudChkZXZfcHJp diwgc2l6ZSwKLQkJCQkJCSAgICBpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyhvYmopLAotCQkJ CQkJICAgIGZsYWdzICYgUElOX01BUFBBQkxFKSk7Ci0KLQlzdGFydCA9IGZsYWdzICYgUElOX09G RlNFVF9CSUFTID8gZmxhZ3MgJiBQSU5fT0ZGU0VUX01BU0sgOiAwOwotCi0JZW5kID0gdm1hLT52 bS0+dG90YWw7Ci0JaWYgKGZsYWdzICYgUElOX01BUFBBQkxFKQotCQllbmQgPSBtaW5fdCh1NjQs IGVuZCwgZGV2X3ByaXYtPmdndHQubWFwcGFibGVfZW5kKTsKLQlpZiAoZmxhZ3MgJiBQSU5fWk9O RV80RykKLQkJZW5kID0gbWluX3QodTY0LCBlbmQsICgxVUxMIDw8IDMyKSAtIFBBR0VfU0laRSk7 Ci0KLQkvKiBJZiBiaW5kaW5nIHRoZSBvYmplY3QvR0dUVCB2aWV3IHJlcXVpcmVzIG1vcmUgc3Bh Y2UgdGhhbiB0aGUgZW50aXJlCi0JICogYXBlcnR1cmUgaGFzLCByZWplY3QgaXQgZWFybHkgYmVm b3JlIGV2aWN0aW5nIGV2ZXJ5dGhpbmcgaW4gYSB2YWluCi0JICogYXR0ZW1wdCB0byBmaW5kIHNw YWNlLgotCSAqLwotCWlmIChzaXplID4gZW5kKSB7Ci0JCURSTV9ERUJVRygiQXR0ZW1wdGluZyB0 byBiaW5kIGFuIG9iamVjdCBsYXJnZXIgdGhhbiB0aGUgYXBlcnR1cmU6IHJlcXVlc3Q9JWxsdSBb b2JqZWN0PSV6ZF0gPiAlcyBhcGVydHVyZT0lbGx1XG4iLAotCQkJICBzaXplLCBvYmotPmJhc2Uu c2l6ZSwKLQkJCSAgZmxhZ3MgJiBQSU5fTUFQUEFCTEUgPyAibWFwcGFibGUiIDogInRvdGFsIiwK LQkJCSAgZW5kKTsKLQkJcmV0dXJuIC1FMkJJRzsKLQl9Ci0KLQlyZXQgPSBpOTE1X2dlbV9vYmpl Y3RfcGluX3BhZ2VzKG9iaik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChmbGFn cyAmIFBJTl9PRkZTRVRfRklYRUQpIHsKLQkJdTY0IG9mZnNldCA9IGZsYWdzICYgUElOX09GRlNF VF9NQVNLOwotCQlpZiAob2Zmc2V0ICYgKGFsaWdubWVudCAtIDEpIHx8IG9mZnNldCA+IGVuZCAt IHNpemUpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycl91bnBpbjsKLQkJfQotCi0J CXZtYS0+bm9kZS5zdGFydCA9IG9mZnNldDsKLQkJdm1hLT5ub2RlLnNpemUgPSBzaXplOwotCQl2 bWEtPm5vZGUuY29sb3IgPSBvYmotPmNhY2hlX2xldmVsOwotCQlyZXQgPSBkcm1fbW1fcmVzZXJ2 ZV9ub2RlKCZ2bWEtPnZtLT5tbSwgJnZtYS0+bm9kZSk7Ci0JCWlmIChyZXQpIHsKLQkJCXJldCA9 IGk5MTVfZ2VtX2V2aWN0X2Zvcl92bWEodm1hKTsKLQkJCWlmIChyZXQgPT0gMCkKLQkJCQlyZXQg PSBkcm1fbW1fcmVzZXJ2ZV9ub2RlKCZ2bWEtPnZtLT5tbSwgJnZtYS0+bm9kZSk7Ci0JCQlpZiAo cmV0KQotCQkJCWdvdG8gZXJyX3VucGluOwotCQl9Ci0JfSBlbHNlIHsKLQkJdTMyIHNlYXJjaF9m bGFnLCBhbGxvY19mbGFnOwotCi0JCWlmIChmbGFncyAmIFBJTl9ISUdIKSB7Ci0JCQlzZWFyY2hf ZmxhZyA9IERSTV9NTV9TRUFSQ0hfQkVMT1c7Ci0JCQlhbGxvY19mbGFnID0gRFJNX01NX0NSRUFU RV9UT1A7Ci0JCX0gZWxzZSB7Ci0JCQlzZWFyY2hfZmxhZyA9IERSTV9NTV9TRUFSQ0hfREVGQVVM VDsKLQkJCWFsbG9jX2ZsYWcgPSBEUk1fTU1fQ1JFQVRFX0RFRkFVTFQ7Ci0JCX0KLQotCQkvKiBX ZSBvbmx5IGFsbG9jYXRlIGluIFBBR0VfU0laRS9HVFRfUEFHRV9TSVpFICg0MDk2KSBjaHVua3Ms Ci0JCSAqIHNvIHdlIGtub3cgdGhhdCB3ZSBhbHdheXMgaGF2ZSBhIG1pbmltdW0gYWxpZ25tZW50 IG9mIDQwOTYuCi0JCSAqIFRoZSBkcm1fbW0gcmFuZ2UgbWFuYWdlciBpcyBvcHRpbWlzZWQgdG8g cmV0dXJuIHJlc3VsdHMKLQkJICogd2l0aCB6ZXJvIGFsaWdubWVudCwgc28gd2hlcmUgcG9zc2li bGUgdXNlIHRoZSBvcHRpbWFsCi0JCSAqIHBhdGguCi0JCSAqLwotCQlpZiAoYWxpZ25tZW50IDw9 IDQwOTYpCi0JCQlhbGlnbm1lbnQgPSAwOwotCi1zZWFyY2hfZnJlZToKLQkJcmV0ID0gZHJtX21t X2luc2VydF9ub2RlX2luX3JhbmdlX2dlbmVyaWMoJnZtYS0+dm0tPm1tLAotCQkJCQkJCSAgJnZt YS0+bm9kZSwKLQkJCQkJCQkgIHNpemUsIGFsaWdubWVudCwKLQkJCQkJCQkgIG9iai0+Y2FjaGVf bGV2ZWwsCi0JCQkJCQkJICBzdGFydCwgZW5kLAotCQkJCQkJCSAgc2VhcmNoX2ZsYWcsCi0JCQkJ CQkJICBhbGxvY19mbGFnKTsKLQkJaWYgKHJldCkgewotCQkJcmV0ID0gaTkxNV9nZW1fZXZpY3Rf c29tZXRoaW5nKHZtYS0+dm0sIHNpemUsIGFsaWdubWVudCwKLQkJCQkJCSAgICAgICBvYmotPmNh Y2hlX2xldmVsLAotCQkJCQkJICAgICAgIHN0YXJ0LCBlbmQsCi0JCQkJCQkgICAgICAgZmxhZ3Mp OwotCQkJaWYgKHJldCA9PSAwKQotCQkJCWdvdG8gc2VhcmNoX2ZyZWU7Ci0KLQkJCWdvdG8gZXJy X3VucGluOwotCQl9Ci0KLQkJR0VNX0JVR19PTih2bWEtPm5vZGUuc3RhcnQgPCBzdGFydCk7Ci0J CUdFTV9CVUdfT04odm1hLT5ub2RlLnN0YXJ0ICsgdm1hLT5ub2RlLnNpemUgPiBlbmQpOwotCX0K LQlHRU1fQlVHX09OKCFpOTE1X2dlbV92YWxpZF9ndHRfc3BhY2Uodm1hLCBvYmotPmNhY2hlX2xl dmVsKSk7Ci0KLQlsaXN0X21vdmVfdGFpbCgmb2JqLT5nbG9iYWxfbGlzdCwgJmRldl9wcml2LT5t bS5ib3VuZF9saXN0KTsKLQlsaXN0X21vdmVfdGFpbCgmdm1hLT52bV9saW5rLCAmdm1hLT52bS0+ aW5hY3RpdmVfbGlzdCk7Ci0Jb2JqLT5iaW5kX2NvdW50Kys7Ci0KLQlyZXR1cm4gMDsKLQotZXJy X3VucGluOgotCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOwotCXJldHVybiByZXQ7 Ci19Ci0KIGJvb2wKIGk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KHN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmosCiAJCQlib29sIGZvcmNlKQpAQCAtMzc2MywxMDAgKzM0ODcsNiBAQCBpOTE1 X2dlbV9yaW5nX3Rocm90dGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmls ZSAqZmlsZSkKIAlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7CiB9CiAKLXN0YXRpYyBib29sCi1p OTE1X3ZtYV9taXNwbGFjZWQoc3RydWN0IGk5MTVfdm1hICp2bWEsIHU2NCBzaXplLCB1NjQgYWxp Z25tZW50LCB1NjQgZmxhZ3MpCi17Ci0JaWYgKCFkcm1fbW1fbm9kZV9hbGxvY2F0ZWQoJnZtYS0+ bm9kZSkpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmICh2bWEtPm5vZGUuc2l6ZSA8IHNpemUpCi0J CXJldHVybiB0cnVlOwotCi0JaWYgKGFsaWdubWVudCAmJiB2bWEtPm5vZGUuc3RhcnQgJiAoYWxp Z25tZW50IC0gMSkpCi0JCXJldHVybiB0cnVlOwotCi0JaWYgKGZsYWdzICYgUElOX01BUFBBQkxF ICYmICFpOTE1X3ZtYV9pc19tYXBfYW5kX2ZlbmNlYWJsZSh2bWEpKQotCQlyZXR1cm4gdHJ1ZTsK LQotCWlmIChmbGFncyAmIFBJTl9PRkZTRVRfQklBUyAmJgotCSAgICB2bWEtPm5vZGUuc3RhcnQg PCAoZmxhZ3MgJiBQSU5fT0ZGU0VUX01BU0spKQotCQlyZXR1cm4gdHJ1ZTsKLQotCWlmIChmbGFn cyAmIFBJTl9PRkZTRVRfRklYRUQgJiYKLQkgICAgdm1hLT5ub2RlLnN0YXJ0ICE9IChmbGFncyAm IFBJTl9PRkZTRVRfTUFTSykpCi0JCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZhbHNlOwotfQot Ci12b2lkIF9faTkxNV92bWFfc2V0X21hcF9hbmRfZmVuY2VhYmxlKHN0cnVjdCBpOTE1X3ZtYSAq dm1hKQotewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPm9iajsKLQlz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYp OwotCWJvb2wgbWFwcGFibGUsIGZlbmNlYWJsZTsKLQl1MzIgZmVuY2Vfc2l6ZSwgZmVuY2VfYWxp Z25tZW50OwotCi0JZmVuY2Vfc2l6ZSA9IGk5MTVfZ2VtX2dldF9nZ3R0X3NpemUoZGV2X3ByaXYs Ci0JCQkJCSAgICB2bWEtPnNpemUsCi0JCQkJCSAgICBpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGlu ZyhvYmopKTsKLQlmZW5jZV9hbGlnbm1lbnQgPSBpOTE1X2dlbV9nZXRfZ2d0dF9hbGlnbm1lbnQo ZGV2X3ByaXYsCi0JCQkJCQkgICAgICB2bWEtPnNpemUsCi0JCQkJCQkgICAgICBpOTE1X2dlbV9v YmplY3RfZ2V0X3RpbGluZyhvYmopLAotCQkJCQkJICAgICAgdHJ1ZSk7Ci0KLQlmZW5jZWFibGUg PSAodm1hLT5ub2RlLnNpemUgPT0gZmVuY2Vfc2l6ZSAmJgotCQkgICAgICh2bWEtPm5vZGUuc3Rh cnQgJiAoZmVuY2VfYWxpZ25tZW50IC0gMSkpID09IDApOwotCi0JbWFwcGFibGUgPSAodm1hLT5u b2RlLnN0YXJ0ICsgZmVuY2Vfc2l6ZSA8PQotCQkgICAgZGV2X3ByaXYtPmdndHQubWFwcGFibGVf ZW5kKTsKLQotCS8qCi0JICogRXhwbGljaXRseSBkaXNhYmxlIGZvciByb3RhdGVkIFZNQSBzaW5j ZSB0aGUgZGlzcGxheSBkb2VzIG5vdAotCSAqIG5lZWQgdGhlIGZlbmNlIGFuZCB0aGUgVk1BIGlz IG5vdCBhY2Nlc3NpYmxlIHRvIG90aGVyIHVzZXJzLgotCSAqLwotCWlmIChtYXBwYWJsZSAmJiBm ZW5jZWFibGUgJiYKLQkgICAgdm1hLT5nZ3R0X3ZpZXcudHlwZSAhPSBJOTE1X0dHVFRfVklFV19S T1RBVEVEKQotCQl2bWEtPmZsYWdzIHw9IEk5MTVfVk1BX0NBTl9GRU5DRTsKLQllbHNlCi0JCXZt YS0+ZmxhZ3MgJj0gfkk5MTVfVk1BX0NBTl9GRU5DRTsKLX0KLQotaW50IF9faTkxNV92bWFfZG9f cGluKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkgICAgICB1NjQgc2l6ZSwgdTY0IGFsaWdubWVu dCwgdTY0IGZsYWdzKQotewotCXVuc2lnbmVkIGludCBib3VuZCA9IHZtYS0+ZmxhZ3M7Ci0JaW50 IHJldDsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnZtYS0+dm0tPmRldi0+c3RydWN0X211dGV4 KTsKLQlHRU1fQlVHX09OKChmbGFncyAmIChQSU5fR0xPQkFMIHwgUElOX1VTRVIpKSA9PSAwKTsK LQlHRU1fQlVHX09OKChmbGFncyAmIFBJTl9HTE9CQUwpICYmICFpOTE1X3ZtYV9pc19nZ3R0KHZt YSkpOwotCi0JaWYgKFdBUk5fT04oYm91bmQgJiBJOTE1X1ZNQV9QSU5fT1ZFUkZMT1cpKSB7Ci0J CXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKChib3VuZCAmIEk5MTVfVk1B X0JJTkRfTUFTSykgPT0gMCkgewotCQlyZXQgPSBpOTE1X3ZtYV9pbnNlcnQodm1hLCBzaXplLCBh bGlnbm1lbnQsIGZsYWdzKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOwotCX0KLQotCXJldCA9 IGk5MTVfdm1hX2JpbmQodm1hLCB2bWEtPm9iai0+Y2FjaGVfbGV2ZWwsIGZsYWdzKTsKLQlpZiAo cmV0KQotCQlnb3RvIGVycjsKLQotCWlmICgoYm91bmQgXiB2bWEtPmZsYWdzKSAmIEk5MTVfVk1B X0dMT0JBTF9CSU5EKQotCQlfX2k5MTVfdm1hX3NldF9tYXBfYW5kX2ZlbmNlYWJsZSh2bWEpOwot Ci0JR0VNX0JVR19PTihpOTE1X3ZtYV9taXNwbGFjZWQodm1hLCBzaXplLCBhbGlnbm1lbnQsIGZs YWdzKSk7Ci0JcmV0dXJuIDA7Ci0KLWVycjoKLQlfX2k5MTVfdm1hX3VucGluKHZtYSk7Ci0JcmV0 dXJuIHJldDsKLX0KLQogc3RydWN0IGk5MTVfdm1hICoKIGk5MTVfZ2VtX29iamVjdF9nZ3R0X3Bp bihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkJIGNvbnN0IHN0cnVjdCBpOTE1 X2dndHRfdmlldyAqdmlldywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf Z2VtX2ZlbmNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9mZW5jZS5jCmRlbGV0 ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODIwNTg0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZ2VtX2ZlbmNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjIgKzAs MCBAQAotLyoKLSAqIENvcHlyaWdodCDCqSAyMDA4LTIwMTUgSW50ZWwgQ29ycG9yYXRpb24KLSAq Ci0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55 IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lh dGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4g dGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0 YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNo LCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBT b2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi0gKiBTb2Z0d2FyZSBp cyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25z OgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24g bm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLSAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVk ZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLSAqIFNvZnR3 YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdB UlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVU IE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBO TyBFVkVOVCBTSEFMTAotICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElB QkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLSAqIExJQUJJTElUWSwgV0hFVEhF UiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCi0g KiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUg VVNFIE9SIE9USEVSIERFQUxJTkdTCi0gKiBJTiBUSEUgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1 ZGUgPGRybS9kcm1QLmg+Ci0jaW5jbHVkZSA8ZHJtL2k5MTVfZHJtLmg+Ci0jaW5jbHVkZSAiaTkx NV9kcnYuaCIKLQotLyoqCi0gKiBET0M6IGZlbmNlIHJlZ2lzdGVyIGhhbmRsaW5nCi0gKgotICog SW1wb3J0YW50IHRvIGF2b2lkIGNvbmZ1c2lvbnM6ICJmZW5jZXMiIGluIHRoZSBpOTE1IGRyaXZl ciBhcmUgbm90IGV4ZWN1dGlvbgotICogZmVuY2VzIHVzZWQgdG8gdHJhY2sgY29tbWFuZCBjb21w bGV0aW9uIGJ1dCBoYXJkd2FyZSBkZXRpbGVyIG9iamVjdHMgd2hpY2gKLSAqIHdyYXAgYSBnaXZl biByYW5nZSBvZiB0aGUgZ2xvYmFsIEdUVC4gRWFjaCBwbGF0Zm9ybSBoYXMgb25seSBhIGZhaXJs eSBsaW1pdGVkCi0gKiBzZXQgb2YgdGhlc2Ugb2JqZWN0cy4KLSAqCi0gKiBGZW5jZXMgYXJlIHVz ZWQgdG8gZGV0aWxlIEdUVCBtZW1vcnkgbWFwcGluZ3MuIFRoZXkncmUgYWxzbyBjb25uZWN0ZWQg dG8gdGhlCi0gKiBoYXJkd2FyZSBmcm9udGJ1ZmZlciByZW5kZXIgdHJhY2tpbmcgYW5kIGhlbmNl IGludGVyYWN0IHdpdGggZnJvbnRidWZmZXIKLSAqIGNvbXByZXNzaW9uLiBGdXJ0aGVybW9yZSBv biBvbGRlciBwbGF0Zm9ybXMgZmVuY2VzIGFyZSByZXF1aXJlZCBmb3IgdGlsZWQKLSAqIG9iamVj dHMgdXNlZCBieSB0aGUgZGlzcGxheSBlbmdpbmUuIFRoZXkgY2FuIGFsc28gYmUgdXNlZCBieSB0 aGUgcmVuZGVyCi0gKiBlbmdpbmUgLSB0aGV5J3JlIHJlcXVpcmVkIGZvciBibGl0dGVyIGNvbW1h bmRzIGFuZCBhcmUgb3B0aW9uYWwgZm9yIHJlbmRlcgotICogY29tbWFuZHMuIEJ1dCBvbiBnZW40 KyBib3RoIGRpc3BsYXkgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBmYmMpIGFuZCByZW5kZXJpbmcK LSAqIGhhdmUgdGhlaXIgb3duIHRpbGluZyBzdGF0ZSBiaXRzIGFuZCBkb24ndCBuZWVkIGZlbmNl cy4KLSAqCi0gKiBBbHNvIG5vdGUgdGhhdCBmZW5jZXMgb25seSBzdXBwb3J0IFggYW5kIFkgdGls aW5nIGFuZCBoZW5jZSBjYW4ndCBiZSB1c2VkIGZvcgotICogdGhlIGZhbmNpZXIgbmV3IHRpbGlu ZyBmb3JtYXRzIGxpa2UgVywgWXMgYW5kIFlmLgotICoKLSAqIEZpbmFsbHkgbm90ZSB0aGF0IGJl Y2F1c2UgZmVuY2VzIGFyZSBzdWNoIGEgcmVzdHJpY3RlZCByZXNvdXJjZSB0aGV5J3JlCi0gKiBk eW5hbWljYWxseSBhc3NvY2lhdGVkIHdpdGggb2JqZWN0cy4gRnVydGhlcm1vcmUgZmVuY2Ugc3Rh dGUgaXMgY29tbWl0dGVkIHRvCi0gKiB0aGUgaGFyZHdhcmUgbGF6aWx5IHRvIGF2b2lkIHVubmVj ZXNzYXJ5IHN0YWxscyBvbiBnZW4yLzMuIFRoZXJlZm9yZSBjb2RlIG11c3QKLSAqIGV4cGxpY2l0 bHkgY2FsbCBpOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlKCkgdG8gc3luY2hyb25pemUgZmVuY2lu ZyBzdGF0dXMKLSAqIGZvciBjcHUgYWNjZXNzLiBBbHNvIG5vdGUgdGhhdCBzb21lIGNvZGUgd2Fu dHMgYW4gdW5mZW5jZWQgdmlldywgZm9yIHRob3NlCi0gKiBjYXNlcyB0aGUgZmVuY2UgY2FuIGJl IHJlbW92ZWQgZm9yY2VmdWxseSB3aXRoIGk5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2UoKS4KLSAq Ci0gKiBJbnRlcm5hbGx5IHRoZXNlIGZ1bmN0aW9ucyB3aWxsIHN5bmNocm9uaXplIHdpdGggdXNl cnNwYWNlIGFjY2VzcyBieSByZW1vdmluZwotICogQ1BVIHB0ZXMgaW50byBHVFQgbW1hcHMgKG5v dCB0aGUgR1RUIHB0ZXMgdGhlbXNlbHZlcykgYXMgbmVlZGVkLgotICovCi0KLSNkZWZpbmUgcGlw ZWxpbmVkIDAKLQotc3RhdGljIHZvaWQgaTk2NV93cml0ZV9mZW5jZV9yZWcoc3RydWN0IGRybV9p OTE1X2ZlbmNlX3JlZyAqZmVuY2UsCi0JCQkJIHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCWk5 MTVfcmVnX3QgZmVuY2VfcmVnX2xvLCBmZW5jZV9yZWdfaGk7Ci0JaW50IGZlbmNlX3BpdGNoX3No aWZ0OwotCXU2NCB2YWw7Ci0KLQlpZiAoSU5URUxfSU5GTyhmZW5jZS0+aTkxNSktPmdlbiA+PSA2 KSB7Ci0JCWZlbmNlX3JlZ19sbyA9IEZFTkNFX1JFR19HRU42X0xPKGZlbmNlLT5pZCk7Ci0JCWZl bmNlX3JlZ19oaSA9IEZFTkNFX1JFR19HRU42X0hJKGZlbmNlLT5pZCk7Ci0JCWZlbmNlX3BpdGNo X3NoaWZ0ID0gR0VONl9GRU5DRV9QSVRDSF9TSElGVDsKLQotCX0gZWxzZSB7Ci0JCWZlbmNlX3Jl Z19sbyA9IEZFTkNFX1JFR185NjVfTE8oZmVuY2UtPmlkKTsKLQkJZmVuY2VfcmVnX2hpID0gRkVO Q0VfUkVHXzk2NV9ISShmZW5jZS0+aWQpOwotCQlmZW5jZV9waXRjaF9zaGlmdCA9IEk5NjVfRkVO Q0VfUElUQ0hfU0hJRlQ7Ci0JfQotCi0JdmFsID0gMDsKLQlpZiAodm1hKSB7Ci0JCXVuc2lnbmVk IGludCB0aWxpbmcgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyh2bWEtPm9iaik7Ci0JCWJv b2wgaXNfeV90aWxlZCA9IHRpbGluZyA9PSBJOTE1X1RJTElOR19ZOwotCQl1bnNpZ25lZCBpbnQg c3RyaWRlID0gaTkxNV9nZW1fb2JqZWN0X2dldF9zdHJpZGUodm1hLT5vYmopOwotCQl1MzIgcm93 X3NpemUgPSBzdHJpZGUgKiAoaXNfeV90aWxlZCA/IDMyIDogOCk7Ci0JCXUzMiBzaXplID0gcm91 bmRkb3duKCh1MzIpdm1hLT5ub2RlLnNpemUsIHJvd19zaXplKTsKLQotCQl2YWwgPSAoKHZtYS0+ bm9kZS5zdGFydCArIHNpemUgLSA0MDk2KSAmIDB4ZmZmZmYwMDApIDw8IDMyOwotCQl2YWwgfD0g dm1hLT5ub2RlLnN0YXJ0ICYgMHhmZmZmZjAwMDsKLQkJdmFsIHw9ICh1NjQpKChzdHJpZGUgLyAx MjgpIC0gMSkgPDwgZmVuY2VfcGl0Y2hfc2hpZnQ7Ci0JCWlmIChpc195X3RpbGVkKQotCQkJdmFs IHw9IEJJVChJOTY1X0ZFTkNFX1RJTElOR19ZX1NISUZUKTsKLQkJdmFsIHw9IEk5NjVfRkVOQ0Vf UkVHX1ZBTElEOwotCX0KLQotCWlmICghcGlwZWxpbmVkKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdiA9IGZlbmNlLT5pOTE1OwotCi0JCS8qIFRvIHcvYSBpbmNvaGVyZW5j eSB3aXRoIG5vbi1hdG9taWMgNjQtYml0IHJlZ2lzdGVyIHVwZGF0ZXMsCi0JCSAqIHdlIHNwbGl0 IHRoZSA2NC1iaXQgdXBkYXRlIGludG8gdHdvIDMyLWJpdCB3cml0ZXMuIEluIG9yZGVyCi0JCSAq IGZvciBhIHBhcnRpYWwgZmVuY2Ugbm90IHRvIGJlIGV2YWx1YXRlZCBiZXR3ZWVuIHdyaXRlcywg d2UKLQkJICogcHJlY2VkZSB0aGUgdXBkYXRlIHdpdGggd3JpdGUgdG8gdHVybiBvZmYgdGhlIGZl bmNlIHJlZ2lzdGVyLAotCQkgKiBhbmQgb25seSBlbmFibGUgdGhlIGZlbmNlIGFzIHRoZSBsYXN0 IHN0ZXAuCi0JCSAqCi0JCSAqIEZvciBleHRyYSBsZXZlbHMgb2YgcGFyYW5vaWEsIHdlIG1ha2Ug c3VyZSBlYWNoIHN0ZXAgbGFuZHMKLQkJICogYmVmb3JlIGFwcGx5aW5nIHRoZSBuZXh0IHN0ZXAu Ci0JCSAqLwotCQlJOTE1X1dSSVRFKGZlbmNlX3JlZ19sbywgMCk7Ci0JCVBPU1RJTkdfUkVBRChm ZW5jZV9yZWdfbG8pOwotCi0JCUk5MTVfV1JJVEUoZmVuY2VfcmVnX2hpLCB1cHBlcl8zMl9iaXRz KHZhbCkpOwotCQlJOTE1X1dSSVRFKGZlbmNlX3JlZ19sbywgbG93ZXJfMzJfYml0cyh2YWwpKTsK LQkJUE9TVElOR19SRUFEKGZlbmNlX3JlZ19sbyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBpOTE1 X3dyaXRlX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpmZW5jZSwKLQkJCQkg c3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IDA7Ci0JaWYgKHZt YSkgewotCQl1bnNpZ25lZCBpbnQgdGlsaW5nID0gaTkxNV9nZW1fb2JqZWN0X2dldF90aWxpbmco dm1hLT5vYmopOwotCQlib29sIGlzX3lfdGlsZWQgPSB0aWxpbmcgPT0gSTkxNV9USUxJTkdfWTsK LQkJdW5zaWduZWQgaW50IHN0cmlkZSA9IGk5MTVfZ2VtX29iamVjdF9nZXRfc3RyaWRlKHZtYS0+ b2JqKTsKLQkJaW50IHBpdGNoX3ZhbDsKLQkJaW50IHRpbGVfd2lkdGg7Ci0KLQkJV0FSTigodm1h LT5ub2RlLnN0YXJ0ICYgfkk5MTVfRkVOQ0VfU1RBUlRfTUFTSykgfHwKLQkJICAgICAhaXNfcG93 ZXJfb2ZfMih2bWEtPm5vZGUuc2l6ZSkgfHwKLQkJICAgICAodm1hLT5ub2RlLnN0YXJ0ICYgKHZt YS0+bm9kZS5zaXplIC0gMSkpLAotCQkgICAgICJvYmplY3QgMHglMDhsbHggW2ZlbmNlYWJsZT8g JWRdIG5vdCAxTSBvciBwb3Qtc2l6ZSAoMHglMDhsbHgpIGFsaWduZWRcbiIsCi0JCSAgICAgdm1h LT5ub2RlLnN0YXJ0LAotCQkgICAgIGk5MTVfdm1hX2lzX21hcF9hbmRfZmVuY2VhYmxlKHZtYSks Ci0JCSAgICAgdm1hLT5ub2RlLnNpemUpOwotCi0JCWlmIChpc195X3RpbGVkICYmIEhBU18xMjhf QllURV9ZX1RJTElORyhmZW5jZS0+aTkxNSkpCi0JCQl0aWxlX3dpZHRoID0gMTI4OwotCQllbHNl Ci0JCQl0aWxlX3dpZHRoID0gNTEyOwotCi0JCS8qIE5vdGU6IHBpdGNoIGJldHRlciBiZSBhIHBv d2VyIG9mIHR3byB0aWxlIHdpZHRocyAqLwotCQlwaXRjaF92YWwgPSBzdHJpZGUgLyB0aWxlX3dp ZHRoOwotCQlwaXRjaF92YWwgPSBmZnMocGl0Y2hfdmFsKSAtIDE7Ci0KLQkJdmFsID0gdm1hLT5u b2RlLnN0YXJ0OwotCQlpZiAoaXNfeV90aWxlZCkKLQkJCXZhbCB8PSBCSVQoSTgzMF9GRU5DRV9U SUxJTkdfWV9TSElGVCk7Ci0JCXZhbCB8PSBJOTE1X0ZFTkNFX1NJWkVfQklUUyh2bWEtPm5vZGUu c2l6ZSk7Ci0JCXZhbCB8PSBwaXRjaF92YWwgPDwgSTgzMF9GRU5DRV9QSVRDSF9TSElGVDsKLQkJ dmFsIHw9IEk4MzBfRkVOQ0VfUkVHX1ZBTElEOwotCX0KLQotCWlmICghcGlwZWxpbmVkKSB7Ci0J CXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGZlbmNlLT5pOTE1OwotCQlpOTE1 X3JlZ190IHJlZyA9IEZFTkNFX1JFRyhmZW5jZS0+aWQpOwotCi0JCUk5MTVfV1JJVEUocmVnLCB2 YWwpOwotCQlQT1NUSU5HX1JFQUQocmVnKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGk4MzBfd3Jp dGVfZmVuY2VfcmVnKHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZlbmNlLAotCQkJCSBzdHJ1 Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gMDsKLQlpZiAodm1hKSB7 Ci0JCXVuc2lnbmVkIGludCB0aWxpbmcgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyh2bWEt Pm9iaik7Ci0JCWJvb2wgaXNfeV90aWxlZCA9IHRpbGluZyA9PSBJOTE1X1RJTElOR19ZOwotCQl1 bnNpZ25lZCBpbnQgc3RyaWRlID0gaTkxNV9nZW1fb2JqZWN0X2dldF9zdHJpZGUodm1hLT5vYmop OwotCQl1MzIgcGl0Y2hfdmFsOwotCi0JCVdBUk4oKHZtYS0+bm9kZS5zdGFydCAmIH5JODMwX0ZF TkNFX1NUQVJUX01BU0spIHx8Ci0JCSAgICAgIWlzX3Bvd2VyX29mXzIodm1hLT5ub2RlLnNpemUp IHx8Ci0JCSAgICAgKHZtYS0+bm9kZS5zdGFydCAmICh2bWEtPm5vZGUuc2l6ZSAtIDEpKSwKLQkJ ICAgICAib2JqZWN0IDB4JTA4bGx4IG5vdCA1MTJLIG9yIHBvdC1zaXplIDB4JTA4bGx4IGFsaWdu ZWRcbiIsCi0JCSAgICAgdm1hLT5ub2RlLnN0YXJ0LCB2bWEtPm5vZGUuc2l6ZSk7Ci0KLQkJcGl0 Y2hfdmFsID0gc3RyaWRlIC8gMTI4OwotCQlwaXRjaF92YWwgPSBmZnMocGl0Y2hfdmFsKSAtIDE7 Ci0KLQkJdmFsID0gdm1hLT5ub2RlLnN0YXJ0OwotCQlpZiAoaXNfeV90aWxlZCkKLQkJCXZhbCB8 PSBCSVQoSTgzMF9GRU5DRV9USUxJTkdfWV9TSElGVCk7Ci0JCXZhbCB8PSBJODMwX0ZFTkNFX1NJ WkVfQklUUyh2bWEtPm5vZGUuc2l6ZSk7Ci0JCXZhbCB8PSBwaXRjaF92YWwgPDwgSTgzMF9GRU5D RV9QSVRDSF9TSElGVDsKLQkJdmFsIHw9IEk4MzBfRkVOQ0VfUkVHX1ZBTElEOwotCX0KLQotCWlm ICghcGlwZWxpbmVkKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGZl bmNlLT5pOTE1OwotCQlpOTE1X3JlZ190IHJlZyA9IEZFTkNFX1JFRyhmZW5jZS0+aWQpOwotCi0J CUk5MTVfV1JJVEUocmVnLCB2YWwpOwotCQlQT1NUSU5HX1JFQUQocmVnKTsKLQl9Ci19Ci0KLXN0 YXRpYyB2b2lkIGZlbmNlX3dyaXRlKHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZlbmNlLAot CQkJc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JLyogUHJldmlvdXMgYWNjZXNzIHRocm91Z2gg dGhlIGZlbmNlIHJlZ2lzdGVyIGlzIG1hcnNoYWxsZWQgYnkKLQkgKiB0aGUgbWIoKSBpbnNpZGUg dGhlIGZhdWx0IGhhbmRsZXJzIChpOTE1X2dlbV9yZWxlYXNlX21tYXBzKQotCSAqIGFuZCBleHBs aWNpdGx5IG1hbmFnZWQgZm9yIGludGVybmFsIHVzZXJzLgotCSAqLwotCi0JaWYgKElTX0dFTjIo ZmVuY2UtPmk5MTUpKQotCQlpODMwX3dyaXRlX2ZlbmNlX3JlZyhmZW5jZSwgdm1hKTsKLQllbHNl IGlmIChJU19HRU4zKGZlbmNlLT5pOTE1KSkKLQkJaTkxNV93cml0ZV9mZW5jZV9yZWcoZmVuY2Us IHZtYSk7Ci0JZWxzZQotCQlpOTY1X3dyaXRlX2ZlbmNlX3JlZyhmZW5jZSwgdm1hKTsKLQotCS8q IEFjY2VzcyB0aHJvdWdoIHRoZSBmZW5jZWQgcmVnaW9uIGFmdGVyd2FyZHMgaXMKLQkgKiBvcmRl cmVkIGJ5IHRoZSBwb3N0aW5nIHJlYWRzIHdoaWxzdCB3cml0aW5nIHRoZSByZWdpc3RlcnMuCi0J ICovCi0KLQlmZW5jZS0+ZGlydHkgPSBmYWxzZTsKLX0KLQotc3RhdGljIGludCBmZW5jZV91cGRh dGUoc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqZmVuY2UsCi0JCQlzdHJ1Y3QgaTkxNV92bWEg KnZtYSkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKHZtYSkgewotCQlpZiAoIWk5MTVfdm1hX2lzX21h cF9hbmRfZmVuY2VhYmxlKHZtYSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoV0FSTigh aTkxNV9nZW1fb2JqZWN0X2dldF9zdHJpZGUodm1hLT5vYmopIHx8Ci0JCQkgIWk5MTVfZ2VtX29i amVjdF9nZXRfdGlsaW5nKHZtYS0+b2JqKSwKLQkJCSAiYm9ndXMgZmVuY2Ugc2V0dXAgd2l0aCBz dHJpZGU6IDB4JXgsIHRpbGluZyBtb2RlOiAlaVxuIiwKLQkJCSBpOTE1X2dlbV9vYmplY3RfZ2V0 X3N0cmlkZSh2bWEtPm9iaiksCi0JCQkgaTkxNV9nZW1fb2JqZWN0X2dldF90aWxpbmcodm1hLT5v YmopKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXJldCA9IGk5MTVfZ2VtX2FjdGl2ZV9yZXRp cmUoJnZtYS0+bGFzdF9mZW5jZSwKLQkJCQkJICAgICAmdm1hLT5vYmotPmJhc2UuZGV2LT5zdHJ1 Y3RfbXV0ZXgpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoZmVuY2Ut PnZtYSkgewotCQlyZXQgPSBpOTE1X2dlbV9hY3RpdmVfcmV0aXJlKCZmZW5jZS0+dm1hLT5sYXN0 X2ZlbmNlLAotCQkJCSAgICAgICZmZW5jZS0+dm1hLT5vYmotPmJhc2UuZGV2LT5zdHJ1Y3RfbXV0 ZXgpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoZmVuY2UtPnZtYSAm JiBmZW5jZS0+dm1hICE9IHZtYSkgewotCQkvKiBFbnN1cmUgdGhhdCBhbGwgdXNlcnNwYWNlIENQ VSBhY2Nlc3MgaXMgY29tcGxldGVkIGJlZm9yZQotCQkgKiBzdGVhbGluZyB0aGUgZmVuY2UuCi0J CSAqLwotCQlpOTE1X2dlbV9yZWxlYXNlX21tYXAoZmVuY2UtPnZtYS0+b2JqKTsKLQotCQlmZW5j ZS0+dm1hLT5mZW5jZSA9IE5VTEw7Ci0JCWZlbmNlLT52bWEgPSBOVUxMOwotCi0JCWxpc3RfbW92 ZSgmZmVuY2UtPmxpbmssICZmZW5jZS0+aTkxNS0+bW0uZmVuY2VfbGlzdCk7Ci0JfQotCi0JZmVu Y2Vfd3JpdGUoZmVuY2UsIHZtYSk7Ci0KLQlpZiAodm1hKSB7Ci0JCWlmIChmZW5jZS0+dm1hICE9 IHZtYSkgewotCQkJdm1hLT5mZW5jZSA9IGZlbmNlOwotCQkJZmVuY2UtPnZtYSA9IHZtYTsKLQkJ fQotCi0JCWxpc3RfbW92ZV90YWlsKCZmZW5jZS0+bGluaywgJmZlbmNlLT5pOTE1LT5tbS5mZW5j ZV9saXN0KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpOTE1X3ZtYV9wdXRfZmVu Y2UgLSBmb3JjZS1yZW1vdmUgZmVuY2UgZm9yIGEgVk1BCi0gKiBAdm1hOiB2bWEgdG8gbWFwIGxp bmVhcmx5IChub3QgdGhyb3VnaCBhIGZlbmNlIHJlZykKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGZv cmNlLXJlbW92ZXMgYW55IGZlbmNlIGZyb20gdGhlIGdpdmVuIG9iamVjdCwgd2hpY2ggaXMgdXNl ZnVsCi0gKiBpZiB0aGUga2VybmVsIHdhbnRzIHRvIGRvIHVudGlsZWQgR1RUIGFjY2Vzcy4KLSAq Ci0gKiBSZXR1cm5zOgotICoKLSAqIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBv biBmYWlsdXJlLgotICovCi1pbnQKLWk5MTVfdm1hX3B1dF9mZW5jZShzdHJ1Y3QgaTkxNV92bWEg KnZtYSkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpmZW5jZSA9IHZtYS0+ZmVuY2U7 Ci0KLQlhc3NlcnRfcnBtX3dha2Vsb2NrX2hlbGQodG9faTkxNSh2bWEtPnZtLT5kZXYpKTsKLQot CWlmICghZmVuY2UpCi0JCXJldHVybiAwOwotCi0JaWYgKGZlbmNlLT5waW5fY291bnQpCi0JCXJl dHVybiAtRUJVU1k7Ci0KLQlyZXR1cm4gZmVuY2VfdXBkYXRlKGZlbmNlLCBOVUxMKTsKLX0KLQot c3RhdGljIHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZlbmNlX2ZpbmQoc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZl bmNlOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShmZW5jZSwgJmRldl9wcml2LT5tbS5mZW5jZV9s aXN0LCBsaW5rKSB7Ci0JCWlmIChmZW5jZS0+cGluX2NvdW50KQotCQkJY29udGludWU7Ci0KLQkJ cmV0dXJuIGZlbmNlOwotCX0KLQotCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gb2YgcGVuZGluZyBm bGlwcyB3aGljaCBjb25zdW1lIGZlbmNlcyAqLwotCWlmIChpbnRlbF9oYXNfcGVuZGluZ19mYl91 bnBpbigmZGV2X3ByaXYtPmRybSkpCi0JCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOwotCi0JcmV0 dXJuIEVSUl9QVFIoLUVERUFETEspOwotfQotCi0vKioKLSAqIGk5MTVfdm1hX2dldF9mZW5jZSAt IHNldCB1cCBmZW5jaW5nIGZvciBhIHZtYQotICogQHZtYTogdm1hIHRvIG1hcCB0aHJvdWdoIGEg ZmVuY2UgcmVnCi0gKgotICogV2hlbiBtYXBwaW5nIG9iamVjdHMgdGhyb3VnaCB0aGUgR1RULCB1 c2Vyc3BhY2Ugd2FudHMgdG8gYmUgYWJsZSB0byB3cml0ZQotICogdG8gdGhlbSB3aXRob3V0IGhh dmluZyB0byB3b3JyeSBhYm91dCBzd2l6emxpbmcgaWYgdGhlIG9iamVjdCBpcyB0aWxlZC4KLSAq IFRoaXMgZnVuY3Rpb24gd2Fsa3MgdGhlIGZlbmNlIHJlZ3MgbG9va2luZyBmb3IgYSBmcmVlIG9u ZSBmb3IgQG9iaiwKLSAqIHN0ZWFsaW5nIG9uZSBpZiBpdCBjYW4ndCBmaW5kIGFueS4KLSAqCi0g KiBJdCB0aGVuIHNldHMgdXAgdGhlIHJlZyBiYXNlZCBvbiB0aGUgb2JqZWN0J3MgcHJvcGVydGll czogYWRkcmVzcywgcGl0Y2gKLSAqIGFuZCB0aWxpbmcgZm9ybWF0LgotICoKLSAqIEZvciBhbiB1 bnRpbGVkIHN1cmZhY2UsIHRoaXMgcmVtb3ZlcyBhbnkgZXhpc3RpbmcgZmVuY2UuCi0gKgotICog UmV0dXJuczoKLSAqCi0gKiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFp bHVyZS4KLSAqLwotaW50Ci1pOTE1X3ZtYV9nZXRfZmVuY2Uoc3RydWN0IGk5MTVfdm1hICp2bWEp Ci17Ci0Jc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqZmVuY2U7Ci0Jc3RydWN0IGk5MTVfdm1h ICpzZXQgPSBpOTE1X2dlbV9vYmplY3RfaXNfdGlsZWQodm1hLT5vYmopID8gdm1hIDogTlVMTDsK LQotCS8qIE5vdGUgdGhhdCB3ZSByZXZva2UgZmVuY2VzIG9uIHJ1bnRpbWUgc3VzcGVuZC4gVGhl cmVmb3JlIHRoZSB1c2VyCi0JICogbXVzdCBrZWVwIHRoZSBkZXZpY2UgYXdha2Ugd2hpbHN0IHVz aW5nIHRoZSBmZW5jZS4KLQkgKi8KLQlhc3NlcnRfcnBtX3dha2Vsb2NrX2hlbGQodG9faTkxNSh2 bWEtPnZtLT5kZXYpKTsKLQotCS8qIEp1c3QgdXBkYXRlIG91ciBwbGFjZSBpbiB0aGUgTFJVIGlm IG91ciBmZW5jZSBpcyBnZXR0aW5nIHJldXNlZC4gKi8KLQlpZiAodm1hLT5mZW5jZSkgewotCQlm ZW5jZSA9IHZtYS0+ZmVuY2U7Ci0JCWlmICghZmVuY2UtPmRpcnR5KSB7Ci0JCQlsaXN0X21vdmVf dGFpbCgmZmVuY2UtPmxpbmssCi0JCQkJICAgICAgICZmZW5jZS0+aTkxNS0+bW0uZmVuY2VfbGlz dCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0gZWxzZSBpZiAoc2V0KSB7Ci0JCWZlbmNlID0gZmVu Y2VfZmluZCh0b19pOTE1KHZtYS0+dm0tPmRldikpOwotCQlpZiAoSVNfRVJSKGZlbmNlKSkKLQkJ CXJldHVybiBQVFJfRVJSKGZlbmNlKTsKLQl9IGVsc2UKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4g ZmVuY2VfdXBkYXRlKGZlbmNlLCBzZXQpOwotfQotCi0vKioKLSAqIGk5MTVfZ2VtX3Jlc3RvcmVf ZmVuY2VzIC0gcmVzdG9yZSBmZW5jZSBzdGF0ZQotICogQGRldjogRFJNIGRldmljZQotICoKLSAq IFJlc3RvcmUgdGhlIGh3IGZlbmNlIHN0YXRlIHRvIG1hdGNoIHRoZSBzb2Z0d2FyZSB0cmFja2lu ZyBhZ2FpbiwgdG8gYmUgY2FsbGVkCi0gKiBhZnRlciBhIGdwdSByZXNldCBhbmQgb24gcmVzdW1l LiBOb3RlIHRoYXQgb24gcnVudGltZSBzdXNwZW5kIHdlIG9ubHkgY2FuY2VsCi0gKiB0aGUgZmVu Y2VzLCB0byBiZSByZWFjcXVpcmVkIGJ5IHRoZSB1c2VyIGxhdGVyLgotICovCi12b2lkIGk5MTVf Z2VtX3Jlc3RvcmVfZmVuY2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOwotCWludCBpOwotCi0JLyog Tm90ZSB0aGF0IHRoaXMgbWF5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIHN0cnVjdF9tdXRleCwgYnkK LQkgKiBydW50aW1lIHN1c3BlbmQvcmVzdW1lLiBUaGUgYmFycmllciB3ZSByZXF1aXJlIGlzIGVu Zm9yY2VkIGJ5Ci0JICogcnBtIGl0c2VsZiAtIGFsbCBhY2Nlc3MgdG8gZmVuY2VzL0dUVCBhcmUg b25seSB3aXRoaW4gYW4gcnBtCi0JICogd2FrZXJlZiwgYW5kIHRvIGFjcXVpcmUgdGhhdCB3YWtl cmVmIHlvdSBtdXN0IHBhc3MgdGhyb3VnaCBoZXJlLgotCSAqLwotCi0JZm9yIChpID0gMDsgaSA8 IGRldl9wcml2LT5udW1fZmVuY2VfcmVnczsgaSsrKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9mZW5j ZV9yZWcgKnJlZyA9ICZkZXZfcHJpdi0+ZmVuY2VfcmVnc1tpXTsKLQkJc3RydWN0IGk5MTVfdm1h ICp2bWEgPSByZWctPnZtYTsKLQotCQkvKgotCQkgKiBDb21taXQgZGVsYXllZCB0aWxpbmcgY2hh bmdlcyBpZiB3ZSBoYXZlIGFuIG9iamVjdCBzdGlsbAotCQkgKiBhdHRhY2hlZCB0byB0aGUgZmVu Y2UsIG90aGVyd2lzZSBqdXN0IGNsZWFyIHRoZSBmZW5jZS4KLQkJICovCi0JCWlmICh2bWEgJiYg IWk5MTVfZ2VtX29iamVjdF9pc190aWxlZCh2bWEtPm9iaikpIHsKLQkJCUdFTV9CVUdfT04oIXJl Zy0+ZGlydHkpOwotCQkJR0VNX0JVR19PTighbGlzdF9lbXB0eSgmdm1hLT5vYmotPnVzZXJmYXVs dF9saW5rKSk7Ci0KLQkJCWxpc3RfbW92ZSgmcmVnLT5saW5rLCAmZGV2X3ByaXYtPm1tLmZlbmNl X2xpc3QpOwotCQkJdm1hLT5mZW5jZSA9IE5VTEw7Ci0JCQl2bWEgPSBOVUxMOwotCQl9Ci0KLQkJ ZmVuY2Vfd3JpdGUocmVnLCB2bWEpOwotCQlyZWctPnZtYSA9IHZtYTsKLQl9Ci19Ci0KLS8qKgot ICogRE9DOiB0aWxpbmcgc3dpenpsaW5nIGRldGFpbHMKLSAqCi0gKiBUaGUgaWRlYSBiZWhpbmQg dGlsaW5nIGlzIHRvIGluY3JlYXNlIGNhY2hlIGhpdCByYXRlcyBieSByZWFycmFuZ2luZwotICog cGl4ZWwgZGF0YSBzbyB0aGF0IGEgZ3JvdXAgb2YgcGl4ZWwgYWNjZXNzZXMgYXJlIGluIHRoZSBz YW1lIGNhY2hlbGluZS4KLSAqIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGZyb20gZG9pbmcgdGhp cyBvbiB0aGUgYmFjay9kZXB0aCBidWZmZXIgYXJlIG9uCi0gKiB0aGUgb3JkZXIgb2YgMzAlLgot ICoKLSAqIEludGVsIGFyY2hpdGVjdHVyZXMgbWFrZSB0aGlzIHNvbWV3aGF0IG1vcmUgY29tcGxp Y2F0ZWQsIHRob3VnaCwgYnkKLSAqIGFkanVzdG1lbnRzIG1hZGUgdG8gYWRkcmVzc2luZyBvZiBk YXRhIHdoZW4gdGhlIG1lbW9yeSBpcyBpbiBpbnRlcmxlYXZlZAotICogbW9kZSAobWF0Y2hlZCBw YWlycyBvZiBESU1NUykgdG8gaW1wcm92ZSBtZW1vcnkgYmFuZHdpZHRoLgotICogRm9yIGludGVy bGVhdmVkIG1lbW9yeSwgdGhlIENQVSBzZW5kcyBldmVyeSBzZXF1ZW50aWFsIDY0IGJ5dGVzCi0g KiB0byBhbiBhbHRlcm5hdGUgbWVtb3J5IGNoYW5uZWwgc28gaXQgY2FuIGdldCB0aGUgYmFuZHdp ZHRoIGZyb20gYm90aC4KLSAqCi0gKiBUaGUgR1BVIGFsc28gcmVhcnJhbmdlcyBpdHMgYWNjZXNz ZXMgZm9yIGluY3JlYXNlZCBiYW5kd2lkdGggdG8gaW50ZXJsZWF2ZWQKLSAqIG1lbW9yeSwgYW5k IGl0IG1hdGNoZXMgd2hhdCB0aGUgQ1BVIGRvZXMgZm9yIG5vbi10aWxlZC4gIEhvd2V2ZXIsIHdo ZW4gdGlsZWQKLSAqIGl0IGRvZXMgaXQgYSBsaXR0bGUgZGlmZmVyZW50bHksIHNpbmNlIG9uZSB3 YWxrcyBhZGRyZXNzZXMgbm90IGp1c3QgaW4gdGhlCi0gKiBYIGRpcmVjdGlvbiBidXQgYWxzbyBZ LiAgU28sIGFsb25nIHdpdGggYWx0ZXJuYXRpbmcgY2hhbm5lbHMgd2hlbiBiaXQKLSAqIDYgb2Yg dGhlIGFkZHJlc3MgZmxpcHMsIGl0IGFsc28gYWx0ZXJuYXRlcyB3aGVuIG90aGVyIGJpdHMgZmxp cCAtLSAgQml0cyA5Ci0gKiAoZXZlcnkgNTEyIGJ5dGVzLCBhbiBYIHRpbGUgc2NhbmxpbmUpIGFu ZCAxMCAoZXZlcnkgdHdvIFggdGlsZSBzY2FubGluZXMpCi0gKiBhcmUgY29tbW9uIHRvIGJvdGgg dGhlIDkxNSBhbmQgOTY1LWNsYXNzIGhhcmR3YXJlLgotICoKLSAqIFRoZSBDUFUgYWxzbyBzb21l dGltZXMgWE9ScyBpbiBoaWdoZXIgYml0cyBhcyB3ZWxsLCB0byBpbXByb3ZlCi0gKiBiYW5kd2lk dGggZG9pbmcgc3RyaWRlZCBhY2Nlc3MgbGlrZSB3ZSBkbyBzbyBmcmVxdWVudGx5IGluIGdyYXBo aWNzLiAgVGhpcwotICogaXMgY2FsbGVkICJDaGFubmVsIFhPUiBSYW5kb21pemF0aW9uIiBpbiB0 aGUgTUNIIGRvY3VtZW50YXRpb24uICBUaGUgcmVzdWx0Ci0gKiBpcyB0aGF0IHRoZSBDUFUgaXMg WE9SaW5nIGluIGVpdGhlciBiaXQgMTEgb3IgYml0IDE3IHRvIGJpdCA2IG9mIGl0cyBhZGRyZXNz Ci0gKiBkZWNvZGUuCi0gKgotICogQWxsIG9mIHRoaXMgYml0IDYgWE9SaW5nIGhhcyBhbiBlZmZl Y3Qgb24gb3VyIG1lbW9yeSBtYW5hZ2VtZW50LAotICogYXMgd2UgbmVlZCB0byBtYWtlIHN1cmUg dGhhdCB0aGUgM2QgZHJpdmVyIGNhbiBjb3JyZWN0bHkgYWRkcmVzcyBvYmplY3QKLSAqIGNvbnRl bnRzLgotICoKLSAqIElmIHdlIGRvbid0IGhhdmUgaW50ZXJsZWF2ZWQgbWVtb3J5LCBhbGwgdGls aW5nIGlzIHNhZmUgYW5kIG5vIHN3aXp6bGluZyBpcwotICogcmVxdWlyZWQuCi0gKgotICogV2hl biBiaXQgMTcgaXMgWE9SZWQgaW4sIHdlIHNpbXBseSByZWZ1c2UgdG8gdGlsZSBhdCBhbGwuICBC aXQKLSAqIDE3IGlzIG5vdCBqdXN0IGEgcGFnZSBvZmZzZXQsIHNvIGFzIHdlIHBhZ2UgYW4gb2Jq ZWN0IG91dCBhbmQgYmFjayBpbiwKLSAqIGluZGl2aWR1YWwgcGFnZXMgaW4gaXQgd2lsbCBoYXZl IGRpZmZlcmVudCBiaXQgMTcgYWRkcmVzc2VzLCByZXN1bHRpbmcgaW4KLSAqIGVhY2ggNjQgYnl0 ZXMgYmVpbmcgc3dhcHBlZCB3aXRoIGl0cyBuZWlnaGJvciEKLSAqCi0gKiBPdGhlcndpc2UsIGlm IGludGVybGVhdmVkLCB3ZSBoYXZlIHRvIHRlbGwgdGhlIDNkIGRyaXZlciB3aGF0IHRoZSBhZGRy ZXNzCi0gKiBzd2l6emxpbmcgaXQgbmVlZHMgdG8gZG8gaXMsIHNpbmNlIGl0J3Mgd3JpdGluZyB3 aXRoIHRoZSBDUFUgdG8gdGhlIHBhZ2VzCi0gKiAoYml0IDYgYW5kIHBvdGVudGlhbGx5IGJpdCAx MSBYT1JlZCBpbiksIGFuZCB0aGUgR1BVIGlzIHJlYWRpbmcgZnJvbSB0aGUKLSAqIHBhZ2VzIChi aXQgNiwgOSwgYW5kIDEwIFhPUmVkIGluKSwgcmVzdWx0aW5nIGluIGEgY3VtdWxhdGl2ZSBiaXQg c3dpenpsaW5nCi0gKiByZXF1aXJlZCBieSB0aGUgQ1BVIG9mIFhPUmluZyBpbiBiaXQgNiwgOSwg MTAsIGFuZCBwb3RlbnRpYWxseSAxMSwgaW4gb3JkZXIKLSAqIHRvIG1hdGNoIHdoYXQgdGhlIEdQ VSBleHBlY3RzLgotICovCi0KLS8qKgotICogaTkxNV9nZW1fZGV0ZWN0X2JpdF82X3N3aXp6bGUg LSBkZXRlY3QgYml0IDYgc3dpenpsaW5nIHBhdHRlcm4KLSAqIEBkZXY6IERSTSBkZXZpY2UKLSAq Ci0gKiBEZXRlY3RzIGJpdCA2IHN3aXp6bGluZyBvZiBhZGRyZXNzIGxvb2t1cCBiZXR3ZWVuIElH RCBhY2Nlc3MgYW5kIENQVQotICogYWNjZXNzIHRocm91Z2ggbWFpbiBtZW1vcnkuCi0gKi8KLXZv aWQKLWk5MTVfZ2VtX2RldGVjdF9iaXRfNl9zd2l6emxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYp Ci17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOwot CXVpbnQzMl90IHN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOOwotCXVpbnQz Ml90IHN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOOwotCi0JaWYgKElOVEVM X0dFTihkZXZfcHJpdikgPj0gOCB8fCBJU19WQUxMRVlWSUVXKGRldl9wcml2KSkgewotCQkvKgot CQkgKiBPbiBCRFcrLCBzd2l6emxpbmcgaXMgbm90IHVzZWQuIFdlIGxlYXZlIHRoZSBDUFUgbWVt b3J5Ci0JCSAqIGNvbnRyb2xsZXIgaW4gY2hhcmdlIG9mIG9wdGltaXppbmcgbWVtb3J5IGFjY2Vz c2VzIHdpdGhvdXQKLQkJICogdGhlIGV4dHJhIGFkZHJlc3MgbWFuaXB1bGF0aW9uIEdQVSBzaWRl LgotCQkgKgotCQkgKiBWTFYgYW5kIENIViBkb24ndCBoYXZlIEdQVSBzd2l6emxpbmcuCi0JCSAq LwotCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKLQkJc3dpenpsZV95ID0g STkxNV9CSVRfNl9TV0laWkxFX05PTkU7Ci0JfSBlbHNlIGlmIChJTlRFTF9JTkZPKGRldiktPmdl biA+PSA2KSB7Ci0JCWlmIChkZXZfcHJpdi0+cHJlc2VydmVfYmlvc19zd2l6emxlKSB7Ci0JCQlp ZiAoSTkxNV9SRUFEKERJU1BfQVJCX0NUTCkgJgotCQkJICAgIERJU1BfVElMRV9TVVJGQUNFX1NX SVpaTElORykgewotCQkJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV85XzEwOwotCQkJ CXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV85OwotCQkJfSBlbHNlIHsKLQkJCQlzd2l6 emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKLQkJCQlzd2l6emxlX3kgPSBJOTE1X0JJ VF82X1NXSVpaTEVfTk9ORTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXVpbnQzMl90IGRpbW1fYzAs IGRpbW1fYzE7Ci0JCQlkaW1tX2MwID0gSTkxNV9SRUFEKE1BRF9ESU1NX0MwKTsKLQkJCWRpbW1f YzEgPSBJOTE1X1JFQUQoTUFEX0RJTU1fQzEpOwotCQkJZGltbV9jMCAmPSBNQURfRElNTV9BX1NJ WkVfTUFTSyB8IE1BRF9ESU1NX0JfU0laRV9NQVNLOwotCQkJZGltbV9jMSAmPSBNQURfRElNTV9B X1NJWkVfTUFTSyB8IE1BRF9ESU1NX0JfU0laRV9NQVNLOwotCQkJLyogRW5hYmxlIHN3aXp6bGlu ZyB3aGVuIHRoZSBjaGFubmVscyBhcmUgcG9wdWxhdGVkCi0JCQkgKiB3aXRoIGlkZW50aWNhbGx5 IHNpemVkIGRpbW1zLiBXZSBkb24ndCBuZWVkIHRvIGNoZWNrCi0JCQkgKiB0aGUgM3JkIGNoYW5u ZWwgYmVjYXVzZSBubyBjcHUgd2l0aCBncHUgYXR0YWNoZWQKLQkJCSAqIHNoaXBzIGluIHRoYXQg Y29uZmlndXJhdGlvbi4gQWxzbywgc3dpenpsaW5nIG9ubHkKLQkJCSAqIG1ha2VzIHNlbnNlIGZv ciAyIGNoYW5uZWxzIGFueXdheS4gKi8KLQkJCWlmIChkaW1tX2MwID09IGRpbW1fYzEpIHsKLQkJ CQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMDsKLQkJCQlzd2l6emxlX3kgPSBJ OTE1X0JJVF82X1NXSVpaTEVfOTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3dpenpsZV94ID0gSTkxNV9C SVRfNl9TV0laWkxFX05PTkU7Ci0JCQkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFX05P TkU7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKElTX0dFTjUoZGV2X3ByaXYpKSB7Ci0JCS8qIE9u IElyb25sYWtlIHdoYXRldmVyIERSQU0gY29uZmlnLCBHUFUgYWx3YXlzIGRvCi0JCSAqIHNhbWUg c3dpenpsaW5nIHNldHVwLgotCQkgKi8KLQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxF XzlfMTA7Ci0JCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV85OwotCX0gZWxzZSBpZiAo SVNfR0VOMihkZXZfcHJpdikpIHsKLQkJLyogQXMgZmFyIGFzIHdlIGtub3csIHRoZSA4NjUgZG9l c24ndCBoYXZlIHRoZXNlIGJpdCA2Ci0JCSAqIHN3aXp6bGluZyBpc3N1ZXMuCi0JCSAqLwotCQlz d2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKLQkJc3dpenpsZV95ID0gSTkxNV9C SVRfNl9TV0laWkxFX05PTkU7Ci0JfSBlbHNlIGlmIChJU19NT0JJTEUoZGV2X3ByaXYpIHx8IChJ U19HRU4zKGRldl9wcml2KSAmJgotCQkgICAhSVNfRzMzKGRldl9wcml2KSkpIHsKLQkJdWludDMy X3QgZGNjOwotCi0JCS8qIE9uIDl4eCBjaGlwc2V0cywgY2hhbm5lbCBpbnRlcmxlYXZlIGJ5IHRo ZSBDUFUgaXMKLQkJICogZGV0ZXJtaW5lZCBieSBEQ0MuICBGb3Igc2luZ2xlLWNoYW5uZWwsIG5l aXRoZXIgdGhlIENQVQotCQkgKiBub3IgdGhlIEdQVSBkbyBzd2l6emxpbmcuICBGb3IgZHVhbCBj aGFubmVsIGludGVybGVhdmVkLAotCQkgKiB0aGUgR1BVJ3MgaW50ZXJsZWF2ZSBpcyBiaXQgOSBh bmQgMTAgZm9yIFggdGlsZWQsIGFuZCBiaXQKLQkJICogOSBmb3IgWSB0aWxlZC4gIFRoZSBDUFUn cyBpbnRlcmxlYXZlIGlzIGluZGVwZW5kZW50LCBhbmQKLQkJICogY2FuIGJlIGJhc2VkIG9uIGVp dGhlciBiaXQgMTEgKGhhdmVuJ3Qgc2VlbiB0aGlzIHlldCkgb3IKLQkJICogYml0IDE3IChjb21t b24pLgotCQkgKi8KLQkJZGNjID0gSTkxNV9SRUFEKERDQyk7Ci0JCXN3aXRjaCAoZGNjICYgREND X0FERFJFU1NJTkdfTU9ERV9NQVNLKSB7Ci0JCWNhc2UgRENDX0FERFJFU1NJTkdfTU9ERV9TSU5H TEVfQ0hBTk5FTDoKLQkJY2FzZSBEQ0NfQUREUkVTU0lOR19NT0RFX0RVQUxfQ0hBTk5FTF9BU1lN TUVUUklDOgotCQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7Ci0JCQlzd2l6 emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKLQkJCWJyZWFrOwotCQljYXNlIERDQ19B RERSRVNTSU5HX01PREVfRFVBTF9DSEFOTkVMX0lOVEVSTEVBVkVEOgotCQkJaWYgKGRjYyAmIERD Q19DSEFOTkVMX1hPUl9ESVNBQkxFKSB7Ci0JCQkJLyogVGhpcyBpcyB0aGUgYmFzZSBzd2l6emxp bmcgYnkgdGhlIEdQVSBmb3IKLQkJCQkgKiB0aWxlZCBidWZmZXJzLgotCQkJCSAqLwotCQkJCXN3 aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV85XzEwOwotCQkJCXN3aXp6bGVfeSA9IEk5MTVf QklUXzZfU1dJWlpMRV85OwotCQkJfSBlbHNlIGlmICgoZGNjICYgRENDX0NIQU5ORUxfWE9SX0JJ VF8xNykgPT0gMCkgewotCQkJCS8qIEJpdCAxMSBzd2l6emxpbmcgYnkgdGhlIENQVSBpbiBhZGRp dGlvbi4gKi8KLQkJCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMF8xMTsKLQkJ CQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMTsKLQkJCX0gZWxzZSB7Ci0JCQkJ LyogQml0IDE3IHN3aXp6bGluZyBieSB0aGUgQ1BVIGluIGFkZGl0aW9uLiAqLwotCQkJCXN3aXp6 bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV85XzEwXzE3OwotCQkJCXN3aXp6bGVfeSA9IEk5MTVf QklUXzZfU1dJWlpMRV85XzE3OwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBjaGVjayBm b3IgTC1zaGFwZWQgbWVtb3J5IGFrYSBtb2RpZmllZCBlbmhhbmNlZCBhZGRyZXNzaW5nICovCi0J CWlmIChJU19HRU40KGRldl9wcml2KSAmJgotCQkgICAgIShJOTE1X1JFQUQoRENDMikgJiBEQ0My X01PRElGSUVEX0VOSEFOQ0VEX0RJU0FCTEUpKSB7Ci0JCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82 X1NXSVpaTEVfVU5LTk9XTjsKLQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV9VTktO T1dOOwotCQl9Ci0KLQkJaWYgKGRjYyA9PSAweGZmZmZmZmZmKSB7Ci0JCQlEUk1fRVJST1IoIkNv dWxkbid0IHJlYWQgZnJvbSBNQ0hCQVIuICAiCi0JCQkJICAiRGlzYWJsaW5nIHRpbGluZy5cbiIp OwotCQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV047Ci0JCQlzd2l6emxl X3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfVU5LTk9XTjsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFRo ZSA5NjUsIEczMywgYW5kIG5ld2VyLCBoYXZlIGEgdmVyeSBmbGV4aWJsZSBtZW1vcnkKLQkJICog Y29uZmlndXJhdGlvbi4gIEl0IHdpbGwgZW5hYmxlIGR1YWwtY2hhbm5lbCBtb2RlCi0JCSAqIChp bnRlcmxlYXZpbmcpIG9uIGFzIG11Y2ggbWVtb3J5IGFzIGl0IGNhbiwgYW5kIHRoZSBHUFUKLQkJ ICogd2lsbCBhZGRpdGlvbmFsbHkgc29tZXRpbWVzIGVuYWJsZSBkaWZmZXJlbnQgYml0IDYKLQkJ ICogc3dpenpsaW5nIGZvciB0aWxlZCBvYmplY3RzIGZyb20gdGhlIENQVS4KLQkJICoKLQkJICog SGVyZSdzIHdoYXQgSSBmb3VuZCBvbiB0aGUgRzk2NToKLQkJICogICAgc2xvdCBmaWxsICAgICAg ICAgbWVtb3J5IHNpemUgIHN3aXp6bGluZwotCQkgKiAwQSAgIDBCICAgMUEgICAxQiAgICAxLWNo ICAgMi1jaAotCQkgKiA1MTIgIDAgICAgMCAgICAwICAgICA1MTIgICAgMCAgICAgTwotCQkgKiA1 MTIgIDAgICAgNTEyICAwICAgICAxNiAgICAgMTAwOCAgWAotCQkgKiA1MTIgIDAgICAgMCAgICA1 MTIgICAxNiAgICAgMTAwOCAgWAotCQkgKiAwICAgIDUxMiAgMCAgICA1MTIgICAxNiAgICAgMTAw OCAgWAotCQkgKiAxMDI0IDEwMjQgMTAyNCAwICAgICAyMDQ4ICAgMTAyNCAgTwotCQkgKgotCQkg KiBXZSBjb3VsZCBwcm9iYWJseSBkZXRlY3QgdGhpcyBiYXNlZCBvbiBlaXRoZXIgdGhlIERSQgot CQkgKiBtYXRjaGluZywgd2hpY2ggd2FzIHRoZSBjYXNlIGZvciB0aGUgc3dpenpsaW5nIHJlcXVp cmVkIGluCi0JCSAqIHRoZSB0YWJsZSBhYm92ZSwgb3IgZnJvbSB0aGUgMS1jaCB2YWx1ZSBiZWlu ZyBsZXNzIHRoYW4KLQkJICogdGhlIG1pbmltdW0gc2l6ZSBvZiBhIHJhbmsuCi0JCSAqCi0JCSAq IFJlcG9ydHMgaW5kaWNhdGUgdGhhdCB0aGUgc3dpenpsaW5nIGFjdHVhbGx5Ci0JCSAqIHZhcmll cyBkZXBlbmRpbmcgdXBvbiBwYWdlIHBsYWNlbWVudCBpbnNpZGUgdGhlCi0JCSAqIGNoYW5uZWxz LCBpLmUuIHdlIHNlZSBzd2l6emxlZCBwYWdlcyB3aGVyZSB0aGUKLQkJICogYmFua3Mgb2YgbWVt b3J5IGFyZSBwYWlyZWQgYW5kIHVuc3dpenpsZWQgb24gdGhlCi0JCSAqIHVuZXZlbiBwb3J0aW9u LCBzbyBsZWF2ZSB0aGF0IGFzIHVua25vd24uCi0JCSAqLwotCQlpZiAoSTkxNV9SRUFEMTYoQzBE UkIzKSA9PSBJOTE1X1JFQUQxNihDMURSQjMpKSB7Ci0JCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82 X1NXSVpaTEVfOV8xMDsKLQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV85OwotCQl9 Ci0JfQotCi0JaWYgKHN3aXp6bGVfeCA9PSBJOTE1X0JJVF82X1NXSVpaTEVfVU5LTk9XTiB8fAot CSAgICBzd2l6emxlX3kgPT0gSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV04pIHsKLQkJLyogVXNl cnNwYWNlIGxpa2VzIHRvIGV4cGxvZGUgaWYgaXQgc2VlcyB1bmtub3duIHN3aXp6bGluZywKLQkJ ICogc28gbGllLiBXZSB3aWxsIGZpbmlzaCB0aGUgbGllIHdoZW4gcmVwb3J0aW5nIHRocm91Z2gK LQkJICogdGhlIGdldC10aWxpbmctaW9jdGwgYnkgcmVwb3J0aW5nIHRoZSBwaHlzaWNhbCBzd2l6 emxlCi0JCSAqIG1vZGUgYXMgdW5rbm93biBpbnN0ZWFkLgotCQkgKgotCQkgKiBBcyB3ZSBkb24n dCBzdHJpY3RseSBrbm93IHdoYXQgdGhlIHN3aXp6bGluZyBpcywgaXQgbWF5IGJlCi0JCSAqIGJp dDE3IGRlcGVuZGVudCwgYW5kIHNvIHdlIG5lZWQgdG8gYWxzbyBwcmV2ZW50IHRoZSBwYWdlcwot CQkgKiBmcm9tIGJlaW5nIG1vdmVkLgotCQkgKi8KLQkJZGV2X3ByaXYtPnF1aXJrcyB8PSBRVUlS S19QSU5fU1dJWlpMRURfUEFHRVM7Ci0JCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV9O T05FOwotCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKLQl9Ci0KLQlkZXZf cHJpdi0+bW0uYml0XzZfc3dpenpsZV94ID0gc3dpenpsZV94OwotCWRldl9wcml2LT5tbS5iaXRf Nl9zd2l6emxlX3kgPSBzd2l6emxlX3k7Ci19Ci0KLS8qCi0gKiBTd2FwIGV2ZXJ5IDY0IGJ5dGVz IG9mIHRoaXMgcGFnZSBhcm91bmQsIHRvIGFjY291bnQgZm9yIGl0IGhhdmluZyBhIG5ldwotICog Yml0IDE3IG9mIGl0cyBwaHlzaWNhbCBhZGRyZXNzIGFuZCB0aGVyZWZvcmUgYmVpbmcgaW50ZXJw cmV0ZWQgZGlmZmVyZW50bHkKLSAqIGJ5IHRoZSBHUFUuCi0gKi8KLXN0YXRpYyB2b2lkCi1pOTE1 X2dlbV9zd2l6emxlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JY2hhciB0ZW1wWzY0XTsK LQljaGFyICp2YWRkcjsKLQlpbnQgaTsKLQotCXZhZGRyID0ga21hcChwYWdlKTsKLQotCWZvciAo aSA9IDA7IGkgPCBQQUdFX1NJWkU7IGkgKz0gMTI4KSB7Ci0JCW1lbWNweSh0ZW1wLCAmdmFkZHJb aV0sIDY0KTsKLQkJbWVtY3B5KCZ2YWRkcltpXSwgJnZhZGRyW2kgKyA2NF0sIDY0KTsKLQkJbWVt Y3B5KCZ2YWRkcltpICsgNjRdLCB0ZW1wLCA2NCk7Ci0JfQotCi0Ja3VubWFwKHBhZ2UpOwotfQot Ci0vKioKLSAqIGk5MTVfZ2VtX29iamVjdF9kb19iaXRfMTdfc3dpenpsZSAtIGZpeHVwIGJpdCAx NyBzd2l6emxpbmcKLSAqIEBvYmo6IGk5MTUgR0VNIGJ1ZmZlciBvYmplY3QKLSAqIEBwYWdlczog dGhlIHNjYXR0ZXJnYXRoZXIgbGlzdCBvZiBwaHlzaWNhbCBwYWdlcwotICoKLSAqIFRoaXMgZnVu Y3Rpb24gZml4ZXMgdXAgdGhlIHN3aXp6bGluZyBpbiBjYXNlIGFueSBwYWdlIGZyYW1lIG51bWJl ciBmb3IgdGhpcwotICogb2JqZWN0IGhhcyBjaGFuZ2VkIGluIGJpdCAxNyBzaW5jZSB0aGF0IHN0 YXRlIGhhcyBiZWVuIHNhdmVkIHdpdGgKLSAqIGk5MTVfZ2VtX29iamVjdF9zYXZlX2JpdF8xN19z d2l6emxlKCkuCi0gKgotICogVGhpcyBpcyBjYWxsZWQgd2hlbiBwaW5uaW5nIGJhY2tpbmcgc3Rv cmFnZSBhZ2Fpbiwgc2luY2UgdGhlIGtlcm5lbCBpcyBmcmVlCi0gKiB0byBtb3ZlIHVucGlubmVk IGJhY2tpbmcgc3RvcmFnZSBhcm91bmQgKGVpdGhlciBieSBkaXJlY3RseSBtb3ZpbmcgcGFnZXMg b3IKLSAqIGJ5IHN3YXBwaW5nIHRoZW0gb3V0IGFuZCBiYWNrIGluIGFnYWluKS4KLSAqLwotdm9p ZAotaTkxNV9nZW1fb2JqZWN0X2RvX2JpdF8xN19zd2l6emxlKHN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmosCi0JCQkJICBzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzKQotewotCXN0cnVjdCBz Z3RfaXRlciBzZ3RfaXRlcjsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpbnQgaTsKLQotCWlmIChv YmotPmJpdF8xNyA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpID0gMDsKLQlmb3JfZWFjaF9zZ3Rf cGFnZShwYWdlLCBzZ3RfaXRlciwgcGFnZXMpIHsKLQkJY2hhciBuZXdfYml0XzE3ID0gcGFnZV90 b19waHlzKHBhZ2UpID4+IDE3OwotCQlpZiAoKG5ld19iaXRfMTcgJiAweDEpICE9ICh0ZXN0X2Jp dChpLCBvYmotPmJpdF8xNykgIT0gMCkpIHsKLQkJCWk5MTVfZ2VtX3N3aXp6bGVfcGFnZShwYWdl KTsKLQkJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwotCQl9Ci0JCWkrKzsKLQl9Ci19Ci0KLS8qKgot ICogaTkxNV9nZW1fb2JqZWN0X3NhdmVfYml0XzE3X3N3aXp6bGUgLSBzYXZlIGJpdCAxNyBzd2l6 emxpbmcKLSAqIEBvYmo6IGk5MTUgR0VNIGJ1ZmZlciBvYmplY3QKLSAqIEBwYWdlczogdGhlIHNj YXR0ZXJnYXRoZXIgbGlzdCBvZiBwaHlzaWNhbCBwYWdlcwotICoKLSAqIFRoaXMgZnVuY3Rpb24g c2F2ZXMgdGhlIGJpdCAxNyBvZiBlYWNoIHBhZ2UgZnJhbWUgbnVtYmVyIHNvIHRoYXQgc3dpenps aW5nCi0gKiBjYW4gYmUgZml4ZWQgdXAgbGF0ZXIgb24gd2l0aCBpOTE1X2dlbV9vYmplY3RfZG9f Yml0XzE3X3N3aXp6bGUoKS4gVGhpcyBtdXN0Ci0gKiBiZSBjYWxsZWQgYmVmb3JlIHRoZSBiYWNr aW5nIHN0b3JhZ2UgY2FuIGJlIHVucGlubmVkLgotICovCi12b2lkCi1pOTE1X2dlbV9vYmplY3Rf c2F2ZV9iaXRfMTdfc3dpenpsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAotCQkJ CSAgICBzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzKQotewotCWNvbnN0IHVuc2lnbmVkIGludCBwYWdl X2NvdW50ID0gb2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVDsKLQlzdHJ1Y3Qgc2d0X2l0ZXIg c2d0X2l0ZXI7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JaW50IGk7Ci0KLQlpZiAob2JqLT5iaXRf MTcgPT0gTlVMTCkgewotCQlvYmotPmJpdF8xNyA9IGtjYWxsb2MoQklUU19UT19MT05HUyhwYWdl X2NvdW50KSwKLQkJCQkgICAgICBzaXplb2YobG9uZyksIEdGUF9LRVJORUwpOwotCQlpZiAob2Jq LT5iaXRfMTcgPT0gTlVMTCkgewotCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVt b3J5IGZvciBiaXQgMTcgIgotCQkJCSAgInJlY29yZFxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9 Ci0KLQlpID0gMDsKLQotCWZvcl9lYWNoX3NndF9wYWdlKHBhZ2UsIHNndF9pdGVyLCBwYWdlcykg ewotCQlpZiAocGFnZV90b19waHlzKHBhZ2UpICYgKDEgPDwgMTcpKQotCQkJX19zZXRfYml0KGks IG9iai0+Yml0XzE3KTsKLQkJZWxzZQotCQkJX19jbGVhcl9iaXQoaSwgb2JqLT5iaXRfMTcpOwot CQlpKys7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1f ZmVuY2VfcmVnLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9mZW5jZV9yZWcuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODIwNTg0Ci0tLSAvZGV2L251bGwK KysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2VfcmVnLmMKQEAgLTAsMCAr MSw3MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOC0yMDE1IEludGVsIENvcnBvcmF0aW9u CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRv IGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNz b2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFs IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBs aW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVi bGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0 aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdh cmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0 aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNz aW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGlu Y2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBT b2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9V VCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5H IEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisg KiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAg SU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJF IExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdI RVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lO RworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1Ig VEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNp bmNsdWRlIDxkcm0vZHJtUC5oPgorI2luY2x1ZGUgPGRybS9pOTE1X2RybS5oPgorI2luY2x1ZGUg Imk5MTVfZHJ2LmgiCisKKy8qKgorICogRE9DOiBmZW5jZSByZWdpc3RlciBoYW5kbGluZworICoK KyAqIEltcG9ydGFudCB0byBhdm9pZCBjb25mdXNpb25zOiAiZmVuY2VzIiBpbiB0aGUgaTkxNSBk cml2ZXIgYXJlIG5vdCBleGVjdXRpb24KKyAqIGZlbmNlcyB1c2VkIHRvIHRyYWNrIGNvbW1hbmQg Y29tcGxldGlvbiBidXQgaGFyZHdhcmUgZGV0aWxlciBvYmplY3RzIHdoaWNoCisgKiB3cmFwIGEg Z2l2ZW4gcmFuZ2Ugb2YgdGhlIGdsb2JhbCBHVFQuIEVhY2ggcGxhdGZvcm0gaGFzIG9ubHkgYSBm YWlybHkgbGltaXRlZAorICogc2V0IG9mIHRoZXNlIG9iamVjdHMuCisgKgorICogRmVuY2VzIGFy ZSB1c2VkIHRvIGRldGlsZSBHVFQgbWVtb3J5IG1hcHBpbmdzLiBUaGV5J3JlIGFsc28gY29ubmVj dGVkIHRvIHRoZQorICogaGFyZHdhcmUgZnJvbnRidWZmZXIgcmVuZGVyIHRyYWNraW5nIGFuZCBo ZW5jZSBpbnRlcmFjdCB3aXRoIGZyb250YnVmZmVyCisgKiBjb21wcmVzc2lvbi4gRnVydGhlcm1v cmUgb24gb2xkZXIgcGxhdGZvcm1zIGZlbmNlcyBhcmUgcmVxdWlyZWQgZm9yIHRpbGVkCisgKiBv YmplY3RzIHVzZWQgYnkgdGhlIGRpc3BsYXkgZW5naW5lLiBUaGV5IGNhbiBhbHNvIGJlIHVzZWQg YnkgdGhlIHJlbmRlcgorICogZW5naW5lIC0gdGhleSdyZSByZXF1aXJlZCBmb3IgYmxpdHRlciBj b21tYW5kcyBhbmQgYXJlIG9wdGlvbmFsIGZvciByZW5kZXIKKyAqIGNvbW1hbmRzLiBCdXQgb24g Z2VuNCsgYm90aCBkaXNwbGF5ICh3aXRoIHRoZSBleGNlcHRpb24gb2YgZmJjKSBhbmQgcmVuZGVy aW5nCisgKiBoYXZlIHRoZWlyIG93biB0aWxpbmcgc3RhdGUgYml0cyBhbmQgZG9uJ3QgbmVlZCBm ZW5jZXMuCisgKgorICogQWxzbyBub3RlIHRoYXQgZmVuY2VzIG9ubHkgc3VwcG9ydCBYIGFuZCBZ IHRpbGluZyBhbmQgaGVuY2UgY2FuJ3QgYmUgdXNlZCBmb3IKKyAqIHRoZSBmYW5jaWVyIG5ldyB0 aWxpbmcgZm9ybWF0cyBsaWtlIFcsIFlzIGFuZCBZZi4KKyAqCisgKiBGaW5hbGx5IG5vdGUgdGhh dCBiZWNhdXNlIGZlbmNlcyBhcmUgc3VjaCBhIHJlc3RyaWN0ZWQgcmVzb3VyY2UgdGhleSdyZQor ICogZHluYW1pY2FsbHkgYXNzb2NpYXRlZCB3aXRoIG9iamVjdHMuIEZ1cnRoZXJtb3JlIGZlbmNl IHN0YXRlIGlzIGNvbW1pdHRlZCB0bworICogdGhlIGhhcmR3YXJlIGxhemlseSB0byBhdm9pZCB1 bm5lY2Vzc2FyeSBzdGFsbHMgb24gZ2VuMi8zLiBUaGVyZWZvcmUgY29kZSBtdXN0CisgKiBleHBs aWNpdGx5IGNhbGwgaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZSgpIHRvIHN5bmNocm9uaXplIGZl bmNpbmcgc3RhdHVzCisgKiBmb3IgY3B1IGFjY2Vzcy4gQWxzbyBub3RlIHRoYXQgc29tZSBjb2Rl IHdhbnRzIGFuIHVuZmVuY2VkIHZpZXcsIGZvciB0aG9zZQorICogY2FzZXMgdGhlIGZlbmNlIGNh biBiZSByZW1vdmVkIGZvcmNlZnVsbHkgd2l0aCBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlKCku CisgKgorICogSW50ZXJuYWxseSB0aGVzZSBmdW5jdGlvbnMgd2lsbCBzeW5jaHJvbml6ZSB3aXRo IHVzZXJzcGFjZSBhY2Nlc3MgYnkgcmVtb3ZpbmcKKyAqIENQVSBwdGVzIGludG8gR1RUIG1tYXBz IChub3QgdGhlIEdUVCBwdGVzIHRoZW1zZWx2ZXMpIGFzIG5lZWRlZC4KKyAqLworCisjZGVmaW5l IHBpcGVsaW5lZCAwCisKK3N0YXRpYyB2b2lkIGk5NjVfd3JpdGVfZmVuY2VfcmVnKHN0cnVjdCBk cm1faTkxNV9mZW5jZV9yZWcgKmZlbmNlLAorCQkJCSBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sK KwlpOTE1X3JlZ190IGZlbmNlX3JlZ19sbywgZmVuY2VfcmVnX2hpOworCWludCBmZW5jZV9waXRj aF9zaGlmdDsKKwl1NjQgdmFsOworCisJaWYgKElOVEVMX0lORk8oZmVuY2UtPmk5MTUpLT5nZW4g Pj0gNikgeworCQlmZW5jZV9yZWdfbG8gPSBGRU5DRV9SRUdfR0VONl9MTyhmZW5jZS0+aWQpOwor CQlmZW5jZV9yZWdfaGkgPSBGRU5DRV9SRUdfR0VONl9ISShmZW5jZS0+aWQpOworCQlmZW5jZV9w aXRjaF9zaGlmdCA9IEdFTjZfRkVOQ0VfUElUQ0hfU0hJRlQ7CisKKwl9IGVsc2UgeworCQlmZW5j ZV9yZWdfbG8gPSBGRU5DRV9SRUdfOTY1X0xPKGZlbmNlLT5pZCk7CisJCWZlbmNlX3JlZ19oaSA9 IEZFTkNFX1JFR185NjVfSEkoZmVuY2UtPmlkKTsKKwkJZmVuY2VfcGl0Y2hfc2hpZnQgPSBJOTY1 X0ZFTkNFX1BJVENIX1NISUZUOworCX0KKworCXZhbCA9IDA7CisJaWYgKHZtYSkgeworCQl1bnNp Z25lZCBpbnQgdGlsaW5nID0gaTkxNV9nZW1fb2JqZWN0X2dldF90aWxpbmcodm1hLT5vYmopOwor CQlib29sIGlzX3lfdGlsZWQgPSB0aWxpbmcgPT0gSTkxNV9USUxJTkdfWTsKKwkJdW5zaWduZWQg aW50IHN0cmlkZSA9IGk5MTVfZ2VtX29iamVjdF9nZXRfc3RyaWRlKHZtYS0+b2JqKTsKKwkJdTMy IHJvd19zaXplID0gc3RyaWRlICogKGlzX3lfdGlsZWQgPyAzMiA6IDgpOworCQl1MzIgc2l6ZSA9 IHJvdW5kZG93bigodTMyKXZtYS0+bm9kZS5zaXplLCByb3dfc2l6ZSk7CisKKwkJdmFsID0gKCh2 bWEtPm5vZGUuc3RhcnQgKyBzaXplIC0gNDA5NikgJiAweGZmZmZmMDAwKSA8PCAzMjsKKwkJdmFs IHw9IHZtYS0+bm9kZS5zdGFydCAmIDB4ZmZmZmYwMDA7CisJCXZhbCB8PSAodTY0KSgoc3RyaWRl IC8gMTI4KSAtIDEpIDw8IGZlbmNlX3BpdGNoX3NoaWZ0OworCQlpZiAoaXNfeV90aWxlZCkKKwkJ CXZhbCB8PSBCSVQoSTk2NV9GRU5DRV9USUxJTkdfWV9TSElGVCk7CisJCXZhbCB8PSBJOTY1X0ZF TkNFX1JFR19WQUxJRDsKKwl9CisKKwlpZiAoIXBpcGVsaW5lZCkgeworCQlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBmZW5jZS0+aTkxNTsKKworCQkvKiBUbyB3L2EgaW5jb2hl cmVuY3kgd2l0aCBub24tYXRvbWljIDY0LWJpdCByZWdpc3RlciB1cGRhdGVzLAorCQkgKiB3ZSBz cGxpdCB0aGUgNjQtYml0IHVwZGF0ZSBpbnRvIHR3byAzMi1iaXQgd3JpdGVzLiBJbiBvcmRlcgor CQkgKiBmb3IgYSBwYXJ0aWFsIGZlbmNlIG5vdCB0byBiZSBldmFsdWF0ZWQgYmV0d2VlbiB3cml0 ZXMsIHdlCisJCSAqIHByZWNlZGUgdGhlIHVwZGF0ZSB3aXRoIHdyaXRlIHRvIHR1cm4gb2ZmIHRo ZSBmZW5jZSByZWdpc3RlciwKKwkJICogYW5kIG9ubHkgZW5hYmxlIHRoZSBmZW5jZSBhcyB0aGUg bGFzdCBzdGVwLgorCQkgKgorCQkgKiBGb3IgZXh0cmEgbGV2ZWxzIG9mIHBhcmFub2lhLCB3ZSBt YWtlIHN1cmUgZWFjaCBzdGVwIGxhbmRzCisJCSAqIGJlZm9yZSBhcHBseWluZyB0aGUgbmV4dCBz dGVwLgorCQkgKi8KKwkJSTkxNV9XUklURShmZW5jZV9yZWdfbG8sIDApOworCQlQT1NUSU5HX1JF QUQoZmVuY2VfcmVnX2xvKTsKKworCQlJOTE1X1dSSVRFKGZlbmNlX3JlZ19oaSwgdXBwZXJfMzJf Yml0cyh2YWwpKTsKKwkJSTkxNV9XUklURShmZW5jZV9yZWdfbG8sIGxvd2VyXzMyX2JpdHModmFs KSk7CisJCVBPU1RJTkdfUkVBRChmZW5jZV9yZWdfbG8pOworCX0KK30KKworc3RhdGljIHZvaWQg aTkxNV93cml0ZV9mZW5jZV9yZWcoc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqZmVuY2UsCisJ CQkJIHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSAwOworCWlm ICh2bWEpIHsKKwkJdW5zaWduZWQgaW50IHRpbGluZyA9IGk5MTVfZ2VtX29iamVjdF9nZXRfdGls aW5nKHZtYS0+b2JqKTsKKwkJYm9vbCBpc195X3RpbGVkID0gdGlsaW5nID09IEk5MTVfVElMSU5H X1k7CisJCXVuc2lnbmVkIGludCBzdHJpZGUgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3N0cmlkZSh2 bWEtPm9iaik7CisJCWludCBwaXRjaF92YWw7CisJCWludCB0aWxlX3dpZHRoOworCisJCVdBUk4o KHZtYS0+bm9kZS5zdGFydCAmIH5JOTE1X0ZFTkNFX1NUQVJUX01BU0spIHx8CisJCSAgICAgIWlz X3Bvd2VyX29mXzIodm1hLT5ub2RlLnNpemUpIHx8CisJCSAgICAgKHZtYS0+bm9kZS5zdGFydCAm ICh2bWEtPm5vZGUuc2l6ZSAtIDEpKSwKKwkJICAgICAib2JqZWN0IDB4JTA4bGx4IFtmZW5jZWFi bGU/ICVkXSBub3QgMU0gb3IgcG90LXNpemUgKDB4JTA4bGx4KSBhbGlnbmVkXG4iLAorCQkgICAg IHZtYS0+bm9kZS5zdGFydCwKKwkJICAgICBpOTE1X3ZtYV9pc19tYXBfYW5kX2ZlbmNlYWJsZSh2 bWEpLAorCQkgICAgIHZtYS0+bm9kZS5zaXplKTsKKworCQlpZiAoaXNfeV90aWxlZCAmJiBIQVNf MTI4X0JZVEVfWV9USUxJTkcoZmVuY2UtPmk5MTUpKQorCQkJdGlsZV93aWR0aCA9IDEyODsKKwkJ ZWxzZQorCQkJdGlsZV93aWR0aCA9IDUxMjsKKworCQkvKiBOb3RlOiBwaXRjaCBiZXR0ZXIgYmUg YSBwb3dlciBvZiB0d28gdGlsZSB3aWR0aHMgKi8KKwkJcGl0Y2hfdmFsID0gc3RyaWRlIC8gdGls ZV93aWR0aDsKKwkJcGl0Y2hfdmFsID0gZmZzKHBpdGNoX3ZhbCkgLSAxOworCisJCXZhbCA9IHZt YS0+bm9kZS5zdGFydDsKKwkJaWYgKGlzX3lfdGlsZWQpCisJCQl2YWwgfD0gQklUKEk4MzBfRkVO Q0VfVElMSU5HX1lfU0hJRlQpOworCQl2YWwgfD0gSTkxNV9GRU5DRV9TSVpFX0JJVFModm1hLT5u b2RlLnNpemUpOworCQl2YWwgfD0gcGl0Y2hfdmFsIDw8IEk4MzBfRkVOQ0VfUElUQ0hfU0hJRlQ7 CisJCXZhbCB8PSBJODMwX0ZFTkNFX1JFR19WQUxJRDsKKwl9CisKKwlpZiAoIXBpcGVsaW5lZCkg eworCQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBmZW5jZS0+aTkxNTsKKwkJ aTkxNV9yZWdfdCByZWcgPSBGRU5DRV9SRUcoZmVuY2UtPmlkKTsKKworCQlJOTE1X1dSSVRFKHJl ZywgdmFsKTsKKwkJUE9TVElOR19SRUFEKHJlZyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpODMw X3dyaXRlX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpmZW5jZSwKKwkJCQkg c3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IDA7CisJaWYgKHZt YSkgeworCQl1bnNpZ25lZCBpbnQgdGlsaW5nID0gaTkxNV9nZW1fb2JqZWN0X2dldF90aWxpbmco dm1hLT5vYmopOworCQlib29sIGlzX3lfdGlsZWQgPSB0aWxpbmcgPT0gSTkxNV9USUxJTkdfWTsK KwkJdW5zaWduZWQgaW50IHN0cmlkZSA9IGk5MTVfZ2VtX29iamVjdF9nZXRfc3RyaWRlKHZtYS0+ b2JqKTsKKwkJdTMyIHBpdGNoX3ZhbDsKKworCQlXQVJOKCh2bWEtPm5vZGUuc3RhcnQgJiB+STgz MF9GRU5DRV9TVEFSVF9NQVNLKSB8fAorCQkgICAgICFpc19wb3dlcl9vZl8yKHZtYS0+bm9kZS5z aXplKSB8fAorCQkgICAgICh2bWEtPm5vZGUuc3RhcnQgJiAodm1hLT5ub2RlLnNpemUgLSAxKSks CisJCSAgICAgIm9iamVjdCAweCUwOGxseCBub3QgNTEySyBvciBwb3Qtc2l6ZSAweCUwOGxseCBh bGlnbmVkXG4iLAorCQkgICAgIHZtYS0+bm9kZS5zdGFydCwgdm1hLT5ub2RlLnNpemUpOworCisJ CXBpdGNoX3ZhbCA9IHN0cmlkZSAvIDEyODsKKwkJcGl0Y2hfdmFsID0gZmZzKHBpdGNoX3ZhbCkg LSAxOworCisJCXZhbCA9IHZtYS0+bm9kZS5zdGFydDsKKwkJaWYgKGlzX3lfdGlsZWQpCisJCQl2 YWwgfD0gQklUKEk4MzBfRkVOQ0VfVElMSU5HX1lfU0hJRlQpOworCQl2YWwgfD0gSTgzMF9GRU5D RV9TSVpFX0JJVFModm1hLT5ub2RlLnNpemUpOworCQl2YWwgfD0gcGl0Y2hfdmFsIDw8IEk4MzBf RkVOQ0VfUElUQ0hfU0hJRlQ7CisJCXZhbCB8PSBJODMwX0ZFTkNFX1JFR19WQUxJRDsKKwl9CisK KwlpZiAoIXBpcGVsaW5lZCkgeworCQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYg PSBmZW5jZS0+aTkxNTsKKwkJaTkxNV9yZWdfdCByZWcgPSBGRU5DRV9SRUcoZmVuY2UtPmlkKTsK KworCQlJOTE1X1dSSVRFKHJlZywgdmFsKTsKKwkJUE9TVElOR19SRUFEKHJlZyk7CisJfQorfQor CitzdGF0aWMgdm9pZCBmZW5jZV93cml0ZShzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpmZW5j ZSwKKwkJCXN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCS8qIFByZXZpb3VzIGFjY2VzcyB0aHJv dWdoIHRoZSBmZW5jZSByZWdpc3RlciBpcyBtYXJzaGFsbGVkIGJ5CisJICogdGhlIG1iKCkgaW5z aWRlIHRoZSBmYXVsdCBoYW5kbGVycyAoaTkxNV9nZW1fcmVsZWFzZV9tbWFwcykKKwkgKiBhbmQg ZXhwbGljaXRseSBtYW5hZ2VkIGZvciBpbnRlcm5hbCB1c2Vycy4KKwkgKi8KKworCWlmIChJU19H RU4yKGZlbmNlLT5pOTE1KSkKKwkJaTgzMF93cml0ZV9mZW5jZV9yZWcoZmVuY2UsIHZtYSk7CisJ ZWxzZSBpZiAoSVNfR0VOMyhmZW5jZS0+aTkxNSkpCisJCWk5MTVfd3JpdGVfZmVuY2VfcmVnKGZl bmNlLCB2bWEpOworCWVsc2UKKwkJaTk2NV93cml0ZV9mZW5jZV9yZWcoZmVuY2UsIHZtYSk7CisK KwkvKiBBY2Nlc3MgdGhyb3VnaCB0aGUgZmVuY2VkIHJlZ2lvbiBhZnRlcndhcmRzIGlzCisJICog b3JkZXJlZCBieSB0aGUgcG9zdGluZyByZWFkcyB3aGlsc3Qgd3JpdGluZyB0aGUgcmVnaXN0ZXJz LgorCSAqLworCisJZmVuY2UtPmRpcnR5ID0gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgZmVuY2Vf dXBkYXRlKHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZlbmNlLAorCQkJc3RydWN0IGk5MTVf dm1hICp2bWEpCit7CisJaW50IHJldDsKKworCWlmICh2bWEpIHsKKwkJaWYgKCFpOTE1X3ZtYV9p c19tYXBfYW5kX2ZlbmNlYWJsZSh2bWEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKFdB Uk4oIWk5MTVfZ2VtX29iamVjdF9nZXRfc3RyaWRlKHZtYS0+b2JqKSB8fAorCQkJICFpOTE1X2dl bV9vYmplY3RfZ2V0X3RpbGluZyh2bWEtPm9iaiksCisJCQkgImJvZ3VzIGZlbmNlIHNldHVwIHdp dGggc3RyaWRlOiAweCV4LCB0aWxpbmcgbW9kZTogJWlcbiIsCisJCQkgaTkxNV9nZW1fb2JqZWN0 X2dldF9zdHJpZGUodm1hLT5vYmopLAorCQkJIGk5MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5nKHZt YS0+b2JqKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXQgPSBpOTE1X2dlbV9hY3RpdmVf cmV0aXJlKCZ2bWEtPmxhc3RfZmVuY2UsCisJCQkJCSAgICAgJnZtYS0+b2JqLT5iYXNlLmRldi0+ c3RydWN0X211dGV4KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGZl bmNlLT52bWEpIHsKKwkJcmV0ID0gaTkxNV9nZW1fYWN0aXZlX3JldGlyZSgmZmVuY2UtPnZtYS0+ bGFzdF9mZW5jZSwKKwkJCQkgICAgICAmZmVuY2UtPnZtYS0+b2JqLT5iYXNlLmRldi0+c3RydWN0 X211dGV4KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGZlbmNlLT52 bWEgJiYgZmVuY2UtPnZtYSAhPSB2bWEpIHsKKwkJLyogRW5zdXJlIHRoYXQgYWxsIHVzZXJzcGFj ZSBDUFUgYWNjZXNzIGlzIGNvbXBsZXRlZCBiZWZvcmUKKwkJICogc3RlYWxpbmcgdGhlIGZlbmNl LgorCQkgKi8KKwkJaTkxNV9nZW1fcmVsZWFzZV9tbWFwKGZlbmNlLT52bWEtPm9iaik7CisKKwkJ ZmVuY2UtPnZtYS0+ZmVuY2UgPSBOVUxMOworCQlmZW5jZS0+dm1hID0gTlVMTDsKKworCQlsaXN0 X21vdmUoJmZlbmNlLT5saW5rLCAmZmVuY2UtPmk5MTUtPm1tLmZlbmNlX2xpc3QpOworCX0KKwor CWZlbmNlX3dyaXRlKGZlbmNlLCB2bWEpOworCisJaWYgKHZtYSkgeworCQlpZiAoZmVuY2UtPnZt YSAhPSB2bWEpIHsKKwkJCXZtYS0+ZmVuY2UgPSBmZW5jZTsKKwkJCWZlbmNlLT52bWEgPSB2bWE7 CisJCX0KKworCQlsaXN0X21vdmVfdGFpbCgmZmVuY2UtPmxpbmssICZmZW5jZS0+aTkxNS0+bW0u ZmVuY2VfbGlzdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaTkxNV92bWFfcHV0 X2ZlbmNlIC0gZm9yY2UtcmVtb3ZlIGZlbmNlIGZvciBhIFZNQQorICogQHZtYTogdm1hIHRvIG1h cCBsaW5lYXJseSAobm90IHRocm91Z2ggYSBmZW5jZSByZWcpCisgKgorICogVGhpcyBmdW5jdGlv biBmb3JjZS1yZW1vdmVzIGFueSBmZW5jZSBmcm9tIHRoZSBnaXZlbiBvYmplY3QsIHdoaWNoIGlz IHVzZWZ1bAorICogaWYgdGhlIGtlcm5lbCB3YW50cyB0byBkbyB1bnRpbGVkIEdUVCBhY2Nlc3Mu CisgKgorICogUmV0dXJuczoKKyAqCisgKiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNv ZGUgb24gZmFpbHVyZS4KKyAqLworaW50CitpOTE1X3ZtYV9wdXRfZmVuY2Uoc3RydWN0IGk5MTVf dm1hICp2bWEpCit7CisJc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqZmVuY2UgPSB2bWEtPmZl bmNlOworCisJYXNzZXJ0X3JwbV93YWtlbG9ja19oZWxkKHRvX2k5MTUodm1hLT52bS0+ZGV2KSk7 CisKKwlpZiAoIWZlbmNlKQorCQlyZXR1cm4gMDsKKworCWlmIChmZW5jZS0+cGluX2NvdW50KQor CQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIGZlbmNlX3VwZGF0ZShmZW5jZSwgTlVMTCk7Cit9 CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpmZW5jZV9maW5kKHN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVn ICpmZW5jZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmVuY2UsICZkZXZfcHJpdi0+bW0uZmVu Y2VfbGlzdCwgbGluaykgeworCQlpZiAoZmVuY2UtPnBpbl9jb3VudCkKKwkJCWNvbnRpbnVlOwor CisJCXJldHVybiBmZW5jZTsKKwl9CisKKwkvKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIHBlbmRp bmcgZmxpcHMgd2hpY2ggY29uc3VtZSBmZW5jZXMgKi8KKwlpZiAoaW50ZWxfaGFzX3BlbmRpbmdf ZmJfdW5waW4oJmRldl9wcml2LT5kcm0pKQorCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKKwor CXJldHVybiBFUlJfUFRSKC1FREVBRExLKTsKK30KKworLyoqCisgKiBpOTE1X3ZtYV9nZXRfZmVu Y2UgLSBzZXQgdXAgZmVuY2luZyBmb3IgYSB2bWEKKyAqIEB2bWE6IHZtYSB0byBtYXAgdGhyb3Vn aCBhIGZlbmNlIHJlZworICoKKyAqIFdoZW4gbWFwcGluZyBvYmplY3RzIHRocm91Z2ggdGhlIEdU VCwgdXNlcnNwYWNlIHdhbnRzIHRvIGJlIGFibGUgdG8gd3JpdGUKKyAqIHRvIHRoZW0gd2l0aG91 dCBoYXZpbmcgdG8gd29ycnkgYWJvdXQgc3dpenpsaW5nIGlmIHRoZSBvYmplY3QgaXMgdGlsZWQu CisgKiBUaGlzIGZ1bmN0aW9uIHdhbGtzIHRoZSBmZW5jZSByZWdzIGxvb2tpbmcgZm9yIGEgZnJl ZSBvbmUgZm9yIEBvYmosCisgKiBzdGVhbGluZyBvbmUgaWYgaXQgY2FuJ3QgZmluZCBhbnkuCisg KgorICogSXQgdGhlbiBzZXRzIHVwIHRoZSByZWcgYmFzZWQgb24gdGhlIG9iamVjdCdzIHByb3Bl cnRpZXM6IGFkZHJlc3MsIHBpdGNoCisgKiBhbmQgdGlsaW5nIGZvcm1hdC4KKyAqCisgKiBGb3Ig YW4gdW50aWxlZCBzdXJmYWNlLCB0aGlzIHJlbW92ZXMgYW55IGV4aXN0aW5nIGZlbmNlLgorICoK KyAqIFJldHVybnM6CisgKgorICogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9u IGZhaWx1cmUuCisgKi8KK2ludAoraTkxNV92bWFfZ2V0X2ZlbmNlKHN0cnVjdCBpOTE1X3ZtYSAq dm1hKQoreworCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZlbmNlOworCXN0cnVjdCBpOTE1 X3ZtYSAqc2V0ID0gaTkxNV9nZW1fb2JqZWN0X2lzX3RpbGVkKHZtYS0+b2JqKSA/IHZtYSA6IE5V TEw7CisKKwkvKiBOb3RlIHRoYXQgd2UgcmV2b2tlIGZlbmNlcyBvbiBydW50aW1lIHN1c3BlbmQu IFRoZXJlZm9yZSB0aGUgdXNlcgorCSAqIG11c3Qga2VlcCB0aGUgZGV2aWNlIGF3YWtlIHdoaWxz dCB1c2luZyB0aGUgZmVuY2UuCisJICovCisJYXNzZXJ0X3JwbV93YWtlbG9ja19oZWxkKHRvX2k5 MTUodm1hLT52bS0+ZGV2KSk7CisKKwkvKiBKdXN0IHVwZGF0ZSBvdXIgcGxhY2UgaW4gdGhlIExS VSBpZiBvdXIgZmVuY2UgaXMgZ2V0dGluZyByZXVzZWQuICovCisJaWYgKHZtYS0+ZmVuY2UpIHsK KwkJZmVuY2UgPSB2bWEtPmZlbmNlOworCQlpZiAoIWZlbmNlLT5kaXJ0eSkgeworCQkJbGlzdF9t b3ZlX3RhaWwoJmZlbmNlLT5saW5rLAorCQkJCSAgICAgICAmZmVuY2UtPmk5MTUtPm1tLmZlbmNl X2xpc3QpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYgKHNldCkgeworCQlmZW5jZSA9 IGZlbmNlX2ZpbmQodG9faTkxNSh2bWEtPnZtLT5kZXYpKTsKKwkJaWYgKElTX0VSUihmZW5jZSkp CisJCQlyZXR1cm4gUFRSX0VSUihmZW5jZSk7CisJfSBlbHNlCisJCXJldHVybiAwOworCisJcmV0 dXJuIGZlbmNlX3VwZGF0ZShmZW5jZSwgc2V0KTsKK30KKworLyoqCisgKiBpOTE1X2dlbV9yZXN0 b3JlX2ZlbmNlcyAtIHJlc3RvcmUgZmVuY2Ugc3RhdGUKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAq CisgKiBSZXN0b3JlIHRoZSBodyBmZW5jZSBzdGF0ZSB0byBtYXRjaCB0aGUgc29mdHdhcmUgdHJh Y2tpbmcgYWdhaW4sIHRvIGJlIGNhbGxlZAorICogYWZ0ZXIgYSBncHUgcmVzZXQgYW5kIG9uIHJl c3VtZS4gTm90ZSB0aGF0IG9uIHJ1bnRpbWUgc3VzcGVuZCB3ZSBvbmx5IGNhbmNlbAorICogdGhl IGZlbmNlcywgdG8gYmUgcmVhY3F1aXJlZCBieSB0aGUgdXNlciBsYXRlci4KKyAqLwordm9pZCBp OTE1X2dlbV9yZXN0b3JlX2ZlbmNlcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoZGV2KTsKKwlpbnQgaTsKKwor CS8qIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBzdHJ1Y3RfbXV0ZXgs IGJ5CisJICogcnVudGltZSBzdXNwZW5kL3Jlc3VtZS4gVGhlIGJhcnJpZXIgd2UgcmVxdWlyZSBp cyBlbmZvcmNlZCBieQorCSAqIHJwbSBpdHNlbGYgLSBhbGwgYWNjZXNzIHRvIGZlbmNlcy9HVFQg YXJlIG9ubHkgd2l0aGluIGFuIHJwbQorCSAqIHdha2VyZWYsIGFuZCB0byBhY3F1aXJlIHRoYXQg d2FrZXJlZiB5b3UgbXVzdCBwYXNzIHRocm91Z2ggaGVyZS4KKwkgKi8KKworCWZvciAoaSA9IDA7 IGkgPCBkZXZfcHJpdi0+bnVtX2ZlbmNlX3JlZ3M7IGkrKykgeworCQlzdHJ1Y3QgZHJtX2k5MTVf ZmVuY2VfcmVnICpyZWcgPSAmZGV2X3ByaXYtPmZlbmNlX3JlZ3NbaV07CisJCXN0cnVjdCBpOTE1 X3ZtYSAqdm1hID0gcmVnLT52bWE7CisKKwkJLyoKKwkJICogQ29tbWl0IGRlbGF5ZWQgdGlsaW5n IGNoYW5nZXMgaWYgd2UgaGF2ZSBhbiBvYmplY3Qgc3RpbGwKKwkJICogYXR0YWNoZWQgdG8gdGhl IGZlbmNlLCBvdGhlcndpc2UganVzdCBjbGVhciB0aGUgZmVuY2UuCisJCSAqLworCQlpZiAodm1h ICYmICFpOTE1X2dlbV9vYmplY3RfaXNfdGlsZWQodm1hLT5vYmopKSB7CisJCQlHRU1fQlVHX09O KCFyZWctPmRpcnR5KTsKKwkJCUdFTV9CVUdfT04oIWxpc3RfZW1wdHkoJnZtYS0+b2JqLT51c2Vy ZmF1bHRfbGluaykpOworCisJCQlsaXN0X21vdmUoJnJlZy0+bGluaywgJmRldl9wcml2LT5tbS5m ZW5jZV9saXN0KTsKKwkJCXZtYS0+ZmVuY2UgPSBOVUxMOworCQkJdm1hID0gTlVMTDsKKwkJfQor CisJCWZlbmNlX3dyaXRlKHJlZywgdm1hKTsKKwkJcmVnLT52bWEgPSB2bWE7CisJfQorfQorCisv KioKKyAqIERPQzogdGlsaW5nIHN3aXp6bGluZyBkZXRhaWxzCisgKgorICogVGhlIGlkZWEgYmVo aW5kIHRpbGluZyBpcyB0byBpbmNyZWFzZSBjYWNoZSBoaXQgcmF0ZXMgYnkgcmVhcnJhbmdpbmcK KyAqIHBpeGVsIGRhdGEgc28gdGhhdCBhIGdyb3VwIG9mIHBpeGVsIGFjY2Vzc2VzIGFyZSBpbiB0 aGUgc2FtZSBjYWNoZWxpbmUuCisgKiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBmcm9tIGRvaW5n IHRoaXMgb24gdGhlIGJhY2svZGVwdGggYnVmZmVyIGFyZSBvbgorICogdGhlIG9yZGVyIG9mIDMw JS4KKyAqCisgKiBJbnRlbCBhcmNoaXRlY3R1cmVzIG1ha2UgdGhpcyBzb21ld2hhdCBtb3JlIGNv bXBsaWNhdGVkLCB0aG91Z2gsIGJ5CisgKiBhZGp1c3RtZW50cyBtYWRlIHRvIGFkZHJlc3Npbmcg b2YgZGF0YSB3aGVuIHRoZSBtZW1vcnkgaXMgaW4gaW50ZXJsZWF2ZWQKKyAqIG1vZGUgKG1hdGNo ZWQgcGFpcnMgb2YgRElNTVMpIHRvIGltcHJvdmUgbWVtb3J5IGJhbmR3aWR0aC4KKyAqIEZvciBp bnRlcmxlYXZlZCBtZW1vcnksIHRoZSBDUFUgc2VuZHMgZXZlcnkgc2VxdWVudGlhbCA2NCBieXRl cworICogdG8gYW4gYWx0ZXJuYXRlIG1lbW9yeSBjaGFubmVsIHNvIGl0IGNhbiBnZXQgdGhlIGJh bmR3aWR0aCBmcm9tIGJvdGguCisgKgorICogVGhlIEdQVSBhbHNvIHJlYXJyYW5nZXMgaXRzIGFj Y2Vzc2VzIGZvciBpbmNyZWFzZWQgYmFuZHdpZHRoIHRvIGludGVybGVhdmVkCisgKiBtZW1vcnks IGFuZCBpdCBtYXRjaGVzIHdoYXQgdGhlIENQVSBkb2VzIGZvciBub24tdGlsZWQuICBIb3dldmVy LCB3aGVuIHRpbGVkCisgKiBpdCBkb2VzIGl0IGEgbGl0dGxlIGRpZmZlcmVudGx5LCBzaW5jZSBv bmUgd2Fsa3MgYWRkcmVzc2VzIG5vdCBqdXN0IGluIHRoZQorICogWCBkaXJlY3Rpb24gYnV0IGFs c28gWS4gIFNvLCBhbG9uZyB3aXRoIGFsdGVybmF0aW5nIGNoYW5uZWxzIHdoZW4gYml0CisgKiA2 IG9mIHRoZSBhZGRyZXNzIGZsaXBzLCBpdCBhbHNvIGFsdGVybmF0ZXMgd2hlbiBvdGhlciBiaXRz IGZsaXAgLS0gIEJpdHMgOQorICogKGV2ZXJ5IDUxMiBieXRlcywgYW4gWCB0aWxlIHNjYW5saW5l KSBhbmQgMTAgKGV2ZXJ5IHR3byBYIHRpbGUgc2NhbmxpbmVzKQorICogYXJlIGNvbW1vbiB0byBi b3RoIHRoZSA5MTUgYW5kIDk2NS1jbGFzcyBoYXJkd2FyZS4KKyAqCisgKiBUaGUgQ1BVIGFsc28g c29tZXRpbWVzIFhPUnMgaW4gaGlnaGVyIGJpdHMgYXMgd2VsbCwgdG8gaW1wcm92ZQorICogYmFu ZHdpZHRoIGRvaW5nIHN0cmlkZWQgYWNjZXNzIGxpa2Ugd2UgZG8gc28gZnJlcXVlbnRseSBpbiBn cmFwaGljcy4gIFRoaXMKKyAqIGlzIGNhbGxlZCAiQ2hhbm5lbCBYT1IgUmFuZG9taXphdGlvbiIg aW4gdGhlIE1DSCBkb2N1bWVudGF0aW9uLiAgVGhlIHJlc3VsdAorICogaXMgdGhhdCB0aGUgQ1BV IGlzIFhPUmluZyBpbiBlaXRoZXIgYml0IDExIG9yIGJpdCAxNyB0byBiaXQgNiBvZiBpdHMgYWRk cmVzcworICogZGVjb2RlLgorICoKKyAqIEFsbCBvZiB0aGlzIGJpdCA2IFhPUmluZyBoYXMgYW4g ZWZmZWN0IG9uIG91ciBtZW1vcnkgbWFuYWdlbWVudCwKKyAqIGFzIHdlIG5lZWQgdG8gbWFrZSBz dXJlIHRoYXQgdGhlIDNkIGRyaXZlciBjYW4gY29ycmVjdGx5IGFkZHJlc3Mgb2JqZWN0CisgKiBj b250ZW50cy4KKyAqCisgKiBJZiB3ZSBkb24ndCBoYXZlIGludGVybGVhdmVkIG1lbW9yeSwgYWxs IHRpbGluZyBpcyBzYWZlIGFuZCBubyBzd2l6emxpbmcgaXMKKyAqIHJlcXVpcmVkLgorICoKKyAq IFdoZW4gYml0IDE3IGlzIFhPUmVkIGluLCB3ZSBzaW1wbHkgcmVmdXNlIHRvIHRpbGUgYXQgYWxs LiAgQml0CisgKiAxNyBpcyBub3QganVzdCBhIHBhZ2Ugb2Zmc2V0LCBzbyBhcyB3ZSBwYWdlIGFu IG9iamVjdCBvdXQgYW5kIGJhY2sgaW4sCisgKiBpbmRpdmlkdWFsIHBhZ2VzIGluIGl0IHdpbGwg aGF2ZSBkaWZmZXJlbnQgYml0IDE3IGFkZHJlc3NlcywgcmVzdWx0aW5nIGluCisgKiBlYWNoIDY0 IGJ5dGVzIGJlaW5nIHN3YXBwZWQgd2l0aCBpdHMgbmVpZ2hib3IhCisgKgorICogT3RoZXJ3aXNl LCBpZiBpbnRlcmxlYXZlZCwgd2UgaGF2ZSB0byB0ZWxsIHRoZSAzZCBkcml2ZXIgd2hhdCB0aGUg YWRkcmVzcworICogc3dpenpsaW5nIGl0IG5lZWRzIHRvIGRvIGlzLCBzaW5jZSBpdCdzIHdyaXRp bmcgd2l0aCB0aGUgQ1BVIHRvIHRoZSBwYWdlcworICogKGJpdCA2IGFuZCBwb3RlbnRpYWxseSBi aXQgMTEgWE9SZWQgaW4pLCBhbmQgdGhlIEdQVSBpcyByZWFkaW5nIGZyb20gdGhlCisgKiBwYWdl cyAoYml0IDYsIDksIGFuZCAxMCBYT1JlZCBpbiksIHJlc3VsdGluZyBpbiBhIGN1bXVsYXRpdmUg Yml0IHN3aXp6bGluZworICogcmVxdWlyZWQgYnkgdGhlIENQVSBvZiBYT1JpbmcgaW4gYml0IDYs IDksIDEwLCBhbmQgcG90ZW50aWFsbHkgMTEsIGluIG9yZGVyCisgKiB0byBtYXRjaCB3aGF0IHRo ZSBHUFUgZXhwZWN0cy4KKyAqLworCisvKioKKyAqIGk5MTVfZ2VtX2RldGVjdF9iaXRfNl9zd2l6 emxlIC0gZGV0ZWN0IGJpdCA2IHN3aXp6bGluZyBwYXR0ZXJuCisgKiBAZGV2OiBEUk0gZGV2aWNl CisgKgorICogRGV0ZWN0cyBiaXQgNiBzd2l6emxpbmcgb2YgYWRkcmVzcyBsb29rdXAgYmV0d2Vl biBJR0QgYWNjZXNzIGFuZCBDUFUKKyAqIGFjY2VzcyB0aHJvdWdoIG1haW4gbWVtb3J5LgorICov Cit2b2lkCitpOTE1X2dlbV9kZXRlY3RfYml0XzZfc3dpenpsZShzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoZGV2 KTsKKwl1aW50MzJfdCBzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfVU5LTk9XTjsKKwl1 aW50MzJfdCBzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfVU5LTk9XTjsKKworCWlmIChJ TlRFTF9HRU4oZGV2X3ByaXYpID49IDggfHwgSVNfVkFMTEVZVklFVyhkZXZfcHJpdikpIHsKKwkJ LyoKKwkJICogT24gQkRXKywgc3dpenpsaW5nIGlzIG5vdCB1c2VkLiBXZSBsZWF2ZSB0aGUgQ1BV IG1lbW9yeQorCQkgKiBjb250cm9sbGVyIGluIGNoYXJnZSBvZiBvcHRpbWl6aW5nIG1lbW9yeSBh Y2Nlc3NlcyB3aXRob3V0CisJCSAqIHRoZSBleHRyYSBhZGRyZXNzIG1hbmlwdWxhdGlvbiBHUFUg c2lkZS4KKwkJICoKKwkJICogVkxWIGFuZCBDSFYgZG9uJ3QgaGF2ZSBHUFUgc3dpenpsaW5nLgor CQkgKi8KKwkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisJCXN3aXp6bGVf eSA9IEk5MTVfQklUXzZfU1dJWlpMRV9OT05FOworCX0gZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYp LT5nZW4gPj0gNikgeworCQlpZiAoZGV2X3ByaXYtPnByZXNlcnZlX2Jpb3Nfc3dpenpsZSkgewor CQkJaWYgKEk5MTVfUkVBRChESVNQX0FSQl9DVEwpICYKKwkJCSAgICBESVNQX1RJTEVfU1VSRkFD RV9TV0laWkxJTkcpIHsKKwkJCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMDsK KwkJCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfOTsKKwkJCX0gZWxzZSB7CisJCQkJ c3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisJCQkJc3dpenpsZV95ID0gSTkx NV9CSVRfNl9TV0laWkxFX05PTkU7CisJCQl9CisJCX0gZWxzZSB7CisJCQl1aW50MzJfdCBkaW1t X2MwLCBkaW1tX2MxOworCQkJZGltbV9jMCA9IEk5MTVfUkVBRChNQURfRElNTV9DMCk7CisJCQlk aW1tX2MxID0gSTkxNV9SRUFEKE1BRF9ESU1NX0MxKTsKKwkJCWRpbW1fYzAgJj0gTUFEX0RJTU1f QV9TSVpFX01BU0sgfCBNQURfRElNTV9CX1NJWkVfTUFTSzsKKwkJCWRpbW1fYzEgJj0gTUFEX0RJ TU1fQV9TSVpFX01BU0sgfCBNQURfRElNTV9CX1NJWkVfTUFTSzsKKwkJCS8qIEVuYWJsZSBzd2l6 emxpbmcgd2hlbiB0aGUgY2hhbm5lbHMgYXJlIHBvcHVsYXRlZAorCQkJICogd2l0aCBpZGVudGlj YWxseSBzaXplZCBkaW1tcy4gV2UgZG9uJ3QgbmVlZCB0byBjaGVjaworCQkJICogdGhlIDNyZCBj aGFubmVsIGJlY2F1c2Ugbm8gY3B1IHdpdGggZ3B1IGF0dGFjaGVkCisJCQkgKiBzaGlwcyBpbiB0 aGF0IGNvbmZpZ3VyYXRpb24uIEFsc28sIHN3aXp6bGluZyBvbmx5CisJCQkgKiBtYWtlcyBzZW5z ZSBmb3IgMiBjaGFubmVscyBhbnl3YXkuICovCisJCQlpZiAoZGltbV9jMCA9PSBkaW1tX2MxKSB7 CisJCQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTA7CisJCQkJc3dpenpsZV95 ID0gSTkxNV9CSVRfNl9TV0laWkxFXzk7CisJCQl9IGVsc2UgeworCQkJCXN3aXp6bGVfeCA9IEk5 MTVfQklUXzZfU1dJWlpMRV9OT05FOworCQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpM RV9OT05FOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChJU19HRU41KGRldl9wcml2KSkgeworCQkv KiBPbiBJcm9ubGFrZSB3aGF0ZXZlciBEUkFNIGNvbmZpZywgR1BVIGFsd2F5cyBkbworCQkgKiBz YW1lIHN3aXp6bGluZyBzZXR1cC4KKwkJICovCisJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJ WlpMRV85XzEwOworCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfOTsKKwl9IGVsc2Ug aWYgKElTX0dFTjIoZGV2X3ByaXYpKSB7CisJCS8qIEFzIGZhciBhcyB3ZSBrbm93LCB0aGUgODY1 IGRvZXNuJ3QgaGF2ZSB0aGVzZSBiaXQgNgorCQkgKiBzd2l6emxpbmcgaXNzdWVzLgorCQkgKi8K KwkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisJCXN3aXp6bGVfeSA9IEk5 MTVfQklUXzZfU1dJWlpMRV9OT05FOworCX0gZWxzZSBpZiAoSVNfTU9CSUxFKGRldl9wcml2KSB8 fCAoSVNfR0VOMyhkZXZfcHJpdikgJiYKKwkJICAgIUlTX0czMyhkZXZfcHJpdikpKSB7CisJCXVp bnQzMl90IGRjYzsKKworCQkvKiBPbiA5eHggY2hpcHNldHMsIGNoYW5uZWwgaW50ZXJsZWF2ZSBi eSB0aGUgQ1BVIGlzCisJCSAqIGRldGVybWluZWQgYnkgRENDLiAgRm9yIHNpbmdsZS1jaGFubmVs LCBuZWl0aGVyIHRoZSBDUFUKKwkJICogbm9yIHRoZSBHUFUgZG8gc3dpenpsaW5nLiAgRm9yIGR1 YWwgY2hhbm5lbCBpbnRlcmxlYXZlZCwKKwkJICogdGhlIEdQVSdzIGludGVybGVhdmUgaXMgYml0 IDkgYW5kIDEwIGZvciBYIHRpbGVkLCBhbmQgYml0CisJCSAqIDkgZm9yIFkgdGlsZWQuICBUaGUg Q1BVJ3MgaW50ZXJsZWF2ZSBpcyBpbmRlcGVuZGVudCwgYW5kCisJCSAqIGNhbiBiZSBiYXNlZCBv biBlaXRoZXIgYml0IDExIChoYXZlbid0IHNlZW4gdGhpcyB5ZXQpIG9yCisJCSAqIGJpdCAxNyAo Y29tbW9uKS4KKwkJICovCisJCWRjYyA9IEk5MTVfUkVBRChEQ0MpOworCQlzd2l0Y2ggKGRjYyAm IERDQ19BRERSRVNTSU5HX01PREVfTUFTSykgeworCQljYXNlIERDQ19BRERSRVNTSU5HX01PREVf U0lOR0xFX0NIQU5ORUw6CisJCWNhc2UgRENDX0FERFJFU1NJTkdfTU9ERV9EVUFMX0NIQU5ORUxf QVNZTU1FVFJJQzoKKwkJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV9OT05FOworCQkJ c3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisJCQlicmVhazsKKwkJY2FzZSBE Q0NfQUREUkVTU0lOR19NT0RFX0RVQUxfQ0hBTk5FTF9JTlRFUkxFQVZFRDoKKwkJCWlmIChkY2Mg JiBEQ0NfQ0hBTk5FTF9YT1JfRElTQUJMRSkgeworCQkJCS8qIFRoaXMgaXMgdGhlIGJhc2Ugc3dp enpsaW5nIGJ5IHRoZSBHUFUgZm9yCisJCQkJICogdGlsZWQgYnVmZmVycy4KKwkJCQkgKi8KKwkJ CQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMDsKKwkJCQlzd2l6emxlX3kgPSBJ OTE1X0JJVF82X1NXSVpaTEVfOTsKKwkJCX0gZWxzZSBpZiAoKGRjYyAmIERDQ19DSEFOTkVMX1hP Ul9CSVRfMTcpID09IDApIHsKKwkJCQkvKiBCaXQgMTEgc3dpenpsaW5nIGJ5IHRoZSBDUFUgaW4g YWRkaXRpb24uICovCisJCQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTBfMTE7 CisJCQkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTE7CisJCQl9IGVsc2Ugewor CQkJCS8qIEJpdCAxNyBzd2l6emxpbmcgYnkgdGhlIENQVSBpbiBhZGRpdGlvbi4gKi8KKwkJCQlz d2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMF8xNzsKKwkJCQlzd2l6emxlX3kgPSBJ OTE1X0JJVF82X1NXSVpaTEVfOV8xNzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyogY2hl Y2sgZm9yIEwtc2hhcGVkIG1lbW9yeSBha2EgbW9kaWZpZWQgZW5oYW5jZWQgYWRkcmVzc2luZyAq LworCQlpZiAoSVNfR0VONChkZXZfcHJpdikgJiYKKwkJICAgICEoSTkxNV9SRUFEKERDQzIpICYg RENDMl9NT0RJRklFRF9FTkhBTkNFRF9ESVNBQkxFKSkgeworCQkJc3dpenpsZV94ID0gSTkxNV9C SVRfNl9TV0laWkxFX1VOS05PV047CisJCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVf VU5LTk9XTjsKKwkJfQorCisJCWlmIChkY2MgPT0gMHhmZmZmZmZmZikgeworCQkJRFJNX0VSUk9S KCJDb3VsZG4ndCByZWFkIGZyb20gTUNIQkFSLiAgIgorCQkJCSAgIkRpc2FibGluZyB0aWxpbmcu XG4iKTsKKwkJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOOworCQkJc3dp enpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV047CisJCX0KKwl9IGVsc2UgeworCQkv KiBUaGUgOTY1LCBHMzMsIGFuZCBuZXdlciwgaGF2ZSBhIHZlcnkgZmxleGlibGUgbWVtb3J5CisJ CSAqIGNvbmZpZ3VyYXRpb24uICBJdCB3aWxsIGVuYWJsZSBkdWFsLWNoYW5uZWwgbW9kZQorCQkg KiAoaW50ZXJsZWF2aW5nKSBvbiBhcyBtdWNoIG1lbW9yeSBhcyBpdCBjYW4sIGFuZCB0aGUgR1BV CisJCSAqIHdpbGwgYWRkaXRpb25hbGx5IHNvbWV0aW1lcyBlbmFibGUgZGlmZmVyZW50IGJpdCA2 CisJCSAqIHN3aXp6bGluZyBmb3IgdGlsZWQgb2JqZWN0cyBmcm9tIHRoZSBDUFUuCisJCSAqCisJ CSAqIEhlcmUncyB3aGF0IEkgZm91bmQgb24gdGhlIEc5NjU6CisJCSAqICAgIHNsb3QgZmlsbCAg ICAgICAgIG1lbW9yeSBzaXplICBzd2l6emxpbmcKKwkJICogMEEgICAwQiAgIDFBICAgMUIgICAg MS1jaCAgIDItY2gKKwkJICogNTEyICAwICAgIDAgICAgMCAgICAgNTEyICAgIDAgICAgIE8KKwkJ ICogNTEyICAwICAgIDUxMiAgMCAgICAgMTYgICAgIDEwMDggIFgKKwkJICogNTEyICAwICAgIDAg ICAgNTEyICAgMTYgICAgIDEwMDggIFgKKwkJICogMCAgICA1MTIgIDAgICAgNTEyICAgMTYgICAg IDEwMDggIFgKKwkJICogMTAyNCAxMDI0IDEwMjQgMCAgICAgMjA0OCAgIDEwMjQgIE8KKwkJICoK KwkJICogV2UgY291bGQgcHJvYmFibHkgZGV0ZWN0IHRoaXMgYmFzZWQgb24gZWl0aGVyIHRoZSBE UkIKKwkJICogbWF0Y2hpbmcsIHdoaWNoIHdhcyB0aGUgY2FzZSBmb3IgdGhlIHN3aXp6bGluZyBy ZXF1aXJlZCBpbgorCQkgKiB0aGUgdGFibGUgYWJvdmUsIG9yIGZyb20gdGhlIDEtY2ggdmFsdWUg YmVpbmcgbGVzcyB0aGFuCisJCSAqIHRoZSBtaW5pbXVtIHNpemUgb2YgYSByYW5rLgorCQkgKgor CQkgKiBSZXBvcnRzIGluZGljYXRlIHRoYXQgdGhlIHN3aXp6bGluZyBhY3R1YWxseQorCQkgKiB2 YXJpZXMgZGVwZW5kaW5nIHVwb24gcGFnZSBwbGFjZW1lbnQgaW5zaWRlIHRoZQorCQkgKiBjaGFu bmVscywgaS5lLiB3ZSBzZWUgc3dpenpsZWQgcGFnZXMgd2hlcmUgdGhlCisJCSAqIGJhbmtzIG9m IG1lbW9yeSBhcmUgcGFpcmVkIGFuZCB1bnN3aXp6bGVkIG9uIHRoZQorCQkgKiB1bmV2ZW4gcG9y dGlvbiwgc28gbGVhdmUgdGhhdCBhcyB1bmtub3duLgorCQkgKi8KKwkJaWYgKEk5MTVfUkVBRDE2 KEMwRFJCMykgPT0gSTkxNV9SRUFEMTYoQzFEUkIzKSkgeworCQkJc3dpenpsZV94ID0gSTkxNV9C SVRfNl9TV0laWkxFXzlfMTA7CisJCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfOTsK KwkJfQorCX0KKworCWlmIChzd2l6emxlX3ggPT0gSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV04g fHwKKwkgICAgc3dpenpsZV95ID09IEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOKSB7CisJCS8q IFVzZXJzcGFjZSBsaWtlcyB0byBleHBsb2RlIGlmIGl0IHNlZXMgdW5rbm93biBzd2l6emxpbmcs CisJCSAqIHNvIGxpZS4gV2Ugd2lsbCBmaW5pc2ggdGhlIGxpZSB3aGVuIHJlcG9ydGluZyB0aHJv dWdoCisJCSAqIHRoZSBnZXQtdGlsaW5nLWlvY3RsIGJ5IHJlcG9ydGluZyB0aGUgcGh5c2ljYWwg c3dpenpsZQorCQkgKiBtb2RlIGFzIHVua25vd24gaW5zdGVhZC4KKwkJICoKKwkJICogQXMgd2Ug ZG9uJ3Qgc3RyaWN0bHkga25vdyB3aGF0IHRoZSBzd2l6emxpbmcgaXMsIGl0IG1heSBiZQorCQkg KiBiaXQxNyBkZXBlbmRlbnQsIGFuZCBzbyB3ZSBuZWVkIHRvIGFsc28gcHJldmVudCB0aGUgcGFn ZXMKKwkJICogZnJvbSBiZWluZyBtb3ZlZC4KKwkJICovCisJCWRldl9wcml2LT5xdWlya3MgfD0g UVVJUktfUElOX1NXSVpaTEVEX1BBR0VTOworCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpa TEVfTk9ORTsKKwkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisJfQorCisJ ZGV2X3ByaXYtPm1tLmJpdF82X3N3aXp6bGVfeCA9IHN3aXp6bGVfeDsKKwlkZXZfcHJpdi0+bW0u Yml0XzZfc3dpenpsZV95ID0gc3dpenpsZV95OworfQorCisvKgorICogU3dhcCBldmVyeSA2NCBi eXRlcyBvZiB0aGlzIHBhZ2UgYXJvdW5kLCB0byBhY2NvdW50IGZvciBpdCBoYXZpbmcgYSBuZXcK KyAqIGJpdCAxNyBvZiBpdHMgcGh5c2ljYWwgYWRkcmVzcyBhbmQgdGhlcmVmb3JlIGJlaW5nIGlu dGVycHJldGVkIGRpZmZlcmVudGx5CisgKiBieSB0aGUgR1BVLgorICovCitzdGF0aWMgdm9pZAor aTkxNV9nZW1fc3dpenpsZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWNoYXIgdGVtcFs2 NF07CisJY2hhciAqdmFkZHI7CisJaW50IGk7CisKKwl2YWRkciA9IGttYXAocGFnZSk7CisKKwlm b3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFOyBpICs9IDEyOCkgeworCQltZW1jcHkodGVtcCwgJnZh ZGRyW2ldLCA2NCk7CisJCW1lbWNweSgmdmFkZHJbaV0sICZ2YWRkcltpICsgNjRdLCA2NCk7CisJ CW1lbWNweSgmdmFkZHJbaSArIDY0XSwgdGVtcCwgNjQpOworCX0KKworCWt1bm1hcChwYWdlKTsK K30KKworLyoqCisgKiBpOTE1X2dlbV9vYmplY3RfZG9fYml0XzE3X3N3aXp6bGUgLSBmaXh1cCBi aXQgMTcgc3dpenpsaW5nCisgKiBAb2JqOiBpOTE1IEdFTSBidWZmZXIgb2JqZWN0CisgKiBAcGFn ZXM6IHRoZSBzY2F0dGVyZ2F0aGVyIGxpc3Qgb2YgcGh5c2ljYWwgcGFnZXMKKyAqCisgKiBUaGlz IGZ1bmN0aW9uIGZpeGVzIHVwIHRoZSBzd2l6emxpbmcgaW4gY2FzZSBhbnkgcGFnZSBmcmFtZSBu dW1iZXIgZm9yIHRoaXMKKyAqIG9iamVjdCBoYXMgY2hhbmdlZCBpbiBiaXQgMTcgc2luY2UgdGhh dCBzdGF0ZSBoYXMgYmVlbiBzYXZlZCB3aXRoCisgKiBpOTE1X2dlbV9vYmplY3Rfc2F2ZV9iaXRf MTdfc3dpenpsZSgpLgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gcGlubmluZyBiYWNraW5n IHN0b3JhZ2UgYWdhaW4sIHNpbmNlIHRoZSBrZXJuZWwgaXMgZnJlZQorICogdG8gbW92ZSB1bnBp bm5lZCBiYWNraW5nIHN0b3JhZ2UgYXJvdW5kIChlaXRoZXIgYnkgZGlyZWN0bHkgbW92aW5nIHBh Z2VzIG9yCisgKiBieSBzd2FwcGluZyB0aGVtIG91dCBhbmQgYmFjayBpbiBhZ2FpbikuCisgKi8K K3ZvaWQKK2k5MTVfZ2VtX29iamVjdF9kb19iaXRfMTdfc3dpenpsZShzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqLAorCQkJCSAgc3RydWN0IHNnX3RhYmxlICpwYWdlcykKK3sKKwlzdHJ1 Y3Qgc2d0X2l0ZXIgc2d0X2l0ZXI7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGk7CisKKwlp ZiAob2JqLT5iaXRfMTcgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaSA9IDA7CisJZm9yX2VhY2hf c2d0X3BhZ2UocGFnZSwgc2d0X2l0ZXIsIHBhZ2VzKSB7CisJCWNoYXIgbmV3X2JpdF8xNyA9IHBh Z2VfdG9fcGh5cyhwYWdlKSA+PiAxNzsKKwkJaWYgKChuZXdfYml0XzE3ICYgMHgxKSAhPSAodGVz dF9iaXQoaSwgb2JqLT5iaXRfMTcpICE9IDApKSB7CisJCQlpOTE1X2dlbV9zd2l6emxlX3BhZ2Uo cGFnZSk7CisJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJfQorCQlpKys7CisJfQorfQorCisv KioKKyAqIGk5MTVfZ2VtX29iamVjdF9zYXZlX2JpdF8xN19zd2l6emxlIC0gc2F2ZSBiaXQgMTcg c3dpenpsaW5nCisgKiBAb2JqOiBpOTE1IEdFTSBidWZmZXIgb2JqZWN0CisgKiBAcGFnZXM6IHRo ZSBzY2F0dGVyZ2F0aGVyIGxpc3Qgb2YgcGh5c2ljYWwgcGFnZXMKKyAqCisgKiBUaGlzIGZ1bmN0 aW9uIHNhdmVzIHRoZSBiaXQgMTcgb2YgZWFjaCBwYWdlIGZyYW1lIG51bWJlciBzbyB0aGF0IHN3 aXp6bGluZworICogY2FuIGJlIGZpeGVkIHVwIGxhdGVyIG9uIHdpdGggaTkxNV9nZW1fb2JqZWN0 X2RvX2JpdF8xN19zd2l6emxlKCkuIFRoaXMgbXVzdAorICogYmUgY2FsbGVkIGJlZm9yZSB0aGUg YmFja2luZyBzdG9yYWdlIGNhbiBiZSB1bnBpbm5lZC4KKyAqLwordm9pZAoraTkxNV9nZW1fb2Jq ZWN0X3NhdmVfYml0XzE3X3N3aXp6bGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwK KwkJCQkgICAgc3RydWN0IHNnX3RhYmxlICpwYWdlcykKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQg cGFnZV9jb3VudCA9IG9iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQ7CisJc3RydWN0IHNndF9p dGVyIHNndF9pdGVyOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBpOworCisJaWYgKG9iai0+ Yml0XzE3ID09IE5VTEwpIHsKKwkJb2JqLT5iaXRfMTcgPSBrY2FsbG9jKEJJVFNfVE9fTE9OR1Mo cGFnZV9jb3VudCksCisJCQkJICAgICAgc2l6ZW9mKGxvbmcpLCBHRlBfS0VSTkVMKTsKKwkJaWYg KG9iai0+Yml0XzE3ID09IE5VTEwpIHsKKwkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRl IG1lbW9yeSBmb3IgYml0IDE3ICIKKwkJCQkgICJyZWNvcmRcbiIpOworCQkJcmV0dXJuOworCQl9 CisJfQorCisJaSA9IDA7CisKKwlmb3JfZWFjaF9zZ3RfcGFnZShwYWdlLCBzZ3RfaXRlciwgcGFn ZXMpIHsKKwkJaWYgKHBhZ2VfdG9fcGh5cyhwYWdlKSAmICgxIDw8IDE3KSkKKwkJCV9fc2V0X2Jp dChpLCBvYmotPmJpdF8xNyk7CisJCWVsc2UKKwkJCV9fY2xlYXJfYml0KGksIG9iai0+Yml0XzE3 KTsKKwkJaSsrOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf Z2VtX2ZlbmNlX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2VfcmVn LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjNGEyZAotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2ZlbmNlX3JlZy5oCkBAIC0w LDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgor ICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBh bnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29j aWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBp biB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGlt aXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxp c2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhl IFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJl IGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlv bnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lv biBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNs dWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29m dHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQg V0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBC VVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICog RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElO IE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBM SUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVU SEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcK KyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRI RSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKwor I2lmbmRlZiBfX0k5MTVfRkVOQ0VfUkVHX0hfXworI2RlZmluZSBfX0k5MTVfRkVOQ0VfUkVHX0hf XworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCitzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZTsK K3N0cnVjdCBpOTE1X3ZtYTsKKworc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyB7CisJc3RydWN0 IGxpc3RfaGVhZCBsaW5rOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1OworCXN0cnVj dCBpOTE1X3ZtYSAqdm1hOworCWludCBwaW5fY291bnQ7CisJaW50IGlkOworCS8qKgorCSAqIFdo ZXRoZXIgdGhlIHRpbGluZyBwYXJhbWV0ZXJzIGZvciB0aGUgY3VycmVudGx5CisJICogYXNzb2Np YXRlZCBmZW5jZSByZWdpc3RlciBoYXZlIGNoYW5nZWQuIE5vdGUgdGhhdAorCSAqIGZvciB0aGUg cHVycG9zZXMgb2YgdHJhY2tpbmcgdGlsaW5nIGNoYW5nZXMgd2UgYWxzbworCSAqIHRyZWF0IHRo ZSB1bmZlbmNlZCByZWdpc3RlciwgdGhlIHJlZ2lzdGVyIHNsb3QgdGhhdAorCSAqIHRoZSBvYmpl Y3Qgb2NjdXBpZXMgd2hpbHN0IGl0IGV4ZWN1dGVzIGEgZmVuY2VkCisJICogY29tbWFuZCAoc3Vj aCBhcyBCTFQgb24gZ2VuMi8zKSwgYXMgYSAiZmVuY2UiLgorCSAqLworCWJvb2wgZGlydHk7Cit9 OworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1f Z3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwppbmRleCA2NzYwNmJm Li4yNjMxZjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQu YworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwpAQCAtOTYsMTMgKzk2 LDYgQEAKICAqCiAgKi8KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgaTkxNV9nZ3R0ICoKLWk5MTVf dm1fdG9fZ2d0dChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKLXsKLQlHRU1fQlVHX09O KCFpOTE1X2lzX2dndHQodm0pKTsKLQlyZXR1cm4gY29udGFpbmVyX29mKHZtLCBzdHJ1Y3QgaTkx NV9nZ3R0LCBiYXNlKTsKLX0KLQogc3RhdGljIGludAogaTkxNV9nZXRfZ2d0dF92bWFfcGFnZXMo c3RydWN0IGk5MTVfdm1hICp2bWEpOwogCkBAIC0zMzQ4LDE3NSArMzM0MSw2IEBAIHZvaWQgaTkx NV9nZW1fcmVzdG9yZV9ndHRfbWFwcGluZ3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKIAlpOTE1 X2dndHRfZmx1c2goZGV2X3ByaXYpOwogfQogCi1zdGF0aWMgdm9pZAotaTkxNV92bWFfcmV0aXJl KHN0cnVjdCBpOTE1X2dlbV9hY3RpdmUgKmFjdGl2ZSwKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9y ZXF1ZXN0ICpycSkKLXsKLQljb25zdCB1bnNpZ25lZCBpbnQgaWR4ID0gcnEtPmVuZ2luZS0+aWQ7 Ci0Jc3RydWN0IGk5MTVfdm1hICp2bWEgPQotCQljb250YWluZXJfb2YoYWN0aXZlLCBzdHJ1Y3Qg aTkxNV92bWEsIGxhc3RfcmVhZFtpZHhdKTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqID0gdm1hLT5vYmo7Ci0KLQlHRU1fQlVHX09OKCFpOTE1X3ZtYV9oYXNfYWN0aXZlX2VuZ2lu ZSh2bWEsIGlkeCkpOwotCi0JaTkxNV92bWFfY2xlYXJfYWN0aXZlKHZtYSwgaWR4KTsKLQlpZiAo aTkxNV92bWFfaXNfYWN0aXZlKHZtYSkpCi0JCXJldHVybjsKLQotCWxpc3RfbW92ZV90YWlsKCZ2 bWEtPnZtX2xpbmssICZ2bWEtPnZtLT5pbmFjdGl2ZV9saXN0KTsKLQlpZiAodW5saWtlbHkoaTkx NV92bWFfaXNfY2xvc2VkKHZtYSkgJiYgIWk5MTVfdm1hX2lzX3Bpbm5lZCh2bWEpKSkKLQkJV0FS Tl9PTihpOTE1X3ZtYV91bmJpbmQodm1hKSk7Ci0KLQlHRU1fQlVHX09OKCFpOTE1X2dlbV9vYmpl Y3RfaXNfYWN0aXZlKG9iaikpOwotCWlmICgtLW9iai0+YWN0aXZlX2NvdW50KQotCQlyZXR1cm47 Ci0KLQkvKiBCdW1wIG91ciBwbGFjZSBvbiB0aGUgYm91bmQgbGlzdCB0byBrZWVwIGl0IHJvdWdo bHkgaW4gTFJVIG9yZGVyCi0JICogc28gdGhhdCB3ZSBkb24ndCBzdGVhbCBmcm9tIHJlY2VudGx5 IHVzZWQgYnV0IGluYWN0aXZlIG9iamVjdHMKLQkgKiAodW5sZXNzIHdlIGFyZSBmb3JjZWQgdG8g b2ZjISkKLQkgKi8KLQlpZiAob2JqLT5iaW5kX2NvdW50KQotCQlsaXN0X21vdmVfdGFpbCgmb2Jq LT5nbG9iYWxfbGlzdCwgJnJxLT5pOTE1LT5tbS5ib3VuZF9saXN0KTsKLQotCW9iai0+bW0uZGly dHkgPSB0cnVlOyAvKiBiZSBwYXJhbm9pZCAgKi8KLQotCWlmIChpOTE1X2dlbV9vYmplY3RfaGFz X2FjdGl2ZV9yZWZlcmVuY2Uob2JqKSkgewotCQlpOTE1X2dlbV9vYmplY3RfY2xlYXJfYWN0aXZl X3JlZmVyZW5jZShvYmopOwotCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7Ci0JfQotfQotCi1z dGF0aWMgdm9pZAotaTkxNV9nZ3R0X3JldGlyZV9fd3JpdGUoc3RydWN0IGk5MTVfZ2VtX2FjdGl2 ZSAqYWN0aXZlLAotCQkJc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0KQotewot CXN0cnVjdCBpOTE1X3ZtYSAqdm1hID0KLQkJY29udGFpbmVyX29mKGFjdGl2ZSwgc3RydWN0IGk5 MTVfdm1hLCBsYXN0X3dyaXRlKTsKLQotCWludGVsX2ZiX29ial9mbHVzaCh2bWEtPm9iaiwgdHJ1 ZSwgT1JJR0lOX0NTKTsKLX0KLQotdm9pZCBpOTE1X3ZtYV9kZXN0cm95KHN0cnVjdCBpOTE1X3Zt YSAqdm1hKQotewotCUdFTV9CVUdfT04odm1hLT5ub2RlLmFsbG9jYXRlZCk7Ci0JR0VNX0JVR19P TihpOTE1X3ZtYV9pc19hY3RpdmUodm1hKSk7Ci0JR0VNX0JVR19PTighaTkxNV92bWFfaXNfY2xv c2VkKHZtYSkpOwotCUdFTV9CVUdfT04odm1hLT5mZW5jZSk7Ci0KLQlyYl9lcmFzZSgmdm1hLT5v Ympfbm9kZSwgJnZtYS0+b2JqLT52bWFfdHJlZSk7Ci0JbGlzdF9kZWwoJnZtYS0+dm1fbGluayk7 Ci0JaWYgKCFpOTE1X3ZtYV9pc19nZ3R0KHZtYSkpCi0JCWk5MTVfcHBndHRfcHV0KGk5MTVfdm1f dG9fcHBndHQodm1hLT52bSkpOwotCi0Ja21lbV9jYWNoZV9mcmVlKHRvX2k5MTUodm1hLT5vYmot PmJhc2UuZGV2KS0+dm1hcywgdm1hKTsKLX0KLQotdm9pZCBpOTE1X3ZtYV9jbG9zZShzdHJ1Y3Qg aTkxNV92bWEgKnZtYSkKLXsKLQlHRU1fQlVHX09OKGk5MTVfdm1hX2lzX2Nsb3NlZCh2bWEpKTsK LQl2bWEtPmZsYWdzIHw9IEk5MTVfVk1BX0NMT1NFRDsKLQotCWxpc3RfZGVsX2luaXQoJnZtYS0+ b2JqX2xpbmspOwotCWlmICghaTkxNV92bWFfaXNfYWN0aXZlKHZtYSkgJiYgIWk5MTVfdm1hX2lz X3Bpbm5lZCh2bWEpKQotCQlXQVJOX09OKGk5MTVfdm1hX3VuYmluZCh2bWEpKTsKLX0KLQotc3Rh dGljIGlubGluZSBsb25nIHZtYV9jb21wYXJlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkJICAg ICAgIHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJICAgICAgIGNvbnN0IHN0cnVj dCBpOTE1X2dndHRfdmlldyAqdmlldykKLXsKLQlHRU1fQlVHX09OKHZpZXcgJiYgIWk5MTVfdm1h X2lzX2dndHQodm1hKSk7Ci0KLQlpZiAodm1hLT52bSAhPSB2bSkKLQkJcmV0dXJuIHZtYS0+dm0g LSB2bTsKLQotCWlmICghdmlldykKLQkJcmV0dXJuIHZtYS0+Z2d0dF92aWV3LnR5cGU7Ci0KLQlp ZiAodm1hLT5nZ3R0X3ZpZXcudHlwZSAhPSB2aWV3LT50eXBlKQotCQlyZXR1cm4gdm1hLT5nZ3R0 X3ZpZXcudHlwZSAtIHZpZXctPnR5cGU7Ci0KLQlyZXR1cm4gbWVtY21wKCZ2bWEtPmdndHRfdmll dy5wYXJhbXMsCi0JCSAgICAgICZ2aWV3LT5wYXJhbXMsCi0JCSAgICAgIHNpemVvZih2aWV3LT5w YXJhbXMpKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpOTE1X3ZtYSAqCi1fX2k5MTVfdm1hX2NyZWF0 ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAotCQkgIHN0cnVjdCBpOTE1X2FkZHJl c3Nfc3BhY2UgKnZtLAotCQkgIGNvbnN0IHN0cnVjdCBpOTE1X2dndHRfdmlldyAqdmlldykKLXsK LQlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKLQlzdHJ1Y3QgcmJfbm9kZSAqcmIsICoqcDsKLQlpbnQg aTsKLQotCUdFTV9CVUdfT04odm0tPmNsb3NlZCk7Ci0KLQl2bWEgPSBrbWVtX2NhY2hlX3phbGxv Yyh0b19pOTE1KG9iai0+YmFzZS5kZXYpLT52bWFzLCBHRlBfS0VSTkVMKTsKLQlpZiAodm1hID09 IE5VTEwpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0JSU5JVF9MSVNUX0hFQUQoJnZt YS0+ZXhlY19saXN0KTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2bWEtPmxhc3RfcmVh ZCk7IGkrKykKLQkJaW5pdF9yZXF1ZXN0X2FjdGl2ZSgmdm1hLT5sYXN0X3JlYWRbaV0sIGk5MTVf dm1hX3JldGlyZSk7Ci0JaW5pdF9yZXF1ZXN0X2FjdGl2ZSgmdm1hLT5sYXN0X3dyaXRlLAotCQkJ ICAgIGk5MTVfaXNfZ2d0dCh2bSkgPyBpOTE1X2dndHRfcmV0aXJlX193cml0ZSA6IE5VTEwpOwot CWluaXRfcmVxdWVzdF9hY3RpdmUoJnZtYS0+bGFzdF9mZW5jZSwgTlVMTCk7Ci0JbGlzdF9hZGQo JnZtYS0+dm1fbGluaywgJnZtLT51bmJvdW5kX2xpc3QpOwotCXZtYS0+dm0gPSB2bTsKLQl2bWEt Pm9iaiA9IG9iajsKLQl2bWEtPnNpemUgPSBvYmotPmJhc2Uuc2l6ZTsKLQotCWlmICh2aWV3KSB7 Ci0JCXZtYS0+Z2d0dF92aWV3ID0gKnZpZXc7Ci0JCWlmICh2aWV3LT50eXBlID09IEk5MTVfR0dU VF9WSUVXX1BBUlRJQUwpIHsKLQkJCXZtYS0+c2l6ZSA9IHZpZXctPnBhcmFtcy5wYXJ0aWFsLnNp emU7Ci0JCQl2bWEtPnNpemUgPDw9IFBBR0VfU0hJRlQ7Ci0JCX0gZWxzZSBpZiAodmlldy0+dHlw ZSA9PSBJOTE1X0dHVFRfVklFV19ST1RBVEVEKSB7Ci0JCQl2bWEtPnNpemUgPQotCQkJCWludGVs X3JvdGF0aW9uX2luZm9fc2l6ZSgmdmlldy0+cGFyYW1zLnJvdGF0ZWQpOwotCQkJdm1hLT5zaXpl IDw8PSBQQUdFX1NISUZUOwotCQl9Ci0JfQotCi0JaWYgKGk5MTVfaXNfZ2d0dCh2bSkpIHsKLQkJ dm1hLT5mbGFncyB8PSBJOTE1X1ZNQV9HR1RUOwotCQlsaXN0X2FkZCgmdm1hLT5vYmpfbGluaywg Jm9iai0+dm1hX2xpc3QpOwotCX0gZWxzZSB7Ci0JCWk5MTVfcHBndHRfZ2V0KGk5MTVfdm1fdG9f cHBndHQodm0pKTsKLQkJbGlzdF9hZGRfdGFpbCgmdm1hLT5vYmpfbGluaywgJm9iai0+dm1hX2xp c3QpOwotCX0KLQotCXJiID0gTlVMTDsKLQlwID0gJm9iai0+dm1hX3RyZWUucmJfbm9kZTsKLQl3 aGlsZSAoKnApIHsKLQkJc3RydWN0IGk5MTVfdm1hICpwb3M7Ci0KLQkJcmIgPSAqcDsKLQkJcG9z ID0gcmJfZW50cnkocmIsIHN0cnVjdCBpOTE1X3ZtYSwgb2JqX25vZGUpOwotCQlpZiAodm1hX2Nv bXBhcmUocG9zLCB2bSwgdmlldykgPCAwKQotCQkJcCA9ICZyYi0+cmJfcmlnaHQ7Ci0JCWVsc2UK LQkJCXAgPSAmcmItPnJiX2xlZnQ7Ci0JfQotCXJiX2xpbmtfbm9kZSgmdm1hLT5vYmpfbm9kZSwg cmIsIHApOwotCXJiX2luc2VydF9jb2xvcigmdm1hLT5vYmpfbm9kZSwgJm9iai0+dm1hX3RyZWUp OwotCi0JcmV0dXJuIHZtYTsKLX0KLQotc3RydWN0IGk5MTVfdm1hICoKLWk5MTVfdm1hX2NyZWF0 ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAotCQlzdHJ1Y3QgaTkxNV9hZGRyZXNz X3NwYWNlICp2bSwKLQkJY29uc3Qgc3RydWN0IGk5MTVfZ2d0dF92aWV3ICp2aWV3KQotewotCWxv Y2tkZXBfYXNzZXJ0X2hlbGQoJm9iai0+YmFzZS5kZXYtPnN0cnVjdF9tdXRleCk7Ci0JR0VNX0JV R19PTih2aWV3ICYmICFpOTE1X2lzX2dndHQodm0pKTsKLQlHRU1fQlVHX09OKGk5MTVfZ2VtX29i al90b192bWEob2JqLCB2bSwgdmlldykpOwotCi0JcmV0dXJuIF9faTkxNV92bWFfY3JlYXRlKG9i aiwgdm0sIHZpZXcpOwotfQotCiBzdHJ1Y3QgaTkxNV92bWEgKgogaTkxNV9nZW1fb2JqX3RvX3Zt YShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkgICAgc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0sCkBAIC0zNTI5LDcgKzMzNTMsNyBAQCBpOTE1X2dlbV9vYmpfdG9fdm1h KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCXN0cnVjdCBpOTE1X3ZtYSAqdm1h ID0gcmJfZW50cnkocmIsIHN0cnVjdCBpOTE1X3ZtYSwgb2JqX25vZGUpOwogCQlsb25nIGNtcDsK IAotCQljbXAgPSB2bWFfY29tcGFyZSh2bWEsIHZtLCB2aWV3KTsKKwkJY21wID0gaTkxNV92bWFf Y29tcGFyZSh2bWEsIHZtLCB2aWV3KTsKIAkJaWYgKGNtcCA9PSAwKQogCQkJcmV0dXJuIHZtYTsK IApAQCAtMzU1NCw3ICszMzc4LDcgQEAgaTkxNV9nZW1fb2JqX2xvb2t1cF9vcl9jcmVhdGVfdm1h KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAKIAl2bWEgPSBpOTE1X2dlbV9vYmpf dG9fdm1hKG9iaiwgdm0sIHZpZXcpOwogCWlmICghdm1hKSB7Ci0JCXZtYSA9IF9faTkxNV92bWFf Y3JlYXRlKG9iaiwgdm0sIHZpZXcpOworCQl2bWEgPSBpOTE1X3ZtYV9jcmVhdGUob2JqLCB2bSwg dmlldyk7CiAJCUdFTV9CVUdfT04odm1hICE9IGk5MTVfZ2VtX29ial90b192bWEob2JqLCB2bSwg dmlldykpOwogCX0KIApAQCAtMzczOSw5OSArMzU2MywzIEBAIGk5MTVfZ2V0X2dndHRfdm1hX3Bh Z2VzKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQogCXJldHVybiByZXQ7CiB9CiAKLS8qKgotICogaTkx NV92bWFfYmluZCAtIFNldHMgdXAgUFRFcyBmb3IgYW4gVk1BIGluIGl0J3MgY29ycmVzcG9uZGlu ZyBhZGRyZXNzIHNwYWNlLgotICogQHZtYTogVk1BIHRvIG1hcAotICogQGNhY2hlX2xldmVsOiBt YXBwaW5nIGNhY2hlIGxldmVsCi0gKiBAZmxhZ3M6IGZsYWdzIGxpa2UgZ2xvYmFsIG9yIGxvY2Fs IG1hcHBpbmcKLSAqCi0gKiBETUEgYWRkcmVzc2VzIGFyZSB0YWtlbiBmcm9tIHRoZSBzY2F0dGVy LWdhdGhlciB0YWJsZSBvZiB0aGlzIG9iamVjdCAob3Igb2YKLSAqIHRoaXMgVk1BIGluIGNhc2Ug b2Ygbm9uLWRlZmF1bHQgR0dUVCB2aWV3cykgYW5kIFBURSBlbnRyaWVzIHNldCB1cC4KLSAqIE5v dGUgdGhhdCBETUEgYWRkcmVzc2VzIGFyZSBhbHNvIHRoZSBvbmx5IHBhcnQgb2YgdGhlIFNHIHRh YmxlIHdlIGNhcmUgYWJvdXQuCi0gKi8KLWludCBpOTE1X3ZtYV9iaW5kKHN0cnVjdCBpOTE1X3Zt YSAqdm1hLCBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCi0JCSAgdTMyIGZsYWdz KQotewotCXUzMiBiaW5kX2ZsYWdzOwotCXUzMiB2bWFfZmxhZ3M7Ci0JaW50IHJldDsKLQotCWlm IChXQVJOX09OKGZsYWdzID09IDApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJpbmRfZmxhZ3Mg PSAwOwotCWlmIChmbGFncyAmIFBJTl9HTE9CQUwpCi0JCWJpbmRfZmxhZ3MgfD0gSTkxNV9WTUFf R0xPQkFMX0JJTkQ7Ci0JaWYgKGZsYWdzICYgUElOX1VTRVIpCi0JCWJpbmRfZmxhZ3MgfD0gSTkx NV9WTUFfTE9DQUxfQklORDsKLQotCXZtYV9mbGFncyA9IHZtYS0+ZmxhZ3MgJiAoSTkxNV9WTUFf R0xPQkFMX0JJTkQgfCBJOTE1X1ZNQV9MT0NBTF9CSU5EKTsKLQlpZiAoZmxhZ3MgJiBQSU5fVVBE QVRFKQotCQliaW5kX2ZsYWdzIHw9IHZtYV9mbGFnczsKLQllbHNlCi0JCWJpbmRfZmxhZ3MgJj0g fnZtYV9mbGFnczsKLQlpZiAoYmluZF9mbGFncyA9PSAwKQotCQlyZXR1cm4gMDsKLQotCWlmICh2 bWFfZmxhZ3MgPT0gMCAmJiB2bWEtPnZtLT5hbGxvY2F0ZV92YV9yYW5nZSkgewotCQl0cmFjZV9p OTE1X3ZhX2FsbG9jKHZtYSk7Ci0JCXJldCA9IHZtYS0+dm0tPmFsbG9jYXRlX3ZhX3JhbmdlKHZt YS0+dm0sCi0JCQkJCQkgdm1hLT5ub2RlLnN0YXJ0LAotCQkJCQkJIHZtYS0+bm9kZS5zaXplKTsK LQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gdm1hLT52bS0+YmluZF92 bWEodm1hLCBjYWNoZV9sZXZlbCwgYmluZF9mbGFncyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJl dDsKLQotCXZtYS0+ZmxhZ3MgfD0gYmluZF9mbGFnczsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBf X2lvbWVtICppOTE1X3ZtYV9waW5faW9tYXAoc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0Jdm9p ZCBfX2lvbWVtICpwdHI7Ci0KLQkvKiBBY2Nlc3MgdGhyb3VnaCB0aGUgR1RUIHJlcXVpcmVzIHRo ZSBkZXZpY2UgdG8gYmUgYXdha2UuICovCi0JYXNzZXJ0X3JwbV93YWtlbG9ja19oZWxkKHRvX2k5 MTUodm1hLT52bS0+ZGV2KSk7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZ2bWEtPnZtLT5kZXYt PnN0cnVjdF9tdXRleCk7Ci0JaWYgKFdBUk5fT04oIWk5MTVfdm1hX2lzX21hcF9hbmRfZmVuY2Vh YmxlKHZtYSkpKQotCQlyZXR1cm4gSU9fRVJSX1BUUigtRU5PREVWKTsKLQotCUdFTV9CVUdfT04o IWk5MTVfdm1hX2lzX2dndHQodm1hKSk7Ci0JR0VNX0JVR19PTigodm1hLT5mbGFncyAmIEk5MTVf Vk1BX0dMT0JBTF9CSU5EKSA9PSAwKTsKLQotCXB0ciA9IHZtYS0+aW9tYXA7Ci0JaWYgKHB0ciA9 PSBOVUxMKSB7Ci0JCXB0ciA9IGlvX21hcHBpbmdfbWFwX3djKCZpOTE1X3ZtX3RvX2dndHQodm1h LT52bSktPm1hcHBhYmxlLAotCQkJCQl2bWEtPm5vZGUuc3RhcnQsCi0JCQkJCXZtYS0+bm9kZS5z aXplKTsKLQkJaWYgKHB0ciA9PSBOVUxMKQotCQkJcmV0dXJuIElPX0VSUl9QVFIoLUVOT01FTSk7 Ci0KLQkJdm1hLT5pb21hcCA9IHB0cjsKLQl9Ci0KLQlfX2k5MTVfdm1hX3Bpbih2bWEpOwotCXJl dHVybiBwdHI7Ci19Ci0KLXZvaWQgaTkxNV92bWFfdW5waW5fYW5kX3JlbGVhc2Uoc3RydWN0IGk5 MTVfdm1hICoqcF92bWEpCi17Ci0Jc3RydWN0IGk5MTVfdm1hICp2bWE7Ci0Jc3RydWN0IGRybV9p OTE1X2dlbV9vYmplY3QgKm9iajsKLQotCXZtYSA9IGZldGNoX2FuZF96ZXJvKHBfdm1hKTsKLQlp ZiAoIXZtYSkKLQkJcmV0dXJuOwotCi0Jb2JqID0gdm1hLT5vYmo7Ci0KLQlpOTE1X3ZtYV91bnBp bih2bWEpOwotCWk5MTVfdm1hX2Nsb3NlKHZtYSk7Ci0KLQlfX2k5MTVfZ2VtX29iamVjdF9yZWxl YXNlX3VubGVzc19hY3RpdmUob2JqKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2k5MTVfZ2VtX2d0dC5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmgK aW5kZXggYzIzZWY5ZC4uNTdiNTg0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv aTkxNV9nZW1fZ3R0LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmgK QEAgLTM1LDcgKzM1LDkgQEAKICNkZWZpbmUgX19JOTE1X0dFTV9HVFRfSF9fCiAKICNpbmNsdWRl IDxsaW51eC9pby1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAorI2luY2x1ZGUg Imk5MTVfZ2VtX3RpbWVsaW5lLmgiCiAjaW5jbHVkZSAiaTkxNV9nZW1fcmVxdWVzdC5oIgogCiAj ZGVmaW5lIEk5MTVfRkVOQ0VfUkVHX05PTkUgLTEKQEAgLTEzOCw2ICsxNDAsOCBAQCB0eXBlZGVm IHVpbnQ2NF90IGdlbjhfcHBndHRfcG1sNGVfdDsKICNkZWZpbmUgR0VOOF9QUEFUX0VMTENfT1ZF UlJJREUJCSgwPDwyKQogI2RlZmluZSBHRU44X1BQQVQoaSwgeCkJCQkoKHVpbnQ2NF90KSAoeCkg PDwgKChpKSAqIDgpKQogCitzdHJ1Y3Qgc2dfdGFibGU7CisKIGVudW0gaTkxNV9nZ3R0X3ZpZXdf dHlwZSB7CiAJSTkxNV9HR1RUX1ZJRVdfTk9STUFMID0gMCwKIAlJOTE1X0dHVFRfVklFV19ST1RB VEVELApAQCAtMTY4LDEzNSArMTcyLDcgQEAgZXh0ZXJuIGNvbnN0IHN0cnVjdCBpOTE1X2dndHRf dmlldyBpOTE1X2dndHRfdmlld19yb3RhdGVkOwogCiBlbnVtIGk5MTVfY2FjaGVfbGV2ZWw7CiAK LS8qKgotICogQSBWTUEgcmVwcmVzZW50cyBhIEdFTSBCTyB0aGF0IGlzIGJvdW5kIGludG8gYW4g YWRkcmVzcyBzcGFjZS4gVGhlcmVmb3JlLCBhCi0gKiBWTUEncyBwcmVzZW5jZSBjYW5ub3QgYmUg Z3VhcmFudGVlZCBiZWZvcmUgYmluZGluZywgb3IgYWZ0ZXIgdW5iaW5kaW5nIHRoZQotICogb2Jq ZWN0IGludG8vZnJvbSB0aGUgYWRkcmVzcyBzcGFjZS4KLSAqCi0gKiBUbyBtYWtlIHRoaW5ncyBh cyBzaW1wbGUgYXMgcG9zc2libGUgKGllLiBubyByZWZjb3VudGluZyksIGEgVk1BJ3MgbGlmZXRp bWUKLSAqIHdpbGwgYWx3YXlzIGJlIDw9IGFuIG9iamVjdHMgbGlmZXRpbWUuIFNvIG9iamVjdCBy ZWZjb3VudGluZyBzaG91bGQgY292ZXIgdXMuCi0gKi8KLXN0cnVjdCBpOTE1X3ZtYSB7Ci0Jc3Ry dWN0IGRybV9tbV9ub2RlIG5vZGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsK LQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2Vf cmVnICpmZW5jZTsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzOwotCXZvaWQgX19pb21lbSAqaW9t YXA7Ci0JdTY0IHNpemU7Ci0JdTY0IGRpc3BsYXlfYWxpZ25tZW50OwotCi0JdW5zaWduZWQgaW50 IGZsYWdzOwotCS8qKgotCSAqIEhvdyBtYW55IHVzZXJzIGhhdmUgcGlubmVkIHRoaXMgb2JqZWN0 IGluIEdUVCBzcGFjZS4gVGhlIGZvbGxvd2luZwotCSAqIHVzZXJzIGNhbiBlYWNoIGhvbGQgYXQg bW9zdCBvbmUgcmVmZXJlbmNlOiBwd3JpdGUvcHJlYWQsIGV4ZWNidWZmZXIKLQkgKiAob2JqZWN0 cyBhcmUgbm90IGFsbG93ZWQgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIGJhdGNoYnVmZmVy KSwKLQkgKiBhbmQgdGhlIGZyYW1lYnVmZmVyIGNvZGUuIFdoZW4gc3dpdGNoaW5nL3BhZ2VmbGlw cGluZywgdGhlCi0JICogZnJhbWVidWZmZXIgY29kZSBoYXMgYXQgbW9zdCB0d28gYnVmZmVycyBw aW5uZWQgcGVyIGNydGMuCi0JICoKLQkgKiBJbiB0aGUgd29yc3QgY2FzZSB0aGlzIGlzIDEgKyAx ICsgMSArIDIqMiA9IDcuIFRoYXQgd291bGQgZml0IGludG8gMwotCSAqIGJpdHMgd2l0aCBhYnNv bHV0ZWx5IG5vIGhlYWRyb29tLiBTbyB1c2UgNCBiaXRzLgotCSAqLwotI2RlZmluZSBJOTE1X1ZN QV9QSU5fTUFTSyAweGYKLSNkZWZpbmUgSTkxNV9WTUFfUElOX09WRVJGTE9XCUJJVCg1KQotCi0J LyoqIEZsYWdzIGFuZCBhZGRyZXNzIHNwYWNlIHRoaXMgVk1BIGlzIGJvdW5kIHRvICovCi0jZGVm aW5lIEk5MTVfVk1BX0dMT0JBTF9CSU5ECUJJVCg2KQotI2RlZmluZSBJOTE1X1ZNQV9MT0NBTF9C SU5ECUJJVCg3KQotI2RlZmluZSBJOTE1X1ZNQV9CSU5EX01BU0sgKEk5MTVfVk1BX0dMT0JBTF9C SU5EIHwgSTkxNV9WTUFfTE9DQUxfQklORCB8IEk5MTVfVk1BX1BJTl9PVkVSRkxPVykKLQotI2Rl ZmluZSBJOTE1X1ZNQV9HR1RUCQlCSVQoOCkKLSNkZWZpbmUgSTkxNV9WTUFfQ0FOX0ZFTkNFCUJJ VCg5KQotI2RlZmluZSBJOTE1X1ZNQV9DTE9TRUQJCUJJVCgxMCkKLQotCXVuc2lnbmVkIGludCBh Y3RpdmU7Ci0Jc3RydWN0IGk5MTVfZ2VtX2FjdGl2ZSBsYXN0X3JlYWRbSTkxNV9OVU1fRU5HSU5F U107Ci0Jc3RydWN0IGk5MTVfZ2VtX2FjdGl2ZSBsYXN0X3dyaXRlOwotCXN0cnVjdCBpOTE1X2dl bV9hY3RpdmUgbGFzdF9mZW5jZTsKLQotCS8qKgotCSAqIFN1cHBvcnQgZGlmZmVyZW50IEdHVFQg dmlld3MgaW50byB0aGUgc2FtZSBvYmplY3QuCi0JICogVGhpcyBtZWFucyB0aGVyZSBjYW4gYmUg bXVsdGlwbGUgVk1BIG1hcHBpbmdzIHBlciBvYmplY3QgYW5kIHBlciBWTS4KLQkgKiBpOTE1X2dn dHRfdmlld190eXBlIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aG9zZSBlbnRyaWVz LgotCSAqIFRoZSBkZWZhdWx0IG9uZSBvZiB6ZXJvIChJOTE1X0dHVFRfVklFV19OT1JNQUwpIGlz IGRlZmF1bHQgYW5kIGFsc28KLQkgKiBhc3N1bWVkIGluIEdFTSBmdW5jdGlvbnMgd2hpY2ggdGFr ZSBubyBnZ3R0IHZpZXcgcGFyYW1ldGVyLgotCSAqLwotCXN0cnVjdCBpOTE1X2dndHRfdmlldyBn Z3R0X3ZpZXc7Ci0KLQkvKiogVGhpcyBvYmplY3QncyBwbGFjZSBvbiB0aGUgYWN0aXZlL2luYWN0 aXZlIGxpc3RzICovCi0Jc3RydWN0IGxpc3RfaGVhZCB2bV9saW5rOwotCi0Jc3RydWN0IGxpc3Rf aGVhZCBvYmpfbGluazsgLyogTGluayBpbiB0aGUgb2JqZWN0J3MgVk1BIGxpc3QgKi8KLQlzdHJ1 Y3QgcmJfbm9kZSBvYmpfbm9kZTsKLQotCS8qKiBUaGlzIHZtYSdzIHBsYWNlIGluIHRoZSBiYXRj aGJ1ZmZlciBvciBvbiB0aGUgZXZpY3Rpb24gbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgZXhl Y19saXN0OwotCi0JLyoqCi0JICogVXNlZCBmb3IgcGVyZm9ybWluZyByZWxvY2F0aW9ucyBkdXJp bmcgZXhlY2J1ZmZlciBpbnNlcnRpb24uCi0JICovCi0Jc3RydWN0IGhsaXN0X25vZGUgZXhlY19u b2RlOwotCXVuc2lnbmVkIGxvbmcgZXhlY19oYW5kbGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9l eGVjX29iamVjdDIgKmV4ZWNfZW50cnk7Ci19OwotCi1zdHJ1Y3QgaTkxNV92bWEgKgotaTkxNV92 bWFfY3JlYXRlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCXN0cnVjdCBpOTE1 X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQljb25zdCBzdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgKnZpZXcp Owotdm9pZCBpOTE1X3ZtYV91bnBpbl9hbmRfcmVsZWFzZShzdHJ1Y3QgaTkxNV92bWEgKipwX3Zt YSk7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpOTE1X3ZtYV9pc19nZ3R0KGNvbnN0IHN0cnVjdCBp OTE1X3ZtYSAqdm1hKQotewotCXJldHVybiB2bWEtPmZsYWdzICYgSTkxNV9WTUFfR0dUVDsKLX0K LQotc3RhdGljIGlubGluZSBib29sIGk5MTVfdm1hX2lzX21hcF9hbmRfZmVuY2VhYmxlKGNvbnN0 IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCXJldHVybiB2bWEtPmZsYWdzICYgSTkxNV9WTUFf Q0FOX0ZFTkNFOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaTkxNV92bWFfaXNfY2xvc2VkKGNv bnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCXJldHVybiB2bWEtPmZsYWdzICYgSTkxNV9W TUFfQ0xPU0VEOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpOTE1X3ZtYV9nZXRf YWN0aXZlKGNvbnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCXJldHVybiB2bWEtPmFjdGl2 ZTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGk5MTVfdm1hX2lzX2FjdGl2ZShjb25zdCBzdHJ1 Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQlyZXR1cm4gaTkxNV92bWFfZ2V0X2FjdGl2ZSh2bWEpOwot fQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaTkxNV92bWFfc2V0X2FjdGl2ZShzdHJ1Y3QgaTkxNV92 bWEgKnZtYSwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IGVuZ2luZSkKLXsKLQl2bWEtPmFjdGl2 ZSB8PSBCSVQoZW5naW5lKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGk5MTVfdm1hX2NsZWFy X2FjdGl2ZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKLQkJCQkJIHVuc2lnbmVkIGludCBlbmdpbmUp Ci17Ci0Jdm1hLT5hY3RpdmUgJj0gfkJJVChlbmdpbmUpOwotfQotCi1zdGF0aWMgaW5saW5lIGJv b2wgaTkxNV92bWFfaGFzX2FjdGl2ZV9lbmdpbmUoY29uc3Qgc3RydWN0IGk5MTVfdm1hICp2bWEs Ci0JCQkJCSAgICAgIHVuc2lnbmVkIGludCBlbmdpbmUpCi17Ci0JcmV0dXJuIHZtYS0+YWN0aXZl ICYgQklUKGVuZ2luZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGk5MTVfZ2d0dF9vZmZzZXQo Y29uc3Qgc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JR0VNX0JVR19PTighaTkxNV92bWFfaXNf Z2d0dCh2bWEpKTsKLQlHRU1fQlVHX09OKCF2bWEtPm5vZGUuYWxsb2NhdGVkKTsKLQlHRU1fQlVH X09OKHVwcGVyXzMyX2JpdHModm1hLT5ub2RlLnN0YXJ0KSk7Ci0JR0VNX0JVR19PTih1cHBlcl8z Ml9iaXRzKHZtYS0+bm9kZS5zdGFydCArIHZtYS0+bm9kZS5zaXplIC0gMSkpOwotCXJldHVybiBs b3dlcl8zMl9iaXRzKHZtYS0+bm9kZS5zdGFydCk7Ci19CitzdHJ1Y3QgaTkxNV92bWE7CiAKIHN0 cnVjdCBpOTE1X3BhZ2VfZG1hIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKQEAgLTYwNiw2ICs0ODIs MTMgQEAgaTkxNV9wYWdlX2Rpcl9kbWFfYWRkcihjb25zdCBzdHJ1Y3QgaTkxNV9od19wcGd0dCAq cHBndHQsIGNvbnN0IHVuc2lnbmVkIG4pCiAJCXB4X2RtYShwcGd0dC0+YmFzZS5zY3JhdGNoX3Bk KTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgaTkxNV9nZ3R0ICoKK2k5MTVfdm1fdG9fZ2d0 dChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKK3sKKwlHRU1fQlVHX09OKCFpOTE1X2lz X2dndHQodm0pKTsKKwlyZXR1cm4gY29udGFpbmVyX29mKHZtLCBzdHJ1Y3QgaTkxNV9nZ3R0LCBi YXNlKTsKK30KKwogaW50IGk5MTVfZ2d0dF9wcm9iZV9odyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXYpOwogaW50IGk5MTVfZ2d0dF9pbml0X2h3KHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdik7CiBpbnQgaTkxNV9nZ3R0X2VuYWJsZV9odyhzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYpOwpAQCAtNjUzLDg4ICs1MzYsNCBAQCB2b2lkIGk5MTVfZ2VtX2d0 dF9maW5pc2hfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKICNkZWZpbmUg UElOX09GRlNFVF9GSVhFRAlCSVQoMTEpCiAjZGVmaW5lIFBJTl9PRkZTRVRfTUFTSwkJKH40MDk1 KQogCi1pbnQgX19pOTE1X3ZtYV9kb19waW4oc3RydWN0IGk5MTVfdm1hICp2bWEsCi0JCSAgICAg IHU2NCBzaXplLCB1NjQgYWxpZ25tZW50LCB1NjQgZmxhZ3MpOwotc3RhdGljIGlubGluZSBpbnQg X19tdXN0X2NoZWNrCi1pOTE1X3ZtYV9waW4oc3RydWN0IGk5MTVfdm1hICp2bWEsIHU2NCBzaXpl LCB1NjQgYWxpZ25tZW50LCB1NjQgZmxhZ3MpCi17Ci0JQlVJTERfQlVHX09OKFBJTl9NQlogIT0g STkxNV9WTUFfUElOX09WRVJGTE9XKTsKLQlCVUlMRF9CVUdfT04oUElOX0dMT0JBTCAhPSBJOTE1 X1ZNQV9HTE9CQUxfQklORCk7Ci0JQlVJTERfQlVHX09OKFBJTl9VU0VSICE9IEk5MTVfVk1BX0xP Q0FMX0JJTkQpOwotCi0JLyogUGluIGVhcmx5IHRvIHByZXZlbnQgdGhlIHNocmlua2VyL2V2aWN0 aW9uIGxvZ2ljIGZyb20gZGVzdHJveWluZwotCSAqIG91ciB2bWEgYXMgd2UgaW5zZXJ0IGFuZCBi aW5kLgotCSAqLwotCWlmIChsaWtlbHkoKCgrK3ZtYS0+ZmxhZ3MgXiBmbGFncykgJiBJOTE1X1ZN QV9CSU5EX01BU0spID09IDApKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBfX2k5MTVfdm1hX2Rv X3Bpbih2bWEsIHNpemUsIGFsaWdubWVudCwgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIGlu dCBpOTE1X3ZtYV9waW5fY291bnQoY29uc3Qgc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JcmV0 dXJuIHZtYS0+ZmxhZ3MgJiBJOTE1X1ZNQV9QSU5fTUFTSzsKLX0KLQotc3RhdGljIGlubGluZSBi b29sIGk5MTVfdm1hX2lzX3Bpbm5lZChjb25zdCBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQly ZXR1cm4gaTkxNV92bWFfcGluX2NvdW50KHZtYSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBf X2k5MTVfdm1hX3BpbihzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQl2bWEtPmZsYWdzKys7Ci0J R0VNX0JVR19PTih2bWEtPmZsYWdzICYgSTkxNV9WTUFfUElOX09WRVJGTE9XKTsKLX0KLQotc3Rh dGljIGlubGluZSB2b2lkIF9faTkxNV92bWFfdW5waW4oc3RydWN0IGk5MTVfdm1hICp2bWEpCi17 Ci0JR0VNX0JVR19PTighaTkxNV92bWFfaXNfcGlubmVkKHZtYSkpOwotCXZtYS0+ZmxhZ3MtLTsK LX0KLQotc3RhdGljIGlubGluZSB2b2lkIGk5MTVfdm1hX3VucGluKHN0cnVjdCBpOTE1X3ZtYSAq dm1hKQotewotCUdFTV9CVUdfT04oIWRybV9tbV9ub2RlX2FsbG9jYXRlZCgmdm1hLT5ub2RlKSk7 Ci0JX19pOTE1X3ZtYV91bnBpbih2bWEpOwotfQotCi0vKioKLSAqIGk5MTVfdm1hX3Bpbl9pb21h cCAtIGNhbGxzIGlvcmVtYXBfd2MgdG8gbWFwIHRoZSBHR1RUIFZNQSB2aWEgdGhlIGFwZXJ0dXJl Ci0gKiBAdm1hOiBWTUEgdG8gaW9tYXAKLSAqCi0gKiBUaGUgcGFzc2VkIGluIFZNQSBoYXMgdG8g YmUgcGlubmVkIGluIHRoZSBnbG9iYWwgR1RUIG1hcHBhYmxlIHJlZ2lvbi4KLSAqIEFuIGV4dHJh IHBpbm5pbmcgb2YgdGhlIFZNQSBpcyBhY3F1aXJlZCBmb3IgdGhlIHJldHVybiBpb21hcHBpbmcs Ci0gKiB0aGUgY2FsbGVyIG11c3QgY2FsbCBpOTE1X3ZtYV91bnBpbl9pb21hcCB0byByZWxpbnF1 aXNoIHRoZSBwaW5uaW5nCi0gKiBhZnRlciB0aGUgaW9tYXBwaW5nIGlzIG5vIGxvbmdlciByZXF1 aXJlZC4KLSAqCi0gKiBDYWxsZXJzIG11c3QgaG9sZCB0aGUgc3RydWN0X211dGV4LgotICoKLSAq IFJldHVybnMgYSB2YWxpZCBpb21hcHBlZCBwb2ludGVyIG9yIEVSUl9QVFIuCi0gKi8KLXZvaWQg X19pb21lbSAqaTkxNV92bWFfcGluX2lvbWFwKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsKLSNkZWZp bmUgSU9fRVJSX1BUUih4KSAoKHZvaWQgX19pb21lbSAqKUVSUl9QVFIoeCkpCi0KLS8qKgotICog aTkxNV92bWFfdW5waW5faW9tYXAgLSB1bnBpbnMgdGhlIG1hcHBpbmcgcmV0dXJuZWQgZnJvbSBp OTE1X3ZtYV9pb21hcAotICogQHZtYTogVk1BIHRvIHVucGluCi0gKgotICogVW5waW5zIHRoZSBw cmV2aW91c2x5IGlvbWFwcGVkIFZNQSBmcm9tIGk5MTVfdm1hX3Bpbl9pb21hcCgpLgotICoKLSAq IENhbGxlcnMgbXVzdCBob2xkIHRoZSBzdHJ1Y3RfbXV0ZXguIFRoaXMgZnVuY3Rpb24gaXMgb25s eSB2YWxpZCB0byBiZQotICogY2FsbGVkIG9uIGEgVk1BIHByZXZpb3VzbHkgaW9tYXBwZWQgYnkg dGhlIGNhbGxlciB3aXRoIGk5MTVfdm1hX3Bpbl9pb21hcCgpLgotICovCi1zdGF0aWMgaW5saW5l IHZvaWQgaTkxNV92bWFfdW5waW5faW9tYXAoc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JbG9j a2RlcF9hc3NlcnRfaGVsZCgmdm1hLT52bS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCUdFTV9CVUdf T04odm1hLT5pb21hcCA9PSBOVUxMKTsKLQlpOTE1X3ZtYV91bnBpbih2bWEpOwotfQotCi1zdGF0 aWMgaW5saW5lIHN0cnVjdCBwYWdlICppOTE1X3ZtYV9maXJzdF9wYWdlKHN0cnVjdCBpOTE1X3Zt YSAqdm1hKQotewotCUdFTV9CVUdfT04oIXZtYS0+cGFnZXMpOwotCXJldHVybiBzZ19wYWdlKHZt YS0+cGFnZXMtPnNnbCk7Ci19Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9nZW1fb2JqZWN0LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9v YmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODI2YzI1Ci0tLSAv ZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fb2JqZWN0LmgKQEAg LTAsMCArMSwzMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNiBJbnRlbCBDb3Jwb3JhdGlv bgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0 byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFz c29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVh bCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQg bGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1 Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2Yg dGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3 YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRp dGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlz c2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBp bmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICog U29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhP VVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElO RyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAor ICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4g IElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBC RSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBX SEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJ TkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9S IFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8K KworI2lmbmRlZiBfX0k5MTVfR0VNX09CSkVDVF9IX18KKyNkZWZpbmUgX19JOTE1X0dFTV9PQkpF Q1RfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9yZXNlcnZhdGlvbi5oPgorCisjaW5jbHVkZSA8ZHJt L2RybV92bWFfbWFuYWdlci5oPgorI2luY2x1ZGUgPGRybS9kcm1fZ2VtLmg+CisjaW5jbHVkZSA8 ZHJtL2RybVAuaD4KKworI2luY2x1ZGUgPGRybS9pOTE1X2RybS5oPgorCitzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdF9vcHMgeworCXVuc2lnbmVkIGludCBmbGFnczsKKyNkZWZpbmUgSTkxNV9H RU1fT0JKRUNUX0hBU19TVFJVQ1RfUEFHRSAweDEKKyNkZWZpbmUgSTkxNV9HRU1fT0JKRUNUX0lT X1NIUklOS0FCTEUgICAweDIKKworCS8qIEludGVyZmFjZSBiZXR3ZWVuIHRoZSBHRU0gb2JqZWN0 IGFuZCBpdHMgYmFja2luZyBzdG9yYWdlLgorCSAqIGdldF9wYWdlcygpIGlzIGNhbGxlZCBvbmNl IHByaW9yIHRvIHRoZSB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgc2V0CisJICogb2YgcGFnZXMgYmVm b3JlIHRvIGJpbmRpbmcgdGhlbSBpbnRvIHRoZSBHVFQsIGFuZCBwdXRfcGFnZXMoKSBpcworCSAq IGNhbGxlZCBhZnRlciB3ZSBubyBsb25nZXIgbmVlZCB0aGVtLiBBcyB3ZSBleHBlY3QgdGhlcmUg dG8gYmUKKwkgKiBhc3NvY2lhdGVkIGNvc3Qgd2l0aCBtaWdyYXRpbmcgcGFnZXMgYmV0d2VlbiB0 aGUgYmFja2luZyBzdG9yYWdlCisJICogYW5kIG1ha2luZyB0aGVtIGF2YWlsYWJsZSBmb3IgdGhl IEdQVSAoZS5nLiBjbGZsdXNoKSwgd2UgbWF5IGhvbGQKKwkgKiBvbnRvIHRoZSBwYWdlcyBhZnRl ciB0aGV5IGFyZSBubyBsb25nZXIgcmVmZXJlbmNlZCBieSB0aGUgR1BVCisJICogaW4gY2FzZSB0 aGV5IG1heSBiZSB1c2VkIGFnYWluIHNob3J0bHkgKGZvciBleGFtcGxlIG1pZ3JhdGluZyB0aGUK KwkgKiBwYWdlcyB0byBhIGRpZmZlcmVudCBtZW1vcnkgZG9tYWluIHdpdGhpbiB0aGUgR1RUKS4g cHV0X3BhZ2VzKCkKKwkgKiB3aWxsIHRoZXJlZm9yZSBtb3N0IGxpa2VseSBiZSBjYWxsZWQgd2hl biB0aGUgb2JqZWN0IGl0c2VsZiBpcworCSAqIGJlaW5nIHJlbGVhc2VkIG9yIHVuZGVyIG1lbW9y eSBwcmVzc3VyZSAod2hlcmUgd2UgYXR0ZW1wdCB0bworCSAqIHJlYXAgcGFnZXMgZm9yIHRoZSBz aHJpbmtlcikuCisJICovCisJc3RydWN0IHNnX3RhYmxlICooKmdldF9wYWdlcykoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKik7CisJdm9pZCAoKnB1dF9wYWdlcykoc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKiwgc3RydWN0IHNnX3RhYmxlICopOworCisJaW50ICgqZG1hYnVmX2V4cG9y dCkoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKik7CisJdm9pZCAoKnJlbGVhc2UpKHN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICopOworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgeworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCBiYXNlOworCisJY29uc3Qgc3RydWN0IGRybV9p OTE1X2dlbV9vYmplY3Rfb3BzICpvcHM7CisKKwkvKiogTGlzdCBvZiBWTUFzIGJhY2tlZCBieSB0 aGlzIG9iamVjdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgdm1hX2xpc3Q7CisJc3RydWN0IHJiX3Jv b3Qgdm1hX3RyZWU7CisKKwkvKiogU3RvbGVuIG1lbW9yeSBmb3IgdGhpcyBvYmplY3QsIGluc3Rl YWQgb2YgYmVpbmcgYmFja2VkIGJ5IHNobWVtLiAqLworCXN0cnVjdCBkcm1fbW1fbm9kZSAqc3Rv bGVuOworCXN0cnVjdCBsaXN0X2hlYWQgZ2xvYmFsX2xpc3Q7CisJdW5pb24geworCQlzdHJ1Y3Qg cmN1X2hlYWQgcmN1OworCQlzdHJ1Y3QgbGxpc3Rfbm9kZSBmcmVlZDsKKwl9OworCisJLyoqCisJ ICogV2hldGhlciB0aGUgb2JqZWN0IGlzIGN1cnJlbnRseSBpbiB0aGUgR0dUVCBtbWFwLgorCSAq LworCXN0cnVjdCBsaXN0X2hlYWQgdXNlcmZhdWx0X2xpbms7CisKKwkvKiogVXNlZCBpbiBleGVj YnVmIHRvIHRlbXBvcmFyaWx5IGhvbGQgYSByZWYgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG9ial9l eGVjX2xpbms7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJhdGNoX3Bvb2xfbGluazsKKworCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CisKKwkvKioKKwkgKiBIYXZlIHdlIHRha2VuIGEgcmVmZXJlbmNlIGZv ciB0aGUgb2JqZWN0IGZvciBpbmNvbXBsZXRlIEdQVQorCSAqIGFjdGl2aXR5PworCSAqLworI2Rl ZmluZSBJOTE1X0JPX0FDVElWRV9SRUYgMAorCisJLyoKKwkgKiBJcyB0aGUgb2JqZWN0IHRvIGJl IG1hcHBlZCBhcyByZWFkLW9ubHkgdG8gdGhlIEdQVQorCSAqIE9ubHkgaG9ub3VyZWQgaWYgaGFy ZHdhcmUgaGFzIHJlbGV2YW50IHB0ZSBiaXQKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGd0X3JvOjE7 CisJdW5zaWduZWQgaW50IGNhY2hlX2xldmVsOjM7CisJdW5zaWduZWQgaW50IGNhY2hlX2RpcnR5 OjE7CisKKwlhdG9taWNfdCBmcm9udGJ1ZmZlcl9iaXRzOworCXVuc2lnbmVkIGludCBmcm9udGJ1 ZmZlcl9nZ3R0X29yaWdpbjsgLyogd3JpdGUgb25jZSAqLworCisJLyoqIEN1cnJlbnQgdGlsaW5n IHN0cmlkZSBmb3IgdGhlIG9iamVjdCwgaWYgaXQncyB0aWxlZC4gKi8KKwl1bnNpZ25lZCBpbnQg dGlsaW5nX2FuZF9zdHJpZGU7CisjZGVmaW5lIEZFTkNFX01JTklNVU1fU1RSSURFIDEyOCAvKiBT ZWUgaTkxNV90aWxpbmdfb2soKSAqLworI2RlZmluZSBUSUxJTkdfTUFTSyAoRkVOQ0VfTUlOSU1V TV9TVFJJREUtMSkKKyNkZWZpbmUgU1RSSURFX01BU0sgKH5USUxJTkdfTUFTSykKKworCS8qKiBD b3VudCBvZiBWTUEgYWN0dWFsbHkgYm91bmQgYnkgdGhpcyBvYmplY3QgKi8KKwl1bnNpZ25lZCBp bnQgYmluZF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgYWN0aXZlX2NvdW50OworCXVuc2lnbmVkIGlu dCBwaW5fZGlzcGxheTsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBtdXRleCBsb2NrOyAvKiBwcm90 ZWN0cyB0aGUgcGFnZXMgYW5kIHRoZWlyIHVzZSAqLworCQlhdG9taWNfdCBwYWdlc19waW5fY291 bnQ7CisKKwkJc3RydWN0IHNnX3RhYmxlICpwYWdlczsKKwkJdm9pZCAqbWFwcGluZzsKKworCQlz dHJ1Y3QgaTkxNV9nZW1fb2JqZWN0X3BhZ2VfaXRlciB7CisJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3Qg KnNnX3BvczsKKwkJCXVuc2lnbmVkIGludCBzZ19pZHg7IC8qIGluIHBhZ2VzLCBidXQgMzJiaXQg ZWVrISAqLworCisJCQlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290IHJhZGl4OworCQkJc3RydWN0IG11 dGV4IGxvY2s7IC8qIHByb3RlY3RzIHRoaXMgY2FjaGUgKi8KKwkJfSBnZXRfcGFnZTsKKworCQkv KioKKwkJICogQWR2aWNlOiBhcmUgdGhlIGJhY2tpbmcgcGFnZXMgcHVyZ2VhYmxlPworCQkgKi8K KwkJdW5zaWduZWQgaW50IG1hZHY6MjsKKworCQkvKioKKwkJICogVGhpcyBpcyBzZXQgaWYgdGhl IG9iamVjdCBoYXMgYmVlbiB3cml0dGVuIHRvIHNpbmNlIHRoZQorCQkgKiBwYWdlcyB3ZXJlIGxh c3QgYWNxdWlyZWQuCisJCSAqLworCQlib29sIGRpcnR5OjE7CisKKwkJLyoqCisJCSAqIFRoaXMg aXMgc2V0IGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gcGlubmVkIGR1ZSB0byB1bmtub3duCisJCSAq IHN3aXp6bGluZy4KKwkJICovCisJCWJvb2wgcXVpcmtlZDoxOworCX0gbW07CisKKwkvKiogQnJl YWRjcnVtYiBvZiBsYXN0IHJlbmRlcmluZyB0byB0aGUgYnVmZmVyLgorCSAqIFRoZXJlIGNhbiBv bmx5IGJlIG9uZSB3cml0ZXIsIGJ1dCB3ZSBhbGxvdyBmb3IgbXVsdGlwbGUgcmVhZGVycy4KKwkg KiBJZiB0aGVyZSBpcyBhIHdyaXRlciB0aGF0IG5lY2Vzc2FyaWx5IGltcGxpZXMgdGhhdCBhbGwg b3RoZXIKKwkgKiByZWFkIHJlcXVlc3RzIGFyZSBjb21wbGV0ZSAtIGJ1dCB3ZSBtYXkgb25seSBi ZSBsYXppbHkgY2xlYXJpbmcKKwkgKiB0aGUgcmVhZCByZXF1ZXN0cy4gQSByZWFkIHJlcXVlc3Qg aXMgbmF0dXJhbGx5IHRoZSBtb3N0IHJlY2VudAorCSAqIHJlcXVlc3Qgb24gYSByaW5nLCBzbyB3 ZSBtYXkgaGF2ZSB0d28gZGlmZmVyZW50IHdyaXRlIGFuZCByZWFkCisJICogcmVxdWVzdHMgb24g b25lIHJpbmcgd2hlcmUgdGhlIHdyaXRlIHJlcXVlc3QgaXMgb2xkZXIgdGhhbiB0aGUKKwkgKiBy ZWFkIHJlcXVlc3QuIFRoaXMgYWxsb3dzIGZvciB0aGUgQ1BVIHRvIHJlYWQgZnJvbSBhbiBhY3Rp dmUKKwkgKiBidWZmZXIgYnkgb25seSB3YWl0aW5nIGZvciB0aGUgd3JpdGUgdG8gY29tcGxldGUu CisJICovCisJc3RydWN0IHJlc2VydmF0aW9uX29iamVjdCAqcmVzdjsKKworCS8qKiBSZWZlcmVu Y2VzIGZyb20gZnJhbWVidWZmZXJzLCBsb2NrcyBvdXQgdGlsaW5nIGNoYW5nZXMuICovCisJdW5z aWduZWQgbG9uZyBmcmFtZWJ1ZmZlcl9yZWZlcmVuY2VzOworCisJLyoqIFJlY29yZCBvZiBhZGRy ZXNzIGJpdCAxNyBvZiBlYWNoIHBhZ2UgYXQgbGFzdCB1bmJpbmQuICovCisJdW5zaWduZWQgbG9u ZyAqYml0XzE3OworCisJc3RydWN0IGk5MTVfZ2VtX3VzZXJwdHIgeworCQl1aW50cHRyX3QgcHRy OworCQl1bnNpZ25lZCByZWFkX29ubHkgOjE7CisKKwkJc3RydWN0IGk5MTVfbW1fc3RydWN0ICpt bTsKKwkJc3RydWN0IGk5MTVfbW11X29iamVjdCAqbW11X29iamVjdDsKKwkJc3RydWN0IHdvcmtf c3RydWN0ICp3b3JrOworCX0gdXNlcnB0cjsKKworCS8qKiBmb3IgcGh5cyBhbGxvY2F0ZWQgb2Jq ZWN0cyAqLworCXN0cnVjdCBkcm1fZG1hX2hhbmRsZSAqcGh5c19oYW5kbGU7CisKKwlzdHJ1Y3Qg cmVzZXJ2YXRpb25fb2JqZWN0IF9fYnVpbHRpbl9yZXN2OworfTsKKworc3RhdGljIGlubGluZSBz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCit0b19pbnRlbF9ibyhzdHJ1Y3QgZHJtX2dlbV9v YmplY3QgKmdlbSkKK3sKKwkvKiBBc3NlcnQgdGhhdCB0b19pbnRlbF9ibyhOVUxMKSA9PSBOVUxM ICovCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LCBi YXNlKSk7CisKKwlyZXR1cm4gY29udGFpbmVyX29mKGdlbSwgc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QsIGJhc2UpOworfQorCisvKioKKyAqIGk5MTVfZ2VtX29iamVjdF9sb29rdXBfcmN1IC0g bG9vayB1cCBhIHRlbXBvcmFyeSBHRU0gb2JqZWN0IGZyb20gaXRzIGhhbmRsZQorICogQGZpbHA6 IERSTSBmaWxlIHByaXZhdGUgZGF0ZQorICogQGhhbmRsZTogdXNlcnNwYWNlIGhhbmRsZQorICoK KyAqIFJldHVybnM6CisgKgorICogQSBwb2ludGVyIHRvIHRoZSBvYmplY3QgbmFtZWQgYnkgdGhl IGhhbmRsZSBpZiBzdWNoIGV4aXN0cyBvbiBAZmlscCwgTlVMTAorICogb3RoZXJ3aXNlLiBUaGlz IG9iamVjdCBpcyBvbmx5IHZhbGlkIHdoaWxzdCB1bmRlciB0aGUgUkNVIHJlYWQgbG9jaywgYW5k CisgKiBub3RlIGNhcmVmdWxseSB0aGUgb2JqZWN0IG1heSBiZSBpbiB0aGUgcHJvY2VzcyBvZiBi ZWluZyBkZXN0cm95ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKgoraTkxNV9nZW1fb2JqZWN0X2xvb2t1cF9yY3Uoc3RydWN0IGRybV9maWxlICpmaWxl LCB1MzIgaGFuZGxlKQoreworI2lmZGVmIENPTkZJR19MT0NLREVQCisJV0FSTl9PTihkZWJ1Z19s b2NrcyAmJiAhbG9ja19pc19oZWxkKCZyY3VfbG9ja19tYXApKTsKKyNlbmRpZgorCXJldHVybiBp ZHJfZmluZCgmZmlsZS0+b2JqZWN0X2lkciwgaGFuZGxlKTsKK30KKworc3RhdGljIGlubGluZSBz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCitpOTE1X2dlbV9vYmplY3RfbG9va3VwKHN0cnVj dCBkcm1fZmlsZSAqZmlsZSwgdTMyIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqOworCisJcmN1X3JlYWRfbG9jaygpOworCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9s b29rdXBfcmN1KGZpbGUsIGhhbmRsZSk7CisJaWYgKG9iaiAmJiAha3JlZl9nZXRfdW5sZXNzX3pl cm8oJm9iai0+YmFzZS5yZWZjb3VudCkpCisJCW9iaiA9IE5VTEw7CisJcmN1X3JlYWRfdW5sb2Nr KCk7CisKKwlyZXR1cm4gb2JqOworfQorCitfX2RlcHJlY2F0ZWQKK2V4dGVybiBzdHJ1Y3QgZHJt X2dlbV9vYmplY3QgKgorZHJtX2dlbV9vYmplY3RfbG9va3VwKHN0cnVjdCBkcm1fZmlsZSAqZmls ZSwgdTMyIGhhbmRsZSk7CisKK19fYXR0cmlidXRlX18oKG5vbm51bGwpKQorc3RhdGljIGlubGlu ZSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCitpOTE1X2dlbV9vYmplY3RfZ2V0KHN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNl KCZvYmotPmJhc2UpOworCXJldHVybiBvYmo7Cit9CisKK19fZGVwcmVjYXRlZAorZXh0ZXJuIHZv aWQgZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKTsKKwor X19hdHRyaWJ1dGVfXygobm9ubnVsbCkpCitzdGF0aWMgaW5saW5lIHZvaWQKK2k5MTVfZ2VtX29i amVjdF9wdXQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlfX2RybV9nZW1f b2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOworfQorCitfX2RlcHJlY2F0ZWQKK2V4dGVy biB2b2lkIGRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAq KTsKKworX19kZXByZWNhdGVkCitleHRlcm4gdm9pZCBkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5j ZV91bmxvY2tlZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKik7CisKK3N0YXRpYyBpbmxpbmUgYm9v bAoraTkxNV9nZW1fb2JqZWN0X2lzX2RlYWQoY29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iaikKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJm9iai0+YmFzZS5yZWZjb3VudC5yZWZj b3VudCkgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBib29sCitpOTE1X2dlbV9vYmplY3RfaGFz X3N0cnVjdF9wYWdlKGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJ cmV0dXJuIG9iai0+b3BzLT5mbGFncyAmIEk5MTVfR0VNX09CSkVDVF9IQVNfU1RSVUNUX1BBR0U7 Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraTkxNV9nZW1fb2JqZWN0X2lzX3Nocmlua2FibGUo Y29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlyZXR1cm4gb2JqLT5v cHMtPmZsYWdzICYgSTkxNV9HRU1fT0JKRUNUX0lTX1NIUklOS0FCTEU7Cit9CisKK3N0YXRpYyBp bmxpbmUgYm9vbAoraTkxNV9nZW1fb2JqZWN0X2lzX2FjdGl2ZShjb25zdCBzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXJldHVybiBvYmotPmFjdGl2ZV9jb3VudDsKK30KKwor c3RhdGljIGlubGluZSBib29sCitpOTE1X2dlbV9vYmplY3RfaGFzX2FjdGl2ZV9yZWZlcmVuY2Uo Y29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlyZXR1cm4gdGVzdF9i aXQoSTkxNV9CT19BQ1RJVkVfUkVGLCAmb2JqLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUg dm9pZAoraTkxNV9nZW1fb2JqZWN0X3NldF9hY3RpdmVfcmVmZXJlbmNlKHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmopCit7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmb2JqLT5iYXNlLmRl di0+c3RydWN0X211dGV4KTsKKwlfX3NldF9iaXQoSTkxNV9CT19BQ1RJVkVfUkVGLCAmb2JqLT5m bGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraTkxNV9nZW1fb2JqZWN0X2NsZWFyX2Fj dGl2ZV9yZWZlcmVuY2Uoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlsb2Nr ZGVwX2Fzc2VydF9oZWxkKCZvYmotPmJhc2UuZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCV9fY2xlYXJf Yml0KEk5MTVfQk9fQUNUSVZFX1JFRiwgJm9iai0+ZmxhZ3MpOworfQorCit2b2lkIF9faTkxNV9n ZW1fb2JqZWN0X3JlbGVhc2VfdW5sZXNzX2FjdGl2ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqb2JqKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2k5MTVfZ2VtX29iamVjdF9n ZXRfdGlsaW5nKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJcmV0dXJuIG9i ai0+dGlsaW5nX2FuZF9zdHJpZGUgJiBUSUxJTkdfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBi b29sCitpOTE1X2dlbV9vYmplY3RfaXNfdGlsZWQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iaikKK3sKKwlyZXR1cm4gaTkxNV9nZW1fb2JqZWN0X2dldF90aWxpbmcob2JqKSAhPSBJOTE1 X1RJTElOR19OT05FOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAoraTkxNV9nZW1f b2JqZWN0X2dldF9zdHJpZGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwly ZXR1cm4gb2JqLT50aWxpbmdfYW5kX3N0cmlkZSAmIFNUUklERV9NQVNLOworfQorCitzdGF0aWMg aW5saW5lIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKgoraTkxNV9nZW1fb2JqZWN0X2xhc3Rfd3Jp dGVfZW5naW5lKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGlu dGVsX2VuZ2luZV9jcyAqZW5naW5lID0gTlVMTDsKKwlzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZTsK KworCXJjdV9yZWFkX2xvY2soKTsKKwlmZW5jZSA9IHJlc2VydmF0aW9uX29iamVjdF9nZXRfZXhj bF9yY3Uob2JqLT5yZXN2KTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmIChmZW5jZSAmJiBk bWFfZmVuY2VfaXNfaTkxNShmZW5jZSkgJiYgIWRtYV9mZW5jZV9pc19zaWduYWxlZChmZW5jZSkp CisJCWVuZ2luZSA9IHRvX3JlcXVlc3QoZmVuY2UpLT5lbmdpbmU7CisJZG1hX2ZlbmNlX3B1dChm ZW5jZSk7CisKKwlyZXR1cm4gZW5naW5lOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fcmVxdWVzdC5oIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV9nZW1fcmVxdWVzdC5oCmluZGV4IDc1ZjgzNjAuLmIwYjU5YjMgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3JlcXVlc3QuaAorKysgYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pOTE1X2dlbV9yZXF1ZXN0LmgKQEAgLTMwLDYgKzMwLDkgQEAKICNpbmNsdWRl ICJpOTE1X2dlbS5oIgogI2luY2x1ZGUgImk5MTVfc3dfZmVuY2UuaCIKIAorc3RydWN0IGRybV9m aWxlOworc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Q7CisKIHN0cnVjdCBpbnRlbF93YWl0IHsK IAlzdHJ1Y3QgcmJfbm9kZSBub2RlOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwpkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92bWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2k5MTVfdm1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViODRk ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdm1hLmMKQEAg LTAsMCArMSw2NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNiBJbnRlbCBDb3Jwb3JhdGlv bgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0 byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFz c29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVh bCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQg bGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1 Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2Yg dGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3 YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRp dGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlz c2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBp bmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICog U29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhP VVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElO RyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAor ICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4g IElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBC RSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBX SEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJ TkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9S IFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8K KyAKKyNpbmNsdWRlICJpOTE1X3ZtYS5oIgorCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKyNpbmNs dWRlICJpbnRlbF9yaW5nYnVmZmVyLmgiCisjaW5jbHVkZSAiaW50ZWxfZnJvbnRidWZmZXIuaCIK KworI2luY2x1ZGUgPGRybS9kcm1fZ2VtLmg+CisKK3N0YXRpYyB2b2lkCitpOTE1X3ZtYV9yZXRp cmUoc3RydWN0IGk5MTVfZ2VtX2FjdGl2ZSAqYWN0aXZlLAorCQlzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X3JlcXVlc3QgKnJxKQoreworCWNvbnN0IHVuc2lnbmVkIGludCBpZHggPSBycS0+ZW5naW5lLT5p ZDsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYSA9CisJCWNvbnRhaW5lcl9vZihhY3RpdmUsIHN0cnVj dCBpOTE1X3ZtYSwgbGFzdF9yZWFkW2lkeF0pOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmogPSB2bWEtPm9iajsKKworCUdFTV9CVUdfT04oIWk5MTVfdm1hX2hhc19hY3RpdmVfZW5n aW5lKHZtYSwgaWR4KSk7CisKKwlpOTE1X3ZtYV9jbGVhcl9hY3RpdmUodm1hLCBpZHgpOworCWlm IChpOTE1X3ZtYV9pc19hY3RpdmUodm1hKSkKKwkJcmV0dXJuOworCisJbGlzdF9tb3ZlX3RhaWwo JnZtYS0+dm1fbGluaywgJnZtYS0+dm0tPmluYWN0aXZlX2xpc3QpOworCWlmICh1bmxpa2VseShp OTE1X3ZtYV9pc19jbG9zZWQodm1hKSAmJiAhaTkxNV92bWFfaXNfcGlubmVkKHZtYSkpKQorCQlX QVJOX09OKGk5MTVfdm1hX3VuYmluZCh2bWEpKTsKKworCUdFTV9CVUdfT04oIWk5MTVfZ2VtX29i amVjdF9pc19hY3RpdmUob2JqKSk7CisJaWYgKC0tb2JqLT5hY3RpdmVfY291bnQpCisJCXJldHVy bjsKKworCS8qIEJ1bXAgb3VyIHBsYWNlIG9uIHRoZSBib3VuZCBsaXN0IHRvIGtlZXAgaXQgcm91 Z2hseSBpbiBMUlUgb3JkZXIKKwkgKiBzbyB0aGF0IHdlIGRvbid0IHN0ZWFsIGZyb20gcmVjZW50 bHkgdXNlZCBidXQgaW5hY3RpdmUgb2JqZWN0cworCSAqICh1bmxlc3Mgd2UgYXJlIGZvcmNlZCB0 byBvZmMhKQorCSAqLworCWlmIChvYmotPmJpbmRfY291bnQpCisJCWxpc3RfbW92ZV90YWlsKCZv YmotPmdsb2JhbF9saXN0LCAmcnEtPmk5MTUtPm1tLmJvdW5kX2xpc3QpOworCisJb2JqLT5tbS5k aXJ0eSA9IHRydWU7IC8qIGJlIHBhcmFub2lkICAqLworCisJaWYgKGk5MTVfZ2VtX29iamVjdF9o YXNfYWN0aXZlX3JlZmVyZW5jZShvYmopKSB7CisJCWk5MTVfZ2VtX29iamVjdF9jbGVhcl9hY3Rp dmVfcmVmZXJlbmNlKG9iaik7CisJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwl9Cit9CisK K3N0YXRpYyB2b2lkCitpOTE1X2dndHRfcmV0aXJlX193cml0ZShzdHJ1Y3QgaTkxNV9nZW1fYWN0 aXZlICphY3RpdmUsCisJCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3QpCit7 CisJc3RydWN0IGk5MTVfdm1hICp2bWEgPQorCQljb250YWluZXJfb2YoYWN0aXZlLCBzdHJ1Y3Qg aTkxNV92bWEsIGxhc3Rfd3JpdGUpOworCisJaW50ZWxfZmJfb2JqX2ZsdXNoKHZtYS0+b2JqLCB0 cnVlLCBPUklHSU5fQ1MpOworfQorCitzdGF0aWMgc3RydWN0IGk5MTVfdm1hICoKK19faTkxNV92 bWFfY3JlYXRlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCSAgc3RydWN0IGk5 MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJCSAgY29uc3Qgc3RydWN0IGk5MTVfZ2d0dF92aWV3ICp2 aWV3KQoreworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCXN0cnVjdCByYl9ub2RlICpyYiwgKipw OworCWludCBpOworCisJR0VNX0JVR19PTih2bS0+Y2xvc2VkKTsKKworCXZtYSA9IGttZW1fY2Fj aGVfemFsbG9jKHRvX2k5MTUob2JqLT5iYXNlLmRldiktPnZtYXMsIEdGUF9LRVJORUwpOworCWlm ICh2bWEgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlJTklUX0xJU1Rf SEVBRCgmdm1hLT5leGVjX2xpc3QpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZtYS0+ bGFzdF9yZWFkKTsgaSsrKQorCQlpbml0X3JlcXVlc3RfYWN0aXZlKCZ2bWEtPmxhc3RfcmVhZFtp XSwgaTkxNV92bWFfcmV0aXJlKTsKKwlpbml0X3JlcXVlc3RfYWN0aXZlKCZ2bWEtPmxhc3Rfd3Jp dGUsCisJCQkgICAgaTkxNV9pc19nZ3R0KHZtKSA/IGk5MTVfZ2d0dF9yZXRpcmVfX3dyaXRlIDog TlVMTCk7CisJaW5pdF9yZXF1ZXN0X2FjdGl2ZSgmdm1hLT5sYXN0X2ZlbmNlLCBOVUxMKTsKKwls aXN0X2FkZCgmdm1hLT52bV9saW5rLCAmdm0tPnVuYm91bmRfbGlzdCk7CisJdm1hLT52bSA9IHZt OworCXZtYS0+b2JqID0gb2JqOworCXZtYS0+c2l6ZSA9IG9iai0+YmFzZS5zaXplOworCisJaWYg KHZpZXcpIHsKKwkJdm1hLT5nZ3R0X3ZpZXcgPSAqdmlldzsKKwkJaWYgKHZpZXctPnR5cGUgPT0g STkxNV9HR1RUX1ZJRVdfUEFSVElBTCkgeworCQkJdm1hLT5zaXplID0gdmlldy0+cGFyYW1zLnBh cnRpYWwuc2l6ZTsKKwkJCXZtYS0+c2l6ZSA8PD0gUEFHRV9TSElGVDsKKwkJfSBlbHNlIGlmICh2 aWV3LT50eXBlID09IEk5MTVfR0dUVF9WSUVXX1JPVEFURUQpIHsKKwkJCXZtYS0+c2l6ZSA9CisJ CQkJaW50ZWxfcm90YXRpb25faW5mb19zaXplKCZ2aWV3LT5wYXJhbXMucm90YXRlZCk7CisJCQl2 bWEtPnNpemUgPDw9IFBBR0VfU0hJRlQ7CisJCX0KKwl9CisKKwlpZiAoaTkxNV9pc19nZ3R0KHZt KSkgeworCQl2bWEtPmZsYWdzIHw9IEk5MTVfVk1BX0dHVFQ7CisJCWxpc3RfYWRkKCZ2bWEtPm9i al9saW5rLCAmb2JqLT52bWFfbGlzdCk7CisJfSBlbHNlIHsKKwkJaTkxNV9wcGd0dF9nZXQoaTkx NV92bV90b19wcGd0dCh2bSkpOworCQlsaXN0X2FkZF90YWlsKCZ2bWEtPm9ial9saW5rLCAmb2Jq LT52bWFfbGlzdCk7CisJfQorCisJcmIgPSBOVUxMOworCXAgPSAmb2JqLT52bWFfdHJlZS5yYl9u b2RlOworCXdoaWxlICgqcCkgeworCQlzdHJ1Y3QgaTkxNV92bWEgKnBvczsKKworCQlyYiA9ICpw OworCQlwb3MgPSByYl9lbnRyeShyYiwgc3RydWN0IGk5MTVfdm1hLCBvYmpfbm9kZSk7CisJCWlm IChpOTE1X3ZtYV9jb21wYXJlKHBvcywgdm0sIHZpZXcpIDwgMCkKKwkJCXAgPSAmcmItPnJiX3Jp Z2h0OworCQllbHNlCisJCQlwID0gJnJiLT5yYl9sZWZ0OworCX0KKwlyYl9saW5rX25vZGUoJnZt YS0+b2JqX25vZGUsIHJiLCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnZtYS0+b2JqX25vZGUsICZv YmotPnZtYV90cmVlKTsKKworCXJldHVybiB2bWE7Cit9CisKK3N0cnVjdCBpOTE1X3ZtYSAqCitp OTE1X3ZtYV9jcmVhdGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJc3RydWN0 IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJCWNvbnN0IHN0cnVjdCBpOTE1X2dndHRfdmlldyAq dmlldykKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZvYmotPmJhc2UuZGV2LT5zdHJ1Y3RfbXV0 ZXgpOworCUdFTV9CVUdfT04odmlldyAmJiAhaTkxNV9pc19nZ3R0KHZtKSk7CisJR0VNX0JVR19P TihpOTE1X2dlbV9vYmpfdG9fdm1hKG9iaiwgdm0sIHZpZXcpKTsKKworCXJldHVybiBfX2k5MTVf dm1hX2NyZWF0ZShvYmosIHZtLCB2aWV3KTsKK30KKworLyoqCisgKiBpOTE1X3ZtYV9iaW5kIC0g U2V0cyB1cCBQVEVzIGZvciBhbiBWTUEgaW4gaXQncyBjb3JyZXNwb25kaW5nIGFkZHJlc3Mgc3Bh Y2UuCisgKiBAdm1hOiBWTUEgdG8gbWFwCisgKiBAY2FjaGVfbGV2ZWw6IG1hcHBpbmcgY2FjaGUg bGV2ZWwKKyAqIEBmbGFnczogZmxhZ3MgbGlrZSBnbG9iYWwgb3IgbG9jYWwgbWFwcGluZworICoK KyAqIERNQSBhZGRyZXNzZXMgYXJlIHRha2VuIGZyb20gdGhlIHNjYXR0ZXItZ2F0aGVyIHRhYmxl IG9mIHRoaXMgb2JqZWN0IChvciBvZgorICogdGhpcyBWTUEgaW4gY2FzZSBvZiBub24tZGVmYXVs dCBHR1RUIHZpZXdzKSBhbmQgUFRFIGVudHJpZXMgc2V0IHVwLgorICogTm90ZSB0aGF0IERNQSBh ZGRyZXNzZXMgYXJlIGFsc28gdGhlIG9ubHkgcGFydCBvZiB0aGUgU0cgdGFibGUgd2UgY2FyZSBh Ym91dC4KKyAqLworaW50IGk5MTVfdm1hX2JpbmQoc3RydWN0IGk5MTVfdm1hICp2bWEsIGVudW0g aTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCwKKwkJICB1MzIgZmxhZ3MpCit7CisJdTMyIGJp bmRfZmxhZ3M7CisJdTMyIHZtYV9mbGFnczsKKwlpbnQgcmV0OworCisJaWYgKFdBUk5fT04oZmxh Z3MgPT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYmluZF9mbGFncyA9IDA7CisJaWYgKGZs YWdzICYgUElOX0dMT0JBTCkKKwkJYmluZF9mbGFncyB8PSBJOTE1X1ZNQV9HTE9CQUxfQklORDsK KwlpZiAoZmxhZ3MgJiBQSU5fVVNFUikKKwkJYmluZF9mbGFncyB8PSBJOTE1X1ZNQV9MT0NBTF9C SU5EOworCisJdm1hX2ZsYWdzID0gdm1hLT5mbGFncyAmIChJOTE1X1ZNQV9HTE9CQUxfQklORCB8 IEk5MTVfVk1BX0xPQ0FMX0JJTkQpOworCWlmIChmbGFncyAmIFBJTl9VUERBVEUpCisJCWJpbmRf ZmxhZ3MgfD0gdm1hX2ZsYWdzOworCWVsc2UKKwkJYmluZF9mbGFncyAmPSB+dm1hX2ZsYWdzOwor CWlmIChiaW5kX2ZsYWdzID09IDApCisJCXJldHVybiAwOworCisJaWYgKHZtYV9mbGFncyA9PSAw ICYmIHZtYS0+dm0tPmFsbG9jYXRlX3ZhX3JhbmdlKSB7CisJCXRyYWNlX2k5MTVfdmFfYWxsb2Mo dm1hKTsKKwkJcmV0ID0gdm1hLT52bS0+YWxsb2NhdGVfdmFfcmFuZ2Uodm1hLT52bSwKKwkJCQkJ CSB2bWEtPm5vZGUuc3RhcnQsCisJCQkJCQkgdm1hLT5ub2RlLnNpemUpOworCQlpZiAocmV0KQor CQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB2bWEtPnZtLT5iaW5kX3ZtYSh2bWEsIGNhY2hl X2xldmVsLCBiaW5kX2ZsYWdzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdm1hLT5m bGFncyB8PSBiaW5kX2ZsYWdzOworCXJldHVybiAwOworfQorCit2b2lkIF9faW9tZW0gKmk5MTVf dm1hX3Bpbl9pb21hcChzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwl2b2lkIF9faW9tZW0gKnB0 cjsKKworCS8qIEFjY2VzcyB0aHJvdWdoIHRoZSBHVFQgcmVxdWlyZXMgdGhlIGRldmljZSB0byBi ZSBhd2FrZS4gKi8KKwlhc3NlcnRfcnBtX3dha2Vsb2NrX2hlbGQodG9faTkxNSh2bWEtPnZtLT5k ZXYpKTsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnZtYS0+dm0tPmRldi0+c3RydWN0X211dGV4 KTsKKwlpZiAoV0FSTl9PTighaTkxNV92bWFfaXNfbWFwX2FuZF9mZW5jZWFibGUodm1hKSkpCisJ CXJldHVybiBJT19FUlJfUFRSKC1FTk9ERVYpOworCisJR0VNX0JVR19PTighaTkxNV92bWFfaXNf Z2d0dCh2bWEpKTsKKwlHRU1fQlVHX09OKCh2bWEtPmZsYWdzICYgSTkxNV9WTUFfR0xPQkFMX0JJ TkQpID09IDApOworCisJcHRyID0gdm1hLT5pb21hcDsKKwlpZiAocHRyID09IE5VTEwpIHsKKwkJ cHRyID0gaW9fbWFwcGluZ19tYXBfd2MoJmk5MTVfdm1fdG9fZ2d0dCh2bWEtPnZtKS0+bWFwcGFi bGUsCisJCQkJCXZtYS0+bm9kZS5zdGFydCwKKwkJCQkJdm1hLT5ub2RlLnNpemUpOworCQlpZiAo cHRyID09IE5VTEwpCisJCQlyZXR1cm4gSU9fRVJSX1BUUigtRU5PTUVNKTsKKworCQl2bWEtPmlv bWFwID0gcHRyOworCX0KKworCV9faTkxNV92bWFfcGluKHZtYSk7CisJcmV0dXJuIHB0cjsKK30K Kwordm9pZCBpOTE1X3ZtYV91bnBpbl9hbmRfcmVsZWFzZShzdHJ1Y3QgaTkxNV92bWEgKipwX3Zt YSkKK3sKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqb2JqOworCisJdm1hID0gZmV0Y2hfYW5kX3plcm8ocF92bWEpOworCWlmICghdm1hKQorCQly ZXR1cm47CisKKwlvYmogPSB2bWEtPm9iajsKKworCWk5MTVfdm1hX3VucGluKHZtYSk7CisJaTkx NV92bWFfY2xvc2Uodm1hKTsKKworCV9faTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfdW5sZXNzX2Fj dGl2ZShvYmopOworfQorCitib29sCitpOTE1X3ZtYV9taXNwbGFjZWQoc3RydWN0IGk5MTVfdm1h ICp2bWEsIHU2NCBzaXplLCB1NjQgYWxpZ25tZW50LCB1NjQgZmxhZ3MpCit7CisJaWYgKCFkcm1f bW1fbm9kZV9hbGxvY2F0ZWQoJnZtYS0+bm9kZSkpCisJCXJldHVybiBmYWxzZTsKKworCWlmICh2 bWEtPm5vZGUuc2l6ZSA8IHNpemUpCisJCXJldHVybiB0cnVlOworCisJaWYgKGFsaWdubWVudCAm JiB2bWEtPm5vZGUuc3RhcnQgJiAoYWxpZ25tZW50IC0gMSkpCisJCXJldHVybiB0cnVlOworCisJ aWYgKGZsYWdzICYgUElOX01BUFBBQkxFICYmICFpOTE1X3ZtYV9pc19tYXBfYW5kX2ZlbmNlYWJs ZSh2bWEpKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChmbGFncyAmIFBJTl9PRkZTRVRfQklBUyAm JgorCSAgICB2bWEtPm5vZGUuc3RhcnQgPCAoZmxhZ3MgJiBQSU5fT0ZGU0VUX01BU0spKQorCQly ZXR1cm4gdHJ1ZTsKKworCWlmIChmbGFncyAmIFBJTl9PRkZTRVRfRklYRUQgJiYKKwkgICAgdm1h LT5ub2RlLnN0YXJ0ICE9IChmbGFncyAmIFBJTl9PRkZTRVRfTUFTSykpCisJCXJldHVybiB0cnVl OworCisJcmV0dXJuIGZhbHNlOworfQorCit2b2lkIF9faTkxNV92bWFfc2V0X21hcF9hbmRfZmVu Y2VhYmxlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2Jq ZWN0ICpvYmogPSB2bWEtPm9iajsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYg PSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOworCWJvb2wgbWFwcGFibGUsIGZlbmNlYWJsZTsKKwl1 MzIgZmVuY2Vfc2l6ZSwgZmVuY2VfYWxpZ25tZW50OworCisJZmVuY2Vfc2l6ZSA9IGk5MTVfZ2Vt X2dldF9nZ3R0X3NpemUoZGV2X3ByaXYsCisJCQkJCSAgICB2bWEtPnNpemUsCisJCQkJCSAgICBp OTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyhvYmopKTsKKwlmZW5jZV9hbGlnbm1lbnQgPSBpOTE1 X2dlbV9nZXRfZ2d0dF9hbGlnbm1lbnQoZGV2X3ByaXYsCisJCQkJCQkgICAgICB2bWEtPnNpemUs CisJCQkJCQkgICAgICBpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyhvYmopLAorCQkJCQkJICAg ICAgdHJ1ZSk7CisKKwlmZW5jZWFibGUgPSAodm1hLT5ub2RlLnNpemUgPT0gZmVuY2Vfc2l6ZSAm JgorCQkgICAgICh2bWEtPm5vZGUuc3RhcnQgJiAoZmVuY2VfYWxpZ25tZW50IC0gMSkpID09IDAp OworCisJbWFwcGFibGUgPSAodm1hLT5ub2RlLnN0YXJ0ICsgZmVuY2Vfc2l6ZSA8PQorCQkgICAg ZGV2X3ByaXYtPmdndHQubWFwcGFibGVfZW5kKTsKKworCS8qCisJICogRXhwbGljaXRseSBkaXNh YmxlIGZvciByb3RhdGVkIFZNQSBzaW5jZSB0aGUgZGlzcGxheSBkb2VzIG5vdAorCSAqIG5lZWQg dGhlIGZlbmNlIGFuZCB0aGUgVk1BIGlzIG5vdCBhY2Nlc3NpYmxlIHRvIG90aGVyIHVzZXJzLgor CSAqLworCWlmIChtYXBwYWJsZSAmJiBmZW5jZWFibGUgJiYKKwkgICAgdm1hLT5nZ3R0X3ZpZXcu dHlwZSAhPSBJOTE1X0dHVFRfVklFV19ST1RBVEVEKQorCQl2bWEtPmZsYWdzIHw9IEk5MTVfVk1B X0NBTl9GRU5DRTsKKwllbHNlCisJCXZtYS0+ZmxhZ3MgJj0gfkk5MTVfVk1BX0NBTl9GRU5DRTsK K30KKworYm9vbCBpOTE1X2dlbV92YWxpZF9ndHRfc3BhY2Uoc3RydWN0IGk5MTVfdm1hICp2bWEs CisJCQkgICAgICB1bnNpZ25lZCBsb25nIGNhY2hlX2xldmVsKQoreworCXN0cnVjdCBkcm1fbW1f bm9kZSAqZ3R0X3NwYWNlID0gJnZtYS0+bm9kZTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKm90aGVy OworCisJLyoKKwkgKiBPbiBzb21lIG1hY2hpbmVzIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB3aGVu IHB1dHRpbmcgZGlmZmVyaW5nIHR5cGVzCisJICogb2Ygc25vb3BhYmxlIG1lbW9yeSB0b2dldGhl ciB0byBhdm9pZCB0aGUgcHJlZmV0Y2hlciBjcm9zc2luZyBtZW1vcnkKKwkgKiBkb21haW5zIGFu ZCBkeWluZy4gRHVyaW5nIHZtIGluaXRpYWxpc2F0aW9uLCB3ZSBkZWNpZGUgd2hldGhlciBvciBu b3QKKwkgKiB0aGVzZSBjb25zdHJhaW50cyBhcHBseSBhbmQgc2V0IHRoZSBkcm1fbW0uY29sb3Jf YWRqdXN0CisJICogYXBwcm9wcmlhdGVseS4KKwkgKi8KKwlpZiAodm1hLT52bS0+bW0uY29sb3Jf YWRqdXN0ID09IE5VTEwpCisJCXJldHVybiB0cnVlOworCisJaWYgKCFkcm1fbW1fbm9kZV9hbGxv Y2F0ZWQoZ3R0X3NwYWNlKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAobGlzdF9lbXB0eSgmZ3R0 X3NwYWNlLT5ub2RlX2xpc3QpKQorCQlyZXR1cm4gdHJ1ZTsKKworCW90aGVyID0gbGlzdF9lbnRy eShndHRfc3BhY2UtPm5vZGVfbGlzdC5wcmV2LCBzdHJ1Y3QgZHJtX21tX25vZGUsIG5vZGVfbGlz dCk7CisJaWYgKG90aGVyLT5hbGxvY2F0ZWQgJiYgIW90aGVyLT5ob2xlX2ZvbGxvd3MgJiYgb3Ro ZXItPmNvbG9yICE9IGNhY2hlX2xldmVsKQorCQlyZXR1cm4gZmFsc2U7CisKKwlvdGhlciA9IGxp c3RfZW50cnkoZ3R0X3NwYWNlLT5ub2RlX2xpc3QubmV4dCwgc3RydWN0IGRybV9tbV9ub2RlLCBu b2RlX2xpc3QpOworCWlmIChvdGhlci0+YWxsb2NhdGVkICYmICFndHRfc3BhY2UtPmhvbGVfZm9s bG93cyAmJiBvdGhlci0+Y29sb3IgIT0gY2FjaGVfbGV2ZWwpCisJCXJldHVybiBmYWxzZTsKKwor CXJldHVybiB0cnVlOworfQorCisvKioKKyAqIGk5MTVfdm1hX2luc2VydCAtIGZpbmRzIGEgc2xv dCBmb3IgdGhlIHZtYSBpbiBpdHMgYWRkcmVzcyBzcGFjZQorICogQHZtYTogdGhlIHZtYQorICog QHNpemU6IHJlcXVlc3RlZCBzaXplIGluIGJ5dGVzIChjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIFZN QSkKKyAqIEBhbGlnbm1lbnQ6IHJlcXVpcmVkIGFsaWdubWVudAorICogQGZsYWdzOiBtYXNrIG9m IFBJTl8qIGZsYWdzIHRvIHVzZQorICoKKyAqIEZpcnN0IHdlIHRyeSB0byBhbGxvY2F0ZSBzb21l IGZyZWUgc3BhY2UgdGhhdCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzIGZvcgorICogdGhlIFZNQS4g RmFpbGlpbmcgdGhhdCwgaWYgdGhlIGZsYWdzIHBlcm1pdCwgaXQgd2lsbCBldmljdCBhbiBvbGQg Vk1BLAorICogcHJlZmVycmFibHkgdGhlIG9sZGVzdCBpZGxlIGVudHJ5IHRvIG1ha2Ugcm9vbSBm b3IgdGhlIG5ldyBWTUEuCisgKgorICogUmV0dXJuczoKKyAqIDAgb24gc3VjY2VzcywgbmVnYXRp dmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQKK2k5MTVfdm1hX2luc2Vy dChzdHJ1Y3QgaTkxNV92bWEgKnZtYSwgdTY0IHNpemUsIHU2NCBhbGlnbm1lbnQsIHU2NCBmbGFn cykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KHZtYS0+ dm0tPmRldik7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHZtYS0+b2JqOwor CXU2NCBzdGFydCwgZW5kOworCWludCByZXQ7CisKKwlHRU1fQlVHX09OKHZtYS0+ZmxhZ3MgJiAo STkxNV9WTUFfR0xPQkFMX0JJTkQgfCBJOTE1X1ZNQV9MT0NBTF9CSU5EKSk7CisJR0VNX0JVR19P Tihkcm1fbW1fbm9kZV9hbGxvY2F0ZWQoJnZtYS0+bm9kZSkpOworCisJc2l6ZSA9IG1heChzaXpl LCB2bWEtPnNpemUpOworCWlmIChmbGFncyAmIFBJTl9NQVBQQUJMRSkKKwkJc2l6ZSA9IGk5MTVf Z2VtX2dldF9nZ3R0X3NpemUoZGV2X3ByaXYsIHNpemUsCisJCQkJCSAgICAgIGk5MTVfZ2VtX29i amVjdF9nZXRfdGlsaW5nKG9iaikpOworCisJYWxpZ25tZW50ID0gbWF4KG1heChhbGlnbm1lbnQs IHZtYS0+ZGlzcGxheV9hbGlnbm1lbnQpLAorCQkJaTkxNV9nZW1fZ2V0X2dndHRfYWxpZ25tZW50 KGRldl9wcml2LCBzaXplLAorCQkJCQkJICAgIGk5MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5nKG9i aiksCisJCQkJCQkgICAgZmxhZ3MgJiBQSU5fTUFQUEFCTEUpKTsKKworCXN0YXJ0ID0gZmxhZ3Mg JiBQSU5fT0ZGU0VUX0JJQVMgPyBmbGFncyAmIFBJTl9PRkZTRVRfTUFTSyA6IDA7CisKKwllbmQg PSB2bWEtPnZtLT50b3RhbDsKKwlpZiAoZmxhZ3MgJiBQSU5fTUFQUEFCTEUpCisJCWVuZCA9IG1p bl90KHU2NCwgZW5kLCBkZXZfcHJpdi0+Z2d0dC5tYXBwYWJsZV9lbmQpOworCWlmIChmbGFncyAm IFBJTl9aT05FXzRHKQorCQllbmQgPSBtaW5fdCh1NjQsIGVuZCwgKDFVTEwgPDwgMzIpIC0gUEFH RV9TSVpFKTsKKworCS8qIElmIGJpbmRpbmcgdGhlIG9iamVjdC9HR1RUIHZpZXcgcmVxdWlyZXMg bW9yZSBzcGFjZSB0aGFuIHRoZSBlbnRpcmUKKwkgKiBhcGVydHVyZSBoYXMsIHJlamVjdCBpdCBl YXJseSBiZWZvcmUgZXZpY3RpbmcgZXZlcnl0aGluZyBpbiBhIHZhaW4KKwkgKiBhdHRlbXB0IHRv IGZpbmQgc3BhY2UuCisJICovCisJaWYgKHNpemUgPiBlbmQpIHsKKwkJRFJNX0RFQlVHKCJBdHRl bXB0aW5nIHRvIGJpbmQgYW4gb2JqZWN0IGxhcmdlciB0aGFuIHRoZSBhcGVydHVyZTogcmVxdWVz dD0lbGx1IFtvYmplY3Q9JXpkXSA+ICVzIGFwZXJ0dXJlPSVsbHVcbiIsCisJCQkgIHNpemUsIG9i ai0+YmFzZS5zaXplLAorCQkJICBmbGFncyAmIFBJTl9NQVBQQUJMRSA/ICJtYXBwYWJsZSIgOiAi dG90YWwiLAorCQkJICBlbmQpOworCQlyZXR1cm4gLUUyQklHOworCX0KKworCXJldCA9IGk5MTVf Z2VtX29iamVjdF9waW5fcGFnZXMob2JqKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJ aWYgKGZsYWdzICYgUElOX09GRlNFVF9GSVhFRCkgeworCQl1NjQgb2Zmc2V0ID0gZmxhZ3MgJiBQ SU5fT0ZGU0VUX01BU0s7CisJCWlmIChvZmZzZXQgJiAoYWxpZ25tZW50IC0gMSkgfHwgb2Zmc2V0 ID4gZW5kIC0gc2l6ZSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX3VucGluOwor CQl9CisKKwkJdm1hLT5ub2RlLnN0YXJ0ID0gb2Zmc2V0OworCQl2bWEtPm5vZGUuc2l6ZSA9IHNp emU7CisJCXZtYS0+bm9kZS5jb2xvciA9IG9iai0+Y2FjaGVfbGV2ZWw7CisJCXJldCA9IGRybV9t bV9yZXNlcnZlX25vZGUoJnZtYS0+dm0tPm1tLCAmdm1hLT5ub2RlKTsKKwkJaWYgKHJldCkgewor CQkJcmV0ID0gaTkxNV9nZW1fZXZpY3RfZm9yX3ZtYSh2bWEpOworCQkJaWYgKHJldCA9PSAwKQor CQkJCXJldCA9IGRybV9tbV9yZXNlcnZlX25vZGUoJnZtYS0+dm0tPm1tLCAmdm1hLT5ub2RlKTsK KwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJfdW5waW47CisJCX0KKwl9IGVsc2UgeworCQl1MzIg c2VhcmNoX2ZsYWcsIGFsbG9jX2ZsYWc7CisKKwkJaWYgKGZsYWdzICYgUElOX0hJR0gpIHsKKwkJ CXNlYXJjaF9mbGFnID0gRFJNX01NX1NFQVJDSF9CRUxPVzsKKwkJCWFsbG9jX2ZsYWcgPSBEUk1f TU1fQ1JFQVRFX1RPUDsKKwkJfSBlbHNlIHsKKwkJCXNlYXJjaF9mbGFnID0gRFJNX01NX1NFQVJD SF9ERUZBVUxUOworCQkJYWxsb2NfZmxhZyA9IERSTV9NTV9DUkVBVEVfREVGQVVMVDsKKwkJfQor CisJCS8qIFdlIG9ubHkgYWxsb2NhdGUgaW4gUEFHRV9TSVpFL0dUVF9QQUdFX1NJWkUgKDQwOTYp IGNodW5rcywKKwkJICogc28gd2Uga25vdyB0aGF0IHdlIGFsd2F5cyBoYXZlIGEgbWluaW11bSBh bGlnbm1lbnQgb2YgNDA5Ni4KKwkJICogVGhlIGRybV9tbSByYW5nZSBtYW5hZ2VyIGlzIG9wdGlt aXNlZCB0byByZXR1cm4gcmVzdWx0cworCQkgKiB3aXRoIHplcm8gYWxpZ25tZW50LCBzbyB3aGVy ZSBwb3NzaWJsZSB1c2UgdGhlIG9wdGltYWwKKwkJICogcGF0aC4KKwkJICovCisJCWlmIChhbGln bm1lbnQgPD0gNDA5NikKKwkJCWFsaWdubWVudCA9IDA7CisKK3NlYXJjaF9mcmVlOgorCQlyZXQg PSBkcm1fbW1faW5zZXJ0X25vZGVfaW5fcmFuZ2VfZ2VuZXJpYygmdm1hLT52bS0+bW0sCisJCQkJ CQkJICAmdm1hLT5ub2RlLAorCQkJCQkJCSAgc2l6ZSwgYWxpZ25tZW50LAorCQkJCQkJCSAgb2Jq LT5jYWNoZV9sZXZlbCwKKwkJCQkJCQkgIHN0YXJ0LCBlbmQsCisJCQkJCQkJICBzZWFyY2hfZmxh ZywKKwkJCQkJCQkgIGFsbG9jX2ZsYWcpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSBpOTE1X2dl bV9ldmljdF9zb21ldGhpbmcodm1hLT52bSwgc2l6ZSwgYWxpZ25tZW50LAorCQkJCQkJICAgICAg IG9iai0+Y2FjaGVfbGV2ZWwsCisJCQkJCQkgICAgICAgc3RhcnQsIGVuZCwKKwkJCQkJCSAgICAg ICBmbGFncyk7CisJCQlpZiAocmV0ID09IDApCisJCQkJZ290byBzZWFyY2hfZnJlZTsKKworCQkJ Z290byBlcnJfdW5waW47CisJCX0KKworCQlHRU1fQlVHX09OKHZtYS0+bm9kZS5zdGFydCA8IHN0 YXJ0KTsKKwkJR0VNX0JVR19PTih2bWEtPm5vZGUuc3RhcnQgKyB2bWEtPm5vZGUuc2l6ZSA+IGVu ZCk7CisJfQorCUdFTV9CVUdfT04oIWk5MTVfZ2VtX3ZhbGlkX2d0dF9zcGFjZSh2bWEsIG9iai0+ Y2FjaGVfbGV2ZWwpKTsKKworCWxpc3RfbW92ZV90YWlsKCZvYmotPmdsb2JhbF9saXN0LCAmZGV2 X3ByaXYtPm1tLmJvdW5kX2xpc3QpOworCWxpc3RfbW92ZV90YWlsKCZ2bWEtPnZtX2xpbmssICZ2 bWEtPnZtLT5pbmFjdGl2ZV9saXN0KTsKKwlvYmotPmJpbmRfY291bnQrKzsKKworCXJldHVybiAw OworCitlcnJfdW5waW46CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CisJcmV0 dXJuIHJldDsKK30KKworaW50IF9faTkxNV92bWFfZG9fcGluKHN0cnVjdCBpOTE1X3ZtYSAqdm1h LAorCQkgICAgICB1NjQgc2l6ZSwgdTY0IGFsaWdubWVudCwgdTY0IGZsYWdzKQoreworCXVuc2ln bmVkIGludCBib3VuZCA9IHZtYS0+ZmxhZ3M7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0 X2hlbGQoJnZtYS0+dm0tPmRldi0+c3RydWN0X211dGV4KTsKKwlHRU1fQlVHX09OKChmbGFncyAm IChQSU5fR0xPQkFMIHwgUElOX1VTRVIpKSA9PSAwKTsKKwlHRU1fQlVHX09OKChmbGFncyAmIFBJ Tl9HTE9CQUwpICYmICFpOTE1X3ZtYV9pc19nZ3R0KHZtYSkpOworCisJaWYgKFdBUk5fT04oYm91 bmQgJiBJOTE1X1ZNQV9QSU5fT1ZFUkZMT1cpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBl cnI7CisJfQorCisJaWYgKChib3VuZCAmIEk5MTVfVk1BX0JJTkRfTUFTSykgPT0gMCkgeworCQly ZXQgPSBpOTE1X3ZtYV9pbnNlcnQodm1hLCBzaXplLCBhbGlnbm1lbnQsIGZsYWdzKTsKKwkJaWYg KHJldCkKKwkJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGk5MTVfdm1hX2JpbmQodm1hLCB2bWEt Pm9iai0+Y2FjaGVfbGV2ZWwsIGZsYWdzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWlm ICgoYm91bmQgXiB2bWEtPmZsYWdzKSAmIEk5MTVfVk1BX0dMT0JBTF9CSU5EKQorCQlfX2k5MTVf dm1hX3NldF9tYXBfYW5kX2ZlbmNlYWJsZSh2bWEpOworCisJR0VNX0JVR19PTihpOTE1X3ZtYV9t aXNwbGFjZWQodm1hLCBzaXplLCBhbGlnbm1lbnQsIGZsYWdzKSk7CisJcmV0dXJuIDA7CisKK2Vy cjoKKwlfX2k5MTVfdm1hX3VucGluKHZtYSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBpOTE1 X3ZtYV9kZXN0cm95KHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCUdFTV9CVUdfT04odm1hLT5u b2RlLmFsbG9jYXRlZCk7CisJR0VNX0JVR19PTihpOTE1X3ZtYV9pc19hY3RpdmUodm1hKSk7CisJ R0VNX0JVR19PTighaTkxNV92bWFfaXNfY2xvc2VkKHZtYSkpOworCUdFTV9CVUdfT04odm1hLT5m ZW5jZSk7CisKKwlyYl9lcmFzZSgmdm1hLT5vYmpfbm9kZSwgJnZtYS0+b2JqLT52bWFfdHJlZSk7 CisJbGlzdF9kZWwoJnZtYS0+dm1fbGluayk7CisJaWYgKCFpOTE1X3ZtYV9pc19nZ3R0KHZtYSkp CisJCWk5MTVfcHBndHRfcHV0KGk5MTVfdm1fdG9fcHBndHQodm1hLT52bSkpOworCisJa21lbV9j YWNoZV9mcmVlKHRvX2k5MTUodm1hLT5vYmotPmJhc2UuZGV2KS0+dm1hcywgdm1hKTsKK30KKwor dm9pZCBpOTE1X3ZtYV9jbG9zZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlHRU1fQlVHX09O KGk5MTVfdm1hX2lzX2Nsb3NlZCh2bWEpKTsKKwl2bWEtPmZsYWdzIHw9IEk5MTVfVk1BX0NMT1NF RDsKKworCWxpc3RfZGVsX2luaXQoJnZtYS0+b2JqX2xpbmspOworCWlmICghaTkxNV92bWFfaXNf YWN0aXZlKHZtYSkgJiYgIWk5MTVfdm1hX2lzX3Bpbm5lZCh2bWEpKQorCQlXQVJOX09OKGk5MTVf dm1hX3VuYmluZCh2bWEpKTsKK30KKworc3RhdGljIHZvaWQgX19pOTE1X3ZtYV9pb3VubWFwKHN0 cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCUdFTV9CVUdfT04oaTkxNV92bWFfaXNfcGlubmVkKHZt YSkpOworCisJaWYgKHZtYS0+aW9tYXAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaW9fbWFwcGlu Z191bm1hcCh2bWEtPmlvbWFwKTsKKwl2bWEtPmlvbWFwID0gTlVMTDsKK30KKworaW50IGk5MTVf dm1hX3VuYmluZChzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqID0gdm1hLT5vYmo7CisJdW5zaWduZWQgbG9uZyBhY3RpdmU7CisJaW50IHJl dDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm9iai0+YmFzZS5kZXYtPnN0cnVjdF9tdXRleCk7 CisKKwkvKiBGaXJzdCB3YWl0IHVwb24gYW55IGFjdGl2aXR5IGFzIHJldGlyaW5nIHRoZSByZXF1 ZXN0IG1heQorCSAqIGhhdmUgc2lkZS1lZmZlY3RzIHN1Y2ggYXMgdW5waW5uaW5nIG9yIGV2ZW4g dW5iaW5kaW5nIHRoaXMgdm1hLgorCSAqLworCWFjdGl2ZSA9IGk5MTVfdm1hX2dldF9hY3RpdmUo dm1hKTsKKwlpZiAoYWN0aXZlKSB7CisJCWludCBpZHg7CisKKwkJLyogV2hlbiBhIGNsb3NlZCBW TUEgaXMgcmV0aXJlZCwgaXQgaXMgdW5ib3VuZCAtIGVlay4KKwkJICogSW4gb3JkZXIgdG8gcHJl dmVudCBpdCBmcm9tIGJlaW5nIHJlY3Vyc2l2ZWx5IGNsb3NlZCwKKwkJICogdGFrZSBhIHBpbiBv biB0aGUgdm1hIHNvIHRoYXQgdGhlIHNlY29uZCB1bmJpbmQgaXMKKwkJICogYWJvcnRlZC4KKwkJ ICoKKwkJICogRXZlbiBtb3JlIHNjYXJ5IGlzIHRoYXQgdGhlIHJldGlyZSBjYWxsYmFjayBtYXkg ZnJlZQorCQkgKiB0aGUgb2JqZWN0IChsYXN0IGFjdGl2ZSB2bWEpLiBUbyBwcmV2ZW50IHRoZSBl eHBsb3Npb24KKwkJICogd2UgZGVmZXIgdGhlIGFjdHVhbCBvYmplY3QgZnJlZSB0byBhIHdvcmtl ciB0aGF0IGNhbgorCQkgKiBvbmx5IHByb2NlZWQgb25jZSBpdCBhY3F1aXJlcyB0aGUgc3RydWN0 X211dGV4ICh3aGljaAorCQkgKiB3ZSBjdXJyZW50bHkgaG9sZCwgdGhlcmVmb3JlIGl0IGNhbm5v dCBmcmVlIHRoaXMgb2JqZWN0CisJCSAqIGJlZm9yZSB3ZSBhcmUgZmluaXNoZWQpLgorCQkgKi8K KwkJX19pOTE1X3ZtYV9waW4odm1hKTsKKworCQlmb3JfZWFjaF9hY3RpdmUoYWN0aXZlLCBpZHgp IHsKKwkJCXJldCA9IGk5MTVfZ2VtX2FjdGl2ZV9yZXRpcmUoJnZtYS0+bGFzdF9yZWFkW2lkeF0s CisJCQkJCQkgICAmdm1hLT52bS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQkJaWYgKHJldCkKKwkJ CQlicmVhazsKKwkJfQorCisJCV9faTkxNV92bWFfdW5waW4odm1hKTsKKwkJaWYgKHJldCkKKwkJ CXJldHVybiByZXQ7CisKKwkJR0VNX0JVR19PTihpOTE1X3ZtYV9pc19hY3RpdmUodm1hKSk7CisJ fQorCisJaWYgKGk5MTVfdm1hX2lzX3Bpbm5lZCh2bWEpKQorCQlyZXR1cm4gLUVCVVNZOworCisJ aWYgKCFkcm1fbW1fbm9kZV9hbGxvY2F0ZWQoJnZtYS0+bm9kZSkpCisJCWdvdG8gZGVzdHJveTsK KworCUdFTV9CVUdfT04ob2JqLT5iaW5kX2NvdW50ID09IDApOworCUdFTV9CVUdfT04oIW9iai0+ bW0ucGFnZXMpOworCisJaWYgKGk5MTVfdm1hX2lzX21hcF9hbmRfZmVuY2VhYmxlKHZtYSkpIHsK KwkJLyogcmVsZWFzZSB0aGUgZmVuY2UgcmVnIF9hZnRlcl8gZmx1c2hpbmcgKi8KKwkJcmV0ID0g aTkxNV92bWFfcHV0X2ZlbmNlKHZtYSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJ CS8qIEZvcmNlIGEgcGFnZWZhdWx0IGZvciBkb21haW4gdHJhY2tpbmcgb24gbmV4dCB1c2VyIGFj Y2VzcyAqLworCQlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2JqKTsKKworCQlfX2k5MTVfdm1hX2lv dW5tYXAodm1hKTsKKwkJdm1hLT5mbGFncyAmPSB+STkxNV9WTUFfQ0FOX0ZFTkNFOworCX0KKwor CWlmIChsaWtlbHkoIXZtYS0+dm0tPmNsb3NlZCkpIHsKKwkJdHJhY2VfaTkxNV92bWFfdW5iaW5k KHZtYSk7CisJCXZtYS0+dm0tPnVuYmluZF92bWEodm1hKTsKKwl9CisJdm1hLT5mbGFncyAmPSB+ KEk5MTVfVk1BX0dMT0JBTF9CSU5EIHwgSTkxNV9WTUFfTE9DQUxfQklORCk7CisKKwlkcm1fbW1f cmVtb3ZlX25vZGUoJnZtYS0+bm9kZSk7CisJbGlzdF9tb3ZlX3RhaWwoJnZtYS0+dm1fbGluaywg JnZtYS0+dm0tPnVuYm91bmRfbGlzdCk7CisKKwlpZiAodm1hLT5wYWdlcyAhPSBvYmotPm1tLnBh Z2VzKSB7CisJCUdFTV9CVUdfT04oIXZtYS0+cGFnZXMpOworCQlzZ19mcmVlX3RhYmxlKHZtYS0+ cGFnZXMpOworCQlrZnJlZSh2bWEtPnBhZ2VzKTsKKwl9CisJdm1hLT5wYWdlcyA9IE5VTEw7CisK KwkvKiBTaW5jZSB0aGUgdW5ib3VuZCBsaXN0IGlzIGdsb2JhbCwgb25seSBtb3ZlIHRvIHRoYXQg bGlzdCBpZgorCSAqIG5vIG1vcmUgVk1BcyBleGlzdC4gKi8KKwlpZiAoLS1vYmotPmJpbmRfY291 bnQgPT0gMCkKKwkJbGlzdF9tb3ZlX3RhaWwoJm9iai0+Z2xvYmFsX2xpc3QsCisJCQkgICAgICAg JnRvX2k5MTUob2JqLT5iYXNlLmRldiktPm1tLnVuYm91bmRfbGlzdCk7CisKKwkvKiBBbmQgZmlu YWxseSBub3cgdGhlIG9iamVjdCBpcyBjb21wbGV0ZWx5IGRlY291cGxlZCBmcm9tIHRoaXMgdm1h LAorCSAqIHdlIGNhbiBkcm9wIGl0cyBob2xkIG9uIHRoZSBiYWNraW5nIHN0b3JhZ2UgYW5kIGFs bG93IGl0IHRvIGJlCisJICogcmVhcGVkIGJ5IHRoZSBzaHJpbmtlci4KKwkgKi8KKwlpOTE1X2dl bV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKKworZGVzdHJveToKKwlpZiAodW5saWtlbHkoaTkx NV92bWFfaXNfY2xvc2VkKHZtYSkpKQorCQlpOTE1X3ZtYV9kZXN0cm95KHZtYSk7CisKKwlyZXR1 cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92bWEuaCBi L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdm1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMC4uZDM1OGIzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2k5MTVfdm1hLmgKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAx NiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQs IGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRo aXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0 d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwg aW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHks IG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQv b3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8g d2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0 aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3Rp Y2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFy YWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBv cnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJ REVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAq IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Yg TUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5E IE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBD T1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhF UgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBP UiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJ VEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBT T0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0k5MTVfVk1BX0hfXworI2RlZmluZSBfX0k5 MTVfVk1BX0hfXworCisjaW5jbHVkZSA8bGludXgvaW8tbWFwcGluZy5oPgorCisjaW5jbHVkZSA8 ZHJtL2RybV9tbS5oPgorCisjaW5jbHVkZSAiaTkxNV9nZW1fZ3R0LmgiCisjaW5jbHVkZSAiaTkx NV9nZW1fZmVuY2VfcmVnLmgiCisjaW5jbHVkZSAiaTkxNV9nZW1fb2JqZWN0LmgiCisjaW5jbHVk ZSAiaTkxNV9nZW1fcmVxdWVzdC5oIgorCisKK2VudW0gaTkxNV9jYWNoZV9sZXZlbDsKKworLyoq CisgKiBBIFZNQSByZXByZXNlbnRzIGEgR0VNIEJPIHRoYXQgaXMgYm91bmQgaW50byBhbiBhZGRy ZXNzIHNwYWNlLiBUaGVyZWZvcmUsIGEKKyAqIFZNQSdzIHByZXNlbmNlIGNhbm5vdCBiZSBndWFy YW50ZWVkIGJlZm9yZSBiaW5kaW5nLCBvciBhZnRlciB1bmJpbmRpbmcgdGhlCisgKiBvYmplY3Qg aW50by9mcm9tIHRoZSBhZGRyZXNzIHNwYWNlLgorICoKKyAqIFRvIG1ha2UgdGhpbmdzIGFzIHNp bXBsZSBhcyBwb3NzaWJsZSAoaWUuIG5vIHJlZmNvdW50aW5nKSwgYSBWTUEncyBsaWZldGltZQor ICogd2lsbCBhbHdheXMgYmUgPD0gYW4gb2JqZWN0cyBsaWZldGltZS4gU28gb2JqZWN0IHJlZmNv dW50aW5nIHNob3VsZCBjb3ZlciB1cy4KKyAqLworc3RydWN0IGk5MTVfdm1hIHsKKwlzdHJ1Y3Qg ZHJtX21tX25vZGUgbm9kZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0 cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtOworCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcg KmZlbmNlOworCXN0cnVjdCBzZ190YWJsZSAqcGFnZXM7CisJdm9pZCBfX2lvbWVtICppb21hcDsK Kwl1NjQgc2l6ZTsKKwl1NjQgZGlzcGxheV9hbGlnbm1lbnQ7CisKKwl1bnNpZ25lZCBpbnQgZmxh Z3M7CisJLyoqCisJICogSG93IG1hbnkgdXNlcnMgaGF2ZSBwaW5uZWQgdGhpcyBvYmplY3QgaW4g R1RUIHNwYWNlLiBUaGUgZm9sbG93aW5nCisJICogdXNlcnMgY2FuIGVhY2ggaG9sZCBhdCBtb3N0 IG9uZSByZWZlcmVuY2U6IHB3cml0ZS9wcmVhZCwgZXhlY2J1ZmZlcgorCSAqIChvYmplY3RzIGFy ZSBub3QgYWxsb3dlZCBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWUgYmF0Y2hidWZmZXIpLAor CSAqIGFuZCB0aGUgZnJhbWVidWZmZXIgY29kZS4gV2hlbiBzd2l0Y2hpbmcvcGFnZWZsaXBwaW5n LCB0aGUKKwkgKiBmcmFtZWJ1ZmZlciBjb2RlIGhhcyBhdCBtb3N0IHR3byBidWZmZXJzIHBpbm5l ZCBwZXIgY3J0Yy4KKwkgKgorCSAqIEluIHRoZSB3b3JzdCBjYXNlIHRoaXMgaXMgMSArIDEgKyAx ICsgMioyID0gNy4gVGhhdCB3b3VsZCBmaXQgaW50byAzCisJICogYml0cyB3aXRoIGFic29sdXRl bHkgbm8gaGVhZHJvb20uIFNvIHVzZSA0IGJpdHMuCisJICovCisjZGVmaW5lIEk5MTVfVk1BX1BJ Tl9NQVNLIDB4ZgorI2RlZmluZSBJOTE1X1ZNQV9QSU5fT1ZFUkZMT1cJQklUKDUpCisKKwkvKiog RmxhZ3MgYW5kIGFkZHJlc3Mgc3BhY2UgdGhpcyBWTUEgaXMgYm91bmQgdG8gKi8KKyNkZWZpbmUg STkxNV9WTUFfR0xPQkFMX0JJTkQJQklUKDYpCisjZGVmaW5lIEk5MTVfVk1BX0xPQ0FMX0JJTkQJ QklUKDcpCisjZGVmaW5lIEk5MTVfVk1BX0JJTkRfTUFTSyAoSTkxNV9WTUFfR0xPQkFMX0JJTkQg fCBJOTE1X1ZNQV9MT0NBTF9CSU5EIHwgSTkxNV9WTUFfUElOX09WRVJGTE9XKQorCisjZGVmaW5l IEk5MTVfVk1BX0dHVFQJCUJJVCg4KQorI2RlZmluZSBJOTE1X1ZNQV9DQU5fRkVOQ0UJQklUKDkp CisjZGVmaW5lIEk5MTVfVk1BX0NMT1NFRAkJQklUKDEwKQorCisJdW5zaWduZWQgaW50IGFjdGl2 ZTsKKwlzdHJ1Y3QgaTkxNV9nZW1fYWN0aXZlIGxhc3RfcmVhZFtJOTE1X05VTV9FTkdJTkVTXTsK KwlzdHJ1Y3QgaTkxNV9nZW1fYWN0aXZlIGxhc3Rfd3JpdGU7CisJc3RydWN0IGk5MTVfZ2VtX2Fj dGl2ZSBsYXN0X2ZlbmNlOworCisJLyoqCisJICogU3VwcG9ydCBkaWZmZXJlbnQgR0dUVCB2aWV3 cyBpbnRvIHRoZSBzYW1lIG9iamVjdC4KKwkgKiBUaGlzIG1lYW5zIHRoZXJlIGNhbiBiZSBtdWx0 aXBsZSBWTUEgbWFwcGluZ3MgcGVyIG9iamVjdCBhbmQgcGVyIFZNLgorCSAqIGk5MTVfZ2d0dF92 aWV3X3R5cGUgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRob3NlIGVudHJpZXMuCisJ ICogVGhlIGRlZmF1bHQgb25lIG9mIHplcm8gKEk5MTVfR0dUVF9WSUVXX05PUk1BTCkgaXMgZGVm YXVsdCBhbmQgYWxzbworCSAqIGFzc3VtZWQgaW4gR0VNIGZ1bmN0aW9ucyB3aGljaCB0YWtlIG5v IGdndHQgdmlldyBwYXJhbWV0ZXIuCisJICovCisJc3RydWN0IGk5MTVfZ2d0dF92aWV3IGdndHRf dmlldzsKKworCS8qKiBUaGlzIG9iamVjdCdzIHBsYWNlIG9uIHRoZSBhY3RpdmUvaW5hY3RpdmUg bGlzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHZtX2xpbms7CisKKwlzdHJ1Y3QgbGlzdF9oZWFk IG9ial9saW5rOyAvKiBMaW5rIGluIHRoZSBvYmplY3QncyBWTUEgbGlzdCAqLworCXN0cnVjdCBy Yl9ub2RlIG9ial9ub2RlOworCisJLyoqIFRoaXMgdm1hJ3MgcGxhY2UgaW4gdGhlIGJhdGNoYnVm ZmVyIG9yIG9uIHRoZSBldmljdGlvbiBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBleGVjX2xp c3Q7CisKKwkvKioKKwkgKiBVc2VkIGZvciBwZXJmb3JtaW5nIHJlbG9jYXRpb25zIGR1cmluZyBl eGVjYnVmZmVyIGluc2VydGlvbi4KKwkgKi8KKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBleGVjX25vZGU7 CisJdW5zaWduZWQgbG9uZyBleGVjX2hhbmRsZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNf b2JqZWN0MiAqZXhlY19lbnRyeTsKK307CisKK3N0cnVjdCBpOTE1X3ZtYSAqCitpOTE1X3ZtYV9j cmVhdGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0sCisJCWNvbnN0IHN0cnVjdCBpOTE1X2dndHRfdmlldyAqdmlldyk7CisK K3N0YXRpYyBpbmxpbmUgbG9uZworaTkxNV92bWFfY29tcGFyZShzdHJ1Y3QgaTkxNV92bWEgKnZt YSwKKwkJIHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQkgY29uc3Qgc3RydWN0IGk5 MTVfZ2d0dF92aWV3ICp2aWV3KQoreworCUdFTV9CVUdfT04odmlldyAmJiAhaTkxNV92bWFfaXNf Z2d0dCh2bWEpKTsKKworCWlmICh2bWEtPnZtICE9IHZtKQorCQlyZXR1cm4gdm1hLT52bSAtIHZt OworCisJaWYgKCF2aWV3KQorCQlyZXR1cm4gdm1hLT5nZ3R0X3ZpZXcudHlwZTsKKworCWlmICh2 bWEtPmdndHRfdmlldy50eXBlICE9IHZpZXctPnR5cGUpCisJCXJldHVybiB2bWEtPmdndHRfdmll dy50eXBlIC0gdmlldy0+dHlwZTsKKworCXJldHVybiBtZW1jbXAoJnZtYS0+Z2d0dF92aWV3LnBh cmFtcywKKwkJICAgICAgJnZpZXctPnBhcmFtcywKKwkJICAgICAgc2l6ZW9mKHZpZXctPnBhcmFt cykpOworfQorCit2b2lkIGk5MTVfdm1hX3VucGluX2FuZF9yZWxlYXNlKHN0cnVjdCBpOTE1X3Zt YSAqKnBfdm1hKTsKKworc3RhdGljIGlubGluZSBib29sIGk5MTVfdm1hX2lzX2dndHQoY29uc3Qg c3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJcmV0dXJuIHZtYS0+ZmxhZ3MgJiBJOTE1X1ZNQV9H R1RUOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV92bWFfaXNfbWFwX2FuZF9mZW5jZWFi bGUoY29uc3Qgc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJcmV0dXJuIHZtYS0+ZmxhZ3MgJiBJ OTE1X1ZNQV9DQU5fRkVOQ0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpOTE1X3ZtYV9pc19j bG9zZWQoY29uc3Qgc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJcmV0dXJuIHZtYS0+ZmxhZ3Mg JiBJOTE1X1ZNQV9DTE9TRUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGk5MTVf dm1hX2dldF9hY3RpdmUoY29uc3Qgc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJcmV0dXJuIHZt YS0+YWN0aXZlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV92bWFfaXNfYWN0aXZlKGNv bnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXJldHVybiBpOTE1X3ZtYV9nZXRfYWN0aXZl KHZtYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X3ZtYV9zZXRfYWN0aXZlKHN0cnVj dCBpOTE1X3ZtYSAqdm1hLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZW5naW5lKQoreworCXZt YS0+YWN0aXZlIHw9IEJJVChlbmdpbmUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaTkxNV92 bWFfY2xlYXJfYWN0aXZlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkJCQkgdW5zaWduZWQgaW50 IGVuZ2luZSkKK3sKKwl2bWEtPmFjdGl2ZSAmPSB+QklUKGVuZ2luZSk7Cit9CisKK3N0YXRpYyBp bmxpbmUgYm9vbCBpOTE1X3ZtYV9oYXNfYWN0aXZlX2VuZ2luZShjb25zdCBzdHJ1Y3QgaTkxNV92 bWEgKnZtYSwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IGVuZ2luZSkKK3sKKwlyZXR1cm4gdm1h LT5hY3RpdmUgJiBCSVQoZW5naW5lKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaTkxNV9nZ3R0 X29mZnNldChjb25zdCBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlHRU1fQlVHX09OKCFpOTE1 X3ZtYV9pc19nZ3R0KHZtYSkpOworCUdFTV9CVUdfT04oIXZtYS0+bm9kZS5hbGxvY2F0ZWQpOwor CUdFTV9CVUdfT04odXBwZXJfMzJfYml0cyh2bWEtPm5vZGUuc3RhcnQpKTsKKwlHRU1fQlVHX09O KHVwcGVyXzMyX2JpdHModm1hLT5ub2RlLnN0YXJ0ICsgdm1hLT5ub2RlLnNpemUgLSAxKSk7CisJ cmV0dXJuIGxvd2VyXzMyX2JpdHModm1hLT5ub2RlLnN0YXJ0KTsKK30KKworc3RhdGljIGlubGlu ZSBzdHJ1Y3QgaTkxNV92bWEgKmk5MTVfdm1hX2dldChzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sK KwlpOTE1X2dlbV9vYmplY3RfZ2V0KHZtYS0+b2JqKTsKKwlyZXR1cm4gdm1hOworfQorCitzdGF0 aWMgaW5saW5lIHZvaWQgaTkxNV92bWFfcHV0KHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCWk5 MTVfZ2VtX29iamVjdF9wdXQodm1hLT5vYmopOworfQorCitpbnQgaTkxNV92bWFfYmluZChzdHJ1 Y3QgaTkxNV92bWEgKnZtYSwgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVsLAorCQkg IHUzMiBmbGFncyk7Citib29sIGk5MTVfZ2VtX3ZhbGlkX2d0dF9zcGFjZShzdHJ1Y3QgaTkxNV92 bWEgKnZtYSwgdW5zaWduZWQgbG9uZyBjYWNoZV9sZXZlbCk7Citib29sCitpOTE1X3ZtYV9taXNw bGFjZWQoc3RydWN0IGk5MTVfdm1hICp2bWEsIHU2NCBzaXplLCB1NjQgYWxpZ25tZW50LCB1NjQg ZmxhZ3MpOwordm9pZCBfX2k5MTVfdm1hX3NldF9tYXBfYW5kX2ZlbmNlYWJsZShzdHJ1Y3QgaTkx NV92bWEgKnZtYSk7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfdm1hX3VuYmluZChzdHJ1Y3QgaTkx NV92bWEgKnZtYSk7Cit2b2lkIGk5MTVfdm1hX2Nsb3NlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsK K3ZvaWQgaTkxNV92bWFfZGVzdHJveShzdHJ1Y3QgaTkxNV92bWEgKnZtYSk7CisKK2ludCBfX2k5 MTVfdm1hX2RvX3BpbihzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKKwkJICAgICAgdTY0IHNpemUsIHU2 NCBhbGlnbm1lbnQsIHU2NCBmbGFncyk7CitzdGF0aWMgaW5saW5lIGludCBfX211c3RfY2hlY2sK K2k5MTVfdm1hX3BpbihzdHJ1Y3QgaTkxNV92bWEgKnZtYSwgdTY0IHNpemUsIHU2NCBhbGlnbm1l bnQsIHU2NCBmbGFncykKK3sKKwlCVUlMRF9CVUdfT04oUElOX01CWiAhPSBJOTE1X1ZNQV9QSU5f T1ZFUkZMT1cpOworCUJVSUxEX0JVR19PTihQSU5fR0xPQkFMICE9IEk5MTVfVk1BX0dMT0JBTF9C SU5EKTsKKwlCVUlMRF9CVUdfT04oUElOX1VTRVIgIT0gSTkxNV9WTUFfTE9DQUxfQklORCk7CisK KwkvKiBQaW4gZWFybHkgdG8gcHJldmVudCB0aGUgc2hyaW5rZXIvZXZpY3Rpb24gbG9naWMgZnJv bSBkZXN0cm95aW5nCisJICogb3VyIHZtYSBhcyB3ZSBpbnNlcnQgYW5kIGJpbmQuCisJICovCisJ aWYgKGxpa2VseSgoKCsrdm1hLT5mbGFncyBeIGZsYWdzKSAmIEk5MTVfVk1BX0JJTkRfTUFTSykg PT0gMCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIF9faTkxNV92bWFfZG9fcGluKHZtYSwgc2l6 ZSwgYWxpZ25tZW50LCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGk5MTVfdm1hX3Bp bl9jb3VudChjb25zdCBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlyZXR1cm4gdm1hLT5mbGFn cyAmIEk5MTVfVk1BX1BJTl9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV92bWFf aXNfcGlubmVkKGNvbnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXJldHVybiBpOTE1X3Zt YV9waW5fY291bnQodm1hKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faTkxNV92bWFfcGlu KHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXZtYS0+ZmxhZ3MrKzsKKwlHRU1fQlVHX09OKHZt YS0+ZmxhZ3MgJiBJOTE1X1ZNQV9QSU5fT1ZFUkZMT1cpOworfQorCitzdGF0aWMgaW5saW5lIHZv aWQgX19pOTE1X3ZtYV91bnBpbihzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlHRU1fQlVHX09O KCFpOTE1X3ZtYV9pc19waW5uZWQodm1hKSk7CisJdm1hLT5mbGFncy0tOworfQorCitzdGF0aWMg aW5saW5lIHZvaWQgaTkxNV92bWFfdW5waW4oc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJR0VN X0JVR19PTighZHJtX21tX25vZGVfYWxsb2NhdGVkKCZ2bWEtPm5vZGUpKTsKKwlfX2k5MTVfdm1h X3VucGluKHZtYSk7Cit9CisKKy8qKgorICogaTkxNV92bWFfcGluX2lvbWFwIC0gY2FsbHMgaW9y ZW1hcF93YyB0byBtYXAgdGhlIEdHVFQgVk1BIHZpYSB0aGUgYXBlcnR1cmUKKyAqIEB2bWE6IFZN QSB0byBpb21hcAorICoKKyAqIFRoZSBwYXNzZWQgaW4gVk1BIGhhcyB0byBiZSBwaW5uZWQgaW4g dGhlIGdsb2JhbCBHVFQgbWFwcGFibGUgcmVnaW9uLgorICogQW4gZXh0cmEgcGlubmluZyBvZiB0 aGUgVk1BIGlzIGFjcXVpcmVkIGZvciB0aGUgcmV0dXJuIGlvbWFwcGluZywKKyAqIHRoZSBjYWxs ZXIgbXVzdCBjYWxsIGk5MTVfdm1hX3VucGluX2lvbWFwIHRvIHJlbGlucXVpc2ggdGhlIHBpbm5p bmcKKyAqIGFmdGVyIHRoZSBpb21hcHBpbmcgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLgorICoKKyAq IENhbGxlcnMgbXVzdCBob2xkIHRoZSBzdHJ1Y3RfbXV0ZXguCisgKgorICogUmV0dXJucyBhIHZh bGlkIGlvbWFwcGVkIHBvaW50ZXIgb3IgRVJSX1BUUi4KKyAqLwordm9pZCBfX2lvbWVtICppOTE1 X3ZtYV9waW5faW9tYXAoc3RydWN0IGk5MTVfdm1hICp2bWEpOworI2RlZmluZSBJT19FUlJfUFRS KHgpICgodm9pZCBfX2lvbWVtICopRVJSX1BUUih4KSkKKworLyoqCisgKiBpOTE1X3ZtYV91bnBp bl9pb21hcCAtIHVucGlucyB0aGUgbWFwcGluZyByZXR1cm5lZCBmcm9tIGk5MTVfdm1hX2lvbWFw CisgKiBAdm1hOiBWTUEgdG8gdW5waW4KKyAqCisgKiBVbnBpbnMgdGhlIHByZXZpb3VzbHkgaW9t YXBwZWQgVk1BIGZyb20gaTkxNV92bWFfcGluX2lvbWFwKCkuCisgKgorICogQ2FsbGVycyBtdXN0 IGhvbGQgdGhlIHN0cnVjdF9tdXRleC4gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHZhbGlkIHRvIGJl CisgKiBjYWxsZWQgb24gYSBWTUEgcHJldmlvdXNseSBpb21hcHBlZCBieSB0aGUgY2FsbGVyIHdp dGggaTkxNV92bWFfcGluX2lvbWFwKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X3Zt YV91bnBpbl9pb21hcChzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlsb2NrZGVwX2Fzc2VydF9o ZWxkKCZ2bWEtPnZtLT5kZXYtPnN0cnVjdF9tdXRleCk7CisJR0VNX0JVR19PTih2bWEtPmlvbWFw ID09IE5VTEwpOworCWk5MTVfdm1hX3VucGluKHZtYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3Ry dWN0IHBhZ2UgKmk5MTVfdm1hX2ZpcnN0X3BhZ2Uoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJ R0VNX0JVR19PTighdm1hLT5wYWdlcyk7CisJcmV0dXJuIHNnX3BhZ2Uodm1hLT5wYWdlcy0+c2ds KTsKK30KKworLyoqCisgKiBpOTE1X3ZtYV9waW5fZmVuY2UgLSBwaW4gZmVuY2luZyBzdGF0ZQor ICogQHZtYTogdm1hIHRvIHBpbiBmZW5jaW5nIGZvcgorICoKKyAqIFRoaXMgcGlucyB0aGUgZmVu Y2luZyBzdGF0ZSAod2hldGhlciB0aWxlZCBvciB1bnRpbGVkKSB0byBtYWtlIHN1cmUgdGhlCisg KiB2bWEgKGFuZCBpdHMgb2JqZWN0KSBpcyByZWFkeSB0byBiZSB1c2VkIGFzIGEgc2Nhbm91dCB0 YXJnZXQuIEZlbmNpbmcKKyAqIHN0YXR1cyBtdXN0IGJlIHN5bmNocm9uaXplIGZpcnN0IGJ5IGNh bGxpbmcgaTkxNV92bWFfZ2V0X2ZlbmNlKCk6CisgKgorICogVGhlIHJlc3VsdGluZyBmZW5jZSBw aW4gcmVmZXJlbmNlIG11c3QgYmUgcmVsZWFzZWQgYWdhaW4gd2l0aAorICogaTkxNV92bWFfdW5w aW5fZmVuY2UoKS4KKyAqCisgKiBSZXR1cm5zOgorICoKKyAqIFRydWUgaWYgdGhlIHZtYSBoYXMg YSBmZW5jZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wKK2k5MTVf dm1hX3Bpbl9mZW5jZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlsb2NrZGVwX2Fzc2VydF9o ZWxkKCZ2bWEtPnZtLT5kZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKHZtYS0+ZmVuY2UpIHsKKwkJ dm1hLT5mZW5jZS0+cGluX2NvdW50Kys7CisJCXJldHVybiB0cnVlOworCX0gZWxzZQorCQlyZXR1 cm4gZmFsc2U7Cit9CisKKy8qKgorICogaTkxNV92bWFfdW5waW5fZmVuY2UgLSB1bnBpbiBmZW5j aW5nIHN0YXRlCisgKiBAdm1hOiB2bWEgdG8gdW5waW4gZmVuY2luZyBmb3IKKyAqCisgKiBUaGlz IHJlbGVhc2VzIHRoZSBmZW5jZSBwaW4gcmVmZXJlbmNlIGFjcXVpcmVkIHRocm91Z2gKKyAqIGk5 MTVfdm1hX3Bpbl9mZW5jZS4gSXQgd2lsbCBoYW5kbGUgYm90aCBvYmplY3RzIHdpdGggYW5kIHdp dGhvdXQgYW4KKyAqIGF0dGFjaGVkIGZlbmNlIGNvcnJlY3RseSwgY2FsbGVycyBkbyBub3QgbmVl ZCB0byBkaXN0aW5ndWlzaCB0aGlzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2k5MTVfdm1h X3VucGluX2ZlbmNlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCWxvY2tkZXBfYXNzZXJ0X2hl bGQoJnZtYS0+dm0tPmRldi0+c3RydWN0X211dGV4KTsKKwlpZiAodm1hLT5mZW5jZSkgeworCQlH RU1fQlVHX09OKHZtYS0+ZmVuY2UtPnBpbl9jb3VudCA8PSAwKTsKKwkJdm1hLT5mZW5jZS0+cGlu X2NvdW50LS07CisJfQorfQorCisjZW5kaWYKKwotLSAKMi43LjQKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50 ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=