From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5BA11C433E6 for ; Wed, 3 Feb 2021 07:45:55 +0000 (UTC) Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0555F64DDB for ; Wed, 3 Feb 2021 07:45:54 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0555F64DDB Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=virtualization-bounces@lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id B2C5920469; Wed, 3 Feb 2021 07:45:54 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id GtJf6pHDtjRR; Wed, 3 Feb 2021 07:45:48 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id 4100120488; Wed, 3 Feb 2021 07:45:48 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 2A683C0FA7; Wed, 3 Feb 2021 07:45:48 +0000 (UTC) Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 5394FC013A for ; Wed, 3 Feb 2021 07:45:47 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 4E8DE85CAA for ; Wed, 3 Feb 2021 07:45:47 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id R_GftCPUp2qn for ; Wed, 3 Feb 2021 07:45:44 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by fraxinus.osuosl.org (Postfix) with ESMTPS id 8784085116 for ; Wed, 3 Feb 2021 07:45:44 +0000 (UTC) IronPort-SDR: Jv01I70qQwh1qERxETBxIRxUMR2OPB0J/32PR5xLKv7eL92L13NTwPnbkevkSn8ffD+afG8sgA 7MvVdmVW1SfQ== X-IronPort-AV: E=McAfee;i="6000,8403,9883"; a="180225891" X-IronPort-AV: E=Sophos;i="5.79,397,1602572400"; d="scan'208";a="180225891" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2021 23:45:43 -0800 IronPort-SDR: c1CWC6AZTXNmY1fdnXQ9EvyghMtQOSuzmeNvWclYNl08Lpdai3r10f09qZwxKM+IEQvraWyIO0 bX5st4pokXQw== X-IronPort-AV: E=Sophos;i="5.79,397,1602572400"; d="scan'208";a="433280702" Received: from vkasired-desk2.fm.intel.com ([10.105.128.127]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2021 23:45:42 -0800 From: Vivek Kasireddy To: virtualization@lists.linux-foundation.org, dri-devel@lists.freedesktop.org Subject: [RFC v3 3/3] vhost: Add Vdmabuf backend Date: Tue, 2 Feb 2021 23:35:17 -0800 Message-Id: <20210203073517.1908882-4-vivek.kasireddy@intel.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210203073517.1908882-1-vivek.kasireddy@intel.com> References: <20210203073517.1908882-1-vivek.kasireddy@intel.com> MIME-Version: 1.0 Cc: dongwon.kim@intel.com, daniel.vetter@ffwll.ch, sumit.semwal@linaro.org, daniel.vetter@intel.com, christian.koenig@amd.com, linux-media@vger.kernel.org X-BeenThere: virtualization@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Linux virtualization List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: virtualization-bounces@lists.linux-foundation.org Sender: "Virtualization" VGhpcyBiYWNrZW5kIGFjdHMgYXMgdGhlIGNvdW50ZXJwYXJ0IHRvIHRoZSBWZG1hYnVmIFZpcnRp byBmcm9udGVuZC4KV2hlbiBpdCByZWNlaXZlcyBhIG5ldyBleHBvcnQgZXZlbnQgZnJvbSB0aGUg ZnJvbnRlbmQsIGl0IHJhaXNlcyBhbgpldmVudCB0byBhbGVydCB0aGUgUWVtdSBVSS91c2Vyc3Bh Y2UuIFFlbXUgdGhlbiAiaW1wb3J0cyIgdGhpcyBidWZmZXIKdXNpbmcgdGhlIFVuaXF1ZSBJRC4K CkFzIHBhcnQgb2YgdGhlIGltcG9ydCBzdGVwLCBhIG5ldyBkbWFidWYgaXMgY3JlYXRlZCBvbiB0 aGUgSG9zdCB1c2luZwp0aGUgcGFnZSBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIHRoZSBHdWVz dC4gVGhlIGZkIGFzc29jaWF0ZWQgd2l0aAp0aGlzIGRtYWJ1ZiBpcyBtYWRlIGF2YWlsYWJsZSB0 byBRZW11IFVJL3VzZXJzcGFjZSB3aGljaCB0aGVuIGNyZWF0ZXMKYSB0ZXh0dXJlIGZyb20gaXQg Zm9yIHRoZSBwdXJwb3NlIG9mIGRpc3BsYXlpbmcgaXQuCgpTaWduZWQtb2ZmLWJ5OiBEb25nd29u IEtpbSA8ZG9uZ3dvbi5raW1AaW50ZWwuY29tPgpTaWduZWQtb2ZmLWJ5OiBWaXZlayBLYXNpcmVk ZHkgPHZpdmVrLmthc2lyZWRkeUBpbnRlbC5jb20+Ci0tLQogZHJpdmVycy92aG9zdC9LY29uZmln ICAgICAgfCAgICA5ICsKIGRyaXZlcnMvdmhvc3QvTWFrZWZpbGUgICAgIHwgICAgMyArCiBkcml2 ZXJzL3Zob3N0L3ZkbWFidWYuYyAgICB8IDE0NDYgKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrCiBpbmNsdWRlL3VhcGkvbGludXgvdmhvc3QuaCB8ICAgIDMgKwogNCBmaWxlcyBj aGFuZ2VkLCAxNDYxIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3Zo b3N0L3ZkbWFidWYuYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3QvS2NvbmZpZyBiL2RyaXZl cnMvdmhvc3QvS2NvbmZpZwppbmRleCA1ODdmYmFlMDYxODIuLjlhOTljYzI2MTFjYSAxMDA2NDQK LS0tIGEvZHJpdmVycy92aG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmhvc3QvS2NvbmZpZwpA QCAtODksNCArODksMTMgQEAgY29uZmlnIFZIT1NUX0NST1NTX0VORElBTl9MRUdBQ1kKIAogCSAg SWYgdW5zdXJlLCBzYXkgIk4iLgogCitjb25maWcgVkhPU1RfVkRNQUJVRgorCWJvb2wgIlZob3N0 IGJhY2tlbmQgZm9yIHRoZSBWZG1hYnVmIGRyaXZlciIKKwlkZXBlbmRzIG9uIEtWTSAmJiBFVkVO VEZECisJc2VsZWN0IFZIT1NUCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBkcml2ZXIgd29y a3MgaW4gcGFpciB3aXRoIHRoZSBWaXJ0aW8gVmRtYWJ1ZiBmcm9udGVuZC4gSXQgY2FuCisJICBi ZSB1c2VkIHRvIGNyZWF0ZSBhIGRtYWJ1ZiB1c2luZyB0aGUgcGFnZXMgc2hhcmVkIGJ5IHRoZSBH dWVzdC4KKwogZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3QvTWFrZWZpbGUgYi9kcml2 ZXJzL3Zob3N0L01ha2VmaWxlCmluZGV4IGYzZTE4OTdjY2U4NS4uNWMyY2VhNGE3ZWFmIDEwMDY0 NAotLS0gYS9kcml2ZXJzL3Zob3N0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmhvc3QvTWFrZWZp bGUKQEAgLTE3LDMgKzE3LDYgQEAgb2JqLSQoQ09ORklHX1ZIT1NUKQkrPSB2aG9zdC5vCiAKIG9i ai0kKENPTkZJR19WSE9TVF9JT1RMQikgKz0gdmhvc3RfaW90bGIubwogdmhvc3RfaW90bGIteSA6 PSBpb3RsYi5vCisKK29iai0kKENPTkZJR19WSE9TVF9WRE1BQlVGKSArPSB2aG9zdF92ZG1hYnVm Lm8KK3Zob3N0X3ZkbWFidWYteSA6PSB2ZG1hYnVmLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhv c3QvdmRtYWJ1Zi5jIGIvZHJpdmVycy92aG9zdC92ZG1hYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAwLi4xZDZlOWJjZjY2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9k cml2ZXJzL3Zob3N0L3ZkbWFidWYuYwpAQCAtMCwwICsxLDE0NDYgQEAKKy8vIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiAoTUlUIE9SIEdQTC0yLjApCisKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAy MSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQs IGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRo aXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0 d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwg aW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHks IG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQv b3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8g d2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0 aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3Rp Y2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFy YWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBv cnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJ REVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAq IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Yg TUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5E IE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBD T1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhF UgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBP UiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJ VEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBT T0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgRG9uZ3dvbiBLaW0gPGRvbmd3b24ua2lt QGludGVsLmNvbT4KKyAqICAgIE1hdGV1c3ogUG9scm9sYSA8bWF0ZXVzei5wb2xyb2xhQGdtYWls LmNvbT4KKyAqICAgIFZpdmVrIEthc2lyZWRkeSA8dml2ZWsua2FzaXJlZGR5QGludGVsLmNvbT4K KyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8u aD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cisj aW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Cisj aW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2lu Y2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2h0YWJsZS5oPgorI2lu Y2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVk ZSA8bGludXgvZG1hLWJ1Zi5oPgorI2luY2x1ZGUgPGxpbnV4L3Zob3N0Lmg+CisjaW5jbHVkZSA8 bGludXgvdmZpby5oPgorI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CisjaW5jbHVkZSA8bGlu dXgvdmlydGlvX3ZkbWFidWYuaD4KKworI2luY2x1ZGUgInZob3N0LmgiCisKKyNkZWZpbmUgUkVG U19QRVJfUEFHRSAoUEFHRV9TSVpFL3NpemVvZihsb25nKSkKKworZW51bSB7CisJVkhPU1RfVkRN QUJVRl9GRUFUVVJFUyA9IFZIT1NUX0ZFQVRVUkVTLAorfTsKKworc3RhdGljIHN0cnVjdCB2aXJ0 aW9fdmRtYWJ1Zl9pbmZvICpkcnZfaW5mbzsKKworc3RydWN0IGt2bV9pbnN0YW5jZSB7CisJc3Ry dWN0IGt2bSAqa3ZtOworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKK307CisKK3N0cnVjdCB2aG9z dF92ZG1hYnVmIHsKKwlzdHJ1Y3Qgdmhvc3RfZGV2IGRldjsKKwlzdHJ1Y3Qgdmhvc3RfdmlydHF1 ZXVlIHZxc1tWRE1BQlVGX1ZRX01BWF07CisJc3RydWN0IHZob3N0X3dvcmsgc2VuZF93b3JrOwor CXN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9ldmVudF9xdWV1ZSAqZXZxOworCXU2NCB2bWlkOworCisJ c3RydWN0IGxpc3RfaGVhZCBtc2dfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3Ry dWN0IGt2bSAqa3ZtOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHZob3N0X3ZkbWFidWZfYWRk KHN0cnVjdCB2aG9zdF92ZG1hYnVmICpuZXcpCit7CisJbGlzdF9hZGRfdGFpbCgmbmV3LT5saXN0 LCAmZHJ2X2luZm8tPmhlYWRfdmRtYWJ1Zl9saXN0KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1 Y3Qgdmhvc3RfdmRtYWJ1ZiAqdmhvc3RfdmRtYWJ1Zl9maW5kKHU2NCB2bWlkKQoreworCXN0cnVj dCB2aG9zdF92ZG1hYnVmICpmb3VuZDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZm91bmQsICZk cnZfaW5mby0+aGVhZF92ZG1hYnVmX2xpc3QsIGxpc3QpCisJCWlmIChmb3VuZC0+dm1pZCA9PSB2 bWlkKQorCQkJcmV0dXJuIGZvdW5kOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxp bmUgYm9vbCB2aG9zdF92ZG1hYnVmX2RlbChzdHJ1Y3Qgdmhvc3RfdmRtYWJ1ZiAqdmRtYWJ1ZikK K3sKKwlzdHJ1Y3Qgdmhvc3RfdmRtYWJ1ZiAqaXRlciwgKnRlbXA7CisKKwlsaXN0X2Zvcl9lYWNo X2VudHJ5X3NhZmUoaXRlciwgdGVtcCwKKwkJCQkgJmRydl9pbmZvLT5oZWFkX3ZkbWFidWZfbGlz dCwKKwkJCQkgbGlzdCkKKwkJaWYgKGl0ZXIgPT0gdmRtYWJ1ZikgeworCQkJbGlzdF9kZWwoJml0 ZXItPmxpc3QpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCXJldHVybiBmYWxzZTsKK30KKwor c3RhdGljIGlubGluZSB2b2lkIHZob3N0X3ZkbWFidWZfZGVsX2FsbCh2b2lkKQoreworCXN0cnVj dCB2aG9zdF92ZG1hYnVmICppdGVyLCAqdGVtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2Fm ZShpdGVyLCB0ZW1wLAorCQkJCSAmZHJ2X2luZm8tPmhlYWRfdmRtYWJ1Zl9saXN0LAorCQkJCSBs aXN0KSB7CisJCWxpc3RfZGVsKCZpdGVyLT5saXN0KTsKKwkJa2ZyZWUoaXRlcik7CisJfQorfQor CitzdGF0aWMgdm9pZCAqbWFwX2dwYShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdwYV90IGdwYSkK K3sKKwlzdHJ1Y3Qga3ZtX2hvc3RfbWFwIG1hcDsKKwlpbnQgcmV0OworCisJcmV0ID0ga3ZtX3Zj cHVfbWFwKHZjcHUsIGdwYV90b19nZm4oZ3BhKSwgJm1hcCk7CisJaWYgKHJldCA8IDApCisJCXJl dHVybiBFUlJfUFRSKHJldCk7CisJZWxzZQorCQlyZXR1cm4gbWFwLmh2YTsKK30KKworc3RhdGlj IHZvaWQgdW5tYXBfaHZhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgaHZhKQoreworCXN0 cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKGh2YSk7CisJc3RydWN0IGt2bV9ob3N0X21h cCBtYXA7CisKKwltYXAuaHZhID0gKHZvaWQgKilodmE7CisJbWFwLnBhZ2UgPSBwYWdlOworCisJ a3ZtX3ZjcHVfdW5tYXAodmNwdSwgJm1hcCwgdHJ1ZSk7Cit9CisKKy8qIG1hcHBpbmcgZ3Vlc3Qn cyBwYWdlcyBmb3IgdGhlIHZkbWFidWYgKi8KK3N0YXRpYyBpbnQKK3Zob3N0X3ZkbWFidWZfbWFw X3BhZ2VzKHU2NCB2bWlkLAorCQkgICAgICAgIHN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9zaGFyZWRf cGFnZXMgKnBhZ2VzX2luZm8pCit7CisJc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYgPSB2 aG9zdF92ZG1hYnVmX2ZpbmQodm1pZCk7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OworCXZvaWQg KnBhZGRyOworCWludCBucGdzID0gUkVGU19QRVJfUEFHRTsKKwlpbnQgbGFzdF9uZW50cywgbl9s MnJlZnM7CisJaW50IGksIGogPSAwLCBrID0gMDsKKworCWlmICghdmRtYWJ1ZiB8fCAhdmRtYWJ1 Zi0+a3ZtIHx8ICFwYWdlc19pbmZvIHx8IHBhZ2VzX2luZm8tPnBhZ2VzKQorCQlyZXR1cm4gLUVJ TlZBTDsKKworCXZjcHUgPSBrdm1fZ2V0X3ZjcHVfYnlfaWQodmRtYWJ1Zi0+a3ZtLCAwKTsKKwlp ZiAoIXZjcHUpCisJCXJldHVybiAtRUlOVkFMOworCisJbGFzdF9uZW50cyA9IChwYWdlc19pbmZv LT5uZW50cyAtIDEpICUgbnBncyArIDE7CisJbl9sMnJlZnMgPSAocGFnZXNfaW5mby0+bmVudHMg LyBucGdzKSArICgobGFzdF9uZW50cyA+IDApID8gMSA6IDApIC0KKwkJICAgKGxhc3RfbmVudHMg PT0gbnBncyk7CisKKwlwYWdlc19pbmZvLT5wYWdlcyA9IGtjYWxsb2MocGFnZXNfaW5mby0+bmVu dHMsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFw YWdlc19pbmZvLT5wYWdlcykKKwkJZ290byBmYWlsX3BhZ2VfYWxsb2M7CisKKwlwYWdlc19pbmZv LT5sMnJlZnMgPSBrY2FsbG9jKG5fbDJyZWZzLCBzaXplb2YoZ3BhX3QgKiksIEdGUF9LRVJORUwp OworCWlmICghcGFnZXNfaW5mby0+bDJyZWZzKQorCQlnb3RvIGZhaWxfbDJyZWZzOworCisJcGFn ZXNfaW5mby0+bDNyZWZzID0gKGdwYV90ICopbWFwX2dwYSh2Y3B1LCBwYWdlc19pbmZvLT5yZWYp OworCWlmIChJU19FUlIocGFnZXNfaW5mby0+bDNyZWZzKSkKKwkJZ290byBmYWlsX2wzcmVmczsK KworCWZvciAoaSA9IDA7IGkgPCBuX2wycmVmczsgaSsrKSB7CisJCXBhZ2VzX2luZm8tPmwycmVm c1tpXSA9IChncGFfdCAqKW1hcF9ncGEodmNwdSwKKwkJCQkJCQkgcGFnZXNfaW5mby0+bDNyZWZz W2ldKTsKKworCQlpZiAoSVNfRVJSKHBhZ2VzX2luZm8tPmwycmVmc1tpXSkpCisJCQlnb3RvIGZh aWxfbWFwcGluZ19sMjsKKworCQkvKiBsYXN0IGxldmVsLTIgcmVmICovCisJCWlmIChpID09IG5f bDJyZWZzIC0gMSkKKwkJCW5wZ3MgPSBsYXN0X25lbnRzOworCisJCWZvciAoaiA9IDA7IGogPCBu cGdzOyBqKyspIHsKKwkJCXBhZGRyID0gbWFwX2dwYSh2Y3B1LCBwYWdlc19pbmZvLT5sMnJlZnNb aV1bal0pOworCQkJaWYgKElTX0VSUihwYWRkcikpCisJCQkJZ290byBmYWlsX21hcHBpbmdfbDE7 CisKKwkJCXBhZ2VzX2luZm8tPnBhZ2VzW2tdID0gdmlydF90b19wYWdlKHBhZGRyKTsKKwkJCWsr KzsKKwkJfQorCQl1bm1hcF9odmEodmNwdSwgcGFnZXNfaW5mby0+bDNyZWZzW2ldKTsKKwl9CisK Kwl1bm1hcF9odmEodmNwdSwgcGFnZXNfaW5mby0+cmVmKTsKKworCXJldHVybiAwOworCitmYWls X21hcHBpbmdfbDE6CisJZm9yIChrID0gMDsgayA8IGo7IGsrKykKKwkJdW5tYXBfaHZhKHZjcHUs IHBhZ2VzX2luZm8tPmwycmVmc1tpXVtrXSk7CisKK2ZhaWxfbWFwcGluZ19sMjoKKwlmb3IgKGog PSAwOyBqIDwgaTsgaisrKSB7CisJCWZvciAoayA9IDA7IGsgPCBSRUZTX1BFUl9QQUdFOyBrKysp CisJCQl1bm1hcF9odmEodmNwdSwgcGFnZXNfaW5mby0+bDJyZWZzW2ldW2tdKTsKKwl9CisKKwl1 bm1hcF9odmEodmNwdSwgcGFnZXNfaW5mby0+bDNyZWZzW2ldKTsKKwl1bm1hcF9odmEodmNwdSwg cGFnZXNfaW5mby0+cmVmKTsKKworZmFpbF9sM3JlZnM6CisJa2ZyZWUocGFnZXNfaW5mby0+bDJy ZWZzKTsKKworZmFpbF9sMnJlZnM6CisJa2ZyZWUocGFnZXNfaW5mby0+cGFnZXMpOworCitmYWls X3BhZ2VfYWxsb2M6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qIHVubWFwcGluZyBtYXBwZWQg cGFnZXMgKi8KK3N0YXRpYyBpbnQKK3Zob3N0X3ZkbWFidWZfdW5tYXBfcGFnZXModTY0IHZtaWQs CisJCQkgIHN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9zaGFyZWRfcGFnZXMgKnBhZ2VzX2luZm8pCit7 CisJc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYgPSB2aG9zdF92ZG1hYnVmX2ZpbmQodm1p ZCk7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OworCWludCBsYXN0X25lbnRzID0gKHBhZ2VzX2lu Zm8tPm5lbnRzIC0gMSkgJSBSRUZTX1BFUl9QQUdFICsgMTsKKwlpbnQgbl9sMnJlZnMgPSAocGFn ZXNfaW5mby0+bmVudHMgLyBSRUZTX1BFUl9QQUdFKSArCisJCSAgICAgICAoKGxhc3RfbmVudHMg PiAwKSA/IDEgOiAwKSAtCisJCSAgICAgICAobGFzdF9uZW50cyA9PSBSRUZTX1BFUl9QQUdFKTsK KwlpbnQgaSwgajsKKworCWlmICghdmRtYWJ1ZiB8fCAhdmRtYWJ1Zi0+a3ZtIHx8ICFwYWdlc19p bmZvIHx8IHBhZ2VzX2luZm8tPnBhZ2VzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZjcHUgPSBr dm1fZ2V0X3ZjcHVfYnlfaWQodmRtYWJ1Zi0+a3ZtLCAwKTsKKwlpZiAoIXZjcHUpCisJCXJldHVy biAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IG5fbDJyZWZzIC0gMTsgaSsrKSB7CisJCWZv ciAoaiA9IDA7IGogPCBSRUZTX1BFUl9QQUdFOyBqKyspCisJCQl1bm1hcF9odmEodmNwdSwgcGFn ZXNfaW5mby0+bDJyZWZzW2ldW2pdKTsKKwl9CisKKwlmb3IgKGogPSAwOyBqIDwgbGFzdF9uZW50 czsgaisrKQorCQl1bm1hcF9odmEodmNwdSwgcGFnZXNfaW5mby0+bDJyZWZzW2ldW2pdKTsKKwor CWtmcmVlKHBhZ2VzX2luZm8tPmwycmVmcyk7CisJa2ZyZWUocGFnZXNfaW5mby0+cGFnZXMpOwor CXBhZ2VzX2luZm8tPnBhZ2VzID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisvKiBjcmVhdGUg c2dfdGFibGUgd2l0aCBnaXZlbiBwYWdlcyBhbmQgb3RoZXIgcGFyYW1ldGVycyAqLworc3RhdGlj IHN0cnVjdCBzZ190YWJsZSAqbmV3X3NndChzdHJ1Y3QgcGFnZSAqKnBncywKKwkJCQlpbnQgZmly c3Rfb2ZzdCwgaW50IGxhc3RfbGVuLAorCQkJCWludCBuZW50cykKK3sKKwlzdHJ1Y3Qgc2dfdGFi bGUgKnNndDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbDsKKwlpbnQgaSwgcmV0OworCisJc2d0 ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNnX3RhYmxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFz Z3QpCisJCXJldHVybiBOVUxMOworCisJcmV0ID0gc2dfYWxsb2NfdGFibGUoc2d0LCBuZW50cywg R0ZQX0tFUk5FTCk7CisJaWYgKHJldCkgeworCQlrZnJlZShzZ3QpOworCQlyZXR1cm4gTlVMTDsK Kwl9CisKKwlzZ2wgPSBzZ3QtPnNnbDsKKwlzZ19zZXRfcGFnZShzZ2wsIHBnc1swXSwgUEFHRV9T SVpFLWZpcnN0X29mc3QsIGZpcnN0X29mc3QpOworCisJZm9yIChpID0gMTsgaSA8IG5lbnRzLTE7 IGkrKykgeworCQlzZ2wgPSBzZ19uZXh0KHNnbCk7CisJCXNnX3NldF9wYWdlKHNnbCwgcGdzW2ld LCBQQUdFX1NJWkUsIDApOworCX0KKworCS8qIG1vcmUgdGhhbiAxIHBhZ2UgKi8KKwlpZiAobmVu dHMgPiAxKSB7CisJCXNnbCA9IHNnX25leHQoc2dsKTsKKwkJc2dfc2V0X3BhZ2Uoc2dsLCBwZ3Nb aV0sIGxhc3RfbGVuLCAwKTsKKwl9CisKKwlyZXR1cm4gc2d0OworfQorCitzdGF0aWMgc3RydWN0 IHNnX3RhYmxlCisqdmhvc3RfdmRtYWJ1Zl9kbWFidWZfbWFwKHN0cnVjdCBkbWFfYnVmX2F0dGFj aG1lbnQgKmF0dGFjaG1lbnQsCisJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sK KwlzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfYnVmICppbXA7CisKKwlpZiAoIWF0dGFjaG1lbnQtPmRt YWJ1ZiB8fCAhYXR0YWNobWVudC0+ZG1hYnVmLT5wcml2KQorCQlyZXR1cm4gTlVMTDsKKworCWlt cCA9IChzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfYnVmICopYXR0YWNobWVudC0+ZG1hYnVmLT5wcml2 OworCisJLyogaWYgYnVmZmVyIGhhcyBuZXZlciBiZWVuIG1hcHBlZCAqLworCWlmICghaW1wLT5z Z3QpIHsKKwkJaW1wLT5zZ3QgPSBuZXdfc2d0KGltcC0+cGFnZXNfaW5mby0+cGFnZXMsCisJCQkJ ICAgaW1wLT5wYWdlc19pbmZvLT5maXJzdF9vZnN0LAorCQkJCSAgIGltcC0+cGFnZXNfaW5mby0+ bGFzdF9sZW4sCisJCQkJICAgaW1wLT5wYWdlc19pbmZvLT5uZW50cyk7CisKKwkJaWYgKCFpbXAt PnNndCkKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmICghZG1hX21hcF9zZyhhdHRhY2htZW50 LT5kZXYsIGltcC0+c2d0LT5zZ2wsCisJCQlpbXAtPnNndC0+bmVudHMsIGRpcikpIHsKKwkJc2df ZnJlZV90YWJsZShpbXAtPnNndCk7CisJCWtmcmVlKGltcC0+c2d0KTsKKwkJcmV0dXJuIE5VTEw7 CisJfQorCisJcmV0dXJuIGltcC0+c2d0OworfQorCitzdGF0aWMgdm9pZAordmhvc3RfdmRtYWJ1 Zl9kbWFidWZfdW5tYXAoc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqYXR0YWNobWVudCwKKwkg ICAJICAgICAgICAgICBzdHJ1Y3Qgc2dfdGFibGUgKnNnLAorCQkJICAgZW51bSBkbWFfZGF0YV9k aXJlY3Rpb24gZGlyKQoreworCWRtYV91bm1hcF9zZyhhdHRhY2htZW50LT5kZXYsIHNnLT5zZ2ws IHNnLT5uZW50cywgZGlyKTsKK30KKworc3RhdGljIGludCB2aG9zdF92ZG1hYnVmX2RtYWJ1Zl9t bWFwKHN0cnVjdCBkbWFfYnVmICpkbWFidWYsCisJCQkJICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1 Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfYnVmICppbXA7CisJdTY0IHVhZGRy OworCWludCBpLCBlcnI7CisKKwlpZiAoIWRtYWJ1Zi0+cHJpdikKKwkJcmV0dXJuIC1FSU5WQUw7 CisKKwlpbXAgPSAoc3RydWN0IHZpcnRpb192ZG1hYnVmX2J1ZiAqKWRtYWJ1Zi0+cHJpdjsKKwor CWlmICghaW1wLT5wYWdlc19pbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZtYS0+dm1fZmxh Z3MgfD0gVk1fRE9OVEVYUEFORCB8IFZNX0RPTlREVU1QOworCisJdWFkZHIgPSB2bWEtPnZtX3N0 YXJ0OworCWZvciAoaSA9IDA7IGkgPCBpbXAtPnBhZ2VzX2luZm8tPm5lbnRzOyBpKyspIHsKKwkJ ZXJyID0gdm1faW5zZXJ0X3BhZ2Uodm1hLCB1YWRkciwKKwkJCQkgICAgIGltcC0+cGFnZXNfaW5m by0+cGFnZXNbaV0pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQl1YWRkciArPSBQ QUdFX1NJWkU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmhvc3RfdmRtYWJ1 Zl9kbWFidWZfdm1hcChzdHJ1Y3QgZG1hX2J1ZiAqZG1hYnVmLAorCQkJCSAgICAgc3RydWN0IGRt YV9idWZfbWFwICptYXApCit7CisJc3RydWN0IHZpcnRpb192ZG1hYnVmX2J1ZiAqaW1wOworCXZv aWQgKmFkZHI7CisKKwlpZiAoIWRtYWJ1Zi0+cHJpdikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlp bXAgPSAoc3RydWN0IHZpcnRpb192ZG1hYnVmX2J1ZiAqKWRtYWJ1Zi0+cHJpdjsKKworCWlmICgh aW1wLT5wYWdlc19pbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFkZHIgPSB2bWFwKGltcC0+ cGFnZXNfaW5mby0+cGFnZXMsIGltcC0+cGFnZXNfaW5mby0+bmVudHMsCisgICAgICAgICAgICAg ICAgICAgIDAsIFBBR0VfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKGFkZHIpKQorCQlyZXR1cm4gUFRS X0VSUihhZGRyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2aG9zdF92ZG1hYnVm X2RtYWJ1Zl9yZWxlYXNlKHN0cnVjdCBkbWFfYnVmICpkbWFfYnVmKQoreworCXN0cnVjdCB2aXJ0 aW9fdmRtYWJ1Zl9idWYgKmltcDsKKworCWlmICghZG1hX2J1Zi0+cHJpdikKKwkJcmV0dXJuOwor CisJaW1wID0gKHN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9idWYgKilkbWFfYnVmLT5wcml2OworCWlt cC0+ZG1hX2J1ZiA9IE5VTEw7CisJaW1wLT52YWxpZCA9IGZhbHNlOworCisJdmhvc3RfdmRtYWJ1 Zl91bm1hcF9wYWdlcyhpbXAtPnZtaWQsIGltcC0+cGFnZXNfaW5mbyk7CisJdmlydGlvX3ZkbWFi dWZfZGVsX2J1ZihkcnZfaW5mbywgJmltcC0+YnVmX2lkKTsKKworCWlmIChpbXAtPnNndCkgewor CQlzZ19mcmVlX3RhYmxlKGltcC0+c2d0KTsKKwkJa2ZyZWUoaW1wLT5zZ3QpOworCQlpbXAtPnNn dCA9IE5VTEw7CisJfQorCisJa2ZyZWUoaW1wLT5wcml2KTsKKwlrZnJlZShpbXAtPnBhZ2VzX2lu Zm8pOworCWtmcmVlKGltcCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1hX2J1Zl9vcHMg dmhvc3RfdmRtYWJ1Zl9kbWFidWZfb3BzID0geworCS5tYXBfZG1hX2J1ZiA9IHZob3N0X3ZkbWFi dWZfZG1hYnVmX21hcCwKKwkudW5tYXBfZG1hX2J1ZiA9IHZob3N0X3ZkbWFidWZfZG1hYnVmX3Vu bWFwLAorCS5yZWxlYXNlID0gdmhvc3RfdmRtYWJ1Zl9kbWFidWZfcmVsZWFzZSwKKwkubW1hcCA9 IHZob3N0X3ZkbWFidWZfZG1hYnVmX21tYXAsCisJLnZtYXAgPSB2aG9zdF92ZG1hYnVmX2RtYWJ1 Zl92bWFwLAorfTsKKworLyogZXhwb3J0aW5nIGRtYWJ1ZiBhcyBmZCAqLworc3RhdGljIGludCB2 aG9zdF92ZG1hYnVmX2V4cF9mZChzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfYnVmICppbXAsIGludCBm bGFncykKK3sKKwlERUZJTkVfRE1BX0JVRl9FWFBPUlRfSU5GTyhleHBfaW5mbyk7CisKKwlleHBf aW5mby5vcHMgPSAmdmhvc3RfdmRtYWJ1Zl9kbWFidWZfb3BzOworCisJLyogbXVsdGlwbGUgb2Yg UEFHRV9TSVpFLCBub3QgY29uc2lkZXJpbmcgb2Zmc2V0ICovCisJZXhwX2luZm8uc2l6ZSA9IGlt cC0+cGFnZXNfaW5mby0+bmVudHMgKiBQQUdFX1NJWkU7CisJZXhwX2luZm8uZmxhZ3MgPSAwOwor CWV4cF9pbmZvLnByaXYgPSBpbXA7CisKKwlpZiAoIWltcC0+ZG1hX2J1ZikgeworCQlpbXAtPmRt YV9idWYgPSBkbWFfYnVmX2V4cG9ydCgmZXhwX2luZm8pOworCQlpZiAoSVNfRVJSX09SX05VTEwo aW1wLT5kbWFfYnVmKSkgeworCQkJaW1wLT5kbWFfYnVmID0gTlVMTDsKKwkJCXJldHVybiAtRUlO VkFMOworCQl9CisJfQorCisJcmV0dXJuIGRtYV9idWZfZmQoaW1wLT5kbWFfYnVmLCBmbGFncyk7 Cit9CisKK3N0YXRpYyBpbnQgdmhvc3RfdmRtYWJ1Zl9hZGRfZXZlbnQoc3RydWN0IHZob3N0X3Zk bWFidWYgKnZkbWFidWYsCisJCQkJICAgc3RydWN0IHZpcnRpb192ZG1hYnVmX2J1ZiAqYnVmX2lu Zm8pCit7CisJc3RydWN0IHZpcnRpb192ZG1hYnVmX2V2ZW50ICplX29sZGVzdCwgKmVfbmV3Owor CXN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9ldmVudF9xdWV1ZSAqZXZxID0gdmRtYWJ1Zi0+ZXZxOwor CXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKKwllX25ldyA9IGt6YWxsb2Moc2l6ZW9mKCplX25l dyksIEdGUF9LRVJORUwpOworCWlmICghZV9uZXcpCisJCXJldHVybiAtRU5PTUVNOworCisJZV9u ZXctPmVfZGF0YS5oZHIuYnVmX2lkID0gYnVmX2luZm8tPmJ1Zl9pZDsKKwllX25ldy0+ZV9kYXRh LmRhdGEgPSAodm9pZCAqKWJ1Zl9pbmZvLT5wcml2OworCWVfbmV3LT5lX2RhdGEuaGRyLnNpemUg PSBidWZfaW5mby0+c3pfcHJpdjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZldnEtPmVfbG9jaywg aXJxZmxhZ3MpOworCisJLyogY2hlY2sgY3VycmVudCBudW1iZXIgb2YgZXZlbnQgdGhlbiBpZiBp dCBoaXRzIHRoZSBtYXggbnVtICgzMikKKwkgKiB0aGVuIHJlbW92ZSB0aGUgb2xkZXN0IGV2ZW50 IGluIHRoZSBsaXN0CisJICovCisJaWYgKGV2cS0+cGVuZGluZyA+IDMxKSB7CisJCWVfb2xkZXN0 ID0gbGlzdF9maXJzdF9lbnRyeSgmZXZxLT5lX2xpc3QsCisJCQkJCSAgICBzdHJ1Y3QgdmlydGlv X3ZkbWFidWZfZXZlbnQsIGxpbmspOworCQlsaXN0X2RlbCgmZV9vbGRlc3QtPmxpbmspOworCQll dnEtPnBlbmRpbmctLTsKKwkJa2ZyZWUoZV9vbGRlc3QpOworCX0KKworCWxpc3RfYWRkX3RhaWwo JmVfbmV3LT5saW5rLCAmZXZxLT5lX2xpc3QpOworCisJZXZxLT5wZW5kaW5nKys7CisKKwl3YWtl X3VwX2ludGVycnVwdGlibGUoJmV2cS0+ZV93YWl0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZldnEtPmVfbG9jaywgaXJxZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg c2VuZF9tc2dfdG9fZ3Vlc3QodTY0IHZtaWQsIGVudW0gdmlydGlvX3ZkbWFidWZfY21kIGNtZCwg aW50ICpvcCkKK3sKKwlzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfbXNnICptc2c7CisJc3RydWN0IHZo b3N0X3ZkbWFidWYgKnZkbWFidWY7CisKKwl2ZG1hYnVmID0gdmhvc3RfdmRtYWJ1Zl9maW5kKHZt aWQpOworCWlmICghdmRtYWJ1ZikgeworCQlkZXZfZXJyKGRydl9pbmZvLT5kZXYsCisJCQkiY2Fu J3QgZmluZCB2ZG1hYnVmIGZvciA6IHZtaWQgPSAlbGx1XG4iLCB2bWlkKTsKKwkJcmV0dXJuIC1F SU5WQUw7CisJfQorCisJaWYgKGNtZCAhPSBWSVJUSU9fVkRNQUJVRl9DTURfRE1BQlVGX1JFTCkK KwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2cgPSBrdmNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHZp cnRpb192ZG1hYnVmX21zZyksCisJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykKKwkJ cmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkoJm1zZy0+b3BbMF0sICZvcFswXSwgOCAqIHNpemVv ZihpbnQpKTsKKwltc2ctPmNtZCA9IGNtZDsKKworCWxpc3RfYWRkX3RhaWwoJm1zZy0+bGlzdCwg JnZkbWFidWYtPm1zZ19saXN0KTsKKwl2aG9zdF93b3JrX3F1ZXVlKCZ2ZG1hYnVmLT5kZXYsICZ2 ZG1hYnVmLT5zZW5kX3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVnaXN0 ZXJfZXhwb3J0ZWQoc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYsCisJCQkgICAgIHZpcnRp b192ZG1hYnVmX2J1Zl9pZF90ICpidWZfaWQsIGludCAqb3BzKQoreworCXN0cnVjdCB2aXJ0aW9f dmRtYWJ1Zl9idWYgKmltcDsKKwlpbnQgcmV0OworCisJaW1wID0ga2NhbGxvYygxLCBzaXplb2Yo KmltcCksIEdGUF9LRVJORUwpOworCWlmICghaW1wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlt cC0+cGFnZXNfaW5mbyA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9z aGFyZWRfcGFnZXMpLAorCQkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbXAtPnBhZ2VzX2luZm8p IHsKKwkJa2ZyZWUoaW1wKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW1wLT5zel9wcml2 ID0gb3BzW1ZJUlRJT19WRE1BQlVGX1BSSVZBVEVfREFUQV9TSVpFXTsKKwlpZiAoaW1wLT5zel9w cml2KSB7CisJCWltcC0+cHJpdiA9IGtjYWxsb2MoMSwgb3BzW1ZJUlRJT19WRE1BQlVGX1BSSVZB VEVfREFUQV9TSVpFXSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghaW1wLT5wcml2KSB7 CisJCQlrZnJlZShpbXAtPnBhZ2VzX2luZm8pOworCQkJa2ZyZWUoaW1wKTsKKwkJCXJldHVybiAt RU5PTUVNOworCQl9CisJfQorCisJbWVtY3B5KCZpbXAtPmJ1Zl9pZCwgYnVmX2lkLCBzaXplb2Yo KmJ1Zl9pZCkpOworCisJaW1wLT5wYWdlc19pbmZvLT5uZW50cyA9IG9wc1tWSVJUSU9fVkRNQUJV Rl9OVU1fUEFHRVNfU0hBUkVEXTsKKwlpbXAtPnBhZ2VzX2luZm8tPmZpcnN0X29mc3QgPSBvcHNb VklSVElPX1ZETUFCVUZfRklSU1RfUEFHRV9EQVRBX09GRlNFVF07CisJaW1wLT5wYWdlc19pbmZv LT5sYXN0X2xlbiA9IG9wc1tWSVJUSU9fVkRNQUJVRl9MQVNUX1BBR0VfREFUQV9MRU5HVEhdOwor CWltcC0+cGFnZXNfaW5mby0+cmVmID0gKihncGFfdCAqKSZvcHNbVklSVElPX1ZETUFCVUZfUkVG X0FERFJfVVBQRVJfMzJCSVRdOworCWltcC0+dm1pZCA9IHZkbWFidWYtPnZtaWQ7CisJaW1wLT52 YWxpZCA9IHRydWU7CisKKwl2aXJ0aW9fdmRtYWJ1Zl9hZGRfYnVmKGRydl9pbmZvLCBpbXApOwor CisJLyogdHJhbnNmZXJyaW5nIHByaXZhdGUgZGF0YSAqLworCW1lbWNweShpbXAtPnByaXYsICZv cHNbVklSVElPX1ZETUFCVUZfUFJJVkFURV9EQVRBX1NUQVJUXSwKKwkgICAgICAgb3BzW1ZJUlRJ T19WRE1BQlVGX1BSSVZBVEVfREFUQV9TSVpFXSk7CisKKwkvKiBnZW5lcmF0ZSBpbXBvcnQgZXZl bnQgKi8KKwlyZXQgPSB2aG9zdF92ZG1hYnVmX2FkZF9ldmVudCh2ZG1hYnVmLCBpbXApOworCWlm IChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2Vu ZF90b19yZWN2cShzdHJ1Y3Qgdmhvc3RfdmRtYWJ1ZiAqdmRtYWJ1ZiwKKwkJCSAgc3RydWN0IHZo b3N0X3ZpcnRxdWV1ZSAqdnEpCit7CisJc3RydWN0IHZpcnRpb192ZG1hYnVmX21zZyAqbXNnOwor CWludCBoZWFkLCBpbiwgb3V0LCBpbl9zaXplOworCWJvb2wgYWRkZWQgPSBmYWxzZTsKKwlpbnQg cmV0OworCisJbXV0ZXhfbG9jaygmdnEtPm11dGV4KTsKKworCWlmICghdmhvc3RfdnFfZ2V0X2Jh Y2tlbmQodnEpKQorCQlnb3RvIG91dDsKKworCXZob3N0X2Rpc2FibGVfbm90aWZ5KCZ2ZG1hYnVm LT5kZXYsIHZxKTsKKworCWZvciAoOzspIHsKKwkJaWYgKGxpc3RfZW1wdHkoJnZkbWFidWYtPm1z Z19saXN0KSkKKwkJCWJyZWFrOworCisJCWhlYWQgPSB2aG9zdF9nZXRfdnFfZGVzYyh2cSwgdnEt PmlvdiwgQVJSQVlfU0laRSh2cS0+aW92KSwKKwkJCQkJICZvdXQsICZpbiwgTlVMTCwgTlVMTCk7 CisKKwkJaWYgKGhlYWQgPCAwIHx8IGhlYWQgPT0gdnEtPm51bSkKKwkJCWJyZWFrOworCisJCWlu X3NpemUgPSBpb3ZfbGVuZ3RoKCZ2cS0+aW92W291dF0sIGluKTsKKwkJaWYgKGluX3NpemUgIT0g c2l6ZW9mKHN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9tc2cpKSB7CisJCQlkZXZfZXJyKGRydl9pbmZv LT5kZXYsICJyeCBtc2cgd2l0aCB3cm9uZyBzaXplXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJ bXNnID0gbGlzdF9maXJzdF9lbnRyeSgmdmRtYWJ1Zi0+bXNnX2xpc3QsCisJCQkJICAgICAgIHN0 cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9tc2csIGxpc3QpOworCQlsaXN0X2RlbF9pbml0KCZtc2ctPmxp c3QpOworCisJCXJldCA9IF9fY29weV90b191c2VyKHZxLT5pb3Zbb3V0XS5pb3ZfYmFzZSwgbXNn LAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9tc2cpKTsKKwkJaWYgKHJl dCkgeworCQkJZGV2X2VycihkcnZfaW5mby0+ZGV2LAorCQkJCSJmYWlsIHRvIGNvcHkgdHggbXNn XG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJdmhvc3RfYWRkX3VzZWQodnEsIGhlYWQsIGluX3Np emUpOworCQlhZGRlZCA9IHRydWU7CisKKwkJLy9rZnJlZShtc2cpOworCX0KKworCXZob3N0X2Vu YWJsZV9ub3RpZnkoJnZkbWFidWYtPmRldiwgdnEpOworCWlmIChhZGRlZCkKKwkJdmhvc3Rfc2ln bmFsKCZ2ZG1hYnVmLT5kZXYsIHZxKTsKK291dDoKKwltdXRleF91bmxvY2soJnZxLT5tdXRleCk7 Cit9CisKK3N0YXRpYyB2b2lkIHZob3N0X3NlbmRfbXNnX3dvcmsoc3RydWN0IHZob3N0X3dvcmsg KndvcmspCit7CisJc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYgPSBjb250YWluZXJfb2Yo d29yaywKKwkJCQkJICAgICAgICAgICAgIHN0cnVjdCB2aG9zdF92ZG1hYnVmLAorCQkJCQkgICAg ICAgICAgICAgc2VuZF93b3JrKTsKKwlzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSA9ICZ2ZG1h YnVmLT52cXNbVkRNQUJVRl9WUV9SRUNWXTsKKworCXNlbmRfdG9fcmVjdnEodmRtYWJ1ZiwgdnEp OworfQorCisvKiBwYXJzZSBpbmNvbWluZyBtZXNzYWdlIGZyb20gYSBndWVzdCAqLworc3RhdGlj IGludCBwYXJzZV9tc2coc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYsCisJCSAgICAgc3Ry dWN0IHZpcnRpb192ZG1hYnVmX21zZyAqbXNnKQoreworCXZpcnRpb192ZG1hYnVmX2J1Zl9pZF90 ICpidWZfaWQ7CisJc3RydWN0IHZpcnRpb192ZG1hYnVmX21zZyAqdm1pZF9tc2c7CisJaW50IHJl dCA9IDA7CisKKwlzd2l0Y2ggKG1zZy0+Y21kKSB7CisJY2FzZSBWSVJUSU9fVkRNQUJVRl9DTURf RVhQT1JUOgorCQlidWZfaWQgPSAodmlydGlvX3ZkbWFidWZfYnVmX2lkX3QgKiltc2ctPm9wOwor CQlyZXQgPSByZWdpc3Rlcl9leHBvcnRlZCh2ZG1hYnVmLCBidWZfaWQsIG1zZy0+b3ApOworCisJ CWJyZWFrOworCWNhc2UgVklSVElPX1ZETUFCVUZfQ01EX05FRURfVk1JRDoKKwkJdm1pZF9tc2cg PSBrdmNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHZpcnRpb192ZG1hYnVmX21zZyksCisJCQkJICAg IEdGUF9LRVJORUwpOworCQlpZiAoIXZtaWRfbXNnKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJ YnJlYWs7CisJCX0KKworCQl2bWlkX21zZy0+Y21kID0gbXNnLT5jbWQ7CisJCXZtaWRfbXNnLT5v cFswXSA9IHZkbWFidWYtPnZtaWQ7CisJCWxpc3RfYWRkX3RhaWwoJnZtaWRfbXNnLT5saXN0LCAm dmRtYWJ1Zi0+bXNnX2xpc3QpOworCQl2aG9zdF93b3JrX3F1ZXVlKCZ2ZG1hYnVmLT5kZXYsICZ2 ZG1hYnVmLT5zZW5kX3dvcmspOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5W QUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHZob3N0 X3ZkbWFidWZfaGFuZGxlX3NlbmRfa2ljayhzdHJ1Y3Qgdmhvc3Rfd29yayAqd29yaykKK3sKKwlz dHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQkJICBz dHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlLAorCQkJCQkJICBwb2xsLndvcmspOworCXN0cnVjdCB2aG9z dF92ZG1hYnVmICp2ZG1hYnVmID0gY29udGFpbmVyX29mKHZxLT5kZXYsCisJCQkJCSAgICAgIAkg ICAgIHN0cnVjdCB2aG9zdF92ZG1hYnVmLAorCQkJCQkgICAgICAJICAgICBkZXYpOworCXN0cnVj dCB2aXJ0aW9fdmRtYWJ1Zl9tc2cgbXNnOworCWludCBoZWFkLCBpbiwgb3V0LCBpbl9zaXplOwor CWJvb2wgYWRkZWQgPSBmYWxzZTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmdnEtPm11dGV4 KTsKKworCWlmICghdmhvc3RfdnFfZ2V0X2JhY2tlbmQodnEpKQorCQlnb3RvIG91dDsKKworCXZo b3N0X2Rpc2FibGVfbm90aWZ5KCZ2ZG1hYnVmLT5kZXYsIHZxKTsKKworCS8qIE1ha2Ugc3VyZSB3 ZSB3aWxsIHByb2Nlc3MgYWxsIHBlbmRpbmcgcmVxdWVzdHMgKi8KKwlmb3IgKDs7KSB7CisJCWhl YWQgPSB2aG9zdF9nZXRfdnFfZGVzYyh2cSwgdnEtPmlvdiwgQVJSQVlfU0laRSh2cS0+aW92KSwK KwkJCQkJICZvdXQsICZpbiwgTlVMTCwgTlVMTCk7CisKKwkJaWYgKGhlYWQgPCAwIHx8IGhlYWQg PT0gdnEtPm51bSkKKwkJCWJyZWFrOworCisJCWluX3NpemUgPSBpb3ZfbGVuZ3RoKCZ2cS0+aW92 W2luXSwgb3V0KTsKKwkJaWYgKGluX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fdmRtYWJ1 Zl9tc2cpKSB7CisJCQlkZXZfZXJyKGRydl9pbmZvLT5kZXYsICJyeCBtc2cgd2l0aCB3cm9uZyBz aXplXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKF9fY29weV9mcm9tX3VzZXIoJm1zZywg dnEtPmlvdltpbl0uaW92X2Jhc2UsIGluX3NpemUpKSB7CisJCQlkZXZfZXJyKGRydl9pbmZvLT5k ZXYsCisJCQkJImVycjogY2FuJ3QgZ2V0IHRoZSBtc2cgZnJvbSB2cVxuIik7CisJCQlicmVhazsK KwkJfQorCisJCXJldCA9IHBhcnNlX21zZyh2ZG1hYnVmLCAmbXNnKTsKKwkJaWYgKHJldCkgewor CQkJZGV2X2VycihkcnZfaW5mby0+ZGV2LAorCQkJCSJtc2cgcGFyc2UgZXJyb3I6ICVkIiwKKwkJ CQlyZXQpOworCQkJZGV2X2VycihkcnZfaW5mby0+ZGV2LAorCQkJCSIgY21kOiAlZFxuIiwgbXNn LmNtZCk7CisKKwkJCWJyZWFrOworCQl9CisKKwkJdmhvc3RfYWRkX3VzZWQodnEsIGhlYWQsIGlu X3NpemUpOworCQlhZGRlZCA9IHRydWU7CisJfQorCisJdmhvc3RfZW5hYmxlX25vdGlmeSgmdmRt YWJ1Zi0+ZGV2LCB2cSk7CisJaWYgKGFkZGVkKQorCQl2aG9zdF9zaWduYWwoJnZkbWFidWYtPmRl diwgdnEpOworb3V0OgorCW11dGV4X3VubG9jaygmdnEtPm11dGV4KTsKK30KKworc3RhdGljIHZv aWQgdmhvc3RfdmRtYWJ1Zl9oYW5kbGVfcmVjdl9raWNrKHN0cnVjdCB2aG9zdF93b3JrICp3b3Jr KQoreworCXN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxID0gY29udGFpbmVyX29mKHdvcmssCisJ CQkJCQkgIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUsCisJCQkJCQkgIHBvbGwud29yayk7CisJc3Ry dWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYgPSBjb250YWluZXJfb2YodnEtPmRldiwKKwkJCQkJ ICAgICAgCSAgICAgc3RydWN0IHZob3N0X3ZkbWFidWYsCisJCQkJCSAgICAgIAkgICAgIGRldik7 CisKKwlzZW5kX3RvX3JlY3ZxKHZkbWFidWYsIHZxKTsKK30KKworc3RhdGljIGludCB2aG9zdF92 ZG1hYnVmX2dldF9rdm0oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgdW5zaWduZWQg bG9uZyBldmVudCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qga3ZtX2luc3RhbmNlICppbnN0YW5j ZTsKKwlzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfaW5mbyAqZHJ2ID0gY29udGFpbmVyX29mKG5iLAor CQkJCQkJc3RydWN0IHZpcnRpb192ZG1hYnVmX2luZm8sCisJCQkJCQlrdm1fbm90aWZpZXIpOwor CisJaW5zdGFuY2UgPSBremFsbG9jKHNpemVvZigqaW5zdGFuY2UpLCBHRlBfS0VSTkVMKTsKKwlp ZiAoaW5zdGFuY2UgJiYgZXZlbnQgPT0gS1ZNX0VWRU5UX0NSRUFURV9WTSkgeworCQlpZiAoZGF0 YSkgeworCQkJaW5zdGFuY2UtPmt2bSA9IGRhdGE7CisJCQlsaXN0X2FkZF90YWlsKCZpbnN0YW5j ZS0+bGluaywKKwkJCQkgICAgICAmZHJ2LT5rdm1faW5zdGFuY2VzKTsKKwkJfQorCX0KKworCXJl dHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga3ZtICpmaW5kX2t2bV9pbnN0YW5j ZSh1NjQgdm1pZCkKK3sKKwlzdHJ1Y3Qga3ZtX2luc3RhbmNlICppbnN0YW5jZSwgKnRtcDsKKwlz dHJ1Y3Qga3ZtICprdm0gPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGluc3Rh bmNlLCB0bXAsICZkcnZfaW5mby0+a3ZtX2luc3RhbmNlcywKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGxpbmspIHsKKwkJaWYgKGluc3RhbmNlLT5rdm0tPnVzZXJzcGFjZV9waWQg PT0gdm1pZCkgeworCQkJa3ZtID0gaW5zdGFuY2UtPmt2bTsKKworCQkJbGlzdF9kZWwoJmluc3Rh bmNlLT5saW5rKTsKKwkJCWtmcmVlKGluc3RhbmNlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJ cmV0dXJuIGt2bTsKK30KKworc3RhdGljIGludCB2aG9zdF92ZG1hYnVmX29wZW4oc3RydWN0IGlu b2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHZob3N0X3ZkbWFidWYg KnZkbWFidWY7CisJc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqKnZxczsKKwlpbnQgcmV0ID0gMDsK KworCWlmICghZHJ2X2luZm8pIHsKKwkJcHJfZXJyKCJ2aG9zdC12ZG1hYnVmOiBjYW4ndCBvcGVu IG1pc2MgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmRtYWJ1ZiA9IGt6 YWxsb2Moc2l6ZW9mKCp2ZG1hYnVmKSwgR0ZQX0tFUk5FTCB8CisJCQkgICBfX0dGUF9SRVRSWV9N QVlGQUlMKTsKKwlpZiAoIXZkbWFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJdnFzID0ga21h bGxvY19hcnJheShBUlJBWV9TSVpFKHZkbWFidWYtPnZxcyksIHNpemVvZigqdnFzKSwKKwkJCSAg ICBHRlBfS0VSTkVMKTsKKwlpZiAoIXZxcykgeworCQlrZnJlZSh2ZG1hYnVmKTsKKwkJcmV0dXJu IC1FTk9NRU07CisJfQorCisJdmRtYWJ1Zi0+ZXZxID0ga2NhbGxvYygxLCBzaXplb2YoKih2ZG1h YnVmLT5ldnEpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2ZG1hYnVmLT5ldnEpIHsKKwkJa2ZyZWUo dmRtYWJ1Zik7CisJCWtmcmVlKHZxcyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXZxc1tW RE1BQlVGX1ZRX1NFTkRdID0gJnZkbWFidWYtPnZxc1tWRE1BQlVGX1ZRX1NFTkRdOworCXZxc1tW RE1BQlVGX1ZRX1JFQ1ZdID0gJnZkbWFidWYtPnZxc1tWRE1BQlVGX1ZRX1JFQ1ZdOworCXZkbWFi dWYtPnZxc1tWRE1BQlVGX1ZRX1NFTkRdLmhhbmRsZV9raWNrID0gdmhvc3RfdmRtYWJ1Zl9oYW5k bGVfc2VuZF9raWNrOworCXZkbWFidWYtPnZxc1tWRE1BQlVGX1ZRX1JFQ1ZdLmhhbmRsZV9raWNr ID0gdmhvc3RfdmRtYWJ1Zl9oYW5kbGVfcmVjdl9raWNrOworCisJdmhvc3RfZGV2X2luaXQoJnZk bWFidWYtPmRldiwgdnFzLCBBUlJBWV9TSVpFKHZkbWFidWYtPnZxcyksCisJCSAgICAgICBVSU9f TUFYSU9WLCAwLCAwLCB0cnVlLCBOVUxMKTsKKworCUlOSVRfTElTVF9IRUFEKCZ2ZG1hYnVmLT5t c2dfbGlzdCk7CisJdmhvc3Rfd29ya19pbml0KCZ2ZG1hYnVmLT5zZW5kX3dvcmssIHZob3N0X3Nl bmRfbXNnX3dvcmspOworCXZkbWFidWYtPnZtaWQgPSB0YXNrX3BpZF9ucihjdXJyZW50KTsKKwl2 ZG1hYnVmLT5rdm0gPSBmaW5kX2t2bV9pbnN0YW5jZSh2ZG1hYnVmLT52bWlkKTsKKwl2aG9zdF92 ZG1hYnVmX2FkZCh2ZG1hYnVmKTsKKworCW11dGV4X2luaXQoJnZkbWFidWYtPmV2cS0+ZV9yZWFk bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnZkbWFidWYtPmV2cS0+ZV9sb2NrKTsKKworCS8qIElu aXRpYWxpemUgZXZlbnQgcXVldWUgKi8KKwlJTklUX0xJU1RfSEVBRCgmdmRtYWJ1Zi0+ZXZxLT5l X2xpc3QpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZkbWFidWYtPmV2cS0+ZV93YWl0KTsKKwor CS8qIHJlc2V0dGluZyBudW1iZXIgb2YgcGVuZGluZyBldmVudHMgKi8KKwl2ZG1hYnVmLT5ldnEt PnBlbmRpbmcgPSAwOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IHZkbWFidWY7CisKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgdm9pZCB2aG9zdF92ZG1hYnVmX2ZsdXNoKHN0cnVjdCB2aG9zdF92 ZG1hYnVmICp2ZG1hYnVmKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJ WkUodmRtYWJ1Zi0+dnFzKTsgaSsrKQorCQlpZiAodmRtYWJ1Zi0+dnFzW2ldLmhhbmRsZV9raWNr KQorCQkJdmhvc3RfcG9sbF9mbHVzaCgmdmRtYWJ1Zi0+dnFzW2ldLnBvbGwpOworCisJdmhvc3Rf d29ya19mbHVzaCgmdmRtYWJ1Zi0+ZGV2LCAmdmRtYWJ1Zi0+c2VuZF93b3JrKTsKK30KKworc3Rh dGljIGludCB2aG9zdF92ZG1hYnVmX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0 IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYgPSBmaWxwLT5w cml2YXRlX2RhdGE7CisJc3RydWN0IHZpcnRpb192ZG1hYnVmX2V2ZW50ICplLCAqZXQ7CisKKwlp ZiAoIXZob3N0X3ZkbWFidWZfZGVsKHZkbWFidWYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11 dGV4X2xvY2soJmRydl9pbmZvLT5nX211dGV4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2Fm ZShlLCBldCwgJnZkbWFidWYtPmV2cS0+ZV9saXN0LAorCQkJCSBsaW5rKSB7CisJCWxpc3RfZGVs KCZlLT5saW5rKTsKKwkJa2ZyZWUoZSk7CisJCXZkbWFidWYtPmV2cS0+cGVuZGluZy0tOworCX0K KworCXZob3N0X3ZkbWFidWZfZmx1c2godmRtYWJ1Zik7CisJdmhvc3RfZGV2X2NsZWFudXAoJnZk bWFidWYtPmRldik7CisKKwlrZnJlZSh2ZG1hYnVmLT5kZXYudnFzKTsKKwlrdmZyZWUodmRtYWJ1 Zik7CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCW11dGV4X3VubG9jaygmZHJ2X2lu Zm8tPmdfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmhv c3RfdmRtYWJ1Zl9ldmVudF9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICAJICAgICBz dHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHZob3N0X3ZkbWFidWYg KnZkbWFidWYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlwb2xsX3dhaXQoZmlscCwgJnZkbWFi dWYtPmV2cS0+ZV93YWl0LCB3YWl0KTsKKworCWlmICghbGlzdF9lbXB0eSgmdmRtYWJ1Zi0+ZXZx LT5lX2xpc3QpKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXJldHVybiAwOwor fQorCitzdGF0aWMgc3NpemVfdCB2aG9zdF92ZG1hYnVmX2V2ZW50X3JlYWQoc3RydWN0IGZpbGUg KmZpbHAsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICAgCQlzaXplX3QgY250LCBsb2ZmX3Qg Km9mc3QpCit7CisJc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYgPSBmaWxwLT5wcml2YXRl X2RhdGE7CisJaW50IHJldDsKKworCWlmICh0YXNrX3BpZF9ucihjdXJyZW50KSAhPSB2ZG1hYnVm LT52bWlkKSB7CisJCWRldl9lcnIoZHJ2X2luZm8tPmRldiwgImN1cnJlbnQgcHJvY2VzcyBjYW5u b3QgcmVhZCBldmVudHNcbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCS8qIG1ha2Ugc3Vy ZSB1c2VyIGJ1ZmZlciBjYW4gYmUgd3JpdHRlbiAqLworCWlmICghYWNjZXNzX29rKGJ1Ziwgc2l6 ZW9mKCpidWYpKSkgeworCQlkZXZfZXJyKGRydl9pbmZvLT5kZXYsICJ1c2VyIGJ1ZmZlciBjYW4n dCBiZSB3cml0dGVuLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IG11dGV4 X2xvY2tfaW50ZXJydXB0aWJsZSgmdmRtYWJ1Zi0+ZXZxLT5lX3JlYWRsb2NrKTsKKwlpZiAocmV0 KQorCQlyZXR1cm4gcmV0OworCisJZm9yICg7OykgeworCQlzdHJ1Y3QgdmlydGlvX3ZkbWFidWZf ZXZlbnQgKmUgPSBOVUxMOworCisJCXNwaW5fbG9ja19pcnEoJnZkbWFidWYtPmV2cS0+ZV9sb2Nr KTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZ2ZG1hYnVmLT5ldnEtPmVfbGlzdCkpIHsKKwkJCWUgPSBs aXN0X2ZpcnN0X2VudHJ5KCZ2ZG1hYnVmLT5ldnEtPmVfbGlzdCwKKwkJCQkJICAgICBzdHJ1Y3Qg dmlydGlvX3ZkbWFidWZfZXZlbnQsIGxpbmspOworCQkJbGlzdF9kZWwoJmUtPmxpbmspOworCQl9 CisJCXNwaW5fdW5sb2NrX2lycSgmdmRtYWJ1Zi0+ZXZxLT5lX2xvY2spOworCisJCWlmICghZSkg eworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKworCQkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05P TkJMT0NLKSB7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbXV0 ZXhfdW5sb2NrKCZ2ZG1hYnVmLT5ldnEtPmVfcmVhZGxvY2spOworCQkJcmV0ID0gd2FpdF9ldmVu dF9pbnRlcnJ1cHRpYmxlKHZkbWFidWYtPmV2cS0+ZV93YWl0LAorCQkJCQkhbGlzdF9lbXB0eSgm dmRtYWJ1Zi0+ZXZxLT5lX2xpc3QpKTsKKworCQkJaWYgKHJldCA9PSAwKQorCQkJCXJldCA9IG11 dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgKKwkJCQkJCSZ2ZG1hYnVmLT5ldnEtPmVfcmVhZGxvY2sp OworCisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25l ZCBpbnQgbGVuID0gKHNpemVvZihlLT5lX2RhdGEuaGRyKSArCisJCQkJCSAgICBlLT5lX2RhdGEu aGRyLnNpemUpOworCisJCQlpZiAobGVuID4gY250IC0gcmV0KSB7CitwdXRfYmFja19ldmVudDoK KwkJCQlzcGluX2xvY2tfaXJxKCZ2ZG1hYnVmLT5ldnEtPmVfbG9jayk7CisJCQkJbGlzdF9hZGQo JmUtPmxpbmssICZ2ZG1hYnVmLT5ldnEtPmVfbGlzdCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZ2 ZG1hYnVmLT5ldnEtPmVfbG9jayk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChjb3B5X3Rv X3VzZXIoYnVmICsgcmV0LCAmZS0+ZV9kYXRhLmhkciwKKwkJCQkJIHNpemVvZihlLT5lX2RhdGEu aGRyKSkpIHsKKwkJCQlpZiAocmV0ID09IDApCisJCQkJCXJldCA9IC1FRkFVTFQ7CisKKwkJCQln b3RvIHB1dF9iYWNrX2V2ZW50OworCQkJfQorCisJCQlyZXQgKz0gc2l6ZW9mKGUtPmVfZGF0YS5o ZHIpOworCisJCQlpZiAoY29weV90b191c2VyKGJ1ZiArIHJldCwgZS0+ZV9kYXRhLmRhdGEsCisJ CQkJCSBlLT5lX2RhdGEuaGRyLnNpemUpKSB7CisKKwkJCQlzdHJ1Y3QgdmlydGlvX3ZkbWFidWZf ZV9oZHIgZHVtbXlfaGRyID0gezB9OworCisJCQkJcmV0IC09IHNpemVvZihlLT5lX2RhdGEuaGRy KTsKKworCQkJCS8qIG51bGxpZnlpbmcgaGRyIG9mIHRoZSBldmVudCBpbiB1c2VyIGJ1ZmZlciAq LworCQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmICsgcmV0LCAmZHVtbXlfaGRyLAorCQkJCQkJIHNp emVvZihkdW1teV9oZHIpKSkKKwkJCQkJZGV2X2VycihkcnZfaW5mby0+ZGV2LAorCQkJCQkgICAi ZmFpbCB0byBudWxsaWZ5IGludmFsaWQgaGRyXG4iKTsKKworCQkJCXJldCA9IC1FRkFVTFQ7CisK KwkJCQlnb3RvIHB1dF9iYWNrX2V2ZW50OworCQkJfQorCisJCQlyZXQgKz0gZS0+ZV9kYXRhLmhk ci5zaXplOworCisJCQlzcGluX2xvY2tfaXJxKCZ2ZG1hYnVmLT5ldnEtPmVfbG9jayk7CisJCQl2 ZG1hYnVmLT5ldnEtPnBlbmRpbmctLTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmdmRtYWJ1Zi0+ZXZx LT5lX2xvY2spOworCQkJa2ZyZWUoZSk7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJnZkbWFi dWYtPmV2cS0+ZV9yZWFkbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZo b3N0X3ZkbWFidWZfc3RhcnQoc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYpCit7CisgICAg ICAgIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxOworICAgICAgICBpbnQgaSwgcmV0OworCisJ bXV0ZXhfbG9jaygmdmRtYWJ1Zi0+ZGV2Lm11dGV4KTsKKworICAgICAgICByZXQgPSB2aG9zdF9k ZXZfY2hlY2tfb3duZXIoJnZkbWFidWYtPmRldik7CisgICAgICAgIGlmIChyZXQpCisgICAgICAg ICAgICAgICAgZ290byBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2ZG1hYnVm LT52cXMpOyBpKyspIHsKKwkJdnEgPSAmdmRtYWJ1Zi0+dnFzW2ldOworCisJCW11dGV4X2xvY2so JnZxLT5tdXRleCk7CisKKwkJaWYgKCF2aG9zdF92cV9hY2Nlc3Nfb2sodnEpKSB7CisJCQlyZXQg PSAtRUZBVUxUOworCQkJZ290byBlcnJfdnE7CisJCX0KKworCQlpZiAoIXZob3N0X3ZxX2dldF9i YWNrZW5kKHZxKSkgeworCQkJdmhvc3RfdnFfc2V0X2JhY2tlbmQodnEsIHZkbWFidWYpOworCQkJ cmV0ID0gdmhvc3RfdnFfaW5pdF9hY2Nlc3ModnEpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVy cl92cTsKKwkJfQorCisJCW11dGV4X3VubG9jaygmdnEtPm11dGV4KTsKKwl9CisKKwltdXRleF91 bmxvY2soJnZkbWFidWYtPmRldi5tdXRleCk7CisgICAgICAgIHJldHVybiAwOworCitlcnJfdnE6 CisgICAgICAgIHZob3N0X3ZxX3NldF9iYWNrZW5kKHZxLCBOVUxMKTsKKyAgICAgICAgbXV0ZXhf dW5sb2NrKCZ2cS0+bXV0ZXgpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmRtYWJ1 Zi0+dnFzKTsgaSsrKSB7CisJCXZxID0gJnZkbWFidWYtPnZxc1tpXTsKKworCQltdXRleF9sb2Nr KCZ2cS0+bXV0ZXgpOworCQl2aG9zdF92cV9zZXRfYmFja2VuZCh2cSwgTlVMTCk7CisJCW11dGV4 X3VubG9jaygmdnEtPm11dGV4KTsKKwl9CisKK2VycjoKKwltdXRleF91bmxvY2soJnZkbWFidWYt PmRldi5tdXRleCk7CisgICAgICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmhvc3Rf dmRtYWJ1Zl9zdG9wKHN0cnVjdCB2aG9zdF92ZG1hYnVmICp2ZG1hYnVmKQoreworICAgICAgICBz dHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cTsKKyAgICAgICAgaW50IGksIHJldDsKKworCW11dGV4 X2xvY2soJnZkbWFidWYtPmRldi5tdXRleCk7CisKKyAgICAgICAgcmV0ID0gdmhvc3RfZGV2X2No ZWNrX293bmVyKCZ2ZG1hYnVmLT5kZXYpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAg ICAgIGdvdG8gZXJyOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmRtYWJ1Zi0+dnFz KTsgaSsrKSB7CisJCXZxID0gJnZkbWFidWYtPnZxc1tpXTsKKworCQltdXRleF9sb2NrKCZ2cS0+ bXV0ZXgpOworCQl2aG9zdF92cV9zZXRfYmFja2VuZCh2cSwgTlVMTCk7CisJCW11dGV4X3VubG9j aygmdnEtPm11dGV4KTsKKwl9CisKK2VycjoKKwltdXRleF91bmxvY2soJnZkbWFidWYtPmRldi5t dXRleCk7CisgICAgICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmhvc3RfdmRtYWJ1 Zl9zZXRfZmVhdHVyZXMoc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYsCisJCQkJICAgICAg dTY0IGZlYXR1cmVzKQoreworCXN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxOworCWludCBpOwor CisJaWYgKGZlYXR1cmVzICYgflZIT1NUX1ZETUFCVUZfRkVBVFVSRVMpCisJCXJldHVybiAtRU9Q Tk9UU1VQUDsKKworCW11dGV4X2xvY2soJnZkbWFidWYtPmRldi5tdXRleCk7CisJaWYgKChmZWF0 dXJlcyAmICgxIDw8IFZIT1NUX0ZfTE9HX0FMTCkpICYmCisJICAgICF2aG9zdF9sb2dfYWNjZXNz X29rKCZ2ZG1hYnVmLT5kZXYpKSB7CisJCW11dGV4X3VubG9jaygmdmRtYWJ1Zi0+ZGV2Lm11dGV4 KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUo dmRtYWJ1Zi0+dnFzKTsgaSsrKSB7CisJCXZxID0gJnZkbWFidWYtPnZxc1tpXTsKKwkJbXV0ZXhf bG9jaygmdnEtPm11dGV4KTsKKwkJdnEtPmFja2VkX2ZlYXR1cmVzID0gZmVhdHVyZXM7CisJCW11 dGV4X3VubG9jaygmdnEtPm11dGV4KTsKKwl9CisKKwltdXRleF91bmxvY2soJnZkbWFidWYtPmRl di5tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHdyYXBwZXIgaW9jdGwgZm9yIHZob3N0IGlu dGVyZmFjZSBjb250cm9sICovCitzdGF0aWMgaW50IHZob3N0X2NvcmVfaW9jdGwoc3RydWN0IGZp bGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBwYXJhbSkK K3sKKwlzdHJ1Y3Qgdmhvc3RfdmRtYWJ1ZiAqdmRtYWJ1ZiA9IGZpbHAtPnByaXZhdGVfZGF0YTsK Kwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKXBhcmFtOworCXU2NCBmZWF0dXJl czsKKwlpbnQgcmV0LCBzdGFydDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSE9TVF9HRVRf RkVBVFVSRVM6CisJCWZlYXR1cmVzID0gVkhPU1RfVkRNQUJVRl9GRUFUVVJFUzsKKwkJaWYgKGNv cHlfdG9fdXNlcihhcmdwLCAmZmVhdHVyZXMsIHNpemVvZihmZWF0dXJlcykpKQorCQkJcmV0dXJu IC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgVkhPU1RfU0VUX0ZFQVRVUkVTOgorCQlpZiAo Y29weV9mcm9tX3VzZXIoJmZlYXR1cmVzLCBhcmdwLCBzaXplb2YoZmVhdHVyZXMpKSkKKwkJCXJl dHVybiAtRUZBVUxUOworCQlyZXR1cm4gdmhvc3RfdmRtYWJ1Zl9zZXRfZmVhdHVyZXModmRtYWJ1 ZiwgZmVhdHVyZXMpOworCWNhc2UgVkhPU1RfVkRNQUJVRl9TRVRfUlVOTklORzoKKwkJaWYgKGNv cHlfZnJvbV91c2VyKCZzdGFydCwgYXJncCwgc2l6ZW9mKHN0YXJ0KSkpCisgICAgICAgICAgICAg ICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoc3RhcnQpCisgICAgICAgICAgICAg ICAgCXJldHVybiB2aG9zdF92ZG1hYnVmX3N0YXJ0KHZkbWFidWYpOworICAgICAgICAgICAgICAg IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aG9zdF92ZG1hYnVmX3N0b3Ao dmRtYWJ1Zik7CisJZGVmYXVsdDoKKwkJbXV0ZXhfbG9jaygmdmRtYWJ1Zi0+ZGV2Lm11dGV4KTsK KwkJcmV0ID0gdmhvc3RfZGV2X2lvY3RsKCZ2ZG1hYnVmLT5kZXYsIGNtZCwgYXJncCk7CisJCWlm IChyZXQgPT0gLUVOT0lPQ1RMQ01EKSB7CisJCQlyZXQgPSB2aG9zdF92cmluZ19pb2N0bCgmdmRt YWJ1Zi0+ZGV2LCBjbWQsIGFyZ3ApOworCQl9IGVsc2UgeworCQkJdmhvc3RfdmRtYWJ1Zl9mbHVz aCh2ZG1hYnVmKTsKKwkJfQorCQltdXRleF91bmxvY2soJnZkbWFidWYtPmRldi5tdXRleCk7CisJ fQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGlvY3RsIC0gaW1wb3J0aW5nIHZkbWFidWYg ZnJvbSBndWVzdCBPUworICoKKyAqIHVzZXIgcGFyYW1ldGVyczoKKyAqCisgKgl2aXJ0aW9fdmRt YWJ1Zl9idWZfaWRfdCBidWZfaWQgLSB2ZG1hYnVmIElEIG9mIGltcG9ydGVkIGJ1ZmZlcgorICoJ aW50IGZsYWdzIC0gZmxhZ3MKKyAqCWludCBmZCAtIGZpbGUgaGFuZGxlIG9mCXRoZSBpbXBvcnRl ZCBidWZmZXIKKyAqCisgKi8KK3N0YXRpYyBpbnQgaW1wb3J0X2lvY3RsKHN0cnVjdCBmaWxlICpm aWxwLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB2aG9zdF92ZG1hYnVmICp2ZG1hYnVmID0gZmls cC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9pbXBvcnQgKmF0dHIgPSBk YXRhOworCXN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9idWYgKmltcDsKKwlpbnQgcmV0ID0gMDsKKwor CW11dGV4X2xvY2soJnZkbWFidWYtPmRldi5tdXRleCk7CisKKwkvKiBsb29rIGZvciBkbWFidWYg Zm9yIHRoZSBpZCAqLworCWltcCA9IHZpcnRpb192ZG1hYnVmX2ZpbmRfYnVmKGRydl9pbmZvLCAm YXR0ci0+YnVmX2lkKTsKKwlpZiAoIWltcCB8fCAhaW1wLT52YWxpZCkgeworCQltdXRleF91bmxv Y2soJnZkbWFidWYtPmRldi5tdXRleCk7CisJCWRldl9lcnIoZHJ2X2luZm8tPmRldiwKKwkJCSJu byB2YWxpZCBidWYgZm91bmQgd2l0aCBpZCA9ICVsbHVcbiIsIGF0dHItPmJ1Zl9pZC5pZCk7CisJ CXJldHVybiAtRU5PRU5UOworCX0KKworCS8qIG9ubHkgaWYgbWFwcGVkIHBhZ2VzIGFyZSBub3Qg cHJlc2VudCAqLworCWlmICghaW1wLT5wYWdlc19pbmZvLT5wYWdlcykgeworCQlyZXQgPSB2aG9z dF92ZG1hYnVmX21hcF9wYWdlcyh2ZG1hYnVmLT52bWlkLCBpbXAtPnBhZ2VzX2luZm8pOworCQlp ZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkcnZfaW5mby0+ZGV2LAorCQkJCSJmYWlsZWQgdG8g bWFwIGd1ZXN0IHBhZ2VzXG4iKTsKKwkJCWdvdG8gZmFpbF9tYXA7CisJCX0KKwl9CisKKwlhdHRy LT5mZCA9IHZob3N0X3ZkbWFidWZfZXhwX2ZkKGltcCwgYXR0ci0+ZmxhZ3MpOworCWlmIChhdHRy LT5mZCA8IDApIHsKKwkJZGV2X2VycihkcnZfaW5mby0+ZGV2LCAiZmFpbGVkIHRvIGdldCBmaWxl IGRlc2NyaXB0b3JcbiIpOworCQlnb3RvIGZhaWxfaW1wb3J0OworCX0KKworCWltcC0+aW1wb3J0 ZWQgPSB0cnVlOworCisJbXV0ZXhfdW5sb2NrKCZ2ZG1hYnVmLT5kZXYubXV0ZXgpOworCWdvdG8g c3VjY2VzczsKKworZmFpbF9pbXBvcnQ6CisJLyogbm90IGltcG9ydGVkIHlldD8gKi8KKwlpZiAo IWltcC0+aW1wb3J0ZWQpIHsKKwkJdmhvc3RfdmRtYWJ1Zl91bm1hcF9wYWdlcyh2ZG1hYnVmLT52 bWlkLCBpbXAtPnBhZ2VzX2luZm8pOworCQlpZiAoaW1wLT5kbWFfYnVmKQorCQkJa2ZyZWUoaW1w LT5kbWFfYnVmKTsKKworCQlpZiAoaW1wLT5zZ3QpIHsKKwkJCXNnX2ZyZWVfdGFibGUoaW1wLT5z Z3QpOworCQkJa2ZyZWUoaW1wLT5zZ3QpOworCQkJaW1wLT5zZ3QgPSBOVUxMOworCQl9CisJfQor CitmYWlsX21hcDoKKwkvKiBDaGVjayBpZiBidWZmZXIgaXMgc3RpbGwgdmFsaWQgYW5kIGlmIG5v dCByZW1vdmUgaXQKKwkgKiBmcm9tIGltcG9ydGVkIGxpc3QuCisJICovCisJaWYgKCFpbXAtPnZh bGlkICYmICFpbXAtPmltcG9ydGVkKSB7CisJCXZpcnRpb192ZG1hYnVmX2RlbF9idWYoZHJ2X2lu Zm8sICZpbXAtPmJ1Zl9pZCk7CisJCWtmcmVlKGltcC0+cHJpdik7CisJCWtmcmVlKGltcC0+cGFn ZXNfaW5mbyk7CisJCWtmcmVlKGltcCk7CisJfQorCisJcmV0ID0gIGF0dHItPmZkOworCW11dGV4 X3VubG9jaygmdmRtYWJ1Zi0+ZGV2Lm11dGV4KTsKKworc3VjY2VzczoKKwlyZXR1cm4gcmV0Owor fQorCitzdGF0aWMgaW50IHJlbGVhc2VfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRh dGEpCit7CisJc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYgPSBmaWxwLT5wcml2YXRlX2Rh dGE7CisJc3RydWN0IHZpcnRpb192ZG1hYnVmX2ltcG9ydCAqYXR0ciA9IGRhdGE7CisJc3RydWN0 IHZpcnRpb192ZG1hYnVmX2J1ZiAqaW1wOworCXZpcnRpb192ZG1hYnVmX2J1Zl9pZF90IGJ1Zl9p ZCA9IGF0dHItPmJ1Zl9pZDsKKwlpbnQgKm9wOworCWludCByZXQgPSAwOworCisJb3AgPSBrY2Fs bG9jKDEsIHNpemVvZihpbnQpICogNjUsIEdGUF9LRVJORUwpOworCWlmICghb3ApCisJCXJldHVy biAtRU5PTUVNOworCisJaW1wID0gdmlydGlvX3ZkbWFidWZfZmluZF9idWYoZHJ2X2luZm8sICZi dWZfaWQpOworCWlmICghaW1wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWltcC0+aW1wb3J0ZWQg PSBmYWxzZTsKKworCW1lbWNweShvcCwgJmltcC0+YnVmX2lkLCBzaXplb2YoaW1wLT5idWZfaWQp KTsKKworCXJldCA9IHNlbmRfbXNnX3RvX2d1ZXN0KHZkbWFidWYtPnZtaWQsIFZJUlRJT19WRE1B QlVGX0NNRF9ETUFCVUZfUkVMLAorCQkJCW9wKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJy KGRydl9pbmZvLT5kZXYsICJmYWlsIHRvIHNlbmQgcmVsZWFzZSBjbWRcbiIpOworCQlyZXR1cm4g cmV0OworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogaW9jdGwgLSBxdWVyeWluZyB2YXJp b3VzIGluZm9ybWF0aW9uIG9mIHZkbWFidWYKKyAqCisgKiB1c2VyIHBhcmFtZXRlcnM6CisgKgor ICoJdmlydGlvX3ZkbWFidWZfYnVmX2lkX3QgYnVmX2lkIC0gdmRtYWJ1ZiBJRCBvZiBpbXBvcnRl ZCBidWZmZXIKKyAqCXVuc2lnbmVkIGxvbmcgaW5mbyAtIHJldHVybmVkIHF1ZXJ5aW5nIHJlc3Vs dAorICoKKyAqLworc3RhdGljIGludCBxdWVyeV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9p ZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfcXVlcnkgKmF0dHIgPSBkYXRhOwor CXN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9idWYgKmltcDsKKwl2aXJ0aW9fdmRtYWJ1Zl9idWZfaWRf dCBidWZfaWQgPSBhdHRyLT5idWZfaWQ7CisKKwkvKiBxdWVyeSBmb3IgaW1wb3J0ZWQgZG1hYnVm ICovCisJaW1wID0gdmlydGlvX3ZkbWFidWZfZmluZF9idWYoZHJ2X2luZm8sICZidWZfaWQpOwor CWlmICghaW1wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoYXR0ci0+aXRlbSkgewor CS8qIHNpemUgb2YgZG1hYnVmIGluIGJ5dGUgKi8KKwljYXNlIFZJUlRJT19WRE1BQlVGX1FVRVJZ X1NJWkU6CisJCWlmIChpbXAtPmRtYV9idWYpIHsKKwkJCS8qIGlmIGxvY2FsIGRtYV9idWYgaXMg Y3JlYXRlZCAoaWYgaXQncworCQkJICogZXZlciBtYXBwZWQpLCByZXRyaWV2ZSBpdCBkaXJlY3Rs eQorCQkJICogZnJvbSBzdHJ1Y3QgZG1hX2J1ZiAqCisJCQkgKi8KKwkJCWF0dHItPmluZm8gPSBp bXAtPmRtYV9idWYtPnNpemU7CisJCX0gZWxzZSB7CisJCQkvKiBjYWxjdWF0ZSBpdCBmcm9tIGdp dmVuIG5lbnRzLCBmaXJzdF9vZnN0CisJCQkgKiBhbmQgbGFzdF9sZW4KKwkJCSAqLworCQkJYXR0 ci0+aW5mbyA9ICgoaW1wLT5wYWdlc19pbmZvLT5uZW50cykqUEFHRV9TSVpFIC0KKwkJCQkgICAg IChpbXAtPnBhZ2VzX2luZm8tPmZpcnN0X29mc3QpIC0gUEFHRV9TSVpFICsKKwkJCQkgICAgIChp bXAtPnBhZ2VzX2luZm8tPmxhc3RfbGVuKSk7CisJCX0KKwkJYnJlYWs7CisKKwkvKiB3aGV0aGVy IHRoZSBidWZmZXIgaXMgdXNlZCBvciBub3QgKi8KKwljYXNlIFZJUlRJT19WRE1BQlVGX1FVRVJZ X0JVU1k6CisJCS8qIGNoZWNrcyBpZiBpdCdzIHVzZWQgYnkgaW1wb3J0ZXIgKi8KKwkJYXR0ci0+ aW5mbyA9IGltcC0+aW1wb3J0ZWQ7CisJCWJyZWFrOworCisJLyogc2l6ZSBvZiBwcml2YXRlIGlu Zm8gYXR0YWNoZWQgdG8gYnVmZmVyICovCisJY2FzZSBWSVJUSU9fVkRNQUJVRl9RVUVSWV9QUklW X0lORk9fU0laRToKKwkJYXR0ci0+aW5mbyA9IGltcC0+c3pfcHJpdjsKKwkJYnJlYWs7CisKKwkv KiBjb3B5IHByaXZhdGUgaW5mbyBhdHRhY2hlZCB0byBidWZmZXIgKi8KKwljYXNlIFZJUlRJT19W RE1BQlVGX1FVRVJZX1BSSVZfSU5GTzoKKwkJaWYgKGltcC0+c3pfcHJpdiA+IDApIHsKKwkJCWlu dCBuOworCisJCQluID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWF0dHItPmluZm8sCisJ CQkJCWltcC0+cHJpdiwKKwkJCQkJaW1wLT5zel9wcml2KTsKKwkJCWlmIChuICE9IDApCisJCQkJ cmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJ TlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2aXJ0aW9f dmRtYWJ1Zl9pb2N0bF9kZXNjIHZob3N0X3ZkbWFidWZfaW9jdGxzW10gPSB7CisJVklSVElPX1ZE TUFCVUZfSU9DVExfREVGKFZJUlRJT19WRE1BQlVGX0lPQ1RMX0lNUE9SVCwgaW1wb3J0X2lvY3Rs LCAwKSwKKwlWSVJUSU9fVkRNQUJVRl9JT0NUTF9ERUYoVklSVElPX1ZETUFCVUZfSU9DVExfUkVM RUFTRSwgcmVsZWFzZV9pb2N0bCwgMCksCisJVklSVElPX1ZETUFCVUZfSU9DVExfREVGKFZJUlRJ T19WRE1BQlVGX0lPQ1RMX1FVRVJZLCBxdWVyeV9pb2N0bCwgMCksCit9OworCitzdGF0aWMgbG9u ZyB2aG9zdF92ZG1hYnVmX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21k LAorCQkJCXVuc2lnbmVkIGxvbmcgcGFyYW0pCit7CisJY29uc3Qgc3RydWN0IHZpcnRpb192ZG1h YnVmX2lvY3RsX2Rlc2MgKmlvY3RsOworCXZpcnRpb192ZG1hYnVmX2lvY3RsX3QgZnVuYzsKKwl1 bnNpZ25lZCBpbnQgbnI7CisJaW50IHJldDsKKwljaGFyICprZGF0YTsKKworCS8qIGNoZWNrIGlm IGNtZCBpcyB2aG9zdCdzICovCisJaWYgKF9JT0NfVFlQRShjbWQpID09IFZIT1NUX1ZJUlRJTykg eworCQlyZXQgPSB2aG9zdF9jb3JlX2lvY3RsKGZpbHAsIGNtZCwgcGFyYW0pOworCQlyZXR1cm4g cmV0OworCX0KKworCW5yID0gX0lPQ19OUihjbWQpOworCisJaWYgKG5yID49IEFSUkFZX1NJWkUo dmhvc3RfdmRtYWJ1Zl9pb2N0bHMpKSB7CisJCWRldl9lcnIoZHJ2X2luZm8tPmRldiwgImludmFs aWQgaW9jdGxcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpb2N0bCA9ICZ2aG9zdF92 ZG1hYnVmX2lvY3Rsc1tucl07CisKKwlmdW5jID0gaW9jdGwtPmZ1bmM7CisKKwlpZiAodW5saWtl bHkoIWZ1bmMpKSB7CisJCWRldl9lcnIoZHJ2X2luZm8tPmRldiwgIm5vIGZ1bmN0aW9uXG4iKTsK KwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJa2RhdGEgPSBrbWFsbG9jKF9JT0NfU0laRShjbWQp LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChj b3B5X2Zyb21fdXNlcihrZGF0YSwgKHZvaWQgX191c2VyICopcGFyYW0sCisJCQkgICBfSU9DX1NJ WkUoY21kKSkgIT0gMCkgeworCQlkZXZfZXJyKGRydl9pbmZvLT5kZXYsCisJCQkiZmFpbGVkIHRv IGNvcHkgYXJncyBmcm9tIHVzZXJzcGFjZVxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8g aW9jdGxfZXJyb3I7CisJfQorCisJcmV0ID0gZnVuYyhmaWxwLCBrZGF0YSk7CisKKwlpZiAoY29w eV90b191c2VyKCh2b2lkIF9fdXNlciAqKXBhcmFtLCBrZGF0YSwKKwkJCSBfSU9DX1NJWkUoY21k KSkgIT0gMCkgeworCQlkZXZfZXJyKGRydl9pbmZvLT5kZXYsCisJCQkiZmFpbGVkIHRvIGNvcHkg YXJncyBiYWNrIHRvIHVzZXJzcGFjZVxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gaW9j dGxfZXJyb3I7CisJfQorCitpb2N0bF9lcnJvcjoKKwlrZnJlZShrZGF0YSk7CisJcmV0dXJuIHJl dDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmhvc3RfdmRtYWJ1 Zl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gdmhvc3RfdmRtYWJ1 Zl9vcGVuLAorCS5yZWxlYXNlID0gdmhvc3RfdmRtYWJ1Zl9yZWxlYXNlLAorCS5yZWFkID0gdmhv c3RfdmRtYWJ1Zl9ldmVudF9yZWFkLAorCS5wb2xsID0gdmhvc3RfdmRtYWJ1Zl9ldmVudF9wb2xs LAorCS51bmxvY2tlZF9pb2N0bCA9IHZob3N0X3ZkbWFidWZfaW9jdGwsCit9OworCitzdGF0aWMg c3RydWN0IG1pc2NkZXZpY2Ugdmhvc3RfdmRtYWJ1Zl9taXNjZGV2ID0geworCS5taW5vciA9IE1J U0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZSA9ICJ2aG9zdC12ZG1hYnVmIiwKKwkuZm9wcyA9ICZ2 aG9zdF92ZG1hYnVmX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB2aG9zdF92ZG1hYnVm X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnZo b3N0X3ZkbWFidWZfbWlzY2Rldik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoInZob3N0LXZkbWFi dWY6IGRyaXZlciBjYW4ndCBiZSByZWdpc3RlcmVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisK KwlkbWFfY29lcmNlX21hc2tfYW5kX2NvaGVyZW50KHZob3N0X3ZkbWFidWZfbWlzY2Rldi50aGlz X2RldmljZSwKKwkJCQkgICAgIERNQV9CSVRfTUFTSyg2NCkpOworCisJZHJ2X2luZm8gPSBrY2Fs bG9jKDEsIHNpemVvZigqZHJ2X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRydl9pbmZvKSB7 CisJCW1pc2NfZGVyZWdpc3Rlcigmdmhvc3RfdmRtYWJ1Zl9taXNjZGV2KTsKKwkJcmV0dXJuIC1F Tk9NRU07CisJfQorCisJZHJ2X2luZm8tPmRldiA9IHZob3N0X3ZkbWFidWZfbWlzY2Rldi50aGlz X2RldmljZTsKKworCWhhc2hfaW5pdChkcnZfaW5mby0+YnVmX2xpc3QpOworCW11dGV4X2luaXQo JmRydl9pbmZvLT5nX211dGV4KTsKKworCUlOSVRfTElTVF9IRUFEKCZkcnZfaW5mby0+aGVhZF92 ZG1hYnVmX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkcnZfaW5mby0+a3ZtX2luc3RhbmNlcyk7 CisKKwlkcnZfaW5mby0+a3ZtX25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSB2aG9zdF92ZG1hYnVm X2dldF9rdm07CisJcmV0ID0ga3ZtX3ZtX3JlZ2lzdGVyX25vdGlmaWVyKCZkcnZfaW5mby0+a3Zt X25vdGlmaWVyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2aG9z dF92ZG1hYnVmX2RlaW5pdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3Rlcigmdmhvc3RfdmRtYWJ1 Zl9taXNjZGV2KTsKKwl2aG9zdF92ZG1hYnVmX2RlbF9hbGwoKTsKKworCWt2bV92bV91bnJlZ2lz dGVyX25vdGlmaWVyKCZkcnZfaW5mby0+a3ZtX25vdGlmaWVyKTsKKwlrZnJlZShkcnZfaW5mbyk7 CisJZHJ2X2luZm8gPSBOVUxMOworfQorCittb2R1bGVfaW5pdCh2aG9zdF92ZG1hYnVmX2luaXQp OworbW9kdWxlX2V4aXQodmhvc3RfdmRtYWJ1Zl9kZWluaXQpOworCitNT0RVTEVfREVTQ1JJUFRJ T04oIlZob3N0IFZkbWFidWYgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRp dGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3Zob3N0Lmgg Yi9pbmNsdWRlL3VhcGkvbGludXgvdmhvc3QuaAppbmRleCBjOTk4ODYwZDdiYmMuLjg3ZTBkMWI4 Y2M3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3Zob3N0LmgKKysrIGIvaW5jbHVk ZS91YXBpL2xpbnV4L3Zob3N0LmgKQEAgLTE1MCw0ICsxNTAsNyBAQAogLyogR2V0IHRoZSB2YWxp ZCBpb3ZhIHJhbmdlICovCiAjZGVmaW5lIFZIT1NUX1ZEUEFfR0VUX0lPVkFfUkFOR0UJX0lPUihW SE9TVF9WSVJUSU8sIDB4NzgsIFwKIAkJCQkJICAgICBzdHJ1Y3Qgdmhvc3RfdmRwYV9pb3ZhX3Jh bmdlKQorCisvKiBWSE9TVF9WRE1BQlVGIHNwZWNpZmljIGRlZmluZXMgKi8KKyNkZWZpbmUgVkhP U1RfVkRNQUJVRl9TRVRfUlVOTklORyAgICAgICBfSU9XKFZIT1NUX1ZJUlRJTywgMHg4MCwgaW50 KQogI2VuZGlmCi0tIAoyLjI2LjIKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpWaXJ0dWFsaXphdGlvbiBtYWlsaW5nIGxpc3QKVmlydHVhbGl6YXRpb25A bGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKaHR0cHM6Ly9saXN0cy5saW51eGZvdW5kYXRpb24u b3JnL21haWxtYW4vbGlzdGluZm8vdmlydHVhbGl6YXRpb24=