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 7265DE7B5E3 for ; Wed, 4 Oct 2023 10:00:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:In-Reply-To: Content-Transfer-Encoding:Content-Type: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=Xb+bw7+oRtg4GgltRa7kRlWLiBrf0HlhYLQTRaduXtY=; b=YqBRP0i7HsP9lQF587vfNxwqgx rHkrVmGY7lQqGjbhP7QngUaDT/vk8I8WT+Dfo4a3s7ge0zUGDI8L7/EmU31av9o0nYdzLmzR506r0 kcfXFA6WUaOjEYItONt6n99nB4jJ7bwrxEe1sGn9AvkvyNmYcWcdkdVNUSdrdfNd/PxAoj9Au4E4n aTzp4+F/S6ssBL9IcOgSAnKi/kSrIzjcbz6JDjejvfDZeHF2fD3Nm9AMyBGz/NBJQcxmW6Pw4Xxdb hoMorMoXE/l5J8biIxbIJmoR0txJBJ5gs5H0EoqmO6+mPbY3MO2dNqlCmXbWhEMRnTDpPn/ttKHZy iTbSsJJg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qnyfm-00HA4Q-0H; Wed, 04 Oct 2023 10:00:06 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qnyfi-00HA2U-18; Wed, 04 Oct 2023 10:00:04 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E89ACDA7; Wed, 4 Oct 2023 03:00:38 -0700 (PDT) Received: from FVFF77S0Q05N (unknown [10.57.95.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 56DB53F5A1; Wed, 4 Oct 2023 02:59:57 -0700 (PDT) Date: Wed, 4 Oct 2023 10:59:50 +0100 From: Mark Rutland To: Doug Anderson Cc: Catalin Marinas , Will Deacon , Marc Zyngier , Stephen Boyd , Valentin Schneider , Chen-Yu Tsai , AngeloGioacchino Del Regno , D Scott Phillips , Josh Poimboeuf , Matthias Brugger , Misono Tomohiro , Peter Zijlstra , Sumit Garg , Thomas Gleixner , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org Subject: Re: [PATCH 1/2] arm64: smp: Fix pseudo NMI issues w/ broken Mediatek FW Message-ID: References: <20231002094526.1.Ie8f760213053e3d11592f892b30912dbac6b8b48@changeid> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231004_030002_488273_585D1E31 X-CRM114-Status: GOOD ( 68.48 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org On Tue, Oct 03, 2023 at 12:32:39PM -0700, Doug Anderson wrote: > Hi, > > On Tue, Oct 3, 2023 at 9:32 AM Mark Rutland wrote: > > > > On Tue, Oct 03, 2023 at 06:43:07AM -0700, Doug Anderson wrote: > > > Hi, > > > > > > On Tue, Oct 3, 2023 at 5:29 AM Mark Rutland wrote: > > > > > > > > On Mon, Oct 02, 2023 at 12:16:17PM -0700, Doug Anderson wrote: > > > > > Hi, > > > > > > > > > > On Mon, Oct 2, 2023 at 10:24 AM Mark Rutland wrote: > > > > > > > > > > > > On Mon, Oct 02, 2023 at 09:45:29AM -0700, Douglas Anderson wrote: > > > > > > > Some mediatek devices have the property > > > > > > > "mediatek,broken-save-restore-fw" in their GIC. This means that, > > > > > > > although the hardware supports pseudo-NMI, the firmware has a bug > > > > > > > that blocks enabling it. When we're in this state, > > > > > > > system_uses_irq_prio_masking() will return true but we'll fail to > > > > > > > actually enable the IRQ in the GIC. > > > > > > > > > > > > > > Let's make the code handle this. We'll detect that we failed to > > > > > > > request an IPI as NMI and fallback to requesting it normally. Though > > > > > > > we expect that either all of our requests will fail or all will > > > > > > > succeed, it's just as cheap to keep a per-IPI bitmap and that keeps us > > > > > > > robust. > > > > > > > > > > > > > > Fixes: 331a1b3a836c ("arm64: smp: Add arch support for backtrace using pseudo-NMI") > > > > > > > Reported-by: Chen-Yu Tsai > > > > > > > Closes: https://issuetracker.google.com/issues/197061987#comment68 > > > > > > > Signed-off-by: Douglas Anderson > > > > > > > --- > > > > > > > > > > > > > > arch/arm64/kernel/smp.c | 19 ++++++++++++------- > > > > > > > 1 file changed, 12 insertions(+), 7 deletions(-) > > > > > > > > > > > > I'm not too keen on falling back here when we have no idea why the request failed. > > > > > > > > > > > > I'd prefer if we could check the `supports_pseudo_nmis` static key directly to > > > > > > account for the case of broken FW, e.g. as below. > > > > > > > > > > > > Mark. > > > > > > > > > > > > ---->8---- > > > > > > From 72fdec05c64a74f21871b44c7c760bbe07cac044 Mon Sep 17 00:00:00 2001 > > > > > > From: Mark Rutland > > > > > > Date: Mon, 2 Oct 2023 18:00:36 +0100 > > > > > > Subject: [PATCH] arm64: smp: avoid NMI IPIs with broken MediaTek FW > > > > > > > > > > > > Some MediaTek devices have broken firmware which corrupts some GICR > > > > > > registers behind the back of the OS, and pseudo-NMIs cannot be used on > > > > > > these devices. For more details see commit: > > > > > > > > > > > > 44bd78dd2b8897f5 ("irqchip/gic-v3: Disable pseudo NMIs on Mediatek devices w/ firmware issues") > > > > > > > > > > > > We did not take this problem into account in commit: > > > > > > > > > > > > 331a1b3a836c0f38 ("arm64: smp: Add arch support for backtrace using pseudo-NMI") > > > > > > > > > > > > Since that commit arm64's SMP code will try to setup some IPIs as > > > > > > pseudo-NMIs, even on systems with broken FW. The GICv3 code will > > > > > > (rightly) reject attempts to request interrupts as pseudo-NMIs, > > > > > > resulting in boot-time failures. > > > > > > > > > > > > Avoid the problem by taking the broken FW into account when deciding to > > > > > > request IPIs as pseudo-NMIs. The GICv3 driver maintains a static_key > > > > > > named "supports_pseudo_nmis" which is false on systems with broken FW, > > > > > > and we can consult this within ipi_should_be_nmi(). > > > > > > > > > > > > Fixes: 331a1b3a836c0f38 ("arm64: smp: Add arch support for backtrace using pseudo-NMI") > > > > > > Reported-by: Chen-Yu Tsai > > > > > > Closes: https://issuetracker.google.com/issues/197061987#comment68 > > > > > > Signed-off-by: Mark Rutland > > > > > > Cc: Douglas Anderson > > > > > > Cc: Marc Zyngier > > > > > > --- > > > > > > arch/arm64/kernel/smp.c | 5 ++++- > > > > > > drivers/irqchip/irq-gic-v3.c | 2 +- > > > > > > 2 files changed, 5 insertions(+), 2 deletions(-) > > > > > > > > > > Sure, this is OK w/ me as long as folks don't mind accessing the > > > > > global here, it's OK w/ me: > > > > > > > > > > Reviewed-by: Douglas Anderson > > > > > > > > > > It seems to work for me, thus: > > > > > > > > > > Tested-by: Douglas Anderson > > > > > > > > > > > > > > > > diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c > > > > > > index 814d9aa93b21b..061c69160f90f 100644 > > > > > > --- a/arch/arm64/kernel/smp.c > > > > > > +++ b/arch/arm64/kernel/smp.c > > > > > > @@ -964,7 +964,10 @@ static void smp_cross_call(const struct cpumask *target, unsigned int ipinr) > > > > > > > > > > > > static bool ipi_should_be_nmi(enum ipi_msg_type ipi) > > > > > > { > > > > > > - if (!system_uses_irq_prio_masking()) > > > > > > + DECLARE_STATIC_KEY_FALSE(supports_pseudo_nmis); > > > > > > + > > > > > > + if (!system_uses_irq_prio_masking() || > > > > > > + !static_branch_likely(&supports_pseudo_nmis)) > > > > > > > > > > One thought, actually, is whether we should actually change > > > > > system_uses_irq_prio_masking() to return the correct value. What do > > > > > you think? > > > > > > > > I don't think we should add this to system_uses_irq_prio_masking(); that's used > > > > by the low-level flags manipulation code that gets inlined all over the place, > > > > and that code will work regarldess of whether we actually use NMI priorities. > > > > > > > > If we want to avoid using PMR masking *at all* on these platforms, we'd need to > > > > detect that within can_use_gic_priorities() or early_enable_pseudo_nmi(). > > > > > > I suspect that anyone trying to use PMR masking on these systems for > > > any purpose will be unhappy. The issue is talked about in: > > > > > > https://issuetracker.google.com/281831288 > > > > > > ...where you can see that the firmware on these systems isn't properly > > > saving/restoring some registers, including GICR_IPRIORITYR. > > > > Ok, then that's a latent bug even before the IPI changes, going back to the > > original workaround in commit: > > > > 44bd78dd2b8897f5 ("irqchip/gic-v3: Disable pseudo NMIs on Mediatek devices w/ firmware issues") > > > > For the sake of those reading the archive, can we have a better description of > > what exactly happens on these boards? > > > > IIUC on these boards the firmware fails to save+restore (some?) GICR registers > > across (some?) PSCI CPU_SUSPEND idle states. > > > > Which registers does it save+restore? > > > > Does it reset other registers into a specific state? > > Though I'm not an expert in this area, my understanding is that in > some of the deeper idle states then GICR registers are lost. That > matches a thread [0] I found. In early investigation I found that I > could comment out `cpu-idle-states` in the device tree to avoid the > problems [1]. I believe this is fully expected which is why firmware > is supposed to save/restore these registers whenever a low power is > entered/exited. I'd presume that any register not properly > saved/restored comes up in whatever its default state is. > > As far as pseudo-NMI was concerned, all I really needed to > save/restore was "GICR_NUM_IPRIORITYR" [2], but Marc Zyngier looked at > the code and identified [3] at least these in addition: > * GICR_CTLR > * GICR_ISPENDR0 > * GICR_ISACTIVER0 > * GICR_NSACR Looking at the GIC spec (Arm IHI 0069H), page 12-673, I see for all of the GICR_IPRIORITYR.Priority_offset_*B fields: | The reset behavior of this field is: | • On a GIC reset, this field resets to an architecturally UNKNOWN value. ... so at least per the architecture these could be reset to arbitrary values, and that priority might permit SGI/PPIs to be taken IRQs are priority-masked, or to prevent SGI/PPIs to be taken when priority-unmasked. I also see for GICR_CTLR that EnableLPIs would be reset to 0, and IIUC that means LPIs won't work on these parts, which seems like a problem. > That list seems to match the Arm Trusted Firmware patch that fixed the > issue [4]. ...but it will be impossible to ever get the fix rolled out > to all devices. Even if we could get firmware spins Qualified for > every device there will still be cases where we'll boot with the old > firmware. Since we _don't_ bundle the device tree with the firmware, > we believe that the quirk mechanism that we came up with (add a quirk > in never device trees and firmware removes the quirk when we have a > fix) is at least a robust/reliable way to detect the issue. > > The whole issue seems rather concerning, but (apparently) it never > caused issues in the kernel until we tried to use pseudo-NMI. Given you haven't seen any issues, I suspect those are getting reset to fixed values that happens to work out for us, but it is a bit worrisome more generally (e.g. the LPI case above). Mark. > > [0] https://github.com/ARM-software/tf-issues/issues/464 > [1] https://issuetracker.google.com/issues/197061987#comment27 > [2] https://crrev.com/c/4519877 > [3] https://issuetracker.google.com/issues/281831288#comment5 > [4] https://github.com/ARM-software/arm-trusted-firmware/commit/1c62cc7fbdf2ec2a7e69b3c027d507fcafdcaa12 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 D93F6E7B5E1 for ; Wed, 4 Oct 2023 10:00:30 +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=wfsNc8XynYP+JYLsvM5TBdmVOs6Axn7+7Z4wP5jsrMU=; b=vnD3odYa4KrWEc 8PykbWHTIJzBk7bT8a8CC7tefyJa+KyCSbKdrCKzfJbyGlBC0tDFqvwUZyoY4p/iOwrtxDJn7BwuL xvHK3Vt9WkTEO1VMtAQNLktcJfLybhb6/IgsNZFQobQxCjnH6OjScMpcvWmw60K2NCFgsw7+hC94B rEJdrd+yLFAsDgcgEpBa+w3YXwbBKJEDLl/9rUOlALGc3MaUuexjxx9pY+f8HQpGn10dpw58Km0BL PulBH8OQ+3Szc8pTUxXcMKVSgFG9sgoT666+f5C2QyxG97y4JQEgxFfbssgm0eD+04T0p+H+/oDb+ hVpvBXhTij4SLNhHPVkw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qnyfl-00HA3Y-15; Wed, 04 Oct 2023 10:00:05 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qnyfi-00HA2U-18; Wed, 04 Oct 2023 10:00:04 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E89ACDA7; Wed, 4 Oct 2023 03:00:38 -0700 (PDT) Received: from FVFF77S0Q05N (unknown [10.57.95.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 56DB53F5A1; Wed, 4 Oct 2023 02:59:57 -0700 (PDT) Date: Wed, 4 Oct 2023 10:59:50 +0100 From: Mark Rutland To: Doug Anderson Cc: Catalin Marinas , Will Deacon , Marc Zyngier , Stephen Boyd , Valentin Schneider , Chen-Yu Tsai , AngeloGioacchino Del Regno , D Scott Phillips , Josh Poimboeuf , Matthias Brugger , Misono Tomohiro , Peter Zijlstra , Sumit Garg , Thomas Gleixner , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org Subject: Re: [PATCH 1/2] arm64: smp: Fix pseudo NMI issues w/ broken Mediatek FW Message-ID: References: <20231002094526.1.Ie8f760213053e3d11592f892b30912dbac6b8b48@changeid> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231004_030002_488273_585D1E31 X-CRM114-Status: GOOD ( 68.48 ) 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 T24gVHVlLCBPY3QgMDMsIDIwMjMgYXQgMTI6MzI6MzlQTSAtMDcwMCwgRG91ZyBBbmRlcnNvbiB3 cm90ZToKPiBIaSwKPiAKPiBPbiBUdWUsIE9jdCAzLCAyMDIzIGF0IDk6MzLigK9BTSBNYXJrIFJ1 dGxhbmQgPG1hcmsucnV0bGFuZEBhcm0uY29tPiB3cm90ZToKPiA+Cj4gPiBPbiBUdWUsIE9jdCAw MywgMjAyMyBhdCAwNjo0MzowN0FNIC0wNzAwLCBEb3VnIEFuZGVyc29uIHdyb3RlOgo+ID4gPiBI aSwKPiA+ID4KPiA+ID4gT24gVHVlLCBPY3QgMywgMjAyMyBhdCA1OjI54oCvQU0gTWFyayBSdXRs YW5kIDxtYXJrLnJ1dGxhbmRAYXJtLmNvbT4gd3JvdGU6Cj4gPiA+ID4KPiA+ID4gPiBPbiBNb24s IE9jdCAwMiwgMjAyMyBhdCAxMjoxNjoxN1BNIC0wNzAwLCBEb3VnIEFuZGVyc29uIHdyb3RlOgo+ ID4gPiA+ID4gSGksCj4gPiA+ID4gPgo+ID4gPiA+ID4gT24gTW9uLCBPY3QgMiwgMjAyMyBhdCAx MDoyNOKAr0FNIE1hcmsgUnV0bGFuZCA8bWFyay5ydXRsYW5kQGFybS5jb20+IHdyb3RlOgo+ID4g PiA+ID4gPgo+ID4gPiA+ID4gPiBPbiBNb24sIE9jdCAwMiwgMjAyMyBhdCAwOTo0NToyOUFNIC0w NzAwLCBEb3VnbGFzIEFuZGVyc29uIHdyb3RlOgo+ID4gPiA+ID4gPiA+IFNvbWUgbWVkaWF0ZWsg ZGV2aWNlcyBoYXZlIHRoZSBwcm9wZXJ0eQo+ID4gPiA+ID4gPiA+ICJtZWRpYXRlayxicm9rZW4t c2F2ZS1yZXN0b3JlLWZ3IiBpbiB0aGVpciBHSUMuIFRoaXMgbWVhbnMgdGhhdCwKPiA+ID4gPiA+ ID4gPiBhbHRob3VnaCB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgcHNldWRvLU5NSSwgdGhlIGZpcm13 YXJlIGhhcyBhIGJ1Zwo+ID4gPiA+ID4gPiA+IHRoYXQgYmxvY2tzIGVuYWJsaW5nIGl0LiBXaGVu IHdlJ3JlIGluIHRoaXMgc3RhdGUsCj4gPiA+ID4gPiA+ID4gc3lzdGVtX3VzZXNfaXJxX3ByaW9f bWFza2luZygpIHdpbGwgcmV0dXJuIHRydWUgYnV0IHdlJ2xsIGZhaWwgdG8KPiA+ID4gPiA+ID4g PiBhY3R1YWxseSBlbmFibGUgdGhlIElSUSBpbiB0aGUgR0lDLgo+ID4gPiA+ID4gPiA+Cj4gPiA+ ID4gPiA+ID4gTGV0J3MgbWFrZSB0aGUgY29kZSBoYW5kbGUgdGhpcy4gV2UnbGwgZGV0ZWN0IHRo YXQgd2UgZmFpbGVkIHRvCj4gPiA+ID4gPiA+ID4gcmVxdWVzdCBhbiBJUEkgYXMgTk1JIGFuZCBm YWxsYmFjayB0byByZXF1ZXN0aW5nIGl0IG5vcm1hbGx5LiBUaG91Z2gKPiA+ID4gPiA+ID4gPiB3 ZSBleHBlY3QgdGhhdCBlaXRoZXIgYWxsIG9mIG91ciByZXF1ZXN0cyB3aWxsIGZhaWwgb3IgYWxs IHdpbGwKPiA+ID4gPiA+ID4gPiBzdWNjZWVkLCBpdCdzIGp1c3QgYXMgY2hlYXAgdG8ga2VlcCBh IHBlci1JUEkgYml0bWFwIGFuZCB0aGF0IGtlZXBzIHVzCj4gPiA+ID4gPiA+ID4gcm9idXN0Lgo+ ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gRml4ZXM6IDMzMWExYjNhODM2YyAoImFybTY0OiBz bXA6IEFkZCBhcmNoIHN1cHBvcnQgZm9yIGJhY2t0cmFjZSB1c2luZyBwc2V1ZG8tTk1JIikKPiA+ ID4gPiA+ID4gPiBSZXBvcnRlZC1ieTogQ2hlbi1ZdSBUc2FpIDx3ZW5zdEBjaHJvbWl1bS5vcmc+ Cj4gPiA+ID4gPiA+ID4gQ2xvc2VzOiBodHRwczovL2lzc3VldHJhY2tlci5nb29nbGUuY29tL2lz c3Vlcy8xOTcwNjE5ODcjY29tbWVudDY4Cj4gPiA+ID4gPiA+ID4gU2lnbmVkLW9mZi1ieTogRG91 Z2xhcyBBbmRlcnNvbiA8ZGlhbmRlcnNAY2hyb21pdW0ub3JnPgo+ID4gPiA+ID4gPiA+IC0tLQo+ ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gIGFyY2gvYXJtNjQva2VybmVsL3NtcC5jIHwgMTkg KysrKysrKysrKysrLS0tLS0tLQo+ID4gPiA+ID4gPiA+ICAxIGZpbGUgY2hhbmdlZCwgMTIgaW5z ZXJ0aW9ucygrKSwgNyBkZWxldGlvbnMoLSkKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gSSdtIG5v dCB0b28ga2VlbiBvbiBmYWxsaW5nIGJhY2sgaGVyZSB3aGVuIHdlIGhhdmUgbm8gaWRlYSB3aHkg dGhlIHJlcXVlc3QgZmFpbGVkLgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBJJ2QgcHJlZmVyIGlm IHdlIGNvdWxkIGNoZWNrIHRoZSBgc3VwcG9ydHNfcHNldWRvX25taXNgIHN0YXRpYyBrZXkgZGly ZWN0bHkgdG8KPiA+ID4gPiA+ID4gYWNjb3VudCBmb3IgdGhlIGNhc2Ugb2YgYnJva2VuIEZXLCBl LmcuIGFzIGJlbG93Lgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBNYXJrLgo+ID4gPiA+ID4gPgo+ ID4gPiA+ID4gPiAtLS0tPjgtLS0tCj4gPiA+ID4gPiA+IEZyb20gNzJmZGVjMDVjNjRhNzRmMjE4 NzFiNDRjN2M3NjBiYmUwN2NhYzA0NCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKPiA+ID4gPiA+ ID4gRnJvbTogTWFyayBSdXRsYW5kIDxtYXJrLnJ1dGxhbmRAYXJtLmNvbT4KPiA+ID4gPiA+ID4g RGF0ZTogTW9uLCAyIE9jdCAyMDIzIDE4OjAwOjM2ICswMTAwCj4gPiA+ID4gPiA+IFN1YmplY3Q6 IFtQQVRDSF0gYXJtNjQ6IHNtcDogYXZvaWQgTk1JIElQSXMgd2l0aCBicm9rZW4gTWVkaWFUZWsg RlcKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gU29tZSBNZWRpYVRlayBkZXZpY2VzIGhhdmUgYnJv a2VuIGZpcm13YXJlIHdoaWNoIGNvcnJ1cHRzIHNvbWUgR0lDUgo+ID4gPiA+ID4gPiByZWdpc3Rl cnMgYmVoaW5kIHRoZSBiYWNrIG9mIHRoZSBPUywgYW5kIHBzZXVkby1OTUlzIGNhbm5vdCBiZSB1 c2VkIG9uCj4gPiA+ID4gPiA+IHRoZXNlIGRldmljZXMuIEZvciBtb3JlIGRldGFpbHMgc2VlIGNv bW1pdDoKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gICA0NGJkNzhkZDJiODg5N2Y1ICgiaXJxY2hp cC9naWMtdjM6IERpc2FibGUgcHNldWRvIE5NSXMgb24gTWVkaWF0ZWsgZGV2aWNlcyB3LyBmaXJt d2FyZSBpc3N1ZXMiKQo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBXZSBkaWQgbm90IHRha2UgdGhp cyBwcm9ibGVtIGludG8gYWNjb3VudCBpbiBjb21taXQ6Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ ICAgMzMxYTFiM2E4MzZjMGYzOCAoImFybTY0OiBzbXA6IEFkZCBhcmNoIHN1cHBvcnQgZm9yIGJh Y2t0cmFjZSB1c2luZyBwc2V1ZG8tTk1JIikKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gU2luY2Ug dGhhdCBjb21taXQgYXJtNjQncyBTTVAgY29kZSB3aWxsIHRyeSB0byBzZXR1cCBzb21lIElQSXMg YXMKPiA+ID4gPiA+ID4gcHNldWRvLU5NSXMsIGV2ZW4gb24gc3lzdGVtcyB3aXRoIGJyb2tlbiBG Vy4gVGhlIEdJQ3YzIGNvZGUgd2lsbAo+ID4gPiA+ID4gPiAocmlnaHRseSkgcmVqZWN0IGF0dGVt cHRzIHRvIHJlcXVlc3QgaW50ZXJydXB0cyBhcyBwc2V1ZG8tTk1JcywKPiA+ID4gPiA+ID4gcmVz dWx0aW5nIGluIGJvb3QtdGltZSBmYWlsdXJlcy4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gQXZv aWQgdGhlIHByb2JsZW0gYnkgdGFraW5nIHRoZSBicm9rZW4gRlcgaW50byBhY2NvdW50IHdoZW4g ZGVjaWRpbmcgdG8KPiA+ID4gPiA+ID4gcmVxdWVzdCBJUElzIGFzIHBzZXVkby1OTUlzLiBUaGUg R0lDdjMgZHJpdmVyIG1haW50YWlucyBhIHN0YXRpY19rZXkKPiA+ID4gPiA+ID4gbmFtZWQgInN1 cHBvcnRzX3BzZXVkb19ubWlzIiB3aGljaCBpcyBmYWxzZSBvbiBzeXN0ZW1zIHdpdGggYnJva2Vu IEZXLAo+ID4gPiA+ID4gPiBhbmQgd2UgY2FuIGNvbnN1bHQgdGhpcyB3aXRoaW4gaXBpX3Nob3Vs ZF9iZV9ubWkoKS4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gRml4ZXM6IDMzMWExYjNhODM2YzBm MzggKCJhcm02NDogc21wOiBBZGQgYXJjaCBzdXBwb3J0IGZvciBiYWNrdHJhY2UgdXNpbmcgcHNl dWRvLU5NSSIpCj4gPiA+ID4gPiA+IFJlcG9ydGVkLWJ5OiBDaGVuLVl1IFRzYWkgPHdlbnN0QGNo cm9taXVtLm9yZz4KPiA+ID4gPiA+ID4gQ2xvc2VzOiBodHRwczovL2lzc3VldHJhY2tlci5nb29n bGUuY29tL2lzc3Vlcy8xOTcwNjE5ODcjY29tbWVudDY4Cj4gPiA+ID4gPiA+IFNpZ25lZC1vZmYt Ynk6IE1hcmsgUnV0bGFuZCA8bWFyay5ydXRsYW5kQGFybS5jb20+Cj4gPiA+ID4gPiA+IENjOiBE b3VnbGFzIEFuZGVyc29uIDxkaWFuZGVyc0BjaHJvbWl1bS5vcmc+Cj4gPiA+ID4gPiA+IENjOiBN YXJjIFp5bmdpZXIgPG1hekBrZXJuZWwub3JnPgo+ID4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+ID4g IGFyY2gvYXJtNjQva2VybmVsL3NtcC5jICAgICAgfCA1ICsrKystCj4gPiA+ID4gPiA+ICBkcml2 ZXJzL2lycWNoaXAvaXJxLWdpYy12My5jIHwgMiArLQo+ID4gPiA+ID4gPiAgMiBmaWxlcyBjaGFu Z2VkLCA1IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCj4gPiA+ID4gPgo+ID4gPiA+ID4g U3VyZSwgdGhpcyBpcyBPSyB3LyBtZSBhcyBsb25nIGFzIGZvbGtzIGRvbid0IG1pbmQgYWNjZXNz aW5nIHRoZQo+ID4gPiA+ID4gZ2xvYmFsIGhlcmUsIGl0J3MgT0sgdy8gbWU6Cj4gPiA+ID4gPgo+ ID4gPiA+ID4gUmV2aWV3ZWQtYnk6IERvdWdsYXMgQW5kZXJzb24gPGRpYW5kZXJzQGNocm9taXVt Lm9yZz4KPiA+ID4gPiA+Cj4gPiA+ID4gPiBJdCBzZWVtcyB0byB3b3JrIGZvciBtZSwgdGh1czoK PiA+ID4gPiA+Cj4gPiA+ID4gPiBUZXN0ZWQtYnk6IERvdWdsYXMgQW5kZXJzb24gPGRpYW5kZXJz QGNocm9taXVtLm9yZz4KPiA+ID4gPiA+Cj4gPiA+ID4gPgo+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0 IGEvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9zbXAuYwo+ID4g PiA+ID4gPiBpbmRleCA4MTRkOWFhOTNiMjFiLi4wNjFjNjkxNjBmOTBmIDEwMDY0NAo+ID4gPiA+ ID4gPiAtLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9zbXAuYwo+ID4gPiA+ID4gPiArKysgYi9hcmNo L2FybTY0L2tlcm5lbC9zbXAuYwo+ID4gPiA+ID4gPiBAQCAtOTY0LDcgKzk2NCwxMCBAQCBzdGF0 aWMgdm9pZCBzbXBfY3Jvc3NfY2FsbChjb25zdCBzdHJ1Y3QgY3B1bWFzayAqdGFyZ2V0LCB1bnNp Z25lZCBpbnQgaXBpbnIpCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ICBzdGF0aWMgYm9vbCBpcGlf c2hvdWxkX2JlX25taShlbnVtIGlwaV9tc2dfdHlwZSBpcGkpCj4gPiA+ID4gPiA+ICB7Cj4gPiA+ ID4gPiA+IC0gICAgICAgaWYgKCFzeXN0ZW1fdXNlc19pcnFfcHJpb19tYXNraW5nKCkpCj4gPiA+ ID4gPiA+ICsgICAgICAgREVDTEFSRV9TVEFUSUNfS0VZX0ZBTFNFKHN1cHBvcnRzX3BzZXVkb19u bWlzKTsKPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiArICAgICAgIGlmICghc3lzdGVtX3VzZXNf aXJxX3ByaW9fbWFza2luZygpIHx8Cj4gPiA+ID4gPiA+ICsgICAgICAgICAgICFzdGF0aWNfYnJh bmNoX2xpa2VseSgmc3VwcG9ydHNfcHNldWRvX25taXMpKQo+ID4gPiA+ID4KPiA+ID4gPiA+IE9u ZSB0aG91Z2h0LCBhY3R1YWxseSwgaXMgd2hldGhlciB3ZSBzaG91bGQgYWN0dWFsbHkgY2hhbmdl Cj4gPiA+ID4gPiBzeXN0ZW1fdXNlc19pcnFfcHJpb19tYXNraW5nKCkgdG8gcmV0dXJuIHRoZSBj b3JyZWN0IHZhbHVlLiBXaGF0IGRvCj4gPiA+ID4gPiB5b3UgdGhpbms/Cj4gPiA+ID4KPiA+ID4g PiBJIGRvbid0IHRoaW5rIHdlIHNob3VsZCBhZGQgdGhpcyB0byBzeXN0ZW1fdXNlc19pcnFfcHJp b19tYXNraW5nKCk7IHRoYXQncyB1c2VkCj4gPiA+ID4gYnkgdGhlIGxvdy1sZXZlbCBmbGFncyBt YW5pcHVsYXRpb24gY29kZSB0aGF0IGdldHMgaW5saW5lZCBhbGwgb3ZlciB0aGUgcGxhY2UsCj4g PiA+ID4gYW5kIHRoYXQgY29kZSB3aWxsIHdvcmsgcmVnYXJsZGVzcyBvZiB3aGV0aGVyIHdlIGFj dHVhbGx5IHVzZSBOTUkgcHJpb3JpdGllcy4KPiA+ID4gPgo+ID4gPiA+IElmIHdlIHdhbnQgdG8g YXZvaWQgdXNpbmcgUE1SIG1hc2tpbmcgKmF0IGFsbCogb24gdGhlc2UgcGxhdGZvcm1zLCB3ZSdk IG5lZWQgdG8KPiA+ID4gPiBkZXRlY3QgdGhhdCB3aXRoaW4gY2FuX3VzZV9naWNfcHJpb3JpdGll cygpIG9yIGVhcmx5X2VuYWJsZV9wc2V1ZG9fbm1pKCkuCj4gPiA+Cj4gPiA+IEkgc3VzcGVjdCB0 aGF0IGFueW9uZSB0cnlpbmcgdG8gdXNlIFBNUiBtYXNraW5nIG9uIHRoZXNlIHN5c3RlbXMgZm9y Cj4gPiA+IGFueSBwdXJwb3NlIHdpbGwgYmUgdW5oYXBweS4gVGhlIGlzc3VlIGlzIHRhbGtlZCBh Ym91dCBpbjoKPiA+ID4KPiA+ID4gaHR0cHM6Ly9pc3N1ZXRyYWNrZXIuZ29vZ2xlLmNvbS8yODE4 MzEyODgKPiA+ID4KPiA+ID4gLi4ud2hlcmUgeW91IGNhbiBzZWUgdGhhdCB0aGUgZmlybXdhcmUg b24gdGhlc2Ugc3lzdGVtcyBpc24ndCBwcm9wZXJseQo+ID4gPiBzYXZpbmcvcmVzdG9yaW5nIHNv bWUgcmVnaXN0ZXJzLCBpbmNsdWRpbmcgR0lDUl9JUFJJT1JJVFlSLgo+ID4KPiA+IE9rLCB0aGVu IHRoYXQncyBhIGxhdGVudCBidWcgZXZlbiBiZWZvcmUgdGhlIElQSSBjaGFuZ2VzLCBnb2luZyBi YWNrIHRvIHRoZQo+ID4gb3JpZ2luYWwgd29ya2Fyb3VuZCBpbiBjb21taXQ6Cj4gPgo+ID4gICA0 NGJkNzhkZDJiODg5N2Y1ICgiaXJxY2hpcC9naWMtdjM6IERpc2FibGUgcHNldWRvIE5NSXMgb24g TWVkaWF0ZWsgZGV2aWNlcyB3LyBmaXJtd2FyZSBpc3N1ZXMiKQo+ID4KPiA+IEZvciB0aGUgc2Fr ZSBvZiB0aG9zZSByZWFkaW5nIHRoZSBhcmNoaXZlLCBjYW4gd2UgaGF2ZSBhIGJldHRlciBkZXNj cmlwdGlvbiBvZgo+ID4gd2hhdCBleGFjdGx5IGhhcHBlbnMgb24gdGhlc2UgYm9hcmRzPwo+ID4K PiA+IElJVUMgb24gdGhlc2UgYm9hcmRzIHRoZSBmaXJtd2FyZSBmYWlscyB0byBzYXZlK3Jlc3Rv cmUgKHNvbWU/KSBHSUNSIHJlZ2lzdGVycwo+ID4gYWNyb3NzIChzb21lPykgUFNDSSBDUFVfU1VT UEVORCBpZGxlIHN0YXRlcy4KPiA+Cj4gPiBXaGljaCByZWdpc3RlcnMgZG9lcyBpdCBzYXZlK3Jl c3RvcmU/Cj4gPgo+ID4gRG9lcyBpdCByZXNldCBvdGhlciByZWdpc3RlcnMgaW50byBhIHNwZWNp ZmljIHN0YXRlPwo+IAo+IFRob3VnaCBJJ20gbm90IGFuIGV4cGVydCBpbiB0aGlzIGFyZWEsIG15 IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCBpbgo+IHNvbWUgb2YgdGhlIGRlZXBlciBpZGxlIHN0YXRl cyB0aGVuIEdJQ1IgcmVnaXN0ZXJzIGFyZSBsb3N0LiBUaGF0Cj4gbWF0Y2hlcyBhIHRocmVhZCBb MF0gSSBmb3VuZC4gSW4gZWFybHkgaW52ZXN0aWdhdGlvbiBJIGZvdW5kIHRoYXQgSQo+IGNvdWxk IGNvbW1lbnQgb3V0IGBjcHUtaWRsZS1zdGF0ZXNgIGluIHRoZSBkZXZpY2UgdHJlZSB0byBhdm9p ZCB0aGUKPiBwcm9ibGVtcyBbMV0uIEkgYmVsaWV2ZSB0aGlzIGlzIGZ1bGx5IGV4cGVjdGVkIHdo aWNoIGlzIHdoeSBmaXJtd2FyZQo+IGlzIHN1cHBvc2VkIHRvIHNhdmUvcmVzdG9yZSB0aGVzZSBy ZWdpc3RlcnMgd2hlbmV2ZXIgYSBsb3cgcG93ZXIgaXMKPiBlbnRlcmVkL2V4aXRlZC4gSSdkIHBy ZXN1bWUgdGhhdCBhbnkgcmVnaXN0ZXIgbm90IHByb3Blcmx5Cj4gc2F2ZWQvcmVzdG9yZWQgY29t ZXMgdXAgaW4gd2hhdGV2ZXIgaXRzIGRlZmF1bHQgc3RhdGUgaXMuCj4gCj4gQXMgZmFyIGFzIHBz ZXVkby1OTUkgd2FzIGNvbmNlcm5lZCwgYWxsIEkgcmVhbGx5IG5lZWRlZCB0bwo+IHNhdmUvcmVz dG9yZSB3YXMgIkdJQ1JfTlVNX0lQUklPUklUWVIiIFsyXSwgYnV0IE1hcmMgWnluZ2llciBsb29r ZWQgYXQKPiB0aGUgY29kZSBhbmQgaWRlbnRpZmllZCBbM10gYXQgbGVhc3QgdGhlc2UgaW4gYWRk aXRpb246Cj4gKiBHSUNSX0NUTFIKPiAqIEdJQ1JfSVNQRU5EUjAKPiAqIEdJQ1JfSVNBQ1RJVkVS MAo+ICogR0lDUl9OU0FDUgoKTG9va2luZyBhdCB0aGUgR0lDIHNwZWMgKEFybSBJSEkgMDA2OUgp LCBwYWdlIDEyLTY3MywgSSBzZWUgZm9yIGFsbCBvZiB0aGUKR0lDUl9JUFJJT1JJVFlSPG4+LlBy aW9yaXR5X29mZnNldF8qQiBmaWVsZHM6Cgp8IFRoZSByZXNldCBiZWhhdmlvciBvZiB0aGlzIGZp ZWxkIGlzOgp8IOKAoiBPbiBhIEdJQyByZXNldCwgdGhpcyBmaWVsZCByZXNldHMgdG8gYW4gYXJj aGl0ZWN0dXJhbGx5IFVOS05PV04gdmFsdWUuCgouLi4gc28gYXQgbGVhc3QgcGVyIHRoZSBhcmNo aXRlY3R1cmUgdGhlc2UgY291bGQgYmUgcmVzZXQgdG8gYXJiaXRyYXJ5IHZhbHVlcywKCmFuZCB0 aGF0IHByaW9yaXR5IG1pZ2h0IHBlcm1pdCBTR0kvUFBJcyB0byBiZSB0YWtlbiBJUlFzIGFyZSBw cmlvcml0eS1tYXNrZWQsCm9yIHRvIHByZXZlbnQgU0dJL1BQSXMgdG8gYmUgdGFrZW4gd2hlbiBw cmlvcml0eS11bm1hc2tlZC4KCkkgYWxzbyBzZWUgZm9yIEdJQ1JfQ1RMUiB0aGF0IEVuYWJsZUxQ SXMgd291bGQgYmUgcmVzZXQgdG8gMCwgYW5kIElJVUMgdGhhdAptZWFucyBMUElzIHdvbid0IHdv cmsgb24gdGhlc2UgcGFydHMsIHdoaWNoIHNlZW1zIGxpa2UgYSBwcm9ibGVtLgoKPiBUaGF0IGxp c3Qgc2VlbXMgdG8gbWF0Y2ggdGhlIEFybSBUcnVzdGVkIEZpcm13YXJlIHBhdGNoIHRoYXQgZml4 ZWQgdGhlCj4gaXNzdWUgWzRdLiAuLi5idXQgaXQgd2lsbCBiZSBpbXBvc3NpYmxlIHRvIGV2ZXIg Z2V0IHRoZSBmaXggcm9sbGVkIG91dAo+IHRvIGFsbCBkZXZpY2VzLiBFdmVuIGlmIHdlIGNvdWxk IGdldCBmaXJtd2FyZSBzcGlucyBRdWFsaWZpZWQgZm9yCj4gZXZlcnkgZGV2aWNlIHRoZXJlIHdp bGwgc3RpbGwgYmUgY2FzZXMgd2hlcmUgd2UnbGwgYm9vdCB3aXRoIHRoZSBvbGQKPiBmaXJtd2Fy ZS4gU2luY2Ugd2UgX2Rvbid0XyBidW5kbGUgdGhlIGRldmljZSB0cmVlIHdpdGggdGhlIGZpcm13 YXJlLAo+IHdlIGJlbGlldmUgdGhhdCB0aGUgcXVpcmsgbWVjaGFuaXNtIHRoYXQgd2UgY2FtZSB1 cCB3aXRoIChhZGQgYSBxdWlyawo+IGluIG5ldmVyIGRldmljZSB0cmVlcyBhbmQgZmlybXdhcmUg cmVtb3ZlcyB0aGUgcXVpcmsgd2hlbiB3ZSBoYXZlIGEKPiBmaXgpIGlzIGF0IGxlYXN0IGEgcm9i dXN0L3JlbGlhYmxlIHdheSB0byBkZXRlY3QgdGhlIGlzc3VlLgo+IAo+IFRoZSB3aG9sZSBpc3N1 ZSBzZWVtcyByYXRoZXIgY29uY2VybmluZywgYnV0IChhcHBhcmVudGx5KSBpdCBuZXZlcgo+IGNh dXNlZCBpc3N1ZXMgaW4gdGhlIGtlcm5lbCB1bnRpbCB3ZSB0cmllZCB0byB1c2UgcHNldWRvLU5N SS4KCkdpdmVuIHlvdSBoYXZlbid0IHNlZW4gYW55IGlzc3VlcywgSSBzdXNwZWN0IHRob3NlIGFy ZSBnZXR0aW5nIHJlc2V0IHRvIGZpeGVkCnZhbHVlcyB0aGF0IGhhcHBlbnMgdG8gd29yayBvdXQg Zm9yIHVzLCBidXQgaXQgaXMgYSBiaXQgd29ycmlzb21lIG1vcmUKZ2VuZXJhbGx5IChlLmcuIHRo ZSBMUEkgY2FzZSBhYm92ZSkuCgpNYXJrLgoKPiAKPiBbMF0gaHR0cHM6Ly9naXRodWIuY29tL0FS TS1zb2Z0d2FyZS90Zi1pc3N1ZXMvaXNzdWVzLzQ2NAo+IFsxXSBodHRwczovL2lzc3VldHJhY2tl ci5nb29nbGUuY29tL2lzc3Vlcy8xOTcwNjE5ODcjY29tbWVudDI3Cj4gWzJdIGh0dHBzOi8vY3Jy ZXYuY29tL2MvNDUxOTg3Nwo+IFszXSBodHRwczovL2lzc3VldHJhY2tlci5nb29nbGUuY29tL2lz c3Vlcy8yODE4MzEyODgjY29tbWVudDUKPiBbNF0gaHR0cHM6Ly9naXRodWIuY29tL0FSTS1zb2Z0 d2FyZS9hcm0tdHJ1c3RlZC1maXJtd2FyZS9jb21taXQvMWM2MmNjN2ZiZGYyZWMyYTdlNjliM2Mw MjdkNTA3ZmNhZmRjYWExMgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBs aXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlz dGluZm8vbGludXgtYXJtLWtlcm5lbAo=