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 83D0F10942 for ; Thu, 17 Aug 2023 10:04:57 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id EF8F1C433C7; Thu, 17 Aug 2023 10:04:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1692266697; bh=W1jtb9kryF03zGezQ0pFDhPp1SJkF/jrhW+cT+eIlSQ=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=FN4Un9Sg//ad7XLVVZgBBvXK0Sn95lIzpAQwILtk9wyxiVlJE/MyuGmGpTRhTKJCq uaM89Fb64+xlgQOQ9yBk6oZhKOrrPhMc9ZXJ5OvagsHIQVb7SIHij0khzUzMJ7jHs3 5zOZSxDuu+gWPmAd4/+w7vSYmUk48QlJCc3Nz44dAa95YmIsAlZ9qb+Qv96Mj3RN29 8KX383jcdGqxD+stkclCrtqawhpGdWgKpi2QnwggNFLmp17tNdj5gix1rgPmOKirOI mh8dhezdHP0Iqt8IShCkgdI+4J5LbK5/6XeJpSAJ9+yU0e4nSkY+M+dkTVj6SJS6Jw g7fJ8i4i/I7rA== 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 1qWZs6-005eA6-EC; Thu, 17 Aug 2023 11:04:54 +0100 Date: Thu, 17 Aug 2023 11:04:54 +0100 Message-ID: <86ttsyf0hl.wl-maz@kernel.org> From: Marc Zyngier To: Ganapatrao Kulkarni Cc: linux-kernel@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, eauger@redhat.com, miguel.luis@oracle.com, darren@os.amperecomputing.com, scott@os.amperecomputing.com, Christoffer Dall Subject: Re: [PATCH 2/2] KVM: arm64: timers: Adjust CVAL of a ptimer across guest entry and exits In-Reply-To: <0c5fb304-8c69-80c3-6f1e-487828554244@os.amperecomputing.com> References: <20230817060314.535987-1-gankulkarni@os.amperecomputing.com> <20230817060314.535987-3-gankulkarni@os.amperecomputing.com> <87bkf6oyyt.wl-maz@kernel.org> <0c5fb304-8c69-80c3-6f1e-487828554244@os.amperecomputing.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: gankulkarni@os.amperecomputing.com, linux-kernel@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, eauger@redhat.com, miguel.luis@oracle.com, darren@os.amperecomputing.com, scott@os.amperecomputing.com, Christoffer.Dall@arm.com X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false On Thu, 17 Aug 2023 10:27:55 +0100, Ganapatrao Kulkarni wrote: >=20 >=20 > Hi Marc, >=20 > On 17-08-2023 01:57 pm, Marc Zyngier wrote: > > [Fixing Christoffer's email address] >=20 > Thanks. > >=20 > > On Thu, 17 Aug 2023 07:03:14 +0100, > > Ganapatrao Kulkarni wrote: > >>=20 > >> As per FEAT_ECV, when HCR_EL2.{E2H, TGE} =3D=3D {1, 1}, Enhanced Count= er > >> Virtualization functionality is disabled and CNTPOFF_EL2 value is trea= ted > >> as zero. On VHE host, E2H and TGE are set, hence it is required > >> to adjust CVAL by incrementing it by CNTPOFF_EL2 after guest > >> exit to avoid false physical timer interrupts and also > >> decrement/restore CVAL before the guest entry. > >=20 > > No, this is wrong. Neither E2H nor TGE have any impact on writing to > > CNTPOFF_EL2, nor does it have an impact on CNTP_CVAL_EL0. Just read > > the pseudocode to convince yourself. > >=20 > > CNTPOFF_EL2 is applied at exactly two points: when SW is reading > > CNTPCT_EL0 from EL1 while {E2H,TGE}=3D=3D{1, 0} and when the HW is > > comparing CNTPCT_EL0 with the CNTP_CVAL_EL0. In both cases the offset > > is subtracted from the counter. And that's the point where the running > > EL matters. Which means that CNTPOFF_EL2 behaves exactly like > > CNTVOFF_EL2. No ifs, no buts. >=20 > As per ARM ARM (ARM DDI 0487J.a page D11-5989) > "When FEAT_ECV is implemented, the CNTPOFF_EL2 register allows an > offset to be applied to the physical counter, as viewed from EL1 and > EL0, and to the EL1 physical timer. The functionality of this 64-bit > register is affected by CNTHCTL_EL2.ECV." >=20 > As per ARM ARM (ARM DDI 0487J.a page D19-7857) > "When HCR_EL2.{E2H, TGE} =3D=3D {1, 1} or SCR_EL3.{NS, EEL2} =3D=3D {0, 0= }, then > Enhanced Counter Virtualization functionality is disabled." I think this is just bad writing. The functionality isn't disabled, since you can access CNTPOFF_EL2. It is just that, as for CNTVOFF, the offset isn't applied to reads of the physical counter. >=20 > "The EL1 physical timer interrupt is triggered when ((PCount<63:0> - > CNTPOFF_EL2<63:0>) - PCVal<63:0>) is greater than or equal to 0." >=20 > As per ARM ARM (ARM DDI 0487J.a page D19-7938) > "When EL2 is implemented and enabled in the current Security state, > the physical counter uses a fixed physical offset of *zero* if any of > the following are true: > =E2=80=A2 CNTHCTL_EL2.ECV is 0. > =E2=80=A2 SCR_EL3.ECVEn is 0. > =E2=80=A2 HCR_EL2.{E2H, TGE} is {1, 1}." >=20 > In VHE host hypervisor, E2H=3DTGE=3D1 hence ECV is disabled and Ptimer > interrupt is triggered based on PCount<63:0> - PCVal<63:0> ECV is *not* disabled. It is just that CNTPOFF isn't applied to the counter as viewed from EL2. >=20 > Since cval is set by Guest as per offsetted PCounter value and pCount > is not subtracted by CNTPOFF when in VHE-L0, results in cval becoming > much lesser than physical counter(bumped up since CNTPOFF is zero) and > timer interrupt trigger condition is met falsely. Again, you're misreading the spec. When the guest reads the counter, it reads something that is offset by CNTPOFF. When the guest programs CVAL, it is an offset from the value it has read. When the HW compares the physical counter to CVAL, it applies CNTPOFF to the counter. There is no context to these things, and the value of TGE should not matter. And even if it did, at the point where we enter the guest, everything should be hunky dory: the HW has all the information, and no interrupt should fire if the offseted counter is less than the deadline. Again, this is exactly like CNTVOFF. > There is no issue/impact on cval due to ECV, however it can be/is > manipulated to handle this on and off of CNTPOFF/ECV. >=20 > IIUC, CNTPOFF and CNTVOFF are not same as per specification. We clearly are reading different things in the spec, as I cannot see *any* difference in how they are described. If your HW has built them differently, you have a problem. 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 19307C27C7A for ; Thu, 17 Aug 2023 10:05:31 +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=GjfP32OvCRpdVdtpPTPDO7lmYtMR6g2zJokfZzTyygs=; b=NjslTuPu7rDVP8 8HZOfiTXIKQFniY1g4r7hofcqGHIDcqFQv4HLcGwNCHt0EDwRzc8wT3TjlYQa3Wnqj5DO/hTo3cfS ZZjmyH5HMwPRtucQWQUVN62Sm4oTdj5cAmc0j3heDrt7+XADweuNO5mt5w71lB+SiOi3GAaBpZniN q2Rge15TIVT0iw62+XgI/civ/NVSglapmSl4axJ5By5N+9iAdpxvS95bA6j9jV5GrfuhzrASXCZrE SqP/vXXflzVJMaNiLctVYRLIELDeF10h8L9ffHpndWLfJlVhLLiSlzbOPHJx4i5Tx2PA4jcik0aSf roHExqQPHm/BTMsApcJA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qWZsC-00601j-2N; Thu, 17 Aug 2023 10:05:00 +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 1qWZsA-00601Q-0Z for linux-arm-kernel@lists.infradead.org; Thu, 17 Aug 2023 10:04:59 +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 9015660A55; Thu, 17 Aug 2023 10:04:57 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id EF8F1C433C7; Thu, 17 Aug 2023 10:04:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1692266697; bh=W1jtb9kryF03zGezQ0pFDhPp1SJkF/jrhW+cT+eIlSQ=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=FN4Un9Sg//ad7XLVVZgBBvXK0Sn95lIzpAQwILtk9wyxiVlJE/MyuGmGpTRhTKJCq uaM89Fb64+xlgQOQ9yBk6oZhKOrrPhMc9ZXJ5OvagsHIQVb7SIHij0khzUzMJ7jHs3 5zOZSxDuu+gWPmAd4/+w7vSYmUk48QlJCc3Nz44dAa95YmIsAlZ9qb+Qv96Mj3RN29 8KX383jcdGqxD+stkclCrtqawhpGdWgKpi2QnwggNFLmp17tNdj5gix1rgPmOKirOI mh8dhezdHP0Iqt8IShCkgdI+4J5LbK5/6XeJpSAJ9+yU0e4nSkY+M+dkTVj6SJS6Jw g7fJ8i4i/I7rA== 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 1qWZs6-005eA6-EC; Thu, 17 Aug 2023 11:04:54 +0100 Date: Thu, 17 Aug 2023 11:04:54 +0100 Message-ID: <86ttsyf0hl.wl-maz@kernel.org> From: Marc Zyngier To: Ganapatrao Kulkarni Cc: linux-kernel@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, eauger@redhat.com, miguel.luis@oracle.com, darren@os.amperecomputing.com, scott@os.amperecomputing.com, Christoffer Dall Subject: Re: [PATCH 2/2] KVM: arm64: timers: Adjust CVAL of a ptimer across guest entry and exits In-Reply-To: <0c5fb304-8c69-80c3-6f1e-487828554244@os.amperecomputing.com> References: <20230817060314.535987-1-gankulkarni@os.amperecomputing.com> <20230817060314.535987-3-gankulkarni@os.amperecomputing.com> <87bkf6oyyt.wl-maz@kernel.org> <0c5fb304-8c69-80c3-6f1e-487828554244@os.amperecomputing.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: gankulkarni@os.amperecomputing.com, linux-kernel@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, eauger@redhat.com, miguel.luis@oracle.com, darren@os.amperecomputing.com, scott@os.amperecomputing.com, Christoffer.Dall@arm.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-20230817_030458_321539_3D131337 X-CRM114-Status: GOOD ( 31.31 ) 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 T24gVGh1LCAxNyBBdWcgMjAyMyAxMDoyNzo1NSArMDEwMCwKR2FuYXBhdHJhbyBLdWxrYXJuaSA8 Z2Fua3Vsa2FybmlAb3MuYW1wZXJlY29tcHV0aW5nLmNvbT4gd3JvdGU6Cj4gCj4gCj4gSGkgTWFy YywKPiAKPiBPbiAxNy0wOC0yMDIzIDAxOjU3IHBtLCBNYXJjIFp5bmdpZXIgd3JvdGU6Cj4gPiBb Rml4aW5nIENocmlzdG9mZmVyJ3MgZW1haWwgYWRkcmVzc10KPiAKPiBUaGFua3MuCj4gPiAKPiA+ IE9uIFRodSwgMTcgQXVnIDIwMjMgMDc6MDM6MTQgKzAxMDAsCj4gPiBHYW5hcGF0cmFvIEt1bGth cm5pIDxnYW5rdWxrYXJuaUBvcy5hbXBlcmVjb21wdXRpbmcuY29tPiB3cm90ZToKPiA+PiAKPiA+ PiBBcyBwZXIgRkVBVF9FQ1YsIHdoZW4gSENSX0VMMi57RTJILCBUR0V9ID09IHsxLCAxfSwgRW5o YW5jZWQgQ291bnRlcgo+ID4+IFZpcnR1YWxpemF0aW9uIGZ1bmN0aW9uYWxpdHkgaXMgZGlzYWJs ZWQgYW5kIENOVFBPRkZfRUwyIHZhbHVlIGlzIHRyZWF0ZWQKPiA+PiBhcyB6ZXJvLiBPbiBWSEUg aG9zdCwgRTJIIGFuZCBUR0UgYXJlIHNldCwgaGVuY2UgaXQgaXMgcmVxdWlyZWQKPiA+PiB0byBh ZGp1c3QgQ1ZBTCBieSBpbmNyZW1lbnRpbmcgaXQgYnkgQ05UUE9GRl9FTDIgYWZ0ZXIgZ3Vlc3QK PiA+PiBleGl0IHRvIGF2b2lkIGZhbHNlIHBoeXNpY2FsIHRpbWVyIGludGVycnVwdHMgYW5kIGFs c28KPiA+PiBkZWNyZW1lbnQvcmVzdG9yZSBDVkFMIGJlZm9yZSB0aGUgZ3Vlc3QgZW50cnkuCj4g PiAKPiA+IE5vLCB0aGlzIGlzIHdyb25nLiBOZWl0aGVyIEUySCBub3IgVEdFIGhhdmUgYW55IGlt cGFjdCBvbiB3cml0aW5nIHRvCj4gPiBDTlRQT0ZGX0VMMiwgbm9yIGRvZXMgaXQgaGF2ZSBhbiBp bXBhY3Qgb24gQ05UUF9DVkFMX0VMMC4gSnVzdCByZWFkCj4gPiB0aGUgcHNldWRvY29kZSB0byBj b252aW5jZSB5b3Vyc2VsZi4KPiA+IAo+ID4gQ05UUE9GRl9FTDIgaXMgYXBwbGllZCBhdCBleGFj dGx5IHR3byBwb2ludHM6IHdoZW4gU1cgaXMgcmVhZGluZwo+ID4gQ05UUENUX0VMMCBmcm9tIEVM MSB3aGlsZSB7RTJILFRHRX09PXsxLCAwfSBhbmQgd2hlbiB0aGUgSFcgaXMKPiA+IGNvbXBhcmlu ZyBDTlRQQ1RfRUwwIHdpdGggdGhlIENOVFBfQ1ZBTF9FTDAuIEluIGJvdGggY2FzZXMgdGhlIG9m ZnNldAo+ID4gaXMgc3VidHJhY3RlZCBmcm9tIHRoZSBjb3VudGVyLiBBbmQgdGhhdCdzIHRoZSBw b2ludCB3aGVyZSB0aGUgcnVubmluZwo+ID4gRUwgbWF0dGVycy4gV2hpY2ggbWVhbnMgdGhhdCBD TlRQT0ZGX0VMMiBiZWhhdmVzIGV4YWN0bHkgbGlrZQo+ID4gQ05UVk9GRl9FTDIuIE5vIGlmcywg bm8gYnV0cy4KPiAKPiBBcyBwZXIgQVJNIEFSTSAoQVJNIERESSAwNDg3Si5hIHBhZ2UgRDExLTU5 ODkpCj4gIldoZW4gRkVBVF9FQ1YgaXMgaW1wbGVtZW50ZWQsIHRoZSBDTlRQT0ZGX0VMMiByZWdp c3RlciBhbGxvd3MgYW4KPiBvZmZzZXQgdG8gYmUgYXBwbGllZCB0byB0aGUgcGh5c2ljYWwgY291 bnRlciwgYXMgdmlld2VkIGZyb20gRUwxIGFuZAo+IEVMMCwgYW5kIHRvIHRoZSBFTDEgcGh5c2lj YWwgdGltZXIuIFRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgNjQtYml0Cj4gcmVnaXN0ZXIgaXMg YWZmZWN0ZWQgYnkgQ05USENUTF9FTDIuRUNWLiIKPiAKPiBBcyBwZXIgQVJNIEFSTSAoQVJNIERE SSAwNDg3Si5hIHBhZ2UgRDE5LTc4NTcpCj4gIldoZW4gSENSX0VMMi57RTJILCBUR0V9ID09IHsx LCAxfSBvciBTQ1JfRUwzLntOUywgRUVMMn0gPT0gezAsIDB9LCB0aGVuCj4gRW5oYW5jZWQgQ291 bnRlciBWaXJ0dWFsaXphdGlvbiBmdW5jdGlvbmFsaXR5IGlzIGRpc2FibGVkLiIKCkkgdGhpbmsg dGhpcyBpcyBqdXN0IGJhZCB3cml0aW5nLiBUaGUgZnVuY3Rpb25hbGl0eSBpc24ndCBkaXNhYmxl ZCwKc2luY2UgeW91IGNhbiBhY2Nlc3MgQ05UUE9GRl9FTDIuIEl0IGlzIGp1c3QgdGhhdCwgYXMg Zm9yIENOVFZPRkYsIHRoZQpvZmZzZXQgaXNuJ3QgYXBwbGllZCB0byByZWFkcyBvZiB0aGUgcGh5 c2ljYWwgY291bnRlci4KCj4gCj4gIlRoZSBFTDEgcGh5c2ljYWwgdGltZXIgaW50ZXJydXB0IGlz IHRyaWdnZXJlZCB3aGVuICgoUENvdW50PDYzOjA+IC0KPiBDTlRQT0ZGX0VMMjw2MzowPikgLSBQ Q1ZhbDw2MzowPikgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuIgo+IAo+IEFzIHBlciBB Uk0gQVJNIChBUk0gRERJIDA0ODdKLmEgcGFnZSBEMTktNzkzOCkKPiAiV2hlbiBFTDIgaXMgaW1w bGVtZW50ZWQgYW5kIGVuYWJsZWQgaW4gdGhlIGN1cnJlbnQgU2VjdXJpdHkgc3RhdGUsCj4gdGhl IHBoeXNpY2FsIGNvdW50ZXIgdXNlcyBhIGZpeGVkIHBoeXNpY2FsIG9mZnNldCBvZiAqemVybyog aWYgYW55IG9mCj4gdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZToKPiDigKIgQ05USENUTF9FTDIuRUNW IGlzIDAuCj4g4oCiIFNDUl9FTDMuRUNWRW4gaXMgMC4KPiDigKIgSENSX0VMMi57RTJILCBUR0V9 IGlzIHsxLCAxfS4iCj4gCj4gSW4gVkhFIGhvc3QgaHlwZXJ2aXNvciwgRTJIPVRHRT0xIGhlbmNl IEVDViBpcyBkaXNhYmxlZCBhbmQgUHRpbWVyCj4gaW50ZXJydXB0IGlzIHRyaWdnZXJlZCBiYXNl ZCBvbiBQQ291bnQ8NjM6MD4gLSBQQ1ZhbDw2MzowPgoKRUNWIGlzICpub3QqIGRpc2FibGVkLiBJ dCBpcyBqdXN0IHRoYXQgQ05UUE9GRiBpc24ndCBhcHBsaWVkIHRvIHRoZQpjb3VudGVyIGFzIHZp ZXdlZCBmcm9tIEVMMi4KCj4gCj4gU2luY2UgY3ZhbCBpcyBzZXQgYnkgR3Vlc3QgYXMgcGVyIG9m ZnNldHRlZCBQQ291bnRlciB2YWx1ZSBhbmQgcENvdW50Cj4gaXMgbm90IHN1YnRyYWN0ZWQgYnkg Q05UUE9GRiB3aGVuIGluIFZIRS1MMCwgcmVzdWx0cyBpbiBjdmFsIGJlY29taW5nCj4gbXVjaCBs ZXNzZXIgdGhhbiBwaHlzaWNhbCBjb3VudGVyKGJ1bXBlZCB1cCBzaW5jZSBDTlRQT0ZGIGlzIHpl cm8pIGFuZAo+IHRpbWVyIGludGVycnVwdCB0cmlnZ2VyIGNvbmRpdGlvbiBpcyBtZXQgZmFsc2Vs eS4KCkFnYWluLCB5b3UncmUgbWlzcmVhZGluZyB0aGUgc3BlYy4gV2hlbiB0aGUgZ3Vlc3QgcmVh ZHMgdGhlIGNvdW50ZXIsCml0IHJlYWRzIHNvbWV0aGluZyB0aGF0IGlzIG9mZnNldCBieSBDTlRQ T0ZGLiBXaGVuIHRoZSBndWVzdCBwcm9ncmFtcwpDVkFMLCBpdCBpcyBhbiBvZmZzZXQgZnJvbSB0 aGUgdmFsdWUgaXQgaGFzIHJlYWQuIFdoZW4gdGhlIEhXIGNvbXBhcmVzCnRoZSBwaHlzaWNhbCBj b3VudGVyIHRvIENWQUwsIGl0IGFwcGxpZXMgQ05UUE9GRiB0byB0aGUgY291bnRlci4KClRoZXJl IGlzIG5vIGNvbnRleHQgdG8gdGhlc2UgdGhpbmdzLCBhbmQgdGhlIHZhbHVlIG9mIFRHRSBzaG91 bGQgbm90Cm1hdHRlci4gQW5kIGV2ZW4gaWYgaXQgZGlkLCBhdCB0aGUgcG9pbnQgd2hlcmUgd2Ug ZW50ZXIgdGhlIGd1ZXN0LApldmVyeXRoaW5nIHNob3VsZCBiZSBodW5reSBkb3J5OiB0aGUgSFcg aGFzIGFsbCB0aGUgaW5mb3JtYXRpb24sIGFuZApubyBpbnRlcnJ1cHQgc2hvdWxkIGZpcmUgaWYg dGhlIG9mZnNldGVkIGNvdW50ZXIgaXMgbGVzcyB0aGFuIHRoZQpkZWFkbGluZS4KCkFnYWluLCB0 aGlzIGlzIGV4YWN0bHkgbGlrZSBDTlRWT0ZGLgoKPiBUaGVyZSBpcyBubyBpc3N1ZS9pbXBhY3Qg b24gY3ZhbCBkdWUgdG8gRUNWLCBob3dldmVyIGl0IGNhbiBiZS9pcwo+IG1hbmlwdWxhdGVkIHRv IGhhbmRsZSB0aGlzIG9uIGFuZCBvZmYgb2YgQ05UUE9GRi9FQ1YuCj4gCj4gSUlVQywgQ05UUE9G RiBhbmQgQ05UVk9GRiBhcmUgbm90IHNhbWUgYXMgcGVyIHNwZWNpZmljYXRpb24uCgpXZSBjbGVh cmx5IGFyZSByZWFkaW5nIGRpZmZlcmVudCB0aGluZ3MgaW4gdGhlIHNwZWMsIGFzIEkgY2Fubm90 IHNlZQoqYW55KiBkaWZmZXJlbmNlIGluIGhvdyB0aGV5IGFyZSBkZXNjcmliZWQuIElmIHlvdXIg SFcgaGFzIGJ1aWx0IHRoZW0KZGlmZmVyZW50bHksIHlvdSBoYXZlIGEgcHJvYmxlbS4KClRoYW5r cywKCglNLgoKLS0gCldpdGhvdXQgZGV2aWF0aW9uIGZyb20gdGhlIG5vcm0sIHByb2dyZXNzIGlz IG5vdCBwb3NzaWJsZS4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LWFybS1rZXJuZWwK