From mboxrd@z Thu Jan 1 00:00:00 1970 From: Juergen Gross Subject: [PATCH v3 3/3] xen: optimize xenbus driver for multiple concurrent xenstore accesses Date: Mon, 23 Jan 2017 11:09:18 +0100 Message-ID: <20170123100918.13523-4-jgross__34093.1317689412$1485166280$gmane$org@suse.com> References: <20170123100918.13523-1-jgross@suse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cVbZ8-00081E-DR for xen-devel@lists.xenproject.org; Mon, 23 Jan 2017 10:09:34 +0000 In-Reply-To: <20170123100918.13523-1-jgross@suse.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org Cc: Juergen Gross , boris.ostrovsky@oracle.com List-Id: xen-devel@lists.xenproject.org SGFuZGxpbmcgb2YgbXVsdGlwbGUgY29uY3VycmVudCBYZW5zdG9yZSBhY2Nlc3NlcyB0aHJvdWdo IHhlbmJ1cyBkcml2ZXIKZWl0aGVyIGZyb20gdGhlIGtlcm5lbCBvciB1c2VyIGxhbmQgaXMgcmF0 aGVyIGxhbWUgdG9kYXk6IHhlbmJ1cyBpcwpjYXBhYmxlIHRvIGhhdmUgb25lIGFjY2VzcyBhY3Rp dmUgb25seSBhdCBvbmUgcG9pbnQgb2YgdGltZS4KClJld3JpdGUgeGVuYnVzIHRvIGhhbmRsZSBt dWx0aXBsZSByZXF1ZXN0cyBjb25jdXJyZW50bHkgYnkgbWFraW5nIHVzZQpvZiB0aGUgcmVxdWVz dCBpZCBvZiB0aGUgWGVuc3RvcmUgcHJvdG9jb2wuIFRoaXMgcmVxdWlyZXMgdG86CgotIEluc3Rl YWQgb2YgYmxvY2tpbmcgaW5zaWRlIHhiX3JlYWQoKSB3aGVuIHRyeWluZyB0byByZWFkIGRhdGEg ZnJvbQogIHRoZSB4ZW5zdG9yZSByaW5nIGJ1ZmZlciBkbyBzbyBvbmx5IGluIHRoZSBtYWluIGxv b3Agb2YKICB4ZW5idXNfdGhyZWFkKCkuCgotIEluc3RlYWQgb2YgZG9pbmcgd3JpdGVzIHRvIHRo ZSB4ZW5zdG9yZSByaW5nIGJ1ZmZlciBpbiB0aGUgY29udGV4dCBvZgogIHRoZSBjYWxsZXIganVz dCBxdWV1ZSB0aGUgcmVxdWVzdCBhbmQgZG8gdGhlIHdyaXRlIGluIHRoZSBkZWRpY2F0ZWQKICB4 ZW5idXMgdGhyZWFkLgoKLSBJbnN0ZWFkIG9mIGp1c3QgZm9yd2FyZGluZyB0aGUgcmVxdWVzdCBp ZCBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlciBvZgogIHhlbmJ1cyB0byB4ZW5zdG9yZSB1c2UgYSB4 ZW5idXMgaW50ZXJuYWwgdW5pcXVlIHJlcXVlc3QgaWQuIFRoaXMgd2lsbAogIGFsbG93IG11bHRp cGxlIG91dHN0YW5kaW5nIHJlcXVlc3RzLgoKLSBNb2RpZnkgdGhlIGxvY2tpbmcgc2NoZW1lIGlu IG9yZGVyIHRvIGFsbG93IG11bHRpcGxlIHJlcXVlc3RzIGJlaW5nCiAgYWN0aXZlIGluIHBhcmFs bGVsLgoKLSBJbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSByZXBseSBvZiBhIHVzZXIncyB4ZW5z dG9yZSByZXF1ZXN0IGFmdGVyCiAgd3JpdGluZyB0aGUgcmVxdWVzdCB0byB0aGUgeGVuc3RvcmUg cmluZyBidWZmZXIgcmV0dXJuIGRpcmVjdGx5IHRvCiAgdGhlIGNhbGxlciBhbmQgZG8gdGhlIHdh aXRpbmcgaW4gdGhlIHJlYWQgcGF0aC4KCkFkZGl0aW9uYWxseSBzaWduYWwgaGFuZGxpbmcgd2Fz IG9wdGltaXplZCBieSBhdm9pZGluZyB3YWtpbmcgdXAgdGhlCnhlbmJ1cyB0aHJlYWQgb3Igc2Vu ZGluZyBhbiBldmVudCB0byBYZW5zdG9yZSBpbiBjYXNlIHRoZSBhZGRyZXNzZWQKZW50aXR5IGlz IGtub3duIHRvIGJlIHJ1bm5pbmcgYWxyZWFkeS4KCkFzIGEgcmVzdWx0IGNvbW11bmljYXRpb24g d2l0aCBYZW5zdG9yZSBpcyBzcGVkIHVwIGJ5IGEgZmFjdG9yIG9mIHVwCnRvIDU6IGRlcGVuZGlu ZyBvbiB0aGUgcmVxdWVzdCB0eXBlIChyZWFkIG9yIHdyaXRlKSBhbmQgdGhlIGFtb3VudCBvZgpk YXRhIHRyYW5zZmVycmVkIHRoZSBnYWluIHdhcyBhdCBsZWFzdCAyMCUgKHNtYWxsIHJlYWRzKSBh bmQgd2VudCB1cCB0bwphIGZhY3RvciBvZiA1IGZvciBsYXJnZSB3cml0ZXMuCgpJbiB0aGUgZW5k IHNvbWUgbW9yZSByb3VnaCBlZGdlcyBvZiB4ZW5idXMgaGF2ZSBiZWVuIHNtb290aGVkOgoKLSBI YW5kbGluZyBvZiBtZW1vcnkgc2hvcnRhZ2Ugd2hlbiByZWFkaW5nIGZyb20geGVuc3RvcmUgcmlu ZyBidWZmZXIgaW4KICB0aGUgeGVuYnVzIGRyaXZlciB3YXMgbm90IG9wdGltYWw6IGl0IHdhcyBi dXN5IGxvb3BpbmcgYW5kIGlzc3VpbmcgYQogIHdhcm5pbmcgaW4gZWFjaCBsb29wLgoKLSBJbiBj YXNlIG9mIHhlbnN0b3JlIG5vdCBydW5uaW5nIGluIGRvbTAgYnV0IGluIGEgc3R1YmRvbSB3ZSBl bmQgdXAKICB3aXRoIHR3byB4ZW5idXMgdGhyZWFkcyBydW5uaW5nIGFzIHRoZSBpbml0aWFsaXph dGlvbiBvZiB4ZW5idXMgaW4KICBkb20wIGV4cGVjdGluZyBhIGxvY2FsIHhlbnN0b3JlZCB3aWxs IGJlIHJlZG9uZSBsYXRlciB3aGVuIGNvbm5lY3RpbmcKICB0byB0aGUgeGVuc3RvcmUgZG9tYWlu LiBVcCB0byBub3cgdGhpcyB3YXMgbm8gcHJvYmxlbSBhcyBsb2NraW5nCiAgd291bGQgcHJldmVu dCB0aGUgdHdvIHhlbmJ1cyB0aHJlYWRzIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlciwgYnV0 CiAgdGhpcyB3YXMganVzdCBhIHdhc3RlIG9mIGtlcm5lbCByZXNvdXJjZXMuCgotIEFuIG91dCBv ZiBtZW1vcnkgc2l0dWF0aW9uIHdoaWxlIHdyaXRpbmcgdG8gb3IgcmVhZGluZyBmcm9tIHRoZQog IHhlbnN0b3JlIHJpbmcgYnVmZmVyIG5vIGxvbmdlciB3aWxsIGxlYWQgdG8gYSBwb3NzaWJsZSBs b3NzIG9mCiAgc3luY2hyb25pemF0aW9uIHdpdGggeGVuc3RvcmUuCgotIFRoZSB1c2VyIHJlYWQg YW5kIHdyaXRlIHBhcnQgYXJlIG5vdyBpbnRlcnJ1cHRpYmxlIGJ5IHNpZ25hbHMuCgpTaWduZWQt b2ZmLWJ5OiBKdWVyZ2VuIEdyb3NzIDxqZ3Jvc3NAc3VzZS5jb20+Ci0tLQpWMzogLSBzaW1wbGlm eSB4c19yZXF1ZXN0X2VudGVyKCkgYXMgcmVxdWVzdGVkIGJ5IEJvcmlzIE9zdHJvdnNreQoKVjI6 IGFkZHJlc3MgY29tbWVudHMgb2YgQm9yaXMgT3N0cm92c2t5OgogICAgLSBndWFyZCB4c19yZXF1 ZXN0X2lkIGJ5IGxvY2sKICAgIC0gbW92ZSBzdGF0ZSBzdHJ1Y3QgZGVmaW5pdGlvbnMgdG8gdGhl IHBsYWNlIHdoZXJlIHRoZXkgYXJlIGJlaW5nCiAgICAgIHVzZWQKICAgIC0gcmF0ZSBsaW1pdCBz b21lIHdhcm5pbmdzCiAgICAtIHVzZSBiYXJyaWVyKCkgaW5zdGVhZCBvZiBjcHVfcmVsYXgoKQog ICAgLSBhZGQvcmVtb3ZlIHNvbWUgY29tbWVudHMKICAgIC0gbWlub3IgY2hhbmdlcyBsaWtlIG5h bWluZyBvZiB2YXJpYWJsZXMKLS0tCiBkcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzLmggICAgICAg ICAgICAgIHwgIDQ4ICsrLQogZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19jb21tcy5jICAgICAg ICB8IDMxMyArKysrKysrKysrKysrKysrLS0KIGRyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfZGV2 X2Zyb250ZW5kLmMgfCAxODggKysrKysrKy0tLS0KIGRyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNf eHMuYyAgICAgICAgICAgfCA1MzggKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLQogNCBm aWxlcyBjaGFuZ2VkLCA2ODQgaW5zZXJ0aW9ucygrKSwgNDAzIGRlbGV0aW9ucygtKQoKZGlmZiAt LWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXMuaCBiL2RyaXZlcnMveGVuL3hlbmJ1cy94 ZW5idXMuaAppbmRleCA1MTk5NTI3Li4xNDljNWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94 ZW5idXMveGVuYnVzLmgKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1cy5oCkBAIC0zMiw2 ICszMiwxMCBAQAogI2lmbmRlZiBfWEVOQlVTX1hFTkJVU19ICiAjZGVmaW5lIF9YRU5CVVNfWEVO QlVTX0gKIAorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+ CisjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgorCiAjZGVmaW5lIFhFTl9CVVNfSURfU0laRQkJCTIw CiAKIHN0cnVjdCB4ZW5fYnVzX3R5cGUgewpAQCAtNTIsMTYgKzU2LDQ5IEBAIGVudW0geGVuc3Rv cmVfaW5pdCB7CiAJWFNfTE9DQUwsCiB9OwogCitzdHJ1Y3QgeHNfd2F0Y2hfZXZlbnQgeworCXN0 cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXN0cnVjdCB4ZW5idXNf d2F0Y2ggKmhhbmRsZTsKKwljb25zdCBjaGFyICpwYXRoOworCWNvbnN0IGNoYXIgKnRva2VuOwor CWNoYXIgYm9keVtdOworfTsKKworZW51bSB4Yl9yZXFfc3RhdGUgeworCXhiX3JlcV9zdGF0ZV9x dWV1ZWQsCisJeGJfcmVxX3N0YXRlX3dhaXRfcmVwbHksCisJeGJfcmVxX3N0YXRlX2dvdF9yZXBs eSwKKwl4Yl9yZXFfc3RhdGVfYWJvcnRlZAorfTsKKworc3RydWN0IHhiX3JlcV9kYXRhIHsKKwlz dHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CisJc3RydWN0IHhz ZF9zb2NrbXNnIG1zZzsKKwllbnVtIHhzZF9zb2NrbXNnX3R5cGUgdHlwZTsKKwljaGFyICpib2R5 OworCWNvbnN0IHN0cnVjdCBrdmVjICp2ZWM7CisJaW50IG51bV92ZWNzOworCWludCBlcnI7CisJ ZW51bSB4Yl9yZXFfc3RhdGUgc3RhdGU7CisJdm9pZCAoKmNiKShzdHJ1Y3QgeGJfcmVxX2RhdGEg Kik7CisJdm9pZCAqcGFyOworfTsKKwogZXh0ZXJuIGVudW0geGVuc3RvcmVfaW5pdCB4ZW5fc3Rv cmVfZG9tYWluX3R5cGU7CiBleHRlcm4gY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqeGVu YnVzX2Rldl9ncm91cHNbXTsKK2V4dGVybiBzdHJ1Y3QgbXV0ZXggeHNfcmVzcG9uc2VfbXV0ZXg7 CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCB4c19yZXBseV9saXN0OworZXh0ZXJuIHN0cnVjdCBs aXN0X2hlYWQgeGJfd3JpdGVfbGlzdDsKK2V4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCB4Yl93YWl0 cTsKK2V4dGVybiBzdHJ1Y3QgbXV0ZXggeGJfd3JpdGVfbXV0ZXg7CiAKIGludCB4c19pbml0KHZv aWQpOwogaW50IHhiX2luaXRfY29tbXModm9pZCk7CiB2b2lkIHhiX2RlaW5pdF9jb21tcyh2b2lk KTsKLWludCB4Yl93cml0ZShjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKTsKLWlu dCB4Yl9yZWFkKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pOwotaW50IHhiX2RhdGFfdG9f cmVhZCh2b2lkKTsKLWludCB4Yl93YWl0X2Zvcl9kYXRhX3RvX3JlYWQodm9pZCk7CitpbnQgeHNf d2F0Y2hfbXNnKHN0cnVjdCB4c193YXRjaF9ldmVudCAqZXZlbnQpOwordm9pZCB4c19yZXF1ZXN0 X2V4aXQoc3RydWN0IHhiX3JlcV9kYXRhICpyZXEpOwogCiBpbnQgeGVuYnVzX21hdGNoKHN0cnVj dCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpfZHJ2KTsKIGludCB4ZW5idXNf ZGV2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKl9kZXYpOwpAQCAtOTIsNiArMTI5LDcgQEAgaW50IHhl bmJ1c19yZWFkX290aGVyZW5kX2RldGFpbHMoc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhlbmRldiwK IAogdm9pZCB4ZW5idXNfcmluZ19vcHNfaW5pdCh2b2lkKTsKIAotdm9pZCAqeGVuYnVzX2Rldl9y ZXF1ZXN0X2FuZF9yZXBseShzdHJ1Y3QgeHNkX3NvY2ttc2cgKm1zZyk7CitpbnQgeGVuYnVzX2Rl dl9yZXF1ZXN0X2FuZF9yZXBseShzdHJ1Y3QgeHNkX3NvY2ttc2cgKm1zZywgdm9pZCAqcGFyKTsK K3ZvaWQgeGVuYnVzX2Rldl9xdWV1ZV9yZXBseShzdHJ1Y3QgeGJfcmVxX2RhdGEgKnJlcSk7CiAK ICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19jb21tcy5jIGIv ZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19jb21tcy5jCmluZGV4IGMyMWVjMDIuLjg1NmFkYTUg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfY29tbXMuYworKysgYi9kcml2 ZXJzL3hlbi94ZW5idXMveGVuYnVzX2NvbW1zLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAogI2luY2x1 ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRl IDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxs aW51eC9lcnIuaD4KICNpbmNsdWRlIDx4ZW4veGVuYnVzLmg+CkBAIC00MiwxMSArNDMsMjIgQEAK ICNpbmNsdWRlIDx4ZW4vcGFnZS5oPgogI2luY2x1ZGUgInhlbmJ1cy5oIgogCisvKiBBIGxpc3Qg b2YgcmVwbGllcy4gQ3VycmVudGx5IG9ubHkgb25lIHdpbGwgZXZlciBiZSBvdXRzdGFuZGluZy4g Ki8KK0xJU1RfSEVBRCh4c19yZXBseV9saXN0KTsKKworLyogQSBsaXN0IG9mIHdyaXRlIHJlcXVl c3RzLiAqLworTElTVF9IRUFEKHhiX3dyaXRlX2xpc3QpOworREVDTEFSRV9XQUlUX1FVRVVFX0hF QUQoeGJfd2FpdHEpOworREVGSU5FX01VVEVYKHhiX3dyaXRlX211dGV4KTsKKworLyogUHJvdGVj dCB4ZW5idXMgcmVhZGVyIHRocmVhZCBhZ2FpbnN0IHNhdmUvcmVzdG9yZS4gKi8KK0RFRklORV9N VVRFWCh4c19yZXNwb25zZV9tdXRleCk7CisKIHN0YXRpYyBpbnQgeGVuYnVzX2lycTsKK3N0YXRp YyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnhlbmJ1c190YXNrOwogCiBzdGF0aWMgREVDTEFSRV9XT1JL KHByb2JlX3dvcmssIHhlbmJ1c19wcm9iZSk7CiAKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVf SEVBRCh4Yl93YWl0cSk7CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB3YWtlX3dhaXRpbmcoaW50IGly cSwgdm9pZCAqdW51c2VkKQogewpAQCAtODQsMzAgKzk2LDMxIEBAIHN0YXRpYyBjb25zdCB2b2lk ICpnZXRfaW5wdXRfY2h1bmsoWEVOU1RPUkVfUklOR19JRFggY29ucywKIAlyZXR1cm4gYnVmICsg TUFTS19YRU5TVE9SRV9JRFgoY29ucyk7CiB9CiAKK3N0YXRpYyBpbnQgeGJfZGF0YV90b193cml0 ZSh2b2lkKQoreworCXN0cnVjdCB4ZW5zdG9yZV9kb21haW5faW50ZXJmYWNlICppbnRmID0geGVu X3N0b3JlX2ludGVyZmFjZTsKKworCXJldHVybiAoaW50Zi0+cmVxX3Byb2QgLSBpbnRmLT5yZXFf Y29ucykgIT0gWEVOU1RPUkVfUklOR19TSVpFICYmCisJCSFsaXN0X2VtcHR5KCZ4Yl93cml0ZV9s aXN0KTsKK30KKwogLyoqCiAgKiB4Yl93cml0ZSAtIGxvdyBsZXZlbCB3cml0ZQogICogQGRhdGE6 IGJ1ZmZlciB0byBzZW5kCiAgKiBAbGVuOiBsZW5ndGggb2YgYnVmZmVyCiAgKgotICogUmV0dXJu cyAwIG9uIHN1Y2Nlc3MsIGVycm9yIG90aGVyd2lzZS4KKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5 dGVzIHdyaXR0ZW4gb3IgLWVyci4KICAqLwotaW50IHhiX3dyaXRlKGNvbnN0IHZvaWQgKmRhdGEs IHVuc2lnbmVkIGxlbikKK3N0YXRpYyBpbnQgeGJfd3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgdW5z aWduZWQgaW50IGxlbikKIHsKIAlzdHJ1Y3QgeGVuc3RvcmVfZG9tYWluX2ludGVyZmFjZSAqaW50 ZiA9IHhlbl9zdG9yZV9pbnRlcmZhY2U7CiAJWEVOU1RPUkVfUklOR19JRFggY29ucywgcHJvZDsK LQlpbnQgcmM7CisJdW5zaWduZWQgaW50IGJ5dGVzID0gMDsKIAogCXdoaWxlIChsZW4gIT0gMCkg ewogCQl2b2lkICpkc3Q7CiAJCXVuc2lnbmVkIGludCBhdmFpbDsKIAotCQlyYyA9IHdhaXRfZXZl bnRfaW50ZXJydXB0aWJsZSgKLQkJCXhiX3dhaXRxLAotCQkJKGludGYtPnJlcV9wcm9kIC0gaW50 Zi0+cmVxX2NvbnMpICE9Ci0JCQlYRU5TVE9SRV9SSU5HX1NJWkUpOwotCQlpZiAocmMgPCAwKQot CQkJcmV0dXJuIHJjOwotCiAJCS8qIFJlYWQgaW5kZXhlcywgdGhlbiB2ZXJpZnkuICovCiAJCWNv bnMgPSBpbnRmLT5yZXFfY29uczsKIAkJcHJvZCA9IGludGYtPnJlcV9wcm9kOwpAQCAtMTE1LDU5 ICsxMjgsNTcgQEAgaW50IHhiX3dyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxlbikK IAkJCWludGYtPnJlcV9jb25zID0gaW50Zi0+cmVxX3Byb2QgPSAwOwogCQkJcmV0dXJuIC1FSU87 CiAJCX0KLQotCQlkc3QgPSBnZXRfb3V0cHV0X2NodW5rKGNvbnMsIHByb2QsIGludGYtPnJlcSwg JmF2YWlsKTsKLQkJaWYgKGF2YWlsID09IDApCi0JCQljb250aW51ZTsKLQkJaWYgKGF2YWlsID4g bGVuKQotCQkJYXZhaWwgPSBsZW47CisJCWlmICgheGJfZGF0YV90b193cml0ZSgpKQorCQkJcmV0 dXJuIGJ5dGVzOwogCiAJCS8qIE11c3Qgd3JpdGUgZGF0YSAvYWZ0ZXIvIHJlYWRpbmcgdGhlIGNv bnN1bWVyIGluZGV4LiAqLwogCQl2aXJ0X21iKCk7CiAKKwkJZHN0ID0gZ2V0X291dHB1dF9jaHVu ayhjb25zLCBwcm9kLCBpbnRmLT5yZXEsICZhdmFpbCk7CisJCWlmIChhdmFpbCA9PSAwKQorCQkJ Y29udGludWU7CisJCWlmIChhdmFpbCA+IGxlbikKKwkJCWF2YWlsID0gbGVuOworCiAJCW1lbWNw eShkc3QsIGRhdGEsIGF2YWlsKTsKIAkJZGF0YSArPSBhdmFpbDsKIAkJbGVuIC09IGF2YWlsOwor CQlieXRlcyArPSBhdmFpbDsKIAogCQkvKiBPdGhlciBzaWRlIG11c3Qgbm90IHNlZSBuZXcgcHJv ZHVjZXIgdW50aWwgZGF0YSBpcyB0aGVyZS4gKi8KIAkJdmlydF93bWIoKTsKIAkJaW50Zi0+cmVx X3Byb2QgKz0gYXZhaWw7CiAKIAkJLyogSW1wbGllcyBtYigpOiBvdGhlciBzaWRlIHdpbGwgc2Vl IHRoZSB1cGRhdGVkIHByb2R1Y2VyLiAqLwotCQlub3RpZnlfcmVtb3RlX3ZpYV9ldnRjaG4oeGVu X3N0b3JlX2V2dGNobik7CisJCWlmIChwcm9kIDw9IGludGYtPnJlcV9jb25zKQorCQkJbm90aWZ5 X3JlbW90ZV92aWFfZXZ0Y2huKHhlbl9zdG9yZV9ldnRjaG4pOwogCX0KIAotCXJldHVybiAwOwor CXJldHVybiBieXRlczsKIH0KIAotaW50IHhiX2RhdGFfdG9fcmVhZCh2b2lkKQorc3RhdGljIGlu dCB4Yl9kYXRhX3RvX3JlYWQodm9pZCkKIHsKIAlzdHJ1Y3QgeGVuc3RvcmVfZG9tYWluX2ludGVy ZmFjZSAqaW50ZiA9IHhlbl9zdG9yZV9pbnRlcmZhY2U7CiAJcmV0dXJuIChpbnRmLT5yc3BfY29u cyAhPSBpbnRmLT5yc3BfcHJvZCk7CiB9CiAKLWludCB4Yl93YWl0X2Zvcl9kYXRhX3RvX3JlYWQo dm9pZCkKLXsKLQlyZXR1cm4gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHhiX3dhaXRxLCB4Yl9k YXRhX3RvX3JlYWQoKSk7Ci19Ci0KLWludCB4Yl9yZWFkKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxl bikKK3N0YXRpYyBpbnQgeGJfcmVhZCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQogewog CXN0cnVjdCB4ZW5zdG9yZV9kb21haW5faW50ZXJmYWNlICppbnRmID0geGVuX3N0b3JlX2ludGVy ZmFjZTsKIAlYRU5TVE9SRV9SSU5HX0lEWCBjb25zLCBwcm9kOwotCWludCByYzsKKwl1bnNpZ25l ZCBpbnQgYnl0ZXMgPSAwOwogCiAJd2hpbGUgKGxlbiAhPSAwKSB7CiAJCXVuc2lnbmVkIGludCBh dmFpbDsKIAkJY29uc3QgY2hhciAqc3JjOwogCi0JCXJjID0geGJfd2FpdF9mb3JfZGF0YV90b19y ZWFkKCk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KIAkJLyogUmVhZCBpbmRleGVz LCB0aGVuIHZlcmlmeS4gKi8KIAkJY29ucyA9IGludGYtPnJzcF9jb25zOwogCQlwcm9kID0gaW50 Zi0+cnNwX3Byb2Q7CisJCWlmIChjb25zID09IHByb2QpCisJCQlyZXR1cm4gYnl0ZXM7CisKIAkJ aWYgKCFjaGVja19pbmRleGVzKGNvbnMsIHByb2QpKSB7CiAJCQlpbnRmLT5yc3BfY29ucyA9IGlu dGYtPnJzcF9wcm9kID0gMDsKIAkJCXJldHVybiAtRUlPOwpAQCAtMTg1LDE3ICsxOTYsMjQzIEBA IGludCB4Yl9yZWFkKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxlbikKIAkJbWVtY3B5KGRhdGEsIHNy YywgYXZhaWwpOwogCQlkYXRhICs9IGF2YWlsOwogCQlsZW4gLT0gYXZhaWw7CisJCWJ5dGVzICs9 IGF2YWlsOwogCiAJCS8qIE90aGVyIHNpZGUgbXVzdCBub3Qgc2VlIGZyZWUgc3BhY2UgdW50aWwg d2UndmUgY29waWVkIG91dCAqLwogCQl2aXJ0X21iKCk7CiAJCWludGYtPnJzcF9jb25zICs9IGF2 YWlsOwogCi0JCXByX2RlYnVnKCJGaW5pc2hlZCByZWFkIG9mICVpIGJ5dGVzICglaSB0byBnbylc biIsIGF2YWlsLCBsZW4pOwotCiAJCS8qIEltcGxpZXMgbWIoKTogb3RoZXIgc2lkZSB3aWxsIHNl ZSB0aGUgdXBkYXRlZCBjb25zdW1lci4gKi8KLQkJbm90aWZ5X3JlbW90ZV92aWFfZXZ0Y2huKHhl bl9zdG9yZV9ldnRjaG4pOworCQlpZiAoaW50Zi0+cnNwX3Byb2QgLSBjb25zID49IFhFTlNUT1JF X1JJTkdfU0laRSkKKwkJCW5vdGlmeV9yZW1vdGVfdmlhX2V2dGNobih4ZW5fc3RvcmVfZXZ0Y2hu KTsKIAl9CiAKKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19tc2codm9p ZCkKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJc3RydWN0IHhzZF9zb2NrbXNnIG1zZzsKKwkJY2hh ciAqYm9keTsKKwkJdW5pb24geworCQkJdm9pZCAqYWxsb2M7CisJCQlzdHJ1Y3QgeHNfd2F0Y2hf ZXZlbnQgKndhdGNoOworCQl9OworCQlib29sIGluX21zZzsKKwkJYm9vbCBpbl9oZHI7CisJCXVu c2lnbmVkIGludCByZWFkOworCX0gc3RhdGU7CisJc3RydWN0IHhiX3JlcV9kYXRhICpyZXE7CisJ aW50IGVycjsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKCFzdGF0ZS5pbl9tc2cpIHsKKwkJ c3RhdGUuaW5fbXNnID0gdHJ1ZTsKKwkJc3RhdGUuaW5faGRyID0gdHJ1ZTsKKwkJc3RhdGUucmVh ZCA9IDA7CisKKwkJLyoKKwkJICogV2UgbXVzdCBkaXNhbGxvdyBzYXZlL3Jlc3RvcmUgd2hpbGUg cmVhZGluZyBhIG1lc3NhZ2UuCisJCSAqIEEgcGFydGlhbCByZWFkIGFjcm9zcyBzL3IgbGVhdmVz IHVzIG91dCBvZiBzeW5jIHdpdGgKKwkJICogeGVuc3RvcmVkLgorCQkgKiB4c19yZXNwb25zZV9t dXRleCBpcyBsb2NrZWQgYXMgbG9uZyBhcyB3ZSBhcmUgcHJvY2Vzc2luZyBvbmUKKwkJICogbWVz c2FnZS4gc3RhdGUuaW5fbXNnIHdpbGwgYmUgdHJ1ZSBhcyBsb25nIGFzIHdlIGFyZSBob2xkaW5n CisJCSAqIHRoZSBsb2NrIGhlcmUuCisJCSAqLworCQltdXRleF9sb2NrKCZ4c19yZXNwb25zZV9t dXRleCk7CisKKwkJaWYgKCF4Yl9kYXRhX3RvX3JlYWQoKSkgeworCQkJLyogV2UgcmFjZWQgd2l0 aCBzYXZlL3Jlc3RvcmU6IHBlbmRpbmcgZGF0YSAnZ29uZScuICovCisJCQltdXRleF91bmxvY2so JnhzX3Jlc3BvbnNlX211dGV4KTsKKwkJCXN0YXRlLmluX21zZyA9IGZhbHNlOworCQkJcmV0dXJu IDA7CisJCX0KKwl9CisKKwlpZiAoc3RhdGUuaW5faGRyKSB7CisJCWlmIChzdGF0ZS5yZWFkICE9 IHNpemVvZihzdGF0ZS5tc2cpKSB7CisJCQllcnIgPSB4Yl9yZWFkKCh2b2lkICopJnN0YXRlLm1z ZyArIHN0YXRlLnJlYWQsCisJCQkJICAgICAgc2l6ZW9mKHN0YXRlLm1zZykgLSBzdGF0ZS5yZWFk KTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJc3RhdGUucmVhZCArPSBlcnI7 CisJCQlpZiAoc3RhdGUucmVhZCAhPSBzaXplb2Yoc3RhdGUubXNnKSkKKwkJCQlyZXR1cm4gMDsK KwkJCWlmIChzdGF0ZS5tc2cubGVuID4gWEVOU1RPUkVfUEFZTE9BRF9NQVgpIHsKKwkJCQllcnIg PSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJbGVuID0gc3RhdGUubXNn LmxlbiArIDE7CisJCWlmIChzdGF0ZS5tc2cudHlwZSA9PSBYU19XQVRDSF9FVkVOVCkKKwkJCWxl biArPSBzaXplb2YoKnN0YXRlLndhdGNoKTsKKworCQlzdGF0ZS5hbGxvYyA9IGttYWxsb2MobGVu LCBHRlBfTk9JTyB8IF9fR0ZQX0hJR0gpOworCQlpZiAoIXN0YXRlLmFsbG9jKQorCQkJcmV0dXJu IC1FTk9NRU07CisKKwkJaWYgKHN0YXRlLm1zZy50eXBlID09IFhTX1dBVENIX0VWRU5UKQorCQkJ c3RhdGUuYm9keSA9IHN0YXRlLndhdGNoLT5ib2R5OworCQllbHNlCisJCQlzdGF0ZS5ib2R5ID0g c3RhdGUuYWxsb2M7CisJCXN0YXRlLmluX2hkciA9IGZhbHNlOworCQlzdGF0ZS5yZWFkID0gMDsK Kwl9CisKKwllcnIgPSB4Yl9yZWFkKHN0YXRlLmJvZHkgKyBzdGF0ZS5yZWFkLCBzdGF0ZS5tc2cu bGVuIC0gc3RhdGUucmVhZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJc3RhdGUu cmVhZCArPSBlcnI7CisJaWYgKHN0YXRlLnJlYWQgIT0gc3RhdGUubXNnLmxlbikKKwkJcmV0dXJu IDA7CisKKwlzdGF0ZS5ib2R5W3N0YXRlLm1zZy5sZW5dID0gJ1wwJzsKKworCWlmIChzdGF0ZS5t c2cudHlwZSA9PSBYU19XQVRDSF9FVkVOVCkgeworCQlzdGF0ZS53YXRjaC0+bGVuID0gc3RhdGUu bXNnLmxlbjsKKwkJZXJyID0geHNfd2F0Y2hfbXNnKHN0YXRlLndhdGNoKTsKKwl9IGVsc2Ugewor CQllcnIgPSAtRU5PRU5UOworCQltdXRleF9sb2NrKCZ4Yl93cml0ZV9tdXRleCk7CisJCWxpc3Rf Zm9yX2VhY2hfZW50cnkocmVxLCAmeHNfcmVwbHlfbGlzdCwgbGlzdCkgeworCQkJaWYgKHJlcS0+ bXNnLnJlcV9pZCA9PSBzdGF0ZS5tc2cucmVxX2lkKSB7CisJCQkJaWYgKHJlcS0+c3RhdGUgPT0g eGJfcmVxX3N0YXRlX3dhaXRfcmVwbHkpIHsKKwkJCQkJcmVxLT5tc2cudHlwZSA9IHN0YXRlLm1z Zy50eXBlOworCQkJCQlyZXEtPm1zZy5sZW4gPSBzdGF0ZS5tc2cubGVuOworCQkJCQlyZXEtPmJv ZHkgPSBzdGF0ZS5ib2R5OworCQkJCQlyZXEtPnN0YXRlID0geGJfcmVxX3N0YXRlX2dvdF9yZXBs eTsKKwkJCQkJbGlzdF9kZWwoJnJlcS0+bGlzdCk7CisJCQkJCXJlcS0+Y2IocmVxKTsKKwkJCQl9 IGVsc2UgeworCQkJCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKwkJCQkJa2ZyZWUocmVxKTsKKwkJ CQl9CisJCQkJZXJyID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQltdXRleF91bmxvY2so JnhiX3dyaXRlX211dGV4KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCW11dGV4 X3VubG9jaygmeHNfcmVzcG9uc2VfbXV0ZXgpOworCisJc3RhdGUuaW5fbXNnID0gZmFsc2U7CisJ c3RhdGUuYWxsb2MgPSBOVUxMOworCXJldHVybiBlcnI7CisKKyBvdXQ6CisJbXV0ZXhfdW5sb2Nr KCZ4c19yZXNwb25zZV9tdXRleCk7CisJc3RhdGUuaW5fbXNnID0gZmFsc2U7CisJa2ZyZWUoc3Rh dGUuYWxsb2MpOworCXN0YXRlLmFsbG9jID0gTlVMTDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0 aWMgaW50IHByb2Nlc3Nfd3JpdGVzKHZvaWQpCit7CisJc3RhdGljIHN0cnVjdCB7CisJCXN0cnVj dCB4Yl9yZXFfZGF0YSAqcmVxOworCQlpbnQgaWR4OworCQl1bnNpZ25lZCBpbnQgd3JpdHRlbjsK Kwl9IHN0YXRlOworCXZvaWQgKmJhc2U7CisJdW5zaWduZWQgaW50IGxlbjsKKwlpbnQgZXJyID0g MDsKKworCWlmICgheGJfZGF0YV90b193cml0ZSgpKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xv Y2soJnhiX3dyaXRlX211dGV4KTsKKworCWlmICghc3RhdGUucmVxKSB7CisJCXN0YXRlLnJlcSA9 IGxpc3RfZmlyc3RfZW50cnkoJnhiX3dyaXRlX2xpc3QsCisJCQkJCSAgICAgc3RydWN0IHhiX3Jl cV9kYXRhLCBsaXN0KTsKKwkJc3RhdGUuaWR4ID0gLTE7CisJCXN0YXRlLndyaXR0ZW4gPSAwOwor CX0KKworCWlmIChzdGF0ZS5yZXEtPnN0YXRlID09IHhiX3JlcV9zdGF0ZV9hYm9ydGVkKQorCQln b3RvIG91dF9lcnI7CisKKwl3aGlsZSAoc3RhdGUuaWR4IDwgc3RhdGUucmVxLT5udW1fdmVjcykg eworCQlpZiAoc3RhdGUuaWR4IDwgMCkgeworCQkJYmFzZSA9ICZzdGF0ZS5yZXEtPm1zZzsKKwkJ CWxlbiA9IHNpemVvZihzdGF0ZS5yZXEtPm1zZyk7CisJCX0gZWxzZSB7CisJCQliYXNlID0gc3Rh dGUucmVxLT52ZWNbc3RhdGUuaWR4XS5pb3ZfYmFzZTsKKwkJCWxlbiA9IHN0YXRlLnJlcS0+dmVj W3N0YXRlLmlkeF0uaW92X2xlbjsKKwkJfQorCQllcnIgPSB4Yl93cml0ZShiYXNlICsgc3RhdGUu d3JpdHRlbiwgbGVuIC0gc3RhdGUud3JpdHRlbik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBv dXRfZXJyOworCQlzdGF0ZS53cml0dGVuICs9IGVycjsKKwkJaWYgKHN0YXRlLndyaXR0ZW4gIT0g bGVuKQorCQkJZ290byBvdXQ7CisKKwkJc3RhdGUuaWR4Kys7CisJCXN0YXRlLndyaXR0ZW4gPSAw OworCX0KKworCWxpc3RfZGVsKCZzdGF0ZS5yZXEtPmxpc3QpOworCXN0YXRlLnJlcS0+c3RhdGUg PSB4Yl9yZXFfc3RhdGVfd2FpdF9yZXBseTsKKwlsaXN0X2FkZF90YWlsKCZzdGF0ZS5yZXEtPmxp c3QsICZ4c19yZXBseV9saXN0KTsKKwlzdGF0ZS5yZXEgPSBOVUxMOworCisgb3V0OgorCW11dGV4 X3VubG9jaygmeGJfd3JpdGVfbXV0ZXgpOworCisJcmV0dXJuIDA7CisKKyBvdXRfZXJyOgorCXN0 YXRlLnJlcS0+bXNnLnR5cGUgPSBYU19FUlJPUjsKKwlzdGF0ZS5yZXEtPmVyciA9IGVycjsKKwls aXN0X2RlbCgmc3RhdGUucmVxLT5saXN0KTsKKwlpZiAoc3RhdGUucmVxLT5zdGF0ZSA9PSB4Yl9y ZXFfc3RhdGVfYWJvcnRlZCkKKwkJa2ZyZWUoc3RhdGUucmVxKTsKKwllbHNlIHsKKwkJc3RhdGUu cmVxLT5zdGF0ZSA9IHhiX3JlcV9zdGF0ZV9nb3RfcmVwbHk7CisJCXdha2VfdXAoJnN0YXRlLnJl cS0+d3EpOworCX0KKworCW11dGV4X3VubG9jaygmeGJfd3JpdGVfbXV0ZXgpOworCisJc3RhdGUu cmVxID0gTlVMTDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgeGJfdGhyZWFkX3dv cmsodm9pZCkKK3sKKwlyZXR1cm4geGJfZGF0YV90b19yZWFkKCkgfHwgeGJfZGF0YV90b193cml0 ZSgpOworfQorCitzdGF0aWMgaW50IHhlbmJ1c190aHJlYWQodm9pZCAqdW51c2VkKQoreworCWlu dCBlcnI7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlpZiAod2FpdF9l dmVudF9pbnRlcnJ1cHRpYmxlKHhiX3dhaXRxLCB4Yl90aHJlYWRfd29yaygpKSkKKwkJCWNvbnRp bnVlOworCisJCWVyciA9IHByb2Nlc3NfbXNnKCk7CisJCWlmIChlcnIgPT0gLUVOT01FTSkKKwkJ CXNjaGVkdWxlKCk7CisJCWVsc2UgaWYgKGVycikKKwkJCXByX3dhcm5fcmF0ZWxpbWl0ZWQoImVy cm9yICVkIHdoaWxlIHJlYWRpbmcgbWVzc2FnZVxuIiwKKwkJCQkJICAgIGVycik7CisKKwkJZXJy ID0gcHJvY2Vzc193cml0ZXMoKTsKKwkJaWYgKGVycikKKwkJCXByX3dhcm5fcmF0ZWxpbWl0ZWQo ImVycm9yICVkIHdoaWxlIHdyaXRpbmcgbWVzc2FnZVxuIiwKKwkJCQkJICAgIGVycik7CisJfQor CisJeGVuYnVzX3Rhc2sgPSBOVUxMOwogCXJldHVybiAwOwogfQogCkBAIC0yMjMsNiArNDYwLDcg QEAgaW50IHhiX2luaXRfY29tbXModm9pZCkKIAkJcmViaW5kX2V2dGNobl9pcnEoeGVuX3N0b3Jl X2V2dGNobiwgeGVuYnVzX2lycSk7CiAJfSBlbHNlIHsKIAkJaW50IGVycjsKKwogCQllcnIgPSBi aW5kX2V2dGNobl90b19pcnFoYW5kbGVyKHhlbl9zdG9yZV9ldnRjaG4sIHdha2Vfd2FpdGluZywK IAkJCQkJCTAsICJ4ZW5idXMiLCAmeGJfd2FpdHEpOwogCQlpZiAoZXJyIDwgMCkgewpAQCAtMjMx LDYgKzQ2OSwxMyBAQCBpbnQgeGJfaW5pdF9jb21tcyh2b2lkKQogCQl9CiAKIAkJeGVuYnVzX2ly cSA9IGVycjsKKworCQlpZiAoIXhlbmJ1c190YXNrKSB7CisJCQl4ZW5idXNfdGFzayA9IGt0aHJl YWRfcnVuKHhlbmJ1c190aHJlYWQsIE5VTEwsCisJCQkJCQkgICJ4ZW5idXMiKTsKKwkJCWlmIChJ U19FUlIoeGVuYnVzX3Rhc2spKQorCQkJCXJldHVybiBQVFJfRVJSKHhlbmJ1c190YXNrKTsKKwkJ fQogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1 c19kZXZfZnJvbnRlbmQuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfZGV2X2Zyb250ZW5k LmMKaW5kZXggZTRiOTg0Ny4uNGQzNDNlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVz L3hlbmJ1c19kZXZfZnJvbnRlbmQuYworKysgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX2Rl dl9mcm9udGVuZC5jCkBAIC0xMTMsNiArMTEzLDcgQEAgc3RydWN0IHhlbmJ1c19maWxlX3ByaXYg ewogCXN0cnVjdCBsaXN0X2hlYWQgcmVhZF9idWZmZXJzOwogCXdhaXRfcXVldWVfaGVhZF90IHJl YWRfd2FpdHE7CiAKKwlzdHJ1Y3Qga3JlZiBrcmVmOwogfTsKIAogLyogUmVhZCBvdXQgYW55IHJh dyB4ZW5idXMgbWVzc2FnZXMgcXVldWVkIHVwLiAqLwpAQCAtMjk3LDYgKzI5OCwxMDcgQEAgc3Rh dGljIHZvaWQgd2F0Y2hfZmlyZWQoc3RydWN0IHhlbmJ1c193YXRjaCAqd2F0Y2gsCiAJbXV0ZXhf dW5sb2NrKCZhZGFwLT5kZXZfZGF0YS0+cmVwbHlfbXV0ZXgpOwogfQogCitzdGF0aWMgdm9pZCB4 ZW5idXNfZmlsZV9mcmVlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCB4ZW5idXNfZmls ZV9wcml2ICp1OworCXN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb25faG9sZGVyICp0cmFucywgKnRt cDsKKwlzdHJ1Y3Qgd2F0Y2hfYWRhcHRlciAqd2F0Y2gsICp0bXBfd2F0Y2g7CisJc3RydWN0IHJl YWRfYnVmZmVyICpyYiwgKnRtcF9yYjsKKworCXUgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0 IHhlbmJ1c19maWxlX3ByaXYsIGtyZWYpOworCisJLyoKKwkgKiBObyBuZWVkIGZvciBsb2NraW5n IGhlcmUgYmVjYXVzZSB0aGVyZSBhcmUgbm8gb3RoZXIgdXNlcnMsCisJICogYnkgZGVmaW5pdGlv bi4KKwkgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cmFucywgdG1wLCAmdS0+dHJh bnNhY3Rpb25zLCBsaXN0KSB7CisJCXhlbmJ1c190cmFuc2FjdGlvbl9lbmQodHJhbnMtPmhhbmRs ZSwgMSk7CisJCWxpc3RfZGVsKCZ0cmFucy0+bGlzdCk7CisJCWtmcmVlKHRyYW5zKTsKKwl9CisK KwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2F0Y2gsIHRtcF93YXRjaCwgJnUtPndhdGNoZXMs IGxpc3QpIHsKKwkJdW5yZWdpc3Rlcl94ZW5idXNfd2F0Y2goJndhdGNoLT53YXRjaCk7CisJCWxp c3RfZGVsKCZ3YXRjaC0+bGlzdCk7CisJCWZyZWVfd2F0Y2hfYWRhcHRlcih3YXRjaCk7CisJfQor CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJiLCB0bXBfcmIsICZ1LT5yZWFkX2J1ZmZlcnMs IGxpc3QpIHsKKwkJbGlzdF9kZWwoJnJiLT5saXN0KTsKKwkJa2ZyZWUocmIpOworCX0KKwlrZnJl ZSh1KTsKK30KKworc3RhdGljIHN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb25faG9sZGVyICp4ZW5i dXNfZ2V0X3RyYW5zYWN0aW9uKAorCXN0cnVjdCB4ZW5idXNfZmlsZV9wcml2ICp1LCB1aW50MzJf dCB0eF9pZCkKK3sKKwlzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uX2hvbGRlciAqdHJhbnM7CisK KwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zLCAmdS0+dHJhbnNhY3Rpb25zLCBsaXN0KQorCQlp ZiAodHJhbnMtPmhhbmRsZS5pZCA9PSB0eF9pZCkKKwkJCXJldHVybiB0cmFuczsKKworCXJldHVy biBOVUxMOworfQorCit2b2lkIHhlbmJ1c19kZXZfcXVldWVfcmVwbHkoc3RydWN0IHhiX3JlcV9k YXRhICpyZXEpCit7CisJc3RydWN0IHhlbmJ1c19maWxlX3ByaXYgKnUgPSByZXEtPnBhcjsKKwlz dHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uX2hvbGRlciAqdHJhbnMgPSBOVUxMOworCWludCByYzsK KwlMSVNUX0hFQUQoc3RhZ2luZ19xKTsKKworCXhzX3JlcXVlc3RfZXhpdChyZXEpOworCisJbXV0 ZXhfbG9jaygmdS0+bXNnYnVmZmVyX211dGV4KTsKKworCWlmIChyZXEtPnR5cGUgPT0gWFNfVFJB TlNBQ1RJT05fU1RBUlQpIHsKKwkJdHJhbnMgPSB4ZW5idXNfZ2V0X3RyYW5zYWN0aW9uKHUsIDAp OworCQlpZiAoV0FSTl9PTighdHJhbnMpKQorCQkJZ290byBvdXQ7CisJCWlmIChyZXEtPm1zZy50 eXBlID09IFhTX0VSUk9SKSB7CisJCQlsaXN0X2RlbCgmdHJhbnMtPmxpc3QpOworCQkJa2ZyZWUo dHJhbnMpOworCQl9IGVsc2UgeworCQkJcmMgPSBrc3RydG91MzIocmVxLT5ib2R5LCAxMCwgJnRy YW5zLT5oYW5kbGUuaWQpOworCQkJaWYgKFdBUk5fT04ocmMpKQorCQkJCWdvdG8gb3V0OworCQl9 CisJfSBlbHNlIGlmIChyZXEtPm1zZy50eXBlID09IFhTX1RSQU5TQUNUSU9OX0VORCkgeworCQl0 cmFucyA9IHhlbmJ1c19nZXRfdHJhbnNhY3Rpb24odSwgcmVxLT5tc2cudHhfaWQpOworCQlpZiAo V0FSTl9PTighdHJhbnMpKQorCQkJZ290byBvdXQ7CisJCWxpc3RfZGVsKCZ0cmFucy0+bGlzdCk7 CisJCWtmcmVlKHRyYW5zKTsKKwl9CisKKwltdXRleF91bmxvY2soJnUtPm1zZ2J1ZmZlcl9tdXRl eCk7CisKKwltdXRleF9sb2NrKCZ1LT5yZXBseV9tdXRleCk7CisJcmMgPSBxdWV1ZV9yZXBseSgm c3RhZ2luZ19xLCAmcmVxLT5tc2csIHNpemVvZihyZXEtPm1zZykpOworCWlmICghcmMpCisJCXJj ID0gcXVldWVfcmVwbHkoJnN0YWdpbmdfcSwgcmVxLT5ib2R5LCByZXEtPm1zZy5sZW4pOworCWlm ICghcmMpIHsKKwkJbGlzdF9zcGxpY2VfdGFpbCgmc3RhZ2luZ19xLCAmdS0+cmVhZF9idWZmZXJz KTsKKwkJd2FrZV91cCgmdS0+cmVhZF93YWl0cSk7CisJfSBlbHNlIHsKKwkJcXVldWVfY2xlYW51 cCgmc3RhZ2luZ19xKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ1LT5yZXBseV9tdXRleCk7CisKKwlr ZnJlZShyZXEtPmJvZHkpOworCWtmcmVlKHJlcSk7CisKKwlrcmVmX3B1dCgmdS0+a3JlZiwgeGVu YnVzX2ZpbGVfZnJlZSk7CisKKwlyZXR1cm47CisKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ1LT5t c2didWZmZXJfbXV0ZXgpOworfQorCiBzdGF0aWMgaW50IHhlbmJ1c19jb21tYW5kX3JlcGx5KHN0 cnVjdCB4ZW5idXNfZmlsZV9wcml2ICp1LAogCQkJCXVuc2lnbmVkIGludCBtc2dfdHlwZSwgY29u c3QgY2hhciAqcmVwbHkpCiB7CkBAIC0zMTcsNiArNDE5LDkgQEAgc3RhdGljIGludCB4ZW5idXNf Y29tbWFuZF9yZXBseShzdHJ1Y3QgeGVuYnVzX2ZpbGVfcHJpdiAqdSwKIAl3YWtlX3VwKCZ1LT5y ZWFkX3dhaXRxKTsKIAltdXRleF91bmxvY2soJnUtPnJlcGx5X211dGV4KTsKIAorCWlmICghcmMp CisJCWtyZWZfcHV0KCZ1LT5rcmVmLCB4ZW5idXNfZmlsZV9mcmVlKTsKKwogCXJldHVybiByYzsK IH0KIApAQCAtMzI0LDU3ICs0MjksMjIgQEAgc3RhdGljIGludCB4ZW5idXNfd3JpdGVfdHJhbnNh Y3Rpb24odW5zaWduZWQgbXNnX3R5cGUsCiAJCQkJICAgIHN0cnVjdCB4ZW5idXNfZmlsZV9wcml2 ICp1KQogewogCWludCByYzsKLQl2b2lkICpyZXBseTsKIAlzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0 aW9uX2hvbGRlciAqdHJhbnMgPSBOVUxMOwotCUxJU1RfSEVBRChzdGFnaW5nX3EpOwogCiAJaWYg KG1zZ190eXBlID09IFhTX1RSQU5TQUNUSU9OX1NUQVJUKSB7Ci0JCXRyYW5zID0ga21hbGxvYyhz aXplb2YoKnRyYW5zKSwgR0ZQX0tFUk5FTCk7CisJCXRyYW5zID0ga3phbGxvYyhzaXplb2YoKnRy YW5zKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdHJhbnMpIHsKIAkJCXJjID0gLUVOT01FTTsKIAkJ CWdvdG8gb3V0OwogCQl9Ci0JfSBlbHNlIGlmICh1LT51Lm1zZy50eF9pZCAhPSAwKSB7Ci0JCWxp c3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZ1LT50cmFuc2FjdGlvbnMsIGxpc3QpCi0JCQlpZiAo dHJhbnMtPmhhbmRsZS5pZCA9PSB1LT51Lm1zZy50eF9pZCkKLQkJCQlicmVhazsKLQkJaWYgKCZ0 cmFucy0+bGlzdCA9PSAmdS0+dHJhbnNhY3Rpb25zKQotCQkJcmV0dXJuIHhlbmJ1c19jb21tYW5k X3JlcGx5KHUsIFhTX0VSUk9SLCAiRU5PRU5UIik7Ci0JfQorCQlsaXN0X2FkZCgmdHJhbnMtPmxp c3QsICZ1LT50cmFuc2FjdGlvbnMpOworCX0gZWxzZSBpZiAodS0+dS5tc2cudHhfaWQgIT0gMCAm JgorCQkgICAheGVuYnVzX2dldF90cmFuc2FjdGlvbih1LCB1LT51Lm1zZy50eF9pZCkpCisJCXJl dHVybiB4ZW5idXNfY29tbWFuZF9yZXBseSh1LCBYU19FUlJPUiwgIkVOT0VOVCIpOwogCi0JcmVw bHkgPSB4ZW5idXNfZGV2X3JlcXVlc3RfYW5kX3JlcGx5KCZ1LT51Lm1zZyk7Ci0JaWYgKElTX0VS UihyZXBseSkpIHsKLQkJaWYgKG1zZ190eXBlID09IFhTX1RSQU5TQUNUSU9OX1NUQVJUKQotCQkJ a2ZyZWUodHJhbnMpOwotCQlyYyA9IFBUUl9FUlIocmVwbHkpOwotCQlnb3RvIG91dDsKLQl9Ci0K LQlpZiAobXNnX3R5cGUgPT0gWFNfVFJBTlNBQ1RJT05fU1RBUlQpIHsKLQkJaWYgKHUtPnUubXNn LnR5cGUgPT0gWFNfRVJST1IpCi0JCQlrZnJlZSh0cmFucyk7Ci0JCWVsc2UgewotCQkJdHJhbnMt PmhhbmRsZS5pZCA9IHNpbXBsZV9zdHJ0b3VsKHJlcGx5LCBOVUxMLCAwKTsKLQkJCWxpc3RfYWRk KCZ0cmFucy0+bGlzdCwgJnUtPnRyYW5zYWN0aW9ucyk7Ci0JCX0KLQl9IGVsc2UgaWYgKHUtPnUu bXNnLnR5cGUgPT0gWFNfVFJBTlNBQ1RJT05fRU5EKSB7Ci0JCWxpc3RfZGVsKCZ0cmFucy0+bGlz dCk7CisJcmMgPSB4ZW5idXNfZGV2X3JlcXVlc3RfYW5kX3JlcGx5KCZ1LT51Lm1zZywgdSk7CisJ aWYgKHJjKQogCQlrZnJlZSh0cmFucyk7Ci0JfQotCi0JbXV0ZXhfbG9jaygmdS0+cmVwbHlfbXV0 ZXgpOwotCXJjID0gcXVldWVfcmVwbHkoJnN0YWdpbmdfcSwgJnUtPnUubXNnLCBzaXplb2YodS0+ dS5tc2cpKTsKLQlpZiAoIXJjKQotCQlyYyA9IHF1ZXVlX3JlcGx5KCZzdGFnaW5nX3EsIHJlcGx5 LCB1LT51Lm1zZy5sZW4pOwotCWlmICghcmMpIHsKLQkJbGlzdF9zcGxpY2VfdGFpbCgmc3RhZ2lu Z19xLCAmdS0+cmVhZF9idWZmZXJzKTsKLQkJd2FrZV91cCgmdS0+cmVhZF93YWl0cSk7Ci0JfSBl bHNlIHsKLQkJcXVldWVfY2xlYW51cCgmc3RhZ2luZ19xKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZ1 LT5yZXBseV9tdXRleCk7Ci0KLQlrZnJlZShyZXBseSk7CiAKIG91dDoKIAlyZXR1cm4gcmM7CkBA IC01MDYsNiArNTc2LDggQEAgc3RhdGljIHNzaXplX3QgeGVuYnVzX2ZpbGVfd3JpdGUoc3RydWN0 IGZpbGUgKmZpbHAsCiAJICogT0ssIG5vdyB3ZSBoYXZlIGEgY29tcGxldGUgbWVzc2FnZS4gIERv IHNvbWV0aGluZyB3aXRoIGl0LgogCSAqLwogCisJa3JlZl9nZXQoJnUtPmtyZWYpOworCiAJbXNn X3R5cGUgPSB1LT51Lm1zZy50eXBlOwogCiAJc3dpdGNoIChtc2dfdHlwZSkgewpAQCAtNTIwLDgg KzU5MiwxMCBAQCBzdGF0aWMgc3NpemVfdCB4ZW5idXNfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAq ZmlscCwKIAkJcmV0ID0geGVuYnVzX3dyaXRlX3RyYW5zYWN0aW9uKG1zZ190eXBlLCB1KTsKIAkJ YnJlYWs7CiAJfQotCWlmIChyZXQgIT0gMCkKKwlpZiAocmV0ICE9IDApIHsKIAkJcmMgPSByZXQ7 CisJCWtyZWZfcHV0KCZ1LT5rcmVmLCB4ZW5idXNfZmlsZV9mcmVlKTsKKwl9CiAKIAkvKiBCdWZm ZXJlZCBtZXNzYWdlIGNvbnN1bWVkICovCiAJdS0+bGVuID0gMDsKQEAgLTU0Niw2ICs2MjAsOCBA QCBzdGF0aWMgaW50IHhlbmJ1c19maWxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0 IGZpbGUgKmZpbHApCiAJaWYgKHUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlrcmVm X2luaXQoJnUtPmtyZWYpOworCiAJSU5JVF9MSVNUX0hFQUQoJnUtPnRyYW5zYWN0aW9ucyk7CiAJ SU5JVF9MSVNUX0hFQUQoJnUtPndhdGNoZXMpOwogCUlOSVRfTElTVF9IRUFEKCZ1LT5yZWFkX2J1 ZmZlcnMpOwpAQCAtNTYyLDMyICs2MzgsOCBAQCBzdGF0aWMgaW50IHhlbmJ1c19maWxlX29wZW4o c3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiBzdGF0aWMgaW50IHhlbmJ1 c19maWxlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7 CiAJc3RydWN0IHhlbmJ1c19maWxlX3ByaXYgKnUgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0Jc3Ry dWN0IHhlbmJ1c190cmFuc2FjdGlvbl9ob2xkZXIgKnRyYW5zLCAqdG1wOwotCXN0cnVjdCB3YXRj aF9hZGFwdGVyICp3YXRjaCwgKnRtcF93YXRjaDsKLQlzdHJ1Y3QgcmVhZF9idWZmZXIgKnJiLCAq dG1wX3JiOwogCi0JLyoKLQkgKiBObyBuZWVkIGZvciBsb2NraW5nIGhlcmUgYmVjYXVzZSB0aGVy ZSBhcmUgbm8gb3RoZXIgdXNlcnMsCi0JICogYnkgZGVmaW5pdGlvbi4KLQkgKi8KLQotCWxpc3Rf Zm9yX2VhY2hfZW50cnlfc2FmZSh0cmFucywgdG1wLCAmdS0+dHJhbnNhY3Rpb25zLCBsaXN0KSB7 Ci0JCXhlbmJ1c190cmFuc2FjdGlvbl9lbmQodHJhbnMtPmhhbmRsZSwgMSk7Ci0JCWxpc3RfZGVs KCZ0cmFucy0+bGlzdCk7Ci0JCWtmcmVlKHRyYW5zKTsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2Vu dHJ5X3NhZmUod2F0Y2gsIHRtcF93YXRjaCwgJnUtPndhdGNoZXMsIGxpc3QpIHsKLQkJdW5yZWdp c3Rlcl94ZW5idXNfd2F0Y2goJndhdGNoLT53YXRjaCk7Ci0JCWxpc3RfZGVsKCZ3YXRjaC0+bGlz dCk7Ci0JCWZyZWVfd2F0Y2hfYWRhcHRlcih3YXRjaCk7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9l bnRyeV9zYWZlKHJiLCB0bXBfcmIsICZ1LT5yZWFkX2J1ZmZlcnMsIGxpc3QpIHsKLQkJbGlzdF9k ZWwoJnJiLT5saXN0KTsKLQkJa2ZyZWUocmIpOwotCX0KLQlrZnJlZSh1KTsKKwlrcmVmX3B1dCgm dS0+a3JlZiwgeGVuYnVzX2ZpbGVfZnJlZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBh L2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5i dXNfeHMuYwppbmRleCBlYmM3NjhmLi5lNjJjYjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94 ZW5idXMveGVuYnVzX3hzLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c194cy5jCkBA IC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4 L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Jl Ym9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXgu aD4KICNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KQEAgLTUwLDYxICs1MSwyOCBAQAog I2luY2x1ZGUgPHhlbi94ZW4uaD4KICNpbmNsdWRlICJ4ZW5idXMuaCIKIAotc3RydWN0IHhzX3N0 b3JlZF9tc2cgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCXN0cnVjdCB4c2Rfc29ja21z ZyBoZHI7Ci0KLQl1bmlvbiB7Ci0JCS8qIFF1ZXVlZCByZXBsaWVzLiAqLwotCQlzdHJ1Y3Qgewot CQkJY2hhciAqYm9keTsKLQkJfSByZXBseTsKLQotCQkvKiBRdWV1ZWQgd2F0Y2ggZXZlbnRzLiAq LwotCQlzdHJ1Y3QgewotCQkJc3RydWN0IHhlbmJ1c193YXRjaCAqaGFuZGxlOwotCQkJY29uc3Qg Y2hhciAqcGF0aDsKLQkJCWNvbnN0IGNoYXIgKnRva2VuOwotCQl9IHdhdGNoOwotCX0gdTsKLX07 Ci0KLXN0cnVjdCB4c19oYW5kbGUgewotCS8qIEEgbGlzdCBvZiByZXBsaWVzLiBDdXJyZW50bHkg b25seSBvbmUgd2lsbCBldmVyIGJlIG91dHN0YW5kaW5nLiAqLwotCXN0cnVjdCBsaXN0X2hlYWQg cmVwbHlfbGlzdDsKLQlzcGlubG9ja190IHJlcGx5X2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qg cmVwbHlfd2FpdHE7Ci0KLQkvKgotCSAqIE11dGV4IG9yZGVyaW5nOiB0cmFuc2FjdGlvbl9tdXRl eCAtPiB3YXRjaF9tdXRleCAtPiByZXF1ZXN0X211dGV4LgotCSAqIHJlc3BvbnNlX211dGV4IGlz IG5ldmVyIHRha2VuIHNpbXVsdGFuZW91c2x5IHdpdGggdGhlIG90aGVyIHRocmVlLgotCSAqCi0J ICogdHJhbnNhY3Rpb25fbXV0ZXggbXVzdCBiZSBoZWxkIGJlZm9yZSBpbmNyZW1lbnRpbmcKLQkg KiB0cmFuc2FjdGlvbl9jb3VudC4gVGhlIG11dGV4IGlzIGhlbGQgd2hlbiBhIHN1c3BlbmQgaXMg aW4KLQkgKiBwcm9ncmVzcyB0byBwcmV2ZW50IG5ldyB0cmFuc2FjdGlvbnMgc3RhcnRpbmcuCi0J ICoKLQkgKiBXaGVuIGRlY3JlbWVudGluZyB0cmFuc2FjdGlvbl9jb3VudCB0byB6ZXJvIHRoZSB3 YWl0IHF1ZXVlCi0JICogc2hvdWxkIGJlIHdva2VuIHVwLCB0aGUgc3VzcGVuZCBjb2RlIHdhaXRz IGZvciBjb3VudCB0bwotCSAqIHJlYWNoIHplcm8uCi0JICovCi0KLQkvKiBPbmUgcmVxdWVzdCBh dCBhIHRpbWUuICovCi0Jc3RydWN0IG11dGV4IHJlcXVlc3RfbXV0ZXg7Ci0KLQkvKiBQcm90ZWN0 IHhlbmJ1cyByZWFkZXIgdGhyZWFkIGFnYWluc3Qgc2F2ZS9yZXN0b3JlLiAqLwotCXN0cnVjdCBt dXRleCByZXNwb25zZV9tdXRleDsKLQotCS8qIFByb3RlY3QgdHJhbnNhY3Rpb25zIGFnYWluc3Qg c2F2ZS9yZXN0b3JlLiAqLwotCXN0cnVjdCBtdXRleCB0cmFuc2FjdGlvbl9tdXRleDsKLQlhdG9t aWNfdCB0cmFuc2FjdGlvbl9jb3VudDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB0cmFuc2FjdGlvbl93 cTsKLQotCS8qIFByb3RlY3Qgd2F0Y2ggKGRlKXJlZ2lzdGVyIGFnYWluc3Qgc2F2ZS9yZXN0b3Jl LiAqLwotCXN0cnVjdCByd19zZW1hcGhvcmUgd2F0Y2hfbXV0ZXg7Ci19OwotCi1zdGF0aWMgc3Ry dWN0IHhzX2hhbmRsZSB4c19zdGF0ZTsKKy8qCisgKiBGcmFtZXdvcmsgdG8gcHJvdGVjdCBzdXNw ZW5kL3Jlc3VtZSBoYW5kbGluZyBhZ2FpbnN0IG5vcm1hbCBYZW5zdG9yZQorICogbWVzc2FnZSBo YW5kbGluZzoKKyAqIER1cmluZyBzdXNwZW5kL3Jlc3VtZSB0aGVyZSBtdXN0IGJlIG5vIG9wZW4g dHJhbnNhY3Rpb24gYW5kIG5vIHBlbmRpbmcKKyAqIFhlbnN0b3JlIHJlcXVlc3QuCisgKiBOZXcg d2F0Y2ggZXZlbnRzIGhhcHBlbmluZyBpbiB0aGlzIHRpbWUgY2FuIGJlIGlnbm9yZWQgYnkgZmly aW5nIGFsbCB3YXRjaGVzCisgKiBhZnRlciByZXN1bWUuCisgKi8KKworLyogTG9jayBwcm90ZWN0 aW5nIGVudGVyL2V4aXQgY3JpdGljYWwgcmVnaW9uLiAqLworc3RhdGljIERFRklORV9TUElOTE9D Syh4c19zdGF0ZV9sb2NrKTsKKy8qIE51bWJlciBvZiB1c2VycyBpbiBjcml0aWNhbCByZWdpb24g KHByb3RlY3RlZCBieSB4c19zdGF0ZV9sb2NrKS4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgeHNf c3RhdGVfdXNlcnM7CisvKiBTdXNwZW5kIGhhbmRsZXIgd2FpdGluZyBvciBhbHJlYWR5IGFjdGl2 ZSAocHJvdGVjdGVkIGJ5IHhzX3N0YXRlX2xvY2spPyAqLworc3RhdGljIGludCB4c19zdXNwZW5k X2FjdGl2ZTsKKy8qIFVuaXF1ZSBYZW5zdG9yZSByZXF1ZXN0IGlkIChwcm90ZWN0ZWQgYnkgeHNf c3RhdGVfbG9jaykuICovCitzdGF0aWMgdWludDMyX3QgeHNfcmVxdWVzdF9pZDsKKworLyogV2Fp dCBxdWV1ZSBmb3IgYWxsIGNhbGxlcnMgd2FpdGluZyBmb3IgY3JpdGljYWwgcmVnaW9uIHRvIGJl Y29tZSB1c2FibGUuICovCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoeHNfc3RhdGVf ZW50ZXJfd3EpOworLyogV2FpdCBxdWV1ZSBmb3Igc3VzcGVuZCBoYW5kbGluZyB3YWl0aW5nIGZv ciBjcml0aWNhbCByZWdpb24gYmVpbmcgZW1wdHkuICovCitzdGF0aWMgREVDTEFSRV9XQUlUX1FV RVVFX0hFQUQoeHNfc3RhdGVfZXhpdF93cSk7CiAKIC8qIExpc3Qgb2YgcmVnaXN0ZXJlZCB3YXRj aGVzLCBhbmQgYSBsb2NrIHRvIHByb3RlY3QgaXQuICovCiBzdGF0aWMgTElTVF9IRUFEKHdhdGNo ZXMpOwpAQCAtMTE0LDYgKzgyLDkgQEAgc3RhdGljIERFRklORV9TUElOTE9DSyh3YXRjaGVzX2xv Y2spOwogc3RhdGljIExJU1RfSEVBRCh3YXRjaF9ldmVudHMpOwogc3RhdGljIERFRklORV9TUElO TE9DSyh3YXRjaF9ldmVudHNfbG9jayk7CiAKKy8qIFByb3RlY3Qgd2F0Y2ggKGRlKXJlZ2lzdGVy IGFnYWluc3Qgc2F2ZS9yZXN0b3JlLiAqLworc3RhdGljIERFQ0xBUkVfUldTRU0oeHNfd2F0Y2hf cndzZW0pOworCiAvKgogICogRGV0YWlscyBvZiB0aGUgeGVud2F0Y2ggY2FsbGJhY2sga2VybmVs IHRocmVhZC4gVGhlIHRocmVhZCB3YWl0cyBvbiB0aGUKICAqIHdhdGNoX2V2ZW50c193YWl0cSBm b3Igd29yayB0byBkbyAocXVldWVkIG9uIHdhdGNoX2V2ZW50cyBsaXN0KS4gV2hlbiBpdApAQCAt MTI0LDYgKzk1LDU5IEBAIHN0YXRpYyBwaWRfdCB4ZW53YXRjaF9waWQ7CiBzdGF0aWMgREVGSU5F X01VVEVYKHhlbndhdGNoX211dGV4KTsKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3 YXRjaF9ldmVudHNfd2FpdHEpOwogCitzdGF0aWMgdm9pZCB4c19zdXNwZW5kX2VudGVyKHZvaWQp Cit7CisJc3Bpbl9sb2NrKCZ4c19zdGF0ZV9sb2NrKTsKKwl4c19zdXNwZW5kX2FjdGl2ZSsrOwor CXNwaW5fdW5sb2NrKCZ4c19zdGF0ZV9sb2NrKTsKKwl3YWl0X2V2ZW50KHhzX3N0YXRlX2V4aXRf d3EsIHhzX3N0YXRlX3VzZXJzID09IDApOworfQorCitzdGF0aWMgdm9pZCB4c19zdXNwZW5kX2V4 aXQodm9pZCkKK3sKKwlzcGluX2xvY2soJnhzX3N0YXRlX2xvY2spOworCXhzX3N1c3BlbmRfYWN0 aXZlLS07CisJc3Bpbl91bmxvY2soJnhzX3N0YXRlX2xvY2spOworCXdha2VfdXBfYWxsKCZ4c19z dGF0ZV9lbnRlcl93cSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCB4c19yZXF1ZXN0X2VudGVyKHN0 cnVjdCB4Yl9yZXFfZGF0YSAqcmVxKQoreworCXVpbnQzMl90IHJxX2lkOworCisJcmVxLT50eXBl ID0gcmVxLT5tc2cudHlwZTsKKworCXNwaW5fbG9jaygmeHNfc3RhdGVfbG9jayk7CisKKwl3aGls ZSAoIXJlcS0+bXNnLnR4X2lkICYmIHhzX3N1c3BlbmRfYWN0aXZlKSB7CisJCXNwaW5fdW5sb2Nr KCZ4c19zdGF0ZV9sb2NrKTsKKwkJd2FpdF9ldmVudCh4c19zdGF0ZV9lbnRlcl93cSwgeHNfc3Vz cGVuZF9hY3RpdmUgPT0gMCk7CisJCXNwaW5fbG9jaygmeHNfc3RhdGVfbG9jayk7CisJfQorCisJ aWYgKHJlcS0+dHlwZSA9PSBYU19UUkFOU0FDVElPTl9TVEFSVCkKKwkJeHNfc3RhdGVfdXNlcnMr KzsKKwl4c19zdGF0ZV91c2VycysrOworCXJxX2lkID0geHNfcmVxdWVzdF9pZCsrOworCisJc3Bp bl91bmxvY2soJnhzX3N0YXRlX2xvY2spOworCisJcmV0dXJuIHJxX2lkOworfQorCit2b2lkIHhz X3JlcXVlc3RfZXhpdChzdHJ1Y3QgeGJfcmVxX2RhdGEgKnJlcSkKK3sKKwlzcGluX2xvY2soJnhz X3N0YXRlX2xvY2spOworCXhzX3N0YXRlX3VzZXJzLS07CisJaWYgKChyZXEtPnR5cGUgPT0gWFNf VFJBTlNBQ1RJT05fU1RBUlQgJiYgcmVxLT5tc2cudHlwZSA9PSBYU19FUlJPUikgfHwKKwkgICAg cmVxLT5tc2cudHlwZSA9PSBYU19UUkFOU0FDVElPTl9FTkQpCisJCXhzX3N0YXRlX3VzZXJzLS07 CisJc3Bpbl91bmxvY2soJnhzX3N0YXRlX2xvY2spOworCisJaWYgKHhzX3N1c3BlbmRfYWN0aXZl ICYmICF4c19zdGF0ZV91c2VycykKKwkJd2FrZV91cCgmeHNfc3RhdGVfZXhpdF93cSk7Cit9CisK IHN0YXRpYyBpbnQgZ2V0X2Vycm9yKGNvbnN0IGNoYXIgKmVycm9yc3RyaW5nKQogewogCXVuc2ln bmVkIGludCBpOwpAQCAtMTYxLDIxICsxODUsMjQgQEAgc3RhdGljIGJvb2wgeGVuYnVzX29rKHZv aWQpCiAJfQogCXJldHVybiBmYWxzZTsKIH0KLXN0YXRpYyB2b2lkICpyZWFkX3JlcGx5KGVudW0g eHNkX3NvY2ttc2dfdHlwZSAqdHlwZSwgdW5zaWduZWQgaW50ICpsZW4pCisKK3N0YXRpYyBib29s IHRlc3RfcmVwbHkoc3RydWN0IHhiX3JlcV9kYXRhICpyZXEpCit7CisJaWYgKHJlcS0+c3RhdGUg PT0geGJfcmVxX3N0YXRlX2dvdF9yZXBseSB8fCAheGVuYnVzX29rKCkpCisJCXJldHVybiB0cnVl OworCisJLyogTWFrZSBzdXJlIHRvIHJlcmVhZCByZXEtPnN0YXRlIGVhY2ggdGltZS4gKi8KKwli YXJyaWVyKCk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkICpyZWFkX3JlcGx5 KHN0cnVjdCB4Yl9yZXFfZGF0YSAqcmVxKQogewotCXN0cnVjdCB4c19zdG9yZWRfbXNnICptc2c7 Ci0JY2hhciAqYm9keTsKLQotCXNwaW5fbG9jaygmeHNfc3RhdGUucmVwbHlfbG9jayk7Ci0KLQl3 aGlsZSAobGlzdF9lbXB0eSgmeHNfc3RhdGUucmVwbHlfbGlzdCkpIHsKLQkJc3Bpbl91bmxvY2so JnhzX3N0YXRlLnJlcGx5X2xvY2spOwotCQlpZiAoeGVuYnVzX29rKCkpCi0JCQkvKiBYWFggRklY TUU6IEF2b2lkIHN5bmNocm9ub3VzIHdhaXQgZm9yIHJlc3BvbnNlIGhlcmUuICovCi0JCQl3YWl0 X2V2ZW50X3RpbWVvdXQoeHNfc3RhdGUucmVwbHlfd2FpdHEsCi0JCQkJCSAgICFsaXN0X2VtcHR5 KCZ4c19zdGF0ZS5yZXBseV9saXN0KSwKLQkJCQkJICAgbXNlY3NfdG9famlmZmllcyg1MDApKTsK LQkJZWxzZSB7CisJd2hpbGUgKHJlcS0+c3RhdGUgIT0geGJfcmVxX3N0YXRlX2dvdF9yZXBseSkg eworCQl3YWl0X2V2ZW50KHJlcS0+d3EsIHRlc3RfcmVwbHkocmVxKSk7CisKKwkJaWYgKCF4ZW5i dXNfb2soKSkKIAkJCS8qCiAJCQkgKiBJZiB3ZSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcg c2h1dC1kb3duIHRoZXJlIGlzCiAJCQkgKiBubyBwb2ludCBvZiB0cnlpbmcgdG8gY29udGFjdCBY ZW5CdXMgLSBpdCBpcyBlaXRoZXIKQEAgLTE4Myw3NyArMjEwLDgzIEBAIHN0YXRpYyB2b2lkICpy ZWFkX3JlcGx5KGVudW0geHNkX3NvY2ttc2dfdHlwZSAqdHlwZSwgdW5zaWduZWQgaW50ICpsZW4p CiAJCQkgKiBoYXMgYmVlbiBraWxsZWQgb3IgaXMgdW5yZWFjaGFibGUuCiAJCQkgKi8KIAkJCXJl dHVybiBFUlJfUFRSKC1FSU8pOwotCQl9Ci0JCXNwaW5fbG9jaygmeHNfc3RhdGUucmVwbHlfbG9j ayk7CisJCWlmIChyZXEtPmVycikKKwkJCXJldHVybiBFUlJfUFRSKHJlcS0+ZXJyKTsKKwogCX0K IAotCW1zZyA9IGxpc3RfZW50cnkoeHNfc3RhdGUucmVwbHlfbGlzdC5uZXh0LAotCQkJIHN0cnVj dCB4c19zdG9yZWRfbXNnLCBsaXN0KTsKLQlsaXN0X2RlbCgmbXNnLT5saXN0KTsKLQotCXNwaW5f dW5sb2NrKCZ4c19zdGF0ZS5yZXBseV9sb2NrKTsKLQotCSp0eXBlID0gbXNnLT5oZHIudHlwZTsK LQlpZiAobGVuKQotCQkqbGVuID0gbXNnLT5oZHIubGVuOwotCWJvZHkgPSBtc2ctPnUucmVwbHku Ym9keTsKLQotCWtmcmVlKG1zZyk7Ci0KLQlyZXR1cm4gYm9keTsKKwlyZXR1cm4gcmVxLT5ib2R5 OwogfQogCi1zdGF0aWMgdm9pZCB0cmFuc2FjdGlvbl9zdGFydCh2b2lkKQorc3RhdGljIHZvaWQg eHNfc2VuZChzdHJ1Y3QgeGJfcmVxX2RhdGEgKnJlcSwgc3RydWN0IHhzZF9zb2NrbXNnICptc2cp CiB7Ci0JbXV0ZXhfbG9jaygmeHNfc3RhdGUudHJhbnNhY3Rpb25fbXV0ZXgpOwotCWF0b21pY19p bmMoJnhzX3N0YXRlLnRyYW5zYWN0aW9uX2NvdW50KTsKLQltdXRleF91bmxvY2soJnhzX3N0YXRl LnRyYW5zYWN0aW9uX211dGV4KTsKLX0KKwlib29sIG5vdGlmeTsKIAotc3RhdGljIHZvaWQgdHJh bnNhY3Rpb25fZW5kKHZvaWQpCi17Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnhzX3N0YXRl LnRyYW5zYWN0aW9uX2NvdW50KSkKLQkJd2FrZV91cCgmeHNfc3RhdGUudHJhbnNhY3Rpb25fd3Ep OwotfQorCXJlcS0+bXNnID0gKm1zZzsKKwlyZXEtPmVyciA9IDA7CisJcmVxLT5zdGF0ZSA9IHhi X3JlcV9zdGF0ZV9xdWV1ZWQ7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcmVxLT53cSk7CiAKLXN0 YXRpYyB2b2lkIHRyYW5zYWN0aW9uX3N1c3BlbmQodm9pZCkKLXsKLQltdXRleF9sb2NrKCZ4c19z dGF0ZS50cmFuc2FjdGlvbl9tdXRleCk7Ci0Jd2FpdF9ldmVudCh4c19zdGF0ZS50cmFuc2FjdGlv bl93cSwKLQkJICAgYXRvbWljX3JlYWQoJnhzX3N0YXRlLnRyYW5zYWN0aW9uX2NvdW50KSA9PSAw KTsKLX0KKwlyZXEtPm1zZy5yZXFfaWQgPSB4c19yZXF1ZXN0X2VudGVyKHJlcSk7CiAKLXN0YXRp YyB2b2lkIHRyYW5zYWN0aW9uX3Jlc3VtZSh2b2lkKQotewotCW11dGV4X3VubG9jaygmeHNfc3Rh dGUudHJhbnNhY3Rpb25fbXV0ZXgpOworCW11dGV4X2xvY2soJnhiX3dyaXRlX211dGV4KTsKKwls aXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZ4Yl93cml0ZV9saXN0KTsKKwlub3RpZnkgPSBsaXN0 X2lzX3Npbmd1bGFyKCZ4Yl93cml0ZV9saXN0KTsKKwltdXRleF91bmxvY2soJnhiX3dyaXRlX211 dGV4KTsKKworCWlmIChub3RpZnkpCisJCXdha2VfdXAoJnhiX3dhaXRxKTsKIH0KIAotdm9pZCAq eGVuYnVzX2Rldl9yZXF1ZXN0X2FuZF9yZXBseShzdHJ1Y3QgeHNkX3NvY2ttc2cgKm1zZykKK3N0 YXRpYyB2b2lkICp4c193YWl0X2Zvcl9yZXBseShzdHJ1Y3QgeGJfcmVxX2RhdGEgKnJlcSwgc3Ry dWN0IHhzZF9zb2NrbXNnICptc2cpCiB7CiAJdm9pZCAqcmV0OwotCWVudW0geHNkX3NvY2ttc2df dHlwZSB0eXBlID0gbXNnLT50eXBlOwotCWludCBlcnI7CiAKLQlpZiAodHlwZSA9PSBYU19UUkFO U0FDVElPTl9TVEFSVCkKLQkJdHJhbnNhY3Rpb25fc3RhcnQoKTsKKwlyZXQgPSByZWFkX3JlcGx5 KHJlcSk7CiAKLQltdXRleF9sb2NrKCZ4c19zdGF0ZS5yZXF1ZXN0X211dGV4KTsKKwl4c19yZXF1 ZXN0X2V4aXQocmVxKTsKIAotCWVyciA9IHhiX3dyaXRlKG1zZywgc2l6ZW9mKCptc2cpICsgbXNn LT5sZW4pOwotCWlmIChlcnIpIHsKLQkJbXNnLT50eXBlID0gWFNfRVJST1I7Ci0JCXJldCA9IEVS Ul9QVFIoZXJyKTsKLQl9IGVsc2UKLQkJcmV0ID0gcmVhZF9yZXBseSgmbXNnLT50eXBlLCAmbXNn LT5sZW4pOworCW1zZy0+dHlwZSA9IHJlcS0+bXNnLnR5cGU7CisJbXNnLT5sZW4gPSByZXEtPm1z Zy5sZW47CiAKLQltdXRleF91bmxvY2soJnhzX3N0YXRlLnJlcXVlc3RfbXV0ZXgpOwotCi0JaWYg KChtc2ctPnR5cGUgPT0gWFNfVFJBTlNBQ1RJT05fRU5EKSB8fAotCSAgICAoKHR5cGUgPT0gWFNf VFJBTlNBQ1RJT05fU1RBUlQpICYmIChtc2ctPnR5cGUgPT0gWFNfRVJST1IpKSkKLQkJdHJhbnNh Y3Rpb25fZW5kKCk7CisJbXV0ZXhfbG9jaygmeGJfd3JpdGVfbXV0ZXgpOworCWlmIChyZXEtPnN0 YXRlID09IHhiX3JlcV9zdGF0ZV9xdWV1ZWQgfHwKKwkgICAgcmVxLT5zdGF0ZSA9PSB4Yl9yZXFf c3RhdGVfd2FpdF9yZXBseSkKKwkJcmVxLT5zdGF0ZSA9IHhiX3JlcV9zdGF0ZV9hYm9ydGVkOwor CWVsc2UKKwkJa2ZyZWUocmVxKTsKKwltdXRleF91bmxvY2soJnhiX3dyaXRlX211dGV4KTsKIAog CXJldHVybiByZXQ7CiB9CisKK3N0YXRpYyB2b2lkIHhzX3dha2VfdXAoc3RydWN0IHhiX3JlcV9k YXRhICpyZXEpCit7CisJd2FrZV91cCgmcmVxLT53cSk7Cit9CisKK2ludCB4ZW5idXNfZGV2X3Jl cXVlc3RfYW5kX3JlcGx5KHN0cnVjdCB4c2Rfc29ja21zZyAqbXNnLCB2b2lkICpwYXIpCit7CisJ c3RydWN0IHhiX3JlcV9kYXRhICpyZXE7CisJc3RydWN0IGt2ZWMgKnZlYzsKKworCXJlcSA9IGtt YWxsb2Moc2l6ZW9mKCpyZXEpICsgc2l6ZW9mKCp2ZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJl cSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2ZWMgPSAoc3RydWN0IGt2ZWMgKikocmVxICsgMSk7 CisJdmVjLT5pb3ZfbGVuID0gbXNnLT5sZW47CisJdmVjLT5pb3ZfYmFzZSA9IG1zZyArIDE7CisK KwlyZXEtPnZlYyA9IHZlYzsKKwlyZXEtPm51bV92ZWNzID0gMTsKKwlyZXEtPmNiID0geGVuYnVz X2Rldl9xdWV1ZV9yZXBseTsKKwlyZXEtPnBhciA9IHBhcjsKKworCXhzX3NlbmQocmVxLCBtc2cp OworCisJcmV0dXJuIDA7Cit9CiBFWFBPUlRfU1lNQk9MKHhlbmJ1c19kZXZfcmVxdWVzdF9hbmRf cmVwbHkpOwogCiAvKiBTZW5kIG1lc3NhZ2UgdG8geHMsIGdldCBrbWFsbG9jJ2VkIHJlcGx5LiAg RVJSX1BUUigpIG9uIGVycm9yLiAqLwpAQCAtMjYzLDM3ICsyOTYsMzEgQEAgc3RhdGljIHZvaWQg KnhzX3RhbGt2KHN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24gdCwKIAkJICAgICAgdW5zaWduZWQg aW50IG51bV92ZWNzLAogCQkgICAgICB1bnNpZ25lZCBpbnQgKmxlbikKIHsKKwlzdHJ1Y3QgeGJf cmVxX2RhdGEgKnJlcTsKIAlzdHJ1Y3QgeHNkX3NvY2ttc2cgbXNnOwogCXZvaWQgKnJldCA9IE5V TEw7CiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGVycjsKIAorCXJlcSA9IGttYWxsb2Moc2l6ZW9m KCpyZXEpLCBHRlBfTk9JTyB8IF9fR0ZQX0hJR0gpOworCWlmICghcmVxKQorCQlyZXR1cm4gRVJS X1BUUigtRU5PTUVNKTsKKworCXJlcS0+dmVjID0gaW92ZWM7CisJcmVxLT5udW1fdmVjcyA9IG51 bV92ZWNzOworCXJlcS0+Y2IgPSB4c193YWtlX3VwOworCiAJbXNnLnR4X2lkID0gdC5pZDsKLQlt c2cucmVxX2lkID0gMDsKIAltc2cudHlwZSA9IHR5cGU7CiAJbXNnLmxlbiA9IDA7CiAJZm9yIChp ID0gMDsgaSA8IG51bV92ZWNzOyBpKyspCiAJCW1zZy5sZW4gKz0gaW92ZWNbaV0uaW92X2xlbjsK IAotCW11dGV4X2xvY2soJnhzX3N0YXRlLnJlcXVlc3RfbXV0ZXgpOworCXhzX3NlbmQocmVxLCAm bXNnKTsKIAotCWVyciA9IHhiX3dyaXRlKCZtc2csIHNpemVvZihtc2cpKTsKLQlpZiAoZXJyKSB7 Ci0JCW11dGV4X3VubG9jaygmeHNfc3RhdGUucmVxdWVzdF9tdXRleCk7Ci0JCXJldHVybiBFUlJf UFRSKGVycik7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG51bV92ZWNzOyBpKyspIHsKLQkJZXJy ID0geGJfd3JpdGUoaW92ZWNbaV0uaW92X2Jhc2UsIGlvdmVjW2ldLmlvdl9sZW4pOwotCQlpZiAo ZXJyKSB7Ci0JCQltdXRleF91bmxvY2soJnhzX3N0YXRlLnJlcXVlc3RfbXV0ZXgpOwotCQkJcmV0 dXJuIEVSUl9QVFIoZXJyKTsKLQkJfQotCX0KLQotCXJldCA9IHJlYWRfcmVwbHkoJm1zZy50eXBl LCBsZW4pOwotCi0JbXV0ZXhfdW5sb2NrKCZ4c19zdGF0ZS5yZXF1ZXN0X211dGV4KTsKKwlyZXQg PSB4c193YWl0X2Zvcl9yZXBseShyZXEsICZtc2cpOworCWlmIChsZW4pCisJCSpsZW4gPSBtc2cu bGVuOwogCiAJaWYgKElTX0VSUihyZXQpKQogCQlyZXR1cm4gcmV0OwpAQCAtNTAwLDEzICs1Mjcs OSBAQCBpbnQgeGVuYnVzX3RyYW5zYWN0aW9uX3N0YXJ0KHN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rp b24gKnQpCiB7CiAJY2hhciAqaWRfc3RyOwogCi0JdHJhbnNhY3Rpb25fc3RhcnQoKTsKLQogCWlk X3N0ciA9IHhzX3NpbmdsZShYQlRfTklMLCBYU19UUkFOU0FDVElPTl9TVEFSVCwgIiIsIE5VTEwp OwotCWlmIChJU19FUlIoaWRfc3RyKSkgewotCQl0cmFuc2FjdGlvbl9lbmQoKTsKKwlpZiAoSVNf RVJSKGlkX3N0cikpCiAJCXJldHVybiBQVFJfRVJSKGlkX3N0cik7Ci0JfQogCiAJdC0+aWQgPSBz aW1wbGVfc3RydG91bChpZF9zdHIsIE5VTEwsIDApOwogCWtmcmVlKGlkX3N0cik7CkBAIC01MjAs MTggKzU0MywxMyBAQCBFWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfdHJhbnNhY3Rpb25fc3RhcnQp OwogaW50IHhlbmJ1c190cmFuc2FjdGlvbl9lbmQoc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbiB0 LCBpbnQgYWJvcnQpCiB7CiAJY2hhciBhYm9ydHN0clsyXTsKLQlpbnQgZXJyOwogCiAJaWYgKGFi b3J0KQogCQlzdHJjcHkoYWJvcnRzdHIsICJGIik7CiAJZWxzZQogCQlzdHJjcHkoYWJvcnRzdHIs ICJUIik7CiAKLQllcnIgPSB4c19lcnJvcih4c19zaW5nbGUodCwgWFNfVFJBTlNBQ1RJT05fRU5E LCBhYm9ydHN0ciwgTlVMTCkpOwotCi0JdHJhbnNhY3Rpb25fZW5kKCk7Ci0KLQlyZXR1cm4gZXJy OworCXJldHVybiB4c19lcnJvcih4c19zaW5nbGUodCwgWFNfVFJBTlNBQ1RJT05fRU5ELCBhYm9y dHN0ciwgTlVMTCkpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoeGVuYnVzX3RyYW5zYWN0aW9uX2Vu ZCk7CiAKQEAgLTY2NCw2ICs2ODIsMzAgQEAgc3RhdGljIHN0cnVjdCB4ZW5idXNfd2F0Y2ggKmZp bmRfd2F0Y2goY29uc3QgY2hhciAqdG9rZW4pCiAKIAlyZXR1cm4gTlVMTDsKIH0KKworaW50IHhz X3dhdGNoX21zZyhzdHJ1Y3QgeHNfd2F0Y2hfZXZlbnQgKmV2ZW50KQoreworCWlmIChjb3VudF9z dHJpbmdzKGV2ZW50LT5ib2R5LCBldmVudC0+bGVuKSAhPSAyKSB7CisJCWtmcmVlKGV2ZW50KTsK KwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWV2ZW50LT5wYXRoID0gKGNvbnN0IGNoYXIgKilldmVu dC0+Ym9keTsKKwlldmVudC0+dG9rZW4gPSAoY29uc3QgY2hhciAqKXN0cmNocihldmVudC0+Ym9k eSwgJ1wwJykgKyAxOworCisJc3Bpbl9sb2NrKCZ3YXRjaGVzX2xvY2spOworCWV2ZW50LT5oYW5k bGUgPSBmaW5kX3dhdGNoKGV2ZW50LT50b2tlbik7CisJaWYgKGV2ZW50LT5oYW5kbGUgIT0gTlVM TCkgeworCQlzcGluX2xvY2soJndhdGNoX2V2ZW50c19sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgm ZXZlbnQtPmxpc3QsICZ3YXRjaF9ldmVudHMpOworCQl3YWtlX3VwKCZ3YXRjaF9ldmVudHNfd2Fp dHEpOworCQlzcGluX3VubG9jaygmd2F0Y2hfZXZlbnRzX2xvY2spOworCX0gZWxzZQorCQlrZnJl ZShldmVudCk7CisJc3Bpbl91bmxvY2soJndhdGNoZXNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30K KwogLyoKICAqIENlcnRhaW4gb2xkZXIgWGVuQnVzIHRvb2xzdGFjayBjYW5ub3QgaGFuZGxlIHJl YWRpbmcgdmFsdWVzIHRoYXQgYXJlCiAgKiBub3QgcG9wdWxhdGVkLiBTb21lIFhlbiAzLjQgaW5z dGFsbGF0aW9uIGFyZSBpbmNhcGFibGUgb2YgZG9pbmcgdGhpcwpAQCAtNzEyLDcgKzc1NCw3IEBA IGludCByZWdpc3Rlcl94ZW5idXNfd2F0Y2goc3RydWN0IHhlbmJ1c193YXRjaCAqd2F0Y2gpCiAK IAlzcHJpbnRmKHRva2VuLCAiJWxYIiwgKGxvbmcpd2F0Y2gpOwogCi0JZG93bl9yZWFkKCZ4c19z dGF0ZS53YXRjaF9tdXRleCk7CisJZG93bl9yZWFkKCZ4c193YXRjaF9yd3NlbSk7CiAKIAlzcGlu X2xvY2soJndhdGNoZXNfbG9jayk7CiAJQlVHX09OKGZpbmRfd2F0Y2godG9rZW4pKTsKQEAgLTcy Nyw3ICs3NjksNyBAQCBpbnQgcmVnaXN0ZXJfeGVuYnVzX3dhdGNoKHN0cnVjdCB4ZW5idXNfd2F0 Y2ggKndhdGNoKQogCQlzcGluX3VubG9jaygmd2F0Y2hlc19sb2NrKTsKIAl9CiAKLQl1cF9yZWFk KCZ4c19zdGF0ZS53YXRjaF9tdXRleCk7CisJdXBfcmVhZCgmeHNfd2F0Y2hfcndzZW0pOwogCiAJ cmV0dXJuIGVycjsKIH0KQEAgLTczNSwxMyArNzc3LDEzIEBAIEVYUE9SVF9TWU1CT0xfR1BMKHJl Z2lzdGVyX3hlbmJ1c193YXRjaCk7CiAKIHZvaWQgdW5yZWdpc3Rlcl94ZW5idXNfd2F0Y2goc3Ry dWN0IHhlbmJ1c193YXRjaCAqd2F0Y2gpCiB7Ci0Jc3RydWN0IHhzX3N0b3JlZF9tc2cgKm1zZywg KnRtcDsKKwlzdHJ1Y3QgeHNfd2F0Y2hfZXZlbnQgKmV2ZW50LCAqdG1wOwogCWNoYXIgdG9rZW5b c2l6ZW9mKHdhdGNoKSAqIDIgKyAxXTsKIAlpbnQgZXJyOwogCiAJc3ByaW50Zih0b2tlbiwgIiVs WCIsIChsb25nKXdhdGNoKTsKIAotCWRvd25fcmVhZCgmeHNfc3RhdGUud2F0Y2hfbXV0ZXgpOwor CWRvd25fcmVhZCgmeHNfd2F0Y2hfcndzZW0pOwogCiAJc3Bpbl9sb2NrKCZ3YXRjaGVzX2xvY2sp OwogCUJVR19PTighZmluZF93YXRjaCh0b2tlbikpOwpAQCAtNzUyLDcgKzc5NCw3IEBAIHZvaWQg dW5yZWdpc3Rlcl94ZW5idXNfd2F0Y2goc3RydWN0IHhlbmJ1c193YXRjaCAqd2F0Y2gpCiAJaWYg KGVycikKIAkJcHJfd2FybigiRmFpbGVkIHRvIHJlbGVhc2Ugd2F0Y2ggJXM6ICVpXG4iLCB3YXRj aC0+bm9kZSwgZXJyKTsKIAotCXVwX3JlYWQoJnhzX3N0YXRlLndhdGNoX211dGV4KTsKKwl1cF9y ZWFkKCZ4c193YXRjaF9yd3NlbSk7CiAKIAkvKiBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGNhbGxi YWNrcyBydW5uaW5nIGN1cnJlbnRseSAodW5sZXNzCiAJICAgaXRzIHVzKSAqLwpAQCAtNzYxLDEy ICs4MDMsMTEgQEAgdm9pZCB1bnJlZ2lzdGVyX3hlbmJ1c193YXRjaChzdHJ1Y3QgeGVuYnVzX3dh dGNoICp3YXRjaCkKIAogCS8qIENhbmNlbCBwZW5kaW5nIHdhdGNoIGV2ZW50cy4gKi8KIAlzcGlu X2xvY2soJndhdGNoX2V2ZW50c19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNn LCB0bXAsICZ3YXRjaF9ldmVudHMsIGxpc3QpIHsKLQkJaWYgKG1zZy0+dS53YXRjaC5oYW5kbGUg IT0gd2F0Y2gpCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV2ZW50LCB0bXAsICZ3YXRjaF9l dmVudHMsIGxpc3QpIHsKKwkJaWYgKGV2ZW50LT5oYW5kbGUgIT0gd2F0Y2gpCiAJCQljb250aW51 ZTsKLQkJbGlzdF9kZWwoJm1zZy0+bGlzdCk7Ci0JCWtmcmVlKG1zZy0+dS53YXRjaC5wYXRoKTsK LQkJa2ZyZWUobXNnKTsKKwkJbGlzdF9kZWwoJmV2ZW50LT5saXN0KTsKKwkJa2ZyZWUoZXZlbnQp OwogCX0KIAlzcGluX3VubG9jaygmd2F0Y2hfZXZlbnRzX2xvY2spOwogCkBAIC03NzcsMTAgKzgx OCwxMCBAQCBFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX3hlbmJ1c193YXRjaCk7CiAKIHZv aWQgeHNfc3VzcGVuZCh2b2lkKQogewotCXRyYW5zYWN0aW9uX3N1c3BlbmQoKTsKLQlkb3duX3dy aXRlKCZ4c19zdGF0ZS53YXRjaF9tdXRleCk7Ci0JbXV0ZXhfbG9jaygmeHNfc3RhdGUucmVxdWVz dF9tdXRleCk7Ci0JbXV0ZXhfbG9jaygmeHNfc3RhdGUucmVzcG9uc2VfbXV0ZXgpOworCXhzX3N1 c3BlbmRfZW50ZXIoKTsKKworCWRvd25fd3JpdGUoJnhzX3dhdGNoX3J3c2VtKTsKKwltdXRleF9s b2NrKCZ4c19yZXNwb25zZV9tdXRleCk7CiB9CiAKIHZvaWQgeHNfcmVzdW1lKHZvaWQpCkBAIC03 OTAsMzEgKzgzMSwzMSBAQCB2b2lkIHhzX3Jlc3VtZSh2b2lkKQogCiAJeGJfaW5pdF9jb21tcygp OwogCi0JbXV0ZXhfdW5sb2NrKCZ4c19zdGF0ZS5yZXNwb25zZV9tdXRleCk7Ci0JbXV0ZXhfdW5s b2NrKCZ4c19zdGF0ZS5yZXF1ZXN0X211dGV4KTsKLQl0cmFuc2FjdGlvbl9yZXN1bWUoKTsKKwlt dXRleF91bmxvY2soJnhzX3Jlc3BvbnNlX211dGV4KTsKIAotCS8qIE5vIG5lZWQgZm9yIHdhdGNo ZXNfbG9jazogdGhlIHdhdGNoX211dGV4IGlzIHN1ZmZpY2llbnQuICovCisJeHNfc3VzcGVuZF9l eGl0KCk7CisKKwkvKiBObyBuZWVkIGZvciB3YXRjaGVzX2xvY2s6IHRoZSB4c193YXRjaF9yd3Nl bSBpcyBzdWZmaWNpZW50LiAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkod2F0Y2gsICZ3YXRjaGVz LCBsaXN0KSB7CiAJCXNwcmludGYodG9rZW4sICIlbFgiLCAobG9uZyl3YXRjaCk7CiAJCXhzX3dh dGNoKHdhdGNoLT5ub2RlLCB0b2tlbik7CiAJfQogCi0JdXBfd3JpdGUoJnhzX3N0YXRlLndhdGNo X211dGV4KTsKKwl1cF93cml0ZSgmeHNfd2F0Y2hfcndzZW0pOwogfQogCiB2b2lkIHhzX3N1c3Bl bmRfY2FuY2VsKHZvaWQpCiB7Ci0JbXV0ZXhfdW5sb2NrKCZ4c19zdGF0ZS5yZXNwb25zZV9tdXRl eCk7Ci0JbXV0ZXhfdW5sb2NrKCZ4c19zdGF0ZS5yZXF1ZXN0X211dGV4KTsKLQl1cF93cml0ZSgm eHNfc3RhdGUud2F0Y2hfbXV0ZXgpOwotCW11dGV4X3VubG9jaygmeHNfc3RhdGUudHJhbnNhY3Rp b25fbXV0ZXgpOworCW11dGV4X3VubG9jaygmeHNfcmVzcG9uc2VfbXV0ZXgpOworCXVwX3dyaXRl KCZ4c193YXRjaF9yd3NlbSk7CisKKwl4c19zdXNwZW5kX2V4aXQoKTsKIH0KIAogc3RhdGljIGlu dCB4ZW53YXRjaF90aHJlYWQodm9pZCAqdW51c2VkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmVu dDsKLQlzdHJ1Y3QgeHNfc3RvcmVkX21zZyAqbXNnOworCXN0cnVjdCB4c193YXRjaF9ldmVudCAq ZXZlbnQ7CiAKIAlmb3IgKDs7KSB7CiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh3YXRjaF9l dmVudHNfd2FpdHEsCkBAIC04MzIsMTIgKzg3MywxMCBAQCBzdGF0aWMgaW50IHhlbndhdGNoX3Ro cmVhZCh2b2lkICp1bnVzZWQpCiAJCXNwaW5fdW5sb2NrKCZ3YXRjaF9ldmVudHNfbG9jayk7CiAK IAkJaWYgKGVudCAhPSAmd2F0Y2hfZXZlbnRzKSB7Ci0JCQltc2cgPSBsaXN0X2VudHJ5KGVudCwg c3RydWN0IHhzX3N0b3JlZF9tc2csIGxpc3QpOwotCQkJbXNnLT51LndhdGNoLmhhbmRsZS0+Y2Fs bGJhY2sobXNnLT51LndhdGNoLmhhbmRsZSwKLQkJCQkJCSAgICAgIG1zZy0+dS53YXRjaC5wYXRo LAotCQkJCQkJICAgICAgbXNnLT51LndhdGNoLnRva2VuKTsKLQkJCWtmcmVlKG1zZy0+dS53YXRj aC5wYXRoKTsKLQkJCWtmcmVlKG1zZyk7CisJCQlldmVudCA9IGxpc3RfZW50cnkoZW50LCBzdHJ1 Y3QgeHNfd2F0Y2hfZXZlbnQsIGxpc3QpOworCQkJZXZlbnQtPmhhbmRsZS0+Y2FsbGJhY2soZXZl bnQtPmhhbmRsZSwgZXZlbnQtPnBhdGgsCisJCQkJCQlldmVudC0+dG9rZW4pOworCQkJa2ZyZWUo ZXZlbnQpOwogCQl9CiAKIAkJbXV0ZXhfdW5sb2NrKCZ4ZW53YXRjaF9tdXRleCk7CkBAIC04NDYs MTI2ICs4ODUsMzcgQEAgc3RhdGljIGludCB4ZW53YXRjaF90aHJlYWQodm9pZCAqdW51c2VkKQog CXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHByb2Nlc3NfbXNnKHZvaWQpCisvKgorICogV2Fr ZSB1cCBhbGwgdGhyZWFkcyB3YWl0aW5nIGZvciBhIHhlbnN0b3JlIHJlcGx5LiBJbiBjYXNlIG9m IHNodXRkb3duIGFsbAorICogcGVuZGluZyByZXBsaWVzIHdpbGwgYmUgbWFya2VkIGFzICJhYm9y dGVkIiBpbiBvcmRlciB0byBsZXQgdGhlIHdhaXRlcnMKKyAqIHJldHVybiBpbiBzcGl0ZSBvZiB4 ZW5zdG9yZSBwb3NzaWJseSBubyBsb25nZXIgYmVpbmcgYWJsZSB0byByZXBseS4gVGhpcworICog d2lsbCBhdm9pZCBibG9ja2luZyBzaHV0ZG93biBieSBhIHRocmVhZCB3YWl0aW5nIGZvciB4ZW5z dG9yZSBidXQgYmVpbmcKKyAqIG5lY2Vzc2FyeSBmb3Igc2h1dGRvd24gcHJvY2Vzc2luZyB0byBw cm9jZWVkLgorICovCitzdGF0aWMgaW50IHhzX3JlYm9vdF9ub3RpZnkoc3RydWN0IG5vdGlmaWVy X2Jsb2NrICpuYiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKIHsK LQlzdHJ1Y3QgeHNfc3RvcmVkX21zZyAqbXNnOwotCWNoYXIgKmJvZHk7Ci0JaW50IGVycjsKLQot CS8qCi0JICogV2UgbXVzdCBkaXNhbGxvdyBzYXZlL3Jlc3RvcmUgd2hpbGUgcmVhZGluZyBhIHhl bnN0b3JlIG1lc3NhZ2UuCi0JICogQSBwYXJ0aWFsIHJlYWQgYWNyb3NzIHMvciBsZWF2ZXMgdXMg b3V0IG9mIHN5bmMgd2l0aCB4ZW5zdG9yZWQuCi0JICovCi0JZm9yICg7OykgewotCQllcnIgPSB4 Yl93YWl0X2Zvcl9kYXRhX3RvX3JlYWQoKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0J CW11dGV4X2xvY2soJnhzX3N0YXRlLnJlc3BvbnNlX211dGV4KTsKLQkJaWYgKHhiX2RhdGFfdG9f cmVhZCgpKQotCQkJYnJlYWs7Ci0JCS8qIFdlIHJhY2VkIHdpdGggc2F2ZS9yZXN0b3JlOiBwZW5k aW5nIGRhdGEgJ2Rpc2FwcGVhcmVkJy4gKi8KLQkJbXV0ZXhfdW5sb2NrKCZ4c19zdGF0ZS5yZXNw b25zZV9tdXRleCk7Ci0JfQotCi0KLQltc2cgPSBrbWFsbG9jKHNpemVvZigqbXNnKSwgR0ZQX05P SU8gfCBfX0dGUF9ISUdIKTsKLQlpZiAobXNnID09IE5VTEwpIHsKLQkJZXJyID0gLUVOT01FTTsK LQkJZ290byBvdXQ7Ci0JfQotCi0JZXJyID0geGJfcmVhZCgmbXNnLT5oZHIsIHNpemVvZihtc2ct PmhkcikpOwotCWlmIChlcnIpIHsKLQkJa2ZyZWUobXNnKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0J aWYgKG1zZy0+aGRyLmxlbiA+IFhFTlNUT1JFX1BBWUxPQURfTUFYKSB7Ci0JCWtmcmVlKG1zZyk7 Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWJvZHkgPSBrbWFsbG9jKG1z Zy0+aGRyLmxlbiArIDEsIEdGUF9OT0lPIHwgX19HRlBfSElHSCk7Ci0JaWYgKGJvZHkgPT0gTlVM TCkgewotCQlrZnJlZShtc2cpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0K LQllcnIgPSB4Yl9yZWFkKGJvZHksIG1zZy0+aGRyLmxlbik7Ci0JaWYgKGVycikgewotCQlrZnJl ZShib2R5KTsKLQkJa2ZyZWUobXNnKTsKLQkJZ290byBvdXQ7Ci0JfQotCWJvZHlbbXNnLT5oZHIu bGVuXSA9ICdcMCc7Ci0KLQlpZiAobXNnLT5oZHIudHlwZSA9PSBYU19XQVRDSF9FVkVOVCkgewot CQlpZiAoY291bnRfc3RyaW5ncyhib2R5LCBtc2ctPmhkci5sZW4pICE9IDIpIHsKLQkJCWVyciA9 IC1FSU5WQUw7Ci0JCQlrZnJlZShtc2cpOwotCQkJa2ZyZWUoYm9keSk7Ci0JCQlnb3RvIG91dDsK LQkJfQotCQltc2ctPnUud2F0Y2gucGF0aCA9IChjb25zdCBjaGFyICopYm9keTsKLQkJbXNnLT51 LndhdGNoLnRva2VuID0gKGNvbnN0IGNoYXIgKilzdHJjaHIoYm9keSwgJ1wwJykgKyAxOwotCi0J CXNwaW5fbG9jaygmd2F0Y2hlc19sb2NrKTsKLQkJbXNnLT51LndhdGNoLmhhbmRsZSA9IGZpbmRf d2F0Y2gobXNnLT51LndhdGNoLnRva2VuKTsKLQkJaWYgKG1zZy0+dS53YXRjaC5oYW5kbGUgIT0g TlVMTCkgewotCQkJc3Bpbl9sb2NrKCZ3YXRjaF9ldmVudHNfbG9jayk7Ci0JCQlsaXN0X2FkZF90 YWlsKCZtc2ctPmxpc3QsICZ3YXRjaF9ldmVudHMpOwotCQkJd2FrZV91cCgmd2F0Y2hfZXZlbnRz X3dhaXRxKTsKLQkJCXNwaW5fdW5sb2NrKCZ3YXRjaF9ldmVudHNfbG9jayk7Ci0JCX0gZWxzZSB7 Ci0JCQlrZnJlZShib2R5KTsKLQkJCWtmcmVlKG1zZyk7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJndh dGNoZXNfbG9jayk7Ci0JfSBlbHNlIHsKLQkJbXNnLT51LnJlcGx5LmJvZHkgPSBib2R5OwotCQlz cGluX2xvY2soJnhzX3N0YXRlLnJlcGx5X2xvY2spOwotCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxp c3QsICZ4c19zdGF0ZS5yZXBseV9saXN0KTsKLQkJc3Bpbl91bmxvY2soJnhzX3N0YXRlLnJlcGx5 X2xvY2spOwotCQl3YWtlX3VwKCZ4c19zdGF0ZS5yZXBseV93YWl0cSk7Ci0JfQotCi0gb3V0Ogot CW11dGV4X3VubG9jaygmeHNfc3RhdGUucmVzcG9uc2VfbXV0ZXgpOwotCXJldHVybiBlcnI7CisJ c3RydWN0IHhiX3JlcV9kYXRhICpyZXE7CisKKwltdXRleF9sb2NrKCZ4Yl93cml0ZV9tdXRleCk7 CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZ4c19yZXBseV9saXN0LCBsaXN0KQorCQl3YWtl X3VwKCZyZXEtPndxKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJnhiX3dyaXRlX2xpc3Qs IGxpc3QpCisJCXdha2VfdXAoJnJlcS0+d3EpOworCW11dGV4X3VubG9jaygmeGJfd3JpdGVfbXV0 ZXgpOworCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIAotc3RhdGljIGludCB4ZW5idXNfdGhyZWFk KHZvaWQgKnVudXNlZCkKLXsKLQlpbnQgZXJyOwotCi0JZm9yICg7OykgewotCQllcnIgPSBwcm9j ZXNzX21zZygpOwotCQlpZiAoZXJyKQotCQkJcHJfd2FybigiZXJyb3IgJWQgd2hpbGUgcmVhZGlu ZyBtZXNzYWdlXG4iLCBlcnIpOwotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQkJYnJl YWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19CitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHhz X3JlYm9vdF9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHhzX3JlYm9vdF9ub3RpZnksCit9Owog CiBpbnQgeHNfaW5pdCh2b2lkKQogewogCWludCBlcnI7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0 YXNrOwogCi0JSU5JVF9MSVNUX0hFQUQoJnhzX3N0YXRlLnJlcGx5X2xpc3QpOwotCXNwaW5fbG9j a19pbml0KCZ4c19zdGF0ZS5yZXBseV9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ4c19z dGF0ZS5yZXBseV93YWl0cSk7Ci0KLQltdXRleF9pbml0KCZ4c19zdGF0ZS5yZXF1ZXN0X211dGV4 KTsKLQltdXRleF9pbml0KCZ4c19zdGF0ZS5yZXNwb25zZV9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgm eHNfc3RhdGUudHJhbnNhY3Rpb25fbXV0ZXgpOwotCWluaXRfcndzZW0oJnhzX3N0YXRlLndhdGNo X211dGV4KTsKLQlhdG9taWNfc2V0KCZ4c19zdGF0ZS50cmFuc2FjdGlvbl9jb3VudCwgMCk7Ci0J aW5pdF93YWl0cXVldWVfaGVhZCgmeHNfc3RhdGUudHJhbnNhY3Rpb25fd3EpOworCXJlZ2lzdGVy X3JlYm9vdF9ub3RpZmllcigmeHNfcmVib290X25iKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIHNo YXJlZCBtZW1vcnkgcmluZ3MgdG8gdGFsayB0byB4ZW5zdG9yZWQgKi8KIAllcnIgPSB4Yl9pbml0 X2NvbW1zKCk7CkBAIC05NzcsMTAgKzkyNyw2IEBAIGludCB4c19pbml0KHZvaWQpCiAJCXJldHVy biBQVFJfRVJSKHRhc2spOwogCXhlbndhdGNoX3BpZCA9IHRhc2stPnBpZDsKIAotCXRhc2sgPSBr dGhyZWFkX3J1bih4ZW5idXNfdGhyZWFkLCBOVUxMLCAieGVuYnVzIik7Ci0JaWYgKElTX0VSUih0 YXNrKSkKLQkJcmV0dXJuIFBUUl9FUlIodGFzayk7Ci0KIAkvKiBzaHV0ZG93biB3YXRjaGVzIGZv ciBrZXhlYyBib290ICovCiAJeHNfcmVzZXRfd2F0Y2hlcygpOwogCi0tIAoyLjEwLjIKCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFp bGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0dHBzOi8vbGlzdHMueGVuLm9yZy94 ZW4tZGV2ZWwK