From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= Subject: [RFC PATCH v6 71/92] mm: add support for remote mapping Date: Fri, 9 Aug 2019 19:00:26 +0300 Message-ID: <20190809160047.8319-72-alazar@bitdefender.com> References: <20190809160047.8319-1-alazar@bitdefender.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190809160047.8319-1-alazar@bitdefender.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: virtualization-bounces@lists.linux-foundation.org Errors-To: virtualization-bounces@lists.linux-foundation.org To: kvm@vger.kernel.org Cc: Tamas K Lengyel , Weijiang Yang , Yu C , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Jan Kiszka , =?UTF-8?q?Samuel=20Laur=C3=A9n?= , Konrad Rzeszutek Wilk , virtualization@lists.linux-foundation.org, =?UTF-8?q?Adalbert=20Laz=C4=83r?= , linux-mm@kvack.org, Patrick Colp , Mathieu Tarral , Stefan Hajnoczi , =?UTF-8?q?Mircea=20C=C3=AErjaliu?= , Paolo Bonzini , Zhang@mail.linuxfoundation.org, =?UTF-8?q?Mihai=20Don=C8=9Bu?= List-Id: virtualization@lists.linuxfoundation.org RnJvbTogTWlyY2VhIEPDrnJqYWxpdSA8bWNpcmphbGl1QGJpdGRlZmVuZGVyLmNvbT4KClRoZSBm b2xsb3dpbmcgdHdvIG5ldyBtbSBleHBvcnRzIGFyZSBpbnRyb2R1Y2VkOgogKiBtbV9yZW1vdGVf bWFwKHN0cnVjdCBtbV9zdHJ1Y3QgKnJlcV9tbSwKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBs b25nIHJlcV9odmEsCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBtYXBfaHZhKQogKiBt bV9yZW1vdGVfdW5tYXAodW5zaWduZWQgbG9uZyBtYXBfaHZhKQogKiBtbV9yZW1vdGVfcmVzZXQo dm9pZCkKICogcm1hcF93YWxrX3JlbW90ZShzdHJ1Y3QgcGFnZSAqcGFnZSwKICAgICAgICAgICAg ICAgICAgICBzdHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgKnJ3YykKClRoaXMgcGF0Y2ggYWxsb3dz IG9uZSBwcm9jZXNzIHRvIG1hcCBpbnRvIGl0cyBhZGRyZXNzIHNwYWNlIGEgcGFnZSBmcm9tCmFu b3RoZXIgcHJvY2Vzcy4gVGhlIHByZXZpb3VzIHBhZ2UgKGlmIGl0IGV4aXN0cykgaXMgZHJvcHBl ZC4gVGhlcmUgaXMKbm8gY29ycmVzcG9uZGluZyBwYWlyIG9mIHN5c3RlbSBjYWxscyBhcyB0aGlz IEFQSSBpcyBtZWFudCB0byBiZSB1c2VkCmJ5IHRoZSBrZXJuZWwgaXRzZWxmIG9ubHkuCgpUaGUg dGFyZ2V0ZWQgdXNlciBpcyB0aGUgdXBjb21pbmcgS1ZNIFZNIGludHJvc3BlY3Rpb24gc3Vic3lz dGVtIChLVk1JKSwKd2hlcmUgYW4gaW50cm9zcGVjdG9yIHJ1bm5pbmcgaW4gaXRzIG93biBWTSB3 aWxsIG1hcCBwYWdlcyBmcm9tIHRoZQppbnRyb3NwZWN0ZWQgZ3Vlc3QgaW4gb3JkZXIgdG8gZWxp bWluYXRlIHJvdW5kIHRyaXBzIHRvIHRoZSBob3N0IGtlcm5lbAoocmVhZC93cml0ZSBndWVzdCBw YWdlcykuCgpUaGUgZmxvdyBpcyBhcyBmb2xsb3dzOiB0aGUgaW50cm9zcGVjdG9yIGlkZW50aWZp ZXMgYSBndWVzdCBwaHlzaWNhbAphZGRyZXNzIHdoZXJlIHNvbWUgaW5mb3JtYXRpb24gb2YgaW50 ZXJlc3QgaXMgbG9jYXRlZC4gSXQgY3JlYXRlcyBhIG9uZQpwYWdlIGFub255bW91cyBtYXBwaW5n IHdpdGggTUFQX0xPQ0tFRCB8IE1BUF9QT1BVTEFURSBhbmQgY2FsbHMgdGhlCmtlcm5lbCB2aWEg YW4gSU9DVEwgb24gL2Rldi9rdm1tZW0gZ2l2aW5nIHRoZSBtYXAgdmlydHVhbCBhZGRyZXNzIGFu ZAp0aGUgZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBhcyBhcmd1bWVudHMuIFRoZSBrZXJuZWwgY29u dmVydHMgdGhlIG1hcAp2YSBpbnRvIGEgcGh5c2ljYWwgcGFnZSAoZ3BhIGluIEtWTS1zcGVhaykg YW5kIHBhc3NlcyBpdCB0byB0aGUgaG9zdAprZXJuZWwgdmlhIGEgaHlwZXJjYWxsLCBhbG9uZyB3 aXRoIHRoZSBpbnRyb3NwZWN0ZWQgZ3Vlc3QgZ3BhLiBUaGUgaG9zdAprZXJuZWwgY29udmVydHMg dGhlIHR3byBncGEtcyBpbnRvIHRoZWlyIGFwcHJvcHJpYXRlIGh2YS1zIChob3N0IHZpcnR1YWwK YWRkcmVzc2VzKSBhbmQgbWFrZXMgc3VyZSB0aGUgdm1hIGJhY2tpbmcgdXAgdGhlIHBhZ2UgYmVs b25naW5nIHRvIHRoZSBWTQppbiB3aGljaCB0aGUgaW50cm9zcGVjdG9yIHJ1bnMsIHBvaW50cyB0 byB0aGUgaW5kaWNhdGVkIHBhZ2UgaW50byB0aGUKaW50cm9zcGVjdGVkIGd1ZXN0LiBJIGhhdmUg bm90IGluY2x1ZGVkIGhlcmUgdGhlIHVzZSBvZiB0aGUgbWFwcGluZwp0b2tlbiBkZXNjcmliZWQg aW4gdGhlIEtWTUkgZG9jdW1lbnRhdGlvbi4KClNpZ25lZC1vZmYtYnk6IE1pcmNlYSBDw65yamFs aXUgPG1jaXJqYWxpdUBiaXRkZWZlbmRlci5jb20+ClNpZ25lZC1vZmYtYnk6IEFkYWxiZXJ0IExh esSDciA8YWxhemFyQGJpdGRlZmVuZGVyLmNvbT4KLS0tCiBpbmNsdWRlL2xpbnV4L3BhZ2UtZmxh Z3MuaCAgICAgICAgICB8ICAgIDkgKy0KIGluY2x1ZGUvbGludXgvcmVtb3RlX21hcHBpbmcuaCAg ICAgIHwgIDE2NyArKysKIGluY2x1ZGUvdWFwaS9saW51eC9yZW1vdGVfbWFwcGluZy5oIHwgICAx OCArCiBtbS9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDggKwogbW0vTWFr ZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxICsKIG1tL21lbW9yeS1mYWlsdXJl LmMgICAgICAgICAgICAgICAgIHwgICA2OSArLQogbW0vbWlncmF0ZS5jICAgICAgICAgICAgICAg ICAgICAgICAgfCAgICA5ICstCiBtbS9yZW1vdGVfbWFwcGluZy5jICAgICAgICAgICAgICAgICB8 IDE4MzQgKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBtbS9ybWFwLmMgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgMTMgKy0KIG1tL3Ztc2Nhbi5jICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgMyArLQogMTAgZmlsZXMgY2hhbmdlZCwgMjEwOCBpbnNlcnRpb25zKCspLCAyMyBk ZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL2xpbnV4L3JlbW90ZV9tYXBw aW5nLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL3VhcGkvbGludXgvcmVtb3RlX21hcHBp bmcuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IG1tL3JlbW90ZV9tYXBwaW5nLmMKCmRpZmYgLS1naXQg YS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaCBiL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5o CmluZGV4IDM5YjQ0OTRlMjlmMS4uM2Y2NWIyODMzNTYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xp bnV4L3BhZ2UtZmxhZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaApAQCAtNDE3 LDggKzQxNywxMCBAQCBQQUdFRkxBRyhJZGxlLCBpZGxlLCBQRl9BTlkpCiAgKi8KICNkZWZpbmUg UEFHRV9NQVBQSU5HX0FOT04JMHgxCiAjZGVmaW5lIFBBR0VfTUFQUElOR19NT1ZBQkxFCTB4Mgor I2RlZmluZSBQQUdFX01BUFBJTkdfUkVNT1RFCTB4NAogI2RlZmluZSBQQUdFX01BUFBJTkdfS1NN CShQQUdFX01BUFBJTkdfQU5PTiB8IFBBR0VfTUFQUElOR19NT1ZBQkxFKQotI2RlZmluZSBQQUdF X01BUFBJTkdfRkxBR1MJKFBBR0VfTUFQUElOR19BTk9OIHwgUEFHRV9NQVBQSU5HX01PVkFCTEUp CisjZGVmaW5lIFBBR0VfTUFQUElOR19GTEFHUwkoUEFHRV9NQVBQSU5HX0FOT04gfCBQQUdFX01B UFBJTkdfTU9WQUJMRSB8IFwKKwkJCQkgUEFHRV9NQVBQSU5HX1JFTU9URSkKIAogc3RhdGljIF9f YWx3YXlzX2lubGluZSBpbnQgUGFnZU1hcHBpbmdGbGFncyhzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsK QEAgLTQzMSw2ICs0MzMsMTEgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgUGFnZUFub24o c3RydWN0IHBhZ2UgKnBhZ2UpCiAJcmV0dXJuICgodW5zaWduZWQgbG9uZylwYWdlLT5tYXBwaW5n ICYgUEFHRV9NQVBQSU5HX0FOT04pICE9IDA7CiB9CiAKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUg aW50IFBhZ2VSZW1vdGUoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuICgodW5zaWduZWQg bG9uZylwYWdlLT5tYXBwaW5nICYgUEFHRV9NQVBQSU5HX1JFTU9URSkgIT0gMDsKK30KKwogc3Rh dGljIF9fYWx3YXlzX2lubGluZSBpbnQgX19QYWdlTW92YWJsZShzdHJ1Y3QgcGFnZSAqcGFnZSkK IHsKIAlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKXBhZ2UtPm1hcHBpbmcgJiBQQUdFX01BUFBJTkdf RkxBR1MpID09CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlbW90ZV9tYXBwaW5nLmggYi9p bmNsdWRlL2xpbnV4L3JlbW90ZV9tYXBwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAwLi5kMzBkMGQxMGU1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xp bnV4L3JlbW90ZV9tYXBwaW5nLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBHUEwtMi4wICovCisjaWZuZGVmIF9SRU1PVEVfTUFQUElOR19ICisjZGVmaW5l IF9SRU1PVEVfTUFQUElOR19ICisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxp bnV4L3JtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9t bXVfbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWRlYnVnLmg+CisKK3N0cnVjdCBwYWdl X2RiIHsKKwlzdHJ1Y3QgbW1fc3RydWN0ICp0YXJnZXQ7CQkvKiB0YXJnZXQgZm9yIHRoaXMgbWFw cGluZyAqLworCXVuc2lnbmVkIGxvbmcgcmVxX2h2YTsJCQkvKiBIVkEgaW4gdGFyZ2V0ICovCisJ dW5zaWduZWQgbG9uZyBtYXBfaHZhOwkJCS8qIEhWQSBpbiBjbGllbnQgKi8KKworCXJlZmNvdW50 X3QgcmVmY250OwkJCS8qIGNsaWVudC1zaWRlIHNoYXJpbmcgKi8KKwlpbnQgZmxhZ3M7CisKKwkv KiB0YXJnZXQgbGlua3MgLSBzZXJpYWxpemVkIGJ5IHRhcmdldF9kYi0+bG9jayAqLworCXN0cnVj dCBsaXN0X2hlYWQgdGFyZ2V0X2xpbms7CQkvKiB0YXJnZXQtc2lkZSBsaW5rICovCisKKwkvKiBj bGllbnQgbGlua3MgLSBzZXJpYWxpemVkIGJ5IGNsaWVudF9kYi0+bG9jayAqLworCXN0cnVjdCBy Yl9ub2RlIGZpbGVfbGluazsJCS8qIHVzZXMgbWFwX2h2YSBhcyBrZXkgKi8KKworCS8qIHJtYXAg Y29tcG9uZW50cyAtIHNlcmlhbGl6ZWQgYnkgcGFnZSBsb2NrICovCisJc3RydWN0IGFub25fdm1h ICpyZXFfYW5vbl92bWE7CisJc3RydWN0IGFub25fdm1hICptYXBfYW5vbl92bWE7Cit9OworCitz dHJ1Y3QgdGFyZ2V0X2RiIHsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsJCS8qIG1tIG9mIHRoaXMg c3RydWN0ICovCisJc3RydWN0IGhsaXN0X25vZGUgZGJfbGluazsJLyogZGF0YWJhc2UgbGluayAq LworCisJc3RydWN0IG1tdV9ub3RpZmllciBtbjsJCS8qIGZvciBub3RpZmljYXRpb25zIGZyb20g bW0gKi8KKwlzdHJ1Y3QgcmN1X2hlYWQJcmN1OwkJLyogZm9yIGRlbGF5ZWQgZnJlZWluZyAqLwor CXJlZmNvdW50X3QgcmVmY250OworCisJc3BpbmxvY2tfdCBsb2NrOwkJLyogbG9jayBmb3IgdGhl IGZvbGxvd2luZyAqLworCXN0cnVjdCBtbV9zdHJ1Y3QgKmNsaWVudDsJLyogY2xpZW50IGZvciB0 aGlzIHRhcmdldCAqLworCXN0cnVjdCBsaXN0X2hlYWQgcGFnZXNfbGlzdDsJLyogbWFwcGVkIEhW QXMgZm9yIHRoaXMgdGFyZ2V0ICovCit9OworCitzdHJ1Y3QgZmlsZV9kYjsKK3N0cnVjdCBjbGll bnRfZGIgeworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwkJLyogbW0gb2YgdGhpcyBzdHJ1Y3QgKi8K KwlzdHJ1Y3QgaGxpc3Rfbm9kZSBkYl9saW5rOwkvKiBkYXRhYmFzZSBsaW5rICovCisKKwlzdHJ1 Y3QgbW11X25vdGlmaWVyIG1uOwkJLyogZm9yIG5vdGlmaWNhdGlvbnMgZnJvbSBtbSAqLworCXN0 cnVjdCByY3VfaGVhZAlyY3U7CQkvKiBmb3IgZGVsYXllZCBmcmVlaW5nICovCisJcmVmY291bnRf dCByZWZjbnQ7CisKKwlzdHJ1Y3QgZmlsZV9kYiAqcHNldWRvOwkJLyoga2VybmVsIGludGVyZmFj ZSAqLworfTsKKworc3RydWN0IGZpbGVfZGIgeworCXN0cnVjdCBjbGllbnRfZGIgKmNkYjsKKwor CXNwaW5sb2NrX3QgbG9jazsJCS8qIGxvY2sgZm9yIHRoZSBmb2xsb3dpbmcgKi8KKwlzdHJ1Y3Qg cmJfcm9vdCByYl9yb290OwkJLyogbWFwcGluZ3MgaW5kZXhlZCBieSBtYXBfaHZhICovCit9Owor CitzdGF0aWMgaW5saW5lIHZvaWQgKlBhZ2VNYXBwaW5nKHN0cnVjdCBwYWdlX2RiICpwZGIpCit7 CisJcmV0dXJuICh2b2lkICopcGRiICsgKFBBR0VfTUFQUElOR19BTk9OIHwgUEFHRV9NQVBQSU5H X1JFTU9URSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2VfZGIgKlJlbW90ZU1hcHBp bmcoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJVk1fQlVHX09OX1BBR0UoIVBhZ2VSZW1vdGUocGFn ZSksIHBhZ2UpOworCXJldHVybiAodm9pZCAqKSgodW5zaWduZWQgbG9uZylwYWdlLT5tYXBwaW5n ICYgflBBR0VfTUFQUElOR19GTEFHUyk7Cit9CisKKy8qCisgKiBUZW1wbGF0ZSBmb3Iga2V5ZWQg UkIgdHJlZS4KKyAqCisgKiBSQkNUWVBFCXR5cGUgb2YgY29udGFpbmVyIHN0cnVjdHVyZQorICog X3JiX3Jvb3QJbmFtZSBvZiByYl9yb290IGVsZW1lbnQKKyAqIFJCTlRZUEUJdHlwZSBvZiBub2Rl IHN0cnVjdHVyZQorICogX3JiX25vZGUJbmFtZSBvZiByYl9ub2RlIGVsZW1lbnQKKyAqIF9rZXkJ CW5hbWUgb2Yga2V5IGVsZW1lbnQKKyAqLworCisjZGVmaW5lIEtFWUVEX1JCX1RSRUUoUkJQUkVG SVgsIFJCQ1RZUEUsIF9yYl9yb290LCBSQk5UWVBFLCBfcmJfbm9kZSwgX2tleSlcCisJCQkJCQkJ CQlcCitzdGF0aWMgYm9vbCBSQlBSRUZJWCAjIyBfaW5zZXJ0KFJCQ1RZUEUgKiBfY29udGFpbmVy LCBSQk5UWVBFICogX25vZGUpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHJiX3Jvb3QgKnJvb3Qg PSAmX2NvbnRhaW5lci0+X3JiX3Jvb3Q7CQkJXAorCXN0cnVjdCByYl9ub2RlICoqbmV3ID0gJnJv b3QtPnJiX25vZGU7CQkJCVwKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsJCQkJCVwK KwkJCQkJCQkJCVwKKwkvKiBGaWd1cmUgb3V0IHdoZXJlIHRvIHB1dCBuZXcgbm9kZSAqLwkJCQlc CisJd2hpbGUgKCpuZXcpIHsJCQkJCQkJXAorCQlSQk5UWVBFICp0aGlzID0gcmJfZW50cnkoKm5l dywgUkJOVFlQRSwgX3JiX25vZGUpOwlcCisJCQkJCQkJCQlcCisJCXBhcmVudCA9ICpuZXc7CQkJ CQkJXAorCQlpZiAoX25vZGUtPl9rZXkgPCB0aGlzLT5fa2V5KQkJCQlcCisJCQluZXcgPSAmKCgq bmV3KS0+cmJfbGVmdCk7CQkJXAorCQllbHNlIGlmIChfbm9kZS0+X2tleSA+IHRoaXMtPl9rZXkp CQkJXAorCQkJbmV3ID0gJigoKm5ldyktPnJiX3JpZ2h0KTsJCQlcCisJCWVsc2UJCQkJCQkJXAor CQkJcmV0dXJuIGZhbHNlOwkJCQkJXAorCX0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwkvKiBBZGQg bmV3IG5vZGUgYW5kIHJlYmFsYW5jZSB0cmVlLiAqLwkJCQlcCisJcmJfbGlua19ub2RlKCZfbm9k ZS0+X3JiX25vZGUsIHBhcmVudCwgbmV3KTsJCQlcCisJcmJfaW5zZXJ0X2NvbG9yKCZfbm9kZS0+ X3JiX25vZGUsIHJvb3QpOwkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gdHJ1ZTsJCQkJCQkJXAor fQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBSQk5UWVBFICoJCQkJCQkJXAorUkJQUkVG SVggIyMgX3NlYXJjaChSQkNUWVBFICogX2NvbnRhaW5lciwgdW5zaWduZWQgbG9uZyBfa2V5KQkJ XAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgcmJfcm9vdCAqcm9vdCA9ICZfY29udGFpbmVyLT5fcmJf cm9vdDsJCQlcCisJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByb290LT5yYl9ub2RlOwkJCQlcCisJ CQkJCQkJCQlcCisJd2hpbGUgKG5vZGUpIHsJCQkJCQkJXAorCQlSQk5UWVBFICpfbm9kZSA9IHJi X2VudHJ5KG5vZGUsIFJCTlRZUEUsIF9yYl9ub2RlKTsJXAorCQkJCQkJCQkJXAorCQlpZiAoX2tl eSA8IF9ub2RlLT5fa2V5KQkJCQkJXAorCQkJbm9kZSA9IG5vZGUtPnJiX2xlZnQ7CQkJCVwKKwkJ ZWxzZSBpZiAoX2tleSA+IF9ub2RlLT5fa2V5KQkJCQlcCisJCQlub2RlID0gbm9kZS0+cmJfcmln aHQ7CQkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQlyZXR1cm4gX25vZGU7CQkJCQlcCisJfQkJCQkJ CQkJXAorCQkJCQkJCQkJXAorCXJldHVybiBOVUxMOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCQkJ CQkJCQkJXAorc3RhdGljIHZvaWQgUkJQUkVGSVggIyMgX3JlbW92ZShSQkNUWVBFICpfY29udGFp bmVyLCBSQk5UWVBFICpfbm9kZSkJXAorewkJCQkJCQkJCVwKKwlyYl9lcmFzZSgmX25vZGUtPl9y Yl9ub2RlLCAmX2NvbnRhaW5lci0+X3JiX3Jvb3QpOwkJXAorCVJCX0NMRUFSX05PREUoJl9ub2Rl LT5fcmJfbm9kZSk7CQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgYm9vbCBS QlBSRUZJWCAjIyBfZW1wdHkoY29uc3QgUkJDVFlQRSAqX2NvbnRhaW5lcikJCVwKK3sJCQkJCQkJ CQlcCisJcmV0dXJuIFJCX0VNUFRZX1JPT1QoJl9jb250YWluZXItPl9yYl9yb290KTsJCQlcCit9 CQkJCQkJCQkJXAorCisjaWZkZWYgQ09ORklHX1JFTU9URV9NQVBQSU5HCitleHRlcm4gaW50IG1t X3JlbW90ZV9tYXAoc3RydWN0IG1tX3N0cnVjdCAqcmVxX21tLAorCQkJIHVuc2lnbmVkIGxvbmcg cmVxX2h2YSwgdW5zaWduZWQgbG9uZyBtYXBfaHZhKTsKK2V4dGVybiBpbnQgbW1fcmVtb3RlX3Vu bWFwKHVuc2lnbmVkIGxvbmcgbWFwX2h2YSk7CitleHRlcm4gdm9pZCBtbV9yZW1vdGVfcmVzZXQo dm9pZCk7CitleHRlcm4gdm9pZCBybWFwX3dhbGtfcmVtb3RlKHN0cnVjdCBwYWdlICpwYWdlLCBz dHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgKnJ3Yyk7CisjZWxzZSAvKiBDT05GSUdfUkVNT1RFX01B UFBJTkcgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG1tX3JlbW90ZV9tYXAoc3RydWN0IG1tX3N0cnVj dCAqcmVxX21tLAorCQkJCXVuc2lnbmVkIGxvbmcgcmVxX2h2YSwgdW5zaWduZWQgbG9uZyBtYXBf aHZhKQoreworCXJldHVybiAtRUlOVkFMOworfQorc3RhdGljIGlubGluZSBpbnQgbW1fcmVtb3Rl X3VubWFwKHVuc2lnbmVkIGxvbmcgbWFwX2h2YSkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KK3N0 YXRpYyBpbmxpbmUgdm9pZCBtbV9yZW1vdGVfcmVzZXQodm9pZCkKK3sKK30KK3N0YXRpYyBpbmxp bmUgdm9pZCBybWFwX3dhbGtfcmVtb3RlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgICBzdHJ1 Y3Qgcm1hcF93YWxrX2NvbnRyb2wgKnJ3YykKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfUkVNT1RF X01BUFBJTkcgKi8KKworI2VuZGlmIC8qIF9SRU1PVEVfTUFQUElOR19IICovCmRpZmYgLS1naXQg YS9pbmNsdWRlL3VhcGkvbGludXgvcmVtb3RlX21hcHBpbmcuaCBiL2luY2x1ZGUvdWFwaS9saW51 eC9yZW1vdGVfbWFwcGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw MC4uZDhiNTQ0ZGQ1YWRkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3Jl bW90ZV9tYXBwaW5nLmgKQEAgLTAsMCArMSwxOCBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IEdQTC0yLjAgV0lUSCBMaW51eC1zeXNjYWxsLW5vdGUgKi8KKworI2lmbmRlZiBfX1VBUElf UkVNT1RFX01BUFBJTkdfSF9fCisjZGVmaW5lIF9fVUFQSV9SRU1PVEVfTUFQUElOR19IX18KKwor I2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworc3Ry dWN0IHJlbW90ZV9tYXBfcmVxdWVzdCB7CisJX191MzIgcmVxX3BpZDsKKwlfX3U2NCByZXFfaHZh OworCV9fdTY0IG1hcF9odmE7Cit9OworCisjZGVmaW5lIFJFTU9URV9NQVAgICAgICAgX0lPVygn cicsIDB4MDEsIHN0cnVjdCByZW1vdGVfbWFwX3JlcXVlc3QpCisjZGVmaW5lIFJFTU9URV9VTk1B UCAgICAgX0lPVygncicsIDB4MDIsIHVuc2lnbmVkIGxvbmcpCisKKyNlbmRpZiAvKiBfX1VBUElf UkVNT1RFX01BUFBJTkdfSF9fICovCmRpZmYgLS1naXQgYS9tbS9LY29uZmlnIGIvbW0vS2NvbmZp ZwppbmRleCAyNWM3MWViOGE3ZGIuLjg0NTFkYWZkM2M5MSAxMDA2NDQKLS0tIGEvbW0vS2NvbmZp ZworKysgYi9tbS9LY29uZmlnCkBAIC03NTgsNCArNzU4LDEyIEBAIGNvbmZpZyBHVVBfQkVOQ0hN QVJLCiBjb25maWcgQVJDSF9IQVNfUFRFX1NQRUNJQUwKIAlib29sCiAKK2NvbmZpZyBSRU1PVEVf TUFQUElORworCWJvb2wgIlJlbW90ZSBtZW1vcnkgbWFwcGluZyIKKwlkZXBlbmRzIG9uIE1NVSAm JiAhS1NNCisJZGVmYXVsdCBuCisJaGVscAorCSAgQWxsb3dzIGEgZ2l2ZW4gYXBwbGljYXRpb24g dG8gbWFwIHBhZ2VzIG9mIGFub3RoZXIgYXBwbGljYXRpb24gaW4gaXRzIG93bgorCSAgYWRkcmVz cyBzcGFjZS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvbW0vTWFrZWZpbGUgYi9tbS9NYWtlZmls ZQppbmRleCBkMjEwY2M5ZDZmODAuLmU2OWEzYjE1NjI3YSAxMDA2NDQKLS0tIGEvbW0vTWFrZWZp bGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTk5LDMgKzk5LDQgQEAgb2JqLSQoQ09ORklHX0hBUkRF TkVEX1VTRVJDT1BZKSArPSB1c2VyY29weS5vCiBvYmotJChDT05GSUdfUEVSQ1BVX1NUQVRTKSAr PSBwZXJjcHUtc3RhdHMubwogb2JqLSQoQ09ORklHX0hNTSkgKz0gaG1tLm8KIG9iai0kKENPTkZJ R19NRU1GRF9DUkVBVEUpICs9IG1lbWZkLm8KK29iai0kKENPTkZJR19SRU1PVEVfTUFQUElORykg Kz0gcmVtb3RlX21hcHBpbmcubwpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LWZhaWx1cmUuYyBiL21t L21lbW9yeS1mYWlsdXJlLmMKaW5kZXggODMxYmU1ZmY1ZjRkLi40MDA2NjI3MWM0MTEgMTAwNjQ0 Ci0tLSBhL21tL21lbW9yeS1mYWlsdXJlLmMKKysrIGIvbW0vbWVtb3J5LWZhaWx1cmUuYwpAQCAt OSwxNiArOSwxNiBAQAogICogSGlnaCBsZXZlbCBtYWNoaW5lIGNoZWNrIGhhbmRsZXIuIEhhbmRs ZXMgcGFnZXMgcmVwb3J0ZWQgYnkgdGhlCiAgKiBoYXJkd2FyZSBhcyBiZWluZyBjb3JydXB0ZWQg dXN1YWxseSBkdWUgdG8gYSBtdWx0aS1iaXQgRUNDIG1lbW9yeSBvciBjYWNoZQogICogZmFpbHVy ZS4KLSAqIAorICoKICAqIEluIGFkZGl0aW9uIHRoZXJlIGlzIGEgInNvZnQgb2ZmbGluZSIgZW50 cnkgcG9pbnQgdGhhdCBhbGxvd3Mgc3RvcCB1c2luZwogICogbm90LXlldC1jb3JydXB0ZWQtYnkt c3VzcGljaW91cyBwYWdlcyB3aXRob3V0IGtpbGxpbmcgYW55dGhpbmcuCiAgKgogICogSGFuZGxl cyBwYWdlIGNhY2hlIHBhZ2VzIGluIHZhcmlvdXMgc3RhdGVzLglUaGUgdHJpY2t5IHBhcnQKLSAq IGhlcmUgaXMgdGhhdCB3ZSBjYW4gYWNjZXNzIGFueSBwYWdlIGFzeW5jaHJvbm91c2x5IGluIHJl c3BlY3QgdG8gCi0gKiBvdGhlciBWTSB1c2VycywgYmVjYXVzZSBtZW1vcnkgZmFpbHVyZXMgY291 bGQgaGFwcGVuIGFueXRpbWUgYW5kIAotICogYW55d2hlcmUuIFRoaXMgY291bGQgdmlvbGF0ZSBz b21lIG9mIHRoZWlyIGFzc3VtcHRpb25zLiBUaGlzIGlzIHdoeSAKLSAqIHRoaXMgY29kZSBoYXMg dG8gYmUgZXh0cmVtZWx5IGNhcmVmdWwuIEdlbmVyYWxseSBpdCB0cmllcyB0byB1c2UgCi0gKiBu b3JtYWwgbG9ja2luZyBydWxlcywgYXMgaW4gZ2V0IHRoZSBzdGFuZGFyZCBsb2NrcywgZXZlbiBp ZiB0aGF0IG1lYW5zIAorICogaGVyZSBpcyB0aGF0IHdlIGNhbiBhY2Nlc3MgYW55IHBhZ2UgYXN5 bmNocm9ub3VzbHkgaW4gcmVzcGVjdCB0bworICogb3RoZXIgVk0gdXNlcnMsIGJlY2F1c2UgbWVt b3J5IGZhaWx1cmVzIGNvdWxkIGhhcHBlbiBhbnl0aW1lIGFuZAorICogYW55d2hlcmUuIFRoaXMg Y291bGQgdmlvbGF0ZSBzb21lIG9mIHRoZWlyIGFzc3VtcHRpb25zLiBUaGlzIGlzIHdoeQorICog dGhpcyBjb2RlIGhhcyB0byBiZSBleHRyZW1lbHkgY2FyZWZ1bC4gR2VuZXJhbGx5IGl0IHRyaWVz IHRvIHVzZQorICogbm9ybWFsIGxvY2tpbmcgcnVsZXMsIGFzIGluIGdldCB0aGUgc3RhbmRhcmQg bG9ja3MsIGV2ZW4gaWYgdGhhdCBtZWFucwogICogdGhlIGVycm9yIGhhbmRsaW5nIHRha2VzIHBv dGVudGlhbGx5IGEgbG9uZyB0aW1lLgogICoKICAqIEl0IGNhbiBiZSB2ZXJ5IHRlbXB0aW5nIHRv IGFkZCBoYW5kbGluZyBmb3Igb2JzY3VyZSBjYXNlcyBoZXJlLgpAQCAtMjgsMTIgKzI4LDEyIEBA CiAgKiAgIGh0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvY2dpdC91dGlscy9jcHUvbWNlL21jZS10ZXN0 LmdpdC8KICAqIC0gVGhlIGNhc2UgYWN0dWFsbHkgc2hvd3MgdXAgYXMgYSBmcmVxdWVudCAodG9w IDEwKSBwYWdlIHN0YXRlIGluCiAgKiAgIHRvb2xzL3ZtL3BhZ2UtdHlwZXMgd2hlbiBydW5uaW5n IGEgcmVhbCB3b3JrbG9hZC4KLSAqIAorICoKICAqIFRoZXJlIGFyZSBzZXZlcmFsIG9wZXJhdGlv bnMgaGVyZSB3aXRoIGV4cG9uZW50aWFsIGNvbXBsZXhpdHkgYmVjYXVzZQotICogb2YgdW5zdWl0 YWJsZSBWTSBkYXRhIHN0cnVjdHVyZXMuIEZvciBleGFtcGxlIHRoZSBvcGVyYXRpb24gdG8gbWFw IGJhY2sgCi0gKiBmcm9tIFJNQVAgY2hhaW5zIHRvIHByb2Nlc3NlcyBoYXMgdG8gd2FsayB0aGUg Y29tcGxldGUgcHJvY2VzcyBsaXN0IGFuZCAKKyAqIG9mIHVuc3VpdGFibGUgVk0gZGF0YSBzdHJ1 Y3R1cmVzLiBGb3IgZXhhbXBsZSB0aGUgb3BlcmF0aW9uIHRvIG1hcCBiYWNrCisgKiBmcm9tIFJN QVAgY2hhaW5zIHRvIHByb2Nlc3NlcyBoYXMgdG8gd2FsayB0aGUgY29tcGxldGUgcHJvY2VzcyBs aXN0IGFuZAogICogaGFzIG5vbiBsaW5lYXIgY29tcGxleGl0eSB3aXRoIHRoZSBudW1iZXIuIEJ1 dCBzaW5jZSBtZW1vcnkgY29ycnVwdGlvbnMKLSAqIGFyZSByYXJlIHdlIGhvcGUgdG8gZ2V0IGF3 YXkgd2l0aCB0aGlzLiBUaGlzIGF2b2lkcyBpbXBhY3RpbmcgdGhlIGNvcmUgCisgKiBhcmUgcmFy ZSB3ZSBob3BlIHRvIGdldCBhd2F5IHdpdGggdGhpcy4gVGhpcyBhdm9pZHMgaW1wYWN0aW5nIHRo ZSBjb3JlCiAgKiBWTS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNTksNiAr NTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CiAjaW5jbHVkZSA8bGludXgvcmF0ZWxp bWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZS1pc29sYXRpb24uaD4KKyNpbmNsdWRlIDxsaW51 eC9yZW1vdGVfbWFwcGluZy5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAicmFz L3Jhc19ldmVudC5oIgogCkBAIC00NjcsNiArNDY4LDQ1IEBAIHN0YXRpYyB2b2lkIGNvbGxlY3Rf cHJvY3NfYW5vbihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqdG9fa2lsbCwK IAlwYWdlX3VubG9ja19hbm9uX3ZtYV9yZWFkKGF2KTsKIH0KIAorLyoKKyAqIENvbGxlY3QgcHJv Y2Vzc2VzIHdoZW4gdGhlIGVycm9yIGhpdCBhIHJlbW90ZSBtYXBwZWQgcGFnZS4KKyAqLworc3Rh dGljIHZvaWQgY29sbGVjdF9wcm9jc19yZW1vdGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBs aXN0X2hlYWQgKnRvX2tpbGwsCisJCQkJc3RydWN0IHRvX2tpbGwgKip0a2MsIGludCBmb3JjZV9l YXJseSkKK3sKKwlzdHJ1Y3QgcGFnZV9kYiAqcGRiOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAq dm1hOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCXN0cnVjdCBhbm9uX3ZtYSAqYXY7CisJ cGdvZmZfdCBwZ29mZjsKKworCXBkYiA9IFJlbW90ZU1hcHBpbmcocGFnZSk7CisJYXYgPSBwZGIt PnJlcV9hbm9uX3ZtYTsKKwlpZiAoYXYgPT0gTlVMTCkJCQkvKiBUYXJnZXQgaGFzIGxlZnQgKi8K KwkJcmV0dXJuOworCisJcGdvZmYgPSBwYWdlX3RvX3Bnb2ZmKHBhZ2UpOwkvKiBPZmZzZXQgaW4g dGFyZ2V0ICovCisJYW5vbl92bWFfbG9ja19yZWFkKGF2KTsKKwlyZWFkX2xvY2soJnRhc2tsaXN0 X2xvY2spOworCWZvcl9lYWNoX3Byb2Nlc3ModHNrKSB7CisJCXN0cnVjdCBhbm9uX3ZtYV9jaGFp biAqdm1hYzsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0ID0gdGFza19lYXJseV9raWxsKHRzaywg Zm9yY2VfZWFybHkpOworCisJCWlmICghdCkKKwkJCWNvbnRpbnVlOworCQlhbm9uX3ZtYV9pbnRl cnZhbF90cmVlX2ZvcmVhY2godm1hYywgJmF2LT5yYl9yb290LAorCQkJcGdvZmYsIHBnb2ZmKSB7 CisJCQl2bWEgPSB2bWFjLT52bWE7CisJCQlpZiAoIXBhZ2VfbWFwcGVkX2luX3ZtYShwYWdlLCB2 bWEpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHZtYS0+dm1fbW0gPT0gdC0+bW0pCisJCQkJYWRk X3RvX2tpbGwodCwgcGFnZSwgdm1hLCB0b19raWxsLCB0a2MpOworCQl9CisJfQorCXJlYWRfdW5s b2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlhbm9uX3ZtYV91bmxvY2tfcmVhZChhdik7Cit9CisKIC8q CiAgKiBDb2xsZWN0IHByb2Nlc3NlcyB3aGVuIHRoZSBlcnJvciBoaXQgYSBmaWxlIG1hcHBlZCBw YWdlLgogICovCkBAIC01MTksOSArNTU5LDEyIEBAIHN0YXRpYyB2b2lkIGNvbGxlY3RfcHJvY3Mo c3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKnRva2lsbCwKIAl0ayA9IGttYWxs b2Moc2l6ZW9mKHN0cnVjdCB0b19raWxsKSwgR0ZQX05PSU8pOwogCWlmICghdGspCiAJCXJldHVy bjsKLQlpZiAoUGFnZUFub24ocGFnZSkpCi0JCWNvbGxlY3RfcHJvY3NfYW5vbihwYWdlLCB0b2tp bGwsICZ0aywgZm9yY2VfZWFybHkpOwotCWVsc2UKKwlpZiAoUGFnZUFub24ocGFnZSkpIHsKKwkJ aWYgKFBhZ2VSZW1vdGUocGFnZSkpCisJCQljb2xsZWN0X3Byb2NzX3JlbW90ZShwYWdlLCB0b2tp bGwsICZ0aywgZm9yY2VfZWFybHkpOworCQllbHNlCisJCQljb2xsZWN0X3Byb2NzX2Fub24ocGFn ZSwgdG9raWxsLCAmdGssIGZvcmNlX2Vhcmx5KTsKKwl9IGVsc2UKIAkJY29sbGVjdF9wcm9jc19m aWxlKHBhZ2UsIHRva2lsbCwgJnRrLCBmb3JjZV9lYXJseSk7CiAJa2ZyZWUodGspOwogfQpkaWZm IC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jCmluZGV4IGQ0ZmQ2ODBiZTNiMC4u NGQxOGE4MTE1ZmZjIDEwMDY0NAotLS0gYS9tbS9taWdyYXRlLmMKKysrIGIvbW0vbWlncmF0ZS5j CkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZV9vd25lci5oPgogI2luY2x1 ZGUgPGxpbnV4L3NjaGVkL21tLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVk ZSA8bGludXgvcmVtb3RlX21hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgog CkBAIC0yMTUsNyArMjE2LDcgQEAgc3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGUoc3Ry dWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCiAJVk1fQlVHX09O X1BBR0UoUGFnZVRhaWwocGFnZSksIHBhZ2UpOwogCXdoaWxlIChwYWdlX3ZtYV9tYXBwZWRfd2Fs aygmcHZtdykpIHsKLQkJaWYgKFBhZ2VLc20ocGFnZSkpCisJCWlmIChQYWdlS3NtKHBhZ2UpIHx8 IFBhZ2VSZW1vdGUocGFnZSkpCiAJCQluZXcgPSBwYWdlOwogCQllbHNlCiAJCQluZXcgPSBwYWdl IC0gcHZtdy5wYWdlLT5pbmRleCArCkBAIC0xMDY1LDcgKzEwNjYsNyBAQCBzdGF0aWMgaW50IF9f dW5tYXBfYW5kX21vdmUoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBwYWdlICpuZXdwYWdlLAog CSAqIGJlY2F1c2UgdGhhdCBpbXBsaWVzIHRoYXQgdGhlIGFub24gcGFnZSBpcyBubyBsb25nZXIg bWFwcGVkCiAJICogKGFuZCBjYW5ub3QgYmUgcmVtYXBwZWQgc28gbG9uZyBhcyB3ZSBob2xkIHRo ZSBwYWdlIGxvY2spLgogCSAqLwotCWlmIChQYWdlQW5vbihwYWdlKSAmJiAhUGFnZUtzbShwYWdl KSkKKwlpZiAoUGFnZUFub24ocGFnZSkgJiYgIVBhZ2VLc20ocGFnZSkgJiYgIVBhZ2VSZW1vdGUo cGFnZSkpCiAJCWFub25fdm1hID0gcGFnZV9nZXRfYW5vbl92bWEocGFnZSk7CiAKIAkvKgpAQCAt MTEwNCw4ICsxMTA1LDggQEAgc3RhdGljIGludCBfX3VubWFwX2FuZF9tb3ZlKHN0cnVjdCBwYWdl ICpwYWdlLCBzdHJ1Y3QgcGFnZSAqbmV3cGFnZSwKIAkJfQogCX0gZWxzZSBpZiAocGFnZV9tYXBw ZWQocGFnZSkpIHsKIAkJLyogRXN0YWJsaXNoIG1pZ3JhdGlvbiBwdGVzICovCi0JCVZNX0JVR19P Tl9QQUdFKFBhZ2VBbm9uKHBhZ2UpICYmICFQYWdlS3NtKHBhZ2UpICYmICFhbm9uX3ZtYSwKLQkJ CQlwYWdlKTsKKwkJVk1fQlVHX09OX1BBR0UoUGFnZUFub24ocGFnZSkgJiYgIVBhZ2VLc20ocGFn ZSkgJiYKKwkJCQkhUGFnZVJlbW90ZShwYWdlKSAmJiAhYW5vbl92bWEsIHBhZ2UpOwogCQl0cnlf dG9fdW5tYXAocGFnZSwKIAkJCVRUVV9NSUdSQVRJT058VFRVX0lHTk9SRV9NTE9DS3xUVFVfSUdO T1JFX0FDQ0VTUyk7CiAJCXBhZ2Vfd2FzX21hcHBlZCA9IDE7CmRpZmYgLS1naXQgYS9tbS9yZW1v dGVfbWFwcGluZy5jIGIvbW0vcmVtb3RlX21hcHBpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMDAuLjE0YjBkYjg5YzQyNQotLS0gL2Rldi9udWxsCisrKyBiL21tL3Jl bW90ZV9tYXBwaW5nLmMKQEAgLTAsMCArMSwxODM0IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMAorLyoKKyAqIFJlbW90ZSBtZW1vcnkgbWFwcGluZy4KKyAqCisgKiBDb3B5 cmlnaHQgKEMpIDIwMTctMjAxOSBCaXRkZWZlbmRlciBTLlIuTC4KKyAqCisgKiBBdXRob3I6Cisg KiAgIE1pcmNlYSBDaXJqYWxpdSA8bWNpcmphbGl1QGJpdGRlZmVuZGVyLmNvbT4KKyAqLworI2Rl ZmluZSBwcl9mbXQoZm10KQlLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGlu dXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Nj aGVkLmg+CisjaW5jbHVkZSA8bGludXgvcm1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4K KyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5j bHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRl IDxsaW51eC9zd2Fwb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxp bnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGlk Lmg+CisjaW5jbHVkZSA8bGludXgvb29tLmg+CisjaW5jbHVkZSA8bGludXgvaHVnZV9tbS5oPgor I2luY2x1ZGUgPGxpbnV4L21tdV9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL21t Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJ2YWxfdHJlZV9nZW5lcmljLmg+CisjaW5jbHVkZSA8 bGludXgvaGFzaHRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVmY291bnQuaD4KKyNpbmNsdWRl IDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1 ZGUgPGxpbnV4L3JlbW90ZV9tYXBwaW5nLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9yZW1vdGVf bWFwcGluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBBU1NFUlQoZXhw KSBCVUdfT04oIShleHApKQorI2RlZmluZSBCVVNZX0JJVCAwCisjZGVmaW5lIE1BUFBFRF9CSVQg MQorCisjZGVmaW5lIFREQl9IQVNIX0JJVFMgNAorI2RlZmluZSBDREJfSEFTSF9CSVRTIDIKKwor c3RhdGljIGludCBtbV9yZW1vdGVfZG9fdW5tYXAoc3RydWN0IG1tX3N0cnVjdCAqbWFwX21tLCB1 bnNpZ25lZCBsb25nIG1hcF9odmEpOworc3RhdGljIGludCBtbV9yZW1vdGVfZG9fdW5tYXBfdGFy Z2V0KHN0cnVjdCBwYWdlX2RiICpwZGIpOworc3RhdGljIGludCBtbV9yZW1vdGVfbWFrZV9zdGFs ZShzdHJ1Y3QgcGFnZV9kYiAqcGRiKTsKKworc3RhdGljIHZvaWQgbW1fcmVtb3RlX2RiX3Rhcmdl dF9yZWxlYXNlKHN0cnVjdCB0YXJnZXRfZGIgKnRkYik7CitzdGF0aWMgdm9pZCBtbV9yZW1vdGVf ZGJfY2xpZW50X3JlbGVhc2Uoc3RydWN0IGNsaWVudF9kYiAqY2RiKTsKKworc3RhdGljIHZvaWQg dGRiX3JlbGVhc2Uoc3RydWN0IG1tdV9ub3RpZmllciAqbW4sIHN0cnVjdCBtbV9zdHJ1Y3QgKm1t KTsKK3N0YXRpYyB2b2lkIGNkYl9yZWxlYXNlKHN0cnVjdCBtbXVfbm90aWZpZXIgKm1uLCBzdHJ1 Y3QgbW1fc3RydWN0ICptbSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbW11X25vdGlmaWVyX29w cyB0ZGJfbm90aWZpZXJfb3BzID0geworCS5yZWxlYXNlID0gdGRiX3JlbGVhc2UsCit9OworCitz dGF0aWMgY29uc3Qgc3RydWN0IG1tdV9ub3RpZmllcl9vcHMgY2RiX25vdGlmaWVyX29wcyA9IHsK KwkucmVsZWFzZSA9IGNkYl9yZWxlYXNlLAorfTsKKworc3RhdGljIERFRklORV9IQVNIVEFCTEUo dGRiX2hhc2gsIFREQl9IQVNIX0JJVFMpOworc3RhdGljIERFRklORV9TUElOTE9DSyh0ZGJfbG9j ayk7CisKK3N0YXRpYyBERUZJTkVfSEFTSFRBQkxFKGNkYl9oYXNoLCBDREJfSEFTSF9CSVRTKTsK K3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2RiX2xvY2spOworCitzdGF0aWMgc3RydWN0IGttZW1f Y2FjaGUgKnBkYl9jYWNoZTsKK3N0YXRpYyBhdG9taWNfdCBwZGJfY291bnQgPSBBVE9NSUNfSU5J VCgwKTsKK3N0YXRpYyBhdG9taWNfdCBtYXBfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRp YyBhdG9taWNfdCBycGdfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKKworc3RhdGljIGF0b21pY190 IHN0YXRfZW1wdHlfcHRlID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgYXRvbWljX3Qgc3RhdF9t YXBwZWRfcHRlID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgYXRvbWljX3Qgc3RhdF9zd2FwX3B0 ZSA9IEFUT01JQ19JTklUKDApOworc3RhdGljIGF0b21pY190IHN0YXRfcmVmYXVsdCA9IEFUT01J Q19JTklUKDApOworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbW1fcmVtb3RlX2RlYnVnZnNfZGly OworCitzdGF0aWMgdm9pZCB0YXJnZXRfZGJfaW5pdChzdHJ1Y3QgdGFyZ2V0X2RiICp0ZGIpCit7 CisJdGRiLT5tbi5vcHMgPSAmdGRiX25vdGlmaWVyX29wczsKKwlyZWZjb3VudF9zZXQoJnRkYi0+ cmVmY250LCAwKTsKKworCXRkYi0+Y2xpZW50ID0gTlVMTDsKKwlJTklUX0xJU1RfSEVBRCgmdGRi LT5wYWdlc19saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmdGRiLT5sb2NrKTsKK30KKworc3RhdGlj IHN0cnVjdCB0YXJnZXRfZGIgKnRhcmdldF9kYl9hbGxvYyh2b2lkKQoreworCXN0cnVjdCB0YXJn ZXRfZGIgKnRkYjsKKworCXRkYiA9IGt6YWxsb2Moc2l6ZW9mKCp0ZGIpLCBHRlBfS0VSTkVMKTsK KwlpZiAodGRiICE9IE5VTEwpCisJCXRhcmdldF9kYl9pbml0KHRkYik7CisKKwlyZXR1cm4gdGRi OworfQorCitzdGF0aWMgdm9pZCB0YXJnZXRfZGJfZnJlZShzdHJ1Y3QgdGFyZ2V0X2RiICp0ZGIp Cit7CisJQVNTRVJUKHJlZmNvdW50X3JlYWQoJnRkYi0+cmVmY250KSA9PSAwKTsKKwlBU1NFUlQo bGlzdF9lbXB0eSgmdGRiLT5wYWdlc19saXN0KSk7CisKKwlrZnJlZSh0ZGIpOworfQorCitzdGF0 aWMgdm9pZCB0YXJnZXRfZGJfaW5zZXJ0KHN0cnVjdCB0YXJnZXRfZGIgKnRkYiwgc3RydWN0IHBh Z2VfZGIgKnBkYikKK3sKKwlsaXN0X2FkZCgmcGRiLT50YXJnZXRfbGluaywgJnRkYi0+cGFnZXNf bGlzdCk7Cit9CisKK3N0YXRpYyBib29sIHRhcmdldF9kYl9lbXB0eShjb25zdCBzdHJ1Y3QgdGFy Z2V0X2RiICp0ZGIpCit7CisJcmV0dXJuIGxpc3RfZW1wdHkoJnRkYi0+cGFnZXNfbGlzdCk7Cit9 CisKK3N0YXRpYyB2b2lkIHRhcmdldF9kYl9yZW1vdmUoc3RydWN0IHRhcmdldF9kYiAqdGRiLCBz dHJ1Y3QgcGFnZV9kYiAqcGRiKQoreworCWxpc3RfZGVsKCZwZGItPnRhcmdldF9saW5rKTsKK30K Kworc3RhdGljIHZvaWQgdGFyZ2V0X2RiX2ZyZWVfZGVsYXllZChzdHJ1Y3QgcmN1X2hlYWQgKnJj dSkKK3sKKwlzdHJ1Y3QgdGFyZ2V0X2RiICp0ZGIgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3Qg dGFyZ2V0X2RiLCByY3UpOworCisJcHJfZGVidWcoIiVzOiBmb3IgbW0gJTAxNmx4XG4iLCBfX2Z1 bmNfXywgKHVuc2lnbmVkIGxvbmcpdGRiLT5tbSk7CisKKwl0YXJnZXRfZGJfZnJlZSh0ZGIpOwor fQorCitzdGF0aWMgdm9pZCB0YXJnZXRfZGJfcHV0KHN0cnVjdCB0YXJnZXRfZGIgKnRkYikKK3sK KwlpZiAocmVmY291bnRfZGVjX2FuZF90ZXN0KCZ0ZGItPnJlZmNudCkpIHsKKwkJcHJfZGVidWco IiVzOiBtbSAlMDE2bHhcbiIsIF9fZnVuY19fLCAodW5zaWduZWQgbG9uZyl0ZGItPm1tKTsKKwor CQlzcGluX2xvY2soJnRkYl9sb2NrKTsKKwkJaGFzaF9kZWwoJnRkYi0+ZGJfbGluayk7CisJCXNw aW5fdW5sb2NrKCZ0ZGJfbG9jayk7CisKKwkJbW1fcmVtb3RlX2RiX3RhcmdldF9yZWxlYXNlKHRk Yik7CisKKwkJQVNTRVJUKHRhcmdldF9kYl9lbXB0eSh0ZGIpKTsKKworCQltbXVfbm90aWZpZXJf Y2FsbF9zcmN1KCZ0ZGItPnJjdSwgdGFyZ2V0X2RiX2ZyZWVfZGVsYXllZCk7CisJfQorfQorCitz dGF0aWMgc3RydWN0IHRhcmdldF9kYiAqdGFyZ2V0X2RiX2xvb2t1cChjb25zdCBzdHJ1Y3QgbW1f c3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgdGFyZ2V0X2RiICp0ZGI7CisKKwlzcGluX2xvY2soJnRk Yl9sb2NrKTsKKworCWhhc2hfZm9yX2VhY2hfcG9zc2libGUodGRiX2hhc2gsIHRkYiwgZGJfbGlu aywgKHVuc2lnbmVkIGxvbmcpbW0pCisJCWlmICh0ZGItPm1tID09IG1tICYmIHJlZmNvdW50X2lu Y19ub3RfemVybygmdGRiLT5yZWZjbnQpKQorCQkJYnJlYWs7CisKKwlzcGluX3VubG9jaygmdGRi X2xvY2spOworCisJcmV0dXJuIHRkYjsKK30KKworc3RhdGljIHN0cnVjdCB0YXJnZXRfZGIgKnRh cmdldF9kYl9sb29rdXBfb3JfYWRkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCB0 YXJnZXRfZGIgKnRkYiwgKmFsbG9jYXRlZDsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJaW50IHJl c3VsdDsKKworCWFsbG9jYXRlZCA9IHRhcmdldF9kYl9hbGxvYygpOwkvKiBtYXkgYmUgTlVMTCAq LworCisJc3Bpbl9sb2NrKCZ0ZGJfbG9jayk7CisKKwloYXNoX2Zvcl9lYWNoX3Bvc3NpYmxlKHRk Yl9oYXNoLCB0ZGIsIGRiX2xpbmssICh1bnNpZ25lZCBsb25nKW1tKQorCQlpZiAodGRiLT5tbSA9 PSBtbSAmJiByZWZjb3VudF9pbmNfbm90X3plcm8oJnRkYi0+cmVmY250KSkgeworCQkJZm91bmQg PSB0cnVlOworCQkJYnJlYWs7CisJCX0KKworCWlmICghZm91bmQgJiYgYWxsb2NhdGVkICE9IE5V TEwpIHsKKwkJdGRiID0gYWxsb2NhdGVkOworCQlhbGxvY2F0ZWQgPSBOVUxMOworCisJCXRkYi0+ bW0gPSBtbTsKKwkJaGFzaF9hZGQodGRiX2hhc2gsICZ0ZGItPmRiX2xpbmssICh1bnNpZ25lZCBs b25nKW1tKTsKKwkJcmVmY291bnRfc2V0KCZ0ZGItPnJlZmNudCwgMSk7CisJfQorCisJc3Bpbl91 bmxvY2soJnRkYl9sb2NrKTsKKworCWlmIChhbGxvY2F0ZWQgIT0gTlVMTCkKKwkJdGFyZ2V0X2Ri X2ZyZWUoYWxsb2NhdGVkKTsKKworCWlmIChmb3VuZCB8fCB0ZGIgPT0gTlVMTCkKKwkJcmV0dXJu IHRkYjsKKworCS8qCisJICogcmVnaXN0ZXIgYSBtbXUgbm90aWZpZXIgd2hlbiBhZGRpbmcgdGhp cyBlbnRyeSB0byB0aGUgbGlzdCAtIGF0IHRoaXMKKwkgKiBwb2ludCBvdGhlciB0aHJlYWRzIG1h eSBhbHJlYWR5IGhhdmUgaG9sZCBvZiB0aGlzIHRkYgorCSAqLworCXJlc3VsdCA9IG1tdV9ub3Rp Zmllcl9yZWdpc3RlcigmdGRiLT5tbiwgbW0pOworCWlmIChJU19FUlJfVkFMVUUoKGxvbmcpIHJl c3VsdCkpIHsKKwkJcHJfZXJyKCJtbXVfbm90aWZpZXJfcmVnaXN0ZXIoKSBmYWlsZWQ6ICVkXG4i LCByZXN1bHQpOworCisJCXRhcmdldF9kYl9wdXQodGRiKTsKKwkJcmV0dXJuIEVSUl9QVFIoKGxv bmcpIHJlc3VsdCk7CisJfQorCisJcHJfZGVidWcoIiVzOiBuZXcgZW50cnkgZm9yIG1tICUwMTZs eFxuIiwKKwkJX19mdW5jX18sICh1bnNpZ25lZCBsb25nKXRkYi0+bW0pOworCisJcmVmY291bnRf aW5jKCZ0ZGItPnJlZmNudCk7CisJcmV0dXJuIHRkYjsKK30KKworc3RhdGljIHZvaWQgY2xpZW50 X2RiX2luaXQoc3RydWN0IGNsaWVudF9kYiAqY2RiKQoreworCWNkYi0+bW0gPSBOVUxMOworCUlO SVRfSExJU1RfTk9ERSgmY2RiLT5kYl9saW5rKTsKKworCWNkYi0+bW4ub3BzID0gJmNkYl9ub3Rp Zmllcl9vcHM7CisJcmVmY291bnRfc2V0KCZjZGItPnJlZmNudCwgMCk7CisKKwljZGItPnBzZXVk byA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xpZW50X2RiICpjbGllbnRfZGJfYWxsb2Mo dm9pZCkKK3sKKwlzdHJ1Y3QgY2xpZW50X2RiICpjZGI7CisKKwljZGIgPSBremFsbG9jKHNpemVv ZigqY2RiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNkYiAhPSBOVUxMKQorCQljbGllbnRfZGJfaW5p dChjZGIpOworCisJcmV0dXJuIGNkYjsKK30KKworc3RhdGljIHZvaWQgY2xpZW50X2RiX2ZyZWUo c3RydWN0IGNsaWVudF9kYiAqY2RiKQoreworCUFTU0VSVChyZWZjb3VudF9yZWFkKCZjZGItPnJl ZmNudCkgPT0gMCk7CisKKwlrZnJlZShjZGIpOworfQorCitzdGF0aWMgdm9pZCBjbGllbnRfZGJf ZnJlZV9kZWxheWVkKHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCBjbGllbnRfZGIg KmNkYiA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBjbGllbnRfZGIsIHJjdSk7CisKKwlwcl9k ZWJ1ZygiJXM6IG1tICUwMTZseFxuIiwgX19mdW5jX18sICh1bnNpZ25lZCBsb25nKWNkYi0+bW0p OworCisJY2xpZW50X2RiX2ZyZWUoY2RiKTsKK30KKworc3RhdGljIHZvaWQgY2xpZW50X2RiX3B1 dChzdHJ1Y3QgY2xpZW50X2RiICpjZGIpCit7CisJaWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdCgm Y2RiLT5yZWZjbnQpKSB7CisJCXByX2RlYnVnKCIlczogbW0gJTAxNmx4XG4iLCBfX2Z1bmNfXywg KHVuc2lnbmVkIGxvbmcpY2RiLT5tbSk7CisKKwkJc3Bpbl9sb2NrKCZjZGJfbG9jayk7CisJCWhh c2hfZGVsKCZjZGItPmRiX2xpbmspOworCQlzcGluX3VubG9jaygmY2RiX2xvY2spOworCisJCW1t X3JlbW90ZV9kYl9jbGllbnRfcmVsZWFzZShjZGIpOworCisJCW1tdV9ub3RpZmllcl9jYWxsX3Ny Y3UoJmNkYi0+cmN1LCBjbGllbnRfZGJfZnJlZV9kZWxheWVkKTsKKwl9Cit9CisKK3N0YXRpYyBz dHJ1Y3QgY2xpZW50X2RiICpjbGllbnRfZGJfbG9va3VwKGNvbnN0IHN0cnVjdCBtbV9zdHJ1Y3Qg Km1tKQoreworCXN0cnVjdCBjbGllbnRfZGIgKmNkYjsKKworCXNwaW5fbG9jaygmY2RiX2xvY2sp OworCisJaGFzaF9mb3JfZWFjaF9wb3NzaWJsZShjZGJfaGFzaCwgY2RiLCBkYl9saW5rLCAodW5z aWduZWQgbG9uZyltbSkKKwkJaWYgKGNkYi0+bW0gPT0gbW0gJiYgcmVmY291bnRfaW5jX25vdF96 ZXJvKCZjZGItPnJlZmNudCkpCisJCQlicmVhazsKKworCXNwaW5fdW5sb2NrKCZjZGJfbG9jayk7 CisKKwlyZXR1cm4gY2RiOworfQorCisvLyBUT0RPOiBlYWNoIG1hcHBpbmcgcmVxdWVzdCBieSBk aXJlY3Qga2VybmVsIGludGVyZmFjZSBjYWxscyB0aGlzIGZ1bmN0aW9uCisvLyB0byBmaW5kIGl0 cyBtbSBhc3NvY2lhdGlvbi4gVGVtcG9yYXJ5IGFsbG9jYXRpbmcgYSBzdHJ1Y3QgY2xpZW50X2Ri IGZvciBlYWNoCisvLyBtYXBwaW5nIGF0dGVtcHQgbWF5IHBvc2UgYSBwZXJmb3JtYW5jZSBwcm9i bGVtLgorc3RhdGljIHN0cnVjdCBjbGllbnRfZGIgKmNsaWVudF9kYl9sb29rdXBfb3JfYWRkKHN0 cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCBjbGllbnRfZGIgKmNkYiwgKmFsbG9jYXRl ZDsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJaW50IHJlc3VsdDsKKworCWFsbG9jYXRlZCA9IGNs aWVudF9kYl9hbGxvYygpOwkvKiBtYXkgYmUgTlVMTCAqLworCisJc3Bpbl9sb2NrKCZjZGJfbG9j ayk7CisKKwloYXNoX2Zvcl9lYWNoX3Bvc3NpYmxlKGNkYl9oYXNoLCBjZGIsIGRiX2xpbmssICh1 bnNpZ25lZCBsb25nKW1tKQorCQlpZiAoY2RiLT5tbSA9PSBtbSAmJiByZWZjb3VudF9pbmNfbm90 X3plcm8oJmNkYi0+cmVmY250KSkgeworCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0K KworCWlmICghZm91bmQgJiYgYWxsb2NhdGVkICE9IE5VTEwpIHsKKwkJY2RiID0gYWxsb2NhdGVk OworCQlhbGxvY2F0ZWQgPSBOVUxMOworCisJCWNkYi0+bW0gPSBtbTsKKwkJaGFzaF9hZGQoY2Ri X2hhc2gsICZjZGItPmRiX2xpbmssICh1bnNpZ25lZCBsb25nKW1tKTsKKwkJcmVmY291bnRfc2V0 KCZjZGItPnJlZmNudCwgMSk7CisJfQorCisJc3Bpbl91bmxvY2soJmNkYl9sb2NrKTsKKworCWlm IChhbGxvY2F0ZWQgIT0gTlVMTCkKKwkJY2xpZW50X2RiX2ZyZWUoYWxsb2NhdGVkKTsKKworCWlm IChmb3VuZCB8fCBjZGIgPT0gTlVMTCkKKwkJcmV0dXJuIGNkYjsKKworCS8qCisJICogcmVnaXN0 ZXIgYSBtbXUgbm90aWZpZXIgd2hlbiBhZGRpbmcgdGhpcyBlbnRyeSB0byB0aGUgbGlzdCAtIGF0 IHRoaXMKKwkgKiBwb2ludCBvdGhlciB0aHJlYWRzIG1heSBhbHJlYWR5IGhhdmUgaG9sZCBvZiB0 aGlzIGNkYgorCSAqLworCXJlc3VsdCA9IG1tdV9ub3RpZmllcl9yZWdpc3RlcigmY2RiLT5tbiwg bW0pOworCWlmIChJU19FUlJfVkFMVUUoKGxvbmcpcmVzdWx0KSkgeworCQlwcl9lcnIoIm1tdV9u b3RpZmllcl9yZWdpc3RlcigpIGZhaWxlZDogJWRcbiIsIHJlc3VsdCk7CisKKwkJY2xpZW50X2Ri X3B1dChjZGIpOworCQlyZXR1cm4gRVJSX1BUUigobG9uZylyZXN1bHQpOworCX0KKworCXByX2Rl YnVnKCIlczogbmV3IGVudHJ5IGZvciBtbSAlMDE2bHhcbiIsCisJCV9fZnVuY19fLCAodW5zaWdu ZWQgbG9uZyljZGItPm1tKTsKKworCXJlZmNvdW50X2luYygmY2RiLT5yZWZjbnQpOworCXJldHVy biBjZGI7Cit9CisKK0tFWUVEX1JCX1RSRUUoY2xpZW50X2RiX2h2YSwgc3RydWN0IGZpbGVfZGIs IHJiX3Jvb3QsCisJc3RydWN0IHBhZ2VfZGIsIGZpbGVfbGluaywgbWFwX2h2YSkKKworc3RhdGlj IHZvaWQgZmlsZV9kYl9pbml0KHN0cnVjdCBmaWxlX2RiICpmZGIpCit7CisJZmRiLT5jZGIgPSBO VUxMOworCisJc3Bpbl9sb2NrX2luaXQoJmZkYi0+bG9jayk7CisJZmRiLT5yYl9yb290ID0gUkJf Uk9PVDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX2RiICpmaWxlX2RiX2FsbG9jKHZvaWQpCit7 CisJc3RydWN0IGZpbGVfZGIgKmZkYjsKKworCWZkYiA9IGttYWxsb2Moc2l6ZW9mKCpmZGIpLCBH RlBfS0VSTkVMKTsKKwlpZiAoZmRiICE9IE5VTEwpCisJCWZpbGVfZGJfaW5pdChmZGIpOworCisJ cmV0dXJuIGZkYjsKK30KKworc3RhdGljIHZvaWQgZmlsZV9kYl9mcmVlKHN0cnVjdCBmaWxlX2Ri ICpmZGIpCit7CisJQVNTRVJUKGNsaWVudF9kYl9odmFfZW1wdHkoZmRiKSk7CisKKwlrZnJlZShm ZGIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfZGIgKmNsaWVudF9kYl9wc2V1ZG9fZmlsZShz dHJ1Y3QgY2xpZW50X2RiICpjZGIpCit7CisJc3RydWN0IGZpbGVfZGIgKmFsbG9jYXRlZDsKKwor CWlmIChjZGItPnBzZXVkbyA9PSBOVUxMKSB7CisJCWFsbG9jYXRlZCA9IGZpbGVfZGJfYWxsb2Mo KTsKKwkJaWYgKGNtcHhjaGcoJmNkYi0+cHNldWRvLCBOVUxMLCBhbGxvY2F0ZWQpKQorCQkJZmls ZV9kYl9mcmVlKGFsbG9jYXRlZCk7CisJfQorCisJcmV0dXJuIGNkYi0+cHNldWRvOworfQorCitz dGF0aWMgc3RydWN0IHBhZ2VfZGIgKnBhZ2VfZGJfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgcGFn ZV9kYiAqcmVzdWx0OworCisJcmVzdWx0ID0ga21lbV9jYWNoZV9hbGxvYyhwZGJfY2FjaGUsIEdG UF9LRVJORUwpOworCWlmIChyZXN1bHQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1z ZXQocmVzdWx0LCAwLCBzaXplb2YoKnJlc3VsdCkpOworCisJYXRvbWljX2luYygmcGRiX2NvdW50 KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHBhZ2VfZGJfZnJlZShzdHJ1 Y3QgcGFnZV9kYiAqcGRiKQoreworCWttZW1fY2FjaGVfZnJlZShwZGJfY2FjaGUsIHBkYik7CisK KwlCVUdfT04oYXRvbWljX2FkZF9uZWdhdGl2ZSgtMSwgJnBkYl9jb3VudCkpOworfQorCitzdGF0 aWMgdm9pZCBwYWdlX2RiX3B1dChzdHJ1Y3QgcGFnZV9kYiAqcGRiKQoreworCWlmIChyZWZjb3Vu dF9kZWNfYW5kX3Rlc3QoJnBkYi0+cmVmY250KSkgeworCisJCS8qIHRoaXMgY2FzZSBpcyBwb3Nz aWJsZSBpZiBib3RoIHRhcmdldCBhbmQgY2xpZW50IGFyZQorCQkgKiBPT00ta2lsbGVkIGluIHF1 aWNrIHN1Y2Nlc3Npb24gYW5kIHRoZSByZWxlYXNlIGZ1bmN0aW9ucworCQkgKiBjYW4ndCBnZXQg dG8gdGhlIHJlbW90ZSBtYXBwZWQgcGFnZQorCQkgKi8KKwkJaWYgKHBkYi0+bWFwX2Fub25fdm1h KQorCQkJcHV0X2Fub25fdm1hKHBkYi0+bWFwX2Fub25fdm1hKTsKKwkJaWYgKHBkYi0+cmVxX2Fu b25fdm1hKQorCQkJcHV0X2Fub25fdm1hKHBkYi0+cmVxX2Fub25fdm1hKTsKKworCQlwYWdlX2Ri X2ZyZWUocGRiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhZ2VfZGJfcmVsZWFzZShzdHJ1Y3Qg cGFnZV9kYiAqcGRiKQoreworCWNsZWFyX2JpdChCVVNZX0JJVCwgKHVuc2lnbmVkIGxvbmcgKikm cGRiLT5mbGFncyk7CisJLyogc2VlIGNvbW1lbnRzIG9mIHdha2VfdXBfYml0KCksIHNldF9iaXQo KSBpcyBhdG9taWMgKi8KKwlzbXBfbWJfX2FmdGVyX2F0b21pYygpOworCXdha2VfdXBfYml0KCZw ZGItPmZsYWdzLCBCVVNZX0JJVCk7Cit9CisKKy8qIFJlc2VydmUgYSBtYXBwaW5nIGVudHJ5IGlu ZGV4ZWQgYnkgbWFwX2h2YSBpbiB0aGUgZmlsZSBkYXRhYmFzZS4gKi8KK3N0YXRpYyBzdHJ1Y3Qg cGFnZV9kYiAqCitwYWdlX2RiX3Jlc2VydmUoc3RydWN0IGZpbGVfZGIgKmZkYiwgc3RydWN0IG1t X3N0cnVjdCAqcmVxX21tLAorCXVuc2lnbmVkIGxvbmcgcmVxX2h2YSwgdW5zaWduZWQgbG9uZyBt YXBfaHZhKQoreworCXN0cnVjdCBwYWdlX2RiICpwZGI7CisKKwlwZGIgPSBwYWdlX2RiX2FsbG9j KCk7CisJaWYgKHVubGlrZWx5KHBkYiA9PSBOVUxMKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01F TSk7CisKKwkvKiBmaWxsIHBkYiAqLworCXBkYi0+dGFyZ2V0ID0gcmVxX21tOworCXBkYi0+cmVx X2h2YSA9IHJlcV9odmE7CisJcGRiLT5tYXBfaHZhID0gbWFwX2h2YTsKKwlyZWZjb3VudF9zZXQo JnBkYi0+cmVmY250LCAxKTsKKwlfX3NldF9iaXQoQlVTWV9CSVQsICh1bnNpZ25lZCBsb25nICop JnBkYi0+ZmxhZ3MpOworCisJLyogaW5zZXJ0IG1hcHBpbmcgZW50cnkgaW50byB0aGUgY2xpZW50 IGlmIG5vdCBhbHJlYWR5IHRoZXJlICovCisJc3Bpbl9sb2NrKCZmZGItPmxvY2spOworCisJaWYg KGxpa2VseShjbGllbnRfZGJfaHZhX2luc2VydChmZGIsIHBkYikpKQorCQlyZWZjb3VudF9pbmMo JnBkYi0+cmVmY250KTsKKwllbHNlIHsKKwkJcGFnZV9kYl9mcmVlKHBkYik7CisJCXBkYiA9IEVS Ul9QVFIoLUVBTFJFQURZKTsKKwl9CisKKwlzcGluX3VubG9jaygmZmRiLT5sb2NrKTsKKworCXJl dHVybiBwZGI7Cit9CisKKy8qIFJldmVyc2Ugb2YgcGFnZV9kYl9yZXNlcnZlKCksIHRvIGJlIGNh bGxlZCBpbiBjYXNlIG9mIGVycm9yLiAqLworc3RhdGljIHZvaWQKK3BhZ2VfZGJfdW5yZXNlcnZl KHN0cnVjdCBmaWxlX2RiICpmZGIsIHN0cnVjdCBwYWdlX2RiICpwZGIpCit7CisJc3Bpbl9sb2Nr KCZmZGItPmxvY2spOworCisJY2xpZW50X2RiX2h2YV9yZW1vdmUoZmRiLCBwZGIpOworCXBhZ2Vf ZGJfcHV0KHBkYik7CisKKwlzcGluX3VubG9jaygmZmRiLT5sb2NrKTsKKworCXBhZ2VfZGJfcmVs ZWFzZShwZGIpOworCXBhZ2VfZGJfcHV0KHBkYik7Cit9CisKKy8qIE1hcmtzIGFzIG1hcHBlZCAm IGRyb3BzIHJlZmVyZW5jZS4gKi8KK3N0YXRpYyB2b2lkCitwYWdlX2RiX2dvdF9tYXBwZWQoc3Ry dWN0IHBhZ2VfZGIgKnBkYikKK3sKKwlfX3NldF9iaXQoTUFQUEVEX0JJVCwgKHVuc2lnbmVkIGxv bmcgKikmcGRiLT5mbGFncyk7CisKKwlwYWdlX2RiX3JlbGVhc2UocGRiKTsKKwlwYWdlX2RiX3B1 dChwZGIpOworfQorCisvKiBHZXRzIGV4Y2x1c2l2ZSBhY2Nlc3MgZm9yIHVubWFwcGluZy4gKi8K K3N0YXRpYyBzdHJ1Y3QgcGFnZV9kYiAqCitwYWdlX2RiX2JlZ2luX3VubWFwKHN0cnVjdCBmaWxl X2RiICpmZGIsIHVuc2lnbmVkIGxvbmcgbWFwX2h2YSkKK3sKKwlzdHJ1Y3QgcGFnZV9kYiAqcGRi OworCWludCByZXN1bHQ7CisKKwlzcGluX2xvY2soJmZkYi0+bG9jayk7CisKKwlwZGIgPSBjbGll bnRfZGJfaHZhX3NlYXJjaChmZGIsIG1hcF9odmEpOworCWlmIChsaWtlbHkocGRiICE9IE5VTEwp KQorCQlyZWZjb3VudF9pbmMoJnBkYi0+cmVmY250KTsKKworCXNwaW5fdW5sb2NrKCZmZGItPmxv Y2spOworCisJaWYgKHBkYiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworcmV0cnk6CisJcmVz dWx0ID0gd2FpdF9vbl9iaXQoKHVuc2lnbmVkIGxvbmcgKikmcGRiLT5mbGFncywgQlVTWV9CSVQs CisJCQkgICAgIFRBU0tfS0lMTEFCTEUpOworCS8qIG5vbi16ZXJvIGlmIGludGVycnVwdGVkIGJ5 IGEgc2lnbmFsICovCisJaWYgKHVubGlrZWx5KHJlc3VsdCAhPSAwKSkKKwkJcmV0dXJuIEVSUl9Q VFIoLUVJTlRSKTsKKworCS8qIHRyeSBzZXQgYml0ICYgc3BpbiBpZiBmYWlsZWQgKi8KKwlpZiAo dGVzdF9hbmRfc2V0X2JpdChCVVNZX0JJVCwgKHVuc2lnbmVkIGxvbmcgKikmcGRiLT5mbGFncykp CisJCWdvdG8gcmV0cnk7CisKKwlyZXR1cm4gcGRiOworfQorCisvKiBNYXJrcyBhcyB1bm1hcHBl ZCwgcmVtb3ZlcyBmcm9tIHRyZWUgJiBkcm9wcyByZWZlcmVuY2UuICovCitzdGF0aWMgdm9pZAor cGFnZV9kYl9lbmRfdW5tYXAoc3RydWN0IGZpbGVfZGIgKmZkYiwgc3RydWN0IHBhZ2VfZGIgKnBk YikKK3sKKwlfX2NsZWFyX2JpdChNQVBQRURfQklULCAodW5zaWduZWQgbG9uZyAqKSZwZGItPmZs YWdzKTsKKworCXNwaW5fbG9jaygmZmRiLT5sb2NrKTsKKworCWNsaWVudF9kYl9odmFfcmVtb3Zl KGZkYiwgcGRiKTsKKwlwYWdlX2RiX3B1dChwZGIpOworCisJc3Bpbl91bmxvY2soJmZkYi0+bG9j ayk7CisKKwlwYWdlX2RiX3JlbGVhc2UocGRiKTsKKwlwYWdlX2RiX3B1dChwZGIpOworfQorCitz dGF0aWMgaW50CitwYWdlX2RiX2FkZF90YXJnZXQoc3RydWN0IHBhZ2VfZGIgKnBkYiwgc3RydWN0 IG1tX3N0cnVjdCAqdGFyZ2V0LAorCQkgICBzdHJ1Y3QgbW1fc3RydWN0ICpjbGllbnQpCit7CisJ c3RydWN0IHRhcmdldF9kYiAqdGRiOworCWludCByZXN1bHQgPSAwOworCisJLyoKKwkgKiByZXR1 cm5zIGEgdmFsaWQgcG9pbnRlciBvciBhbiBlcnJvciB2YWx1ZSwgbmV2ZXIgTlVMTAorCSAqIGFs c28gZ2V0cyByZWZlcmVuY2UgdG8gZW50cnkKKwkgKi8KKwl0ZGIgPSB0YXJnZXRfZGJfbG9va3Vw X29yX2FkZCh0YXJnZXQpOworCWlmIChJU19FUlJfVkFMVUUodGRiKSkKKwkJcmV0dXJuIFBUUl9F UlIodGRiKTsKKworCS8qIHRhcmdldC1zaWRlIGxvY2tpbmcgKi8KKwlzcGluX2xvY2soJnRkYi0+ bG9jayk7CisKKwkvKiBjaGVjayB0aGF0IHRhcmdldCBpcyBub3QgaW50cm9zcGVjdGVkIGJ5IHNv bWVvbmUgZWxzZSAqLworCWlmICh0ZGItPmNsaWVudCAhPSBOVUxMICYmIHRkYi0+Y2xpZW50ICE9 IGNsaWVudCkKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwllbHNlIHsKKwkJdGRiLT5jbGllbnQgPSBj bGllbnQ7CisJCXRhcmdldF9kYl9pbnNlcnQodGRiLCBwZGIpOworCX0KKworCXNwaW5fdW5sb2Nr KCZ0ZGItPmxvY2spOworCisJdGFyZ2V0X2RiX3B1dCh0ZGIpOworCisJcmV0dXJuIHJlc3VsdDsK K30KKworc3RhdGljIGludAorcGFnZV9kYl9yZW1vdmVfdGFyZ2V0KHN0cnVjdCBwYWdlX2RiICpw ZGIpCit7CisJc3RydWN0IHRhcmdldF9kYiAqdGRiOworCWludCByZXN1bHQgPSAwOworCisJLyog ZmluZCB0YXJnZXQgZW50cnkgaW4gdGhlIGRhdGFiYXNlICovCisJdGRiID0gdGFyZ2V0X2RiX2xv b2t1cChwZGItPnRhcmdldCk7CisJaWYgKHRkYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsK KworCS8qIHRhcmdldC1zaWRlIGxvY2tpbmcgKi8KKwlzcGluX2xvY2soJnRkYi0+bG9jayk7CisK KwkvKiByZW1vdmUgbWFwcGluZyBmcm9tIHRhcmdldCAqLworCXRhcmdldF9kYl9yZW1vdmUodGRi LCBwZGIpOworCisJLyogY2xlYXIgdGhlIGNsaWVudCBpZiBubyBtb3JlIG1hcHBpbmdzICovCisJ aWYgKHRhcmdldF9kYl9lbXB0eSh0ZGIpKSB7CisJCXRkYi0+Y2xpZW50ID0gTlVMTDsKKwkJcHJf ZGVidWcoIiVzOiBhbGwgbWFwcGluZ3MgZ29uZSBmb3IgdGFyZ2V0IG1tICUwMTZseFxuIiwKKwkJ CV9fZnVuY19fLCAodW5zaWduZWQgbG9uZylwZGItPnRhcmdldCk7CisJfQorCisJc3Bpbl91bmxv Y2soJnRkYi0+bG9jayk7CisKKwl0YXJnZXRfZGJfcHV0KHRkYik7CisKKwlyZXR1cm4gcmVzdWx0 OworfQorCisvKiBMYXN0IHJlc29ydCBjYWxsIGlmIG1lbW9yeSBvZiBjbGllbnQgZ290IHVubWFw cGVkIGJlZm9yZSBpb2N0bChSRU1fVU5NQVApICovCitzdGF0aWMgYm9vbCBub3RfbWFwcGVkX2lu X2NsaWVudChzdHJ1Y3QgcGFnZV9kYiAqcGRiKQoreworCWludCBudW1wYWdlczsKKwlzdHJ1Y3Qg cGFnZSAqcmVxX3BhZ2U7CisJYm9vbCByZXN1bHQgPSBmYWxzZTsKKworCW51bXBhZ2VzID0gX19n ZXRfdXNlcl9wYWdlc19mYXN0KHBkYi0+bWFwX2h2YSwgMSwgMCwgJnJlcV9wYWdlKTsKKwlpZiAo bnVtcGFnZXMgPT0gMCkKKwkJcmV0dXJuIHRydWU7CisKKwkvKiBwYWdlIHdhcyBtdW5tYXBwZWQg JiByZXBsYWNlZCBieSBhIG5vcm1hbCBwYWdlICovCisJaWYgKCFQYWdlUmVtb3RlKHJlcV9wYWdl KSkKKwkJcmVzdWx0ID0gdHJ1ZTsKKworCXB1dF9wYWdlKHJlcV9wYWdlKTsKKwlyZXR1cm4gcmVz dWx0OworfQorCisvKgorICogQ2xlYXIgYWxsIHRoZSBsaW5rcyB0byBhIHRhcmdldCBhdCBvbmNl LgorICovCitzdGF0aWMgdm9pZCBtbV9yZW1vdGVfZGJfY2xlYW51cF90YXJnZXQoc3RydWN0IGNs aWVudF9kYiAqY2RiLAorCQkJCQlzdHJ1Y3QgdGFyZ2V0X2RiICp0ZGIpCit7CisJc3RydWN0IHBh Z2VfZGIgKnBkYiwgKm5wZGI7CisKKwkvKiBpZiB3ZSBlbmRlZCB1cCBoZXJlIHRoZSB0YXJnZXQg bXVzdCBiZSBpbnRyb3NwZWN0ZWQgKi8KKwlBU1NFUlQodGRiLT5jbGllbnQgIT0gTlVMTCk7CisJ dGRiLT5jbGllbnQgPSBOVUxMOworCisJLyoKKwkgKiB3YWxrIHRoZSB0cmVlICYgY2xlYXIgbGlu a3MgdG8gdGFyZ2V0IC0gdGhpcyBmdW5jdGlvbiBpcyBzZXJpYWxpemVkCisJICogd2l0aCByZXNw ZWN0IHRvIHRoZSBtYWluIGxvb3AgaW4gbW1fcmVtb3RlX2RiX2NsaWVudF9yZWxlYXNlKCkgc28K KwkgKiB0aGVyZSB3aWxsIGJlIG5vIHJhY2Ugb24gcGRiLT50YXJnZXQKKwkgKi8KKwlsaXN0X2Zv cl9lYWNoX2VudHJ5X3NhZmUocGRiLCBucGRiLCAmdGRiLT5wYWdlc19saXN0LCB0YXJnZXRfbGlu aykgeworCQlpZiAobW1faXNfb29tX3ZpY3RpbShjZGItPm1tKSB8fCBub3RfbWFwcGVkX2luX2Ns aWVudChwZGIpKQorCQkJbW1fcmVtb3RlX2RvX3VubWFwX3RhcmdldChwZGIpOworCisJCWxpc3Rf ZGVsKCZwZGItPnRhcmdldF9saW5rKTsKKwkJcGRiLT50YXJnZXQgPSBOVUxMOworCX0KK30KKwor LyoKKyAqIEEgY2xpZW50IGZpbGUgaXMgY2xvc2luZy4gTm8gcmFjZSB3aXRoIG9wZXJhdGlvbnMg b2YgZmlsZSBpcyBwb3NzaWJsZS4KKyAqLworc3RhdGljIHZvaWQgbW1fcmVtb3RlX2RiX2ZpbGVf cmVsZWFzZShzdHJ1Y3QgZmlsZV9kYiAqZmRiKQoreworCXN0cnVjdCBjbGllbnRfZGIgKmNkYiA9 IGZkYi0+Y2RiOworCXN0cnVjdCBwYWdlX2RiICpwZGIsICpucGRiOworCXN0cnVjdCB0YXJnZXRf ZGIgKnRkYjsKKworCWlmICghY2xpZW50X2RiX2h2YV9lbXB0eShmZGIpKQorCQlwcl9kZWJ1Zygi JXM6IGNsaWVudCBmaWxlICUwMTZseCBoYXMgbWFwcGluZ3NcbiIsCisJCQlfX2Z1bmNfXywgKHVu c2lnbmVkIGxvbmcpZmRiKTsKKworCS8qIGl0ZXJhdGUgdGhlIHRyZWUgb2YgbWFwcGluZ3MgKi8K KwlyYnRyZWVfcG9zdG9yZGVyX2Zvcl9lYWNoX2VudHJ5X3NhZmUocGRiLCBucGRiLCAmZmRiLT5y Yl9yb290LCBmaWxlX2xpbmspIHsKKwkJLyogcGRiLT50YXJnZXQgaXMgY2xlYXJlZCBpbiB0aGUg ZnVuYyBhYm92ZSwgc3RvcmUgaW4gdmFyICovCisJCXN0cnVjdCBtbV9zdHJ1Y3QgKnJlcV9tbSA9 IHBkYi0+dGFyZ2V0OworCisJCS8qIHNlZSBjb21tZW50cyBpbiBmdW5jdGlvbiBhYm92ZSAqLwor CQlpZiAocmVxX21tID09IE5VTEwpCisJCQlnb3RvIGp1c3RfZnJlZTsKKworCQkvKiBwaW4gdGFy Z2V0IHRvIGF2b2lkIHJhY2Ugd2l0aCBtbV9yZW1vdGVfZGJfdGFyZ2V0X3JlbGVhc2UoKSAqLwor CQlpZiAobW1nZXRfbm90X3plcm8ocmVxX21tKSkgeworCisJCQkvKiBwaW4gZW50cnkgZm9yIHRh cmdldCAtIG1heWJlIGl0IGhhcyBiZWVuIHJlbGVhc2VkICovCisJCQl0ZGIgPSB0YXJnZXRfZGJf bG9va3VwKHJlcV9tbSk7CisJCQlpZiAodGRiICE9IE5VTEwpIHsKKwkJCQkvKiBzZWUgY29tbWVu dHMgb2YgdGhpcyBmdW5jdGlvbiAqLworCQkJCW1tX3JlbW90ZV9kYl9jbGVhbnVwX3RhcmdldChj ZGIsIHRkYik7CisKKwkJCQkvKiB1bnBpbiBlbnRyeSBmb3IgdGFyZ2V0ICovCisJCQkJdGFyZ2V0 X2RiX3B1dCh0ZGIpOworCQkJfQorCisJCQltbXB1dChyZXFfbW0pOworCQl9CisKKwlqdXN0X2Zy ZWU6CisJCS8qIGludmFsaWRhdGUgbGlua3MgdG8gY2xpZW50ICovCisJCVJCX0NMRUFSX05PREUo JnBkYi0+ZmlsZV9saW5rKTsKKworCQlpZiAoIW1tX2lzX29vbV92aWN0aW0oY2RiLT5tbSkpCisJ CQltbV9yZW1vdGVfZG9fdW5tYXAoY2RiLT5tbSwgcGRiLT5tYXBfaHZhKTsKKworCQlwYWdlX2Ri X3B1dChwZGIpOworCX0KKworCS8qIGNsZWFyIHJvb3Qgb2YgdHJlZSAqLworCWZkYi0+cmJfcm9v dCA9IFJCX1JPT1Q7Cit9CisKKy8qCisgKiBUaGUgY2xpZW50IGlzIGNsb3NpbmcuIFRoaXMgbWVh bnMgdGhlIG5vcm1hbCBtYXBwaW5nL3VubWFwcGluZyBsb2dpYworICogZG9lcyBub3Qgd29yayBh bnltb3JlLiBObyBtb3JlIGxvY2tpbmcgbmVlZGVkLgorICovCitzdGF0aWMgdm9pZCBtbV9yZW1v dGVfZGJfY2xpZW50X3JlbGVhc2Uoc3RydWN0IGNsaWVudF9kYiAqY2RiKQoreworCXN0cnVjdCBm aWxlX2RiICpmZGIgPSBjZGItPnBzZXVkbzsKKworCWlmIChmZGIgPT0gTlVMTCkKKwkJcmV0dXJu OworCisJcHJfZGVidWcoIiVzOiBjbGllbnQgJTAxNmx4IGhhcyBzcGVjaWFsIGZpbGVcbiIsCisJ CV9fZnVuY19fLCAodW5zaWduZWQgbG9uZykgY2RiKTsKKworCW1tX3JlbW90ZV9kYl9maWxlX3Jl bGVhc2UoZmRiKTsKKwlmaWxlX2RiX2ZyZWUoZmRiKTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVu IGEgdGFyZ2V0IGV4aXRzIGFuZCB0aGUgcGFnZSBtdXN0IGJlIG1hcmtlZCBhcyBzdGFsZSBhbmQg dGhlCisgKiB0YXJnZXQtc2lkZSBhbm9uLXZtYSByZWxlYXNlZC4KKyAqIFRoaXMgZnVuY3Rpb24g d2lsbCBub3QgcmFjZSB3aXRoIG1tX3JlbW90ZV9yZW1hcCgpLCBzaW5jZSBhIHJlZmVyZW5jZSB0 byB0aGUKKyAqIHRhcmdldCBNTSBpcyB0YWtlbiBiZWZvcmUgbWFwcGluZyBiZWluZyBkb25lLgor ICogVGhpcyBmdW5jdGlvbiBtYXkgcmFjZSB3aXRoIG1tX3JlbW90ZV9kb191bm1hcCgpLCBzbyBh IGNoZWNrIG11c3QgYmUKKyAqIGRvbmUgdW5kZXIgcGFnZSBsb2NrIHRvIG1ha2Ugc3VyZSB0aGUg cGFnZSBpcyBzdGlsbCByZW1vdGUgbWFwcGVkLgorICogQWZ0ZXIgdGhpcyBpcyBydW4sIHRoZSBw YWdlcyBhcmUgc3RpbGwgcmVtb3RlIG1hcHBlZCBwYWdlcywgYnV0IHRoZSBybWFwCisgKiBvbmx5 IHBvaW50cyB0byB0aGUgY2xpZW50LgorICovCitzdGF0aWMgaW50IG1tX3JlbW90ZV9tYWtlX3N0 YWxlKHN0cnVjdCBwYWdlX2RiICpwZGIpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqcmVxX21tID0g cGRiLT50YXJnZXQ7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICpyZXFfdm1hOworCXN0cnVjdCBw YWdlICpyZXFfcGFnZTsKKwlpbnQgcmVzdWx0ID0gMDsKKworCS8qIHRoaXMgYWxsb3dzIGZhdWx0 aW5nIHRvIGhhcHBlbiAqLworCWRvd25fcmVhZCgmcmVxX21tLT5tbWFwX3NlbSk7CisKKwkvKiBm aW5kIFZNQSBjb250YWluaW5nIGFkZHJlc3MgKi8KKwlyZXFfdm1hID0gZmluZF92bWEocmVxX21t LCBwZGItPnJlcV9odmEpOworCWlmICh1bmxpa2VseShyZXFfdm1hID09IE5VTEwpKSB7CisJCXJl c3VsdCA9IC1FTk9FTlQ7CisJCXByX2Vycigibm8gcmVtb3RlIFZNQSBmb3VuZCBmb3Igc3RhbGxp bmdcbiIpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyogc2hvdWxkIGJlIGF2YWlsYWJs ZSAmIHVuZXZpY3RhYmxlICovCisJcmVxX3BhZ2UgPSBmb2xsb3dfcGFnZShyZXFfdm1hLCBwZGIt PnJlcV9odmEsIEZPTExfTUlHUkFUSU9OIHwgRk9MTF9HRVQpOworCWlmIChJU19FUlJfVkFMVUUo cmVxX3BhZ2UpKSB7CisJCXJlc3VsdCA9IFBUUl9FUlIocmVxX3BhZ2UpOworCQlwcl9lcnIoImZv bGxvd19wYWdlKCkgZmFpbGVkOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBvdXRfdW5sb2NrOwor CX0gZWxzZSBpZiAodW5saWtlbHkocmVxX3BhZ2UgPT0gTlVMTCkpIHsKKwkJcmVzdWx0ID0gLUVO T0VOVDsKKwkJcHJfZXJyKCJmb2xsb3dfcGFnZSgpIHJldHVybmVkIG5vIHBhZ2VcbiIpOworCQln b3RvIG91dF91bmxvY2s7CisJfQorCisJLyogYWNjZXNzIHRvIFJNQVAgY29tcG9uZW50cyBvZiBQ REIgY2FuIG9ubHkgYmUgZG9uZSB1bmRlciBwYWdlIGxvY2sgKi8KKwlsb2NrX3BhZ2UocmVxX3Bh Z2UpOworCisJaWYgKGxpa2VseShQYWdlUmVtb3RlKHJlcV9wYWdlKSkpIHsKKwkJQVNTRVJUKHBk Yi0+cmVxX2Fub25fdm1hID09IHJlcV92bWEtPmFub25fdm1hKTsKKwkJLyoganVzdCByZWxlYXNl IHRhcmdldCBhbm9uX3ZtYSAtIHRoZSBwYWdlIHdpbGwgYmUgdGVtcG9yYXJpbHkKKwkJICogbGVm dCB3aXRoIGluY3JlYXNlZCBtYXBjb3VudCAmIHJlZmNvdW50LCB3aGljaCB3aWxsIGJlCisJCSAq IGRlY3JlbWVudGVkIHdoZW4gdGhlIHBhZ2UgaXMgdW5tYXBwZWQgZnJvbSB0aGUgdGFyZ2V0IG1t CisJCSAqLworCQlwdXRfYW5vbl92bWEocGRiLT5yZXFfYW5vbl92bWEpOworCQlwZGItPnJlcV9h bm9uX3ZtYSA9IE5VTEw7CisJfQorCisJdW5sb2NrX3BhZ2UocmVxX3BhZ2UpOworCisJcHV0X3Bh Z2UocmVxX3BhZ2UpOwkvKiBmb2xsb3dfcGFnZSguLi4gRk9MTF9HRVQpICovCisKK291dF91bmxv Y2s6CisJdXBfcmVhZCgmcmVxX21tLT5tbWFwX3NlbSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQor CitzdGF0aWMgaW50IG1tX3JlbW90ZV9tYWtlX3N0YWxlX2NsaWVudChzdHJ1Y3QgbW1fc3RydWN0 ICptYXBfbW0sCisJCQkJICAgICAgIHN0cnVjdCBwYWdlX2RiICpwZGIpCit7CisJc3RydWN0IHZt X2FyZWFfc3RydWN0ICptYXBfdm1hOworCXN0cnVjdCBwYWdlICpyZXFfcGFnZTsKKworCWludCBy ZXN1bHQgPSAwOworCisJZG93bl9yZWFkKCZtYXBfbW0tPm1tYXBfc2VtKTsKKworCW1hcF92bWEg PSBmaW5kX3ZtYShtYXBfbW0sIHBkYi0+bWFwX2h2YSk7CisJaWYgKHVubGlrZWx5KG1hcF92bWEg PT0gTlVMTCkpIHsKKwkJcmVzdWx0ID0gLUVOT0VOVDsKKwkJcHJfZXJyKCJubyBjbGllbnQgVk1B IGZvdW5kIGZvciBzdGFsbGluZ1xuIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBz aG91bGQgYmUgYXZhaWxhYmxlICYgdW5ldmljdGFibGUgKi8KKwlyZXFfcGFnZSA9IGZvbGxvd19w YWdlKG1hcF92bWEsIHBkYi0+bWFwX2h2YSwgRk9MTF9NSUdSQVRJT04gfCBGT0xMX0dFVCk7CisJ aWYgKElTX0VSUl9WQUxVRShyZXFfcGFnZSkpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUihyZXFfcGFn ZSk7CisJCXByX2VycigiZm9sbG93X3BhZ2UoKSBmYWlsZWQ6ICVkXG4iLCByZXN1bHQpOworCQln b3RvIG91dF91bmxvY2s7CisJfSBlbHNlIGlmICh1bmxpa2VseShyZXFfcGFnZSA9PSBOVUxMKSkg eworCQlyZXN1bHQgPSAtRU5PRU5UOworCQlwcl9lcnIoImZvbGxvd19wYWdlKCkgcmV0dXJuZWQg bm8gcGFnZVxuIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBhY2Nlc3MgdG8gUk1B UCBjb21wb25lbnRzIG9mIFBEQiBjYW4gb25seSBiZSBkb25lIHVuZGVyIHBhZ2UgbG9jayAqLwor CWxvY2tfcGFnZShyZXFfcGFnZSk7CisKKwlpZiAobGlrZWx5KFBhZ2VSZW1vdGUocmVxX3BhZ2Up KSkgeworCQkvKiBqdXN0IHJlbGVhc2UgdGFyZ2V0IGFub25fdm1hIC0gdGhlIHBhZ2Ugd2lsbCBi ZSB0ZW1wb3JhcmlseQorCQkgKiBsZWZ0IHdpdGggaW5jcmVhc2VkIG1hcGNvdW50ICYgcmVmY291 bnQsIHdoaWNoIHdpbGwgYmUKKwkJICogZGVjcmVtZW50ZWQgd2hlbiB0aGUgcGFnZSBpcyB1bm1h cHBlZCBmcm9tIHRoZSB0YXJnZXQgbW0KKwkJICovCisJCXB1dF9hbm9uX3ZtYShwZGItPnJlcV9h bm9uX3ZtYSk7CisJCXBkYi0+cmVxX2Fub25fdm1hID0gTlVMTDsKKwl9CisKKwl1bmxvY2tfcGFn ZShyZXFfcGFnZSk7CisKKwlwdXRfcGFnZShyZXFfcGFnZSk7CS8qIGZvbGxvd19wYWdlKC4uLiBG T0xMX0dFVCkgKi8KKworb3V0X3VubG9jazoKKwl1cF9yZWFkKCZtYXBfbW0tPm1tYXBfc2VtKTsK KworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBUaGUgdGFyZ2V0IE1NIGlzIGNsb3Npbmcu IFRoaXMgbWVhbnMgdGhlIHBhZ2VzIGFyZSB1bm1hcHBlZCBieSB0aGUgZGVmYXVsdAorICoga2Vy bmVsIGxvZ2ljIG9uIHRoZSB0YXJnZXQgc2lkZSwgYnV0IHdlIG11c3QgbWFyayB0aGUgZW50cmll cyBhcyBzdGFsZS4KKyAqIFRoaXMgZnVuY3Rpb24gd29uJ3QgcmFjZSB3aXRoIHRoZSBtYXBwaW5n IGZ1bmN0aW9uIHNpbmNlIHdlIGdldCBoZXJlCisgKiBvbiB0YXJnZXQgTU0gdGVhcmRvd24gYW5k IHRoZSBtYXBwaW5nIGZ1bmN0aW9uIHdvbid0IGJlIGFibGUgdG8gZ2V0IGEKKyAqIHJlZmVyZW5j ZSB0byB0aGUgdGFyZ2V0IE1NLgorICogVGhpcyBmdW5jdGlvbiBtYXkgcmFjZSB3aXRoIHRoZSB1 bm1hcHBpbmcgZnVuY3Rpb24sIGJ1dAorICogYWNjZXNzIHdpbGwgYmUgZG9uZSBvbmx5IG9uIHRo ZSB0YXJnZXQtc2lkZSBjb21wb25lbnRzLgorICovCitzdGF0aWMgdm9pZCBtbV9yZW1vdGVfZGJf dGFyZ2V0X3JlbGVhc2Uoc3RydWN0IHRhcmdldF9kYiAqdGRiKQoreworCXN0cnVjdCBtbV9zdHJ1 Y3QgKm1hcF9tbTsKKwlzdHJ1Y3QgcGFnZV9kYiAqcGRiLCAqbnBkYjsKKworCS8qIG5vIGNsaWVu dCwgbm90aGluZyB0byBkbyAqLworCWlmICh0ZGItPmNsaWVudCA9PSBOVUxMKSB7CisJCUFTU0VS VCh0YXJnZXRfZGJfZW1wdHkodGRiKSk7CisJCXJldHVybjsKKwl9CisKKwltYXBfbW0gPSB0ZGIt PmNsaWVudDsKKwl0ZGItPmNsaWVudCA9IE5VTEw7CisKKwkvKiBpZiB0aGUgdGFyZ2V0IGlzIGtp bGxlZCBieSBPT00sIHRyeSB0byBwaW4gdGhlIGNsaWVudCAqLworCWlmIChtbV9pc19vb21fdmlj dGltKHRkYi0+bW0pICYmICFtbWdldF9ub3RfemVybyhtYXBfbW0pKSB7CisJCS8qIG91dCBvZiBs dWNrLCBqdXN0IHVubGluayBmcm9tIHRoZSBsaXN0ICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnlf c2FmZShwZGIsIG5wZGIsICZ0ZGItPnBhZ2VzX2xpc3QsIHRhcmdldF9saW5rKSB7CisJCQlsaXN0 X2RlbCgmcGRiLT50YXJnZXRfbGluayk7CisJCQlwZGItPnRhcmdldCA9IE5VTEw7CisJCX0KKwor CQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBhbGwgdGhlIGVudHJpZXMgaW4gdGhpcyB0cmVlIG11 c3QgYmUgbWFkZSBzdGFsZSwKKwkgKiBidXQgbm90IHJlbW92ZWQgZnJvbSB0aGUgY2xpZW50IHRy ZWUKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGRiLCBucGRiLCAmdGRiLT5wYWdl c19saXN0LCB0YXJnZXRfbGluaykgeworCQlpZiAoIW1tX2lzX29vbV92aWN0aW0odGRiLT5tbSkp CisJCQltbV9yZW1vdGVfbWFrZV9zdGFsZShwZGIpOworCQllbHNlCisJCQltbV9yZW1vdGVfbWFr ZV9zdGFsZV9jbGllbnQobWFwX21tLCBwZGIpOworCisJCWxpc3RfZGVsKCZwZGItPnRhcmdldF9s aW5rKTsKKwkJcGRiLT50YXJnZXQgPSBOVUxMOworCX0KKworCS8qIGNsaWVudCBoYXMgYmVlbiBw aW5uZWQgYmVmb3JlICovCisJaWYgKG1tX2lzX29vbV92aWN0aW0odGRiLT5tbSkpCisJCW1tcHV0 KG1hcF9tbSk7Cit9CisKK3N0YXRpYyB2b2lkIHRkYl9yZWxlYXNlKHN0cnVjdCBtbXVfbm90aWZp ZXIgKm1uLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgdGFyZ2V0X2RiICp0ZGIg PSBjb250YWluZXJfb2YobW4sIHN0cnVjdCB0YXJnZXRfZGIsIG1uKTsKKworCXByX2RlYnVnKCIl czogbW0gJTAxNmx4XG4iLCBfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcpbW0pOworCisJLyogYXQg dGhpcyBwb2ludCBvdGhlciB0aHJlYWRzIG1heSBhbHJlYWR5IGhhdmUgaG9sZCBvZiB0aGlzIHRk YiAqLworCXRhcmdldF9kYl9wdXQodGRiKTsKK30KKworc3RhdGljIHZvaWQgY2RiX3JlbGVhc2Uo c3RydWN0IG1tdV9ub3RpZmllciAqbW4sIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVj dCBjbGllbnRfZGIgKmNkYiA9IGNvbnRhaW5lcl9vZihtbiwgc3RydWN0IGNsaWVudF9kYiwgbW4p OworCisJcHJfZGVidWcoIiVzOiBtbSAlMDE2bHhcbiIsIF9fZnVuY19fLCAodW5zaWduZWQgbG9u ZyltbSk7CisKKwkvKiBhdCB0aGlzIHBvaW50IG90aGVyIHRocmVhZHMgbWF5IGFscmVhZHkgaGF2 ZSBob2xkIG9mIHRoaXMgY2RiICovCisJY2xpZW50X2RiX3B1dChjZGIpOworfQorCitzdGF0aWMg dm9pZCBtbV9yZW1vdGVfcGFnZV91bmV2aWN0YWJsZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlW TV9CVUdfT05fUEFHRSghUGFnZUxvY2tlZChwYWdlKSwgcGFnZSk7CisKKwlpZiAoIWlzb2xhdGVf bHJ1X3BhZ2UocGFnZSkpCisJCXB1dGJhY2tfbHJ1X3BhZ2UocGFnZSk7Cit9CisKK3N0YXRpYyB2 b2lkIG1tX3JlbW90ZV9wYWdlX2V2aWN0YWJsZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlWTV9C VUdfT05fUEFHRSghUGFnZUxvY2tlZChwYWdlKSwgcGFnZSk7CisKKwlpZiAoIWlzb2xhdGVfbHJ1 X3BhZ2UocGFnZSkpCisJCXB1dGJhY2tfbHJ1X3BhZ2UocGFnZSk7CisJZWxzZSB7CisJCWlmIChQ YWdlVW5ldmljdGFibGUocGFnZSkpCisJCQljb3VudF92bV9ldmVudChVTkVWSUNUQUJMRV9QR1NU UkFOREVEKTsKKwl9Cit9CisKK3ZvaWQgcm1hcF93YWxrX3JlbW90ZShzdHJ1Y3QgcGFnZSAqcGFn ZSwgc3RydWN0IHJtYXBfd2Fsa19jb250cm9sICpyd2MpCit7CisJc3RydWN0IHBhZ2VfZGIgKnBk YjsKKwlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hOworCXN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAq YXZjOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXBnb2ZmX3QgcGdvZmZfc3RhcnQs IHBnb2ZmX2VuZDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisKKwlWTV9CVUdfT05fUEFHRSgh UGFnZVJlbW90ZShwYWdlKSwgcGFnZSk7CisJVk1fQlVHX09OX1BBR0UoIVBhZ2VMb2NrZWQocGFn ZSksIHBhZ2UpOworCisJcGRiID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpcGFnZS0+bWFwcGlu ZyAmIH5QQUdFX01BUFBJTkdfRkxBR1MpOworCisJLyogaXRlcmF0ZSBvbiBvcmlnaW5hbCBhbm9u X3ZtYSAqLworCWFub25fdm1hID0gcGRiLT5yZXFfYW5vbl92bWE7CisJaWYgKGFub25fdm1hICE9 IE5VTEwpIHsKKwkJYW5vbl92bWFfbG9ja19yZWFkKGFub25fdm1hKTsKKwkJcGdvZmZfc3RhcnQg PSBwYWdlX3RvX3Bnb2ZmKHBhZ2UpOworCQlwZ29mZl9lbmQgPSBwZ29mZl9zdGFydCArIGhwYWdl X25yX3BhZ2VzKHBhZ2UpIC0gMTsKKwkJYW5vbl92bWFfaW50ZXJ2YWxfdHJlZV9mb3JlYWNoKGF2 YywgJmFub25fdm1hLT5yYl9yb290LAorCQkJCQkgICAgICAgcGdvZmZfc3RhcnQsIHBnb2ZmX2Vu ZCkgeworCQkJdm1hID0gYXZjLT52bWE7CisJCQlhZGRyZXNzID0gdm1hX2FkZHJlc3MocGFnZSwg dm1hKTsKKworCQkJY29uZF9yZXNjaGVkKCk7CisKKwkJCWlmIChyd2MtPmludmFsaWRfdm1hICYm IHJ3Yy0+aW52YWxpZF92bWEodm1hLCByd2MtPmFyZykpCisJCQkJY29udGludWU7CisKKwkJCWlm ICghcndjLT5ybWFwX29uZShwYWdlLCB2bWEsIGFkZHJlc3MsIHJ3Yy0+YXJnKSkKKwkJCQlicmVh azsKKworCQkJaWYgKHJ3Yy0+ZG9uZSAmJiByd2MtPmRvbmUocGFnZSkpCisJCQkJYnJlYWs7CisJ CX0KKwkJYW5vbl92bWFfdW5sb2NrX3JlYWQoYW5vbl92bWEpOworCX0KKworCS8qIGl0ZXJhcmUg b24gY2xpZW50IGFub25fdm1hICovCisJYW5vbl92bWEgPSBwZGItPm1hcF9hbm9uX3ZtYTsKKwlp ZiAoYW5vbl92bWEgIT0gTlVMTCkgeworCQlhbm9uX3ZtYV9sb2NrX3JlYWQoYW5vbl92bWEpOwor CQlhbm9uX3ZtYV9pbnRlcnZhbF90cmVlX2ZvcmVhY2goYXZjLCAmYW5vbl92bWEtPnJiX3Jvb3Qs CisJCQkJCSAgICAgICAwLCBVTE9OR19NQVgpIHsKKwkJCXZtYSA9IGF2Yy0+dm1hOworCQkJYWRk cmVzcyA9IHBkYi0+bWFwX2h2YTsKKworCQkJY29uZF9yZXNjaGVkKCk7CisKKwkJCWlmIChyd2Mt PmludmFsaWRfdm1hICYmIHJ3Yy0+aW52YWxpZF92bWEodm1hLCByd2MtPmFyZykpCisJCQkJY29u dGludWU7CisKKwkJCWlmICghcndjLT5ybWFwX29uZShwYWdlLCB2bWEsIGFkZHJlc3MsIHJ3Yy0+ YXJnKSkKKwkJCQlicmVhazsKKworCQkJaWYgKHJ3Yy0+ZG9uZSAmJiByd2MtPmRvbmUocGFnZSkp CisJCQkJYnJlYWs7CisJCX0KKwkJYW5vbl92bWFfdW5sb2NrX3JlYWQoYW5vbl92bWEpOworCX0K K30KKworc3RhdGljIGludCBtbV9yZW1vdGVfaW52YWxpZGF0ZV9wdGUoc3RydWN0IHZtX2FyZWFf c3RydWN0ICptYXBfdm1hLAorCXVuc2lnbmVkIGxvbmcgbWFwX2h2YSwgcG1kX3QgKm1hcF9wbWQs IHN0cnVjdCBwYWdlICptYXBfcGFnZSkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptYXBfbW0gPSBt YXBfdm1hLT52bV9tbTsKKwlzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlOworCXVuc2ln bmVkIGxvbmcgbW11bl9zdGFydDsKKwl1bnNpZ25lZCBsb25nIG1tdW5fZW5kOworCXB0ZV90ICpw dGVwOworCXNwaW5sb2NrX3QgKnB0bDsKKwlzd3BfZW50cnlfdCBlbnRyeTsKKwlpbnQgcmVzdWx0 ID0gMDsKKworCW1tdW5fc3RhcnQgPSBtYXBfaHZhOworCW1tdW5fZW5kID0gbWFwX2h2YSArIFBB R0VfU0laRTsKKwltbXVfbm90aWZpZXJfcmFuZ2VfaW5pdCgmcmFuZ2UsIG1hcF9tbSwgbW11bl9z dGFydCwgbW11bl9lbmQpOworCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KCZy YW5nZSk7CisKKwlwdGVwID0gcHRlX29mZnNldF9tYXBfbG9jayhtYXBfbW0sIG1hcF9wbWQsIG1h cF9odmEsICZwdGwpOworCisJLyogcmVtb3ZlIHJldmVyc2UgbWFwcGluZyAtIHRoZSBjYWxsZXIg bmVlZHMgdG8gaG9sZCB0aGUgcHRlIGxvY2sgKi8KKwlpZiAobGlrZWx5KG1hcF9wYWdlICE9IE5V TEwpKSB7CisJCXBhZ2VfcmVtb3ZlX3JtYXAobWFwX3BhZ2UsIGZhbHNlKTsKKworCQkvKiB0aGUg emVyb19wYWdlIGlzIG5vdCBhbm9ueW1vdXMgKi8KKwkJaWYgKCFpc196ZXJvX3BmbihwdGVfcGZu KCpwdGVwKSkpCisJCQlkZWNfbW1fY291bnRlcihtYXBfbW0sIE1NX0FOT05QQUdFUyk7CisKKwkJ LyogY2xlYXIgb2xkIFBURSBlbnRyeSAqLworCQlmbHVzaF9jYWNoZV9wYWdlKG1hcF92bWEsIG1h cF9odmEsIHB0ZV9wZm4oKnB0ZXApKTsKKwkJcHRlcF9jbGVhcl9mbHVzaF9ub3RpZnkobWFwX3Zt YSwgbWFwX2h2YSwgcHRlcCk7CisKKwkJYXRvbWljX2luYygmc3RhdF9tYXBwZWRfcHRlKTsKKwl9 IGVsc2UgeworCQkvKiBmcmVzaCBQVEUgb3IgaGFzIGJlZW4gY2xlYXJlZCBiZWZvcmUgKi8KKwkJ aWYgKGxpa2VseShwdGVfbm9uZSgqcHRlcCkpKSB7CisJCQlhdG9taWNfaW5jKCZzdGF0X2VtcHR5 X3B0ZSk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworCQkvKiBhIHBhZ2Ugd2FzIGZhdWx0 ZWQgaW4gYWZ0ZXIgZm9sbG93X3BhZ2UoKSByZXR1cm5lZCBOVUxMICovCisJCWlmICh1bmxpa2Vs eShwdGVfcHJlc2VudCgqcHRlcCkpKSB7CisJCQlhdG9taWNfaW5jKCZzdGF0X3JlZmF1bHQpOwor CQkJcmVzdWx0ID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCS8qIG11 c3QgYmUgc3dhcCBlbnRyeSAqLworCQllbnRyeSA9IHB0ZV90b19zd3BfZW50cnkoKnB0ZXApOwor CQkvKiBmb2xsb3dfcGFnZSguLi4gfCBGT0xMX01JR1JBVElPTiB8IC4uLikgKi8KKwkJQVNTRVJU KCFpc19taWdyYXRpb25fZW50cnkoZW50cnkpKTsKKwkJZnJlZV9zd2FwX2FuZF9jYWNoZShlbnRy eSk7CisJCXB0ZXBfY2xlYXJfZmx1c2gobWFwX3ZtYSwgbWFwX2h2YSwgcHRlcCk7CisKKwkJYXRv bWljX2luYygmc3RhdF9zd2FwX3B0ZSk7CisJfQorCitvdXRfdW5sb2NrOgorCXB0ZV91bm1hcF91 bmxvY2socHRlcCwgcHRsKTsKKworCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZCgm cmFuZ2UpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBtbV9yZW1vdGVfaW5z dGFsbF9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICptYXBfdm1hLAorCXVuc2lnbmVkIGxvbmcg bWFwX2h2YSwgcG1kX3QgKm1hcF9wbWQsIHN0cnVjdCBwYWdlICpyZXFfcGFnZSkKK3sKKwlzdHJ1 Y3QgbW1fc3RydWN0ICptYXBfbW0gPSBtYXBfdm1hLT52bV9tbTsKKwlwdGVfdCBwdGUsICpwdGVw OworCXNwaW5sb2NrX3QgKnB0bDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCXB0ZXAgPSBwdGVfb2Zm c2V0X21hcF9sb2NrKG1hcF9tbSwgbWFwX3BtZCwgbWFwX2h2YSwgJnB0bCk7CisKKwkvKiBhIHBh Z2Ugd2FzIGZhdWx0ZWQgaW4gKi8KKwlpZiAodW5saWtlbHkocHRlX3ByZXNlbnQoKnB0ZXApKSkg eworCQlhdG9taWNfaW5jKCZzdGF0X3JlZmF1bHQpOworCQlyZXN1bHQgPSAtRUFHQUlOOworCQln b3RvIG91dF91bmxvY2s7CisJfQorCisJLyogY3JlYXRlIG5ldyBQVEUgYmFzZWQgb24gcmVxdWVz dGVkIHBhZ2UgKi8KKwlwdGUgPSBta19wdGUocmVxX3BhZ2UsIG1hcF92bWEtPnZtX3BhZ2VfcHJv dCk7CisJaWYgKG1hcF92bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpCisJCXB0ZSA9IHB0ZV9ta3dy aXRlKHB0ZV9ta2RpcnR5KHB0ZSkpOworCXNldF9wdGVfYXRfbm90aWZ5KG1hcF9tbSwgbWFwX2h2 YSwgcHRlcCwgcHRlKTsKKworCWluY19tbV9jb3VudGVyKG1hcF9tbSwgTU1fQU5PTlBBR0VTKTsK Kworb3V0X3VubG9jazoKKwlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7CisKKwlyZXR1cm4g cmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBtbV9yZW1vdGVfcHV0X3JlcShzdHJ1Y3QgcGFnZSAq cmVxX3BhZ2UsCisJCQkgICAgICBzdHJ1Y3QgYW5vbl92bWEgKnJlcV9hbm9uX3ZtYSkKK3sKKwlp ZiAocmVxX2Fub25fdm1hKQorCQlwdXRfYW5vbl92bWEocmVxX2Fub25fdm1hKTsKKworCWlmIChy ZXFfcGFnZSkKKwkJcHV0X3BhZ2UocmVxX3BhZ2UpOworfQorCitzdGF0aWMgaW50IG1tX3JlbW90 ZV9nZXRfcmVxKHN0cnVjdCBtbV9zdHJ1Y3QgKnJlcV9tbSwgdW5zaWduZWQgbG9uZyByZXFfaHZh LAorCQkJICAgICBzdHJ1Y3QgcGFnZSAqKnByZXFfcGFnZSwKKwkJCSAgICAgc3RydWN0IGFub25f dm1hICoqcHJlcV9hbm9uX3ZtYSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcmVxX3BhZ2UgPSBOVUxMOwor CXN0cnVjdCBhbm9uX3ZtYSAqcmVxX2Fub25fdm1hID0gTlVMTDsKKwlsb25nIG5ycGFnZXM7CisJ aW50IHJlc3VsdCA9IDA7CisKKwkvKiBmb3Igbm93IHdlLXJlIHVzaW5nIGJvdGggcG9pbnRlcnMg Ki8KKwlBU1NFUlQocHJlcV9wYWdlICE9IE5VTEwpOworCUFTU0VSVChwcmVxX2Fub25fdm1hICE9 IE5VTEwpOworCisJaWYgKGNoZWNrX3N0YWJsZV9hZGRyZXNzX3NwYWNlKHJlcV9tbSkpIHsKKwkJ cHJfZXJyKCJhZGRyZXNzIHNwYWNlIG9mIHRhcmdldCBub3Qgc3RhYmxlIik7CisJCXJldHVybiAt RUlOVkFMOworCX0KKworCWRvd25fcmVhZCgmcmVxX21tLT5tbWFwX3NlbSk7CisKKwkvKiBnZXQg aG9zdCBwYWdlIGNvcnJlc3BvbmRpbmcgdG8gcmVxdWVzdGVkIGFkZHJlc3MgKi8KKwlucnBhZ2Vz ID0gZ2V0X3VzZXJfcGFnZXNfcmVtb3RlKE5VTEwsIHJlcV9tbSwgcmVxX2h2YSwgMSwKKwkJRk9M TF9XUklURSB8IEZPTExfRk9SQ0UgfCBGT0xMX1NQTElUIHwgRk9MTF9NSUdSQVRJT04sCisJCSZy ZXFfcGFnZSwgTlVMTCwgTlVMTCk7CisJaWYgKHVubGlrZWx5KG5ycGFnZXMgPT0gMCkpIHsKKwkJ cHJfZXJyKCJubyBwYWdlIGZvciByZXFfaHZhICUwMTZseFxuIiwgcmVxX2h2YSk7CisJCXJlc3Vs dCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoSVNfRVJSX1ZBTFVFKG5ycGFn ZXMpKSB7CisJCXJlc3VsdCA9IG5ycGFnZXM7CisJCWlmIChyZXN1bHQgPT0gLUVCVVNZKQorCQkJ cHJfZGVidWcoImdldF91c2VyX3BhZ2VzX3JlbW90ZSgpIGZhaWxlZDogJWRcbiIsIHJlc3VsdCk7 CisJCWVsc2UKKwkJCXByX2VycigiZ2V0X3VzZXJfcGFnZXNfcmVtb3RlKCkgZmFpbGVkOiAlZFxu IiwgcmVzdWx0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogbGltaXQgaW50cm9zcGVjdGlvbiB0 byBhbm9uIG1lbW9yeSAodGhpcyBhbHNvIGV4Y2x1ZGVzIHplcm8tcGFnZSkgKi8KKwlpZiAoIVBh Z2VBbm9uKHJlcV9wYWdlKSkgeworCQlyZXN1bHQgPSAtRUlOVkFMOworCQlwcl9lcnIoInBhZ2Ug YXQgcmVxX2h2YSAlMDE2bHggbm90IGFub25cbiIsIHJlcV9odmEpOworCQlnb3RvIG91dDsKKwl9 CisKKwkvKiBtYWtlIHN1cmUgdGhlIGFwcGxpY2F0aW9uIGRvZXNuJ3Qgd2FudCByZW1vdGUtZG91 YmxlLW1hcHBpbmcgKi8KKwlpZiAoUGFnZVJlbW90ZShyZXFfcGFnZSkpIHsKKwkJcmVzdWx0ID0g LUVBTFJFQURZOworCQlwcl9lcnIoInBhZ2UgYXQgcmVxX2h2YSAlMDE2bHggYWxyZWFkeSBtYXBw ZWRcbiIsIHJlcV9odmEpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiB0YWtlICYgbG9jayB0aGlz IGFub24gdm1hICovCisJcmVxX2Fub25fdm1hID0gcGFnZV9nZXRfYW5vbl92bWEocmVxX3BhZ2Up OworCWlmICh1bmxpa2VseShyZXFfYW5vbl92bWEgPT0gTlVMTCkpIHsKKwkJcmVzdWx0ID0gLUVJ TlZBTDsKKwkJcHJfZXJyKCJubyBhbm9uIHZtYSBmb3IgcmVxX2h2YSAlMDE2bHhcbiIsIHJlcV9o dmEpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBvdXRwdXQgdGhlc2UgdmFsdWVzIG9ubHkgaWYg c3VjY2Vzc2Z1bCAqLworCSpwcmVxX3BhZ2UgPSByZXFfcGFnZTsKKwkqcHJlcV9hbm9uX3ZtYSA9 IHJlcV9hbm9uX3ZtYTsKKworb3V0OgorCXVwX3JlYWQoJnJlcV9tbS0+bW1hcF9zZW0pOworCisJ aWYgKHJlc3VsdCkKKwkJbW1fcmVtb3RlX3B1dF9yZXEocmVxX3BhZ2UsIHJlcV9hbm9uX3ZtYSk7 CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IG1tX3JlbW90ZV9yZW1hcChzdHJ1 Y3QgbW1fc3RydWN0ICptYXBfbW0sIHVuc2lnbmVkIGxvbmcgbWFwX2h2YSwKKwkJCSAgIHN0cnVj dCBwYWdlICpyZXFfcGFnZSwgc3RydWN0IGFub25fdm1hICpyZXFfYW5vbl92bWEsCisJCQkgICBz dHJ1Y3QgcGFnZV9kYiAqcGRiKQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqbWFwX3ZtYTsK KwlwbWRfdCAqbWFwX3BtZDsKKwlzdHJ1Y3QgcGFnZSAqbWFwX3BhZ2UgPSBOVUxMOworCWludCBy ZXN1bHQgPSAwOworCisJLyogdGhpcyBhbGxvd3MgZmF1bHRpbmcgdG8gaGFwcGVuICovCisJZG93 bl9yZWFkKCZtYXBfbW0tPm1tYXBfc2VtKTsKKworCS8qIGZpbmQgVk1BIGNvbnRhaW5pbmcgYWRk cmVzcyAqLworCW1hcF92bWEgPSBmaW5kX3ZtYShtYXBfbW0sIG1hcF9odmEpOworCWlmICh1bmxp a2VseShtYXBfdm1hID09IE5VTEwpKSB7CisJCXJlc3VsdCA9IC1FTk9FTlQ7CisJCXByX2Vycigi bm8gbG9jYWwgVk1BIGZvdW5kIGZvciByZW1hcHBpbmdcbiIpOworCQlnb3RvIG91dF91bmxvY2s7 CisJfQorCisJaWYgKHVubGlrZWx5KCF2bWFfaXNfYW5vbnltb3VzKG1hcF92bWEpKSkgeworCQly ZXN1bHQgPSAtRUlOVkFMOworCQlwcl9lcnIoImxvY2FsIFZNQSBpcyBub3QgYW5vbnltb3VzXG4i KTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlBU1NFUlQobWFwX3ZtYS0+YW5vbl92bWEgIT0g TlVMTCk7CisKK3JldHJ5OgorCS8qCisJICogZ2V0IHJlZmVyZW5jZSB0byBsb2NhbCBwYWdlIGNv cnJlc3BvbmRpbmcgdG8gdGFyZ2V0IGFkZHJlc3M7CisJICogdGhlIHJlc3VsdCBtYXkgYmUgTlVM TCBpbiBjYXNlIG9mIHN3YXAgZW50cnkgb3IgbWFwcGluZyBub3QgcHJlc2VudAorCSAqLworCW1h cF9wYWdlID0gZm9sbG93X3BhZ2UobWFwX3ZtYSwgbWFwX2h2YSwKKwkJCSAgICAgICBGT0xMX1NQ TElUIHwgRk9MTF9NSUdSQVRJT04gfCBGT0xMX0dFVCk7CisJaWYgKElTX0VSUl9WQUxVRShtYXBf cGFnZSkpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUihtYXBfcGFnZSk7CisJCXByX2RlYnVnKCIlczog Zm9sbG93X3BhZ2UoKSBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKKwkJZ290byBv dXRfdW5sb2NrOworCX0KKworCS8qIGluIGNhc2Ugb2YgVEhQLCB0aGUgaHVnZSBwYWdlIG11c3Qg YmUgc3BsaXQgYmVmb3JlIHRoZSBQTUQgZXhpc3RzICovCisJbWFwX3BtZCA9IG1tX2ZpbmRfcG1k KG1hcF9tbSwgbWFwX2h2YSk7CisJaWYgKHVubGlrZWx5KCFtYXBfcG1kKSkgeworCQkvKiBmb2xs b3dfcGFnZSguLi4gfCBGT0xMX0dFVCkgKi8KKwkJaWYgKG1hcF9wYWdlICE9IE5VTEwpCisJCQlw dXRfcGFnZShtYXBfcGFnZSk7CisJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCXByX2VycigibG9jYWwg UE1EIG5vdCBmb3VuZCIpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyogdW5tYXAgbWFw X3BhZ2UgZnJvbSBjdXJyZW50IHBhZ2UgdGFibGVzICovCisJaWYgKG1hcF9wYWdlICE9IE5VTEwp CisJCWxvY2tfcGFnZShtYXBfcGFnZSk7CisKKwkvKiB0aGUgb25seSBwb3NzaWJsZSBlcnJvciBp cyAtRUFHQUlOIHdoZW4gbWFwX3BhZ2UgPT0gTlVMTCAqLworCXJlc3VsdCA9IG1tX3JlbW90ZV9p bnZhbGlkYXRlX3B0ZShtYXBfdm1hLCBtYXBfaHZhLCBtYXBfcG1kLCBtYXBfcGFnZSk7CisJaWYg KElTX0VSUl9WQUxVRSgobG9uZylyZXN1bHQpKQorCQlnb3RvIHJldHJ5OworCisJaWYgKG1hcF9w YWdlICE9IE5VTEwpCisJCXVubG9ja19wYWdlKG1hcF9wYWdlKTsKKworCS8qIHdlJ3JlIGRvbmUg d2l0aCB0aGlzIHBhZ2UgKi8KKwlpZiAobWFwX3BhZ2UgIT0gTlVMTCkgeworCQkvKiByZWZlcmVu Y2UgYWNxdWlyZWQgaW4gZm9sbG93X3BhZ2UoLi4uIHwgRk9MTF9HRVQpICovCisJCXB1dF9wYWdl KG1hcF9wYWdlKTsKKwkJZnJlZV9wYWdlX2FuZF9zd2FwX2NhY2hlKG1hcF9wYWdlKTsKKwl9CisK KwkvKiBtYXAgcmVxX3BhZ2UgYXQgdGhlIHNhbWUgYWRkcmVzcyAtIHBhZ2UgaXMgYWxyZWFkeSBQ YWdlUmVtb3RlKCkgKi8KKwlsb2NrX3BhZ2UocmVxX3BhZ2UpOworCisJLyogdGhlIG9ubHkgcG9z c2libGUgZXJyb3IgaXMgLUVBR0FJTiB3aGVuIFBURSAhPSBwdGVfbm9uZSgpICovCisJcmVzdWx0 ID0gbW1fcmVtb3RlX2luc3RhbGxfcHRlKG1hcF92bWEsIG1hcF9odmEsIG1hcF9wbWQsIHJlcV9w YWdlKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKChsb25nKXJlc3VsdCkpIHsKKwkJdW5sb2NrX3BhZ2Uo cmVxX3BhZ2UpOworCQlnb3RvIHJldHJ5OworCX0KKworCS8qIGluY3JlbWVudCBpdHMgcmVmZXJl bmNlIHRvIG91dGxpdmUgT09NICovCisJZ2V0X2Fub25fdm1hKG1hcF92bWEtPmFub25fdm1hKTsK KwlwZGItPm1hcF9hbm9uX3ZtYSA9IG1hcF92bWEtPmFub25fdm1hOworCisJLyogd2lsbCBvbmx5 IGluY3JlbWVudCB0aGUgbWFwY291bnQgb2YgdGhpcyBwYWdlICovCisJcGFnZV9hZGRfYW5vbl9y bWFwKHJlcV9wYWdlLCBtYXBfdm1hLCBtYXBfaHZhLCBmYWxzZSk7CisKKwl1bmxvY2tfcGFnZShy ZXFfcGFnZSk7CisKKwkvKiBsb2NhbCBhY2NvdW50aW5nICovCisJYXRvbWljX2luYygmbWFwX2Nv dW50KTsKKworb3V0X3VubG9jazoKKwl1cF9yZWFkKCZtYXBfbW0tPm1tYXBfc2VtKTsKKworCXJl dHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbW1fcmVtb3RlX3Byb21vdGVfcGFnZShzdHJ1 Y3QgcGFnZSAqcmVxX3BhZ2UsCisJCQkJICBzdHJ1Y3QgYW5vbl92bWEgKnJlcV9hbm9uX3ZtYSwK KwkJCQkgIHN0cnVjdCBwYWdlX2RiICpwZGIpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlsb2Nr X3BhZ2UocmVxX3BhZ2UpOworCisJLyoKKwkgKiBtYXliZSBzb21lIG90aGVyIHRocmVhZCBtYXBw aW5nIHRoZSBzYW1lIHBhZ2UgaW4gYW5vdGhlciBmaWxlCisJICogcmVhY2hlZCBoZXJlIGJlZm9y ZSB1cworCSAqLworCWlmIChQYWdlUmVtb3RlKHJlcV9wYWdlKSkgeworCQlyZXN1bHQgPSAtRUFM UkVBRFk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBtYWtlIHRoaXMgcGFnZSByZW1v dGUsIG1hcHBlZCBvbmx5IHVuZGVyIHRoZSB0YXJnZXQgKi8KKwlwZGItPnJlcV9hbm9uX3ZtYSA9 IHJlcV9hbm9uX3ZtYTsKKwlyZXFfcGFnZS0+bWFwcGluZyA9IFBhZ2VNYXBwaW5nKHBkYik7CisK KwltbV9yZW1vdGVfcGFnZV91bmV2aWN0YWJsZShyZXFfcGFnZSk7CisJYXRvbWljX2luYygmcnBn X2NvdW50KTsKKworb3V0X3VubG9jazoKKwl1bmxvY2tfcGFnZShyZXFfcGFnZSk7CisKKwlyZXR1 cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBtbV9yZW1vdGVfcmV2ZXJ0X3Byb21vdGUoc3Ry dWN0IHBhZ2UgKnJlcV9wYWdlKQoreworCXN0cnVjdCBwYWdlX2RiICpwZGI7CisKKwkvKiB0aGUg cGFnZSBtdXN0IGhhdmUgYmVlbiBtYWRlIHJlbW90ZSBieSB0aGlzIHRocmVhZCAqLworCUFTU0VS VChQYWdlUmVtb3RlKHJlcV9wYWdlKSk7CisKKwlsb2NrX3BhZ2UocmVxX3BhZ2UpOworCisJcGRi ID0gUmVtb3RlTWFwcGluZyhyZXFfcGFnZSk7CisKKwkvKiByZXZlcnQgdGhlIG1hcHBpbmcgYmFj ayB0byBhbm9uIHBhZ2UgbWFwcGVkIHVuZGVyIHRhcmdldCAqLworCXJlcV9wYWdlLT5tYXBwaW5n ID0gKHZvaWQgKilwZGItPnJlcV9hbm9uX3ZtYSArIFBBR0VfTUFQUElOR19BTk9OOworCXBkYi0+ cmVxX2Fub25fdm1hID0gTlVMTDsKKworCW1tX3JlbW90ZV9wYWdlX2V2aWN0YWJsZShyZXFfcGFn ZSk7CisJQlVHX09OKGF0b21pY19hZGRfbmVnYXRpdmUoLTEsICZycGdfY291bnQpKTsKKworCXVu bG9ja19wYWdlKHJlcV9wYWdlKTsKK30KKworc3RhdGljIGludCBtbV9yZW1vdGVfZG9fbWFwKHN0 cnVjdCBtbV9zdHJ1Y3QgKnJlcV9tbSwgdW5zaWduZWQgbG9uZyByZXFfaHZhLAorCQkJICAgIHN0 cnVjdCBtbV9zdHJ1Y3QgKm1hcF9tbSwgdW5zaWduZWQgbG9uZyBtYXBfaHZhLAorCQkJICAgIHN0 cnVjdCBwYWdlX2RiICpwZGIpCit7CisJc3RydWN0IHBhZ2UgKnJlcV9wYWdlOworCXN0cnVjdCBh bm9uX3ZtYSAqcmVxX2Fub25fdm1hOworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBtbV9yZW1v dGVfZ2V0X3JlcShyZXFfbW0sIHJlcV9odmEsICZyZXFfcGFnZSwgJnJlcV9hbm9uX3ZtYSk7CisJ aWYgKElTX0VSUl9WQUxVRSgobG9uZylyZXN1bHQpKQorCQlyZXR1cm4gcmVzdWx0OworCisJcmVz dWx0ID0gbW1fcmVtb3RlX3Byb21vdGVfcGFnZShyZXFfcGFnZSwgcmVxX2Fub25fdm1hLCBwZGIp OworCWlmIChJU19FUlJfVkFMVUUoKGxvbmcpcmVzdWx0KSkKKwkJZ290byBvdXRfcHV0OworCisJ cmVzdWx0ID0gbW1fcmVtb3RlX3JlbWFwKG1hcF9tbSwgbWFwX2h2YSwgcmVxX3BhZ2UsIHJlcV9h bm9uX3ZtYSwgcGRiKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKChsb25nKXJlc3VsdCkpCisJCWdvdG8g b3V0X3JldmVydDsKKworCXJldHVybiAwOworCitvdXRfcmV2ZXJ0OgorCW1tX3JlbW90ZV9yZXZl cnRfcHJvbW90ZShyZXFfcGFnZSk7CitvdXRfcHV0OgorCW1tX3JlbW90ZV9wdXRfcmVxKHJlcV9w YWdlLCByZXFfYW5vbl92bWEpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBt bV9yZW1vdGVfbWFwX2ZpbGUoc3RydWN0IGZpbGVfZGIgKmZkYiwgc3RydWN0IG1tX3N0cnVjdCAq cmVxX21tLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyByZXFfaHZhLCB1bnNpZ25lZCBsb25nIG1h cF9odmEpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbWFwX21tID0gY3VycmVudC0+bW07CisJc3Ry dWN0IHBhZ2VfZGIgKnBkYjsKKwlpbnQgcmVzdWx0ID0gMDsKKworCS8qIHRyaWVzIHRvIGFkZCB0 aGUgZW50cnkgaW4gdGhlIHRyZWUgKi8KKwlwZGIgPSBwYWdlX2RiX3Jlc2VydmUoZmRiLCByZXFf bW0sIHJlcV9odmEsIG1hcF9odmEpOworCWlmIChJU19FUlJfVkFMVUUocGRiKSkKKwkJcmV0dXJu IFBUUl9FUlIocGRiKTsKKworCS8qIGRvIHRoZSBhY3R1YWwgbWVtb3J5IG1hcHBpbmcgKi8KKwly ZXN1bHQgPSBtbV9yZW1vdGVfZG9fbWFwKHJlcV9tbSwgcmVxX2h2YSwgbWFwX21tLCBtYXBfaHZh LCBwZGIpOworCWlmIChJU19FUlJfVkFMVUUoKGxvbmcpcmVzdWx0KSkKKwkJZ290byBvdXRfcGRi OworCisJLyogYWRkIG1hcHBpbmcgdG8gdGFyZ2V0IGRhdGFiYXNlICovCisJcmVzdWx0ID0gcGFn ZV9kYl9hZGRfdGFyZ2V0KHBkYiwgcmVxX21tLCBtYXBfbW0pOworCWlmIChJU19FUlJfVkFMVUUo KGxvbmcpcmVzdWx0KSkgeworCQltbV9yZW1vdGVfZG9fdW5tYXAobWFwX21tLCBtYXBfaHZhKTsK KwkJZ290byBvdXRfcGRiOworCX0KKworCS8qIG1hcmtzIGFzIG1hcHBlZCAmIGRyb3BzIHJlZmVy ZW5jZSAqLworCXBhZ2VfZGJfZ290X21hcHBlZChwZGIpOworCisJcmV0dXJuIDA7CisKK291dF9w ZGI6CisJLyogcmVtb3ZlcyB0aGUgZW50cnkgZnJvbSB0aGUgdHJlZSAmIGRyb3BzIHJlZmVyZW5j ZSAqLworCXBhZ2VfZGJfdW5yZXNlcnZlKGZkYiwgcGRiKTsKKworCXJldHVybiByZXN1bHQ7Cit9 CisKK2ludCBtbV9yZW1vdGVfbWFwKHN0cnVjdCBtbV9zdHJ1Y3QgKnJlcV9tbSwKKwkJICB1bnNp Z25lZCBsb25nIHJlcV9odmEsIHVuc2lnbmVkIGxvbmcgbWFwX2h2YSkKK3sKKwlzdHJ1Y3QgbW1f c3RydWN0ICptYXBfbW0gPSBjdXJyZW50LT5tbTsKKwlzdHJ1Y3QgY2xpZW50X2RiICpjZGI7CisJ c3RydWN0IGZpbGVfZGIgKmZkYjsKKwlpbnQgcmVzdWx0ID0gMDsKKworCXByX2RlYnVnKCIlczog cmVxX21tICUwMTZseCwgcmVxX2h2YSAlMDE2bHgsIG1hcF9odmEgJTAxNmx4XG4iLAorCQlfX2Z1 bmNfXywgKHVuc2lnbmVkIGxvbmcpcmVxX21tLCByZXFfaHZhLCBtYXBfaHZhKTsKKworCWNkYiA9 IGNsaWVudF9kYl9sb29rdXBfb3JfYWRkKG1hcF9tbSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGNk YikpCisJCXJldHVybiAoY2RiID09IE5VTEwpID8gLUVOT01FTSA6IFBUUl9FUlIoY2RiKTsKKwor CWZkYiA9IGNsaWVudF9kYl9wc2V1ZG9fZmlsZShjZGIpOworCWlmIChmZGIgPT0gTlVMTCkgewor CQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9jZGI7CisJfQorCisJLyogdHJ5IHRvIHBp biB0aGUgdGFyZ2V0IE1NIHNvIGl0IHdvbid0IGdvIGF3YXkgKi8KKwlpZiAoIW1tZ2V0X25vdF96 ZXJvKHJlcV9tbSkpIHsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfY2RiOworCX0K KworCXJlc3VsdCA9IG1tX3JlbW90ZV9tYXBfZmlsZShmZGIsIHJlcV9tbSwgcmVxX2h2YSwgbWFw X2h2YSk7CisJbW1wdXQocmVxX21tKTsKKworb3V0X2NkYjoKKwljbGllbnRfZGJfcHV0KGNkYik7 CisKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwobW1fcmVtb3RlX21hcCk7 CisKK3N0YXRpYyBpbnQgbW1fcmVtb3RlX2RvX3VubWFwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1hcF9t bSwgdW5zaWduZWQgbG9uZyBtYXBfaHZhKQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqbWFw X3ZtYTsKKwlwbWRfdCAqbWFwX3BtZDsKKwlzdHJ1Y3QgcGFnZSAqcmVxX3BhZ2UgPSBOVUxMOwor CXN0cnVjdCBhbm9uX3ZtYSAqcmVxX2Fub25fdm1hID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZV9kYiAq cGRiOworCWludCByZXN1bHQgPSAwOworCisJLyogdGhpcyBhbGxvd3MgZmF1bHRpbmcgdG8gaGFw cGVuICovCisJZG93bl9yZWFkKCZtYXBfbW0tPm1tYXBfc2VtKTsKKworCS8qIGZpbmQgZGVzdGlu YXRpb24gVk1BIGZvciBtYXBwaW5nICovCisJbWFwX3ZtYSA9IGZpbmRfdm1hKG1hcF9tbSwgbWFw X2h2YSk7CisJaWYgKHVubGlrZWx5KG1hcF92bWEgPT0gTlVMTCkpIHsKKwkJcmVzdWx0ID0gLUVO T0VOVDsKKwkJcHJfZXJyKCJubyBsb2NhbCBWTUEgZm91bmQgZm9yIHVubWFwcGluZ1xuIik7CisJ CWdvdG8gb3V0OworCX0KKworCW1hcF9wbWQgPSBtbV9maW5kX3BtZChtYXBfbW0sIG1hcF9odmEp OworCWlmICh1bmxpa2VseSghbWFwX3BtZCkpIHsKKwkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJcHJf ZXJyKCJsb2NhbCBQTUQgbm90IGZvdW5kIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGdldCBw YWdlIG1hcHBlZCB0byBkZXN0aW5hdGlvbiBhZGRyZXNzIC0gd2Uga25vdyBpdCBpcyB0aGVyZSAq LworCXJlcV9wYWdlID0gZm9sbG93X3BhZ2UobWFwX3ZtYSwgbWFwX2h2YSwgRk9MTF9HRVQgfCBG T0xMX01JR1JBVElPTik7CisJaWYgKElTX0VSUl9WQUxVRShyZXFfcGFnZSkpIHsKKwkJcmVzdWx0 ID0gUFRSX0VSUihyZXFfcGFnZSk7CisJCXJlcV9wYWdlID0gTlVMTDsKKwkJcHJfZXJyKCJmb2xs b3dfcGFnZSgpIGZhaWxlZDogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gb3V0OworCX0gZWxzZSBp ZiAodW5saWtlbHkocmVxX3BhZ2UgPT0gTlVMTCkpIHsKKwkJcmVzdWx0ID0gLUVOT0VOVDsKKwkJ cHJfZXJyKCJmb2xsb3dfcGFnZSgpIHJldHVybmVkIG5vIHBhZ2VcbiIpOworCQlnb3RvIG91dDsK Kwl9CisKKwlBU1NFUlQoUGFnZVJlbW90ZShyZXFfcGFnZSkpOworCXBkYiA9IFJlbW90ZU1hcHBp bmcocmVxX3BhZ2UpOworCisJbG9ja19wYWdlKHJlcV9wYWdlKTsKKworCS8qIGFsc28gY2FsbHMg cGFnZV9yZW1vdmVfcm1hcCgpICovCisJbW1fcmVtb3RlX2ludmFsaWRhdGVfcHRlKG1hcF92bWEs IG1hcF9odmEsIG1hcF9wbWQsIHJlcV9wYWdlKTsKKworCXJlcV9hbm9uX3ZtYSA9IHBkYi0+cmVx X2Fub25fdm1hOworCXBkYi0+cmVxX2Fub25fdm1hID0gTlVMTDsKKworCS8qIHJlc3RvcmUgb3Jp Z2luYWwgcm1hcCAqLworCXJlcV9wYWdlLT5tYXBwaW5nID0gKHZvaWQgKilyZXFfYW5vbl92bWEg KyBQQUdFX01BUFBJTkdfQU5PTjsKKwltbV9yZW1vdGVfcGFnZV9ldmljdGFibGUocmVxX3BhZ2Up OworCUJVR19PTihhdG9taWNfYWRkX25lZ2F0aXZlKC0xLCAmcnBnX2NvdW50KSk7CisKKwkvKiBy ZWZjb3VudCB3YXMgaW5jcmVhc2VkIGluIG1tX3JlbW90ZV9yZW1hcCgpICovCisJcHV0X2Fub25f dm1hKHBkYi0+bWFwX2Fub25fdm1hKTsKKwlwZGItPm1hcF9hbm9uX3ZtYSA9IE5VTEw7CisKKwl1 bmxvY2tfcGFnZShyZXFfcGFnZSk7CisKKwkvKiBmb2xsb3dfcGFnZSguLi4sIEZPTExfR0VULi4u KSAqLworCXB1dF9wYWdlKHJlcV9wYWdlKTsKKworCUJVR19PTihhdG9taWNfYWRkX25lZ2F0aXZl KC0xLCAmbWFwX2NvdW50KSk7CisKKwkvKiByZWZlcmVuY2UgY291bnQgd2FzIGluYyBkdXJpbmcg bW1fcmVtb3RlX2dldF9yZXEoKSAqLworCW1tX3JlbW90ZV9wdXRfcmVxKHJlcV9wYWdlLCByZXFf YW5vbl92bWEpOworCitvdXQ6CisJdXBfcmVhZCgmbWFwX21tLT5tbWFwX3NlbSk7CisKKwlyZXR1 cm4gcmVzdWx0OworfQorCisvKgorICogSW4gY2FzZSB0aGUgY2xpZW50J3MgbWVtb3J5IGlzIHJl YXBlZCBieSB0aGUgT09NIGtpbGxlciwgdGhlIHJlbW90ZSBwYWdlcycKKyAqIHJlZmVyZW5jZSBj b3VudCArIG1hcGNvdW50IGlzIGRyb3BwZWQgYW5kIHRoZXkgYmVsb25nIGp1c3QgdG8gdGhlIHRh cmdldC4KKyAqLworc3RhdGljIGludCBtbV9yZW1vdGVfZG9fdW5tYXBfdGFyZ2V0KHN0cnVjdCBw YWdlX2RiICpwZGIpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqcmVxX21tID0gcGRiLT50YXJnZXQ7 CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICpyZXFfdm1hOworCXN0cnVjdCBwYWdlICpyZXFfcGFn ZSA9IE5VTEw7CisJc3RydWN0IGFub25fdm1hICpyZXFfYW5vbl92bWEgPSBOVUxMOworCWludCBy ZXN1bHQgPSAwOworCisJZG93bl9yZWFkKCZyZXFfbW0tPm1tYXBfc2VtKTsKKworCXJlcV92bWEg PSBmaW5kX3ZtYShyZXFfbW0sIHBkYi0+cmVxX2h2YSk7CisJaWYgKHVubGlrZWx5KHJlcV92bWEg PT0gTlVMTCkpIHsKKwkJcmVzdWx0ID0gLUVOT0VOVDsKKwkJcHJfZXJyKCJubyBzb3VyY2UgVk1B IGZvdW5kIGZvciB1bm1hcHBpbmdcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBwYWdlIGlz IHVuZXZpY3RhYmxlIC0gc2hvdWxkIGJlIG1hcHBlZCAqLworCXJlcV9wYWdlID0gZm9sbG93X3Bh Z2UocmVxX3ZtYSwgcGRiLT5yZXFfaHZhLCBGT0xMX0dFVCB8IEZPTExfTUlHUkFUSU9OKTsKKwlp ZiAoSVNfRVJSX1ZBTFVFKHJlcV9wYWdlKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKHJlcV9wYWdl KTsKKwkJcmVxX3BhZ2UgPSBOVUxMOworCQlwcl9lcnIoImZvbGxvd19wYWdlKCkgZmFpbGVkOiAl ZFxuIiwgcmVzdWx0KTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmICh1bmxpa2VseShyZXFfcGFn ZSA9PSBOVUxMKSkgeworCQlyZXN1bHQgPSAtRU5PRU5UOworCQlwcl9lcnIoImZvbGxvd19wYWdl KCkgcmV0dXJuZWQgbm8gcGFnZVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCUFTU0VSVChQYWdl UmVtb3RlKHJlcV9wYWdlKSk7CisJQVNTRVJUKHBkYiA9PSBSZW1vdGVNYXBwaW5nKHJlcV9wYWdl KSk7CisKKwkvKgorCSAqIHBhZ2VfcmVtb3ZlX3JtYXAoKSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQg d2hlbiB0aGUgcGFnZSB3YXMgdW5tYXBwZWQKKwkgKiBmcm9tIHRoZSBjbGllbnQsIG5vdyB3ZSBt dXN0IGhhdmUgYSBoaWdoZXIgcmVmY291bnQgZnJvbQorCSAqIGZvbGxvd19wYWdlKC4uLkZPTExf R0VULi4uKQorCSAqLworCisJbG9ja19wYWdlKHJlcV9wYWdlKTsKKworCXJlcV9hbm9uX3ZtYSA9 IHBkYi0+cmVxX2Fub25fdm1hOworCXBkYi0+cmVxX2Fub25fdm1hID0gTlVMTDsKKworCS8qIHJl c3RvcmUgb3JpZ2luYWwgcm1hcCAqLworCXJlcV9wYWdlLT5tYXBwaW5nID0gKHZvaWQgKilyZXFf YW5vbl92bWEgKyBQQUdFX01BUFBJTkdfQU5PTjsKKwltbV9yZW1vdGVfcGFnZV9ldmljdGFibGUo cmVxX3BhZ2UpOworCUJVR19PTihhdG9taWNfYWRkX25lZ2F0aXZlKC0xLCAmcnBnX2NvdW50KSk7 CisKKwkvKiByZWZjb3VudCB3YXMgaW5jcmVhc2VkIGluIG1tX3JlbW90ZV9yZW1hcCgpICovCisJ cHV0X2Fub25fdm1hKHBkYi0+bWFwX2Fub25fdm1hKTsKKwlwZGItPm1hcF9hbm9uX3ZtYSA9IE5V TEw7CisKKwl1bmxvY2tfcGFnZShyZXFfcGFnZSk7CisKKwlCVUdfT04oYXRvbWljX2FkZF9uZWdh dGl2ZSgtMSwgJm1hcF9jb3VudCkpOworCisJLyogY2xpZW50IGRvZXNuJ3QgbWFwIHRoaXMgcGFn ZSBhbnltb3JlLCBhIHNpbmdsZSByZWZjb3VudCB0byBkcm9wICovCisJbW1fcmVtb3RlX3B1dF9y ZXEocmVxX3BhZ2UsIHJlcV9hbm9uX3ZtYSk7CisKK291dDoKKwl1cF9yZWFkKCZyZXFfbW0tPm1t YXBfc2VtKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbW1fcmVtb3RlX3Vu bWFwX2ZpbGUoc3RydWN0IGZpbGVfZGIgKmZkYiwgdW5zaWduZWQgbG9uZyBtYXBfaHZhKQorewor CXN0cnVjdCBtbV9zdHJ1Y3QgKm1hcF9tbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCBtbV9zdHJ1 Y3QgKnJlcV9tbTsKKwlzdHJ1Y3QgcGFnZV9kYiAqcGRiOworCWludCByZXN1bHQ7CisKKwkvKiB0 YWtlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhpcyBwZGIgKi8KKwlwZGIgPSBwYWdlX2RiX2JlZ2lu X3VubWFwKGZkYiwgbWFwX2h2YSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKHBkYikpCisJCXJldHVy biAocGRiID09IE5VTEwpID8gLUVOT0VOVCA6IFBUUl9FUlIocGRiKTsKKworCS8qIHRlc3QgaWYg b3RoZXIgdGhyZWFkIHVubWFwcGVkIHRoaXMgYWRkcmVzcyBiZWZvcmUgdXMgKi8KKwlpZiAoIXRl c3RfYml0KE1BUFBFRF9CSVQsICh1bnNpZ25lZCBsb25nICopJnBkYi0+ZmxhZ3MpKSB7CisJCXJl c3VsdCA9IC1FQUxSRUFEWTsKKwkJZ290byBqdXN0X3JlbGVhc2U7CisJfQorCisJLyogYWxzbyBk aXNjb25uZWN0IGZyb20gdGFyZ2V0IC0gY2FuIGZhaWwgaWYgdGFyZ2V0IGV4aXRlZCAqLworCXJl c3VsdCA9IHBhZ2VfZGJfcmVtb3ZlX3RhcmdldChwZGIpOworCWlmIChJU19FUlJfVkFMVUUoKGxv bmcpcmVzdWx0KSkKKwkJcHJfZGVidWcoIiVzOiBwYWdlX2RiX3JlbW92ZV90YXJnZXQoKSBmYWls ZWQ6ICVkXG4iLAorCQkJX19mdW5jX18sIHJlc3VsdCk7CisKKwkvKiB0aGUgdW5tYXBwaW5nIGlz IGRvbmUgb24gbG9jYWwgbW0gb25seSAqLworCXJlc3VsdCA9IG1tX3JlbW90ZV9kb191bm1hcCht YXBfbW0sIG1hcF9odmEpOworCWlmIChJU19FUlJfVkFMVUUoKGxvbmcpcmVzdWx0KSkgeworCQlw cl9kZWJ1ZygiJXM6IG1tX3JlbW90ZV9kb191bm1hcCgpIGZhaWxlZDogJWQsIHRyeWluZyB0YXJn ZXRcbiIsCisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKKworCQlyZXFfbW0gPSBwZGItPnRhcmdldDsK KwkJaWYgKG1tZ2V0X25vdF96ZXJvKHJlcV9tbSkpIHsKKwkJCXJlc3VsdCA9IG1tX3JlbW90ZV9k b191bm1hcF90YXJnZXQocGRiKTsKKworCQkJbW1wdXQocmVxX21tKTsKKwkJfQorCX0KKworanVz dF9yZWxlYXNlOgorCS8qIG1hcmtzIGFzIHVubWFwcGVkICYgZHJvcHMgcmVmZXJlbmNlICovCisJ cGFnZV9kYl9lbmRfdW5tYXAoZmRiLCBwZGIpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50 IG1tX3JlbW90ZV91bm1hcCh1bnNpZ25lZCBsb25nIG1hcF9odmEpCit7CisJc3RydWN0IG1tX3N0 cnVjdCAqbWFwX21tID0gY3VycmVudC0+bW07CisJc3RydWN0IGNsaWVudF9kYiAqY2RiOworCXN0 cnVjdCBmaWxlX2RiICpmZGI7CisJaW50IHJlc3VsdDsKKworCXByX2RlYnVnKCIlczogbWFwX2h2 YSAlMDE2bHhcbiIsIF9fZnVuY19fLCBtYXBfaHZhKTsKKworCWNkYiA9IGNsaWVudF9kYl9sb29r dXBfb3JfYWRkKG1hcF9tbSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGNkYikpCisJCXJldHVybiAo Y2RiID09IE5VTEwpID8gLUVOT01FTSA6IFBUUl9FUlIoY2RiKTsKKworCWZkYiA9IGNsaWVudF9k Yl9wc2V1ZG9fZmlsZShjZGIpOworCWlmIChmZGIgPT0gTlVMTCkgeworCQlyZXN1bHQgPSAtRU5P TUVNOworCQlnb3RvIG91dF9jZGI7CisJfQorCisJcmVzdWx0ID0gbW1fcmVtb3RlX3VubWFwX2Zp bGUoZmRiLCBtYXBfaHZhKTsKKworb3V0X2NkYjoKKwljbGllbnRfZGJfcHV0KGNkYik7CisKKwly ZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwobW1fcmVtb3RlX3VubWFwKTsKKwor LyogY2FsbGVkIG9uIGJlaGFsZiBvZiB0aGUgY2xpZW50ICovCit2b2lkIG1tX3JlbW90ZV9yZXNl dCh2b2lkKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1hcF9tbSA9IGN1cnJlbnQtPm1tOworCXN0 cnVjdCBjbGllbnRfZGIgKmNkYjsKKworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJ LyogYWxzbyBnZXRzIHJlZmVyZW5jZSB0byBlbnRyeSAqLworCWNkYiA9IGNsaWVudF9kYl9sb29r dXAobWFwX21tKTsKKwlpZiAoY2RiID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIG5vIGxvY2tp bmcgaGVyZSwgd2UgaGF2ZSBleGNsdXNpdmUgYWNjZXNzICovCisJbW1fcmVtb3RlX2RiX2NsaWVu dF9yZWxlYXNlKGNkYik7CisKKwljbGllbnRfZGJfcHV0KGNkYik7Cit9CitFWFBPUlRfU1lNQk9M X0dQTChtbV9yZW1vdGVfcmVzZXQpOworCitzdGF0aWMgaW50IHJlbW1hcF9kZXZfb3BlbihzdHJ1 Y3QgaW5vZGUgKmlub2RlcCwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGZpbGVfZGIg KmZkYjsKKwlzdHJ1Y3QgY2xpZW50X2RiICpjZGI7CisJaW50IHJlc3VsdCA9IDA7CisKKwlmZGIg PSBmaWxlX2RiX2FsbG9jKCk7CisJaWYgKGZkYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsK KworCS8qIHdlIG5lZWQgdGhlIG1tIHRvIGV4aXN0IGF0IGZpbGUgY2xvc2luZyB0aW1lICovCisJ bW1nZXQoY3VycmVudC0+bW0pOworCisJY2RiID0gY2xpZW50X2RiX2xvb2t1cF9vcl9hZGQoY3Vy cmVudC0+bW0pOworCWlmIChJU19FUlJfT1JfTlVMTChjZGIpKSB7CisJCXJlc3VsdCA9IChjZGIg PT0gTlVMTCkgPyAtRU5PTUVNIDogUFRSX0VSUihjZGIpOworCQlnb3RvIG91dF9lcnI7CisJfQor CisJZmRiLT5jZGIgPSBjZGI7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gZmRiOworCisJLyogYnkg cGlubmluZyB0aGUgbW0gd2UgYWxzbyBtYWtlIHN1cmUgdGhlIGNkYiBkb2VzIG5vdCBnZXQgcmVs ZWFzZWQgKi8KKwljbGllbnRfZGJfcHV0KGNkYik7CisKKwlyZXR1cm4gMDsKKworb3V0X2VycjoK KwltbXB1dChjdXJyZW50LT5tbSk7CisJZmlsZV9kYl9mcmVlKGZkYik7CisKKwlyZXR1cm4gcmVz dWx0OworfQorCitzdGF0aWMgbG9uZyByZW1tYXBfZGV2X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxw LCB1bnNpZ25lZCBpbnQgaW9jdGwsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZv aWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopIGFyZzsKKwlzdHJ1Y3QgZmlsZV9kYiAq ZmRiID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjbGllbnRfZGIgKmNkYiA9IGZkYi0+ Y2RiOworCWxvbmcgcmVzdWx0ID0gMDsKKworCWlmIChjdXJyZW50LT5tbSAhPSBjZGItPm1tKSB7 CisJCXByX2VycigiaW9jdGwgcmVxdWVzdCBieSBkaWZmZXJlbnQgcHJvY2Vzc1xuIik7CisJCXJl dHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoaW9jdGwpIHsKKwljYXNlIFJFTU9URV9NQVA6 IHsKKwkJc3RydWN0IHJlbW90ZV9tYXBfcmVxdWVzdCByZXE7CisJCXN0cnVjdCB0YXNrX3N0cnVj dCAqcmVxX3Rhc2s7CisJCXN0cnVjdCBtbV9zdHJ1Y3QgKnJlcV9tbTsKKworCQlyZXN1bHQgPSAt RUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJlcSwgYXJncCwgc2l6ZW9mKHJlcSkpKQor CQkJYnJlYWs7CisKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJaWYgKCFhY2Nlc3Nfb2socmVxLm1h cF9odmEsIFBBR0VfU0laRSkpCisJCQlicmVhazsKKwkJaWYgKHJlcS5yZXFfaHZhICYgflBBR0Vf TUFTSykKKwkJCWJyZWFrOworCQlpZiAocmVxLm1hcF9odmEgJiB+UEFHRV9NQVNLKQorCQkJYnJl YWs7CisKKwkJcmVzdWx0ID0gLUVTUkNIOworCQlyZXFfdGFzayA9IGZpbmRfZ2V0X3Rhc2tfYnlf dnBpZChyZXEucmVxX3BpZCk7CisJCWlmIChyZXFfdGFzayA9PSBOVUxMKQorCQkJYnJlYWs7CisK KwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJcmVxX21tID0gZ2V0X3Rhc2tfbW0ocmVxX3Rhc2spOwor CQlwdXRfdGFza19zdHJ1Y3QocmVxX3Rhc2spOworCQlpZiAocmVxX21tID09IE5VTEwpCisJCQli cmVhazsKKworCQlyZXN1bHQgPSBtbV9yZW1vdGVfbWFwX2ZpbGUoZmRiLCByZXFfbW0sIHJlcS5y ZXFfaHZhLCByZXEubWFwX2h2YSk7CisJCW1tcHV0KHJlcV9tbSk7CisKKwkJYnJlYWs7CisJfQor CisJY2FzZSBSRU1PVEVfVU5NQVA6IHsKKwkJdW5zaWduZWQgbG9uZyBtYXBfaHZhID0gKHVuc2ln bmVkIGxvbmcpIGFyZzsKKworCQlyZXN1bHQgPSAtRUlOVkFMOworCQlpZiAoIWFjY2Vzc19vayht YXBfaHZhLCBQQUdFX1NJWkUpKQorCQkJYnJlYWs7CisJCWlmIChtYXBfaHZhICYgflBBR0VfTUFT SykKKwkJCWJyZWFrOworCisJCXJlc3VsdCA9IG1tX3JlbW90ZV91bm1hcF9maWxlKGZkYiwgbWFw X2h2YSk7CisKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJcHJfZXJyKCJpb2N0bCAlZCBu b3QgaW1wbGVtZW50ZWRcbiIsIGlvY3RsKTsKKwkJcmVzdWx0ID0gLUVOT1RUWTsKKwl9CisKKwly ZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHJlbW1hcF9kZXZfcmVsZWFzZShzdHJ1Y3Qg aW5vZGUgKmlub2RlcCwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGZpbGVfZGIgKmZk YiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY2xpZW50X2RiICpjZGIgPSBmZGItPmNk YjsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGNkYi0+bW07CisKKwltbV9yZW1vdGVfZGJfZmls ZV9yZWxlYXNlKGZkYik7CisJZmlsZV9kYl9mcmVlKGZkYik7CisKKwkvKgorCSAqIHdlIG1heSBo YXZlIHJlYWNoZWQgaGVyZSBieSBraWxsaW5nIHRoZSBjbGllbnQgcHJvY2VzcywKKwkgKiBjdXJy ZW50LT5tbSBpcyBub3QgYWNjZXNzaWJsZSBhbnltb3JlCisJICovCisJbW1wdXQobW0pOworCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlbW1h cF9vcHMgPSB7CisJLm9wZW4gPSByZW1tYXBfZGV2X29wZW4sCisJLnVubG9ja2VkX2lvY3RsID0g cmVtbWFwX2Rldl9pb2N0bCwKKwkuY29tcGF0X2lvY3RsID0gcmVtbWFwX2Rldl9pb2N0bCwKKwku cmVsZWFzZSA9IHJlbW1hcF9kZXZfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2Rl dmljZSByZW1tYXBfZGV2ID0geworCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFt ZSA9ICJyZW1vdGUtbWFwIiwKKwkuZm9wcyA9ICZyZW1tYXBfb3BzLAorfTsKKworYnVpbHRpbl9t aXNjX2RldmljZShyZW1tYXBfZGV2KTsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGlj IHZvaWQgX19pbml0IG1tX3JlbW90ZV9kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwltbV9yZW1vdGVf ZGVidWdmc19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInJlbW90ZV9tYXBwaW5nIiwgTlVMTCk7 CisJaWYgKG1tX3JlbW90ZV9kZWJ1Z2ZzX2RpciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlkZWJ1 Z2ZzX2NyZWF0ZV9hdG9taWNfdCgibWFwX2NvdW50IiwgMDQ0NCwgbW1fcmVtb3RlX2RlYnVnZnNf ZGlyLAorCQkJCSZtYXBfY291bnQpOworCWRlYnVnZnNfY3JlYXRlX2F0b21pY190KCJwZGJfY291 bnQiLCAwNDQ0LCBtbV9yZW1vdGVfZGVidWdmc19kaXIsCisJCQkJJnBkYl9jb3VudCk7CisJZGVi dWdmc19jcmVhdGVfYXRvbWljX3QoInJwZ19jb3VudCIsIDA0NDQsIG1tX3JlbW90ZV9kZWJ1Z2Zz X2RpciwKKwkJCQkmcnBnX2NvdW50KTsKKworCWRlYnVnZnNfY3JlYXRlX2F0b21pY190KCJzdGF0 X2VtcHR5X3B0ZSIsIDA0NDQsIG1tX3JlbW90ZV9kZWJ1Z2ZzX2RpciwKKwkJCQkmc3RhdF9lbXB0 eV9wdGUpOworCWRlYnVnZnNfY3JlYXRlX2F0b21pY190KCJzdGF0X21hcHBlZF9wdGUiLCAwNDQ0 LCBtbV9yZW1vdGVfZGVidWdmc19kaXIsCisJCQkJJnN0YXRfbWFwcGVkX3B0ZSk7CisJZGVidWdm c19jcmVhdGVfYXRvbWljX3QoInN0YXRfc3dhcF9wdGUiLCAwNDQ0LCBtbV9yZW1vdGVfZGVidWdm c19kaXIsCisJCQkJJnN0YXRfc3dhcF9wdGUpOworCWRlYnVnZnNfY3JlYXRlX2F0b21pY190KCJz dGF0X3JlZmF1bHQiLCAwNDQ0LCBtbV9yZW1vdGVfZGVidWdmc19kaXIsCisJCQkJJnN0YXRfcmVm YXVsdCk7Cit9CisjZWxzZSAvKiBDT05GSUdfREVCVUdfRlMgKi8KK3N0YXRpYyB2b2lkIF9faW5p dCBtbV9yZW1vdGVfZGVidWdmc19pbml0KHZvaWQpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0RF QlVHX0ZTICovCisKK3N0YXRpYyBpbnQgX19pbml0IG1tX3JlbW90ZV9pbml0KHZvaWQpCit7CisJ cGRiX2NhY2hlID0gS01FTV9DQUNIRShwYWdlX2RiLCBTTEFCX1BBTklDIHwgU0xBQl9BQ0NPVU5U KTsKKwlpZiAoIXBkYl9jYWNoZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltbV9yZW1vdGVfZGVi dWdmc19pbml0KCk7CisKKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChtbV9yZW1vdGVf aW5pdCk7CmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggMDQ1NGVjYzI5 NTM3Li4zNTI1NzBkOWFkMjIgMTAwNjQ0Ci0tLSBhL21tL3JtYXAuYworKysgYi9tbS9ybWFwLmMK QEAgLTY1LDYgKzY1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlX2lkbGUuaD4KICNpbmNsdWRl IDxsaW51eC9tZW1yZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXJmYXVsdGZkX2suaD4KKyNp bmNsdWRlIDxsaW51eC9yZW1vdGVfbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNo Lmg+CiAKQEAgLTg1Niw3ICs4NTcsNyBAQCBpbnQgcGFnZV9yZWZlcmVuY2VkKHN0cnVjdCBwYWdl ICpwYWdlLAogCWlmICghcGFnZV9ybWFwcGluZyhwYWdlKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAo IWlzX2xvY2tlZCAmJiAoIVBhZ2VBbm9uKHBhZ2UpIHx8IFBhZ2VLc20ocGFnZSkpKSB7CisJaWYg KCFpc19sb2NrZWQgJiYgKCFQYWdlQW5vbihwYWdlKSB8fCBQYWdlS3NtKHBhZ2UpIHx8IFBhZ2VS ZW1vdGUocGFnZSkpKSB7CiAJCXdlX2xvY2tlZCA9IHRyeWxvY2tfcGFnZShwYWdlKTsKIAkJaWYg KCF3ZV9sb2NrZWQpCiAJCQlyZXR1cm4gMTsKQEAgLTEwMjEsNyArMTAyMiw3IEBAIHZvaWQgcGFn ZV9tb3ZlX2Fub25fcm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0 ICp2bWEpCiAgKiBfX3BhZ2Vfc2V0X2Fub25fcm1hcCAtIHNldCB1cCBuZXcgYW5vbnltb3VzIHJt YXAKICAqIEBwYWdlOglQYWdlIG9yIEh1Z2VwYWdlIHRvIGFkZCB0byBybWFwCiAgKiBAdm1hOglW TSBhcmVhIHRvIGFkZCBwYWdlIHRvLgotICogQGFkZHJlc3M6CVVzZXIgdmlydHVhbCBhZGRyZXNz IG9mIHRoZSBtYXBwaW5nCQorICogQGFkZHJlc3M6CVVzZXIgdmlydHVhbCBhZGRyZXNzIG9mIHRo ZSBtYXBwaW5nCiAgKiBAZXhjbHVzaXZlOgl0aGUgcGFnZSBpcyBleGNsdXNpdmVseSBvd25lZCBi eSB0aGUgY3VycmVudCBwcm9jZXNzCiAgKi8KIHN0YXRpYyB2b2lkIF9fcGFnZV9zZXRfYW5vbl9y bWFwKHN0cnVjdCBwYWdlICpwYWdlLApAQCAtMTEyNSw3ICsxMTI2LDggQEAgdm9pZCBkb19wYWdl X2FkZF9hbm9uX3JtYXAoc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQlfX2luY19ub2RlX3BhZ2Vfc3Rh dGUocGFnZSwgTlJfQU5PTl9USFBTKTsKIAkJX19tb2Rfbm9kZV9wYWdlX3N0YXRlKHBhZ2VfcGdk YXQocGFnZSksIE5SX0FOT05fTUFQUEVELCBucik7CiAJfQotCWlmICh1bmxpa2VseShQYWdlS3Nt KHBhZ2UpKSkKKworCWlmICh1bmxpa2VseShQYWdlS3NtKHBhZ2UpIHx8IFBhZ2VSZW1vdGUocGFn ZSkpKQogCQlyZXR1cm47CiAKIAlWTV9CVUdfT05fUEFHRSghUGFnZUxvY2tlZChwYWdlKSwgcGFn ZSk7CkBAIC0xODk3LDYgKzE4OTksOCBAQCB2b2lkIHJtYXBfd2FsayhzdHJ1Y3QgcGFnZSAqcGFn ZSwgc3RydWN0IHJtYXBfd2Fsa19jb250cm9sICpyd2MpCiB7CiAJaWYgKHVubGlrZWx5KFBhZ2VL c20ocGFnZSkpKQogCQlybWFwX3dhbGtfa3NtKHBhZ2UsIHJ3Yyk7CisJZWxzZSBpZiAodW5saWtl bHkoUGFnZVJlbW90ZShwYWdlKSkpCisJCXJtYXBfd2Fsa19yZW1vdGUocGFnZSwgcndjKTsKIAll bHNlIGlmIChQYWdlQW5vbihwYWdlKSkKIAkJcm1hcF93YWxrX2Fub24ocGFnZSwgcndjLCBmYWxz ZSk7CiAJZWxzZQpAQCAtMTkwNiw4ICsxOTEwLDkgQEAgdm9pZCBybWFwX3dhbGsoc3RydWN0IHBh Z2UgKnBhZ2UsIHN0cnVjdCBybWFwX3dhbGtfY29udHJvbCAqcndjKQogLyogTGlrZSBybWFwX3dh bGssIGJ1dCBjYWxsZXIgaG9sZHMgcmVsZXZhbnQgcm1hcCBsb2NrICovCiB2b2lkIHJtYXBfd2Fs a19sb2NrZWQoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBybWFwX3dhbGtfY29udHJvbCAqcndj KQogewotCS8qIG5vIGtzbSBzdXBwb3J0IGZvciBub3cgKi8KKwkvKiBubyBrc20vcmVtb3RlIHN1 cHBvcnQgZm9yIG5vdyAqLwogCVZNX0JVR19PTl9QQUdFKFBhZ2VLc20ocGFnZSksIHBhZ2UpOwor CVZNX0JVR19PTl9QQUdFKFBhZ2VSZW1vdGUocGFnZSksIHBhZ2UpOwogCWlmIChQYWdlQW5vbihw YWdlKSkKIAkJcm1hcF93YWxrX2Fub24ocGFnZSwgcndjLCB0cnVlKTsKIAllbHNlCmRpZmYgLS1n aXQgYS9tbS92bXNjYW4uYyBiL21tL3Ztc2Nhbi5jCmluZGV4IGU5Nzk3MDViYmYzMi4uNjNlNGRm YjQ3N2RlIDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtNDI3 Nyw3ICs0Mjc3LDggQEAgaW50IHBhZ2VfZXZpY3RhYmxlKHN0cnVjdCBwYWdlICpwYWdlKQogCiAJ LyogUHJldmVudCBhZGRyZXNzX3NwYWNlIG9mIGlub2RlIGFuZCBzd2FwIGNhY2hlIGZyb20gYmVp bmcgZnJlZWQgKi8KIAlyY3VfcmVhZF9sb2NrKCk7Ci0JcmV0ID0gIW1hcHBpbmdfdW5ldmljdGFi bGUocGFnZV9tYXBwaW5nKHBhZ2UpKSAmJiAhUGFnZU1sb2NrZWQocGFnZSk7CisJcmV0ID0gIW1h cHBpbmdfdW5ldmljdGFibGUocGFnZV9tYXBwaW5nKHBhZ2UpKSAmJgorCQkhUGFnZU1sb2NrZWQo cGFnZSkgJiYgIVBhZ2VSZW1vdGUocGFnZSk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJu IHJldDsKIH0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K VmlydHVhbGl6YXRpb24gbWFpbGluZyBsaXN0ClZpcnR1YWxpemF0aW9uQGxpc3RzLmxpbnV4LWZv dW5kYXRpb24ub3JnCmh0dHBzOi8vbGlzdHMubGludXhmb3VuZGF0aW9uLm9yZy9tYWlsbWFuL2xp c3RpbmZvL3ZpcnR1YWxpemF0aW9u