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=-13.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED,USER_AGENT_SANE_2 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 8F0CFC433DF for ; Fri, 19 Jun 2020 01:55:24 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 5475220776 for ; Fri, 19 Jun 2020 01:55:24 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="IILp1V+Y"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="YSqcfWE7" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5475220776 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-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=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=PAZSjKlMx7uJnm1Nr2dJZ6dWe2oAQ6P/1M6G6naAd/E=; b=IILp1V+YDgEAiv AvOlGbxFC7ZpjaGqZap7kHO0pg6tVYg++xRS9ptYkDiYYkaydXldQ7O+mRCauGLyv77ZP9MZb47rL cEAiKJUDde+UDVatXGo26HK4l6rqBWf4ystOfLuDWn3ANOup/ubEkTt2A7ygQut9GkpugacgsoBPm 05EMEavibioE3ajmKfFUJur2vtwS66TA/PxLGSLpM4+urFQZx3wOJdfdzOvioT9b4ZWx2Wxn2AlaF QP6mQrb0WHZg4wBnbRd5x6Qfx9M0D+fi5cUCqoqQso6s/kG9Kj3VIhX29v0zvhmLkir1qKl/QQA2r dQ6qLQSiHsysvSO/HHPA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jm6FP-0007kh-Qf; Fri, 19 Jun 2020 01:55:15 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jm6FM-0007jA-E6 for linux-arm-kernel@lists.infradead.org; Fri, 19 Jun 2020 01:55:14 +0000 X-UUID: a3bb5afe98324b3aa62b8a5dfc5be409-20200618 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=eSIoLyaJEFkINxafFPsx03C8ForADV0MP2v7hBefnU4=; b=YSqcfWE73wFZ8YSKTFDeIGjJJ1UHFXicZar1Ymvmsd/Xio3KddIHfo8pbZEQ1e1JFCcEe2ix8GIf9q4uiZwmK2qvJ4nHNv3zfqiA6LDxvaluGjFoscorshvJNIShs1IXpEUnGAl3YhgyljfO4kHMkrYXLhqxUYV3Pyw37xpr7bc=; X-UUID: a3bb5afe98324b3aa62b8a5dfc5be409-20200618 Received: from mtkcas67.mediatek.inc [(172.29.193.45)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 999691455; Thu, 18 Jun 2020 17:55:09 -0800 Received: from mtkmbs08n2.mediatek.inc (172.21.101.56) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Thu, 18 Jun 2020 18:55:07 -0700 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs08n2.mediatek.inc (172.21.101.56) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 19 Jun 2020 09:54:58 +0800 Received: from [172.21.77.33] (172.21.77.33) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Fri, 19 Jun 2020 09:55:04 +0800 Message-ID: <1592531704.23014.1.camel@mtkswgap22> Subject: Re: [PATCH] Fix unwind_frame for clang-built kernels From: Miles Chen To: Nick Desaulniers Date: Fri, 19 Jun 2020 09:55:04 +0800 In-Reply-To: References: <20200616223633.73971-1-nhuck@google.com> X-Mailer: Evolution 3.2.3-0ubuntu6 MIME-Version: 1.0 X-TM-SNTS-SMTP: 7E2F102F10D549D6E1CCFDFA8195D3DEE40C7CE5360F0C642E1E211402486FC02000:8 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200618_185512_485499_1593CD1D X-CRM114-Status: GOOD ( 30.02 ) 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: Catalin Marinas , Vincent Whitchurch , LKML , Russell King , clang-built-linux , Sedat Dilek , Kristof Beyls , Nathan Huckleberry , Linux ARM Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Thu, 2020-06-18 at 13:22 -0700, Nick Desaulniers wrote: > On Tue, Jun 16, 2020 at 3:36 PM 'Nathan Huckleberry' via Clang Built > Linux wrote: > > > > Since clang does not push pc and sp in function prologues, the current > > implementation of unwind_frame does not work. By using the previous > > frame's lr/fp instead of saved pc/sp we get valid unwinds on clang-built > > kernels. > > > > The bounds check on next frame pointer must be changed as well since > > there are 8 less bytes between frames. > > > > This fixes /proc//stack. > > > > Link: https://github.com/ClangBuiltLinux/linux/issues/912 > > Signed-off-by: Nathan Huckleberry > > Thanks for the patch, Nathan! When I looked into this, I found the > latest ARM AAPCS [0] specifically says (with `it` referring to `a > platform`: "It may permit the frame pointer register to be used as a > general-purpose callee-saved register, but provide a platform-specific > mechanism for external agents to reliably locate the chain of frame > records." While it's good that's acknowledged in the documentation, > the current wording is relaxed in order to not force current > implementations to converge. This has the unfortunate side effect of > making finding the frame pointer toolchain dependendent, hence this > patch and your previous commit 6dc5fd93b2f1 ("ARM: 8900/1: > UNWINDER_FRAME_POINTER implementation for Clang"). Being more > specific in the documentation would force at least one implementation > to change, and I think that would also imply an ABI break. So I can > see it both ways, though I still would prefer that the language pin > this down, even if we had to change LLVM. Just providing additional > context for folks on the thread. > > This should also have a reported by tag from Miles, in v2. > > Reported-by: Miles Chen > > Miles mentioned to me that he tested it, but maybe Miles can confirm > that publicly on-list via an explicit Tested-by: tag? Thanks for the patch. Tested-by: Miles Chen > > This would be useful for us to have in stable; otherwise we'll have to > carry out of tree in Android and CrOS, which I'd rather not do. Via > Documentation/process/stable-kernel-rules.rst, if you add this tag to > V2, that will greatly simplify submitting this to stable: > Cc: stable@vger.kernel.org > > Miles also showed me the behavior of this patch for different kernel > versions, which varies anywhere from empty or single entry traces to > panics, so this is pretty important that this works for Clang builds. > > [0] https://static.docs.arm.com/ihi0042/i/aapcs32.pdf > > > --- > > arch/arm/kernel/stacktrace.c | 24 ++++++++++++++++++++++++ > > 1 file changed, 24 insertions(+) > > > > diff --git a/arch/arm/kernel/stacktrace.c b/arch/arm/kernel/stacktrace.c > > index cc726afea023..76ea4178a55c 100644 > > --- a/arch/arm/kernel/stacktrace.c > > +++ b/arch/arm/kernel/stacktrace.c > > @@ -22,6 +22,19 @@ > > * A simple function epilogue looks like this: > > * ldm sp, {fp, sp, pc} > > * > > + * When compiled with clang, pc and sp are not pushed. A simple function > > + * prologue looks like this when built with clang: > > + * > > + * stmdb {..., fp, lr} > > + * add fp, sp, #x > > + * sub sp, sp, #y > > + * > > + * A simple function epilogue looks like this when built with clang: > > + * > > + * sub sp, fp, #x > > + * ldm {..., fp, pc} > > + * > > + * > > * Note that with framepointer enabled, even the leaf functions have the same > > * prologue and epilogue, therefore we can ignore the LR value in this case. > > */ > > @@ -34,6 +47,16 @@ int notrace unwind_frame(struct stackframe *frame) > > low = frame->sp; > > high = ALIGN(low, THREAD_SIZE); > > > > +#ifdef CONFIG_CC_IS_CLANG > > + /* check current frame pointer is within bounds */ > > + if (fp < low + 4 || fp > high - 4) > > The patch LGTM; maybe Russell or Catalin could triple check this > bounds check? Assuming there's no issue, you can include on a v2 my > reviewed by: > > Reviewed-by: Nick Desaulniers > > I'd probably wait the remainder of a week before sending a v2 to > collect additional feedback. Thank you again. > > > + return -EINVAL; > > + > > + frame->sp = frame->fp; > > + frame->fp = *(unsigned long *)(fp); > > + frame->pc = frame->lr; > > + frame->lr = *(unsigned long *)(fp + 4); > > +#else > > /* check current frame pointer is within bounds */ > > if (fp < low + 12 || fp > high - 4) > > return -EINVAL; > > @@ -42,6 +65,7 @@ int notrace unwind_frame(struct stackframe *frame) > > frame->fp = *(unsigned long *)(fp - 12); > > frame->sp = *(unsigned long *)(fp - 8); > > frame->pc = *(unsigned long *)(fp - 4); > > +#endif > > > > return 0; > > } > > -- > > 2.27.0.290.gba653c62da-goog > > > > -- > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel 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=-13.3 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, USER_AGENT_SANE_2 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 D881FC433E0 for ; Fri, 19 Jun 2020 01:55:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A363020776 for ; Fri, 19 Jun 2020 01:55:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="YSqcfWE7" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730785AbgFSBzL (ORCPT ); Thu, 18 Jun 2020 21:55:11 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:61727 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1728414AbgFSBzL (ORCPT ); Thu, 18 Jun 2020 21:55:11 -0400 X-UUID: 36793c47f4934525899c2ced162e9734-20200619 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=eSIoLyaJEFkINxafFPsx03C8ForADV0MP2v7hBefnU4=; b=YSqcfWE73wFZ8YSKTFDeIGjJJ1UHFXicZar1Ymvmsd/Xio3KddIHfo8pbZEQ1e1JFCcEe2ix8GIf9q4uiZwmK2qvJ4nHNv3zfqiA6LDxvaluGjFoscorshvJNIShs1IXpEUnGAl3YhgyljfO4kHMkrYXLhqxUYV3Pyw37xpr7bc=; X-UUID: 36793c47f4934525899c2ced162e9734-20200619 Received: from mtkcas07.mediatek.inc [(172.21.101.84)] by mailgw02.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 485305922; Fri, 19 Jun 2020 09:55:08 +0800 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs08n2.mediatek.inc (172.21.101.56) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 19 Jun 2020 09:54:58 +0800 Received: from [172.21.77.33] (172.21.77.33) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Fri, 19 Jun 2020 09:55:04 +0800 Message-ID: <1592531704.23014.1.camel@mtkswgap22> Subject: Re: [PATCH] Fix unwind_frame for clang-built kernels From: Miles Chen To: Nick Desaulniers CC: Nathan Huckleberry , Russell King , Vincent Whitchurch , Linux ARM , LKML , clang-built-linux , Sedat Dilek , Catalin Marinas , Kristof Beyls Date: Fri, 19 Jun 2020 09:55:04 +0800 In-Reply-To: References: <20200616223633.73971-1-nhuck@google.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 MIME-Version: 1.0 X-TM-SNTS-SMTP: 7E2F102F10D549D6E1CCFDFA8195D3DEE40C7CE5360F0C642E1E211402486FC02000:8 X-MTK: N Content-Transfer-Encoding: base64 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org T24gVGh1LCAyMDIwLTA2LTE4IGF0IDEzOjIyIC0wNzAwLCBOaWNrIERlc2F1bG5pZXJzIHdyb3Rl Og0KPiBPbiBUdWUsIEp1biAxNiwgMjAyMCBhdCAzOjM2IFBNICdOYXRoYW4gSHVja2xlYmVycnkn IHZpYSBDbGFuZyBCdWlsdA0KPiBMaW51eCA8Y2xhbmctYnVpbHQtbGludXhAZ29vZ2xlZ3JvdXBz LmNvbT4gd3JvdGU6DQo+ID4NCj4gPiBTaW5jZSBjbGFuZyBkb2VzIG5vdCBwdXNoIHBjIGFuZCBz cCBpbiBmdW5jdGlvbiBwcm9sb2d1ZXMsIHRoZSBjdXJyZW50DQo+ID4gaW1wbGVtZW50YXRpb24g b2YgdW53aW5kX2ZyYW1lIGRvZXMgbm90IHdvcmsuIEJ5IHVzaW5nIHRoZSBwcmV2aW91cw0KPiA+ IGZyYW1lJ3MgbHIvZnAgaW5zdGVhZCBvZiBzYXZlZCBwYy9zcCB3ZSBnZXQgdmFsaWQgdW53aW5k cyBvbiBjbGFuZy1idWlsdA0KPiA+IGtlcm5lbHMuDQo+ID4NCj4gPiBUaGUgYm91bmRzIGNoZWNr IG9uIG5leHQgZnJhbWUgcG9pbnRlciBtdXN0IGJlIGNoYW5nZWQgYXMgd2VsbCBzaW5jZQ0KPiA+ IHRoZXJlIGFyZSA4IGxlc3MgYnl0ZXMgYmV0d2VlbiBmcmFtZXMuDQo+ID4NCj4gPiBUaGlzIGZp eGVzIC9wcm9jLzxwaWQ+L3N0YWNrLg0KPiA+DQo+ID4gTGluazogaHR0cHM6Ly9naXRodWIuY29t L0NsYW5nQnVpbHRMaW51eC9saW51eC9pc3N1ZXMvOTEyDQo+ID4gU2lnbmVkLW9mZi1ieTogTmF0 aGFuIEh1Y2tsZWJlcnJ5IDxuaHVja0Bnb29nbGUuY29tPg0KPiANCj4gVGhhbmtzIGZvciB0aGUg cGF0Y2gsIE5hdGhhbiEgIFdoZW4gSSBsb29rZWQgaW50byB0aGlzLCBJIGZvdW5kIHRoZQ0KPiBs YXRlc3QgQVJNIEFBUENTIFswXSBzcGVjaWZpY2FsbHkgc2F5cyAod2l0aCBgaXRgIHJlZmVycmlu ZyB0byBgYQ0KPiBwbGF0Zm9ybWA6ICJJdCBtYXkgcGVybWl0IHRoZSBmcmFtZSBwb2ludGVyIHJl Z2lzdGVyIHRvIGJlIHVzZWQgYXMgYQ0KPiBnZW5lcmFsLXB1cnBvc2UgY2FsbGVlLXNhdmVkIHJl Z2lzdGVyLCBidXQgcHJvdmlkZSBhIHBsYXRmb3JtLXNwZWNpZmljDQo+IG1lY2hhbmlzbSBmb3Ig ZXh0ZXJuYWwgYWdlbnRzIHRvIHJlbGlhYmx5IGxvY2F0ZSB0aGUgY2hhaW4gb2YgZnJhbWUNCj4g cmVjb3Jkcy4iICAgV2hpbGUgaXQncyBnb29kIHRoYXQncyBhY2tub3dsZWRnZWQgaW4gdGhlIGRv Y3VtZW50YXRpb24sDQo+IHRoZSBjdXJyZW50IHdvcmRpbmcgaXMgcmVsYXhlZCBpbiBvcmRlciB0 byBub3QgZm9yY2UgY3VycmVudA0KPiBpbXBsZW1lbnRhdGlvbnMgdG8gY29udmVyZ2UuICBUaGlz IGhhcyB0aGUgdW5mb3J0dW5hdGUgc2lkZSBlZmZlY3Qgb2YNCj4gbWFraW5nIGZpbmRpbmcgdGhl IGZyYW1lIHBvaW50ZXIgdG9vbGNoYWluIGRlcGVuZGVuZGVudCwgaGVuY2UgdGhpcw0KPiBwYXRj aCBhbmQgeW91ciBwcmV2aW91cyBjb21taXQgNmRjNWZkOTNiMmYxICgiQVJNOiA4OTAwLzE6DQo+ IFVOV0lOREVSX0ZSQU1FX1BPSU5URVIgaW1wbGVtZW50YXRpb24gZm9yIENsYW5nIikuICBCZWlu ZyBtb3JlDQo+IHNwZWNpZmljIGluIHRoZSBkb2N1bWVudGF0aW9uIHdvdWxkIGZvcmNlIGF0IGxl YXN0IG9uZSBpbXBsZW1lbnRhdGlvbg0KPiB0byBjaGFuZ2UsIGFuZCBJIHRoaW5rIHRoYXQgd291 bGQgYWxzbyBpbXBseSBhbiBBQkkgYnJlYWsuICBTbyBJIGNhbg0KPiBzZWUgaXQgYm90aCB3YXlz LCB0aG91Z2ggSSBzdGlsbCB3b3VsZCBwcmVmZXIgdGhhdCB0aGUgbGFuZ3VhZ2UgcGluDQo+IHRo aXMgZG93biwgZXZlbiBpZiB3ZSBoYWQgdG8gY2hhbmdlIExMVk0uICBKdXN0IHByb3ZpZGluZyBh ZGRpdGlvbmFsDQo+IGNvbnRleHQgZm9yIGZvbGtzIG9uIHRoZSB0aHJlYWQuDQo+IA0KPiBUaGlz IHNob3VsZCBhbHNvIGhhdmUgYSByZXBvcnRlZCBieSB0YWcgZnJvbSBNaWxlcywgaW4gdjIuDQo+ IA0KPiBSZXBvcnRlZC1ieTogTWlsZXMgQ2hlbiA8TWlsZXMuQ2hlbkBtZWRpYXRlay5jb20+DQo+ IA0KPiBNaWxlcyBtZW50aW9uZWQgdG8gbWUgdGhhdCBoZSB0ZXN0ZWQgaXQsIGJ1dCBtYXliZSBN aWxlcyBjYW4gY29uZmlybQ0KPiB0aGF0IHB1YmxpY2x5IG9uLWxpc3QgdmlhIGFuIGV4cGxpY2l0 IFRlc3RlZC1ieTogdGFnPw0KDQpUaGFua3MgZm9yIHRoZSBwYXRjaC4NCg0KVGVzdGVkLWJ5OiBN aWxlcyBDaGVuIDxtaWxlcy5jaGVuQG1lZGlhdGVrLmNvbT4NCg0KPiANCj4gVGhpcyB3b3VsZCBi ZSB1c2VmdWwgZm9yIHVzIHRvIGhhdmUgaW4gc3RhYmxlOyBvdGhlcndpc2Ugd2UnbGwgaGF2ZSB0 bw0KPiBjYXJyeSBvdXQgb2YgdHJlZSBpbiBBbmRyb2lkIGFuZCBDck9TLCB3aGljaCBJJ2QgcmF0 aGVyIG5vdCBkby4gIFZpYQ0KPiBEb2N1bWVudGF0aW9uL3Byb2Nlc3Mvc3RhYmxlLWtlcm5lbC1y dWxlcy5yc3QsIGlmIHlvdSBhZGQgdGhpcyB0YWcgdG8NCj4gVjIsIHRoYXQgd2lsbCBncmVhdGx5 IHNpbXBsaWZ5IHN1Ym1pdHRpbmcgdGhpcyB0byBzdGFibGU6DQo+IENjOiBzdGFibGVAdmdlci5r ZXJuZWwub3JnDQo+IA0KPiBNaWxlcyBhbHNvIHNob3dlZCBtZSB0aGUgYmVoYXZpb3Igb2YgdGhp cyBwYXRjaCBmb3IgZGlmZmVyZW50IGtlcm5lbA0KPiB2ZXJzaW9ucywgd2hpY2ggdmFyaWVzIGFu eXdoZXJlIGZyb20gZW1wdHkgb3Igc2luZ2xlIGVudHJ5IHRyYWNlcyB0bw0KPiBwYW5pY3MsIHNv IHRoaXMgaXMgcHJldHR5IGltcG9ydGFudCB0aGF0IHRoaXMgd29ya3MgZm9yIENsYW5nIGJ1aWxk cy4NCj4gDQo+IFswXSBodHRwczovL3N0YXRpYy5kb2NzLmFybS5jb20vaWhpMDA0Mi9pL2FhcGNz MzIucGRmDQo+IA0KPiA+IC0tLQ0KPiA+ICBhcmNoL2FybS9rZXJuZWwvc3RhY2t0cmFjZS5jIHwg MjQgKysrKysrKysrKysrKysrKysrKysrKysrDQo+ID4gIDEgZmlsZSBjaGFuZ2VkLCAyNCBpbnNl cnRpb25zKCspDQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3N0YWNrdHJh Y2UuYyBiL2FyY2gvYXJtL2tlcm5lbC9zdGFja3RyYWNlLmMNCj4gPiBpbmRleCBjYzcyNmFmZWEw MjMuLjc2ZWE0MTc4YTU1YyAxMDA2NDQNCj4gPiAtLS0gYS9hcmNoL2FybS9rZXJuZWwvc3RhY2t0 cmFjZS5jDQo+ID4gKysrIGIvYXJjaC9hcm0va2VybmVsL3N0YWNrdHJhY2UuYw0KPiA+IEBAIC0y Miw2ICsyMiwxOSBAQA0KPiA+ICAgKiBBIHNpbXBsZSBmdW5jdGlvbiBlcGlsb2d1ZSBsb29rcyBs aWtlIHRoaXM6DQo+ID4gICAqICAgICBsZG0gICAgIHNwLCB7ZnAsIHNwLCBwY30NCj4gPiAgICoN Cj4gPiArICogV2hlbiBjb21waWxlZCB3aXRoIGNsYW5nLCBwYyBhbmQgc3AgYXJlIG5vdCBwdXNo ZWQuIEEgc2ltcGxlIGZ1bmN0aW9uDQo+ID4gKyAqIHByb2xvZ3VlIGxvb2tzIGxpa2UgdGhpcyB3 aGVuIGJ1aWx0IHdpdGggY2xhbmc6DQo+ID4gKyAqDQo+ID4gKyAqICAgICBzdG1kYiAgIHsuLi4s IGZwLCBscn0NCj4gPiArICogICAgIGFkZCAgICAgZnAsIHNwLCAjeA0KPiA+ICsgKiAgICAgc3Vi ICAgICBzcCwgc3AsICN5DQo+ID4gKyAqDQo+ID4gKyAqIEEgc2ltcGxlIGZ1bmN0aW9uIGVwaWxv Z3VlIGxvb2tzIGxpa2UgdGhpcyB3aGVuIGJ1aWx0IHdpdGggY2xhbmc6DQo+ID4gKyAqDQo+ID4g KyAqICAgICBzdWIgICAgIHNwLCBmcCwgI3gNCj4gPiArICogICAgIGxkbSAgICAgey4uLiwgZnAs IHBjfQ0KPiA+ICsgKg0KPiA+ICsgKg0KPiA+ICAgKiBOb3RlIHRoYXQgd2l0aCBmcmFtZXBvaW50 ZXIgZW5hYmxlZCwgZXZlbiB0aGUgbGVhZiBmdW5jdGlvbnMgaGF2ZSB0aGUgc2FtZQ0KPiA+ICAg KiBwcm9sb2d1ZSBhbmQgZXBpbG9ndWUsIHRoZXJlZm9yZSB3ZSBjYW4gaWdub3JlIHRoZSBMUiB2 YWx1ZSBpbiB0aGlzIGNhc2UuDQo+ID4gICAqLw0KPiA+IEBAIC0zNCw2ICs0NywxNiBAQCBpbnQg bm90cmFjZSB1bndpbmRfZnJhbWUoc3RydWN0IHN0YWNrZnJhbWUgKmZyYW1lKQ0KPiA+ICAgICAg ICAgbG93ID0gZnJhbWUtPnNwOw0KPiA+ICAgICAgICAgaGlnaCA9IEFMSUdOKGxvdywgVEhSRUFE X1NJWkUpOw0KPiA+DQo+ID4gKyNpZmRlZiBDT05GSUdfQ0NfSVNfQ0xBTkcNCj4gPiArICAgICAg IC8qIGNoZWNrIGN1cnJlbnQgZnJhbWUgcG9pbnRlciBpcyB3aXRoaW4gYm91bmRzICovDQo+ID4g KyAgICAgICBpZiAoZnAgPCBsb3cgKyA0IHx8IGZwID4gaGlnaCAtIDQpDQo+IA0KPiBUaGUgcGF0 Y2ggTEdUTTsgbWF5YmUgUnVzc2VsbCBvciBDYXRhbGluIGNvdWxkIHRyaXBsZSBjaGVjayB0aGlz DQo+IGJvdW5kcyBjaGVjaz8gIEFzc3VtaW5nIHRoZXJlJ3Mgbm8gaXNzdWUsIHlvdSBjYW4gaW5j bHVkZSBvbiBhIHYyIG15DQo+IHJldmlld2VkIGJ5Og0KPiANCj4gUmV2aWV3ZWQtYnk6IE5pY2sg RGVzYXVsbmllcnMgPG5kZXNhdWxuaWVyc0Bnb29nbGUuY29tPg0KPiANCj4gSSdkIHByb2JhYmx5 IHdhaXQgdGhlIHJlbWFpbmRlciBvZiBhIHdlZWsgYmVmb3JlIHNlbmRpbmcgYSB2MiB0bw0KPiBj b2xsZWN0IGFkZGl0aW9uYWwgZmVlZGJhY2suICBUaGFuayB5b3UgYWdhaW4uDQo+IA0KPiA+ICsg ICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsNCj4gPiArDQo+ID4gKyAgICAgICBmcmFtZS0+ c3AgPSBmcmFtZS0+ZnA7DQo+ID4gKyAgICAgICBmcmFtZS0+ZnAgPSAqKHVuc2lnbmVkIGxvbmcg KikoZnApOw0KPiA+ICsgICAgICAgZnJhbWUtPnBjID0gZnJhbWUtPmxyOw0KPiA+ICsgICAgICAg ZnJhbWUtPmxyID0gKih1bnNpZ25lZCBsb25nICopKGZwICsgNCk7DQo+ID4gKyNlbHNlDQo+ID4g ICAgICAgICAvKiBjaGVjayBjdXJyZW50IGZyYW1lIHBvaW50ZXIgaXMgd2l0aGluIGJvdW5kcyAq Lw0KPiA+ICAgICAgICAgaWYgKGZwIDwgbG93ICsgMTIgfHwgZnAgPiBoaWdoIC0gNCkNCj4gPiAg ICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7DQo+ID4gQEAgLTQyLDYgKzY1LDcgQEAgaW50 IG5vdHJhY2UgdW53aW5kX2ZyYW1lKHN0cnVjdCBzdGFja2ZyYW1lICpmcmFtZSkNCj4gPiAgICAg ICAgIGZyYW1lLT5mcCA9ICoodW5zaWduZWQgbG9uZyAqKShmcCAtIDEyKTsNCj4gPiAgICAgICAg IGZyYW1lLT5zcCA9ICoodW5zaWduZWQgbG9uZyAqKShmcCAtIDgpOw0KPiA+ICAgICAgICAgZnJh bWUtPnBjID0gKih1bnNpZ25lZCBsb25nICopKGZwIC0gNCk7DQo+ID4gKyNlbmRpZg0KPiA+DQo+ ID4gICAgICAgICByZXR1cm4gMDsNCj4gPiAgfQ0KPiA+IC0tDQo+ID4gMi4yNy4wLjI5MC5nYmE2 NTNjNjJkYS1nb29nDQo+ID4NCj4gPiAtLQ0KPiANCg0K