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_RED,USER_AGENT_GIT autolearn=ham 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 0F236C433E6 for ; Tue, 19 Jan 2021 08:39:30 +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 7F11E23121 for ; Tue, 19 Jan 2021 08:39:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7F11E23121 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 9AEF327A4E; Tue, 19 Jan 2021 08:39:28 +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 YCC84sqhCMw8; Tue, 19 Jan 2021 08:39:22 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id BE0E0274B0; Tue, 19 Jan 2021 08:39:22 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id A6ABCC08A1; Tue, 19 Jan 2021 08:39:22 +0000 (UTC) Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 5F13BC013A for ; Tue, 19 Jan 2021 08:39:21 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 4D03A8480D for ; Tue, 19 Jan 2021 08:39:21 +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 4UVkXwld93yQ for ; Tue, 19 Jan 2021 08:39:18 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by fraxinus.osuosl.org (Postfix) with ESMTPS id D39A685D3D for ; Tue, 19 Jan 2021 08:39:18 +0000 (UTC) IronPort-SDR: u6y+RWrEIux8wpEkEUGNlL9LYgFDF0w3WWxFbImn0jFGesTTK+9S91g+fQ+2s6fibC/+ARifyK QUHzdSlJMAJw== X-IronPort-AV: E=McAfee;i="6000,8403,9868"; a="166562892" X-IronPort-AV: E=Sophos;i="5.79,358,1602572400"; d="scan'208";a="166562892" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Jan 2021 00:39:14 -0800 IronPort-SDR: 6wpfdxXCmmMoSw6lldSbNtR1FSqKcuAGNfwTPAUO5ucU0VMP0bPWSEpOoPW9llKBejP1od3lhB xoyV0xz9Y77A== X-IronPort-AV: E=Sophos;i="5.79,358,1602572400"; d="scan'208";a="402291666" Received: from vkasired-desk2.fm.intel.com ([10.105.128.127]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Jan 2021 00:39:14 -0800 From: Vivek Kasireddy To: virtualization@lists.linux-foundation.org Subject: [RFC 2/3] vhost: Add Vdmabuf backend Date: Tue, 19 Jan 2021 00:28:11 -0800 Message-Id: <20210119082812.822291-3-vivek.kasireddy@intel.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210119082812.822291-1-vivek.kasireddy@intel.com> References: <20210119082812.822291-1-vivek.kasireddy@intel.com> MIME-Version: 1.0 Cc: dongwon.kim@intel.com 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 ICAgfCAgICA5ICsKIGRyaXZlcnMvdmhvc3QvTWFrZWZpbGUgIHwgICAgMyArCiBkcml2ZXJzL3Zo b3N0L3ZkbWFidWYuYyB8IDEzMzIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCiAzIGZpbGVzIGNoYW5nZWQsIDEzNDQgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvdmhvc3QvdmRtYWJ1Zi5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC9L Y29uZmlnIGIvZHJpdmVycy92aG9zdC9LY29uZmlnCmluZGV4IDU4N2ZiYWUwNjE4Mi4uMWYxYzUx YzQ0OTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy92 aG9zdC9LY29uZmlnCkBAIC04OSw0ICs4OSwxMyBAQCBjb25maWcgVkhPU1RfQ1JPU1NfRU5ESUFO X0xFR0FDWQogCiAJICBJZiB1bnN1cmUsIHNheSAiTiIuCiAKK2NvbmZpZyBWSE9TVF9WRE1BQlVG CisJYm9vbCAiVmhvc3QgYmFja2VuZCBmb3IgdGhlIFZkbWFidWYgZHJpdmVyIgorCWRlcGVuZHMg b24gRVZFTlRGRAorCXNlbGVjdCBWSE9TVAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgZHJp dmVyIHdvcmtzIGluIHBhaXIgd2l0aCB0aGUgVmlydGlvIFZkbWFidWYgZnJvbnRlbmQuIEl0IGNh bgorCSAgYmUgdXNlZCB0byBjcmVhdGUgYSBkbWFidWYgdXNpbmcgdGhlIHBhZ2VzIHNoYXJlZCBi eSB0aGUgR3Vlc3QuCisKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L01ha2VmaWxl IGIvZHJpdmVycy92aG9zdC9NYWtlZmlsZQppbmRleCBmM2UxODk3Y2NlODUuLjVjMmNlYTRhN2Vh ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aG9zdC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Zob3N0 L01ha2VmaWxlCkBAIC0xNywzICsxNyw2IEBAIG9iai0kKENPTkZJR19WSE9TVCkJKz0gdmhvc3Qu bwogCiBvYmotJChDT05GSUdfVkhPU1RfSU9UTEIpICs9IHZob3N0X2lvdGxiLm8KIHZob3N0X2lv dGxiLXkgOj0gaW90bGIubworCitvYmotJChDT05GSUdfVkhPU1RfVkRNQUJVRikgKz0gdmhvc3Rf dmRtYWJ1Zi5vCit2aG9zdF92ZG1hYnVmLXkgOj0gdmRtYWJ1Zi5vCmRpZmYgLS1naXQgYS9kcml2 ZXJzL3Zob3N0L3ZkbWFidWYuYyBiL2RyaXZlcnMvdmhvc3QvdmRtYWJ1Zi5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uN2UyNTc2ZmMyYzBkCi0tLSAvZGV2L251bGwK KysrIGIvZHJpdmVycy92aG9zdC92ZG1hYnVmLmMKQEAgLTAsMCArMSwxMzMyIEBACisvLyBTUERY LUxpY2Vuc2UtSWRlbnRpZmllcjogKE1JVCBPUiBHUEwtMi4wKQorCisvKgorICogQ29weXJpZ2h0 IMKpIDIwMjEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBn cmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29w eSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRo ZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJp Y3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNl LCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAor ICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJz b25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1Ympl Y3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmln aHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQK KyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFu dGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJ UyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNT IE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5U SUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhP UlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMg T1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1Qs IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVD VElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJ TiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIERvbmd3b24gS2ltIDxkb25n d29uLmtpbUBpbnRlbC5jb20+CisgKiAgICBNYXRldXN6IFBvbHJvbGEgPG1hdGV1c3oucG9scm9s YUBnbWFpbC5jb20+CisgKiAgICBWaXZlayBLYXNpcmVkZHkgPHZpdmVrLmthc2lyZWRkeUBpbnRl bC5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxs aW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9t b2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2Nk ZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9z bGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGFzaHRh YmxlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwu aD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtYnVmLmg+CisjaW5jbHVkZSA8bGludXgvdmhvc3QuaD4K KyNpbmNsdWRlIDxsaW51eC92ZmlvLmg+CisjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KKyNp bmNsdWRlIDxsaW51eC92aXJ0aW9fdmRtYWJ1Zi5oPgorCisjaW5jbHVkZSAidmhvc3QuaCIKKwor I2RlZmluZSBSRUZTX1BFUl9QQUdFIChQQUdFX1NJWkUvc2l6ZW9mKGxvbmcpKQorCitzdGF0aWMg c3RydWN0IHZpcnRpb192ZG1hYnVmX2luZm8gKmRydl9pbmZvOworCitzdHJ1Y3Qga3ZtX2luc3Rh bmNlIHsKKwlzdHJ1Y3Qga3ZtICprdm07CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworfTsKKwor c3RydWN0IHZob3N0X3ZkbWFidWYgeworCXN0cnVjdCB2aG9zdF9kZXYgZGV2OworCXN0cnVjdCB2 aG9zdF92aXJ0cXVldWUgdnE7CisJc3RydWN0IHZob3N0X3dvcmsgdHhfd29yazsKKwlzdHJ1Y3Qg dmlydGlvX3ZkbWFidWZfZXZlbnRfcXVldWUgKmV2cTsKKwl1NjQgdm1pZDsKKworCS8qIHN5bmNo cm9uaXphdGlvbiBiZXR3ZWVuIHRyYW5zbWlzc2lvbnMgKi8KKwlzdHJ1Y3QgbXV0ZXggdHhfbXV0 ZXg7CisJLyogc3luY2hyb25pemF0aW9uIG9uIHR4IGFuZCByeCAqLworCXN0cnVjdCBtdXRleCB2 cV9tdXRleDsKKworCXN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl90eG1zZyBuZXh0OworCXN0cnVjdCBs aXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3Qga3ZtICprdm07Cit9OworCitzdGF0aWMgaW5saW5lIHZv aWQgdmhvc3RfdmRtYWJ1Zl9hZGQoc3RydWN0IHZob3N0X3ZkbWFidWYgKm5ldykKK3sKKwlsaXN0 X2FkZF90YWlsKCZuZXctPmxpc3QsICZkcnZfaW5mby0+aGVhZF92ZG1hYnVmX2xpc3QpOworfQor CitzdGF0aWMgaW5saW5lIHN0cnVjdCB2aG9zdF92ZG1hYnVmICp2aG9zdF92ZG1hYnVmX2ZpbmQo dTY0IHZtaWQpCit7CisJc3RydWN0IHZob3N0X3ZkbWFidWYgKmZvdW5kOworCisJbGlzdF9mb3Jf ZWFjaF9lbnRyeShmb3VuZCwgJmRydl9pbmZvLT5oZWFkX3ZkbWFidWZfbGlzdCwgbGlzdCkKKwkJ aWYgKGZvdW5kLT52bWlkID09IHZtaWQpCisJCQlyZXR1cm4gZm91bmQ7CisKKwlyZXR1cm4gTlVM TDsKK30KKworc3RhdGljIGlubGluZSBib29sIHZob3N0X3ZkbWFidWZfZGVsKHN0cnVjdCB2aG9z dF92ZG1hYnVmICp2ZG1hYnVmKQoreworCXN0cnVjdCB2aG9zdF92ZG1hYnVmICppdGVyLCAqdGVt cDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVyLCB0ZW1wLAorCQkJCSAmZHJ2X2lu Zm8tPmhlYWRfdmRtYWJ1Zl9saXN0LAorCQkJCSBsaXN0KQorCQlpZiAoaXRlciA9PSB2ZG1hYnVm KSB7CisJCQlsaXN0X2RlbCgmaXRlci0+bGlzdCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJ cmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmhvc3RfdmRtYWJ1Zl9kZWxf YWxsKHZvaWQpCit7CisJc3RydWN0IHZob3N0X3ZkbWFidWYgKml0ZXIsICp0ZW1wOworCisJbGlz dF9mb3JfZWFjaF9lbnRyeV9zYWZlKGl0ZXIsIHRlbXAsCisJCQkJICZkcnZfaW5mby0+aGVhZF92 ZG1hYnVmX2xpc3QsCisJCQkJIGxpc3QpIHsKKwkJbGlzdF9kZWwoJml0ZXItPmxpc3QpOworCQlr ZnJlZShpdGVyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkICptYXBfZ3BhKHN0cnVjdCBrdm1fdmNw dSAqdmNwdSwgZ3BhX3QgZ3BhKQoreworCXN0cnVjdCBrdm1faG9zdF9tYXAgbWFwOworCWludCBy ZXQ7CisKKwlyZXQgPSBrdm1fdmNwdV9tYXAodmNwdSwgZ3BhX3RvX2dmbihncGEpLCAmbWFwKTsK KwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwllbHNlCisJCXJldHVybiBt YXAuaHZhOworfQorCitzdGF0aWMgdm9pZCB1bm1hcF9odmEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1 LCBncGFfdCBodmEpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoaHZhKTsK KwlzdHJ1Y3Qga3ZtX2hvc3RfbWFwIG1hcDsKKworCW1hcC5odmEgPSAodm9pZCAqKWh2YTsKKwlt YXAucGFnZSA9IHBhZ2U7CisKKwlrdm1fdmNwdV91bm1hcCh2Y3B1LCAmbWFwLCB0cnVlKTsKK30K KworLyogbWFwcGluZyBndWVzdCdzIHBhZ2VzIGZvciB0aGUgdmRtYWJ1ZiAqLworc3RhdGljIGlu dAordmhvc3RfdmRtYWJ1Zl9tYXBfcGFnZXModTY0IHZtaWQsCisJCSAgICAgICAgc3RydWN0IHZp cnRpb192ZG1hYnVmX3NoYXJlZF9wYWdlcyAqcGFnZXNfaW5mbykKK3sKKwlzdHJ1Y3Qgdmhvc3Rf dmRtYWJ1ZiAqdmRtYWJ1ZiA9IHZob3N0X3ZkbWFidWZfZmluZCh2bWlkKTsKKwlzdHJ1Y3Qga3Zt X3ZjcHUgKnZjcHU7CisJdm9pZCAqcGFkZHI7CisJaW50IG5wZ3MgPSBSRUZTX1BFUl9QQUdFOwor CWludCBsYXN0X25lbnRzLCBuX2wycmVmczsKKwlpbnQgaSwgaiA9IDAsIGsgPSAwOworCisJaWYg KCF2ZG1hYnVmIHx8ICF2ZG1hYnVmLT5rdm0gfHwgIXBhZ2VzX2luZm8gfHwgcGFnZXNfaW5mby0+ cGFnZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJdmNwdSA9IGt2bV9nZXRfdmNwdV9ieV9pZCh2 ZG1hYnVmLT5rdm0sIDApOworCWlmICghdmNwdSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsYXN0 X25lbnRzID0gKHBhZ2VzX2luZm8tPm5lbnRzIC0gMSkgJSBucGdzICsgMTsKKwluX2wycmVmcyA9 IChwYWdlc19pbmZvLT5uZW50cyAvIG5wZ3MpICsgKChsYXN0X25lbnRzID4gMCkgPyAxIDogMCkg LQorCQkgICAobGFzdF9uZW50cyA9PSBucGdzKTsKKworCXBhZ2VzX2luZm8tPnBhZ2VzID0ga2Nh bGxvYyhwYWdlc19pbmZvLT5uZW50cywgc2l6ZW9mKHN0cnVjdCBwYWdlICopLAorCQkJCSAgICBH RlBfS0VSTkVMKTsKKwlpZiAoIXBhZ2VzX2luZm8tPnBhZ2VzKQorCQlnb3RvIGZhaWxfcGFnZV9h bGxvYzsKKworCXBhZ2VzX2luZm8tPmwycmVmcyA9IGtjYWxsb2Mobl9sMnJlZnMsIHNpemVvZihn cGFfdCAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlc19pbmZvLT5sMnJlZnMpCisJCWdvdG8g ZmFpbF9sMnJlZnM7CisKKwlwYWdlc19pbmZvLT5sM3JlZnMgPSAoZ3BhX3QgKiltYXBfZ3BhKHZj cHUsIHBhZ2VzX2luZm8tPnJlZik7CisJaWYgKElTX0VSUihwYWdlc19pbmZvLT5sM3JlZnMpKQor CQlnb3RvIGZhaWxfbDNyZWZzOworCisJZm9yIChpID0gMDsgaSA8IG5fbDJyZWZzOyBpKyspIHsK KwkJcGFnZXNfaW5mby0+bDJyZWZzW2ldID0gKGdwYV90ICopbWFwX2dwYSh2Y3B1LAorCQkJCQkJ CSBwYWdlc19pbmZvLT5sM3JlZnNbaV0pOworCisJCWlmIChJU19FUlIocGFnZXNfaW5mby0+bDJy ZWZzW2ldKSkKKwkJCWdvdG8gZmFpbF9tYXBwaW5nX2wyOworCisJCS8qIGxhc3QgbGV2ZWwtMiBy ZWYgKi8KKwkJaWYgKGkgPT0gbl9sMnJlZnMgLSAxKQorCQkJbnBncyA9IGxhc3RfbmVudHM7CisK KwkJZm9yIChqID0gMDsgaiA8IG5wZ3M7IGorKykgeworCQkJcGFkZHIgPSBtYXBfZ3BhKHZjcHUs IHBhZ2VzX2luZm8tPmwycmVmc1tpXVtqXSk7CisJCQlpZiAoSVNfRVJSKHBhZGRyKSkKKwkJCQln b3RvIGZhaWxfbWFwcGluZ19sMTsKKworCQkJcGFnZXNfaW5mby0+cGFnZXNba10gPSB2aXJ0X3Rv X3BhZ2UocGFkZHIpOworCQkJaysrOworCQl9CisJCXVubWFwX2h2YSh2Y3B1LCBwYWdlc19pbmZv LT5sM3JlZnNbaV0pOworCX0KKworCXVubWFwX2h2YSh2Y3B1LCBwYWdlc19pbmZvLT5yZWYpOwor CisJcmV0dXJuIDA7CisKK2ZhaWxfbWFwcGluZ19sMToKKwlmb3IgKGsgPSAwOyBrIDwgajsgaysr KQorCQl1bm1hcF9odmEodmNwdSwgcGFnZXNfaW5mby0+bDJyZWZzW2ldW2tdKTsKKworZmFpbF9t YXBwaW5nX2wyOgorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJZm9yIChrID0gMDsgayA8 IFJFRlNfUEVSX1BBR0U7IGsrKykKKwkJCXVubWFwX2h2YSh2Y3B1LCBwYWdlc19pbmZvLT5sMnJl ZnNbaV1ba10pOworCX0KKworCXVubWFwX2h2YSh2Y3B1LCBwYWdlc19pbmZvLT5sM3JlZnNbaV0p OworCXVubWFwX2h2YSh2Y3B1LCBwYWdlc19pbmZvLT5yZWYpOworCitmYWlsX2wzcmVmczoKKwlr ZnJlZShwYWdlc19pbmZvLT5sMnJlZnMpOworCitmYWlsX2wycmVmczoKKwlrZnJlZShwYWdlc19p bmZvLT5wYWdlcyk7CisKK2ZhaWxfcGFnZV9hbGxvYzoKKwlyZXR1cm4gLUVOT01FTTsKK30KKwor LyogdW5tYXBwaW5nIG1hcHBlZCBwYWdlcyAqLworc3RhdGljIGludAordmhvc3RfdmRtYWJ1Zl91 bm1hcF9wYWdlcyh1NjQgdm1pZCwKKwkJCSAgc3RydWN0IHZpcnRpb192ZG1hYnVmX3NoYXJlZF9w YWdlcyAqcGFnZXNfaW5mbykKK3sKKwlzdHJ1Y3Qgdmhvc3RfdmRtYWJ1ZiAqdmRtYWJ1ZiA9IHZo b3N0X3ZkbWFidWZfZmluZCh2bWlkKTsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisJaW50IGxh c3RfbmVudHMgPSAocGFnZXNfaW5mby0+bmVudHMgLSAxKSAlIFJFRlNfUEVSX1BBR0UgKyAxOwor CWludCBuX2wycmVmcyA9IChwYWdlc19pbmZvLT5uZW50cyAvIFJFRlNfUEVSX1BBR0UpICsKKwkJ ICAgICAgICgobGFzdF9uZW50cyA+IDApID8gMSA6IDApIC0KKwkJICAgICAgIChsYXN0X25lbnRz ID09IFJFRlNfUEVSX1BBR0UpOworCWludCBpLCBqOworCisJaWYgKCF2ZG1hYnVmIHx8ICF2ZG1h YnVmLT5rdm0gfHwgIXBhZ2VzX2luZm8gfHwgcGFnZXNfaW5mby0+cGFnZXMpCisJCXJldHVybiAt RUlOVkFMOworCisJdmNwdSA9IGt2bV9nZXRfdmNwdV9ieV9pZCh2ZG1hYnVmLT5rdm0sIDApOwor CWlmICghdmNwdSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9sMnJl ZnMgLSAxOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IFJFRlNfUEVSX1BBR0U7IGorKykKKwkJ CXVubWFwX2h2YSh2Y3B1LCBwYWdlc19pbmZvLT5sMnJlZnNbaV1bal0pOworCX0KKworCWZvciAo aiA9IDA7IGogPCBsYXN0X25lbnRzOyBqKyspCisJCXVubWFwX2h2YSh2Y3B1LCBwYWdlc19pbmZv LT5sMnJlZnNbaV1bal0pOworCisJa2ZyZWUocGFnZXNfaW5mby0+bDJyZWZzKTsKKwlrZnJlZShw YWdlc19pbmZvLT5wYWdlcyk7CisJcGFnZXNfaW5mby0+cGFnZXMgPSBOVUxMOworCisJcmV0dXJu IDA7Cit9CisKKy8qIGNyZWF0ZSBzZ190YWJsZSB3aXRoIGdpdmVuIHBhZ2VzIGFuZCBvdGhlciBw YXJhbWV0ZXJzICovCitzdGF0aWMgc3RydWN0IHNnX3RhYmxlICpuZXdfc2d0KHN0cnVjdCBwYWdl ICoqcGdzLAorCQkJCWludCBmaXJzdF9vZnN0LCBpbnQgbGFzdF9sZW4sCisJCQkJaW50IG5lbnRz KQoreworCXN0cnVjdCBzZ190YWJsZSAqc2d0OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsOwor CWludCBpLCByZXQ7CisKKwlzZ3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2dfdGFibGUpLCBH RlBfS0VSTkVMKTsKKwlpZiAoIXNndCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBzZ19hbGxv Y190YWJsZShzZ3QsIG5lbnRzLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKHNn dCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNnbCA9IHNndC0+c2dsOworCXNnX3NldF9wYWdl KHNnbCwgcGdzWzBdLCBQQUdFX1NJWkUtZmlyc3Rfb2ZzdCwgZmlyc3Rfb2ZzdCk7CisKKwlmb3Ig KGkgPSAxOyBpIDwgbmVudHMtMTsgaSsrKSB7CisJCXNnbCA9IHNnX25leHQoc2dsKTsKKwkJc2df c2V0X3BhZ2Uoc2dsLCBwZ3NbaV0sIFBBR0VfU0laRSwgMCk7CisJfQorCisJLyogbW9yZSB0aGFu IDEgcGFnZSAqLworCWlmIChuZW50cyA+IDEpIHsKKwkJc2dsID0gc2dfbmV4dChzZ2wpOworCQlz Z19zZXRfcGFnZShzZ2wsIHBnc1tpXSwgbGFzdF9sZW4sIDApOworCX0KKworCXJldHVybiBzZ3Q7 Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUKKyp2aG9zdF92ZG1hYnVmX2RtYWJ1Zl9tYXAo c3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqYXR0YWNobWVudCwKKwkJCSAgZW51bSBkbWFfZGF0 YV9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9idWYgKmltcDsKKwor CWlmICghYXR0YWNobWVudC0+ZG1hYnVmIHx8ICFhdHRhY2htZW50LT5kbWFidWYtPnByaXYpCisJ CXJldHVybiBOVUxMOworCisJaW1wID0gKHN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9idWYgKilhdHRh Y2htZW50LT5kbWFidWYtPnByaXY7CisKKwkvKiBpZiBidWZmZXIgaGFzIG5ldmVyIGJlZW4gbWFw cGVkICovCisJaWYgKCFpbXAtPnNndCkgeworCQlpbXAtPnNndCA9IG5ld19zZ3QoaW1wLT5wYWdl c19pbmZvLT5wYWdlcywKKwkJCQkgICBpbXAtPnBhZ2VzX2luZm8tPmZpcnN0X29mc3QsCisJCQkJ ICAgaW1wLT5wYWdlc19pbmZvLT5sYXN0X2xlbiwKKwkJCQkgICBpbXAtPnBhZ2VzX2luZm8tPm5l bnRzKTsKKworCQlpZiAoIWltcC0+c2d0KQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFk bWFfbWFwX3NnKGF0dGFjaG1lbnQtPmRldiwgaW1wLT5zZ3QtPnNnbCwKKwkJCWltcC0+c2d0LT5u ZW50cywgZGlyKSkgeworCQlzZ19mcmVlX3RhYmxlKGltcC0+c2d0KTsKKwkJa2ZyZWUoaW1wLT5z Z3QpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gaW1wLT5zZ3Q7Cit9CisKK3N0YXRp YyB2b2lkCit2aG9zdF92ZG1hYnVmX2RtYWJ1Zl91bm1hcChzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2ht ZW50ICphdHRhY2htZW50LAorCSAgIAkgICAgICAgICAgIHN0cnVjdCBzZ190YWJsZSAqc2csCisJ CQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJZG1hX3VubWFwX3NnKGF0dGFj aG1lbnQtPmRldiwgc2ctPnNnbCwgc2ctPm5lbnRzLCBkaXIpOworfQorCitzdGF0aWMgaW50IHZo b3N0X3ZkbWFidWZfZG1hYnVmX21tYXAoc3RydWN0IGRtYV9idWYgKmRtYWJ1ZiwKKwkJCQkgICAg IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9i dWYgKmltcDsKKwl1NjQgdWFkZHI7CisJaW50IGksIGVycjsKKworCWlmICghZG1hYnVmLT5wcml2 KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWltcCA9IChzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfYnVm ICopZG1hYnVmLT5wcml2OworCisJaWYgKCFpbXAtPnBhZ2VzX2luZm8pCisJCXJldHVybiAtRUlO VkFMOworCisJdm1hLT52bV9mbGFncyB8PSBWTV9ET05URVhQQU5EIHwgVk1fRE9OVERVTVA7CisK Kwl1YWRkciA9IHZtYS0+dm1fc3RhcnQ7CisJZm9yIChpID0gMDsgaSA8IGltcC0+cGFnZXNfaW5m by0+bmVudHM7IGkrKykgeworCQllcnIgPSB2bV9pbnNlcnRfcGFnZSh2bWEsIHVhZGRyLAorCQkJ CSAgICAgaW1wLT5wYWdlc19pbmZvLT5wYWdlc1tpXSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4g ZXJyOworCisJCXVhZGRyICs9IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGludCB2aG9zdF92ZG1hYnVmX2RtYWJ1Zl92bWFwKHN0cnVjdCBkbWFfYnVmICpkbWFidWYs CisJCQkJICAgICBzdHJ1Y3QgZG1hX2J1Zl9tYXAgKm1hcCkKK3sKKwlzdHJ1Y3QgdmlydGlvX3Zk bWFidWZfYnVmICppbXA7CisJdm9pZCAqYWRkcjsKKworCWlmICghZG1hYnVmLT5wcml2KQorCQly ZXR1cm4gLUVJTlZBTDsKKworCWltcCA9IChzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfYnVmICopZG1h YnVmLT5wcml2OworCisJaWYgKCFpbXAtPnBhZ2VzX2luZm8pCisJCXJldHVybiAtRUlOVkFMOwor CisJYWRkciA9IHZtYXAoaW1wLT5wYWdlc19pbmZvLT5wYWdlcywgaW1wLT5wYWdlc19pbmZvLT5u ZW50cywKKyAgICAgICAgICAgICAgICAgICAgMCwgUEFHRV9LRVJORUwpOworCWlmIChJU19FUlIo YWRkcikpCisJCXJldHVybiBQVFJfRVJSKGFkZHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyB2b2lkIHZob3N0X3ZkbWFidWZfZG1hYnVmX3JlbGVhc2Uoc3RydWN0IGRtYV9idWYgKmRtYV9i dWYpCit7CisJc3RydWN0IHZpcnRpb192ZG1hYnVmX2J1ZiAqaW1wOworCisJaWYgKCFkbWFfYnVm LT5wcml2KQorCQlyZXR1cm47CisKKwlpbXAgPSAoc3RydWN0IHZpcnRpb192ZG1hYnVmX2J1ZiAq KWRtYV9idWYtPnByaXY7CisJaW1wLT5kbWFfYnVmID0gTlVMTDsKKwlpbXAtPnZhbGlkID0gZmFs c2U7CisKKwl2aG9zdF92ZG1hYnVmX3VubWFwX3BhZ2VzKGltcC0+dm1pZCwgaW1wLT5wYWdlc19p bmZvKTsKKwl2aXJ0aW9fdmRtYWJ1Zl9kZWxfYnVmKGRydl9pbmZvLCAmaW1wLT5idWZfaWQpOwor CisJaWYgKGltcC0+c2d0KSB7CisJCXNnX2ZyZWVfdGFibGUoaW1wLT5zZ3QpOworCQlrZnJlZShp bXAtPnNndCk7CisJCWltcC0+c2d0ID0gTlVMTDsKKwl9CisKKwlrZnJlZShpbXAtPnByaXYpOwor CWtmcmVlKGltcC0+cGFnZXNfaW5mbyk7CisJa2ZyZWUoaW1wKTsKK30KKworc3RhdGljIGNvbnN0 IHN0cnVjdCBkbWFfYnVmX29wcyB2aG9zdF92ZG1hYnVmX2RtYWJ1Zl9vcHMgPSB7CisJLm1hcF9k bWFfYnVmID0gdmhvc3RfdmRtYWJ1Zl9kbWFidWZfbWFwLAorCS51bm1hcF9kbWFfYnVmID0gdmhv c3RfdmRtYWJ1Zl9kbWFidWZfdW5tYXAsCisJLnJlbGVhc2UgPSB2aG9zdF92ZG1hYnVmX2RtYWJ1 Zl9yZWxlYXNlLAorCS5tbWFwID0gdmhvc3RfdmRtYWJ1Zl9kbWFidWZfbW1hcCwKKwkudm1hcCA9 IHZob3N0X3ZkbWFidWZfZG1hYnVmX3ZtYXAsCit9OworCisvKiBleHBvcnRpbmcgZG1hYnVmIGFz IGZkICovCitzdGF0aWMgaW50IHZob3N0X3ZkbWFidWZfZXhwX2ZkKHN0cnVjdCB2aXJ0aW9fdmRt YWJ1Zl9idWYgKmltcCwgaW50IGZsYWdzKQoreworCURFRklORV9ETUFfQlVGX0VYUE9SVF9JTkZP KGV4cF9pbmZvKTsKKworCWV4cF9pbmZvLm9wcyA9ICZ2aG9zdF92ZG1hYnVmX2RtYWJ1Zl9vcHM7 CisKKwkvKiBtdWx0aXBsZSBvZiBQQUdFX1NJWkUsIG5vdCBjb25zaWRlcmluZyBvZmZzZXQgKi8K KwlleHBfaW5mby5zaXplID0gaW1wLT5wYWdlc19pbmZvLT5uZW50cyAqIFBBR0VfU0laRTsKKwll eHBfaW5mby5mbGFncyA9IDA7CisJZXhwX2luZm8ucHJpdiA9IGltcDsKKworCWlmICghaW1wLT5k bWFfYnVmKSB7CisJCWltcC0+ZG1hX2J1ZiA9IGRtYV9idWZfZXhwb3J0KCZleHBfaW5mbyk7CisJ CWlmIChJU19FUlJfT1JfTlVMTChpbXAtPmRtYV9idWYpKSB7CisJCQlpbXAtPmRtYV9idWYgPSBO VUxMOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gZG1hX2J1Zl9mZChp bXAtPmRtYV9idWYsIGZsYWdzKTsKK30KKworc3RhdGljIGludCB2aG9zdF92ZG1hYnVmX2FkZF9l dmVudChzdHJ1Y3Qgdmhvc3RfdmRtYWJ1ZiAqdmRtYWJ1ZiwKKwkJCQkgICBzdHJ1Y3QgdmlydGlv X3ZkbWFidWZfYnVmICpidWZfaW5mbykKK3sKKwlzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfZXZlbnQg KmVfb2xkZXN0LCAqZV9uZXc7CisJc3RydWN0IHZpcnRpb192ZG1hYnVmX2V2ZW50X3F1ZXVlICpl dnEgPSB2ZG1hYnVmLT5ldnE7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKworCWVfbmV3ID0g a3phbGxvYyhzaXplb2YoKmVfbmV3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlX25ldykKKwkJcmV0 dXJuIC1FTk9NRU07CisKKwllX25ldy0+ZV9kYXRhLmhkci5idWZfaWQgPSBidWZfaW5mby0+YnVm X2lkOworCWVfbmV3LT5lX2RhdGEuZGF0YSA9ICh2b2lkICopYnVmX2luZm8tPnByaXY7CisJZV9u ZXctPmVfZGF0YS5oZHIuc2l6ZSA9IGJ1Zl9pbmZvLT5zel9wcml2OworCisJc3Bpbl9sb2NrX2ly cXNhdmUoJmV2cS0+ZV9sb2NrLCBpcnFmbGFncyk7CisKKwkvKiBjaGVjayBjdXJyZW50IG51bWJl ciBvZiBldmVudCB0aGVuIGlmIGl0IGhpdHMgdGhlIG1heCBudW0gKDMyKQorCSAqIHRoZW4gcmVt b3ZlIHRoZSBvbGRlc3QgZXZlbnQgaW4gdGhlIGxpc3QKKwkgKi8KKwlpZiAoZXZxLT5wZW5kaW5n ID4gMzEpIHsKKwkJZV9vbGRlc3QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZldnEtPmVfbGlzdCwKKwkJ CQkJICAgIHN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9ldmVudCwgbGluayk7CisJCWxpc3RfZGVsKCZl X29sZGVzdC0+bGluayk7CisJCWV2cS0+cGVuZGluZy0tOworCQlrZnJlZShlX29sZGVzdCk7CisJ fQorCisJbGlzdF9hZGRfdGFpbCgmZV9uZXctPmxpbmssICZldnEtPmVfbGlzdCk7CisKKwlldnEt PnBlbmRpbmcrKzsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZXZxLT5lX3dhaXQpOworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2cS0+ZV9sb2NrLCBpcnFmbGFncyk7CisKKwlyZXR1cm4g MDsKK30KKworLyogdHJhbnNtaXR0aW5nIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQgc2VuZF9tc2df dG9fZ3Vlc3QodTY0IHZtaWQsIGVudW0gdmlydGlvX3ZkbWFidWZfY21kIGNtZCwgaW50ICpvcCkK K3sKKwlzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfbXNnIG1zZzsKKwlzdHJ1Y3Qgdmhvc3RfdmRtYWJ1 ZiAqdmRtYWJ1ZjsKKworCXZkbWFidWYgPSB2aG9zdF92ZG1hYnVmX2ZpbmQodm1pZCk7CisJaWYg KCF2ZG1hYnVmKSB7CisJCWRldl9lcnIoZHJ2X2luZm8tPmRldiwKKwkJCSJjYW4ndCBmaW5kIHZk bWFidWYgZm9yIDogdm1pZCA9ICVsbHVcbiIsIHZtaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9 CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklSVElPX1ZETUFCVUZfQ01EX0RNQUJVRl9SRUw6 CisJCW1lbWNweSgmbXNnLm9wWzBdLCAmb3BbMF0sIDggKiBzaXplb2YoaW50KSk7CisJCWJyZWFr OworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1zZy5jbWQgPSBjbWQ7CisK KwltdXRleF9sb2NrKCZ2ZG1hYnVmLT50eF9tdXRleCk7CisJbXV0ZXhfbG9jaygmdmRtYWJ1Zi0+ dnFfbXV0ZXgpOworCisJaWYgKCh2ZG1hYnVmLT5uZXh0Lm1zZ19wdHIgPT0gTlVMTCkgfHwKKwkg ICAgKHZkbWFidWYtPm5leHQuaGVhZCA9PSAtMSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ2ZG1hYnVm LT52cV9tdXRleCk7CisJCW11dGV4X3VubG9jaygmdmRtYWJ1Zi0+dHhfbXV0ZXgpOworCQlyZXR1 cm4gLUVCVVNZOworCX0KKworCW1lbWNweSgmdmRtYWJ1Zi0+bmV4dC5tc2csICZtc2csIHNpemVv Zihtc2cpKTsKKwl2aG9zdF93b3JrX3F1ZXVlKCZ2ZG1hYnVmLT5kZXYsICZ2ZG1hYnVmLT50eF93 b3JrKTsKKworCW11dGV4X3VubG9jaygmdmRtYWJ1Zi0+dnFfbXV0ZXgpOworCW11dGV4X3VubG9j aygmdmRtYWJ1Zi0+dHhfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVn aXN0ZXJfZXhwb3J0ZWQoc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYsCisJCQkgICAgIHZp cnRpb192ZG1hYnVmX2J1Zl9pZF90ICpidWZfaWQsIGludCAqb3BzKQoreworCXN0cnVjdCB2aXJ0 aW9fdmRtYWJ1Zl9idWYgKmltcDsKKwlpbnQgcmV0OworCisJaW1wID0ga2NhbGxvYygxLCBzaXpl b2YoKmltcCksIEdGUF9LRVJORUwpOworCWlmICghaW1wKQorCQlyZXR1cm4gLUVOT01FTTsKKwor CWltcC0+cGFnZXNfaW5mbyA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fdmRtYWJ1 Zl9zaGFyZWRfcGFnZXMpLAorCQkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbXAtPnBhZ2VzX2lu Zm8pIHsKKwkJa2ZyZWUoaW1wKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW1wLT5zel9w cml2ID0gb3BzW1ZJUlRJT19WRE1BQlVGX1BSSVZBVEVfREFUQV9TSVpFXTsKKwlpZiAoaW1wLT5z el9wcml2KSB7CisJCWltcC0+cHJpdiA9IGtjYWxsb2MoMSwgb3BzW1ZJUlRJT19WRE1BQlVGX1BS SVZBVEVfREFUQV9TSVpFXSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghaW1wLT5wcml2 KSB7CisJCQlrZnJlZShpbXAtPnBhZ2VzX2luZm8pOworCQkJa2ZyZWUoaW1wKTsKKwkJCXJldHVy biAtRU5PTUVNOworCQl9CisJfQorCisJbWVtY3B5KCZpbXAtPmJ1Zl9pZCwgYnVmX2lkLCBzaXpl b2YoKmJ1Zl9pZCkpOworCisJaW1wLT5wYWdlc19pbmZvLT5uZW50cyA9IG9wc1tWSVJUSU9fVkRN QUJVRl9OVU1fUEFHRVNfU0hBUkVEXTsKKwlpbXAtPnBhZ2VzX2luZm8tPmZpcnN0X29mc3QgPSBv cHNbVklSVElPX1ZETUFCVUZfRklSU1RfUEFHRV9EQVRBX09GRlNFVF07CisJaW1wLT5wYWdlc19p bmZvLT5sYXN0X2xlbiA9IG9wc1tWSVJUSU9fVkRNQUJVRl9MQVNUX1BBR0VfREFUQV9MRU5HVEhd OworCWltcC0+cGFnZXNfaW5mby0+cmVmID0gKihncGFfdCAqKSZvcHNbVklSVElPX1ZETUFCVUZf UkVGX0FERFJfVVBQRVJfMzJCSVRdOworCWltcC0+dm1pZCA9IHZkbWFidWYtPnZtaWQ7CisJaW1w LT52YWxpZCA9IHRydWU7CisKKwl2aXJ0aW9fdmRtYWJ1Zl9hZGRfYnVmKGRydl9pbmZvLCBpbXAp OworCisJLyogdHJhbnNmZXJyaW5nIHByaXZhdGUgZGF0YSAqLworCW1lbWNweShpbXAtPnByaXYs ICZvcHNbVklSVElPX1ZETUFCVUZfUFJJVkFURV9EQVRBX1NUQVJUXSwKKwkgICAgICAgb3BzW1ZJ UlRJT19WRE1BQlVGX1BSSVZBVEVfREFUQV9TSVpFXSk7CisKKwkvKiBnZW5lcmF0ZSBpbXBvcnQg ZXZlbnQgKi8KKwlyZXQgPSB2aG9zdF92ZG1hYnVmX2FkZF9ldmVudCh2ZG1hYnVmLCBpbXApOwor CWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQg c2VuZF90b190eHEoc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYsCisJCQlzdHJ1Y3Qgdmly dGlvX3ZkbWFidWZfdHhtc2cgKm1zZ19pbmZvKQoreworCWludCByZXQ7CisKKwlyZXQgPSBfX2Nv cHlfdG9fdXNlcihtc2dfaW5mby0+bXNnX3B0ciwgJm1zZ19pbmZvLT5tc2csCisJCQkgICAgIHNp emVvZihzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfbXNnKSk7CisKKwlpZiAoIXJldCkgeworCQl2aG9z dF9hZGRfdXNlZF9hbmRfc2lnbmFsKCZ2ZG1hYnVmLT5kZXYsICZ2ZG1hYnVmLT52cSwKKwkJCQkJ ICBtc2dfaW5mby0+aGVhZCwKKwkJCQkJICBzaXplb2Yoc3RydWN0IHZpcnRpb192ZG1hYnVmX21z ZykpOworCQltc2dfaW5mby0+bXNnX3B0ciA9IE5VTEw7CisJCW1zZ19pbmZvLT5oZWFkID0gLTE7 CisJfSBlbHNlIHsKKwkJZGV2X2VycihkcnZfaW5mby0+ZGV2LAorCQkJImZhaWwgdG8gY29weSB0 eCBtc2dcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgdHhfd29yayhzdHJ1Y3Qgdmhvc3Rfd29y ayAqd29yaykKK3sKKwlzdHJ1Y3Qgdmhvc3RfdmRtYWJ1ZiAqdmRtYWJ1ZiA9IGNvbnRhaW5lcl9v Zih3b3JrLAorCQkJCQkgICAgICAgICAgICAgc3RydWN0IHZob3N0X3ZkbWFidWYsCisJCQkJCSAg ICAgICAgICAgICB0eF93b3JrKTsKKworCW11dGV4X2xvY2soJnZkbWFidWYtPnZxX211dGV4KTsK KwlzZW5kX3RvX3R4cSh2ZG1hYnVmLCAmdmRtYWJ1Zi0+bmV4dCk7CisJbXV0ZXhfdW5sb2NrKCZ2 ZG1hYnVmLT52cV9tdXRleCk7Cit9CisKKy8qIHBhcnNlIGluY29taW5nIG1lc3NhZ2UgZnJvbSBh IGd1ZXN0ICovCitzdGF0aWMgaW50IHBhcnNlX21zZyhzdHJ1Y3Qgdmhvc3RfdmRtYWJ1ZiAqdmRt YWJ1ZiwKKwkJICAgICBzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfbXNnICptc2csCisgICAgICAgICAg ICAgICAgICAgICB2b2lkIF9fdXNlciAqb3V0LCBpbnQgaGVhZCkKK3sKKwlzdHJ1Y3QgdmlydGlv X3ZkbWFidWZfdHhtc2cgKm1zZ19pbmZvOworCXZpcnRpb192ZG1hYnVmX2J1Zl9pZF90ICpidWZf aWQgPSAodmlydGlvX3ZkbWFidWZfYnVmX2lkX3QgKiltc2ctPm9wOworCWludCByZXQgPSAwOwor CisJbXNnX2luZm8gPSBrY2FsbG9jKDEsIHNpemVvZigqbXNnX2luZm8pLCBHRlBfS0VSTkVMKTsK KwlpZiAoIW1zZ19pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN3aXRjaCAobXNnLT5jbWQp IHsKKwljYXNlIFZJUlRJT19WRE1BQlVGX0NNRF9FWFBPUlQ6CisJCXJldCA9IHJlZ2lzdGVyX2V4 cG9ydGVkKHZkbWFidWYsIGJ1Zl9pZCwgbXNnLT5vcCk7CisJCWlmIChyZXQpCisJCQlicmVhazsK KworCQltZW1jcHkoJm1zZ19pbmZvLT5tc2csIG1zZywgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fdmRt YWJ1Zl9tc2cpKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQli cmVhazsKKwl9CisKKwltc2dfaW5mby0+bXNnX3B0ciA9IG91dDsKKwltc2dfaW5mby0+aGVhZCA9 IGhlYWQ7CisKKwlrZnJlZShtc2dfaW5mbyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg dm9pZCByeF93b3JrKHN0cnVjdCB2aG9zdF93b3JrICp3b3JrKQoreworCXN0cnVjdCB2aG9zdF92 aXJ0cXVldWUgKnZxID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCQkgIHN0cnVjdCB2aG9zdF92 aXJ0cXVldWUsCisJCQkJCQkgIHBvbGwud29yayk7CisJc3RydWN0IHZob3N0X3ZkbWFidWYgKnZk bWFidWYgPSBjb250YWluZXJfb2YodnEtPmRldiwKKwkJCQkJICAgICAgCSAgICAgc3RydWN0IHZo b3N0X3ZkbWFidWYsCisJCQkJCSAgICAgIAkgICAgIGRldik7CisJc3RydWN0IHZpcnRpb192ZG1h YnVmX21zZyBtc2c7CisJaW50IGhlYWQsIGluLCBvdXQsIGluX3NpemU7CisJaW50IHJldDsKKwor CW11dGV4X2xvY2soJnZkbWFidWYtPnZxX211dGV4KTsKKwl2aG9zdF9kaXNhYmxlX25vdGlmeSgm dmRtYWJ1Zi0+ZGV2LCB2cSk7CisKKwkvKiBNYWtlIHN1cmUgd2Ugd2lsbCBwcm9jZXNzIGFsbCBw ZW5kaW5nIHJlcXVlc3RzICovCisJZm9yICg7OykgeworCQloZWFkID0gdmhvc3RfZ2V0X3ZxX2Rl c2ModnEsIHZxLT5pb3YsIEFSUkFZX1NJWkUodnEtPmlvdiksCisJCQkJCSAmb3V0LCAmaW4sIE5V TEwsIE5VTEwpOworCisJCWlmICh1bmxpa2VseShoZWFkIDwgMCkpCisJCQlicmVhazsKKworCQkv KiBOb3RoaW5nIG5ldz8gV2FpdCBmb3IgZXZlbnRmZCB0byB0ZWxsIHVzIHRoZXkgcmVmaWxsZWQg Ki8KKwkJaWYgKGhlYWQgPT0gdnEtPm51bSkgeworCQkJaWYgKHVubGlrZWx5KHZob3N0X2VuYWJs ZV9ub3RpZnkoJnZkbWFidWYtPmRldiwgdnEpKSkgeworCQkJCXZob3N0X2Rpc2FibGVfbm90aWZ5 KCZ2ZG1hYnVmLT5kZXYsIHZxKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9 CisKKwkJaWYgKG91dCkKKwkJCWJyZWFrOworCisJCWluX3NpemUgPSBpb3ZfbGVuZ3RoKCZ2cS0+ aW92WzBdLCBpbik7CisKKwkJaWYgKGluX3NpemUgPT0gc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fdmRt YWJ1Zl9tc2cpKSB7CisJCQlpZiAoX19jb3B5X2Zyb21fdXNlcigmbXNnLCB2cS0+aW92WzBdLmlv dl9iYXNlLAorCQkJCQkgICAgaW5fc2l6ZSkpIHsKKwkJCQlkZXZfZXJyKGRydl9pbmZvLT5kZXYs CisJCQkJCSJlcnI6IGNhbid0IGdldCB0aGUgbXNnIGZyb20gdnFcbiIpOworCQkJCWNvbnRpbnVl OworCQkJfQorCisJCQl2ZG1hYnVmLT5uZXh0Lm1zZ19wdHIgPSB2cS0+aW92WzBdLmlvdl9iYXNl OworCQkJdmRtYWJ1Zi0+bmV4dC5oZWFkID0gaGVhZDsKKworCQkJaWYgKG1zZy5jbWQgPT0gVklS VElPX1ZETUFCVUZfQ01EX05FRURfVk1JRCkgeworCQkJCXN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl90 eG1zZyBhY2s7CisKKwkJCQlhY2subXNnLnJlcV9pZCA9IG1zZy5yZXFfaWQ7CisJCQkJYWNrLm1z Zy5jbWQgPSBtc2cuY21kOworCQkJCWFjay5tc2cub3BbMF0gPSB2ZG1hYnVmLT52bWlkOworCQkJ CWFjay5tc2dfcHRyID0gdnEtPmlvdlswXS5pb3ZfYmFzZTsKKwkJCQlhY2suaGVhZCA9IGhlYWQ7 CisKKwkJCQlzZW5kX3RvX3R4cSh2ZG1hYnVmLCAmYWNrKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0 ID0gcGFyc2VfbXNnKHZkbWFidWYsICZtc2csCisJCQkJCQl2cS0+aW92WzBdLmlvdl9iYXNlLAor CQkJCQkJaGVhZCk7CisJCQkJaWYgKHJldCkgeworCQkJCQlkZXZfZXJyKGRydl9pbmZvLT5kZXYs CisJCQkJCQkibXNnIHBhcnNlIGVycm9yOiAlZCIsCisJCQkJCQlyZXQpOworCQkJCQlkZXZfZXJy KGRydl9pbmZvLT5kZXYsCisJCQkJCQkiIGNtZDogJWRcbiIsIG1zZy5jbWQpOworCQkJCX0KKwkJ CX0KKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoZHJ2X2luZm8tPmRldiwgInJ4IG1zZyB3aXRoIHdy b25nIHNpemVcbiIpOworCisJCQkvKiBqdXN0IHRocm93IGJhY2sgdGhlIG1lc3NhZ2UgdG8gdGhl IGNsaWVudCB0bworCQkJICogZW1wdHkgdXNlZCBidWZmZXIKKwkJCSAqLworCQkJdmhvc3RfYWRk X3VzZWRfYW5kX3NpZ25hbCgmdmRtYWJ1Zi0+ZGV2LCB2cSwgaGVhZCwKKwkJCQkJCSAgaW5fc2l6 ZSk7CisJCX0KKwl9CisKKwl2aG9zdF9lbmFibGVfbm90aWZ5KCZ2ZG1hYnVmLT5kZXYsIHZxKTsK KwltdXRleF91bmxvY2soJnZkbWFidWYtPnZxX211dGV4KTsKK30KKwordm9pZCB2aG9zdF92ZG1h YnVmX2dldF9rdm0odW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0 IGt2bV9pbnN0YW5jZSAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IGt6YWxsb2Moc2l6ZW9mKCpp bnN0YW5jZSksIEdGUF9LRVJORUwpOworCWlmICghaW5zdGFuY2UpCisJCXJldHVybjsKKworCWlm IChhY3Rpb24gPT0gVkZJT19HUk9VUF9OT1RJRllfU0VUX0tWTSkgeworCQlpZiAoZGF0YSkgewor CQkJaW5zdGFuY2UtPmt2bSA9IGRhdGE7CisJCQlsaXN0X2FkZF90YWlsKCZpbnN0YW5jZS0+bGlu aywKKwkJCQkgICAgICAmZHJ2X2luZm8tPmt2bV9pbnN0YW5jZXMpOworCQl9CisJfQorfQorRVhQ T1JUX1NZTUJPTF9HUEwodmhvc3RfdmRtYWJ1Zl9nZXRfa3ZtKTsKKworc3RhdGljIHN0cnVjdCBr dm0gKmZpbmRfa3ZtX2luc3RhbmNlKHU2NCB2bWlkKQoreworCXN0cnVjdCBrdm1faW5zdGFuY2Ug Kmluc3RhbmNlLCAqdG1wOworCXN0cnVjdCBrdm0gKmt2bSA9IE5VTEw7CisKKwlsaXN0X2Zvcl9l YWNoX2VudHJ5X3NhZmUoaW5zdGFuY2UsIHRtcCwgJmRydl9pbmZvLT5rdm1faW5zdGFuY2VzLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluaykgeworCQlpZiAoaW5zdGFuY2Ut Pmt2bS0+dXNlcnNwYWNlX3BpZCA9PSB2bWlkKSB7CisJCQlrdm0gPSBpbnN0YW5jZS0+a3ZtOwor CisJCQlsaXN0X2RlbCgmaW5zdGFuY2UtPmxpbmspOworCQkJa2ZyZWUoaW5zdGFuY2UpOworCQkJ YnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4ga3ZtOworfQorCitzdGF0aWMgaW50IHZob3N0X3Zk bWFidWZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlz dHJ1Y3Qgdmhvc3RfdmRtYWJ1ZiAqdmRtYWJ1ZjsKKwlzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICoq dnFzOworCWludCByZXQgPSAwOworCisJaWYgKCFkcnZfaW5mbykgeworCQlwcl9lcnIoInZob3N0 LXZkbWFidWY6IGNhbid0IG9wZW4gbWlzYyBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsK Kwl9CisKKwl2cXMgPSBrY2FsbG9jKDEsIHNpemVvZigqdnFzKSwgR0ZQX0tFUk5FTCk7CisJaWYg KCF2cXMpCisJCXJldHVybiAtRU5PTUVNOworCisJdmRtYWJ1ZiA9IGt2emFsbG9jKHNpemVvZigq dmRtYWJ1ZiksIEdGUF9LRVJORUwgfAorCQkJX19HRlBfUkVUUllfTUFZRkFJTCk7CisJaWYgKCF2 ZG1hYnVmKSB7CisJCWtmcmVlKHZxcyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXZkbWFi dWYtPmV2cSA9IGtjYWxsb2MoMSwgc2l6ZW9mKCp2ZG1hYnVmLT5ldnEpLCBHRlBfS0VSTkVMKTsK KwlpZiAoIXZkbWFidWYtPmV2cSkgeworCQlrZnJlZSh2ZG1hYnVmKTsKKwkJa2ZyZWUodnFzKTsK KwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbXV0ZXhfbG9jaygmZHJ2X2luZm8tPmdfbXV0ZXgp OworCisJdnFzWzBdID0gJnZkbWFidWYtPnZxOworCXZkbWFidWYtPnZxLmhhbmRsZV9raWNrID0g cnhfd29yazsKKworCW11dGV4X2luaXQoJnZkbWFidWYtPnZxX211dGV4KTsKKwltdXRleF9pbml0 KCZ2ZG1hYnVmLT50eF9tdXRleCk7CisJdmhvc3RfZGV2X2luaXQoJnZkbWFidWYtPmRldiwgdnFz LCAxLCBVSU9fTUFYSU9WLCAwLCAwLCB0cnVlLCBOVUxMKTsKKworCXZob3N0X3dvcmtfaW5pdCgm dmRtYWJ1Zi0+dHhfd29yaywgdHhfd29yayk7CisJdmRtYWJ1Zi0+dm1pZCA9IHRhc2tfcGlkX25y KGN1cnJlbnQpOworCXZkbWFidWYtPmt2bSA9IGZpbmRfa3ZtX2luc3RhbmNlKHZkbWFidWYtPnZt aWQpOworCXZob3N0X3ZkbWFidWZfYWRkKHZkbWFidWYpOworCisJbXV0ZXhfaW5pdCgmdmRtYWJ1 Zi0+ZXZxLT5lX3JlYWRsb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmdmRtYWJ1Zi0+ZXZxLT5lX2xv Y2spOworCisJLyogSW5pdGlhbGl6ZSBldmVudCBxdWV1ZSAqLworCUlOSVRfTElTVF9IRUFEKCZ2 ZG1hYnVmLT5ldnEtPmVfbGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdmRtYWJ1Zi0+ZXZx LT5lX3dhaXQpOworCisJLyogcmVzZXR0aW5nIG51bWJlciBvZiBwZW5kaW5nIGV2ZW50cyAqLwor CXZkbWFidWYtPmV2cS0+cGVuZGluZyA9IDA7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gdmRtYWJ1 ZjsKKworCW11dGV4X3VubG9jaygmZHJ2X2luZm8tPmdfbXV0ZXgpOworCisJcmV0dXJuIHJldDsK K30KKworc3RhdGljIGludCB2aG9zdF92ZG1hYnVmX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9k ZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYg PSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZpcnRpb192ZG1hYnVmX2V2ZW50ICplLCAq ZXQ7CisKKwlpZiAoIXZob3N0X3ZkbWFidWZfZGVsKHZkbWFidWYpKQorCQlyZXR1cm4gLUVJTlZB TDsKKworCW11dGV4X2xvY2soJmRydl9pbmZvLT5nX211dGV4KTsKKworCWxpc3RfZm9yX2VhY2hf ZW50cnlfc2FmZShlLCBldCwgJnZkbWFidWYtPmV2cS0+ZV9saXN0LAorCQkJCSBsaW5rKSB7CisJ CWxpc3RfZGVsKCZlLT5saW5rKTsKKwkJa2ZyZWUoZSk7CisJCXZkbWFidWYtPmV2cS0+cGVuZGlu Zy0tOworCX0KKworCXZob3N0X3BvbGxfc3RvcCgmdmRtYWJ1Zi0+dnEucG9sbCk7CisJdmhvc3Rf cG9sbF9mbHVzaCgmdmRtYWJ1Zi0+dnEucG9sbCk7CisJdmhvc3RfZGV2X2NsZWFudXAoJnZkbWFi dWYtPmRldik7CisKKwlrZnJlZSh2ZG1hYnVmLT5kZXYudnFzKTsKKwlrdmZyZWUodmRtYWJ1Zik7 CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCW11dGV4X3VubG9jaygmZHJ2X2luZm8t PmdfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmhvc3Rf dmRtYWJ1Zl9ldmVudF9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCSAgICAJICAgICBzdHJ1 Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHZob3N0X3ZkbWFidWYgKnZk bWFidWYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlwb2xsX3dhaXQoZmlscCwgJnZkbWFidWYt PmV2cS0+ZV93YWl0LCB3YWl0KTsKKworCWlmICghbGlzdF9lbXB0eSgmdmRtYWJ1Zi0+ZXZxLT5l X2xpc3QpKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgc3NpemVfdCB2aG9zdF92ZG1hYnVmX2V2ZW50X3JlYWQoc3RydWN0IGZpbGUgKmZp bHAsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICAgCQlzaXplX3QgY250LCBsb2ZmX3QgKm9m c3QpCit7CisJc3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYgPSBmaWxwLT5wcml2YXRlX2Rh dGE7CisJaW50IHJldDsKKworCWlmICh0YXNrX3BpZF9ucihjdXJyZW50KSAhPSB2ZG1hYnVmLT52 bWlkKSB7CisJCWRldl9lcnIoZHJ2X2luZm8tPmRldiwgImN1cnJlbnQgcHJvY2VzcyBjYW5ub3Qg cmVhZCBldmVudHNcbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCS8qIG1ha2Ugc3VyZSB1 c2VyIGJ1ZmZlciBjYW4gYmUgd3JpdHRlbiAqLworCWlmICghYWNjZXNzX29rKGJ1Ziwgc2l6ZW9m KCpidWYpKSkgeworCQlkZXZfZXJyKGRydl9pbmZvLT5kZXYsICJ1c2VyIGJ1ZmZlciBjYW4ndCBi ZSB3cml0dGVuLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IG11dGV4X2xv Y2tfaW50ZXJydXB0aWJsZSgmdmRtYWJ1Zi0+ZXZxLT5lX3JlYWRsb2NrKTsKKwlpZiAocmV0KQor CQlyZXR1cm4gcmV0OworCisJZm9yICg7OykgeworCQlzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfZXZl bnQgKmUgPSBOVUxMOworCisJCXNwaW5fbG9ja19pcnEoJnZkbWFidWYtPmV2cS0+ZV9sb2NrKTsK KwkJaWYgKCFsaXN0X2VtcHR5KCZ2ZG1hYnVmLT5ldnEtPmVfbGlzdCkpIHsKKwkJCWUgPSBsaXN0 X2ZpcnN0X2VudHJ5KCZ2ZG1hYnVmLT5ldnEtPmVfbGlzdCwKKwkJCQkJICAgICBzdHJ1Y3Qgdmly dGlvX3ZkbWFidWZfZXZlbnQsIGxpbmspOworCQkJbGlzdF9kZWwoJmUtPmxpbmspOworCQl9CisJ CXNwaW5fdW5sb2NrX2lycSgmdmRtYWJ1Zi0+ZXZxLT5lX2xvY2spOworCisJCWlmICghZSkgewor CQkJaWYgKHJldCkKKwkJCQlicmVhazsKKworCQkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJM T0NLKSB7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbXV0ZXhf dW5sb2NrKCZ2ZG1hYnVmLT5ldnEtPmVfcmVhZGxvY2spOworCQkJcmV0ID0gd2FpdF9ldmVudF9p bnRlcnJ1cHRpYmxlKHZkbWFidWYtPmV2cS0+ZV93YWl0LAorCQkJCQkhbGlzdF9lbXB0eSgmdmRt YWJ1Zi0+ZXZxLT5lX2xpc3QpKTsKKworCQkJaWYgKHJldCA9PSAwKQorCQkJCXJldCA9IG11dGV4 X2xvY2tfaW50ZXJydXB0aWJsZSgKKwkJCQkJCSZ2ZG1hYnVmLT5ldnEtPmVfcmVhZGxvY2spOwor CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBp bnQgbGVuID0gKHNpemVvZihlLT5lX2RhdGEuaGRyKSArCisJCQkJCSAgICBlLT5lX2RhdGEuaGRy LnNpemUpOworCisJCQlpZiAobGVuID4gY250IC0gcmV0KSB7CitwdXRfYmFja19ldmVudDoKKwkJ CQlzcGluX2xvY2tfaXJxKCZ2ZG1hYnVmLT5ldnEtPmVfbG9jayk7CisJCQkJbGlzdF9hZGQoJmUt PmxpbmssICZ2ZG1hYnVmLT5ldnEtPmVfbGlzdCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZ2ZG1h YnVmLT5ldnEtPmVfbG9jayk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChjb3B5X3RvX3Vz ZXIoYnVmICsgcmV0LCAmZS0+ZV9kYXRhLmhkciwKKwkJCQkJIHNpemVvZihlLT5lX2RhdGEuaGRy KSkpIHsKKwkJCQlpZiAocmV0ID09IDApCisJCQkJCXJldCA9IC1FRkFVTFQ7CisKKwkJCQlnb3Rv IHB1dF9iYWNrX2V2ZW50OworCQkJfQorCisJCQlyZXQgKz0gc2l6ZW9mKGUtPmVfZGF0YS5oZHIp OworCisJCQlpZiAoY29weV90b191c2VyKGJ1ZiArIHJldCwgZS0+ZV9kYXRhLmRhdGEsCisJCQkJ CSBlLT5lX2RhdGEuaGRyLnNpemUpKSB7CisKKwkJCQlzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfZV9o ZHIgZHVtbXlfaGRyID0gezB9OworCisJCQkJcmV0IC09IHNpemVvZihlLT5lX2RhdGEuaGRyKTsK KworCQkJCS8qIG51bGxpZnlpbmcgaGRyIG9mIHRoZSBldmVudCBpbiB1c2VyIGJ1ZmZlciAqLwor CQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmICsgcmV0LCAmZHVtbXlfaGRyLAorCQkJCQkJIHNpemVv ZihkdW1teV9oZHIpKSkKKwkJCQkJZGV2X2VycihkcnZfaW5mby0+ZGV2LAorCQkJCQkgICAiZmFp bCB0byBudWxsaWZ5IGludmFsaWQgaGRyXG4iKTsKKworCQkJCXJldCA9IC1FRkFVTFQ7CisKKwkJ CQlnb3RvIHB1dF9iYWNrX2V2ZW50OworCQkJfQorCisJCQlyZXQgKz0gZS0+ZV9kYXRhLmhkci5z aXplOworCisJCQlzcGluX2xvY2tfaXJxKCZ2ZG1hYnVmLT5ldnEtPmVfbG9jayk7CisJCQl2ZG1h YnVmLT5ldnEtPnBlbmRpbmctLTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmdmRtYWJ1Zi0+ZXZxLT5l X2xvY2spOworCQkJa2ZyZWUoZSk7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJnZkbWFidWYt PmV2cS0+ZV9yZWFkbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiB2aG9zdCBpbnRlcmZh Y2Ugb3duZXIgcmVzZXQgKi8KK3N0YXRpYyBsb25nIHZob3N0X3ZkbWFidWZfcmVzZXRfb3duZXIo c3RydWN0IHZob3N0X3ZkbWFidWYgKnZkbWFidWYpCit7CisJbG9uZyByZXQ7CisJc3RydWN0IHZo b3N0X2lvdGxiICppb3RsYjsKKworCW11dGV4X2xvY2soJnZkbWFidWYtPmRldi5tdXRleCk7CisJ cmV0ID0gdmhvc3RfZGV2X2NoZWNrX293bmVyKCZ2ZG1hYnVmLT5kZXYpOworCWlmIChyZXQpCisJ CWdvdG8gZXJyOworCisJaW90bGIgPSB2aG9zdF9kZXZfcmVzZXRfb3duZXJfcHJlcGFyZSgpOwor CWlmICghaW90bGIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJdmhv c3RfcG9sbF9zdG9wKCZ2ZG1hYnVmLT52cS5wb2xsKTsKKwl2aG9zdF9wb2xsX2ZsdXNoKCZ2ZG1h YnVmLT52cS5wb2xsKTsKKworCXZob3N0X2Rldl9yZXNldF9vd25lcigmdmRtYWJ1Zi0+ZGV2LCBp b3RsYik7CitlcnI6CisJbXV0ZXhfdW5sb2NrKCZ2ZG1hYnVmLT5kZXYubXV0ZXgpOworCXJldHVy biByZXQ7Cit9CisKKy8qIHdyYXBwZXIgaW9jdGwgZm9yIHZob3N0IGludGVyZmFjZSBjb250cm9s ICovCitzdGF0aWMgaW50IHZob3N0X2NvcmVfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2ln bmVkIGludCBjbWQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlzdHJ1Y3Qgdmhv c3RfdmRtYWJ1ZiAqdmRtYWJ1ZiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJ c3dpdGNoIChjbWQpIHsKKwljYXNlIFZIT1NUX0dFVF9GRUFUVVJFUzoKKwkJLyogVE9ETzogZnV0 dXJlIGltcGxlbWVudGF0aW9uICovCisJCXJldHVybiAwOworCWNhc2UgVkhPU1RfU0VUX0ZFQVRV UkVTOgorCQkvKiBUT0RPOiBmdXR1cmUgaW1wbGVtZW50YXRpb24gKi8KKwkJcmV0dXJuIDA7CisJ Y2FzZSBWSE9TVF9SRVNFVF9PV05FUjoKKwkJcmV0dXJuIHZob3N0X3ZkbWFidWZfcmVzZXRfb3du ZXIodmRtYWJ1Zik7CisKKwlkZWZhdWx0OgorCQlyZXQgPSB2aG9zdF9kZXZfaW9jdGwoJnZkbWFi dWYtPmRldiwgY21kLCAodm9pZCBfX3VzZXIgKilwYXJhbSk7CisJCWlmIChyZXQgPT0gLUVOT0lP Q1RMQ01EKSB7CisJCQlyZXQgPSB2aG9zdF92cmluZ19pb2N0bCgmdmRtYWJ1Zi0+ZGV2LCBjbWQs CisJCQkJCQkodm9pZCBfX3VzZXIgKilwYXJhbSk7CisJCX0gZWxzZSB7CisJCQl2aG9zdF9wb2xs X2ZsdXNoKCZ2ZG1hYnVmLT52cS5wb2xsKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisK Ky8qCisgKiBpb2N0bCAtIGltcG9ydGluZyB2ZG1hYnVmIGZyb20gZ3Vlc3QgT1MKKyAqCisgKiB1 c2VyIHBhcmFtZXRlcnM6CisgKgorICoJdmlydGlvX3ZkbWFidWZfYnVmX2lkX3QgYnVmX2lkIC0g dmRtYWJ1ZiBJRCBvZiBpbXBvcnRlZCBidWZmZXIKKyAqCWludCBmbGFncyAtIGZsYWdzCisgKglp bnQgZmQgLSBmaWxlIGhhbmRsZSBvZgl0aGUgaW1wb3J0ZWQgYnVmZmVyCisgKgorICovCitzdGF0 aWMgaW50IGltcG9ydF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGF0YSkKK3sKKwlz dHJ1Y3Qgdmhvc3RfdmRtYWJ1ZiAqdmRtYWJ1ZiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1 Y3QgdmlydGlvX3ZkbWFidWZfaW1wb3J0ICphdHRyID0gZGF0YTsKKwlzdHJ1Y3QgdmlydGlvX3Zk bWFidWZfYnVmICppbXA7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZ2ZG1hYnVmLT5k ZXYubXV0ZXgpOworCisJLyogbG9vayBmb3IgZG1hYnVmIGZvciB0aGUgaWQgKi8KKwlpbXAgPSB2 aXJ0aW9fdmRtYWJ1Zl9maW5kX2J1ZihkcnZfaW5mbywgJmF0dHItPmJ1Zl9pZCk7CisJaWYgKCFp bXAgfHwgIWltcC0+dmFsaWQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ2ZG1hYnVmLT5kZXYubXV0ZXgp OworCQlkZXZfZXJyKGRydl9pbmZvLT5kZXYsCisJCQkibm8gdmFsaWQgYnVmIGZvdW5kIHdpdGgg aWQgPSAlbGx1XG4iLCBhdHRyLT5idWZfaWQuaWQpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisK KwkvKiBvbmx5IGlmIG1hcHBlZCBwYWdlcyBhcmUgbm90IHByZXNlbnQgKi8KKwlpZiAoIWltcC0+ cGFnZXNfaW5mby0+cGFnZXMpIHsKKwkJcmV0ID0gdmhvc3RfdmRtYWJ1Zl9tYXBfcGFnZXModmRt YWJ1Zi0+dm1pZCwgaW1wLT5wYWdlc19pbmZvKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9l cnIoZHJ2X2luZm8tPmRldiwKKwkJCQkiZmFpbGVkIHRvIG1hcCBndWVzdCBwYWdlc1xuIik7CisJ CQlnb3RvIGZhaWxfbWFwOworCQl9CisJfQorCisJYXR0ci0+ZmQgPSB2aG9zdF92ZG1hYnVmX2V4 cF9mZChpbXAsIGF0dHItPmZsYWdzKTsKKwlpZiAoYXR0ci0+ZmQgPCAwKSB7CisJCWRldl9lcnIo ZHJ2X2luZm8tPmRldiwgImZhaWxlZCB0byBnZXQgZmlsZSBkZXNjcmlwdG9yXG4iKTsKKwkJZ290 byBmYWlsX2ltcG9ydDsKKwl9CisKKwlpbXAtPmltcG9ydGVkID0gdHJ1ZTsKKworCW11dGV4X3Vu bG9jaygmdmRtYWJ1Zi0+ZGV2Lm11dGV4KTsKKwlnb3RvIHN1Y2Nlc3M7CisKK2ZhaWxfaW1wb3J0 OgorCS8qIG5vdCBpbXBvcnRlZCB5ZXQ/ICovCisJaWYgKCFpbXAtPmltcG9ydGVkKSB7CisJCXZo b3N0X3ZkbWFidWZfdW5tYXBfcGFnZXModmRtYWJ1Zi0+dm1pZCwgaW1wLT5wYWdlc19pbmZvKTsK KwkJaWYgKGltcC0+ZG1hX2J1ZikKKwkJCWtmcmVlKGltcC0+ZG1hX2J1Zik7CisKKwkJaWYgKGlt cC0+c2d0KSB7CisJCQlzZ19mcmVlX3RhYmxlKGltcC0+c2d0KTsKKwkJCWtmcmVlKGltcC0+c2d0 KTsKKwkJCWltcC0+c2d0ID0gTlVMTDsKKwkJfQorCX0KKworZmFpbF9tYXA6CisJLyogQ2hlY2sg aWYgYnVmZmVyIGlzIHN0aWxsIHZhbGlkIGFuZCBpZiBub3QgcmVtb3ZlIGl0CisJICogZnJvbSBp bXBvcnRlZCBsaXN0LgorCSAqLworCWlmICghaW1wLT52YWxpZCAmJiAhaW1wLT5pbXBvcnRlZCkg eworCQl2aXJ0aW9fdmRtYWJ1Zl9kZWxfYnVmKGRydl9pbmZvLCAmaW1wLT5idWZfaWQpOworCQlr ZnJlZShpbXAtPnByaXYpOworCQlrZnJlZShpbXAtPnBhZ2VzX2luZm8pOworCQlrZnJlZShpbXAp OworCX0KKworCXJldCA9ICBhdHRyLT5mZDsKKwltdXRleF91bmxvY2soJnZkbWFidWYtPmRldi5t dXRleCk7CisKK3N1Y2Nlc3M6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZWxlYXNl X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB2aG9zdF92 ZG1hYnVmICp2ZG1hYnVmID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2aXJ0aW9fdmRt YWJ1Zl9pbXBvcnQgKmF0dHIgPSBkYXRhOworCXN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9idWYgKmlt cDsKKwl2aXJ0aW9fdmRtYWJ1Zl9idWZfaWRfdCBidWZfaWQgPSBhdHRyLT5idWZfaWQ7CisJaW50 ICpvcDsKKwlpbnQgcmV0ID0gMDsKKworCW9wID0ga2NhbGxvYygxLCBzaXplb2YoaW50KSAqIDY1 LCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWltcCA9IHZp cnRpb192ZG1hYnVmX2ZpbmRfYnVmKGRydl9pbmZvLCAmYnVmX2lkKTsKKwlpZiAoIWltcCkKKwkJ cmV0dXJuIC1FSU5WQUw7CisKKwlpbXAtPmltcG9ydGVkID0gZmFsc2U7CisKKwltZW1jcHkob3As ICZpbXAtPmJ1Zl9pZCwgc2l6ZW9mKGltcC0+YnVmX2lkKSk7CisKKwlyZXQgPSBzZW5kX21zZ190 b19ndWVzdCh2ZG1hYnVmLT52bWlkLCBWSVJUSU9fVkRNQUJVRl9DTURfRE1BQlVGX1JFTCwKKwkJ CQlvcCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkcnZfaW5mby0+ZGV2LCAiZmFpbCB0 byBzZW5kIHJlbGVhc2UgY21kXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsK K30KKworLyoKKyAqIGlvY3RsIC0gcXVlcnlpbmcgdmFyaW91cyBpbmZvcm1hdGlvbiBvZiB2ZG1h YnVmCisgKgorICogdXNlciBwYXJhbWV0ZXJzOgorICoKKyAqCXZpcnRpb192ZG1hYnVmX2J1Zl9p ZF90IGJ1Zl9pZCAtIHZkbWFidWYgSUQgb2YgaW1wb3J0ZWQgYnVmZmVyCisgKgl1bnNpZ25lZCBs b25nIGluZm8gLSByZXR1cm5lZCBxdWVyeWluZyByZXN1bHQKKyAqCisgKi8KK3N0YXRpYyBpbnQg cXVlcnlfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHZp cnRpb192ZG1hYnVmX3F1ZXJ5ICphdHRyID0gZGF0YTsKKwlzdHJ1Y3QgdmlydGlvX3ZkbWFidWZf YnVmICppbXA7CisJdmlydGlvX3ZkbWFidWZfYnVmX2lkX3QgYnVmX2lkID0gYXR0ci0+YnVmX2lk OworCisJLyogcXVlcnkgZm9yIGltcG9ydGVkIGRtYWJ1ZiAqLworCWltcCA9IHZpcnRpb192ZG1h YnVmX2ZpbmRfYnVmKGRydl9pbmZvLCAmYnVmX2lkKTsKKwlpZiAoIWltcCkKKwkJcmV0dXJuIC1F SU5WQUw7CisKKwlzd2l0Y2ggKGF0dHItPml0ZW0pIHsKKwkvKiBzaXplIG9mIGRtYWJ1ZiBpbiBi eXRlICovCisJY2FzZSBWSVJUSU9fVkRNQUJVRl9RVUVSWV9TSVpFOgorCQlpZiAoaW1wLT5kbWFf YnVmKSB7CisJCQkvKiBpZiBsb2NhbCBkbWFfYnVmIGlzIGNyZWF0ZWQgKGlmIGl0J3MKKwkJCSAq IGV2ZXIgbWFwcGVkKSwgcmV0cmlldmUgaXQgZGlyZWN0bHkKKwkJCSAqIGZyb20gc3RydWN0IGRt YV9idWYgKgorCQkJICovCisJCQlhdHRyLT5pbmZvID0gaW1wLT5kbWFfYnVmLT5zaXplOworCQl9 IGVsc2UgeworCQkJLyogY2FsY3VhdGUgaXQgZnJvbSBnaXZlbiBuZW50cywgZmlyc3Rfb2ZzdAor CQkJICogYW5kIGxhc3RfbGVuCisJCQkgKi8KKwkJCWF0dHItPmluZm8gPSAoKGltcC0+cGFnZXNf aW5mby0+bmVudHMpKlBBR0VfU0laRSAtCisJCQkJICAgICAoaW1wLT5wYWdlc19pbmZvLT5maXJz dF9vZnN0KSAtIFBBR0VfU0laRSArCisJCQkJICAgICAoaW1wLT5wYWdlc19pbmZvLT5sYXN0X2xl bikpOworCQl9CisJCWJyZWFrOworCisJLyogd2hldGhlciB0aGUgYnVmZmVyIGlzIHVzZWQgb3Ig bm90ICovCisJY2FzZSBWSVJUSU9fVkRNQUJVRl9RVUVSWV9CVVNZOgorCQkvKiBjaGVja3MgaWYg aXQncyB1c2VkIGJ5IGltcG9ydGVyICovCisJCWF0dHItPmluZm8gPSBpbXAtPmltcG9ydGVkOwor CQlicmVhazsKKworCS8qIHNpemUgb2YgcHJpdmF0ZSBpbmZvIGF0dGFjaGVkIHRvIGJ1ZmZlciAq LworCWNhc2UgVklSVElPX1ZETUFCVUZfUVVFUllfUFJJVl9JTkZPX1NJWkU6CisJCWF0dHItPmlu Zm8gPSBpbXAtPnN6X3ByaXY7CisJCWJyZWFrOworCisJLyogY29weSBwcml2YXRlIGluZm8gYXR0 YWNoZWQgdG8gYnVmZmVyICovCisJY2FzZSBWSVJUSU9fVkRNQUJVRl9RVUVSWV9QUklWX0lORk86 CisJCWlmIChpbXAtPnN6X3ByaXYgPiAwKSB7CisJCQlpbnQgbjsKKworCQkJbiA9IGNvcHlfdG9f dXNlcigodm9pZCBfX3VzZXIgKilhdHRyLT5pbmZvLAorCQkJCQlpbXAtPnByaXYsCisJCQkJCWlt cC0+c3pfcHJpdik7CisJCQlpZiAobiAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJ CWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmlydGlvX3ZkbWFidWZfaW9jdGxfZGVzYyB2aG9z dF92ZG1hYnVmX2lvY3Rsc1tdID0geworCVZJUlRJT19WRE1BQlVGX0lPQ1RMX0RFRihWSVJUSU9f VkRNQUJVRl9JT0NUTF9JTVBPUlQsIGltcG9ydF9pb2N0bCwgMCksCisJVklSVElPX1ZETUFCVUZf SU9DVExfREVGKFZJUlRJT19WRE1BQlVGX0lPQ1RMX1JFTEVBU0UsIHJlbGVhc2VfaW9jdGwsIDAp LAorCVZJUlRJT19WRE1BQlVGX0lPQ1RMX0RFRihWSVJUSU9fVkRNQUJVRl9JT0NUTF9RVUVSWSwg cXVlcnlfaW9jdGwsIDApLAorfTsKKworc3RhdGljIGxvbmcgdmhvc3RfdmRtYWJ1Zl9pb2N0bChz dHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIHBh cmFtKQoreworCWNvbnN0IHN0cnVjdCB2aXJ0aW9fdmRtYWJ1Zl9pb2N0bF9kZXNjICppb2N0bDsK Kwl2aXJ0aW9fdmRtYWJ1Zl9pb2N0bF90IGZ1bmM7CisJdW5zaWduZWQgaW50IG5yOworCWludCBy ZXQ7CisJY2hhciAqa2RhdGE7CisKKwkvKiBjaGVjayBpZiBjbWQgaXMgdmhvc3QncyAqLworCWlm IChfSU9DX1RZUEUoY21kKSA9PSBWSE9TVF9WSVJUSU8pIHsKKwkJcmV0ID0gdmhvc3RfY29yZV9p b2N0bChmaWxwLCBjbWQsIHBhcmFtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwluciA9IF9JT0Nf TlIoY21kKTsKKworCWlmIChuciA+PSBBUlJBWV9TSVpFKHZob3N0X3ZkbWFidWZfaW9jdGxzKSkg eworCQlkZXZfZXJyKGRydl9pbmZvLT5kZXYsICJpbnZhbGlkIGlvY3RsXG4iKTsKKwkJcmV0dXJu IC1FSU5WQUw7CisJfQorCisJaW9jdGwgPSAmdmhvc3RfdmRtYWJ1Zl9pb2N0bHNbbnJdOworCisJ ZnVuYyA9IGlvY3RsLT5mdW5jOworCisJaWYgKHVubGlrZWx5KCFmdW5jKSkgeworCQlkZXZfZXJy KGRydl9pbmZvLT5kZXYsICJubyBmdW5jdGlvblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0K KworCWtkYXRhID0ga21hbGxvYyhfSU9DX1NJWkUoY21kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFr ZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoa2RhdGEsICh2 b2lkIF9fdXNlciAqKXBhcmFtLAorCQkJICAgX0lPQ19TSVpFKGNtZCkpICE9IDApIHsKKwkJZGV2 X2VycihkcnZfaW5mby0+ZGV2LAorCQkJImZhaWxlZCB0byBjb3B5IGFyZ3MgZnJvbSB1c2Vyc3Bh Y2VcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGlvY3RsX2Vycm9yOworCX0KKworCXJl dCA9IGZ1bmMoZmlscCwga2RhdGEpOworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIg KilwYXJhbSwga2RhdGEsCisJCQkgX0lPQ19TSVpFKGNtZCkpICE9IDApIHsKKwkJZGV2X2Vycihk cnZfaW5mby0+ZGV2LAorCQkJImZhaWxlZCB0byBjb3B5IGFyZ3MgYmFjayB0byB1c2Vyc3BhY2Vc biIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGlvY3RsX2Vycm9yOworCX0KKworaW9jdGxf ZXJyb3I6CisJa2ZyZWUoa2RhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBz dHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZob3N0X3ZkbWFidWZfZm9wcyA9IHsKKwkub3duZXIgPSBU SElTX01PRFVMRSwKKwkub3BlbiA9IHZob3N0X3ZkbWFidWZfb3BlbiwKKwkucmVsZWFzZSA9IHZo b3N0X3ZkbWFidWZfcmVsZWFzZSwKKwkucmVhZCA9IHZob3N0X3ZkbWFidWZfZXZlbnRfcmVhZCwK KwkucG9sbCA9IHZob3N0X3ZkbWFidWZfZXZlbnRfcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwgPSB2 aG9zdF92ZG1hYnVmX2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHZob3N0 X3ZkbWFidWZfbWlzY2RldiA9IHsKKwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5h bWUgPSAidmhvc3QtdmRtYWJ1ZiIsCisJLmZvcHMgPSAmdmhvc3RfdmRtYWJ1Zl9mb3BzLAorfTsK Kworc3RhdGljIGludCBfX2luaXQgdmhvc3RfdmRtYWJ1Zl9pbml0KHZvaWQpCit7CisJaW50IHJl dCA9IDA7CisKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ2aG9zdF92ZG1hYnVmX21pc2NkZXYpOwor CWlmIChyZXQpIHsKKwkJcHJfZXJyKCJ2aG9zdC12ZG1hYnVmOiBkcml2ZXIgY2FuJ3QgYmUgcmVn aXN0ZXJlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZG1hX2NvZXJjZV9tYXNrX2FuZF9j b2hlcmVudCh2aG9zdF92ZG1hYnVmX21pc2NkZXYudGhpc19kZXZpY2UsCisJCQkJICAgICBETUFf QklUX01BU0soNjQpKTsKKworCWRydl9pbmZvID0ga2NhbGxvYygxLCBzaXplb2YoKmRydl9pbmZv KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcnZfaW5mbykgeworCQltaXNjX2RlcmVnaXN0ZXIoJnZo b3N0X3ZkbWFidWZfbWlzY2Rldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRydl9pbmZv LT5kZXYgPSB2aG9zdF92ZG1hYnVmX21pc2NkZXYudGhpc19kZXZpY2U7CisKKwltdXRleF9pbml0 KCZkcnZfaW5mby0+Z19tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmRydl9pbmZvLT5oZWFkX3Zk bWFidWZfbGlzdCk7CisJaGFzaF9pbml0KGRydl9pbmZvLT5idWZfbGlzdCk7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZob3N0X3ZkbWFidWZfZGVpbml0KHZvaWQpCit7 CisJbWlzY19kZXJlZ2lzdGVyKCZ2aG9zdF92ZG1hYnVmX21pc2NkZXYpOworCXZob3N0X3ZkbWFi dWZfZGVsX2FsbCgpOworCisJa2ZyZWUoZHJ2X2luZm8pOworCWRydl9pbmZvID0gTlVMTDsKK30K KworbW9kdWxlX2luaXQodmhvc3RfdmRtYWJ1Zl9pbml0KTsKK21vZHVsZV9leGl0KHZob3N0X3Zk bWFidWZfZGVpbml0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJWaG9zdCBWZG1hYnVmIERyaXZl ciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKLS0gCjIu MjYuMgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KVmly dHVhbGl6YXRpb24gbWFpbGluZyBsaXN0ClZpcnR1YWxpemF0aW9uQGxpc3RzLmxpbnV4LWZvdW5k YXRpb24ub3JnCmh0dHBzOi8vbGlzdHMubGludXhmb3VuZGF0aW9uLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL3ZpcnR1YWxpemF0aW9u