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=-7.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS 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 05B16C33C8C for ; Sun, 5 Jan 2020 11:35:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B89F6222C4 for ; Sun, 5 Jan 2020 11:35:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578224153; bh=dktLam6PZZSt7Od13pgFScuOzRHoMRZ6kh53YBAa22A=; h=Date:From:To:Cc:Subject:In-Reply-To:References:List-ID:From; b=ny0RrXZfKBPH3NwHsfRW4W+4AfRUlOcXK3T9eQ7LOGQd92ntm0/DxEPpulHi2xqEl 0YFfijvwiuj1AFFqsvKyXo06G1MmU9hROWDNg9qZBok+cxonci2dAG23+/wPV0GDU8 zrzLmaxfyTeF5gDYonAZ5eg7NbIzh2KjdWm4v7LQ= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726360AbgAELfw (ORCPT ); Sun, 5 Jan 2020 06:35:52 -0500 Received: from mail.kernel.org ([198.145.29.99]:53080 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725897AbgAELfw (ORCPT ); Sun, 5 Jan 2020 06:35:52 -0500 Received: from disco-boy.misterjones.org (disco-boy.misterjones.org [51.254.78.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9E5F220848; Sun, 5 Jan 2020 11:35:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578224150; bh=dktLam6PZZSt7Od13pgFScuOzRHoMRZ6kh53YBAa22A=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=ANivoHacQhSSiLX8FrqMfeOxwm1J5HqPpYJxlsJ4GeyEPK0wTatHaiGwuNlnEb62d g4UJ+Kx9T4w9GDixPvvy8NtYpL40SroFqtZUqRydYLdclQJpgX3aFQRxmIPYMD6jJY FFWGNaRck/2jhVzShi/IBb1EWPxY0aR1i5ALFo2k= Received: from 78.163-31-62.static.virginmediabusiness.co.uk ([62.31.163.78] helo=big-swifty.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1io4CC-0001t7-HT; Sun, 05 Jan 2020 11:35:48 +0000 Date: Sun, 05 Jan 2020 11:35:38 +0000 Message-ID: <86mub2gmph.wl-maz@kernel.org> From: Marc Zyngier To: Alexandru Elisei Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org, Andre Przywara , Dave Martin , Julien Thierry , James Morse , Suzuki K Poulose , Christoffer Dall , Jintack Lim Subject: Re: [PATCH 35/59] KVM: arm/arm64: nv: Support multiple nested stage 2 mmu structures In-Reply-To: References: <20190621093843.220980-1-marc.zyngier@arm.com> <20190621093843.220980-36-marc.zyngier@arm.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 EasyPG/1.0.0 Emacs/26 (aarch64-unknown-linux-gnu) MULE/6.0 (HANACHIRUSATO) 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: 62.31.163.78 X-SA-Exim-Rcpt-To: alexandru.elisei@arm.com, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org, andre.przywara@arm.com, Dave.Martin@arm.com, julien.thierry.kdev@gmail.com, james.morse@arm.com, suzuki.poulose@arm.com, Christoffer.Dall@arm.com, jintack@cs.columbia.edu X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org [Blast from the past!] Hi Alexandru, I'm currently reworking this series, so taking the opportunity to go through your comments (I won't reply to them all, as most are perfectly valid and need no further discussion). On Thu, 04 Jul 2019 16:51:52 +0100, Alexandru Elisei wrote: >=20 > On 6/21/19 10:38 AM, Marc Zyngier wrote: >=20 > > From: Christoffer Dall > > > > Add stage 2 mmu data structures for virtual EL2 and for nested guests. > > We don't yet populate shadow stage 2 page tables, but we now have a > > framework for getting to a shadow stage 2 pgd. > > > > We allocate twice the number of vcpus as stage 2 mmu structures because > > that's sufficient for each vcpu running two VMs without having to flush > > the stage 2 page tables. > > > > Signed-off-by: Christoffer Dall > > Signed-off-by: Marc Zyngier > > --- > > arch/arm/include/asm/kvm_host.h | 4 + > > arch/arm/include/asm/kvm_mmu.h | 3 + > > arch/arm64/include/asm/kvm_host.h | 28 +++++ > > arch/arm64/include/asm/kvm_mmu.h | 8 ++ > > arch/arm64/include/asm/kvm_nested.h | 7 ++ > > arch/arm64/kvm/nested.c | 172 ++++++++++++++++++++++++++++ > > virt/kvm/arm/arm.c | 16 ++- > > virt/kvm/arm/mmu.c | 31 ++--- > > 8 files changed, 254 insertions(+), 15 deletions(-) > > > > diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm= _host.h > > index e3217c4ad25b..b821eb2383ad 100644 > > --- a/arch/arm/include/asm/kvm_host.h > > +++ b/arch/arm/include/asm/kvm_host.h > > @@ -424,4 +424,8 @@ static inline bool kvm_arm_vcpu_is_finalized(struct= kvm_vcpu *vcpu) > > return true; > > } > > =20 > > +static inline void kvm_vcpu_load_hw_mmu(struct kvm_vcpu *vcpu) {} > > +static inline void kvm_vcpu_put_hw_mmu(struct kvm_vcpu *vcpu) {} > > +static inline int kvm_vcpu_init_nested(struct kvm_vcpu *vcpu) { return= 0; } > > + > > #endif /* __ARM_KVM_HOST_H__ */ > > diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_= mmu.h > > index be23e3f8e08c..e6984b6da2ce 100644 > > --- a/arch/arm/include/asm/kvm_mmu.h > > +++ b/arch/arm/include/asm/kvm_mmu.h > > @@ -420,6 +420,9 @@ static inline int hyp_map_aux_data(void) > > =20 > > static inline void kvm_set_ipa_limit(void) {} > > =20 > > +static inline void kvm_init_s2_mmu(struct kvm_s2_mmu *mmu) {} > > +static inline void kvm_init_nested(struct kvm *kvm) {} > > + > > static __always_inline u64 kvm_get_vttbr(struct kvm_s2_mmu *mmu) > > { > > struct kvm_vmid *vmid =3D &mmu->vmid; > > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm= /kvm_host.h > > index 3dee5e17a4ee..cc238de170d2 100644 > > --- a/arch/arm64/include/asm/kvm_host.h > > +++ b/arch/arm64/include/asm/kvm_host.h > > @@ -88,11 +88,39 @@ struct kvm_s2_mmu { > > phys_addr_t pgd_phys; > > =20 > > struct kvm *kvm; > > + > > + /* > > + * For a shadow stage-2 MMU, the virtual vttbr programmed by the guest > > + * hypervisor. Unused for kvm_arch->mmu. Set to 1 when the structure > > + * contains no valid information. > > + */ > > + u64 vttbr; > > + > > + /* true when this represents a nested context where virtual HCR_EL2.V= M =3D=3D 1 */ > > + bool nested_stage2_enabled; > > + > > + /* > > + * 0: Nobody is currently using this, check vttbr for validity > > + * >0: Somebody is actively using this. > > + */ > > + atomic_t refcnt; > > }; > > =20 > > +static inline bool kvm_s2_mmu_valid(struct kvm_s2_mmu *mmu) > > +{ > > + return !(mmu->vttbr & 1); > > +} > > + > > struct kvm_arch { > > struct kvm_s2_mmu mmu; > > =20 > > + /* > > + * Stage 2 paging stage for VMs with nested virtual using a virtual > > + * VMID. > > + */ > > + struct kvm_s2_mmu *nested_mmus; > > + size_t nested_mmus_size; > > + > > /* VTCR_EL2 value for this VM */ > > u64 vtcr; > > =20 > > diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/= kvm_mmu.h > > index 1eb6e0ca61c2..32bcaa1845dc 100644 > > --- a/arch/arm64/include/asm/kvm_mmu.h > > +++ b/arch/arm64/include/asm/kvm_mmu.h > > @@ -100,6 +100,7 @@ alternative_cb_end > > #include > > #include > > #include > > +#include > > =20 > > void kvm_update_va_mask(struct alt_instr *alt, > > __le32 *origptr, __le32 *updptr, int nr_inst); > > @@ -164,6 +165,7 @@ int create_hyp_exec_mappings(phys_addr_t phys_addr,= size_t size, > > void **haddr); > > void free_hyp_pgds(void); > > =20 > > +void kvm_unmap_stage2_range(struct kvm_s2_mmu *mmu, phys_addr_t start,= u64 size); > > void stage2_unmap_vm(struct kvm *kvm); > > int kvm_alloc_stage2_pgd(struct kvm_s2_mmu *mmu); > > void kvm_free_stage2_pgd(struct kvm_s2_mmu *mmu); > > @@ -635,5 +637,11 @@ static __always_inline void __load_guest_stage2(st= ruct kvm_s2_mmu *mmu) > > asm(ALTERNATIVE("nop", "isb", ARM64_WORKAROUND_1165522)); > > } > > =20 > > +static inline u64 get_vmid(u64 vttbr) > > +{ > > + return (vttbr & VTTBR_VMID_MASK(kvm_get_vmid_bits())) >> > > + VTTBR_VMID_SHIFT; > > +} > > + > > #endif /* __ASSEMBLY__ */ > > #endif /* __ARM64_KVM_MMU_H__ */ > > diff --git a/arch/arm64/include/asm/kvm_nested.h b/arch/arm64/include/a= sm/kvm_nested.h > > index 61e71d0d2151..d4021d0892bd 100644 > > --- a/arch/arm64/include/asm/kvm_nested.h > > +++ b/arch/arm64/include/asm/kvm_nested.h > > @@ -10,6 +10,13 @@ static inline bool nested_virt_in_use(const struct k= vm_vcpu *vcpu) > > test_bit(KVM_ARM_VCPU_NESTED_VIRT, vcpu->arch.features); > > } > > =20 > > +extern void kvm_init_nested(struct kvm *kvm); > > +extern int kvm_vcpu_init_nested(struct kvm_vcpu *vcpu); > > +extern void kvm_init_s2_mmu(struct kvm_s2_mmu *mmu); > > +extern struct kvm_s2_mmu *lookup_s2_mmu(struct kvm *kvm, u64 vttbr, u6= 4 hcr); > > +extern void kvm_vcpu_load_hw_mmu(struct kvm_vcpu *vcpu); > > +extern void kvm_vcpu_put_hw_mmu(struct kvm_vcpu *vcpu); > > + > > int handle_wfx_nested(struct kvm_vcpu *vcpu, bool is_wfe); > > extern bool forward_traps(struct kvm_vcpu *vcpu, u64 control_bit); > > extern bool forward_nv_traps(struct kvm_vcpu *vcpu); > > diff --git a/arch/arm64/kvm/nested.c b/arch/arm64/kvm/nested.c > > index 3872e3cf1691..4b38dc5c0be3 100644 > > --- a/arch/arm64/kvm/nested.c > > +++ b/arch/arm64/kvm/nested.c > > @@ -18,7 +18,161 @@ > > #include > > #include > > =20 > > +#include > > #include > > +#include > > +#include > > + > > +void kvm_init_nested(struct kvm *kvm) > > +{ > > + kvm_init_s2_mmu(&kvm->arch.mmu); > > + > > + kvm->arch.nested_mmus =3D NULL; > > + kvm->arch.nested_mmus_size =3D 0; > > +} > > + > > +int kvm_vcpu_init_nested(struct kvm_vcpu *vcpu) > > +{ > > + struct kvm *kvm =3D vcpu->kvm; > > + struct kvm_s2_mmu *tmp; > > + int num_mmus; > > + int ret =3D -ENOMEM; > > + > > + if (!test_bit(KVM_ARM_VCPU_NESTED_VIRT, vcpu->arch.features)) > > + return 0; > > + > > + if (!cpus_have_const_cap(ARM64_HAS_NESTED_VIRT)) > > + return -EINVAL; > > + > > + mutex_lock(&kvm->lock); > > + > > + num_mmus =3D atomic_read(&kvm->online_vcpus) * 2; > > + tmp =3D __krealloc(kvm->arch.nested_mmus, > > + num_mmus * sizeof(*kvm->arch.nested_mmus), > > + GFP_KERNEL | __GFP_ZERO); > > + > > + if (tmp) { > > + if (tmp !=3D kvm->arch.nested_mmus) > > + kfree(kvm->arch.nested_mmus); >=20 > Here we are freeing a resource that is shared between all virtual > CPUs. So if kvm_alloc_stage2_pgd (below) fails, we could end up > freeing something that has been initialized by previous > vcpu(s). Same thing happens if tmp =3D=3D kvm->arch.nested_mmus (because > of kfree(tmp)). >=20 > Looking at Documentation/virtual/kvm/api.txt (section 4.82, > KVM_ARM_VCPU_IOCTL): >=20 > Userspace can call this function multiple times for a given vcpu, > including after the vcpu has been run. This will reset the vcpu to > its initial state. >=20 > It seems to me that it is allowed for userspace to try to call > KVM_ARM_VCPU_IOCTL again after it failed. I was wondering if it's > possible to end up in a situation where the second call succeeds, > but kvm->arch.nested_mmus is not initialized properly and if we > should care about that. Indeed, this needs reworking. I think that in the event of any allocation failure, we're better off leaving things in place. Given that we always perform a krealloc(), it should be safe to do so. >=20 > > + > > + tmp[num_mmus - 1].kvm =3D kvm; > > + atomic_set(&tmp[num_mmus - 1].refcnt, 0); > > + ret =3D kvm_alloc_stage2_pgd(&tmp[num_mmus - 1]); > > + if (ret) > > + goto out; > > + > > + tmp[num_mmus - 2].kvm =3D kvm; > > + atomic_set(&tmp[num_mmus - 2].refcnt, 0); > > + ret =3D kvm_alloc_stage2_pgd(&tmp[num_mmus - 2]); > > + if (ret) { > > + kvm_free_stage2_pgd(&tmp[num_mmus - 1]); > > + goto out; > > + } > > + > > + kvm->arch.nested_mmus_size =3D num_mmus; > > + kvm->arch.nested_mmus =3D tmp; > > + tmp =3D NULL; > > + } > > + > > +out: > > + kfree(tmp); > > + mutex_unlock(&kvm->lock); > > + return ret; > > +} > > + > > +/* Must be called with kvm->lock held */ > > +struct kvm_s2_mmu *lookup_s2_mmu(struct kvm *kvm, u64 vttbr, u64 hcr) > > +{ > > + bool nested_stage2_enabled =3D hcr & HCR_VM; > > + int i; > > + > > + /* Don't consider the CnP bit for the vttbr match */ > > + vttbr =3D vttbr & ~1UL; >=20 > There's a define for that bit, VTTBR_CNP_BIT in kvm_arm.h (which this file > includes). Fair enough. >=20 > > + > > + /* Search a mmu in the list using the virtual VMID as a key */ >=20 > I think when the guest has stage 2 enabled we also match on > VTTBR_EL2.VMID + VTTBR_EL2.BADDR. Yes. >=20 > > + for (i =3D 0; i < kvm->arch.nested_mmus_size; i++) { > > + struct kvm_s2_mmu *mmu =3D &kvm->arch.nested_mmus[i]; > > + > > + if (!kvm_s2_mmu_valid(mmu)) > > + continue; > > + > > + if (nested_stage2_enabled && > > + mmu->nested_stage2_enabled && > > + vttbr =3D=3D mmu->vttbr) > > + return mmu; > > + > > + if (!nested_stage2_enabled && > > + !mmu->nested_stage2_enabled && > > + get_vmid(vttbr) =3D=3D get_vmid(mmu->vttbr)) > > + return mmu; >=20 > I'm struggling to understand why we do this. As far as I can tell, > this applies only to non-vhe guest hypervisors, because that's the > only situation where we run something at vEL1 without shadow stage 2 > enabled. I don't think the non-VHE consideration is relevant here. Trying to distinguish between arbitrary use cases is just a massive distraction and gets in the way of implementing the architecture correctly. > There's only one MMU that matches that guest, because > there's only one host for the non-vhe hypervisor. So why are we > matching on vmid only, instead of matching on the entire vttbr? Is > it because we don't want to get fooled by a naughty guest that > changes the BADDR each time it switches to its EL1 host? Or > something else entirely that I'm missing? First, let's remember one thing: No matter whether we have S2 enabled or not, TLBs are tagged by VMID. I wondered about that for a long time, but couldn't find anything in the architecture that would contradict this. And if you think of what a CPU must implement, it makes more sense to always tag things than try to come up with more fancy schemes. Given that our shadow S2 is an ugly form of SW-loaded TLBs, matching the VMID is critical to hit the right shadow MMU context. And since S2 *translation* is disabled, it is perfectly valid to ignore the BADDR part of VTTBR, and VHE-vs-!VHE doesn't come into the equation. Now, the real cause for questioning is the previous statement: why do we decide to match on the whole VTTBR when S2 translation is enabled? Let's imagine a guest that reuses the same VMID for different translations (that's a bit bonkers, but unfortunately not forbidden by the architecture if you consider per-CPU translations). And even in the single VCPU case that would change BADDR each time without invalidating the TLBs: If we only matched on the VMID, we could potentially end-up with TLB conflicts, and that's not a nice place to be. So we will just pick a new MMU context, and start populating shadow translations based on this context. This is pretty forgiving for broken guests, but it also simplifies the implementation. >=20 > > + } > > + return NULL; > > +} > > + > > +static struct kvm_s2_mmu *get_s2_mmu_nested(struct kvm_vcpu *vcpu) > > +{ > > + struct kvm *kvm =3D vcpu->kvm; > > + u64 vttbr =3D vcpu_read_sys_reg(vcpu, VTTBR_EL2); > > + u64 hcr=3D vcpu_read_sys_reg(vcpu, HCR_EL2); > > + struct kvm_s2_mmu *s2_mmu; > > + int i; > > + > > + s2_mmu =3D lookup_s2_mmu(kvm, vttbr, hcr); > > + if (s2_mmu) > > + goto out; > > + > > + for (i =3D 0; i < kvm->arch.nested_mmus_size; i++) { > > + s2_mmu =3D &kvm->arch.nested_mmus[i]; > > + > > + if (atomic_read(&s2_mmu->refcnt) =3D=3D 0) > > + break; > > + } > > + BUG_ON(atomic_read(&s2_mmu->refcnt)); /* We have struct MMUs to spare= */ > > + > > + if (kvm_s2_mmu_valid(s2_mmu)) { > > + /* Clear the old state */ > > + kvm_unmap_stage2_range(s2_mmu, 0, kvm_phys_size(kvm)); > > + if (s2_mmu->vmid.vmid_gen) > > + kvm_call_hyp(__kvm_tlb_flush_vmid, s2_mmu); > > + } > > + > > + /* > > + * The virtual VMID (modulo CnP) will be used as a key when matching > > + * an existing kvm_s2_mmu. > > + */ > > + s2_mmu->vttbr =3D vttbr & ~1UL; > > + s2_mmu->nested_stage2_enabled =3D hcr & HCR_VM; > > + > > +out: > > + atomic_inc(&s2_mmu->refcnt); > > + return s2_mmu; > > +} > > + > > +void kvm_init_s2_mmu(struct kvm_s2_mmu *mmu) > > +{ > > + mmu->vttbr =3D 1; > > + mmu->nested_stage2_enabled =3D false; > > + atomic_set(&mmu->refcnt, 0); > > +} > > + > > +void kvm_vcpu_load_hw_mmu(struct kvm_vcpu *vcpu) > > +{ > > + if (is_hyp_ctxt(vcpu)) { >=20 > If userspace has set the nested feature, but hasn't set the vcpu > mode to PSR_MODE_EL2h/PSR_MODE_EL2t, we will never use > kvm->arch.mmu, and instead we'll always take the mmu_lock and search > for the mmu. Is that something we should care about? I'm really not worried about this. If the user has asked for nested support but doesn't make use of it, tough luck. >=20 > > + vcpu->arch.hw_mmu =3D &vcpu->kvm->arch.mmu; > > + } else { > > + spin_lock(&vcpu->kvm->mmu_lock); > > + vcpu->arch.hw_mmu =3D get_s2_mmu_nested(vcpu); > > + spin_unlock(&vcpu->kvm->mmu_lock); > > + } > > +} > > + > > +void kvm_vcpu_put_hw_mmu(struct kvm_vcpu *vcpu) > > +{ > > + if (vcpu->arch.hw_mmu !=3D &vcpu->kvm->arch.mmu) { > > + atomic_dec(&vcpu->arch.hw_mmu->refcnt); > > + vcpu->arch.hw_mmu =3D NULL; > > + } > > +} > > =20 > > /* > > * Inject wfx to the virtual EL2 if this is not from the virtual EL2 a= nd > > @@ -37,3 +191,21 @@ int handle_wfx_nested(struct kvm_vcpu *vcpu, bool i= s_wfe) > > =20 > > return -EINVAL; > > } > > + > > +void kvm_arch_flush_shadow_all(struct kvm *kvm) > > +{ > > + int i; > > + > > + for (i =3D 0; i < kvm->arch.nested_mmus_size; i++) { > > + struct kvm_s2_mmu *mmu =3D &kvm->arch.nested_mmus[i]; > > + > > + WARN_ON(atomic_read(&mmu->refcnt)); > > + > > + if (!atomic_read(&mmu->refcnt)) > > + kvm_free_stage2_pgd(mmu); > > + } > > + kfree(kvm->arch.nested_mmus); > > + kvm->arch.nested_mmus =3D NULL; > > + kvm->arch.nested_mmus_size =3D 0; > > + kvm_free_stage2_pgd(&kvm->arch.mmu); > > +} > > diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c > > index 5d4371633e1c..4e3cbfa1ecbe 100644 > > --- a/virt/kvm/arm/arm.c > > +++ b/virt/kvm/arm/arm.c > > @@ -36,6 +36,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > #include > > @@ -126,6 +127,8 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long= type) > > kvm->arch.mmu.vmid.vmid_gen =3D 0; > > kvm->arch.mmu.kvm =3D kvm; > > =20 > > + kvm_init_nested(kvm); >=20 > More context: >=20 > @@ -120,18 +121,20 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long= type) > =C2=A0 > =C2=A0=C2=A0=C2=A0=C2=A0 ret =3D kvm_alloc_stage2_pgd(&kvm->arch.mmu); > =C2=A0=C2=A0=C2=A0=C2=A0 if (ret) > =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 goto out_fail_alloc; > =C2=A0 > =C2=A0=C2=A0=C2=A0=C2=A0 /* Mark the initial VMID generation invalid */ > =C2=A0=C2=A0=C2=A0=C2=A0 kvm->arch.mmu.vmid.vmid_gen =3D 0; > =C2=A0=C2=A0=C2=A0=C2=A0 kvm->arch.mmu.kvm =3D kvm; > =C2=A0 > +=C2=A0=C2=A0=C2=A0 kvm_init_nested(kvm); > + >=20 > kvm_alloc_stage2_pgd ends up calling kvm_init_s2_mmu for > kvm->arch.mmu. kvm_init_nested does the same thing, and we end up > calling kvm_init_s2_mmu for kvm->arch.mmu twice. There's really no > harm in doing it twice, but I thought I could mention it because it > looks to me that the fix is simple: remove the kvm_init_s2_mmu call > from kvm_init_nested. The double initialization is also true for the > tip of the series. I've reworked this part a bit, and need to reconcile the above with what I now have. Overall, I do agree that there is some vastly redundant init here. And a very belated thanks for all the work you've put into reviewing this difficult series. Rest assured that this wasn't in vain! Thanks, M. --=20 Jazz is not dead, it just smells funny. 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=-6.8 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 558B4C33C8C for ; Sun, 5 Jan 2020 11:35:58 +0000 (UTC) Received: from mm01.cs.columbia.edu (mm01.cs.columbia.edu [128.59.11.253]) by mail.kernel.org (Postfix) with ESMTP id C7F4F21775 for ; Sun, 5 Jan 2020 11:35:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="ANivoHac" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C7F4F21775 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=kvmarm-bounces@lists.cs.columbia.edu Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 4A4254AE99; Sun, 5 Jan 2020 06:35:57 -0500 (EST) X-Virus-Scanned: at lists.cs.columbia.edu Authentication-Results: mm01.cs.columbia.edu (amavisd-new); dkim=softfail (fail, message has been altered) header.i=@kernel.org Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id mVNjGu8bF18Q; Sun, 5 Jan 2020 06:35:55 -0500 (EST) Received: from mm01.cs.columbia.edu (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 5382C4AE9A; Sun, 5 Jan 2020 06:35:55 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id ED67E4AE96 for ; Sun, 5 Jan 2020 06:35:53 -0500 (EST) X-Virus-Scanned: at lists.cs.columbia.edu Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Ct6I54CKKtLs for ; Sun, 5 Jan 2020 06:35:52 -0500 (EST) Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by mm01.cs.columbia.edu (Postfix) with ESMTPS id E4BE64A319 for ; Sun, 5 Jan 2020 06:35:51 -0500 (EST) Received: from disco-boy.misterjones.org (disco-boy.misterjones.org [51.254.78.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9E5F220848; Sun, 5 Jan 2020 11:35:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578224150; bh=dktLam6PZZSt7Od13pgFScuOzRHoMRZ6kh53YBAa22A=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=ANivoHacQhSSiLX8FrqMfeOxwm1J5HqPpYJxlsJ4GeyEPK0wTatHaiGwuNlnEb62d g4UJ+Kx9T4w9GDixPvvy8NtYpL40SroFqtZUqRydYLdclQJpgX3aFQRxmIPYMD6jJY FFWGNaRck/2jhVzShi/IBb1EWPxY0aR1i5ALFo2k= Received: from 78.163-31-62.static.virginmediabusiness.co.uk ([62.31.163.78] helo=big-swifty.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1io4CC-0001t7-HT; Sun, 05 Jan 2020 11:35:48 +0000 Date: Sun, 05 Jan 2020 11:35:38 +0000 Message-ID: <86mub2gmph.wl-maz@kernel.org> From: Marc Zyngier To: Alexandru Elisei Subject: Re: [PATCH 35/59] KVM: arm/arm64: nv: Support multiple nested stage 2 mmu structures In-Reply-To: References: <20190621093843.220980-1-marc.zyngier@arm.com> <20190621093843.220980-36-marc.zyngier@arm.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 EasyPG/1.0.0 Emacs/26 (aarch64-unknown-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") X-SA-Exim-Connect-IP: 62.31.163.78 X-SA-Exim-Rcpt-To: alexandru.elisei@arm.com, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org, andre.przywara@arm.com, Dave.Martin@arm.com, julien.thierry.kdev@gmail.com, james.morse@arm.com, suzuki.poulose@arm.com, Christoffer.Dall@arm.com, jintack@cs.columbia.edu X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false Cc: kvm@vger.kernel.org, Andre Przywara , kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org, Dave Martin X-BeenThere: kvmarm@lists.cs.columbia.edu X-Mailman-Version: 2.1.14 Precedence: list List-Id: Where KVM/ARM decisions are made List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu W0JsYXN0IGZyb20gdGhlIHBhc3QhXQoKSGkgQWxleGFuZHJ1LAoKSSdtIGN1cnJlbnRseSByZXdv cmtpbmcgdGhpcyBzZXJpZXMsIHNvIHRha2luZyB0aGUgb3Bwb3J0dW5pdHkgdG8gZ28KdGhyb3Vn aCB5b3VyIGNvbW1lbnRzIChJIHdvbid0IHJlcGx5IHRvIHRoZW0gYWxsLCBhcyBtb3N0IGFyZQpw ZXJmZWN0bHkgdmFsaWQgYW5kIG5lZWQgbm8gZnVydGhlciBkaXNjdXNzaW9uKS4KCk9uIFRodSwg MDQgSnVsIDIwMTkgMTY6NTE6NTIgKzAxMDAsCkFsZXhhbmRydSBFbGlzZWkgPGFsZXhhbmRydS5l bGlzZWlAYXJtLmNvbT4gd3JvdGU6Cj4gCj4gT24gNi8yMS8xOSAxMDozOCBBTSwgTWFyYyBaeW5n aWVyIHdyb3RlOgo+IAo+ID4gRnJvbTogQ2hyaXN0b2ZmZXIgRGFsbCA8Y2hyaXN0b2ZmZXIuZGFs bEBhcm0uY29tPgo+ID4KPiA+IEFkZCBzdGFnZSAyIG1tdSBkYXRhIHN0cnVjdHVyZXMgZm9yIHZp cnR1YWwgRUwyIGFuZCBmb3IgbmVzdGVkIGd1ZXN0cy4KPiA+IFdlIGRvbid0IHlldCBwb3B1bGF0 ZSBzaGFkb3cgc3RhZ2UgMiBwYWdlIHRhYmxlcywgYnV0IHdlIG5vdyBoYXZlIGEKPiA+IGZyYW1l d29yayBmb3IgZ2V0dGluZyB0byBhIHNoYWRvdyBzdGFnZSAyIHBnZC4KPiA+Cj4gPiBXZSBhbGxv Y2F0ZSB0d2ljZSB0aGUgbnVtYmVyIG9mIHZjcHVzIGFzIHN0YWdlIDIgbW11IHN0cnVjdHVyZXMg YmVjYXVzZQo+ID4gdGhhdCdzIHN1ZmZpY2llbnQgZm9yIGVhY2ggdmNwdSBydW5uaW5nIHR3byBW TXMgd2l0aG91dCBoYXZpbmcgdG8gZmx1c2gKPiA+IHRoZSBzdGFnZSAyIHBhZ2UgdGFibGVzLgo+ ID4KPiA+IFNpZ25lZC1vZmYtYnk6IENocmlzdG9mZmVyIERhbGwgPGNocmlzdG9mZmVyLmRhbGxA YXJtLmNvbT4KPiA+IFNpZ25lZC1vZmYtYnk6IE1hcmMgWnluZ2llciA8bWFyYy56eW5naWVyQGFy bS5jb20+Cj4gPiAtLS0KPiA+ICBhcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oICAgICB8 ICAgNCArCj4gPiAgYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX21tdS5oICAgICAgfCAgIDMgKwo+ ID4gIGFyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCAgIHwgIDI4ICsrKysrCj4gPiAg YXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbW11LmggICAgfCAgIDggKysKPiA+ICBhcmNoL2Fy bTY0L2luY2x1ZGUvYXNtL2t2bV9uZXN0ZWQuaCB8ICAgNyArKwo+ID4gIGFyY2gvYXJtNjQva3Zt L25lc3RlZC5jICAgICAgICAgICAgIHwgMTcyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysK PiA+ICB2aXJ0L2t2bS9hcm0vYXJtLmMgICAgICAgICAgICAgICAgICB8ICAxNiArKy0KPiA+ICB2 aXJ0L2t2bS9hcm0vbW11LmMgICAgICAgICAgICAgICAgICB8ICAzMSArKy0tLQo+ID4gIDggZmls ZXMgY2hhbmdlZCwgMjU0IGluc2VydGlvbnMoKyksIDE1IGRlbGV0aW9ucygtKQo+ID4KPiA+IGRp ZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC9hcm0vaW5j bHVkZS9hc20va3ZtX2hvc3QuaAo+ID4gaW5kZXggZTMyMTdjNGFkMjViLi5iODIxZWIyMzgzYWQg MTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCj4gPiArKysg Yi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCj4gPiBAQCAtNDI0LDQgKzQyNCw4IEBA IHN0YXRpYyBpbmxpbmUgYm9vbCBrdm1fYXJtX3ZjcHVfaXNfZmluYWxpemVkKHN0cnVjdCBrdm1f dmNwdSAqdmNwdSkKPiA+ICAJcmV0dXJuIHRydWU7Cj4gPiAgfQo+ID4gIAo+ID4gK3N0YXRpYyBp bmxpbmUgdm9pZCBrdm1fdmNwdV9sb2FkX2h3X21tdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpIHt9 Cj4gPiArc3RhdGljIGlubGluZSB2b2lkIGt2bV92Y3B1X3B1dF9od19tbXUoc3RydWN0IGt2bV92 Y3B1ICp2Y3B1KSB7fQo+ID4gK3N0YXRpYyBpbmxpbmUgaW50IGt2bV92Y3B1X2luaXRfbmVzdGVk KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkgeyByZXR1cm4gMDsgfQo+ID4gKwo+ID4gICNlbmRpZiAv KiBfX0FSTV9LVk1fSE9TVF9IX18gKi8KPiA+IGRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRl L2FzbS9rdm1fbW11LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fbW11LmgKPiA+IGluZGV4 IGJlMjNlM2Y4ZTA4Yy4uZTY5ODRiNmRhMmNlIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9hcm0vaW5j bHVkZS9hc20va3ZtX21tdS5oCj4gPiArKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fbW11 LmgKPiA+IEBAIC00MjAsNiArNDIwLDkgQEAgc3RhdGljIGlubGluZSBpbnQgaHlwX21hcF9hdXhf ZGF0YSh2b2lkKQo+ID4gIAo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fc2V0X2lwYV9saW1p dCh2b2lkKSB7fQo+ID4gIAo+ID4gK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1faW5pdF9zMl9tbXUo c3RydWN0IGt2bV9zMl9tbXUgKm1tdSkge30KPiA+ICtzdGF0aWMgaW5saW5lIHZvaWQga3ZtX2lu aXRfbmVzdGVkKHN0cnVjdCBrdm0gKmt2bSkge30KPiA+ICsKPiA+ICBzdGF0aWMgX19hbHdheXNf aW5saW5lIHU2NCBrdm1fZ2V0X3Z0dGJyKHN0cnVjdCBrdm1fczJfbW11ICptbXUpCj4gPiAgewo+ ID4gIAlzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQgPSAmbW11LT52bWlkOwo+ID4gZGlmZiAtLWdpdCBh L2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9h c20va3ZtX2hvc3QuaAo+ID4gaW5kZXggM2RlZTVlMTdhNGVlLi5jYzIzOGRlMTcwZDIgMTAwNjQ0 Cj4gPiAtLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKPiA+ICsrKyBiL2Fy Y2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAo+ID4gQEAgLTg4LDExICs4OCwzOSBAQCBz dHJ1Y3Qga3ZtX3MyX21tdSB7Cj4gPiAgCXBoeXNfYWRkcl90CXBnZF9waHlzOwo+ID4gIAo+ID4g IAlzdHJ1Y3Qga3ZtICprdm07Cj4gPiArCj4gPiArCS8qCj4gPiArCSAqIEZvciBhIHNoYWRvdyBz dGFnZS0yIE1NVSwgdGhlIHZpcnR1YWwgdnR0YnIgcHJvZ3JhbW1lZCBieSB0aGUgZ3Vlc3QKPiA+ ICsJICogaHlwZXJ2aXNvci4gIFVudXNlZCBmb3Iga3ZtX2FyY2gtPm1tdS4gU2V0IHRvIDEgd2hl biB0aGUgc3RydWN0dXJlCj4gPiArCSAqIGNvbnRhaW5zIG5vIHZhbGlkIGluZm9ybWF0aW9uLgo+ ID4gKwkgKi8KPiA+ICsJdTY0CXZ0dGJyOwo+ID4gKwo+ID4gKwkvKiB0cnVlIHdoZW4gdGhpcyBy ZXByZXNlbnRzIGEgbmVzdGVkIGNvbnRleHQgd2hlcmUgdmlydHVhbCBIQ1JfRUwyLlZNID09IDEg Ki8KPiA+ICsJYm9vbAluZXN0ZWRfc3RhZ2UyX2VuYWJsZWQ7Cj4gPiArCj4gPiArCS8qCj4gPiAr CSAqICAwOiBOb2JvZHkgaXMgY3VycmVudGx5IHVzaW5nIHRoaXMsIGNoZWNrIHZ0dGJyIGZvciB2 YWxpZGl0eQo+ID4gKwkgKiA+MDogU29tZWJvZHkgaXMgYWN0aXZlbHkgdXNpbmcgdGhpcy4KPiA+ ICsJICovCj4gPiArCWF0b21pY190IHJlZmNudDsKPiA+ICB9Owo+ID4gIAo+ID4gK3N0YXRpYyBp bmxpbmUgYm9vbCBrdm1fczJfbW11X3ZhbGlkKHN0cnVjdCBrdm1fczJfbW11ICptbXUpCj4gPiAr ewo+ID4gKwlyZXR1cm4gIShtbXUtPnZ0dGJyICYgMSk7Cj4gPiArfQo+ID4gKwo+ID4gIHN0cnVj dCBrdm1fYXJjaCB7Cj4gPiAgCXN0cnVjdCBrdm1fczJfbW11IG1tdTsKPiA+ICAKPiA+ICsJLyoK PiA+ICsJICogU3RhZ2UgMiBwYWdpbmcgc3RhZ2UgZm9yIFZNcyB3aXRoIG5lc3RlZCB2aXJ0dWFs IHVzaW5nIGEgdmlydHVhbAo+ID4gKwkgKiBWTUlELgo+ID4gKwkgKi8KPiA+ICsJc3RydWN0IGt2 bV9zMl9tbXUgKm5lc3RlZF9tbXVzOwo+ID4gKwlzaXplX3QgbmVzdGVkX21tdXNfc2l6ZTsKPiA+ ICsKPiA+ICAJLyogVlRDUl9FTDIgdmFsdWUgZm9yIHRoaXMgVk0gKi8KPiA+ICAJdTY0ICAgIHZ0 Y3I7Cj4gPiAgCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbW11 LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9tbXUuaAo+ID4gaW5kZXggMWViNmUwY2E2 MWMyLi4zMmJjYWExODQ1ZGMgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNt L2t2bV9tbXUuaAo+ID4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbW11LmgKPiA+ IEBAIC0xMDAsNiArMTAwLDcgQEAgYWx0ZXJuYXRpdmVfY2JfZW5kCj4gPiAgI2luY2x1ZGUgPGFz bS9tbXVfY29udGV4dC5oPgo+ID4gICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgo+ID4gICNpbmNs dWRlIDxhc20va3ZtX2VtdWxhdGUuaD4KPiA+ICsjaW5jbHVkZSA8YXNtL2t2bV9uZXN0ZWQuaD4K PiA+ICAKPiA+ICB2b2lkIGt2bV91cGRhdGVfdmFfbWFzayhzdHJ1Y3QgYWx0X2luc3RyICphbHQs Cj4gPiAgCQkJX19sZTMyICpvcmlncHRyLCBfX2xlMzIgKnVwZHB0ciwgaW50IG5yX2luc3QpOwo+ ID4gQEAgLTE2NCw2ICsxNjUsNyBAQCBpbnQgY3JlYXRlX2h5cF9leGVjX21hcHBpbmdzKHBoeXNf YWRkcl90IHBoeXNfYWRkciwgc2l6ZV90IHNpemUsCj4gPiAgCQkJICAgICB2b2lkICoqaGFkZHIp Owo+ID4gIHZvaWQgZnJlZV9oeXBfcGdkcyh2b2lkKTsKPiA+ICAKPiA+ICt2b2lkIGt2bV91bm1h cF9zdGFnZTJfcmFuZ2Uoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgcGh5c19hZGRyX3Qgc3RhcnQs IHU2NCBzaXplKTsKPiA+ICB2b2lkIHN0YWdlMl91bm1hcF92bShzdHJ1Y3Qga3ZtICprdm0pOwo+ ID4gIGludCBrdm1fYWxsb2Nfc3RhZ2UyX3BnZChzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11KTsKPiA+ ICB2b2lkIGt2bV9mcmVlX3N0YWdlMl9wZ2Qoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSk7Cj4gPiBA QCAtNjM1LDUgKzYzNywxMSBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX19sb2FkX2d1 ZXN0X3N0YWdlMihzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11KQo+ID4gIAlhc20oQUxURVJOQVRJVkUo Im5vcCIsICJpc2IiLCBBUk02NF9XT1JLQVJPVU5EXzExNjU1MjIpKTsKPiA+ICB9Cj4gPiAgCj4g PiArc3RhdGljIGlubGluZSB1NjQgZ2V0X3ZtaWQodTY0IHZ0dGJyKQo+ID4gK3sKPiA+ICsJcmV0 dXJuICh2dHRiciAmIFZUVEJSX1ZNSURfTUFTSyhrdm1fZ2V0X3ZtaWRfYml0cygpKSkgPj4KPiA+ ICsJCVZUVEJSX1ZNSURfU0hJRlQ7Cj4gPiArfQo+ID4gKwo+ID4gICNlbmRpZiAvKiBfX0FTU0VN QkxZX18gKi8KPiA+ICAjZW5kaWYgLyogX19BUk02NF9LVk1fTU1VX0hfXyAqLwo+ID4gZGlmZiAt LWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX25lc3RlZC5oIGIvYXJjaC9hcm02NC9p bmNsdWRlL2FzbS9rdm1fbmVzdGVkLmgKPiA+IGluZGV4IDYxZTcxZDBkMjE1MS4uZDQwMjFkMDg5 MmJkIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbmVzdGVkLmgK PiA+ICsrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX25lc3RlZC5oCj4gPiBAQCAtMTAs NiArMTAsMTMgQEAgc3RhdGljIGlubGluZSBib29sIG5lc3RlZF92aXJ0X2luX3VzZShjb25zdCBz dHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCj4gPiAgCQl0ZXN0X2JpdChLVk1fQVJNX1ZDUFVfTkVTVEVE X1ZJUlQsIHZjcHUtPmFyY2guZmVhdHVyZXMpOwo+ID4gIH0KPiA+ICAKPiA+ICtleHRlcm4gdm9p ZCBrdm1faW5pdF9uZXN0ZWQoc3RydWN0IGt2bSAqa3ZtKTsKPiA+ICtleHRlcm4gaW50IGt2bV92 Y3B1X2luaXRfbmVzdGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Cj4gPiArZXh0ZXJuIHZvaWQg a3ZtX2luaXRfczJfbW11KHN0cnVjdCBrdm1fczJfbW11ICptbXUpOwo+ID4gK2V4dGVybiBzdHJ1 Y3Qga3ZtX3MyX21tdSAqbG9va3VwX3MyX21tdShzdHJ1Y3Qga3ZtICprdm0sIHU2NCB2dHRiciwg dTY0IGhjcik7Cj4gPiArZXh0ZXJuIHZvaWQga3ZtX3ZjcHVfbG9hZF9od19tbXUoc3RydWN0IGt2 bV92Y3B1ICp2Y3B1KTsKPiA+ICtleHRlcm4gdm9pZCBrdm1fdmNwdV9wdXRfaHdfbW11KHN0cnVj dCBrdm1fdmNwdSAqdmNwdSk7Cj4gPiArCj4gPiAgaW50IGhhbmRsZV93ZnhfbmVzdGVkKHN0cnVj dCBrdm1fdmNwdSAqdmNwdSwgYm9vbCBpc193ZmUpOwo+ID4gIGV4dGVybiBib29sIGZvcndhcmRf dHJhcHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgY29udHJvbF9iaXQpOwo+ID4gIGV4dGVy biBib29sIGZvcndhcmRfbnZfdHJhcHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKPiA+IGRpZmYg LS1naXQgYS9hcmNoL2FybTY0L2t2bS9uZXN0ZWQuYyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5j Cj4gPiBpbmRleCAzODcyZTNjZjE2OTEuLjRiMzhkYzVjMGJlMyAxMDA2NDQKPiA+IC0tLSBhL2Fy Y2gvYXJtNjQva3ZtL25lc3RlZC5jCj4gPiArKysgYi9hcmNoL2FybTY0L2t2bS9uZXN0ZWQuYwo+ ID4gQEAgLTE4LDcgKzE4LDE2MSBAQAo+ID4gICNpbmNsdWRlIDxsaW51eC9rdm0uaD4KPiA+ICAj aW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KPiA+ICAKPiA+ICsjaW5jbHVkZSA8YXNtL2t2bV9h cm0uaD4KPiA+ICAjaW5jbHVkZSA8YXNtL2t2bV9lbXVsYXRlLmg+Cj4gPiArI2luY2x1ZGUgPGFz bS9rdm1fbW11Lmg+Cj4gPiArI2luY2x1ZGUgPGFzbS9rdm1fbmVzdGVkLmg+Cj4gPiArCj4gPiAr dm9pZCBrdm1faW5pdF9uZXN0ZWQoc3RydWN0IGt2bSAqa3ZtKQo+ID4gK3sKPiA+ICsJa3ZtX2lu aXRfczJfbW11KCZrdm0tPmFyY2gubW11KTsKPiA+ICsKPiA+ICsJa3ZtLT5hcmNoLm5lc3RlZF9t bXVzID0gTlVMTDsKPiA+ICsJa3ZtLT5hcmNoLm5lc3RlZF9tbXVzX3NpemUgPSAwOwo+ID4gK30K PiA+ICsKPiA+ICtpbnQga3ZtX3ZjcHVfaW5pdF9uZXN0ZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1 KQo+ID4gK3sKPiA+ICsJc3RydWN0IGt2bSAqa3ZtID0gdmNwdS0+a3ZtOwo+ID4gKwlzdHJ1Y3Qg a3ZtX3MyX21tdSAqdG1wOwo+ID4gKwlpbnQgbnVtX21tdXM7Cj4gPiArCWludCByZXQgPSAtRU5P TUVNOwo+ID4gKwo+ID4gKwlpZiAoIXRlc3RfYml0KEtWTV9BUk1fVkNQVV9ORVNURURfVklSVCwg dmNwdS0+YXJjaC5mZWF0dXJlcykpCj4gPiArCQlyZXR1cm4gMDsKPiA+ICsKPiA+ICsJaWYgKCFj cHVzX2hhdmVfY29uc3RfY2FwKEFSTTY0X0hBU19ORVNURURfVklSVCkpCj4gPiArCQlyZXR1cm4g LUVJTlZBTDsKPiA+ICsKPiA+ICsJbXV0ZXhfbG9jaygma3ZtLT5sb2NrKTsKPiA+ICsKPiA+ICsJ bnVtX21tdXMgPSBhdG9taWNfcmVhZCgma3ZtLT5vbmxpbmVfdmNwdXMpICogMjsKPiA+ICsJdG1w ID0gX19rcmVhbGxvYyhrdm0tPmFyY2gubmVzdGVkX21tdXMsCj4gPiArCQkJIG51bV9tbXVzICog c2l6ZW9mKCprdm0tPmFyY2gubmVzdGVkX21tdXMpLAo+ID4gKwkJCSBHRlBfS0VSTkVMIHwgX19H RlBfWkVSTyk7Cj4gPiArCj4gPiArCWlmICh0bXApIHsKPiA+ICsJCWlmICh0bXAgIT0ga3ZtLT5h cmNoLm5lc3RlZF9tbXVzKQo+ID4gKwkJCWtmcmVlKGt2bS0+YXJjaC5uZXN0ZWRfbW11cyk7Cj4g Cj4gSGVyZSB3ZSBhcmUgZnJlZWluZyBhIHJlc291cmNlIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4g YWxsIHZpcnR1YWwKPiBDUFVzLiBTbyBpZiBrdm1fYWxsb2Nfc3RhZ2UyX3BnZCAoYmVsb3cpIGZh aWxzLCB3ZSBjb3VsZCBlbmQgdXAKPiBmcmVlaW5nIHNvbWV0aGluZyB0aGF0IGhhcyBiZWVuIGlu aXRpYWxpemVkIGJ5IHByZXZpb3VzCj4gdmNwdShzKS4gU2FtZSB0aGluZyBoYXBwZW5zIGlmIHRt cCA9PSBrdm0tPmFyY2gubmVzdGVkX21tdXMgKGJlY2F1c2UKPiBvZiBrZnJlZSh0bXApKS4KPiAK PiBMb29raW5nIGF0IERvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dCAoc2VjdGlvbiA0 LjgyLAo+IEtWTV9BUk1fVkNQVV9JT0NUTCk6Cj4gCj4gVXNlcnNwYWNlIGNhbiBjYWxsIHRoaXMg ZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgZm9yIGEgZ2l2ZW4gdmNwdSwKPiBpbmNsdWRpbmcgYWZ0 ZXIgdGhlIHZjcHUgaGFzIGJlZW4gcnVuLiBUaGlzIHdpbGwgcmVzZXQgdGhlIHZjcHUgdG8KPiBp dHMgaW5pdGlhbCBzdGF0ZS4KPiAKPiBJdCBzZWVtcyB0byBtZSB0aGF0IGl0IGlzIGFsbG93ZWQg Zm9yIHVzZXJzcGFjZSB0byB0cnkgdG8gY2FsbAo+IEtWTV9BUk1fVkNQVV9JT0NUTCBhZ2FpbiBh ZnRlciBpdCBmYWlsZWQuIEkgd2FzIHdvbmRlcmluZyBpZiBpdCdzCj4gcG9zc2libGUgdG8gZW5k IHVwIGluIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBzZWNvbmQgY2FsbCBzdWNjZWVkcywKPiBidXQg a3ZtLT5hcmNoLm5lc3RlZF9tbXVzIGlzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSBhbmQgaWYg d2UKPiBzaG91bGQgY2FyZSBhYm91dCB0aGF0LgoKSW5kZWVkLCB0aGlzIG5lZWRzIHJld29ya2lu Zy4gSSB0aGluayB0aGF0IGluIHRoZSBldmVudCBvZiBhbnkKYWxsb2NhdGlvbiBmYWlsdXJlLCB3 ZSdyZSBiZXR0ZXIgb2ZmIGxlYXZpbmcgdGhpbmdzIGluIHBsYWNlLiBHaXZlbgp0aGF0IHdlIGFs d2F5cyBwZXJmb3JtIGEga3JlYWxsb2MoKSwgaXQgc2hvdWxkIGJlIHNhZmUgdG8gZG8gc28uCgo+ IAo+ID4gKwo+ID4gKwkJdG1wW251bV9tbXVzIC0gMV0ua3ZtID0ga3ZtOwo+ID4gKwkJYXRvbWlj X3NldCgmdG1wW251bV9tbXVzIC0gMV0ucmVmY250LCAwKTsKPiA+ICsJCXJldCA9IGt2bV9hbGxv Y19zdGFnZTJfcGdkKCZ0bXBbbnVtX21tdXMgLSAxXSk7Cj4gPiArCQlpZiAocmV0KQo+ID4gKwkJ CWdvdG8gb3V0Owo+ID4gKwo+ID4gKwkJdG1wW251bV9tbXVzIC0gMl0ua3ZtID0ga3ZtOwo+ID4g KwkJYXRvbWljX3NldCgmdG1wW251bV9tbXVzIC0gMl0ucmVmY250LCAwKTsKPiA+ICsJCXJldCA9 IGt2bV9hbGxvY19zdGFnZTJfcGdkKCZ0bXBbbnVtX21tdXMgLSAyXSk7Cj4gPiArCQlpZiAocmV0 KSB7Cj4gPiArCQkJa3ZtX2ZyZWVfc3RhZ2UyX3BnZCgmdG1wW251bV9tbXVzIC0gMV0pOwo+ID4g KwkJCWdvdG8gb3V0Owo+ID4gKwkJfQo+ID4gKwo+ID4gKwkJa3ZtLT5hcmNoLm5lc3RlZF9tbXVz X3NpemUgPSBudW1fbW11czsKPiA+ICsJCWt2bS0+YXJjaC5uZXN0ZWRfbW11cyA9IHRtcDsKPiA+ ICsJCXRtcCA9IE5VTEw7Cj4gPiArCX0KPiA+ICsKPiA+ICtvdXQ6Cj4gPiArCWtmcmVlKHRtcCk7 Cj4gPiArCW11dGV4X3VubG9jaygma3ZtLT5sb2NrKTsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICt9 Cj4gPiArCj4gPiArLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBrdm0tPmxvY2sgaGVsZCAqLwo+ID4g K3N0cnVjdCBrdm1fczJfbW11ICpsb29rdXBfczJfbW11KHN0cnVjdCBrdm0gKmt2bSwgdTY0IHZ0 dGJyLCB1NjQgaGNyKQo+ID4gK3sKPiA+ICsJYm9vbCBuZXN0ZWRfc3RhZ2UyX2VuYWJsZWQgPSBo Y3IgJiBIQ1JfVk07Cj4gPiArCWludCBpOwo+ID4gKwo+ID4gKwkvKiBEb24ndCBjb25zaWRlciB0 aGUgQ25QIGJpdCBmb3IgdGhlIHZ0dGJyIG1hdGNoICovCj4gPiArCXZ0dGJyID0gdnR0YnIgJiB+ MVVMOwo+IAo+IFRoZXJlJ3MgYSBkZWZpbmUgZm9yIHRoYXQgYml0LCBWVFRCUl9DTlBfQklUIGlu IGt2bV9hcm0uaCAod2hpY2ggdGhpcyBmaWxlCj4gaW5jbHVkZXMpLgoKRmFpciBlbm91Z2guCgo+ IAo+ID4gKwo+ID4gKwkvKiBTZWFyY2ggYSBtbXUgaW4gdGhlIGxpc3QgdXNpbmcgdGhlIHZpcnR1 YWwgVk1JRCBhcyBhIGtleSAqLwo+IAo+IEkgdGhpbmsgd2hlbiB0aGUgZ3Vlc3QgaGFzIHN0YWdl IDIgZW5hYmxlZCB3ZSBhbHNvIG1hdGNoIG9uCj4gVlRUQlJfRUwyLlZNSUQgKyBWVFRCUl9FTDIu QkFERFIuCgpZZXMuCgo+IAo+ID4gKwlmb3IgKGkgPSAwOyBpIDwga3ZtLT5hcmNoLm5lc3RlZF9t bXVzX3NpemU7IGkrKykgewo+ID4gKwkJc3RydWN0IGt2bV9zMl9tbXUgKm1tdSA9ICZrdm0tPmFy Y2gubmVzdGVkX21tdXNbaV07Cj4gPiArCj4gPiArCQlpZiAoIWt2bV9zMl9tbXVfdmFsaWQobW11 KSkKPiA+ICsJCQljb250aW51ZTsKPiA+ICsKPiA+ICsJCWlmIChuZXN0ZWRfc3RhZ2UyX2VuYWJs ZWQgJiYKPiA+ICsJCSAgICBtbXUtPm5lc3RlZF9zdGFnZTJfZW5hYmxlZCAmJgo+ID4gKwkJICAg IHZ0dGJyID09IG1tdS0+dnR0YnIpCj4gPiArCQkJcmV0dXJuIG1tdTsKPiA+ICsKPiA+ICsJCWlm ICghbmVzdGVkX3N0YWdlMl9lbmFibGVkICYmCj4gPiArCQkgICAgIW1tdS0+bmVzdGVkX3N0YWdl Ml9lbmFibGVkICYmCj4gPiArCQkgICAgZ2V0X3ZtaWQodnR0YnIpID09IGdldF92bWlkKG1tdS0+ dnR0YnIpKQo+ID4gKwkJCXJldHVybiBtbXU7Cj4gCj4gSSdtIHN0cnVnZ2xpbmcgdG8gdW5kZXJz dGFuZCB3aHkgd2UgZG8gdGhpcy4gQXMgZmFyIGFzIEkgY2FuIHRlbGwsCj4gdGhpcyBhcHBsaWVz IG9ubHkgdG8gbm9uLXZoZSBndWVzdCBoeXBlcnZpc29ycywgYmVjYXVzZSB0aGF0J3MgdGhlCj4g b25seSBzaXR1YXRpb24gd2hlcmUgd2UgcnVuIHNvbWV0aGluZyBhdCB2RUwxIHdpdGhvdXQgc2hh ZG93IHN0YWdlIDIKPiBlbmFibGVkLgoKSSBkb24ndCB0aGluayB0aGUgbm9uLVZIRSBjb25zaWRl cmF0aW9uIGlzIHJlbGV2YW50IGhlcmUuIFRyeWluZyB0bwpkaXN0aW5ndWlzaCBiZXR3ZWVuIGFy Yml0cmFyeSB1c2UgY2FzZXMgaXMganVzdCBhIG1hc3NpdmUgZGlzdHJhY3Rpb24KYW5kIGdldHMg aW4gdGhlIHdheSBvZiBpbXBsZW1lbnRpbmcgdGhlIGFyY2hpdGVjdHVyZSBjb3JyZWN0bHkuCgo+ IFRoZXJlJ3Mgb25seSBvbmUgTU1VIHRoYXQgbWF0Y2hlcyB0aGF0IGd1ZXN0LCBiZWNhdXNlCj4g dGhlcmUncyBvbmx5IG9uZSBob3N0IGZvciB0aGUgbm9uLXZoZSBoeXBlcnZpc29yLiBTbyB3aHkg YXJlIHdlCj4gbWF0Y2hpbmcgb24gdm1pZCBvbmx5LCBpbnN0ZWFkIG9mIG1hdGNoaW5nIG9uIHRo ZSBlbnRpcmUgdnR0YnI/IElzCj4gaXQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGdldCBmb29s ZWQgYnkgYSBuYXVnaHR5IGd1ZXN0IHRoYXQKPiBjaGFuZ2VzIHRoZSBCQUREUiBlYWNoIHRpbWUg aXQgc3dpdGNoZXMgdG8gaXRzIEVMMSBob3N0PyBPcgo+IHNvbWV0aGluZyBlbHNlIGVudGlyZWx5 IHRoYXQgSSdtIG1pc3Npbmc/CgpGaXJzdCwgbGV0J3MgcmVtZW1iZXIgb25lIHRoaW5nOiBObyBt YXR0ZXIgd2hldGhlciB3ZSBoYXZlIFMyIGVuYWJsZWQKb3Igbm90LCBUTEJzIGFyZSB0YWdnZWQg YnkgVk1JRC4gSSB3b25kZXJlZCBhYm91dCB0aGF0IGZvciBhIGxvbmcKdGltZSwgYnV0IGNvdWxk bid0IGZpbmQgYW55dGhpbmcgaW4gdGhlIGFyY2hpdGVjdHVyZSB0aGF0IHdvdWxkCmNvbnRyYWRp Y3QgdGhpcy4gQW5kIGlmIHlvdSB0aGluayBvZiB3aGF0IGEgQ1BVIG11c3QgaW1wbGVtZW50LCBp dAptYWtlcyBtb3JlIHNlbnNlIHRvIGFsd2F5cyB0YWcgdGhpbmdzIHRoYW4gdHJ5IHRvIGNvbWUg dXAgd2l0aCBtb3JlCmZhbmN5IHNjaGVtZXMuCgpHaXZlbiB0aGF0IG91ciBzaGFkb3cgUzIgaXMg YW4gdWdseSBmb3JtIG9mIFNXLWxvYWRlZCBUTEJzLCBtYXRjaGluZwp0aGUgVk1JRCBpcyBjcml0 aWNhbCB0byBoaXQgdGhlIHJpZ2h0IHNoYWRvdyBNTVUgY29udGV4dC4gQW5kIHNpbmNlIFMyCip0 cmFuc2xhdGlvbiogaXMgZGlzYWJsZWQsIGl0IGlzIHBlcmZlY3RseSB2YWxpZCB0byBpZ25vcmUg dGhlIEJBRERSCnBhcnQgb2YgVlRUQlIsIGFuZCBWSEUtdnMtIVZIRSBkb2Vzbid0IGNvbWUgaW50 byB0aGUgZXF1YXRpb24uCgpOb3csIHRoZSByZWFsIGNhdXNlIGZvciBxdWVzdGlvbmluZyBpcyB0 aGUgcHJldmlvdXMgc3RhdGVtZW50OiB3aHkgZG8Kd2UgZGVjaWRlIHRvIG1hdGNoIG9uIHRoZSB3 aG9sZSBWVFRCUiB3aGVuIFMyIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQ/CkxldCdzIGltYWdpbmUg YSBndWVzdCB0aGF0IHJldXNlcyB0aGUgc2FtZSBWTUlEIGZvciBkaWZmZXJlbnQKdHJhbnNsYXRp b25zICh0aGF0J3MgYSBiaXQgYm9ua2VycywgYnV0IHVuZm9ydHVuYXRlbHkgbm90IGZvcmJpZGRl biBieQp0aGUgYXJjaGl0ZWN0dXJlIGlmIHlvdSBjb25zaWRlciBwZXItQ1BVIHRyYW5zbGF0aW9u cykuCgpBbmQgZXZlbiBpbiB0aGUgc2luZ2xlIFZDUFUgY2FzZSB0aGF0IHdvdWxkIGNoYW5nZSBC QUREUiBlYWNoIHRpbWUKd2l0aG91dCBpbnZhbGlkYXRpbmcgdGhlIFRMQnM6IElmIHdlIG9ubHkg bWF0Y2hlZCBvbiB0aGUgVk1JRCwgd2UKY291bGQgcG90ZW50aWFsbHkgZW5kLXVwIHdpdGggVExC IGNvbmZsaWN0cywgYW5kIHRoYXQncyBub3QgYSBuaWNlCnBsYWNlIHRvIGJlLiBTbyB3ZSB3aWxs IGp1c3QgcGljayBhIG5ldyBNTVUgY29udGV4dCwgYW5kIHN0YXJ0CnBvcHVsYXRpbmcgc2hhZG93 IHRyYW5zbGF0aW9ucyBiYXNlZCBvbiB0aGlzIGNvbnRleHQuIFRoaXMgaXMgcHJldHR5CmZvcmdp dmluZyBmb3IgYnJva2VuIGd1ZXN0cywgYnV0IGl0IGFsc28gc2ltcGxpZmllcyB0aGUgaW1wbGVt ZW50YXRpb24uCgo+IAo+ID4gKwl9Cj4gPiArCXJldHVybiBOVUxMOwo+ID4gK30KPiA+ICsKPiA+ ICtzdGF0aWMgc3RydWN0IGt2bV9zMl9tbXUgKmdldF9zMl9tbXVfbmVzdGVkKHN0cnVjdCBrdm1f dmNwdSAqdmNwdSkKPiA+ICt7Cj4gPiArCXN0cnVjdCBrdm0gKmt2bSA9IHZjcHUtPmt2bTsKPiA+ ICsJdTY0IHZ0dGJyID0gdmNwdV9yZWFkX3N5c19yZWcodmNwdSwgVlRUQlJfRUwyKTsKPiA+ICsJ dTY0IGhjcj0gdmNwdV9yZWFkX3N5c19yZWcodmNwdSwgSENSX0VMMik7Cj4gPiArCXN0cnVjdCBr dm1fczJfbW11ICpzMl9tbXU7Cj4gPiArCWludCBpOwo+ID4gKwo+ID4gKwlzMl9tbXUgPSBsb29r dXBfczJfbW11KGt2bSwgdnR0YnIsIGhjcik7Cj4gPiArCWlmIChzMl9tbXUpCj4gPiArCQlnb3Rv IG91dDsKPiA+ICsKPiA+ICsJZm9yIChpID0gMDsgaSA8IGt2bS0+YXJjaC5uZXN0ZWRfbW11c19z aXplOyBpKyspIHsKPiA+ICsJCXMyX21tdSA9ICZrdm0tPmFyY2gubmVzdGVkX21tdXNbaV07Cj4g PiArCj4gPiArCQlpZiAoYXRvbWljX3JlYWQoJnMyX21tdS0+cmVmY250KSA9PSAwKQo+ID4gKwkJ CWJyZWFrOwo+ID4gKwl9Cj4gPiArCUJVR19PTihhdG9taWNfcmVhZCgmczJfbW11LT5yZWZjbnQp KTsgLyogV2UgaGF2ZSBzdHJ1Y3QgTU1VcyB0byBzcGFyZSAqLwo+ID4gKwo+ID4gKwlpZiAoa3Zt X3MyX21tdV92YWxpZChzMl9tbXUpKSB7Cj4gPiArCQkvKiBDbGVhciB0aGUgb2xkIHN0YXRlICov Cj4gPiArCQlrdm1fdW5tYXBfc3RhZ2UyX3JhbmdlKHMyX21tdSwgMCwga3ZtX3BoeXNfc2l6ZShr dm0pKTsKPiA+ICsJCWlmIChzMl9tbXUtPnZtaWQudm1pZF9nZW4pCj4gPiArCQkJa3ZtX2NhbGxf aHlwKF9fa3ZtX3RsYl9mbHVzaF92bWlkLCBzMl9tbXUpOwo+ID4gKwl9Cj4gPiArCj4gPiArCS8q Cj4gPiArCSAqIFRoZSB2aXJ0dWFsIFZNSUQgKG1vZHVsbyBDblApIHdpbGwgYmUgdXNlZCBhcyBh IGtleSB3aGVuIG1hdGNoaW5nCj4gPiArCSAqIGFuIGV4aXN0aW5nIGt2bV9zMl9tbXUuCj4gPiAr CSAqLwo+ID4gKwlzMl9tbXUtPnZ0dGJyID0gdnR0YnIgJiB+MVVMOwo+ID4gKwlzMl9tbXUtPm5l c3RlZF9zdGFnZTJfZW5hYmxlZCA9IGhjciAmIEhDUl9WTTsKPiA+ICsKPiA+ICtvdXQ6Cj4gPiAr CWF0b21pY19pbmMoJnMyX21tdS0+cmVmY250KTsKPiA+ICsJcmV0dXJuIHMyX21tdTsKPiA+ICt9 Cj4gPiArCj4gPiArdm9pZCBrdm1faW5pdF9zMl9tbXUoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSkK PiA+ICt7Cj4gPiArCW1tdS0+dnR0YnIgPSAxOwo+ID4gKwltbXUtPm5lc3RlZF9zdGFnZTJfZW5h YmxlZCA9IGZhbHNlOwo+ID4gKwlhdG9taWNfc2V0KCZtbXUtPnJlZmNudCwgMCk7Cj4gPiArfQo+ ID4gKwo+ID4gK3ZvaWQga3ZtX3ZjcHVfbG9hZF9od19tbXUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1 KQo+ID4gK3sKPiA+ICsJaWYgKGlzX2h5cF9jdHh0KHZjcHUpKSB7Cj4gCj4gSWYgdXNlcnNwYWNl IGhhcyBzZXQgdGhlIG5lc3RlZCBmZWF0dXJlLCBidXQgaGFzbid0IHNldCB0aGUgdmNwdQo+IG1v ZGUgdG8gUFNSX01PREVfRUwyaC9QU1JfTU9ERV9FTDJ0LCB3ZSB3aWxsIG5ldmVyIHVzZQo+IGt2 bS0+YXJjaC5tbXUsIGFuZCBpbnN0ZWFkIHdlJ2xsIGFsd2F5cyB0YWtlIHRoZSBtbXVfbG9jayBh bmQgc2VhcmNoCj4gZm9yIHRoZSBtbXUuIElzIHRoYXQgc29tZXRoaW5nIHdlIHNob3VsZCBjYXJl IGFib3V0PwoKSSdtIHJlYWxseSBub3Qgd29ycmllZCBhYm91dCB0aGlzLiBJZiB0aGUgdXNlciBo YXMgYXNrZWQgZm9yIG5lc3RlZApzdXBwb3J0IGJ1dCBkb2Vzbid0IG1ha2UgdXNlIG9mIGl0LCB0 b3VnaCBsdWNrLgoKPiAKPiA+ICsJCXZjcHUtPmFyY2guaHdfbW11ID0gJnZjcHUtPmt2bS0+YXJj aC5tbXU7Cj4gPiArCX0gZWxzZSB7Cj4gPiArCQlzcGluX2xvY2soJnZjcHUtPmt2bS0+bW11X2xv Y2spOwo+ID4gKwkJdmNwdS0+YXJjaC5od19tbXUgPSBnZXRfczJfbW11X25lc3RlZCh2Y3B1KTsK PiA+ICsJCXNwaW5fdW5sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKPiA+ICsJfQo+ID4gK30K PiA+ICsKPiA+ICt2b2lkIGt2bV92Y3B1X3B1dF9od19tbXUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1 KQo+ID4gK3sKPiA+ICsJaWYgKHZjcHUtPmFyY2guaHdfbW11ICE9ICZ2Y3B1LT5rdm0tPmFyY2gu bW11KSB7Cj4gPiArCQlhdG9taWNfZGVjKCZ2Y3B1LT5hcmNoLmh3X21tdS0+cmVmY250KTsKPiA+ ICsJCXZjcHUtPmFyY2guaHdfbW11ID0gTlVMTDsKPiA+ICsJfQo+ID4gK30KPiA+ICAKPiA+ICAv Kgo+ID4gICAqIEluamVjdCB3ZnggdG8gdGhlIHZpcnR1YWwgRUwyIGlmIHRoaXMgaXMgbm90IGZy b20gdGhlIHZpcnR1YWwgRUwyIGFuZAo+ID4gQEAgLTM3LDMgKzE5MSwyMSBAQCBpbnQgaGFuZGxl X3dmeF9uZXN0ZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBib29sIGlzX3dmZSkKPiA+ICAKPiA+ ICAJcmV0dXJuIC1FSU5WQUw7Cj4gPiAgfQo+ID4gKwo+ID4gK3ZvaWQga3ZtX2FyY2hfZmx1c2hf c2hhZG93X2FsbChzdHJ1Y3Qga3ZtICprdm0pCj4gPiArewo+ID4gKwlpbnQgaTsKPiA+ICsKPiA+ ICsJZm9yIChpID0gMDsgaSA8IGt2bS0+YXJjaC5uZXN0ZWRfbW11c19zaXplOyBpKyspIHsKPiA+ ICsJCXN0cnVjdCBrdm1fczJfbW11ICptbXUgPSAma3ZtLT5hcmNoLm5lc3RlZF9tbXVzW2ldOwo+ ID4gKwo+ID4gKwkJV0FSTl9PTihhdG9taWNfcmVhZCgmbW11LT5yZWZjbnQpKTsKPiA+ICsKPiA+ ICsJCWlmICghYXRvbWljX3JlYWQoJm1tdS0+cmVmY250KSkKPiA+ICsJCQlrdm1fZnJlZV9zdGFn ZTJfcGdkKG1tdSk7Cj4gPiArCX0KPiA+ICsJa2ZyZWUoa3ZtLT5hcmNoLm5lc3RlZF9tbXVzKTsK PiA+ICsJa3ZtLT5hcmNoLm5lc3RlZF9tbXVzID0gTlVMTDsKPiA+ICsJa3ZtLT5hcmNoLm5lc3Rl ZF9tbXVzX3NpemUgPSAwOwo+ID4gKwlrdm1fZnJlZV9zdGFnZTJfcGdkKCZrdm0tPmFyY2gubW11 KTsKPiA+ICt9Cj4gPiBkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL2FybS5jIGIvdmlydC9rdm0v YXJtL2FybS5jCj4gPiBpbmRleCA1ZDQzNzE2MzNlMWMuLjRlM2NiZmExZWNiZSAxMDA2NDQKPiA+ IC0tLSBhL3ZpcnQva3ZtL2FybS9hcm0uYwo+ID4gKysrIGIvdmlydC9rdm0vYXJtL2FybS5jCj4g PiBAQCAtMzYsNiArMzYsNyBAQAo+ID4gICNpbmNsdWRlIDxhc20va3ZtX2FybS5oPgo+ID4gICNp bmNsdWRlIDxhc20va3ZtX2FzbS5oPgo+ID4gICNpbmNsdWRlIDxhc20va3ZtX21tdS5oPgo+ID4g KyNpbmNsdWRlIDxhc20va3ZtX25lc3RlZC5oPgo+ID4gICNpbmNsdWRlIDxhc20va3ZtX2VtdWxh dGUuaD4KPiA+ICAjaW5jbHVkZSA8YXNtL2t2bV9jb3Byb2MuaD4KPiA+ICAjaW5jbHVkZSA8YXNt L3NlY3Rpb25zLmg+Cj4gPiBAQCAtMTI2LDYgKzEyNyw4IEBAIGludCBrdm1fYXJjaF9pbml0X3Zt KHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgbG9uZyB0eXBlKQo+ID4gIAlrdm0tPmFyY2gubW11 LnZtaWQudm1pZF9nZW4gPSAwOwo+ID4gIAlrdm0tPmFyY2gubW11Lmt2bSA9IGt2bTsKPiA+ICAK PiA+ICsJa3ZtX2luaXRfbmVzdGVkKGt2bSk7Cj4gCj4gTW9yZSBjb250ZXh0Ogo+IAo+IEBAIC0x MjAsMTggKzEyMSwyMCBAQCBpbnQga3ZtX2FyY2hfaW5pdF92bShzdHJ1Y3Qga3ZtICprdm0sIHVu c2lnbmVkIGxvbmcgdHlwZSkKPiDCoAo+IMKgwqDCoMKgIHJldCA9IGt2bV9hbGxvY19zdGFnZTJf cGdkKCZrdm0tPmFyY2gubW11KTsKPiDCoMKgwqDCoCBpZiAocmV0KQo+IMKgwqDCoMKgIMKgwqDC oCBnb3RvIG91dF9mYWlsX2FsbG9jOwo+IMKgCj4gwqDCoMKgwqAgLyogTWFyayB0aGUgaW5pdGlh bCBWTUlEIGdlbmVyYXRpb24gaW52YWxpZCAqLwo+IMKgwqDCoMKgIGt2bS0+YXJjaC5tbXUudm1p ZC52bWlkX2dlbiA9IDA7Cj4gwqDCoMKgwqAga3ZtLT5hcmNoLm1tdS5rdm0gPSBrdm07Cj4gwqAK PiArwqDCoMKgIGt2bV9pbml0X25lc3RlZChrdm0pOwo+ICsKPiAKPiBrdm1fYWxsb2Nfc3RhZ2Uy X3BnZCBlbmRzIHVwIGNhbGxpbmcga3ZtX2luaXRfczJfbW11IGZvcgo+IGt2bS0+YXJjaC5tbXUu ICBrdm1faW5pdF9uZXN0ZWQgZG9lcyB0aGUgc2FtZSB0aGluZywgYW5kIHdlIGVuZCB1cAo+IGNh bGxpbmcga3ZtX2luaXRfczJfbW11IGZvciBrdm0tPmFyY2gubW11IHR3aWNlLiBUaGVyZSdzIHJl YWxseSBubwo+IGhhcm0gaW4gZG9pbmcgaXQgdHdpY2UsIGJ1dCBJIHRob3VnaHQgSSBjb3VsZCBt ZW50aW9uIGl0IGJlY2F1c2UgaXQKPiBsb29rcyB0byBtZSB0aGF0IHRoZSBmaXggaXMgc2ltcGxl OiByZW1vdmUgdGhlIGt2bV9pbml0X3MyX21tdSBjYWxsCj4gZnJvbSBrdm1faW5pdF9uZXN0ZWQu IFRoZSBkb3VibGUgaW5pdGlhbGl6YXRpb24gaXMgYWxzbyB0cnVlIGZvciB0aGUKPiB0aXAgb2Yg dGhlIHNlcmllcy4KCkkndmUgcmV3b3JrZWQgdGhpcyBwYXJ0IGEgYml0LCBhbmQgbmVlZCB0byBy ZWNvbmNpbGUgdGhlIGFib3ZlIHdpdGgKd2hhdCBJIG5vdyBoYXZlLiBPdmVyYWxsLCBJIGRvIGFn cmVlIHRoYXQgdGhlcmUgaXMgc29tZSB2YXN0bHkKcmVkdW5kYW50IGluaXQgaGVyZS4KCkFuZCBh IHZlcnkgYmVsYXRlZCB0aGFua3MgZm9yIGFsbCB0aGUgd29yayB5b3UndmUgcHV0IGludG8gcmV2 aWV3aW5nCnRoaXMgZGlmZmljdWx0IHNlcmllcy4gUmVzdCBhc3N1cmVkIHRoYXQgdGhpcyB3YXNu J3QgaW4gdmFpbiEKClRoYW5rcywKCglNLgoKLS0gCkphenogaXMgbm90IGRlYWQsIGl0IGp1c3Qg c21lbGxzIGZ1bm55LgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwprdm1hcm0gbWFpbGluZyBsaXN0Cmt2bWFybUBsaXN0cy5jcy5jb2x1bWJpYS5lZHUKaHR0 cHM6Ly9saXN0cy5jcy5jb2x1bWJpYS5lZHUvbWFpbG1hbi9saXN0aW5mby9rdm1hcm0K 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=-7.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE, SPF_PASS 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 F3363C33C99 for ; Sun, 5 Jan 2020 11:35:56 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id C13DD21775 for ; Sun, 5 Jan 2020 11:35:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="bR14OY3b"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="ANivoHac" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C13DD21775 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Subject: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=dlb/Y+2LTcKgCNLrcsci1yW9T/7UWFtr/skQDe5bciA=; b=bR14OY3bIu+pbc Vo67lbjOjBbn5AXE/6vPb4Iqv6xuYoZzlSHZB1rKCe7TV+NrTrKtcB9VvD5NTCBg3SyybdnxdgHmD J7o+uXFTYK/nftfxAsawMF8j/iQy7SXJLmfkMQP2g2DkLZyE3J7gICNw+0wK+NRZtE7W+3ftzx+eS FeurzrZOrgSv0vn/6+wQEj2kMgX+BuYpx92g9uDh9HS+Edf4nNJrH3wRtuB/4T+mZdsx4JuGtt/m+ 0fuPdnxngrQvhob9x5Can+8YWtS2u79cqzT+GDYJnPzsjZJJYG7ncDK40hm1UmG4jYFnlPdKaNuzG wxSGFUQaMjTyRMOWupEA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1io4CK-0004P1-3p; Sun, 05 Jan 2020 11:35:56 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1io4CF-0004OD-SJ for linux-arm-kernel@lists.infradead.org; Sun, 05 Jan 2020 11:35:54 +0000 Received: from disco-boy.misterjones.org (disco-boy.misterjones.org [51.254.78.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9E5F220848; Sun, 5 Jan 2020 11:35:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578224150; bh=dktLam6PZZSt7Od13pgFScuOzRHoMRZ6kh53YBAa22A=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=ANivoHacQhSSiLX8FrqMfeOxwm1J5HqPpYJxlsJ4GeyEPK0wTatHaiGwuNlnEb62d g4UJ+Kx9T4w9GDixPvvy8NtYpL40SroFqtZUqRydYLdclQJpgX3aFQRxmIPYMD6jJY FFWGNaRck/2jhVzShi/IBb1EWPxY0aR1i5ALFo2k= Received: from 78.163-31-62.static.virginmediabusiness.co.uk ([62.31.163.78] helo=big-swifty.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1io4CC-0001t7-HT; Sun, 05 Jan 2020 11:35:48 +0000 Date: Sun, 05 Jan 2020 11:35:38 +0000 Message-ID: <86mub2gmph.wl-maz@kernel.org> From: Marc Zyngier To: Alexandru Elisei Subject: Re: [PATCH 35/59] KVM: arm/arm64: nv: Support multiple nested stage 2 mmu structures In-Reply-To: References: <20190621093843.220980-1-marc.zyngier@arm.com> <20190621093843.220980-36-marc.zyngier@arm.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 EasyPG/1.0.0 Emacs/26 (aarch64-unknown-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") X-SA-Exim-Connect-IP: 62.31.163.78 X-SA-Exim-Rcpt-To: alexandru.elisei@arm.com, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org, andre.przywara@arm.com, Dave.Martin@arm.com, julien.thierry.kdev@gmail.com, james.morse@arm.com, suzuki.poulose@arm.com, Christoffer.Dall@arm.com, jintack@cs.columbia.edu 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-20200105_033551_962743_2BD771C5 X-CRM114-Status: GOOD ( 44.68 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kvm@vger.kernel.org, Suzuki K Poulose , Jintack Lim , Andre Przywara , Christoffer Dall , kvmarm@lists.cs.columbia.edu, James Morse , linux-arm-kernel@lists.infradead.org, Dave Martin , Julien Thierry Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org W0JsYXN0IGZyb20gdGhlIHBhc3QhXQoKSGkgQWxleGFuZHJ1LAoKSSdtIGN1cnJlbnRseSByZXdv cmtpbmcgdGhpcyBzZXJpZXMsIHNvIHRha2luZyB0aGUgb3Bwb3J0dW5pdHkgdG8gZ28KdGhyb3Vn aCB5b3VyIGNvbW1lbnRzIChJIHdvbid0IHJlcGx5IHRvIHRoZW0gYWxsLCBhcyBtb3N0IGFyZQpw ZXJmZWN0bHkgdmFsaWQgYW5kIG5lZWQgbm8gZnVydGhlciBkaXNjdXNzaW9uKS4KCk9uIFRodSwg MDQgSnVsIDIwMTkgMTY6NTE6NTIgKzAxMDAsCkFsZXhhbmRydSBFbGlzZWkgPGFsZXhhbmRydS5l bGlzZWlAYXJtLmNvbT4gd3JvdGU6Cj4gCj4gT24gNi8yMS8xOSAxMDozOCBBTSwgTWFyYyBaeW5n aWVyIHdyb3RlOgo+IAo+ID4gRnJvbTogQ2hyaXN0b2ZmZXIgRGFsbCA8Y2hyaXN0b2ZmZXIuZGFs bEBhcm0uY29tPgo+ID4KPiA+IEFkZCBzdGFnZSAyIG1tdSBkYXRhIHN0cnVjdHVyZXMgZm9yIHZp cnR1YWwgRUwyIGFuZCBmb3IgbmVzdGVkIGd1ZXN0cy4KPiA+IFdlIGRvbid0IHlldCBwb3B1bGF0 ZSBzaGFkb3cgc3RhZ2UgMiBwYWdlIHRhYmxlcywgYnV0IHdlIG5vdyBoYXZlIGEKPiA+IGZyYW1l d29yayBmb3IgZ2V0dGluZyB0byBhIHNoYWRvdyBzdGFnZSAyIHBnZC4KPiA+Cj4gPiBXZSBhbGxv Y2F0ZSB0d2ljZSB0aGUgbnVtYmVyIG9mIHZjcHVzIGFzIHN0YWdlIDIgbW11IHN0cnVjdHVyZXMg YmVjYXVzZQo+ID4gdGhhdCdzIHN1ZmZpY2llbnQgZm9yIGVhY2ggdmNwdSBydW5uaW5nIHR3byBW TXMgd2l0aG91dCBoYXZpbmcgdG8gZmx1c2gKPiA+IHRoZSBzdGFnZSAyIHBhZ2UgdGFibGVzLgo+ ID4KPiA+IFNpZ25lZC1vZmYtYnk6IENocmlzdG9mZmVyIERhbGwgPGNocmlzdG9mZmVyLmRhbGxA YXJtLmNvbT4KPiA+IFNpZ25lZC1vZmYtYnk6IE1hcmMgWnluZ2llciA8bWFyYy56eW5naWVyQGFy bS5jb20+Cj4gPiAtLS0KPiA+ICBhcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oICAgICB8 ICAgNCArCj4gPiAgYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX21tdS5oICAgICAgfCAgIDMgKwo+ ID4gIGFyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCAgIHwgIDI4ICsrKysrCj4gPiAg YXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbW11LmggICAgfCAgIDggKysKPiA+ICBhcmNoL2Fy bTY0L2luY2x1ZGUvYXNtL2t2bV9uZXN0ZWQuaCB8ICAgNyArKwo+ID4gIGFyY2gvYXJtNjQva3Zt L25lc3RlZC5jICAgICAgICAgICAgIHwgMTcyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysK PiA+ICB2aXJ0L2t2bS9hcm0vYXJtLmMgICAgICAgICAgICAgICAgICB8ICAxNiArKy0KPiA+ICB2 aXJ0L2t2bS9hcm0vbW11LmMgICAgICAgICAgICAgICAgICB8ICAzMSArKy0tLQo+ID4gIDggZmls ZXMgY2hhbmdlZCwgMjU0IGluc2VydGlvbnMoKyksIDE1IGRlbGV0aW9ucygtKQo+ID4KPiA+IGRp ZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC9hcm0vaW5j bHVkZS9hc20va3ZtX2hvc3QuaAo+ID4gaW5kZXggZTMyMTdjNGFkMjViLi5iODIxZWIyMzgzYWQg MTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCj4gPiArKysg Yi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCj4gPiBAQCAtNDI0LDQgKzQyNCw4IEBA IHN0YXRpYyBpbmxpbmUgYm9vbCBrdm1fYXJtX3ZjcHVfaXNfZmluYWxpemVkKHN0cnVjdCBrdm1f dmNwdSAqdmNwdSkKPiA+ICAJcmV0dXJuIHRydWU7Cj4gPiAgfQo+ID4gIAo+ID4gK3N0YXRpYyBp bmxpbmUgdm9pZCBrdm1fdmNwdV9sb2FkX2h3X21tdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpIHt9 Cj4gPiArc3RhdGljIGlubGluZSB2b2lkIGt2bV92Y3B1X3B1dF9od19tbXUoc3RydWN0IGt2bV92 Y3B1ICp2Y3B1KSB7fQo+ID4gK3N0YXRpYyBpbmxpbmUgaW50IGt2bV92Y3B1X2luaXRfbmVzdGVk KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkgeyByZXR1cm4gMDsgfQo+ID4gKwo+ID4gICNlbmRpZiAv KiBfX0FSTV9LVk1fSE9TVF9IX18gKi8KPiA+IGRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRl L2FzbS9rdm1fbW11LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fbW11LmgKPiA+IGluZGV4 IGJlMjNlM2Y4ZTA4Yy4uZTY5ODRiNmRhMmNlIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9hcm0vaW5j bHVkZS9hc20va3ZtX21tdS5oCj4gPiArKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fbW11 LmgKPiA+IEBAIC00MjAsNiArNDIwLDkgQEAgc3RhdGljIGlubGluZSBpbnQgaHlwX21hcF9hdXhf ZGF0YSh2b2lkKQo+ID4gIAo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fc2V0X2lwYV9saW1p dCh2b2lkKSB7fQo+ID4gIAo+ID4gK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1faW5pdF9zMl9tbXUo c3RydWN0IGt2bV9zMl9tbXUgKm1tdSkge30KPiA+ICtzdGF0aWMgaW5saW5lIHZvaWQga3ZtX2lu aXRfbmVzdGVkKHN0cnVjdCBrdm0gKmt2bSkge30KPiA+ICsKPiA+ICBzdGF0aWMgX19hbHdheXNf aW5saW5lIHU2NCBrdm1fZ2V0X3Z0dGJyKHN0cnVjdCBrdm1fczJfbW11ICptbXUpCj4gPiAgewo+ ID4gIAlzdHJ1Y3Qga3ZtX3ZtaWQgKnZtaWQgPSAmbW11LT52bWlkOwo+ID4gZGlmZiAtLWdpdCBh L2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9h c20va3ZtX2hvc3QuaAo+ID4gaW5kZXggM2RlZTVlMTdhNGVlLi5jYzIzOGRlMTcwZDIgMTAwNjQ0 Cj4gPiAtLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKPiA+ICsrKyBiL2Fy Y2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAo+ID4gQEAgLTg4LDExICs4OCwzOSBAQCBz dHJ1Y3Qga3ZtX3MyX21tdSB7Cj4gPiAgCXBoeXNfYWRkcl90CXBnZF9waHlzOwo+ID4gIAo+ID4g IAlzdHJ1Y3Qga3ZtICprdm07Cj4gPiArCj4gPiArCS8qCj4gPiArCSAqIEZvciBhIHNoYWRvdyBz dGFnZS0yIE1NVSwgdGhlIHZpcnR1YWwgdnR0YnIgcHJvZ3JhbW1lZCBieSB0aGUgZ3Vlc3QKPiA+ ICsJICogaHlwZXJ2aXNvci4gIFVudXNlZCBmb3Iga3ZtX2FyY2gtPm1tdS4gU2V0IHRvIDEgd2hl biB0aGUgc3RydWN0dXJlCj4gPiArCSAqIGNvbnRhaW5zIG5vIHZhbGlkIGluZm9ybWF0aW9uLgo+ ID4gKwkgKi8KPiA+ICsJdTY0CXZ0dGJyOwo+ID4gKwo+ID4gKwkvKiB0cnVlIHdoZW4gdGhpcyBy ZXByZXNlbnRzIGEgbmVzdGVkIGNvbnRleHQgd2hlcmUgdmlydHVhbCBIQ1JfRUwyLlZNID09IDEg Ki8KPiA+ICsJYm9vbAluZXN0ZWRfc3RhZ2UyX2VuYWJsZWQ7Cj4gPiArCj4gPiArCS8qCj4gPiAr CSAqICAwOiBOb2JvZHkgaXMgY3VycmVudGx5IHVzaW5nIHRoaXMsIGNoZWNrIHZ0dGJyIGZvciB2 YWxpZGl0eQo+ID4gKwkgKiA+MDogU29tZWJvZHkgaXMgYWN0aXZlbHkgdXNpbmcgdGhpcy4KPiA+ ICsJICovCj4gPiArCWF0b21pY190IHJlZmNudDsKPiA+ICB9Owo+ID4gIAo+ID4gK3N0YXRpYyBp bmxpbmUgYm9vbCBrdm1fczJfbW11X3ZhbGlkKHN0cnVjdCBrdm1fczJfbW11ICptbXUpCj4gPiAr ewo+ID4gKwlyZXR1cm4gIShtbXUtPnZ0dGJyICYgMSk7Cj4gPiArfQo+ID4gKwo+ID4gIHN0cnVj dCBrdm1fYXJjaCB7Cj4gPiAgCXN0cnVjdCBrdm1fczJfbW11IG1tdTsKPiA+ICAKPiA+ICsJLyoK PiA+ICsJICogU3RhZ2UgMiBwYWdpbmcgc3RhZ2UgZm9yIFZNcyB3aXRoIG5lc3RlZCB2aXJ0dWFs IHVzaW5nIGEgdmlydHVhbAo+ID4gKwkgKiBWTUlELgo+ID4gKwkgKi8KPiA+ICsJc3RydWN0IGt2 bV9zMl9tbXUgKm5lc3RlZF9tbXVzOwo+ID4gKwlzaXplX3QgbmVzdGVkX21tdXNfc2l6ZTsKPiA+ ICsKPiA+ICAJLyogVlRDUl9FTDIgdmFsdWUgZm9yIHRoaXMgVk0gKi8KPiA+ICAJdTY0ICAgIHZ0 Y3I7Cj4gPiAgCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbW11 LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9tbXUuaAo+ID4gaW5kZXggMWViNmUwY2E2 MWMyLi4zMmJjYWExODQ1ZGMgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNt L2t2bV9tbXUuaAo+ID4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbW11LmgKPiA+ IEBAIC0xMDAsNiArMTAwLDcgQEAgYWx0ZXJuYXRpdmVfY2JfZW5kCj4gPiAgI2luY2x1ZGUgPGFz bS9tbXVfY29udGV4dC5oPgo+ID4gICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgo+ID4gICNpbmNs dWRlIDxhc20va3ZtX2VtdWxhdGUuaD4KPiA+ICsjaW5jbHVkZSA8YXNtL2t2bV9uZXN0ZWQuaD4K PiA+ICAKPiA+ICB2b2lkIGt2bV91cGRhdGVfdmFfbWFzayhzdHJ1Y3QgYWx0X2luc3RyICphbHQs Cj4gPiAgCQkJX19sZTMyICpvcmlncHRyLCBfX2xlMzIgKnVwZHB0ciwgaW50IG5yX2luc3QpOwo+ ID4gQEAgLTE2NCw2ICsxNjUsNyBAQCBpbnQgY3JlYXRlX2h5cF9leGVjX21hcHBpbmdzKHBoeXNf YWRkcl90IHBoeXNfYWRkciwgc2l6ZV90IHNpemUsCj4gPiAgCQkJICAgICB2b2lkICoqaGFkZHIp Owo+ID4gIHZvaWQgZnJlZV9oeXBfcGdkcyh2b2lkKTsKPiA+ICAKPiA+ICt2b2lkIGt2bV91bm1h cF9zdGFnZTJfcmFuZ2Uoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgcGh5c19hZGRyX3Qgc3RhcnQs IHU2NCBzaXplKTsKPiA+ICB2b2lkIHN0YWdlMl91bm1hcF92bShzdHJ1Y3Qga3ZtICprdm0pOwo+ ID4gIGludCBrdm1fYWxsb2Nfc3RhZ2UyX3BnZChzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11KTsKPiA+ ICB2b2lkIGt2bV9mcmVlX3N0YWdlMl9wZ2Qoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSk7Cj4gPiBA QCAtNjM1LDUgKzYzNywxMSBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX19sb2FkX2d1 ZXN0X3N0YWdlMihzdHJ1Y3Qga3ZtX3MyX21tdSAqbW11KQo+ID4gIAlhc20oQUxURVJOQVRJVkUo Im5vcCIsICJpc2IiLCBBUk02NF9XT1JLQVJPVU5EXzExNjU1MjIpKTsKPiA+ICB9Cj4gPiAgCj4g PiArc3RhdGljIGlubGluZSB1NjQgZ2V0X3ZtaWQodTY0IHZ0dGJyKQo+ID4gK3sKPiA+ICsJcmV0 dXJuICh2dHRiciAmIFZUVEJSX1ZNSURfTUFTSyhrdm1fZ2V0X3ZtaWRfYml0cygpKSkgPj4KPiA+ ICsJCVZUVEJSX1ZNSURfU0hJRlQ7Cj4gPiArfQo+ID4gKwo+ID4gICNlbmRpZiAvKiBfX0FTU0VN QkxZX18gKi8KPiA+ICAjZW5kaWYgLyogX19BUk02NF9LVk1fTU1VX0hfXyAqLwo+ID4gZGlmZiAt LWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX25lc3RlZC5oIGIvYXJjaC9hcm02NC9p bmNsdWRlL2FzbS9rdm1fbmVzdGVkLmgKPiA+IGluZGV4IDYxZTcxZDBkMjE1MS4uZDQwMjFkMDg5 MmJkIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbmVzdGVkLmgK PiA+ICsrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX25lc3RlZC5oCj4gPiBAQCAtMTAs NiArMTAsMTMgQEAgc3RhdGljIGlubGluZSBib29sIG5lc3RlZF92aXJ0X2luX3VzZShjb25zdCBz dHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCj4gPiAgCQl0ZXN0X2JpdChLVk1fQVJNX1ZDUFVfTkVTVEVE X1ZJUlQsIHZjcHUtPmFyY2guZmVhdHVyZXMpOwo+ID4gIH0KPiA+ICAKPiA+ICtleHRlcm4gdm9p ZCBrdm1faW5pdF9uZXN0ZWQoc3RydWN0IGt2bSAqa3ZtKTsKPiA+ICtleHRlcm4gaW50IGt2bV92 Y3B1X2luaXRfbmVzdGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Cj4gPiArZXh0ZXJuIHZvaWQg a3ZtX2luaXRfczJfbW11KHN0cnVjdCBrdm1fczJfbW11ICptbXUpOwo+ID4gK2V4dGVybiBzdHJ1 Y3Qga3ZtX3MyX21tdSAqbG9va3VwX3MyX21tdShzdHJ1Y3Qga3ZtICprdm0sIHU2NCB2dHRiciwg dTY0IGhjcik7Cj4gPiArZXh0ZXJuIHZvaWQga3ZtX3ZjcHVfbG9hZF9od19tbXUoc3RydWN0IGt2 bV92Y3B1ICp2Y3B1KTsKPiA+ICtleHRlcm4gdm9pZCBrdm1fdmNwdV9wdXRfaHdfbW11KHN0cnVj dCBrdm1fdmNwdSAqdmNwdSk7Cj4gPiArCj4gPiAgaW50IGhhbmRsZV93ZnhfbmVzdGVkKHN0cnVj dCBrdm1fdmNwdSAqdmNwdSwgYm9vbCBpc193ZmUpOwo+ID4gIGV4dGVybiBib29sIGZvcndhcmRf dHJhcHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgY29udHJvbF9iaXQpOwo+ID4gIGV4dGVy biBib29sIGZvcndhcmRfbnZfdHJhcHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKPiA+IGRpZmYg LS1naXQgYS9hcmNoL2FybTY0L2t2bS9uZXN0ZWQuYyBiL2FyY2gvYXJtNjQva3ZtL25lc3RlZC5j Cj4gPiBpbmRleCAzODcyZTNjZjE2OTEuLjRiMzhkYzVjMGJlMyAxMDA2NDQKPiA+IC0tLSBhL2Fy Y2gvYXJtNjQva3ZtL25lc3RlZC5jCj4gPiArKysgYi9hcmNoL2FybTY0L2t2bS9uZXN0ZWQuYwo+ ID4gQEAgLTE4LDcgKzE4LDE2MSBAQAo+ID4gICNpbmNsdWRlIDxsaW51eC9rdm0uaD4KPiA+ICAj aW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KPiA+ICAKPiA+ICsjaW5jbHVkZSA8YXNtL2t2bV9h cm0uaD4KPiA+ICAjaW5jbHVkZSA8YXNtL2t2bV9lbXVsYXRlLmg+Cj4gPiArI2luY2x1ZGUgPGFz bS9rdm1fbW11Lmg+Cj4gPiArI2luY2x1ZGUgPGFzbS9rdm1fbmVzdGVkLmg+Cj4gPiArCj4gPiAr dm9pZCBrdm1faW5pdF9uZXN0ZWQoc3RydWN0IGt2bSAqa3ZtKQo+ID4gK3sKPiA+ICsJa3ZtX2lu aXRfczJfbW11KCZrdm0tPmFyY2gubW11KTsKPiA+ICsKPiA+ICsJa3ZtLT5hcmNoLm5lc3RlZF9t bXVzID0gTlVMTDsKPiA+ICsJa3ZtLT5hcmNoLm5lc3RlZF9tbXVzX3NpemUgPSAwOwo+ID4gK30K PiA+ICsKPiA+ICtpbnQga3ZtX3ZjcHVfaW5pdF9uZXN0ZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1 KQo+ID4gK3sKPiA+ICsJc3RydWN0IGt2bSAqa3ZtID0gdmNwdS0+a3ZtOwo+ID4gKwlzdHJ1Y3Qg a3ZtX3MyX21tdSAqdG1wOwo+ID4gKwlpbnQgbnVtX21tdXM7Cj4gPiArCWludCByZXQgPSAtRU5P TUVNOwo+ID4gKwo+ID4gKwlpZiAoIXRlc3RfYml0KEtWTV9BUk1fVkNQVV9ORVNURURfVklSVCwg dmNwdS0+YXJjaC5mZWF0dXJlcykpCj4gPiArCQlyZXR1cm4gMDsKPiA+ICsKPiA+ICsJaWYgKCFj cHVzX2hhdmVfY29uc3RfY2FwKEFSTTY0X0hBU19ORVNURURfVklSVCkpCj4gPiArCQlyZXR1cm4g LUVJTlZBTDsKPiA+ICsKPiA+ICsJbXV0ZXhfbG9jaygma3ZtLT5sb2NrKTsKPiA+ICsKPiA+ICsJ bnVtX21tdXMgPSBhdG9taWNfcmVhZCgma3ZtLT5vbmxpbmVfdmNwdXMpICogMjsKPiA+ICsJdG1w ID0gX19rcmVhbGxvYyhrdm0tPmFyY2gubmVzdGVkX21tdXMsCj4gPiArCQkJIG51bV9tbXVzICog c2l6ZW9mKCprdm0tPmFyY2gubmVzdGVkX21tdXMpLAo+ID4gKwkJCSBHRlBfS0VSTkVMIHwgX19H RlBfWkVSTyk7Cj4gPiArCj4gPiArCWlmICh0bXApIHsKPiA+ICsJCWlmICh0bXAgIT0ga3ZtLT5h cmNoLm5lc3RlZF9tbXVzKQo+ID4gKwkJCWtmcmVlKGt2bS0+YXJjaC5uZXN0ZWRfbW11cyk7Cj4g Cj4gSGVyZSB3ZSBhcmUgZnJlZWluZyBhIHJlc291cmNlIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4g YWxsIHZpcnR1YWwKPiBDUFVzLiBTbyBpZiBrdm1fYWxsb2Nfc3RhZ2UyX3BnZCAoYmVsb3cpIGZh aWxzLCB3ZSBjb3VsZCBlbmQgdXAKPiBmcmVlaW5nIHNvbWV0aGluZyB0aGF0IGhhcyBiZWVuIGlu aXRpYWxpemVkIGJ5IHByZXZpb3VzCj4gdmNwdShzKS4gU2FtZSB0aGluZyBoYXBwZW5zIGlmIHRt cCA9PSBrdm0tPmFyY2gubmVzdGVkX21tdXMgKGJlY2F1c2UKPiBvZiBrZnJlZSh0bXApKS4KPiAK PiBMb29raW5nIGF0IERvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dCAoc2VjdGlvbiA0 LjgyLAo+IEtWTV9BUk1fVkNQVV9JT0NUTCk6Cj4gCj4gVXNlcnNwYWNlIGNhbiBjYWxsIHRoaXMg ZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgZm9yIGEgZ2l2ZW4gdmNwdSwKPiBpbmNsdWRpbmcgYWZ0 ZXIgdGhlIHZjcHUgaGFzIGJlZW4gcnVuLiBUaGlzIHdpbGwgcmVzZXQgdGhlIHZjcHUgdG8KPiBp dHMgaW5pdGlhbCBzdGF0ZS4KPiAKPiBJdCBzZWVtcyB0byBtZSB0aGF0IGl0IGlzIGFsbG93ZWQg Zm9yIHVzZXJzcGFjZSB0byB0cnkgdG8gY2FsbAo+IEtWTV9BUk1fVkNQVV9JT0NUTCBhZ2FpbiBh ZnRlciBpdCBmYWlsZWQuIEkgd2FzIHdvbmRlcmluZyBpZiBpdCdzCj4gcG9zc2libGUgdG8gZW5k IHVwIGluIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBzZWNvbmQgY2FsbCBzdWNjZWVkcywKPiBidXQg a3ZtLT5hcmNoLm5lc3RlZF9tbXVzIGlzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSBhbmQgaWYg d2UKPiBzaG91bGQgY2FyZSBhYm91dCB0aGF0LgoKSW5kZWVkLCB0aGlzIG5lZWRzIHJld29ya2lu Zy4gSSB0aGluayB0aGF0IGluIHRoZSBldmVudCBvZiBhbnkKYWxsb2NhdGlvbiBmYWlsdXJlLCB3 ZSdyZSBiZXR0ZXIgb2ZmIGxlYXZpbmcgdGhpbmdzIGluIHBsYWNlLiBHaXZlbgp0aGF0IHdlIGFs d2F5cyBwZXJmb3JtIGEga3JlYWxsb2MoKSwgaXQgc2hvdWxkIGJlIHNhZmUgdG8gZG8gc28uCgo+ IAo+ID4gKwo+ID4gKwkJdG1wW251bV9tbXVzIC0gMV0ua3ZtID0ga3ZtOwo+ID4gKwkJYXRvbWlj X3NldCgmdG1wW251bV9tbXVzIC0gMV0ucmVmY250LCAwKTsKPiA+ICsJCXJldCA9IGt2bV9hbGxv Y19zdGFnZTJfcGdkKCZ0bXBbbnVtX21tdXMgLSAxXSk7Cj4gPiArCQlpZiAocmV0KQo+ID4gKwkJ CWdvdG8gb3V0Owo+ID4gKwo+ID4gKwkJdG1wW251bV9tbXVzIC0gMl0ua3ZtID0ga3ZtOwo+ID4g KwkJYXRvbWljX3NldCgmdG1wW251bV9tbXVzIC0gMl0ucmVmY250LCAwKTsKPiA+ICsJCXJldCA9 IGt2bV9hbGxvY19zdGFnZTJfcGdkKCZ0bXBbbnVtX21tdXMgLSAyXSk7Cj4gPiArCQlpZiAocmV0 KSB7Cj4gPiArCQkJa3ZtX2ZyZWVfc3RhZ2UyX3BnZCgmdG1wW251bV9tbXVzIC0gMV0pOwo+ID4g KwkJCWdvdG8gb3V0Owo+ID4gKwkJfQo+ID4gKwo+ID4gKwkJa3ZtLT5hcmNoLm5lc3RlZF9tbXVz X3NpemUgPSBudW1fbW11czsKPiA+ICsJCWt2bS0+YXJjaC5uZXN0ZWRfbW11cyA9IHRtcDsKPiA+ ICsJCXRtcCA9IE5VTEw7Cj4gPiArCX0KPiA+ICsKPiA+ICtvdXQ6Cj4gPiArCWtmcmVlKHRtcCk7 Cj4gPiArCW11dGV4X3VubG9jaygma3ZtLT5sb2NrKTsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICt9 Cj4gPiArCj4gPiArLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBrdm0tPmxvY2sgaGVsZCAqLwo+ID4g K3N0cnVjdCBrdm1fczJfbW11ICpsb29rdXBfczJfbW11KHN0cnVjdCBrdm0gKmt2bSwgdTY0IHZ0 dGJyLCB1NjQgaGNyKQo+ID4gK3sKPiA+ICsJYm9vbCBuZXN0ZWRfc3RhZ2UyX2VuYWJsZWQgPSBo Y3IgJiBIQ1JfVk07Cj4gPiArCWludCBpOwo+ID4gKwo+ID4gKwkvKiBEb24ndCBjb25zaWRlciB0 aGUgQ25QIGJpdCBmb3IgdGhlIHZ0dGJyIG1hdGNoICovCj4gPiArCXZ0dGJyID0gdnR0YnIgJiB+ MVVMOwo+IAo+IFRoZXJlJ3MgYSBkZWZpbmUgZm9yIHRoYXQgYml0LCBWVFRCUl9DTlBfQklUIGlu IGt2bV9hcm0uaCAod2hpY2ggdGhpcyBmaWxlCj4gaW5jbHVkZXMpLgoKRmFpciBlbm91Z2guCgo+ IAo+ID4gKwo+ID4gKwkvKiBTZWFyY2ggYSBtbXUgaW4gdGhlIGxpc3QgdXNpbmcgdGhlIHZpcnR1 YWwgVk1JRCBhcyBhIGtleSAqLwo+IAo+IEkgdGhpbmsgd2hlbiB0aGUgZ3Vlc3QgaGFzIHN0YWdl IDIgZW5hYmxlZCB3ZSBhbHNvIG1hdGNoIG9uCj4gVlRUQlJfRUwyLlZNSUQgKyBWVFRCUl9FTDIu QkFERFIuCgpZZXMuCgo+IAo+ID4gKwlmb3IgKGkgPSAwOyBpIDwga3ZtLT5hcmNoLm5lc3RlZF9t bXVzX3NpemU7IGkrKykgewo+ID4gKwkJc3RydWN0IGt2bV9zMl9tbXUgKm1tdSA9ICZrdm0tPmFy Y2gubmVzdGVkX21tdXNbaV07Cj4gPiArCj4gPiArCQlpZiAoIWt2bV9zMl9tbXVfdmFsaWQobW11 KSkKPiA+ICsJCQljb250aW51ZTsKPiA+ICsKPiA+ICsJCWlmIChuZXN0ZWRfc3RhZ2UyX2VuYWJs ZWQgJiYKPiA+ICsJCSAgICBtbXUtPm5lc3RlZF9zdGFnZTJfZW5hYmxlZCAmJgo+ID4gKwkJICAg IHZ0dGJyID09IG1tdS0+dnR0YnIpCj4gPiArCQkJcmV0dXJuIG1tdTsKPiA+ICsKPiA+ICsJCWlm ICghbmVzdGVkX3N0YWdlMl9lbmFibGVkICYmCj4gPiArCQkgICAgIW1tdS0+bmVzdGVkX3N0YWdl Ml9lbmFibGVkICYmCj4gPiArCQkgICAgZ2V0X3ZtaWQodnR0YnIpID09IGdldF92bWlkKG1tdS0+ dnR0YnIpKQo+ID4gKwkJCXJldHVybiBtbXU7Cj4gCj4gSSdtIHN0cnVnZ2xpbmcgdG8gdW5kZXJz dGFuZCB3aHkgd2UgZG8gdGhpcy4gQXMgZmFyIGFzIEkgY2FuIHRlbGwsCj4gdGhpcyBhcHBsaWVz IG9ubHkgdG8gbm9uLXZoZSBndWVzdCBoeXBlcnZpc29ycywgYmVjYXVzZSB0aGF0J3MgdGhlCj4g b25seSBzaXR1YXRpb24gd2hlcmUgd2UgcnVuIHNvbWV0aGluZyBhdCB2RUwxIHdpdGhvdXQgc2hh ZG93IHN0YWdlIDIKPiBlbmFibGVkLgoKSSBkb24ndCB0aGluayB0aGUgbm9uLVZIRSBjb25zaWRl cmF0aW9uIGlzIHJlbGV2YW50IGhlcmUuIFRyeWluZyB0bwpkaXN0aW5ndWlzaCBiZXR3ZWVuIGFy Yml0cmFyeSB1c2UgY2FzZXMgaXMganVzdCBhIG1hc3NpdmUgZGlzdHJhY3Rpb24KYW5kIGdldHMg aW4gdGhlIHdheSBvZiBpbXBsZW1lbnRpbmcgdGhlIGFyY2hpdGVjdHVyZSBjb3JyZWN0bHkuCgo+ IFRoZXJlJ3Mgb25seSBvbmUgTU1VIHRoYXQgbWF0Y2hlcyB0aGF0IGd1ZXN0LCBiZWNhdXNlCj4g dGhlcmUncyBvbmx5IG9uZSBob3N0IGZvciB0aGUgbm9uLXZoZSBoeXBlcnZpc29yLiBTbyB3aHkg YXJlIHdlCj4gbWF0Y2hpbmcgb24gdm1pZCBvbmx5LCBpbnN0ZWFkIG9mIG1hdGNoaW5nIG9uIHRo ZSBlbnRpcmUgdnR0YnI/IElzCj4gaXQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGdldCBmb29s ZWQgYnkgYSBuYXVnaHR5IGd1ZXN0IHRoYXQKPiBjaGFuZ2VzIHRoZSBCQUREUiBlYWNoIHRpbWUg aXQgc3dpdGNoZXMgdG8gaXRzIEVMMSBob3N0PyBPcgo+IHNvbWV0aGluZyBlbHNlIGVudGlyZWx5 IHRoYXQgSSdtIG1pc3Npbmc/CgpGaXJzdCwgbGV0J3MgcmVtZW1iZXIgb25lIHRoaW5nOiBObyBt YXR0ZXIgd2hldGhlciB3ZSBoYXZlIFMyIGVuYWJsZWQKb3Igbm90LCBUTEJzIGFyZSB0YWdnZWQg YnkgVk1JRC4gSSB3b25kZXJlZCBhYm91dCB0aGF0IGZvciBhIGxvbmcKdGltZSwgYnV0IGNvdWxk bid0IGZpbmQgYW55dGhpbmcgaW4gdGhlIGFyY2hpdGVjdHVyZSB0aGF0IHdvdWxkCmNvbnRyYWRp Y3QgdGhpcy4gQW5kIGlmIHlvdSB0aGluayBvZiB3aGF0IGEgQ1BVIG11c3QgaW1wbGVtZW50LCBp dAptYWtlcyBtb3JlIHNlbnNlIHRvIGFsd2F5cyB0YWcgdGhpbmdzIHRoYW4gdHJ5IHRvIGNvbWUg dXAgd2l0aCBtb3JlCmZhbmN5IHNjaGVtZXMuCgpHaXZlbiB0aGF0IG91ciBzaGFkb3cgUzIgaXMg YW4gdWdseSBmb3JtIG9mIFNXLWxvYWRlZCBUTEJzLCBtYXRjaGluZwp0aGUgVk1JRCBpcyBjcml0 aWNhbCB0byBoaXQgdGhlIHJpZ2h0IHNoYWRvdyBNTVUgY29udGV4dC4gQW5kIHNpbmNlIFMyCip0 cmFuc2xhdGlvbiogaXMgZGlzYWJsZWQsIGl0IGlzIHBlcmZlY3RseSB2YWxpZCB0byBpZ25vcmUg dGhlIEJBRERSCnBhcnQgb2YgVlRUQlIsIGFuZCBWSEUtdnMtIVZIRSBkb2Vzbid0IGNvbWUgaW50 byB0aGUgZXF1YXRpb24uCgpOb3csIHRoZSByZWFsIGNhdXNlIGZvciBxdWVzdGlvbmluZyBpcyB0 aGUgcHJldmlvdXMgc3RhdGVtZW50OiB3aHkgZG8Kd2UgZGVjaWRlIHRvIG1hdGNoIG9uIHRoZSB3 aG9sZSBWVFRCUiB3aGVuIFMyIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQ/CkxldCdzIGltYWdpbmUg YSBndWVzdCB0aGF0IHJldXNlcyB0aGUgc2FtZSBWTUlEIGZvciBkaWZmZXJlbnQKdHJhbnNsYXRp b25zICh0aGF0J3MgYSBiaXQgYm9ua2VycywgYnV0IHVuZm9ydHVuYXRlbHkgbm90IGZvcmJpZGRl biBieQp0aGUgYXJjaGl0ZWN0dXJlIGlmIHlvdSBjb25zaWRlciBwZXItQ1BVIHRyYW5zbGF0aW9u cykuCgpBbmQgZXZlbiBpbiB0aGUgc2luZ2xlIFZDUFUgY2FzZSB0aGF0IHdvdWxkIGNoYW5nZSBC QUREUiBlYWNoIHRpbWUKd2l0aG91dCBpbnZhbGlkYXRpbmcgdGhlIFRMQnM6IElmIHdlIG9ubHkg bWF0Y2hlZCBvbiB0aGUgVk1JRCwgd2UKY291bGQgcG90ZW50aWFsbHkgZW5kLXVwIHdpdGggVExC IGNvbmZsaWN0cywgYW5kIHRoYXQncyBub3QgYSBuaWNlCnBsYWNlIHRvIGJlLiBTbyB3ZSB3aWxs IGp1c3QgcGljayBhIG5ldyBNTVUgY29udGV4dCwgYW5kIHN0YXJ0CnBvcHVsYXRpbmcgc2hhZG93 IHRyYW5zbGF0aW9ucyBiYXNlZCBvbiB0aGlzIGNvbnRleHQuIFRoaXMgaXMgcHJldHR5CmZvcmdp dmluZyBmb3IgYnJva2VuIGd1ZXN0cywgYnV0IGl0IGFsc28gc2ltcGxpZmllcyB0aGUgaW1wbGVt ZW50YXRpb24uCgo+IAo+ID4gKwl9Cj4gPiArCXJldHVybiBOVUxMOwo+ID4gK30KPiA+ICsKPiA+ ICtzdGF0aWMgc3RydWN0IGt2bV9zMl9tbXUgKmdldF9zMl9tbXVfbmVzdGVkKHN0cnVjdCBrdm1f dmNwdSAqdmNwdSkKPiA+ICt7Cj4gPiArCXN0cnVjdCBrdm0gKmt2bSA9IHZjcHUtPmt2bTsKPiA+ ICsJdTY0IHZ0dGJyID0gdmNwdV9yZWFkX3N5c19yZWcodmNwdSwgVlRUQlJfRUwyKTsKPiA+ICsJ dTY0IGhjcj0gdmNwdV9yZWFkX3N5c19yZWcodmNwdSwgSENSX0VMMik7Cj4gPiArCXN0cnVjdCBr dm1fczJfbW11ICpzMl9tbXU7Cj4gPiArCWludCBpOwo+ID4gKwo+ID4gKwlzMl9tbXUgPSBsb29r dXBfczJfbW11KGt2bSwgdnR0YnIsIGhjcik7Cj4gPiArCWlmIChzMl9tbXUpCj4gPiArCQlnb3Rv IG91dDsKPiA+ICsKPiA+ICsJZm9yIChpID0gMDsgaSA8IGt2bS0+YXJjaC5uZXN0ZWRfbW11c19z aXplOyBpKyspIHsKPiA+ICsJCXMyX21tdSA9ICZrdm0tPmFyY2gubmVzdGVkX21tdXNbaV07Cj4g PiArCj4gPiArCQlpZiAoYXRvbWljX3JlYWQoJnMyX21tdS0+cmVmY250KSA9PSAwKQo+ID4gKwkJ CWJyZWFrOwo+ID4gKwl9Cj4gPiArCUJVR19PTihhdG9taWNfcmVhZCgmczJfbW11LT5yZWZjbnQp KTsgLyogV2UgaGF2ZSBzdHJ1Y3QgTU1VcyB0byBzcGFyZSAqLwo+ID4gKwo+ID4gKwlpZiAoa3Zt X3MyX21tdV92YWxpZChzMl9tbXUpKSB7Cj4gPiArCQkvKiBDbGVhciB0aGUgb2xkIHN0YXRlICov Cj4gPiArCQlrdm1fdW5tYXBfc3RhZ2UyX3JhbmdlKHMyX21tdSwgMCwga3ZtX3BoeXNfc2l6ZShr dm0pKTsKPiA+ICsJCWlmIChzMl9tbXUtPnZtaWQudm1pZF9nZW4pCj4gPiArCQkJa3ZtX2NhbGxf aHlwKF9fa3ZtX3RsYl9mbHVzaF92bWlkLCBzMl9tbXUpOwo+ID4gKwl9Cj4gPiArCj4gPiArCS8q Cj4gPiArCSAqIFRoZSB2aXJ0dWFsIFZNSUQgKG1vZHVsbyBDblApIHdpbGwgYmUgdXNlZCBhcyBh IGtleSB3aGVuIG1hdGNoaW5nCj4gPiArCSAqIGFuIGV4aXN0aW5nIGt2bV9zMl9tbXUuCj4gPiAr CSAqLwo+ID4gKwlzMl9tbXUtPnZ0dGJyID0gdnR0YnIgJiB+MVVMOwo+ID4gKwlzMl9tbXUtPm5l c3RlZF9zdGFnZTJfZW5hYmxlZCA9IGhjciAmIEhDUl9WTTsKPiA+ICsKPiA+ICtvdXQ6Cj4gPiAr CWF0b21pY19pbmMoJnMyX21tdS0+cmVmY250KTsKPiA+ICsJcmV0dXJuIHMyX21tdTsKPiA+ICt9 Cj4gPiArCj4gPiArdm9pZCBrdm1faW5pdF9zMl9tbXUoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSkK PiA+ICt7Cj4gPiArCW1tdS0+dnR0YnIgPSAxOwo+ID4gKwltbXUtPm5lc3RlZF9zdGFnZTJfZW5h YmxlZCA9IGZhbHNlOwo+ID4gKwlhdG9taWNfc2V0KCZtbXUtPnJlZmNudCwgMCk7Cj4gPiArfQo+ ID4gKwo+ID4gK3ZvaWQga3ZtX3ZjcHVfbG9hZF9od19tbXUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1 KQo+ID4gK3sKPiA+ICsJaWYgKGlzX2h5cF9jdHh0KHZjcHUpKSB7Cj4gCj4gSWYgdXNlcnNwYWNl IGhhcyBzZXQgdGhlIG5lc3RlZCBmZWF0dXJlLCBidXQgaGFzbid0IHNldCB0aGUgdmNwdQo+IG1v ZGUgdG8gUFNSX01PREVfRUwyaC9QU1JfTU9ERV9FTDJ0LCB3ZSB3aWxsIG5ldmVyIHVzZQo+IGt2 bS0+YXJjaC5tbXUsIGFuZCBpbnN0ZWFkIHdlJ2xsIGFsd2F5cyB0YWtlIHRoZSBtbXVfbG9jayBh bmQgc2VhcmNoCj4gZm9yIHRoZSBtbXUuIElzIHRoYXQgc29tZXRoaW5nIHdlIHNob3VsZCBjYXJl IGFib3V0PwoKSSdtIHJlYWxseSBub3Qgd29ycmllZCBhYm91dCB0aGlzLiBJZiB0aGUgdXNlciBo YXMgYXNrZWQgZm9yIG5lc3RlZApzdXBwb3J0IGJ1dCBkb2Vzbid0IG1ha2UgdXNlIG9mIGl0LCB0 b3VnaCBsdWNrLgoKPiAKPiA+ICsJCXZjcHUtPmFyY2guaHdfbW11ID0gJnZjcHUtPmt2bS0+YXJj aC5tbXU7Cj4gPiArCX0gZWxzZSB7Cj4gPiArCQlzcGluX2xvY2soJnZjcHUtPmt2bS0+bW11X2xv Y2spOwo+ID4gKwkJdmNwdS0+YXJjaC5od19tbXUgPSBnZXRfczJfbW11X25lc3RlZCh2Y3B1KTsK PiA+ICsJCXNwaW5fdW5sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKPiA+ICsJfQo+ID4gK30K PiA+ICsKPiA+ICt2b2lkIGt2bV92Y3B1X3B1dF9od19tbXUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1 KQo+ID4gK3sKPiA+ICsJaWYgKHZjcHUtPmFyY2guaHdfbW11ICE9ICZ2Y3B1LT5rdm0tPmFyY2gu bW11KSB7Cj4gPiArCQlhdG9taWNfZGVjKCZ2Y3B1LT5hcmNoLmh3X21tdS0+cmVmY250KTsKPiA+ ICsJCXZjcHUtPmFyY2guaHdfbW11ID0gTlVMTDsKPiA+ICsJfQo+ID4gK30KPiA+ICAKPiA+ICAv Kgo+ID4gICAqIEluamVjdCB3ZnggdG8gdGhlIHZpcnR1YWwgRUwyIGlmIHRoaXMgaXMgbm90IGZy b20gdGhlIHZpcnR1YWwgRUwyIGFuZAo+ID4gQEAgLTM3LDMgKzE5MSwyMSBAQCBpbnQgaGFuZGxl X3dmeF9uZXN0ZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBib29sIGlzX3dmZSkKPiA+ICAKPiA+ ICAJcmV0dXJuIC1FSU5WQUw7Cj4gPiAgfQo+ID4gKwo+ID4gK3ZvaWQga3ZtX2FyY2hfZmx1c2hf c2hhZG93X2FsbChzdHJ1Y3Qga3ZtICprdm0pCj4gPiArewo+ID4gKwlpbnQgaTsKPiA+ICsKPiA+ ICsJZm9yIChpID0gMDsgaSA8IGt2bS0+YXJjaC5uZXN0ZWRfbW11c19zaXplOyBpKyspIHsKPiA+ ICsJCXN0cnVjdCBrdm1fczJfbW11ICptbXUgPSAma3ZtLT5hcmNoLm5lc3RlZF9tbXVzW2ldOwo+ ID4gKwo+ID4gKwkJV0FSTl9PTihhdG9taWNfcmVhZCgmbW11LT5yZWZjbnQpKTsKPiA+ICsKPiA+ ICsJCWlmICghYXRvbWljX3JlYWQoJm1tdS0+cmVmY250KSkKPiA+ICsJCQlrdm1fZnJlZV9zdGFn ZTJfcGdkKG1tdSk7Cj4gPiArCX0KPiA+ICsJa2ZyZWUoa3ZtLT5hcmNoLm5lc3RlZF9tbXVzKTsK PiA+ICsJa3ZtLT5hcmNoLm5lc3RlZF9tbXVzID0gTlVMTDsKPiA+ICsJa3ZtLT5hcmNoLm5lc3Rl ZF9tbXVzX3NpemUgPSAwOwo+ID4gKwlrdm1fZnJlZV9zdGFnZTJfcGdkKCZrdm0tPmFyY2gubW11 KTsKPiA+ICt9Cj4gPiBkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL2FybS5jIGIvdmlydC9rdm0v YXJtL2FybS5jCj4gPiBpbmRleCA1ZDQzNzE2MzNlMWMuLjRlM2NiZmExZWNiZSAxMDA2NDQKPiA+ IC0tLSBhL3ZpcnQva3ZtL2FybS9hcm0uYwo+ID4gKysrIGIvdmlydC9rdm0vYXJtL2FybS5jCj4g PiBAQCAtMzYsNiArMzYsNyBAQAo+ID4gICNpbmNsdWRlIDxhc20va3ZtX2FybS5oPgo+ID4gICNp bmNsdWRlIDxhc20va3ZtX2FzbS5oPgo+ID4gICNpbmNsdWRlIDxhc20va3ZtX21tdS5oPgo+ID4g KyNpbmNsdWRlIDxhc20va3ZtX25lc3RlZC5oPgo+ID4gICNpbmNsdWRlIDxhc20va3ZtX2VtdWxh dGUuaD4KPiA+ICAjaW5jbHVkZSA8YXNtL2t2bV9jb3Byb2MuaD4KPiA+ICAjaW5jbHVkZSA8YXNt L3NlY3Rpb25zLmg+Cj4gPiBAQCAtMTI2LDYgKzEyNyw4IEBAIGludCBrdm1fYXJjaF9pbml0X3Zt KHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgbG9uZyB0eXBlKQo+ID4gIAlrdm0tPmFyY2gubW11 LnZtaWQudm1pZF9nZW4gPSAwOwo+ID4gIAlrdm0tPmFyY2gubW11Lmt2bSA9IGt2bTsKPiA+ICAK PiA+ICsJa3ZtX2luaXRfbmVzdGVkKGt2bSk7Cj4gCj4gTW9yZSBjb250ZXh0Ogo+IAo+IEBAIC0x MjAsMTggKzEyMSwyMCBAQCBpbnQga3ZtX2FyY2hfaW5pdF92bShzdHJ1Y3Qga3ZtICprdm0sIHVu c2lnbmVkIGxvbmcgdHlwZSkKPiDCoAo+IMKgwqDCoMKgIHJldCA9IGt2bV9hbGxvY19zdGFnZTJf cGdkKCZrdm0tPmFyY2gubW11KTsKPiDCoMKgwqDCoCBpZiAocmV0KQo+IMKgwqDCoMKgIMKgwqDC oCBnb3RvIG91dF9mYWlsX2FsbG9jOwo+IMKgCj4gwqDCoMKgwqAgLyogTWFyayB0aGUgaW5pdGlh bCBWTUlEIGdlbmVyYXRpb24gaW52YWxpZCAqLwo+IMKgwqDCoMKgIGt2bS0+YXJjaC5tbXUudm1p ZC52bWlkX2dlbiA9IDA7Cj4gwqDCoMKgwqAga3ZtLT5hcmNoLm1tdS5rdm0gPSBrdm07Cj4gwqAK PiArwqDCoMKgIGt2bV9pbml0X25lc3RlZChrdm0pOwo+ICsKPiAKPiBrdm1fYWxsb2Nfc3RhZ2Uy X3BnZCBlbmRzIHVwIGNhbGxpbmcga3ZtX2luaXRfczJfbW11IGZvcgo+IGt2bS0+YXJjaC5tbXUu ICBrdm1faW5pdF9uZXN0ZWQgZG9lcyB0aGUgc2FtZSB0aGluZywgYW5kIHdlIGVuZCB1cAo+IGNh bGxpbmcga3ZtX2luaXRfczJfbW11IGZvciBrdm0tPmFyY2gubW11IHR3aWNlLiBUaGVyZSdzIHJl YWxseSBubwo+IGhhcm0gaW4gZG9pbmcgaXQgdHdpY2UsIGJ1dCBJIHRob3VnaHQgSSBjb3VsZCBt ZW50aW9uIGl0IGJlY2F1c2UgaXQKPiBsb29rcyB0byBtZSB0aGF0IHRoZSBmaXggaXMgc2ltcGxl OiByZW1vdmUgdGhlIGt2bV9pbml0X3MyX21tdSBjYWxsCj4gZnJvbSBrdm1faW5pdF9uZXN0ZWQu IFRoZSBkb3VibGUgaW5pdGlhbGl6YXRpb24gaXMgYWxzbyB0cnVlIGZvciB0aGUKPiB0aXAgb2Yg dGhlIHNlcmllcy4KCkkndmUgcmV3b3JrZWQgdGhpcyBwYXJ0IGEgYml0LCBhbmQgbmVlZCB0byBy ZWNvbmNpbGUgdGhlIGFib3ZlIHdpdGgKd2hhdCBJIG5vdyBoYXZlLiBPdmVyYWxsLCBJIGRvIGFn cmVlIHRoYXQgdGhlcmUgaXMgc29tZSB2YXN0bHkKcmVkdW5kYW50IGluaXQgaGVyZS4KCkFuZCBh IHZlcnkgYmVsYXRlZCB0aGFua3MgZm9yIGFsbCB0aGUgd29yayB5b3UndmUgcHV0IGludG8gcmV2 aWV3aW5nCnRoaXMgZGlmZmljdWx0IHNlcmllcy4gUmVzdCBhc3N1cmVkIHRoYXQgdGhpcyB3YXNu J3QgaW4gdmFpbiEKClRoYW5rcywKCglNLgoKLS0gCkphenogaXMgbm90IGRlYWQsIGl0IGp1c3Qg c21lbGxzIGZ1bm55LgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0 cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGlu Zm8vbGludXgtYXJtLWtlcm5lbAo=