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 X-Spam-Level: X-Spam-Status: No, score=-10.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 381CFC4742C for ; Wed, 11 Nov 2020 10:05:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A40DE20729 for ; Wed, 11 Nov 2020 10:05:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="v/nJ0O7/" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727294AbgKKKFm (ORCPT ); Wed, 11 Nov 2020 05:05:42 -0500 Received: from mail.kernel.org ([198.145.29.99]:44464 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726238AbgKKKFl (ORCPT ); Wed, 11 Nov 2020 05:05:41 -0500 Received: from mail-ot1-f54.google.com (mail-ot1-f54.google.com [209.85.210.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9940B20729 for ; Wed, 11 Nov 2020 10:05:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605089140; bh=JMJDdRzH3QwjOuXDoBx7SvWwgW4sbLkHYJkkc39eVnI=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=v/nJ0O7/qyH5mE+/znROZYqG+O4zm+MPuwvVFCjjDzAN6wygJnXCtfKlxcLM5aaBx X/RBlrJs1I7FTIcu9e6QAOzAJh5j7rYrLPr3TbdT2h/K5rYICk1jxzr73UKhSKkrNt eqnHBb5lXsKZcnu94DqccGvdjCI4OBcYCqNLG5s4= Received: by mail-ot1-f54.google.com with SMTP id a15so1623290otf.5 for ; Wed, 11 Nov 2020 02:05:40 -0800 (PST) X-Gm-Message-State: AOAM533xfseVAePY/R9gClqIiqVxpDzTCHPLr5aBlKPISYW/O1DyOfyV 2QiGx0SE9Ol0woT/H0VVLio1vyIFSI9v8q75h6I= X-Google-Smtp-Source: ABdhPJwesThzIC4EG/7rHaew6jOU6q98im6yKnr0YIGUDrxwbPOYxwQIhAUwI9HFfL6Hx7UC9xe1NUWp1uyhriw7hso= X-Received: by 2002:a9d:62c1:: with SMTP id z1mr16523361otk.108.1605089139764; Wed, 11 Nov 2020 02:05:39 -0800 (PST) MIME-Version: 1.0 References: <20201105152944.16953-1-ardb@kernel.org> <0b0d47d9-76a5-723f-6642-d5ddadce7f94@arm.com> In-Reply-To: <0b0d47d9-76a5-723f-6642-d5ddadce7f94@arm.com> From: Ard Biesheuvel Date: Wed, 11 Nov 2020 11:05:27 +0100 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH] random: avoid arch_get_random_seed_long() when collecting IRQ randomness To: =?UTF-8?Q?Andr=C3=A9_Przywara?= Cc: "Theodore Y. Ts'o" , Eric Biggers , Linux Kernel Mailing List , Linux ARM , Marc Zyngier , Mark Rutland , Mark Brown Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 11 Nov 2020 at 10:45, Andr=C3=A9 Przywara = wrote: > > On 11/11/2020 08:19, Ard Biesheuvel wrote: > > Hi, > > > (+ Eric) > > > > On Thu, 5 Nov 2020 at 16:29, Ard Biesheuvel wrote: > >> > >> When reseeding the CRNG periodically, arch_get_random_seed_long() is > >> called to obtain entropy from an architecture specific source if one > >> is implemented. In most cases, these are special instructions, but in > >> some cases, such as on ARM, we may want to back this using firmware > >> calls, which are considerably more expensive. > >> > >> Another call to arch_get_random_seed_long() exists in the CRNG driver, > >> in add_interrupt_randomness(), which collects entropy by capturing > >> inter-interrupt timing and relying on interrupt jitter to provide > >> random bits. This is done by keeping a per-CPU state, and mixing in > >> the IRQ number, the cycle counter and the return address every time an > >> interrupt is taken, and mixing this per-CPU state into the entropy poo= l > >> every 64 invocations, or at least once per second. The entropy that is > >> gathered this way is credited as 1 bit of entropy. Every time this > >> happens, arch_get_random_seed_long() is invoked, and the result is > >> mixed in as well, and also credited with 1 bit of entropy. > >> > >> This means that arch_get_random_seed_long() is called at least once > >> per second on every CPU, which seems excessive, and doesn't really > >> scale, especially in a virtualization scenario where CPUs may be > >> oversubscribed: in cases where arch_get_random_seed_long() is backed > >> by an instruction that actually goes back to a shared hardware entropy > >> source (such as RNDRRS on ARM), we will end up hitting it hundreds of > >> times per second. > > May I ask why this should be a particular problem? Form what I gathered > on the web, it seems like most h/w RNGs have a capacity of multiple > MBit/s. Wikipedia [1] suggests that the x86 CPU instructions generate at > least 20 Mbit/s (worst case: AMD's 2500 cycles @ 800 MHz), and I > measured around 78 Mbit/s with the raw entropy source on my Juno > (possibly even limited by slow MMIO). > So it seems unlikely that a few kbit/s drain the hardware entropy source. > > If we consider this interface comparably cheap, should we then not try > to plug the Arm firmware interface into this? > I'm not sure I follow. Are you saying we should not wire up a comparatively expensive firmware interface to arch_get_random_seed_long() because we currently assume it is backed by something cheap? Because doing so would add significantly to the cost. Also note that a firmware interface would permit other ways of gathering entropy that are not necessarily backed by a dedicated high bandwidth noise source (and we already have examples of this) > I am not against this patch, actually am considering this a nice > cleanup, to separate interrupt generated entropy from other sources. > Especially since we call arch_get_random_seed_long() under a spinlock her= e. > But I am curious about the expectations from arch_get_random in general. > I think it is reasonable to clean this up a little bit. A random *seed* is not the same thing as a random number, and given that we expose both interfaces, it makes sense to permit the seed variant to be more costly, and only use it as intended (i.e., to seed a random number generator) > >> So let's drop the call to arch_get_random_seed_long() from > >> add_interrupt_randomness(), and instead, rely on crng_reseed() to call > >> the arch hook to get random seed material from the platform. > > So I tested this and it works as expected: I see some calls on > initialisation, then a handful of calls every few seconds from the > periodic reseeding. The large number of calls every second are gone. > Excellent, thanks for confirming. > >> > >> Signed-off-by: Ard Biesheuvel > > Since the above questions are unrelated to this particular patch: > > Reviewed-by: Andre Przywara > Tested-by: Andre Przywara > > Cheers, > Andre > > [1] https://en.wikipedia.org/wiki/RDRAND#Performance > > >> --- > >> drivers/char/random.c | 15 +-------------- > >> 1 file changed, 1 insertion(+), 14 deletions(-) > >> > >> diff --git a/drivers/char/random.c b/drivers/char/random.c > >> index 2a41b21623ae..a9c393c1466d 100644 > >> --- a/drivers/char/random.c > >> +++ b/drivers/char/random.c > >> @@ -1261,8 +1261,6 @@ void add_interrupt_randomness(int irq, int irq_f= lags) > >> cycles_t cycles =3D random_get_entropy(); > >> __u32 c_high, j_high; > >> __u64 ip; > >> - unsigned long seed; > >> - int credit =3D 0; > >> > >> if (cycles =3D=3D 0) > >> cycles =3D get_reg(fast_pool, regs); > >> @@ -1298,23 +1296,12 @@ void add_interrupt_randomness(int irq, int irq= _flags) > >> > >> fast_pool->last =3D now; > >> __mix_pool_bytes(r, &fast_pool->pool, sizeof(fast_pool->pool))= ; > >> - > >> - /* > >> - * If we have architectural seed generator, produce a seed and > >> - * add it to the pool. For the sake of paranoia don't let the > >> - * architectural seed generator dominate the input from the > >> - * interrupt noise. > >> - */ > >> - if (arch_get_random_seed_long(&seed)) { > >> - __mix_pool_bytes(r, &seed, sizeof(seed)); > >> - credit =3D 1; > >> - } > >> spin_unlock(&r->lock); > >> > >> fast_pool->count =3D 0; > >> > >> /* award one bit for the contents of the fast pool */ > >> - credit_entropy_bits(r, credit + 1); > >> + credit_entropy_bits(r, 1); > >> } > >> EXPORT_SYMBOL_GPL(add_interrupt_randomness); > >> > >> -- > >> 2.17.1 > >> > 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 X-Spam-Level: X-Spam-Status: No, score=-10.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8C0FEC4742C for ; Wed, 11 Nov 2020 10:06:16 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E3B8020674 for ; Wed, 11 Nov 2020 10:06:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ZvAtDjJQ"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="v/nJ0O7/" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E3B8020674 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=xc0xzRRK01zY+PPbGcdiisttE5hFPnJN1AtBdANfeRg=; b=ZvAtDjJQdyWnS7YL5QPpQHEsT 6hAlt6DaVyiN1Ki8Z//hoWPBHrrQAlXtiNlNJm4UOQE2IlwrscuaT+Tax+6iK9aXnhdwv1QFhcfNC G9pGHss5Mhnh9YWaQkKE1AeDqx+UOAkTmNDxuKKVFR+b4SJiaQDdNEWSsyKAIqwX5Jc3o2otjHseV BY+mMEaPD9s2fOHi7bE0rMrvowKJqrjRIcuxoVh2jyDr8pv7EqIxv32/PdBz2vHzdLwZ3ULkRxRbk X99/3xCami7y0R5hnpmegdTpT0fUVIYrGS/DnfQUXLC3/KJ+ZSQ6vHhRDaST5vOBA1GZPKYjPzrLJ IuVRvI40A==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kcn0b-0001Eh-7s; Wed, 11 Nov 2020 10:05:45 +0000 Received: from mail.kernel.org ([198.145.29.99]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kcn0X-0001E7-Rr for linux-arm-kernel@lists.infradead.org; Wed, 11 Nov 2020 10:05:43 +0000 Received: from mail-ot1-f44.google.com (mail-ot1-f44.google.com [209.85.210.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9C4CA20756 for ; Wed, 11 Nov 2020 10:05:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1605089140; bh=JMJDdRzH3QwjOuXDoBx7SvWwgW4sbLkHYJkkc39eVnI=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=v/nJ0O7/qyH5mE+/znROZYqG+O4zm+MPuwvVFCjjDzAN6wygJnXCtfKlxcLM5aaBx X/RBlrJs1I7FTIcu9e6QAOzAJh5j7rYrLPr3TbdT2h/K5rYICk1jxzr73UKhSKkrNt eqnHBb5lXsKZcnu94DqccGvdjCI4OBcYCqNLG5s4= Received: by mail-ot1-f44.google.com with SMTP id g19so1577072otp.13 for ; Wed, 11 Nov 2020 02:05:40 -0800 (PST) X-Gm-Message-State: AOAM5312fuBsEa/blT48Xj5JPXKCOur2eRnTJIhbslVciwZV590dDZ9Y 6GVJArgAg+oLh4BXO/Dwqgr8KReGLXdYOSNYTq4= X-Google-Smtp-Source: ABdhPJwesThzIC4EG/7rHaew6jOU6q98im6yKnr0YIGUDrxwbPOYxwQIhAUwI9HFfL6Hx7UC9xe1NUWp1uyhriw7hso= X-Received: by 2002:a9d:62c1:: with SMTP id z1mr16523361otk.108.1605089139764; Wed, 11 Nov 2020 02:05:39 -0800 (PST) MIME-Version: 1.0 References: <20201105152944.16953-1-ardb@kernel.org> <0b0d47d9-76a5-723f-6642-d5ddadce7f94@arm.com> In-Reply-To: <0b0d47d9-76a5-723f-6642-d5ddadce7f94@arm.com> From: Ard Biesheuvel Date: Wed, 11 Nov 2020 11:05:27 +0100 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH] random: avoid arch_get_random_seed_long() when collecting IRQ randomness To: =?UTF-8?Q?Andr=C3=A9_Przywara?= X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201111_050542_499779_097C544A X-CRM114-Status: GOOD ( 43.04 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , "Theodore Y. Ts'o" , Marc Zyngier , Linux Kernel Mailing List , Eric Biggers , Mark Brown , Linux ARM 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 T24gV2VkLCAxMSBOb3YgMjAyMCBhdCAxMDo0NSwgQW5kcsOpIFByenl3YXJhIDxhbmRyZS5wcnp5 d2FyYUBhcm0uY29tPiB3cm90ZToKPgo+IE9uIDExLzExLzIwMjAgMDg6MTksIEFyZCBCaWVzaGV1 dmVsIHdyb3RlOgo+Cj4gSGksCj4KPiA+ICgrIEVyaWMpCj4gPgo+ID4gT24gVGh1LCA1IE5vdiAy MDIwIGF0IDE2OjI5LCBBcmQgQmllc2hldXZlbCA8YXJkYkBrZXJuZWwub3JnPiB3cm90ZToKPiA+ Pgo+ID4+IFdoZW4gcmVzZWVkaW5nIHRoZSBDUk5HIHBlcmlvZGljYWxseSwgYXJjaF9nZXRfcmFu ZG9tX3NlZWRfbG9uZygpIGlzCj4gPj4gY2FsbGVkIHRvIG9idGFpbiBlbnRyb3B5IGZyb20gYW4g YXJjaGl0ZWN0dXJlIHNwZWNpZmljIHNvdXJjZSBpZiBvbmUKPiA+PiBpcyBpbXBsZW1lbnRlZC4g SW4gbW9zdCBjYXNlcywgdGhlc2UgYXJlIHNwZWNpYWwgaW5zdHJ1Y3Rpb25zLCBidXQgaW4KPiA+ PiBzb21lIGNhc2VzLCBzdWNoIGFzIG9uIEFSTSwgd2UgbWF5IHdhbnQgdG8gYmFjayB0aGlzIHVz aW5nIGZpcm13YXJlCj4gPj4gY2FsbHMsIHdoaWNoIGFyZSBjb25zaWRlcmFibHkgbW9yZSBleHBl bnNpdmUuCj4gPj4KPiA+PiBBbm90aGVyIGNhbGwgdG8gYXJjaF9nZXRfcmFuZG9tX3NlZWRfbG9u ZygpIGV4aXN0cyBpbiB0aGUgQ1JORyBkcml2ZXIsCj4gPj4gaW4gYWRkX2ludGVycnVwdF9yYW5k b21uZXNzKCksIHdoaWNoIGNvbGxlY3RzIGVudHJvcHkgYnkgY2FwdHVyaW5nCj4gPj4gaW50ZXIt aW50ZXJydXB0IHRpbWluZyBhbmQgcmVseWluZyBvbiBpbnRlcnJ1cHQgaml0dGVyIHRvIHByb3Zp ZGUKPiA+PiByYW5kb20gYml0cy4gVGhpcyBpcyBkb25lIGJ5IGtlZXBpbmcgYSBwZXItQ1BVIHN0 YXRlLCBhbmQgbWl4aW5nIGluCj4gPj4gdGhlIElSUSBudW1iZXIsIHRoZSBjeWNsZSBjb3VudGVy IGFuZCB0aGUgcmV0dXJuIGFkZHJlc3MgZXZlcnkgdGltZSBhbgo+ID4+IGludGVycnVwdCBpcyB0 YWtlbiwgYW5kIG1peGluZyB0aGlzIHBlci1DUFUgc3RhdGUgaW50byB0aGUgZW50cm9weSBwb29s Cj4gPj4gZXZlcnkgNjQgaW52b2NhdGlvbnMsIG9yIGF0IGxlYXN0IG9uY2UgcGVyIHNlY29uZC4g VGhlIGVudHJvcHkgdGhhdCBpcwo+ID4+IGdhdGhlcmVkIHRoaXMgd2F5IGlzIGNyZWRpdGVkIGFz IDEgYml0IG9mIGVudHJvcHkuIEV2ZXJ5IHRpbWUgdGhpcwo+ID4+IGhhcHBlbnMsIGFyY2hfZ2V0 X3JhbmRvbV9zZWVkX2xvbmcoKSBpcyBpbnZva2VkLCBhbmQgdGhlIHJlc3VsdCBpcwo+ID4+IG1p eGVkIGluIGFzIHdlbGwsIGFuZCBhbHNvIGNyZWRpdGVkIHdpdGggMSBiaXQgb2YgZW50cm9weS4K PiA+Pgo+ID4+IFRoaXMgbWVhbnMgdGhhdCBhcmNoX2dldF9yYW5kb21fc2VlZF9sb25nKCkgaXMg Y2FsbGVkIGF0IGxlYXN0IG9uY2UKPiA+PiBwZXIgc2Vjb25kIG9uIGV2ZXJ5IENQVSwgd2hpY2gg c2VlbXMgZXhjZXNzaXZlLCBhbmQgZG9lc24ndCByZWFsbHkKPiA+PiBzY2FsZSwgZXNwZWNpYWxs eSBpbiBhIHZpcnR1YWxpemF0aW9uIHNjZW5hcmlvIHdoZXJlIENQVXMgbWF5IGJlCj4gPj4gb3Zl cnN1YnNjcmliZWQ6IGluIGNhc2VzIHdoZXJlIGFyY2hfZ2V0X3JhbmRvbV9zZWVkX2xvbmcoKSBp cyBiYWNrZWQKPiA+PiBieSBhbiBpbnN0cnVjdGlvbiB0aGF0IGFjdHVhbGx5IGdvZXMgYmFjayB0 byBhIHNoYXJlZCBoYXJkd2FyZSBlbnRyb3B5Cj4gPj4gc291cmNlIChzdWNoIGFzIFJORFJSUyBv biBBUk0pLCB3ZSB3aWxsIGVuZCB1cCBoaXR0aW5nIGl0IGh1bmRyZWRzIG9mCj4gPj4gdGltZXMg cGVyIHNlY29uZC4KPgo+IE1heSBJIGFzayB3aHkgdGhpcyBzaG91bGQgYmUgYSBwYXJ0aWN1bGFy IHByb2JsZW0/IEZvcm0gd2hhdCBJIGdhdGhlcmVkCj4gb24gdGhlIHdlYiwgaXQgc2VlbXMgbGlr ZSBtb3N0IGgvdyBSTkdzIGhhdmUgYSBjYXBhY2l0eSBvZiBtdWx0aXBsZQo+IE1CaXQvcy4gV2lr aXBlZGlhIFsxXSBzdWdnZXN0cyB0aGF0IHRoZSB4ODYgQ1BVIGluc3RydWN0aW9ucyBnZW5lcmF0 ZSBhdAo+IGxlYXN0IDIwIE1iaXQvcyAod29yc3QgY2FzZTogQU1EJ3MgMjUwMCBjeWNsZXMgQCA4 MDAgTUh6KSwgYW5kIEkKPiBtZWFzdXJlZCBhcm91bmQgNzggTWJpdC9zIHdpdGggdGhlIHJhdyBl bnRyb3B5IHNvdXJjZSBvbiBteSBKdW5vCj4gKHBvc3NpYmx5IGV2ZW4gbGltaXRlZCBieSBzbG93 IE1NSU8pLgo+IFNvIGl0IHNlZW1zIHVubGlrZWx5IHRoYXQgYSBmZXcga2JpdC9zIGRyYWluIHRo ZSBoYXJkd2FyZSBlbnRyb3B5IHNvdXJjZS4KPgo+IElmIHdlIGNvbnNpZGVyIHRoaXMgaW50ZXJm YWNlIGNvbXBhcmFibHkgY2hlYXAsIHNob3VsZCB3ZSB0aGVuIG5vdCB0cnkKPiB0byBwbHVnIHRo ZSBBcm0gZmlybXdhcmUgaW50ZXJmYWNlIGludG8gdGhpcz8KPgoKSSdtIG5vdCBzdXJlIEkgZm9s bG93LiBBcmUgeW91IHNheWluZyB3ZSBzaG91bGQgbm90IHdpcmUgdXAgYQpjb21wYXJhdGl2ZWx5 IGV4cGVuc2l2ZSBmaXJtd2FyZSBpbnRlcmZhY2UgdG8KYXJjaF9nZXRfcmFuZG9tX3NlZWRfbG9u ZygpIGJlY2F1c2Ugd2UgY3VycmVudGx5IGFzc3VtZSBpdCBpcyBiYWNrZWQKYnkgc29tZXRoaW5n IGNoZWFwPwoKQmVjYXVzZSBkb2luZyBzbyB3b3VsZCBhZGQgc2lnbmlmaWNhbnRseSB0byB0aGUg Y29zdC4gQWxzbyBub3RlIHRoYXQgYQpmaXJtd2FyZSBpbnRlcmZhY2Ugd291bGQgcGVybWl0IG90 aGVyIHdheXMgb2YgZ2F0aGVyaW5nIGVudHJvcHkgdGhhdAphcmUgbm90IG5lY2Vzc2FyaWx5IGJh Y2tlZCBieSBhIGRlZGljYXRlZCBoaWdoIGJhbmR3aWR0aCBub2lzZSBzb3VyY2UKKGFuZCB3ZSBh bHJlYWR5IGhhdmUgZXhhbXBsZXMgb2YgdGhpcykKCgo+IEkgYW0gbm90IGFnYWluc3QgdGhpcyBw YXRjaCwgYWN0dWFsbHkgYW0gY29uc2lkZXJpbmcgdGhpcyBhIG5pY2UKPiBjbGVhbnVwLCB0byBz ZXBhcmF0ZSBpbnRlcnJ1cHQgZ2VuZXJhdGVkIGVudHJvcHkgZnJvbSBvdGhlciBzb3VyY2VzLgo+ IEVzcGVjaWFsbHkgc2luY2Ugd2UgY2FsbCBhcmNoX2dldF9yYW5kb21fc2VlZF9sb25nKCkgdW5k ZXIgYSBzcGlubG9jayBoZXJlLgo+IEJ1dCBJIGFtIGN1cmlvdXMgYWJvdXQgdGhlIGV4cGVjdGF0 aW9ucyBmcm9tIGFyY2hfZ2V0X3JhbmRvbSBpbiBnZW5lcmFsLgo+CgpJIHRoaW5rIGl0IGlzIHJl YXNvbmFibGUgdG8gY2xlYW4gdGhpcyB1cCBhIGxpdHRsZSBiaXQuIEEgcmFuZG9tCipzZWVkKiBp cyBub3QgdGhlIHNhbWUgdGhpbmcgYXMgYSByYW5kb20gbnVtYmVyLCBhbmQgZ2l2ZW4gdGhhdCB3 ZQpleHBvc2UgYm90aCBpbnRlcmZhY2VzLCBpdCBtYWtlcyBzZW5zZSB0byBwZXJtaXQgdGhlIHNl ZWQgdmFyaWFudCB0bwpiZSBtb3JlIGNvc3RseSwgYW5kIG9ubHkgdXNlIGl0IGFzIGludGVuZGVk IChpLmUuLCB0byBzZWVkIGEgcmFuZG9tCm51bWJlciBnZW5lcmF0b3IpCgo+ID4+IFNvIGxldCdz IGRyb3AgdGhlIGNhbGwgdG8gYXJjaF9nZXRfcmFuZG9tX3NlZWRfbG9uZygpIGZyb20KPiA+PiBh ZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoKSwgYW5kIGluc3RlYWQsIHJlbHkgb24gY3JuZ19yZXNl ZWQoKSB0byBjYWxsCj4gPj4gdGhlIGFyY2ggaG9vayB0byBnZXQgcmFuZG9tIHNlZWQgbWF0ZXJp YWwgZnJvbSB0aGUgcGxhdGZvcm0uCj4KPiBTbyBJIHRlc3RlZCB0aGlzIGFuZCBpdCB3b3JrcyBh cyBleHBlY3RlZDogSSBzZWUgc29tZSBjYWxscyBvbgo+IGluaXRpYWxpc2F0aW9uLCB0aGVuIGEg aGFuZGZ1bCBvZiBjYWxscyBldmVyeSBmZXcgc2Vjb25kcyBmcm9tIHRoZQo+IHBlcmlvZGljIHJl c2VlZGluZy4gVGhlIGxhcmdlIG51bWJlciBvZiBjYWxscyBldmVyeSBzZWNvbmQgYXJlIGdvbmUu Cj4KCkV4Y2VsbGVudCwgdGhhbmtzIGZvciBjb25maXJtaW5nLgoKPiA+Pgo+ID4+IFNpZ25lZC1v ZmYtYnk6IEFyZCBCaWVzaGV1dmVsIDxhcmRiQGtlcm5lbC5vcmc+Cj4KPiBTaW5jZSB0aGUgYWJv dmUgcXVlc3Rpb25zIGFyZSB1bnJlbGF0ZWQgdG8gdGhpcyBwYXJ0aWN1bGFyIHBhdGNoOgo+Cj4g UmV2aWV3ZWQtYnk6IEFuZHJlIFByenl3YXJhIDxhbmRyZS5wcnp5d2FyYUBhcm0uY29tPgo+IFRl c3RlZC1ieTogQW5kcmUgUHJ6eXdhcmEgPGFuZHJlLnByenl3YXJhQGFybS5jb20+Cj4KPiBDaGVl cnMsCj4gQW5kcmUKPgo+IFsxXSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SRFJBTkQj UGVyZm9ybWFuY2UKPgo+ID4+IC0tLQo+ID4+ICBkcml2ZXJzL2NoYXIvcmFuZG9tLmMgfCAxNSAr LS0tLS0tLS0tLS0tLS0KPiA+PiAgMSBmaWxlIGNoYW5nZWQsIDEgaW5zZXJ0aW9uKCspLCAxNCBk ZWxldGlvbnMoLSkKPiA+Pgo+ID4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMg Yi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKPiA+PiBpbmRleCAyYTQxYjIxNjIzYWUuLmE5YzM5M2Mx NDY2ZCAxMDA2NDQKPiA+PiAtLS0gYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKPiA+PiArKysgYi9k cml2ZXJzL2NoYXIvcmFuZG9tLmMKPiA+PiBAQCAtMTI2MSw4ICsxMjYxLDYgQEAgdm9pZCBhZGRf aW50ZXJydXB0X3JhbmRvbW5lc3MoaW50IGlycSwgaW50IGlycV9mbGFncykKPiA+PiAgICAgICAg IGN5Y2xlc190ICAgICAgICAgICAgICAgIGN5Y2xlcyA9IHJhbmRvbV9nZXRfZW50cm9weSgpOwo+ ID4+ICAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgY19oaWdoLCBqX2hpZ2g7Cj4gPj4g ICAgICAgICBfX3U2NCAgICAgICAgICAgICAgICAgICBpcDsKPiA+PiAtICAgICAgIHVuc2lnbmVk IGxvbmcgICAgICAgICAgIHNlZWQ7Cj4gPj4gLSAgICAgICBpbnQgICAgICAgICAgICAgICAgICAg ICBjcmVkaXQgPSAwOwo+ID4+Cj4gPj4gICAgICAgICBpZiAoY3ljbGVzID09IDApCj4gPj4gICAg ICAgICAgICAgICAgIGN5Y2xlcyA9IGdldF9yZWcoZmFzdF9wb29sLCByZWdzKTsKPiA+PiBAQCAt MTI5OCwyMyArMTI5NiwxMiBAQCB2b2lkIGFkZF9pbnRlcnJ1cHRfcmFuZG9tbmVzcyhpbnQgaXJx LCBpbnQgaXJxX2ZsYWdzKQo+ID4+Cj4gPj4gICAgICAgICBmYXN0X3Bvb2wtPmxhc3QgPSBub3c7 Cj4gPj4gICAgICAgICBfX21peF9wb29sX2J5dGVzKHIsICZmYXN0X3Bvb2wtPnBvb2wsIHNpemVv ZihmYXN0X3Bvb2wtPnBvb2wpKTsKPiA+PiAtCj4gPj4gLSAgICAgICAvKgo+ID4+IC0gICAgICAg ICogSWYgd2UgaGF2ZSBhcmNoaXRlY3R1cmFsIHNlZWQgZ2VuZXJhdG9yLCBwcm9kdWNlIGEgc2Vl ZCBhbmQKPiA+PiAtICAgICAgICAqIGFkZCBpdCB0byB0aGUgcG9vbC4gIEZvciB0aGUgc2FrZSBv ZiBwYXJhbm9pYSBkb24ndCBsZXQgdGhlCj4gPj4gLSAgICAgICAgKiBhcmNoaXRlY3R1cmFsIHNl ZWQgZ2VuZXJhdG9yIGRvbWluYXRlIHRoZSBpbnB1dCBmcm9tIHRoZQo+ID4+IC0gICAgICAgICog aW50ZXJydXB0IG5vaXNlLgo+ID4+IC0gICAgICAgICovCj4gPj4gLSAgICAgICBpZiAoYXJjaF9n ZXRfcmFuZG9tX3NlZWRfbG9uZygmc2VlZCkpIHsKPiA+PiAtICAgICAgICAgICAgICAgX19taXhf cG9vbF9ieXRlcyhyLCAmc2VlZCwgc2l6ZW9mKHNlZWQpKTsKPiA+PiAtICAgICAgICAgICAgICAg Y3JlZGl0ID0gMTsKPiA+PiAtICAgICAgIH0KPiA+PiAgICAgICAgIHNwaW5fdW5sb2NrKCZyLT5s b2NrKTsKPiA+Pgo+ID4+ICAgICAgICAgZmFzdF9wb29sLT5jb3VudCA9IDA7Cj4gPj4KPiA+PiAg ICAgICAgIC8qIGF3YXJkIG9uZSBiaXQgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgZmFzdCBwb29s ICovCj4gPj4gLSAgICAgICBjcmVkaXRfZW50cm9weV9iaXRzKHIsIGNyZWRpdCArIDEpOwo+ID4+ ICsgICAgICAgY3JlZGl0X2VudHJvcHlfYml0cyhyLCAxKTsKPiA+PiAgfQo+ID4+ICBFWFBPUlRf U1lNQk9MX0dQTChhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MpOwo+ID4+Cj4gPj4gLS0KPiA+PiAy LjE3LjEKPiA+Pgo+CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3Rz LmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1hcm0ta2VybmVsCg==