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 B881BC6FD1D for ; Thu, 30 Mar 2023 20:21:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229756AbjC3UVL convert rfc822-to-8bit (ORCPT ); Thu, 30 Mar 2023 16:21:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58158 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229755AbjC3UVJ (ORCPT ); Thu, 30 Mar 2023 16:21:09 -0400 Received: from gloria.sntech.de (gloria.sntech.de [185.11.138.130]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CC00440D3; Thu, 30 Mar 2023 13:21:06 -0700 (PDT) Received: from ip4d1634d3.dynamic.kabel-deutschland.de ([77.22.52.211] helo=diego.localnet) by gloria.sntech.de with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1phylD-0006W9-Vs; Thu, 30 Mar 2023 22:20:40 +0200 From: Heiko =?ISO-8859-1?Q?St=FCbner?= To: Arnd Bergmann , Evan Green Cc: Palmer Dabbelt , Conor Dooley , slewis@rivosinc.com, Vineet Gupta , Albert Ou , Andrew Bresticker , Andrew Jones , Anup Patel , Atish Patra , Bagas Sanjaya , Celeste Liu , "Conor.Dooley" , guoren , Jonathan Corbet , Niklas Cassel , Palmer Dabbelt , Paul Walmsley , Randy Dunlap , Ruizhe Pan , Sunil V L , Tobias Klauser , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org Subject: Re: [PATCH v3 2/7] RISC-V: Add a syscall for HW probing Date: Thu, 30 Mar 2023 22:20:38 +0200 Message-ID: <6540574.4vTCxPXJkl@diego> In-Reply-To: References: <20230221190858.3159617-1-evan@rivosinc.com> <605fb2fd-bda2-4922-92bf-e3e416d54398@app.fastmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8BIT Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-doc@vger.kernel.org Am Donnerstag, 30. März 2023, 20:30:29 CEST schrieb Evan Green: > On Thu, Feb 23, 2023 at 2:06 AM Arnd Bergmann wrote: > > > > On Tue, Feb 21, 2023, at 20:08, Evan Green wrote: > > > We don't have enough space for these all in ELF_HWCAP{,2} and there's no > > > system call that quite does this, so let's just provide an arch-specific > > > one to probe for hardware capabilities. This currently just provides > > > m{arch,imp,vendor}id, but with the key-value pairs we can pass more in > > > the future. > > > > > > Co-developed-by: Palmer Dabbelt > > > Signed-off-by: Palmer Dabbelt > > > Signed-off-by: Evan Green > > > > I'm still skeptical about the need for a custom syscall interface here. > > I had not looked at the interface so far, but there are a few things > > that stick out: > > > > > +RISC-V Hardware Probing Interface > > > +--------------------------------- > > > + > > > +The RISC-V hardware probing interface is based around a single > > > syscall, which > > > +is defined in :: > > > + > > > + struct riscv_hwprobe { > > > + __s64 key; > > > + __u64 value; > > > + }; > > > > The way this is defined, the kernel will always have to know > > about the specific set of features, it can't just forward > > unknown features to user space after probing them from an > > architectured hardware interface or from DT. > > You're correct that this interface wasn't intended to have usermode > come in with augmented data or additional key/value pairs. This was > purely meant to provide access to the kernel's repository of > architectural and microarchitectural details. If usermode wants to > provide extra info in this same form, maybe they could wrap this > interface. > > > If 'key' is just an enumerated value with a small number of > > possible values, I don't see anything wrong with using elf > > aux data. I understand it's hard to know how many keys > > might be needed in the long run, from the way you define > > the key/value pairs here, I would expect it to have a lot > > of the same limitations that the aux data has, except for > > a few bytes to be copied. > > Correct, this makes allocating bits out of here cheaper by not > requiring that we actively copy them into every new process forever. > You're right that the aux vector would work as well, but the thinking > behind this series was that an interface like this might be better for > an architecture as extensible as risc-v. What would be the ramifications of defining some sort of vdso-like data-structure and just putting the address into AT_HWCAP2 ? (similar to what vdso does) - that could then even be re-usable with other OS kernels. And would also save declaring numerous new AT_* keys. Because there are already nearly 130 standard extensions and vendors are allowed to defines their own as well, and we will probably also want to tell userspace about them. Heiko > > > + long sys_riscv_hwprobe(struct riscv_hwprobe *pairs, size_t > > > pair_count, > > > + size_t cpu_count, cpu_set_t *cpus, > > > + unsigned long flags); > > > > The cpu set argument worries me more: there should never be a > > need to optimize for broken hardware that has an asymmetric set > > of features. Just let the kernel figure out the minimum set > > of features that works across all CPUs and report that like we > > do with HWCAP. If there is a SoC that is so broken that it has > > important features on a subset of cores that some user might > > actually want to rely on, then have them go through the slow > > sysfs interface for probing the CPUs indidually, but don't make > > the broken case easier at the expense of normal users that > > run on working hardware. > > I'm not so sure. While I agree with you for major classes of features > (eg one CPU has floating point support but another does not), I expect > these bits to contain more subtle details as well, which might vary > across asymmetric implementations without breaking ABI compatibility > per-se. Maybe some vendor has implemented exotic video decoding > acceleration instructions that only work on the big core. Or maybe the > big cores support v3.1 of some extension (where certain things run > faster), but the little cores only have v3.0, where it's a little > slower. Certain apps would likely want to know these things so they > can allocate their work optimally across cores. > > > > > > +asmlinkage long sys_riscv_hwprobe(uintptr_t, uintptr_t, uintptr_t, > > > uintptr_t, > > > + uintptr_t, uintptr_t); > > > > Why 'uintptr_t' rather than the correct type? > > Fixed. > -Evan > 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 9B817C7619A for ; Thu, 30 Mar 2023 20:21:18 +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:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=pl7xlS3EG/5n8jcfG3Wblyp0nZ0x/ZK9wfncoshnRsM=; b=CN21776u0DHwor Kjokh+XACeUrfjeqGGZxlQfiS85A3XwG3BhpcHA4xOnqCkY1YfryCcDg8nid7nqlD4mRqkHsfj84P SR2aSRh5PIAedvJrXSvsgbns2QfrhfJ3nYYSTQLppK7nLN76NekX9xvyVMCgsLGZRucaZnFqfJILJ qVlDP8jLcLXOASsZYcEbiKDBq1aFGC+8A7klUZmllv7lm+IWGkrCOCaPznP0I+svqhIz37IKRbe+/ rM1C2joFtmEUkoniKVKXLlZ89wsKNBhojWtet2/5ZiRdfnt6mPirs7Zvpum8BCPsxpqMjcA8b4Z7/ cSxemMp0BZAQlwGTB1Qg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1phylg-004zsg-35; Thu, 30 Mar 2023 20:21:08 +0000 Received: from gloria.sntech.de ([185.11.138.130]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1phyld-004zsI-31 for linux-riscv@lists.infradead.org; Thu, 30 Mar 2023 20:21:07 +0000 Received: from ip4d1634d3.dynamic.kabel-deutschland.de ([77.22.52.211] helo=diego.localnet) by gloria.sntech.de with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1phylD-0006W9-Vs; Thu, 30 Mar 2023 22:20:40 +0200 From: Heiko =?ISO-8859-1?Q?St=FCbner?= To: Arnd Bergmann , Evan Green Subject: Re: [PATCH v3 2/7] RISC-V: Add a syscall for HW probing Date: Thu, 30 Mar 2023 22:20:38 +0200 Message-ID: <6540574.4vTCxPXJkl@diego> In-Reply-To: References: <20230221190858.3159617-1-evan@rivosinc.com> <605fb2fd-bda2-4922-92bf-e3e416d54398@app.fastmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230330_132105_971499_434E25E7 X-CRM114-Status: GOOD ( 46.88 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Niklas Cassel , slewis@rivosinc.com, linux-doc@vger.kernel.org, Andrew Bresticker , Atish Patra , Palmer Dabbelt , "Conor.Dooley" , Celeste Liu , Bagas Sanjaya , linux-riscv@lists.infradead.org, Jonathan Corbet , Tobias Klauser , Andrew Jones , Albert Ou , Vineet Gupta , Paul Walmsley , Ruizhe Pan , Anup Patel , Randy Dunlap , linux-kernel@vger.kernel.org, Conor Dooley , Palmer Dabbelt , guoren Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org QW0gRG9ubmVyc3RhZywgMzAuIE3DpHJ6IDIwMjMsIDIwOjMwOjI5IENFU1Qgc2NocmllYiBFdmFu IEdyZWVuOgo+IE9uIFRodSwgRmViIDIzLCAyMDIzIGF0IDI6MDbigK9BTSBBcm5kIEJlcmdtYW5u IDxhcm5kQGFybmRiLmRlPiB3cm90ZToKPiA+Cj4gPiBPbiBUdWUsIEZlYiAyMSwgMjAyMywgYXQg MjA6MDgsIEV2YW4gR3JlZW4gd3JvdGU6Cj4gPiA+IFdlIGRvbid0IGhhdmUgZW5vdWdoIHNwYWNl IGZvciB0aGVzZSBhbGwgaW4gRUxGX0hXQ0FQeywyfSBhbmQgdGhlcmUncyBubwo+ID4gPiBzeXN0 ZW0gY2FsbCB0aGF0IHF1aXRlIGRvZXMgdGhpcywgc28gbGV0J3MganVzdCBwcm92aWRlIGFuIGFy Y2gtc3BlY2lmaWMKPiA+ID4gb25lIHRvIHByb2JlIGZvciBoYXJkd2FyZSBjYXBhYmlsaXRpZXMu ICBUaGlzIGN1cnJlbnRseSBqdXN0IHByb3ZpZGVzCj4gPiA+IG17YXJjaCxpbXAsdmVuZG9yfWlk LCBidXQgd2l0aCB0aGUga2V5LXZhbHVlIHBhaXJzIHdlIGNhbiBwYXNzIG1vcmUgaW4KPiA+ID4g dGhlIGZ1dHVyZS4KPiA+ID4KPiA+ID4gQ28tZGV2ZWxvcGVkLWJ5OiBQYWxtZXIgRGFiYmVsdCA8 cGFsbWVyQHJpdm9zaW5jLmNvbT4KPiA+ID4gU2lnbmVkLW9mZi1ieTogUGFsbWVyIERhYmJlbHQg PHBhbG1lckByaXZvc2luYy5jb20+Cj4gPiA+IFNpZ25lZC1vZmYtYnk6IEV2YW4gR3JlZW4gPGV2 YW5Acml2b3NpbmMuY29tPgo+ID4KPiA+IEknbSBzdGlsbCBza2VwdGljYWwgYWJvdXQgdGhlIG5l ZWQgZm9yIGEgY3VzdG9tIHN5c2NhbGwgaW50ZXJmYWNlIGhlcmUuCj4gPiBJIGhhZCBub3QgbG9v a2VkIGF0IHRoZSBpbnRlcmZhY2Ugc28gZmFyLCBidXQgdGhlcmUgYXJlIGEgZmV3IHRoaW5ncwo+ ID4gdGhhdCBzdGljayBvdXQ6Cj4gPgo+ID4gPiArUklTQy1WIEhhcmR3YXJlIFByb2JpbmcgSW50 ZXJmYWNlCj4gPiA+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiA+ID4gKwo+ ID4gPiArVGhlIFJJU0MtViBoYXJkd2FyZSBwcm9iaW5nIGludGVyZmFjZSBpcyBiYXNlZCBhcm91 bmQgYSBzaW5nbGUKPiA+ID4gc3lzY2FsbCwgd2hpY2gKPiA+ID4gK2lzIGRlZmluZWQgaW4gPGFz bS9od3Byb2JlLmg+OjoKPiA+ID4gKwo+ID4gPiArICAgIHN0cnVjdCByaXNjdl9od3Byb2JlIHsK PiA+ID4gKyAgICAgICAgX19zNjQga2V5Owo+ID4gPiArICAgICAgICBfX3U2NCB2YWx1ZTsKPiA+ ID4gKyAgICB9Owo+ID4KPiA+IFRoZSB3YXkgdGhpcyBpcyBkZWZpbmVkLCB0aGUga2VybmVsIHdp bGwgYWx3YXlzIGhhdmUgdG8ga25vdwo+ID4gYWJvdXQgdGhlIHNwZWNpZmljIHNldCBvZiBmZWF0 dXJlcywgaXQgY2FuJ3QganVzdCBmb3J3YXJkCj4gPiB1bmtub3duIGZlYXR1cmVzIHRvIHVzZXIg c3BhY2UgYWZ0ZXIgcHJvYmluZyB0aGVtIGZyb20gYW4KPiA+IGFyY2hpdGVjdHVyZWQgaGFyZHdh cmUgaW50ZXJmYWNlIG9yIGZyb20gRFQuCj4gCj4gWW91J3JlIGNvcnJlY3QgdGhhdCB0aGlzIGlu dGVyZmFjZSB3YXNuJ3QgaW50ZW5kZWQgdG8gaGF2ZSB1c2VybW9kZQo+IGNvbWUgaW4gd2l0aCBh dWdtZW50ZWQgZGF0YSBvciBhZGRpdGlvbmFsIGtleS92YWx1ZSBwYWlycy4gVGhpcyB3YXMKPiBw dXJlbHkgbWVhbnQgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGtlcm5lbCdzIHJlcG9zaXRvcnkg b2YKPiBhcmNoaXRlY3R1cmFsIGFuZCBtaWNyb2FyY2hpdGVjdHVyYWwgZGV0YWlscy4gSWYgdXNl cm1vZGUgd2FudHMgdG8KPiBwcm92aWRlIGV4dHJhIGluZm8gaW4gdGhpcyBzYW1lIGZvcm0sIG1h eWJlIHRoZXkgY291bGQgd3JhcCB0aGlzCj4gaW50ZXJmYWNlLgo+Cj4gPiBJZiAna2V5JyBpcyBq dXN0IGFuIGVudW1lcmF0ZWQgdmFsdWUgd2l0aCBhIHNtYWxsIG51bWJlciBvZgo+ID4gcG9zc2li bGUgdmFsdWVzLCBJIGRvbid0IHNlZSBhbnl0aGluZyB3cm9uZyB3aXRoIHVzaW5nIGVsZgo+ID4g YXV4IGRhdGEuIEkgdW5kZXJzdGFuZCBpdCdzIGhhcmQgdG8ga25vdyBob3cgbWFueSBrZXlzCj4g PiBtaWdodCBiZSBuZWVkZWQgaW4gdGhlIGxvbmcgcnVuLCBmcm9tIHRoZSB3YXkgeW91IGRlZmlu ZQo+ID4gdGhlIGtleS92YWx1ZSBwYWlycyBoZXJlLCBJIHdvdWxkIGV4cGVjdCBpdCB0byBoYXZl IGEgbG90Cj4gPiBvZiB0aGUgc2FtZSBsaW1pdGF0aW9ucyB0aGF0IHRoZSBhdXggZGF0YSBoYXMs IGV4Y2VwdCBmb3IKPiA+IGEgZmV3IGJ5dGVzIHRvIGJlIGNvcGllZC4KPiAKPiBDb3JyZWN0LCB0 aGlzIG1ha2VzIGFsbG9jYXRpbmcgYml0cyBvdXQgb2YgaGVyZSBjaGVhcGVyIGJ5IG5vdAo+IHJl cXVpcmluZyB0aGF0IHdlIGFjdGl2ZWx5IGNvcHkgdGhlbSBpbnRvIGV2ZXJ5IG5ldyBwcm9jZXNz IGZvcmV2ZXIuCj4gWW91J3JlIHJpZ2h0IHRoYXQgdGhlIGF1eCB2ZWN0b3Igd291bGQgd29yayBh cyB3ZWxsLCBidXQgdGhlIHRoaW5raW5nCj4gYmVoaW5kIHRoaXMgc2VyaWVzIHdhcyB0aGF0IGFu IGludGVyZmFjZSBsaWtlIHRoaXMgbWlnaHQgYmUgYmV0dGVyIGZvcgo+IGFuIGFyY2hpdGVjdHVy ZSBhcyBleHRlbnNpYmxlIGFzIHJpc2Mtdi4KCldoYXQgd291bGQgYmUgdGhlIHJhbWlmaWNhdGlv bnMgb2YgZGVmaW5pbmcgc29tZSBzb3J0IG9mIHZkc28tbGlrZQpkYXRhLXN0cnVjdHVyZSBhbmQg anVzdCBwdXR0aW5nIHRoZSBhZGRyZXNzIGludG8gQVRfSFdDQVAyID8KKHNpbWlsYXIgdG8gd2hh dCB2ZHNvIGRvZXMpIC0gdGhhdCBjb3VsZCB0aGVuIGV2ZW4gYmUgcmUtdXNhYmxlCndpdGggb3Ro ZXIgT1Mga2VybmVscy4KCkFuZCB3b3VsZCBhbHNvIHNhdmUgZGVjbGFyaW5nIG51bWVyb3VzIG5l dyBBVF8qIGtleXMuCgoKQmVjYXVzZSB0aGVyZSBhcmUgYWxyZWFkeSBuZWFybHkgMTMwIHN0YW5k YXJkIGV4dGVuc2lvbnMgYW5kIHZlbmRvcnMKYXJlIGFsbG93ZWQgdG8gZGVmaW5lcyB0aGVpciBv d24gYXMgd2VsbCwgYW5kIHdlIHdpbGwgcHJvYmFibHkgYWxzbyB3YW50CnRvIHRlbGwgdXNlcnNw YWNlIGFib3V0IHRoZW0uCgoKSGVpa28KCgo+ID4gPiArICAgIGxvbmcgc3lzX3Jpc2N2X2h3cHJv YmUoc3RydWN0IHJpc2N2X2h3cHJvYmUgKnBhaXJzLCBzaXplX3QKPiA+ID4gcGFpcl9jb3VudCwK PiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjcHVfY291bnQsIGNwdV9z ZXRfdCAqY3B1cywKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxv bmcgZmxhZ3MpOwo+ID4KPiA+IFRoZSBjcHUgc2V0IGFyZ3VtZW50IHdvcnJpZXMgbWUgbW9yZTog dGhlcmUgc2hvdWxkIG5ldmVyIGJlIGEKPiA+IG5lZWQgdG8gb3B0aW1pemUgZm9yIGJyb2tlbiBo YXJkd2FyZSB0aGF0IGhhcyBhbiBhc3ltbWV0cmljIHNldAo+ID4gb2YgZmVhdHVyZXMuIEp1c3Qg bGV0IHRoZSBrZXJuZWwgZmlndXJlIG91dCB0aGUgbWluaW11bSBzZXQKPiA+IG9mIGZlYXR1cmVz IHRoYXQgd29ya3MgYWNyb3NzIGFsbCBDUFVzIGFuZCByZXBvcnQgdGhhdCBsaWtlIHdlCj4gPiBk byB3aXRoIEhXQ0FQLiBJZiB0aGVyZSBpcyBhIFNvQyB0aGF0IGlzIHNvIGJyb2tlbiB0aGF0IGl0 IGhhcwo+ID4gaW1wb3J0YW50IGZlYXR1cmVzIG9uIGEgc3Vic2V0IG9mIGNvcmVzIHRoYXQgc29t ZSB1c2VyIG1pZ2h0Cj4gPiBhY3R1YWxseSB3YW50IHRvIHJlbHkgb24sIHRoZW4gaGF2ZSB0aGVt IGdvIHRocm91Z2ggdGhlIHNsb3cKPiA+IHN5c2ZzIGludGVyZmFjZSBmb3IgcHJvYmluZyB0aGUg Q1BVcyBpbmRpZHVhbGx5LCBidXQgZG9uJ3QgbWFrZQo+ID4gdGhlIGJyb2tlbiBjYXNlIGVhc2ll ciBhdCB0aGUgZXhwZW5zZSBvZiBub3JtYWwgdXNlcnMgdGhhdAo+ID4gcnVuIG9uIHdvcmtpbmcg aGFyZHdhcmUuCj4gCj4gSSdtIG5vdCBzbyBzdXJlLiBXaGlsZSBJIGFncmVlIHdpdGggeW91IGZv ciBtYWpvciBjbGFzc2VzIG9mIGZlYXR1cmVzCj4gKGVnIG9uZSBDUFUgaGFzIGZsb2F0aW5nIHBv aW50IHN1cHBvcnQgYnV0IGFub3RoZXIgZG9lcyBub3QpLCBJIGV4cGVjdAo+IHRoZXNlIGJpdHMg dG8gY29udGFpbiBtb3JlIHN1YnRsZSBkZXRhaWxzIGFzIHdlbGwsIHdoaWNoIG1pZ2h0IHZhcnkK PiBhY3Jvc3MgYXN5bW1ldHJpYyBpbXBsZW1lbnRhdGlvbnMgd2l0aG91dCBicmVha2luZyBBQkkg Y29tcGF0aWJpbGl0eQo+IHBlci1zZS4gTWF5YmUgc29tZSB2ZW5kb3IgaGFzIGltcGxlbWVudGVk IGV4b3RpYyB2aWRlbyBkZWNvZGluZwo+IGFjY2VsZXJhdGlvbiBpbnN0cnVjdGlvbnMgdGhhdCBv bmx5IHdvcmsgb24gdGhlIGJpZyBjb3JlLiBPciBtYXliZSB0aGUKPiBiaWcgY29yZXMgc3VwcG9y dCB2My4xIG9mIHNvbWUgZXh0ZW5zaW9uICh3aGVyZSBjZXJ0YWluIHRoaW5ncyBydW4KPiBmYXN0 ZXIpLCBidXQgdGhlIGxpdHRsZSBjb3JlcyBvbmx5IGhhdmUgdjMuMCwgd2hlcmUgaXQncyBhIGxp dHRsZQo+IHNsb3dlci4gQ2VydGFpbiBhcHBzIHdvdWxkIGxpa2VseSB3YW50IHRvIGtub3cgdGhl c2UgdGhpbmdzIHNvIHRoZXkKPiBjYW4gYWxsb2NhdGUgdGhlaXIgd29yayBvcHRpbWFsbHkgYWNy b3NzIGNvcmVzLgo+IAo+ID4KPiA+ID4gK2FzbWxpbmthZ2UgbG9uZyBzeXNfcmlzY3ZfaHdwcm9i ZSh1aW50cHRyX3QsIHVpbnRwdHJfdCwgdWludHB0cl90LAo+ID4gPiB1aW50cHRyX3QsCj4gPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90LCB1aW50cHRyX3QpOwo+ ID4KPiA+IFdoeSAndWludHB0cl90JyByYXRoZXIgdGhhbiB0aGUgY29ycmVjdCB0eXBlPwo+IAo+ IEZpeGVkLgo+IC1FdmFuCj4gCgoKCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3Rz LmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1yaXNjdgo=