From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Hellstrom Subject: [RFC PATCH 3/3] mm: Add write-protect and clean utilities for address space ranges Date: Wed, 20 Mar 2019 16:23:15 +0100 Message-ID: <20190320152315.82758-4-thellstrom@vmware.com> References: <20190320152315.82758-1-thellstrom@vmware.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from EX13-EDG-OU-002.vmware.com (ex13-edg-ou-002.vmware.com [208.91.0.190]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8163589FAD for ; Wed, 20 Mar 2019 15:23:53 +0000 (UTC) In-Reply-To: <20190320152315.82758-1-thellstrom@vmware.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: Thomas Hellstrom , Michal Hocko , Rik van Riel , Peter Zijlstra , Will Deacon , linux-kernel@vger.kernel.org, Matthew Wilcox , linux-mm@kvack.org, Minchan Kim , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , linux-graphics-maintainer@vmware.com, Souptick Joarder , Huang Ying , Andrew Morton List-Id: dri-devel@lists.freedesktop.org QWRkIHR3byB1dGlsaXRpZXMgdG8gYSkgd3JpdGUtcHJvdGVjdCBhbmQgYikgY2xlYW4gYWxsIHB0 ZXMgcG9pbnRpbmcgaW50bwphIHJhbmdlIG9mIGFuIGFkZHJlc3Mgc3BhY2UKVGhlIHV0aWxpdGll cyBhcmUgaW50ZW5kZWQgdG8gYWlkIGluIHRyYWNraW5nIGRpcnR5IHBhZ2VzIChlaXRoZXIKZHJp dmVyLWFsbG9jYXRlZCBzeXN0ZW0gbWVtb3J5IG9yIHBjaSBkZXZpY2UgbWVtb3J5KS4KVGhlIHdy aXRlLXByb3RlY3QgdXRpbGl0eSBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCnBh Z2VfbWt3cml0ZSgpIGFuZCBwZm5fbWt3cml0ZSgpIHRvIHRyaWdnZXIgd3JpdGUgcGFnZS1mYXVs dHMgb24gcGFnZQphY2Nlc3Nlcy4gVHlwaWNhbGx5IG9uZSB3b3VsZCB3YW50IHRvIHVzZSB0aGlz IG9uIHNwYXJzZSBhY2Nlc3NlcyBpbnRvCmxhcmdlIG1lbW9yeSByZWdpb25zLiBUaGUgY2xlYW4g dXRpbGl0eSBzaG91bGQgYmUgdXNlZCB0byB1dGlsaXplCmhhcmR3YXJlIGRpcnR5aW5nIGZ1bmN0 aW9uYWxpdHkgYW5kIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBwYWdlLWZhdWx0cywKdHlwaWNhbGx5 IG9uIGxhcmdlIGFjY2Vzc2VzIGludG8gc21hbGwgbWVtb3J5IHJlZ2lvbnMuCgpDYzogQW5kcmV3 IE1vcnRvbiA8YWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZz4KQ2M6IE1hdHRoZXcgV2lsY294IDx3 aWxseUBpbmZyYWRlYWQub3JnPgpDYzogV2lsbCBEZWFjb24gPHdpbGwuZGVhY29uQGFybS5jb20+ CkNjOiBQZXRlciBaaWpsc3RyYSA8cGV0ZXJ6QGluZnJhZGVhZC5vcmc+CkNjOiBSaWsgdmFuIFJp ZWwgPHJpZWxAc3VycmllbC5jb20+CkNjOiBNaW5jaGFuIEtpbSA8bWluY2hhbkBrZXJuZWwub3Jn PgpDYzogTWljaGFsIEhvY2tvIDxtaG9ja29Ac3VzZS5jb20+CkNjOiBIdWFuZyBZaW5nIDx5aW5n Lmh1YW5nQGludGVsLmNvbT4KQ2M6IFNvdXB0aWNrIEpvYXJkZXIgPGpyZHIubGludXhAZ21haWwu Y29tPgpDYzogIkrDqXLDtG1lIEdsaXNzZSIgPGpnbGlzc2VAcmVkaGF0LmNvbT4KQ2M6IGxpbnV4 LW1tQGt2YWNrLm9yZwpDYzogbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwpTaWduZWQtb2Zm LWJ5OiBUaG9tYXMgSGVsbHN0cm9tIDx0aGVsbHN0cm9tQHZtd2FyZS5jb20+Ci0tLQogaW5jbHVk ZS9saW51eC9tbS5oICB8ICAgOSArLQogbW0vTWFrZWZpbGUgICAgICAgICB8ICAgMiArLQogbW0v YXBwbHlfYXNfcmFuZ2UuYyB8IDI1NyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCAyNjYgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlv bnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBtbS9hcHBseV9hc19yYW5nZS5jCgpkaWZmIC0tZ2l0 IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IGI3ZGQ0ZGRk NmVmYi4uNjJmMjRkZDBiZmEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKKysrIGIv aW5jbHVkZS9saW51eC9tbS5oCkBAIC0yNjQyLDcgKzI2NDIsMTQgQEAgc3RydWN0IHBmbl9yYW5n ZV9hcHBseSB7CiB9OwogZXh0ZXJuIGludCBhcHBseV90b19wZm5fcmFuZ2Uoc3RydWN0IHBmbl9y YW5nZV9hcHBseSAqY2xvc3VyZSwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5z aWduZWQgbG9uZyBzaXplKTsKLQordW5zaWduZWQgbG9uZyBhcHBseV9hc193cnByb3RlY3Qoc3Ry dWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJIHBnb2ZmX3QgZmlyc3RfaW5kZXgsIHBn b2ZmX3QgbnIpOwordW5zaWduZWQgbG9uZyBhcHBseV9hc19jbGVhbihzdHJ1Y3QgYWRkcmVzc19z cGFjZSAqbWFwcGluZywKKwkJCSAgICAgcGdvZmZfdCBmaXJzdF9pbmRleCwgcGdvZmZfdCBuciwK KwkJCSAgICAgcGdvZmZfdCBiaXRtYXBfcGdvZmYsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKmJp dG1hcCwKKwkJCSAgICAgcGdvZmZfdCAqc3RhcnQsCisJCQkgICAgIHBnb2ZmX3QgKmVuZCk7CiAj aWZkZWYgQ09ORklHX1BBR0VfUE9JU09OSU5HCiBleHRlcm4gYm9vbCBwYWdlX3BvaXNvbmluZ19l bmFibGVkKHZvaWQpOwogZXh0ZXJuIHZvaWQga2VybmVsX3BvaXNvbl9wYWdlcyhzdHJ1Y3QgcGFn ZSAqcGFnZSwgaW50IG51bXBhZ2VzLCBpbnQgZW5hYmxlKTsKZGlmZiAtLWdpdCBhL21tL01ha2Vm aWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggZDIxMGNjOWQ2ZjgwLi5hOTRiNzhmMTI2OTIgMTAwNjQ0 Ci0tLSBhL21tL01ha2VmaWxlCisrKyBiL21tL01ha2VmaWxlCkBAIC0zOSw3ICszOSw3IEBAIG9i ai15CQkJOj0gZmlsZW1hcC5vIG1lbXBvb2wubyBvb21fa2lsbC5vIGZhZHZpc2UubyBcCiAJCQkg ICBtbV9pbml0Lm8gbW11X2NvbnRleHQubyBwZXJjcHUubyBzbGFiX2NvbW1vbi5vIFwKIAkJCSAg IGNvbXBhY3Rpb24ubyB2bWFjYWNoZS5vIFwKIAkJCSAgIGludGVydmFsX3RyZWUubyBsaXN0X2xy dS5vIHdvcmtpbmdzZXQubyBcCi0JCQkgICBkZWJ1Zy5vICQobW11LXkpCisJCQkgICBkZWJ1Zy5v IGFwcGx5X2FzX3JhbmdlLm8gJChtbXUteSkKIAogb2JqLXkgKz0gaW5pdC1tbS5vCiBvYmoteSAr PSBtZW1ibG9jay5vCmRpZmYgLS1naXQgYS9tbS9hcHBseV9hc19yYW5nZS5jIGIvbW0vYXBwbHlf YXNfcmFuZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjlmMDNl MjcyZWJkMAotLS0gL2Rldi9udWxsCisrKyBiL21tL2FwcGx5X2FzX3JhbmdlLmMKQEAgLTAsMCAr MSwyNTcgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjaW5jbHVkZSA8 bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbV90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4 L2h1Z2V0bGIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vY2Fj aGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCisvKioKKyAqIHN0cnVjdCBh cHBseV9hcyAtIENsb3N1cmUgc3RydWN0dXJlIGZvciBhcHBseV9hc19yYW5nZQorICogQGJhc2U6 IHN0cnVjdCBwZm5fcmFuZ2VfYXBwbHkgd2UgZGVyaXZlIGZyb20KKyAqIEBzdGFydDogQWRkcmVz cyBvZiBmaXJzdCBtb2RpZmllZCBwdGUKKyAqIEBlbmQ6IEFkZHJlc3Mgb2YgbGFzdCBtb2RpZmll ZCBwdGUgKyAxCisgKiBAdG90YWw6IFRvdGFsIG51bWJlciBvZiBtb2RpZmllZCBwdGVzCisgKiBA dm1hOiBQb2ludGVyIHRvIHRoZSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Qgd2UncmUgY3VycmVudGx5 IG9wZXJhdGluZyBvbgorICogQGZsdXNoX2NhY2hlOiBXaGV0aGVyIHRvIGNhbGwgYSBjYWNoZSBm bHVzaCBiZWZvcmUgbW9kaWZ5aW5nIGEgcHRlCisgKiBAZmx1c2hfdGxiOiBXaGV0aGVyIHRvIGZs dXNoIHRoZSB0bGIgYWZ0ZXIgbW9kaWZ5aW5nIGEgcHRlCisgKi8KK3N0cnVjdCBhcHBseV9hcyB7 CisJc3RydWN0IHBmbl9yYW5nZV9hcHBseSBiYXNlOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVu ZDsKKwl1bnNpZ25lZCBsb25nIHRvdGFsOworCWNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAq dm1hOworCXUzMiBmbHVzaF9jYWNoZSA6IDE7CisJdTMyIGZsdXNoX3RsYiA6IDE7Cit9OworCisv KioKKyAqIGFwcGx5X3B0X3dycHJvdGVjdCAtIExlYWYgcHRlIGNhbGxiYWNrIHRvIHdyaXRlLXBy b3RlY3QgYSBwdGUKKyAqIEBwdGU6IFBvaW50ZXIgdG8gdGhlIHB0ZQorICogQHRva2VuOiBQYWdl IHRhYmxlIHRva2VuLCBzZWUgYXBwbHlfdG9fcGZuX3JhbmdlKCkKKyAqIEBhZGRyOiBUaGUgdmly dHVhbCBwYWdlIGFkZHJlc3MKKyAqIEBjbG9zdXJlOiBQb2ludGVyIHRvIGEgc3RydWN0IHBmbl9y YW5nZV9hcHBseSBlbWJlZGRlZCBpbiBhCisgKiBzdHJ1Y3QgYXBwbHlfYXMKKyAqCisgKiBUaGUg ZnVuY3Rpb24gd3JpdGUtcHJvdGVjdHMgYSBwdGUgYW5kIHJlY29yZHMgdGhlIHJhbmdlIGluCisg KiB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2Ugb2YgdG91Y2hlZCBwdGVzIGZvciBlZmZpY2llbnQgVExC IGZsdXNoZXMuCisgKgorICogUmV0dXJuOiBBbHdheXMgemVyby4KKyAqLworc3RhdGljIGludCBh cHBseV9wdF93cnByb3RlY3QocHRlX3QgKnB0ZSwgcGd0YWJsZV90IHRva2VuLAorCQkJICAgICAg dW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgICAgc3RydWN0IHBmbl9yYW5nZV9hcHBseSAqY2xv c3VyZSkKK3sKKwlzdHJ1Y3QgYXBwbHlfYXMgKmFhcyA9IGNvbnRhaW5lcl9vZihjbG9zdXJlLCB0 eXBlb2YoKmFhcyksIGJhc2UpOworCisJaWYgKHB0ZV93cml0ZSgqcHRlKSkgeworCQlzZXRfcHRl X2F0KGNsb3N1cmUtPm1tLCBhZGRyLCBwdGUsIHB0ZV93cnByb3RlY3QoKnB0ZSkpOworCQlhYXMt PnRvdGFsKys7CisJCWlmIChhZGRyIDwgYWFzLT5zdGFydCkKKwkJCWFhcy0+c3RhcnQgPSBhZGRy OworCQlpZiAoYWRkciArIFBBR0VfU0laRSA+IGFhcy0+ZW5kKQorCQkJYWFzLT5lbmQgPSBhZGRy ICsgUEFHRV9TSVpFOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHN0cnVjdCBhcHBs eV9hc19jbGVhbiAtIENsb3N1cmUgc3RydWN0dXJlIGZvciBhcHBseV9hc19jbGVhbgorICogQGJh c2U6IHN0cnVjdCBhcHBseV9hcyB3ZSBkZXJpdmUgZnJvbQorICogQGJpdG1hcF9wZ29mZjogQWRk cmVzc19zcGFjZSBQYWdlIG9mZnNldCBvZiB0aGUgZmlyc3QgYml0IGluIEBiaXRtYXAKKyAqIEBi aXRtYXA6IEJpdG1hcCB3aXRoIG9uZSBiaXQgZm9yIGVhY2ggcGFnZSBvZmZzZXQgaW4gdGhlIGFk ZHJlc3Nfc3BhY2UgcmFuZ2UKKyAqIGNvdmVyZWQuCisgKiBAc3RhcnQ6IEFkZHJlc3Nfc3BhY2Ug cGFnZSBvZmZzZXQgb2YgZmlyc3QgbW9kaWZpZWQgcHRlCisgKiBAZW5kOiBBZGRyZXNzX3NwYWNl IHBhZ2Ugb2Zmc2V0IG9mIGxhc3QgbW9kaWZpZWQgcHRlCisgKi8KK3N0cnVjdCBhcHBseV9hc19j bGVhbiB7CisJc3RydWN0IGFwcGx5X2FzIGJhc2U7CisJcGdvZmZfdCBiaXRtYXBfcGdvZmY7CisJ dW5zaWduZWQgbG9uZyAqYml0bWFwOworCXBnb2ZmX3Qgc3RhcnQsIGVuZDsKK307CisKKy8qKgor ICogYXBwbHlfcHRfY2xlYW4gLSBMZWFmIHB0ZSBjYWxsYmFjayB0byBjbGVhbiBhIHB0ZQorICog QHB0ZTogUG9pbnRlciB0byB0aGUgcHRlCisgKiBAdG9rZW46IFBhZ2UgdGFibGUgdG9rZW4sIHNl ZSBhcHBseV90b19wZm5fcmFuZ2UoKQorICogQGFkZHI6IFRoZSB2aXJ0dWFsIHBhZ2UgYWRkcmVz cworICogQGNsb3N1cmU6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcGZuX3JhbmdlX2FwcGx5IGVtYmVk ZGVkIGluIGEKKyAqIHN0cnVjdCBhcHBseV9hc19jbGVhbgorICoKKyAqIFRoZSBmdW5jdGlvbiBj bGVhbnMgYSBwdGUgYW5kIHJlY29yZHMgdGhlIHJhbmdlIGluCisgKiB2aXJ0dWFsIGFkZHJlc3Mg c3BhY2Ugb2YgdG91Y2hlZCBwdGVzIGZvciBlZmZpY2llbnQgVExCIGZsdXNoZXMuCisgKiBJdCBh bHNvIHJlY29yZHMgZGlydHkgcHRlcyBpbiBhIGJpdG1hcCByZXByZXNlbnRpbmcgcGFnZSBvZmZz ZXRzCisgKiBpbiB0aGUgYWRkcmVzc19zcGFjZSwgYXMgd2VsbCBhcyB0aGUgZmlyc3QgYW5kIGxh c3Qgb2YgdGhlIGJpdHMKKyAqIHRvdWNoZWQuCisgKgorICogUmV0dXJuOiBBbHdheXMgemVyby4K KyAqLworc3RhdGljIGludCBhcHBseV9wdF9jbGVhbihwdGVfdCAqcHRlLCBwZ3RhYmxlX3QgdG9r ZW4sCisJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgc3RydWN0IHBmbl9yYW5nZV9hcHBs eSAqY2xvc3VyZSkKK3sKKwlzdHJ1Y3QgYXBwbHlfYXMgKmFhcyA9IGNvbnRhaW5lcl9vZihjbG9z dXJlLCB0eXBlb2YoKmFhcyksIGJhc2UpOworCXN0cnVjdCBhcHBseV9hc19jbGVhbiAqY2xlYW4g PSBjb250YWluZXJfb2YoYWFzLCB0eXBlb2YoKmNsZWFuKSwgYmFzZSk7CisKKwlpZiAocHRlX2Rp cnR5KCpwdGUpKSB7CisJCXBnb2ZmX3QgcGdvZmYgPSAoKGFkZHIgLSBhYXMtPnZtYS0+dm1fc3Rh cnQpID4+IFBBR0VfU0hJRlQpICsKKwkJCWFhcy0+dm1hLT52bV9wZ29mZiAtIGNsZWFuLT5iaXRt YXBfcGdvZmY7CisKKwkJc2V0X3B0ZV9hdChjbG9zdXJlLT5tbSwgYWRkciwgcHRlLCBwdGVfbWtj bGVhbigqcHRlKSk7CisJCWFhcy0+dG90YWwrKzsKKwkJaWYgKGFkZHIgPCBhYXMtPnN0YXJ0KQor CQkJYWFzLT5zdGFydCA9IGFkZHI7CisJCWlmIChhZGRyICsgUEFHRV9TSVpFID4gYWFzLT5lbmQp CisJCQlhYXMtPmVuZCA9IGFkZHIgKyBQQUdFX1NJWkU7CisKKwkJX19zZXRfYml0KHBnb2ZmLCBj bGVhbi0+Yml0bWFwKTsKKwkJY2xlYW4tPnN0YXJ0ID0gbWluKGNsZWFuLT5zdGFydCwgcGdvZmYp OworCQljbGVhbi0+ZW5kID0gbWF4KGNsZWFuLT5lbmQsIHBnb2ZmICsgMSk7CisJfQorCisJcmV0 dXJuIDA7Cit9CisKKy8qKgorICogYXBwbHlfYXNfcmFuZ2UgLSBBcHBseSBhIHB0ZSBjYWxsYmFj ayB0byBhbGwgUFRFcyBwb2ludGluZyBpbnRvIGEgcmFuZ2UKKyAqIG9mIGFuIGFkZHJlc3Nfc3Bh Y2UuCisgKiBAbWFwcGluZzogUG9pbnRlciB0byB0aGUgc3RydWN0IGFkZHJlc3Nfc3BhY2UKKyAq IEBhYXM6IENsb3N1cmUgc3RydWN0dXJlCisgKiBAZmlyc3RfaW5kZXg6IEZpcnN0IHBhZ2Ugb2Zm c2V0IGluIHRoZSBhZGRyZXNzX3NwYWNlCisgKiBAbnI6IE51bWJlciBvZiBpbmNyZW1lbnRhbCBw YWdlIG9mZnNldHMgdG8gY292ZXIKKyAqCisgKiBSZXR1cm46IE51bWJlciBvZiBwdGVzIHRvdWNo ZWQuIE5vdGUgdGhhdCB0aGlzIG51bWJlciBtaWdodCBiZSBsYXJnZXIKKyAqIHRoYW4gQG5yIGlm IHRoZXJlIGFyZSBvdmVybGFwcGluZyB2bWFzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFw cGx5X2FzX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCSAgICBzdHJ1 Y3QgYXBwbHlfYXMgKmFhcywKKwkJCQkgICAgcGdvZmZfdCBmaXJzdF9pbmRleCwgcGdvZmZfdCBu cikKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlwZ29mZl90IHZiYSwgdmVhLCBj YmEsIGNlYTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIGVuZF9hZGRyOworCisJLyogRklY TUU6IElzIGEgcmVhZCBsb2NrIHN1ZmZpY2llbnQgaGVyZT8gKi8KKwlkb3duX3dyaXRlKCZtYXBw aW5nLT5pX21tYXBfcndzZW0pOworCXZtYV9pbnRlcnZhbF90cmVlX2ZvcmVhY2godm1hLCAmbWFw cGluZy0+aV9tbWFwLCBmaXJzdF9pbmRleCwKKwkJZmlyc3RfaW5kZXggKyBuciAtIDEpIHsKKwkJ YWFzLT5iYXNlLm1tID0gdm1hLT52bV9tbTsKKworCQkvKiBDbGlwIHRvIHRoZSB2bWEgKi8KKwkJ dmJhID0gdm1hLT52bV9wZ29mZjsKKwkJdmVhID0gdmJhICsgdm1hX3BhZ2VzKHZtYSk7CisJCWNi YSA9IGZpcnN0X2luZGV4OworCQljYmEgPSBtYXgoY2JhLCB2YmEpOworCQljZWEgPSBmaXJzdF9p bmRleCArIG5yOworCQljZWEgPSBtaW4oY2VhLCB2ZWEpOworCisJCS8qIFRyYW5zbGF0ZSB0byB2 aXJ0dWFsIGFkZHJlc3MgKi8KKwkJc3RhcnRfYWRkciA9ICgoY2JhIC0gdmJhKSA8PCBQQUdFX1NI SUZUKSArIHZtYS0+dm1fc3RhcnQ7CisJCWVuZF9hZGRyID0gKChjZWEgLSB2YmEpIDw8IFBBR0Vf U0hJRlQpICsgdm1hLT52bV9zdGFydDsKKworCQkvKgorCQkgKiBUT0RPOiBTaG91bGQgY2FjaGVz IGJlIGZsdXNoZWQgaW5kaXZpZHVhbGx5IG9uIGRlbWFuZAorCQkgKiBpbiB0aGUgbGVhZi1wdGUg Y2FsbGJhY2tzIGluc3RlYWQ/IFRoYXQgaXMsIGhvdworCQkgKiBjb3N0bHkgYXJlIGludGVyLWNv cmUgaW50ZXJydXB0cyBpbiBhbiBTTVAgc3lzdGVtPworCQkgKi8KKwkJaWYgKGFhcy0+Zmx1c2hf Y2FjaGUpCisJCQlmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHN0YXJ0X2FkZHIsIGVuZF9hZGRyKTsK KwkJYWFzLT5zdGFydCA9IGVuZF9hZGRyOworCQlhYXMtPmVuZCA9IHN0YXJ0X2FkZHI7CisJCWFh cy0+dm1hID0gdm1hOworCisJCS8qIFNob3VsZCBub3QgZXJyb3Igc2luY2UgYWFzLT5iYXNlLmFs bG9jID09IDAgKi8KKwkJV0FSTl9PTihhcHBseV90b19wZm5fcmFuZ2UoJmFhcy0+YmFzZSwgc3Rh cnRfYWRkciwKKwkJCQkJICAgZW5kX2FkZHIgLSBzdGFydF9hZGRyKSk7CisJCWlmIChhYXMtPmZs dXNoX3RsYiAmJiBhYXMtPmVuZCA+IGFhcy0+c3RhcnQpCisJCQlmbHVzaF90bGJfcmFuZ2Uodm1h LCBhYXMtPnN0YXJ0LCBhYXMtPmVuZCk7CisJfQorCXVwX3dyaXRlKCZtYXBwaW5nLT5pX21tYXBf cndzZW0pOworCisJcmV0dXJuIGFhcy0+dG90YWw7Cit9CisKKy8qKgorICogYXBwbHlfYXNfd3Jw cm90ZWN0IC0gV3JpdGUtcHJvdGVjdCBhbGwgcHRlcyBpbiBhbiBhZGRyZXNzX3NwYWNlIHJhbmdl CisgKiBAbWFwcGluZzogVGhlIGFkZHJlc3Nfc3BhY2Ugd2Ugd2FudCB0byB3cml0ZSBwcm90ZWN0 CisgKiBAZmlyc3RfaW5kZXg6IFRoZSBmaXJzdCBwYWdlIG9mZnNldCBpbiB0aGUgcmFuZ2UKKyAq IEBucjogTnVtYmVyIG9mIGluY3JlbWVudGFsIHBhZ2Ugb2Zmc2V0cyB0byBjb3ZlcgorICoKKyAq IFJldHVybjogVGhlIG51bWJlciBvZiBwdGVzIGFjdHVhbGx5IHdyaXRlLXByb3RlY3RlZC4gTm90 ZSB0aGF0CisgKiBhbHJlYWR5IHdyaXRlLXByb3RlY3RlZCBwdGVzIGFyZSBub3QgY291bnRlZC4K KyAqLwordW5zaWduZWQgbG9uZyBhcHBseV9hc193cnByb3RlY3Qoc3RydWN0IGFkZHJlc3Nfc3Bh Y2UgKm1hcHBpbmcsCisJCQkJIHBnb2ZmX3QgZmlyc3RfaW5kZXgsIHBnb2ZmX3QgbnIpCit7CisJ c3RydWN0IGFwcGx5X2FzIGFhcyA9IHsKKwkJLmJhc2UgPSB7CisJCQkuYWxsb2MgPSAwLAorCQkJ LnB0ZWZuID0gYXBwbHlfcHRfd3Jwcm90ZWN0LAorCQl9LAorCQkudG90YWwgPSAwLAorCQkuZmx1 c2hfY2FjaGUgPSAxLAorCQkuZmx1c2hfdGxiID0gMQorCX07CisKKwlyZXR1cm4gYXBwbHlfYXNf cmFuZ2UobWFwcGluZywgJmFhcywgZmlyc3RfaW5kZXgsIG5yKTsKK30KK0VYUE9SVF9TWU1CT0wo YXBwbHlfYXNfd3Jwcm90ZWN0KTsKKworLyoqCisgKiBhcHBseV9hc19jbGVhbiAtIENsZWFuIGFs bCBwdGVzIGluIGFuIGFkZHJlc3Nfc3BhY2UgcmFuZ2UKKyAqIEBtYXBwaW5nOiBUaGUgYWRkcmVz c19zcGFjZSB3ZSB3YW50IHRvIGNsZWFuCisgKiBAZmlyc3RfaW5kZXg6IFRoZSBmaXJzdCBwYWdl IG9mZnNldCBpbiB0aGUgcmFuZ2UKKyAqIEBucjogTnVtYmVyIG9mIGluY3JlbWVudGFsIHBhZ2Ug b2Zmc2V0cyB0byBjb3ZlcgorICogQGJpdG1hcF9wZ29mZjogVGhlIHBhZ2Ugb2Zmc2V0IG9mIHRo ZSBmaXJzdCBiaXQgaW4gQGJpdG1hcAorICogQGJpdG1hcDogUG9pbnRlciB0byBhIGJpdG1hcCBv ZiBhdCBsZWFzdCBAbnIgYml0cy4gVGhlIGJpdG1hcCBuZWVkcyB0bworICogY292ZXIgdGhlIHdo b2xlIHJhbmdlIEBmaXJzdF9pbmRleC4uQGZpcnN0X2luZGV4ICsgQG5yLgorICogQHN0YXJ0OiBQ b2ludGVyIHRvIHBhZ2Ugb2Zmc2V0IG9mIHRoZSBmaXJzdCBzZXQgYml0IGluIEBiaXRtYXAsIG9y IGlmCisgKiBub25lIHNldCB0aGUgdmFsdWUgcG9pbnRlZCB0byBzaG91bGQgYmUgQGJpdG1hcF9w Z29mZiArIEBuci4gVGhlIHZhbHVlCisgKiBpcyBtb2RpZmllZCBhcyBuZXcgYml0cyBhcmUgc2V0 IGJ5IHRoZSBmdW5jdGlvbi4KKyAqIEBlbmQ6IFBhZ2Ugb2Zmc2V0IG9mIHRoZSBsYXN0IHNldCBi aXQgaW4gQGJpdG1hcCArIDEgb3IgQGJpdG1hcF9wZ29mZiBpZgorICogbm9uZSBzZXQuIFRoZSB2 YWx1ZSBpcyBtb2RpZmllZCBhcyBuZXcgYmV0cyBhcmUgc2V0IGJ5IHRoZSBmdW5jdGlvbi4KKyAq CisgKiBOb3RlOiBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGVyZSBpcyBubyBndWFyYW50 ZWUgdGhhdCBhIENQVSBoYXMKKyAqIG5vdCBhbHJlYWR5IGRpcnRpZWQgbmV3IHB0ZXMuIEhvd2V2 ZXIgaXQgd2lsbCBub3QgY2xlYW4gYW55IHB0ZXMgbm90CisgKiByZXBvcnRlZCBpbiB0aGUgYml0 bWFwLgorICoKKyAqIElmIGEgY2FsbGVyIG5lZWRzIHRvIG1ha2Ugc3VyZSBhbGwgZGlydHkgcHRl cyBhcmUgcGlja2VkIHVwIGFuZCBub25lCisgKiBhZGRpdGlvbmFsIGFyZSBhZGRlZCwgaXQgZmly c3QgbmVlZHMgdG8gd3JpdGUtcHJvdGVjdCB0aGUgYWRkcmVzcy1zcGFjZQorICogcmFuZ2UgYW5k IG1ha2Ugc3VyZSBuZXcgd3JpdGVycyBhcmUgYmxvY2tlZCBpbiBwYWdlX21rd3JpdGUoKSBvcgor ICogcGZuX21rd3JpdGUoKS4gQW5kIHRoZW4gYWZ0ZXIgYSBUTEIgZmx1c2ggZm9sbG93aW5nIHRo ZSB3cml0ZS1wcm90ZWN0aW9uCisgKiBwaWNrIHVwcCBhbGwgZGlydHkgYml0cy4KKyAqCisgKiBS ZXR1cm46IFRoZSBudW1iZXIgb2YgZGlydHkgcHRlcyBhY3R1YWxseSBjbGVhbmVkLgorICovCit1 bnNpZ25lZCBsb25nIGFwcGx5X2FzX2NsZWFuKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5n LAorCQkJICAgICBwZ29mZl90IGZpcnN0X2luZGV4LCBwZ29mZl90IG5yLAorCQkJICAgICBwZ29m Zl90IGJpdG1hcF9wZ29mZiwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyAqYml0bWFwLAorCQkJICAg ICBwZ29mZl90ICpzdGFydCwKKwkJCSAgICAgcGdvZmZfdCAqZW5kKQoreworCXN0cnVjdCBhcHBs eV9hc19jbGVhbiBjbGVhbiA9IHsKKwkJLmJhc2UgPSB7CisJCQkuYmFzZSA9IHsKKwkJCQkuYWxs b2MgPSAwLAorCQkJCS5wdGVmbiA9IGFwcGx5X3B0X2NsZWFuLAorCQkJfSwKKwkJCS50b3RhbCA9 IDAsCisJCQkuZmx1c2hfY2FjaGUgPSAwLAorCQkJLmZsdXNoX3RsYiA9IDEsCisJCX0sCisJCS5i aXRtYXBfcGdvZmYgPSBiaXRtYXBfcGdvZmYsCisJCS5iaXRtYXAgPSBiaXRtYXAsCisJCS5zdGFy dCA9ICpzdGFydCwKKwkJLmVuZCA9ICplbmQsCisJfTsKKwl1bnNpZ25lZCBsb25nIHJldCA9IGFw cGx5X2FzX3JhbmdlKG1hcHBpbmcsICZjbGVhbi5iYXNlLCBmaXJzdF9pbmRleCwKKwkJCQkJICAg bnIpOworCisJKnN0YXJ0ID0gY2xlYW4uc3RhcnQ7CisJKmVuZCA9IGNsZWFuLmVuZDsKKwlyZXR1 cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChhcHBseV9hc19jbGVhbik7Ci0tIAoyLjE5LjAucmMx CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2 ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWw=