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 10DCC3C1D for ; Tue, 15 Aug 2023 10:38:46 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3D232C433C8; Tue, 15 Aug 2023 10:38:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1692095926; bh=Ab3lW2QmaXFPBydbQW8n1G4967qqEI7MymXqkcI2A3I=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=CJRzG6elQOY8I5TzQPwEe7jYleC99OJi4KsGLUwesh8WVMmPaYP8WnZMcEJH654+W eGDdOPWjVLdQT9m0XAhQrkzwTFrjVPCkiatZrdC1wztqBjTJo4n2nstvDetgYMvuMp jMIA640DDzGCnDevqbaJS9JdDZUyPvc6hu869NOQB4HtrFtjLhXvvLuhZsJ3a4uO+9 hM1jp8v683RNvnLowSnPdcj/CuElsQ1fuHVh/Nrt0FfyzfjXzUj1HQj/fX1I8HAL6A ac+7/JcA2sm5vs0Hp5BiGZ2PQNv1LTUZa8DQFOVXSyPGb7Ub6bruZCCpOTeElrtnab 37OLpgOFBfaWQ== Received: from host213-123-75-60.in-addr.btopenworld.com ([213.123.75.60] 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 1qVrRj-004yaI-Kn; Tue, 15 Aug 2023 11:38:43 +0100 Date: Tue, 15 Aug 2023 11:38:53 +0100 Message-ID: <87jztwpp36.wl-maz@kernel.org> From: Marc Zyngier To: Jing Zhang Cc: kvmarm@lists.linux.dev, kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Catalin Marinas , Eric Auger , Mark Brown , Mark Rutland , Will Deacon , Alexandru Elisei , Andre Przywara , Chase Conklin , Ganapatrao Kulkarni , Darren Hart , Miguel Luis , James Morse , Suzuki K Poulose , Oliver Upton , Zenghui Yu Subject: Re: [PATCH v3 14/27] KVM: arm64: nv: Add trap forwarding infrastructure In-Reply-To: References: <20230808114711.2013842-1-maz@kernel.org> <20230808114711.2013842-15-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: 213.123.75.60 X-SA-Exim-Rcpt-To: jingzhangos@google.com, kvmarm@lists.linux.dev, kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, catalin.marinas@arm.com, eric.auger@redhat.com, broonie@kernel.org, mark.rutland@arm.com, will@kernel.org, alexandru.elisei@arm.com, andre.przywara@arm.com, chase.conklin@arm.com, gankulkarni@os.amperecomputing.com, darren@os.amperecomputing.com, miguel.luis@oracle.com, james.morse@arm.com, suzuki.poulose@arm.com, oliver.upton@linux.dev, yuzenghui@huawei.com X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false On Sun, 13 Aug 2023 03:24:19 +0100, Jing Zhang wrote: >=20 > Hi Marc, >=20 > On Tue, Aug 8, 2023 at 4:48=E2=80=AFAM Marc Zyngier wrot= e: > > > > A significant part of what a NV hypervisor needs to do is to decide > > whether a trap from a L2+ guest has to be forwarded to a L1 guest > > or handled locally. This is done by checking for the trap bits that > > the guest hypervisor has set and acting accordingly, as described by > > the architecture. > > > > A previous approach was to sprinkle a bunch of checks in all the > > system register accessors, but this is pretty error prone and doesn't > > help getting an overview of what is happening. > > > > Instead, implement a set of global tables that describe a trap bit, > > combinations of trap bits, behaviours on trap, and what bits must > > be evaluated on a system register trap. > > > > Although this is painful to describe, this allows to specify each > > and every control bit in a static manner. To make it efficient, > > the table is inserted in an xarray that is global to the system, > > and checked each time we trap a system register while running > > a L2 guest. > > > > Add the basic infrastructure for now, while additional patches will > > implement configuration registers. > > > > Signed-off-by: Marc Zyngier > > --- > > arch/arm64/include/asm/kvm_host.h | 1 + > > arch/arm64/include/asm/kvm_nested.h | 2 + > > arch/arm64/kvm/emulate-nested.c | 262 ++++++++++++++++++++++++++++ > > arch/arm64/kvm/sys_regs.c | 6 + > > arch/arm64/kvm/trace_arm.h | 26 +++ > > 5 files changed, 297 insertions(+) > > > > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm= /kvm_host.h > > index 721680da1011..cb1c5c54cedd 100644 > > --- a/arch/arm64/include/asm/kvm_host.h > > +++ b/arch/arm64/include/asm/kvm_host.h > > @@ -988,6 +988,7 @@ int kvm_handle_cp10_id(struct kvm_vcpu *vcpu); > > void kvm_reset_sys_regs(struct kvm_vcpu *vcpu); > > > > int __init kvm_sys_reg_table_init(void); > > +int __init populate_nv_trap_config(void); > > > > bool lock_all_vcpus(struct kvm *kvm); > > void unlock_all_vcpus(struct kvm *kvm); > > diff --git a/arch/arm64/include/asm/kvm_nested.h b/arch/arm64/include/a= sm/kvm_nested.h > > index 8fb67f032fd1..fa23cc9c2adc 100644 > > --- a/arch/arm64/include/asm/kvm_nested.h > > +++ b/arch/arm64/include/asm/kvm_nested.h > > @@ -11,6 +11,8 @@ static inline bool vcpu_has_nv(const struct kvm_vcpu = *vcpu) > > test_bit(KVM_ARM_VCPU_HAS_EL2, vcpu->arch.features)); > > } > > > > +extern bool __check_nv_sr_forward(struct kvm_vcpu *vcpu); > > + > > struct sys_reg_params; > > struct sys_reg_desc; > > > > diff --git a/arch/arm64/kvm/emulate-nested.c b/arch/arm64/kvm/emulate-n= ested.c > > index b96662029fb1..1b1148770d45 100644 > > --- a/arch/arm64/kvm/emulate-nested.c > > +++ b/arch/arm64/kvm/emulate-nested.c > > @@ -14,6 +14,268 @@ > > > > #include "trace.h" > > > > +enum trap_behaviour { > > + BEHAVE_HANDLE_LOCALLY =3D 0, > > + BEHAVE_FORWARD_READ =3D BIT(0), > > + BEHAVE_FORWARD_WRITE =3D BIT(1), > > + BEHAVE_FORWARD_ANY =3D BEHAVE_FORWARD_READ | BEHAVE_FORWAR= D_WRITE, > > +}; > > + > > +struct trap_bits { > > + const enum vcpu_sysreg index; > > + const enum trap_behaviour behaviour; > > + const u64 value; > > + const u64 mask; > > +}; > > + > > +enum trap_group { > > + /* Indicates no coarse trap control */ > > + __RESERVED__, > > + > > + /* > > + * The first batch of IDs denote coarse trapping that are used > > + * on their own instead of being part of a combination of > > + * trap controls. > > + */ > > + > > + /* > > + * Anything after this point is a combination of trap controls, > > + * which all must be evaluated to decide what to do. > > + */ > > + __MULTIPLE_CONTROL_BITS__, > > + > > + /* > > + * Anything after this point requires a callback evaluating a > > + * complex trap condition. Hopefully we'll never need this... > > + */ > > + __COMPLEX_CONDITIONS__, > > + > > + /* Must be last */ > > + __NR_TRAP_GROUP_IDS__ > > +}; > > + > > +static const struct trap_bits coarse_trap_bits[] =3D { > > +}; > > + > > +#define MCB(id, ...) \ > > + [id - __MULTIPLE_CONTROL_BITS__] =3D \ > > + (const enum trap_group []){ \ > > + __VA_ARGS__, __RESERVED__ \ > > + } > > + > > +static const enum trap_group *coarse_control_combo[] =3D { > > +}; > > + > > +typedef enum trap_behaviour (*complex_condition_check)(struct kvm_vcpu= *); > > + > > +#define CCC(id, fn) \ > > + [id - __COMPLEX_CONDITIONS__] =3D fn > > + > > +static const complex_condition_check ccc[] =3D { > > +}; > > + > > +/* > > + * Bit assignment for the trap controls. We use a 64bit word with the > > + * following layout for each trapped sysreg: > > + * > > + * [9:0] enum trap_group (10 bits) > > + * [13:10] enum fgt_group_id (4 bits) > > + * [19:14] bit number in the FGT register (6 bits) > > + * [20] trap polarity (1 bit) > > + * [62:21] Unused (42 bits) > > + * [63] RES0 - Must be zero, as lost on insertion in th= e xarray > > + */ > > +#define TC_CGT_BITS 10 > > +#define TC_FGT_BITS 4 > > + > > +union trap_config { > > + u64 val; > > + struct { > > + unsigned long cgt:TC_CGT_BITS; /* Coarse trap id */ > > + unsigned long fgt:TC_FGT_BITS; /* Fing Grained Trap i= d */ >=20 > Would it be better to leave the definition of FGT field to patch 19/27 > which adds the infrastructure for FGT forwarding? It doesn't matter much, but I can move it. >=20 > > + unsigned long bit:6; /* Bit number */ > > + unsigned long pol:1; /* Polarity */ > > + unsigned long unk:42; /* Unknown */ > > + unsigned long mbz:1; /* Must Be Zero */ > > + }; > > +}; > > + > > +struct encoding_to_trap_config { > > + const u32 encoding; > > + const u32 end; > > + const union trap_config tc; > > +}; > > + > > +#define SR_RANGE_TRAP(sr_start, sr_end, trap_id) = \ > > + { = \ > > + .encoding =3D sr_start, = \ > > + .end =3D sr_end, = \ > > + .tc =3D { = \ > > + .cgt =3D trap_id, = \ > > + }, = \ > > + } > > + > > +#define SR_TRAP(sr, trap_id) SR_RANGE_TRAP(sr, sr, trap_id) > > + > > +/* > > + * Map encoding to trap bits for exception reported with EC=3D0x18. > > + * These must only be evaluated when running a nested hypervisor, but > > + * that the current context is not a hypervisor context. When the > > + * trapped access matches one of the trap controls, the exception is > > + * re-injected in the nested hypervisor. > > + */ > > +static const struct encoding_to_trap_config encoding_to_cgt[] __initco= nst =3D { > > +}; > > + > > +static DEFINE_XARRAY(sr_forward_xa); > > + > > +static union trap_config get_trap_config(u32 sysreg) > > +{ > > + return (union trap_config) { > > + .val =3D xa_to_value(xa_load(&sr_forward_xa, sysreg)), > > + }; > > +} > > + > > +int __init populate_nv_trap_config(void) > > +{ > > + int ret =3D 0; > > + > > + BUILD_BUG_ON(sizeof(union trap_config) !=3D sizeof(void *)); > > + BUILD_BUG_ON(__NR_TRAP_GROUP_IDS__ > BIT(TC_CGT_BITS)); > > + > > + for (int i =3D 0; i < ARRAY_SIZE(encoding_to_cgt); i++) { > > + const struct encoding_to_trap_config *cgt =3D &encoding= _to_cgt[i]; > > + void *prev; > > + > > + prev =3D xa_store_range(&sr_forward_xa, cgt->encoding, = cgt->end, > > + xa_mk_value(cgt->tc.val), GFP_KER= NEL); > > + > > + if (prev) { > > + kvm_err("Duplicate CGT for (%d, %d, %d, %d, %d)= \n", > > + sys_reg_Op0(cgt->encoding), > > + sys_reg_Op1(cgt->encoding), > > + sys_reg_CRn(cgt->encoding), > > + sys_reg_CRm(cgt->encoding), > > + sys_reg_Op2(cgt->encoding)); > > + ret =3D -EINVAL; > > + } >=20 > The xa_store_range would only return non-NULL when the entry cannot be > stored (XA_ERROR(-EINVAL)) or memory allocation failed > (XA_ERROR(-ENOMEM)). > Another way may be needed to detect duplicate CGT. Huh, well spotted. I've added code to fallback to xa_store() when not dealing with an actual range, and now have some code to deal with the error path. Unfortunately, I can't see an easy way to deal with overlapping ranges on insertion, and we'll have to deal with the possibility that someone has messed up. >=20 > > + } > > + > > + kvm_info("nv: %ld coarse grained trap handlers\n", > > + ARRAY_SIZE(encoding_to_cgt)); > > + > > + for (int id =3D __MULTIPLE_CONTROL_BITS__; > > + id < (__COMPLEX_CONDITIONS__ - 1); > > + id++) { > > + const enum trap_group *cgids; > > + > > + cgids =3D coarse_control_combo[id - __MULTIPLE_CONTROL_= BITS__]; > > + > > + for (int i =3D 0; cgids[i] !=3D __RESERVED__; i++) { > > + if (cgids[i] >=3D __MULTIPLE_CONTROL_BITS__) { > > + kvm_err("Recursive MCB %d/%d\n", id, cg= ids[i]); > > + ret =3D -EINVAL; >=20 > I am confused about the above check for recursive MCB. In patch 17/29, > a recursive MCD is added and looks like recursive MCB is allowed as > shown in __do_compute_trap_behaviour(). Yeah, you're absolutely right. The reason it doesn't fire is because the outer iterator is broken, as pointed out by Miguel (the last MCB is never checked). Not that recursive MCBs are evil on their own, but people are legitimately scared about them. However, I want the check to be done at boot time, and not at handling time. I've now fixed the iterator, and split CGT_MDCR_TDCC_TDE_TDA into 3 different bits, getting rid of the sole recursive MCB. >=20 > > + } > > + } > > + } > > + > > + if (ret) > > + xa_destroy(&sr_forward_xa); > > + > > + return ret; > > +} > > + > > +static enum trap_behaviour get_behaviour(struct kvm_vcpu *vcpu, > > + const struct trap_bits *tb) > > +{ > > + enum trap_behaviour b =3D BEHAVE_HANDLE_LOCALLY; > > + u64 val; > > + > > + val =3D __vcpu_sys_reg(vcpu, tb->index); > > + if ((val & tb->mask) =3D=3D tb->value) > > + b |=3D tb->behaviour; > > + > > + return b; > > +} > > + > > +static enum trap_behaviour __do_compute_trap_behaviour(struct kvm_vcpu= *vcpu, > > + const enum trap_= group id, > > + enum trap_behavi= our b) > > +{ > > + switch (id) { > > + const enum trap_group *cgids; > > + > > + case __RESERVED__ ... __MULTIPLE_CONTROL_BITS__ - 1: > > + if (likely(id !=3D __RESERVED__)) > > + b |=3D get_behaviour(vcpu, &coarse_trap_bits[id= ]); > > + break; > > + case __MULTIPLE_CONTROL_BITS__ ... __COMPLEX_CONDITIONS__ - 1: > > + /* Yes, this is recursive. Don't do anything stupid. */ > > + cgids =3D coarse_control_combo[id - __MULTIPLE_CONTROL_= BITS__]; > > + for (int i =3D 0; cgids[i] !=3D __RESERVED__; i++) > > + b |=3D __do_compute_trap_behaviour(vcpu, cgids[= i], b); > > + break; > > + default: > > + if (ARRAY_SIZE(ccc)) > > + b |=3D ccc[id - __COMPLEX_CONDITIONS__](vcpu); > > + break; > > + } > > + > > + return b; > > +} > > + > > +static enum trap_behaviour compute_trap_behaviour(struct kvm_vcpu *vcp= u, > > + const union trap_conf= ig tc) > > +{ > > + enum trap_behaviour b =3D BEHAVE_HANDLE_LOCALLY; > > + > > + return __do_compute_trap_behaviour(vcpu, tc.cgt, b); > > +} > > + > > +bool __check_nv_sr_forward(struct kvm_vcpu *vcpu) > > +{ > > + union trap_config tc; > > + enum trap_behaviour b; > > + bool is_read; > > + u32 sysreg; > > + u64 esr; > > + > > + if (!vcpu_has_nv(vcpu) || is_hyp_ctxt(vcpu)) > > + return false; > > + > > + esr =3D kvm_vcpu_get_esr(vcpu); > > + sysreg =3D esr_sys64_to_sysreg(esr); > > + is_read =3D (esr & ESR_ELx_SYS64_ISS_DIR_MASK) =3D=3D ESR_ELx_S= YS64_ISS_DIR_READ; > > + > > + tc =3D get_trap_config(sysreg); > > + > > + /* > > + * A value of 0 for the whole entry means that we know nothing > > + * for this sysreg, and that it cannot be forwareded. In this > > + * situation, let's cut it short. > > + * > > + * Note that ultimately, we could also make use of the xarray > > + * to store the index of the sysreg in the local descriptor > > + * array, avoiding another search... Hint, hint... > > + */ > > + if (!tc.val) > > + return false; > > + > > + b =3D compute_trap_behaviour(vcpu, tc); > > + > > + if (((b & BEHAVE_FORWARD_READ) && is_read) || > > + ((b & BEHAVE_FORWARD_WRITE) && !is_read)) > > + goto inject; > > + > > + return false; > > + > > +inject: > > + trace_kvm_forward_sysreg_trap(vcpu, sysreg, is_read); > > + > > + kvm_inject_nested_sync(vcpu, kvm_vcpu_get_esr(vcpu)); > > + return true; > > +} > > + > > static u64 kvm_check_illegal_exception_return(struct kvm_vcpu *vcpu, u= 64 spsr) > > { > > u64 mode =3D spsr & PSR_MODE_MASK; > > diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c > > index f5baaa508926..dfd72b3a625f 100644 > > --- a/arch/arm64/kvm/sys_regs.c > > +++ b/arch/arm64/kvm/sys_regs.c > > @@ -3177,6 +3177,9 @@ int kvm_handle_sys_reg(struct kvm_vcpu *vcpu) > > > > trace_kvm_handle_sys_reg(esr); > > > > + if (__check_nv_sr_forward(vcpu)) > > + return 1; > > + > > params =3D esr_sys64_to_params(esr); > > params.regval =3D vcpu_get_reg(vcpu, Rt); > > > > @@ -3594,5 +3597,8 @@ int __init kvm_sys_reg_table_init(void) > > if (!first_idreg) > > return -EINVAL; > > > > + if (kvm_get_mode() =3D=3D KVM_MODE_NV) > > + populate_nv_trap_config(); >=20 > Do we need to check the return value of populate_nv_trap_config() and > fail the initialization if the return value is non-zero? Indeed, I forgot about it. Now fixed. 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 99E9FC001B0 for ; Tue, 15 Aug 2023 10:39:28 +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=sPdfx+ndKyMUPvf2M8/H2FJ5tQ9RQECToOx6GNhivn8=; b=2dg1x8MzxB5J9u w6icfp73YwaaU3oxeWkVArQPPgrWY0sgQI9dMCH7gW8czMb1sYKYFQIP1LanYWokQL8o7i8V2bHpJ HnzW3GIsqz15qzX7aKBKokkOU1Dhx8GitpMzULfiKoor48VAmPnN58Rns07GFryR5tBje0zqaok8J UzvnMiZNaUAEaDxrWz17Pu67frNKe4q4vlxU2zq3lg6AC4qO0NXoTvY7FLXJvJ4AeyoBHXUHR+eeA zFT5EjgLwlPkTc/UxKUqYYT1o/v3DXqDhJTTD2ySrIzLwr4oWotmFxbyUmSnMaVgym5wqjr/44K9F KBHXUJLNp7POTL4iJ0vg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qVrRs-001IpN-1N; Tue, 15 Aug 2023 10:38:52 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qVrRo-001Iot-3C for linux-arm-kernel@lists.infradead.org; Tue, 15 Aug 2023 10:38:51 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 677E765179; Tue, 15 Aug 2023 10:38:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3D232C433C8; Tue, 15 Aug 2023 10:38:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1692095926; bh=Ab3lW2QmaXFPBydbQW8n1G4967qqEI7MymXqkcI2A3I=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=CJRzG6elQOY8I5TzQPwEe7jYleC99OJi4KsGLUwesh8WVMmPaYP8WnZMcEJH654+W eGDdOPWjVLdQT9m0XAhQrkzwTFrjVPCkiatZrdC1wztqBjTJo4n2nstvDetgYMvuMp jMIA640DDzGCnDevqbaJS9JdDZUyPvc6hu869NOQB4HtrFtjLhXvvLuhZsJ3a4uO+9 hM1jp8v683RNvnLowSnPdcj/CuElsQ1fuHVh/Nrt0FfyzfjXzUj1HQj/fX1I8HAL6A ac+7/JcA2sm5vs0Hp5BiGZ2PQNv1LTUZa8DQFOVXSyPGb7Ub6bruZCCpOTeElrtnab 37OLpgOFBfaWQ== Received: from host213-123-75-60.in-addr.btopenworld.com ([213.123.75.60] 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 1qVrRj-004yaI-Kn; Tue, 15 Aug 2023 11:38:43 +0100 Date: Tue, 15 Aug 2023 11:38:53 +0100 Message-ID: <87jztwpp36.wl-maz@kernel.org> From: Marc Zyngier To: Jing Zhang Cc: kvmarm@lists.linux.dev, kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Catalin Marinas , Eric Auger , Mark Brown , Mark Rutland , Will Deacon , Alexandru Elisei , Andre Przywara , Chase Conklin , Ganapatrao Kulkarni , Darren Hart , Miguel Luis , James Morse , Suzuki K Poulose , Oliver Upton , Zenghui Yu Subject: Re: [PATCH v3 14/27] KVM: arm64: nv: Add trap forwarding infrastructure In-Reply-To: References: <20230808114711.2013842-1-maz@kernel.org> <20230808114711.2013842-15-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: 213.123.75.60 X-SA-Exim-Rcpt-To: jingzhangos@google.com, kvmarm@lists.linux.dev, kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, catalin.marinas@arm.com, eric.auger@redhat.com, broonie@kernel.org, mark.rutland@arm.com, will@kernel.org, alexandru.elisei@arm.com, andre.przywara@arm.com, chase.conklin@arm.com, gankulkarni@os.amperecomputing.com, darren@os.amperecomputing.com, miguel.luis@oracle.com, james.morse@arm.com, suzuki.poulose@arm.com, oliver.upton@linux.dev, yuzenghui@huawei.com 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-20230815_033849_129023_3A8CCE3F X-CRM114-Status: GOOD ( 58.60 ) 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 T24gU3VuLCAxMyBBdWcgMjAyMyAwMzoyNDoxOSArMDEwMCwKSmluZyBaaGFuZyA8amluZ3poYW5n b3NAZ29vZ2xlLmNvbT4gd3JvdGU6Cj4gCj4gSGkgTWFyYywKPiAKPiBPbiBUdWUsIEF1ZyA4LCAy MDIzIGF0IDQ6NDjigK9BTSBNYXJjIFp5bmdpZXIgPG1hekBrZXJuZWwub3JnPiB3cm90ZToKPiA+ Cj4gPiBBIHNpZ25pZmljYW50IHBhcnQgb2Ygd2hhdCBhIE5WIGh5cGVydmlzb3IgbmVlZHMgdG8g ZG8gaXMgdG8gZGVjaWRlCj4gPiB3aGV0aGVyIGEgdHJhcCBmcm9tIGEgTDIrIGd1ZXN0IGhhcyB0 byBiZSBmb3J3YXJkZWQgdG8gYSBMMSBndWVzdAo+ID4gb3IgaGFuZGxlZCBsb2NhbGx5LiBUaGlz IGlzIGRvbmUgYnkgY2hlY2tpbmcgZm9yIHRoZSB0cmFwIGJpdHMgdGhhdAo+ID4gdGhlIGd1ZXN0 IGh5cGVydmlzb3IgaGFzIHNldCBhbmQgYWN0aW5nIGFjY29yZGluZ2x5LCBhcyBkZXNjcmliZWQg YnkKPiA+IHRoZSBhcmNoaXRlY3R1cmUuCj4gPgo+ID4gQSBwcmV2aW91cyBhcHByb2FjaCB3YXMg dG8gc3ByaW5rbGUgYSBidW5jaCBvZiBjaGVja3MgaW4gYWxsIHRoZQo+ID4gc3lzdGVtIHJlZ2lz dGVyIGFjY2Vzc29ycywgYnV0IHRoaXMgaXMgcHJldHR5IGVycm9yIHByb25lIGFuZCBkb2Vzbid0 Cj4gPiBoZWxwIGdldHRpbmcgYW4gb3ZlcnZpZXcgb2Ygd2hhdCBpcyBoYXBwZW5pbmcuCj4gPgo+ ID4gSW5zdGVhZCwgaW1wbGVtZW50IGEgc2V0IG9mIGdsb2JhbCB0YWJsZXMgdGhhdCBkZXNjcmli ZSBhIHRyYXAgYml0LAo+ID4gY29tYmluYXRpb25zIG9mIHRyYXAgYml0cywgYmVoYXZpb3VycyBv biB0cmFwLCBhbmQgd2hhdCBiaXRzIG11c3QKPiA+IGJlIGV2YWx1YXRlZCBvbiBhIHN5c3RlbSBy ZWdpc3RlciB0cmFwLgo+ID4KPiA+IEFsdGhvdWdoIHRoaXMgaXMgcGFpbmZ1bCB0byBkZXNjcmli ZSwgdGhpcyBhbGxvd3MgdG8gc3BlY2lmeSBlYWNoCj4gPiBhbmQgZXZlcnkgY29udHJvbCBiaXQg aW4gYSBzdGF0aWMgbWFubmVyLiBUbyBtYWtlIGl0IGVmZmljaWVudCwKPiA+IHRoZSB0YWJsZSBp cyBpbnNlcnRlZCBpbiBhbiB4YXJyYXkgdGhhdCBpcyBnbG9iYWwgdG8gdGhlIHN5c3RlbSwKPiA+ IGFuZCBjaGVja2VkIGVhY2ggdGltZSB3ZSB0cmFwIGEgc3lzdGVtIHJlZ2lzdGVyIHdoaWxlIHJ1 bm5pbmcKPiA+IGEgTDIgZ3Vlc3QuCj4gPgo+ID4gQWRkIHRoZSBiYXNpYyBpbmZyYXN0cnVjdHVy ZSBmb3Igbm93LCB3aGlsZSBhZGRpdGlvbmFsIHBhdGNoZXMgd2lsbAo+ID4gaW1wbGVtZW50IGNv bmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgo+ID4KPiA+IFNpZ25lZC1vZmYtYnk6IE1hcmMgWnluZ2ll ciA8bWF6QGtlcm5lbC5vcmc+Cj4gPiAtLS0KPiA+ICBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2 bV9ob3N0LmggICB8ICAgMSArCj4gPiAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbmVzdGVk LmggfCAgIDIgKwo+ID4gIGFyY2gvYXJtNjQva3ZtL2VtdWxhdGUtbmVzdGVkLmMgICAgIHwgMjYy ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiA+ICBhcmNoL2FybTY0L2t2bS9zeXNfcmVn cy5jICAgICAgICAgICB8ICAgNiArCj4gPiAgYXJjaC9hcm02NC9rdm0vdHJhY2VfYXJtLmggICAg ICAgICAgfCAgMjYgKysrCj4gPiAgNSBmaWxlcyBjaGFuZ2VkLCAyOTcgaW5zZXJ0aW9ucygrKQo+ ID4KPiA+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmggYi9h cmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKPiA+IGluZGV4IDcyMTY4MGRhMTAxMS4u Y2IxYzVjNTRjZWRkIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1f aG9zdC5oCj4gPiArKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKPiA+IEBA IC05ODgsNiArOTg4LDcgQEAgaW50IGt2bV9oYW5kbGVfY3AxMF9pZChzdHJ1Y3Qga3ZtX3ZjcHUg KnZjcHUpOwo+ID4gIHZvaWQga3ZtX3Jlc2V0X3N5c19yZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNw dSk7Cj4gPgo+ID4gIGludCBfX2luaXQga3ZtX3N5c19yZWdfdGFibGVfaW5pdCh2b2lkKTsKPiA+ ICtpbnQgX19pbml0IHBvcHVsYXRlX252X3RyYXBfY29uZmlnKHZvaWQpOwo+ID4KPiA+ICBib29s IGxvY2tfYWxsX3ZjcHVzKHN0cnVjdCBrdm0gKmt2bSk7Cj4gPiAgdm9pZCB1bmxvY2tfYWxsX3Zj cHVzKHN0cnVjdCBrdm0gKmt2bSk7Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRl L2FzbS9rdm1fbmVzdGVkLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9uZXN0ZWQuaAo+ ID4gaW5kZXggOGZiNjdmMDMyZmQxLi5mYTIzY2M5YzJhZGMgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNo L2FybTY0L2luY2x1ZGUvYXNtL2t2bV9uZXN0ZWQuaAo+ID4gKysrIGIvYXJjaC9hcm02NC9pbmNs dWRlL2FzbS9rdm1fbmVzdGVkLmgKPiA+IEBAIC0xMSw2ICsxMSw4IEBAIHN0YXRpYyBpbmxpbmUg Ym9vbCB2Y3B1X2hhc19udihjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCj4gPiAgICAgICAg ICAgICAgICAgdGVzdF9iaXQoS1ZNX0FSTV9WQ1BVX0hBU19FTDIsIHZjcHUtPmFyY2guZmVhdHVy ZXMpKTsKPiA+ICB9Cj4gPgo+ID4gK2V4dGVybiBib29sIF9fY2hlY2tfbnZfc3JfZm9yd2FyZChz dHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwo+ID4gKwo+ID4gIHN0cnVjdCBzeXNfcmVnX3BhcmFtczsK PiA+ICBzdHJ1Y3Qgc3lzX3JlZ19kZXNjOwo+ID4KPiA+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0 L2t2bS9lbXVsYXRlLW5lc3RlZC5jIGIvYXJjaC9hcm02NC9rdm0vZW11bGF0ZS1uZXN0ZWQuYwo+ ID4gaW5kZXggYjk2NjYyMDI5ZmIxLi4xYjExNDg3NzBkNDUgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNo L2FybTY0L2t2bS9lbXVsYXRlLW5lc3RlZC5jCj4gPiArKysgYi9hcmNoL2FybTY0L2t2bS9lbXVs YXRlLW5lc3RlZC5jCj4gPiBAQCAtMTQsNiArMTQsMjY4IEBACj4gPgo+ID4gICNpbmNsdWRlICJ0 cmFjZS5oIgo+ID4KPiA+ICtlbnVtIHRyYXBfYmVoYXZpb3VyIHsKPiA+ICsgICAgICAgQkVIQVZF X0hBTkRMRV9MT0NBTExZICAgPSAwLAo+ID4gKyAgICAgICBCRUhBVkVfRk9SV0FSRF9SRUFEICAg ICA9IEJJVCgwKSwKPiA+ICsgICAgICAgQkVIQVZFX0ZPUldBUkRfV1JJVEUgICAgPSBCSVQoMSks Cj4gPiArICAgICAgIEJFSEFWRV9GT1JXQVJEX0FOWSAgICAgID0gQkVIQVZFX0ZPUldBUkRfUkVB RCB8IEJFSEFWRV9GT1JXQVJEX1dSSVRFLAo+ID4gK307Cj4gPiArCj4gPiArc3RydWN0IHRyYXBf Yml0cyB7Cj4gPiArICAgICAgIGNvbnN0IGVudW0gdmNwdV9zeXNyZWcgICAgICAgICAgaW5kZXg7 Cj4gPiArICAgICAgIGNvbnN0IGVudW0gdHJhcF9iZWhhdmlvdXIgICAgICAgYmVoYXZpb3VyOwo+ ID4gKyAgICAgICBjb25zdCB1NjQgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwo+ID4gKyAg ICAgICBjb25zdCB1NjQgICAgICAgICAgICAgICAgICAgICAgIG1hc2s7Cj4gPiArfTsKPiA+ICsK PiA+ICtlbnVtIHRyYXBfZ3JvdXAgewo+ID4gKyAgICAgICAvKiBJbmRpY2F0ZXMgbm8gY29hcnNl IHRyYXAgY29udHJvbCAqLwo+ID4gKyAgICAgICBfX1JFU0VSVkVEX18sCj4gPiArCj4gPiArICAg ICAgIC8qCj4gPiArICAgICAgICAqIFRoZSBmaXJzdCBiYXRjaCBvZiBJRHMgZGVub3RlIGNvYXJz ZSB0cmFwcGluZyB0aGF0IGFyZSB1c2VkCj4gPiArICAgICAgICAqIG9uIHRoZWlyIG93biBpbnN0 ZWFkIG9mIGJlaW5nIHBhcnQgb2YgYSBjb21iaW5hdGlvbiBvZgo+ID4gKyAgICAgICAgKiB0cmFw IGNvbnRyb2xzLgo+ID4gKyAgICAgICAgKi8KPiA+ICsKPiA+ICsgICAgICAgLyoKPiA+ICsgICAg ICAgICogQW55dGhpbmcgYWZ0ZXIgdGhpcyBwb2ludCBpcyBhIGNvbWJpbmF0aW9uIG9mIHRyYXAg Y29udHJvbHMsCj4gPiArICAgICAgICAqIHdoaWNoIGFsbCBtdXN0IGJlIGV2YWx1YXRlZCB0byBk ZWNpZGUgd2hhdCB0byBkby4KPiA+ICsgICAgICAgICovCj4gPiArICAgICAgIF9fTVVMVElQTEVf Q09OVFJPTF9CSVRTX18sCj4gPiArCj4gPiArICAgICAgIC8qCj4gPiArICAgICAgICAqIEFueXRo aW5nIGFmdGVyIHRoaXMgcG9pbnQgcmVxdWlyZXMgYSBjYWxsYmFjayBldmFsdWF0aW5nIGEKPiA+ ICsgICAgICAgICogY29tcGxleCB0cmFwIGNvbmRpdGlvbi4gSG9wZWZ1bGx5IHdlJ2xsIG5ldmVy IG5lZWQgdGhpcy4uLgo+ID4gKyAgICAgICAgKi8KPiA+ICsgICAgICAgX19DT01QTEVYX0NPTkRJ VElPTlNfXywKPiA+ICsKPiA+ICsgICAgICAgLyogTXVzdCBiZSBsYXN0ICovCj4gPiArICAgICAg IF9fTlJfVFJBUF9HUk9VUF9JRFNfXwo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0 cnVjdCB0cmFwX2JpdHMgY29hcnNlX3RyYXBfYml0c1tdID0gewo+ID4gK307Cj4gPiArCj4gPiAr I2RlZmluZSBNQ0IoaWQsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK PiA+ICsgICAgICAgW2lkIC0gX19NVUxUSVBMRV9DT05UUk9MX0JJVFNfX10gICAgICAgID0gICAg ICAgXAo+ID4gKyAgICAgICAgICAgICAgIChjb25zdCBlbnVtIHRyYXBfZ3JvdXAgW10peyAgICAg ICAgICAgICBcCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBfX1ZBX0FSR1NfXywgX19SRVNF UlZFRF9fICAgICAgIFwKPiA+ICsgICAgICAgICAgICAgICB9Cj4gPiArCj4gPiArc3RhdGljIGNv bnN0IGVudW0gdHJhcF9ncm91cCAqY29hcnNlX2NvbnRyb2xfY29tYm9bXSA9IHsKPiA+ICt9Owo+ ID4gKwo+ID4gK3R5cGVkZWYgZW51bSB0cmFwX2JlaGF2aW91ciAoKmNvbXBsZXhfY29uZGl0aW9u X2NoZWNrKShzdHJ1Y3Qga3ZtX3ZjcHUgKik7Cj4gPiArCj4gPiArI2RlZmluZSBDQ0MoaWQsIGZu KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAgIFtpZCAtIF9fQ09NUExF WF9DT05ESVRJT05TX19dID0gZm4KPiA+ICsKPiA+ICtzdGF0aWMgY29uc3QgY29tcGxleF9jb25k aXRpb25fY2hlY2sgY2NjW10gPSB7Cj4gPiArfTsKPiA+ICsKPiA+ICsvKgo+ID4gKyAqIEJpdCBh c3NpZ25tZW50IGZvciB0aGUgdHJhcCBjb250cm9scy4gV2UgdXNlIGEgNjRiaXQgd29yZCB3aXRo IHRoZQo+ID4gKyAqIGZvbGxvd2luZyBsYXlvdXQgZm9yIGVhY2ggdHJhcHBlZCBzeXNyZWc6Cj4g PiArICoKPiA+ICsgKiBbOTowXSAgICAgICBlbnVtIHRyYXBfZ3JvdXAgKDEwIGJpdHMpCj4gPiAr ICogWzEzOjEwXSAgICAgZW51bSBmZ3RfZ3JvdXBfaWQgKDQgYml0cykKPiA+ICsgKiBbMTk6MTRd ICAgICBiaXQgbnVtYmVyIGluIHRoZSBGR1QgcmVnaXN0ZXIgKDYgYml0cykKPiA+ICsgKiBbMjBd ICAgICAgICAgICAgICAgIHRyYXAgcG9sYXJpdHkgKDEgYml0KQo+ID4gKyAqIFs2MjoyMV0gICAg IFVudXNlZCAoNDIgYml0cykKPiA+ICsgKiBbNjNdICAgICAgICAgICAgICAgIFJFUzAgLSBNdXN0 IGJlIHplcm8sIGFzIGxvc3Qgb24gaW5zZXJ0aW9uIGluIHRoZSB4YXJyYXkKPiA+ICsgKi8KPiA+ ICsjZGVmaW5lIFRDX0NHVF9CSVRTICAgIDEwCj4gPiArI2RlZmluZSBUQ19GR1RfQklUUyAgICA0 Cj4gPiArCj4gPiArdW5pb24gdHJhcF9jb25maWcgewo+ID4gKyAgICAgICB1NjQgICAgIHZhbDsK PiA+ICsgICAgICAgc3RydWN0IHsKPiA+ICsgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAg Y2d0OlRDX0NHVF9CSVRTOyAvKiBDb2Fyc2UgdHJhcCBpZCAqLwo+ID4gKyAgICAgICAgICAgICAg IHVuc2lnbmVkIGxvbmcgICBmZ3Q6VENfRkdUX0JJVFM7IC8qIEZpbmcgR3JhaW5lZCBUcmFwIGlk ICovCj4gCj4gV291bGQgaXQgYmUgYmV0dGVyIHRvIGxlYXZlIHRoZSBkZWZpbml0aW9uIG9mIEZH VCBmaWVsZCB0byBwYXRjaCAxOS8yNwo+IHdoaWNoIGFkZHMgdGhlIGluZnJhc3RydWN0dXJlIGZv ciBGR1QgZm9yd2FyZGluZz8KCkl0IGRvZXNuJ3QgbWF0dGVyIG11Y2gsIGJ1dCBJIGNhbiBtb3Zl IGl0LgoKPiAKPiA+ICsgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgYml0OjY7ICAgICAg ICAgICAvKiBCaXQgbnVtYmVyICovCj4gPiArICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAg IHBvbDoxOyAgICAgICAgICAgLyogUG9sYXJpdHkgKi8KPiA+ICsgICAgICAgICAgICAgICB1bnNp Z25lZCBsb25nICAgdW5rOjQyOyAgICAgICAgICAvKiBVbmtub3duICovCj4gPiArICAgICAgICAg ICAgICAgdW5zaWduZWQgbG9uZyAgIG1iejoxOyAgICAgICAgICAgLyogTXVzdCBCZSBaZXJvICov Cj4gPiArICAgICAgIH07Cj4gPiArfTsKPiA+ICsKPiA+ICtzdHJ1Y3QgZW5jb2RpbmdfdG9fdHJh cF9jb25maWcgewo+ID4gKyAgICAgICBjb25zdCB1MzIgICAgICAgICAgICAgICAgICAgICAgIGVu Y29kaW5nOwo+ID4gKyAgICAgICBjb25zdCB1MzIgICAgICAgICAgICAgICAgICAgICAgIGVuZDsK PiA+ICsgICAgICAgY29uc3QgdW5pb24gdHJhcF9jb25maWcgICAgICAgICB0YzsKPiA+ICt9Owo+ ID4gKwo+ID4gKyNkZWZpbmUgU1JfUkFOR0VfVFJBUChzcl9zdGFydCwgc3JfZW5kLCB0cmFwX2lk KSAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgICB7ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gKyAgICAg ICAgICAgICAgIC5lbmNvZGluZyAgICAgICA9IHNyX3N0YXJ0LCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAo+ID4gKyAgICAgICAgICAgICAgIC5lbmQgICAgICAgICAgICA9IHNyX2VuZCwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgICAgICAgICAgIC50YyAg ICAgICAgICAgICA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgLmNndCAgICAgICAgICAgID0gdHJhcF9pZCwgICAgICAg ICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgICAgICAgICAgIH0sICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgICB9Cj4gPiAr Cj4gPiArI2RlZmluZSBTUl9UUkFQKHNyLCB0cmFwX2lkKSAgICAgICAgICAgU1JfUkFOR0VfVFJB UChzciwgc3IsIHRyYXBfaWQpCj4gPiArCj4gPiArLyoKPiA+ICsgKiBNYXAgZW5jb2RpbmcgdG8g dHJhcCBiaXRzIGZvciBleGNlcHRpb24gcmVwb3J0ZWQgd2l0aCBFQz0weDE4Lgo+ID4gKyAqIFRo ZXNlIG11c3Qgb25seSBiZSBldmFsdWF0ZWQgd2hlbiBydW5uaW5nIGEgbmVzdGVkIGh5cGVydmlz b3IsIGJ1dAo+ID4gKyAqIHRoYXQgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBub3QgYSBoeXBlcnZp c29yIGNvbnRleHQuIFdoZW4gdGhlCj4gPiArICogdHJhcHBlZCBhY2Nlc3MgbWF0Y2hlcyBvbmUg b2YgdGhlIHRyYXAgY29udHJvbHMsIHRoZSBleGNlcHRpb24gaXMKPiA+ICsgKiByZS1pbmplY3Rl ZCBpbiB0aGUgbmVzdGVkIGh5cGVydmlzb3IuCj4gPiArICovCj4gPiArc3RhdGljIGNvbnN0IHN0 cnVjdCBlbmNvZGluZ190b190cmFwX2NvbmZpZyBlbmNvZGluZ190b19jZ3RbXSBfX2luaXRjb25z dCA9IHsKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyBERUZJTkVfWEFSUkFZKHNyX2ZvcndhcmRf eGEpOwo+ID4gKwo+ID4gK3N0YXRpYyB1bmlvbiB0cmFwX2NvbmZpZyBnZXRfdHJhcF9jb25maWco dTMyIHN5c3JlZykKPiA+ICt7Cj4gPiArICAgICAgIHJldHVybiAodW5pb24gdHJhcF9jb25maWcp IHsKPiA+ICsgICAgICAgICAgICAgICAudmFsID0geGFfdG9fdmFsdWUoeGFfbG9hZCgmc3JfZm9y d2FyZF94YSwgc3lzcmVnKSksCj4gPiArICAgICAgIH07Cj4gPiArfQo+ID4gKwo+ID4gK2ludCBf X2luaXQgcG9wdWxhdGVfbnZfdHJhcF9jb25maWcodm9pZCkKPiA+ICt7Cj4gPiArICAgICAgIGlu dCByZXQgPSAwOwo+ID4gKwo+ID4gKyAgICAgICBCVUlMRF9CVUdfT04oc2l6ZW9mKHVuaW9uIHRy YXBfY29uZmlnKSAhPSBzaXplb2Yodm9pZCAqKSk7Cj4gPiArICAgICAgIEJVSUxEX0JVR19PTihf X05SX1RSQVBfR1JPVVBfSURTX18gPiBCSVQoVENfQ0dUX0JJVFMpKTsKPiA+ICsKPiA+ICsgICAg ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVuY29kaW5nX3RvX2NndCk7IGkrKykg ewo+ID4gKyAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbmNvZGluZ190b190cmFwX2NvbmZp ZyAqY2d0ID0gJmVuY29kaW5nX3RvX2NndFtpXTsKPiA+ICsgICAgICAgICAgICAgICB2b2lkICpw cmV2Owo+ID4gKwo+ID4gKyAgICAgICAgICAgICAgIHByZXYgPSB4YV9zdG9yZV9yYW5nZSgmc3Jf Zm9yd2FyZF94YSwgY2d0LT5lbmNvZGluZywgY2d0LT5lbmQsCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHhhX21rX3ZhbHVlKGNndC0+dGMudmFsKSwgR0ZQX0tFUk5F TCk7Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgaWYgKHByZXYpIHsKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIGt2bV9lcnIoIkR1cGxpY2F0ZSBDR1QgZm9yICglZCwgJWQsICVkLCAlZCwg JWQpXG4iLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNfcmVnX09wMChj Z3QtPmVuY29kaW5nKSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzX3Jl Z19PcDEoY2d0LT5lbmNvZGluZyksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHN5c19yZWdfQ1JuKGNndC0+ZW5jb2RpbmcpLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzeXNfcmVnX0NSbShjZ3QtPmVuY29kaW5nKSwKPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3lzX3JlZ19PcDIoY2d0LT5lbmNvZGluZykpOwo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKPiA+ICsgICAgICAgICAgICAgICB9Cj4gCj4g VGhlIHhhX3N0b3JlX3JhbmdlIHdvdWxkIG9ubHkgcmV0dXJuIG5vbi1OVUxMIHdoZW4gdGhlIGVu dHJ5IGNhbm5vdCBiZQo+IHN0b3JlZCAoWEFfRVJST1IoLUVJTlZBTCkpIG9yIG1lbW9yeSBhbGxv Y2F0aW9uIGZhaWxlZAo+IChYQV9FUlJPUigtRU5PTUVNKSkuCj4gQW5vdGhlciB3YXkgbWF5IGJl IG5lZWRlZCB0byBkZXRlY3QgZHVwbGljYXRlIENHVC4KCkh1aCwgd2VsbCBzcG90dGVkLiBJJ3Zl IGFkZGVkIGNvZGUgdG8gZmFsbGJhY2sgdG8geGFfc3RvcmUoKSB3aGVuIG5vdApkZWFsaW5nIHdp dGggYW4gYWN0dWFsIHJhbmdlLCBhbmQgbm93IGhhdmUgc29tZSBjb2RlIHRvIGRlYWwgd2l0aCB0 aGUKZXJyb3IgcGF0aC4gVW5mb3J0dW5hdGVseSwgSSBjYW4ndCBzZWUgYW4gZWFzeSB3YXkgdG8g ZGVhbCB3aXRoCm92ZXJsYXBwaW5nIHJhbmdlcyBvbiBpbnNlcnRpb24sIGFuZCB3ZSdsbCBoYXZl IHRvIGRlYWwgd2l0aCB0aGUKcG9zc2liaWxpdHkgdGhhdCBzb21lb25lIGhhcyBtZXNzZWQgdXAu Cgo+IAo+ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAgIGt2bV9pbmZvKCJudjogJWxkIGNv YXJzZSBncmFpbmVkIHRyYXAgaGFuZGxlcnNcbiIsCj4gPiArICAgICAgICAgICAgICAgIEFSUkFZ X1NJWkUoZW5jb2RpbmdfdG9fY2d0KSk7Cj4gPiArCj4gPiArICAgICAgIGZvciAoaW50IGlkID0g X19NVUxUSVBMRV9DT05UUk9MX0JJVFNfXzsKPiA+ICsgICAgICAgICAgICBpZCA8IChfX0NPTVBM RVhfQ09ORElUSU9OU19fIC0gMSk7Cj4gPiArICAgICAgICAgICAgaWQrKykgewo+ID4gKyAgICAg ICAgICAgICAgIGNvbnN0IGVudW0gdHJhcF9ncm91cCAqY2dpZHM7Cj4gPiArCj4gPiArICAgICAg ICAgICAgICAgY2dpZHMgPSBjb2Fyc2VfY29udHJvbF9jb21ib1tpZCAtIF9fTVVMVElQTEVfQ09O VFJPTF9CSVRTX19dOwo+ID4gKwo+ID4gKyAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBj Z2lkc1tpXSAhPSBfX1JFU0VSVkVEX187IGkrKykgewo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgaWYgKGNnaWRzW2ldID49IF9fTVVMVElQTEVfQ09OVFJPTF9CSVRTX18pIHsKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAga3ZtX2VycigiUmVjdXJzaXZlIE1DQiAlZC8lZFxu IiwgaWQsIGNnaWRzW2ldKTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0 ID0gLUVJTlZBTDsKPiAKPiBJIGFtIGNvbmZ1c2VkIGFib3V0IHRoZSBhYm92ZSBjaGVjayBmb3Ig cmVjdXJzaXZlIE1DQi4gSW4gcGF0Y2ggMTcvMjksCj4gYSByZWN1cnNpdmUgTUNEIGlzIGFkZGVk IGFuZCBsb29rcyBsaWtlIHJlY3Vyc2l2ZSBNQ0IgaXMgYWxsb3dlZCBhcwo+IHNob3duIGluIF9f ZG9fY29tcHV0ZV90cmFwX2JlaGF2aW91cigpLgoKWWVhaCwgeW91J3JlIGFic29sdXRlbHkgcmln aHQuIFRoZSByZWFzb24gaXQgZG9lc24ndCBmaXJlIGlzIGJlY2F1c2UKdGhlIG91dGVyIGl0ZXJh dG9yIGlzIGJyb2tlbiwgYXMgcG9pbnRlZCBvdXQgYnkgTWlndWVsICh0aGUgbGFzdCBNQ0IKaXMg bmV2ZXIgY2hlY2tlZCkuIE5vdCB0aGF0IHJlY3Vyc2l2ZSBNQ0JzIGFyZSBldmlsIG9uIHRoZWly IG93biwgYnV0CnBlb3BsZSBhcmUgbGVnaXRpbWF0ZWx5IHNjYXJlZCBhYm91dCB0aGVtLiBIb3dl dmVyLCBJIHdhbnQgdGhlIGNoZWNrCnRvIGJlIGRvbmUgYXQgYm9vdCB0aW1lLCBhbmQgbm90IGF0 IGhhbmRsaW5nIHRpbWUuCgpJJ3ZlIG5vdyBmaXhlZCB0aGUgaXRlcmF0b3IsIGFuZCBzcGxpdCBD R1RfTURDUl9URENDX1RERV9UREEgaW50byAzCmRpZmZlcmVudCBiaXRzLCBnZXR0aW5nIHJpZCBv ZiB0aGUgc29sZSByZWN1cnNpdmUgTUNCLgoKPiAKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg IH0KPiA+ICsgICAgICAgICAgICAgICB9Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAg aWYgKHJldCkKPiA+ICsgICAgICAgICAgICAgICB4YV9kZXN0cm95KCZzcl9mb3J3YXJkX3hhKTsK PiA+ICsKPiA+ICsgICAgICAgcmV0dXJuIHJldDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGVu dW0gdHJhcF9iZWhhdmlvdXIgZ2V0X2JlaGF2aW91cihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0 cmFwX2JpdHMgKnRiKQo+ID4gK3sKPiA+ICsgICAgICAgZW51bSB0cmFwX2JlaGF2aW91ciBiID0g QkVIQVZFX0hBTkRMRV9MT0NBTExZOwo+ID4gKyAgICAgICB1NjQgdmFsOwo+ID4gKwo+ID4gKyAg ICAgICB2YWwgPSBfX3ZjcHVfc3lzX3JlZyh2Y3B1LCB0Yi0+aW5kZXgpOwo+ID4gKyAgICAgICBp ZiAoKHZhbCAmIHRiLT5tYXNrKSA9PSB0Yi0+dmFsdWUpCj4gPiArICAgICAgICAgICAgICAgYiB8 PSB0Yi0+YmVoYXZpb3VyOwo+ID4gKwo+ID4gKyAgICAgICByZXR1cm4gYjsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIGVudW0gdHJhcF9iZWhhdmlvdXIgX19kb19jb21wdXRlX3RyYXBfYmVoYXZp b3VyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnVtIHRyYXBfZ3JvdXAgaWQsCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ZW51bSB0cmFwX2JlaGF2aW91ciBiKQo+ID4gK3sKPiA+ICsgICAgICAgc3dpdGNoIChpZCkgewo+ ID4gKyAgICAgICAgICAgICAgIGNvbnN0IGVudW0gdHJhcF9ncm91cCAqY2dpZHM7Cj4gPiArCj4g PiArICAgICAgIGNhc2UgX19SRVNFUlZFRF9fIC4uLiBfX01VTFRJUExFX0NPTlRST0xfQklUU19f IC0gMToKPiA+ICsgICAgICAgICAgICAgICBpZiAobGlrZWx5KGlkICE9IF9fUkVTRVJWRURfXykp Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBiIHw9IGdldF9iZWhhdmlvdXIodmNwdSwgJmNv YXJzZV90cmFwX2JpdHNbaWRdKTsKPiA+ICsgICAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAg ICAgY2FzZSBfX01VTFRJUExFX0NPTlRST0xfQklUU19fIC4uLiBfX0NPTVBMRVhfQ09ORElUSU9O U19fIC0gMToKPiA+ICsgICAgICAgICAgICAgICAvKiBZZXMsIHRoaXMgaXMgcmVjdXJzaXZlLiBE b24ndCBkbyBhbnl0aGluZyBzdHVwaWQuICovCj4gPiArICAgICAgICAgICAgICAgY2dpZHMgPSBj b2Fyc2VfY29udHJvbF9jb21ib1tpZCAtIF9fTVVMVElQTEVfQ09OVFJPTF9CSVRTX19dOwo+ID4g KyAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBjZ2lkc1tpXSAhPSBfX1JFU0VSVkVEX187 IGkrKykKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGIgfD0gX19kb19jb21wdXRlX3RyYXBf YmVoYXZpb3VyKHZjcHUsIGNnaWRzW2ldLCBiKTsKPiA+ICsgICAgICAgICAgICAgICBicmVhazsK PiA+ICsgICAgICAgZGVmYXVsdDoKPiA+ICsgICAgICAgICAgICAgICBpZiAoQVJSQVlfU0laRShj Y2MpKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgYiB8PSBjY2NbaWQgLSAgX19DT01QTEVY X0NPTkRJVElPTlNfX10odmNwdSk7Cj4gPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gPiArICAg ICAgIH0KPiA+ICsKPiA+ICsgICAgICAgcmV0dXJuIGI7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBlbnVtIHRyYXBfYmVoYXZpb3VyIGNvbXB1dGVfdHJhcF9iZWhhdmlvdXIoc3RydWN0IGt2bV92 Y3B1ICp2Y3B1LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCB1bmlvbiB0cmFwX2NvbmZpZyB0YykKPiA+ICt7Cj4gPiArICAgICAgIGVu dW0gdHJhcF9iZWhhdmlvdXIgYiA9IEJFSEFWRV9IQU5ETEVfTE9DQUxMWTsKPiA+ICsKPiA+ICsg ICAgICAgcmV0dXJuIF9fZG9fY29tcHV0ZV90cmFwX2JlaGF2aW91cih2Y3B1LCB0Yy5jZ3QsIGIp Owo+ID4gK30KPiA+ICsKPiA+ICtib29sIF9fY2hlY2tfbnZfc3JfZm9yd2FyZChzdHJ1Y3Qga3Zt X3ZjcHUgKnZjcHUpCj4gPiArewo+ID4gKyAgICAgICB1bmlvbiB0cmFwX2NvbmZpZyB0YzsKPiA+ ICsgICAgICAgZW51bSB0cmFwX2JlaGF2aW91ciBiOwo+ID4gKyAgICAgICBib29sIGlzX3JlYWQ7 Cj4gPiArICAgICAgIHUzMiBzeXNyZWc7Cj4gPiArICAgICAgIHU2NCBlc3I7Cj4gPiArCj4gPiAr ICAgICAgIGlmICghdmNwdV9oYXNfbnYodmNwdSkgfHwgaXNfaHlwX2N0eHQodmNwdSkpCj4gPiAr ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwo+ID4gKwo+ID4gKyAgICAgICBlc3IgPSBrdm1f dmNwdV9nZXRfZXNyKHZjcHUpOwo+ID4gKyAgICAgICBzeXNyZWcgPSBlc3Jfc3lzNjRfdG9fc3lz cmVnKGVzcik7Cj4gPiArICAgICAgIGlzX3JlYWQgPSAoZXNyICYgRVNSX0VMeF9TWVM2NF9JU1Nf RElSX01BU0spID09IEVTUl9FTHhfU1lTNjRfSVNTX0RJUl9SRUFEOwo+ID4gKwo+ID4gKyAgICAg ICB0YyA9IGdldF90cmFwX2NvbmZpZyhzeXNyZWcpOwo+ID4gKwo+ID4gKyAgICAgICAvKgo+ID4g KyAgICAgICAgKiBBIHZhbHVlIG9mIDAgZm9yIHRoZSB3aG9sZSBlbnRyeSBtZWFucyB0aGF0IHdl IGtub3cgbm90aGluZwo+ID4gKyAgICAgICAgKiBmb3IgdGhpcyBzeXNyZWcsIGFuZCB0aGF0IGl0 IGNhbm5vdCBiZSBmb3J3YXJlZGVkLiBJbiB0aGlzCj4gPiArICAgICAgICAqIHNpdHVhdGlvbiwg bGV0J3MgY3V0IGl0IHNob3J0Lgo+ID4gKyAgICAgICAgKgo+ID4gKyAgICAgICAgKiBOb3RlIHRo YXQgdWx0aW1hdGVseSwgd2UgY291bGQgYWxzbyBtYWtlIHVzZSBvZiB0aGUgeGFycmF5Cj4gPiAr ICAgICAgICAqIHRvIHN0b3JlIHRoZSBpbmRleCBvZiB0aGUgc3lzcmVnIGluIHRoZSBsb2NhbCBk ZXNjcmlwdG9yCj4gPiArICAgICAgICAqIGFycmF5LCBhdm9pZGluZyBhbm90aGVyIHNlYXJjaC4u LiBIaW50LCBoaW50Li4uCj4gPiArICAgICAgICAqLwo+ID4gKyAgICAgICBpZiAoIXRjLnZhbCkK PiA+ICsgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4gPiArCj4gPiArICAgICAgIGIgPSBj b21wdXRlX3RyYXBfYmVoYXZpb3VyKHZjcHUsIHRjKTsKPiA+ICsKPiA+ICsgICAgICAgaWYgKCgo YiAmIEJFSEFWRV9GT1JXQVJEX1JFQUQpICYmIGlzX3JlYWQpIHx8Cj4gPiArICAgICAgICAgICAo KGIgJiBCRUhBVkVfRk9SV0FSRF9XUklURSkgJiYgIWlzX3JlYWQpKQo+ID4gKyAgICAgICAgICAg ICAgIGdvdG8gaW5qZWN0Owo+ID4gKwo+ID4gKyAgICAgICByZXR1cm4gZmFsc2U7Cj4gPiArCj4g PiAraW5qZWN0Ogo+ID4gKyAgICAgICB0cmFjZV9rdm1fZm9yd2FyZF9zeXNyZWdfdHJhcCh2Y3B1 LCBzeXNyZWcsIGlzX3JlYWQpOwo+ID4gKwo+ID4gKyAgICAgICBrdm1faW5qZWN0X25lc3RlZF9z eW5jKHZjcHUsIGt2bV92Y3B1X2dldF9lc3IodmNwdSkpOwo+ID4gKyAgICAgICByZXR1cm4gdHJ1 ZTsKPiA+ICt9Cj4gPiArCj4gPiAgc3RhdGljIHU2NCBrdm1fY2hlY2tfaWxsZWdhbF9leGNlcHRp b25fcmV0dXJuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHNwc3IpCj4gPiAgewo+ID4gICAg ICAgICB1NjQgbW9kZSA9IHNwc3IgJiBQU1JfTU9ERV9NQVNLOwo+ID4gZGlmZiAtLWdpdCBhL2Fy Y2gvYXJtNjQva3ZtL3N5c19yZWdzLmMgYi9hcmNoL2FybTY0L2t2bS9zeXNfcmVncy5jCj4gPiBp bmRleCBmNWJhYWE1MDg5MjYuLmRmZDcyYjNhNjI1ZiAxMDA2NDQKPiA+IC0tLSBhL2FyY2gvYXJt NjQva3ZtL3N5c19yZWdzLmMKPiA+ICsrKyBiL2FyY2gvYXJtNjQva3ZtL3N5c19yZWdzLmMKPiA+ IEBAIC0zMTc3LDYgKzMxNzcsOSBAQCBpbnQga3ZtX2hhbmRsZV9zeXNfcmVnKHN0cnVjdCBrdm1f dmNwdSAqdmNwdSkKPiA+Cj4gPiAgICAgICAgIHRyYWNlX2t2bV9oYW5kbGVfc3lzX3JlZyhlc3Ip Owo+ID4KPiA+ICsgICAgICAgaWYgKF9fY2hlY2tfbnZfc3JfZm9yd2FyZCh2Y3B1KSkKPiA+ICsg ICAgICAgICAgICAgICByZXR1cm4gMTsKPiA+ICsKPiA+ICAgICAgICAgcGFyYW1zID0gZXNyX3N5 czY0X3RvX3BhcmFtcyhlc3IpOwo+ID4gICAgICAgICBwYXJhbXMucmVndmFsID0gdmNwdV9nZXRf cmVnKHZjcHUsIFJ0KTsKPiA+Cj4gPiBAQCAtMzU5NCw1ICszNTk3LDggQEAgaW50IF9faW5pdCBr dm1fc3lzX3JlZ190YWJsZV9pbml0KHZvaWQpCj4gPiAgICAgICAgIGlmICghZmlyc3RfaWRyZWcp Cj4gPiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPgo+ID4gKyAgICAgICBpZiAo a3ZtX2dldF9tb2RlKCkgPT0gS1ZNX01PREVfTlYpCj4gPiArICAgICAgICAgICAgICAgcG9wdWxh dGVfbnZfdHJhcF9jb25maWcoKTsKPiAKPiBEbyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4g dmFsdWUgb2YgcG9wdWxhdGVfbnZfdHJhcF9jb25maWcoKSBhbmQKPiBmYWlsIHRoZSBpbml0aWFs aXphdGlvbiBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vbi16ZXJvPwoKSW5kZWVkLCBJIGZvcmdv dCBhYm91dCBpdC4gTm93IGZpeGVkLgoKVGhhbmtzLAoKCU0uCgotLSAKV2l0aG91dCBkZXZpYXRp b24gZnJvbSB0aGUgbm9ybSwgcHJvZ3Jlc3MgaXMgbm90IHBvc3NpYmxlLgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWls aW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0 cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=