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 A390B14F7A for ; Fri, 21 Jul 2023 09:31:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 26ADCC433C8; Fri, 21 Jul 2023 09:31:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1689931875; bh=XcixfVNMYmXu3vjiST9n6CTBbXMks5XPaOuqSVzLQ1E=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=KBcTkWsMm97sFHjY8HgzcFT7U3MsdECuXIwprb4jD8Qoi+fmD2dJKp1TyjJx5Gobu Nu+BCjf49UZ942NRVqKMOSDBm8qEJVj/thyIn1X7BhKGXKVuQVG0L76YNkbhe68/k9 x4wpEgBw/dV/JiL77jcJskU5A99OZr4SYeXvabY8nKp+mWhNult2jT9a7Rgr1SIqw/ weepj5GDCwj3kbAuraKrUXHIA4+6gZZtYyodm89kanlJkoGroLXIUi+t6LcKX1sk1k /KYzEY9AHJKZkoUeAPWzhgrvLHVMhsKmMqE7LnMGB4U9V3996npRBsqd2lvl2J7C41 irrXIfKsoWjQA== Received: from sofa.misterjones.org ([185.219.108.64] helo=goblin-girl.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 1qMmTg-00FPGP-Fe; Fri, 21 Jul 2023 10:31:12 +0100 Date: Fri, 21 Jul 2023 10:31:12 +0100 Message-ID: <86r0p1txun.wl-maz@kernel.org> From: Marc Zyngier To: Cornelia Huck Cc: Jing Zhang , KVM , KVMARM , ARMLinux , Oliver Upton , Will Deacon , Paolo Bonzini , James Morse , Alexandru Elisei , Suzuki K Poulose , Fuad Tabba , Reiji Watanabe , Raghavendra Rao Ananta , Suraj Jitindar Singh Subject: Re: [PATCH v6 3/6] KVM: arm64: Enable writable for ID_AA64DFR0_EL1 and ID_DFR0_EL1 In-Reply-To: <87sf9h8xs0.fsf@redhat.com> References: <20230718164522.3498236-1-jingzhangos@google.com> <20230718164522.3498236-4-jingzhangos@google.com> <87o7k77yn5.fsf@redhat.com> <87sf9h8xs0.fsf@redhat.com> 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 (aarch64-unknown-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: 185.219.108.64 X-SA-Exim-Rcpt-To: cohuck@redhat.com, jingzhangos@google.com, kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, oliver.upton@linux.dev, will@kernel.org, pbonzini@redhat.com, james.morse@arm.com, alexandru.elisei@arm.com, suzuki.poulose@arm.com, tabba@google.com, reijiw@google.com, rananta@google.com, surajjs@amazon.com X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false On Fri, 21 Jul 2023 09:38:23 +0100, Cornelia Huck wrote: >=20 > On Thu, Jul 20 2023, Jing Zhang wrote: >=20 > > Hi Cornelia, > > > > On Thu, Jul 20, 2023 at 1:52=E2=80=AFAM Cornelia Huck wrote: > >> > >> On Tue, Jul 18 2023, Jing Zhang wrote: > >> > >> > All valid fields in ID_AA64DFR0_EL1 and ID_DFR0_EL1 are writable > >> > from usrespace with this change. > >> > >> Typo: s/usrespace/userspace/ > > Thanks. > >> > >> > > >> > Signed-off-by: Jing Zhang > >> > --- > >> > arch/arm64/kvm/sys_regs.c | 4 ++-- > >> > 1 file changed, 2 insertions(+), 2 deletions(-) > >> > > >> > diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c > >> > index 053d8057ff1e..f33aec83f1b4 100644 > >> > --- a/arch/arm64/kvm/sys_regs.c > >> > +++ b/arch/arm64/kvm/sys_regs.c > >> > @@ -2008,7 +2008,7 @@ static const struct sys_reg_desc sys_reg_descs= [] =3D { > >> > .set_user =3D set_id_dfr0_el1, > >> > .visibility =3D aa32_id_visibility, > >> > .reset =3D read_sanitised_id_dfr0_el1, > >> > - .val =3D ID_DFR0_EL1_PerfMon_MASK, }, > >> > + .val =3D GENMASK(63, 0), }, > >> > ID_HIDDEN(ID_AFR0_EL1), > >> > AA32_ID_SANITISED(ID_MMFR0_EL1), > >> > AA32_ID_SANITISED(ID_MMFR1_EL1), > >> > @@ -2057,7 +2057,7 @@ static const struct sys_reg_desc sys_reg_descs= [] =3D { > >> > .get_user =3D get_id_reg, > >> > .set_user =3D set_id_aa64dfr0_el1, > >> > .reset =3D read_sanitised_id_aa64dfr0_el1, > >> > - .val =3D ID_AA64DFR0_EL1_PMUVer_MASK, }, > >> > + .val =3D GENMASK(63, 0), }, > >> > ID_SANITISED(ID_AA64DFR1_EL1), > >> > ID_UNALLOCATED(5,2), > >> > ID_UNALLOCATED(5,3), > >> > >> How does userspace find out whether a given id reg is actually writabl= e, > >> other than trying to write to it? > >> > > No mechanism was provided to userspace to discover if a given idreg or > > any fields of a given idreg is writable. The write to a readonly idreg > > can also succeed (write ignored) without any error if what's written > > is exactly the same as what the idreg holds or if it is a write to > > AArch32 idregs on an AArch64-only system. >=20 > Hm, I'm not sure that's a good thing for the cases where we want to > support mix-and-match userspace and kernels. Userspace may want to know > upfront whether it can actually tweak the contents of an idreg or not > (for example, in the context of using CPU models for compatibility), so > that it can reject or warn about certain configurations that may not > turn out as the user expects. >=20 > > Not sure if it is worth adding an API to return the writable mask for > > idregs, since we want to enable the writable for all allocated > > unhidden idregs eventually. >=20 > We'd enable any new idregs for writing from the start in the future, I > guess? >=20 > I see two approaches here: > - add an API to get a list of idregs with their writable masks > - add a capability "you can write to all idregs whatever you'd expect to > be able to write there architecture wise", which would require to add > support for all idregs prior to exposing that cap >=20 > The second option would be the easier one (if we don't manage to break > it in the future :) I'm not sure the last option is even possible. The architecture keeps allocating new ID registers in the op0=3D=3D3, op1=3D=3D{0, 1, 3}, CRn=3D= =3D0, CRm=3D=3D{0-7}, op2=3D=3D{0-7} space, so fields that were RES0 until then start having a non-0 value. This could lead to a situation where you move from a system that didn't know about ID_AA64MMFR6_EL1.XYZ to a system that advertises it, and for which the XYZ instruction has another behaviour. Bad things follow. My preference would be a single ioctl that returns the full list of writeable masks in the ID reg range. It is big, but not crazy big (1536 bytes, if I haven't messed up), and includes the non ID_*_EL1 sysreg such as MPIDR_EL1, CTR_EL1, SMIDR_EL1. It would allow the VMM to actively write zeroes to any writable ID register it doesn't know about, or for which it doesn't have anything to restore. It is also relatively future proof, as it covers *everything* the architecture has provisioned for the future (by the time that space is exhausted, I hope none of us will still be involved with this crap). 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 A3D35EB64DC for ; Fri, 21 Jul 2023 09:31:37 +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=ahy6Ggb25EULopy/H0Ar9zqQoXCb7WeTnnFJyjD/Ym8=; b=CTDYyhrNkxj8r9 rJDMkH1Lwgab2ixTB70JWO9thCPwxtXVpkiR2dAJ0YfhADpcE7ZmZYyc+OeuNrpLWm8iKJEWwx8fF WZU7olyFUS1ZC/h512CdKbv/h6nIuHgsHN5tqUJanp0fSkR8N0rHCpk/o1BvOOsCCuACbDZeA5AkJ mjq8ZhDawh8hFs0BxIiBLl7Jrkfa14wL6A+VVxDVsEXR0Kg4YtJlUH0SGKWWIrJCSwVJ7qQg/N0GS tP/Pp8gHSSvgXdLAhfeWN+WWHcNMwoiXiU78xf3OmB/VK2WHs5ZkZNtgjREKl7I8PFurx1oG3ilKT Ui/qKLN8xQ1w2f7R0VOw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qMmTn-00DXoD-1R; Fri, 21 Jul 2023 09:31:19 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qMmTk-00DXmw-2w for linux-arm-kernel@lists.infradead.org; Fri, 21 Jul 2023 09:31:18 +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 D482C618C9; Fri, 21 Jul 2023 09:31:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 26ADCC433C8; Fri, 21 Jul 2023 09:31:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1689931875; bh=XcixfVNMYmXu3vjiST9n6CTBbXMks5XPaOuqSVzLQ1E=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=KBcTkWsMm97sFHjY8HgzcFT7U3MsdECuXIwprb4jD8Qoi+fmD2dJKp1TyjJx5Gobu Nu+BCjf49UZ942NRVqKMOSDBm8qEJVj/thyIn1X7BhKGXKVuQVG0L76YNkbhe68/k9 x4wpEgBw/dV/JiL77jcJskU5A99OZr4SYeXvabY8nKp+mWhNult2jT9a7Rgr1SIqw/ weepj5GDCwj3kbAuraKrUXHIA4+6gZZtYyodm89kanlJkoGroLXIUi+t6LcKX1sk1k /KYzEY9AHJKZkoUeAPWzhgrvLHVMhsKmMqE7LnMGB4U9V3996npRBsqd2lvl2J7C41 irrXIfKsoWjQA== Received: from sofa.misterjones.org ([185.219.108.64] helo=goblin-girl.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 1qMmTg-00FPGP-Fe; Fri, 21 Jul 2023 10:31:12 +0100 Date: Fri, 21 Jul 2023 10:31:12 +0100 Message-ID: <86r0p1txun.wl-maz@kernel.org> From: Marc Zyngier To: Cornelia Huck Cc: Jing Zhang , KVM , KVMARM , ARMLinux , Oliver Upton , Will Deacon , Paolo Bonzini , James Morse , Alexandru Elisei , Suzuki K Poulose , Fuad Tabba , Reiji Watanabe , Raghavendra Rao Ananta , Suraj Jitindar Singh Subject: Re: [PATCH v6 3/6] KVM: arm64: Enable writable for ID_AA64DFR0_EL1 and ID_DFR0_EL1 In-Reply-To: <87sf9h8xs0.fsf@redhat.com> References: <20230718164522.3498236-1-jingzhangos@google.com> <20230718164522.3498236-4-jingzhangos@google.com> <87o7k77yn5.fsf@redhat.com> <87sf9h8xs0.fsf@redhat.com> 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 (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: 185.219.108.64 X-SA-Exim-Rcpt-To: cohuck@redhat.com, jingzhangos@google.com, kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, oliver.upton@linux.dev, will@kernel.org, pbonzini@redhat.com, james.morse@arm.com, alexandru.elisei@arm.com, suzuki.poulose@arm.com, tabba@google.com, reijiw@google.com, rananta@google.com, surajjs@amazon.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-20230721_023117_045085_E454AB98 X-CRM114-Status: GOOD ( 43.45 ) 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 T24gRnJpLCAyMSBKdWwgMjAyMyAwOTozODoyMyArMDEwMCwKQ29ybmVsaWEgSHVjayA8Y29odWNr QHJlZGhhdC5jb20+IHdyb3RlOgo+IAo+IE9uIFRodSwgSnVsIDIwIDIwMjMsIEppbmcgWmhhbmcg PGppbmd6aGFuZ29zQGdvb2dsZS5jb20+IHdyb3RlOgo+IAo+ID4gSGkgQ29ybmVsaWEsCj4gPgo+ ID4gT24gVGh1LCBKdWwgMjAsIDIwMjMgYXQgMTo1MuKAr0FNIENvcm5lbGlhIEh1Y2sgPGNvaHVj a0ByZWRoYXQuY29tPiB3cm90ZToKPiA+Pgo+ID4+IE9uIFR1ZSwgSnVsIDE4IDIwMjMsIEppbmcg WmhhbmcgPGppbmd6aGFuZ29zQGdvb2dsZS5jb20+IHdyb3RlOgo+ID4+Cj4gPj4gPiBBbGwgdmFs aWQgZmllbGRzIGluIElEX0FBNjRERlIwX0VMMSBhbmQgSURfREZSMF9FTDEgYXJlIHdyaXRhYmxl Cj4gPj4gPiBmcm9tIHVzcmVzcGFjZSB3aXRoIHRoaXMgY2hhbmdlLgo+ID4+Cj4gPj4gVHlwbzog cy91c3Jlc3BhY2UvdXNlcnNwYWNlLwo+ID4gVGhhbmtzLgo+ID4+Cj4gPj4gPgo+ID4+ID4gU2ln bmVkLW9mZi1ieTogSmluZyBaaGFuZyA8amluZ3poYW5nb3NAZ29vZ2xlLmNvbT4KPiA+PiA+IC0t LQo+ID4+ID4gIGFyY2gvYXJtNjQva3ZtL3N5c19yZWdzLmMgfCA0ICsrLS0KPiA+PiA+ICAxIGZp bGUgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQo+ID4+ID4KPiA+PiA+ IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9zeXNfcmVncy5jIGIvYXJjaC9hcm02NC9rdm0v c3lzX3JlZ3MuYwo+ID4+ID4gaW5kZXggMDUzZDgwNTdmZjFlLi5mMzNhZWM4M2YxYjQgMTAwNjQ0 Cj4gPj4gPiAtLS0gYS9hcmNoL2FybTY0L2t2bS9zeXNfcmVncy5jCj4gPj4gPiArKysgYi9hcmNo L2FybTY0L2t2bS9zeXNfcmVncy5jCj4gPj4gPiBAQCAtMjAwOCw3ICsyMDA4LDcgQEAgc3RhdGlj IGNvbnN0IHN0cnVjdCBzeXNfcmVnX2Rlc2Mgc3lzX3JlZ19kZXNjc1tdID0gewo+ID4+ID4gICAg ICAgICAuc2V0X3VzZXIgPSBzZXRfaWRfZGZyMF9lbDEsCj4gPj4gPiAgICAgICAgIC52aXNpYmls aXR5ID0gYWEzMl9pZF92aXNpYmlsaXR5LAo+ID4+ID4gICAgICAgICAucmVzZXQgPSByZWFkX3Nh bml0aXNlZF9pZF9kZnIwX2VsMSwKPiA+PiA+IC0gICAgICAgLnZhbCA9IElEX0RGUjBfRUwxX1Bl cmZNb25fTUFTSywgfSwKPiA+PiA+ICsgICAgICAgLnZhbCA9IEdFTk1BU0soNjMsIDApLCB9LAo+ ID4+ID4gICAgICAgSURfSElEREVOKElEX0FGUjBfRUwxKSwKPiA+PiA+ICAgICAgIEFBMzJfSURf U0FOSVRJU0VEKElEX01NRlIwX0VMMSksCj4gPj4gPiAgICAgICBBQTMyX0lEX1NBTklUSVNFRChJ RF9NTUZSMV9FTDEpLAo+ID4+ID4gQEAgLTIwNTcsNyArMjA1Nyw3IEBAIHN0YXRpYyBjb25zdCBz dHJ1Y3Qgc3lzX3JlZ19kZXNjIHN5c19yZWdfZGVzY3NbXSA9IHsKPiA+PiA+ICAgICAgICAgLmdl dF91c2VyID0gZ2V0X2lkX3JlZywKPiA+PiA+ICAgICAgICAgLnNldF91c2VyID0gc2V0X2lkX2Fh NjRkZnIwX2VsMSwKPiA+PiA+ICAgICAgICAgLnJlc2V0ID0gcmVhZF9zYW5pdGlzZWRfaWRfYWE2 NGRmcjBfZWwxLAo+ID4+ID4gLSAgICAgICAudmFsID0gSURfQUE2NERGUjBfRUwxX1BNVVZlcl9N QVNLLCB9LAo+ID4+ID4gKyAgICAgICAudmFsID0gR0VOTUFTSyg2MywgMCksIH0sCj4gPj4gPiAg ICAgICBJRF9TQU5JVElTRUQoSURfQUE2NERGUjFfRUwxKSwKPiA+PiA+ICAgICAgIElEX1VOQUxM T0NBVEVEKDUsMiksCj4gPj4gPiAgICAgICBJRF9VTkFMTE9DQVRFRCg1LDMpLAo+ID4+Cj4gPj4g SG93IGRvZXMgdXNlcnNwYWNlIGZpbmQgb3V0IHdoZXRoZXIgYSBnaXZlbiBpZCByZWcgaXMgYWN0 dWFsbHkgd3JpdGFibGUsCj4gPj4gb3RoZXIgdGhhbiB0cnlpbmcgdG8gd3JpdGUgdG8gaXQ/Cj4g Pj4KPiA+IE5vIG1lY2hhbmlzbSB3YXMgcHJvdmlkZWQgdG8gdXNlcnNwYWNlIHRvIGRpc2NvdmVy IGlmIGEgZ2l2ZW4gaWRyZWcgb3IKPiA+IGFueSBmaWVsZHMgb2YgYSBnaXZlbiBpZHJlZyBpcyB3 cml0YWJsZS4gVGhlIHdyaXRlIHRvIGEgcmVhZG9ubHkgaWRyZWcKPiA+IGNhbiBhbHNvIHN1Y2Nl ZWQgKHdyaXRlIGlnbm9yZWQpIHdpdGhvdXQgYW55IGVycm9yIGlmIHdoYXQncyB3cml0dGVuCj4g PiBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHdoYXQgdGhlIGlkcmVnIGhvbGRzIG9yIGlmIGl0IGlz IGEgd3JpdGUgdG8KPiA+IEFBcmNoMzIgaWRyZWdzIG9uIGFuIEFBcmNoNjQtb25seSBzeXN0ZW0u Cj4gCj4gSG0sIEknbSBub3Qgc3VyZSB0aGF0J3MgYSBnb29kIHRoaW5nIGZvciB0aGUgY2FzZXMg d2hlcmUgd2Ugd2FudCB0bwo+IHN1cHBvcnQgbWl4LWFuZC1tYXRjaCB1c2Vyc3BhY2UgYW5kIGtl cm5lbHMuIFVzZXJzcGFjZSBtYXkgd2FudCB0byBrbm93Cj4gdXBmcm9udCB3aGV0aGVyIGl0IGNh biBhY3R1YWxseSB0d2VhayB0aGUgY29udGVudHMgb2YgYW4gaWRyZWcgb3Igbm90Cj4gKGZvciBl eGFtcGxlLCBpbiB0aGUgY29udGV4dCBvZiB1c2luZyBDUFUgbW9kZWxzIGZvciBjb21wYXRpYmls aXR5KSwgc28KPiB0aGF0IGl0IGNhbiByZWplY3Qgb3Igd2FybiBhYm91dCBjZXJ0YWluIGNvbmZp Z3VyYXRpb25zIHRoYXQgbWF5IG5vdAo+IHR1cm4gb3V0IGFzIHRoZSB1c2VyIGV4cGVjdHMuCj4g Cj4gPiBOb3Qgc3VyZSBpZiBpdCBpcyB3b3J0aCBhZGRpbmcgYW4gQVBJIHRvIHJldHVybiB0aGUg d3JpdGFibGUgbWFzayBmb3IKPiA+IGlkcmVncywgc2luY2Ugd2Ugd2FudCB0byBlbmFibGUgdGhl IHdyaXRhYmxlIGZvciBhbGwgYWxsb2NhdGVkCj4gPiB1bmhpZGRlbiBpZHJlZ3MgZXZlbnR1YWxs eS4KPiAKPiBXZSdkIGVuYWJsZSBhbnkgbmV3IGlkcmVncyBmb3Igd3JpdGluZyBmcm9tIHRoZSBz dGFydCBpbiB0aGUgZnV0dXJlLCBJCj4gZ3Vlc3M/Cj4gCj4gSSBzZWUgdHdvIGFwcHJvYWNoZXMg aGVyZToKPiAtIGFkZCBhbiBBUEkgdG8gZ2V0IGEgbGlzdCBvZiBpZHJlZ3Mgd2l0aCB0aGVpciB3 cml0YWJsZSBtYXNrcwo+IC0gYWRkIGEgY2FwYWJpbGl0eSAieW91IGNhbiB3cml0ZSB0byBhbGwg aWRyZWdzIHdoYXRldmVyIHlvdSdkIGV4cGVjdCB0bwo+ICAgYmUgYWJsZSB0byB3cml0ZSB0aGVy ZSBhcmNoaXRlY3R1cmUgd2lzZSIsIHdoaWNoIHdvdWxkIHJlcXVpcmUgdG8gYWRkCj4gICBzdXBw b3J0IGZvciBhbGwgaWRyZWdzIHByaW9yIHRvIGV4cG9zaW5nIHRoYXQgY2FwCj4gCj4gVGhlIHNl Y29uZCBvcHRpb24gd291bGQgYmUgdGhlIGVhc2llciBvbmUgKGlmIHdlIGRvbid0IG1hbmFnZSB0 byBicmVhawo+IGl0IGluIHRoZSBmdXR1cmUgOikKCkknbSBub3Qgc3VyZSB0aGUgbGFzdCBvcHRp b24gaXMgZXZlbiBwb3NzaWJsZS4gVGhlIGFyY2hpdGVjdHVyZSBrZWVwcwphbGxvY2F0aW5nIG5l dyBJRCByZWdpc3RlcnMgaW4gdGhlIG9wMD09Mywgb3AxPT17MCwgMSwgM30sIENSbj09MCwKQ1Jt PT17MC03fSwgb3AyPT17MC03fSBzcGFjZSwgc28gZmllbGRzIHRoYXQgd2VyZSBSRVMwIHVudGls IHRoZW4Kc3RhcnQgaGF2aW5nIGEgbm9uLTAgdmFsdWUuCgpUaGlzIGNvdWxkIGxlYWQgdG8gYSBz aXR1YXRpb24gd2hlcmUgeW91IG1vdmUgZnJvbSBhIHN5c3RlbSB0aGF0CmRpZG4ndCBrbm93IGFi b3V0IElEX0FBNjRNTUZSNl9FTDEuWFlaIHRvIGEgc3lzdGVtIHRoYXQgYWR2ZXJ0aXNlcyBpdCwK YW5kIGZvciB3aGljaCB0aGUgWFlaIGluc3RydWN0aW9uIGhhcyBhbm90aGVyIGJlaGF2aW91ci4g QmFkIHRoaW5ncwpmb2xsb3cuCgpNeSBwcmVmZXJlbmNlIHdvdWxkIGJlIGEgc2luZ2xlIGlvY3Rs IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBsaXN0IG9mCndyaXRlYWJsZSBtYXNrcyBpbiB0aGUgSUQg cmVnIHJhbmdlLiBJdCBpcyBiaWcsIGJ1dCBub3QgY3JhenkgYmlnCigxNTM2IGJ5dGVzLCBpZiBJ IGhhdmVuJ3QgbWVzc2VkIHVwKSwgYW5kIGluY2x1ZGVzIHRoZSBub24gSURfKl9FTDEKc3lzcmVn IHN1Y2ggYXMgTVBJRFJfRUwxLCBDVFJfRUwxLCBTTUlEUl9FTDEuCgpJdCB3b3VsZCBhbGxvdyB0 aGUgVk1NIHRvIGFjdGl2ZWx5IHdyaXRlIHplcm9lcyB0byBhbnkgd3JpdGFibGUgSUQKcmVnaXN0 ZXIgaXQgZG9lc24ndCBrbm93IGFib3V0LCBvciBmb3Igd2hpY2ggaXQgZG9lc24ndCBoYXZlIGFu eXRoaW5nCnRvIHJlc3RvcmUuIEl0IGlzIGFsc28gcmVsYXRpdmVseSBmdXR1cmUgcHJvb2YsIGFz IGl0IGNvdmVycwoqZXZlcnl0aGluZyogdGhlIGFyY2hpdGVjdHVyZSBoYXMgcHJvdmlzaW9uZWQg Zm9yIHRoZSBmdXR1cmUgKGJ5IHRoZQp0aW1lIHRoYXQgc3BhY2UgaXMgZXhoYXVzdGVkLCBJIGhv cGUgbm9uZSBvZiB1cyB3aWxsIHN0aWxsIGJlIGludm9sdmVkCndpdGggdGhpcyBjcmFwKS4KClRo YW5rcywKCglNLgoKLS0gCldpdGhvdXQgZGV2aWF0aW9uIGZyb20gdGhlIG5vcm0sIHByb2dyZXNz IGlzIG5vdCBwb3NzaWJsZS4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxA bGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK