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 95130E571; Mon, 9 Jun 2025 19:49:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749498547; cv=none; b=OSE0ZctC5bAodMo8c/rzs/feOcJxKgWJTkFAtXLr4NLHRyH/irA4/+Cw6wYoHhOK7hxDyfjy37kQBGstFJQsSSGZhJ+0V26jdkxaTEd6im0i8H7rEcePW79JMATlSmU0g1IjpJ+aXXIOBILF/NJnTijI+ITJzIdyOJHpxEc80oU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749498547; c=relaxed/simple; bh=RLgUdqwZ9jil0fkdDSzWjVe6IIMp+UtbacVJeNotnRE=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=iaP/+uejKMhsVm9gy+qe/JNcxtBwZvQNbk56i9wsfZVSDkC21wpUUqVaL32cHaNYpSkxQOccpAK24GEsKrBred6Oq3FVApxHjS+PLJJPszdz0g8HKhj5RGK4lcIZJSUAN8H9iN0M5YL3E8EAP9Zcwr7feMIjhWYEiHup4CSZ6Zs= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QK55junN; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="QK55junN" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B5945C4CEEB; Mon, 9 Jun 2025 19:49:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1749498547; bh=RLgUdqwZ9jil0fkdDSzWjVe6IIMp+UtbacVJeNotnRE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=QK55junN0VbW2TGQ60ZqBGWYViH46R3lRyu4gUydEyY+Hh3KaitiLfFEvBnWI1r1X lRkAy+lEDKGHHODwZuKXmXjD3bma7Uo1p9YeuJDFpOg4S9P5g+Xcg0SSU2vvttcHI9 4lR9wO8MNIVxc41xXD74pTH5t5lC3rxHs3ajYv7zAHTC7u7F8taQisrWv24jWv6eEY NAMjDv3elM0fob7CfJw9CVKzwDdg4KQs5dEb5YS6zjc++7S4SPPwQj4A+dAgJwJgOn FVNqVUnGBa5/HSJl7pxNXInlROg8XV9V78mjoJUj00SM7blrPSGCR341rm1XL707q3 l5n84gNAl0U8g== Date: Mon, 9 Jun 2025 12:48:45 -0700 From: Eric Biggers To: Julian Calaby Cc: linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org, linux-arm-kernel@lists.infradead.org, loongarch@lists.linux.dev, linux-mips@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, sparclinux@vger.kernel.org, x86@kernel.org, linux-arch@vger.kernel.org, Ard Biesheuvel , "Jason A . Donenfeld" , Linus Torvalds Subject: Re: [PATCH v2 00/12] lib/crc: improve how arch-optimized code is integrated Message-ID: <20250609194845.GC1255@sol> References: <20250607200454.73587-1-ebiggers@kernel.org> Precedence: bulk X-Mailing-List: linux-arch@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Mon, Jun 09, 2025 at 06:15:24PM +1000, Julian Calaby wrote: > Hi Eric, > > On Sun, Jun 8, 2025 at 6:07 AM Eric Biggers wrote: > > > > This series is also available at: > > > > git fetch https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git lib-crc-arch-v2 > > > > This series improves how lib/crc supports arch-optimized code. First, > > instead of the arch-optimized CRC code being in arch/$(SRCARCH)/lib/, it > > will now be in lib/crc/$(SRCARCH)/. Second, the API functions (e.g. > > crc32c()), arch-optimized functions (e.g. crc32c_arch()), and generic > > functions (e.g. crc32c_base()) will now be part of a single module for > > each CRC type, allowing better inlining and dead code elimination. The > > second change is made possible by the first. > > > > As an example, consider CONFIG_CRC32=m on x86. We'll now have just > > crc32.ko instead of both crc32-x86.ko and crc32.ko. The two modules > > were already coupled together and always both got loaded together via > > direct symbol dependency, so the separation provided no benefit. > > > > Note: later I'd like to apply the same design to lib/crypto/ too, where > > often the API functions are out-of-line so this will work even better. > > In those cases, for each algorithm we currently have 3 modules all > > coupled together, e.g. libsha256.ko, libsha256-generic.ko, and > > sha256-x86.ko. We should have just one, inline things properly, and > > rely on the compiler's dead code elimination to decide the inclusion of > > the generic code instead of manually setting it via kconfig. > > > > Having arch-specific code outside arch/ was somewhat controversial when > > Zinc proposed it back in 2018. But I don't think the concerns are > > warranted. It's better from a technical perspective, as it enables the > > improvements mentioned above. This model is already successfully used > > in other places in the kernel such as lib/raid6/. The community of each > > architecture still remains free to work on the code, even if it's not in > > arch/. At the time there was also a desire to put the library code in > > the same files as the old-school crypto API, but that was a mistake; now > > that the library is separate, that's no longer a constraint either. > > Quick question, and apologies if this has been covered elsewhere. > > Why not just use choice blocks in Kconfig to choose the compiled-in > crc32 variant instead of this somewhat indirect scheme? > > This would keep the dependencies grouped by arch and provide a single place to > choose whether the generic or arch-specific method is used. It's not clear exactly what you're suggesting, but it sounds like you're complaining about this: config CRC32_ARCH bool depends on CRC32 && CRC_OPTIMIZATIONS default y if ARM && KERNEL_MODE_NEON default y if ARM64 default y if LOONGARCH default y if MIPS && CPU_MIPSR6 default y if PPC64 && ALTIVEC default y if RISCV && RISCV_ISA_ZBC default y if S390 default y if SPARC64 default y if X86 We could instead make each arch be responsible for selecting this from lib/crc/$(SRCARCH)/Kconfig, which lib/crc/Kconfig would then have to include. But I don't think the small bit of additional per-arch separation would be worth the extra complexity here. Something similar applies to lib/crc/Makefile too. This patchset strikes a balance where the vast majority of the arch-specific CRC code is isolated in lib/crc/$(SRCARCH), and the exceptions are just lib/crc/Makefile and lib/crc/Kconfig. I think these exceptions make sense, given that we're building a single module per CRC variant. We'd have to go through some hoops to isolate the arch-specific Kconfig and Makefile snippets into per-arch files, which don't seem worth it here IMO. > It would also allow for alternatives if that ever becomes a thing and If you mean one arch with multiple alternative implementations of a particular CRC variant, that already exists for many of the architectures. They just build in as many as can be, and the best one is chosen at boot or module load time. But that's existing behavior, unchanged by this patchset. > compile testing of the arch-specific variants if that even offers any > actual value. They all use instructions specific to the corresponding arch, so I don't think any of them would be compatible with COMPILE_TEST. - Eric 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 65653C5B552 for ; Mon, 9 Jun 2025 19:58:03 +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:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=N3aojEUIabbDyAbUvnQzCzgbLNZ0m+ID1t06hUrB/54=; b=TZoS6pB6JXF5p3 VwEWWRIFRfC80th3Tfksc5YnCZb/7g07CWYIyT9rkU5JOYCmzv/uxAqhBxDWDnrEB03HxquHvMTqI RihCIegYfYN6tKT7X8EzGy7EsG3KBOwC2xbNSybYG6q/9ArR7QGzwKHMdKjrsGrcjMSPTn2fclqnk kdx3IskZ8OEf23NOskHLuqij2ZSVTzRgi4Mm+dqzfZjjII/WygSLLxM1kAB/po8M8LIY7Qq6QdXHc 2ki/Tyv+mn7iWcuNW57E5OMDL90j8PnLR/QmRCMzGkFtuPmll/cljoH6OvvyBYPufjmRqk+4eKTxg fPyN8xt/L888uT5QJ7Jw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1uOid3-000000055zH-13L3; Mon, 09 Jun 2025 19:57:57 +0000 Received: from tor.source.kernel.org ([172.105.4.254]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1uOiUW-000000054hY-18xn; Mon, 09 Jun 2025 19:49:08 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 7E22E629DF; Mon, 9 Jun 2025 19:49:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B5945C4CEEB; Mon, 9 Jun 2025 19:49:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1749498547; bh=RLgUdqwZ9jil0fkdDSzWjVe6IIMp+UtbacVJeNotnRE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=QK55junN0VbW2TGQ60ZqBGWYViH46R3lRyu4gUydEyY+Hh3KaitiLfFEvBnWI1r1X lRkAy+lEDKGHHODwZuKXmXjD3bma7Uo1p9YeuJDFpOg4S9P5g+Xcg0SSU2vvttcHI9 4lR9wO8MNIVxc41xXD74pTH5t5lC3rxHs3ajYv7zAHTC7u7F8taQisrWv24jWv6eEY NAMjDv3elM0fob7CfJw9CVKzwDdg4KQs5dEb5YS6zjc++7S4SPPwQj4A+dAgJwJgOn FVNqVUnGBa5/HSJl7pxNXInlROg8XV9V78mjoJUj00SM7blrPSGCR341rm1XL707q3 l5n84gNAl0U8g== Date: Mon, 9 Jun 2025 12:48:45 -0700 From: Eric Biggers To: Julian Calaby Cc: linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org, linux-arm-kernel@lists.infradead.org, loongarch@lists.linux.dev, linux-mips@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, sparclinux@vger.kernel.org, x86@kernel.org, linux-arch@vger.kernel.org, Ard Biesheuvel , "Jason A . Donenfeld" , Linus Torvalds Subject: Re: [PATCH v2 00/12] lib/crc: improve how arch-optimized code is integrated Message-ID: <20250609194845.GC1255@sol> References: <20250607200454.73587-1-ebiggers@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: 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: , 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 T24gTW9uLCBKdW4gMDksIDIwMjUgYXQgMDY6MTU6MjRQTSArMTAwMCwgSnVsaWFuIENhbGFieSB3 cm90ZToKPiBIaSBFcmljLAo+IAo+IE9uIFN1biwgSnVuIDgsIDIwMjUgYXQgNjowN+KAr0FNIEVy aWMgQmlnZ2VycyA8ZWJpZ2dlcnNAa2VybmVsLm9yZz4gd3JvdGU6Cj4gPgo+ID4gVGhpcyBzZXJp ZXMgaXMgYWxzbyBhdmFpbGFibGUgYXQ6Cj4gPgo+ID4gICAgIGdpdCBmZXRjaCBodHRwczovL2dp dC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9lYmlnZ2Vycy9saW51eC5naXQg bGliLWNyYy1hcmNoLXYyCj4gPgo+ID4gVGhpcyBzZXJpZXMgaW1wcm92ZXMgaG93IGxpYi9jcmMg c3VwcG9ydHMgYXJjaC1vcHRpbWl6ZWQgY29kZS4gIEZpcnN0LAo+ID4gaW5zdGVhZCBvZiB0aGUg YXJjaC1vcHRpbWl6ZWQgQ1JDIGNvZGUgYmVpbmcgaW4gYXJjaC8kKFNSQ0FSQ0gpL2xpYi8sIGl0 Cj4gPiB3aWxsIG5vdyBiZSBpbiBsaWIvY3JjLyQoU1JDQVJDSCkvLiAgU2Vjb25kLCB0aGUgQVBJ IGZ1bmN0aW9ucyAoZS5nLgo+ID4gY3JjMzJjKCkpLCBhcmNoLW9wdGltaXplZCBmdW5jdGlvbnMg KGUuZy4gY3JjMzJjX2FyY2goKSksIGFuZCBnZW5lcmljCj4gPiBmdW5jdGlvbnMgKGUuZy4gY3Jj MzJjX2Jhc2UoKSkgd2lsbCBub3cgYmUgcGFydCBvZiBhIHNpbmdsZSBtb2R1bGUgZm9yCj4gPiBl YWNoIENSQyB0eXBlLCBhbGxvd2luZyBiZXR0ZXIgaW5saW5pbmcgYW5kIGRlYWQgY29kZSBlbGlt aW5hdGlvbi4gIFRoZQo+ID4gc2Vjb25kIGNoYW5nZSBpcyBtYWRlIHBvc3NpYmxlIGJ5IHRoZSBm aXJzdC4KPiA+Cj4gPiBBcyBhbiBleGFtcGxlLCBjb25zaWRlciBDT05GSUdfQ1JDMzI9bSBvbiB4 ODYuICBXZSdsbCBub3cgaGF2ZSBqdXN0Cj4gPiBjcmMzMi5rbyBpbnN0ZWFkIG9mIGJvdGggY3Jj MzIteDg2LmtvIGFuZCBjcmMzMi5rby4gIFRoZSB0d28gbW9kdWxlcwo+ID4gd2VyZSBhbHJlYWR5 IGNvdXBsZWQgdG9nZXRoZXIgYW5kIGFsd2F5cyBib3RoIGdvdCBsb2FkZWQgdG9nZXRoZXIgdmlh Cj4gPiBkaXJlY3Qgc3ltYm9sIGRlcGVuZGVuY3ksIHNvIHRoZSBzZXBhcmF0aW9uIHByb3ZpZGVk IG5vIGJlbmVmaXQuCj4gPgo+ID4gTm90ZTogbGF0ZXIgSSdkIGxpa2UgdG8gYXBwbHkgdGhlIHNh bWUgZGVzaWduIHRvIGxpYi9jcnlwdG8vIHRvbywgd2hlcmUKPiA+IG9mdGVuIHRoZSBBUEkgZnVu Y3Rpb25zIGFyZSBvdXQtb2YtbGluZSBzbyB0aGlzIHdpbGwgd29yayBldmVuIGJldHRlci4KPiA+ IEluIHRob3NlIGNhc2VzLCBmb3IgZWFjaCBhbGdvcml0aG0gd2UgY3VycmVudGx5IGhhdmUgMyBt b2R1bGVzIGFsbAo+ID4gY291cGxlZCB0b2dldGhlciwgZS5nLiBsaWJzaGEyNTYua28sIGxpYnNo YTI1Ni1nZW5lcmljLmtvLCBhbmQKPiA+IHNoYTI1Ni14ODYua28uICBXZSBzaG91bGQgaGF2ZSBq dXN0IG9uZSwgaW5saW5lIHRoaW5ncyBwcm9wZXJseSwgYW5kCj4gPiByZWx5IG9uIHRoZSBjb21w aWxlcidzIGRlYWQgY29kZSBlbGltaW5hdGlvbiB0byBkZWNpZGUgdGhlIGluY2x1c2lvbiBvZgo+ ID4gdGhlIGdlbmVyaWMgY29kZSBpbnN0ZWFkIG9mIG1hbnVhbGx5IHNldHRpbmcgaXQgdmlhIGtj b25maWcuCj4gPgo+ID4gSGF2aW5nIGFyY2gtc3BlY2lmaWMgY29kZSBvdXRzaWRlIGFyY2gvIHdh cyBzb21ld2hhdCBjb250cm92ZXJzaWFsIHdoZW4KPiA+IFppbmMgcHJvcG9zZWQgaXQgYmFjayBp biAyMDE4LiAgQnV0IEkgZG9uJ3QgdGhpbmsgdGhlIGNvbmNlcm5zIGFyZQo+ID4gd2FycmFudGVk LiAgSXQncyBiZXR0ZXIgZnJvbSBhIHRlY2huaWNhbCBwZXJzcGVjdGl2ZSwgYXMgaXQgZW5hYmxl cyB0aGUKPiA+IGltcHJvdmVtZW50cyBtZW50aW9uZWQgYWJvdmUuICBUaGlzIG1vZGVsIGlzIGFs cmVhZHkgc3VjY2Vzc2Z1bGx5IHVzZWQKPiA+IGluIG90aGVyIHBsYWNlcyBpbiB0aGUga2VybmVs IHN1Y2ggYXMgbGliL3JhaWQ2Ly4gIFRoZSBjb21tdW5pdHkgb2YgZWFjaAo+ID4gYXJjaGl0ZWN0 dXJlIHN0aWxsIHJlbWFpbnMgZnJlZSB0byB3b3JrIG9uIHRoZSBjb2RlLCBldmVuIGlmIGl0J3Mg bm90IGluCj4gPiBhcmNoLy4gIEF0IHRoZSB0aW1lIHRoZXJlIHdhcyBhbHNvIGEgZGVzaXJlIHRv IHB1dCB0aGUgbGlicmFyeSBjb2RlIGluCj4gPiB0aGUgc2FtZSBmaWxlcyBhcyB0aGUgb2xkLXNj aG9vbCBjcnlwdG8gQVBJLCBidXQgdGhhdCB3YXMgYSBtaXN0YWtlOyBub3cKPiA+IHRoYXQgdGhl IGxpYnJhcnkgaXMgc2VwYXJhdGUsIHRoYXQncyBubyBsb25nZXIgYSBjb25zdHJhaW50IGVpdGhl ci4KPiAKPiBRdWljayBxdWVzdGlvbiwgYW5kIGFwb2xvZ2llcyBpZiB0aGlzIGhhcyBiZWVuIGNv dmVyZWQgZWxzZXdoZXJlLgo+IAo+IFdoeSBub3QganVzdCB1c2UgY2hvaWNlIGJsb2NrcyBpbiBL Y29uZmlnIHRvIGNob29zZSB0aGUgY29tcGlsZWQtaW4KPiBjcmMzMiB2YXJpYW50IGluc3RlYWQg b2YgdGhpcyBzb21ld2hhdCBpbmRpcmVjdCBzY2hlbWU/Cj4KPiBUaGlzIHdvdWxkIGtlZXAgdGhl IGRlcGVuZGVuY2llcyBncm91cGVkIGJ5IGFyY2ggYW5kIHByb3ZpZGUgYSBzaW5nbGUgcGxhY2Ug dG8KPiBjaG9vc2Ugd2hldGhlciB0aGUgZ2VuZXJpYyBvciBhcmNoLXNwZWNpZmljIG1ldGhvZCBp cyB1c2VkLgoKSXQncyBub3QgY2xlYXIgZXhhY3RseSB3aGF0IHlvdSdyZSBzdWdnZXN0aW5nLCBi dXQgaXQgc291bmRzIGxpa2UgeW91J3JlCmNvbXBsYWluaW5nIGFib3V0IHRoaXM6CgogICAgY29u ZmlnIENSQzMyX0FSQ0gKICAgICAgICAgICAgYm9vbAogICAgICAgICAgICBkZXBlbmRzIG9uIENS QzMyICYmIENSQ19PUFRJTUlaQVRJT05TCiAgICAgICAgICAgIGRlZmF1bHQgeSBpZiBBUk0gJiYg S0VSTkVMX01PREVfTkVPTgogICAgICAgICAgICBkZWZhdWx0IHkgaWYgQVJNNjQKICAgICAgICAg ICAgZGVmYXVsdCB5IGlmIExPT05HQVJDSAogICAgICAgICAgICBkZWZhdWx0IHkgaWYgTUlQUyAm JiBDUFVfTUlQU1I2CiAgICAgICAgICAgIGRlZmF1bHQgeSBpZiBQUEM2NCAmJiBBTFRJVkVDCiAg ICAgICAgICAgIGRlZmF1bHQgeSBpZiBSSVNDViAmJiBSSVNDVl9JU0FfWkJDCiAgICAgICAgICAg IGRlZmF1bHQgeSBpZiBTMzkwCiAgICAgICAgICAgIGRlZmF1bHQgeSBpZiBTUEFSQzY0CiAgICAg ICAgICAgIGRlZmF1bHQgeSBpZiBYODYKCldlIGNvdWxkIGluc3RlYWQgbWFrZSBlYWNoIGFyY2gg YmUgcmVzcG9uc2libGUgZm9yIHNlbGVjdGluZyB0aGlzIGZyb20KbGliL2NyYy8kKFNSQ0FSQ0gp L0tjb25maWcsIHdoaWNoIGxpYi9jcmMvS2NvbmZpZyB3b3VsZCB0aGVuIGhhdmUgdG8gaW5jbHVk ZS4KQnV0IEkgZG9uJ3QgdGhpbmsgdGhlIHNtYWxsIGJpdCBvZiBhZGRpdGlvbmFsIHBlci1hcmNo IHNlcGFyYXRpb24gd291bGQgYmUgd29ydGgKdGhlIGV4dHJhIGNvbXBsZXhpdHkgaGVyZS4gIFNv bWV0aGluZyBzaW1pbGFyIGFwcGxpZXMgdG8gbGliL2NyYy9NYWtlZmlsZSB0b28uCgpUaGlzIHBh dGNoc2V0IHN0cmlrZXMgYSBiYWxhbmNlIHdoZXJlIHRoZSB2YXN0IG1ham9yaXR5IG9mIHRoZSBh cmNoLXNwZWNpZmljIENSQwpjb2RlIGlzIGlzb2xhdGVkIGluIGxpYi9jcmMvJChTUkNBUkNIKSwg YW5kIHRoZSBleGNlcHRpb25zIGFyZSBqdXN0CmxpYi9jcmMvTWFrZWZpbGUgYW5kIGxpYi9jcmMv S2NvbmZpZy4gIEkgdGhpbmsgdGhlc2UgZXhjZXB0aW9ucyBtYWtlIHNlbnNlLApnaXZlbiB0aGF0 IHdlJ3JlIGJ1aWxkaW5nIGEgc2luZ2xlIG1vZHVsZSBwZXIgQ1JDIHZhcmlhbnQuICBXZSdkIGhh dmUgdG8gZ28KdGhyb3VnaCBzb21lIGhvb3BzIHRvIGlzb2xhdGUgdGhlIGFyY2gtc3BlY2lmaWMg S2NvbmZpZyBhbmQgTWFrZWZpbGUgc25pcHBldHMKaW50byBwZXItYXJjaCBmaWxlcywgd2hpY2gg ZG9uJ3Qgc2VlbSB3b3J0aCBpdCBoZXJlIElNTy4KCj4gSXQgd291bGQgYWxzbyBhbGxvdyBmb3Ig YWx0ZXJuYXRpdmVzIGlmIHRoYXQgZXZlciBiZWNvbWVzIGEgdGhpbmcgYW5kCgpJZiB5b3UgbWVh biBvbmUgYXJjaCB3aXRoIG11bHRpcGxlIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9ucyBvZiBh IHBhcnRpY3VsYXIKQ1JDIHZhcmlhbnQsIHRoYXQgYWxyZWFkeSBleGlzdHMgZm9yIG1hbnkgb2Yg dGhlIGFyY2hpdGVjdHVyZXMuICBUaGV5IGp1c3QgYnVpbGQKaW4gYXMgbWFueSBhcyBjYW4gYmUs IGFuZCB0aGUgYmVzdCBvbmUgaXMgY2hvc2VuIGF0IGJvb3Qgb3IgbW9kdWxlIGxvYWQgdGltZS4K CkJ1dCB0aGF0J3MgZXhpc3RpbmcgYmVoYXZpb3IsIHVuY2hhbmdlZCBieSB0aGlzIHBhdGNoc2V0 LgoKPiBjb21waWxlIHRlc3Rpbmcgb2YgdGhlIGFyY2gtc3BlY2lmaWMgdmFyaWFudHMgaWYgdGhh dCBldmVuIG9mZmVycyBhbnkKPiBhY3R1YWwgdmFsdWUuCgpUaGV5IGFsbCB1c2UgaW5zdHJ1Y3Rp b25zIHNwZWNpZmljIHRvIHRoZSBjb3JyZXNwb25kaW5nIGFyY2gsIHNvIEkgZG9uJ3QgdGhpbmsK YW55IG9mIHRoZW0gd291bGQgYmUgY29tcGF0aWJsZSB3aXRoIENPTVBJTEVfVEVTVC4KCi0gRXJp YwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgt cmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDov L2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo=