From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D76931B95A; Sun, 17 Mar 2024 13:09:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710680944; cv=none; b=QR4oQnVjnXC2F/mBS+iBoXAhqS4fUu2ySEbFZV/cuZaFRf43EgeIViT2KJuaHCKdNychvmaRSYJYx7U4Hyu73dbq9N3Q3a+KNAek5+sHFJFzwQy8IdV4EvLhwfOqyEM3PbCfKH1kw4HVMNkt6J/e5V9sPKqY6HqOn/ADxH5diM4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710680944; c=relaxed/simple; bh=YpH/O6L1fyZz4ZnrgUQq9DJ00JR7UqTznRXw4DqQ3B0=; h=Date:Message-ID:From:To:Cc:Subject:In-Reply-To:References: MIME-Version:Content-Type; b=DvFnwlJcFt7aTfhlaiFI7gLt9UtrFHTV8DEJ2eYKivlMRQaLAP9xtjzjzxVkeYaryjLo9Dc7tIuEAQWmE7M+l4ZEn0T+D12F4vevQbN8lWPwr7mAJF+MIK5hkIoU6YnqKob4+U1MThig/b8Vu1wrk2zymmLFs80JBevfzyAt5c0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Kp9UpsSY; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Kp9UpsSY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 95102C433F1; Sun, 17 Mar 2024 13:09:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710680944; bh=YpH/O6L1fyZz4ZnrgUQq9DJ00JR7UqTznRXw4DqQ3B0=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=Kp9UpsSYOyMMckcu4YnPpY6b6P0ntWvhuYh18hhC2iPCj2ImE08q06s5M7WI0WKzu dgwY0hCd4/8oA4/BN8d40ABJXq+a9/69ZPdYpnhB9BSIRJFbzdhmmYHofjyN9iYNbb 3dpx3O01H+V6kQP/G4spZKQeXZx4jHdas83s2AbFW7EFfIqerTudaqI4meUUhyQHuv mv2YyGJVzpAUSoDNLuoiPNRLZEmESW3xA312nlWCMywSwlcJJzddgohFz3BFljjl53 m7DpB8UBKRqq/NECNYU9FhjTCV8gZV4B409VnMHSedgoy+9dplJU3D0KUaIl+HnfZi H0morTVce7hxw== Received: from sofa.misterjones.org ([185.219.108.64] helo=goblin-girl.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1rlqG6-00D2GR-DS; Sun, 17 Mar 2024 13:09:02 +0000 Date: Sun, 17 Mar 2024 13:09:01 +0000 Message-ID: <867ci10zv6.wl-maz@kernel.org> From: Marc Zyngier To: =?UTF-8?B?UGllcnJlLUNsw6ltZW50?= Tosi Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org, James Morse , Suzuki K Poulose , Oliver Upton , Zenghui Yu , Will Deacon , Quentin Perret , Vincent Donnefort Subject: Re: [PATCH 09/10] KVM: arm64: nVHE: Support CONFIG_CFI_CLANG at EL2 In-Reply-To: <87885c41627a033d9772dd368049e7f8f5fd4ef7.1710446682.git.ptosi@google.com> References: <87885c41627a033d9772dd368049e7f8f5fd4ef7.1710446682.git.ptosi@google.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/29.1 (aarch64-unknown-linux-gnu) MULE/6.0 (HANACHIRUSATO) Precedence: bulk X-Mailing-List: kvmarm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 185.219.108.64 X-SA-Exim-Rcpt-To: ptosi@google.com, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org, james.morse@arm.com, suzuki.poulose@arm.com, oliver.upton@linux.dev, yuzenghui@huawei.com, will@kernel.org, qperret@google.com, vdonnefort@google.com X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false On Thu, 14 Mar 2024 20:25:43 +0000, Pierre-Cl=C3=A9ment Tosi wrote: >=20 > The compiler implements KCFI by adding type information (u32) above > every function that might be indirectly called and, whenever a function > pointer is called, injects a read-and-compare of that u32 against the > value corresponding to the expected type. In case of a mismatch, a BRK > instruction gets executed. When the hypervisor triggers such an > exception, it panics. Importantly, this triggers an exception return to EL1. If you don't explain that, then nobody can really understand how you end-up in nvhe_hyp_panic_handler() the first place. >=20 > Therefore, teach hyp_panic() to detect KCFI errors from the ESR and nvhe_hyp_panic_handler() instead hyp_panic()? > report them. If necessary, remind the user that CONFIG_CFI_PERMISSIVE > doesn't affect EL2 KCFI. >=20 > Pass $(CC_FLAGS_CFI) to the compiler when building the nVHE hyp code. >=20 > Use SYM_TYPED_FUNC_START() for __pkvm_init_switch_pgd, as nVHE can't > call it directly and must use a PA function pointer from C (because it > is part of the idmap page), which would trigger a KCFI failure if the > type ID wasn't present. >=20 > Signed-off-by: Pierre-Cl=C3=A9ment Tosi > --- > arch/arm64/include/asm/esr.h | 6 ++++++ > arch/arm64/kvm/handle_exit.c | 11 +++++++++++ > arch/arm64/kvm/hyp/nvhe/Makefile | 6 +++--- > arch/arm64/kvm/hyp/nvhe/hyp-init.S | 3 ++- > 4 files changed, 22 insertions(+), 4 deletions(-) >=20 > diff --git a/arch/arm64/include/asm/esr.h b/arch/arm64/include/asm/esr.h > index b0c23e7d6595..281e352a4c94 100644 > --- a/arch/arm64/include/asm/esr.h > +++ b/arch/arm64/include/asm/esr.h > @@ -397,6 +397,12 @@ static inline bool esr_is_data_abort(unsigned long e= sr) > return ec =3D=3D ESR_ELx_EC_DABT_LOW || ec =3D=3D ESR_ELx_EC_DABT_CUR; > } > =20 > +static inline bool esr_is_cfi_brk(unsigned long esr) > +{ > + return ESR_ELx_EC(esr) =3D=3D ESR_ELx_EC_BRK64 && > + (esr_comment(esr) & ~CFI_BRK_IMM_MASK) =3D=3D CFI_BRK_IMM_BASE; > +} > + nit: since there is a single user, please place this helper in handle_exit.= c. > static inline bool esr_fsc_is_translation_fault(unsigned long esr) > { > return (esr & ESR_ELx_FSC_TYPE) =3D=3D ESR_ELx_FSC_FAULT; > diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c > index ffa67ac6656c..9b6574e50b13 100644 > --- a/arch/arm64/kvm/handle_exit.c > +++ b/arch/arm64/kvm/handle_exit.c > @@ -383,6 +383,15 @@ void handle_exit_early(struct kvm_vcpu *vcpu, int ex= ception_index) > kvm_handle_guest_serror(vcpu, kvm_vcpu_get_esr(vcpu)); > } > =20 > +static void kvm_nvhe_report_cfi_failure(u64 panic_addr) > +{ > + kvm_err("nVHE hyp CFI failure at: [<%016llx>] %pB!\n", panic_addr, > + (void *)(panic_addr + kaslr_offset())); > + > + if (IS_ENABLED(CONFIG_CFI_PERMISSIVE)) > + kvm_err(" (CONFIG_CFI_PERMISSIVE ignored for hyp failures)\n"); > +} > + > void __noreturn __cold nvhe_hyp_panic_handler(u64 esr, u64 spsr, > u64 elr_virt, u64 elr_phys, > u64 par, uintptr_t vcpu, > @@ -413,6 +422,8 @@ void __noreturn __cold nvhe_hyp_panic_handler(u64 esr= , u64 spsr, > else > kvm_err("nVHE hyp BUG at: [<%016llx>] %pB!\n", panic_addr, > (void *)(panic_addr + kaslr_offset())); > + } else if (IS_ENABLED(CONFIG_CFI_CLANG) && esr_is_cfi_brk(esr)) { It would seem logical to move the IS_ENABLED() into the ESR check helper. > + kvm_nvhe_report_cfi_failure(panic_addr); > } else { > kvm_err("nVHE hyp panic at: [<%016llx>] %pB!\n", panic_addr, > (void *)(panic_addr + kaslr_offset())); > diff --git a/arch/arm64/kvm/hyp/nvhe/Makefile b/arch/arm64/kvm/hyp/nvhe/M= akefile > index 2250253a6429..2eb915d8943f 100644 > --- a/arch/arm64/kvm/hyp/nvhe/Makefile > +++ b/arch/arm64/kvm/hyp/nvhe/Makefile > @@ -89,9 +89,9 @@ quiet_cmd_hyprel =3D HYPREL $@ > quiet_cmd_hypcopy =3D HYPCOPY $@ > cmd_hypcopy =3D $(OBJCOPY) --prefix-symbols=3D__kvm_nvhe_ $< $@ > =20 > -# Remove ftrace, Shadow Call Stack, and CFI CFLAGS. > -# This is equivalent to the 'notrace', '__noscs', and '__nocfi' annotati= ons. > -KBUILD_CFLAGS :=3D $(filter-out $(CC_FLAGS_FTRACE) $(CC_FLAGS_SCS) $(CC_= FLAGS_CFI), $(KBUILD_CFLAGS)) > +# Remove ftrace and Shadow Call Stack CFLAGS. > +# This is equivalent to the 'notrace' and '__noscs' annotations. > +KBUILD_CFLAGS :=3D $(filter-out $(CC_FLAGS_FTRACE) $(CC_FLAGS_SCS), $(KB= UILD_CFLAGS)) > # Starting from 13.0.0 llvm emits SHT_REL section '.llvm.call-graph-prof= ile' > # when profile optimization is applied. gen-hyprel does not support SHT_= REL and > # causes a build failure. Remove profile optimization flags. > diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-init.S b/arch/arm64/kvm/hyp/nvhe= /hyp-init.S > index 8958dd761837..ade73fdfaad9 100644 > --- a/arch/arm64/kvm/hyp/nvhe/hyp-init.S > +++ b/arch/arm64/kvm/hyp/nvhe/hyp-init.S > @@ -5,6 +5,7 @@ > */ > =20 > #include > +#include > #include > =20 > #include > @@ -265,7 +266,7 @@ alternative_else_nop_endif > =20 > SYM_CODE_END(__kvm_handle_stub_hvc) > =20 > -SYM_FUNC_START(__pkvm_init_switch_pgd) > +SYM_TYPED_FUNC_START(__pkvm_init_switch_pgd) Please put a comment indicating why SYM_TYPED_FUNC_START() is necessary, because this will otherwise bitrot very quickly. > /* Load the inputs from the VA pointer before turning the MMU off */ > ldr x5, [x0, #NVHE_INIT_PGD_PA] > ldr x0, [x0, #NVHE_INIT_STACK_HYP_VA] >=20 Another question is how do we test that this still works down the line? In my experience, these features eventually bitrot because they have very little functional impact (just like the panic handler broke the ELR_EL2 handling). We really should have a way to exercise such failure path. Thanks, M. --=20 Without deviation from the norm, progress is not possible. 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 80779C54E67 for ; Sun, 17 Mar 2024 13:09:32 +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:MIME-Version:References:In-Reply-To: Subject:Cc:To:From:Message-ID:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=3NKO0aJNOzvtDiY/nDGrCCsUPQt8pf/Pj5/Vvrc/oxE=; b=w53wTzqSfDOarI P/iM24q39IhN0coXRLj/wtfz03bYX/dRs/9xD2aJoxr6h2S4IA2F166n0QNN0KY9IfbWpkkZklLDE s6XUI0v7Tz8/ciUt9w0YLYuEzJwbYhjD8Vo9+9VmUISFd8WzNT6QXP1EL07wumxvjBL881A+S75bg FzWBUusubincx7HeTBiW/Opvy5DRjJGp5fiz+C8ghC5VnbiS4TzloYcCGV8oYEUqZ4OiZ+cWK4xm/ dazcjsiBHkgM2qBwlj30e8Lt1/CqgBwncvzVdxRxYy0oEuhxNYw7q9sO+cdSe7NtsGStvjZa2Yhsb gl0Js3nSRsN+aOCf+39g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rlqGF-00000005FRT-3ahf; Sun, 17 Mar 2024 13:09:11 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rlqGC-00000005FQw-2Jnp for linux-arm-kernel@lists.infradead.org; Sun, 17 Mar 2024 13:09:10 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 27F2660A39; Sun, 17 Mar 2024 13:09:05 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 95102C433F1; Sun, 17 Mar 2024 13:09:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710680944; bh=YpH/O6L1fyZz4ZnrgUQq9DJ00JR7UqTznRXw4DqQ3B0=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=Kp9UpsSYOyMMckcu4YnPpY6b6P0ntWvhuYh18hhC2iPCj2ImE08q06s5M7WI0WKzu dgwY0hCd4/8oA4/BN8d40ABJXq+a9/69ZPdYpnhB9BSIRJFbzdhmmYHofjyN9iYNbb 3dpx3O01H+V6kQP/G4spZKQeXZx4jHdas83s2AbFW7EFfIqerTudaqI4meUUhyQHuv mv2YyGJVzpAUSoDNLuoiPNRLZEmESW3xA312nlWCMywSwlcJJzddgohFz3BFljjl53 m7DpB8UBKRqq/NECNYU9FhjTCV8gZV4B409VnMHSedgoy+9dplJU3D0KUaIl+HnfZi H0morTVce7hxw== Received: from sofa.misterjones.org ([185.219.108.64] helo=goblin-girl.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1rlqG6-00D2GR-DS; Sun, 17 Mar 2024 13:09:02 +0000 Date: Sun, 17 Mar 2024 13:09:01 +0000 Message-ID: <867ci10zv6.wl-maz@kernel.org> From: Marc Zyngier To: =?UTF-8?B?UGllcnJlLUNsw6ltZW50?= Tosi Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org, James Morse , Suzuki K Poulose , Oliver Upton , Zenghui Yu , Will Deacon , Quentin Perret , Vincent Donnefort Subject: Re: [PATCH 09/10] KVM: arm64: nVHE: Support CONFIG_CFI_CLANG at EL2 In-Reply-To: <87885c41627a033d9772dd368049e7f8f5fd4ef7.1710446682.git.ptosi@google.com> References: <87885c41627a033d9772dd368049e7f8f5fd4ef7.1710446682.git.ptosi@google.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/29.1 (aarch64-unknown-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") X-SA-Exim-Connect-IP: 185.219.108.64 X-SA-Exim-Rcpt-To: ptosi@google.com, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org, james.morse@arm.com, suzuki.poulose@arm.com, oliver.upton@linux.dev, yuzenghui@huawei.com, will@kernel.org, qperret@google.com, vdonnefort@google.com X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240317_060908_707336_6E5AEAEF X-CRM114-Status: GOOD ( 30.78 ) 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 T24gVGh1LCAxNCBNYXIgMjAyNCAyMDoyNTo0MyArMDAwMCwKUGllcnJlLUNsw6ltZW50IFRvc2kg PHB0b3NpQGdvb2dsZS5jb20+IHdyb3RlOgo+IAo+IFRoZSBjb21waWxlciBpbXBsZW1lbnRzIEtD RkkgYnkgYWRkaW5nIHR5cGUgaW5mb3JtYXRpb24gKHUzMikgYWJvdmUKPiBldmVyeSBmdW5jdGlv biB0aGF0IG1pZ2h0IGJlIGluZGlyZWN0bHkgY2FsbGVkIGFuZCwgd2hlbmV2ZXIgYSBmdW5jdGlv bgo+IHBvaW50ZXIgaXMgY2FsbGVkLCBpbmplY3RzIGEgcmVhZC1hbmQtY29tcGFyZSBvZiB0aGF0 IHUzMiBhZ2FpbnN0IHRoZQo+IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV4cGVjdGVkIHR5 cGUuIEluIGNhc2Ugb2YgYSBtaXNtYXRjaCwgYSBCUksKPiBpbnN0cnVjdGlvbiBnZXRzIGV4ZWN1 dGVkLiBXaGVuIHRoZSBoeXBlcnZpc29yIHRyaWdnZXJzIHN1Y2ggYW4KPiBleGNlcHRpb24sIGl0 IHBhbmljcy4KCkltcG9ydGFudGx5LCB0aGlzIHRyaWdnZXJzIGFuIGV4Y2VwdGlvbiByZXR1cm4g dG8gRUwxLiBJZiB5b3UgZG9uJ3QKZXhwbGFpbiB0aGF0LCB0aGVuIG5vYm9keSBjYW4gcmVhbGx5 IHVuZGVyc3RhbmQgaG93IHlvdSBlbmQtdXAgaW4KbnZoZV9oeXBfcGFuaWNfaGFuZGxlcigpIHRo ZSBmaXJzdCBwbGFjZS4KCj4gCj4gVGhlcmVmb3JlLCB0ZWFjaCBoeXBfcGFuaWMoKSB0byBkZXRl Y3QgS0NGSSBlcnJvcnMgZnJvbSB0aGUgRVNSIGFuZAoKbnZoZV9oeXBfcGFuaWNfaGFuZGxlcigp IGluc3RlYWQgaHlwX3BhbmljKCk/Cgo+IHJlcG9ydCB0aGVtLiBJZiBuZWNlc3NhcnksIHJlbWlu ZCB0aGUgdXNlciB0aGF0IENPTkZJR19DRklfUEVSTUlTU0lWRQo+IGRvZXNuJ3QgYWZmZWN0IEVM MiBLQ0ZJLgo+IAo+IFBhc3MgJChDQ19GTEFHU19DRkkpIHRvIHRoZSBjb21waWxlciB3aGVuIGJ1 aWxkaW5nIHRoZSBuVkhFIGh5cCBjb2RlLgo+IAo+IFVzZSBTWU1fVFlQRURfRlVOQ19TVEFSVCgp IGZvciBfX3Brdm1faW5pdF9zd2l0Y2hfcGdkLCBhcyBuVkhFIGNhbid0Cj4gY2FsbCBpdCBkaXJl Y3RseSBhbmQgbXVzdCB1c2UgYSBQQSBmdW5jdGlvbiBwb2ludGVyIGZyb20gQyAoYmVjYXVzZSBp dAo+IGlzIHBhcnQgb2YgdGhlIGlkbWFwIHBhZ2UpLCB3aGljaCB3b3VsZCB0cmlnZ2VyIGEgS0NG SSBmYWlsdXJlIGlmIHRoZQo+IHR5cGUgSUQgd2Fzbid0IHByZXNlbnQuCj4gCj4gU2lnbmVkLW9m Zi1ieTogUGllcnJlLUNsw6ltZW50IFRvc2kgPHB0b3NpQGdvb2dsZS5jb20+Cj4gLS0tCj4gIGFy Y2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmggICAgICAgfCAgNiArKysrKysKPiAgYXJjaC9hcm02 NC9rdm0vaGFuZGxlX2V4aXQuYyAgICAgICB8IDExICsrKysrKysrKysrCj4gIGFyY2gvYXJtNjQv a3ZtL2h5cC9udmhlL01ha2VmaWxlICAgfCAgNiArKystLS0KPiAgYXJjaC9hcm02NC9rdm0vaHlw L252aGUvaHlwLWluaXQuUyB8ICAzICsrLQo+ICA0IGZpbGVzIGNoYW5nZWQsIDIyIGluc2VydGlv bnMoKyksIDQgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVk ZS9hc20vZXNyLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oCj4gaW5kZXggYjBjMjNl N2Q2NTk1Li4yODFlMzUyYTRjOTQgMTAwNjQ0Cj4gLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2Fz bS9lc3IuaAo+ICsrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmgKPiBAQCAtMzk3LDYg KzM5NywxMiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgZXNyX2lzX2RhdGFfYWJvcnQodW5zaWduZWQg bG9uZyBlc3IpCj4gIAlyZXR1cm4gZWMgPT0gRVNSX0VMeF9FQ19EQUJUX0xPVyB8fCBlYyA9PSBF U1JfRUx4X0VDX0RBQlRfQ1VSOwo+ICB9Cj4gIAo+ICtzdGF0aWMgaW5saW5lIGJvb2wgZXNyX2lz X2NmaV9icmsodW5zaWduZWQgbG9uZyBlc3IpCj4gK3sKPiArCXJldHVybiBFU1JfRUx4X0VDKGVz cikgPT0gRVNSX0VMeF9FQ19CUks2NCAmJgo+ICsJICAgICAgIChlc3JfY29tbWVudChlc3IpICYg fkNGSV9CUktfSU1NX01BU0spID09IENGSV9CUktfSU1NX0JBU0U7Cj4gK30KPiArCgpuaXQ6IHNp bmNlIHRoZXJlIGlzIGEgc2luZ2xlIHVzZXIsIHBsZWFzZSBwbGFjZSB0aGlzIGhlbHBlciBpbiBo YW5kbGVfZXhpdC5jLgoKPiAgc3RhdGljIGlubGluZSBib29sIGVzcl9mc2NfaXNfdHJhbnNsYXRp b25fZmF1bHQodW5zaWduZWQgbG9uZyBlc3IpCj4gIHsKPiAgCXJldHVybiAoZXNyICYgRVNSX0VM eF9GU0NfVFlQRSkgPT0gRVNSX0VMeF9GU0NfRkFVTFQ7Cj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJt NjQva3ZtL2hhbmRsZV9leGl0LmMgYi9hcmNoL2FybTY0L2t2bS9oYW5kbGVfZXhpdC5jCj4gaW5k ZXggZmZhNjdhYzY2NTZjLi45YjY1NzRlNTBiMTMgMTAwNjQ0Cj4gLS0tIGEvYXJjaC9hcm02NC9r dm0vaGFuZGxlX2V4aXQuYwo+ICsrKyBiL2FyY2gvYXJtNjQva3ZtL2hhbmRsZV9leGl0LmMKPiBA QCAtMzgzLDYgKzM4MywxNSBAQCB2b2lkIGhhbmRsZV9leGl0X2Vhcmx5KHN0cnVjdCBrdm1fdmNw dSAqdmNwdSwgaW50IGV4Y2VwdGlvbl9pbmRleCkKPiAgCQlrdm1faGFuZGxlX2d1ZXN0X3NlcnJv cih2Y3B1LCBrdm1fdmNwdV9nZXRfZXNyKHZjcHUpKTsKPiAgfQo+ICAKPiArc3RhdGljIHZvaWQg a3ZtX252aGVfcmVwb3J0X2NmaV9mYWlsdXJlKHU2NCBwYW5pY19hZGRyKQo+ICt7Cj4gKwlrdm1f ZXJyKCJuVkhFIGh5cCBDRkkgZmFpbHVyZSBhdDogWzwlMDE2bGx4Pl0gJXBCIVxuIiwgcGFuaWNf YWRkciwKPiArCQkodm9pZCAqKShwYW5pY19hZGRyICsga2FzbHJfb2Zmc2V0KCkpKTsKPiArCj4g KwlpZiAoSVNfRU5BQkxFRChDT05GSUdfQ0ZJX1BFUk1JU1NJVkUpKQo+ICsJCWt2bV9lcnIoIiAo Q09ORklHX0NGSV9QRVJNSVNTSVZFIGlnbm9yZWQgZm9yIGh5cCBmYWlsdXJlcylcbiIpOwo+ICt9 Cj4gKwo+ICB2b2lkIF9fbm9yZXR1cm4gX19jb2xkIG52aGVfaHlwX3BhbmljX2hhbmRsZXIodTY0 IGVzciwgdTY0IHNwc3IsCj4gIAkJCQkJICAgICAgdTY0IGVscl92aXJ0LCB1NjQgZWxyX3BoeXMs Cj4gIAkJCQkJICAgICAgdTY0IHBhciwgdWludHB0cl90IHZjcHUsCj4gQEAgLTQxMyw2ICs0MjIs OCBAQCB2b2lkIF9fbm9yZXR1cm4gX19jb2xkIG52aGVfaHlwX3BhbmljX2hhbmRsZXIodTY0IGVz ciwgdTY0IHNwc3IsCj4gIAkJZWxzZQo+ICAJCQlrdm1fZXJyKCJuVkhFIGh5cCBCVUcgYXQ6IFs8 JTAxNmxseD5dICVwQiFcbiIsIHBhbmljX2FkZHIsCj4gIAkJCQkJKHZvaWQgKikocGFuaWNfYWRk ciArIGthc2xyX29mZnNldCgpKSk7Cj4gKwl9IGVsc2UgaWYgKElTX0VOQUJMRUQoQ09ORklHX0NG SV9DTEFORykgJiYgZXNyX2lzX2NmaV9icmsoZXNyKSkgewoKSXQgd291bGQgc2VlbSBsb2dpY2Fs IHRvIG1vdmUgdGhlIElTX0VOQUJMRUQoKSBpbnRvIHRoZSBFU1IgY2hlY2sgaGVscGVyLgoKPiAr CQlrdm1fbnZoZV9yZXBvcnRfY2ZpX2ZhaWx1cmUocGFuaWNfYWRkcik7Cj4gIAl9IGVsc2Ugewo+ ICAJCWt2bV9lcnIoIm5WSEUgaHlwIHBhbmljIGF0OiBbPCUwMTZsbHg+XSAlcEIhXG4iLCBwYW5p Y19hZGRyLAo+ICAJCQkJKHZvaWQgKikocGFuaWNfYWRkciArIGthc2xyX29mZnNldCgpKSk7Cj4g ZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL01ha2VmaWxlIGIvYXJjaC9hcm02 NC9rdm0vaHlwL252aGUvTWFrZWZpbGUKPiBpbmRleCAyMjUwMjUzYTY0MjkuLjJlYjkxNWQ4OTQz ZiAxMDA2NDQKPiAtLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS9NYWtlZmlsZQo+ICsrKyBi L2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL01ha2VmaWxlCj4gQEAgLTg5LDkgKzg5LDkgQEAgcXVp ZXRfY21kX2h5cHJlbCA9IEhZUFJFTCAgJEAKPiAgcXVpZXRfY21kX2h5cGNvcHkgPSBIWVBDT1BZ ICRACj4gICAgICAgIGNtZF9oeXBjb3B5ID0gJChPQkpDT1BZKSAtLXByZWZpeC1zeW1ib2xzPV9f a3ZtX252aGVfICQ8ICRACj4gIAo+IC0jIFJlbW92ZSBmdHJhY2UsIFNoYWRvdyBDYWxsIFN0YWNr LCBhbmQgQ0ZJIENGTEFHUy4KPiAtIyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlICdub3RyYWNl JywgJ19fbm9zY3MnLCBhbmQgJ19fbm9jZmknIGFubm90YXRpb25zLgo+IC1LQlVJTERfQ0ZMQUdT IDo9ICQoZmlsdGVyLW91dCAkKENDX0ZMQUdTX0ZUUkFDRSkgJChDQ19GTEFHU19TQ1MpICQoQ0Nf RkxBR1NfQ0ZJKSwgJChLQlVJTERfQ0ZMQUdTKSkKPiArIyBSZW1vdmUgZnRyYWNlIGFuZCBTaGFk b3cgQ2FsbCBTdGFjayBDRkxBR1MuCj4gKyMgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSAnbm90 cmFjZScgYW5kICdfX25vc2NzJyBhbm5vdGF0aW9ucy4KPiArS0JVSUxEX0NGTEFHUyA6PSAkKGZp bHRlci1vdXQgJChDQ19GTEFHU19GVFJBQ0UpICQoQ0NfRkxBR1NfU0NTKSwgJChLQlVJTERfQ0ZM QUdTKSkKPiAgIyBTdGFydGluZyBmcm9tIDEzLjAuMCBsbHZtIGVtaXRzIFNIVF9SRUwgc2VjdGlv biAnLmxsdm0uY2FsbC1ncmFwaC1wcm9maWxlJwo+ICAjIHdoZW4gcHJvZmlsZSBvcHRpbWl6YXRp b24gaXMgYXBwbGllZC4gZ2VuLWh5cHJlbCBkb2VzIG5vdCBzdXBwb3J0IFNIVF9SRUwgYW5kCj4g ICMgY2F1c2VzIGEgYnVpbGQgZmFpbHVyZS4gUmVtb3ZlIHByb2ZpbGUgb3B0aW1pemF0aW9uIGZs YWdzLgo+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS9oeXAtaW5pdC5TIGIv YXJjaC9hcm02NC9rdm0vaHlwL252aGUvaHlwLWluaXQuUwo+IGluZGV4IDg5NThkZDc2MTgzNy4u YWRlNzNmZGZhYWQ5IDEwMDY0NAo+IC0tLSBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL2h5cC1p bml0LlMKPiArKysgYi9hcmNoL2FybTY0L2t2bS9oeXAvbnZoZS9oeXAtaW5pdC5TCj4gQEAgLTUs NiArNSw3IEBACj4gICAqLwo+ICAKPiAgI2luY2x1ZGUgPGxpbnV4L2FybS1zbWNjYy5oPgo+ICsj aW5jbHVkZSA8bGludXgvY2ZpX3R5cGVzLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+ Cj4gIAo+ICAjaW5jbHVkZSA8YXNtL2FsdGVybmF0aXZlLmg+Cj4gQEAgLTI2NSw3ICsyNjYsNyBA QCBhbHRlcm5hdGl2ZV9lbHNlX25vcF9lbmRpZgo+ICAKPiAgU1lNX0NPREVfRU5EKF9fa3ZtX2hh bmRsZV9zdHViX2h2YykKPiAgCj4gLVNZTV9GVU5DX1NUQVJUKF9fcGt2bV9pbml0X3N3aXRjaF9w Z2QpCj4gK1NZTV9UWVBFRF9GVU5DX1NUQVJUKF9fcGt2bV9pbml0X3N3aXRjaF9wZ2QpCgpQbGVh c2UgcHV0IGEgY29tbWVudCBpbmRpY2F0aW5nIHdoeSBTWU1fVFlQRURfRlVOQ19TVEFSVCgpIGlz Cm5lY2Vzc2FyeSwgYmVjYXVzZSB0aGlzIHdpbGwgb3RoZXJ3aXNlIGJpdHJvdCB2ZXJ5IHF1aWNr bHkuCgo+ICAJLyogTG9hZCB0aGUgaW5wdXRzIGZyb20gdGhlIFZBIHBvaW50ZXIgYmVmb3JlIHR1 cm5pbmcgdGhlIE1NVSBvZmYgKi8KPiAgCWxkcgl4NSwgW3gwLCAjTlZIRV9JTklUX1BHRF9QQV0K PiAgCWxkcgl4MCwgW3gwLCAjTlZIRV9JTklUX1NUQUNLX0hZUF9WQV0KPiAKCkFub3RoZXIgcXVl c3Rpb24gaXMgaG93IGRvIHdlIHRlc3QgdGhhdCB0aGlzIHN0aWxsIHdvcmtzIGRvd24gdGhlCmxp bmU/IEluIG15IGV4cGVyaWVuY2UsIHRoZXNlIGZlYXR1cmVzIGV2ZW50dWFsbHkgYml0cm90IGJl Y2F1c2UgdGhleQpoYXZlIHZlcnkgbGl0dGxlIGZ1bmN0aW9uYWwgaW1wYWN0IChqdXN0IGxpa2Ug dGhlIHBhbmljIGhhbmRsZXIgYnJva2UKdGhlIEVMUl9FTDIgaGFuZGxpbmcpLiBXZSByZWFsbHkg c2hvdWxkIGhhdmUgYSB3YXkgdG8gZXhlcmNpc2Ugc3VjaApmYWlsdXJlIHBhdGguCgpUaGFua3Ms CgoJTS4KCi0tIApXaXRob3V0IGRldmlhdGlvbiBmcm9tIHRoZSBub3JtLCBwcm9ncmVzcyBpcyBu b3QgcG9zc2libGUuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3Rz LmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1hcm0ta2VybmVsCg==