From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 321D6C8EC for ; Fri, 2 Jun 2023 08:25:41 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8F8C8C433D2; Fri, 2 Jun 2023 08:25:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1685694341; bh=bNXlHhXedmdPPe/K+SVuaWMGRNYLUdQRKj6I74qlBrs=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=Xh7HYTpo4nMXKVmRIlBMtVQZAaJZlNJh8oodxpQMfUiZ7i03OAMyDN6rcJW+6KY67 nFaj4Vgy3gV2SAs2FFrgj6veNIZOhDoJBNnP+gW0309syLC6bxyNhZjS8BB+8BjgPa vd/Wyj63PV1mkMuLUcHOdc+11P6LnkRWvaMJeMz+rwX4zO5CBLJ3Oldw+R5XCKeh0g J/AdtophrHNobHJnSMOeV0fOALs6427GzA8qHOW81xwLuZH+XAUX/cNXavI4+kQI5+ HKc5qB9ke7zuoPIFMapN9VOS0jgv332F8kDDJ86FZUpZgRQ0zjwzaypZIvIkeg0BBA bd40/xlROVi0A== Received: from 90.4.23.109.rev.sfr.net ([109.23.4.90] helo=wait-a-minute.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1q506N-002H9j-8n; Fri, 02 Jun 2023 09:25:39 +0100 Date: Fri, 02 Jun 2023 09:25:37 +0100 Message-ID: <875y86p8xq.wl-maz@kernel.org> From: Marc Zyngier To: Raghavendra Rao Ananta Cc: Oliver Upton , James Morse , Suzuki K Poulose , Ricardo Koller , Paolo Bonzini , Jing Zhang , Colton Lewis , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, kvm@vger.kernel.org Subject: Re: [PATCH v4 3/6] KVM: arm64: Implement kvm_arch_flush_remote_tlbs_range() In-Reply-To: References: <20230519005231.3027912-1-rananta@google.com> <20230519005231.3027912-4-rananta@google.com> <87v8gbjkzn.wl-maz@kernel.org> <86zg5kc2ho.wl-maz@kernel.org> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/28.2 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) Precedence: bulk X-Mailing-List: kvmarm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 109.23.4.90 X-SA-Exim-Rcpt-To: rananta@google.com, oliver.upton@linux.dev, james.morse@arm.com, suzuki.poulose@arm.com, ricarkol@google.com, pbonzini@redhat.com, jingzhangos@google.com, coltonlewis@google.com, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, kvm@vger.kernel.org X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false On Fri, 02 Jun 2023 02:37:28 +0100, Raghavendra Rao Ananta wrote: >=20 > On Wed, May 31, 2023 at 1:46=E2=80=AFAM Marc Zyngier wro= te: > > > > On Tue, 30 May 2023 22:22:23 +0100, > > Raghavendra Rao Ananta wrote: > > > > > > On Mon, May 29, 2023 at 7:00=E2=80=AFAM Marc Zyngier = wrote: > > > > > > > > On Fri, 19 May 2023 01:52:28 +0100, > > > > Raghavendra Rao Ananta wrote: > > > > > > > > > > Implement kvm_arch_flush_remote_tlbs_range() for arm64 > > > > > to invalidate the given range in the TLB. > > > > > > > > > > Signed-off-by: Raghavendra Rao Ananta > > > > > --- > > > > > arch/arm64/include/asm/kvm_host.h | 3 +++ > > > > > arch/arm64/kvm/hyp/nvhe/tlb.c | 4 +--- > > > > > arch/arm64/kvm/mmu.c | 11 +++++++++++ > > > > > 3 files changed, 15 insertions(+), 3 deletions(-) > > > > > > > > > > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/inclu= de/asm/kvm_host.h > > > > > index 81ab41b84f436..343fb530eea9c 100644 > > > > > --- a/arch/arm64/include/asm/kvm_host.h > > > > > +++ b/arch/arm64/include/asm/kvm_host.h > > > > > @@ -1081,6 +1081,9 @@ struct kvm *kvm_arch_alloc_vm(void); > > > > > #define __KVM_HAVE_ARCH_FLUSH_REMOTE_TLBS > > > > > int kvm_arch_flush_remote_tlbs(struct kvm *kvm); > > > > > > > > > > +#define __KVM_HAVE_ARCH_FLUSH_REMOTE_TLBS_RANGE > > > > > +int kvm_arch_flush_remote_tlbs_range(struct kvm *kvm, gfn_t star= t_gfn, u64 pages); > > > > > + > > > > > static inline bool kvm_vm_is_protected(struct kvm *kvm) > > > > > { > > > > > return false; > > > > > diff --git a/arch/arm64/kvm/hyp/nvhe/tlb.c b/arch/arm64/kvm/hyp/n= vhe/tlb.c > > > > > index d4ea549c4b5c4..d2c7c1bc6d441 100644 > > > > > --- a/arch/arm64/kvm/hyp/nvhe/tlb.c > > > > > +++ b/arch/arm64/kvm/hyp/nvhe/tlb.c > > > > > @@ -150,10 +150,8 @@ void __kvm_tlb_flush_vmid_range(struct kvm_s= 2_mmu *mmu, > > > > > return; > > > > > } > > > > > > > > > > - dsb(ishst); > > > > > - > > > > > /* Switch to requested VMID */ > > > > > - __tlb_switch_to_guest(mmu, &cxt); > > > > > + __tlb_switch_to_guest(mmu, &cxt, false); > > > > > > > > This hunk is in the wrong patch, isn't it? > > > > > > > Ah, you are right. It should be part of the previous patch. I think I > > > introduced it accidentally when I rebased the series. I'll remove it > > > in the next spin. > > > > > > > > > > > > > > > > __flush_tlb_range_op(ipas2e1is, start, pages, stride, 0, 0,= false); > > > > > > > > > > diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c > > > > > index d0a0d3dca9316..e3673b4c10292 100644 > > > > > --- a/arch/arm64/kvm/mmu.c > > > > > +++ b/arch/arm64/kvm/mmu.c > > > > > @@ -92,6 +92,17 @@ int kvm_arch_flush_remote_tlbs(struct kvm *kvm) > > > > > return 0; > > > > > } > > > > > > > > > > +int kvm_arch_flush_remote_tlbs_range(struct kvm *kvm, gfn_t star= t_gfn, u64 pages) > > > > > +{ > > > > > + phys_addr_t start, end; > > > > > + > > > > > + start =3D start_gfn << PAGE_SHIFT; > > > > > + end =3D (start_gfn + pages) << PAGE_SHIFT; > > > > > + > > > > > + kvm_call_hyp(__kvm_tlb_flush_vmid_range, &kvm->arch.mmu, st= art, end); > > > > > > > > So that's the point that I think is not right. It is the MMU code t= hat > > > > should drive the invalidation method, and not the HYP code. The HYP > > > > code should be as dumb as possible, and the logic should be kept in > > > > the MMU code. > > > > > > > > So when a range invalidation is forwarded to HYP, it's a *valid* ra= nge > > > > invalidation. not something that can fallback to VMID-wide invalida= tion. > > > > > > > I'm guessing that you are referring to patch-2. Do you recommend > > > moving the 'pages >=3D MAX_TLBI_RANGE_PAGES' logic here and simply > > > return an error? How about for the other check: > > > system_supports_tlb_range()? > > > The idea was for __kvm_tlb_flush_vmid_range() to also implement a > > > fallback mechanism in case the system doesn't support the range-based > > > instructions. But if we end up calling __kvm_tlb_flush_vmid_range() > > > from multiple cases, we'd end up duplicating the checks. WDYT? > > > > My take is that there should be a single helper deciding to issue > > either a number of range-based TLBIs depending on start/end, or a > > single VMID-based TLBI. Having multiple calling sites is not a > > problem, and even if that code gets duplicated, big deal. > > > Hypothetically, if I move the check to this patch and return an error > if this situation occurs, since I'm dependending on David's common MMU > code [1], kvm_main.c would end of calling kvm_flush_remote_tlbs() and > we'd be doing a VMID-based TLBI. > One idea would be to issue a WARN_ON() and return 0 so that we don't > issue any TLBIs. Thoughts? Then we should fix the infrastructure. And no, not issuing TLBs is not an acceptable outcome. Might as well panic the kernel, because silent memory corruption is not something I'm willing to entertain. My take is as follows: - either the core code doesn't specify a range, and we blow the whole thing as we do today - or it specifies a range, and we apply range invalidation as permitted by the architecture and the implementation (either a *series* of range invalidation, or a full VMID invalidation). As for the "common MMU" stuff, something such as "flush_remote_tlbs" really shows that this code isn't common at all. It is just x86 creep, and I have zero problem ignoring it. >=20 > > But a hypercall that falls back to global invalidation based on a > > range evaluation error (more than MAX_TLBI_RANGE_PAGES) is papering > > over a latent bug. > > > If I understand this correctly, MAX_TLBI_RANGE_PAGES is specifically > the capacity of the range-based instructions itself, isn't it? Is it > incorrect for the caller to request a higher range be invalidated even > on systems that do not support these instructions? Probably that's why > __flush_tlb_range() falls back to a global flush when the range > request is exceeded? This is indeed the architectural limit. But invalidating the whole VMID isn't necessarily the right thing either. If you can preserve some of the TLBs by only issuing a couple of range invalidation that span *in total* more than MAX_TLBI_RANGE_PAGES. Again, what I'm objecting to is the silent upgrading to VMID-wide invalidation being hidden away in the HYP code. That's just wrong. The HYP code is not the place for abstraction. Thanks, M. --=20 Without deviation from the norm, progress is not possible. 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 EF3E7C7EE2A for ; Fri, 2 Jun 2023 08:26:10 +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: Subject:Cc:To:From:Message-ID:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=9tel99fBLVBnBFIoRMXc2zRGEMpuSqL0CM+UUA3cNBk=; b=vXhMGUwvWvHTad xDb1Z8BWDZA4FtVIXvx6VDORN7bENdcmO4YILL1G5WN8Sb8vM/a++cUJixQ1Tj9Quipmkw1QekJDH NY1eq+ug2osRh9jWCLJfh7HB1eBEnqDDau1CQtCjm8OjsVf2sLizbcQ0LedS5AIk/aeyHodsT7Fwe evrz6bUtGfElUqmNSqBgaNOvH8UydGD6qNWV0hZEYJzSXMIuELRKfC2B6XM5QctR00DnkL8EYnf1N 32sLV3s3olzUe7qlldt58Ig5CmuByiq50mD7oI0674L2kYHeEM2EIay/qE72Lm2WLBHuIhGLHVhSV cvTglGvCCwlb0dBdYVsQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1q506V-0068qy-2P; Fri, 02 Jun 2023 08:25:47 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1q506S-0068on-0P for linux-arm-kernel@lists.infradead.org; Fri, 02 Jun 2023 08:25:47 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 539AF64D11; Fri, 2 Jun 2023 08:25:43 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8F8C8C433D2; Fri, 2 Jun 2023 08:25:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1685694341; bh=bNXlHhXedmdPPe/K+SVuaWMGRNYLUdQRKj6I74qlBrs=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=Xh7HYTpo4nMXKVmRIlBMtVQZAaJZlNJh8oodxpQMfUiZ7i03OAMyDN6rcJW+6KY67 nFaj4Vgy3gV2SAs2FFrgj6veNIZOhDoJBNnP+gW0309syLC6bxyNhZjS8BB+8BjgPa vd/Wyj63PV1mkMuLUcHOdc+11P6LnkRWvaMJeMz+rwX4zO5CBLJ3Oldw+R5XCKeh0g J/AdtophrHNobHJnSMOeV0fOALs6427GzA8qHOW81xwLuZH+XAUX/cNXavI4+kQI5+ HKc5qB9ke7zuoPIFMapN9VOS0jgv332F8kDDJ86FZUpZgRQ0zjwzaypZIvIkeg0BBA bd40/xlROVi0A== Received: from 90.4.23.109.rev.sfr.net ([109.23.4.90] helo=wait-a-minute.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1q506N-002H9j-8n; Fri, 02 Jun 2023 09:25:39 +0100 Date: Fri, 02 Jun 2023 09:25:37 +0100 Message-ID: <875y86p8xq.wl-maz@kernel.org> From: Marc Zyngier To: Raghavendra Rao Ananta Cc: Oliver Upton , James Morse , Suzuki K Poulose , Ricardo Koller , Paolo Bonzini , Jing Zhang , Colton Lewis , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, kvm@vger.kernel.org Subject: Re: [PATCH v4 3/6] KVM: arm64: Implement kvm_arch_flush_remote_tlbs_range() In-Reply-To: References: <20230519005231.3027912-1-rananta@google.com> <20230519005231.3027912-4-rananta@google.com> <87v8gbjkzn.wl-maz@kernel.org> <86zg5kc2ho.wl-maz@kernel.org> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/28.2 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") X-SA-Exim-Connect-IP: 109.23.4.90 X-SA-Exim-Rcpt-To: rananta@google.com, oliver.upton@linux.dev, james.morse@arm.com, suzuki.poulose@arm.com, ricarkol@google.com, pbonzini@redhat.com, jingzhangos@google.com, coltonlewis@google.com, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, kvm@vger.kernel.org X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230602_012544_268162_A1D9615A X-CRM114-Status: GOOD ( 56.18 ) X-BeenThere: linux-arm-kernel@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-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gRnJpLCAwMiBKdW4gMjAyMyAwMjozNzoyOCArMDEwMCwKUmFnaGF2ZW5kcmEgUmFvIEFuYW50 YSA8cmFuYW50YUBnb29nbGUuY29tPiB3cm90ZToKPiAKPiBPbiBXZWQsIE1heSAzMSwgMjAyMyBh dCAxOjQ24oCvQU0gTWFyYyBaeW5naWVyIDxtYXpAa2VybmVsLm9yZz4gd3JvdGU6Cj4gPgo+ID4g T24gVHVlLCAzMCBNYXkgMjAyMyAyMjoyMjoyMyArMDEwMCwKPiA+IFJhZ2hhdmVuZHJhIFJhbyBB bmFudGEgPHJhbmFudGFAZ29vZ2xlLmNvbT4gd3JvdGU6Cj4gPiA+Cj4gPiA+IE9uIE1vbiwgTWF5 IDI5LCAyMDIzIGF0IDc6MDDigK9BTSBNYXJjIFp5bmdpZXIgPG1hekBrZXJuZWwub3JnPiB3cm90 ZToKPiA+ID4gPgo+ID4gPiA+IE9uIEZyaSwgMTkgTWF5IDIwMjMgMDE6NTI6MjggKzAxMDAsCj4g PiA+ID4gUmFnaGF2ZW5kcmEgUmFvIEFuYW50YSA8cmFuYW50YUBnb29nbGUuY29tPiB3cm90ZToK PiA+ID4gPiA+Cj4gPiA+ID4gPiBJbXBsZW1lbnQga3ZtX2FyY2hfZmx1c2hfcmVtb3RlX3RsYnNf cmFuZ2UoKSBmb3IgYXJtNjQKPiA+ID4gPiA+IHRvIGludmFsaWRhdGUgdGhlIGdpdmVuIHJhbmdl IGluIHRoZSBUTEIuCj4gPiA+ID4gPgo+ID4gPiA+ID4gU2lnbmVkLW9mZi1ieTogUmFnaGF2ZW5k cmEgUmFvIEFuYW50YSA8cmFuYW50YUBnb29nbGUuY29tPgo+ID4gPiA+ID4gLS0tCj4gPiA+ID4g PiAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIHwgIDMgKysrCj4gPiA+ID4gPiAg YXJjaC9hcm02NC9rdm0vaHlwL252aGUvdGxiLmMgICAgIHwgIDQgKy0tLQo+ID4gPiA+ID4gIGFy Y2gvYXJtNjQva3ZtL21tdS5jICAgICAgICAgICAgICB8IDExICsrKysrKysrKysrCj4gPiA+ID4g PiAgMyBmaWxlcyBjaGFuZ2VkLCAxNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQo+ID4g PiA+ID4KPiA+ID4gPiA+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9o b3N0LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKPiA+ID4gPiA+IGluZGV4 IDgxYWI0MWI4NGY0MzYuLjM0M2ZiNTMwZWVhOWMgMTAwNjQ0Cj4gPiA+ID4gPiAtLS0gYS9hcmNo L2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKPiA+ID4gPiA+ICsrKyBiL2FyY2gvYXJtNjQv aW5jbHVkZS9hc20va3ZtX2hvc3QuaAo+ID4gPiA+ID4gQEAgLTEwODEsNiArMTA4MSw5IEBAIHN0 cnVjdCBrdm0gKmt2bV9hcmNoX2FsbG9jX3ZtKHZvaWQpOwo+ID4gPiA+ID4gICNkZWZpbmUgX19L Vk1fSEFWRV9BUkNIX0ZMVVNIX1JFTU9URV9UTEJTCj4gPiA+ID4gPiAgaW50IGt2bV9hcmNoX2Zs dXNoX3JlbW90ZV90bGJzKHN0cnVjdCBrdm0gKmt2bSk7Cj4gPiA+ID4gPgo+ID4gPiA+ID4gKyNk ZWZpbmUgX19LVk1fSEFWRV9BUkNIX0ZMVVNIX1JFTU9URV9UTEJTX1JBTkdFCj4gPiA+ID4gPiAr aW50IGt2bV9hcmNoX2ZsdXNoX3JlbW90ZV90bGJzX3JhbmdlKHN0cnVjdCBrdm0gKmt2bSwgZ2Zu X3Qgc3RhcnRfZ2ZuLCB1NjQgcGFnZXMpOwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gIHN0YXRpYyBp bmxpbmUgYm9vbCBrdm1fdm1faXNfcHJvdGVjdGVkKHN0cnVjdCBrdm0gKmt2bSkKPiA+ID4gPiA+ ICB7Cj4gPiA+ID4gPiAgICAgICByZXR1cm4gZmFsc2U7Cj4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEv YXJjaC9hcm02NC9rdm0vaHlwL252aGUvdGxiLmMgYi9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS90 bGIuYwo+ID4gPiA+ID4gaW5kZXggZDRlYTU0OWM0YjVjNC4uZDJjN2MxYmM2ZDQ0MSAxMDA2NDQK PiA+ID4gPiA+IC0tLSBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL3RsYi5jCj4gPiA+ID4gPiAr KysgYi9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS90bGIuYwo+ID4gPiA+ID4gQEAgLTE1MCwxMCAr MTUwLDggQEAgdm9pZCBfX2t2bV90bGJfZmx1c2hfdm1pZF9yYW5nZShzdHJ1Y3Qga3ZtX3MyX21t dSAqbW11LAo+ID4gPiA+ID4gICAgICAgICAgICAgICByZXR1cm47Cj4gPiA+ID4gPiAgICAgICB9 Cj4gPiA+ID4gPgo+ID4gPiA+ID4gLSAgICAgZHNiKGlzaHN0KTsKPiA+ID4gPiA+IC0KPiA+ID4g PiA+ICAgICAgIC8qIFN3aXRjaCB0byByZXF1ZXN0ZWQgVk1JRCAqLwo+ID4gPiA+ID4gLSAgICAg X190bGJfc3dpdGNoX3RvX2d1ZXN0KG1tdSwgJmN4dCk7Cj4gPiA+ID4gPiArICAgICBfX3RsYl9z d2l0Y2hfdG9fZ3Vlc3QobW11LCAmY3h0LCBmYWxzZSk7Cj4gPiA+ID4KPiA+ID4gPiBUaGlzIGh1 bmsgaXMgaW4gdGhlIHdyb25nIHBhdGNoLCBpc24ndCBpdD8KPiA+ID4gPgo+ID4gPiBBaCwgeW91 IGFyZSByaWdodC4gSXQgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIHByZXZpb3VzIHBhdGNoLiBJIHRo aW5rIEkKPiA+ID4gaW50cm9kdWNlZCBpdCBhY2NpZGVudGFsbHkgd2hlbiBJIHJlYmFzZWQgdGhl IHNlcmllcy4gSSdsbCByZW1vdmUgaXQKPiA+ID4gaW4gdGhlIG5leHQgc3Bpbi4KPiA+ID4KPiA+ ID4KPiA+ID4gPiA+Cj4gPiA+ID4gPiAgICAgICBfX2ZsdXNoX3RsYl9yYW5nZV9vcChpcGFzMmUx aXMsIHN0YXJ0LCBwYWdlcywgc3RyaWRlLCAwLCAwLCBmYWxzZSk7Cj4gPiA+ID4gPgo+ID4gPiA+ ID4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL21tdS5jIGIvYXJjaC9hcm02NC9rdm0vbW11 LmMKPiA+ID4gPiA+IGluZGV4IGQwYTBkM2RjYTkzMTYuLmUzNjczYjRjMTAyOTIgMTAwNjQ0Cj4g PiA+ID4gPiAtLS0gYS9hcmNoL2FybTY0L2t2bS9tbXUuYwo+ID4gPiA+ID4gKysrIGIvYXJjaC9h cm02NC9rdm0vbW11LmMKPiA+ID4gPiA+IEBAIC05Miw2ICs5MiwxNyBAQCBpbnQga3ZtX2FyY2hf Zmx1c2hfcmVtb3RlX3RsYnMoc3RydWN0IGt2bSAqa3ZtKQo+ID4gPiA+ID4gICAgICAgcmV0dXJu IDA7Cj4gPiA+ID4gPiAgfQo+ID4gPiA+ID4KPiA+ID4gPiA+ICtpbnQga3ZtX2FyY2hfZmx1c2hf cmVtb3RlX3RsYnNfcmFuZ2Uoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBzdGFydF9nZm4sIHU2NCBw YWdlcykKPiA+ID4gPiA+ICt7Cj4gPiA+ID4gPiArICAgICBwaHlzX2FkZHJfdCBzdGFydCwgZW5k Owo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKyAgICAgc3RhcnQgPSBzdGFydF9nZm4gPDwgUEFHRV9T SElGVDsKPiA+ID4gPiA+ICsgICAgIGVuZCA9IChzdGFydF9nZm4gKyBwYWdlcykgPDwgUEFHRV9T SElGVDsKPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICsgICAgIGt2bV9jYWxsX2h5cChfX2t2bV90bGJf Zmx1c2hfdm1pZF9yYW5nZSwgJmt2bS0+YXJjaC5tbXUsIHN0YXJ0LCBlbmQpOwo+ID4gPiA+Cj4g PiA+ID4gU28gdGhhdCdzIHRoZSBwb2ludCB0aGF0IEkgdGhpbmsgaXMgbm90IHJpZ2h0LiBJdCBp cyB0aGUgTU1VIGNvZGUgdGhhdAo+ID4gPiA+IHNob3VsZCBkcml2ZSB0aGUgaW52YWxpZGF0aW9u IG1ldGhvZCwgYW5kIG5vdCB0aGUgSFlQIGNvZGUuIFRoZSBIWVAKPiA+ID4gPiBjb2RlIHNob3Vs ZCBiZSBhcyBkdW1iIGFzIHBvc3NpYmxlLCBhbmQgdGhlIGxvZ2ljIHNob3VsZCBiZSBrZXB0IGlu Cj4gPiA+ID4gdGhlIE1NVSBjb2RlLgo+ID4gPiA+Cj4gPiA+ID4gU28gd2hlbiBhIHJhbmdlIGlu dmFsaWRhdGlvbiBpcyBmb3J3YXJkZWQgdG8gSFlQLCBpdCdzIGEgKnZhbGlkKiByYW5nZQo+ID4g PiA+IGludmFsaWRhdGlvbi4gbm90IHNvbWV0aGluZyB0aGF0IGNhbiBmYWxsYmFjayB0byBWTUlE LXdpZGUgaW52YWxpZGF0aW9uLgo+ID4gPiA+Cj4gPiA+IEknbSBndWVzc2luZyB0aGF0IHlvdSBh cmUgcmVmZXJyaW5nIHRvIHBhdGNoLTIuIERvIHlvdSByZWNvbW1lbmQKPiA+ID4gbW92aW5nIHRo ZSAncGFnZXMgPj0gTUFYX1RMQklfUkFOR0VfUEFHRVMnIGxvZ2ljIGhlcmUgYW5kIHNpbXBseQo+ ID4gPiByZXR1cm4gYW4gZXJyb3I/IEhvdyBhYm91dCBmb3IgdGhlIG90aGVyIGNoZWNrOgo+ID4g PiBzeXN0ZW1fc3VwcG9ydHNfdGxiX3JhbmdlKCk/Cj4gPiA+IFRoZSBpZGVhIHdhcyBmb3IgX19r dm1fdGxiX2ZsdXNoX3ZtaWRfcmFuZ2UoKSB0byBhbHNvIGltcGxlbWVudCBhCj4gPiA+IGZhbGxi YWNrIG1lY2hhbmlzbSBpbiBjYXNlIHRoZSBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IHRoZSByYW5n ZS1iYXNlZAo+ID4gPiBpbnN0cnVjdGlvbnMuIEJ1dCBpZiB3ZSBlbmQgdXAgY2FsbGluZyBfX2t2 bV90bGJfZmx1c2hfdm1pZF9yYW5nZSgpCj4gPiA+IGZyb20gbXVsdGlwbGUgY2FzZXMsIHdlJ2Qg ZW5kIHVwIGR1cGxpY2F0aW5nIHRoZSBjaGVja3MuIFdEWVQ/Cj4gPgo+ID4gTXkgdGFrZSBpcyB0 aGF0IHRoZXJlIHNob3VsZCBiZSBhIHNpbmdsZSBoZWxwZXIgZGVjaWRpbmcgdG8gaXNzdWUKPiA+ IGVpdGhlciBhIG51bWJlciBvZiByYW5nZS1iYXNlZCBUTEJJcyBkZXBlbmRpbmcgb24gc3RhcnQv ZW5kLCBvciBhCj4gPiBzaW5nbGUgVk1JRC1iYXNlZCBUTEJJLiBIYXZpbmcgbXVsdGlwbGUgY2Fs bGluZyBzaXRlcyBpcyBub3QgYQo+ID4gcHJvYmxlbSwgYW5kIGV2ZW4gaWYgdGhhdCBjb2RlIGdl dHMgZHVwbGljYXRlZCwgYmlnIGRlYWwuCj4gPgo+IEh5cG90aGV0aWNhbGx5LCBpZiBJIG1vdmUg dGhlIGNoZWNrIHRvIHRoaXMgcGF0Y2ggYW5kIHJldHVybiBhbiBlcnJvcgo+IGlmIHRoaXMgc2l0 dWF0aW9uIG9jY3Vycywgc2luY2UgSSdtIGRlcGVuZGVuZGluZyBvbiBEYXZpZCdzIGNvbW1vbiBN TVUKPiBjb2RlIFsxXSwga3ZtX21haW4uYyB3b3VsZCBlbmQgb2YgY2FsbGluZyBrdm1fZmx1c2hf cmVtb3RlX3RsYnMoKSBhbmQKPiB3ZSdkIGJlIGRvaW5nIGEgVk1JRC1iYXNlZCBUTEJJLgo+IE9u ZSBpZGVhIHdvdWxkIGJlIHRvIGlzc3VlIGEgV0FSTl9PTigpIGFuZCByZXR1cm4gMCBzbyB0aGF0 IHdlIGRvbid0Cj4gaXNzdWUgYW55IFRMQklzLiBUaG91Z2h0cz8KClRoZW4gd2Ugc2hvdWxkIGZp eCB0aGUgaW5mcmFzdHJ1Y3R1cmUuIEFuZCBubywgbm90IGlzc3VpbmcgVExCcyBpcwpub3QgYW4g YWNjZXB0YWJsZSBvdXRjb21lLiBNaWdodCBhcyB3ZWxsIHBhbmljIHRoZSBrZXJuZWwsIGJlY2F1 c2UKc2lsZW50IG1lbW9yeSBjb3JydXB0aW9uIGlzIG5vdCBzb21ldGhpbmcgSSdtIHdpbGxpbmcg dG8gZW50ZXJ0YWluLgoKTXkgdGFrZSBpcyBhcyBmb2xsb3dzOgoKLSBlaXRoZXIgdGhlIGNvcmUg Y29kZSBkb2Vzbid0IHNwZWNpZnkgYSByYW5nZSwgYW5kIHdlIGJsb3cgdGhlIHdob2xlCiAgdGhp bmcgYXMgd2UgZG8gdG9kYXkKCi0gb3IgaXQgc3BlY2lmaWVzIGEgcmFuZ2UsIGFuZCB3ZSBhcHBs eSByYW5nZSBpbnZhbGlkYXRpb24gYXMgcGVybWl0dGVkCiAgYnkgdGhlIGFyY2hpdGVjdHVyZSBh bmQgdGhlIGltcGxlbWVudGF0aW9uIChlaXRoZXIgYSAqc2VyaWVzKiBvZgogIHJhbmdlIGludmFs aWRhdGlvbiwgb3IgYSBmdWxsIFZNSUQgaW52YWxpZGF0aW9uKS4KCkFzIGZvciB0aGUgImNvbW1v biBNTVUiIHN0dWZmLCBzb21ldGhpbmcgc3VjaCBhcyAiZmx1c2hfcmVtb3RlX3RsYnMiCnJlYWxs eSBzaG93cyB0aGF0IHRoaXMgY29kZSBpc24ndCBjb21tb24gYXQgYWxsLiBJdCBpcyBqdXN0IHg4 NiBjcmVlcCwKYW5kIEkgaGF2ZSB6ZXJvIHByb2JsZW0gaWdub3JpbmcgaXQuCgo+IAo+ID4gQnV0 IGEgaHlwZXJjYWxsIHRoYXQgZmFsbHMgYmFjayB0byBnbG9iYWwgaW52YWxpZGF0aW9uIGJhc2Vk IG9uIGEKPiA+IHJhbmdlIGV2YWx1YXRpb24gZXJyb3IgKG1vcmUgdGhhbiBNQVhfVExCSV9SQU5H RV9QQUdFUykgaXMgcGFwZXJpbmcKPiA+IG92ZXIgYSBsYXRlbnQgYnVnLgo+ID4KPiBJZiBJIHVu ZGVyc3RhbmQgdGhpcyBjb3JyZWN0bHksIE1BWF9UTEJJX1JBTkdFX1BBR0VTIGlzIHNwZWNpZmlj YWxseQo+IHRoZSBjYXBhY2l0eSBvZiB0aGUgcmFuZ2UtYmFzZWQgaW5zdHJ1Y3Rpb25zIGl0c2Vs ZiwgaXNuJ3QgaXQ/IElzIGl0Cj4gaW5jb3JyZWN0IGZvciB0aGUgY2FsbGVyIHRvIHJlcXVlc3Qg YSBoaWdoZXIgcmFuZ2UgYmUgaW52YWxpZGF0ZWQgZXZlbgo+IG9uIHN5c3RlbXMgdGhhdCBkbyBu b3Qgc3VwcG9ydCB0aGVzZSBpbnN0cnVjdGlvbnM/IFByb2JhYmx5IHRoYXQncyB3aHkKPiBfX2Zs dXNoX3RsYl9yYW5nZSgpIGZhbGxzIGJhY2sgdG8gYSBnbG9iYWwgZmx1c2ggd2hlbiB0aGUgcmFu Z2UKPiByZXF1ZXN0IGlzIGV4Y2VlZGVkPwoKVGhpcyBpcyBpbmRlZWQgdGhlIGFyY2hpdGVjdHVy YWwgbGltaXQuIEJ1dCBpbnZhbGlkYXRpbmcgdGhlIHdob2xlClZNSUQgaXNuJ3QgbmVjZXNzYXJp bHkgdGhlIHJpZ2h0IHRoaW5nIGVpdGhlci4gSWYgeW91IGNhbiBwcmVzZXJ2ZQpzb21lIG9mIHRo ZSBUTEJzIGJ5IG9ubHkgaXNzdWluZyBhIGNvdXBsZSBvZiByYW5nZSBpbnZhbGlkYXRpb24gdGhh dApzcGFuICppbiB0b3RhbCogbW9yZSB0aGFuIE1BWF9UTEJJX1JBTkdFX1BBR0VTLgoKQWdhaW4s IHdoYXQgSSdtIG9iamVjdGluZyB0byBpcyB0aGUgc2lsZW50IHVwZ3JhZGluZyB0byBWTUlELXdp ZGUKaW52YWxpZGF0aW9uIGJlaW5nIGhpZGRlbiBhd2F5IGluIHRoZSBIWVAgY29kZS4gVGhhdCdz IGp1c3Qgd3JvbmcuIFRoZQpIWVAgY29kZSBpcyBub3QgdGhlIHBsYWNlIGZvciBhYnN0cmFjdGlv bi4KClRoYW5rcywKCglNLgoKLS0gCldpdGhvdXQgZGV2aWF0aW9uIGZyb20gdGhlIG5vcm0sIHBy b2dyZXNzIGlzIG5vdCBwb3NzaWJsZS4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1r ZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWls bWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK