From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH v2 1/7] kfence: Introduce kfence, a N:M completion mechanism Date: Sun, 17 Jul 2016 13:58:01 +0100 Message-ID: <1468760287-731-2-git-send-email-chris@chris-wilson.co.uk> References: <1466759333-4703-1-git-send-email-chris@chris-wilson.co.uk> <1468760287-731-1-git-send-email-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x243.google.com (mail-wm0-x243.google.com [IPv6:2a00:1450:400c:c09::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0239C6E1BE for ; Sun, 17 Jul 2016 12:58:59 +0000 (UTC) Received: by mail-wm0-x243.google.com with SMTP id x83so8714137wma.3 for ; Sun, 17 Jul 2016 05:58:58 -0700 (PDT) In-Reply-To: <1468760287-731-1-git-send-email-chris@chris-wilson.co.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: linux-kernel@vger.kernel.org Cc: "Peter Zijlstra (Intel)" , Daniel Vetter , Rasmus Villemoes , dri-devel@lists.freedesktop.org, Alexander Potapenko , Ingo Molnar , Davidlohr Bueso , Shuah Khan , Andrey Ryabinin , "Paul E. McKenney" , linux-media@vger.kernel.org, Kees Cook , Nikolay Aleksandrov , linaro-mm-sig@lists.linaro.org, Dan Williams , Andy Shevchenko , Dmitry Vyukov , Thomas Gleixner , Tejun Heo , Andrew Morton , "David S. Miller" List-Id: dri-devel@lists.freedesktop.org Q29tcGxldGlvbnMgYXJlIGEgc2ltcGxlIHN5bmNocm9uaXphdGlvbiBtZWNoYW5pc20sIHN1aXRh YmxlIGZvciAxOk0KYmFycmllcnMgd2hlcmUgbWFueSB3YWl0ZXJzIG1heWJlIHdhaXRpbmcgZm9y IGEgc2luZ2xlIGV2ZW50LiBIb3dldmVyLApzb21lIGV2ZW50IGRyaXZlbiBtZWNoYW5pc21zIHJl cXVpcmUgYSBncmFwaCBvZiBldmVudHMgd2hlcmUgb25lIGV2ZW50Cm1heSBkZXBlbmQgdXBvbiBz ZXZlcmFsIGVhcmxpZXIgZXZlbnRzLiBUaGUga2ZlbmNlIGV4dGVuZHMgdGhlIHN0cnVjdApjb21w bGV0aW9uIHRvIGJlIGFibGUgdG8gYXN5bmNocm9ub3VzbHkgd2FpdCB1cG9uIHNldmVyYWwgZXZl bnQgc291cmNlcywKaW5jbHVkaW5nIGNvbXBsZXRpb25zIGFuZCBvdGhlciBmZW5jZXMgZm9ybWlu ZyB0aGUgYmFzaXMgb24gd2hpY2ggYW4KYWN5Y2xpYyBkZXBlbmRlbmN5IGdyYXBoIGNhbiBiZSBi dWlsdC4gTW9zdCBvZnRlbiB0aGlzIGlzIHVzZWQgdG8gY3JlYXRlCmEgc2V0IG9mIGludGVyZGVw ZW5kZW50IHRhc2tzIHRoYXQgY2FuIGJlIHJ1biBjb25jdXJyZW50bHkgYnV0IHlldApzZXJpYWxp c2VkIHdoZXJlIG5lY2Vzc2FyeS4gRm9yIGV4YW1wbGUsIHRoZSBrZXJuZWwgaW5pdCBzZXF1ZW5j ZSBoYXMKbWFueSB0YXNrcyB0aGF0IGNvdWxkIGJlIHJ1biBpbiBwYXJhbGxlbCBzbyBsb25nIGFz IHRoZWlyIGRlcGVuZGVuY2llcwpvbiBwcmV2aW91cyB0YXNrcyBoYXZlIGJlZW4gY29tcGxldGVk LiBTaW1pbGFybHkgd2UgaGF2ZSB0aGUgcHJvYmxlbSBvZgphc3NpZ25pbmcgaW50ZXJkZXBlbmRl bnQgdGFza3MgdG8gbXVsdGlwbGUgaGFyZHdhcmUgZXhlY3V0aW9uIGVuZ2luZXMsCmJlIHRoZXkg dXNlZCBmb3IgcmVuZGVyaW5nIG9yIGZvciBkaXNwbGF5LiBrZmVuY2VzIHByb3ZpZGVzIGEgYnVp bGRpbmcKYmxvY2sgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGRldGVybWluaW5nIGFuIG9yZGVyIGlu IHdoaWNoIHRhc2tzIGNhbgpleGVjdXRlLgoKU2lnbmVkLW9mZi1ieTogQ2hyaXMgV2lsc29uIDxj aHJpc0BjaHJpcy13aWxzb24uY28udWs+CkNjOiBTdW1pdCBTZW13YWwgPHN1bWl0LnNlbXdhbEBs aW5hcm8ub3JnPgpDYzogU2h1YWggS2hhbiA8c2h1YWhraEBvc2cuc2Ftc3VuZy5jb20+CkNjOiBU ZWp1biBIZW8gPHRqQGtlcm5lbC5vcmc+CkNjOiBEYW5pZWwgVmV0dGVyIDxkYW5pZWwudmV0dGVy QGZmd2xsLmNoPgpDYzogQW5kcmV3IE1vcnRvbiA8YWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZz4K Q2M6IEluZ28gTW9sbmFyIDxtaW5nb0BrZXJuZWwub3JnPgpDYzogS2VlcyBDb29rIDxrZWVzY29v a0BjaHJvbWl1bS5vcmc+CkNjOiBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4K Q2M6ICJQYXVsIEUuIE1jS2VubmV5IiA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+CkNjOiBE YW4gV2lsbGlhbXMgPGRhbi5qLndpbGxpYW1zQGludGVsLmNvbT4KQ2M6IEFuZHJleSBSeWFiaW5p biA8YXJ5YWJpbmluQHZpcnR1b3p6by5jb20+CkNjOiBEYXZpZGxvaHIgQnVlc28gPGRhdmVAc3Rn b2xhYnMubmV0PgpDYzogTmlrb2xheSBBbGVrc2FuZHJvdiA8bmlrb2xheUBjdW11bHVzbmV0d29y a3MuY29tPgpDYzogIkRhdmlkIFMuIE1pbGxlciIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CkNjOiAi UGV0ZXIgWmlqbHN0cmEgKEludGVsKSIgPHBldGVyekBpbmZyYWRlYWQub3JnPgpDYzogUmFzbXVz IFZpbGxlbW9lcyA8bGludXhAcmFzbXVzdmlsbGVtb2VzLmRrPgpDYzogQW5keSBTaGV2Y2hlbmtv IDxhbmRyaXkuc2hldmNoZW5rb0BsaW51eC5pbnRlbC5jb20+CkNjOiBEbWl0cnkgVnl1a292IDxk dnl1a292QGdvb2dsZS5jb20+CkNjOiBBbGV4YW5kZXIgUG90YXBlbmtvIDxnbGlkZXJAZ29vZ2xl LmNvbT4KQ2M6IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKQ2M6IGxpbnV4LW1lZGlhQHZn ZXIua2VybmVsLm9yZwpDYzogZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpDYzogbGlu YXJvLW1tLXNpZ0BsaXN0cy5saW5hcm8ub3JnCi0tLQogaW5jbHVkZS9saW51eC9rZmVuY2UuaCAg ICAgICAgICAgICAgICB8ICA2NCArKysrCiBrZXJuZWwvTWFrZWZpbGUgICAgICAgICAgICAgICAg ICAgICAgIHwgICAyICstCiBrZXJuZWwva2ZlbmNlLmMgICAgICAgICAgICAgICAgICAgICAgIHwg NDMxICsrKysrKysrKysrKysrKysrKysrKysrKysrKwogbGliL0tjb25maWcuZGVidWcgICAgICAg ICAgICAgICAgICAgICB8ICAyMyArKwogbGliL01ha2VmaWxlICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAgMSArCiBsaWIvdGVzdC1rZmVuY2UuYyAgICAgICAgICAgICAgICAgICAgIHwgNTM2 ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIHRvb2xzL3Rlc3Rpbmcvc2VsZnRl c3RzL2xpYi9rZmVuY2Uuc2ggfCAgMTAgKwogNyBmaWxlcyBjaGFuZ2VkLCAxMDY2IGluc2VydGlv bnMoKyksIDEgZGVsZXRpb24oLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL2xpbnV4L2tm ZW5jZS5oCiBjcmVhdGUgbW9kZSAxMDA2NDQga2VybmVsL2tmZW5jZS5jCiBjcmVhdGUgbW9kZSAx MDA2NDQgbGliL3Rlc3Qta2ZlbmNlLmMKIGNyZWF0ZSBtb2RlIDEwMDc1NSB0b29scy90ZXN0aW5n L3NlbGZ0ZXN0cy9saWIva2ZlbmNlLnNoCgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZmVu Y2UuaCBiL2luY2x1ZGUvbGludXgva2ZlbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAwLi42ZTMyMzg1YjNiOGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xp bnV4L2tmZW5jZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBrZmVuY2UuaCAtIGxpYnJhcnkg cm91dGluZXMgZm9yIE46TSBzeW5jaHJvbmlzYXRpb24gcG9pbnRzCisgKgorICogQ29weXJpZ2h0 IChDKSAyMDE2IEludGVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2Vk IHVuZGVyIHRoZSBHUEx2Mi4KKyAqCisgKi8KKworI2lmbmRlZiBfS0ZFTkNFX0hfCisjZGVmaW5l IF9LRkVOQ0VfSF8KKworI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ty ZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPiAvKiBmb3IgTk9USUZZX0RPTkUgKi8K KyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKK3N0cnVjdCBjb21wbGV0aW9uOworCitzdHJ1Y3Qg a2ZlbmNlIHsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisJc3RydWN0IGtyZWYga3JlZjsKKwlhdG9taWNfdCBwZW5kaW5nOworfTsKKworI2RlZmluZSBL RkVOQ0VfQ0hFQ0tFRF9CSVQJMCAvKiB1c2VkIGludGVybmFsbHkgZm9yIERBRyBjaGVja2luZyAq LworI2RlZmluZSBLRkVOQ0VfUFJJVkFURV9CSVQJMSAvKiBhdmFpbGFibGUgZm9yIHVzZSBieSBv d25lciAqLworI2RlZmluZSBLRkVOQ0VfTUFTSwkJKH4zKQorCisjZGVmaW5lIF9fa2ZlbmNlX2Nh bGwgX19hbGlnbmVkKDQpCit0eXBlZGVmIGludCAoKmtmZW5jZV9ub3RpZnlfdCkoc3RydWN0IGtm ZW5jZSAqKTsKKwordm9pZCBrZmVuY2VfaW5pdChzdHJ1Y3Qga2ZlbmNlICpmZW5jZSwga2ZlbmNl X25vdGlmeV90IGZuKTsKKworc3RydWN0IGtmZW5jZSAqa2ZlbmNlX2dldChzdHJ1Y3Qga2ZlbmNl ICpmZW5jZSk7Cit2b2lkIGtmZW5jZV9wdXQoc3RydWN0IGtmZW5jZSAqZmVuY2UpOworCit2b2lk IGtmZW5jZV9hd2FpdChzdHJ1Y3Qga2ZlbmNlICpmZW5jZSk7CitpbnQga2ZlbmNlX2F3YWl0X2tm ZW5jZShzdHJ1Y3Qga2ZlbmNlICpmZW5jZSwKKwkJCXN0cnVjdCBrZmVuY2UgKmFmdGVyLAorCQkJ Z2ZwX3QgZ2ZwKTsKK2ludCBrZmVuY2VfYXdhaXRfY29tcGxldGlvbihzdHJ1Y3Qga2ZlbmNlICpm ZW5jZSwKKwkJCSAgICBzdHJ1Y3QgY29tcGxldGlvbiAqeCwKKwkJCSAgICBnZnBfdCBnZnApOwor dm9pZCBrZmVuY2VfY29tcGxldGUoc3RydWN0IGtmZW5jZSAqZmVuY2UpOwordm9pZCBrZmVuY2Vf d2FrZV91cF9hbGwoc3RydWN0IGtmZW5jZSAqZmVuY2UpOwordm9pZCBrZmVuY2Vfd2FpdChzdHJ1 Y3Qga2ZlbmNlICpmZW5jZSk7CisKKy8qKgorICoga2ZlbmNlX2RvbmUgLSByZXBvcnQgd2hlbiB0 aGUgZmVuY2UgaGFzIGJlZW4gcGFzc2VkCisgKiBAZmVuY2U6IHRoZSBrZmVuY2UgdG8gcXVlcnkK KyAqCisgKiBrZmVuY2VfZG9uZSgpIHJlcG9ydHMgdHJ1ZSB3aGVuIHRoZSBmZW5jZSBpcyBubyBs b25nZXIgd2FpdGluZyBmb3IgYW55CisgKiBldmVudHMgYW5kIGhhcyBjb21wbGV0ZWQgaXRzIGZl bmNlLWNvbXBsZXRlIG5vdGlmaWNhdGlvbi4KKyAqCisgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUg ZmVuY2UgaGFzIGJlZW4gcGFzc2VkLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxp bmUgYm9vbCBrZmVuY2VfZG9uZShjb25zdCBzdHJ1Y3Qga2ZlbmNlICpmZW5jZSkKK3sKKwlyZXR1 cm4gYXRvbWljX3JlYWQoJmZlbmNlLT5wZW5kaW5nKSA8IDA7Cit9CisKKyNlbmRpZiAvKiBfS0ZF TkNFX0hfICovCmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUK aW5kZXggZTJlYzU0ZTJiOTUyLi5mZjExZjMxYjdlYzkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9NYWtl ZmlsZQorKysgYi9rZXJuZWwvTWFrZWZpbGUKQEAgLTksNyArOSw3IEBAIG9iai15ICAgICA9IGZv cmsubyBleGVjX2RvbWFpbi5vIHBhbmljLm8gXAogCSAgICBleHRhYmxlLm8gcGFyYW1zLm8gXAog CSAgICBrdGhyZWFkLm8gc3lzX25pLm8gbnNwcm94eS5vIFwKIAkgICAgbm90aWZpZXIubyBrc3lz ZnMubyBjcmVkLm8gcmVib290Lm8gXAotCSAgICBhc3luYy5vIHJhbmdlLm8gc21wYm9vdC5vCisJ ICAgIGFzeW5jLm8ga2ZlbmNlLm8gcmFuZ2UubyBzbXBib290Lm8KIAogb2JqLSQoQ09ORklHX01V TFRJVVNFUikgKz0gZ3JvdXBzLm8KIApkaWZmIC0tZ2l0IGEva2VybmVsL2tmZW5jZS5jIGIva2Vy bmVsL2tmZW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uNjkz YWY5ZGE1NDVhCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL2tmZW5jZS5jCkBAIC0wLDAgKzEs NDMxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDE2IEludGVsIENvcnBvcmF0aW9uCisgKgor ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uOyB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxs aW51eC9rZmVuY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKy8qKgorICogRE9DOiBr ZmVuY2Ugb3ZlcnZpZXcKKyAqCisgKiBrZmVuY2VzIHByb3ZpZGUgc3luY2hyb25pc2F0aW9uIGJh cnJpZXJzIGJldHdlZW4gbXVsdGlwbGUgdGFza3MuIFRoZXkgYXJlCisgKiB2ZXJ5IHNpbWlsYXIg dG8gY29tcGxldGlvbnMsIG9yIHRoZSBPcGVuR0wgZmVuY2Ugc3luY2hyb25pc2F0aW9uIG9iamVj dC4KKyAqIFdoZXJlIGtmZW5jZXMgZGlmZmVyIGZyb20gY29tcGxldGlvbnMgaXMgdGhlaXIgYWJp bGl0eSB0byB0cmFjayBtdWx0aXBsZQorICogZXZlbnQgc291cmNlcyByYXRoZXIgdGhhbiBiZWlu ZyBhIHNpbmd1bGFyICJjb21wbGV0aW9uIGV2ZW50Ii4gU2ltaWxhciB0bworICogY29tcGxldGlv bnMgbXVsdGlwbGUgcHJvY2Vzc2VzIGNhbiB3YWl0IHVwb24gYSBrZmVuY2UuIEhvd2V2ZXIsIHVu bGlrZQorICogY29tcGxldGlvbnMsIGEga2ZlbmNlIGNhbiB3YWl0IHVwb24gb3RoZXIga2ZlbmNl cyBhbGxvd2luZyBmb3IgYSBncmFwaAorICogb2YgaW50ZXJkZXBlbmRlbnQgZXZlbnRzLgorICoK KyAqIEVhY2gga2ZlbmNlIGlzIGEgb25lLXNob3QgZmxhZywgc2lnbmFsaW5nIHRoYXQgd29yayBo YXMgcHJvZ3Jlc3NlZCBwYXN0CisgKiBhIGNlcnRhaW4gcG9pbnQgKGFzIG1lYXN1cmVkIGJ5IGNv bXBsZXRpb24gb2YgYWxsIGV2ZW50cyB0aGUga2ZlbmNlIGlzCisgKiBsaXN0ZW5pbmcgZm9yKSBh bmQgdGhlIHdhaXRlcnMgdXBvbiB0aGF0IGtmZW5jZSBtYXkgcHJvY2VlZC4KKyAqCisgKiBrZmVu Y2VzIHByb3ZpZGUgYm90aCBzaWduYWxpbmcgYW5kIHdhaXRpbmcgcm91dGluZXM6CisgKgorICog LSBrZmVuY2VfYXdhaXQoKTogaW5kaWNhdGVzIHRoYXQgdGhlIGtmZW5jZSBpcyBhc3luY2hyb25v dXNseSB3YWl0aW5nIGZvcgorICogICBhbm90aGVyIGV2ZW50LgorICoKKyAqIC0ga2ZlbmNlX2Nv bXBsZXRlKCk6IHVuZG9lcyB0aGUgZWFybGllciBhd2FpdCBhbmQgbWFya3MgdGhlIGZlbmNlIGFz IGRvbmUKKyAqICAgaWYgYWxsIG9mIGl0cyBwZW5kaW5nIGV2ZW50cyBoYXZlIGJlZW4gY29tcGxl dGVkLgorICoKKyAqIC0ga2ZlbmNlX2RvbmUoKTogcmVwb3J0cyB3aGV0aGVyIG9yIG5vdCB0aGUg a2ZlbmNlIGhhcyBiZWVuIHBhc3NlZC4KKyAqCisgKiAtIGtmZW5jZV93YWl0KCk6IGFsbG93cyB0 aGUgY2FsbGVyIHRvIHNsZWVwICh1bmludGVycnVwdGlibHkpIHVudGlsIHRoZQorICogICBmZW5j ZSBpcyBwYXNzZWQuCisgKgorICogVGhpcyBpbnRlcmZhY2UgaXMgdmVyeSBzaW1pbGFyIHRvIGNv bXBsZXRpb25zLCB3aXRoIHRoZSBleGNlcHRpb24gb2YKKyAqIGFsbG93aW5nIHRoZSBmZW5jZSB0 byBhd2FpdCBtdWx0aXBsZSBldmVudHMuIGtmZW5jZXMgY2FuIHdhaXQgdXBvbiBvdGhlcgorICog ZmVuY2VzIG9yIG90aGVyIGhhcmR3YXJlIGV2ZW50cywgYnVpbGRpbmcgYW4gb3JkZXJlZCBkZXBl bmRlbmN5IGdyYXBoOgorICoKKyAqIC0ga2ZlbmNlX2F3YWl0X2tmZW5jZSgpOiB0aGUga2ZlbmNl IGFzeW5jaHJvbm91c2x5IHdhaXRzIHVwb24gY29tcGxldGlvbgorICogICBvZiBhbm90aGVyIGtm ZW5jZQorICoKKyAqIC0ga2ZlbmNlX2F3YWl0X2NvbXBsZXRpb24oKTogdGhlIGtmZW5jZSBhc3lu Y2hyb25vdXNseSB3YWl0cyB1cG9uIGEKKyAqICAgY29tcGxldGlvbgorICoKKyAqIEEga2ZlbmNl IGlzIGluaXRpYWxpc2VkIHVzaW5nIGtmZW5jZV9pbml0KCksIGFuZCBzdGFydHMgb2ZmIGF3YWl0 aW5nIGFuCisgKiBldmVudC4gT25jZSB5b3UgaGF2ZSBmaW5pc2hlZCBzZXR0aW5nIHVwIHRoZSBm ZW5jZSwgaW5jbHVkaW5nIGFkZGluZworICogYWxsIG9mIGl0cyBhc3luY2hyb25vdXMgd2FpdHMs IGNhbGwga2ZlbmNlX2NvbXBsZXRlKCkuCisgKgorICogVW5saWtlIGNvbXBsZXRpb25zLCBrZmVu Y2VzIGFyZSBleHBlY3RlZCB0byBsaXZlIGluc2lkZSBtb3JlIGNvbXBsZXggZ3JhcGhzCisgKiBh bmQgZm9ybSB0aGUgYmFzaXMgZm9yIHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiBpbnRlcmRlcGVuZGVu dCB0YXNrcyBhbmQgc28gYXJlCisgKiByZWZlcmVuY2UgY291bnRlZC4gVXNlIGtmZW5jZV9nZXQo KSBhbmQga2ZlbmNlX3B1dCgpIHRvIGFjcXVpcmUgb3IgcmVsZWFzZQorICogYSByZWZlcmVuY2Ug dG8gdGhlIGtmZW5jZSByZXNwZWN0aXZlbHkuCisgKgorICogVGhlIGtmZW5jZSBjYW4gYmUgZW1i ZWRkZWQgaW5zaWRlIGEgbGFyZ2VyIHN0cnVjdHVyZSBhbmQgYmUgdXNlZCBhcyBwYXJ0CisgKiBv ZiBpdHMgZXZlbnQgZHJpdmVuIG1lY2hhbmlzbS4gQXMgc3VjaCBrZmVuY2VfaW5pdCgpIGNhbiBi ZSBwYXNzZWQgYQorICogY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBmaXJz dCB3aGVuIHRoZSBrZmVuY2UgaXMgY29tcGxldGVkLAorICogYW5kIGFnYWluIHdoZW4gdGhlIGtm ZW5jZSBpcyB0byBiZSBmcmVlZC4gSWYgbm8gY2FsbGJhY2sgaXMgcHJvdmlkZWQsIHRoZQorICog a2ZlbmNlIHdpbGwgYmUgZnJlZWQgdXNpbmcga2ZyZWUoKSB3aGVuIGl0cyByZWZlcmVuY2UgY291 bnQgaGl0cyB6ZXJvIC0KKyAqIGlmIGl0IGlzIGVtYmVkZGVkIGluc2lkZSBhbm90aGVyIHN0cnVj dHVyZSBhbmQgbm8gY2FsbGJhY2sgaXMgcHJvdmlkZWQsCisgKiBpdCBtdXN0IGJlIHRoZSBmaXJz dCBtZW1iZXIgb2YgaXRzIHBhcmVudCBzdHJ1Y3QuCisgKgorICogVGhlIGZlbmNlLWNvbXBsZXRl ZCBub3RpZmljYXRpb24gaXMgY2FsbGVkIGJlZm9yZSBhbnkgbGlzdGVuZXJzIHVwb24gdGhlCisg KiBmZW5jZSBhcmUgc2lnbmFsZWQsIG9yIGFueSB3YWl0ZXJzIHdva2VuLiBZb3UgY2FuIGRlZmVy IHRoZWlyIHdha2UgdXAgYnkKKyAqIHJldHVybmluZyBOT1RJRllfT0sgZnJvbSB0aGUgZmVuY2Ut Y29tcGxldGVkIG5vdGlmaWNhdGlvbiBhbmQgY2FsbGluZworICoga2ZlbmNlX3dha2VfdXBfYWxs KCkgbGF0ZXIgd2hlbiByZWFkeS4KKyAqLworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGtmZW5j ZV9sb2NrKTsKKworc3RhdGljIGludCBfX2tmZW5jZV9ub3RpZnkoc3RydWN0IGtmZW5jZSAqZmVu Y2UpCit7CisJa2ZlbmNlX25vdGlmeV90IGZuOworCisJZm4gPSAoa2ZlbmNlX25vdGlmeV90KShm ZW5jZS0+ZmxhZ3MgJiBLRkVOQ0VfTUFTSyk7CisJcmV0dXJuIGZuKGZlbmNlKTsKK30KKworc3Rh dGljIHZvaWQga2ZlbmNlX2ZyZWUoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGtmZW5j ZSAqZmVuY2UgPSBjb250YWluZXJfb2Yoa3JlZiwgdHlwZW9mKCpmZW5jZSksIGtyZWYpOworCisJ V0FSTl9PTihhdG9taWNfcmVhZCgmZmVuY2UtPnBlbmRpbmcpID4gMCk7CisKKwlpZiAoZmVuY2Ut PmZsYWdzICYgS0ZFTkNFX01BU0spCisJCVdBUk5fT04oX19rZmVuY2Vfbm90aWZ5KGZlbmNlKSAh PSBOT1RJRllfRE9ORSk7CisJZWxzZQorCQlrZnJlZShmZW5jZSk7Cit9CisKKy8qKgorICoga2Zl bmNlX3B1dCAtIHJlbGVhc2UgYSByZWZlcmVuY2UgdG8gYSBrZmVuY2UKKyAqIEBmZW5jZTogdGhl IGtmZW5jZSBiZWluZyBkaXNwb3NlZCBvZgorICoKKyAqIGtmZW5jZV9wdXQoKSBkZWNyZW1lbnRz IHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIEBmZW5jZSwgYW5kIHdoZW4KKyAqIGl0IGhpdHMg emVybyB0aGUgZmVuY2Ugd2lsbCBiZSBmcmVlZC4KKyAqLwordm9pZCBrZmVuY2VfcHV0KHN0cnVj dCBrZmVuY2UgKmZlbmNlKQoreworCWtyZWZfcHV0KCZmZW5jZS0+a3JlZiwga2ZlbmNlX2ZyZWUp OworfQorRVhQT1JUX1NZTUJPTF9HUEwoa2ZlbmNlX3B1dCk7CisKKy8qKgorICoga2ZlbmNlX2dl dCAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gYSBrZmVuY2UKKyAqIEBmZW5jZTogdGhlIGtmZW5j ZSBiZWluZyB1c2VkCisgKgorICogUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUga2ZlbmNlLCB3 aXRoIGl0cyByZWZlcmVuY2UgY291bnQgaW5jcmVtZW50ZWQuCisgKi8KK3N0cnVjdCBrZmVuY2Ug KmtmZW5jZV9nZXQoc3RydWN0IGtmZW5jZSAqZmVuY2UpCit7CisJa3JlZl9nZXQoJmZlbmNlLT5r cmVmKTsKKwlyZXR1cm4gZmVuY2U7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrZmVuY2VfZ2V0KTsK Kworc3RhdGljIHZvaWQgX19rZmVuY2Vfd2FrZV91cF9hbGwoc3RydWN0IGtmZW5jZSAqZmVuY2Us CisJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmNvbnRpbnVhdGlvbikKK3sKKwl3YWl0X3F1ZXVlX2hl YWRfdCAqeCA9ICZmZW5jZS0+d2FpdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYXRvbWlj X2RlYygmZmVuY2UtPnBlbmRpbmcpOworCisJLyoKKwkgKiBUbyBwcmV2ZW50IHVuYm91bmRlZCBy ZWN1cnNpb24gYXMgd2UgdHJhdmVyc2UgdGhlIGdyYXBoIG9mIGtmZW5jZXMsCisJICogd2UgbW92 ZSB0aGUgdGFza19saXN0IGZyb20gdGhpcyB0aGUgbmV4dCByZWFkeSBmZW5jZSB0byB0aGUgdGFp bCBvZgorCSAqIHRoZSBvcmlnaW5hbCBmZW5jZSdzIHRhc2tfbGlzdCAoYW5kIHNvIGFkZGVkIHRv IHRoZSBsaXN0IHRvIGJlCisJICogd29rZW4pLgorCSAqLworCXNtcF9tYl9fYmVmb3JlX3NwaW5s b2NrKCk7CisJc3Bpbl9sb2NrX2lycXNhdmVfbmVzdGVkKCZ4LT5sb2NrLCBmbGFncywgMSArICEh Y29udGludWF0aW9uKTsKKwlpZiAoY29udGludWF0aW9uKSB7CisJCWxpc3Rfc3BsaWNlX3RhaWxf aW5pdCgmeC0+dGFza19saXN0LCBjb250aW51YXRpb24pOworCX0gZWxzZSB7CisJCXdoaWxlICgh bGlzdF9lbXB0eSgmeC0+dGFza19saXN0KSkKKwkJCV9fd2FrZV91cF9sb2NrZWRfa2V5KHgsIFRB U0tfTk9STUFMLCAmeC0+dGFza19saXN0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm eC0+bG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIGtmZW5jZV93YWtlX3VwX2FsbCAtIHdha2Ug YWxsIHdhaXRlcnMgdXBvbiBhIGZlbmNlCisgKiBAZmVuY2U6IHRoZSBrZmVuY2UgdG8gc2lnbmFs CisgKgorICogSWYgdGhlIGZlbmNlLWNvbXBsZXRlIG5vdGlmaWNhdGlvbiBpcyBkZWZlcnJlZCwg d2hlbiB0aGUgY2FsbGJhY2sgaXMKKyAqIGNvbXBsZXRlIGl0IHNob3VsZCBjYWxsIGtmZW5jZV93 YWtlX3VwX2FsbCgpIHRvIHdha2UgdXAgYWxsIHdhaXRlcnMKKyAqIHVwb24gdGhlIGZlbmNlLgor ICoKKyAqIEl0IGlzIGludmFsaWQgdG8gY2FsbCBrZmVuY2Vfd2FrZV91cF9hbGwoKSBhdCBhbnkg dGltZSBvdGhlciB0aGFuIGZyb20KKyAqIGluc2lkZSBhIGRlZmVycmVkIGZlbmNlLWNvbXBsZXRl IG5vdGlmaWNhdGlvbi4KKyAqLwordm9pZCBrZmVuY2Vfd2FrZV91cF9hbGwoc3RydWN0IGtmZW5j ZSAqZmVuY2UpCit7CisJV0FSTl9PTihhdG9taWNfcmVhZCgmZmVuY2UtPnBlbmRpbmcpICE9IDAp OworCV9fa2ZlbmNlX3dha2VfdXBfYWxsKGZlbmNlLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQg X19rZmVuY2VfY29tcGxldGUoc3RydWN0IGtmZW5jZSAqZmVuY2UsCisJCQkgICAgICBzdHJ1Y3Qg bGlzdF9oZWFkICpjb250aW51YXRpb24pCit7CisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZm ZW5jZS0+cGVuZGluZykpCisJCXJldHVybjsKKworCWlmIChmZW5jZS0+ZmxhZ3MgJiBLRkVOQ0Vf TUFTSyAmJiBfX2tmZW5jZV9ub3RpZnkoZmVuY2UpICE9IE5PVElGWV9ET05FKQorCQlyZXR1cm47 CisKKwlfX2tmZW5jZV93YWtlX3VwX2FsbChmZW5jZSwgY29udGludWF0aW9uKTsKK30KKworLyoq CisgKiBrZmVuY2VfYXdhaXQgLSBpbmNyZW1lbnQgdGhlIGNvdW50IG9mIGV2ZW50cyBiZWluZyBh c3luY2hyb25vdXNseSB3YWl0ZWQgdXBvbgorICogQGZlbmNlOiB0aGUga2ZlbmNlCisgKgorICog a2ZlbmNlX2F3YWl0KCkgaW5kaWNhdGVzIHRoYXQgdGhlIEBmZW5jZSBpcyB3YWl0aW5nIHVwb24g dGhlIGNvbXBsZXRpb24KKyAqIG9mIGFuIGV2ZW50LiBUaGUgQGZlbmNlIG1heSB3YWl0IHVwb24g bXVsdGlwbGUgZXZlbnRzIGNvbmN1cnJlbnRseS4KKyAqIFdoZW4gdGhhdCBldmVudCBpcyBjb21w bGV0ZSwgYSBjb3JyZXNwb25kaW5nIGNhbGwgdG8ga2ZlbmNlX2NvbXBsZXRlKCkKKyAqIHNob3Vs ZCBiZSBtYWRlLgorICovCit2b2lkIGtmZW5jZV9hd2FpdChzdHJ1Y3Qga2ZlbmNlICpmZW5jZSkK K3sKKwlXQVJOX09OKGF0b21pY19pbmNfcmV0dXJuKCZmZW5jZS0+cGVuZGluZykgPD0gMSk7Cit9 CitFWFBPUlRfU1lNQk9MX0dQTChrZmVuY2VfYXdhaXQpOworCisvKioKKyAqIGtmZW5jZV9jb21w bGV0ZSAtIGRlY3JlbWVudCB0aGUgY291bnQgb2YgZXZlbnRzIHdhaXRlZCB1cG9uCisgKiBAZmVu Y2U6IHRoZSBrZmVuY2UKKyAqCisgKiBXaGVuIGFsbCBldmVudCBzb3VyY2VzIGZvciB0aGUgQGZl bmNlIGFyZSBjb21wbGV0ZWQsIGkuZS4gdGhlIGV2ZW50IGNvdW50CisgKiBoaXRzIHplcm8sIGFs bCB3YWl0ZXJzIHVwb24gdGhlIEBmZW5jZSBhcmUgd29rZW4gdXAuCisgKi8KK3ZvaWQga2ZlbmNl X2NvbXBsZXRlKHN0cnVjdCBrZmVuY2UgKmZlbmNlKQoreworCWlmIChXQVJOX09OKGtmZW5jZV9k b25lKGZlbmNlKSkpCisJCXJldHVybjsKKworCV9fa2ZlbmNlX2NvbXBsZXRlKGZlbmNlLCBOVUxM KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGtmZW5jZV9jb21wbGV0ZSk7CisKKy8qKgorICoga2Zl bmNlX3dhaXQgLSB3YWl0IHVwb24gYSBmZW5jZSB0byBiZSBjb21wbGV0ZWQKKyAqIEBmZW5jZTog dGhlIGtmZW5jZSB0byB3YWl0IHVwb24KKyAqCisgKiBCbG9ja3MgKHVuaW50ZXJydXB0aWJseSB3 YWl0cykgdW50aWwgdGhlIEBmZW5jZSBldmVudCBjb3VudGVyIHJlYWNoZXMgemVybworICogYW5k IHRoZW4gYWxzbyB3YWl0cyBmb3IgdGhlIGZlbmNlLWNvbXBsZXRlZCBub3RpZmljYXRpb24gdG8g ZmluaXNoLgorICovCit2b2lkIGtmZW5jZV93YWl0KHN0cnVjdCBrZmVuY2UgKmZlbmNlKQorewor CXdhaXRfZXZlbnQoZmVuY2UtPndhaXQsIGtmZW5jZV9kb25lKGZlbmNlKSk7Cit9CitFWFBPUlRf U1lNQk9MX0dQTChrZmVuY2Vfd2FpdCk7CisKKy8qKgorICoga2ZlbmNlX2luaXQgLSBpbml0aWFs aXplIGEgZmVuY2UgZm9yIGVtYmVkZGVkIHVzZSB3aXRoaW4gYSBzdHJ1Y3QKKyAqIEBmZW5jZTog dGhpcyBrZmVuY2UKKyAqIEBmbjogYSBjYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiB0aGUgZmVu Y2UgaXMgY29tcGxldGUsIGFuZCB3aGVuIHRoZQorICogZmVuY2UgaXMgcmVsZWFzZWQKKyAqCisg KiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBAZmVuY2UgZm9yIHVzZSBlbWJlZGRlZCB3 aXRoaW4gYSBwYXJlbnQKKyAqIHN0cnVjdHVyZS4gVGhlIG9wdGlvbmFsIEBmbiBob29rIGlzIGZp cnN0IGNhbGxlZCB3aGVuIHRoZSBmZW5jZSBpcyBjb21wbGV0ZWQKKyAqICh3aGVuIGFsbCBpdHMg cGVuZGluZyBldmVudCBjb3VudCBoaXRzIDApIGFuZCBhZ2FpbiB3aGVuIHRoZSBmZW5jZSBpcwor ICogdG8gYmUgZnJlZWQuIE5vdGUgdGhhdCB0aGUgQGZuIHdpbGwgYmUgY2FsbGVkIGZyb20gYXRv bWljIGNvbnRleHQuIFRoZSBAZm4KKyAqIGlzIHN0b3JlZCBpbnNpZGUgdGhlIGZlbmNlIG1peGVk IHdpdGggc29tZSBmbGFncywgYW5kIHNvIHRoZSBAZm4gbXVzdAorICogYmUgYWxpZ25lZCB1c2lu ZyB0aGUgX19rZmVuY2VfY2FsbCBmdW5jdGlvbiBhdHRyaWJ1dGUuCisgKgorICogSWYgdGhlIEBm biBpcyBub3QgcHJvdmlkZWQsIHRoZSBrZmVuY2UgbXVzdCBiZSB0aGUgZmlyc3QgbWVtYmVyIGlu IGl0cworICogcGFyZW50IHN0cnVjdCBhcyBpdCB3aWxsIGJlIGZyZWVkIHVzaW5nIGtmcmVlKCku CisgKgorICogZmVuY2UtY29tcGxldGUgbm90aWZpY2F0aW9uOiBAZm4gd2lsbCBiZSBjYWxsZWQg d2hlbiB0aGUgcGVuZGluZyBldmVudAorICogY291bnQgaGl0cyAwLCBob3dldmVyIHRoZSBmZW5j ZSBpcyBub3QgY29tcGxldGVkIHVubGVzcyB0aGUgY2FsbGJhY2sKKyAqIHJldHVybnMgTk9USUZZ X0RPTkUuIER1cmluZyB0aGlzIG5vdGlmaWNhdGlvbiBjYWxsYmFjayBmZW5jZV9kb25lKCkgcmVw b3J0cworICogZmFsc2UuIFlvdSBjYW4gc3VzcGVuZCBjb21wbGV0aW9uIG9mIHRoZSBmZW5jZSBi eSByZXR1cm5pbmcKKyAqIE5PVElGWV9PSyBpbnN0ZWFkIGFuZCB0aGVuIGxhdGVyIGNhbGxpbmcg a2ZlbmNlX3dha2VfdXBfYWxsKCkuCisgKgorICogZmVuY2UtcmVsZWFzZSBub3RpZmljYXRpb246 IEBmbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByZWZlcmVuY2UgY291bnQKKyAqIGhpdHMgMCwg ZmVuY2VfZG9uZSgpIHdpbGwgcmVwb3J0IHRydWUuCisgKi8KK3ZvaWQga2ZlbmNlX2luaXQoc3Ry dWN0IGtmZW5jZSAqZmVuY2UsIGtmZW5jZV9ub3RpZnlfdCBmbikKK3sKKwlCVUdfT04oKHVuc2ln bmVkIGxvbmcpZm4gJiB+S0ZFTkNFX01BU0spOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZmVu Y2UtPndhaXQpOworCWtyZWZfaW5pdCgmZmVuY2UtPmtyZWYpOworCWF0b21pY19zZXQoJmZlbmNl LT5wZW5kaW5nLCAxKTsKKwlmZW5jZS0+ZmxhZ3MgPSAodW5zaWduZWQgbG9uZylmbjsKK30KK0VY UE9SVF9TWU1CT0xfR1BMKGtmZW5jZV9pbml0KTsKKworc3RhdGljIGludCBrZmVuY2Vfd2FrZSh3 YWl0X3F1ZXVlX3QgKndxLCB1bnNpZ25lZCBtb2RlLCBpbnQgZmxhZ3MsIHZvaWQgKmtleSkKK3sK KwlsaXN0X2RlbCgmd3EtPnRhc2tfbGlzdCk7CisJX19rZmVuY2VfY29tcGxldGUod3EtPnByaXZh dGUsIGtleSk7CisJa2ZlbmNlX3B1dCh3cS0+cHJpdmF0ZSk7CisJa2ZyZWUod3EpOworCXJldHVy biAwOworfQorCitzdGF0aWMgYm9vbCBfX2tmZW5jZV9jaGVja19pZl9hZnRlcihzdHJ1Y3Qga2Zl bmNlICpmZW5jZSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGtmZW5jZSAqIGNvbnN0IHNpZ25hbGVy KQoreworCXdhaXRfcXVldWVfdCAqd3E7CisKKwlpZiAoX190ZXN0X2FuZF9zZXRfYml0KEtGRU5D RV9DSEVDS0VEX0JJVCwgJmZlbmNlLT5mbGFncykpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChm ZW5jZSA9PSBzaWduYWxlcikKKwkJcmV0dXJuIHRydWU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5 KHdxLCAmZmVuY2UtPndhaXQudGFza19saXN0LCB0YXNrX2xpc3QpIHsKKwkJaWYgKHdxLT5mdW5j ICE9IGtmZW5jZV93YWtlKQorCQkJY29udGludWU7CisKKwkJaWYgKF9fa2ZlbmNlX2NoZWNrX2lm X2FmdGVyKHdxLT5wcml2YXRlLCBzaWduYWxlcikpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwly ZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIF9fa2ZlbmNlX2NsZWFyX2NoZWNrZWRfYml0 KHN0cnVjdCBrZmVuY2UgKmZlbmNlKQoreworCXdhaXRfcXVldWVfdCAqd3E7CisKKwlpZiAoIV9f dGVzdF9hbmRfY2xlYXJfYml0KEtGRU5DRV9DSEVDS0VEX0JJVCwgJmZlbmNlLT5mbGFncykpCisJ CXJldHVybjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkod3EsICZmZW5jZS0+d2FpdC50YXNrX2xp c3QsIHRhc2tfbGlzdCkgeworCQlpZiAod3EtPmZ1bmMgIT0ga2ZlbmNlX3dha2UpCisJCQljb250 aW51ZTsKKworCQlfX2tmZW5jZV9jbGVhcl9jaGVja2VkX2JpdCh3cS0+cHJpdmF0ZSk7CisJfQor fQorCitzdGF0aWMgYm9vbCBrZmVuY2VfY2hlY2tfaWZfYWZ0ZXIoc3RydWN0IGtmZW5jZSAqZmVu Y2UsCisJCQkJICBjb25zdCBzdHJ1Y3Qga2ZlbmNlICogY29uc3Qgc2lnbmFsZXIpCit7CisJdW5z aWduZWQgbG9uZyBmbGFnczsKKwlib29sIGVycjsKKworCWlmICghY29uZmlnX2VuYWJsZWQoQ09O RklHX0tGRU5DRV9DSEVDS19EQUcpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzcGluX2xvY2tfaXJx c2F2ZSgma2ZlbmNlX2xvY2ssIGZsYWdzKTsKKwllcnIgPSBfX2tmZW5jZV9jaGVja19pZl9hZnRl cihmZW5jZSwgc2lnbmFsZXIpOworCV9fa2ZlbmNlX2NsZWFyX2NoZWNrZWRfYml0KGZlbmNlKTsK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrZmVuY2VfbG9jaywgZmxhZ3MpOworCisJcmV0dXJu IGVycjsKK30KKworc3RhdGljIHdhaXRfcXVldWVfdCAqX19rZmVuY2VfY3JlYXRlX3dxKHN0cnVj dCBrZmVuY2UgKmZlbmNlLCBnZnBfdCBnZnApCit7CisJd2FpdF9xdWV1ZV90ICp3cTsKKworCXdx ID0ga21hbGxvYyhzaXplb2YoKndxKSwgZ2ZwKTsKKwlpZiAodW5saWtlbHkoIXdxKSkKKwkJcmV0 dXJuIE5VTEw7CisKKwlJTklUX0xJU1RfSEVBRCgmd3EtPnRhc2tfbGlzdCk7CisJd3EtPmZsYWdz ID0gMDsKKwl3cS0+ZnVuYyA9IGtmZW5jZV93YWtlOworCXdxLT5wcml2YXRlID0ga2ZlbmNlX2dl dChmZW5jZSk7CisKKwlrZmVuY2VfYXdhaXQoZmVuY2UpOworCisJcmV0dXJuIHdxOworfQorCisv KioKKyAqIGtmZW5jZV9hd2FpdF9rZmVuY2UgLSBzZXQgb25lIGZlbmNlIHRvIHdhaXQgdXBvbiBh bm90aGVyCisgKiBAZmVuY2U6IHRoaXMga2ZlbmNlCisgKiBAc2lnbmFsZXI6IHRhcmdldCBrZmVu Y2UgdG8gd2FpdCB1cG9uCisgKiBAZ2ZwOiB0aGUgYWxsb3dlZCBhbGxvY2F0aW9uIG1hc2sKKyAq CisgKiBrZmVuY2VfYXdhaXRfa2ZlbmNlKCkgY2F1c2VzIHRoZSBAZmVuY2UgdG8gYXN5bmNocm9u b3VzbHkgd2FpdCB1cG9uIHRoZQorICogY29tcGxldGlvbiBvZiBAc2lnbmFsZXIuCisgKgorICog UmV0dXJucyAxIGlmIHRoZSBAZmVuY2Ugd2FzIGFkZGVkIHRvIHRoZSB3YWl0cXVldWUgb2YgQHNp Z25hbGVyLCAwCisgKiBpZiBAc2lnbmFsZXIgd2FzIGFscmVhZHkgY29tcGxldGUsIG9yIGEgbmVn YXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IGtmZW5jZV9hd2FpdF9rZmVuY2Uoc3RydWN0IGtm ZW5jZSAqZmVuY2UsCisJCQlzdHJ1Y3Qga2ZlbmNlICpzaWduYWxlciwKKwkJCWdmcF90IGdmcCkK K3sKKwl3YWl0X3F1ZXVlX3QgKndxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHBlbmRp bmc7CisKKwlpZiAoa2ZlbmNlX2RvbmUoc2lnbmFsZXIpKQorCQlyZXR1cm4gMDsKKworCS8qIFRo ZSBkZXBlbmRlbmN5IGdyYXBoIG11c3QgYmUgYWN5Y2xpYy4gKi8KKwlpZiAodW5saWtlbHkoa2Zl bmNlX2NoZWNrX2lmX2FmdGVyKGZlbmNlLCBzaWduYWxlcikpKQorCQlyZXR1cm4gLUVJTlZBTDsK KworCXdxID0gX19rZmVuY2VfY3JlYXRlX3dxKGZlbmNlLCBnZnApOworCWlmICh1bmxpa2VseSgh d3EpKSB7CisJCWlmICghZ2ZwZmxhZ3NfYWxsb3dfYmxvY2tpbmcoZ2ZwKSkKKwkJCXJldHVybiAt RU5PTUVNOworCisJCWtmZW5jZV93YWl0KHNpZ25hbGVyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJ c3Bpbl9sb2NrX2lycXNhdmUoJnNpZ25hbGVyLT53YWl0LmxvY2ssIGZsYWdzKTsKKwlpZiAobGlr ZWx5KCFrZmVuY2VfZG9uZShzaWduYWxlcikpKSB7CisJCV9fYWRkX3dhaXRfcXVldWVfdGFpbCgm c2lnbmFsZXItPndhaXQsIHdxKTsKKwkJcGVuZGluZyA9IDE7CisJfSBlbHNlIHsKKwkJa2ZlbmNl X3dha2Uod3EsIDAsIDAsIE5VTEwpOworCQlwZW5kaW5nID0gMDsKKwl9CisJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmc2lnbmFsZXItPndhaXQubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHBlbmRp bmc7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrZmVuY2VfYXdhaXRfa2ZlbmNlKTsKKworLyoqCisg KiBrZmVuY2VfYXdhaXRfY29tcGxldGlvbiAtIHNldCB0aGUgZmVuY2UgdG8gd2FpdCB1cG9uIGEg Y29tcGxldGlvbgorICogQGZlbmNlOiB0aGlzIGtmZW5jZQorICogQHg6IHRhcmdldCBjb21wbGV0 aW9uIHRvIHdhaXQgdXBvbgorICogQGdmcDogdGhlIGFsbG93ZWQgYWxsb2NhdGlvbiBtYXNrCisg KgorICoga2ZlbmNlX2F3YWl0X2NvbXBsZXRpb24oKSBjYXVzZXMgdGhlIEBmZW5jZSB0byBhc3lu Y2hyb25vdXNseSB3YWl0IHVwb24KKyAqIHRoZSBjb21wbGV0aW9uLgorICoKKyAqIFJldHVybnMg MSBpZiB0aGUgQGZlbmNlIHdhcyBhZGRlZCB0byB0aGUgd2FpdHF1ZXVlIG9mIEB4LCAwCisgKiBp ZiBAeCB3YXMgYWxyZWFkeSBjb21wbGV0ZSwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICov CitpbnQga2ZlbmNlX2F3YWl0X2NvbXBsZXRpb24oc3RydWN0IGtmZW5jZSAqZmVuY2UsCisJCQkg ICAgc3RydWN0IGNvbXBsZXRpb24gKngsCisJCQkgICAgZ2ZwX3QgZ2ZwKQoreworCXdhaXRfcXVl dWVfdCAqd3E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcGVuZGluZzsKKworCWlmIChj b21wbGV0aW9uX2RvbmUoeCkpCisJCXJldHVybiAwOworCisJd3EgPSBfX2tmZW5jZV9jcmVhdGVf d3EoZmVuY2UsIGdmcCk7CisJaWYgKHVubGlrZWx5KCF3cSkpIHsKKwkJaWYgKCFnZnBmbGFnc19h bGxvd19ibG9ja2luZyhnZnApKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJd2FpdF9mb3JfY29t cGxldGlvbih4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJngtPndh aXQubG9jaywgZmxhZ3MpOworCWlmIChsaWtlbHkoIVJFQURfT05DRSh4LT5kb25lKSkpIHsKKwkJ X19hZGRfd2FpdF9xdWV1ZV90YWlsKCZ4LT53YWl0LCB3cSk7CisJCXBlbmRpbmcgPSAxOworCX0g ZWxzZSB7CisJCWtmZW5jZV93YWtlKHdxLCAwLCAwLCBOVUxMKTsKKwkJcGVuZGluZyA9IDA7CisJ fQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJngtPndhaXQubG9jaywgZmxhZ3MpOworCisJcmV0 dXJuIHBlbmRpbmc7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrZmVuY2VfYXdhaXRfY29tcGxldGlv bik7CmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1ZyBiL2xpYi9LY29uZmlnLmRlYnVnCmlu ZGV4IGI5Y2ZkYmZhZTlhYS4uZGYxMTgyZDQxZjA2IDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5k ZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtMTc2Myw2ICsxNzYzLDI5IEBAIGNvbmZp ZyBLUFJPQkVTX1NBTklUWV9URVNUCiAKIAkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgogCitj b25maWcgS0ZFTkNFX1NFTEZURVNUCisJdHJpc3RhdGUgIktmZW5jZSBzZWxmIHRlc3RzIgorCWRl cGVuZHMgb24gREVCVUdfS0VSTkVMCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24g cHJvdmlkZXMgYSBrZXJuZWwgbW9kdWxlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRlc3QKKwkgIHRo ZSBrZmVuY2UgaGFuZGxpbmcuIFRoaXMgb3B0aW9uIGlzIG5vdCB1c2VmdWwgZm9yIGRpc3RyaWJ1 dGlvbnMKKwkgIG9yIGdlbmVyYWwga2VybmVscywgYnV0IG9ubHkgZm9yIGtlcm5lbCBkZXZlbG9w ZXJzIHdvcmtpbmcgb24gdGhlCisJICBrZmVuY2UgYW5kIGFzeW5jX2RvbWFpbiBmYWNpbGl0eS4K KworCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKK2NvbmZpZyBLRkVOQ0VfQ0hFQ0tfREFH CisJYm9vbCAiQ2hlY2sgdGhhdCBrZmVuY2UgYXJlIG9ubHkgdXNlZCB3aXRoIGRpcmVjdGVkIGFj eWNsaWMgZ3JhcGhzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJZGVmYXVsdCBuCisJaGVs cAorCSAgVGhpcyBvcHRpb24gZW5mb3JjZXMgdGhhdCBrZmVuY2VzIGFyZSBvbmx5IHVzZWQgd2l0 aCBkaXJlY3RlZCBhY3ljbGljCisJICBncmFwaHMgKERBRyksIGFzIG90aGVyd2lzZSB0aGUgY3lj bGVzIGluIHRoZSBncmFwaCBtZWFucyB0aGF0IHRoZXkKKwkgIHdpbGwgbmV2ZXIgYmUgc2lnbmFs ZWQgKG9yIHRoZSBjb3JyZXNwb25kaW5nIHRhc2sgZXhlY3V0ZWQpLgorCisJICBTYXkgTiBpZiB5 b3UgYXJlIHVuc3VyZS4KKwogY29uZmlnIEJBQ0tUUkFDRV9TRUxGX1RFU1QKIAl0cmlzdGF0ZSAi U2VsZiB0ZXN0IGZvciB0aGUgYmFja3RyYWNlIGNvZGUiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJO RUwKZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQppbmRleCBmZjZhN2E2 YzYzOTUuLjk0Mzc4MWNmZThkMSAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlCisrKyBiL2xpYi9N YWtlZmlsZQpAQCAtMjgsNiArMjgsNyBAQCBsaWIteSA6PSBjdHlwZS5vIHN0cmluZy5vIHZzcHJp bnRmLm8gY21kbGluZS5vIFwKIAkgZWFybHljcGlvLm8gc2VxX2J1Zi5vIG5taV9iYWNrdHJhY2Uu byBub2RlbWFzay5vCiAKIG9iai0kKENPTkZJR19BUkNIX0hBU19ERUJVR19TVFJJQ1RfVVNFUl9D T1BZX0NIRUNLUykgKz0gdXNlcmNvcHkubworb2JqLSQoQ09ORklHX0tGRU5DRV9TRUxGVEVTVCkg Kz0gdGVzdC1rZmVuY2UubwogbGliLSQoQ09ORklHX01NVSkgKz0gaW9yZW1hcC5vCiBsaWItJChD T05GSUdfU01QKSArPSBjcHVtYXNrLm8KIGxpYi0kKENPTkZJR19IQVNfRE1BKSArPSBkbWEtbm9v cC5vCmRpZmYgLS1naXQgYS9saWIvdGVzdC1rZmVuY2UuYyBiL2xpYi90ZXN0LWtmZW5jZS5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uYjQwNzE5ZmNlOTY3Ci0tLSAv ZGV2L251bGwKKysrIGIvbGliL3Rlc3Qta2ZlbmNlLmMKQEAgLTAsMCArMSw1MzYgQEAKKy8qCisg KiBUZXN0IGNhc2VzIGZvciBrZmVuY2UgZmFjaWxpdHkuCisgKi8KKworI2RlZmluZSBwcl9mbXQo Zm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4K KyNpbmNsdWRlIDxsaW51eC9rZmVuY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNp bmNsdWRlIDxsaW51eC9zbGFiLmg+CisKK3N0YXRpYyBzdHJ1Y3Qga2ZlbmNlICphbGxvY19rZmVu Y2Uodm9pZCkKK3sKKwlzdHJ1Y3Qga2ZlbmNlICpmZW5jZTsKKworCWZlbmNlID0ga21hbGxvYyhz aXplb2YoKmZlbmNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmZW5jZSkKKwkJcmV0dXJuIE5VTEw7 CisKKwlrZmVuY2VfaW5pdChmZW5jZSwgTlVMTCk7CisJcmV0dXJuIGZlbmNlOworfQorCitzdGF0 aWMgaW50IF9faW5pdCBfX3Rlc3Rfc2VsZihzdHJ1Y3Qga2ZlbmNlICpmZW5jZSkKK3sKKwlpZiAo a2ZlbmNlX2RvbmUoZmVuY2UpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWtmZW5jZV9jb21wbGV0 ZShmZW5jZSk7CisJaWYgKCFrZmVuY2VfZG9uZShmZW5jZSkpCisJCXJldHVybiAtRUlOVkFMOwor CisJa2ZlbmNlX3dhaXQoZmVuY2UpOworCWlmICgha2ZlbmNlX2RvbmUoZmVuY2UpKQorCQlyZXR1 cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCB0ZXN0X3Nl bGYodm9pZCkKK3sKKwlzdHJ1Y3Qga2ZlbmNlICpmZW5jZTsKKwlpbnQgcmV0OworCisJLyogVGVz dCBrZmVuY2Ugc2lnbmFsaW5nIGFuZCBjb21wbGV0aW9uIHRlc3RpbmcgKi8KKwlwcl9kZWJ1Zygi JXNcbiIsIF9fZnVuY19fKTsKKworCWZlbmNlID0gYWxsb2Nfa2ZlbmNlKCk7CisJaWYgKCFmZW5j ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBfX3Rlc3Rfc2VsZihmZW5jZSk7CisKKwlr ZmVuY2VfcHV0KGZlbmNlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgdGVzdF9zdGFjayB7 CisJc3RydWN0IGtmZW5jZSBmZW5jZTsKKwlib29sIHNlZW47Cit9OworCitzdGF0aWMgaW50IF9f aW5pdCBfX2tmZW5jZV9jYWxsIGZlbmNlX2NhbGxiYWNrKHN0cnVjdCBrZmVuY2UgKmZlbmNlKQor eworCWNvbnRhaW5lcl9vZihmZW5jZSwgdHlwZW9mKHN0cnVjdCB0ZXN0X3N0YWNrKSwgZmVuY2Up LT5zZWVuID0gdHJ1ZTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBpbnQgX19p bml0IHRlc3Rfc3RhY2sodm9pZCkKK3sKKwlzdHJ1Y3QgdGVzdF9zdGFjayB0czsKKwlpbnQgcmV0 OworCisJLyogVGVzdCBrZmVuY2Ugc2lnbmFsaW5nIGFuZCBjb21wbGV0aW9uIHRlc3RpbmcgKG9u IHN0YWNrKSAqLworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJdHMuc2VlbiA9IGZh bHNlOworCWtmZW5jZV9pbml0KCZ0cy5mZW5jZSwgZmVuY2VfY2FsbGJhY2spOworCisJcmV0ID0g X190ZXN0X3NlbGYoJnRzLmZlbmNlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwor CWlmICghdHMuc2VlbikgeworCQlwcl9lcnIoImZlbmNlIGNhbGxiYWNrIG5vdCBleGVjdXRlZFxu Iik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IF9faW5pdCB0ZXN0X2RhZyh2b2lkKQoreworCXN0cnVjdCBrZmVuY2UgKkEsICpCLCAqQzsKKwor CS8qIFRlc3QgZGV0ZWN0aW9uIG9mIGN5Y2xlcyB3aXRoaW4gdGhlIGtmZW5jZSBncmFwaHMgKi8K Kwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmICghY29uZmlnX2VuYWJsZWQoQ09O RklHX0tGRU5DRV9DSEVDS19EQUcpKQorCQlyZXR1cm4gMDsKKworCUEgPSBhbGxvY19rZmVuY2Uo KTsKKwlpZiAoa2ZlbmNlX2F3YWl0X2tmZW5jZShBLCBBLCBHRlBfS0VSTkVMKSAhPSAtRUlOVkFM KSB7CisJCXByX2VycigicmVjdXJzaXZlIGN5Y2xlIG5vdCBkZXRlY3RlZCAoQUEpXG4iKTsKKwkJ cmV0dXJuIC1FSU5WQUw7CisJfQorCisJQiA9IGFsbG9jX2tmZW5jZSgpOworCisJa2ZlbmNlX2F3 YWl0X2tmZW5jZShBLCBCLCBHRlBfS0VSTkVMKTsKKwlpZiAoa2ZlbmNlX2F3YWl0X2tmZW5jZShC LCBBLCBHRlBfS0VSTkVMKSAhPSAtRUlOVkFMKSB7CisJCXByX2Vycigic2luZ2xlIGRlcHRoIGN5 Y2xlIG5vdCBkZXRlY3RlZCAoQkFCKVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCUMg PSBhbGxvY19rZmVuY2UoKTsKKwlrZmVuY2VfYXdhaXRfa2ZlbmNlKEIsIEMsIEdGUF9LRVJORUwp OworCWlmIChrZmVuY2VfYXdhaXRfa2ZlbmNlKEMsIEEsIEdGUF9LRVJORUwpICE9IC1FSU5WQUwp IHsKKwkJcHJfZXJyKCJjeWNsZSBub3QgZGV0ZWN0ZWQgKEJBLCBDQiwgQUMpXG4iKTsKKwkJcmV0 dXJuIC1FSU5WQUw7CisJfQorCisJa2ZlbmNlX2NvbXBsZXRlKEEpOworCWtmZW5jZV9wdXQoQSk7 CisKKwlrZmVuY2VfY29tcGxldGUoQik7CisJa2ZlbmNlX3B1dChCKTsKKworCWtmZW5jZV9jb21w bGV0ZShDKTsKKwlrZmVuY2VfcHV0KEMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg X19pbml0IHRlc3RfQUIodm9pZCkKK3sKKwlzdHJ1Y3Qga2ZlbmNlICpBLCAqQjsKKwlpbnQgcmV0 OworCisJLyogVGVzdCBrZmVuY2UgKEEpIHdhaXRpbmcgb24gYW4gZXZlbnQgc291cmNlIChCKSAq LworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJQSA9IGFsbG9jX2tmZW5jZSgpOwor CUIgPSBhbGxvY19rZmVuY2UoKTsKKwlpZiAoIUEgfHwgIUIpCisJCXJldHVybiAtRU5PTUVNOwor CisJcmV0ID0ga2ZlbmNlX2F3YWl0X2tmZW5jZShBLCBCLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0 IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0ID09IDApCisJCXJldHVybiAtRUlOVkFMOwor CisJa2ZlbmNlX2NvbXBsZXRlKEEpOworCWlmIChrZmVuY2VfZG9uZShBKSkKKwkJcmV0dXJuIC1F SU5WQUw7CisKKwlrZmVuY2VfY29tcGxldGUoQik7CisJaWYgKCFrZmVuY2VfZG9uZShCKSkKKwkJ cmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWtmZW5jZV9kb25lKEEpKQorCQlyZXR1cm4gLUVJTlZB TDsKKworCWtmZW5jZV9wdXQoQik7CisJa2ZlbmNlX3B1dChBKTsKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBfX2luaXQgdGVzdF9BQkModm9pZCkKK3sKKwlzdHJ1Y3Qga2ZlbmNlICpBLCAq QiwgKkM7CisJaW50IHJldDsKKworCS8qIFRlc3QgYSBjaGFpbiBvZiBmZW5jZXMsIEEgd2FpdHMg b24gQiB3aG8gd2FpdHMgb24gQyAqLworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJ QSA9IGFsbG9jX2tmZW5jZSgpOworCUIgPSBhbGxvY19rZmVuY2UoKTsKKwlDID0gYWxsb2Nfa2Zl bmNlKCk7CisJaWYgKCFBIHx8ICFCIHx8ICFDKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9 IGtmZW5jZV9hd2FpdF9rZmVuY2UoQSwgQiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCA8IDApCisJ CXJldHVybiByZXQ7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9 IGtmZW5jZV9hd2FpdF9rZmVuY2UoQiwgQywgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCA8IDApCisJ CXJldHVybiByZXQ7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWtmZW5j ZV9jb21wbGV0ZShBKTsKKwlpZiAoa2ZlbmNlX2RvbmUoQSkpCisJCXJldHVybiAtRUlOVkFMOwor CisJa2ZlbmNlX2NvbXBsZXRlKEIpOworCWlmIChrZmVuY2VfZG9uZShCKSkKKwkJcmV0dXJuIC1F SU5WQUw7CisKKwlpZiAoa2ZlbmNlX2RvbmUoQSkpCisJCXJldHVybiAtRUlOVkFMOworCisJa2Zl bmNlX2NvbXBsZXRlKEMpOworCWlmICgha2ZlbmNlX2RvbmUoQykpCisJCXJldHVybiAtRUlOVkFM OworCisJaWYgKCFrZmVuY2VfZG9uZShCKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWtm ZW5jZV9kb25lKEEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWtmZW5jZV9wdXQoQyk7CisJa2Zl bmNlX3B1dChCKTsKKwlrZmVuY2VfcHV0KEEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IF9faW5pdCB0ZXN0X0FCX0Modm9pZCkKK3sKKwlzdHJ1Y3Qga2ZlbmNlICpBLCAqQiwgKkM7CisJ aW50IHJldDsKKworCS8qIFRlc3QgbXVsdGlwbGUgZmVuY2VzIChBQikgd2FpdGluZyBvbiBhIHNp bmdsZSBldmVudCAoQykgKi8KKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKKworCUEgPSBh bGxvY19rZmVuY2UoKTsKKwlCID0gYWxsb2Nfa2ZlbmNlKCk7CisJQyA9IGFsbG9jX2tmZW5jZSgp OworCWlmICghQSB8fCAhQiB8fCAhQykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBrZmVu Y2VfYXdhaXRfa2ZlbmNlKEEsIEMsIEdGUF9LRVJORUwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1 cm4gcmV0OworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBrZmVu Y2VfYXdhaXRfa2ZlbmNlKEIsIEMsIEdGUF9LRVJORUwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1 cm4gcmV0OworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlrZmVuY2VfY29t cGxldGUoQSk7CisJa2ZlbmNlX2NvbXBsZXRlKEIpOworCisJaWYgKGtmZW5jZV9kb25lKEEpKQor CQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChrZmVuY2VfZG9uZShCKSkKKwkJcmV0dXJuIC1FSU5W QUw7CisKKwlrZmVuY2VfY29tcGxldGUoQyk7CisJaWYgKCFrZmVuY2VfZG9uZShDKSkKKwkJcmV0 dXJuIC1FSU5WQUw7CisKKwlpZiAoIWtmZW5jZV9kb25lKEIpKQorCQlyZXR1cm4gLUVJTlZBTDsK KworCWlmICgha2ZlbmNlX2RvbmUoQSkpCisJCXJldHVybiAtRUlOVkFMOworCisJa2ZlbmNlX3B1 dChDKTsKKwlrZmVuY2VfcHV0KEIpOworCWtmZW5jZV9wdXQoQSk7CisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQgX19pbml0IHRlc3RfQ19BQih2b2lkKQoreworCXN0cnVjdCBrZmVuY2UgKkEs ICpCLCAqQzsKKwlpbnQgcmV0OworCisJLyogVGVzdCBtdWx0aXBsZSBldmVudCBzb3VyY2VzIChB LEIpIGZvciBhIHNpbmdsZSBmZW5jZSAoQykgKi8KKwlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19f KTsKKworCUEgPSBhbGxvY19rZmVuY2UoKTsKKwlCID0gYWxsb2Nfa2ZlbmNlKCk7CisJQyA9IGFs bG9jX2tmZW5jZSgpOworCWlmICghQSB8fCAhQiB8fCAhQykKKwkJcmV0dXJuIC1FTk9NRU07CisK KwlyZXQgPSBrZmVuY2VfYXdhaXRfa2ZlbmNlKEMsIEEsIEdGUF9LRVJORUwpOworCWlmIChyZXQg PCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisK KwlyZXQgPSBrZmVuY2VfYXdhaXRfa2ZlbmNlKEMsIEIsIEdGUF9LRVJORUwpOworCWlmIChyZXQg PCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisK KwlrZmVuY2VfY29tcGxldGUoQyk7CisJaWYgKGtmZW5jZV9kb25lKEMpKQorCQlyZXR1cm4gLUVJ TlZBTDsKKworCWtmZW5jZV9jb21wbGV0ZShBKTsKKwlrZmVuY2VfY29tcGxldGUoQik7CisKKwlp ZiAoIWtmZW5jZV9kb25lKEEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgha2ZlbmNlX2Rv bmUoQikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFrZmVuY2VfZG9uZShDKSkKKwkJcmV0 dXJuIC1FSU5WQUw7CisKKwlrZmVuY2VfcHV0KEMpOworCWtmZW5jZV9wdXQoQik7CisJa2ZlbmNl X3B1dChBKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgdGVzdF9jb21wbGV0 aW9uKHZvaWQpCit7CisJc3RydWN0IGtmZW5jZSAqZmVuY2U7CisJc3RydWN0IGNvbXBsZXRpb24g eDsKKwlpbnQgcmV0OworCisJLyogVGVzdCB1c2Ugb2YgYSBjb21wbGV0aW9uIGFzIGFuIGV2ZW50 IHNvdXJjZSBmb3Iga2ZlbmNlcyAqLworCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOworCisJ aW5pdF9jb21wbGV0aW9uKCZ4KTsKKworCWZlbmNlID0gYWxsb2Nfa2ZlbmNlKCk7CisJaWYgKCFm ZW5jZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBrZmVuY2VfYXdhaXRfY29tcGxldGlv bihmZW5jZSwgJngsIEdGUF9LRVJORUwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0Owor CWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlrZmVuY2VfY29tcGxldGUoZmVu Y2UpOworCWlmIChrZmVuY2VfZG9uZShmZW5jZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJY29t cGxldGVfYWxsKCZ4KTsKKwlpZiAoIWtmZW5jZV9kb25lKGZlbmNlKSkKKwkJcmV0dXJuIC1FSU5W QUw7CisKKwlrZmVuY2VfcHV0KGZlbmNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHRhc2tf aXBjIHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgY29tcGxldGlvbiBzdGFy dGVkOworCXN0cnVjdCBrZmVuY2UgKmluLCAqb3V0OworCWludCB2YWx1ZTsKK307CisKK3N0YXRp YyB2b2lkIF9faW5pdCB0YXNrX2lwYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3Ry dWN0IHRhc2tfaXBjICppcGMgPSBjb250YWluZXJfb2Yod29yaywgdHlwZW9mKCppcGMpLCB3b3Jr KTsKKworCWNvbXBsZXRlKCZpcGMtPnN0YXJ0ZWQpOworCisJa2ZlbmNlX3dhaXQoaXBjLT5pbik7 CisJc21wX3N0b3JlX21iKGlwYy0+dmFsdWUsIDEpOworCWtmZW5jZV9jb21wbGV0ZShpcGMtPm91 dCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHRlc3RfY2hhaW4odm9pZCkKK3sKKwljb25zdCBp bnQgbmZlbmNlcyA9IDQwOTY7CisJc3RydWN0IGtmZW5jZSAqKmZlbmNlczsKKwlpbnQgcmV0LCBp OworCisJLyogVGVzdCBhIGxvbmcgY2hhaW4gb2YgZmVuY2VzICovCisJcHJfZGVidWcoIiVzXG4i LCBfX2Z1bmNfXyk7CisKKwlmZW5jZXMgPSBrbWFsbG9jX2FycmF5KG5mZW5jZXMsIHNpemVvZigq ZmVuY2VzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmZW5jZXMpCisJCXJldHVybiAtRU5PTUVNOwor CisJZm9yIChpID0gMDsgaSA8IG5mZW5jZXM7IGkrKykgeworCQlmZW5jZXNbaV0gPSBhbGxvY19r ZmVuY2UoKTsKKwkJaWYgKCFmZW5jZXNbaV0pCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAo aSA+IDApIHsKKwkJCXJldCA9IGtmZW5jZV9hd2FpdF9rZmVuY2UoZmVuY2VzW2ldLAorCQkJCQkJ ICBmZW5jZXNbaSAtIDFdLAorCQkJCQkJICBHRlBfS0VSTkVMKTsKKwkJCWlmIChyZXQgPCAwKQor CQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlmb3IgKGkgPSBuZmVuY2VzOyAtLWk7ICkgewor CQlrZmVuY2VfY29tcGxldGUoZmVuY2VzW2ldKTsKKwkJaWYgKGtmZW5jZV9kb25lKGZlbmNlc1tp XSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlrZmVuY2VfY29tcGxldGUoZmVuY2VzWzBd KTsKKwlmb3IgKGkgPSAwOyBpIDwgbmZlbmNlczsgaSsrKSB7CisJCWlmICgha2ZlbmNlX2RvbmUo ZmVuY2VzW2ldKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWtmZW5jZV9wdXQoZmVuY2VzW2ld KTsKKwl9CisJa2ZyZWUoZmVuY2VzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2lu aXQgdGVzdF9pcGModm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19pcGMgaXBjOworCWludCByZXQgPSAw OworCisJLyogVGVzdCB1c2Ugb2Yga2ZlbmNlIGFzIGFuIGludGVycHJvY2VzcyBzaWduYWxpbmcg bWVjaGFuaXNtICovCisJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpcGMuaW4gPSBh bGxvY19rZmVuY2UoKTsKKwlpcGMub3V0ID0gYWxsb2Nfa2ZlbmNlKCk7CisJaWYgKCFpcGMuaW4g fHwgIWlwYy5vdXQpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogdXNlIGEgY29tcGxldGlvbiB0 byBhdm9pZCBjaGlja2VuLWFuZC1lZ2cgdGVzdGluZyBmb3Iga2ZlbmNlICovCisJaW5pdF9jb21w bGV0aW9uKCZpcGMuc3RhcnRlZCk7CisKKwlpcGMudmFsdWUgPSAwOworCUlOSVRfV09SSygmaXBj LndvcmssIHRhc2tfaXBjKTsKKwlzY2hlZHVsZV93b3JrKCZpcGMud29yayk7CisKKwl3YWl0X2Zv cl9jb21wbGV0aW9uKCZpcGMuc3RhcnRlZCk7CisKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7 CisJaWYgKFJFQURfT05DRShpcGMudmFsdWUpKSB7CisJCXByX2Vycigid29ya2VyIHVwZGF0ZWQg dmFsdWUgYmVmb3JlIGtmZW5jZSB3YXMgc2lnbmFsZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOwor CX0KKworCWtmZW5jZV9jb21wbGV0ZShpcGMuaW4pOworCWtmZW5jZV93YWl0KGlwYy5vdXQpOwor CisJaWYgKCFSRUFEX09OQ0UoaXBjLnZhbHVlKSkgeworCQlwcl9lcnIoIndvcmtlciBzaWduYWxl ZCBrZmVuY2UgYmVmb3JlIHZhbHVlIHdhcyBwb3N0ZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOwor CX0KKworCWZsdXNoX3dvcmsoJmlwYy53b3JrKTsKKwlrZmVuY2VfcHV0KGlwYy5pbik7CisJa2Zl bmNlX3B1dChpcGMub3V0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCB0 ZXN0X2tmZW5jZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXByX2luZm8oIlRlc3Rpbmcg a2ZlbmNlc1xuIik7CisKKwlyZXQgPSB0ZXN0X3NlbGYoKTsKKwlpZiAocmV0IDwgMCkgeworCQlw cl9lcnIoInNlbGYgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB0ZXN0 X3N0YWNrKCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJzdGFjayBmYWlsZWRcbiIpOwor CQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHRlc3RfZGFnKCk7CisJaWYgKHJldCA8IDApIHsK KwkJcHJfZXJyKCJEQUcgY2hlY2tlciBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwor CXJldCA9IHRlc3RfQUIoKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkFCIGZhaWxlZFxu Iik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gdGVzdF9BQkMoKTsKKwlpZiAocmV0IDwg MCkgeworCQlwcl9lcnIoIkFCQyBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJl dCA9IHRlc3RfQUJfQygpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiQUJfQyBmYWlsZWRc biIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHRlc3RfQ19BQigpOworCWlmIChyZXQg PCAwKSB7CisJCXByX2VycigiQ19BQiBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwor CXJldCA9IHRlc3RfY2hhaW4oKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoImNoYWluIGZh aWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gdGVzdF9pcGMoKTsKKwlpZiAo cmV0IDwgMCkgeworCQlwcl9lcnIoImlwYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0K KworCXJldCA9IHRlc3RfY29tcGxldGlvbigpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2Vycigi Y29tcGxldGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOwor fQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGVzdF9rZmVuY2VfY2xlYW51cCh2b2lkKQoreworfQor Cittb2R1bGVfaW5pdCh0ZXN0X2tmZW5jZV9pbml0KTsKK21vZHVsZV9leGl0KHRlc3Rfa2ZlbmNl X2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiIpOworTU9EVUxF X0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGli L2tmZW5jZS5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2xpYi9rZmVuY2Uuc2gKbmV3IGZp bGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMDAwMDAwLi40ODczMjBjNzBlZDEKLS0tIC9kZXYv bnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saWIva2ZlbmNlLnNoCkBAIC0wLDAg KzEsMTAgQEAKKyMhL2Jpbi9zaAorIyBSdW5zIGluZnJhc3RydWN0dXJlIHRlc3RzIHVzaW5nIHRl c3Qta2ZlbmNlIGtlcm5lbCBtb2R1bGUKKworaWYgL3NiaW4vbW9kcHJvYmUgLXEgdGVzdC1rZmVu Y2U7IHRoZW4KKwkvc2Jpbi9tb2Rwcm9iZSAtcSAtciB0ZXN0LWtmZW5jZQorCWVjaG8gImtmZW5j ZTogb2siCitlbHNlCisJZWNobyAia2ZlbmNlOiBbRkFJTF0iCisJZXhpdCAxCitmaQotLSAKMi44 LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1k ZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=