From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steve Longerbeam Subject: [PATCH v5 2/2] gpu: ipu-v3: Add queued image conversion support Date: Thu, 15 Sep 2016 11:04:12 -0700 Message-ID: <1473962652-16820-3-git-send-email-steve_longerbeam@mentor.com> References: <1473962652-16820-1-git-send-email-steve_longerbeam@mentor.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-pf0-x241.google.com (mail-pf0-x241.google.com [IPv6:2607:f8b0:400e:c00::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id A2A1E6E900 for ; Thu, 15 Sep 2016 18:04:32 +0000 (UTC) Received: by mail-pf0-x241.google.com with SMTP id 128so2496785pfb.0 for ; Thu, 15 Sep 2016 11:04:32 -0700 (PDT) In-Reply-To: <1473962652-16820-1-git-send-email-steve_longerbeam@mentor.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: p.zabel@pengutronix.de, plagnioj@jcrosoft.com, tomi.valkeinen@ti.com Cc: linux-fbdev@vger.kernel.org, Steve Longerbeam , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org VGhpcyBwYXRjaCBpbXBsZW1lbnRzIGltYWdlIGNvbnZlcnNpb24gc3VwcG9ydCB1c2luZyB0aGUg SUMgdGFza3MsIHdpdGgKdGlsaW5nIHRvIHN1cHBvcnQgc2NhbGluZyB0byBhbmQgZnJvbSBpbWFn ZXMgdXAgdG8gNDA5Nng0MDk2LiBJbWFnZQpyb3RhdGlvbiBpcyBhbHNvIHN1cHBvcnRlZC4gSW1h Z2UgY29udmVyc2lvbiByZXF1ZXN0cyBhcmUgYWRkZWQgdG8KYSBydW4gcXVldWUgdW5kZXIgdGhl IElDIHRhc2tzLgoKVGhlIGludGVybmFsIEFQSSBpcyBzdWJzeXN0ZW0gYWdub3N0aWMgKG5vIFY0 TDIgZGVwZW5kZW5jeSBleGNlcHQKZm9yIHRoZSB1c2Ugb2YgVjRMMiBmb3VyY2MgcGl4ZWwgZm9y bWF0cykuCgpDYWxsZXJzIHByZXBhcmUgZm9yIGltYWdlIGNvbnZlcnNpb24gYnkgY2FsbGluZwpp cHVfaW1hZ2VfY29udmVydF9wcmVwYXJlKCksIHdoaWNoIGluaXRpYWxpemVzIHRoZSBwYXJhbWV0 ZXJzIG9mCnRoZSBjb252ZXJzaW9uLiBUaGUgY2FsbGVyIHBhc3NlcyBpbiB0aGUgaXB1IGFuZCBJ QyB0YXNrIHRvIHVzZSBmb3IKdGhlIGNvbnZlcnNpb24sIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGlt YWdlIGZvcm1hdHMsIGEgcm90YXRpb24gbW9kZSwKYW5kIGEgY29tcGxldGlvbiBjYWxsYmFjayBh bmQgY29tcGxldGlvbiBjb250ZXh0IHBvaW50ZXI6CgpzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRl cl9jdHggKgppcHVfaW1hZ2VfY29udmVydF9wcmVwYXJlKHN0cnVjdCBpcHVfc29jICppcHUsIGVu dW0gaXB1X2ljX3Rhc2sgaWNfdGFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qg aXB1X2ltYWdlICppbiwgc3RydWN0IGlwdV9pbWFnZSAqb3V0LAogICAgICAgICAgICAgICAgICAg ICAgICAgIGVudW0gaXB1X3JvdGF0ZV9tb2RlIHJvdF9tb2RlLAogICAgICAgICAgICAgICAgICAg ICAgICAgIGlwdV9pbWFnZV9jb252ZXJ0ZXJfY2JfdCBjb21wbGV0ZSwKICAgICAgICAgICAgICAg ICAgICAgICAgICB2b2lkICpjb21wbGV0ZV9jb250ZXh0KTsKCkEgbmV3IGNvbnZlcnNpb24gY29u dGV4dCBpcyBjcmVhdGVkIHRoYXQgaXMgYWRkZWQgdG8gYW4gSUMgdGFzawpjb250ZXh0IHF1ZXVl LiBUaGUgY2FsbGVyIGlzIGdpdmVuIHRoZSBuZXcgY29udmVyc2lvbiBjb250ZXh0LAp3aGljaCBj YW4gdGhlbiBiZSBwYXNzZWQgdG8gdGhlIGZ1cnRoZXIgQVBJczoKCmludCBpcHVfaW1hZ2VfY29u dmVydF9xdWV1ZShzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRlcl9ydW4gKnJ1bik7CgpUaGlzIHF1 ZXVlcyB0aGUgZ2l2ZW4gaW1hZ2UgY29udmVyc2lvbiByZXF1ZXN0IHJ1biB0byBhIHJ1biBxdWV1 ZSwKYW5kIHN0YXJ0cyB0aGUgY29udmVyc2lvbiBpbW1lZGlhdGVseSBpZiB0aGUgcnVuIHF1ZXVl IGlzIGVtcHR5LiBPbmx5CnRoZSBwaHlzYWRkcidzIG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGlt YWdlIGJ1ZmZlcnMgYXJlIG5lZWRlZCwKc2luY2UgdGhlIGNvbnZlcnNpb24gY29udGV4dCB3YXMg Y3JlYXRlZCBwcmV2aW91c2x5IHdpdGgKaXB1X2ltYWdlX2NvbnZlcnRfcHJlcGFyZSgpLiBXaGVu IHRoZSBjb252ZXJzaW9uIGNvbXBsZXRlcywgdGhlIHJ1bgpwb2ludGVyIGlzIHJldHVybmVkIHRv IHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrLgoKdm9pZCBpcHVfaW1hZ2VfY29udmVydF9hYm9ydChz dHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRlcl9jdHggKmN0eCk7CgpUaGlzIHdpbGwgYWJvcnQgYW55 IGFjdGl2ZSBvciBwZW5kaW5nIGNvbnZlcnNpb25zIGZvciB0aGlzIGNvbnRleHQuCkFueSBjdXJy ZW50bHkgYWN0aXZlIG9yIHBlbmRpbmcgcnVucyBiZWxvbmdpbmcgdG8gdGhpcyBjb250ZXh0IGFy ZQpyZXR1cm5lZCB2aWEgdGhlIGNvbXBsZXRpb24gY2FsbGJhY2sgd2l0aCBhbiBlcnJvciBzdGF0 dXMuCgp2b2lkIGlwdV9pbWFnZV9jb252ZXJ0X3VucHJlcGFyZShzdHJ1Y3QgaXB1X2ltYWdlX2Nv bnZlcnRlcl9jdHggKmN0eCk7CgpVbnByZXBhcmVzIHRoZSBjb252ZXJzaW9uIGNvbnRleHQuIEFu eSBhY3RpdmUgb3IgcGVuZGluZyBydW5zIHdpbGwKYmUgYWJvcnRlZCBieSBjYWxsaW5nIGlwdV9p bWFnZV9jb252ZXJ0X2Fib3J0KCkuCgpTaWduZWQtb2ZmLWJ5OiBTdGV2ZSBMb25nZXJiZWFtIDxz dGV2ZV9sb25nZXJiZWFtQG1lbnRvci5jb20+CgotLS0KCnY1OgotIG1vdmVkIGFsbCB0aGUgaXB1 X2ltYWdlX2NvbnZlcnQgc3VwcG9ydCB0byBpcHUtaW1hZ2UtY29udmVydC5jLgogIFByb3RvdHlw ZXMgbW92ZWQgdG8gaW5jbHVkZS92aWRlby9pbXgtaW1hZ2UtY29udmVydC5oIHdpdGggY29tbWVu dAogIGhlYWRlcnMuCi0gcmVtb3ZlZCB0aGUgSUNfVEFTS19FTkNPREUgY2hhbm5lbHMgZnJvbSBp bWFnZV9jb252ZXJ0X2RtYV9jaGFuW10gbGlzdC4KICBUaGUgZW5jb2RlIHRhc2sgY2Fubm5vdCBi ZSB1c2VkIGJ5IHRoZSBpbWFnZSBjb252ZXJ0ZXIsIHNpbmNlIHRoaXMKICB0YXNrIGhhcyBubyBt ZW1vcnkgc291cmNlIElETUFDIGNoYW5uZWxzIChidWZmZXJzIGNvbWUgZGlyZWN0bHkgZnJvbQog IENTSSkuCi0gcmVuYW1lZCBzb21lIHN0cnVjdHMgYW5kIGEgZmV3IG9mIHRoZSBleHBvcnRlZCBB UElzOiBzdHJ1Y3QKICBpbWFnZV9jb252ZXJ0ZXIgaXMgcmVuYW1lZCBpcHVfaW1hZ2VfY29udmVy dF9jaGFuLCBpcHVfaW1hZ2VfY29udmVydF9ydW4oKQogIGlzIHJlbmFtZWQgaXB1X2ltYWdlX2Nv bnZlcnRfcXVldWUoKS4KLSB0aGUgaXB1X2ljIGhhbmRsZSBwYXNzZWQgdG8gaXB1X2ltYWdlX2Nv bnZlcnRfcHJlcGFyZSgpIGlzIHJlcGxhY2VkIGJ5CiAgdGhlIElQVSBoYW5kbGUgYW5kIElDIHRh c2sgdGhhdCBhcmUgcmVxdWVzdGVkIGZvciBjYXJyeWluZyBvdXQgdGhlCiAgY29udmVyc2lvbi4g VGhlIGltYWdlIGNvbnZlcnRlciBhY3F1aXJlcyB0aGUgaXB1X2ljIGhhbmRsZSBpbnRlcm5hbGx5 LAogIGluIGdldF9pcHVfcmVzb3VyY2VzKCkgYWxvbmcgd2l0aCB0aGUgb3RoZXIgcmVzb3VyY2Vz IHJlcXVpcmVkLgotIHJlbW92ZWQgLm5hbWUgZmllbGQgaW4gdGhlIHN1cHBvcnRlZCBwaXhlbCBm b3JtYXQgbGlzdCwgYW5kCiAgaXB1X2ltYWdlX2NvbnZlcnRfZW51bV9mb3JtYXQoKSBubyBsb25n ZXIgdGFrZXMgYSBjaGFyKiBkZXNjIGFyZy4KLSB5X2RlcHRoIGluICdzdHJ1Y3QgaXB1X2ltYWdl X3BpeGZtdCcgcmVwbGFjZWQgd2l0aCBib29sZWFuIHBsYW5hcgogIChZIHBpeGVsIGRlcHRoIGlz IGFsd2F5cyA4IGJpdHMpLgotIHJlbW92ZWQgZG1hYnVmIHJlYWxsb2NhdGlvbiBpbiBhbGxvY19k bWFfYnVmKCkuCi0gYWRkZWQgbG9ja2RlcF9hc3NlcnRfaGVsZCgpIHRvIGZ1bmN0aW9ucyB0aGF0 IHJlcXVpcmUgdGhlIGlycWxvY2suCi0gYWRkZWQgSUMgdGFzayBudW1iZXIgdG8gZGV2X2RiZygp IG91dHB1dC4KLSBleHBvcnRlZCAnc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X3J1bicuIGlwdV9p bWFnZV9jb252ZXJ0X3F1ZXVlKCkgbm93CiAgdGFrZXMgYSBydW4gcG9pbnRlci4gQ2FsbGVyIG11 c3QgZHluYW1pY2FsbHkgYWxsb2NhdGUgYW5kIGZpbGwgdGhlIHJ1bgogIHdpdGggYSBjb252ZXJz aW9uIGNvbnRleHQgaGFuZGxlIGFuZCB0aGUgaW5wdXQvb3V0cHV0IGJ1ZmZlciBkbWEgYWRkcmVz c2VzLAogIGFuZCBmcmVlIHRoZSBydW4gb2JqZWN0IHdoZW4gaXQgaXMgcmV0dXJuZWQgaW4gdGhl IGNvbXBsZXRpb24gY2FsbGJhY2suCi0gaXB1X2ltYWdlX2NvbnZlcnRfYWRqdXN0KCkgaXMgbm93 IGEgdm9pZC4KCnY0OgotIGRvIGF3YXkgd2l0aCBzdHJ1Y3QgaXB1X2ljX3RpbGVfb2ZmLCBhbmQg bW92ZSB0aWxlIG9mZnNldHMgaW50bwogIHN0cnVjdCBpcHVfaWNfdGlsZS4gVGhpcyBwYXZlcyB0 aGUgd2F5IGZvciBwb3NzaWJseSBhbGxvd2luZyBmb3IKICBlYWNoIHRpbGUgdG8gaGF2ZSBkaWZm ZXJlbnQgZGltZW5zaW9ucyBpbiB0aGUgZnV0dXJlLgoKdjM6IG5vIGNoYW5nZXMKdjI6IG5vIGNo YW5nZXMKLS0tCiBkcml2ZXJzL2dwdS9pcHUtdjMvTWFrZWZpbGUgICAgICAgICAgICB8ICAgIDMg Ky0KIGRyaXZlcnMvZ3B1L2lwdS12My9pcHUtY29tbW9uLmMgICAgICAgIHwgICAgOSArCiBkcml2 ZXJzL2dwdS9pcHUtdjMvaXB1LWltYWdlLWNvbnZlcnQuYyB8IDE3MjEgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2lwdS12My9pcHUtcHJ2LmggICAgICAgICAg IHwgICAgNSArCiBpbmNsdWRlL3ZpZGVvL2lteC1pbWFnZS1jb252ZXJ0LmggICAgICB8ICAyMDcg KysrKwogNSBmaWxlcyBjaGFuZ2VkLCAxOTQ0IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkK IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWltYWdlLWNvbnZlcnQu YwogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvdmlkZW8vaW14LWltYWdlLWNvbnZlcnQuaAoK ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2lwdS12My9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2lw dS12My9NYWtlZmlsZQppbmRleCAxMDdlYzIzLi44YWMwOGUzIDEwMDY0NAotLS0gYS9kcml2ZXJz L2dwdS9pcHUtdjMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvaXB1LXYzL01ha2VmaWxlCkBA IC0xLDQgKzEsNSBAQAogb2JqLSQoQ09ORklHX0lNWF9JUFVWM19DT1JFKSArPSBpbXgtaXB1LXYz Lm8KIAogaW14LWlwdS12My1vYmpzIDo9IGlwdS1jb21tb24ubyBpcHUtY3BtZW0ubyBpcHUtY3Np Lm8gaXB1LWRjLm8gaXB1LWRpLm8gXAotCQlpcHUtZHAubyBpcHUtZG1mYy5vIGlwdS1pYy5vIGlw dS1zbWZjLm8KKwkJaXB1LWRwLm8gaXB1LWRtZmMubyBpcHUtaWMubyBpcHUtaW1hZ2UtY29udmVy dC5vIFwKKwkJaXB1LXNtZmMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvaXB1LXYzL2lwdS1j b21tb24uYyBiL2RyaXZlcnMvZ3B1L2lwdS12My9pcHUtY29tbW9uLmMKaW5kZXggZDIzMDk4OC4u NTEzNmQ2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvaXB1LXYzL2lwdS1jb21tb24uYworKysg Yi9kcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWNvbW1vbi5jCkBAIC04MzksNiArODM5LDEyIEBAIHN0 YXRpYyBpbnQgaXB1X3N1Ym1vZHVsZXNfaW5pdChzdHJ1Y3QgaXB1X3NvYyAqaXB1LAogCQlnb3Rv IGVycl9pYzsKIAl9CiAKKwlyZXQgPSBpcHVfaW1hZ2VfY29udmVydF9pbml0KGlwdSwgZGV2KTsK KwlpZiAocmV0KSB7CisJCXVuaXQgPSAiaW1hZ2VfY29udmVydCI7CisJCWdvdG8gZXJyX2ltYWdl X2NvbnZlcnQ7CisJfQorCiAJcmV0ID0gaXB1X2RpX2luaXQoaXB1LCBkZXYsIDAsIGlwdV9iYXNl ICsgZGV2dHlwZS0+ZGlzcDBfb2ZzLAogCQkJICBJUFVfQ09ORl9ESTBfRU4sIGlwdV9jbGspOwog CWlmIChyZXQpIHsKQEAgLTg5Myw2ICs4OTksOCBAQCBlcnJfZGM6CiBlcnJfZGlfMToKIAlpcHVf ZGlfZXhpdChpcHUsIDApOwogZXJyX2RpXzA6CisJaXB1X2ltYWdlX2NvbnZlcnRfZXhpdChpcHUp OworZXJyX2ltYWdlX2NvbnZlcnQ6CiAJaXB1X2ljX2V4aXQoaXB1KTsKIGVycl9pYzoKIAlpcHVf Y3NpX2V4aXQoaXB1LCAxKTsKQEAgLTk3Nyw2ICs5ODUsNyBAQCBzdGF0aWMgdm9pZCBpcHVfc3Vi bW9kdWxlc19leGl0KHN0cnVjdCBpcHVfc29jICppcHUpCiAJaXB1X2RjX2V4aXQoaXB1KTsKIAlp cHVfZGlfZXhpdChpcHUsIDEpOwogCWlwdV9kaV9leGl0KGlwdSwgMCk7CisJaXB1X2ltYWdlX2Nv bnZlcnRfZXhpdChpcHUpOwogCWlwdV9pY19leGl0KGlwdSk7CiAJaXB1X2NzaV9leGl0KGlwdSwg MSk7CiAJaXB1X2NzaV9leGl0KGlwdSwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9pcHUt djMvaXB1LWltYWdlLWNvbnZlcnQuYyBiL2RyaXZlcnMvZ3B1L2lwdS12My9pcHUtaW1hZ2UtY29u dmVydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjAxNTAKLS0tIC9k ZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9pcHUtdjMvaXB1LWltYWdlLWNvbnZlcnQuYwpAQCAt MCwwICsxLDE3MjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNiBNZW50b3IgR3Jh cGhpY3MgSW5jLgorICoKKyAqIFF1ZXVlZCBpbWFnZSBjb252ZXJzaW9uIHN1cHBvcnQsIHdpdGgg dGlsaW5nIGFuZCByb3RhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg dGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhl IExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK KyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl IGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCisgKiBvciBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UK KyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5o PgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8dmlkZW8vaW14LWlt YWdlLWNvbnZlcnQuaD4KKyNpbmNsdWRlICJpcHUtcHJ2LmgiCisKKy8qCisgKiBUaGUgSUMgUmVz aXplciBoYXMgYSByZXN0cmljdGlvbiB0aGF0IHRoZSBvdXRwdXQgZnJhbWUgZnJvbSB0aGUKKyAq IHJlc2l6ZXIgbXVzdCBiZSAxMDI0IG9yIGxlc3MgaW4gYm90aCB3aWR0aCAocGl4ZWxzKSBhbmQg aGVpZ2h0CisgKiAobGluZXMpLgorICoKKyAqIFRoZSBpbWFnZSBjb252ZXJ0ZXIgYXR0ZW1wdHMg dG8gc3BsaXQgdXAgYSBjb252ZXJzaW9uIHdoZW4KKyAqIHRoZSBkZXNpcmVkIG91dHB1dCAoY29u dmVydGVkKSBmcmFtZSByZXNvbHV0aW9uIGV4Y2VlZHMgdGhlCisgKiBJQyByZXNpemVyIGxpbWl0 IG9mIDEwMjQgaW4gZWl0aGVyIGRpbWVuc2lvbi4KKyAqCisgKiBJZiBlaXRoZXIgZGltZW5zaW9u IG9mIHRoZSBvdXRwdXQgZnJhbWUgZXhjZWVkcyB0aGUgbGltaXQsIHRoZQorICogZGltZW5zaW9u IGlzIHNwbGl0IGludG8gMSwgMiwgb3IgNCBlcXVhbCBzdHJpcGVzLCBmb3IgYSBtYXhpbXVtCisg KiBvZiA0KjQgb3IgMTYgdGlsZXMuIEEgY29udmVyc2lvbiBpcyB0aGVuIGNhcnJpZWQgb3V0IGZv ciBlYWNoCisgKiB0aWxlIChidXQgdGFraW5nIGNhcmUgdG8gcGFzcyB0aGUgZnVsbCBmcmFtZSBz dHJpZGUgbGVuZ3RoIHRvCisgKiB0aGUgRE1BIGNoYW5uZWwncyBwYXJhbWV0ZXIgbWVtb3J5ISku IElETUEgZG91YmxlLWJ1ZmZlcmluZyBpcyB1c2VkCisgKiB0byBjb252ZXJ0IGVhY2ggdGlsZSBi YWNrLXRvLWJhY2sgd2hlbiBwb3NzaWJsZSAoc2VlIG5vdGUgYmVsb3cKKyAqIHdoZW4gZG91Ymxl X2J1ZmZlcmluZyBib29sZWFuIGlzIHNldCkuCisgKgorICogTm90ZSB0aGF0IHRoZSBpbnB1dCBm cmFtZSBtdXN0IGJlIHNwbGl0IHVwIGludG8gdGhlIHNhbWUgbnVtYmVyCisgKiBvZiB0aWxlcyBh cyB0aGUgb3V0cHV0IGZyYW1lLgorICoKKyAqIEZJWE1FOiBhdCB0aGlzIHBvaW50IHRoZXJlIGlz IG5vIGF0dGVtcHQgdG8gZGVhbCB3aXRoIHZpc2libGUgc2VhbXMKKyAqIGF0IHRoZSB0aWxlIGJv dW5kYXJpZXMgd2hlbiB1cHNjYWxpbmcuIFRoZSBzZWFtcyBhcmUgY2F1c2VkIGJ5IGEgcmVzZXQK KyAqIG9mIHRoZSBiaWxpbmVhciB1cHNjYWxlIGludGVycG9sYXRpb24gd2hlbiBzdGFydGluZyBh IG5ldyB0aWxlLiBUaGUKKyAqIHNlYW1zIGFyZSBiYXJlbHkgdmlzaWJsZSBmb3Igc21hbGwgdXBz Y2FsZSBmYWN0b3JzLCBidXQgYmVjb21lCisgKiBpbmNyZWFzaW5nbHkgdmlzaWJsZSBhcyB0aGUg dXBzY2FsZSBmYWN0b3IgZ2V0cyBsYXJnZXIsIHNpbmNlIG1vcmUKKyAqIGludGVycG9sYXRlZCBw aXhlbHMgZ2V0IHRocm93biBvdXQgYXQgdGhlIHRpbGUgYm91bmRhcmllcy4gQSBwb3NzaWxibGUK KyAqIGZpeCBtaWdodCBiZSB0byBvdmVybGFwIHRpbGVzIG9mIGRpZmZlcmVudCBzaXplcywgYnV0 IHRoaXMgbXVzdCBiZSBkb25lCisgKiB3aGlsZSBhbHNvIG1haW50YWluaW5nIHRoZSBJRE1BQyBk bWEgYnVmZmVyIGFkZHJlc3MgYWxpZ25tZW50IGFuZCA4eDggSVJUCisgKiBhbGlnbm1lbnQgcmVz dHJpY3Rpb25zIG9mIGVhY2ggdGlsZS4KKyAqLworCisjZGVmaW5lIE1BWF9TVFJJUEVTX1cgICAg NAorI2RlZmluZSBNQVhfU1RSSVBFU19IICAgIDQKKyNkZWZpbmUgTUFYX1RJTEVTIChNQVhfU1RS SVBFU19XICogTUFYX1NUUklQRVNfSCkKKworI2RlZmluZSBNSU5fVyAgICAgMTI4CisjZGVmaW5l IE1JTl9IICAgICAxMjgKKyNkZWZpbmUgTUFYX1cgICAgIDQwOTYKKyNkZWZpbmUgTUFYX0ggICAg IDQwOTYKKworZW51bSBpcHVfaW1hZ2VfY29udmVydF90eXBlIHsKKwlJTUFHRV9DT05WRVJUX0lO ID0gMCwKKwlJTUFHRV9DT05WRVJUX09VVCwKK307CisKK3N0cnVjdCBpcHVfaW1hZ2VfY29udmVy dF9kbWFfYnVmIHsKKwl2b2lkICAgICAgICAgICp2aXJ0OworCWRtYV9hZGRyX3QgICAgcGh5czsK Kwl1bnNpZ25lZCBsb25nIGxlbjsKK307CisKK3N0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9kbWFf Y2hhbiB7CisJaW50IGluOworCWludCBvdXQ7CisJaW50IHJvdF9pbjsKKwlpbnQgcm90X291dDsK KwlpbnQgdmRpX2luX3A7CisJaW50IHZkaV9pbjsKKwlpbnQgdmRpX2luX247Cit9OworCisvKiBk aW1lbnNpb25zIG9mIG9uZSB0aWxlICovCitzdHJ1Y3QgaXB1X2ltYWdlX3RpbGUgeworCXUzMiB3 aWR0aDsKKwl1MzIgaGVpZ2h0OworCS8qIHNpemUgYW5kIHN0cmlkZXMgYXJlIGluIGJ5dGVzICov CisJdTMyIHNpemU7CisJdTMyIHN0cmlkZTsKKwl1MzIgcm90X3N0cmlkZTsKKwkvKiBzdGFydCBZ IG9yIHBhY2tlZCBvZmZzZXQgb2YgdGhpcyB0aWxlICovCisJdTMyIG9mZnNldDsKKwkvKiBvZmZz ZXQgZnJvbSBzdGFydCB0byB0aWxlIGluIFUgcGxhbmUsIGZvciBwbGFuYXIgZm9ybWF0cyAqLwor CXUzMiB1X29mZjsKKwkvKiBvZmZzZXQgZnJvbSBzdGFydCB0byB0aWxlIGluIFYgcGxhbmUsIGZv ciBwbGFuYXIgZm9ybWF0cyAqLworCXUzMiB2X29mZjsKK307CisKK3N0cnVjdCBpcHVfaW1hZ2Vf Y29udmVydF9pbWFnZSB7CisJc3RydWN0IGlwdV9pbWFnZSBiYXNlOworCWVudW0gaXB1X2ltYWdl X2NvbnZlcnRfdHlwZSB0eXBlOworCisJY29uc3Qgc3RydWN0IGlwdV9pbWFnZV9waXhmbXQgKmZt dDsKKwl1bnNpZ25lZCBpbnQgc3RyaWRlOworCisJLyogIyBvZiByb3dzIChob3Jpem9udGFsIHN0 cmlwZXMpIGlmIGRlc3QgaGVpZ2h0IGlzID4gMTAyNCAqLworCXVuc2lnbmVkIGludCBudW1fcm93 czsKKwkvKiAjIG9mIGNvbHVtbnMgKHZlcnRpY2FsIHN0cmlwZXMpIGlmIGRlc3Qgd2lkdGggaXMg PiAxMDI0ICovCisJdW5zaWduZWQgaW50IG51bV9jb2xzOworCisJc3RydWN0IGlwdV9pbWFnZV90 aWxlIHRpbGVbTUFYX1RJTEVTXTsKK307CisKK3N0cnVjdCBpcHVfaW1hZ2VfcGl4Zm10IHsKKwl1 MzIJZm91cmNjOyAgICAgICAgLyogVjRMMiBmb3VyY2MgKi8KKwlpbnQgICAgIGJwcDsgICAgICAg ICAgIC8qIHRvdGFsIGJwcCAqLworCWludCAgICAgdXZfd2lkdGhfZGVjOyAgLyogZGVjaW1hdGlv biBpbiB3aWR0aCBmb3IgVS9WIHBsYW5lcyAqLworCWludCAgICAgdXZfaGVpZ2h0X2RlYzsgLyog ZGVjaW1hdGlvbiBpbiBoZWlnaHQgZm9yIFUvViBwbGFuZXMgKi8KKwlib29sICAgIHBsYW5hcjsg ICAgICAgIC8qIHBsYW5hciBmb3JtYXQgKi8KKwlib29sICAgIHV2X3N3YXBwZWQ7ICAgIC8qIFUg YW5kIFYgcGxhbmVzIGFyZSBzd2FwcGVkICovCisJYm9vbCAgICB1dl9wYWNrZWQ7ICAgICAvKiBw YXJ0aWFsIHBsYW5hciAoVSBhbmQgViBpbiBzYW1lIHBsYW5lKSAqLworfTsKKworc3RydWN0IGlw dV9pbWFnZV9jb252ZXJ0X2N0eDsKK3N0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9jaGFuOworc3Ry dWN0IGlwdV9pbWFnZV9jb252ZXJ0X3ByaXY7CisKK3N0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9j dHggeworCXN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9jaGFuICpjaGFuOworCisJaXB1X2ltYWdl X2NvbnZlcnRfY2JfdCBjb21wbGV0ZTsKKwl2b2lkICpjb21wbGV0ZV9jb250ZXh0OworCisJLyog U291cmNlL2Rlc3RpbmF0aW9uIGltYWdlIGRhdGEgYW5kIHJvdGF0aW9uIG1vZGUgKi8KKwlzdHJ1 Y3QgaXB1X2ltYWdlX2NvbnZlcnRfaW1hZ2UgaW47CisJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0 X2ltYWdlIG91dDsKKwllbnVtIGlwdV9yb3RhdGVfbW9kZSByb3RfbW9kZTsKKworCS8qIGludGVy bWVkaWF0ZSBidWZmZXIgZm9yIHJvdGF0aW9uICovCisJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0 X2RtYV9idWYgcm90X2ludGVybWVkaWF0ZVsyXTsKKworCS8qIGN1cnJlbnQgYnVmZmVyIG51bWJl ciBmb3IgZG91YmxlIGJ1ZmZlcmluZyAqLworCWludCBjdXJfYnVmX251bTsKKworCWJvb2wgYWJv cnRpbmc7CisJc3RydWN0IGNvbXBsZXRpb24gYWJvcnRlZDsKKworCS8qIGNhbiB3ZSB1c2UgZG91 YmxlLWJ1ZmZlcmluZyBmb3IgdGhpcyBjb252ZXJzaW9uIG9wZXJhdGlvbj8gKi8KKwlib29sIGRv dWJsZV9idWZmZXJpbmc7CisJLyogbnVtX3Jvd3MgKiBudW1fY29scyAqLworCXVuc2lnbmVkIGlu dCBudW1fdGlsZXM7CisJLyogbmV4dCB0aWxlIHRvIHByb2Nlc3MgKi8KKwl1bnNpZ25lZCBpbnQg bmV4dF90aWxlOworCS8qIHdoZXJlIHRvIHBsYWNlIGNvbnZlcnRlZCB0aWxlIGluIGRlc3QgaW1h Z2UgKi8KKwl1bnNpZ25lZCBpbnQgb3V0X3RpbGVfbWFwW01BWF9USUxFU107CisKKwlzdHJ1Y3Qg bGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfY2hhbiB7CisJ c3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X3ByaXYgKnByaXY7CisKKwllbnVtIGlwdV9pY190YXNr IGljX3Rhc2s7CisJY29uc3Qgc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X2RtYV9jaGFuICpkbWFf Y2g7CisKKwlzdHJ1Y3QgaXB1X2ljICppYzsKKwlzdHJ1Y3QgaXB1djNfY2hhbm5lbCAqaW5fY2hh bjsKKwlzdHJ1Y3QgaXB1djNfY2hhbm5lbCAqb3V0X2NoYW47CisJc3RydWN0IGlwdXYzX2NoYW5u ZWwgKnJvdGF0aW9uX2luX2NoYW47CisJc3RydWN0IGlwdXYzX2NoYW5uZWwgKnJvdGF0aW9uX291 dF9jaGFuOworCisJLyogdGhlIElQVSBlbmQtb2YtZnJhbWUgaXJxcyAqLworCWludCBvdXRfZW9m X2lycTsKKwlpbnQgcm90X291dF9lb2ZfaXJxOworCisJc3BpbmxvY2tfdCBpcnFsb2NrOworCisJ LyogbGlzdCBvZiBjb252ZXJ0IGNvbnRleHRzICovCisJc3RydWN0IGxpc3RfaGVhZCBjdHhfbGlz dDsKKwkvKiBxdWV1ZSBvZiBjb252ZXJzaW9uIHJ1bnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHBl bmRpbmdfcTsKKwkvKiBxdWV1ZSBvZiBjb21wbGV0ZWQgcnVucyAqLworCXN0cnVjdCBsaXN0X2hl YWQgZG9uZV9xOworCisJLyogdGhlIGN1cnJlbnQgY29udmVyc2lvbiBydW4gKi8KKwlzdHJ1Y3Qg aXB1X2ltYWdlX2NvbnZlcnRfcnVuICpjdXJyZW50X3J1bjsKK307CisKK3N0cnVjdCBpcHVfaW1h Z2VfY29udmVydF9wcml2IHsKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfY2hhbiBjaGFuW0lD X05VTV9UQVNLU107CisJc3RydWN0IGlwdV9zb2MgKmlwdTsKK307CisKK3N0YXRpYyBjb25zdCBz dHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfZG1hX2NoYW4KK2ltYWdlX2NvbnZlcnRfZG1hX2NoYW5b SUNfTlVNX1RBU0tTXSA9IHsKKwlbSUNfVEFTS19WSUVXRklOREVSXSA9IHsKKwkJLmluID0gSVBV VjNfQ0hBTk5FTF9NRU1fSUNfUFJQX1ZGLAorCQkub3V0ID0gSVBVVjNfQ0hBTk5FTF9JQ19QUlBf VkZfTUVNLAorCQkucm90X2luID0gSVBVVjNfQ0hBTk5FTF9NRU1fUk9UX1ZGLAorCQkucm90X291 dCA9IElQVVYzX0NIQU5ORUxfUk9UX1ZGX01FTSwKKwkJLnZkaV9pbl9wID0gSVBVVjNfQ0hBTk5F TF9NRU1fVkRJX1BSRVYsCisJCS52ZGlfaW4gPSBJUFVWM19DSEFOTkVMX01FTV9WRElfQ1VSLAor CQkudmRpX2luX24gPSBJUFVWM19DSEFOTkVMX01FTV9WRElfTkVYVCwKKwl9LAorCVtJQ19UQVNL X1BPU1RfUFJPQ0VTU09SXSA9IHsKKwkJLmluID0gSVBVVjNfQ0hBTk5FTF9NRU1fSUNfUFAsCisJ CS5vdXQgPSBJUFVWM19DSEFOTkVMX0lDX1BQX01FTSwKKwkJLnJvdF9pbiA9IElQVVYzX0NIQU5O RUxfTUVNX1JPVF9QUCwKKwkJLnJvdF9vdXQgPSBJUFVWM19DSEFOTkVMX1JPVF9QUF9NRU0sCisJ fSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXB1X2ltYWdlX3BpeGZtdCBpbWFnZV9jb252 ZXJ0X2Zvcm1hdHNbXSA9IHsKKwl7CisJCS5mb3VyY2MJPSBWNEwyX1BJWF9GTVRfUkdCNTY1LAor CQkuYnBwICAgID0gMTYsCisJfSwgeworCQkuZm91cmNjCT0gVjRMMl9QSVhfRk1UX1JHQjI0LAor CQkuYnBwICAgID0gMjQsCisJfSwgeworCQkuZm91cmNjCT0gVjRMMl9QSVhfRk1UX0JHUjI0LAor CQkuYnBwICAgID0gMjQsCisJfSwgeworCQkuZm91cmNjCT0gVjRMMl9QSVhfRk1UX1JHQjMyLAor CQkuYnBwICAgID0gMzIsCisJfSwgeworCQkuZm91cmNjCT0gVjRMMl9QSVhfRk1UX0JHUjMyLAor CQkuYnBwICAgID0gMzIsCisJfSwgeworCQkuZm91cmNjCT0gVjRMMl9QSVhfRk1UX1lVWVYsCisJ CS5icHAgICAgPSAxNiwKKwkJLnV2X3dpZHRoX2RlYyA9IDIsCisJCS51dl9oZWlnaHRfZGVjID0g MSwKKwl9LCB7CisJCS5mb3VyY2MJPSBWNEwyX1BJWF9GTVRfVVlWWSwKKwkJLmJwcCAgICA9IDE2 LAorCQkudXZfd2lkdGhfZGVjID0gMiwKKwkJLnV2X2hlaWdodF9kZWMgPSAxLAorCX0sIHsKKwkJ LmZvdXJjYwk9IFY0TDJfUElYX0ZNVF9ZVVY0MjAsCisJCS5icHAgICAgPSAxMiwKKwkJLnBsYW5h ciA9IHRydWUsCisJCS51dl93aWR0aF9kZWMgPSAyLAorCQkudXZfaGVpZ2h0X2RlYyA9IDIsCisJ fSwgeworCQkuZm91cmNjCT0gVjRMMl9QSVhfRk1UX1lWVTQyMCwKKwkJLmJwcCAgICA9IDEyLAor CQkucGxhbmFyID0gdHJ1ZSwKKwkJLnV2X3dpZHRoX2RlYyA9IDIsCisJCS51dl9oZWlnaHRfZGVj ID0gMiwKKwkJLnV2X3N3YXBwZWQgPSB0cnVlLAorCX0sIHsKKwkJLmZvdXJjYyA9IFY0TDJfUElY X0ZNVF9OVjEyLAorCQkuYnBwICAgID0gMTIsCisJCS5wbGFuYXIgPSB0cnVlLAorCQkudXZfd2lk dGhfZGVjID0gMiwKKwkJLnV2X2hlaWdodF9kZWMgPSAyLAorCQkudXZfcGFja2VkID0gdHJ1ZSwK Kwl9LCB7CisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfWVVWNDIyUCwKKwkJLmJwcCAgICA9IDE2 LAorCQkucGxhbmFyID0gdHJ1ZSwKKwkJLnV2X3dpZHRoX2RlYyA9IDIsCisJCS51dl9oZWlnaHRf ZGVjID0gMSwKKwl9LCB7CisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTlYxNiwKKwkJLmJwcCAg ICA9IDE2LAorCQkucGxhbmFyID0gdHJ1ZSwKKwkJLnV2X3dpZHRoX2RlYyA9IDIsCisJCS51dl9o ZWlnaHRfZGVjID0gMSwKKwkJLnV2X3BhY2tlZCA9IHRydWUsCisJfSwKK307CisKK3N0YXRpYyBj b25zdCBzdHJ1Y3QgaXB1X2ltYWdlX3BpeGZtdCAqZ2V0X2Zvcm1hdCh1MzIgZm91cmNjKQorewor CWNvbnN0IHN0cnVjdCBpcHVfaW1hZ2VfcGl4Zm10ICpyZXQgPSBOVUxMOworCXVuc2lnbmVkIGlu dCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW1hZ2VfY29udmVydF9mb3JtYXRz KTsgaSsrKSB7CisJCWlmIChpbWFnZV9jb252ZXJ0X2Zvcm1hdHNbaV0uZm91cmNjID09IGZvdXJj YykgeworCQkJcmV0ID0gJmltYWdlX2NvbnZlcnRfZm9ybWF0c1tpXTsKKwkJCWJyZWFrOworCQl9 CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZHVtcF9mb3JtYXQoc3RydWN0 IGlwdV9pbWFnZV9jb252ZXJ0X2N0eCAqY3R4LAorCQkJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0 X2ltYWdlICppY19pbWFnZSkKK3sKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfY2hhbiAqY2hh biA9IGN0eC0+Y2hhbjsKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfcHJpdiAqcHJpdiA9IGNo YW4tPnByaXY7CisKKwlkZXZfZGJnKHByaXYtPmlwdS0+ZGV2LAorCQkidGFzayAldTogY3R4ICVw OiAlcyBmb3JtYXQ6ICVkeCVkICglZHglZCB0aWxlcyBvZiBzaXplICVkeCVkKSwgJWMlYyVjJWNc biIsCisJCWNoYW4tPmljX3Rhc2ssIGN0eCwKKwkJaWNfaW1hZ2UtPnR5cGUgPT0gSU1BR0VfQ09O VkVSVF9PVVQgPyAiT3V0cHV0IiA6ICJJbnB1dCIsCisJCWljX2ltYWdlLT5iYXNlLnBpeC53aWR0 aCwgaWNfaW1hZ2UtPmJhc2UucGl4LmhlaWdodCwKKwkJaWNfaW1hZ2UtPm51bV9jb2xzLCBpY19p bWFnZS0+bnVtX3Jvd3MsCisJCWljX2ltYWdlLT50aWxlWzBdLndpZHRoLCBpY19pbWFnZS0+dGls ZVswXS5oZWlnaHQsCisJCWljX2ltYWdlLT5mbXQtPmZvdXJjYyAmIDB4ZmYsCisJCShpY19pbWFn ZS0+Zm10LT5mb3VyY2MgPj4gOCkgJiAweGZmLAorCQkoaWNfaW1hZ2UtPmZtdC0+Zm91cmNjID4+ IDE2KSAmIDB4ZmYsCisJCShpY19pbWFnZS0+Zm10LT5mb3VyY2MgPj4gMjQpICYgMHhmZik7Cit9 CisKK2ludCBpcHVfaW1hZ2VfY29udmVydF9lbnVtX2Zvcm1hdChpbnQgaW5kZXgsIHUzMiAqZm91 cmNjKQoreworCWNvbnN0IHN0cnVjdCBpcHVfaW1hZ2VfcGl4Zm10ICpmbXQ7CisKKwlpZiAoaW5k ZXggPj0gKGludClBUlJBWV9TSVpFKGltYWdlX2NvbnZlcnRfZm9ybWF0cykpCisJCXJldHVybiAt RUlOVkFMOworCisJLyogRm9ybWF0IGZvdW5kICovCisJZm10ID0gJmltYWdlX2NvbnZlcnRfZm9y bWF0c1tpbmRleF07CisJKmZvdXJjYyA9IGZtdC0+Zm91cmNjOworCXJldHVybiAwOworfQorRVhQ T1JUX1NZTUJPTF9HUEwoaXB1X2ltYWdlX2NvbnZlcnRfZW51bV9mb3JtYXQpOworCitzdGF0aWMg dm9pZCBmcmVlX2RtYV9idWYoc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X3ByaXYgKnByaXYsCisJ CQkgc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X2RtYV9idWYgKmJ1ZikKK3sKKwlpZiAoYnVmLT52 aXJ0KQorCQlkbWFfZnJlZV9jb2hlcmVudChwcml2LT5pcHUtPmRldiwKKwkJCQkgIGJ1Zi0+bGVu LCBidWYtPnZpcnQsIGJ1Zi0+cGh5cyk7CisJYnVmLT52aXJ0ID0gTlVMTDsKKwlidWYtPnBoeXMg PSAwOworfQorCitzdGF0aWMgaW50IGFsbG9jX2RtYV9idWYoc3RydWN0IGlwdV9pbWFnZV9jb252 ZXJ0X3ByaXYgKnByaXYsCisJCQkgc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X2RtYV9idWYgKmJ1 ZiwKKwkJCSBpbnQgc2l6ZSkKK3sKKwlidWYtPmxlbiA9IFBBR0VfQUxJR04oc2l6ZSk7CisJYnVm LT52aXJ0ID0gZG1hX2FsbG9jX2NvaGVyZW50KHByaXYtPmlwdS0+ZGV2LCBidWYtPmxlbiwgJmJ1 Zi0+cGh5cywKKwkJCQkgICAgICAgR0ZQX0RNQSB8IEdGUF9LRVJORUwpOworCWlmICghYnVmLT52 aXJ0KSB7CisJCWRldl9lcnIocHJpdi0+aXB1LT5kZXYsICJmYWlsZWQgdG8gYWxsb2MgZG1hIGJ1 ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW5saW5lIGludCBudW1fc3RyaXBlcyhpbnQgZGltKQoreworCWlmIChkaW0gPD0gMTAyNCkK KwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoZGltIDw9IDIwNDgpCisJCXJldHVybiAyOworCWVsc2UK KwkJcmV0dXJuIDQ7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfdGlsZV9kaW1lbnNpb25zKHN0cnVj dCBpcHVfaW1hZ2VfY29udmVydF9jdHggKmN0eCwKKwkJCQkgc3RydWN0IGlwdV9pbWFnZV9jb252 ZXJ0X2ltYWdlICppbWFnZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjdHgtPm51 bV90aWxlczsgaSsrKSB7CisJCXN0cnVjdCBpcHVfaW1hZ2VfdGlsZSAqdGlsZSA9ICZpbWFnZS0+ dGlsZVtpXTsKKworCQl0aWxlLT5oZWlnaHQgPSBpbWFnZS0+YmFzZS5waXguaGVpZ2h0IC8gaW1h Z2UtPm51bV9yb3dzOworCQl0aWxlLT53aWR0aCA9IGltYWdlLT5iYXNlLnBpeC53aWR0aCAvIGlt YWdlLT5udW1fY29sczsKKwkJdGlsZS0+c2l6ZSA9ICgodGlsZS0+aGVpZ2h0ICogaW1hZ2UtPmZt dC0+YnBwKSA+PiAzKSAqCisJCQl0aWxlLT53aWR0aDsKKworCQlpZiAoaW1hZ2UtPmZtdC0+cGxh bmFyKSB7CisJCQl0aWxlLT5zdHJpZGUgPSB0aWxlLT53aWR0aDsKKwkJCXRpbGUtPnJvdF9zdHJp ZGUgPSB0aWxlLT5oZWlnaHQ7CisJCX0gZWxzZSB7CisJCQl0aWxlLT5zdHJpZGUgPQorCQkJCShp bWFnZS0+Zm10LT5icHAgKiB0aWxlLT53aWR0aCkgPj4gMzsKKwkJCXRpbGUtPnJvdF9zdHJpZGUg PQorCQkJCShpbWFnZS0+Zm10LT5icHAgKiB0aWxlLT5oZWlnaHQpID4+IDM7CisJCX0KKwl9Cit9 CisKKy8qCisgKiBVc2UgdGhlIHJvdGF0aW9uIHRyYW5zZm9ybWF0aW9uIHRvIGZpbmQgdGhlIHRp bGUgY29vcmRpbmF0ZXMKKyAqIChyb3csIGNvbCkgb2YgYSB0aWxlIGluIHRoZSBkZXN0aW5hdGlv biBmcmFtZSB0aGF0IGNvcnJlc3BvbmRzCisgKiB0byB0aGUgZ2l2ZW4gdGlsZSBjb29yZGluYXRl cyBvZiBhIHNvdXJjZSBmcmFtZS4gVGhlIGRlc3RpbmF0aW9uCisgKiBjb29yZGluYXRlIGlzIHRo ZW4gY29udmVydGVkIHRvIGEgdGlsZSBpbmRleC4KKyAqLworc3RhdGljIGludCB0cmFuc2Zvcm1f dGlsZV9pbmRleChzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfY3R4ICpjdHgsCisJCQkJaW50IHNy Y19yb3csIGludCBzcmNfY29sKQoreworCXN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9jaGFuICpj aGFuID0gY3R4LT5jaGFuOworCXN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9wcml2ICpwcml2ID0g Y2hhbi0+cHJpdjsKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfaW1hZ2UgKnNfaW1hZ2UgPSAm Y3R4LT5pbjsKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfaW1hZ2UgKmRfaW1hZ2UgPSAmY3R4 LT5vdXQ7CisJaW50IGRzdF9yb3csIGRzdF9jb2w7CisKKwkvKiB3aXRoIG5vIHJvdGF0aW9uIGl0 J3MgYSAxOjEgbWFwcGluZyAqLworCWlmIChjdHgtPnJvdF9tb2RlID09IElQVV9ST1RBVEVfTk9O RSkKKwkJcmV0dXJuIHNyY19yb3cgKiBzX2ltYWdlLT5udW1fY29scyArIHNyY19jb2w7CisKKwkv KgorCSAqIGJlZm9yZSBkb2luZyB0aGUgdHJhbnNmb3JtLCBmaXJzdCB3ZSBoYXZlIHRvIHRyYW5z bGF0ZQorCSAqIHNvdXJjZSByb3csY29sIGZvciBhbiBvcmlnaW4gaW4gdGhlIGNlbnRlciBvZiBz X2ltYWdlCisJICovCisJc3JjX3JvdyA9IHNyY19yb3cgKiAyIC0gKHNfaW1hZ2UtPm51bV9yb3dz IC0gMSk7CisJc3JjX2NvbCA9IHNyY19jb2wgKiAyIC0gKHNfaW1hZ2UtPm51bV9jb2xzIC0gMSk7 CisKKwkvKiBkbyB0aGUgcm90YXRpb24gdHJhbnNmb3JtICovCisJaWYgKGN0eC0+cm90X21vZGUg JiBJUFVfUk9UX0JJVF85MCkgeworCQlkc3RfY29sID0gLXNyY19yb3c7CisJCWRzdF9yb3cgPSBz cmNfY29sOworCX0gZWxzZSB7CisJCWRzdF9jb2wgPSBzcmNfY29sOworCQlkc3Rfcm93ID0gc3Jj X3JvdzsKKwl9CisKKwkvKiBhcHBseSBmbGlwICovCisJaWYgKGN0eC0+cm90X21vZGUgJiBJUFVf Uk9UX0JJVF9IRkxJUCkKKwkJZHN0X2NvbCA9IC1kc3RfY29sOworCWlmIChjdHgtPnJvdF9tb2Rl ICYgSVBVX1JPVF9CSVRfVkZMSVApCisJCWRzdF9yb3cgPSAtZHN0X3JvdzsKKworCWRldl9kYmco cHJpdi0+aXB1LT5kZXYsICJ0YXNrICV1OiBjdHggJXA6IFslZCwlZF0gLS0+IFslZCwlZF1cbiIs CisJCWNoYW4tPmljX3Rhc2ssIGN0eCwgc3JjX2NvbCwgc3JjX3JvdywgZHN0X2NvbCwgZHN0X3Jv dyk7CisKKwkvKgorCSAqIGZpbmFsbHkgdHJhbnNsYXRlIGRlc3Qgcm93LGNvbCB1c2luZyBhbiBv cmlnaW4gaW4gdXBwZXIKKwkgKiBsZWZ0IG9mIGRfaW1hZ2UKKwkgKi8KKwlkc3Rfcm93ICs9IGRf aW1hZ2UtPm51bV9yb3dzIC0gMTsKKwlkc3RfY29sICs9IGRfaW1hZ2UtPm51bV9jb2xzIC0gMTsK Kwlkc3Rfcm93IC89IDI7CisJZHN0X2NvbCAvPSAyOworCisJcmV0dXJuIGRzdF9yb3cgKiBkX2lt YWdlLT5udW1fY29scyArIGRzdF9jb2w7Cit9CisKKy8qCisgKiBGaWxsIHRoZSBvdXRfdGlsZV9t YXBbXSB3aXRoIHRyYW5zZm9ybWVkIGRlc3RpbmF0aW9uIHRpbGUgaW5kZWNlcy4KKyAqLworc3Rh dGljIHZvaWQgY2FsY19vdXRfdGlsZV9tYXAoc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X2N0eCAq Y3R4KQoreworCXN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9pbWFnZSAqc19pbWFnZSA9ICZjdHgt PmluOworCXVuc2lnbmVkIGludCByb3csIGNvbCwgdGlsZSA9IDA7CisKKwlmb3IgKHJvdyA9IDA7 IHJvdyA8IHNfaW1hZ2UtPm51bV9yb3dzOyByb3crKykgeworCQlmb3IgKGNvbCA9IDA7IGNvbCA8 IHNfaW1hZ2UtPm51bV9jb2xzOyBjb2wrKykgeworCQkJY3R4LT5vdXRfdGlsZV9tYXBbdGlsZV0g PQorCQkJCXRyYW5zZm9ybV90aWxlX2luZGV4KGN0eCwgcm93LCBjb2wpOworCQkJdGlsZSsrOwor CQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjYWxjX3RpbGVfb2Zmc2V0c19wbGFuYXIoc3RydWN0 IGlwdV9pbWFnZV9jb252ZXJ0X2N0eCAqY3R4LAorCQkJCSAgICAgc3RydWN0IGlwdV9pbWFnZV9j b252ZXJ0X2ltYWdlICppbWFnZSkKK3sKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfY2hhbiAq Y2hhbiA9IGN0eC0+Y2hhbjsKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfcHJpdiAqcHJpdiA9 IGNoYW4tPnByaXY7CisJY29uc3Qgc3RydWN0IGlwdV9pbWFnZV9waXhmbXQgKmZtdCA9IGltYWdl LT5mbXQ7CisJdW5zaWduZWQgaW50IHJvdywgY29sLCB0aWxlID0gMDsKKwl1MzIgSCwgdywgaCwg eV9zdHJpZGUsIHV2X3N0cmlkZTsKKwl1MzIgdXZfcm93X29mZiwgdXZfY29sX29mZiwgdXZfb2Zm LCB1X29mZiwgdl9vZmYsIHRtcDsKKwl1MzIgeV9yb3dfb2ZmLCB5X2NvbF9vZmYsIHlfb2ZmOwor CXUzMiB5X3NpemUsIHV2X3NpemU7CisKKwkvKiBzZXR1cCBzb21lIGNvbnZlbmllbmNlIHZhcnMg Ki8KKwlIID0gaW1hZ2UtPmJhc2UucGl4LmhlaWdodDsKKworCXlfc3RyaWRlID0gaW1hZ2UtPnN0 cmlkZTsKKwl1dl9zdHJpZGUgPSB5X3N0cmlkZSAvIGZtdC0+dXZfd2lkdGhfZGVjOworCWlmIChm bXQtPnV2X3BhY2tlZCkKKwkJdXZfc3RyaWRlICo9IDI7CisKKwl5X3NpemUgPSBIICogeV9zdHJp ZGU7CisJdXZfc2l6ZSA9IHlfc2l6ZSAvIChmbXQtPnV2X3dpZHRoX2RlYyAqIGZtdC0+dXZfaGVp Z2h0X2RlYyk7CisKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IGltYWdlLT5udW1fcm93czsgcm93Kysp IHsKKwkJdyA9IGltYWdlLT50aWxlW3RpbGVdLndpZHRoOworCQloID0gaW1hZ2UtPnRpbGVbdGls ZV0uaGVpZ2h0OworCQl5X3Jvd19vZmYgPSByb3cgKiBoICogeV9zdHJpZGU7CisJCXV2X3Jvd19v ZmYgPSAocm93ICogaCAqIHV2X3N0cmlkZSkgLyBmbXQtPnV2X2hlaWdodF9kZWM7CisKKwkJZm9y IChjb2wgPSAwOyBjb2wgPCBpbWFnZS0+bnVtX2NvbHM7IGNvbCsrKSB7CisJCQl5X2NvbF9vZmYg PSBjb2wgKiB3OworCQkJdXZfY29sX29mZiA9IHlfY29sX29mZiAvIGZtdC0+dXZfd2lkdGhfZGVj OworCQkJaWYgKGZtdC0+dXZfcGFja2VkKQorCQkJCXV2X2NvbF9vZmYgKj0gMjsKKworCQkJeV9v ZmYgPSB5X3Jvd19vZmYgKyB5X2NvbF9vZmY7CisJCQl1dl9vZmYgPSB1dl9yb3dfb2ZmICsgdXZf Y29sX29mZjsKKworCQkJdV9vZmYgPSB5X3NpemUgLSB5X29mZiArIHV2X29mZjsKKwkJCXZfb2Zm ID0gKGZtdC0+dXZfcGFja2VkKSA/IDAgOiB1X29mZiArIHV2X3NpemU7CisJCQlpZiAoZm10LT51 dl9zd2FwcGVkKSB7CisJCQkJdG1wID0gdV9vZmY7CisJCQkJdV9vZmYgPSB2X29mZjsKKwkJCQl2 X29mZiA9IHRtcDsKKwkJCX0KKworCQkJaW1hZ2UtPnRpbGVbdGlsZV0ub2Zmc2V0ID0geV9vZmY7 CisJCQlpbWFnZS0+dGlsZVt0aWxlXS51X29mZiA9IHVfb2ZmOworCQkJaW1hZ2UtPnRpbGVbdGls ZSsrXS52X29mZiA9IHZfb2ZmOworCisJCQlkZXZfZGJnKHByaXYtPmlwdS0+ZGV2LAorCQkJCSJ0 YXNrICV1OiBjdHggJXA6ICVzQFslZCwlZF06IHlfb2ZmICUwOHgsIHVfb2ZmICUwOHgsIHZfb2Zm ICUwOHhcbiIsCisJCQkJY2hhbi0+aWNfdGFzaywgY3R4LAorCQkJCWltYWdlLT50eXBlID09IElN QUdFX0NPTlZFUlRfSU4gPworCQkJCSJJbnB1dCIgOiAiT3V0cHV0Iiwgcm93LCBjb2wsCisJCQkJ eV9vZmYsIHVfb2ZmLCB2X29mZik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfdGls ZV9vZmZzZXRzX3BhY2tlZChzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfY3R4ICpjdHgsCisJCQkJ ICAgICBzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfaW1hZ2UgKmltYWdlKQoreworCXN0cnVjdCBp cHVfaW1hZ2VfY29udmVydF9jaGFuICpjaGFuID0gY3R4LT5jaGFuOworCXN0cnVjdCBpcHVfaW1h Z2VfY29udmVydF9wcml2ICpwcml2ID0gY2hhbi0+cHJpdjsKKwljb25zdCBzdHJ1Y3QgaXB1X2lt YWdlX3BpeGZtdCAqZm10ID0gaW1hZ2UtPmZtdDsKKwl1bnNpZ25lZCBpbnQgcm93LCBjb2wsIHRp bGUgPSAwOworCXUzMiB3LCBoLCBicHAsIHN0cmlkZTsKKwl1MzIgcm93X29mZiwgY29sX29mZjsK KworCS8qIHNldHVwIHNvbWUgY29udmVuaWVuY2UgdmFycyAqLworCXN0cmlkZSA9IGltYWdlLT5z dHJpZGU7CisJYnBwID0gZm10LT5icHA7CisKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IGltYWdlLT5u dW1fcm93czsgcm93KyspIHsKKwkJdyA9IGltYWdlLT50aWxlW3RpbGVdLndpZHRoOworCQloID0g aW1hZ2UtPnRpbGVbdGlsZV0uaGVpZ2h0OworCQlyb3dfb2ZmID0gcm93ICogaCAqIHN0cmlkZTsK KworCQlmb3IgKGNvbCA9IDA7IGNvbCA8IGltYWdlLT5udW1fY29sczsgY29sKyspIHsKKwkJCWNv bF9vZmYgPSAoY29sICogdyAqIGJwcCkgPj4gMzsKKworCQkJaW1hZ2UtPnRpbGVbdGlsZV0ub2Zm c2V0ID0gcm93X29mZiArIGNvbF9vZmY7CisJCQlpbWFnZS0+dGlsZVt0aWxlXS51X29mZiA9IDA7 CisJCQlpbWFnZS0+dGlsZVt0aWxlKytdLnZfb2ZmID0gMDsKKworCQkJZGV2X2RiZyhwcml2LT5p cHUtPmRldiwKKwkJCQkidGFzayAldTogY3R4ICVwOiAlc0BbJWQsJWRdOiBwaHlzICUwOHhcbiIs CisJCQkJY2hhbi0+aWNfdGFzaywgY3R4LAorCQkJCWltYWdlLT50eXBlID09IElNQUdFX0NPTlZF UlRfSU4gPworCQkJCSJJbnB1dCIgOiAiT3V0cHV0Iiwgcm93LCBjb2wsCisJCQkJcm93X29mZiAr IGNvbF9vZmYpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjYWxjX3RpbGVfb2Zmc2V0cyhz dHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfY3R4ICpjdHgsCisJCQkgICAgICBzdHJ1Y3QgaXB1X2lt YWdlX2NvbnZlcnRfaW1hZ2UgKmltYWdlKQoreworCWlmIChpbWFnZS0+Zm10LT5wbGFuYXIpCisJ CWNhbGNfdGlsZV9vZmZzZXRzX3BsYW5hcihjdHgsIGltYWdlKTsKKwllbHNlCisJCWNhbGNfdGls ZV9vZmZzZXRzX3BhY2tlZChjdHgsIGltYWdlKTsKK30KKworLyoKKyAqIHJldHVybiB0aGUgbnVt YmVyIG9mIHJ1bnMgaW4gZ2l2ZW4gcXVldWUgKHBlbmRpbmdfcSBvciBkb25lX3EpCisgKiBmb3Ig dGhpcyBjb250ZXh0LiBob2xkIGlycWxvY2sgd2hlbiBjYWxsaW5nLgorICovCitzdGF0aWMgaW50 IGdldF9ydW5fY291bnQoc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X2N0eCAqY3R4LAorCQkJIHN0 cnVjdCBsaXN0X2hlYWQgKnEpCit7CisJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X3J1biAqcnVu OworCWludCBjb3VudCA9IDA7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZjdHgtPmNoYW4tPmly cWxvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShydW4sIHEsIGxpc3QpIHsKKwkJaWYgKHJ1 bi0+Y3R4ID09IGN0eCkKKwkJCWNvdW50Kys7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitz dGF0aWMgdm9pZCBjb252ZXJ0X3N0b3Aoc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X3J1biAqcnVu KQoreworCXN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9jdHggKmN0eCA9IHJ1bi0+Y3R4OworCXN0 cnVjdCBpcHVfaW1hZ2VfY29udmVydF9jaGFuICpjaGFuID0gY3R4LT5jaGFuOworCXN0cnVjdCBp cHVfaW1hZ2VfY29udmVydF9wcml2ICpwcml2ID0gY2hhbi0+cHJpdjsKKworCWRldl9kYmcocHJp di0+aXB1LT5kZXYsICIlczogdGFzayAldTogc3RvcHBpbmcgY3R4ICVwIHJ1biAlcFxuIiwKKwkJ X19mdW5jX18sIGNoYW4tPmljX3Rhc2ssIGN0eCwgcnVuKTsKKworCS8qIGRpc2FibGUgSUMgdGFz a3MgYW5kIHRoZSBjaGFubmVscyAqLworCWlwdV9pY190YXNrX2Rpc2FibGUoY2hhbi0+aWMpOwor CWlwdV9pZG1hY19kaXNhYmxlX2NoYW5uZWwoY2hhbi0+aW5fY2hhbik7CisJaXB1X2lkbWFjX2Rp c2FibGVfY2hhbm5lbChjaGFuLT5vdXRfY2hhbik7CisKKwlpZiAoaXB1X3JvdF9tb2RlX2lzX2ly dChjdHgtPnJvdF9tb2RlKSkgeworCQlpcHVfaWRtYWNfZGlzYWJsZV9jaGFubmVsKGNoYW4tPnJv dGF0aW9uX2luX2NoYW4pOworCQlpcHVfaWRtYWNfZGlzYWJsZV9jaGFubmVsKGNoYW4tPnJvdGF0 aW9uX291dF9jaGFuKTsKKwkJaXB1X2lkbWFjX3VubGluayhjaGFuLT5vdXRfY2hhbiwgY2hhbi0+ cm90YXRpb25faW5fY2hhbik7CisJfQorCisJaXB1X2ljX2Rpc2FibGUoY2hhbi0+aWMpOworfQor CitzdGF0aWMgdm9pZCBpbml0X2lkbWFjX2NoYW5uZWwoc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0 X2N0eCAqY3R4LAorCQkJICAgICAgIHN0cnVjdCBpcHV2M19jaGFubmVsICpjaGFubmVsLAorCQkJ ICAgICAgIHN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9pbWFnZSAqaW1hZ2UsCisJCQkgICAgICAg ZW51bSBpcHVfcm90YXRlX21vZGUgcm90X21vZGUsCisJCQkgICAgICAgYm9vbCByb3Rfc3dhcF93 aWR0aF9oZWlnaHQpCit7CisJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X2NoYW4gKmNoYW4gPSBj dHgtPmNoYW47CisJdW5zaWduZWQgaW50IGJ1cnN0X3NpemU7CisJdTMyIHdpZHRoLCBoZWlnaHQs IHN0cmlkZTsKKwlkbWFfYWRkcl90IGFkZHIwLCBhZGRyMSA9IDA7CisJc3RydWN0IGlwdV9pbWFn ZSB0aWxlX2ltYWdlOworCXVuc2lnbmVkIGludCB0aWxlX2lkeFsyXTsKKworCWlmIChpbWFnZS0+ dHlwZSA9PSBJTUFHRV9DT05WRVJUX09VVCkgeworCQl0aWxlX2lkeFswXSA9IGN0eC0+b3V0X3Rp bGVfbWFwWzBdOworCQl0aWxlX2lkeFsxXSA9IGN0eC0+b3V0X3RpbGVfbWFwWzFdOworCX0gZWxz ZSB7CisJCXRpbGVfaWR4WzBdID0gMDsKKwkJdGlsZV9pZHhbMV0gPSAxOworCX0KKworCWlmIChy b3Rfc3dhcF93aWR0aF9oZWlnaHQpIHsKKwkJd2lkdGggPSBpbWFnZS0+dGlsZVswXS5oZWlnaHQ7 CisJCWhlaWdodCA9IGltYWdlLT50aWxlWzBdLndpZHRoOworCQlzdHJpZGUgPSBpbWFnZS0+dGls ZVswXS5yb3Rfc3RyaWRlOworCQlhZGRyMCA9IGN0eC0+cm90X2ludGVybWVkaWF0ZVswXS5waHlz OworCQlpZiAoY3R4LT5kb3VibGVfYnVmZmVyaW5nKQorCQkJYWRkcjEgPSBjdHgtPnJvdF9pbnRl cm1lZGlhdGVbMV0ucGh5czsKKwl9IGVsc2UgeworCQl3aWR0aCA9IGltYWdlLT50aWxlWzBdLndp ZHRoOworCQloZWlnaHQgPSBpbWFnZS0+dGlsZVswXS5oZWlnaHQ7CisJCXN0cmlkZSA9IGltYWdl LT5zdHJpZGU7CisJCWFkZHIwID0gaW1hZ2UtPmJhc2UucGh5czAgKworCQkJaW1hZ2UtPnRpbGVb dGlsZV9pZHhbMF1dLm9mZnNldDsKKwkJaWYgKGN0eC0+ZG91YmxlX2J1ZmZlcmluZykKKwkJCWFk ZHIxID0gaW1hZ2UtPmJhc2UucGh5czAgKworCQkJCWltYWdlLT50aWxlW3RpbGVfaWR4WzFdXS5v ZmZzZXQ7CisJfQorCisJaXB1X2NwbWVtX3plcm8oY2hhbm5lbCk7CisKKwltZW1zZXQoJnRpbGVf aW1hZ2UsIDAsIHNpemVvZih0aWxlX2ltYWdlKSk7CisJdGlsZV9pbWFnZS5waXgud2lkdGggPSB0 aWxlX2ltYWdlLnJlY3Qud2lkdGggPSB3aWR0aDsKKwl0aWxlX2ltYWdlLnBpeC5oZWlnaHQgPSB0 aWxlX2ltYWdlLnJlY3QuaGVpZ2h0ID0gaGVpZ2h0OworCXRpbGVfaW1hZ2UucGl4LmJ5dGVzcGVy bGluZSA9IHN0cmlkZTsKKwl0aWxlX2ltYWdlLnBpeC5waXhlbGZvcm1hdCA9ICBpbWFnZS0+Zm10 LT5mb3VyY2M7CisJdGlsZV9pbWFnZS5waHlzMCA9IGFkZHIwOworCXRpbGVfaW1hZ2UucGh5czEg PSBhZGRyMTsKKwlpcHVfY3BtZW1fc2V0X2ltYWdlKGNoYW5uZWwsICZ0aWxlX2ltYWdlKTsKKwor CWlmIChpbWFnZS0+Zm10LT5wbGFuYXIgJiYgIXJvdF9zd2FwX3dpZHRoX2hlaWdodCkKKwkJaXB1 X2NwbWVtX3NldF91dl9vZmZzZXQoY2hhbm5lbCwKKwkJCQkJaW1hZ2UtPnRpbGVbdGlsZV9pZHhb MF1dLnVfb2ZmLAorCQkJCQlpbWFnZS0+dGlsZVt0aWxlX2lkeFswXV0udl9vZmYpOworCisJaWYg KHJvdF9tb2RlKQorCQlpcHVfY3BtZW1fc2V0X3JvdGF0aW9uKGNoYW5uZWwsIHJvdF9tb2RlKTsK KworCWlmIChjaGFubmVsID09IGNoYW4tPnJvdGF0aW9uX2luX2NoYW4gfHwKKwkgICAgY2hhbm5l bCA9PSBjaGFuLT5yb3RhdGlvbl9vdXRfY2hhbikgeworCQlidXJzdF9zaXplID0gODsKKwkJaXB1 X2NwbWVtX3NldF9ibG9ja19tb2RlKGNoYW5uZWwpOworCX0gZWxzZQorCQlidXJzdF9zaXplID0g KHdpZHRoICUgMTYpID8gOCA6IDE2OworCisJaXB1X2NwbWVtX3NldF9idXJzdHNpemUoY2hhbm5l bCwgYnVyc3Rfc2l6ZSk7CisKKwlpcHVfaWNfdGFza19pZG1hX2luaXQoY2hhbi0+aWMsIGNoYW5u ZWwsIHdpZHRoLCBoZWlnaHQsCisJCQkgICAgICBidXJzdF9zaXplLCByb3RfbW9kZSk7CisKKwlp cHVfY3BtZW1fc2V0X2F4aV9pZChjaGFubmVsLCAxKTsKKworCWlwdV9pZG1hY19zZXRfZG91Ymxl X2J1ZmZlcihjaGFubmVsLCBjdHgtPmRvdWJsZV9idWZmZXJpbmcpOworfQorCitzdGF0aWMgaW50 IGNvbnZlcnRfc3RhcnQoc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X3J1biAqcnVuKQoreworCXN0 cnVjdCBpcHVfaW1hZ2VfY29udmVydF9jdHggKmN0eCA9IHJ1bi0+Y3R4OworCXN0cnVjdCBpcHVf aW1hZ2VfY29udmVydF9jaGFuICpjaGFuID0gY3R4LT5jaGFuOworCXN0cnVjdCBpcHVfaW1hZ2Vf Y29udmVydF9wcml2ICpwcml2ID0gY2hhbi0+cHJpdjsKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZl cnRfaW1hZ2UgKnNfaW1hZ2UgPSAmY3R4LT5pbjsKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRf aW1hZ2UgKmRfaW1hZ2UgPSAmY3R4LT5vdXQ7CisJZW51bSBpcHVfY29sb3Jfc3BhY2Ugc3JjX2Nz LCBkZXN0X2NzOworCXVuc2lnbmVkIGludCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodDsKKwlpbnQg cmV0OworCisJZGV2X2RiZyhwcml2LT5pcHUtPmRldiwgIiVzOiB0YXNrICV1OiBzdGFydGluZyBj dHggJXAgcnVuICVwXG4iLAorCQlfX2Z1bmNfXywgY2hhbi0+aWNfdGFzaywgY3R4LCBydW4pOwor CisJc3JjX2NzID0gaXB1X3BpeGVsZm9ybWF0X3RvX2NvbG9yc3BhY2Uoc19pbWFnZS0+Zm10LT5m b3VyY2MpOworCWRlc3RfY3MgPSBpcHVfcGl4ZWxmb3JtYXRfdG9fY29sb3JzcGFjZShkX2ltYWdl LT5mbXQtPmZvdXJjYyk7CisKKwlpZiAoaXB1X3JvdF9tb2RlX2lzX2lydChjdHgtPnJvdF9tb2Rl KSkgeworCQkvKiBzd2FwIHdpZHRoL2hlaWdodCBmb3IgcmVzaXplciAqLworCQlkZXN0X3dpZHRo ID0gZF9pbWFnZS0+dGlsZVswXS5oZWlnaHQ7CisJCWRlc3RfaGVpZ2h0ID0gZF9pbWFnZS0+dGls ZVswXS53aWR0aDsKKwl9IGVsc2UgeworCQlkZXN0X3dpZHRoID0gZF9pbWFnZS0+dGlsZVswXS53 aWR0aDsKKwkJZGVzdF9oZWlnaHQgPSBkX2ltYWdlLT50aWxlWzBdLmhlaWdodDsKKwl9CisKKwkv KiBzZXR1cCB0aGUgSUMgcmVzaXplciBhbmQgQ1NDICovCisJcmV0ID0gaXB1X2ljX3Rhc2tfaW5p dChjaGFuLT5pYywKKwkJCSAgICAgICBzX2ltYWdlLT50aWxlWzBdLndpZHRoLAorCQkJICAgICAg IHNfaW1hZ2UtPnRpbGVbMF0uaGVpZ2h0LAorCQkJICAgICAgIGRlc3Rfd2lkdGgsCisJCQkgICAg ICAgZGVzdF9oZWlnaHQsCisJCQkgICAgICAgc3JjX2NzLCBkZXN0X2NzKTsKKwlpZiAocmV0KSB7 CisJCWRldl9lcnIocHJpdi0+aXB1LT5kZXYsICJpcHVfaWNfdGFza19pbml0IGZhaWxlZCwgJWRc biIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogaW5pdCB0aGUgc291cmNlIE1FTS0t PklDIFBQIElETUFDIGNoYW5uZWwgKi8KKwlpbml0X2lkbWFjX2NoYW5uZWwoY3R4LCBjaGFuLT5p bl9jaGFuLCBzX2ltYWdlLAorCQkJICAgSVBVX1JPVEFURV9OT05FLCBmYWxzZSk7CisKKwlpZiAo aXB1X3JvdF9tb2RlX2lzX2lydChjdHgtPnJvdF9tb2RlKSkgeworCQkvKiBpbml0IHRoZSBJQyBQ UC0tPk1FTSBJRE1BQyBjaGFubmVsICovCisJCWluaXRfaWRtYWNfY2hhbm5lbChjdHgsIGNoYW4t Pm91dF9jaGFuLCBkX2ltYWdlLAorCQkJCSAgIElQVV9ST1RBVEVfTk9ORSwgdHJ1ZSk7CisKKwkJ LyogaW5pdCB0aGUgTUVNLS0+SUMgUFAgUk9UIElETUFDIGNoYW5uZWwgKi8KKwkJaW5pdF9pZG1h Y19jaGFubmVsKGN0eCwgY2hhbi0+cm90YXRpb25faW5fY2hhbiwgZF9pbWFnZSwKKwkJCQkgICBj dHgtPnJvdF9tb2RlLCB0cnVlKTsKKworCQkvKiBpbml0IHRoZSBkZXN0aW5hdGlvbiBJQyBQUCBS T1QtLT5NRU0gSURNQUMgY2hhbm5lbCAqLworCQlpbml0X2lkbWFjX2NoYW5uZWwoY3R4LCBjaGFu LT5yb3RhdGlvbl9vdXRfY2hhbiwgZF9pbWFnZSwKKwkJCQkgICBJUFVfUk9UQVRFX05PTkUsIGZh bHNlKTsKKworCQkvKiBub3cgbGluayBJQyBQUC0tPk1FTSB0byBNRU0tLT5JQyBQUCBST1QgKi8K KwkJaXB1X2lkbWFjX2xpbmsoY2hhbi0+b3V0X2NoYW4sIGNoYW4tPnJvdGF0aW9uX2luX2NoYW4p OworCX0gZWxzZSB7CisJCS8qIGluaXQgdGhlIGRlc3RpbmF0aW9uIElDIFBQLS0+TUVNIElETUFD IGNoYW5uZWwgKi8KKwkJaW5pdF9pZG1hY19jaGFubmVsKGN0eCwgY2hhbi0+b3V0X2NoYW4sIGRf aW1hZ2UsCisJCQkJICAgY3R4LT5yb3RfbW9kZSwgZmFsc2UpOworCX0KKworCS8qIGVuYWJsZSB0 aGUgSUMgKi8KKwlpcHVfaWNfZW5hYmxlKGNoYW4tPmljKTsKKworCS8qIHNldCBidWZmZXJzIHJl YWR5ICovCisJaXB1X2lkbWFjX3NlbGVjdF9idWZmZXIoY2hhbi0+aW5fY2hhbiwgMCk7CisJaXB1 X2lkbWFjX3NlbGVjdF9idWZmZXIoY2hhbi0+b3V0X2NoYW4sIDApOworCWlmIChpcHVfcm90X21v ZGVfaXNfaXJ0KGN0eC0+cm90X21vZGUpKQorCQlpcHVfaWRtYWNfc2VsZWN0X2J1ZmZlcihjaGFu LT5yb3RhdGlvbl9vdXRfY2hhbiwgMCk7CisJaWYgKGN0eC0+ZG91YmxlX2J1ZmZlcmluZykgewor CQlpcHVfaWRtYWNfc2VsZWN0X2J1ZmZlcihjaGFuLT5pbl9jaGFuLCAxKTsKKwkJaXB1X2lkbWFj X3NlbGVjdF9idWZmZXIoY2hhbi0+b3V0X2NoYW4sIDEpOworCQlpZiAoaXB1X3JvdF9tb2RlX2lz X2lydChjdHgtPnJvdF9tb2RlKSkKKwkJCWlwdV9pZG1hY19zZWxlY3RfYnVmZmVyKGNoYW4tPnJv dGF0aW9uX291dF9jaGFuLCAxKTsKKwl9CisKKwkvKiBlbmFibGUgdGhlIGNoYW5uZWxzISAqLwor CWlwdV9pZG1hY19lbmFibGVfY2hhbm5lbChjaGFuLT5pbl9jaGFuKTsKKwlpcHVfaWRtYWNfZW5h YmxlX2NoYW5uZWwoY2hhbi0+b3V0X2NoYW4pOworCWlmIChpcHVfcm90X21vZGVfaXNfaXJ0KGN0 eC0+cm90X21vZGUpKSB7CisJCWlwdV9pZG1hY19lbmFibGVfY2hhbm5lbChjaGFuLT5yb3RhdGlv bl9pbl9jaGFuKTsKKwkJaXB1X2lkbWFjX2VuYWJsZV9jaGFubmVsKGNoYW4tPnJvdGF0aW9uX291 dF9jaGFuKTsKKwl9CisKKwlpcHVfaWNfdGFza19lbmFibGUoY2hhbi0+aWMpOworCisJaXB1X2Nw bWVtX2R1bXAoY2hhbi0+aW5fY2hhbik7CisJaXB1X2NwbWVtX2R1bXAoY2hhbi0+b3V0X2NoYW4p OworCWlmIChpcHVfcm90X21vZGVfaXNfaXJ0KGN0eC0+cm90X21vZGUpKSB7CisJCWlwdV9jcG1l bV9kdW1wKGNoYW4tPnJvdGF0aW9uX2luX2NoYW4pOworCQlpcHVfY3BtZW1fZHVtcChjaGFuLT5y b3RhdGlvbl9vdXRfY2hhbik7CisJfQorCisJaXB1X2R1bXAocHJpdi0+aXB1KTsKKworCXJldHVy biAwOworfQorCisvKiBob2xkIGlycWxvY2sgd2hlbiBjYWxsaW5nICovCitzdGF0aWMgaW50IGRv X3J1bihzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfcnVuICpydW4pCit7CisJc3RydWN0IGlwdV9p bWFnZV9jb252ZXJ0X2N0eCAqY3R4ID0gcnVuLT5jdHg7CisJc3RydWN0IGlwdV9pbWFnZV9jb252 ZXJ0X2NoYW4gKmNoYW4gPSBjdHgtPmNoYW47CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZjaGFu LT5pcnFsb2NrKTsKKworCWN0eC0+aW4uYmFzZS5waHlzMCA9IHJ1bi0+aW5fcGh5czsKKwljdHgt Pm91dC5iYXNlLnBoeXMwID0gcnVuLT5vdXRfcGh5czsKKworCWN0eC0+Y3VyX2J1Zl9udW0gPSAw OworCWN0eC0+bmV4dF90aWxlID0gMTsKKworCS8qIHJlbW92ZSBydW4gZnJvbSBwZW5kaW5nX3Eg YW5kIHNldCBhcyBjdXJyZW50ICovCisJbGlzdF9kZWwoJnJ1bi0+bGlzdCk7CisJY2hhbi0+Y3Vy cmVudF9ydW4gPSBydW47CisKKwlyZXR1cm4gY29udmVydF9zdGFydChydW4pOworfQorCisvKiBo b2xkIGlycWxvY2sgd2hlbiBjYWxsaW5nICovCitzdGF0aWMgdm9pZCBydW5fbmV4dChzdHJ1Y3Qg aXB1X2ltYWdlX2NvbnZlcnRfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZl cnRfcHJpdiAqcHJpdiA9IGNoYW4tPnByaXY7CisJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X3J1 biAqcnVuLCAqdG1wOworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZjaGFuLT5p cnFsb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShydW4sIHRtcCwgJmNoYW4tPnBl bmRpbmdfcSwgbGlzdCkgeworCQkvKiBza2lwIGNvbnRleHRzIHRoYXQgYXJlIGFib3J0aW5nICov CisJCWlmIChydW4tPmN0eC0+YWJvcnRpbmcpIHsKKwkJCWRldl9kYmcocHJpdi0+aXB1LT5kZXYs CisJCQkJIiVzOiB0YXNrICV1OiBza2lwcGluZyBhYm9ydGluZyBjdHggJXAgcnVuICVwXG4iLAor CQkJCV9fZnVuY19fLCBjaGFuLT5pY190YXNrLCBydW4tPmN0eCwgcnVuKTsKKwkJCWNvbnRpbnVl OworCQl9CisKKwkJcmV0ID0gZG9fcnVuKHJ1bik7CisJCWlmICghcmV0KQorCQkJYnJlYWs7CisK KwkJLyoKKwkJICogc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCBzdGFydCwgYWRkIHRoZSBydW4K KwkJICogdG8gZG9uZSBxIGFuZCBjb250aW51ZSB0byB0aGUgbmV4dCBydW4gaW4gdGhlCisJCSAq IHBlbmRpbmcgcS4KKwkJICovCisJCXJ1bi0+c3RhdHVzID0gcmV0OworCQlsaXN0X2FkZF90YWls KCZydW4tPmxpc3QsICZjaGFuLT5kb25lX3EpOworCQljaGFuLT5jdXJyZW50X3J1biA9IE5VTEw7 CisJfQorfQorCitzdGF0aWMgdm9pZCBlbXB0eV9kb25lX3Eoc3RydWN0IGlwdV9pbWFnZV9jb252 ZXJ0X2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X3ByaXYgKnByaXYg PSBjaGFuLT5wcml2OworCXN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9ydW4gKnJ1bjsKKwl1bnNp Z25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmlycWxvY2ssIGZs YWdzKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmY2hhbi0+ZG9uZV9xKSkgeworCQlydW4gPSBs aXN0X2VudHJ5KGNoYW4tPmRvbmVfcS5uZXh0LAorCQkJCSBzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZl cnRfcnVuLAorCQkJCSBsaXN0KTsKKworCQlsaXN0X2RlbCgmcnVuLT5saXN0KTsKKworCQlkZXZf ZGJnKHByaXYtPmlwdS0+ZGV2LAorCQkJIiVzOiB0YXNrICV1OiBjb21wbGV0aW5nIGN0eCAlcCBy dW4gJXAgd2l0aCAlZFxuIiwKKwkJCV9fZnVuY19fLCBjaGFuLT5pY190YXNrLCBydW4tPmN0eCwg cnVuLCBydW4tPnN0YXR1cyk7CisKKwkJLyogY2FsbCB0aGUgY29tcGxldGlvbiBjYWxsYmFjayBh bmQgZnJlZSB0aGUgcnVuICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmlycWxv Y2ssIGZsYWdzKTsKKwkJcnVuLT5jdHgtPmNvbXBsZXRlKHJ1biwgcnVuLT5jdHgtPmNvbXBsZXRl X2NvbnRleHQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+aXJxbG9jaywgZmxhZ3MpOwor CX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmlycWxvY2ssIGZsYWdzKTsKK30K KworLyoKKyAqIHRoZSBib3R0b20gaGFsZiB0aHJlYWQgY2xlYXJzIG91dCB0aGUgZG9uZV9xLCBj YWxsaW5nIHRoZQorICogY29tcGxldGlvbiBoYW5kbGVyIGZvciBlYWNoLgorICovCitzdGF0aWMg aXJxcmV0dXJuX3QgZG9fYmgoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBpcHVf aW1hZ2VfY29udmVydF9jaGFuICpjaGFuID0gZGV2X2lkOworCXN0cnVjdCBpcHVfaW1hZ2VfY29u dmVydF9wcml2ICpwcml2ID0gY2hhbi0+cHJpdjsKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRf Y3R4ICpjdHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcocHJpdi0+aXB1LT5k ZXYsICIlczogdGFzayAldTogZW50ZXJcbiIsIF9fZnVuY19fLAorCQljaGFuLT5pY190YXNrKTsK KworCWVtcHR5X2RvbmVfcShjaGFuKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5pcnFs b2NrLCBmbGFncyk7CisKKwkvKgorCSAqIHRoZSBkb25lX3EgaXMgY2xlYXJlZCBvdXQsIHNpZ25h bCBhbnkgY29udGV4dHMKKwkgKiB0aGF0IGFyZSBhYm9ydGluZyB0aGF0IGFib3J0IGNhbiBjb21w bGV0ZS4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0eCwgJmNoYW4tPmN0eF9saXN0LCBs aXN0KSB7CisJCWlmIChjdHgtPmFib3J0aW5nKSB7CisJCQlkZXZfZGJnKHByaXYtPmlwdS0+ZGV2 LAorCQkJCSIlczogdGFzayAldTogc2lnbmFsaW5nIGFib3J0IGZvciBjdHggJXBcbiIsCisJCQkJ X19mdW5jX18sIGNoYW4tPmljX3Rhc2ssIGN0eCk7CisJCQljb21wbGV0ZSgmY3R4LT5hYm9ydGVk KTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmlycWxvY2ssIGZs YWdzKTsKKworCWRldl9kYmcocHJpdi0+aXB1LT5kZXYsICIlczogdGFzayAldTogZXhpdFxuIiwg X19mdW5jX18sCisJCWNoYW4tPmljX3Rhc2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQor CisvKiBob2xkIGlycWxvY2sgd2hlbiBjYWxsaW5nICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZG9f aXJxKHN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9ydW4gKnJ1bikKK3sKKwlzdHJ1Y3QgaXB1X2lt YWdlX2NvbnZlcnRfY3R4ICpjdHggPSBydW4tPmN0eDsKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZl cnRfY2hhbiAqY2hhbiA9IGN0eC0+Y2hhbjsKKwlzdHJ1Y3QgaXB1X2ltYWdlX3RpbGUgKnNyY190 aWxlLCAqZHN0X3RpbGU7CisJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X2ltYWdlICpzX2ltYWdl ID0gJmN0eC0+aW47CisJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X2ltYWdlICpkX2ltYWdlID0g JmN0eC0+b3V0OworCXN0cnVjdCBpcHV2M19jaGFubmVsICpvdXRjaDsKKwl1bnNpZ25lZCBpbnQg ZHN0X2lkeDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmNoYW4tPmlycWxvY2spOworCisJb3V0 Y2ggPSBpcHVfcm90X21vZGVfaXNfaXJ0KGN0eC0+cm90X21vZGUpID8KKwkJY2hhbi0+cm90YXRp b25fb3V0X2NoYW4gOiBjaGFuLT5vdXRfY2hhbjsKKworCS8qCisJICogSXQgaXMgZGlmZmljdWx0 IHRvIHN0b3AgdGhlIGNoYW5uZWwgRE1BIGJlZm9yZSB0aGUgY2hhbm5lbHMKKwkgKiBlbnRlciB0 aGUgcGF1c2VkIHN0YXRlLiBXaXRob3V0IGRvdWJsZS1idWZmZXJpbmcgdGhlIGNoYW5uZWxzCisJ ICogYXJlIGFsd2F5cyBpbiBhIHBhdXNlZCBzdGF0ZSB3aGVuIHRoZSBFT0YgaXJxIG9jY3Vycywg c28gaXQKKwkgKiBpcyBzYWZlIHRvIHN0b3AgdGhlIGNoYW5uZWxzIG5vdy4gRm9yIGRvdWJsZS1i dWZmZXJpbmcgd2UKKwkgKiBqdXN0IGlnbm9yZSB0aGUgYWJvcnQgdW50aWwgdGhlIG9wZXJhdGlv biBjb21wbGV0ZXMsIHdoZW4gaXQKKwkgKiBpcyBzYWZlIHRvIHNodXQgZG93bi4KKwkgKi8KKwlp ZiAoY3R4LT5hYm9ydGluZyAmJiAhY3R4LT5kb3VibGVfYnVmZmVyaW5nKSB7CisJCWNvbnZlcnRf c3RvcChydW4pOworCQlydW4tPnN0YXR1cyA9IC1FSU87CisJCWdvdG8gZG9uZTsKKwl9CisKKwlp ZiAoY3R4LT5uZXh0X3RpbGUgPT0gY3R4LT5udW1fdGlsZXMpIHsKKwkJLyoKKwkJICogdGhlIGNv bnZlcnNpb24gaXMgY29tcGxldGUKKwkJICovCisJCWNvbnZlcnRfc3RvcChydW4pOworCQlydW4t PnN0YXR1cyA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIG5vdCBkb25lLCBwbGFj ZSB0aGUgbmV4dCB0aWxlIGJ1ZmZlcnMuCisJICovCisJaWYgKCFjdHgtPmRvdWJsZV9idWZmZXJp bmcpIHsKKworCQlzcmNfdGlsZSA9ICZzX2ltYWdlLT50aWxlW2N0eC0+bmV4dF90aWxlXTsKKwkJ ZHN0X2lkeCA9IGN0eC0+b3V0X3RpbGVfbWFwW2N0eC0+bmV4dF90aWxlXTsKKwkJZHN0X3RpbGUg PSAmZF9pbWFnZS0+dGlsZVtkc3RfaWR4XTsKKworCQlpcHVfY3BtZW1fc2V0X2J1ZmZlcihjaGFu LT5pbl9jaGFuLCAwLAorCQkJCSAgICAgc19pbWFnZS0+YmFzZS5waHlzMCArIHNyY190aWxlLT5v ZmZzZXQpOworCQlpcHVfY3BtZW1fc2V0X2J1ZmZlcihvdXRjaCwgMCwKKwkJCQkgICAgIGRfaW1h Z2UtPmJhc2UucGh5czAgKyBkc3RfdGlsZS0+b2Zmc2V0KTsKKwkJaWYgKHNfaW1hZ2UtPmZtdC0+ cGxhbmFyKQorCQkJaXB1X2NwbWVtX3NldF91dl9vZmZzZXQoY2hhbi0+aW5fY2hhbiwKKwkJCQkJ CXNyY190aWxlLT51X29mZiwKKwkJCQkJCXNyY190aWxlLT52X29mZik7CisJCWlmIChkX2ltYWdl LT5mbXQtPnBsYW5hcikKKwkJCWlwdV9jcG1lbV9zZXRfdXZfb2Zmc2V0KG91dGNoLAorCQkJCQkJ ZHN0X3RpbGUtPnVfb2ZmLAorCQkJCQkJZHN0X3RpbGUtPnZfb2ZmKTsKKworCQlpcHVfaWRtYWNf c2VsZWN0X2J1ZmZlcihjaGFuLT5pbl9jaGFuLCAwKTsKKwkJaXB1X2lkbWFjX3NlbGVjdF9idWZm ZXIob3V0Y2gsIDApOworCisJfSBlbHNlIGlmIChjdHgtPm5leHRfdGlsZSA8IGN0eC0+bnVtX3Rp bGVzIC0gMSkgeworCisJCXNyY190aWxlID0gJnNfaW1hZ2UtPnRpbGVbY3R4LT5uZXh0X3RpbGUg KyAxXTsKKwkJZHN0X2lkeCA9IGN0eC0+b3V0X3RpbGVfbWFwW2N0eC0+bmV4dF90aWxlICsgMV07 CisJCWRzdF90aWxlID0gJmRfaW1hZ2UtPnRpbGVbZHN0X2lkeF07CisKKwkJaXB1X2NwbWVtX3Nl dF9idWZmZXIoY2hhbi0+aW5fY2hhbiwgY3R4LT5jdXJfYnVmX251bSwKKwkJCQkgICAgIHNfaW1h Z2UtPmJhc2UucGh5czAgKyBzcmNfdGlsZS0+b2Zmc2V0KTsKKwkJaXB1X2NwbWVtX3NldF9idWZm ZXIob3V0Y2gsIGN0eC0+Y3VyX2J1Zl9udW0sCisJCQkJICAgICBkX2ltYWdlLT5iYXNlLnBoeXMw ICsgZHN0X3RpbGUtPm9mZnNldCk7CisKKwkJaXB1X2lkbWFjX3NlbGVjdF9idWZmZXIoY2hhbi0+ aW5fY2hhbiwgY3R4LT5jdXJfYnVmX251bSk7CisJCWlwdV9pZG1hY19zZWxlY3RfYnVmZmVyKG91 dGNoLCBjdHgtPmN1cl9idWZfbnVtKTsKKworCQljdHgtPmN1cl9idWZfbnVtIF49IDE7CisJfQor CisJY3R4LT5uZXh0X3RpbGUrKzsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Citkb25lOgorCWxpc3Rf YWRkX3RhaWwoJnJ1bi0+bGlzdCwgJmNoYW4tPmRvbmVfcSk7CisJY2hhbi0+Y3VycmVudF9ydW4g PSBOVUxMOworCXJ1bl9uZXh0KGNoYW4pOworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Cit9CisK K3N0YXRpYyBpcnFyZXR1cm5fdCBub3JvdGF0ZV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sK KwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfY2hhbiAqY2hhbiA9IGRhdGE7CisJc3RydWN0IGlw dV9pbWFnZV9jb252ZXJ0X2N0eCAqY3R4OworCXN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9ydW4g KnJ1bjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlycXJldHVybl90IHJldDsKKworCXNwaW5f bG9ja19pcnFzYXZlKCZjaGFuLT5pcnFsb2NrLCBmbGFncyk7CisKKwkvKiBnZXQgY3VycmVudCBy dW4gYW5kIGl0cyBjb250ZXh0ICovCisJcnVuID0gY2hhbi0+Y3VycmVudF9ydW47CisJaWYgKCFy dW4pIHsKKwkJcmV0ID0gSVJRX05PTkU7CisJCWdvdG8gb3V0OworCX0KKworCWN0eCA9IHJ1bi0+ Y3R4OworCisJaWYgKGlwdV9yb3RfbW9kZV9pc19pcnQoY3R4LT5yb3RfbW9kZSkpIHsKKwkJLyog dGhpcyBpcyBhIHJvdGF0aW9uIG9wZXJhdGlvbiwganVzdCBpZ25vcmUgKi8KKwkJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmY2hhbi0+aXJxbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gSVJRX0hBTkRM RUQ7CisJfQorCisJcmV0ID0gZG9faXJxKHJ1bik7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmY2hhbi0+aXJxbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBp cnFyZXR1cm5fdCByb3RhdGVfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlw dV9pbWFnZV9jb252ZXJ0X2NoYW4gKmNoYW4gPSBkYXRhOworCXN0cnVjdCBpcHVfaW1hZ2VfY29u dmVydF9wcml2ICpwcml2ID0gY2hhbi0+cHJpdjsKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRf Y3R4ICpjdHg7CisJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X3J1biAqcnVuOworCXVuc2lnbmVk IGxvbmcgZmxhZ3M7CisJaXJxcmV0dXJuX3QgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNo YW4tPmlycWxvY2ssIGZsYWdzKTsKKworCS8qIGdldCBjdXJyZW50IHJ1biBhbmQgaXRzIGNvbnRl eHQgKi8KKwlydW4gPSBjaGFuLT5jdXJyZW50X3J1bjsKKwlpZiAoIXJ1bikgeworCQlyZXQgPSBJ UlFfTk9ORTsKKwkJZ290byBvdXQ7CisJfQorCisJY3R4ID0gcnVuLT5jdHg7CisKKwlpZiAoIWlw dV9yb3RfbW9kZV9pc19pcnQoY3R4LT5yb3RfbW9kZSkpIHsKKwkJLyogdGhpcyB3YXMgTk9UIGEg cm90YXRpb24gb3BlcmF0aW9uLCBzaG91bGRuJ3QgaGFwcGVuICovCisJCWRldl9lcnIocHJpdi0+ aXB1LT5kZXYsICJVbmV4cGVjdGVkIHJvdGF0aW9uIGludGVycnVwdFxuIik7CisJCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmNoYW4tPmlycWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIElSUV9IQU5E TEVEOworCX0KKworCXJldCA9IGRvX2lycShydW4pOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJmNoYW4tPmlycWxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICog dHJ5IHRvIGZvcmNlIHRoZSBjb21wbGV0aW9uIG9mIHJ1bnMgZm9yIHRoaXMgY3R4LiBDYWxsZWQg d2hlbgorICogYWJvcnQgd2FpdCB0aW1lcyBvdXQgaW4gaXB1X2ltYWdlX2NvbnZlcnRfYWJvcnQo KS4KKyAqLworc3RhdGljIHZvaWQgZm9yY2VfYWJvcnQoc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0 X2N0eCAqY3R4KQoreworCXN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9jaGFuICpjaGFuID0gY3R4 LT5jaGFuOworCXN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9ydW4gKnJ1bjsKKwl1bnNpZ25lZCBs b25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmlycWxvY2ssIGZsYWdzKTsK KworCXJ1biA9IGNoYW4tPmN1cnJlbnRfcnVuOworCWlmIChydW4gJiYgcnVuLT5jdHggPT0gY3R4 KSB7CisJCWNvbnZlcnRfc3RvcChydW4pOworCQlydW4tPnN0YXR1cyA9IC1FSU87CisJCWxpc3Rf YWRkX3RhaWwoJnJ1bi0+bGlzdCwgJmNoYW4tPmRvbmVfcSk7CisJCWNoYW4tPmN1cnJlbnRfcnVu ID0gTlVMTDsKKwkJcnVuX25leHQoY2hhbik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmY2hhbi0+aXJxbG9jaywgZmxhZ3MpOworCisJZW1wdHlfZG9uZV9xKGNoYW4pOworfQorCitz dGF0aWMgdm9pZCByZWxlYXNlX2lwdV9yZXNvdXJjZXMoc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0 X2NoYW4gKmNoYW4pCit7CisJaWYgKGNoYW4tPm91dF9lb2ZfaXJxID49IDApCisJCWZyZWVfaXJx KGNoYW4tPm91dF9lb2ZfaXJxLCBjaGFuKTsKKwlpZiAoY2hhbi0+cm90X291dF9lb2ZfaXJxID49 IDApCisJCWZyZWVfaXJxKGNoYW4tPnJvdF9vdXRfZW9mX2lycSwgY2hhbik7CisKKwlpZiAoIUlT X0VSUl9PUl9OVUxMKGNoYW4tPmluX2NoYW4pKQorCQlpcHVfaWRtYWNfcHV0KGNoYW4tPmluX2No YW4pOworCWlmICghSVNfRVJSX09SX05VTEwoY2hhbi0+b3V0X2NoYW4pKQorCQlpcHVfaWRtYWNf cHV0KGNoYW4tPm91dF9jaGFuKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGNoYW4tPnJvdGF0aW9u X2luX2NoYW4pKQorCQlpcHVfaWRtYWNfcHV0KGNoYW4tPnJvdGF0aW9uX2luX2NoYW4pOworCWlm ICghSVNfRVJSX09SX05VTEwoY2hhbi0+cm90YXRpb25fb3V0X2NoYW4pKQorCQlpcHVfaWRtYWNf cHV0KGNoYW4tPnJvdGF0aW9uX291dF9jaGFuKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGNoYW4t PmljKSkKKwkJaXB1X2ljX3B1dChjaGFuLT5pYyk7CisKKwljaGFuLT5pbl9jaGFuID0gY2hhbi0+ b3V0X2NoYW4gPSBjaGFuLT5yb3RhdGlvbl9pbl9jaGFuID0KKwkJY2hhbi0+cm90YXRpb25fb3V0 X2NoYW4gPSBOVUxMOworCWNoYW4tPm91dF9lb2ZfaXJxID0gY2hhbi0+cm90X291dF9lb2ZfaXJx ID0gLTE7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2lwdV9yZXNvdXJjZXMoc3RydWN0IGlwdV9pbWFn ZV9jb252ZXJ0X2NoYW4gKmNoYW4pCit7CisJY29uc3Qgc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0 X2RtYV9jaGFuICpkbWEgPSBjaGFuLT5kbWFfY2g7CisJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0 X3ByaXYgKnByaXYgPSBjaGFuLT5wcml2OworCWludCByZXQ7CisKKwkvKiBnZXQgSUMgKi8KKwlj aGFuLT5pYyA9IGlwdV9pY19nZXQocHJpdi0+aXB1LCBjaGFuLT5pY190YXNrKTsKKwlpZiAoSVNf RVJSKGNoYW4tPmljKSkgeworCQlkZXZfZXJyKHByaXYtPmlwdS0+ZGV2LCAiY291bGQgbm90IGFj cXVpcmUgSUNcbiIpOworCQlyZXQgPSBQVFJfRVJSKGNoYW4tPmljKTsKKwkJZ290byBlcnI7CisJ fQorCisJLyogZ2V0IElETUFDIGNoYW5uZWxzICovCisJY2hhbi0+aW5fY2hhbiA9IGlwdV9pZG1h Y19nZXQocHJpdi0+aXB1LCBkbWEtPmluKTsKKwljaGFuLT5vdXRfY2hhbiA9IGlwdV9pZG1hY19n ZXQocHJpdi0+aXB1LCBkbWEtPm91dCk7CisJaWYgKElTX0VSUihjaGFuLT5pbl9jaGFuKSB8fCBJ U19FUlIoY2hhbi0+b3V0X2NoYW4pKSB7CisJCWRldl9lcnIocHJpdi0+aXB1LT5kZXYsICJjb3Vs ZCBub3QgYWNxdWlyZSBpZG1hYyBjaGFubmVsc1xuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290 byBlcnI7CisJfQorCisJY2hhbi0+cm90YXRpb25faW5fY2hhbiA9IGlwdV9pZG1hY19nZXQocHJp di0+aXB1LCBkbWEtPnJvdF9pbik7CisJY2hhbi0+cm90YXRpb25fb3V0X2NoYW4gPSBpcHVfaWRt YWNfZ2V0KHByaXYtPmlwdSwgZG1hLT5yb3Rfb3V0KTsKKwlpZiAoSVNfRVJSKGNoYW4tPnJvdGF0 aW9uX2luX2NoYW4pIHx8IElTX0VSUihjaGFuLT5yb3RhdGlvbl9vdXRfY2hhbikpIHsKKwkJZGV2 X2Vycihwcml2LT5pcHUtPmRldiwKKwkJCSJjb3VsZCBub3QgYWNxdWlyZSBpZG1hYyByb3RhdGlv biBjaGFubmVsc1xuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJLyog YWNxdWlyZSB0aGUgRU9GIGludGVycnVwdHMgKi8KKwljaGFuLT5vdXRfZW9mX2lycSA9IGlwdV9p ZG1hY19jaGFubmVsX2lycShwcml2LT5pcHUsCisJCQkJCQkgIGNoYW4tPm91dF9jaGFuLAorCQkJ CQkJICBJUFVfSVJRX0VPRik7CisKKwlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjaGFuLT5v dXRfZW9mX2lycSwgbm9yb3RhdGVfaXJxLCBkb19iaCwKKwkJCQkgICAwLCAiaXB1LWljIiwgY2hh bik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihwcml2LT5pcHUtPmRldiwgImNvdWxkIG5v dCBhY3F1aXJlIGlycSAlZFxuIiwKKwkJCSBjaGFuLT5vdXRfZW9mX2lycSk7CisJCWNoYW4tPm91 dF9lb2ZfaXJxID0gLTE7CisJCWdvdG8gZXJyOworCX0KKworCWNoYW4tPnJvdF9vdXRfZW9mX2ly cSA9IGlwdV9pZG1hY19jaGFubmVsX2lycShwcml2LT5pcHUsCisJCQkJCQkgICAgIGNoYW4tPnJv dGF0aW9uX291dF9jaGFuLAorCQkJCQkJICAgICBJUFVfSVJRX0VPRik7CisKKwlyZXQgPSByZXF1 ZXN0X3RocmVhZGVkX2lycShjaGFuLT5yb3Rfb3V0X2VvZl9pcnEsIHJvdGF0ZV9pcnEsIGRvX2Jo LAorCQkJCSAgIDAsICJpcHUtaWMiLCBjaGFuKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJy KHByaXYtPmlwdS0+ZGV2LCAiY291bGQgbm90IGFjcXVpcmUgaXJxICVkXG4iLAorCQkJY2hhbi0+ cm90X291dF9lb2ZfaXJxKTsKKwkJY2hhbi0+cm90X291dF9lb2ZfaXJxID0gLTE7CisJCWdvdG8g ZXJyOworCX0KKworCXJldHVybiAwOworZXJyOgorCXJlbGVhc2VfaXB1X3Jlc291cmNlcyhjaGFu KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZpbGxfaW1hZ2Uoc3RydWN0IGlwdV9p bWFnZV9jb252ZXJ0X2N0eCAqY3R4LAorCQkgICAgICBzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRf aW1hZ2UgKmljX2ltYWdlLAorCQkgICAgICBzdHJ1Y3QgaXB1X2ltYWdlICppbWFnZSwKKwkJICAg ICAgZW51bSBpcHVfaW1hZ2VfY29udmVydF90eXBlIHR5cGUpCit7CisJc3RydWN0IGlwdV9pbWFn ZV9jb252ZXJ0X3ByaXYgKnByaXYgPSBjdHgtPmNoYW4tPnByaXY7CisKKwlpY19pbWFnZS0+YmFz ZSA9ICppbWFnZTsKKwlpY19pbWFnZS0+dHlwZSA9IHR5cGU7CisKKwlpY19pbWFnZS0+Zm10ID0g Z2V0X2Zvcm1hdChpbWFnZS0+cGl4LnBpeGVsZm9ybWF0KTsKKwlpZiAoIWljX2ltYWdlLT5mbXQp IHsKKwkJZGV2X2Vycihwcml2LT5pcHUtPmRldiwgInBpeGVsZm9ybWF0IG5vdCBzdXBwb3J0ZWQg Zm9yICVzXG4iLAorCQkJdHlwZSA9PSBJTUFHRV9DT05WRVJUX09VVCA/ICJPdXRwdXQiIDogIklu cHV0Iik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpY19pbWFnZS0+Zm10LT5wbGFu YXIpCisJCWljX2ltYWdlLT5zdHJpZGUgPSBpY19pbWFnZS0+YmFzZS5waXgud2lkdGg7CisJZWxz ZQorCQlpY19pbWFnZS0+c3RyaWRlICA9IGljX2ltYWdlLT5iYXNlLnBpeC5ieXRlc3BlcmxpbmU7 CisKKwljYWxjX3RpbGVfZGltZW5zaW9ucyhjdHgsIGljX2ltYWdlKTsKKwljYWxjX3RpbGVfb2Zm c2V0cyhjdHgsIGljX2ltYWdlKTsKKworCXJldHVybiAwOworfQorCisvKiBib3Jyb3dlZCBmcm9t IGRyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItY29tbW9uLmMgKi8KK3N0YXRpYyB1bnNpZ25l ZCBpbnQgY2xhbXBfYWxpZ24odW5zaWduZWQgaW50IHgsIHVuc2lnbmVkIGludCBtaW4sCisJCQkJ dW5zaWduZWQgaW50IG1heCwgdW5zaWduZWQgaW50IGFsaWduKQoreworCS8qIEJpdHMgdGhhdCBt dXN0IGJlIHplcm8gdG8gYmUgYWxpZ25lZCAqLworCXVuc2lnbmVkIGludCBtYXNrID0gfigoMSA8 PCBhbGlnbikgLSAxKTsKKworCS8qIENsYW1wIHRvIGFsaWduZWQgbWluIGFuZCBtYXggKi8KKwl4 ID0gY2xhbXAoeCwgKG1pbiArIH5tYXNrKSAmIG1hc2ssIG1heCAmIG1hc2spOworCisJLyogUm91 bmQgdG8gbmVhcmVzdCBhbGlnbmVkIHZhbHVlICovCisJaWYgKGFsaWduKQorCQl4ID0gKHggKyAo MSA8PCAoYWxpZ24gLSAxKSkpICYgbWFzazsKKworCXJldHVybiB4OworfQorCisvKgorICogV2Ug aGF2ZSB0byBhZGp1c3QgdGhlIHRpbGUgd2lkdGggc3VjaCB0aGF0IHRoZSB0aWxlIHBoeXNhZGRy cyBhbmQKKyAqIFUgYW5kIFYgcGxhbmUgb2Zmc2V0cyBhcmUgbXVsdGlwbGVzIG9mIDggYnl0ZXMg YXMgcmVxdWlyZWQgYnkKKyAqIHRoZSBJUFUgRE1BIENvbnRyb2xsZXIuIEZvciB0aGUgcGxhbmFy IGZvcm1hdHMsIHRoaXMgY29ycmVzcG9uZHMKKyAqIHRvIGEgcGl4ZWwgYWxpZ25tZW50IG9mIDE2 IChidXQgdXNlIGEgbW9yZSBmb3JtYWwgZXF1YXRpb24gc2luY2UKKyAqIHRoZSB2YXJpYWJsZXMg YXJlIGF2YWlsYWJsZSkuIEZvciBhbGwgdGhlIHBhY2tlZCBmb3JtYXRzLCA4IGlzCisgKiBnb29k IGVub3VnaC4KKyAqLworc3RhdGljIGlubGluZSB1MzIgdGlsZV93aWR0aF9hbGlnbihjb25zdCBz dHJ1Y3QgaXB1X2ltYWdlX3BpeGZtdCAqZm10KQoreworCXJldHVybiBmbXQtPnBsYW5hciA/IDgg KiBmbXQtPnV2X3dpZHRoX2RlYyA6IDg7Cit9CisKKy8qCisgKiBGb3IgdGlsZSBoZWlnaHQgYWxp Z25tZW50LCB3ZSBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSBvdXRwdXQgdGlsZQorICogaGVpZ2h0 cyBhcmUgbXVsdGlwbGVzIG9mIDggbGluZXMgaWYgdGhlIElSVCBpcyByZXF1aXJlZCBieSB0aGUK KyAqIGdpdmVuIHJvdGF0aW9uIG1vZGUgKHRoZSBJUlQgcGVyZm9ybXMgcm90YXRpb25zIG9uIDh4 OCBibG9ja3MKKyAqIGF0IGEgdGltZSkuIElmIHRoZSBJUlQgaXMgbm90IHVzZWQsIG9yIGZvciBp bnB1dCBpbWFnZSB0aWxlcywKKyAqIDIgbGluZXMgYXJlIGdvb2QgZW5vdWdoLgorICovCitzdGF0 aWMgaW5saW5lIHUzMiB0aWxlX2hlaWdodF9hbGlnbihlbnVtIGlwdV9pbWFnZV9jb252ZXJ0X3R5 cGUgdHlwZSwKKwkJCQkgICAgZW51bSBpcHVfcm90YXRlX21vZGUgcm90X21vZGUpCit7CisJcmV0 dXJuICh0eXBlID09IElNQUdFX0NPTlZFUlRfT1VUICYmCisJCWlwdV9yb3RfbW9kZV9pc19pcnQo cm90X21vZGUpKSA/IDggOiAyOworfQorCisvKiBBZGp1c3RzIGlucHV0L291dHB1dCBpbWFnZXMg dG8gSVBVIHJlc3RyaWN0aW9ucyAqLwordm9pZCBpcHVfaW1hZ2VfY29udmVydF9hZGp1c3Qoc3Ry dWN0IGlwdV9pbWFnZSAqaW4sIHN0cnVjdCBpcHVfaW1hZ2UgKm91dCwKKwkJCSAgICAgIGVudW0g aXB1X3JvdGF0ZV9tb2RlIHJvdF9tb2RlKQoreworCWNvbnN0IHN0cnVjdCBpcHVfaW1hZ2VfcGl4 Zm10ICppbmZtdCwgKm91dGZtdDsKKwl1bnNpZ25lZCBpbnQgbnVtX2luX3Jvd3MsIG51bV9pbl9j b2xzOworCXVuc2lnbmVkIGludCBudW1fb3V0X3Jvd3MsIG51bV9vdXRfY29sczsKKwl1MzIgd19h bGlnbiwgaF9hbGlnbjsKKworCWluZm10ID0gZ2V0X2Zvcm1hdChpbi0+cGl4LnBpeGVsZm9ybWF0 KTsKKwlvdXRmbXQgPSBnZXRfZm9ybWF0KG91dC0+cGl4LnBpeGVsZm9ybWF0KTsKKworCS8qIHNl dCBzb21lIGRlZmF1bHRzIGlmIG5lZWRlZCAqLworCWlmICghaW5mbXQpIHsKKwkJaW4tPnBpeC5w aXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9SR0IyNDsKKwkJaW5mbXQgPSBnZXRfZm9ybWF0KFY0 TDJfUElYX0ZNVF9SR0IyNCk7CisJfQorCWlmICghb3V0Zm10KSB7CisJCW91dC0+cGl4LnBpeGVs Zm9ybWF0ID0gVjRMMl9QSVhfRk1UX1JHQjI0OworCQlvdXRmbXQgPSBnZXRfZm9ybWF0KFY0TDJf UElYX0ZNVF9SR0IyNCk7CisJfQorCisJaWYgKCFpbi0+cGl4LndpZHRoIHx8ICFpbi0+cGl4Lmhl aWdodCkgeworCQlpbi0+cGl4LndpZHRoID0gNjQwOworCQlpbi0+cGl4LmhlaWdodCA9IDQ4MDsK Kwl9CisJaWYgKCFvdXQtPnBpeC53aWR0aCB8fCAhb3V0LT5waXguaGVpZ2h0KSB7CisJCW91dC0+ cGl4LndpZHRoID0gNjQwOworCQlvdXQtPnBpeC5oZWlnaHQgPSA0ODA7CisJfQorCisJLyogaW1h Z2UgY29udmVydGVyIGRvZXMgbm90IGhhbmRsZSBmaWVsZHMgKi8KKwlpbi0+cGl4LmZpZWxkID0g b3V0LT5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisKKwkvKiByZXNpemVyIGNhbm5vdCBk b3duc2l6ZSBtb3JlIHRoYW4gNDoxICovCisJaWYgKGlwdV9yb3RfbW9kZV9pc19pcnQocm90X21v ZGUpKSB7CisJCW91dC0+cGl4LmhlaWdodCA9IG1heF90KF9fdTMyLCBvdXQtPnBpeC5oZWlnaHQs CisJCQkJCWluLT5waXgud2lkdGggLyA0KTsKKwkJb3V0LT5waXgud2lkdGggPSBtYXhfdChfX3Uz Miwgb3V0LT5waXgud2lkdGgsCisJCQkJICAgICAgIGluLT5waXguaGVpZ2h0IC8gNCk7CisJfSBl bHNlIHsKKwkJb3V0LT5waXgud2lkdGggPSBtYXhfdChfX3UzMiwgb3V0LT5waXgud2lkdGgsCisJ CQkJICAgICAgIGluLT5waXgud2lkdGggLyA0KTsKKwkJb3V0LT5waXguaGVpZ2h0ID0gbWF4X3Qo X191MzIsIG91dC0+cGl4LmhlaWdodCwKKwkJCQkJaW4tPnBpeC5oZWlnaHQgLyA0KTsKKwl9CisK KwkvKiBnZXQgdGlsaW5nIHJvd3MvY29scyBmcm9tIG91dHB1dCBmb3JtYXQgKi8KKwludW1fb3V0 X3Jvd3MgPSBudW1fc3RyaXBlcyhvdXQtPnBpeC5oZWlnaHQpOworCW51bV9vdXRfY29scyA9IG51 bV9zdHJpcGVzKG91dC0+cGl4LndpZHRoKTsKKwlpZiAoaXB1X3JvdF9tb2RlX2lzX2lydChyb3Rf bW9kZSkpIHsKKwkJbnVtX2luX3Jvd3MgPSBudW1fb3V0X2NvbHM7CisJCW51bV9pbl9jb2xzID0g bnVtX291dF9yb3dzOworCX0gZWxzZSB7CisJCW51bV9pbl9yb3dzID0gbnVtX291dF9yb3dzOwor CQludW1faW5fY29scyA9IG51bV9vdXRfY29sczsKKwl9CisKKwkvKiBhbGlnbiBpbnB1dCB3aWR0 aC9oZWlnaHQgKi8KKwl3X2FsaWduID0gaWxvZzIodGlsZV93aWR0aF9hbGlnbihpbmZtdCkgKiBu dW1faW5fY29scyk7CisJaF9hbGlnbiA9IGlsb2cyKHRpbGVfaGVpZ2h0X2FsaWduKElNQUdFX0NP TlZFUlRfSU4sIHJvdF9tb2RlKSAqCisJCQludW1faW5fcm93cyk7CisJaW4tPnBpeC53aWR0aCA9 IGNsYW1wX2FsaWduKGluLT5waXgud2lkdGgsIE1JTl9XLCBNQVhfVywgd19hbGlnbik7CisJaW4t PnBpeC5oZWlnaHQgPSBjbGFtcF9hbGlnbihpbi0+cGl4LmhlaWdodCwgTUlOX0gsIE1BWF9ILCBo X2FsaWduKTsKKworCS8qIGFsaWduIG91dHB1dCB3aWR0aC9oZWlnaHQgKi8KKwl3X2FsaWduID0g aWxvZzIodGlsZV93aWR0aF9hbGlnbihvdXRmbXQpICogbnVtX291dF9jb2xzKTsKKwloX2FsaWdu ID0gaWxvZzIodGlsZV9oZWlnaHRfYWxpZ24oSU1BR0VfQ09OVkVSVF9PVVQsIHJvdF9tb2RlKSAq CisJCQludW1fb3V0X3Jvd3MpOworCW91dC0+cGl4LndpZHRoID0gY2xhbXBfYWxpZ24ob3V0LT5w aXgud2lkdGgsIE1JTl9XLCBNQVhfVywgd19hbGlnbik7CisJb3V0LT5waXguaGVpZ2h0ID0gY2xh bXBfYWxpZ24ob3V0LT5waXguaGVpZ2h0LCBNSU5fSCwgTUFYX0gsIGhfYWxpZ24pOworCisJLyog c2V0IGlucHV0L291dHB1dCBzdHJpZGVzIGFuZCBpbWFnZSBzaXplcyAqLworCWluLT5waXguYnl0 ZXNwZXJsaW5lID0gKGluLT5waXgud2lkdGggKiBpbmZtdC0+YnBwKSA+PiAzOworCWluLT5waXgu c2l6ZWltYWdlID0gaW4tPnBpeC5oZWlnaHQgKiBpbi0+cGl4LmJ5dGVzcGVybGluZTsKKwlvdXQt PnBpeC5ieXRlc3BlcmxpbmUgPSAob3V0LT5waXgud2lkdGggKiBvdXRmbXQtPmJwcCkgPj4gMzsK KwlvdXQtPnBpeC5zaXplaW1hZ2UgPSBvdXQtPnBpeC5oZWlnaHQgKiBvdXQtPnBpeC5ieXRlc3Bl cmxpbmU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcHVfaW1hZ2VfY29udmVydF9hZGp1c3QpOwor CisvKgorICogdGhpcyBpcyB1c2VkIGJ5IGlwdV9pbWFnZV9jb252ZXJ0X3ByZXBhcmUoKSB0byB2 ZXJpZnkgc2V0IGlucHV0IGFuZAorICogb3V0cHV0IGltYWdlcyBhcmUgdmFsaWQgYmVmb3JlIHN0 YXJ0aW5nIHRoZSBjb252ZXJzaW9uLiBDbGllbnRzIGNhbgorICogYWxzbyBjYWxsIGl0IGJlZm9y ZSBjYWxsaW5nIGlwdV9pbWFnZV9jb252ZXJ0X3ByZXBhcmUoKS4KKyAqLworaW50IGlwdV9pbWFn ZV9jb252ZXJ0X3ZlcmlmeShzdHJ1Y3QgaXB1X2ltYWdlICppbiwgc3RydWN0IGlwdV9pbWFnZSAq b3V0LAorCQkJICAgICBlbnVtIGlwdV9yb3RhdGVfbW9kZSByb3RfbW9kZSkKK3sKKwlzdHJ1Y3Qg aXB1X2ltYWdlIHRlc3RpbiwgdGVzdG91dDsKKwlpbnQgcmV0OworCisJdGVzdGluID0gKmluOwor CXRlc3RvdXQgPSAqb3V0OworCisJcmV0ID0gaXB1X2ltYWdlX2NvbnZlcnRfYWRqdXN0KCZ0ZXN0 aW4sICZ0ZXN0b3V0LCByb3RfbW9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlm ICh0ZXN0aW4ucGl4LndpZHRoICE9IGluLT5waXgud2lkdGggfHwKKwkgICAgdGVzdGluLnBpeC5o ZWlnaHQgIT0gaW4tPnBpeC5oZWlnaHQgfHwKKwkgICAgdGVzdG91dC5waXgud2lkdGggIT0gb3V0 LT5waXgud2lkdGggfHwKKwkgICAgdGVzdG91dC5waXguaGVpZ2h0ICE9IG91dC0+cGl4LmhlaWdo dCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BM KGlwdV9pbWFnZV9jb252ZXJ0X3ZlcmlmeSk7CisKKy8qCisgKiBDYWxsIGlwdV9pbWFnZV9jb252 ZXJ0X3ByZXBhcmUoKSB0byBwcmVwYXJlIGZvciB0aGUgY29udmVyc2lvbiBvZgorICogZ2l2ZW4g aW1hZ2VzIGFuZCByb3RhdGlvbiBtb2RlLiBSZXR1cm5zIGEgbmV3IGNvbnZlcnNpb24gY29udGV4 dC4KKyAqLworc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X2N0eCAqCitpcHVfaW1hZ2VfY29udmVy dF9wcmVwYXJlKHN0cnVjdCBpcHVfc29jICppcHUsIGVudW0gaXB1X2ljX3Rhc2sgaWNfdGFzaywK KwkJCSAgc3RydWN0IGlwdV9pbWFnZSAqaW4sIHN0cnVjdCBpcHVfaW1hZ2UgKm91dCwKKwkJCSAg ZW51bSBpcHVfcm90YXRlX21vZGUgcm90X21vZGUsCisJCQkgIGlwdV9pbWFnZV9jb252ZXJ0X2Ni X3QgY29tcGxldGUsCisJCQkgIHZvaWQgKmNvbXBsZXRlX2NvbnRleHQpCit7CisJc3RydWN0IGlw dV9pbWFnZV9jb252ZXJ0X3ByaXYgKnByaXYgPSBpcHUtPmltYWdlX2NvbnZlcnRfcHJpdjsKKwlz dHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfaW1hZ2UgKnNfaW1hZ2UsICpkX2ltYWdlOworCXN0cnVj dCBpcHVfaW1hZ2VfY29udmVydF9jaGFuICpjaGFuOworCXN0cnVjdCBpcHVfaW1hZ2VfY29udmVy dF9jdHggKmN0eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgZ2V0X3JlczsKKwlpbnQg cmV0OworCisJaWYgKCFpbiB8fCAhb3V0IHx8ICFjb21wbGV0ZSB8fAorCSAgICAoaWNfdGFzayAh PSBJQ19UQVNLX1ZJRVdGSU5ERVIgJiYKKwkgICAgIGljX3Rhc2sgIT0gSUNfVEFTS19QT1NUX1BS T0NFU1NPUikpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJLyogdmVyaWZ5IHRoZSBp bi9vdXQgaW1hZ2VzIGJlZm9yZSBjb250aW51aW5nICovCisJcmV0ID0gaXB1X2ltYWdlX2NvbnZl cnRfdmVyaWZ5KGluLCBvdXQsIHJvdF9tb2RlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocHJp di0+aXB1LT5kZXYsICIlczogaW4vb3V0IGZvcm1hdHMgaW52YWxpZFxuIiwKKwkJCV9fZnVuY19f KTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwljaGFuID0gJnByaXYtPmNoYW5baWNf dGFza107CisKKwljdHggPSBremFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYg KCFjdHgpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZGV2X2RiZyhwcml2LT5pcHUt PmRldiwgIiVzOiB0YXNrICV1OiBjdHggJXBcbiIsIF9fZnVuY19fLAorCQljaGFuLT5pY190YXNr LCBjdHgpOworCisJY3R4LT5jaGFuID0gY2hhbjsKKwlpbml0X2NvbXBsZXRpb24oJmN0eC0+YWJv cnRlZCk7CisKKwlzX2ltYWdlID0gJmN0eC0+aW47CisJZF9pbWFnZSA9ICZjdHgtPm91dDsKKwor CS8qIHNldCB0aWxpbmcgYW5kIHJvdGF0aW9uICovCisJZF9pbWFnZS0+bnVtX3Jvd3MgPSBudW1f c3RyaXBlcyhvdXQtPnBpeC5oZWlnaHQpOworCWRfaW1hZ2UtPm51bV9jb2xzID0gbnVtX3N0cmlw ZXMob3V0LT5waXgud2lkdGgpOworCWlmIChpcHVfcm90X21vZGVfaXNfaXJ0KHJvdF9tb2RlKSkg eworCQlzX2ltYWdlLT5udW1fcm93cyA9IGRfaW1hZ2UtPm51bV9jb2xzOworCQlzX2ltYWdlLT5u dW1fY29scyA9IGRfaW1hZ2UtPm51bV9yb3dzOworCX0gZWxzZSB7CisJCXNfaW1hZ2UtPm51bV9y b3dzID0gZF9pbWFnZS0+bnVtX3Jvd3M7CisJCXNfaW1hZ2UtPm51bV9jb2xzID0gZF9pbWFnZS0+ bnVtX2NvbHM7CisJfQorCisJY3R4LT5udW1fdGlsZXMgPSBkX2ltYWdlLT5udW1fY29scyAqIGRf aW1hZ2UtPm51bV9yb3dzOworCWN0eC0+cm90X21vZGUgPSByb3RfbW9kZTsKKworCXJldCA9IGZp bGxfaW1hZ2UoY3R4LCBzX2ltYWdlLCBpbiwgSU1BR0VfQ09OVkVSVF9JTik7CisJaWYgKHJldCkK KwkJZ290byBvdXRfZnJlZTsKKwlyZXQgPSBmaWxsX2ltYWdlKGN0eCwgZF9pbWFnZSwgb3V0LCBJ TUFHRV9DT05WRVJUX09VVCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZTsKKworCWNhbGNf b3V0X3RpbGVfbWFwKGN0eCk7CisKKwlkdW1wX2Zvcm1hdChjdHgsIHNfaW1hZ2UpOworCWR1bXBf Zm9ybWF0KGN0eCwgZF9pbWFnZSk7CisKKwljdHgtPmNvbXBsZXRlID0gY29tcGxldGU7CisJY3R4 LT5jb21wbGV0ZV9jb250ZXh0ID0gY29tcGxldGVfY29udGV4dDsKKworCS8qCisJICogQ2FuIHdl IHVzZSBkb3VibGUtYnVmZmVyaW5nIGZvciB0aGlzIG9wZXJhdGlvbj8gSWYgdGhlcmUgaXMKKwkg KiBvbmx5IG9uZSB0aWxlICh0aGUgd2hvbGUgaW1hZ2UgY2FuIGJlIGNvbnZlcnRlZCBpbiBhIHNp bmdsZQorCSAqIG9wZXJhdGlvbikgdGhlcmUncyBubyBwb2ludCBpbiB1c2luZyBkb3VibGUtYnVm ZmVyaW5nLiBBbHNvLAorCSAqIHRoZSBJUFUncyBJRE1BQyBjaGFubmVscyBhbGxvdyBvbmx5IGEg c2luZ2xlIFUgYW5kIFYgcGxhbmUKKwkgKiBvZmZzZXQgc2hhcmVkIGJldHdlZW4gYm90aCBidWZm ZXJzLCBidXQgdGhlc2Ugb2Zmc2V0cyBjaGFuZ2UKKwkgKiBmb3IgZXZlcnkgdGlsZSwgYW5kIHRo ZXJlZm9yZSB3b3VsZCBoYXZlIHRvIGJlIHVwZGF0ZWQgZm9yCisJICogZWFjaCBidWZmZXIgd2hp Y2ggaXMgbm90IHBvc3NpYmxlLiBTbyBkb3VibGUtYnVmZmVyaW5nIGlzCisJICogaW1wb3NzaWJs ZSB3aGVuIGVpdGhlciB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uIGltYWdlcyBhcmUKKwkgKiBh IHBsYW5hciBmb3JtYXQgKFlVVjQyMCwgWVVWNDIyUCwgZXRjLikuCisJICovCisJY3R4LT5kb3Vi bGVfYnVmZmVyaW5nID0gKGN0eC0+bnVtX3RpbGVzID4gMSAmJgorCQkJCSAhc19pbWFnZS0+Zm10 LT5wbGFuYXIgJiYKKwkJCQkgIWRfaW1hZ2UtPmZtdC0+cGxhbmFyKTsKKworCWlmIChpcHVfcm90 X21vZGVfaXNfaXJ0KGN0eC0+cm90X21vZGUpKSB7CisJCXJldCA9IGFsbG9jX2RtYV9idWYocHJp diwgJmN0eC0+cm90X2ludGVybWVkaWF0ZVswXSwKKwkJCQkgICAgZF9pbWFnZS0+dGlsZVswXS5z aXplKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCWlmIChjdHgtPmRvdWJsZV9i dWZmZXJpbmcpIHsKKwkJCXJldCA9IGFsbG9jX2RtYV9idWYocHJpdiwKKwkJCQkJICAgICZjdHgt PnJvdF9pbnRlcm1lZGlhdGVbMV0sCisJCQkJCSAgICBkX2ltYWdlLT50aWxlWzBdLnNpemUpOwor CQkJaWYgKHJldCkKKwkJCQlnb3RvIG91dF9mcmVlX2RtYWJ1ZjA7CisJCX0KKwl9CisKKwlzcGlu X2xvY2tfaXJxc2F2ZSgmY2hhbi0+aXJxbG9jaywgZmxhZ3MpOworCisJZ2V0X3JlcyA9IGxpc3Rf ZW1wdHkoJmNoYW4tPmN0eF9saXN0KTsKKworCWxpc3RfYWRkX3RhaWwoJmN0eC0+bGlzdCwgJmNo YW4tPmN0eF9saXN0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmlycWxvY2ss IGZsYWdzKTsKKworCWlmIChnZXRfcmVzKSB7CisJCXJldCA9IGdldF9pcHVfcmVzb3VyY2VzKGNo YW4pOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZnJlZV9kbWFidWYxOworCX0KKworCXJldHVy biBjdHg7CisKK291dF9mcmVlX2RtYWJ1ZjE6CisJZnJlZV9kbWFfYnVmKHByaXYsICZjdHgtPnJv dF9pbnRlcm1lZGlhdGVbMV0pOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5pcnFsb2NrLCBm bGFncyk7CisJbGlzdF9kZWwoJmN0eC0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm Y2hhbi0+aXJxbG9jaywgZmxhZ3MpOworb3V0X2ZyZWVfZG1hYnVmMDoKKwlmcmVlX2RtYV9idWYo cHJpdiwgJmN0eC0+cm90X2ludGVybWVkaWF0ZVswXSk7CitvdXRfZnJlZToKKwlrZnJlZShjdHgp OworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcHVfaW1hZ2Vf Y29udmVydF9wcmVwYXJlKTsKKworLyoKKyAqIENhcnJ5IG91dCBhIHNpbmdsZSBpbWFnZSBjb252 ZXJzaW9uIHJ1bi4gT25seSB0aGUgcGh5c2FkZHIncyBvZiB0aGUgaW5wdXQKKyAqIGFuZCBvdXRw dXQgaW1hZ2UgYnVmZmVycyBhcmUgbmVlZGVkLiBUaGUgY29udmVyc2lvbiBjb250ZXh0IG11c3Qg aGF2ZQorICogYmVlbiBjcmVhdGVkIHByZXZpb3VzbHkgd2l0aCBpcHVfaW1hZ2VfY29udmVydF9w cmVwYXJlKCkuCisgKi8KK2ludCBpcHVfaW1hZ2VfY29udmVydF9xdWV1ZShzdHJ1Y3QgaXB1X2lt YWdlX2NvbnZlcnRfcnVuICpydW4pCit7CisJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X2NoYW4g KmNoYW47CisJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X3ByaXYgKnByaXY7CisJc3RydWN0IGlw dV9pbWFnZV9jb252ZXJ0X2N0eCAqY3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJl dCA9IDA7CisKKwlpZiAoIXJ1biB8fCAhcnVuLT5jdHggfHwgIXJ1bi0+aW5fcGh5cyB8fCAhcnVu LT5vdXRfcGh5cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljdHggPSBydW4tPmN0eDsKKwljaGFu ID0gY3R4LT5jaGFuOworCXByaXYgPSBjaGFuLT5wcml2OworCisJZGV2X2RiZyhwcml2LT5pcHUt PmRldiwgIiVzOiB0YXNrICV1OiBjdHggJXAgcnVuICVwXG4iLCBfX2Z1bmNfXywKKwkJY2hhbi0+ aWNfdGFzaywgY3R4LCBydW4pOworCisJSU5JVF9MSVNUX0hFQUQoJnJ1bi0+bGlzdCk7CisKKwlz cGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+aXJxbG9jaywgZmxhZ3MpOworCisJaWYgKGN0eC0+YWJv cnRpbmcpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byB1bmxvY2s7CisJfQorCisJbGlzdF9hZGRf dGFpbCgmcnVuLT5saXN0LCAmY2hhbi0+cGVuZGluZ19xKTsKKworCWlmICghY2hhbi0+Y3VycmVu dF9ydW4pIHsKKwkJcmV0ID0gZG9fcnVuKHJ1bik7CisJCWlmIChyZXQpCisJCQljaGFuLT5jdXJy ZW50X3J1biA9IE5VTEw7CisJfQordW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNo YW4tPmlycWxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwo aXB1X2ltYWdlX2NvbnZlcnRfcXVldWUpOworCisvKiBBYm9ydCBhbnkgYWN0aXZlIG9yIHBlbmRp bmcgY29udmVyc2lvbnMgZm9yIHRoaXMgY29udGV4dCAqLwordm9pZCBpcHVfaW1hZ2VfY29udmVy dF9hYm9ydChzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfY3R4ICpjdHgpCit7CisJc3RydWN0IGlw dV9pbWFnZV9jb252ZXJ0X2NoYW4gKmNoYW4gPSBjdHgtPmNoYW47CisJc3RydWN0IGlwdV9pbWFn ZV9jb252ZXJ0X3ByaXYgKnByaXYgPSBjaGFuLT5wcml2OworCXN0cnVjdCBpcHVfaW1hZ2VfY29u dmVydF9ydW4gKnJ1biwgKmFjdGl2ZV9ydW4sICp0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsK KwlpbnQgcnVuX2NvdW50LCByZXQ7CisJYm9vbCBuZWVkX2Fib3J0OworCisJcmVpbml0X2NvbXBs ZXRpb24oJmN0eC0+YWJvcnRlZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+aXJxbG9j aywgZmxhZ3MpOworCisJLyogbW92ZSBhbGwgcmVtYWluaW5nIHBlbmRpbmcgcnVucyBpbiB0aGlz IGNvbnRleHQgdG8gZG9uZV9xICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ1biwgdG1w LCAmY2hhbi0+cGVuZGluZ19xLCBsaXN0KSB7CisJCWlmIChydW4tPmN0eCAhPSBjdHgpCisJCQlj b250aW51ZTsKKwkJcnVuLT5zdGF0dXMgPSAtRUlPOworCQlsaXN0X21vdmVfdGFpbCgmcnVuLT5s aXN0LCAmY2hhbi0+ZG9uZV9xKTsKKwl9CisKKwlydW5fY291bnQgPSBnZXRfcnVuX2NvdW50KGN0 eCwgJmNoYW4tPmRvbmVfcSk7CisJYWN0aXZlX3J1biA9IChjaGFuLT5jdXJyZW50X3J1biAmJiBj aGFuLT5jdXJyZW50X3J1bi0+Y3R4ID09IGN0eCkgPworCQljaGFuLT5jdXJyZW50X3J1biA6IE5V TEw7CisKKwluZWVkX2Fib3J0ID0gKHJ1bl9jb3VudCB8fCBhY3RpdmVfcnVuKTsKKworCWN0eC0+ YWJvcnRpbmcgPSBuZWVkX2Fib3J0OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+ aXJxbG9jaywgZmxhZ3MpOworCisJaWYgKCFuZWVkX2Fib3J0KSB7CisJCWRldl9kYmcocHJpdi0+ aXB1LT5kZXYsCisJCQkiJXM6IHRhc2sgJXU6IG5vIGFib3J0IG5lZWRlZCBmb3IgY3R4ICVwXG4i LAorCQkJX19mdW5jX18sIGNoYW4tPmljX3Rhc2ssIGN0eCk7CisJCXJldHVybjsKKwl9CisKKwlk ZXZfZGJnKHByaXYtPmlwdS0+ZGV2LAorCQkiJXM6IHRhc2sgJXU6IHdhaXQgZm9yIGNvbXBsZXRp b246ICVkIHJ1bnMsIGFjdGl2ZSBydW4gJXBcbiIsCisJCV9fZnVuY19fLCBjaGFuLT5pY190YXNr LCBydW5fY291bnQsIGFjdGl2ZV9ydW4pOworCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90 aW1lb3V0KCZjdHgtPmFib3J0ZWQsCisJCQkJCSAgbXNlY3NfdG9famlmZmllcygxMDAwMCkpOwor CWlmIChyZXQgPT0gMCkgeworCQlkZXZfd2Fybihwcml2LT5pcHUtPmRldiwgIiVzOiB0aW1lb3V0 XG4iLCBfX2Z1bmNfXyk7CisJCWZvcmNlX2Fib3J0KGN0eCk7CisJfQorCisJY3R4LT5hYm9ydGlu ZyA9IGZhbHNlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXB1X2ltYWdlX2NvbnZlcnRfYWJvcnQp OworCisvKiBVbnByZXBhcmUgaW1hZ2UgY29udmVyc2lvbiBjb250ZXh0ICovCit2b2lkIGlwdV9p bWFnZV9jb252ZXJ0X3VucHJlcGFyZShzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfY3R4ICpjdHgp Cit7CisJc3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X2NoYW4gKmNoYW4gPSBjdHgtPmNoYW47CisJ c3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X3ByaXYgKnByaXYgPSBjaGFuLT5wcml2OworCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBwdXRfcmVzOworCisJLyogbWFrZSBzdXJlIG5vIHJ1bnMg YXJlIGhhbmdpbmcgYXJvdW5kICovCisJaXB1X2ltYWdlX2NvbnZlcnRfYWJvcnQoY3R4KTsKKwor CWRldl9kYmcocHJpdi0+aXB1LT5kZXYsICIlczogdGFzayAldTogcmVtb3ZpbmcgY3R4ICVwXG4i LCBfX2Z1bmNfXywKKwkJY2hhbi0+aWNfdGFzaywgY3R4KTsKKworCXNwaW5fbG9ja19pcnFzYXZl KCZjaGFuLT5pcnFsb2NrLCBmbGFncyk7CisKKwlsaXN0X2RlbCgmY3R4LT5saXN0KTsKKworCXB1 dF9yZXMgPSBsaXN0X2VtcHR5KCZjaGFuLT5jdHhfbGlzdCk7CisKKwlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZjaGFuLT5pcnFsb2NrLCBmbGFncyk7CisKKwlpZiAocHV0X3JlcykKKwkJcmVsZWFz ZV9pcHVfcmVzb3VyY2VzKGNoYW4pOworCisJZnJlZV9kbWFfYnVmKHByaXYsICZjdHgtPnJvdF9p bnRlcm1lZGlhdGVbMV0pOworCWZyZWVfZG1hX2J1Zihwcml2LCAmY3R4LT5yb3RfaW50ZXJtZWRp YXRlWzBdKTsKKworCWtmcmVlKGN0eCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcHVfaW1hZ2Vf Y29udmVydF91bnByZXBhcmUpOworCisvKgorICogIkNhbm5lZCIgYXN5bmNocm9ub3VzIHNpbmds ZSBpbWFnZSBjb252ZXJzaW9uLiBBbGxvY2F0ZXMgYW5kIHJldHVybnMKKyAqIGEgbmV3IGNvbnZl cnNpb24gcnVuLiAgT24gc3VjY2Vzc2Z1bCByZXR1cm4gdGhlIGNhbGxlciBtdXN0IGZyZWUgdGhl CisgKiBydW4gYW5kIGNhbGwgaXB1X2ltYWdlX2NvbnZlcnRfdW5wcmVwYXJlKCkgYWZ0ZXIgY29u dmVyc2lvbiBjb21wbGV0ZXMuCisgKi8KK3N0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9ydW4gKgor aXB1X2ltYWdlX2NvbnZlcnQoc3RydWN0IGlwdV9zb2MgKmlwdSwgZW51bSBpcHVfaWNfdGFzayBp Y190YXNrLAorCQkgIHN0cnVjdCBpcHVfaW1hZ2UgKmluLCBzdHJ1Y3QgaXB1X2ltYWdlICpvdXQs CisJCSAgZW51bSBpcHVfcm90YXRlX21vZGUgcm90X21vZGUsCisJCSAgaXB1X2ltYWdlX2NvbnZl cnRfY2JfdCBjb21wbGV0ZSwKKwkJICB2b2lkICpjb21wbGV0ZV9jb250ZXh0KQoreworCXN0cnVj dCBpcHVfaW1hZ2VfY29udmVydF9jdHggKmN0eDsKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRf cnVuICpydW47CisJaW50IHJldDsKKworCWN0eCA9IGlwdV9pbWFnZV9jb252ZXJ0X3ByZXBhcmUo aXB1LCBpY190YXNrLCBpbiwgb3V0LCByb3RfbW9kZSwKKwkJCQkJY29tcGxldGUsIGNvbXBsZXRl X2NvbnRleHQpOworCWlmIChJU19FUlIoY3R4KSkKKwkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihj dHgpKTsKKworCXJ1biA9IGt6YWxsb2Moc2l6ZW9mKCpydW4pLCBHRlBfS0VSTkVMKTsKKwlpZiAo IXJ1bikgeworCQlpcHVfaW1hZ2VfY29udmVydF91bnByZXBhcmUoY3R4KTsKKwkJcmV0dXJuIEVS Ul9QVFIoLUVOT01FTSk7CisJfQorCisJcnVuLT5jdHggPSBjdHg7CisJcnVuLT5pbl9waHlzID0g aW4tPnBoeXMwOworCXJ1bi0+b3V0X3BoeXMgPSBvdXQtPnBoeXMwOworCisJcmV0ID0gaXB1X2lt YWdlX2NvbnZlcnRfcXVldWUocnVuKTsKKwlpZiAocmV0KSB7CisJCWlwdV9pbWFnZV9jb252ZXJ0 X3VucHJlcGFyZShjdHgpOworCQlrZnJlZShydW4pOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOwor CX0KKworCXJldHVybiBydW47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcHVfaW1hZ2VfY29udmVy dCk7CisKKy8qICJDYW5uZWQiIHN5bmNocm9ub3VzIHNpbmdsZSBpbWFnZSBjb252ZXJzaW9uICov CitzdGF0aWMgdm9pZCBpbWFnZV9jb252ZXJ0X3N5bmNfY29tcGxldGUoc3RydWN0IGlwdV9pbWFn ZV9jb252ZXJ0X3J1biAqcnVuLAorCQkJCQl2b2lkICpkYXRhKQoreworCXN0cnVjdCBjb21wbGV0 aW9uICpjb21wID0gZGF0YTsKKworCWNvbXBsZXRlKGNvbXApOworfQorCitpbnQgaXB1X2ltYWdl X2NvbnZlcnRfc3luYyhzdHJ1Y3QgaXB1X3NvYyAqaXB1LCBlbnVtIGlwdV9pY190YXNrIGljX3Rh c2ssCisJCQkgICBzdHJ1Y3QgaXB1X2ltYWdlICppbiwgc3RydWN0IGlwdV9pbWFnZSAqb3V0LAor CQkJICAgZW51bSBpcHVfcm90YXRlX21vZGUgcm90X21vZGUpCit7CisJc3RydWN0IGlwdV9pbWFn ZV9jb252ZXJ0X3J1biAqcnVuOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7CisJaW50IHJldDsK KworCWluaXRfY29tcGxldGlvbigmY29tcCk7CisKKwlydW4gPSBpcHVfaW1hZ2VfY29udmVydChp cHUsIGljX3Rhc2ssIGluLCBvdXQsIHJvdF9tb2RlLAorCQkJCWltYWdlX2NvbnZlcnRfc3luY19j b21wbGV0ZSwgJmNvbXApOworCWlmIChJU19FUlIocnVuKSkKKwkJcmV0dXJuIFBUUl9FUlIocnVu KTsKKworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29tcCwgbXNlY3NfdG9f amlmZmllcygxMDAwMCkpOworCXJldCA9IChyZXQgPT0gMCkgPyAtRVRJTUVET1VUIDogMDsKKwor CWlwdV9pbWFnZV9jb252ZXJ0X3VucHJlcGFyZShydW4tPmN0eCk7CisJa2ZyZWUocnVuKTsKKwor CXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcHVfaW1hZ2VfY29udmVydF9zeW5j KTsKKworaW50IGlwdV9pbWFnZV9jb252ZXJ0X2luaXQoc3RydWN0IGlwdV9zb2MgKmlwdSwgc3Ry dWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9wcml2ICpwcml2 OworCWludCBpOworCisJcHJpdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHJpdiksIEdG UF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpcHUtPmltYWdl X2NvbnZlcnRfcHJpdiA9IHByaXY7CisJcHJpdi0+aXB1ID0gaXB1OworCisJZm9yIChpID0gMDsg aSA8IElDX05VTV9UQVNLUzsgaSsrKSB7CisJCXN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9jaGFu ICpjaGFuID0gJnByaXYtPmNoYW5baV07CisKKwkJY2hhbi0+aWNfdGFzayA9IGk7CisJCWNoYW4t PnByaXYgPSBwcml2OworCQljaGFuLT5kbWFfY2ggPSAmaW1hZ2VfY29udmVydF9kbWFfY2hhbltp XTsKKwkJY2hhbi0+b3V0X2VvZl9pcnEgPSAtMTsKKwkJY2hhbi0+cm90X291dF9lb2ZfaXJxID0g LTE7CisKKwkJc3Bpbl9sb2NrX2luaXQoJmNoYW4tPmlycWxvY2spOworCQlJTklUX0xJU1RfSEVB RCgmY2hhbi0+Y3R4X2xpc3QpOworCQlJTklUX0xJU1RfSEVBRCgmY2hhbi0+cGVuZGluZ19xKTsK KwkJSU5JVF9MSVNUX0hFQUQoJmNoYW4tPmRvbmVfcSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisK K3ZvaWQgaXB1X2ltYWdlX2NvbnZlcnRfZXhpdChzdHJ1Y3QgaXB1X3NvYyAqaXB1KQoreworfQpk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvaXB1LXYzL2lwdS1wcnYuaCBiL2RyaXZlcnMvZ3B1L2lw dS12My9pcHUtcHJ2LmgKaW5kZXggZmQ0N2Y4Zi4uNDNkOWRmNCAxMDA2NDQKLS0tIGEvZHJpdmVy cy9ncHUvaXB1LXYzL2lwdS1wcnYuaAorKysgYi9kcml2ZXJzL2dwdS9pcHUtdjMvaXB1LXBydi5o CkBAIC0xMzgsNiArMTM4LDcgQEAgc3RydWN0IGlwdV9kY19wcml2Owogc3RydWN0IGlwdV9kbWZj X3ByaXY7CiBzdHJ1Y3QgaXB1X2RpOwogc3RydWN0IGlwdV9pY19wcml2Oworc3RydWN0IGlwdV9p bWFnZV9jb252ZXJ0X3ByaXY7CiBzdHJ1Y3QgaXB1X3NtZmNfcHJpdjsKIAogc3RydWN0IGlwdV9k ZXZ0eXBlOwpAQCAtMTcwLDYgKzE3MSw3IEBAIHN0cnVjdCBpcHVfc29jIHsKIAlzdHJ1Y3QgaXB1 X2RpCQkqZGlfcHJpdlsyXTsKIAlzdHJ1Y3QgaXB1X2NzaQkJKmNzaV9wcml2WzJdOwogCXN0cnVj dCBpcHVfaWNfcHJpdgkqaWNfcHJpdjsKKwlzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfcHJpdiAq aW1hZ2VfY29udmVydF9wcml2OwogCXN0cnVjdCBpcHVfc21mY19wcml2CSpzbWZjX3ByaXY7CiB9 OwogCkBAIC0yMDAsNiArMjAyLDkgQEAgaW50IGlwdV9pY19pbml0KHN0cnVjdCBpcHVfc29jICpp cHUsIHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBs b25nIHRwbWVtX2Jhc2UpOwogdm9pZCBpcHVfaWNfZXhpdChzdHJ1Y3QgaXB1X3NvYyAqaXB1KTsK IAoraW50IGlwdV9pbWFnZV9jb252ZXJ0X2luaXQoc3RydWN0IGlwdV9zb2MgKmlwdSwgc3RydWN0 IGRldmljZSAqZGV2KTsKK3ZvaWQgaXB1X2ltYWdlX2NvbnZlcnRfZXhpdChzdHJ1Y3QgaXB1X3Nv YyAqaXB1KTsKKwogaW50IGlwdV9kaV9pbml0KHN0cnVjdCBpcHVfc29jICppcHUsIHN0cnVjdCBk ZXZpY2UgKmRldiwgaW50IGlkLAogCQl1bnNpZ25lZCBsb25nIGJhc2UsIHUzMiBtb2R1bGUsIHN0 cnVjdCBjbGsgKmlwdV9jbGspOwogdm9pZCBpcHVfZGlfZXhpdChzdHJ1Y3QgaXB1X3NvYyAqaXB1 LCBpbnQgaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92aWRlby9pbXgtaW1hZ2UtY29udmVydC5o IGIvaW5jbHVkZS92aWRlby9pbXgtaW1hZ2UtY29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAuLjRmOGIzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3ZpZGVv L2lteC1pbWFnZS1jb252ZXJ0LmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQg KEMpIDIwMTItMjAxNiBNZW50b3IgR3JhcGhpY3MgSW5jLgorICoKKyAqIGkuTVggUXVldWVkIGlt YWdlIGNvbnZlcnNpb24gc3VwcG9ydCwgd2l0aCB0aWxpbmcgYW5kIHJvdGF0aW9uLgorICoKKyAq IFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh bmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9w dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBB TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFO VEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLwor I2lmbmRlZiBfX0lNWF9JTUFHRV9DT05WRVJUX0hfXworI2RlZmluZSBfX0lNWF9JTUFHRV9DT05W RVJUX0hfXworCisjaW5jbHVkZSA8dmlkZW8vaW14LWlwdS12My5oPgorCitzdHJ1Y3QgaXB1X2lt YWdlX2NvbnZlcnRfY3R4OworCisvKioKKyAqIHN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9ydW4g LSBpbWFnZSBjb252ZXJzaW9uIHJ1biByZXF1ZXN0IHN0cnVjdAorICoKKyAqIEBjdHg6CXRoZSBj b252ZXJzaW9uIGNvbnRleHQKKyAqIEBpbl9waHlzOglkbWEgYWRkciBvZiBpbnB1dCBpbWFnZSBi dWZmZXIgZm9yIHRoaXMgcnVuCisgKiBAb3V0X3BoeXM6CWRtYSBhZGRyIG9mIG91dHB1dCBpbWFn ZSBidWZmZXIgZm9yIHRoaXMgcnVuCisgKiBAc3RhdHVzOgljb21wbGV0aW9uIHN0YXR1cyBvZiB0 aGlzIHJ1bgorICovCitzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZlcnRfcnVuIHsKKwlzdHJ1Y3QgaXB1 X2ltYWdlX2NvbnZlcnRfY3R4ICpjdHg7CisKKwlkbWFfYWRkcl90IGluX3BoeXM7CisJZG1hX2Fk ZHJfdCBvdXRfcGh5czsKKworCWludCBzdGF0dXM7CisKKwkvKiBpbnRlcm5hbCB0byBpbWFnZSBj b252ZXJ0ZXIsIGNhbGxlcnMgZG9uJ3QgdG91Y2ggKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7 Cit9OworCisvKioKKyAqIGlwdV9pbWFnZV9jb252ZXJ0X2NiX3QgLSBjb252ZXJzaW9uIGNhbGxi YWNrIGZ1bmN0aW9uIHByb3RvdHlwZQorICoKKyAqIEBydW46CXRoZSBjb21wbGV0ZWQgY29udmVy c2lvbiBydW4gcG9pbnRlcgorICogQGN0eDoJYSBwcml2YXRlIGNvbnRleHQgcG9pbnRlciBmb3Ig dGhlIGNhbGxiYWNrCisgKi8KK3R5cGVkZWYgdm9pZCAoKmlwdV9pbWFnZV9jb252ZXJ0X2NiX3Qp KHN0cnVjdCBpcHVfaW1hZ2VfY29udmVydF9ydW4gKnJ1biwKKwkJCQkgICAgICAgdm9pZCAqY3R4 KTsKKworLyoqCisgKiBpcHVfaW1hZ2VfY29udmVydF9lbnVtX2Zvcm1hdCgpIC0gZW51bWVyYXRl IHRoZSBpbWFnZSBjb252ZXJ0ZXIncworICoJc3VwcG9ydGVkIGlucHV0IGFuZCBvdXRwdXQgcGl4 ZWwgZm9ybWF0cy4KKyAqCisgKiBAaW5kZXg6CXBpeGVsIGZvcm1hdCBpbmRleAorICogQGZvdXJj YzoJdjRsMiBmb3VyY2MgZm9yIHRoaXMgaW5kZXgKKyAqCisgKiBSZXR1cm5zIDAgd2l0aCBhIHZh bGlkIGluZGV4IGFuZCBmaWxscyBpbiB2NGwyIGZvdXJjYywgLUVJTlZBTCBvdGhlcndpc2UuCisg KgorICogSW4gVjRMMiwgZHJpdmVycyBjYW4gY2FsbCBpcHVfaW1hZ2VfZW51bV9mb3JtYXQoKSBp biAuZW51bV9mbXQuCisgKi8KK2ludCBpcHVfaW1hZ2VfY29udmVydF9lbnVtX2Zvcm1hdChpbnQg aW5kZXgsIHUzMiAqZm91cmNjKTsKKworLyoqCisgKiBpcHVfaW1hZ2VfY29udmVydF9hZGp1c3Qo KSAtIGFkanVzdCBpbnB1dC9vdXRwdXQgaW1hZ2VzIHRvIElQVSByZXN0cmljdGlvbnMuCisgKgor ICogQGluOgkJaW5wdXQgaW1hZ2UgZm9ybWF0LCBhZGp1c3RlZCBvbiByZXR1cm4KKyAqIEBvdXQ6 CW91dHB1dCBpbWFnZSBmb3JtYXQsIGFkanVzdGVkIG9uIHJldHVybgorICogQHJvdF9tb2RlOgly b3RhdGlvbiBtb2RlCisgKgorICogSW4gVjRMMiwgZHJpdmVycyBjYW4gY2FsbCBpcHVfaW1hZ2Vf Y29udmVydF9hZGp1c3QoKSBpbiAudHJ5X2ZtdC4KKyAqLwordm9pZCBpcHVfaW1hZ2VfY29udmVy dF9hZGp1c3Qoc3RydWN0IGlwdV9pbWFnZSAqaW4sIHN0cnVjdCBpcHVfaW1hZ2UgKm91dCwKKwkJ CSAgICAgIGVudW0gaXB1X3JvdGF0ZV9tb2RlIHJvdF9tb2RlKTsKKworLyoqCisgKiBpcHVfaW1h Z2VfY29udmVydF92ZXJpZnkoKSAtIHZlcmlmeSB0aGF0IGlucHV0L291dHB1dCBpbWFnZSBmb3Jt YXRzCisgKiAgICAgICAgIGFuZCByb3RhdGlvbiBtb2RlIG1lZXQgSVBVIHJlc3RyaWN0aW9ucy4K KyAqCisgKiBAaW46CQlpbnB1dCBpbWFnZSBmb3JtYXQKKyAqIEBvdXQ6CW91dHB1dCBpbWFnZSBm b3JtYXQKKyAqIEByb3RfbW9kZToJcm90YXRpb24gbW9kZQorICoKKyAqIFJldHVybnMgMCBpZiB0 aGUgZm9ybWF0cyBhbmQgcm90YXRpb24gbW9kZSBtZWV0IElQVSByZXN0cmljdGlvbnMsCisgKiAt RUlOVkFMIG90aGVyd2lzZS4KKyAqLworaW50IGlwdV9pbWFnZV9jb252ZXJ0X3ZlcmlmeShzdHJ1 Y3QgaXB1X2ltYWdlICppbiwgc3RydWN0IGlwdV9pbWFnZSAqb3V0LAorCQkJICAgICBlbnVtIGlw dV9yb3RhdGVfbW9kZSByb3RfbW9kZSk7CisKKy8qKgorICogaXB1X2ltYWdlX2NvbnZlcnRfcHJl cGFyZSgpIC0gcHJlcGFyZSBhIGNvbnZlcnNpb24gY29udGV4dC4KKyAqCisgKiBAaXB1Ogl0aGUg SVBVIGhhbmRsZSB0byB1c2UgZm9yIHRoZSBjb252ZXJzaW9ucworICogQGljX3Rhc2s6CXRoZSBJ QyB0YXNrIHRvIHVzZSBmb3IgdGhlIGNvbnZlcnNpb25zCisgKiBAaW46CQlpbnB1dCBpbWFnZSBm b3JtYXQKKyAqIEBvdXQ6CW91dHB1dCBpbWFnZSBmb3JtYXQKKyAqIEByb3RfbW9kZToJcm90YXRp b24gbW9kZQorICogQGNvbXBsZXRlOglydW4gY29tcGxldGlvbiBjYWxsYmFjaworICogQGNvbXBs ZXRlX2NvbnRleHQ6CWEgY29udGV4dCBwb2ludGVyIGZvciB0aGUgY29tcGxldGlvbiBjYWxsYmFj aworICoKKyAqIFJldHVybnMgYW4gb3BhcXVlIGNvbnZlcnNpb24gY29udGV4dCBwb2ludGVyIG9u IHN1Y2Nlc3MsIGVycm9yIHBvaW50ZXIKKyAqIG9uIGZhaWx1cmUuIFRoZSBpbnB1dC9vdXRwdXQg Zm9ybWF0cyBhbmQgcm90YXRpb24gbW9kZSBtdXN0IGFscmVhZHkgbWVldAorICogSVBVIHJldHJp Y3Rpb25zLgorICoKKyAqIEluIFY0TDIsIGRyaXZlcnMgc2hvdWxkIGNhbGwgaXB1X2ltYWdlX2Nv bnZlcnRfcHJlcGFyZSgpIGF0IHN0cmVhbW9uLgorICovCitzdHJ1Y3QgaXB1X2ltYWdlX2NvbnZl cnRfY3R4ICoKK2lwdV9pbWFnZV9jb252ZXJ0X3ByZXBhcmUoc3RydWN0IGlwdV9zb2MgKmlwdSwg ZW51bSBpcHVfaWNfdGFzayBpY190YXNrLAorCQkJICBzdHJ1Y3QgaXB1X2ltYWdlICppbiwgc3Ry dWN0IGlwdV9pbWFnZSAqb3V0LAorCQkJICBlbnVtIGlwdV9yb3RhdGVfbW9kZSByb3RfbW9kZSwK KwkJCSAgaXB1X2ltYWdlX2NvbnZlcnRfY2JfdCBjb21wbGV0ZSwKKwkJCSAgdm9pZCAqY29tcGxl dGVfY29udGV4dCk7CisKKy8qKgorICogaXB1X2ltYWdlX2NvbnZlcnRfdW5wcmVwYXJlKCkgLSB1 bnByZXBhcmUgYSBjb252ZXJzaW9uIGNvbnRleHQuCisgKgorICogQGN0eDogdGhlIGNvbnZlcnNp b24gY29udGV4dCBwb2ludGVyIHRvIHVucHJlcGFyZQorICoKKyAqIEFib3J0cyBhbnkgYWN0aXZl IG9yIHBlbmRpbmcgY29udmVyc2lvbnMgZm9yIHRoaXMgY29udGV4dCBhbmQKKyAqIGZyZWVzIHRo ZSBjb250ZXh0LiBBbnkgY3VycmVudGx5IGFjdGl2ZSBvciBwZW5kaW5nIHJ1bnMgYmVsb25naW5n CisgKiB0byB0aGlzIGNvbnRleHQgYXJlIHJldHVybmVkIHZpYSB0aGUgY29tcGxldGlvbiBjYWxs YmFjayB3aXRoIGFuCisgKiBlcnJvciBydW4gc3RhdHVzLgorICoKKyAqIEluIFY0TDIsIGRyaXZl cnMgc2hvdWxkIGNhbGwgaXB1X2ltYWdlX2NvbnZlcnRfdW5wcmVwYXJlKCkgYXQKKyAqIHN0cmVh bW9mZi4KKyAqLwordm9pZCBpcHVfaW1hZ2VfY29udmVydF91bnByZXBhcmUoc3RydWN0IGlwdV9p bWFnZV9jb252ZXJ0X2N0eCAqY3R4KTsKKworLyoqCisgKiBpcHVfaW1hZ2VfY29udmVydF9xdWV1 ZSgpIC0gcXVldWUgYSBjb252ZXJzaW9uIHJ1bgorICoKKyAqIEBydW46IHRoZSBydW4gcmVxdWVz dCBwb2ludGVyCisgKgorICogaXB1X2ltYWdlX2NvbnZlcnRfcnVuIG11c3QgYmUgZHluYW1pY2Fs bHkgYWxsb2NhdGVkIChfbm90XyBhcyBhIGxvY2FsCisgKiB2YXIpIGJ5IGNhbGxlcnMgYW5kIGZp bGxlZCBpbiB3aXRoIGEgcHJldmlvdXNseSBwcmVwYXJlZCBjb252ZXJzaW9uCisgKiBjb250ZXh0 IGhhbmRsZSBhbmQgdGhlIGRtYSBhZGRyJ3Mgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgaW1hZ2Ug YnVmZmVycworICogZm9yIHRoaXMgY29udmVyc2lvbiBydW4uCisgKgorICogV2hlbiB0aGlzIGNv bnZlcnNpb24gY29tcGxldGVzLCB0aGUgcnVuIHBvaW50ZXIgaXMgcmV0dXJuZWQgdmlhIHRoZQor ICogY29tcGxldGlvbiBjYWxsYmFjay4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJl ZWluZyB0aGUgcnVuCisgKiBvYmplY3QgYWZ0ZXIgaXQgY29tcGxldGVzLgorICoKKyAqIEluIFY0 TDIsIGRyaXZlcnMgc2hvdWxkIGNhbGwgaXB1X2ltYWdlX2NvbnZlcnRfcXVldWUoKSB3aGlsZQor ICogc3RyZWFtaW5nIHRvIHF1ZXVlIHRoZSBjb252ZXJzaW9uIG9mIGEgcmVjZWl2ZWQgaW5wdXQg YnVmZmVyLgorICogRm9yIGV4YW1wbGUgbWVtMm1lbSBkZXZpY2VzIHRoaXMgd291bGQgYmUgY2Fs bGVkIGluIC5kZXZpY2VfcnVuLgorICovCitpbnQgaXB1X2ltYWdlX2NvbnZlcnRfcXVldWUoc3Ry dWN0IGlwdV9pbWFnZV9jb252ZXJ0X3J1biAqcnVuKTsKKworLyoqCisgKiBpcHVfaW1hZ2VfY29u dmVydF9hYm9ydCgpIC0gYWJvcnQgY29udmVyc2lvbnMKKyAqCisgKiBAY3R4OiB0aGUgY29udmVy c2lvbiBjb250ZXh0IHBvaW50ZXIKKyAqIAorICogVGhpcyB3aWxsIGFib3J0IGFueSBhY3RpdmUg b3IgcGVuZGluZyBjb252ZXJzaW9ucyBmb3IgdGhpcyBjb250ZXh0LgorICogQW55IGN1cnJlbnRs eSBhY3RpdmUgb3IgcGVuZGluZyBydW5zIGJlbG9uZ2luZyB0byB0aGlzIGNvbnRleHQgYXJlCisg KiByZXR1cm5lZCB2aWEgdGhlIGNvbXBsZXRpb24gY2FsbGJhY2sgd2l0aCBhbiBlcnJvciBydW4g c3RhdHVzLgorICovCit2b2lkIGlwdV9pbWFnZV9jb252ZXJ0X2Fib3J0KHN0cnVjdCBpcHVfaW1h Z2VfY29udmVydF9jdHggKmN0eCk7CisKKy8qKgorICogaXB1X2ltYWdlX2NvbnZlcnQoKSAtIGFz eW5jaHJvbm91cyBpbWFnZSBjb252ZXJzaW9uIHJlcXVlc3QKKyAqCisgKiBAaXB1Ogl0aGUgSVBV IGhhbmRsZSB0byB1c2UgZm9yIHRoZSBjb252ZXJzaW9uCisgKiBAaWNfdGFzazoJdGhlIElDIHRh c2sgdG8gdXNlIGZvciB0aGUgY29udmVyc2lvbgorICogQGluOgkJaW5wdXQgaW1hZ2UgZm9ybWF0 CisgKiBAb3V0OglvdXRwdXQgaW1hZ2UgZm9ybWF0CisgKiBAcm90X21vZGU6CXJvdGF0aW9uIG1v ZGUKKyAqIEBjb21wbGV0ZToJcnVuIGNvbXBsZXRpb24gY2FsbGJhY2sKKyAqIEBjb21wbGV0ZV9j b250ZXh0OglhIGNvbnRleHQgcG9pbnRlciBmb3IgdGhlIGNvbXBsZXRpb24gY2FsbGJhY2sKKyAq CisgKiBSZXF1ZXN0IGEgc2luZ2xlIGltYWdlIGNvbnZlcnNpb24uIFJldHVybnMgdGhlIHJ1biB0 aGF0IGhhcyBiZWVuIHF1ZXVlZC4KKyAqIEEgY29udmVyc2lvbiBjb250ZXh0IGlzIGF1dG9tYXRp Y2FsbHkgY3JlYXRlZCBhbmQgaXMgYXZhaWxhYmxlIGluIHJ1bi0+Y3R4LgorICogQXMgd2l0aCBp cHVfaW1hZ2VfY29udmVydF9wcmVwYXJlKCksIHRoZSBpbnB1dC9vdXRwdXQgZm9ybWF0cyBhbmQg cm90YXRpb24KKyAqIG1vZGUgbXVzdCBhbHJlYWR5IG1lZXQgSVBVIHJldHJpY3Rpb25zLgorICoK KyAqIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuIHRoZSBjYWxsZXIgY2FuIHF1ZXVlIG1vcmUgcnVuIHJl cXVlc3RzIGlmIG5lZWRlZCwgdXNpbmcKKyAqIHRoZSBwcmVwYXJlZCBjb250ZXh0IGluIHJ1bi0+ Y3R4LiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciB1bnByZXBhcmluZworICogdGhlIGNv bnRleHQgd2hlbiBubyBtb3JlIGNvbnZlcnNpb24gcmVxdWVzdHMgYXJlIG5lZWRlZC4KKyAqLwor c3RydWN0IGlwdV9pbWFnZV9jb252ZXJ0X3J1biAqCitpcHVfaW1hZ2VfY29udmVydChzdHJ1Y3Qg aXB1X3NvYyAqaXB1LCBlbnVtIGlwdV9pY190YXNrIGljX3Rhc2ssCisJCSAgc3RydWN0IGlwdV9p bWFnZSAqaW4sIHN0cnVjdCBpcHVfaW1hZ2UgKm91dCwKKwkJICBlbnVtIGlwdV9yb3RhdGVfbW9k ZSByb3RfbW9kZSwKKwkJICBpcHVfaW1hZ2VfY29udmVydF9jYl90IGNvbXBsZXRlLAorCQkgIHZv aWQgKmNvbXBsZXRlX2NvbnRleHQpOworCisvKioKKyAqIGlwdV9pbWFnZV9jb252ZXJ0X3N5bmMo KSAtIHN5bmNocm9ub3VzIHNpbmdsZSBpbWFnZSBjb252ZXJzaW9uIHJlcXVlc3QKKyAqCisgKiBA aXB1Ogl0aGUgSVBVIGhhbmRsZSB0byB1c2UgZm9yIHRoZSBjb252ZXJzaW9uCisgKiBAaWNfdGFz azoJdGhlIElDIHRhc2sgdG8gdXNlIGZvciB0aGUgY29udmVyc2lvbgorICogQGluOgkJaW5wdXQg aW1hZ2UgZm9ybWF0CisgKiBAb3V0OglvdXRwdXQgaW1hZ2UgZm9ybWF0CisgKiBAcm90X21vZGU6 CXJvdGF0aW9uIG1vZGUKKyAqCisgKiBDYXJyeSBvdXQgYSBzaW5nbGUgaW1hZ2UgY29udmVyc2lv bi4gUmV0dXJucyB3aGVuIHRoZSBjb252ZXJzaW9uCisgKiBjb21wbGV0ZXMuIFRoZSBpbnB1dC9v dXRwdXQgZm9ybWF0cyBhbmQgcm90YXRpb24gbW9kZSBtdXN0IGFscmVhZHkKKyAqIG1lZXQgSVBV IHJldHJpY3Rpb25zLiBUaGUgY3JlYXRlZCBjb250ZXh0IGlzIGF1dG9tYXRpY2FsbHkgdW5wcmVw YXJlZAorICogYW5kIHRoZSBydW4gZnJlZWQgb24gcmV0dXJuLgorICovCitpbnQgaXB1X2ltYWdl X2NvbnZlcnRfc3luYyhzdHJ1Y3QgaXB1X3NvYyAqaXB1LCBlbnVtIGlwdV9pY190YXNrIGljX3Rh c2ssCisJCQkgICBzdHJ1Y3QgaXB1X2ltYWdlICppbiwgc3RydWN0IGlwdV9pbWFnZSAqb3V0LAor CQkJICAgZW51bSBpcHVfcm90YXRlX21vZGUgcm90X21vZGUpOworCisKKyNlbmRpZiAvKiBfX0lN WF9JTUFHRV9DT05WRVJUX0hfXyAqLwotLSAKMi43LjQKCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVs QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWls bWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=