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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8186BC77B7C for ; Wed, 31 May 2023 07:31:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234603AbjEaHba (ORCPT ); Wed, 31 May 2023 03:31:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42180 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234510AbjEaHb3 (ORCPT ); Wed, 31 May 2023 03:31:29 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DD8F4123 for ; Wed, 31 May 2023 00:31:27 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 7AA6263768 for ; Wed, 31 May 2023 07:31:27 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D82B3C433D2; Wed, 31 May 2023 07:31:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1685518286; bh=HF7OKbXM2BGCGbyxMZ7v0Zp7UV6T2JLlyQvFgaWN0d8=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=kzdyDYEZfiGiN0E3Bfb41AdhWH/bZ+GihR4qv7iFZZOpaM37vhemeovJc7CHYOHl3 ILIFb7e/JXHSa9Wp9x9NHyi9uBeDyN1szHlxtfEdiWiUSxF9cbVrSBLLORDWxubf42 0EBSPI53J6WplbvxbfA7m8hPvC4W1yliWNo0i9ydim58+psQgJjb8y4xtqIGI7ZAKI T73sCIiUdCZPjfefrLflMNkkzncONG4UHDYqmIGcuLLxxlqNgQZpKqPphTR0j0gWGS bbCnfZhaToYXwJkq6Nc+N4ro6F5q+RtGr/+cKHA1Dva4QUA3g8dAf1O+04iEOK3iiV LQ8ru5FM44QMw== 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 1q4GIm-001Xqs-UU; Wed, 31 May 2023 08:31:25 +0100 Date: Wed, 31 May 2023 08:31:24 +0100 Message-ID: <86353dc5yr.wl-maz@kernel.org> From: Marc Zyngier To: Jing Zhang Cc: KVM , KVMARM , ARMLinux , Oliver Upton , Will Deacon , Paolo Bonzini , James Morse , Alexandru Elisei , Suzuki K Poulose , Fuad Tabba , Reiji Watanabe , Raghavendra Rao Ananta Subject: Re: [PATCH v10 5/5] KVM: arm64: Refactor writings for PMUVer/CSV2/CSV3 In-Reply-To: References: <20230522221835.957419-1-jingzhangos@google.com> <20230522221835.957419-6-jingzhangos@google.com> <87pm6kogx8.wl-maz@kernel.org> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/28.2 (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: 185.219.108.64 X-SA-Exim-Rcpt-To: jingzhangos@google.com, kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, oupton@google.com, 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 X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org On Tue, 30 May 2023 22:18:04 +0100, Jing Zhang wrote: >=20 > Hi Marc, >=20 > On Sun, May 28, 2023 at 4:05=E2=80=AFAM Marc Zyngier wro= te: > > > > On Mon, 22 May 2023 23:18:35 +0100, > > Jing Zhang wrote: > > > > > > Refactor writings for ID_AA64PFR0_EL1.[CSV2|CSV3], > > > ID_AA64DFR0_EL1.PMUVer and ID_DFR0_ELF.PerfMon based on utilities > > > specific to ID register. > > > > > > Signed-off-by: Jing Zhang > > > --- > > > arch/arm64/include/asm/cpufeature.h | 1 + > > > arch/arm64/kernel/cpufeature.c | 2 +- > > > arch/arm64/kvm/sys_regs.c | 365 ++++++++++++++++++--------= -- > > > 3 files changed, 243 insertions(+), 125 deletions(-) > > > > Reading the result after applying this series, I feel like a stuck > > record. This final series still contains gems like this: > > > > static int set_id_aa64pfr0_el1(struct kvm_vcpu *vcpu, > > const struct sys_reg_desc *rd, > > u64 val) > > { > > u8 csv2, csv3; > > > > /* > > * Allow AA64PFR0_EL1.CSV2 to be set from userspace as long as > > * it doesn't promise more than what is actually provided (the > > * guest could otherwise be covered in ectoplasmic residue). > > */ > > csv2 =3D cpuid_feature_extract_unsigned_field(val, ID_AA64PFR0_= EL1_CSV2_SHIFT); > > if (csv2 > 1 || > > (csv2 && arm64_get_spectre_v2_state() !=3D SPECTRE_UNAFFECT= ED)) > > return -EINVAL; > > > > /* Same thing for CSV3 */ > > csv3 =3D cpuid_feature_extract_unsigned_field(val, ID_AA64PFR0_= EL1_CSV3_SHIFT); > > if (csv3 > 1 || > > (csv3 && arm64_get_meltdown_state() !=3D SPECTRE_UNAFFECTED= )) > > return -EINVAL; > > > > return set_id_reg(vcpu, rd, val); > > } > > > > Why do we have this? I've asked the question at least 3 times in the > > previous versions, and I still see the same code. > > > > If we have sane limits, the call to arm64_check_features() in > > set_id_reg() will catch the illegal write. So why do we have this at > > all? The whole point of the exercise was to unify the handling. But > > you're actually making it worse. > > > > So what's the catch? > Sorry, I am only aware of one discussion of this code in v8. The > reason I still keep the check here is that the arm64_check_features() > can not catch all illegal writes as this code does. > For example, for CSV2, one concern is: > When arm64_get_spectre_v2_state() !=3D SPECTRE_UNAFFECTED, this code > only allows guest CSV2 to be set to 0, any non-zero value would lead > to -EINVAL. If we remove the check here, the guest CSV2 can be set to > any value lower or equal to host CSV2. Sorry, this doesn't make sense. Lower is always fine. If you meant 'higher', then I agree that it would be bad. But that doesn't make keeping this code the right outcome. > Of course, we can set the sane limit of CSV2 to 0 when > arm64_get_spectre_v2_state() !=3D SPECTRE_UNAFFECTED in > read_sanitised_id_aa64pfr0_el1(). Then we can remove all the checks > here and no specific set_id function for AA64PFR0_EL1 is needed. This is what I have been asking for all along: the "sanitised" view of the register *must* return the absolute limit for the fields that are flagged as writable by "mask". If we need extra code, then something is really wrong. The core feature code manages that without any special casing, and we should be able to reach the same level. 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 5729DC77B7C for ; Wed, 31 May 2023 07:31:50 +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=UDdNx61wvgf9fE2k8zE1gZjMjivncifI6lAgpIN+MpM=; b=bqpC3KVhL8+HSF JvT3oSoRDvOfjuRstjJiJFgLElz6cZAVM6uzI2fZ5J5UMNrNWWpuHX07cy0iqPUsDTjP0ULb3Ee6l at2ybRDzTemnlYNFXadvMbKORN1cPnTKM6OE+8GNCokOzryLDyIvN5chWVkCXGmHZ1bK09+b37lfq pbyKFLlXdO1tOMD1O7RohaRmOTx2u3kJXOM1QXWTgv6Nv8uP3xCRn9q3GpscEy0zXK4EiCjg5ghhw LBDlumnaV5TA4fW9aJidsjwX6axaAsKLJJQirM+OhjT7TBHi7fNBQHQ28sgOHsjN9UUxWICSv6aA4 oVjD/hiUr7HHxoVVft3A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1q4GIs-00GS12-0S; Wed, 31 May 2023 07:31:30 +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 1q4GIp-00GS09-2y for linux-arm-kernel@lists.infradead.org; Wed, 31 May 2023 07:31:29 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 7690F6374A; Wed, 31 May 2023 07:31:27 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D82B3C433D2; Wed, 31 May 2023 07:31:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1685518286; bh=HF7OKbXM2BGCGbyxMZ7v0Zp7UV6T2JLlyQvFgaWN0d8=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=kzdyDYEZfiGiN0E3Bfb41AdhWH/bZ+GihR4qv7iFZZOpaM37vhemeovJc7CHYOHl3 ILIFb7e/JXHSa9Wp9x9NHyi9uBeDyN1szHlxtfEdiWiUSxF9cbVrSBLLORDWxubf42 0EBSPI53J6WplbvxbfA7m8hPvC4W1yliWNo0i9ydim58+psQgJjb8y4xtqIGI7ZAKI T73sCIiUdCZPjfefrLflMNkkzncONG4UHDYqmIGcuLLxxlqNgQZpKqPphTR0j0gWGS bbCnfZhaToYXwJkq6Nc+N4ro6F5q+RtGr/+cKHA1Dva4QUA3g8dAf1O+04iEOK3iiV LQ8ru5FM44QMw== 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 1q4GIm-001Xqs-UU; Wed, 31 May 2023 08:31:25 +0100 Date: Wed, 31 May 2023 08:31:24 +0100 Message-ID: <86353dc5yr.wl-maz@kernel.org> From: Marc Zyngier To: Jing Zhang Cc: KVM , KVMARM , ARMLinux , Oliver Upton , Will Deacon , Paolo Bonzini , James Morse , Alexandru Elisei , Suzuki K Poulose , Fuad Tabba , Reiji Watanabe , Raghavendra Rao Ananta Subject: Re: [PATCH v10 5/5] KVM: arm64: Refactor writings for PMUVer/CSV2/CSV3 In-Reply-To: References: <20230522221835.957419-1-jingzhangos@google.com> <20230522221835.957419-6-jingzhangos@google.com> <87pm6kogx8.wl-maz@kernel.org> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/28.2 (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: jingzhangos@google.com, kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, oupton@google.com, 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 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-20230531_003128_045379_8FCAF38A X-CRM114-Status: GOOD ( 40.82 ) 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 T24gVHVlLCAzMCBNYXkgMjAyMyAyMjoxODowNCArMDEwMCwKSmluZyBaaGFuZyA8amluZ3poYW5n b3NAZ29vZ2xlLmNvbT4gd3JvdGU6Cj4gCj4gSGkgTWFyYywKPiAKPiBPbiBTdW4sIE1heSAyOCwg MjAyMyBhdCA0OjA14oCvQU0gTWFyYyBaeW5naWVyIDxtYXpAa2VybmVsLm9yZz4gd3JvdGU6Cj4g Pgo+ID4gT24gTW9uLCAyMiBNYXkgMjAyMyAyMzoxODozNSArMDEwMCwKPiA+IEppbmcgWmhhbmcg PGppbmd6aGFuZ29zQGdvb2dsZS5jb20+IHdyb3RlOgo+ID4gPgo+ID4gPiBSZWZhY3RvciB3cml0 aW5ncyBmb3IgSURfQUE2NFBGUjBfRUwxLltDU1YyfENTVjNdLAo+ID4gPiBJRF9BQTY0REZSMF9F TDEuUE1VVmVyIGFuZCBJRF9ERlIwX0VMRi5QZXJmTW9uIGJhc2VkIG9uIHV0aWxpdGllcwo+ID4g PiBzcGVjaWZpYyB0byBJRCByZWdpc3Rlci4KPiA+ID4KPiA+ID4gU2lnbmVkLW9mZi1ieTogSmlu ZyBaaGFuZyA8amluZ3poYW5nb3NAZ29vZ2xlLmNvbT4KPiA+ID4gLS0tCj4gPiA+ICBhcmNoL2Fy bTY0L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaCB8ICAgMSArCj4gPiA+ICBhcmNoL2FybTY0L2tl cm5lbC9jcHVmZWF0dXJlLmMgICAgICB8ICAgMiArLQo+ID4gPiAgYXJjaC9hcm02NC9rdm0vc3lz X3JlZ3MuYyAgICAgICAgICAgfCAzNjUgKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLQo+ID4g PiAgMyBmaWxlcyBjaGFuZ2VkLCAyNDMgaW5zZXJ0aW9ucygrKSwgMTI1IGRlbGV0aW9ucygtKQo+ ID4KPiA+IFJlYWRpbmcgdGhlIHJlc3VsdCBhZnRlciBhcHBseWluZyB0aGlzIHNlcmllcywgSSBm ZWVsIGxpa2UgYSBzdHVjawo+ID4gcmVjb3JkLiBUaGlzIGZpbmFsIHNlcmllcyBzdGlsbCBjb250 YWlucyBnZW1zIGxpa2UgdGhpczoKPiA+Cj4gPiBzdGF0aWMgaW50IHNldF9pZF9hYTY0cGZyMF9l bDEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGNvbnN0IHN0cnVjdCBzeXNfcmVnX2Rlc2MgKnJkLAo+ID4gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHU2NCB2YWwpCj4gPiB7Cj4gPiAgICAgICAgIHU4IGNzdjIsIGNzdjM7Cj4g Pgo+ID4gICAgICAgICAvKgo+ID4gICAgICAgICAgKiBBbGxvdyBBQTY0UEZSMF9FTDEuQ1NWMiB0 byBiZSBzZXQgZnJvbSB1c2Vyc3BhY2UgYXMgbG9uZyBhcwo+ID4gICAgICAgICAgKiBpdCBkb2Vz bid0IHByb21pc2UgbW9yZSB0aGFuIHdoYXQgaXMgYWN0dWFsbHkgcHJvdmlkZWQgKHRoZQo+ID4g ICAgICAgICAgKiBndWVzdCBjb3VsZCBvdGhlcndpc2UgYmUgY292ZXJlZCBpbiBlY3RvcGxhc21p YyByZXNpZHVlKS4KPiA+ICAgICAgICAgICovCj4gPiAgICAgICAgIGNzdjIgPSBjcHVpZF9mZWF0 dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQodmFsLCBJRF9BQTY0UEZSMF9FTDFfQ1NWMl9TSElG VCk7Cj4gPiAgICAgICAgIGlmIChjc3YyID4gMSB8fAo+ID4gICAgICAgICAgICAgKGNzdjIgJiYg YXJtNjRfZ2V0X3NwZWN0cmVfdjJfc3RhdGUoKSAhPSBTUEVDVFJFX1VOQUZGRUNURUQpKQo+ID4g ICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4KPiA+ICAgICAgICAgLyogU2FtZSB0 aGluZyBmb3IgQ1NWMyAqLwo+ID4gICAgICAgICBjc3YzID0gY3B1aWRfZmVhdHVyZV9leHRyYWN0 X3Vuc2lnbmVkX2ZpZWxkKHZhbCwgSURfQUE2NFBGUjBfRUwxX0NTVjNfU0hJRlQpOwo+ID4gICAg ICAgICBpZiAoY3N2MyA+IDEgfHwKPiA+ICAgICAgICAgICAgIChjc3YzICYmIGFybTY0X2dldF9t ZWx0ZG93bl9zdGF0ZSgpICE9IFNQRUNUUkVfVU5BRkZFQ1RFRCkpCj4gPiAgICAgICAgICAgICAg ICAgcmV0dXJuIC1FSU5WQUw7Cj4gPgo+ID4gICAgICAgICByZXR1cm4gc2V0X2lkX3JlZyh2Y3B1 LCByZCwgdmFsKTsKPiA+IH0KPiA+Cj4gPiBXaHkgZG8gd2UgaGF2ZSB0aGlzPyBJJ3ZlIGFza2Vk IHRoZSBxdWVzdGlvbiBhdCBsZWFzdCAzIHRpbWVzIGluIHRoZQo+ID4gcHJldmlvdXMgdmVyc2lv bnMsIGFuZCBJIHN0aWxsIHNlZSB0aGUgc2FtZSBjb2RlLgo+ID4KPiA+IElmIHdlIGhhdmUgc2Fu ZSBsaW1pdHMsIHRoZSBjYWxsIHRvIGFybTY0X2NoZWNrX2ZlYXR1cmVzKCkgaW4KPiA+IHNldF9p ZF9yZWcoKSB3aWxsIGNhdGNoIHRoZSBpbGxlZ2FsIHdyaXRlLiBTbyB3aHkgZG8gd2UgaGF2ZSB0 aGlzIGF0Cj4gPiBhbGw/IFRoZSB3aG9sZSBwb2ludCBvZiB0aGUgZXhlcmNpc2Ugd2FzIHRvIHVu aWZ5IHRoZSBoYW5kbGluZy4gQnV0Cj4gPiB5b3UncmUgYWN0dWFsbHkgbWFraW5nIGl0IHdvcnNl Lgo+ID4KPiA+IFNvIHdoYXQncyB0aGUgY2F0Y2g/Cj4gU29ycnksIEkgYW0gb25seSBhd2FyZSBv ZiBvbmUgZGlzY3Vzc2lvbiBvZiB0aGlzIGNvZGUgaW4gdjguIFRoZQo+IHJlYXNvbiBJIHN0aWxs IGtlZXAgdGhlIGNoZWNrIGhlcmUgaXMgdGhhdCB0aGUgYXJtNjRfY2hlY2tfZmVhdHVyZXMoKQo+ IGNhbiBub3QgY2F0Y2ggYWxsIGlsbGVnYWwgd3JpdGVzIGFzIHRoaXMgY29kZSBkb2VzLgo+IEZv ciBleGFtcGxlLCBmb3IgQ1NWMiwgb25lIGNvbmNlcm4gaXM6Cj4gV2hlbiBhcm02NF9nZXRfc3Bl Y3RyZV92Ml9zdGF0ZSgpICE9IFNQRUNUUkVfVU5BRkZFQ1RFRCwgdGhpcyBjb2RlCj4gb25seSBh bGxvd3MgZ3Vlc3QgQ1NWMiB0byBiZSBzZXQgdG8gMCwgYW55IG5vbi16ZXJvIHZhbHVlIHdvdWxk IGxlYWQKPiB0byAtRUlOVkFMLiBJZiB3ZSByZW1vdmUgdGhlIGNoZWNrIGhlcmUsIHRoZSBndWVz dCBDU1YyIGNhbiBiZSBzZXQgdG8KPiBhbnkgdmFsdWUgbG93ZXIgb3IgZXF1YWwgdG8gaG9zdCBD U1YyLgoKU29ycnksIHRoaXMgZG9lc24ndCBtYWtlIHNlbnNlLiBMb3dlciBpcyBhbHdheXMgZmlu ZS4gSWYgeW91IG1lYW50CidoaWdoZXInLCB0aGVuIEkgYWdyZWUgdGhhdCBpdCB3b3VsZCBiZSBi YWQuIEJ1dCB0aGF0IGRvZXNuJ3QgbWFrZQprZWVwaW5nIHRoaXMgY29kZSB0aGUgcmlnaHQgb3V0 Y29tZS4KCj4gT2YgY291cnNlLCB3ZSBjYW4gc2V0IHRoZSBzYW5lIGxpbWl0IG9mIENTVjIgdG8g MCB3aGVuCj4gYXJtNjRfZ2V0X3NwZWN0cmVfdjJfc3RhdGUoKSAhPSBTUEVDVFJFX1VOQUZGRUNU RUQgaW4KPiByZWFkX3Nhbml0aXNlZF9pZF9hYTY0cGZyMF9lbDEoKS4gVGhlbiB3ZSBjYW4gcmVt b3ZlIGFsbCB0aGUgY2hlY2tzCj4gaGVyZSBhbmQgbm8gc3BlY2lmaWMgc2V0X2lkIGZ1bmN0aW9u IGZvciBBQTY0UEZSMF9FTDEgaXMgbmVlZGVkLgoKVGhpcyBpcyB3aGF0IEkgaGF2ZSBiZWVuIGFz a2luZyBmb3IgYWxsIGFsb25nOiB0aGUgInNhbml0aXNlZCIgdmlldyBvZgp0aGUgcmVnaXN0ZXIg Km11c3QqIHJldHVybiB0aGUgYWJzb2x1dGUgbGltaXQgZm9yIHRoZSBmaWVsZHMgdGhhdCBhcmUK ZmxhZ2dlZCBhcyB3cml0YWJsZSBieSAibWFzayIuCgpJZiB3ZSBuZWVkIGV4dHJhIGNvZGUsIHRo ZW4gc29tZXRoaW5nIGlzIHJlYWxseSB3cm9uZy4gVGhlIGNvcmUKZmVhdHVyZSBjb2RlIG1hbmFn ZXMgdGhhdCB3aXRob3V0IGFueSBzcGVjaWFsIGNhc2luZywgYW5kIHdlIHNob3VsZCBiZQphYmxl IHRvIHJlYWNoIHRoZSBzYW1lIGxldmVsLgoKVGhhbmtzLAoKCU0uCgotLSAKV2l0aG91dCBkZXZp YXRpb24gZnJvbSB0aGUgbm9ybSwgcHJvZ3Jlc3MgaXMgbm90IHBvc3NpYmxlLgoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBt YWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9s aXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=