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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id EF41FC79FA1 for ; Tue, 8 Sep 2026 02:04:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=KDRRY98Tcv6+PFozvrW+OP2UMGT5dmJlMpQPAI2pfw0=; b=uJ4ge9sdS3c4ym oJwUqc4bTbiIOAVR+6rzmajmQwczy1R1rG40MzDE4pE4pdVUTuQwkvV/BTqg8xFb97e56ONbxAzsM zm736CzHuwJtUbT1j/vB5fXT2L0kgW7KLBybKfVVJLb9f1D2n8UbkoAi5aQlTQn0S31kqPnN3HZSg tG/aUo0gDjhYc6vhwKJIvuaW4JtFhz2GodUb0i7r+0eq749qIuMrzJWyMG9Ahb01wQL6+ElH7LkpQ Q35NXXukZrXEVDsz2YNCGkgMuNz8gdY3/M06RAb8mzLAp8TmCT510zW2HnpG4tm+M6GAAQQBjgPkx nFj86rG83QiDkyY693iw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1x3lBk-00000007ulh-07RD; Tue, 08 Sep 2026 02:03:56 +0000 Received: from mail-pj1-x102e.google.com ([2607:f8b0:4864:20::102e]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1x3lBh-00000007uks-1XYJ for linux-riscv@lists.infradead.org; Tue, 08 Sep 2026 02:03:55 +0000 Received: by mail-pj1-x102e.google.com with SMTP id 98e67ed59e1d1-395cf2535acso4148275a91.1 for ; Mon, 07 Sep 2026 19:03:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1788833032; x=1789437832; darn=lists.infradead.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=4RC30WVkLLWYCjQiap4Av0KDiZuNXH0eLkJ0+mv6m/Y=; b=TZynBF+TWX/S1fTHK0p49FX00vsaAc15c2F9xWFkW0THwtMRPWQS9uGI8M6jQHJJCG Whxzwsxb3n/pXQJwfT9PeZcgy2tOaT86o7+vW8xEzMh+7DKZ/T0V1JmsZjZD3AIR+lFW 42Hv6qJyGzhtF9GUZWjyAGmhYSzyRALHoSMH0KXkPZVG7Qjkq398DbTBBgNiWoPPdODq y4jj5YCl2ppeDS7Ov14RgLIfCuD30Tqirknmwbab9f7P+/PGiZ+QAOxGEq0c2pzFZI/+ phlYy30VqOWAvhXJvFOTwM/KbcmPR1oVUGeN8Cd8pf0WUIn1jqRRKjJucCN5fl7+GBoK eJHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788833032; x=1789437832; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=4RC30WVkLLWYCjQiap4Av0KDiZuNXH0eLkJ0+mv6m/Y=; b=fNKckun7sq7SoqwIYj+xCJ4xNiS2El7IbsAxHBQOSheQR8JYbXsHcRkPOGbg0c+NOx Dq9JglovhLrzYjyCDTQtEgoSmLHMncvuf1bSnqEp6nczDSXlzEmh4ylZlzmkcit5Cf8y idrNr31X6aw2JOt4VL6lTTbAJaiF1u2SvlnfERddqhYqqf6BtCxjLSKpGkRLP72Mxg+C gOn7+tJ5ASCbvuIhwKHAQ2n1TsJv5ih1XXq5wTw8Ntb00aXMkxXE9s9U8LCN4J62zrGK WmHbJgWi462eUNdCC/x97hWctK163MKWSLw1cRnHAWxm2Xq2L/l184YwSU48FKzurnQV gDNQ== X-Forwarded-Encrypted: i=1; AKwUvBwRHtQnZp312oIJ4DCeeBC8tH1f1qniqK44y3ueVyjrbYGFauJdh0A3mI+1bdMglyE2VbBYAoi4PQUf4Q==@lists.infradead.org X-Gm-Message-State: AFuF++lEKnpAO5eVX5zEHfUA3oJbo11UTONEND7v7jerfQzpjmbrTC4f XcN5nBHr47bLGP+3z3pn2BZd8ackeXBap+MV9mNcmXY+K4Ct+VZnJJ/SJaOe8J8Eypo= X-Gm-Gg: AYBFou3Aq0miyfEpL7DqoFouw0HswbTHo1aEjZJT5DAbAupNqOzgKiLhzZ8RTQhQ2Zm UbDH0rhAaL3EMrGMOIU79kS5qET1IDq1Yo4efQqPK2tygHCYkizii/YNkCunA8o7TXINwhJt0cn xNdoQJYmWPEq/nPk8jdGjyIZjDxBBqYONsdzDk5ugQd/li2vPGv/dkieqP82fKMdCnF1xoJieyk Ixogt5JcK5km1kSKOsEOvQEegu0JTNKUgmXnWejnJB0w/SC2VPfyr0Z/xbeRacwberlum42I4Ba dDL0juxZX4Van99tfgsRSLjG6Obm14OQDGbYC2yVKqgRdSpxPhYhYrCtjZC7hkierCFddpAzNsn dcethp/qPfmWSKcPVq9TCISZp3SJD2RVq6+ZP/5okVZhbK6ajXAM6Io+tVyMJlqrDpjfpzooY/V tFEmwg6HQy0AdHRTSyGzHZoGwNFXirjjvnX9io2HtMzd2EuxGxj7wZNt6Yc/pGz+bV+ZRDzO3U X-Received: by 2002:a17:90a:ec84:b0:36b:b903:994 with SMTP id 98e67ed59e1d1-39b07f44dbdmr36625558a91.4.1788833032068; Mon, 07 Sep 2026 19:03:52 -0700 (PDT) Received: from sw04.internal.sifive.com ([4.53.31.132]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-1434c745a09sm893671c88.7.2026.09.07.19.03.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 19:03:51 -0700 (PDT) From: Zong Li To: tomasz.jeznach@linux.dev, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, pjw@kernel.org, palmer@dabbelt.com, aou@eecs.berkeley.edu, alex@ghiti.fr, mark.rutland@arm.com, andrew.jones@oss.qualcomm.com, guoren@kernel.org, david.laight.linux@gmail.com, zhangzhanpeng.jasper@bytedance.com, yang.yicong@picoheart.com, nutty.liu@hotmail.com, iommu@lists.linux.dev, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Cc: Zong Li , Chen Pei , Fangyu Yu Subject: [PATCH v9 1/2] drivers/perf: riscv-iommu: add risc-v iommu pmu driver Date: Mon, 7 Sep 2026 19:03:44 -0700 Message-ID: <20260908020347.1836653-2-zong.li@sifive.com> X-Mailer: git-send-email @GIT_VERSION@ In-Reply-To: <20260908020347.1836653-1-zong.li@sifive.com> References: <20260908020347.1836653-1-zong.li@sifive.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260907_190353_471676_78A08E09 X-CRM114-Status: GOOD ( 27.77 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org QWRkIGEgbmV3IGRyaXZlciB0byBzdXBwb3J0IHRoZSBSSVNDLVYgSU9NTVUgUE1VLiBUaGlzIGlz IGFuIGF1eGlsaWFyeQpkZXZpY2UgZHJpdmVyIGNyZWF0ZWQgYnkgdGhlIHBhcmVudCBSSVNDLVYg SU9NTVUgZHJpdmVyLgoKVGhlIHBlcmZvcm1hbmNlIG1vbml0b3IgcHJvdmlkZXMgY291bnRlcnMg d2l0aCBmaWx0ZXJpbmcgc3VwcG9ydCB0bwpjb2xsZWN0IGV2ZW50cyBmb3Igc3BlY2lmaWMgZGV2 aWNlIElEL3Byb2Nlc3MgSUQsIG9yIEdTQ0lEL1BTQ0lELgoKVGhlIFJJU0MtViBJT01NVSBQTVUg c2VwYXJhdGVzIHRoZSBjeWNsZSBjb3VudGVyIGZyb20gdGhlIGV2ZW50IGNvdW50ZXJzLgpUaGUg Y3ljbGUgY291bnRlciBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGlvaHBtZXZ0MCwgc28gYSBzb2Z0 d2FyZS1kZWZpbmVkCmN5Y2xlIGV2ZW50IGlzIHJlcXVpcmVkIGZvciB0aGUgcGVyZiBzdWJzeXN0 ZW0uCgpUaGUgbnVtYmVyIGFuZCB3aWR0aCBvZiB0aGUgY291bnRlcnMgYXJlIGhhcmR3YXJlLWlt cGxlbWVudGVkIGFuZCBtdXN0CmJlIGRldGVjdGVkIGF0IHJ1bnRpbWUuCgpMZWF2ZSBvdXQgYWxs IHRoZSBkZWFkIGNsZWFudXAgY29kZSAoaS5lLiAucmVtb3ZlKCkgb3BlcmF0aW9uKSBpZiB0aGUK UE1VIGRyaXZlciBpcyB0aWVkIHRvIHRoZSBJT01NVSBkcml2ZXIgYW5kIGNhbiBuZXZlciByZWFs aXN0aWNhbGx5IGJlCnJlbW92ZWQuCgpQTVUtcmVsYXRlZCBkZWZpbml0aW9ucyBhcmUgbW92ZWQg aW50byB0aGUgcGVyZiBkcml2ZXIsIHdoZXJlIHRoZXkgYXJlCnVzZWQgZXhjbHVzaXZlbHkuCgpB Y2NvcmRpbmcgdG8gUklTQy1WIElPTU1VIHNwZWNpZmljYXRpb24gQ2hhcHRlciA2OgpXaGV0aGVy IGFuIDggYnl0ZSBhY2Nlc3MgdG8gYW4gSU9NTVUgcmVnaXN0ZXIgaXMgc2luZ2xlLWNvcHkgYXRv bWljIGlzClVOU1BFQ0lGSUVELiBVc2UgdHdvIHNlcGFyYXRlIDQgYnl0ZSBhY2Nlc3NlcyBmb3Ig aGFyZHdhcmUKY29tcGF0aWJpbGl0eS4KClRlc3RlZC1ieTogQ2hlbiBQZWkgPGNwMDYxM0BsaW51 eC5hbGliYWJhLmNvbT4KVGVzdGVkLWJ5OiBGYW5neXUgWXUgPGZhbmd5dS55dUBsaW51eC5hbGli YWJhLmNvbT4KUmV2aWV3ZWQtYnk6IE51dHR5IExpdSA8bnV0dHkubGl1QGhvdG1haWwuY29tPgpS ZXZpZXdlZC1ieTogR3VvIFJlbiAoQWxpYmFiYSBEQU1PIEFjYWRlbXkpIDxndW9yZW5Aa2VybmVs Lm9yZz4KUmV2aWV3ZWQtYnk6IFlpY29uZyBZYW5nIDx5YW5nLnlpY29uZ0BwaWNvaGVhcnQuY29t PgpTdWdnZXN0ZWQtYnk6IERhdmlkIExhaWdodCA8ZGF2aWQubGFpZ2h0LmxpbnV4QGdtYWlsLmNv bT4KU3VnZ2VzdGVkLWJ5OiBHdW8gUmVuIDxndW9yZW5Aa2VybmVsLm9yZz4KTGluazogaHR0cHM6 Ly9sb3JlLmtlcm5lbC5vcmcvbGludXgtcmlzY3YvMjAyNjA2MTgxNDM2MzQuN2YzZGQ2YzVAcHVt cGtpbi8KU2lnbmVkLW9mZi1ieTogWm9uZyBMaSA8em9uZy5saUBzaWZpdmUuY29tPgotLS0KIGRy aXZlcnMvaW9tbXUvcmlzY3YvaW9tbXUtYml0cy5oIHwgICA2MSAtLQogZHJpdmVycy9wZXJmL0tj b25maWcgICAgICAgICAgICAgfCAgIDEyICsKIGRyaXZlcnMvcGVyZi9NYWtlZmlsZSAgICAgICAg ICAgIHwgICAgMSArCiBkcml2ZXJzL3BlcmYvcmlzY3ZfaW9tbXVfcG11LmMgICB8IDEwMjAgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDEwMzMgaW5zZXJ0 aW9ucygrKSwgNjEgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9wZXJm L3Jpc2N2X2lvbW11X3BtdS5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9yaXNjdi9pb21t dS1iaXRzLmggYi9kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LWJpdHMuaAppbmRleCBmMmVmOWJk M2NkZTkuLjZiNWRlOTEzYTAzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9yaXNjdi9pb21t dS1iaXRzLmgKKysrIGIvZHJpdmVycy9pb21tdS9yaXNjdi9pb21tdS1iaXRzLmgKQEAgLTE5Miw2 NyArMTkyLDYgQEAgZW51bSByaXNjdl9pb21tdV9kZHRwX21vZGVzIHsKICNkZWZpbmUgUklTQ1Zf SU9NTVVfSVBTUl9QTUlQCQlCSVQoUklTQ1ZfSU9NTVVfSU5UUl9QTSkKICNkZWZpbmUgUklTQ1Zf SU9NTVVfSVBTUl9QSVAJCUJJVChSSVNDVl9JT01NVV9JTlRSX1BRKQogCi0vKiA1LjE5IFBlcmZv cm1hbmNlIG1vbml0b3JpbmcgY291bnRlciBvdmVyZmxvdyBzdGF0dXMgKDMyYml0cykgKi8KLSNk ZWZpbmUgUklTQ1ZfSU9NTVVfUkVHX0lPQ09VTlRPVkYJMHgwMDU4Ci0jZGVmaW5lIFJJU0NWX0lP TU1VX0lPQ09VTlRPVkZfQ1kJQklUKDApCi0jZGVmaW5lIFJJU0NWX0lPTU1VX0lPQ09VTlRPVkZf SFBNCUdFTk1BU0tfVUxMKDMxLCAxKQotCi0vKiA1LjIwIFBlcmZvcm1hbmNlIG1vbml0b3Jpbmcg Y291bnRlciBpbmhpYml0cyAoMzJiaXRzKSAqLwotI2RlZmluZSBSSVNDVl9JT01NVV9SRUdfSU9D T1VOVElOSAkweDAwNUMKLSNkZWZpbmUgUklTQ1ZfSU9NTVVfSU9DT1VOVElOSF9DWQlCSVQoMCkK LSNkZWZpbmUgUklTQ1ZfSU9NTVVfSU9DT1VOVElOSF9IUE0JR0VOTUFTSygzMSwgMSkKLQotLyog NS4yMSBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGN5Y2xlcyBjb3VudGVyICg2NGJpdHMpICovCi0j ZGVmaW5lIFJJU0NWX0lPTU1VX1JFR19JT0hQTUNZQ0xFUyAgICAgMHgwMDYwCi0jZGVmaW5lIFJJ U0NWX0lPTU1VX0lPSFBNQ1lDTEVTX0NPVU5URVIJR0VOTUFTS19VTEwoNjIsIDApCi0jZGVmaW5l IFJJU0NWX0lPTU1VX0lPSFBNQ1lDTEVTX09GCUJJVF9VTEwoNjMpCi0KLS8qIDUuMjIgUGVyZm9y bWFuY2UgbW9uaXRvcmluZyBldmVudCBjb3VudGVycyAoMzEgKiA2NGJpdHMpICovCi0jZGVmaW5l IFJJU0NWX0lPTU1VX1JFR19JT0hQTUNUUl9CQVNFCTB4MDA2OAotI2RlZmluZSBSSVNDVl9JT01N VV9SRUdfSU9IUE1DVFIoX24pCShSSVNDVl9JT01NVV9SRUdfSU9IUE1DVFJfQkFTRSArICgoX24p ICogMHg4KSkKLQotLyogNS4yMyBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGV2ZW50IHNlbGVjdG9y cyAoMzEgKiA2NGJpdHMpICovCi0jZGVmaW5lIFJJU0NWX0lPTU1VX1JFR19JT0hQTUVWVF9CQVNF CTB4MDE2MAotI2RlZmluZSBSSVNDVl9JT01NVV9SRUdfSU9IUE1FVlQoX24pCShSSVNDVl9JT01N VV9SRUdfSU9IUE1FVlRfQkFTRSArICgoX24pICogMHg4KSkKLSNkZWZpbmUgUklTQ1ZfSU9NTVVf SU9IUE1FVlRfRVZFTlRJRAlHRU5NQVNLX1VMTCgxNCwgMCkKLSNkZWZpbmUgUklTQ1ZfSU9NTVVf SU9IUE1FVlRfRE1BU0sJQklUX1VMTCgxNSkKLSNkZWZpbmUgUklTQ1ZfSU9NTVVfSU9IUE1FVlRf UElEX1BTQ0lECUdFTk1BU0tfVUxMKDM1LCAxNikKLSNkZWZpbmUgUklTQ1ZfSU9NTVVfSU9IUE1F VlRfRElEX0dTQ0lECUdFTk1BU0tfVUxMKDU5LCAzNikKLSNkZWZpbmUgUklTQ1ZfSU9NTVVfSU9I UE1FVlRfUFZfUFNDVglCSVRfVUxMKDYwKQotI2RlZmluZSBSSVNDVl9JT01NVV9JT0hQTUVWVF9E Vl9HU0NWCUJJVF9VTEwoNjEpCi0jZGVmaW5lIFJJU0NWX0lPTU1VX0lPSFBNRVZUX0lEVAlCSVRf VUxMKDYyKQotI2RlZmluZSBSSVNDVl9JT01NVV9JT0hQTUVWVF9PRgkJQklUX1VMTCg2MykKLQot LyogTnVtYmVyIG9mIGRlZmluZWQgcGVyZm9ybWFuY2UtbW9uaXRvcmluZyBldmVudCBzZWxlY3Rv cnMgKi8KLSNkZWZpbmUgUklTQ1ZfSU9NTVVfSU9IUE1FVlRfQ05UCTMxCi0KLS8qKgotICogZW51 bSByaXNjdl9pb21tdV9ocG1ldmVudF9pZCAtIFBlcmZvcm1hbmNlLW1vbml0b3JpbmcgZXZlbnQg aWRlbnRpZmllcgotICoKLSAqIEBSSVNDVl9JT01NVV9IUE1FVkVOVF9JTlZBTElEOiBJbnZhbGlk IGV2ZW50LCBkbyBub3QgY291bnQKLSAqIEBSSVNDVl9JT01NVV9IUE1FVkVOVF9VUlE6IFVudHJh bnNsYXRlZCByZXF1ZXN0cwotICogQFJJU0NWX0lPTU1VX0hQTUVWRU5UX1RSUTogVHJhbnNsYXRl ZCByZXF1ZXN0cwotICogQFJJU0NWX0lPTU1VX0hQTUVWRU5UX0FUU19SUTogQVRTIHRyYW5zbGF0 aW9uIHJlcXVlc3RzCi0gKiBAUklTQ1ZfSU9NTVVfSFBNRVZFTlRfVExCX01JU1M6IFRMQiBtaXNz ZXMKLSAqIEBSSVNDVl9JT01NVV9IUE1FVkVOVF9ERF9XQUxLOiBEZXZpY2UgZGlyZWN0b3J5IHdh bGtzCi0gKiBAUklTQ1ZfSU9NTVVfSFBNRVZFTlRfUERfV0FMSzogUHJvY2VzcyBkaXJlY3Rvcnkg d2Fsa3MKLSAqIEBSSVNDVl9JT01NVV9IUE1FVkVOVF9TX1ZTX1dBTEtTOiBGaXJzdC1zdGFnZSBw YWdlIHRhYmxlIHdhbGtzCi0gKiBAUklTQ1ZfSU9NTVVfSFBNRVZFTlRfR19XQUxLUzogU2Vjb25k LXN0YWdlIHBhZ2UgdGFibGUgd2Fsa3MKLSAqIEBSSVNDVl9JT01NVV9IUE1FVkVOVF9NQVg6IFZh bHVlIHRvIGRlbm90ZSBtYXhpbXVtIEV2ZW50IElEcwotICovCi1lbnVtIHJpc2N2X2lvbW11X2hw bWV2ZW50X2lkIHsKLQlSSVNDVl9JT01NVV9IUE1FVkVOVF9JTlZBTElEICAgID0gMCwKLQlSSVND Vl9JT01NVV9IUE1FVkVOVF9VUlEgICAgICAgID0gMSwKLQlSSVNDVl9JT01NVV9IUE1FVkVOVF9U UlEgICAgICAgID0gMiwKLQlSSVNDVl9JT01NVV9IUE1FVkVOVF9BVFNfUlEgICAgID0gMywKLQlS SVNDVl9JT01NVV9IUE1FVkVOVF9UTEJfTUlTUyAgID0gNCwKLQlSSVNDVl9JT01NVV9IUE1FVkVO VF9ERF9XQUxLICAgID0gNSwKLQlSSVNDVl9JT01NVV9IUE1FVkVOVF9QRF9XQUxLICAgID0gNiwK LQlSSVNDVl9JT01NVV9IUE1FVkVOVF9TX1ZTX1dBTEtTID0gNywKLQlSSVNDVl9JT01NVV9IUE1F VkVOVF9HX1dBTEtTICAgID0gOCwKLQlSSVNDVl9JT01NVV9IUE1FVkVOVF9NQVggICAgICAgID0g OQotfTsKLQogLyogNS4yNCBUcmFuc2xhdGlvbiByZXF1ZXN0IElPVkEgKDY0Yml0cykgKi8KICNk ZWZpbmUgUklTQ1ZfSU9NTVVfUkVHX1RSX1JFUV9JT1ZBICAgICAweDAyNTgKICNkZWZpbmUgUklT Q1ZfSU9NTVVfVFJfUkVRX0lPVkFfVlBOCUdFTk1BU0tfVUxMKDYzLCAxMikKZGlmZiAtLWdpdCBh L2RyaXZlcnMvcGVyZi9LY29uZmlnIGIvZHJpdmVycy9wZXJmL0tjb25maWcKaW5kZXggMjQ1ZTdi Yjc2M2I5Li44Y2NlNmMyZWE2MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGVyZi9LY29uZmlnCisr KyBiL2RyaXZlcnMvcGVyZi9LY29uZmlnCkBAIC0xMDUsNiArMTA1LDE4IEBAIGNvbmZpZyBSSVND Vl9QTVVfU0JJCiAJICBmdWxsIHBlcmYgZmVhdHVyZSBzdXBwb3J0IGkuZS4gY291bnRlciBvdmVy ZmxvdywgcHJpdmlsZWdlIG1vZGUKIAkgIGZpbHRlcmluZywgY291bnRlciBjb25maWd1cmF0aW9u LgogCitjb25maWcgUklTQ1ZfSU9NTVVfUE1VCisJZGVwZW5kcyBvbiBSSVNDViB8fCBDT01QSUxF X1RFU1QKKwlkZXBlbmRzIG9uIFJJU0NWX0lPTU1VCisJYm9vbCAiUklTQy1WIElPTU1VIEhhcmR3 YXJlIFBlcmZvcm1hbmNlIE1vbml0b3IiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaWYg eW91IHdhbnQgdG8gdXNlIHRoZSBSSVNDLVYgSU9NTVUgcGVyZm9ybWFuY2UgbW9uaXRvcgorCSAg aW1wbGVtZW50YXRpb24uIFRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIGlzIGFuIG9wdGlvbmFsIGhh cmR3YXJlCisJICBmZWF0dXJlLCBhbmQgd2hldGhlciBpdCBpcyBhY3R1YWxseSBlbmFibGVkIGRl cGVuZHMgb24gSU9NTVUKKwkgIGhhcmR3YXJlIHN1cHBvcnQuIElmIHRoZSB1bmRlcmx5aW5nIGhh cmR3YXJlIGRvZXMgbm90IGltcGxlbWVudAorCSAgdGhlIFBNVSwgdGhpcyBvcHRpb24gd2lsbCBo YXZlIG5vIGVmZmVjdC4KKwogY29uZmlnIFNUQVJGSVZFX1NUQVJMSU5LX1BNVQogCWRlcGVuZHMg b24gQVJDSF9TVEFSRklWRSB8fCBDT01QSUxFX1RFU1QKIAlkZXBlbmRzIG9uIDY0QklUCmRpZmYg LS1naXQgYS9kcml2ZXJzL3BlcmYvTWFrZWZpbGUgYi9kcml2ZXJzL3BlcmYvTWFrZWZpbGUKaW5k ZXggZWI4YTAyMmRhZDlhLi45MGM3NWYzYzBhYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGVyZi9N YWtlZmlsZQorKysgYi9kcml2ZXJzL3BlcmYvTWFrZWZpbGUKQEAgLTIwLDYgKzIwLDcgQEAgb2Jq LSQoQ09ORklHX1FDT01fTDNfUE1VKSArPSBxY29tX2wzX3BtdS5vCiBvYmotJChDT05GSUdfUklT Q1ZfUE1VKSArPSByaXNjdl9wbXUubwogb2JqLSQoQ09ORklHX1JJU0NWX1BNVV9MRUdBQ1kpICs9 IHJpc2N2X3BtdV9sZWdhY3kubwogb2JqLSQoQ09ORklHX1JJU0NWX1BNVV9TQkkpICs9IHJpc2N2 X3BtdV9zYmkubworb2JqLSQoQ09ORklHX1JJU0NWX0lPTU1VX1BNVSkgKz0gcmlzY3ZfaW9tbXVf cG11Lm8KIG9iai0kKENPTkZJR19TVEFSRklWRV9TVEFSTElOS19QTVUpICs9IHN0YXJmaXZlX3N0 YXJsaW5rX3BtdS5vCiBvYmotJChDT05GSUdfVEhVTkRFUlgyX1BNVSkgKz0gdGh1bmRlcngyX3Bt dS5vCiBvYmotJChDT05GSUdfWEdFTkVfUE1VKSArPSB4Z2VuZV9wbXUubwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9wZXJmL3Jpc2N2X2lvbW11X3BtdS5jIGIvZHJpdmVycy9wZXJmL3Jpc2N2X2lvbW11 X3BtdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uM2ExY2YzNjZh NzlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wZXJmL3Jpc2N2X2lvbW11X3BtdS5jCkBA IC0wLDAgKzEsMTAyMCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25s eQorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNiBTaUZpdmUKKyAqCisgKiBBdXRob3JzCisgKgla b25nIExpIDx6b25nLmxpQHNpZml2ZS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2F1eGls aWFyeV9idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVt YXNrLmg+CisjaW5jbHVkZSA8bGludXgvaW8tNjQtbm9uYXRvbWljLWhpLWxvLmg+CisjaW5jbHVk ZSA8bGludXgvaXJxX3dvcmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisKKyNp bmNsdWRlICIuLi9pb21tdS9yaXNjdi9pb21tdS5oIgorCisvKiA1LjE5IFBlcmZvcm1hbmNlIG1v bml0b3JpbmcgY291bnRlciBvdmVyZmxvdyBzdGF0dXMgKDMyYml0cykgKi8KKyNkZWZpbmUgUklT Q1ZfSU9NTVVfUkVHX0lPQ09VTlRPVkYJMHgwMDU4CisjZGVmaW5lIFJJU0NWX0lPTU1VX0lPQ09V TlRPVkZfQ1kJQklUKDApCisjZGVmaW5lIFJJU0NWX0lPTU1VX0lPQ09VTlRPVkZfSFBNCUdFTk1B U0tfVUxMKDMxLCAxKQorCisvKiA1LjIwIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgY291bnRlciBp bmhpYml0cyAoMzJiaXRzKSAqLworI2RlZmluZSBSSVNDVl9JT01NVV9SRUdfSU9DT1VOVElOSAkw eDAwNUMKKyNkZWZpbmUgUklTQ1ZfSU9NTVVfSU9DT1VOVElOSF9DWQlCSVQoMCkKKyNkZWZpbmUg UklTQ1ZfSU9NTVVfSU9DT1VOVElOSF9IUE0JR0VOTUFTSygzMSwgMCkKKworLyogNS4yMSBQZXJm b3JtYW5jZSBtb25pdG9yaW5nIGN5Y2xlcyBjb3VudGVyICg2NGJpdHMpICovCisjZGVmaW5lIFJJ U0NWX0lPTU1VX1JFR19JT0hQTUNZQ0xFUwkweDAwNjAKKyNkZWZpbmUgUklTQ1ZfSU9NTVVfSU9I UE1DWUNMRVNfQ09VTlRFUglHRU5NQVNLX1VMTCg2MiwgMCkKKyNkZWZpbmUgUklTQ1ZfSU9NTVVf SU9IUE1DWUNMRVNfT0YJQklUX1VMTCg2MykKKyNkZWZpbmUgUklTQ1ZfSU9NTVVfUkVHX0lPSFBN Q1RSKF9uKQkoUklTQ1ZfSU9NTVVfUkVHX0lPSFBNQ1lDTEVTICsgKChfbikgKiAweDgpKQorCisv KiA1LjIyIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZXZlbnQgY291bnRlcnMgKDMxICogNjRiaXRz KSAqLworI2RlZmluZSBSSVNDVl9JT01NVV9SRUdfSU9IUE1DVFJfQkFTRQkweDAwNjgKKyNkZWZp bmUgUklTQ1ZfSU9NTVVfSU9IUE1DVFJfQ09VTlRFUglHRU5NQVNLX1VMTCg2MywgMCkKKworLyog NS4yMyBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGV2ZW50IHNlbGVjdG9ycyAoMzEgKiA2NGJpdHMp ICovCisjZGVmaW5lIFJJU0NWX0lPTU1VX1JFR19JT0hQTUVWVF9CQVNFCTB4MDE2MAorI2RlZmlu ZSBSSVNDVl9JT01NVV9SRUdfSU9IUE1FVlQoX24pCShSSVNDVl9JT01NVV9SRUdfSU9IUE1FVlRf QkFTRSArICgoX24pICogMHg4KSkKKyNkZWZpbmUgUklTQ1ZfSU9NTVVfSU9IUE1FVlRfRVZFTlRJ RAlHRU5NQVNLX1VMTCgxNCwgMCkKKyNkZWZpbmUgUklTQ1ZfSU9NTVVfSU9IUE1FVlRfRE1BU0sJ QklUX1VMTCgxNSkKKyNkZWZpbmUgUklTQ1ZfSU9NTVVfSU9IUE1FVlRfUElEX1BTQ0lECUdFTk1B U0tfVUxMKDM1LCAxNikKKyNkZWZpbmUgUklTQ1ZfSU9NTVVfSU9IUE1FVlRfRElEX0dTQ0lECUdF Tk1BU0tfVUxMKDU5LCAzNikKKyNkZWZpbmUgUklTQ1ZfSU9NTVVfSU9IUE1FVlRfUFZfUFNDVglC SVRfVUxMKDYwKQorI2RlZmluZSBSSVNDVl9JT01NVV9JT0hQTUVWVF9EVl9HU0NWCUJJVF9VTEwo NjEpCisjZGVmaW5lIFJJU0NWX0lPTU1VX0lPSFBNRVZUX0lEVAlCSVRfVUxMKDYyKQorI2RlZmlu ZSBSSVNDVl9JT01NVV9JT0hQTUVWVF9PRgkJQklUX1VMTCg2MykKKyNkZWZpbmUgUklTQ1ZfSU9N TVVfSU9IUE1FVlRfRVZFTlQJR0VOTUFTS19VTEwoNjIsIDApCisKKy8qIFRoZSB0b3RhbCBudW1i ZXIgb2YgY291bnRlcnMgaXMgMzEgZXZlbnQgY291bnRlcnMgcGx1cyAxIGN5Y2xlIGNvdW50ZXIg Ki8KKyNkZWZpbmUgUklTQ1ZfSU9NTVVfSFBNX0NPVU5URVJfTlVNCTMyCisKKy8qIENvdW50ZXIg aW5kZXggMCBpcyB0aGUgY3ljbGUgY291bnRlciwgdGhlIGV2ZW50IGNvdW50ZXJzIHN0YXJ0IGF0 IGluZGV4IDEgKi8KKyNkZWZpbmUgUklTQ1ZfSU9NTVVfSFBNX0NZQ0xFX0lEWAkwCisKK3N0YXRp YyBpbnQgY3B1aHBfc3RhdGU7CisKKy8qKgorICogZW51bSByaXNjdl9pb21tdV9ocG1ldmVudF9p ZCAtIFBlcmZvcm1hbmNlLW1vbml0b3JpbmcgZXZlbnQgaWRlbnRpZmllcgorICoKKyAqIEBSSVND Vl9JT01NVV9IUE1FVkVOVF9DWUNMRTogQ2xvY2sgY3ljbGUgY291bnRlcgorICogQFJJU0NWX0lP TU1VX0hQTUVWRU5UX1VSUTogVW50cmFuc2xhdGVkIHJlcXVlc3RzCisgKiBAUklTQ1ZfSU9NTVVf SFBNRVZFTlRfVFJROiBUcmFuc2xhdGVkIHJlcXVlc3RzCisgKiBAUklTQ1ZfSU9NTVVfSFBNRVZF TlRfQVRTX1JROiBBVFMgdHJhbnNsYXRpb24gcmVxdWVzdHMKKyAqIEBSSVNDVl9JT01NVV9IUE1F VkVOVF9UTEJfTUlTUzogVExCIG1pc3NlcworICogQFJJU0NWX0lPTU1VX0hQTUVWRU5UX0REX1dB TEs6IERldmljZSBkaXJlY3Rvcnkgd2Fsa3MKKyAqIEBSSVNDVl9JT01NVV9IUE1FVkVOVF9QRF9X QUxLOiBQcm9jZXNzIGRpcmVjdG9yeSB3YWxrcworICogQFJJU0NWX0lPTU1VX0hQTUVWRU5UX1Nf VlNfV0FMS1M6IEZpcnN0LXN0YWdlIHBhZ2UgdGFibGUgd2Fsa3MKKyAqIEBSSVNDVl9JT01NVV9I UE1FVkVOVF9HX1dBTEtTOiBTZWNvbmQtc3RhZ2UgcGFnZSB0YWJsZSB3YWxrcworICogQFJJU0NW X0lPTU1VX0hQTUVWRU5UX01BWDogVmFsdWUgdG8gZGVub3RlIG1heGltdW0gRXZlbnQgSURzCisg KgorICogVGhlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgZGVmaW5lIGFuIGV2ZW50IElEIGZvciBj b3VudGluZyB0aGUKKyAqIG51bWJlciBvZiBjbG9jayBjeWNsZXMsIG1lYW5pbmcgdGhlcmUgaXMg bm8gYXNzb2NpYXRlZCAnaW9ocG1ldnQwJy4KKyAqIEV2ZW50IElEIDAgaXMgYW4gaW52YWxpZCBl dmVudCBhbmQgZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIGFueSB2YWxpZAorICogZXZlbnQgSUQuIExl dCdzIHJlcHVycG9zZSBJRCAwIGFzIHRoZSBjeWNsZSBmb3IgcGVyZiwgdGhlIGN5Y2xlCisgKiBl dmVudCBpcyBub3QgYWN0dWFsbHkgd3JpdHRlbiBpbnRvIGFueSByZWdpc3RlciwgaXQgc2VydmVz IHNvbGVseQorICogYXMgYW4gaWRlbnRpZmllci4KKyAqLworZW51bSByaXNjdl9pb21tdV9ocG1l dmVudF9pZCB7CisJUklTQ1ZfSU9NTVVfSFBNRVZFTlRfQ1lDTEUJPSAwLAorCVJJU0NWX0lPTU1V X0hQTUVWRU5UX1VSUSAgICAgICAgPSAxLAorCVJJU0NWX0lPTU1VX0hQTUVWRU5UX1RSUSAgICAg ICAgPSAyLAorCVJJU0NWX0lPTU1VX0hQTUVWRU5UX0FUU19SUSAgICAgPSAzLAorCVJJU0NWX0lP TU1VX0hQTUVWRU5UX1RMQl9NSVNTICAgPSA0LAorCVJJU0NWX0lPTU1VX0hQTUVWRU5UX0REX1dB TEsgICAgPSA1LAorCVJJU0NWX0lPTU1VX0hQTUVWRU5UX1BEX1dBTEsgICAgPSA2LAorCVJJU0NW X0lPTU1VX0hQTUVWRU5UX1NfVlNfV0FMS1MgPSA3LAorCVJJU0NWX0lPTU1VX0hQTUVWRU5UX0df V0FMS1MgICAgPSA4LAorCVJJU0NWX0lPTU1VX0hQTUVWRU5UX01BWCAgICAgICAgPSA5Cit9Owor CitzdHJ1Y3QgcmlzY3ZfaW9tbXVfcG11IHsKKwlzdHJ1Y3QgcG11IHBtdTsKKwlzdHJ1Y3QgaGxp c3Rfbm9kZSBub2RlOworCXZvaWQgX19pb21lbSAqcmVnOworCWludCBvbl9jcHU7CisJdW5zaWdu ZWQgaW50IGlycTsKKwlpbnQgbnVtYV9ub2RlOworCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7 CisJdTY0IGN5Y2xlX2NudHJfbWFzazsKKwl1NjQgZXZlbnRfY250cl9tYXNrOworCXN0cnVjdCBw ZXJmX2V2ZW50ICpldmVudHNbUklTQ1ZfSU9NTVVfSFBNX0NPVU5URVJfTlVNXTsKKwlERUNMQVJF X0JJVE1BUCh1c2VkX2NvdW50ZXJzLCBSSVNDVl9JT01NVV9IUE1fQ09VTlRFUl9OVU0pOworCS8q IERlZmVycyBvdmVyZmxvdyBwcm9jZXNzaW5nIHRvIG9uX2NwdSB3aGVuIHRoZSBpbnRlcnJ1cHQg bGFuZHMgZWxzZXdoZXJlICovCisJc3RydWN0IGlycV93b3JrIHdvcms7Cit9OworCisjZGVmaW5l IHRvX3Jpc2N2X2lvbW11X3BtdShwKSAoY29udGFpbmVyX29mKHAsIHN0cnVjdCByaXNjdl9pb21t dV9wbXUsIHBtdSkpCisKKyNkZWZpbmUgUklTQ1ZfSU9NTVVfUE1VX0FUVFJfRVhUUkFDVE9SKF9u YW1lLCBfbWFzaykJCQlcCisJc3RhdGljIGlubGluZSB1MzIgZ2V0XyMjX25hbWUoc3RydWN0IHBl cmZfZXZlbnQgKmV2ZW50KQkJXAorCXsJCQkJCQkJCVwKKwkJcmV0dXJuIEZJRUxEX0dFVChfbWFz aywgZXZlbnQtPmF0dHIuY29uZmlnKTsJCVwKKwl9CQkJCQkJCQlcCisKK1JJU0NWX0lPTU1VX1BN VV9BVFRSX0VYVFJBQ1RPUihldmVudCwgUklTQ1ZfSU9NTVVfSU9IUE1FVlRfRVZFTlRJRCk7CitS SVNDVl9JT01NVV9QTVVfQVRUUl9FWFRSQUNUT1IocGFydGlhbF9tYXRjaGluZywgUklTQ1ZfSU9N TVVfSU9IUE1FVlRfRE1BU0spOworUklTQ1ZfSU9NTVVfUE1VX0FUVFJfRVhUUkFDVE9SKHBpZF9w c2NpZCwgUklTQ1ZfSU9NTVVfSU9IUE1FVlRfUElEX1BTQ0lEKTsKK1JJU0NWX0lPTU1VX1BNVV9B VFRSX0VYVFJBQ1RPUihkaWRfZ3NjaWQsIFJJU0NWX0lPTU1VX0lPSFBNRVZUX0RJRF9HU0NJRCk7 CitSSVNDVl9JT01NVV9QTVVfQVRUUl9FWFRSQUNUT1IoZmlsdGVyX3BpZF9wc2NpZCwgUklTQ1Zf SU9NTVVfSU9IUE1FVlRfUFZfUFNDVik7CitSSVNDVl9JT01NVV9QTVVfQVRUUl9FWFRSQUNUT1Io ZmlsdGVyX2RpZF9nc2NpZCwgUklTQ1ZfSU9NTVVfSU9IUE1FVlRfRFZfR1NDVik7CitSSVNDVl9J T01NVV9QTVVfQVRUUl9FWFRSQUNUT1IoZmlsdGVyX2lkX3R5cGUsIFJJU0NWX0lPTU1VX0lPSFBN RVZUX0lEVCk7CisKKy8qIEZvcm1hdHMgKi8KK1BNVV9GT1JNQVRfQVRUUihldmVudCwgICAgICAg ICAgICAiY29uZmlnOjAtMTQiKTsKK1BNVV9GT1JNQVRfQVRUUihwYXJ0aWFsX21hdGNoaW5nLCAi Y29uZmlnOjE1Iik7CitQTVVfRk9STUFUX0FUVFIocGlkX3BzY2lkLCAgICAgICAgImNvbmZpZzox Ni0zNSIpOworUE1VX0ZPUk1BVF9BVFRSKGRpZF9nc2NpZCwgICAgICAgICJjb25maWc6MzYtNTki KTsKK1BNVV9GT1JNQVRfQVRUUihmaWx0ZXJfcGlkX3BzY2lkLCAiY29uZmlnOjYwIik7CitQTVVf Rk9STUFUX0FUVFIoZmlsdGVyX2RpZF9nc2NpZCwgImNvbmZpZzo2MSIpOworUE1VX0ZPUk1BVF9B VFRSKGZpbHRlcl9pZF90eXBlLCAgICJjb25maWc6NjIiKTsKKworc3RhdGljIHN0cnVjdCBhdHRy aWJ1dGUgKnJpc2N2X2lvbW11X3BtdV9mb3JtYXRzW10gPSB7CisJJmZvcm1hdF9hdHRyX2V2ZW50 LmF0dHIsCisJJmZvcm1hdF9hdHRyX3BhcnRpYWxfbWF0Y2hpbmcuYXR0ciwKKwkmZm9ybWF0X2F0 dHJfcGlkX3BzY2lkLmF0dHIsCisJJmZvcm1hdF9hdHRyX2RpZF9nc2NpZC5hdHRyLAorCSZmb3Jt YXRfYXR0cl9maWx0ZXJfcGlkX3BzY2lkLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ZpbHRlcl9kaWRf Z3NjaWQuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX2lkX3R5cGUuYXR0ciwKKwlOVUxMLAor fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcmlzY3ZfaW9tbXVfcG11 X2Zvcm1hdF9ncm91cCA9IHsKKwkubmFtZSA9ICJmb3JtYXQiLAorCS5hdHRycyA9IHJpc2N2X2lv bW11X3BtdV9mb3JtYXRzLAorfTsKKworLyogRXZlbnRzICovCitzdGF0aWMgc3NpemVfdCByaXNj dl9pb21tdV9wbXVfZXZlbnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0 IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY2hhciAqcGFnZSkKK3sKKwlzdHJ1Y3Qg cGVyZl9wbXVfZXZlbnRzX2F0dHIgKnBtdV9hdHRyOworCisJcG11X2F0dHIgPSBjb250YWluZXJf b2YoYXR0ciwgc3RydWN0IHBlcmZfcG11X2V2ZW50c19hdHRyLCBhdHRyKTsKKworCXJldHVybiBz eXNmc19lbWl0KHBhZ2UsICJldmVudD0weCUwMmxseFxuIiwgcG11X2F0dHItPmlkKTsKK30KKwor I2RlZmluZSBSSVNDVl9JT01NVV9QTVVfRVZFTlRfQVRUUihuYW1lLCBpZCkJCQlcCisJUE1VX0VW RU5UX0FUVFJfSUQobmFtZSwgcmlzY3ZfaW9tbXVfcG11X2V2ZW50X3Nob3csIGlkKQorCitzdGF0 aWMgc3RydWN0IGF0dHJpYnV0ZSAqcmlzY3ZfaW9tbXVfcG11X2V2ZW50c1tdID0geworCVJJU0NW X0lPTU1VX1BNVV9FVkVOVF9BVFRSKGN5Y2xlLCBSSVNDVl9JT01NVV9IUE1FVkVOVF9DWUNMRSks CisJUklTQ1ZfSU9NTVVfUE1VX0VWRU5UX0FUVFIodW50cmFuc2xhdGVkX3JlcSwgUklTQ1ZfSU9N TVVfSFBNRVZFTlRfVVJRKSwKKwlSSVNDVl9JT01NVV9QTVVfRVZFTlRfQVRUUih0cmFuc2xhdGVk X3JlcSwgUklTQ1ZfSU9NTVVfSFBNRVZFTlRfVFJRKSwKKwlSSVNDVl9JT01NVV9QTVVfRVZFTlRf QVRUUihhdHNfdHJhbnNfcmVxLCBSSVNDVl9JT01NVV9IUE1FVkVOVF9BVFNfUlEpLAorCVJJU0NW X0lPTU1VX1BNVV9FVkVOVF9BVFRSKHRsYl9taXNzLCBSSVNDVl9JT01NVV9IUE1FVkVOVF9UTEJf TUlTUyksCisJUklTQ1ZfSU9NTVVfUE1VX0VWRU5UX0FUVFIoZGR0X3dhbGtzLCBSSVNDVl9JT01N VV9IUE1FVkVOVF9ERF9XQUxLKSwKKwlSSVNDVl9JT01NVV9QTVVfRVZFTlRfQVRUUihwZHRfd2Fs a3MsIFJJU0NWX0lPTU1VX0hQTUVWRU5UX1BEX1dBTEspLAorCVJJU0NWX0lPTU1VX1BNVV9FVkVO VF9BVFRSKHNfdnNfcHRfd2Fsa3MsIFJJU0NWX0lPTU1VX0hQTUVWRU5UX1NfVlNfV0FMS1MpLAor CVJJU0NWX0lPTU1VX1BNVV9FVkVOVF9BVFRSKGdfcHRfd2Fsa3MsIFJJU0NWX0lPTU1VX0hQTUVW RU5UX0dfV0FMS1MpLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0 ZV9ncm91cCByaXNjdl9pb21tdV9wbXVfZXZlbnRzX2dyb3VwID0geworCS5uYW1lID0gImV2ZW50 cyIsCisJLmF0dHJzID0gcmlzY3ZfaW9tbXVfcG11X2V2ZW50cywKK307CisKKy8qIGNwdW1hc2sg Ki8KK3N0YXRpYyBzc2l6ZV90IHJpc2N2X2lvbW11X2NwdW1hc2tfc2hvdyhzdHJ1Y3QgZGV2aWNl ICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpi dWYpCit7CisJc3RydWN0IHJpc2N2X2lvbW11X3BtdSAqcG11ID0gdG9fcmlzY3ZfaW9tbXVfcG11 KGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlpbnQgb25fY3B1ID0gcG11LT5vbl9jcHU7CisKKwkv KgorCSAqIHJpc2N2X2lvbW11X3BtdV9vZmZsaW5lX2NwdSgpIGxlYXZlcyBvbl9jcHUgYXQgLTEg d2hlbiBpdCBjYW5ub3QKKwkgKiBmaW5kIGFub3RoZXIgb25saW5lIENQVSB0byBtaWdyYXRlIHRv LiBSZXBvcnQgYW4gZW1wdHkgbWFzayByYXRoZXIKKwkgKiB0aGFuIGZlZWRpbmcgLTEgdG8gY3B1 bWFza19vZigpLCB3aGljaCBpbmRleGVzIG91dCBvZiBib3VuZHMuCisJICovCisJaWYgKG9uX2Nw dSA8IDApCisJCXJldHVybiBzeXNmc19lbWl0KGJ1ZiwgIiUqcGJsXG4iLCBjcHVtYXNrX3ByX2Fy Z3MoY3B1X25vbmVfbWFzaykpOworCisJcmV0dXJuIHN5c2ZzX2VtaXQoYnVmLCAiJSpwYmxcbiIs IGNwdW1hc2tfcHJfYXJncyhjcHVtYXNrX29mKG9uX2NwdSkpKTsKK30KKworc3RhdGljIHN0cnVj dCBkZXZpY2VfYXR0cmlidXRlIHJpc2N2X2lvbW11X2NwdW1hc2tfYXR0ciA9CisJX19BVFRSKGNw dW1hc2ssIDA0NDQsIHJpc2N2X2lvbW11X2NwdW1hc2tfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBz dHJ1Y3QgYXR0cmlidXRlICpyaXNjdl9pb21tdV9jcHVtYXNrX2F0dHJzW10gPSB7CisJJnJpc2N2 X2lvbW11X2NwdW1hc2tfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgYXR0cmlidXRlX2dyb3VwIHJpc2N2X2lvbW11X3BtdV9jcHVtYXNrX2dyb3VwID0geworCS5h dHRycyA9IHJpc2N2X2lvbW11X2NwdW1hc2tfYXR0cnMsCit9OworCitzdGF0aWMgY29uc3Qgc3Ry dWN0IGF0dHJpYnV0ZV9ncm91cCAqcmlzY3ZfaW9tbXVfcG11X2F0dHJfZ3Jwc1tdID0geworCSZy aXNjdl9pb21tdV9wbXVfY3B1bWFza19ncm91cCwKKwkmcmlzY3ZfaW9tbXVfcG11X2Zvcm1hdF9n cm91cCwKKwkmcmlzY3ZfaW9tbXVfcG11X2V2ZW50c19ncm91cCwKKwlOVUxMLAorfTsKKworLyoK KyAqIFJlZ2lzdGVyIGFjY2VzcyB3cmFwcGVyCisgKgorICogQWNjb3JkaW5nIHRvIFJJU0MtViBJ T01NVSBzcGVjaWZpY2F0aW9uIENoYXB0ZXIgNjoKKyAqIEEgNCBieXRlIGFjY2VzcyB0byBhbiBJ T01NVSByZWdpc3RlciBtdXN0IGJlIHNpbmdsZS1jb3B5IGF0b21pYy4KKyAqIFdoZXRoZXIgYW4g OCBieXRlIGFjY2VzcyB0byBhbiBJT01NVSByZWdpc3RlciBpcyBzaW5nbGUtY29weSBhdG9taWMg aXMgVU5TUEVDSUZJRUQKKyAqCisgKiBVc2UgdHdvIHNlcGFyYXRlIDQgYnl0ZSBhY2Nlc3NlcyBm b3IgaGFyZHdhcmUgY29tcGF0aWJpbGl0eQorICovCitzdGF0aWMgdTY0IHJpc2N2X2lvbW11X3Bt dV9yZWFkcSh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIGhpX2xvX3JlYWRxKGFkZHIp OworfQorCitzdGF0aWMgdm9pZCByaXNjdl9pb21tdV9wbXVfd3JpdGVxKHU2NCB2YWx1ZSwgdm9p ZCBfX2lvbWVtICphZGRyKQoreworCWhpX2xvX3dyaXRlcSh2YWx1ZSwgYWRkcik7Cit9CisKKy8q IFBNVSBPcGVyYXRpb25zICovCitzdGF0aWMgdm9pZCByaXNjdl9pb21tdV9wbXVfc2V0X2NvdW50 ZXIoc3RydWN0IHJpc2N2X2lvbW11X3BtdSAqcG11LCB1MzIgaWR4LAorCQkJCQl1NjQgdmFsdWUp Cit7CisJdTY0IGNvdW50ZXJfbWFzayA9IGlkeCA/IHBtdS0+ZXZlbnRfY250cl9tYXNrIDogcG11 LT5jeWNsZV9jbnRyX21hc2s7CisKKwlyaXNjdl9pb21tdV9wbXVfd3JpdGVxKHZhbHVlICYgY291 bnRlcl9tYXNrLCBwbXUtPnJlZyArIFJJU0NWX0lPTU1VX1JFR19JT0hQTUNUUihpZHgpKTsKK30K KworLyoKKyAqIEFzIHN0YXRlZCBpbiB0aGUgUklTQy1WIElPTU1VIFNwZWNpZmljYXRpb24sIENo YXB0ZXIgNjoKKyAqIFdoZXRoZXIgYW4gOCBieXRlIGFjY2VzcyB0byBhbiBJT01NVSByZWdpc3Rl ciBpcyBzaW5nbGUtY29weSBhdG9taWMKKyAqIGlzIFVOU1BFQ0lGSUVELCBhbmQgc3VjaCBhbiBh Y2Nlc3MgbWF5IGFwcGVhciwgaW50ZXJuYWxseSB0byB0aGUKKyAqIElPTU1VLCBhcyBpZiB0d28g c2VwYXJhdGUgNCBieXRlIGFjY2Vzc2VzIC3igIlmaXJzdCB0byB0aGUgaGlnaCBoYWxmCisgKiBh bmQgc2Vjb25kIHRvIHRoZSBsb3cgaGFsZuKAiS3igIl3ZXJlIHBlcmZvcm1lZAorICoKKyAqIFRv IG1ha2Ugc3VyZSB0aGUgZHJpdmVyIHdvcmtzIGNvcnJlY3RseSBvbiBkaWZmZXJlbnQgaGFyZHdh cmUsCisgKiB0aGUgc29mdHdhcmUgd2lsbCBhbHdheXMgdXNlIHR3byA0LWJ5dGUgYWNjZXNzIGZv ciB0aGUgY291bnRlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIGhpLWxv LWhpIHBhdHRlcm4gdG8gZGV0ZWN0IGFuZCBoYW5kbGUKKyAqIHdyYXBhcm91bmQgZHVyaW5nIHRo ZSByZWFkIG9wZXJhdGlvbjoKKyAqICAgMS4gUmVhZCBoaWdoIGhhbGYgKGhpKQorICogICAyLiBS ZWFkIGxvdyBoYWxmIChsbykKKyAqICAgMy4gUmVhZCBoaWdoIGhhbGYgYWdhaW4gKGhpX2FnYWlu KQorICoKKyAqIElmIGJvdGggcmVhZHMgb2YgdGhlIGhpZ2ggaGFsZiBhZ3JlZSwgdGhlbiB0aGUg bG93IGhhbGYgZGlkIG5vdCBjYXJyeQorICogaW50byB0aGUgaGlnaCBoYWxmIGluIGJldHdlZW4s IHNvIHRoZSB0d28gaGFsdmVzIGJlbG9uZyB0b2dldGhlci4gSWYKKyAqIHRoZXkgZGlmZmVyLCB0 aGUgbG93IGhhbGYgd3JhcHBlZCBkdXJpbmcgdGhlIHJlYWQgYW5kIGlzIHJlLXJlYWQgdG8KKyAq IHBhaXIgaXQgd2l0aCB0aGUgaGlnaCBoYWxmIG9ic2VydmVkIGFmdGVyIHRoZSBjYXJyeS4gQSBz ZWNvbmQgY2FycnkKKyAqIGNhbm5vdCBmb2xsb3cgd2l0aGluIHRoZXNlIGZldyByZWdpc3RlciBh Y2Nlc3NlcywgYXMgdGhhdCB3b3VsZAorICogcmVxdWlyZSB0aGUgY291bnRlciB0byBhZHZhbmNl IGJ5IGFub3RoZXIgMl4zMiBpbiB0aGUgbWVhbnRpbWUuCisgKgorICogTm90ZSB0aGF0IHRoZSBj b21wYXJpc29uIG11c3QgYmUgbWFkZSBiZXR3ZWVuIHRoZSB0d28gcmVhZHMgb2YgdGhlCisgKiBo aWdoIGhhbGYgd2l0aGluIHRoaXMgY2FsbC4gQ29tcGFyaW5nIGFnYWluc3QgYSB2YWx1ZSBjYWNo ZWQgZnJvbSBhbgorICogZWFybGllciBjYWxsIGNhbm5vdCB3b3JrOiBhIGNhcnJ5IGlzIGludmlz aWJsZSB0byBzdWNoIGEgY2hlY2sKKyAqIHdoZW5ldmVyIHRoZSBjYWNoZWQgbG93IGhhbGYgaGFw cGVucyB0byBiZSBzbWFsbGVyIHRoYW4gdGhlIGxvdyBoYWxmCisgKiBvYnNlcnZlZCBhZnRlciB0 aGUgd3JhcC4KKyAqLworc3RhdGljIHU2NCByaXNjdl9pb21tdV9wbXVfZ2V0X2NvdW50ZXIoc3Ry dWN0IHJpc2N2X2lvbW11X3BtdSAqcG11LCB1MzIgaWR4KQoreworCXZvaWQgX19pb21lbSAqYWRk ciA9IHBtdS0+cmVnICsgUklTQ1ZfSU9NTVVfUkVHX0lPSFBNQ1RSKGlkeCk7CisJdTY0IHZhbHVl LCBjb3VudGVyX21hc2sgPSBpZHggPyBwbXUtPmV2ZW50X2NudHJfbWFzayA6IHBtdS0+Y3ljbGVf Y250cl9tYXNrOworCXUzMiBoaSwgbG8sIGhpX2FnYWluOworCisJaGkgPSByZWFkbChhZGRyICsg NCk7CisJbG8gPSByZWFkbChhZGRyKTsKKwloaV9hZ2FpbiA9IHJlYWRsKGFkZHIgKyA0KTsKKwor CWlmIChoaV9hZ2FpbiAhPSBoaSkgeworCQloaSA9IGhpX2FnYWluOworCQlsbyA9IHJlYWRsKGFk ZHIpOworCX0KKworCXZhbHVlID0gKCgodTY0KWhpIDw8IDMyKSB8IGxvKSAmIGNvdW50ZXJfbWFz azsKKworCS8qIFRoZSBiaXQgNjMgb2YgY3ljbGUgY291bnRlciAoaS5lLiwgaWR4ID09IDApIGlz IE9GIGJpdCAqLworCXJldHVybiBpZHggPyB2YWx1ZSA6ICh2YWx1ZSAmIH5SSVNDVl9JT01NVV9J T0hQTUNZQ0xFU19PRik7Cit9CisKK3N0YXRpYyBib29sIGlzX2N5Y2xlX2V2ZW50KHU2NCBldmVu dCkKK3sKKwlyZXR1cm4gRklFTERfR0VUKFJJU0NWX0lPTU1VX0lPSFBNRVZUX0VWRU5USUQsIGV2 ZW50KSA9PQorCSAgICAgICBSSVNDVl9JT01NVV9IUE1FVkVOVF9DWUNMRTsKK30KKworc3RhdGlj IHZvaWQgcmlzY3ZfaW9tbXVfcG11X3NldF9ldmVudChzdHJ1Y3QgcmlzY3ZfaW9tbXVfcG11ICpw bXUsIHUzMiBpZHgsCisJCQkJICAgICAgdTY0IHZhbHVlKQoreworCS8qIFRoZXJlIGlzIG5vIGFz c29jaWF0ZWQgSU9IUE1FVlQwIGZvciBJT0hQTUNZQ0xFUyAqLworCWlmIChpc19jeWNsZV9ldmVu dCh2YWx1ZSkpCisJCXJldHVybjsKKworCS8qIEV2ZW50IGNvdW50ZXIgc3RhcnQgZnJvbSBpZHgg MSAqLworCXJpc2N2X2lvbW11X3BtdV93cml0ZXEoRklFTERfR0VUKFJJU0NWX0lPTU1VX0lPSFBN RVZUX0VWRU5ULCB2YWx1ZSksCisJCQkgICAgICAgcG11LT5yZWcgKyBSSVNDVl9JT01NVV9SRUdf SU9IUE1FVlQoaWR4IC0gMSkpOworfQorCitzdGF0aWMgdm9pZCByaXNjdl9pb21tdV9wbXVfZW5h YmxlX2NvdW50ZXIoc3RydWN0IHJpc2N2X2lvbW11X3BtdSAqcG11LCB1MzIgaWR4KQoreworCXZv aWQgX19pb21lbSAqYWRkciA9IHBtdS0+cmVnICsgUklTQ1ZfSU9NTVVfUkVHX0lPQ09VTlRJTkg7 CisJdTMyIHZhbHVlID0gcmVhZGwoYWRkcik7CisKKwl3cml0ZWwodmFsdWUgJiB+QklUKGlkeCks IGFkZHIpOworfQorCitzdGF0aWMgdm9pZCByaXNjdl9pb21tdV9wbXVfZGlzYWJsZV9jb3VudGVy KHN0cnVjdCByaXNjdl9pb21tdV9wbXUgKnBtdSwgdTMyIGlkeCkKK3sKKwl2b2lkIF9faW9tZW0g KmFkZHIgPSBwbXUtPnJlZyArIFJJU0NWX0lPTU1VX1JFR19JT0NPVU5USU5IOworCXUzMiB2YWx1 ZSA9IHJlYWRsKGFkZHIpOworCisJd3JpdGVsKHZhbHVlIHwgQklUKGlkeCksIGFkZHIpOworfQor CitzdGF0aWMgdm9pZCByaXNjdl9pb21tdV9wbXVfY2xlYXJfb3ZmKHN0cnVjdCByaXNjdl9pb21t dV9wbXUgKnBtdSwgdTMyIGlkeCkKK3sKKwl1NjQgdmFsdWU7CisKKwkvKiBDb3VudGVyIGlzIGRp c2FibGVkIGhlcmUsIG1ha2luZyBpdCBzYWZlIHRvIHJlYWQgYW5kIHdyaXRlIHJlZ2lzdGVycyAq LworCWlmIChpZHggPT0gUklTQ1ZfSU9NTVVfSFBNX0NZQ0xFX0lEWCkgeworCQl2YWx1ZSA9IHJp c2N2X2lvbW11X3BtdV9yZWFkcShwbXUtPnJlZyArIFJJU0NWX0lPTU1VX1JFR19JT0hQTUNZQ0xF UykgJgorCQkJCQkgICAgICB+UklTQ1ZfSU9NTVVfSU9IUE1DWUNMRVNfT0Y7CisJCXJpc2N2X2lv bW11X3BtdV93cml0ZXEodmFsdWUsIHBtdS0+cmVnICsgUklTQ1ZfSU9NTVVfUkVHX0lPSFBNQ1lD TEVTKTsKKwl9IGVsc2UgeworCQkvKiBFdmVudCBjb3VudGVyIHN0YXJ0IGZyb20gaWR4IDEgKi8K KwkJdmFsdWUgPSByaXNjdl9pb21tdV9wbXVfcmVhZHEocG11LT5yZWcgKyBSSVNDVl9JT01NVV9S RUdfSU9IUE1FVlQoaWR4IC0gMSkpICYKKwkJCQkJICAgICAgflJJU0NWX0lPTU1VX0lPSFBNRVZU X09GOworCQlyaXNjdl9pb21tdV9wbXVfd3JpdGVxKHZhbHVlLCBwbXUtPnJlZyArIFJJU0NWX0lP TU1VX1JFR19JT0hQTUVWVChpZHggLSAxKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCByaXNjdl9p b21tdV9wbXVfc3RhcnRfYWxsKHN0cnVjdCByaXNjdl9pb21tdV9wbXUgKnBtdSwgdTMyIGluaGli aXQpCit7CisJd3JpdGVsKGluaGliaXQsIHBtdS0+cmVnICsgUklTQ1ZfSU9NTVVfUkVHX0lPQ09V TlRJTkgpOworfQorCisvKiBSZXR1cm5zIHRoZSBpbmhpYml0IHN0YXRlIHByaW9yIHRvIHN0b3Bw aW5nLCBzbyBjYWxsZXJzIGNhbiByZXN0b3JlIGl0IGxhdGVyICovCitzdGF0aWMgdTMyIHJpc2N2 X2lvbW11X3BtdV9zdG9wX2FsbChzdHJ1Y3QgcmlzY3ZfaW9tbXVfcG11ICpwbXUpCit7CisJdm9p ZCBfX2lvbWVtICphZGRyID0gcG11LT5yZWcgKyBSSVNDVl9JT01NVV9SRUdfSU9DT1VOVElOSDsK Kwl1MzIgaW5oaWJpdCA9IHJlYWRsKGFkZHIpOworCisJd3JpdGVsKEdFTk1BU0tfVTMyKHBtdS0+ bnVtX2NvdW50ZXJzIC0gMSwgMCksIGFkZHIpOworCisJcmV0dXJuIGluaGliaXQ7Cit9CisKKy8q IFBNVSBBUElzICovCitzdGF0aWMgdm9pZCByaXNjdl9pb21tdV9wbXVfc2V0X3BlcmlvZChzdHJ1 Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IHJpc2N2X2lvbW11X3BtdSAqcG11ID0g dG9fcmlzY3ZfaW9tbXVfcG11KGV2ZW50LT5wbXUpOworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpo d2MgPSAmZXZlbnQtPmh3OworCXU2NCBjb3VudGVyX21hc2sgPSBod2MtPmlkeCA/IHBtdS0+ZXZl bnRfY250cl9tYXNrIDogcG11LT5jeWNsZV9jbnRyX21hc2s7CisJdTY0IHBlcmlvZDsKKworCS8q CisJICogTGltaXQgdGhlIG1heGltdW0gcGVyaW9kIHRvIHByZXZlbnQgdGhlIGNvdW50ZXIgdmFs dWUKKwkgKiBmcm9tIG92ZXJ0YWtpbmcgdGhlIG9uZSB3ZSBhcmUgYWJvdXQgdG8gcHJvZ3JhbS4K KwkgKiBJbiBlZmZlY3Qgd2UgYXJlIHJlZHVjaW5nIG1heF9wZXJpb2QgdG8gYWNjb3VudCBmb3IK KwkgKiBpbnRlcnJ1cHQgbGF0ZW5jeSAoYW5kIHdlIGFyZSBiZWluZyB2ZXJ5IGNvbnNlcnZhdGl2 ZSkuCisJICovCisJcGVyaW9kID0gY291bnRlcl9tYXNrID4+IDE7CisJcmlzY3ZfaW9tbXVfcG11 X3NldF9jb3VudGVyKHBtdSwgaHdjLT5pZHgsIHBlcmlvZCk7CisJbG9jYWw2NF9zZXQoJmh3Yy0+ cHJldl9jb3VudCwgcGVyaW9kKTsKK30KKworLyoKKyAqIFRhbGx5IEBjb25maWcgYWdhaW5zdCB3 aGF0IHRoZSBoYXJkd2FyZSBpbXBsZW1lbnRzOiBvbmUgY3ljbGUgY291bnRlciBwbHVzCisgKiBw bXUtPm51bV9jb3VudGVycyAtIDEgZXZlbnQgY291bnRlcnMuIFJldHVybnMgZmFsc2Ugb25jZSB0 aGUgZ3JvdXAgd291bGQgbmVlZAorICogbW9yZSBvZiBlaXRoZXIgdGhhbiBleGlzdCwgc28gdGhh dCBncm91cHMgd2hpY2ggY291bGQgbmV2ZXIgYmUgc2NoZWR1bGVkIGFyZQorICogcmVqZWN0ZWQg aW4gLT5ldmVudF9pbml0KCkgaW5zdGVhZCBvZiBmYWlsaW5nIHdpdGggLUVBR0FJTiBpbiAtPmFk ZCgpIGZvcmV2ZXIuCisgKi8KK3N0YXRpYyBib29sIHJpc2N2X2lvbW11X3BtdV9jbGFpbV9jb3Vu dGVyKHN0cnVjdCByaXNjdl9pb21tdV9wbXUgKnBtdSwgdTY0IGNvbmZpZywKKwkJCQkJICB1bnNp Z25lZCBpbnQgKm5yX2N5Y2xlcywKKwkJCQkJICB1bnNpZ25lZCBpbnQgKm5yX2V2ZW50cykKK3sK KwlpZiAoaXNfY3ljbGVfZXZlbnQoY29uZmlnKSkKKwkJcmV0dXJuICsrKCpucl9jeWNsZXMpIDw9 IDE7CisKKwlyZXR1cm4gKysoKm5yX2V2ZW50cykgPD0gcG11LT5udW1fY291bnRlcnMgLSAxOwor fQorCitzdGF0aWMgaW50IHJpc2N2X2lvbW11X3BtdV9ldmVudF9pbml0KHN0cnVjdCBwZXJmX2V2 ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgcmlzY3ZfaW9tbXVfcG11ICpwbXUgPSB0b19yaXNjdl9p b21tdV9wbXUoZXZlbnQtPnBtdSk7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVu dC0+aHc7CisJc3RydWN0IHBlcmZfZXZlbnQgKnNpYmxpbmc7CisJdW5zaWduZWQgaW50IG5yX2N5 Y2xlcyA9IDA7CisJdW5zaWduZWQgaW50IG5yX2V2ZW50cyA9IDA7CisJaW50IG9uX2NwdTsKKwor CWlmIChldmVudC0+YXR0ci50eXBlICE9IGV2ZW50LT5wbXUtPnR5cGUpCisJCXJldHVybiAtRU5P RU5UOworCisJaWYgKGlzX3NhbXBsaW5nX2V2ZW50KGV2ZW50KSkKKwkJcmV0dXJuIC1FT1BOT1RT VVBQOworCisJaWYgKGV2ZW50LT5jcHUgPCAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkv KgorCSAqIFJlamVjdCBldmVudCBJRHMgdGhpcyBkcml2ZXIgZG9lcyBub3Qga25vdyBhYm91dC4g UHJvZ3JhbW1pbmcgb25lCisJICogaW50byBJT0hQTUVWVCB3b3VsZCBiZSBhY2NlcHRlZCBieSB0 aGUgaGFyZHdhcmUgYnV0IHdvdWxkIG5ldmVyCisJICogY291bnQgYW55dGhpbmcsIHdoaWNoIGlz IGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gaWRsZSBjb3VudGVyLgorCSAqLworCWlmIChnZXRf ZXZlbnQoZXZlbnQpID49IFJJU0NWX0lPTU1VX0hQTUVWRU5UX01BWCkKKwkJcmV0dXJuIC1FSU5W QUw7CisKKwkvKgorCSAqIFRoZXJlIGlzIG5vIElPSFBNRVZUIHJlZ2lzdGVyIGFzc29jaWF0ZWQg d2l0aCBJT0hQTUNZQ0xFUywgc28gbm9uZQorCSAqIG9mIHRoZSBmaWx0ZXJpbmcgZmllbGRzIGNh biBiZSBwcm9ncmFtbWVkIGZvciB0aGUgY3ljbGUgZXZlbnQuCisJICogUmVqZWN0IHRoZW0gaGVy ZSBpbnN0ZWFkIG9mIGNvdW50aW5nIHVuZmlsdGVyZWQgY3ljbGVzIGJlaGluZCB0aGUKKwkgKiB1 c2VyJ3MgYmFjay4KKwkgKi8KKwlpZiAoaXNfY3ljbGVfZXZlbnQoZXZlbnQtPmF0dHIuY29uZmln KSAmJgorCSAgICAoZXZlbnQtPmF0dHIuY29uZmlnICYgflJJU0NWX0lPTU1VX0lPSFBNRVZUX0VW RU5USUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogQWxsIGV2ZW50cyBhcmUgYm91 bmQgdG8gdGhlIENQVSB0aGUgaW50ZXJydXB0IGlzIGFmZmluZSB0by4gVGhhdAorCSAqIENQVSBp cyB1bnNldCB3aGlsZSBubyBvbmxpbmUgQ1BVIGNvdWxkIGJlIGZvdW5kIGZvciB0aGlzIFBNVSwg YW5kCisJICogYXNzaWduaW5nIC0xIGhlcmUgd291bGQgdHVybiB0aGlzIGludG8gYSB0YXNrIGJv dW5kIGV2ZW50LCB3aGljaCBpcworCSAqIG5vdCBzb21ldGhpbmcgdGhpcyBQTVUgY2FuIHNlcnZl LgorCSAqLworCW9uX2NwdSA9IHBtdS0+b25fY3B1OworCWlmIChvbl9jcHUgPCAwKQorCQlyZXR1 cm4gLUVOT0RFVjsKKworCWV2ZW50LT5jcHUgPSBvbl9jcHU7CisKKwlod2MtPmlkeCA9IC0xOwor CWh3Yy0+Y29uZmlnID0gZXZlbnQtPmF0dHIuY29uZmlnOworCisJLyoKKwkgKiBBY2NvdW50IGZv ciB0aGlzIGV2ZW50IGl0c2VsZiBmaXJzdC4gSXQgaGFzIHRvIGJlIGRvbmUgYmVmb3JlIHRoZQor CSAqIGNoZWNrIGJlbG93LCBvdGhlcndpc2UgYW4gZXZlbnQgd2hpY2ggaXMgb24gaXRzIG93biB3 b3VsZCBuZXZlciBiZQorCSAqIG1hdGNoZWQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGNvdW50ZXJz IHRoZSBoYXJkd2FyZSBpbXBsZW1lbnRzLgorCSAqLworCWlmICghcmlzY3ZfaW9tbXVfcG11X2Ns YWltX2NvdW50ZXIocG11LCBldmVudC0+YXR0ci5jb25maWcsCisJCQkJCSAgICZucl9jeWNsZXMs ICZucl9ldmVudHMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE9uIGl0cyBvd24sIHNvIHRo ZXJlIGlzIG5vIGdyb3VwIHRvIHZhbGlkYXRlICovCisJaWYgKGV2ZW50LT5ncm91cF9sZWFkZXIg PT0gZXZlbnQpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBTb2Z0d2FyZSBldmVudHMgbmV2ZXIg b2NjdXB5IGEgaGFyZHdhcmUgY291bnRlciwgc28gdGhleSBkbyBub3QgaGF2ZQorCSAqIHRvIHNp dCBvbiB0aGlzIHBtdSBhbmQgZG8gbm90IGNvbnN1bWUgYW55IG9mIGl0cyBidWRnZXQuIEFueXRo aW5nCisJICogZWxzZSBpbiB0aGUgZ3JvdXAgZG9lcywgc3RhcnRpbmcgd2l0aCB0aGUgbGVhZGVy LgorCSAqLworCWlmICghaXNfc29mdHdhcmVfZXZlbnQoZXZlbnQtPmdyb3VwX2xlYWRlcikpIHsK KwkJLyogQSBoYXJkd2FyZSBsZWFkZXIgaGFzIHRvIHNoYXJlIHRoaXMgcG11J3MgY291bnRlcnMg Ki8KKwkJaWYgKGV2ZW50LT5ncm91cF9sZWFkZXItPnBtdSAhPSBldmVudC0+cG11KQorCQkJcmV0 dXJuIC1FSU5WQUw7CisKKwkJaWYgKCFyaXNjdl9pb21tdV9wbXVfY2xhaW1fY291bnRlcihwbXUs CisJCQkJCQkgICBldmVudC0+Z3JvdXBfbGVhZGVyLT5hdHRyLmNvbmZpZywKKwkJCQkJCSAgICZu cl9jeWNsZXMsICZucl9ldmVudHMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkg KiBUaGVuIHRoZSByZXN0IG9mIHRoZSBncm91cC4gVGhpcyB3YWxrcyBncm91cF9sZWFkZXItPnNp YmxpbmdfbGlzdCwKKwkgKiB3aGljaCBkb2VzIG5vdCBjb250YWluIHRoZSBldmVudCBiZWluZyBp bml0aWFsaXNlZCB5ZXQgLSBoZW5jZQorCSAqIGFjY291bnRpbmcgZm9yIGl0IHNlcGFyYXRlbHkg YWJvdmUuCisJICovCisJZm9yX2VhY2hfc2libGluZ19ldmVudChzaWJsaW5nLCBldmVudC0+Z3Jv dXBfbGVhZGVyKSB7CisJCWlmIChpc19zb2Z0d2FyZV9ldmVudChzaWJsaW5nKSkKKwkJCWNvbnRp bnVlOworCisJCWlmIChzaWJsaW5nLT5wbXUgIT0gZXZlbnQtPnBtdSkKKwkJCXJldHVybiAtRUlO VkFMOworCisJCWlmICghcmlzY3ZfaW9tbXVfcG11X2NsYWltX2NvdW50ZXIocG11LCBzaWJsaW5n LT5hdHRyLmNvbmZpZywKKwkJCQkJCSAgICZucl9jeWNsZXMsICZucl9ldmVudHMpKQorCQkJcmV0 dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJpc2N2X2lv bW11X3BtdV91cGRhdGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBod19w ZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCXN0cnVjdCByaXNjdl9pb21tdV9wbXUgKnBt dSA9IHRvX3Jpc2N2X2lvbW11X3BtdShldmVudC0+cG11KTsKKwl1NjQgZGVsdGEsIHByZXYsIG5v dzsKKwl1MzIgaWR4ID0gaHdjLT5pZHg7CisJdTY0IGNvdW50ZXJfbWFzayA9IGlkeCA/IHBtdS0+ ZXZlbnRfY250cl9tYXNrIDogcG11LT5jeWNsZV9jbnRyX21hc2s7CisKKwlkbyB7CisJCXByZXYg PSBsb2NhbDY0X3JlYWQoJmh3Yy0+cHJldl9jb3VudCk7CisJCW5vdyA9IHJpc2N2X2lvbW11X3Bt dV9nZXRfY291bnRlcihwbXUsIGlkeCk7CisJfSB3aGlsZSAobG9jYWw2NF9jbXB4Y2hnKCZod2Mt PnByZXZfY291bnQsIHByZXYsIG5vdykgIT0gcHJldik7CisKKwlkZWx0YSA9IChub3cgLSBwcmV2 KSAmIGNvdW50ZXJfbWFzazsKKwlsb2NhbDY0X2FkZChkZWx0YSwgJmV2ZW50LT5jb3VudCk7Cit9 CisKK3N0YXRpYyB2b2lkIHJpc2N2X2lvbW11X3BtdV9zdGFydChzdHJ1Y3QgcGVyZl9ldmVudCAq ZXZlbnQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgcmlzY3ZfaW9tbXVfcG11ICpwbXUgPSB0b19y aXNjdl9pb21tdV9wbXUoZXZlbnQtPnBtdSk7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9 ICZldmVudC0+aHc7CisKKwlpZiAoV0FSTl9PTl9PTkNFKCEoZXZlbnQtPmh3LnN0YXRlICYgUEVS Rl9IRVNfU1RPUFBFRCkpKQorCQlyZXR1cm47CisKKwlpZiAoZmxhZ3MgJiBQRVJGX0VGX1JFTE9B RCkKKwkJV0FSTl9PTl9PTkNFKCEoZXZlbnQtPmh3LnN0YXRlICYgUEVSRl9IRVNfVVBUT0RBVEUp KTsKKworCWh3Yy0+c3RhdGUgPSAwOworCXJpc2N2X2lvbW11X3BtdV9zZXRfcGVyaW9kKGV2ZW50 KTsKKwlyaXNjdl9pb21tdV9wbXVfc2V0X2V2ZW50KHBtdSwgaHdjLT5pZHgsIGh3Yy0+Y29uZmln KTsKKwlyaXNjdl9pb21tdV9wbXVfZW5hYmxlX2NvdW50ZXIocG11LCBod2MtPmlkeCk7CisKKwlw ZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIHJpc2N2 X2lvbW11X3BtdV9zdG9wKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQorewor CXN0cnVjdCByaXNjdl9pb21tdV9wbXUgKnBtdSA9IHRvX3Jpc2N2X2lvbW11X3BtdShldmVudC0+ cG11KTsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKwlpbnQgaWR4 ID0gaHdjLT5pZHg7CisKKwlpZiAoaHdjLT5zdGF0ZSAmIFBFUkZfSEVTX1NUT1BQRUQpCisJCXJl dHVybjsKKworCXJpc2N2X2lvbW11X3BtdV9kaXNhYmxlX2NvdW50ZXIocG11LCBpZHgpOworCisJ aWYgKChmbGFncyAmIFBFUkZfRUZfVVBEQVRFKSAmJiAhKGh3Yy0+c3RhdGUgJiBQRVJGX0hFU19V UFRPREFURSkpCisJCXJpc2N2X2lvbW11X3BtdV91cGRhdGUoZXZlbnQpOworCisJaHdjLT5zdGF0 ZSB8PSBQRVJGX0hFU19TVE9QUEVEIHwgUEVSRl9IRVNfVVBUT0RBVEU7Cit9CisKK3N0YXRpYyBp bnQgcmlzY3ZfaW9tbXVfcG11X2FkZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFn cykKK3sKKwlzdHJ1Y3QgcmlzY3ZfaW9tbXVfcG11ICpwbXUgPSB0b19yaXNjdl9pb21tdV9wbXUo ZXZlbnQtPnBtdSk7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisJ dW5zaWduZWQgaW50IG51bV9jb3VudGVycyA9IHBtdS0+bnVtX2NvdW50ZXJzOworCXVuc2lnbmVk IGludCBpZHg7CisKKwkvKiBSZXNlcnZlIGluZGV4IHplcm8gZm9yIGlvaHBtY3ljbGVzICovCisJ aWYgKGlzX2N5Y2xlX2V2ZW50KGV2ZW50LT5hdHRyLmNvbmZpZykpCisJCWlkeCA9IFJJU0NWX0lP TU1VX0hQTV9DWUNMRV9JRFg7CisJZWxzZQorCQlpZHggPSBmaW5kX25leHRfemVyb19iaXQocG11 LT51c2VkX2NvdW50ZXJzLCBudW1fY291bnRlcnMsIDEpOworCisJLyogQWxsIGV2ZW50IGNvdW50 ZXJzIG9yIGN5Y2xlIGNvdW50ZXIgYXJlIGluIHVzZSAqLworCWlmIChpZHggPT0gbnVtX2NvdW50 ZXJzIHx8IHBtdS0+ZXZlbnRzW2lkeF0pCisJCXJldHVybiAtRUFHQUlOOworCisJc2V0X2JpdChp ZHgsIHBtdS0+dXNlZF9jb3VudGVycyk7CisKKwlwbXUtPmV2ZW50c1tpZHhdID0gZXZlbnQ7CisJ aHdjLT5pZHggPSBpZHg7CisJaHdjLT5zdGF0ZSA9IFBFUkZfSEVTX1NUT1BQRUQgfCBQRVJGX0hF U19VUFRPREFURTsKKwlsb2NhbDY0X3NldCgmaHdjLT5wcmV2X2NvdW50LCAwKTsKKworCWlmIChm bGFncyAmIFBFUkZfRUZfU1RBUlQpCisJCXJpc2N2X2lvbW11X3BtdV9zdGFydChldmVudCwgZmxh Z3MpOworCisJLyogUHJvcGFnYXRlIGNoYW5nZXMgdG8gdGhlIHVzZXJzcGFjZSBtYXBwaW5nLiAq LworCXBlcmZfZXZlbnRfdXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgdm9pZCByaXNjdl9pb21tdV9wbXVfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZl bnQpCit7CisJcmlzY3ZfaW9tbXVfcG11X3VwZGF0ZShldmVudCk7Cit9CisKK3N0YXRpYyB2b2lk IHJpc2N2X2lvbW11X3BtdV9kZWwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3Mp Cit7CisJc3RydWN0IHJpc2N2X2lvbW11X3BtdSAqcG11ID0gdG9fcmlzY3ZfaW9tbXVfcG11KGV2 ZW50LT5wbXUpOworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCWlu dCBpZHggPSBod2MtPmlkeDsKKworCXJpc2N2X2lvbW11X3BtdV9zdG9wKGV2ZW50LCBQRVJGX0VG X1VQREFURSk7CisJcG11LT5ldmVudHNbaWR4XSA9IE5VTEw7CisJY2xlYXJfYml0KGlkeCwgcG11 LT51c2VkX2NvdW50ZXJzKTsKKworCXBlcmZfZXZlbnRfdXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsK K30KKworLyoKKyAqIEJpbmQgdGhlIGV2ZW50cyBhbmQgdGhlIGludGVycnVwdCB0byB0aGUgc2Ft ZSBDUFU6IHRoZSBvdmVyZmxvdyBoYW5kbGVyCisgKiByZWxpZXMgb24gcnVubmluZyBvbiBwbXUt Pm9uX2NwdSB0byBiZSBzZXJpYWxpc2VkIGFnYWluc3QgdGhlIHBlcmYKKyAqIGNhbGxiYWNrcywg c28gdGhlIHR3byBtdXN0IG5vdCBkcmlmdCBhcGFydC4gT25seSBjb25zaWRlciBDUFVzIHdoaWNo IHRoZQorICogaXJxY2hpcCBhY3R1YWxseSBhY2NlcHRzIC0gY29tbWl0dGluZyBvbl9jcHUgdG8g YSBDUFUgd2hpY2gKKyAqIGlycV9zZXRfYWZmaW5pdHkoKSB0aGVuIHJlamVjdHMgd291bGQgbGVh dmUgdGhlIGhhbmRsZXIgcGVybWFuZW50bHkgb24gdGhlCisgKiB3cm9uZyBDUFUgd2l0aCBub3Ro aW5nIGxlZnQgdG8gY29ycmVjdCBpdC4KKyAqCisgKiBjcHVtYXNrX2xvY2FsX3NwcmVhZCgpIHdh bGtzIHRoZSBvbmxpbmUgQ1BVcyBpbiBvcmRlciBvZiBOVU1BIGRpc3RhbmNlIGZyb20KKyAqIHRo ZSBpb21tdSwgc28gdGhlIGNsb3Nlc3QgdXNhYmxlIG9uZSB3aW5zLgorICoKKyAqIFJldHVybnMg dGhlIGNob3NlbiBDUFUsIG9yIG5yX2NwdV9pZHMgaWYgbm9uZSBjb3VsZCBiZSB1c2VkLgorICov CitzdGF0aWMgdW5zaWduZWQgaW50IHJpc2N2X2lvbW11X3BtdV9iaW5kX2NwdShzdHJ1Y3Qgcmlz Y3ZfaW9tbXVfcG11ICpwbXUsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHNraXBfY3B1KQorewor CXVuc2lnbmVkIGludCBjcHUsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX29ubGluZV9jcHVz KCk7IGkrKykgeworCQljcHUgPSBjcHVtYXNrX2xvY2FsX3NwcmVhZChpLCBwbXUtPm51bWFfbm9k ZSk7CisJCWlmIChjcHUgPT0gc2tpcF9jcHUpCisJCQljb250aW51ZTsKKwkJaWYgKCFpcnFfc2V0 X2FmZmluaXR5KHBtdS0+aXJxLCBjcHVtYXNrX29mKGNwdSkpKQorCQkJcmV0dXJuIGNwdTsKKwl9 CisKKwlyZXR1cm4gbnJfY3B1X2lkczsKK30KKworc3RhdGljIGludCByaXNjdl9pb21tdV9wbXVf b25saW5lX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKK3sK KwlzdHJ1Y3QgcmlzY3ZfaW9tbXVfcG11ICppb21tdV9wbXU7CisJdW5zaWduZWQgaW50IHRhcmdl dF9jcHU7CisKKwlpb21tdV9wbXUgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCByaXNj dl9pb21tdV9wbXUsIG5vZGUpOworCisJaWYgKFJFQURfT05DRShpb21tdV9wbXUtPm9uX2NwdSkg IT0gLTEpCisJCXJldHVybiAwOworCisJdGFyZ2V0X2NwdSA9IHJpc2N2X2lvbW11X3BtdV9iaW5k X2NwdShpb21tdV9wbXUsIG5yX2NwdV9pZHMpOworCWlmICh0YXJnZXRfY3B1ID49IG5yX2NwdV9p ZHMpIHsKKwkJLyogb25fY3B1IHN0YXlzIHVuc2V0LCBzbyBhIGxhdGVyIGNhbGxiYWNrIHRyaWVz IGFnYWluICovCisJCXByX2RlYnVnKCJmYWlsZWQgdG8gcG9pbnQgaXJxICV1IGF0IGFueSBvbmxp bmUgY3B1XG4iLAorCQkJIGlvbW11X3BtdS0+aXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJV1JJ VEVfT05DRShpb21tdV9wbXUtPm9uX2NwdSwgdGFyZ2V0X2NwdSk7CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGludCByaXNjdl9pb21tdV9wbXVfb2ZmbGluZV9jcHUodW5zaWduZWQgaW50IGNw dSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJpc2N2X2lvbW11X3BtdSAq aW9tbXVfcG11OworCXVuc2lnbmVkIGludCB0YXJnZXRfY3B1OworCisJaW9tbXVfcG11ID0gaGxp c3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgcmlzY3ZfaW9tbXVfcG11LCBub2RlKTsKKworCWlm IChSRUFEX09OQ0UoaW9tbXVfcG11LT5vbl9jcHUpICE9IChpbnQpY3B1KQorCQlyZXR1cm4gMDsK KworCS8qCisJICogVGhlIGxhc3Qgb25saW5lIENQVSBjYW5ub3QgYmUgdGFrZW4gb2ZmbGluZSwg YW5kIHRoaXMgY2FsbGJhY2sgcnVucworCSAqIGJlZm9yZSBfX2NwdV9kaXNhYmxlKCkgY2xlYXJz IHRoZSBvdXRnb2luZyBDUFUgZnJvbSBjcHVfb25saW5lX21hc2ssCisJICogc28gdGhlcmUgaXMg YWx3YXlzIGFub3RoZXIgb25saW5lIENQVSB0byBtb3ZlIHRvLgorCSAqCisJICogU2hvdWxkIHRo YXQgZXZlciBmYWlsLCB1bnNldCBvbl9jcHUgcmF0aGVyIHRoYW4gbGVhdmluZyBpdCBwb2ludGlu ZyBhdAorCSAqIHRoZSBDUFUgd2hpY2ggaXMgZ29pbmcgYXdheS4gVGhhdCBrZWVwcyBldmVudHMg ZnJvbSBiZWluZyBib3VuZCB0byBhCisJICogZGVhZCBDUFUgYW5kIGxldHMgcmlzY3ZfaW9tbXVf cG11X29ubGluZV9jcHUoKSBwaWNrIGFnYWluIG9uY2UgYSBDUFUKKwkgKiBjb21lcyBiYWNrLgor CSAqLworCXRhcmdldF9jcHUgPSByaXNjdl9pb21tdV9wbXVfYmluZF9jcHUoaW9tbXVfcG11LCBj cHUpOworCWlmIChXQVJOX09OX09OQ0UodGFyZ2V0X2NwdSA+PSBucl9jcHVfaWRzKSkgeworCQlX UklURV9PTkNFKGlvbW11X3BtdS0+b25fY3B1LCAtMSk7CisJfSBlbHNlIHsKKwkJV1JJVEVfT05D RShpb21tdV9wbXUtPm9uX2NwdSwgdGFyZ2V0X2NwdSk7CisJCXBlcmZfcG11X21pZ3JhdGVfY29u dGV4dCgmaW9tbXVfcG11LT5wbXUsIGNwdSwgdGFyZ2V0X2NwdSk7CisJfQorCisJcmV0dXJuIDA7 Cit9CisKKy8qCisgKiBNdXN0IHJ1biBvbiBwbXUtPm9uX2NwdSB3aXRoIGludGVycnVwdHMgZGlz YWJsZWQuCisgKiBUaGF0IGlzIHdoYXQgc2VyaWFsaXNlcyBpdCBhZ2FpbnN0IHRoZSBwZXJmIGNh bGxiYWNrcywgYW5kIGlzIHdoeSBub25lCisgKiBvZiB0aGUgc3RhdGUgYmVsb3cgbmVlZHMgYSBs b2NrLgorICovCitzdGF0aWMgdm9pZCByaXNjdl9pb21tdV9wbXVfcHJvY2Vzc19vdmVyZmxvdyhz dHJ1Y3QgcmlzY3ZfaW9tbXVfcG11ICpwbXUpCit7CisJREVDTEFSRV9CSVRNQVAob3ZmX2JpdG1h cCwgQklUU19QRVJfVFlQRSh1NjQpKTsKKwl1MzIgb3ZmLCBpZHgsIGluaGliaXQ7CisKKwlpbmhp Yml0ID0gcmlzY3ZfaW9tbXVfcG11X3N0b3BfYWxsKHBtdSk7CisKKwlvdmYgPSByZWFkbChwbXUt PnJlZyArIFJJU0NWX0lPTU1VX1JFR19JT0NPVU5UT1ZGKTsKKwlpZiAob3ZmKSB7CisJCWJpdG1h cF9mcm9tX3U2NChvdmZfYml0bWFwLCBvdmYpOworCQlmb3JfZWFjaF9zZXRfYml0KGlkeCwgb3Zm X2JpdG1hcCwgcG11LT5udW1fY291bnRlcnMpIHsKKwkJCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVu dCA9IHBtdS0+ZXZlbnRzW2lkeF07CisKKwkJCS8qCisJCQkgKiBwbXUtPmV2ZW50c1tpZHhdIG9u bHkgbWVhbnMgdGhlIGNvdW50ZXIgaXMgYWxsb2NhdGVkLAorCQkJICogbm90IHRoYXQgaXQgaXMg Y291bnRpbmcuIEEgY291bnRlciB3aGljaCBoYXMgbm90IGJlZW4KKwkJCSAqIHN0YXJ0ZWQgaGFz IG5vIHZhbGlkIHByZXZfY291bnQgdG8gY29tcHV0ZSBhIGRlbHRhCisJCQkgKiBhZ2FpbnN0LCBh bmQgb25lIHdoaWNoIGhhcyBiZWVuIHN0b3BwZWQgbXVzdCBub3QgYmUKKwkJCSAqIHJlcHJvZ3Jh bW1lZCBoZXJlLiBUaGUgb3ZlcmZsb3cgYml0IHN0aWxsIGhhcyB0byBiZQorCQkJICogY2xlYXJl ZCBiZWxvdyBpbiBlaXRoZXIgY2FzZSwgaW5jbHVkaW5nIHdoZW4gdGhlIGV2ZW50CisJCQkgKiB3 YXMgYWxyZWFkeSByZW1vdmVkIGJ5IHJpc2N2X2lvbW11X3BtdV9kZWwoKSwKKwkJCSAqIG90aGVy d2lzZSB0aGUgaW50ZXJydXB0IHdvdWxkIHN0YXkgcGVuZGluZyBmb3JldmVyLgorCQkJICovCisJ CQlpZiAoZXZlbnQgJiYgIShldmVudC0+aHcuc3RhdGUgJiBQRVJGX0hFU19TVE9QUEVEKSkgewor CQkJCXJpc2N2X2lvbW11X3BtdV91cGRhdGUoZXZlbnQpOworCQkJCXJpc2N2X2lvbW11X3BtdV9z ZXRfcGVyaW9kKGV2ZW50KTsKKwkJCX0KKworCQkJcmlzY3ZfaW9tbXVfcG11X2NsZWFyX292Zihw bXUsIGlkeCk7CisJCX0KKwl9CisKKwkvKiBDbGVhciBwZXJmb3JtYW5jZSBtb25pdG9yaW5nIGlu dGVycnVwdCBwZW5kaW5nIGJpdCAqLworCXdyaXRlbF9yZWxheGVkKFJJU0NWX0lPTU1VX0lQU1Jf UE1JUCwgcG11LT5yZWcgKyBSSVNDVl9JT01NVV9SRUdfSVBTUik7CisKKwlyaXNjdl9pb21tdV9w bXVfc3RhcnRfYWxsKHBtdSwgaW5oaWJpdCk7Cit9CisKK3N0YXRpYyB2b2lkIHJpc2N2X2lvbW11 X3BtdV93b3JrKHN0cnVjdCBpcnFfd29yayAqd29yaykKK3sKKwlzdHJ1Y3QgcmlzY3ZfaW9tbXVf cG11ICpwbXUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHJpc2N2X2lvbW11X3BtdSwgd29y ayk7CisKKwlyaXNjdl9pb21tdV9wbXVfcHJvY2Vzc19vdmVyZmxvdyhwbXUpOworfQorCitzdGF0 aWMgaXJxcmV0dXJuX3QgcmlzY3ZfaW9tbXVfcG11X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQg KmRldl9pZCkKK3sKKwlzdHJ1Y3QgcmlzY3ZfaW9tbXVfcG11ICpwbXUgPSAoc3RydWN0IHJpc2N2 X2lvbW11X3BtdSAqKWRldl9pZDsKKwlpbnQgdGFyZ2V0X2NwdTsKKworCS8qIENoZWNrIHdoZXRo ZXIgdGhpcyBpbnRlcnJ1cHQgaXMgZm9yIFBNVSAqLworCWlmICghKHJlYWRsX3JlbGF4ZWQocG11 LT5yZWcgKyBSSVNDVl9JT01NVV9SRUdfSVBTUikgJiBSSVNDVl9JT01NVV9JUFNSX1BNSVApKQor CQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKgorCSAqIFBDSSBNU0kvTVNJLVggb24gSU1TSUMgc2V0 cyBJUlFDSElQX01PVkVfREVGRVJSRUQsIHNvCisJICogaXJxX3NldF9hZmZpbml0eSgpIHJlcG9y dHMgc3VjY2VzcyB3aGlsZSBvbmx5IHJlY29yZGluZyB0aGUgcmVxdWVzdAorCSAqIGFuZCB0aGUg bW92ZSBpcyBhcHBsaWVkIGxhdGVyLCBpbiBpbnRlcnJ1cHQgY29udGV4dC4gVW50aWwgdGhlbiB0 aGUKKwkgKiBpbnRlcnJ1cHQgaXMgc3RpbGwgcm91dGVkIHRvIHRoZSBDUFUgdGhlIGlycWNoaXAg cGlja2VkIGluaXRpYWxseSwKKwkgKiB3aGljaCBpcyBub3QgdGhlIENQVSB0aGUgZXZlbnRzIGFy ZSBib3VuZCB0by4KKwkgKgorCSAqIEhhbmQgdGhlIGNvdW50ZXJzIG92ZXIgdG8gdGhhdCBDUFUg aW5zdGVhZCBvZiB0b3VjaGluZyB0aGVtIGhlcmUuCisJICogRGVsaWJlcmF0ZWx5IGxlYXZlIHRo ZSBoYXJkd2FyZSBhbG9uZTogdGhlIGlvbW11IG9ubHkgcmFpc2VzIGEgbmV3CisJICogaW50ZXJy dXB0IG9uIGEgMC0+MSB0cmFuc2l0aW9uIG9mIGJvdGggdGhlIGNvdW50ZXIncyBvdmVyZmxvdyBi aXQgYW5kCisJICogaXBzci5wbWlwLCBzbyBjbGVhcmluZyBlaXRoZXIgb25lIGhlcmUgd291bGQg bG9zZSB0aGUgb3ZlcmZsb3csIGFuZAorCSAqIGxlYXZpbmcgdGhlbSBzZXQgbWVhbnMgbm8gZnVy dGhlciBpbnRlcnJ1cHQgY2FuIGFycml2ZSB3aGlsZSB0aGUgd29yaworCSAqIGlzIHBlbmRpbmcu CisJICovCisJdGFyZ2V0X2NwdSA9IFJFQURfT05DRShwbXUtPm9uX2NwdSk7CisJaWYgKHRhcmdl dF9jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpICYmIHRhcmdldF9jcHUgPj0gMCAmJgorCSAgICBj cHVfb25saW5lKHRhcmdldF9jcHUpKSB7CisJCWlycV93b3JrX3F1ZXVlX29uKCZwbXUtPndvcmss IHRhcmdldF9jcHUpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJLyoKKwkgKiBFaXRo ZXIgdGhpcyBpcyB0aGUgYm91bmQgQ1BVLCBvciB0aGVyZSBpcyBubyB1c2FibGUgb25lIHRvIGRl ZmVyIHRvLgorCSAqIEluIHRoZSBsYXR0ZXIgY2FzZSBoYW5kbGUgaXQgaGVyZSBhbnl3YXk6IG5v Ym9keSBlbHNlIGlzIGdvaW5nIHRvCisJICogY2xlYXIgaXBzci5wbWlwLCBhbmQgd2l0aG91dCB0 aGF0IHRoZSBwbXUgd291bGQgc3RvcCByZXBvcnRpbmcgZm9yCisJICogZ29vZC4KKwkgKi8KKwly aXNjdl9pb21tdV9wbXVfcHJvY2Vzc19vdmVyZmxvdyhwbXUpOworCisJcmV0dXJuIElSUV9IQU5E TEVEOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJpc2N2X2lvbW11X3BtdV9nZXRfaXJxX251 bShzdHJ1Y3QgcmlzY3ZfaW9tbXVfZGV2aWNlICppb21tdSkKK3sKKwkvKiBSZXVzZSBJQ1ZFQy5D SVYgbWFzayBmb3IgYWxsIGludGVycnVwdCB2ZWN0b3JzIG1hcHBpbmcgKi8KKwlpbnQgdmVjID0g KGlvbW11LT5pY3ZlYyA+PiAoUklTQ1ZfSU9NTVVfSU5UUl9QTSAqIDQpKSAmIFJJU0NWX0lPTU1V X0lDVkVDX0NJVjsKKworCXJldHVybiBpb21tdS0+aXJxc1t2ZWNdOworfQorCitzdGF0aWMgaW50 IHJpc2N2X2lvbW11X3BtdV9yZXF1ZXN0X2lycShzdHJ1Y3QgYXV4aWxpYXJ5X2RldmljZSAqYXV4 ZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgcmlzY3ZfaW9tbXVfZGV2aWNlICppb21tdSwKKwkJCQkg ICAgICAgc3RydWN0IHJpc2N2X2lvbW11X3BtdSAqcG11KQoreworCS8qCisJICogQmluZCB0aGUg aGFuZGxlciB0byB0aGUgYXV4aWxpYXJ5IGRldmljZSwgd2hpY2ggaXMgdGhlIHNhbWUgZGV2cmVz CisJICogc2NvcGUgdGhhdCBmcmVlcyBAcG11LiBSZXF1ZXN0aW5nIGl0IG9uIHRoZSBwYXJlbnQg aW9tbXUgZGV2aWNlCisJICogd291bGQga2VlcCB0aGUgaGFuZGxlciByZWdpc3RlcmVkIHdpdGgg YSBkYW5nbGluZyBkZXZfaWQgb25jZSBAcG11CisJICogaXMgZnJlZWQsIGVpdGhlciBvbiBhIGxh dGVyIHByb2JlIGZhaWx1cmUgb3Igb24gZGV2aWNlIHJlbW92YWwuCisJICoKKwkgKiBJUlFGX1NI QVJFRCBpcyByZXF1aXJlZCBiZWNhdXNlIElDVkVDIG1hcHMgdGhlIHBlcmZvcm1hbmNlCisJICog bW9uaXRvcmluZyBzb3VyY2Ugb250byBvbmUgb2YgdGhlIHZlY3RvcnMgdGhlIGlvbW11IGRyaXZl ciBhbHJlYWR5CisJICogcmVxdWVzdGVkIGZvciBpdHMgcXVldWVzIHdoZW5ldmVyIGZld2VyIHRo YW4gUklTQ1ZfSU9NTVVfSU5UUl9DT1VOVAorCSAqIHZlY3RvcnMgYXJlIGF2YWlsYWJsZS4gQm90 aCByZXF1ZXN0ZXJzIGhhdmUgdG8gYWdyZWUgb24gc2hhcmluZywgb3IKKwkgKiB0aGlzIG9uZSBp cyByZWplY3RlZCB3aXRoIC1FQlVTWS4gSVJRRl9PTkVTSE9UIGRvZXMgbm90IGhhdmUgdG8gYmUK KwkgKiBtYXRjaGVkIGJ5IGhhbmQ6IGRldm1fcmVxdWVzdF9pcnEoKSBhZGRzIElSUUZfQ09ORF9P TkVTSE9ULCBzbyB0aGlzCisJICogaGFuZGxlciBhZG9wdHMgd2hhdGV2ZXIgdGhlIGZpcnN0IHJl cXVlc3RlciBwaWNrZWQuCisJICovCisJcmV0dXJuIGRldm1fcmVxdWVzdF9pcnEoJmF1eGRldi0+ ZGV2LCBwbXUtPmlycSwgcmlzY3ZfaW9tbXVfcG11X2lycV9oYW5kbGVyLAorCQkJCUlSUUZfU0hB UkVEIHwgSVJRRl9OT0JBTEFOQ0lORywKKwkJCQlkZXZfbmFtZShpb21tdS0+ZGV2KSwgcG11KTsK K30KKworc3RhdGljIHZvaWQgcmlzY3ZfaW9tbXVfcG11X2ZsdXNoX3dvcmsodm9pZCAqZGF0YSkK K3sKKwlzdHJ1Y3QgcmlzY3ZfaW9tbXVfcG11ICpwbXUgPSBkYXRhOworCisJaXJxX3dvcmtfc3lu YygmcG11LT53b3JrKTsKK30KKworc3RhdGljIHZvaWQgcmlzY3ZfaW9tbXVfcG11X3JlbW92ZV9j cHVocF9pbnN0YW5jZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCByaXNjdl9pb21tdV9wbXUgKnBt dSA9IGRhdGE7CisKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyhjcHVocF9z dGF0ZSwgJnBtdS0+bm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJpc2N2X2lvbW11X3BtdV9kb191 bnJlZ2lzdGVyKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJpc2N2X2lvbW11X3BtdSAqcG11ID0g ZGF0YTsKKworCXBlcmZfcG11X3VucmVnaXN0ZXIoJnBtdS0+cG11KTsKK30KKworc3RhdGljIGlu dCByaXNjdl9pb21tdV9wbXVfcHJvYmUoc3RydWN0IGF1eGlsaWFyeV9kZXZpY2UgKmF1eGRldiwK KwkJCQkgY29uc3Qgc3RydWN0IGF1eGlsaWFyeV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBy aXNjdl9pb21tdV9kZXZpY2UgKmlvbW11X2RldiA9IGRldl9nZXRfcGxhdGRhdGEoJmF1eGRldi0+ ZGV2KTsKKwlzdHJ1Y3QgcmlzY3ZfaW9tbXVfcG11ICppb21tdV9wbXU7CisJdm9pZCBfX2lvbWVt ICphZGRyOworCWNoYXIgKm5hbWU7CisJaW50IHJldDsKKworCWlvbW11X3BtdSA9IGRldm1fa3ph bGxvYygmYXV4ZGV2LT5kZXYsIHNpemVvZigqaW9tbXVfcG11KSwgR0ZQX0tFUk5FTCk7CisJaWYg KCFpb21tdV9wbXUpCisJCXJldHVybiAtRU5PTUVNOworCisJaW9tbXVfcG11LT5yZWcgPSBpb21t dV9kZXYtPnJlZzsKKworCS8qCisJICogQ291bnRlciBudW1iZXIgYW5kIHdpZHRoIGFyZSBoYXJk d2FyZS1pbXBsZW1lbnRlZCwgZGV0ZWN0IHRoZW0gYnkKKwkgKiB3cml0aW5nIDFzIGFuZCByZWFk aW5nIGJhY2sgd2hpY2ggYml0cyBzdHVjay4KKwkgKgorCSAqIFRoZSBzcGVjaWZpY2F0aW9uIHJl cXVpcmVzIGEgbWluaW11bSBvZiBvbmUgcHJvZ3JhbW1hYmxlIGV2ZW50CisJICogY291bnRlciBi ZXNpZGVzIHRoZSBjeWNsZXMgY291bnRlciB3aGVuIGNhcGFiaWxpdGllcy5IUE0gaXMgMSwKKwkg KiB3aGljaCBpcyB0aGUgY29uZGl0aW9uIHVuZGVyIHdoaWNoIHRoaXMgZGV2aWNlIGlzIGNyZWF0 ZWQuIFNvIGEKKwkgKiBjb21wbGlhbnQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJlcG9ydHMgYXQg bGVhc3QgdHdvIGNvdW50ZXJzLCBhbmQKKwkgKiBib3RoIElPSFBNQ1lDTEVTIGFuZCB0aGUgZmly c3QgSU9IUE1DVFIgYXJlIGFsd2F5cyBwcmVzZW50LiBBCisJICogcmVhZGJhY2sgd2hpY2ggc2F5 cyBvdGhlcndpc2UgaXMgbm9uLWNvbXBsaWFudCBoYXJkd2FyZSBhbmQgaXMKKwkgKiByZWplY3Rl ZCByYXRoZXIgdGhhbiB3b3JrZWQgYXJvdW5kLgorCSAqCisJICogVGhlIGltcGxlbWVudGVkIGNv dW50ZXJzIGFyZSBhc3N1bWVkIHRvIGJlIGNvbnNlY3V0aXZlLCBzbyB0aGF0CisJICogaHdlaWdo dDMyKCkgb2YgdGhlIElPQ09VTlRJTkggcmVhZGJhY2sgY2FuIGJlIHVzZWQgYXMgdGhlIGJvdW5k IG9uCisJICogdmFsaWQgY291bnRlciBpbmRpY2VzLgorCSAqCisJICogVGhlIGNvdW50ZXIgbWFz a3MgYXJlIGFsc28gYXNzdW1lZCB0byBiZSBhIGNvbnRpZ3VvdXMgcnVuIG9mIGJpdHMKKwkgKiBz dGFydGluZyBhdCBiaXQgMCwgd2hpY2ggaXMgd2hhdCByaXNjdl9pb21tdV9wbXVfdXBkYXRlKCkg cmVsaWVzIG9uCisJICogd2hlbiBpdCBtYXNrcyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc2FtcGxl cyB0byBoYW5kbGUgd3JhcGFyb3VuZC4KKwkgKi8KKwlhZGRyID0gaW9tbXVfcG11LT5yZWcgKyBS SVNDVl9JT01NVV9SRUdfSU9DT1VOVElOSDsKKwl3cml0ZWwoUklTQ1ZfSU9NTVVfSU9DT1VOVElO SF9IUE0sIGFkZHIpOworCWlvbW11X3BtdS0+bnVtX2NvdW50ZXJzID0gaHdlaWdodDMyKHJlYWRs KGFkZHIpKTsKKwlpZiAoaW9tbXVfcG11LT5udW1fY291bnRlcnMgPCAyKSB7CisJCWRldl9lcnIo JmF1eGRldi0+ZGV2LCAiaGFyZHdhcmUgcmVwb3J0cyAldSBjb3VudGVyKHMpXG4iLAorCQkJaW9t bXVfcG11LT5udW1fY291bnRlcnMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBCaXQg NjMgb2YgSU9IUE1DWUNMRVMgaXMgdGhlIE9GIGJpdCwgbm90IHBhcnQgb2YgdGhlIGNvdW50ZXIg Ki8KKwlhZGRyID0gaW9tbXVfcG11LT5yZWcgKyBSSVNDVl9JT01NVV9SRUdfSU9IUE1DWUNMRVM7 CisJcmlzY3ZfaW9tbXVfcG11X3dyaXRlcShSSVNDVl9JT01NVV9JT0hQTUNZQ0xFU19DT1VOVEVS LCBhZGRyKTsKKwlpb21tdV9wbXUtPmN5Y2xlX2NudHJfbWFzayA9IHJpc2N2X2lvbW11X3BtdV9y ZWFkcShhZGRyKSAmCisJCQkJICAgICBSSVNDVl9JT01NVV9JT0hQTUNZQ0xFU19DT1VOVEVSOwor CWlmICghaW9tbXVfcG11LT5jeWNsZV9jbnRyX21hc2spIHsKKwkJZGV2X2VycigmYXV4ZGV2LT5k ZXYsICJjeWNsZXMgY291bnRlciBpcyBub3QgaW1wbGVtZW50ZWRcbiIpOworCQlyZXR1cm4gLUVO T0RFVjsKKwl9CisKKwkvKiBBc3N1bWUgdGhlIHdpZHRoIG9mIGFsbCBldmVudCBjb3VudGVycyBh cmUgdGhlIHNhbWUgKi8KKwlhZGRyID0gaW9tbXVfcG11LT5yZWcgKyBSSVNDVl9JT01NVV9SRUdf SU9IUE1DVFJfQkFTRTsKKwlyaXNjdl9pb21tdV9wbXVfd3JpdGVxKFJJU0NWX0lPTU1VX0lPSFBN Q1RSX0NPVU5URVIsIGFkZHIpOworCWlvbW11X3BtdS0+ZXZlbnRfY250cl9tYXNrID0gcmlzY3Zf aW9tbXVfcG11X3JlYWRxKGFkZHIpOworCWlmICghaW9tbXVfcG11LT5ldmVudF9jbnRyX21hc2sp IHsKKwkJZGV2X2VycigmYXV4ZGV2LT5kZXYsICJldmVudCBjb3VudGVyIGlzIG5vdCBpbXBsZW1l bnRlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlvbW11X3BtdS0+cG11ID0gKHN0 cnVjdCBwbXUpIHsKKwkJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkJLnBhcmVudAkJPSAmYXV4 ZGV2LT5kZXYsCisJCS50YXNrX2N0eF9ucgk9IHBlcmZfaW52YWxpZF9jb250ZXh0LAorCQkuZXZl bnRfaW5pdAk9IHJpc2N2X2lvbW11X3BtdV9ldmVudF9pbml0LAorCQkuYWRkCQk9IHJpc2N2X2lv bW11X3BtdV9hZGQsCisJCS5kZWwJCT0gcmlzY3ZfaW9tbXVfcG11X2RlbCwKKwkJLnN0YXJ0CQk9 IHJpc2N2X2lvbW11X3BtdV9zdGFydCwKKwkJLnN0b3AJCT0gcmlzY3ZfaW9tbXVfcG11X3N0b3As CisJCS5yZWFkCQk9IHJpc2N2X2lvbW11X3BtdV9yZWFkLAorCQkuYXR0cl9ncm91cHMJPSByaXNj dl9pb21tdV9wbXVfYXR0cl9ncnBzLAorCQkuY2FwYWJpbGl0aWVzCT0gUEVSRl9QTVVfQ0FQX05P X0VYQ0xVREUsCisJfTsKKworCWF1eGlsaWFyeV9zZXRfZHJ2ZGF0YShhdXhkZXYsIGlvbW11X3Bt dSk7CisKKwluYW1lID0gZGV2bV9rYXNwcmludGYoJmF1eGRldi0+ZGV2LCBHRlBfS0VSTkVMLAor CQkJICAgICAgInJpc2N2X2lvbW11X3BtdV8ldSIsIGF1eGRldi0+aWQpOworCWlmICghbmFtZSkg eworCQlkZXZfZXJyKCZhdXhkZXYtPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgbmFtZSByaXNjdl9p b21tdV9wbXVfJXVcbiIsCisJCQlhdXhkZXYtPmlkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQor CisJaW9tbXVfcG11LT5udW1hX25vZGUgPSBkZXZfdG9fbm9kZShpb21tdV9kZXYtPmRldik7CisJ aW9tbXVfcG11LT5pcnEgPSByaXNjdl9pb21tdV9wbXVfZ2V0X2lycV9udW0oaW9tbXVfZGV2KTsK KworCS8qCisJICogSVJRX1dPUktfSU5JVF9IQVJELCBub3QgSVJRX1dPUktfSU5JVDogd2l0aG91 dCBJUlFfV09SS19IQVJEX0lSUSwKKwkgKiBpcnFfd29ya19xdWV1ZV9vbigpIHB1dHMgdGhlIHdv cmsgb24gYSBsYXp5IGxpc3QgdG8gYmUgcnVuIGJ5IGEKKwkgKiB0aHJlYWQgb24gUFJFRU1QVF9S VCwgd2hpY2ggd291bGQgbG9zZSB0aGUgaW50ZXJydXB0cy1kaXNhYmxlZAorCSAqIGNvbnRleHQg dGhpcyBkcml2ZXIgcmVsaWVzIG9uIGZvciBzZXJpYWxpc2F0aW9uLgorCSAqLworCWlvbW11X3Bt dS0+d29yayA9IElSUV9XT1JLX0lOSVRfSEFSRChyaXNjdl9pb21tdV9wbXVfd29yayk7CisKKwkv KgorCSAqIFJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQgc28gdGhhdCBkZXZyZXMsIHdo aWNoIHJlbGVhc2VzIGluCisJICogcmV2ZXJzZSBvcmRlciwgZnJlZXMgdGhlIGludGVycnVwdCBm aXJzdCBhbmQgb25seSB0aGVuIHdhaXRzIGZvciBhbgorCSAqIGluLWZsaWdodCB3b3JrIGl0ZW0u CisJICovCisJcmV0ID0gZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0KCZhdXhkZXYtPmRldiwgcmlz Y3ZfaW9tbXVfcG11X2ZsdXNoX3dvcmssCisJCQkJICAgICAgIGlvbW11X3BtdSk7CisJaWYgKHJl dCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJpc2N2X2lvbW11X3BtdV9yZXF1ZXN0X2lycShh dXhkZXYsIGlvbW11X2RldiwgaW9tbXVfcG11KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmF1 eGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVzOiAlZFxuIiwgbmFtZSwgcmV0KTsK KwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIEJpbmQgYWxsIGV2ZW50cyB0byB0aGUgc2Ft ZSBjcHUgY29udGV4dCB0byBhdm9pZCByYWNlIGVuYWJsaW5nLgorCSAqIHJpc2N2X2lvbW11X3Bt dV9vbmxpbmVfY3B1KCkgcGlja3MgdGhlIENQVSBhbmQgc2V0cyB0aGUgaXJxCisJICogYWZmaW5p dHkgZm9yIHVzIG9uY2UgdGhlIGluc3RhbmNlIGlzIHJlZ2lzdGVyZWQgYmVsb3cuCisJICovCisJ aW9tbXVfcG11LT5vbl9jcHUgPSAtMTsKKworCXJldCA9IGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5j ZShjcHVocF9zdGF0ZSwgJmlvbW11X3BtdS0+bm9kZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJy KCZhdXhkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBob3RwbHVnICVzOiAlZFxuIiwgbmFt ZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBkZXZtX2FkZF9hY3Rpb25fb3Jf cmVzZXQoJmF1eGRldi0+ZGV2LAorCQkJCSAgICAgICByaXNjdl9pb21tdV9wbXVfcmVtb3ZlX2Nw dWhwX2luc3RhbmNlLAorCQkJCSAgICAgICBpb21tdV9wbXUpOworCWlmIChyZXQpCisJCXJldHVy biByZXQ7CisKKwlyZXQgPSBwZXJmX3BtdV9yZWdpc3RlcigmaW9tbXVfcG11LT5wbXUsIG5hbWUs IC0xKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmF1eGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJl Z2lzdGVyICVzOiAlZFxuIiwgbmFtZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQg PSBkZXZtX2FkZF9hY3Rpb25fb3JfcmVzZXQoJmF1eGRldi0+ZGV2LAorCQkJCSAgICAgICByaXNj dl9pb21tdV9wbXVfZG9fdW5yZWdpc3RlciwKKwkJCQkgICAgICAgaW9tbXVfcG11KTsKKwlpZiAo cmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBUaGUgUE1VIG5hbWUgb25seSBjYXJyaWVz IHRoZSBhdXggZGV2IGlkLCBub3QgdGhlIGlvbW11IGRldiBuYW1lLCBzbworCSAqIGZpbmQgdGhl IGlvbW11IGRldiBuYW1lIGhlcmUgdG8gbWFwIHRoaXMgUE1VIGJhY2sgdG8gaXRzIGlvbW11IGRl di4KKwkgKi8KKwlkZXZfaW5mbygmYXV4ZGV2LT5kZXYsICIlczogUmVnaXN0ZXJlZCB3aXRoICV1 IGNvdW50ZXJzIChpb21tdSAlcylcbiIsCisJCSBuYW1lLCBpb21tdV9wbXUtPm51bV9jb3VudGVy cywgZGV2X25hbWUoaW9tbXVfZGV2LT5kZXYpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMg Y29uc3Qgc3RydWN0IGF1eGlsaWFyeV9kZXZpY2VfaWQgcmlzY3ZfaW9tbXVfcG11X2lkX3RhYmxl W10gPSB7CisJeyAubmFtZSA9ICJyaXNjdi1pb21tdS5wbXUiIH0sCisJe30KK307CitNT0RVTEVf REVWSUNFX1RBQkxFKGF1eGlsaWFyeSwgcmlzY3ZfaW9tbXVfcG11X2lkX3RhYmxlKTsKKworc3Rh dGljIHN0cnVjdCBhdXhpbGlhcnlfZHJpdmVyIGlvbW11X3BtdV9kcml2ZXIgPSB7CisJLmRyaXZl ciA9IHsKKwkJLnN1cHByZXNzX2JpbmRfYXR0cnMgPSB0cnVlLAorCX0sCisJLnByb2JlCQk9IHJp c2N2X2lvbW11X3BtdV9wcm9iZSwKKwkuaWRfdGFibGUJPSByaXNjdl9pb21tdV9wbXVfaWRfdGFi bGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCByaXNjdl9pb21tdV9wbXVfaW5pdCh2b2lkKQor eworCWludCByZXQ7CisKKwljcHVocF9zdGF0ZSA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQ VUhQX0FQX09OTElORV9EWU4sCisJCQkJCSAgICAgICJwZXJmL3Jpc2N2L2lvbW11Om9ubGluZSIs CisJCQkJCSAgICAgIHJpc2N2X2lvbW11X3BtdV9vbmxpbmVfY3B1LAorCQkJCQkgICAgICByaXNj dl9pb21tdV9wbXVfb2ZmbGluZV9jcHUpOworCWlmIChjcHVocF9zdGF0ZSA8IDApCisJCXJldHVy biBjcHVocF9zdGF0ZTsKKworCXJldCA9IGF1eGlsaWFyeV9kcml2ZXJfcmVnaXN0ZXIoJmlvbW11 X3BtdV9kcml2ZXIpOworCWlmIChyZXQpCisJCWNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZShjcHVo cF9zdGF0ZSk7CisKKwlyZXR1cm4gcmV0OworfQorbW9kdWxlX2luaXQocmlzY3ZfaW9tbXVfcG11 X2luaXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlJJU0MtViBJT01NVSBQTVUiKTsKK01PRFVM RV9MSUNFTlNFKCJHUEwiKTsKLS0gCjIuNDMuNwoKCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNj dkBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4v bGlzdGluZm8vbGludXgtcmlzY3YK