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 CD98EC46467 for ; Wed, 4 Jan 2023 10:40:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231591AbjADKkM (ORCPT ); Wed, 4 Jan 2023 05:40:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55310 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233387AbjADKkL (ORCPT ); Wed, 4 Jan 2023 05:40:11 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C288412D16; Wed, 4 Jan 2023 02:40:09 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 66D58616BC; Wed, 4 Jan 2023 10:40:09 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 76BC1C433D2; Wed, 4 Jan 2023 10:40:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1672828808; bh=6FPalQcepNo+BytQcBdBWjxpEdX/NRvyniuyigHLcxE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=mmEmzDPfxMmSxpPDiRkY/nrdd55CTcgFlLje3h7S1aWx78vpJkREtHfhbxXc81T7Q qMFgGjpIqNSe755Gb1gYu21gADJJqZWcSIH3lMfcz82jyHw7giqOU1xIaPhhrKrBwr FxH18m8dfPhQHz2E70eVL5ogOM1QDy2b5lKfeI+/xqtuig4OPnoUHSg1yqpBgEhHom FQTXcDn8nuyVlgbx9yrJrcIJ6nXVSisum4vbvhoAklLPl3DrfATQI0nOKhHOJpMcFv PiwWMtcwC/NySZWPvd9znWYUYvt9G/RLrz5WYfnTfBXNfJGiesqWlfD0zb2qg6NB3G z35omPmmuzYPg== Date: Wed, 4 Jan 2023 10:40:03 +0000 From: Lee Jones To: Ard Biesheuvel , stable@vger.kernel.org Cc: linux-efi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, will@kernel.org, catalin.marinas@arm.com, mark.rutland@arm.com, Sami Tolvanen , Kees Cook Subject: Re: [PATCH 1/2] arm64: efi: Execute runtime services from a dedicated stack Message-ID: References: <20221205201210.463781-1-ardb@kernel.org> <20221205201210.463781-2-ardb@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20221205201210.463781-2-ardb@kernel.org> Precedence: bulk List-ID: X-Mailing-List: linux-efi@vger.kernel.org On Mon, 05 Dec 2022, Ard Biesheuvel wrote: > With the introduction of PRMT in the ACPI subsystem, the EFI rts > workqueue is no longer the only caller of efi_call_virt_pointer() in the > kernel. This means the EFI runtime services lock is no longer sufficient > to manage concurrent calls into firmware, but also that firmware calls > may occur that are not marshalled via the workqueue mechanism, but > originate directly from the caller context. > > For added robustness, and to ensure that the runtime services have 8 KiB > of stack space available as per the EFI spec, introduce a spinlock > protected EFI runtime stack of 8 KiB, where the spinlock also ensures > serialization between the EFI rts workqueue (which itself serializes EFI > runtime calls) and other callers of efi_call_virt_pointer(). > > While at it, use the stack pivot to avoid reloading the shadow call > stack pointer from the ordinary stack, as doing so could produce a > gadget to defeat it. > > Signed-off-by: Ard Biesheuvel > --- > arch/arm64/include/asm/efi.h | 3 +++ > arch/arm64/kernel/efi-rt-wrapper.S | 13 +++++++++- > arch/arm64/kernel/efi.c | 25 ++++++++++++++++++++ > 3 files changed, 40 insertions(+), 1 deletion(-) Could we have this in Stable please? Upstream commit: ff7a167961d1b ("arm64: efi: Execute runtime services from a dedicated stack") Ard, do we need Patch 2 as well, or can this be applied on its own? > diff --git a/arch/arm64/include/asm/efi.h b/arch/arm64/include/asm/efi.h > index 7c12e01c2b312e7b..1c408ec3c8b3a883 100644 > --- a/arch/arm64/include/asm/efi.h > +++ b/arch/arm64/include/asm/efi.h > @@ -25,6 +25,7 @@ int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md); > ({ \ > efi_virtmap_load(); \ > __efi_fpsimd_begin(); \ > + spin_lock(&efi_rt_lock); \ > }) > > #undef arch_efi_call_virt > @@ -33,10 +34,12 @@ int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md); > > #define arch_efi_call_virt_teardown() \ > ({ \ > + spin_unlock(&efi_rt_lock); \ > __efi_fpsimd_end(); \ > efi_virtmap_unload(); \ > }) > > +extern spinlock_t efi_rt_lock; > efi_status_t __efi_rt_asm_wrapper(void *, const char *, ...); > > #define ARCH_EFI_IRQ_FLAGS_MASK (PSR_D_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT) > diff --git a/arch/arm64/kernel/efi-rt-wrapper.S b/arch/arm64/kernel/efi-rt-wrapper.S > index 75691a2641c1c0f8..b2786b968fee68dd 100644 > --- a/arch/arm64/kernel/efi-rt-wrapper.S > +++ b/arch/arm64/kernel/efi-rt-wrapper.S > @@ -16,6 +16,12 @@ SYM_FUNC_START(__efi_rt_asm_wrapper) > */ > stp x1, x18, [sp, #16] > > + ldr_l x16, efi_rt_stack_top > + mov sp, x16 > +#ifdef CONFIG_SHADOW_CALL_STACK > + str x18, [sp, #-16]! > +#endif > + > /* > * We are lucky enough that no EFI runtime services take more than > * 5 arguments, so all are passed in registers rather than via the > @@ -29,6 +35,7 @@ SYM_FUNC_START(__efi_rt_asm_wrapper) > mov x4, x6 > blr x8 > > + mov sp, x29 > ldp x1, x2, [sp, #16] > cmp x2, x18 > ldp x29, x30, [sp], #32 > @@ -42,6 +49,10 @@ SYM_FUNC_START(__efi_rt_asm_wrapper) > * called with preemption disabled and a separate shadow stack is used > * for interrupts. > */ > - mov x18, x2 > +#ifdef CONFIG_SHADOW_CALL_STACK > + ldr_l x18, efi_rt_stack_top > + ldr x18, [x18, #-16] > +#endif > + > b efi_handle_corrupted_x18 // tail call > SYM_FUNC_END(__efi_rt_asm_wrapper) > diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c > index a908a37f03678b6b..8cb2e005f8aca589 100644 > --- a/arch/arm64/kernel/efi.c > +++ b/arch/arm64/kernel/efi.c > @@ -144,3 +144,28 @@ asmlinkage efi_status_t efi_handle_corrupted_x18(efi_status_t s, const char *f) > pr_err_ratelimited(FW_BUG "register x18 corrupted by EFI %s\n", f); > return s; > } > + > +DEFINE_SPINLOCK(efi_rt_lock); > + > +asmlinkage u64 *efi_rt_stack_top __ro_after_init; > + > +/* required by the EFI spec */ > +static_assert(THREAD_SIZE >= SZ_8K); > + > +int __init arm64_efi_rt_init(void) > +{ > + void *p = __vmalloc_node_range(THREAD_SIZE, THREAD_ALIGN, > + VMALLOC_START, VMALLOC_END, GFP_KERNEL, > + PAGE_KERNEL, 0, NUMA_NO_NODE, > + __builtin_return_address(0)); > + > + if (!p) { > + pr_warn("Failed to allocate EFI runtime stack\n"); > + clear_bit(EFI_RUNTIME_SERVICES, &efi.flags); > + return -ENOMEM; > + } > + > + efi_rt_stack_top = p + THREAD_SIZE; > + return 0; > +} > +core_initcall(arm64_efi_rt_init); > -- > 2.35.1 > > -- Lee Jones [李琼斯] 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 B6F8EC4332F for ; Wed, 4 Jan 2023 10:47:07 +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=/56o8wlw47IC7H7XGi6IZGRgSgDCq/el9DCNE5SJ0iA=; b=p5SRMcQHrlYYcI Y8A4yGGLM3ETmcSx3pnPMhqqrkzewDTKv0D2QwZ4tWL9X3mtL3sLn6XCrLm3pJwtrnFTOqtnvRsDO TPYzZOKjusqqq6dT1IWBRQ3/Tq1LZLJg2pOYLAZAUQlGnDAEdwxcJOwyIw6/JtsQm7GZlCsM+xULX mLFtH+kC2345g9i2H6kaeheDP81B9+nq3hx+ib5WjtIC7dVW0Kd+bB4IuX3pc0y8Mkdhls0W56J0E LzBGJRVRo15PsP+Ar5RVh0hH7DJRbiLEGdjcRiDuCi2hdnStbsLggUzEBuZKrogzh7PD+jRwSOHs1 Ih74Pu15zu24iMi5uNPw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pD1HY-008VST-MZ; Wed, 04 Jan 2023 10:46:05 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pD1Bq-008SXQ-QC for linux-arm-kernel@lists.infradead.org; Wed, 04 Jan 2023 10:40:13 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 578F6616B6; Wed, 4 Jan 2023 10:40:09 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 76BC1C433D2; Wed, 4 Jan 2023 10:40:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1672828808; bh=6FPalQcepNo+BytQcBdBWjxpEdX/NRvyniuyigHLcxE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=mmEmzDPfxMmSxpPDiRkY/nrdd55CTcgFlLje3h7S1aWx78vpJkREtHfhbxXc81T7Q qMFgGjpIqNSe755Gb1gYu21gADJJqZWcSIH3lMfcz82jyHw7giqOU1xIaPhhrKrBwr FxH18m8dfPhQHz2E70eVL5ogOM1QDy2b5lKfeI+/xqtuig4OPnoUHSg1yqpBgEhHom FQTXcDn8nuyVlgbx9yrJrcIJ6nXVSisum4vbvhoAklLPl3DrfATQI0nOKhHOJpMcFv PiwWMtcwC/NySZWPvd9znWYUYvt9G/RLrz5WYfnTfBXNfJGiesqWlfD0zb2qg6NB3G z35omPmmuzYPg== Date: Wed, 4 Jan 2023 10:40:03 +0000 From: Lee Jones To: Ard Biesheuvel , stable@vger.kernel.org Cc: linux-efi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, will@kernel.org, catalin.marinas@arm.com, mark.rutland@arm.com, Sami Tolvanen , Kees Cook Subject: Re: [PATCH 1/2] arm64: efi: Execute runtime services from a dedicated stack Message-ID: References: <20221205201210.463781-1-ardb@kernel.org> <20221205201210.463781-2-ardb@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20221205201210.463781-2-ardb@kernel.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230104_024011_353379_AB8FDB53 X-CRM114-Status: GOOD ( 29.38 ) 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 T24gTW9uLCAwNSBEZWMgMjAyMiwgQXJkIEJpZXNoZXV2ZWwgd3JvdGU6Cgo+IFdpdGggdGhlIGlu dHJvZHVjdGlvbiBvZiBQUk1UIGluIHRoZSBBQ1BJIHN1YnN5c3RlbSwgdGhlIEVGSSBydHMKPiB3 b3JrcXVldWUgaXMgbm8gbG9uZ2VyIHRoZSBvbmx5IGNhbGxlciBvZiBlZmlfY2FsbF92aXJ0X3Bv aW50ZXIoKSBpbiB0aGUKPiBrZXJuZWwuIFRoaXMgbWVhbnMgdGhlIEVGSSBydW50aW1lIHNlcnZp Y2VzIGxvY2sgaXMgbm8gbG9uZ2VyIHN1ZmZpY2llbnQKPiB0byBtYW5hZ2UgY29uY3VycmVudCBj YWxscyBpbnRvIGZpcm13YXJlLCBidXQgYWxzbyB0aGF0IGZpcm13YXJlIGNhbGxzCj4gbWF5IG9j Y3VyIHRoYXQgYXJlIG5vdCBtYXJzaGFsbGVkIHZpYSB0aGUgd29ya3F1ZXVlIG1lY2hhbmlzbSwg YnV0Cj4gb3JpZ2luYXRlIGRpcmVjdGx5IGZyb20gdGhlIGNhbGxlciBjb250ZXh0Lgo+IAo+IEZv ciBhZGRlZCByb2J1c3RuZXNzLCBhbmQgdG8gZW5zdXJlIHRoYXQgdGhlIHJ1bnRpbWUgc2Vydmlj ZXMgaGF2ZSA4IEtpQgo+IG9mIHN0YWNrIHNwYWNlIGF2YWlsYWJsZSBhcyBwZXIgdGhlIEVGSSBz cGVjLCBpbnRyb2R1Y2UgYSBzcGlubG9jawo+IHByb3RlY3RlZCBFRkkgcnVudGltZSBzdGFjayBv ZiA4IEtpQiwgd2hlcmUgdGhlIHNwaW5sb2NrIGFsc28gZW5zdXJlcwo+IHNlcmlhbGl6YXRpb24g YmV0d2VlbiB0aGUgRUZJIHJ0cyB3b3JrcXVldWUgKHdoaWNoIGl0c2VsZiBzZXJpYWxpemVzIEVG SQo+IHJ1bnRpbWUgY2FsbHMpIGFuZCBvdGhlciBjYWxsZXJzIG9mIGVmaV9jYWxsX3ZpcnRfcG9p bnRlcigpLgo+IAo+IFdoaWxlIGF0IGl0LCB1c2UgdGhlIHN0YWNrIHBpdm90IHRvIGF2b2lkIHJl bG9hZGluZyB0aGUgc2hhZG93IGNhbGwKPiBzdGFjayBwb2ludGVyIGZyb20gdGhlIG9yZGluYXJ5 IHN0YWNrLCBhcyBkb2luZyBzbyBjb3VsZCBwcm9kdWNlIGEKPiBnYWRnZXQgdG8gZGVmZWF0IGl0 Lgo+IAo+IFNpZ25lZC1vZmYtYnk6IEFyZCBCaWVzaGV1dmVsIDxhcmRiQGtlcm5lbC5vcmc+Cj4g LS0tCj4gIGFyY2gvYXJtNjQvaW5jbHVkZS9hc20vZWZpLmggICAgICAgfCAgMyArKysKPiAgYXJj aC9hcm02NC9rZXJuZWwvZWZpLXJ0LXdyYXBwZXIuUyB8IDEzICsrKysrKysrKy0KPiAgYXJjaC9h cm02NC9rZXJuZWwvZWZpLmMgICAgICAgICAgICB8IDI1ICsrKysrKysrKysrKysrKysrKysrCj4g IDMgZmlsZXMgY2hhbmdlZCwgNDAgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQoKQ291bGQg d2UgaGF2ZSB0aGlzIGluIFN0YWJsZSBwbGVhc2U/CgpVcHN0cmVhbSBjb21taXQ6IGZmN2ExNjc5 NjFkMWIgKCJhcm02NDogZWZpOiBFeGVjdXRlIHJ1bnRpbWUgc2VydmljZXMgZnJvbSBhIGRlZGlj YXRlZCBzdGFjayIpCgpBcmQsIGRvIHdlIG5lZWQgUGF0Y2ggMiBhcyB3ZWxsLCBvciBjYW4gdGhp cyBiZSBhcHBsaWVkIG9uIGl0cyBvd24/Cgo+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1 ZGUvYXNtL2VmaS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lZmkuaAo+IGluZGV4IDdjMTJl MDFjMmIzMTJlN2IuLjFjNDA4ZWMzYzhiM2E4ODMgMTAwNjQ0Cj4gLS0tIGEvYXJjaC9hcm02NC9p bmNsdWRlL2FzbS9lZmkuaAo+ICsrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZWZpLmgKPiBA QCAtMjUsNiArMjUsNyBAQCBpbnQgZWZpX3NldF9tYXBwaW5nX3Blcm1pc3Npb25zKHN0cnVjdCBt bV9zdHJ1Y3QgKm1tLCBlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpOwo+ICAoewkJCQkJCQkJCVwKPiAg CWVmaV92aXJ0bWFwX2xvYWQoKTsJCQkJCQlcCj4gIAlfX2VmaV9mcHNpbWRfYmVnaW4oKTsJCQkJ CQlcCj4gKwlzcGluX2xvY2soJmVmaV9ydF9sb2NrKTsJCQkJCVwKPiAgfSkKPiAgCj4gICN1bmRl ZiBhcmNoX2VmaV9jYWxsX3ZpcnQKPiBAQCAtMzMsMTAgKzM0LDEyIEBAIGludCBlZmlfc2V0X21h cHBpbmdfcGVybWlzc2lvbnMoc3RydWN0IG1tX3N0cnVjdCAqbW0sIGVmaV9tZW1vcnlfZGVzY190 ICptZCk7Cj4gIAo+ICAjZGVmaW5lIGFyY2hfZWZpX2NhbGxfdmlydF90ZWFyZG93bigpCQkJCQlc Cj4gICh7CQkJCQkJCQkJXAo+ICsJc3Bpbl91bmxvY2soJmVmaV9ydF9sb2NrKTsJCQkJCVwKPiAg CV9fZWZpX2Zwc2ltZF9lbmQoKTsJCQkJCQlcCj4gIAllZmlfdmlydG1hcF91bmxvYWQoKTsJCQkJ CQlcCj4gIH0pCj4gIAo+ICtleHRlcm4gc3BpbmxvY2tfdCBlZmlfcnRfbG9jazsKPiAgZWZpX3N0 YXR1c190IF9fZWZpX3J0X2FzbV93cmFwcGVyKHZvaWQgKiwgY29uc3QgY2hhciAqLCAuLi4pOwo+ ICAKPiAgI2RlZmluZSBBUkNIX0VGSV9JUlFfRkxBR1NfTUFTSyAoUFNSX0RfQklUIHwgUFNSX0Ff QklUIHwgUFNSX0lfQklUIHwgUFNSX0ZfQklUKQo+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tl cm5lbC9lZmktcnQtd3JhcHBlci5TIGIvYXJjaC9hcm02NC9rZXJuZWwvZWZpLXJ0LXdyYXBwZXIu Uwo+IGluZGV4IDc1NjkxYTI2NDFjMWMwZjguLmIyNzg2Yjk2OGZlZTY4ZGQgMTAwNjQ0Cj4gLS0t IGEvYXJjaC9hcm02NC9rZXJuZWwvZWZpLXJ0LXdyYXBwZXIuUwo+ICsrKyBiL2FyY2gvYXJtNjQv a2VybmVsL2VmaS1ydC13cmFwcGVyLlMKPiBAQCAtMTYsNiArMTYsMTIgQEAgU1lNX0ZVTkNfU1RB UlQoX19lZmlfcnRfYXNtX3dyYXBwZXIpCj4gIAkgKi8KPiAgCXN0cAl4MSwgeDE4LCBbc3AsICMx Nl0KPiAgCj4gKwlsZHJfbAl4MTYsIGVmaV9ydF9zdGFja190b3AKPiArCW1vdglzcCwgeDE2Cj4g KyNpZmRlZiBDT05GSUdfU0hBRE9XX0NBTExfU1RBQ0sKPiArCXN0cgl4MTgsIFtzcCwgIy0xNl0h Cj4gKyNlbmRpZgo+ICsKPiAgCS8qCj4gIAkgKiBXZSBhcmUgbHVja3kgZW5vdWdoIHRoYXQgbm8g RUZJIHJ1bnRpbWUgc2VydmljZXMgdGFrZSBtb3JlIHRoYW4KPiAgCSAqIDUgYXJndW1lbnRzLCBz byBhbGwgYXJlIHBhc3NlZCBpbiByZWdpc3RlcnMgcmF0aGVyIHRoYW4gdmlhIHRoZQo+IEBAIC0y OSw2ICszNSw3IEBAIFNZTV9GVU5DX1NUQVJUKF9fZWZpX3J0X2FzbV93cmFwcGVyKQo+ICAJbW92 CXg0LCB4Ngo+ICAJYmxyCXg4Cj4gIAo+ICsJbW92CXNwLCB4MjkKPiAgCWxkcAl4MSwgeDIsIFtz cCwgIzE2XQo+ICAJY21wCXgyLCB4MTgKPiAgCWxkcAl4MjksIHgzMCwgW3NwXSwgIzMyCj4gQEAg LTQyLDYgKzQ5LDEwIEBAIFNZTV9GVU5DX1NUQVJUKF9fZWZpX3J0X2FzbV93cmFwcGVyKQo+ICAJ ICogY2FsbGVkIHdpdGggcHJlZW1wdGlvbiBkaXNhYmxlZCBhbmQgYSBzZXBhcmF0ZSBzaGFkb3cg c3RhY2sgaXMgdXNlZAo+ICAJICogZm9yIGludGVycnVwdHMuCj4gIAkgKi8KPiAtCW1vdgl4MTgs IHgyCj4gKyNpZmRlZiBDT05GSUdfU0hBRE9XX0NBTExfU1RBQ0sKPiArCWxkcl9sCXgxOCwgZWZp X3J0X3N0YWNrX3RvcAo+ICsJbGRyCXgxOCwgW3gxOCwgIy0xNl0KPiArI2VuZGlmCj4gKwo+ICAJ YgllZmlfaGFuZGxlX2NvcnJ1cHRlZF94MTgJLy8gdGFpbCBjYWxsCj4gIFNZTV9GVU5DX0VORChf X2VmaV9ydF9hc21fd3JhcHBlcikKPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvZWZp LmMgYi9hcmNoL2FybTY0L2tlcm5lbC9lZmkuYwo+IGluZGV4IGE5MDhhMzdmMDM2NzhiNmIuLjhj YjJlMDA1ZjhhY2E1ODkgMTAwNjQ0Cj4gLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvZWZpLmMKPiAr KysgYi9hcmNoL2FybTY0L2tlcm5lbC9lZmkuYwo+IEBAIC0xNDQsMyArMTQ0LDI4IEBAIGFzbWxp bmthZ2UgZWZpX3N0YXR1c190IGVmaV9oYW5kbGVfY29ycnVwdGVkX3gxOChlZmlfc3RhdHVzX3Qg cywgY29uc3QgY2hhciAqZikKPiAgCXByX2Vycl9yYXRlbGltaXRlZChGV19CVUcgInJlZ2lzdGVy IHgxOCBjb3JydXB0ZWQgYnkgRUZJICVzXG4iLCBmKTsKPiAgCXJldHVybiBzOwo+ICB9Cj4gKwo+ ICtERUZJTkVfU1BJTkxPQ0soZWZpX3J0X2xvY2spOwo+ICsKPiArYXNtbGlua2FnZSB1NjQgKmVm aV9ydF9zdGFja190b3AgX19yb19hZnRlcl9pbml0Owo+ICsKPiArLyogcmVxdWlyZWQgYnkgdGhl IEVGSSBzcGVjICovCj4gK3N0YXRpY19hc3NlcnQoVEhSRUFEX1NJWkUgPj0gU1pfOEspOwo+ICsK PiAraW50IF9faW5pdCBhcm02NF9lZmlfcnRfaW5pdCh2b2lkKQo+ICt7Cj4gKwl2b2lkICpwID0g X192bWFsbG9jX25vZGVfcmFuZ2UoVEhSRUFEX1NJWkUsIFRIUkVBRF9BTElHTiwKPiArCQkJCSAg ICAgICBWTUFMTE9DX1NUQVJULCBWTUFMTE9DX0VORCwgR0ZQX0tFUk5FTCwKPiArCQkJCSAgICAg ICBQQUdFX0tFUk5FTCwgMCwgTlVNQV9OT19OT0RFLAo+ICsJCQkJICAgICAgIF9fYnVpbHRpbl9y ZXR1cm5fYWRkcmVzcygwKSk7Cj4gKwo+ICsJaWYgKCFwKSB7Cj4gKwkJcHJfd2FybigiRmFpbGVk IHRvIGFsbG9jYXRlIEVGSSBydW50aW1lIHN0YWNrXG4iKTsKPiArCQljbGVhcl9iaXQoRUZJX1JV TlRJTUVfU0VSVklDRVMsICZlZmkuZmxhZ3MpOwo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsJfQo+ ICsKPiArCWVmaV9ydF9zdGFja190b3AgPSBwICsgVEhSRUFEX1NJWkU7Cj4gKwlyZXR1cm4gMDsK PiArfQo+ICtjb3JlX2luaXRjYWxsKGFybTY0X2VmaV9ydF9pbml0KTsKPiAtLSAKPiAyLjM1LjEK PiAKPiAKCi0tIApMZWUgSm9uZXMgW+adjueQvOaWr10KCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0Cmxp bnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFk Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK