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 6A305C433F5 for ; Mon, 10 Jan 2022 03:00:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238286AbiAJDAq (ORCPT ); Sun, 9 Jan 2022 22:00:46 -0500 Received: from szxga08-in.huawei.com ([45.249.212.255]:31081 "EHLO szxga08-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238272AbiAJDAp (ORCPT ); Sun, 9 Jan 2022 22:00:45 -0500 Received: from dggeme755-chm.china.huawei.com (unknown [172.30.72.57]) by szxga08-in.huawei.com (SkyGuard) with ESMTP id 4JXJQG4cBwz1FCZS; Mon, 10 Jan 2022 10:57:10 +0800 (CST) Received: from [10.67.110.136] (10.67.110.136) by dggeme755-chm.china.huawei.com (10.3.19.101) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2308.20; Mon, 10 Jan 2022 11:00:43 +0800 Subject: Re: [PATCH] arm64: Make CONFIG_ARM64_PSEUDO_NMI macro wrap all the pseudo-NMI code To: Mark Rutland CC: , , , , , , , References: <20220107085536.214501-1-heying24@huawei.com> From: He Ying Message-ID: Date: Mon, 10 Jan 2022 11:00:43 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.8.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [10.67.110.136] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To dggeme755-chm.china.huawei.com (10.3.19.101) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Mark, I'm just back from the weekend and sorry for the delayed reply. 在 2022/1/7 21:19, Mark Rutland 写道: > On Fri, Jan 07, 2022 at 03:55:36AM -0500, He Ying wrote: >> Our product has been updating its kernel from 4.4 to 5.10 recently and >> found a performance issue. We do a bussiness test called ARP test, which >> tests the latency for a ping-pong packets traffic with a certain payload. >> The result is as following. >> >> - 4.4 kernel: avg = ~20s >> - 5.10 kernel (CONFIG_ARM64_PSEUDO_NMI is not set): avg = ~40s > Have you tested with a recent mainline kernel, e.g. v5.15? Actuallly no, that's because this test is only available for the product environment and we don't have an available 5.15 kernel for it yet. > > Is this test publicly available, and can you say which hardrware (e.g. which > CPU implementation) you're testing with? Actually no. The test is only available for our product environment now. We are testing with hisilicon 1213 (4 ARM Cortex-A72 cores). > >> I have been just learning arm64 pseudo-NMI code and have a question, >> why is the related code not wrapped by CONFIG_ARM64_PSEUDO_NMI? > The code in question is all patched via alternatives, and when > CONFIG_ARM64_PSEUDO_NMI is not selected, the code was expected to only have the > overhead of the regular DAIF manipulation. I don't understand alernatives very well and I'll apreciate it if you can explain it a bit more. > >> I wonder if this brings some performance regression. >> >> First, I make this patch and then do the test again. Here's the result. >> >> - 5.10 kernel with this patch not applied: avg = ~40s >> - 5.10 kernel with this patch applied: avg = ~23s >> >> Amazing! Note that all kernel is built with CONFIG_ARM64_PSEUDO_NMI not >> set. It seems the pseudo-NMI feature actually brings some overhead to >> performance event if CONFIG_ARM64_PSEUDO_NMI is not set. > I'm surprised the overhead is so significant; as above this is all patched in > and so the overhead when this is disabled is expected to be *extremely* small. > > For example, wjen CONFIG_ARM64_PSEUDO_NMI, in arch_local_irq_enable(): > > * The portion under the system_has_prio_mask_debugging() test will be removed > entirely by the compiler, as this internally checks > IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI). > > * The assembly will be left as a write to DAIFClr. The only additional cost > should be that of generating GIC_PRIO_IRQON into a register. > > * The pmr_sync() will be removed entirely by the compiler as is defined > conditionally dependent on CONFIG_ARM64_PSEUDO_NMI. > > I can't spot an obvious issue with that or ther other cases. In the common case > those add no new instructions, and in the worst case they only add NOPs. Thanks for your detailed explaination! Actually I can't understand the result exactly. I build two 5.10 kernel images with this patch applied or not and objdump them. Indeed, the disassembles of 'arch_local_irq_restore' are the same. Do you have any ideas how we can find the root cause why this patch improves the performance so much? However, the test result is trustworthy because we do it many times and the result is always repeatable. > >> Furthermore, I find the feature also brings some overhead to vmlinux size. >> I build 5.10 kernel with this patch applied or not while >> CONFIG_ARM64_PSEUDO_NMI is not set. >> >> - 5.10 kernel with this patch not applied: vmlinux size is 384060600 Bytes. >> - 5.10 kernel with this patch applied: vmlinux size is 383842936 Bytes. >> >> That means arm64 pseudo-NMI feature may bring ~200KB overhead to >> vmlinux size. > I suspect that's just the (unused) alternatives, and we could improve that by > passing the config into the alternative blocks. Do you mean the sections generated by the alternatives? I don't understand alernatives very well and I'll apreciate it if you can explain it a bit more. > >> Above all, arm64 pseudo-NMI feature brings some overhead to vmlinux size >> and performance even if config is not set. To avoid it, add macro control >> all around the related code. >> >> Signed-off-by: He Ying >> --- >> arch/arm64/include/asm/irqflags.h | 38 +++++++++++++++++++++++++++++-- >> arch/arm64/kernel/entry.S | 4 ++++ >> 2 files changed, 40 insertions(+), 2 deletions(-) >> >> diff --git a/arch/arm64/include/asm/irqflags.h b/arch/arm64/include/asm/irqflags.h >> index b57b9b1e4344..82f771b41cf5 100644 >> --- a/arch/arm64/include/asm/irqflags.h >> +++ b/arch/arm64/include/asm/irqflags.h >> @@ -26,6 +26,7 @@ >> */ >> static inline void arch_local_irq_enable(void) >> { >> +#ifdef CONFIG_ARM64_PSEUDO_NMI >> if (system_has_prio_mask_debugging()) { >> u32 pmr = read_sysreg_s(SYS_ICC_PMR_EL1); >> >> @@ -41,10 +42,18 @@ static inline void arch_local_irq_enable(void) >> : "memory"); >> >> pmr_sync(); >> +#else >> + asm volatile( >> + "msr daifclr, #3 // arch_local_irq_enable" >> + : >> + : >> + : "memory"); >> +#endif > I'm happy to rework this to improve matters, but I am very much not happy with > duplicating the logic for the !PSEUDO_NMI case. Adding more ifdeffery and > copies of that is not acceptable. I agree. Adding these ifdeffery is a bit ugly. Let's see if there are some better ways. > > Instead, can you please try changing the alternative to also take the config, > e.g. here have: > > | asm volatile(ALTERNATIVE( > | "msr daifclr, #3 // arch_local_irq_enable", > | __msr_s(SYS_ICC_PMR_EL1, "%0"), > | ARM64_HAS_IRQ_PRIO_MASKING, > | CONFIG_ARM64_PSEUDO_NMI) > | : > | : "r" ((unsigned long) GIC_PRIO_IRQON) > | : "memory"); > > ... and see if that makes a significant difference? > > Likewise for the other casees. OK, I'll try it. But I have some questions. Here's the comment of ALERNATIVE: /*  * Usage: asm(ALTERNATIVE(oldinstr, newinstr, feature));  *  * Usage: asm(ALTERNATIVE(oldinstr, newinstr, feature, CONFIG_FOO));  * N.B. If CONFIG_FOO is specified, but not selected, the whole block  *      will be omitted, including oldinstr.  */ If CONFIG_FOO is not selected, the whole block will be omitted including oldinstr. But we still want the oldinstr in this situation. Do I misunderstand something? > >> #endif /* __ASM_IRQFLAGS_H */ >> diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S >> index 2f69ae43941d..ffc32d3d909a 100644 >> --- a/arch/arm64/kernel/entry.S >> +++ b/arch/arm64/kernel/entry.S >> @@ -300,6 +300,7 @@ alternative_else_nop_endif >> str w21, [sp, #S_SYSCALLNO] >> .endif >> >> +#ifdef CONFIG_ARM64_PSEUDO_NMI >> /* Save pmr */ >> alternative_if ARM64_HAS_IRQ_PRIO_MASKING >> mrs_s x20, SYS_ICC_PMR_EL1 >> @@ -307,6 +308,7 @@ alternative_if ARM64_HAS_IRQ_PRIO_MASKING >> mov x20, #GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET >> msr_s SYS_ICC_PMR_EL1, x20 >> alternative_else_nop_endif >> +#endif >> >> /* Re-enable tag checking (TCO set on exception entry) */ >> #ifdef CONFIG_ARM64_MTE >> @@ -330,6 +332,7 @@ alternative_else_nop_endif >> disable_daif >> .endif >> >> +#ifdef CONFIG_ARM64_PSEUDO_NMI >> /* Restore pmr */ >> alternative_if ARM64_HAS_IRQ_PRIO_MASKING >> ldr x20, [sp, #S_PMR_SAVE] >> @@ -339,6 +342,7 @@ alternative_if ARM64_HAS_IRQ_PRIO_MASKING >> dsb sy // Ensure priority change is seen by redistributor >> .L__skip_pmr_sync\@: >> alternative_else_nop_endif >> +#endif > For these two I think the ifdeffery is fine, but I'm surprised this has a > measureable impact as the alternatives should be initialized to NOPS (and never > modified). Yes, these NOPs may bring some overhead. But I can't say how much these NOPs contribute to the result of test. > > Thanks, > Mark. > . 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 D36F7C433EF for ; Mon, 10 Jan 2022 03:02:53 +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-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:CC:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=DHwArHfYPFUW/80O2iRlingqCrJW3hp27yUjbQYc3pc=; b=kYLLou6hRXCOGkuhqGjnlTknBp aNa8u12ng6VcfklKB2wrNikM2nkvOLk1+U/o99CXmtvA2S+kXeizal+CHqqZXahxIECyvaiNY2yFx hDW4iaQG5nU9bHNLHJHdUntQSysb8FzMxtVWfLoFPLP/ORgztlbbPp4wti/pY5OCdWUcwmSvTJ1rk x1C/ISLhZtt9xbkAqtsyz/UfEl/XTJjN9V7QzN8yCd2Z41QMnPF2EiqKIodqTHWCcshi/yZRUuiVB e9O/wK3a93ozNW0xEZIGXZUjo+1eHgVqRHxqlnBkmi664uAEADoutK6KoQsi5iQb9jpT2WthdEn6m gCy1F6FQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1n6kvc-0090SP-7h; Mon, 10 Jan 2022 03:01:00 +0000 Received: from szxga08-in.huawei.com ([45.249.212.255]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1n6kvY-0090Qm-4h for linux-arm-kernel@lists.infradead.org; Mon, 10 Jan 2022 03:00:58 +0000 Received: from dggeme755-chm.china.huawei.com (unknown [172.30.72.57]) by szxga08-in.huawei.com (SkyGuard) with ESMTP id 4JXJQG4cBwz1FCZS; Mon, 10 Jan 2022 10:57:10 +0800 (CST) Received: from [10.67.110.136] (10.67.110.136) by dggeme755-chm.china.huawei.com (10.3.19.101) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2308.20; Mon, 10 Jan 2022 11:00:43 +0800 Subject: Re: [PATCH] arm64: Make CONFIG_ARM64_PSEUDO_NMI macro wrap all the pseudo-NMI code To: Mark Rutland CC: , , , , , , , References: <20220107085536.214501-1-heying24@huawei.com> From: He Ying Message-ID: Date: Mon, 10 Jan 2022 11:00:43 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.8.1 MIME-Version: 1.0 In-Reply-To: X-Originating-IP: [10.67.110.136] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To dggeme755-chm.china.huawei.com (10.3.19.101) X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220109_190056_572163_7008C84D X-CRM114-Status: GOOD ( 50.39 ) 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-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgTWFyaywKCkknbSBqdXN0IGJhY2sgZnJvbSB0aGUgd2Vla2VuZCBhbmQgc29ycnkgZm9yIHRo ZSBkZWxheWVkIHJlcGx5LgoKCuWcqCAyMDIyLzEvNyAyMToxOSwgTWFyayBSdXRsYW5kIOWGmemB kzoKPiBPbiBGcmksIEphbiAwNywgMjAyMiBhdCAwMzo1NTozNkFNIC0wNTAwLCBIZSBZaW5nIHdy b3RlOgo+PiBPdXIgcHJvZHVjdCBoYXMgYmVlbiB1cGRhdGluZyBpdHMga2VybmVsIGZyb20gNC40 IHRvIDUuMTAgcmVjZW50bHkgYW5kCj4+IGZvdW5kIGEgcGVyZm9ybWFuY2UgaXNzdWUuIFdlIGRv IGEgYnVzc2luZXNzIHRlc3QgY2FsbGVkIEFSUCB0ZXN0LCB3aGljaAo+PiB0ZXN0cyB0aGUgbGF0 ZW5jeSBmb3IgYSBwaW5nLXBvbmcgcGFja2V0cyB0cmFmZmljIHdpdGggYSBjZXJ0YWluIHBheWxv YWQuCj4+IFRoZSByZXN1bHQgaXMgYXMgZm9sbG93aW5nLgo+Pgo+PiAgIC0gNC40IGtlcm5lbDog YXZnID0gfjIwcwo+PiAgIC0gNS4xMCBrZXJuZWwgKENPTkZJR19BUk02NF9QU0VVRE9fTk1JIGlz IG5vdCBzZXQpOiBhdmcgPSB+NDBzCj4gSGF2ZSB5b3UgdGVzdGVkIHdpdGggYSByZWNlbnQgbWFp bmxpbmUga2VybmVsLCBlLmcuIHY1LjE1PwoKQWN0dWFsbGx5IG5vLCB0aGF0J3MgYmVjYXVzZSB0 aGlzIHRlc3QgaXMgb25seSBhdmFpbGFibGUgZm9yIHRoZSBwcm9kdWN0IAplbnZpcm9ubWVudCBh bmQKCndlIGRvbid0IGhhdmUgYW4gYXZhaWxhYmxlIDUuMTUga2VybmVsIGZvciBpdCB5ZXQuCgo+ Cj4gSXMgdGhpcyB0ZXN0IHB1YmxpY2x5IGF2YWlsYWJsZSwgYW5kIGNhbiB5b3Ugc2F5IHdoaWNo IGhhcmRyd2FyZSAoZS5nLiB3aGljaAo+IENQVSBpbXBsZW1lbnRhdGlvbikgeW91J3JlIHRlc3Rp bmcgd2l0aD8KCkFjdHVhbGx5IG5vLiBUaGUgdGVzdCBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igb3Vy IHByb2R1Y3QgZW52aXJvbm1lbnQgbm93LiAKV2UgYXJlIHRlc3RpbmcKCndpdGggaGlzaWxpY29u IDEyMTMgKDQgQVJNIENvcnRleC1BNzIgY29yZXMpLgoKPgo+PiBJIGhhdmUgYmVlbiBqdXN0IGxl YXJuaW5nIGFybTY0IHBzZXVkby1OTUkgY29kZSBhbmQgaGF2ZSBhIHF1ZXN0aW9uLAo+PiB3aHkg aXMgdGhlIHJlbGF0ZWQgY29kZSBub3Qgd3JhcHBlZCBieSBDT05GSUdfQVJNNjRfUFNFVURPX05N ST8KPiBUaGUgY29kZSBpbiBxdWVzdGlvbiBpcyBhbGwgcGF0Y2hlZCB2aWEgYWx0ZXJuYXRpdmVz LCBhbmQgd2hlbgo+IENPTkZJR19BUk02NF9QU0VVRE9fTk1JIGlzIG5vdCBzZWxlY3RlZCwgdGhl IGNvZGUgd2FzIGV4cGVjdGVkIHRvIG9ubHkgaGF2ZSB0aGUKPiBvdmVyaGVhZCBvZiB0aGUgcmVn dWxhciBEQUlGIG1hbmlwdWxhdGlvbi4KSSBkb24ndCB1bmRlcnN0YW5kIGFsZXJuYXRpdmVzIHZl cnkgd2VsbCBhbmQgSSdsbCBhcHJlY2lhdGUgaXQgaWYgeW91IApjYW4gZXhwbGFpbiBpdCBhIGJp dCBtb3JlLgo+Cj4+IEkgd29uZGVyIGlmIHRoaXMgYnJpbmdzIHNvbWUgcGVyZm9ybWFuY2UgcmVn cmVzc2lvbi4KPj4KPj4gRmlyc3QsIEkgbWFrZSB0aGlzIHBhdGNoIGFuZCB0aGVuIGRvIHRoZSB0 ZXN0IGFnYWluLiBIZXJlJ3MgdGhlIHJlc3VsdC4KPj4KPj4gICAtIDUuMTAga2VybmVsIHdpdGgg dGhpcyBwYXRjaCBub3QgYXBwbGllZDogYXZnID0gfjQwcwo+PiAgIC0gNS4xMCBrZXJuZWwgd2l0 aCB0aGlzIHBhdGNoIGFwcGxpZWQ6IGF2ZyA9IH4yM3MKPj4KPj4gQW1hemluZyEgTm90ZSB0aGF0 IGFsbCBrZXJuZWwgaXMgYnVpbHQgd2l0aCBDT05GSUdfQVJNNjRfUFNFVURPX05NSSBub3QKPj4g c2V0LiBJdCBzZWVtcyB0aGUgcHNldWRvLU5NSSBmZWF0dXJlIGFjdHVhbGx5IGJyaW5ncyBzb21l IG92ZXJoZWFkIHRvCj4+IHBlcmZvcm1hbmNlIGV2ZW50IGlmIENPTkZJR19BUk02NF9QU0VVRE9f Tk1JIGlzIG5vdCBzZXQuCj4gSSdtIHN1cnByaXNlZCB0aGUgb3ZlcmhlYWQgaXMgc28gc2lnbmlm aWNhbnQ7IGFzIGFib3ZlIHRoaXMgaXMgYWxsIHBhdGNoZWQgaW4KPiBhbmQgc28gdGhlIG92ZXJo ZWFkIHdoZW4gdGhpcyBpcyBkaXNhYmxlZCBpcyBleHBlY3RlZCB0byBiZSAqZXh0cmVtZWx5KiBz bWFsbC4KPgo+IEZvciBleGFtcGxlLCB3amVuIENPTkZJR19BUk02NF9QU0VVRE9fTk1JLCBpbiBh cmNoX2xvY2FsX2lycV9lbmFibGUoKToKPgo+ICogVGhlIHBvcnRpb24gdW5kZXIgdGhlIHN5c3Rl bV9oYXNfcHJpb19tYXNrX2RlYnVnZ2luZygpIHRlc3Qgd2lsbCBiZSByZW1vdmVkCj4gICAgZW50 aXJlbHkgYnkgdGhlIGNvbXBpbGVyLCBhcyB0aGlzIGludGVybmFsbHkgY2hlY2tzCj4gICAgSVNf RU5BQkxFRChDT05GSUdfQVJNNjRfUFNFVURPX05NSSkuCj4KPiAqIFRoZSBhc3NlbWJseSB3aWxs IGJlIGxlZnQgYXMgYSB3cml0ZSB0byBEQUlGQ2xyLiBUaGUgb25seSBhZGRpdGlvbmFsIGNvc3QK PiAgICBzaG91bGQgYmUgdGhhdCBvZiBnZW5lcmF0aW5nIEdJQ19QUklPX0lSUU9OIGludG8gYSBy ZWdpc3Rlci4KPgo+ICogVGhlIHBtcl9zeW5jKCkgd2lsbCBiZSByZW1vdmVkIGVudGlyZWx5IGJ5 IHRoZSBjb21waWxlciBhcyBpcyBkZWZpbmVkCj4gICAgY29uZGl0aW9uYWxseSBkZXBlbmRlbnQg b24gQ09ORklHX0FSTTY0X1BTRVVET19OTUkuCj4KPiBJIGNhbid0IHNwb3QgYW4gb2J2aW91cyBp c3N1ZSB3aXRoIHRoYXQgb3IgdGhlciBvdGhlciBjYXNlcy4gSW4gdGhlIGNvbW1vbiBjYXNlCj4g dGhvc2UgYWRkIG5vIG5ldyBpbnN0cnVjdGlvbnMsIGFuZCBpbiB0aGUgd29yc3QgY2FzZSB0aGV5 IG9ubHkgYWRkIE5PUHMuCgpUaGFua3MgZm9yIHlvdXIgZGV0YWlsZWQgZXhwbGFpbmF0aW9uISBB Y3R1YWxseSBJIGNhbid0IHVuZGVyc3RhbmQgdGhlIApyZXN1bHQgZXhhY3RseS4KCkkgYnVpbGQg dHdvIDUuMTAga2VybmVsIGltYWdlcyB3aXRoIHRoaXMgcGF0Y2ggYXBwbGllZCBvciBub3QgYW5k IApvYmpkdW1wIHRoZW0uIEluZGVlZCwKCnRoZSBkaXNhc3NlbWJsZXMgb2YgJ2FyY2hfbG9jYWxf aXJxX3Jlc3RvcmUnIGFyZSB0aGUgc2FtZS4gRG8geW91IGhhdmUgCmFueSBpZGVhcyBob3cKCndl IGNhbiBmaW5kIHRoZSByb290IGNhdXNlIHdoeSB0aGlzIHBhdGNoIGltcHJvdmVzIHRoZSBwZXJm b3JtYW5jZSBzbyBtdWNoPwoKCkhvd2V2ZXIsIHRoZSB0ZXN0IHJlc3VsdCBpcyB0cnVzdHdvcnRo eSBiZWNhdXNlIHdlIGRvIGl0IG1hbnkgdGltZXMgYW5kIAp0aGUgcmVzdWx0IGlzCgphbHdheXMg cmVwZWF0YWJsZS4KCj4KPj4gRnVydGhlcm1vcmUsIEkgZmluZCB0aGUgZmVhdHVyZSBhbHNvIGJy aW5ncyBzb21lIG92ZXJoZWFkIHRvIHZtbGludXggc2l6ZS4KPj4gSSBidWlsZCA1LjEwIGtlcm5l bCB3aXRoIHRoaXMgcGF0Y2ggYXBwbGllZCBvciBub3Qgd2hpbGUKPj4gQ09ORklHX0FSTTY0X1BT RVVET19OTUkgaXMgbm90IHNldC4KPj4KPj4gICAtIDUuMTAga2VybmVsIHdpdGggdGhpcyBwYXRj aCBub3QgYXBwbGllZDogdm1saW51eCBzaXplIGlzIDM4NDA2MDYwMCBCeXRlcy4KPj4gICAtIDUu MTAga2VybmVsIHdpdGggdGhpcyBwYXRjaCBhcHBsaWVkOiB2bWxpbnV4IHNpemUgaXMgMzgzODQy OTM2IEJ5dGVzLgo+Pgo+PiBUaGF0IG1lYW5zIGFybTY0IHBzZXVkby1OTUkgZmVhdHVyZSBtYXkg YnJpbmcgfjIwMEtCIG92ZXJoZWFkIHRvCj4+IHZtbGludXggc2l6ZS4KPiBJIHN1c3BlY3QgdGhh dCdzIGp1c3QgdGhlICh1bnVzZWQpIGFsdGVybmF0aXZlcywgYW5kIHdlIGNvdWxkIGltcHJvdmUg dGhhdCBieQo+IHBhc3NpbmcgdGhlIGNvbmZpZyBpbnRvIHRoZSBhbHRlcm5hdGl2ZSBibG9ja3Mu CgpEbyB5b3UgbWVhbiB0aGUgc2VjdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSBhbHRlcm5hdGl2ZXM/ IEkgZG9uJ3QgdW5kZXJzdGFuZAoKYWxlcm5hdGl2ZXMgdmVyeSB3ZWxsIGFuZCBJJ2xsIGFwcmVj aWF0ZSBpdCBpZiB5b3UgY2FuIGV4cGxhaW4gaXQgYSBiaXQgCm1vcmUuCgo+Cj4+IEFib3ZlIGFs bCwgYXJtNjQgcHNldWRvLU5NSSBmZWF0dXJlIGJyaW5ncyBzb21lIG92ZXJoZWFkIHRvIHZtbGlu dXggc2l6ZQo+PiBhbmQgcGVyZm9ybWFuY2UgZXZlbiBpZiBjb25maWcgaXMgbm90IHNldC4gVG8g YXZvaWQgaXQsIGFkZCBtYWNybyBjb250cm9sCj4+IGFsbCBhcm91bmQgdGhlIHJlbGF0ZWQgY29k ZS4KPj4KPj4gU2lnbmVkLW9mZi1ieTogSGUgWWluZyA8aGV5aW5nMjRAaHVhd2VpLmNvbT4KPj4g LS0tCj4+ICAgYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pcnFmbGFncy5oIHwgMzggKysrKysrKysr KysrKysrKysrKysrKysrKysrKystLQo+PiAgIGFyY2gvYXJtNjQva2VybmVsL2VudHJ5LlMgICAg ICAgICB8ICA0ICsrKysKPj4gICAyIGZpbGVzIGNoYW5nZWQsIDQwIGluc2VydGlvbnMoKyksIDIg ZGVsZXRpb25zKC0pCj4+Cj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2ly cWZsYWdzLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKPj4gaW5kZXggYjU3 YjliMWU0MzQ0Li44MmY3NzFiNDFjZjUgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQvaW5jbHVk ZS9hc20vaXJxZmxhZ3MuaAo+PiArKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lycWZsYWdz LmgKPj4gQEAgLTI2LDYgKzI2LDcgQEAKPj4gICAgKi8KPj4gICBzdGF0aWMgaW5saW5lIHZvaWQg YXJjaF9sb2NhbF9pcnFfZW5hYmxlKHZvaWQpCj4+ICAgewo+PiArI2lmZGVmIENPTkZJR19BUk02 NF9QU0VVRE9fTk1JCj4+ICAgCWlmIChzeXN0ZW1faGFzX3ByaW9fbWFza19kZWJ1Z2dpbmcoKSkg ewo+PiAgIAkJdTMyIHBtciA9IHJlYWRfc3lzcmVnX3MoU1lTX0lDQ19QTVJfRUwxKTsKPj4gICAK Pj4gQEAgLTQxLDEwICs0MiwxOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9sb2NhbF9pcnFf ZW5hYmxlKHZvaWQpCj4+ICAgCQk6ICJtZW1vcnkiKTsKPj4gICAKPj4gICAJcG1yX3N5bmMoKTsK Pj4gKyNlbHNlCj4+ICsJYXNtIHZvbGF0aWxlKAo+PiArCQkibXNyCWRhaWZjbHIsICMzCQkvLyBh cmNoX2xvY2FsX2lycV9lbmFibGUiCj4+ICsJCToKPj4gKwkJOgo+PiArCQk6ICJtZW1vcnkiKTsK Pj4gKyNlbmRpZgo+IEknbSBoYXBweSB0byByZXdvcmsgdGhpcyB0byBpbXByb3ZlIG1hdHRlcnMs IGJ1dCBJIGFtIHZlcnkgbXVjaCBub3QgaGFwcHkgd2l0aAo+IGR1cGxpY2F0aW5nIHRoZSBsb2dp YyBmb3IgdGhlICFQU0VVRE9fTk1JIGNhc2UuIEFkZGluZyBtb3JlIGlmZGVmZmVyeSBhbmQKPiBj b3BpZXMgb2YgdGhhdCBpcyBub3QgYWNjZXB0YWJsZS4KSSBhZ3JlZS4gQWRkaW5nIHRoZXNlIGlm ZGVmZmVyeSBpcyBhIGJpdCB1Z2x5LiBMZXQncyBzZWUgaWYgdGhlcmUgYXJlIApzb21lIGJldHRl ciB3YXlzLgo+Cj4gSW5zdGVhZCwgY2FuIHlvdSBwbGVhc2UgdHJ5IGNoYW5naW5nIHRoZSBhbHRl cm5hdGl2ZSB0byBhbHNvIHRha2UgdGhlIGNvbmZpZywKPiBlLmcuIGhlcmUgaGF2ZToKPgo+IHwg ICAgICAgYXNtIHZvbGF0aWxlKEFMVEVSTkFUSVZFKAo+IHwgICAgICAgICAgICAgICAibXNyICAg IGRhaWZjbHIsICMzICAgICAgICAgICAgIC8vIGFyY2hfbG9jYWxfaXJxX2VuYWJsZSIsCj4gfCAg ICAgICAgICAgICAgIF9fbXNyX3MoU1lTX0lDQ19QTVJfRUwxLCAiJTAiKSwKPiB8ICAgICAgICAg ICAgICAgQVJNNjRfSEFTX0lSUV9QUklPX01BU0tJTkcsCj4gfCAgICAgICAgICAgICAgIENPTkZJ R19BUk02NF9QU0VVRE9fTk1JKQo+IHwgICAgICAgICAgICAgICA6Cj4gfCAgICAgICAgICAgICAg IDogInIiICgodW5zaWduZWQgbG9uZykgR0lDX1BSSU9fSVJRT04pCj4gfCAgICAgICAgICAgICAg IDogIm1lbW9yeSIpOwo+Cj4gLi4uIGFuZCBzZWUgaWYgdGhhdCBtYWtlcyBhIHNpZ25pZmljYW50 IGRpZmZlcmVuY2U/Cj4KPiBMaWtld2lzZSBmb3IgdGhlIG90aGVyIGNhc2Vlcy4KCk9LLCBJJ2xs IHRyeSBpdC4gQnV0IEkgaGF2ZSBzb21lIHF1ZXN0aW9ucy4gSGVyZSdzIHRoZSBjb21tZW50IG9m IApBTEVSTkFUSVZFOgoKLyoKIMKgKiBVc2FnZTogYXNtKEFMVEVSTkFUSVZFKG9sZGluc3RyLCBu ZXdpbnN0ciwgZmVhdHVyZSkpOwogwqAqCiDCoCogVXNhZ2U6IGFzbShBTFRFUk5BVElWRShvbGRp bnN0ciwgbmV3aW5zdHIsIGZlYXR1cmUsIENPTkZJR19GT08pKTsKIMKgKiBOLkIuIElmIENPTkZJ R19GT08gaXMgc3BlY2lmaWVkLCBidXQgbm90IHNlbGVjdGVkLCB0aGUgd2hvbGUgYmxvY2sKIMKg KsKgwqDCoMKgwqAgd2lsbCBiZSBvbWl0dGVkLCBpbmNsdWRpbmcgb2xkaW5zdHIuCiDCoCovCgpJ ZiBDT05GSUdfRk9PIGlzIG5vdCBzZWxlY3RlZCwgdGhlIHdob2xlIGJsb2NrIHdpbGwgYmUgb21p dHRlZCBpbmNsdWRpbmcgCm9sZGluc3RyLgoKQnV0IHdlIHN0aWxsIHdhbnQgdGhlIG9sZGluc3Ry IGluIHRoaXMgc2l0dWF0aW9uLiBEbyBJIG1pc3VuZGVyc3RhbmQgCnNvbWV0aGluZz8KCj4KPj4g ICAjZW5kaWYgLyogX19BU01fSVJRRkxBR1NfSCAqLwo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02 NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvYXJtNjQva2VybmVsL2VudHJ5LlMKPj4gaW5kZXggMmY2 OWFlNDM5NDFkLi5mZmMzMmQzZDkwOWEgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva2VybmVs L2VudHJ5LlMKPj4gKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvZW50cnkuUwo+PiBAQCAtMzAwLDYg KzMwMCw3IEBAIGFsdGVybmF0aXZlX2Vsc2Vfbm9wX2VuZGlmCj4+ICAgCXN0cgl3MjEsIFtzcCwg I1NfU1lTQ0FMTE5PXQo+PiAgIAkuZW5kaWYKPj4gICAKPj4gKyNpZmRlZiBDT05GSUdfQVJNNjRf UFNFVURPX05NSQo+PiAgIAkvKiBTYXZlIHBtciAqLwo+PiAgIGFsdGVybmF0aXZlX2lmIEFSTTY0 X0hBU19JUlFfUFJJT19NQVNLSU5HCj4+ICAgCW1yc19zCXgyMCwgU1lTX0lDQ19QTVJfRUwxCj4+ IEBAIC0zMDcsNiArMzA4LDcgQEAgYWx0ZXJuYXRpdmVfaWYgQVJNNjRfSEFTX0lSUV9QUklPX01B U0tJTkcKPj4gICAJbW92CXgyMCwgI0dJQ19QUklPX0lSUU9OIHwgR0lDX1BSSU9fUFNSX0lfU0VU Cj4+ICAgCW1zcl9zCVNZU19JQ0NfUE1SX0VMMSwgeDIwCj4+ICAgYWx0ZXJuYXRpdmVfZWxzZV9u b3BfZW5kaWYKPj4gKyNlbmRpZgo+PiAgIAo+PiAgIAkvKiBSZS1lbmFibGUgdGFnIGNoZWNraW5n IChUQ08gc2V0IG9uIGV4Y2VwdGlvbiBlbnRyeSkgKi8KPj4gICAjaWZkZWYgQ09ORklHX0FSTTY0 X01URQo+PiBAQCAtMzMwLDYgKzMzMiw3IEBAIGFsdGVybmF0aXZlX2Vsc2Vfbm9wX2VuZGlmCj4+ ICAgCWRpc2FibGVfZGFpZgo+PiAgIAkuZW5kaWYKPj4gICAKPj4gKyNpZmRlZiBDT05GSUdfQVJN NjRfUFNFVURPX05NSQo+PiAgIAkvKiBSZXN0b3JlIHBtciAqLwo+PiAgIGFsdGVybmF0aXZlX2lm IEFSTTY0X0hBU19JUlFfUFJJT19NQVNLSU5HCj4+ICAgCWxkcgl4MjAsIFtzcCwgI1NfUE1SX1NB VkVdCj4+IEBAIC0zMzksNiArMzQyLDcgQEAgYWx0ZXJuYXRpdmVfaWYgQVJNNjRfSEFTX0lSUV9Q UklPX01BU0tJTkcKPj4gICAJZHNiCXN5CQkJCS8vIEVuc3VyZSBwcmlvcml0eSBjaGFuZ2UgaXMg c2VlbiBieSByZWRpc3RyaWJ1dG9yCj4+ICAgLkxfX3NraXBfcG1yX3N5bmNcQDoKPj4gICBhbHRl cm5hdGl2ZV9lbHNlX25vcF9lbmRpZgo+PiArI2VuZGlmCj4gRm9yIHRoZXNlIHR3byBJIHRoaW5r IHRoZSBpZmRlZmZlcnkgaXMgZmluZSwgYnV0IEknbSBzdXJwcmlzZWQgdGhpcyBoYXMgYQo+IG1l YXN1cmVhYmxlIGltcGFjdCBhcyB0aGUgYWx0ZXJuYXRpdmVzIHNob3VsZCBiZSBpbml0aWFsaXpl ZCB0byBOT1BTIChhbmQgbmV2ZXIKPiBtb2RpZmllZCkuCgpZZXMsIHRoZXNlIE5PUHMgbWF5IGJy aW5nIHNvbWUgb3ZlcmhlYWQuIEJ1dCBJIGNhbid0IHNheSBob3cgbXVjaCB0aGVzZSAKTk9QcyBj b250cmlidXRlIHRvCgp0aGUgcmVzdWx0IG9mIHRlc3QuCgo+Cj4gVGhhbmtzLAo+IE1hcmsuCj4g LgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgt YXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQu b3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJt LWtlcm5lbAo=