From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 398AF3CB57B; Tue, 8 Sep 2026 09:59:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788861566; cv=none; b=KwYt8tGCx+5PM97NlToxvCKWdqKu/k8oBjaCyWeCDP+76vzyjSDqXjuFKcDfOgNr/tbcIyZ+MkBc61A12scMFcTox/rQ7rSYhifXIxViqXDdr3V8gmCL+ikgh9uCmtEX8J0ibsD6hwDirm/0PZLAQ74YN3DUR0rre0s1Zv1Y47o= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788861566; c=relaxed/simple; bh=WEYQYusbt2Mpvh0Zh00ffY0JSbtd03VDzK6C90x78Iw=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=twEce7okaFrhGeL77FBFhphL5TXuROuvwtI+SV15jpTbUllDxTvORHsFSfi/mo6ckoM+VTxW3IVz4UET/oa9zub+L8FTbGKE+6GBE9s0xW5KOPnv4XJ/vyVN9xQm1SryZbV5ib19CuwX9ipn7IKKPLZdiVAsvari4UFdiMu+LtY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=au/t54QD; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="au/t54QD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8C3071F00A3D; Tue, 8 Sep 2026 09:59:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788861564; bh=V4ifYhj5ey0g3l1Ok7EVyIw9Ie8yI/Ypk9Qe6O09XRc=; h=Date:Subject:To:Cc:References:From:In-Reply-To; b=au/t54QDRARSRKQ0Kl8AHX/axMhDJt35PmLOGilGTG/d9KVok6qqKoF4zMvyGgvec XhZ5DfZPdMHkazV6Yis2rJEmYZGGq3/euhqROB/+IvumwxQHAOXemH/1TzXb/pNsvy YFdUy3VVPZ0deHWFwWwWXGhtw1rBaBZOIUkvDemGkWqgcOPPyE0gKCJfoy9oHQFp3G +GAt9bUgp8nF30nCFjR1Ryfk3tw/HWcLcFDJi3V2zIQsWbAYGTx2Z9reVCPC+THUnd Vk/f06I/DsRaKRlkescXbzmNj24mOdEJuhJPhG3ynbGMLIuqs0XEFE0NjuWDA+o+0x fbogPtvhioscA== Message-ID: Date: Tue, 8 Sep 2026 11:59:14 +0200 Precedence: bulk X-Mailing-List: linux-hardening@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] powerpc/kasan: require memintrinsic prefix support for KASAN To: "Mukesh Kumar Chaurasiya (IBM)" , maddy@linux.ibm.com, mpe@ellerman.id.au, npiggin@gmail.com, ryabinin.a.a@gmail.com, glider@google.com, andreyknvl@gmail.com, dvyukov@google.com, vincenzo.frascino@arm.com, pjw@kernel.org, palmer@dabbelt.com, aou@eecs.berkeley.edu, alex@ghiti.fr, kees@kernel.org, amachhiw@linux.ibm.com, ritesh.list@gmail.com, robh@kernel.org, sayalip@linux.ibm.com, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, linux-riscv@lists.infradead.org, linux-hardening@vger.kernel.org Cc: Venkat Rao Bagalkote References: <20260908064948.999530-1-mkchauras@gmail.com> Content-Language: fr-FR From: "Christophe Leroy (CS GROUP)" In-Reply-To: <20260908064948.999530-1-mkchauras@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Le 08/09/2026 à 08:49, Mukesh Kumar Chaurasiya (IBM) a écrit : > powerpc unconditionally selects GENERIC_ENTRY. The GENERIC_ENTRY > infrastructure relies on the compiler emitting __asan_mem*() calls at > instrumented mem*() sites rather than plain memset/memcpy/memmove, so > that entry/exit paths calling those functions are not instrumented. > > This assumption is encoded in two places: > > mm/kasan/shadow.c: > #if !defined(CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX) && > !defined(CONFIG_GENERIC_ENTRY) > > include/linux/fortify-string.h: > #if !defined(CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX) && > !defined(CONFIG_GENERIC_ENTRY) > > When GENERIC_ENTRY is set, both guards suppress the C wrappers for > memset/memcpy/memmove and the __underlying_mem*() redirections. This > is only safe when the compiler supports the prefixed __asan_mem*() > intrinsics. On older toolchains (e.g. GCC 9) that lack this support, > plain mem*() calls from instrumented code fall through to the raw > assembly implementations in mem_64.S / copy_32.S, completely bypassing > the KASAN shadow check. > > Other arches with GENERIC_ENTRY (x86, s390, loongarch, riscv) do not > hit this because their CI toolchains are always new enough to support > the prefix flag. > > Background: the !GENERIC_ENTRY guard was introduced by commit 69d4c0d32186 > ("entry, kasan, x86: Disallow overriding mem*() functions", Peter Zijlstra, > Jan 2023). The root problem is that the KASAN C wrappers override the > linker symbol memset/memcpy/memmove globally, so any call from noinstr or > __no_sanitize_address code (e.g. irqentry_enter/irqentry_exit) would still > reach the KASAN shadow-check wrapper -- at a point where KASAN invariants > may not hold. The compiler prefix approach (Marco Elver, Feb 2023, > commit 51287dcb00cc) solves this by having the compiler emit __asan_memset > at instrumented call sites and bare memset inside __no_sanitize_address > functions, splitting the decision at code-generation time rather than at > link time. > > A manual C-level override cannot replicate this split: a single linker > symbol cannot be made to resolve differently depending on the caller. > > x86 also placed its raw memset/memcpy/memmove implementations in > .noinstr.text (same commit, 69d4c0d32186), which is the other half of > the fix: noinstr callers hit the raw assembly directly, safely bypassing > KASAN. PowerPC has not done this. Placing mem_64.S / memcpy_64.S / > copy_32.S implementations in .noinstr.text would be the complementary > long-term fix that could re-enable KASAN on older toolchains, but it > requires care around linker stub overflow on large PPC64 kernels (the > same reason powerpc uses NOKPROBE_SYMBOL rather than noinstr for its > interrupt handlers -- see the comment in asm/interrupt.h). That work > is left as a follow-up. > > For now, introduce PPC_CC_HAS_KASAN_MEMINTRINSIC_PREFIX, an arch-local > compiler probe that mirrors the same check as CC_HAS_KASAN_MEMINTRINSIC_PREFIX > in lib/Kconfig.kasan but lives outside the 'if KASAN' block to avoid a > recursive dependency (CC_HAS_KASAN_MEMINTRINSIC_PREFIX depends on KASAN > which depends on HAVE_ARCH_KASAN). Gate the three HAVE_ARCH_KASAN selects > on this new symbol so that KASAN is not offered as a config option on > toolchains that cannot support it correctly with GENERIC_ENTRY. > > Since KASAN on powerpc now unconditionally implies > CC_HAS_KASAN_MEMINTRINSIC_PREFIX, the old !CC_HAS_KASAN_MEMINTRINSIC_PREFIX > code paths in asm/kasan.h and asm/string.h are dead. Clean them up: > > - asm/kasan.h: remove the dual-entry-point variant of _GLOBAL_KASAN / > _GLOBAL_TOC_KASAN / EXPORT_SYMBOL_KASAN that emitted both memset and > __memset as entry points to the same assembly. These aliases were only > needed so the C KASAN wrappers in shadow.c could call __memset() to > reach raw memory ops; with the compiler prefix approach the wrappers are > not used at all for mem* on powerpc. > > - asm/string.h: remove the separate __memset/__memcpy/__memmove symbol > declarations and the memset/memcpy/memmove macro redirections for > uninstrumented files that were needed on old toolchains. Simplify the > CONFIG_KASAN block to just the three #define aliases (which are still > used by shadow.c as raw backends). > > - cputable.c, prom_init.c: update stale comments that said GCC replaces > memcpy() with __memcpy() under KASAN; with the prefix flag it emits > __asan_memcpy() instead. > > Reported-by: Venkat Rao Bagalkote > Closes: https://lore.kernel.org/all/96dae110-f79b-4e54-8a9b-514369019b5d@linux.ibm.com > Signed-off-by: Mukesh Kumar Chaurasiya (IBM) > --- > arch/powerpc/Kconfig | 10 +++++++--- > arch/powerpc/include/asm/kasan.h | 19 ++++++++----------- > arch/powerpc/include/asm/string.h | 25 +++++-------------------- > arch/powerpc/kernel/cputable.c | 6 +++--- > arch/powerpc/kernel/prom_init.c | 4 ++-- > 5 files changed, 25 insertions(+), 39 deletions(-) > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > index 2580e27e4328..b27ed9739eea 100644 > --- a/arch/powerpc/Kconfig > +++ b/arch/powerpc/Kconfig > @@ -7,6 +7,10 @@ config CC_HAS_ELFV2 > config CC_HAS_PREFIXED > def_bool PPC64 && $(cc-option, -mcpu=power10 -mprefixed) > > +config PPC_CC_HAS_KASAN_MEMINTRINSIC_PREFIX > + def_bool (CC_IS_CLANG && $(cc-option,-fsanitize=kernel-address -mllvm -asan-kernel-mem-intrinsic-prefix=1)) || \ > + (CC_IS_GCC && $(cc-option,-fsanitize=kernel-address --param asan-kernel-mem-intrinsic-prefix=1)) > + > config CC_HAS_PCREL > # Clang has a bug (https://github.com/llvm/llvm-project/issues/62372) > # where pcrel code is not generated if -msoft-float, -mno-altivec, or > @@ -220,9 +224,9 @@ config PPC > select HAVE_ARCH_HUGE_VMAP if PPC_RADIX_MMU || PPC_8xx > select HAVE_ARCH_JUMP_LABEL > select HAVE_ARCH_JUMP_LABEL_RELATIVE > - select HAVE_ARCH_KASAN if PPC32 && PAGE_SHIFT <= 14 > - select HAVE_ARCH_KASAN if PPC_RADIX_MMU > - select HAVE_ARCH_KASAN if PPC_BOOK3E_64 > + select HAVE_ARCH_KASAN if PPC32 && PAGE_SHIFT <= 14 && PPC_CC_HAS_KASAN_MEMINTRINSIC_PREFIX > + select HAVE_ARCH_KASAN if PPC_RADIX_MMU && PPC_CC_HAS_KASAN_MEMINTRINSIC_PREFIX > + select HAVE_ARCH_KASAN if PPC_BOOK3E_64 && PPC_CC_HAS_KASAN_MEMINTRINSIC_PREFIX > select HAVE_ARCH_KASAN_VMALLOC if HAVE_ARCH_KASAN > select HAVE_ARCH_KCSAN > select HAVE_ARCH_KFENCE if ARCH_SUPPORTS_DEBUG_PAGEALLOC > diff --git a/arch/powerpc/include/asm/kasan.h b/arch/powerpc/include/asm/kasan.h > index a690e7da53c2..ffada5f51b2b 100644 > --- a/arch/powerpc/include/asm/kasan.h > +++ b/arch/powerpc/include/asm/kasan.h > @@ -2,20 +2,17 @@ > #ifndef __ASM_KASAN_H > #define __ASM_KASAN_H > > -#if defined(CONFIG_KASAN) && !defined(CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX) > -#define _GLOBAL_KASAN(fn) \ > - _GLOBAL(fn); \ > - _GLOBAL(__##fn) > -#define _GLOBAL_TOC_KASAN(fn) \ > - _GLOBAL_TOC(fn); \ > - _GLOBAL_TOC(__##fn) > -#define EXPORT_SYMBOL_KASAN(fn) \ > - EXPORT_SYMBOL(__##fn) > -#else /* CONFIG_KASAN && !CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX */ > +/* > + * powerpc requires CC_HAS_KASAN_MEMINTRINSIC_PREFIX whenever KASAN is > + * enabled (see PPC_CC_HAS_KASAN_MEMINTRINSIC_PREFIX in arch/powerpc/Kconfig), > + * so the compiler always emits __asan_mem*() at instrumented call sites and > + * bare mem*() inside __no_sanitize_address / noinstr code. The old dual > + * entry-point trick (_GLOBAL_KASAN emitting both memset and __memset) is > + * therefore never needed. > + */ This explanation belongs to the commit message not to the source code. > #define _GLOBAL_KASAN(fn) _GLOBAL(fn) > #define _GLOBAL_TOC_KASAN(fn) _GLOBAL_TOC(fn) > #define EXPORT_SYMBOL_KASAN(fn) > -#endif /* CONFIG_KASAN && !CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX */ > > #ifndef __ASSEMBLER__ > > diff --git a/arch/powerpc/include/asm/string.h b/arch/powerpc/include/asm/string.h > index 1981bd4036b5..743126e3dcc1 100644 > --- a/arch/powerpc/include/asm/string.h > +++ b/arch/powerpc/include/asm/string.h > @@ -29,29 +29,14 @@ extern void * memchr(const void *,int,__kernel_size_t); > void memcpy_flushcache(void *dest, const void *src, size_t size); > > #ifdef CONFIG_KASAN > -/* __mem variants are used by KASAN to implement instrumented meminstrinsics. */ > -#ifdef CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX > +/* > + * powerpc requires CC_HAS_KASAN_MEMINTRINSIC_PREFIX whenever KASAN is > + * enabled, so the compiler emits __asan_mem*() at instrumented sites. > + * The raw mem* symbols are always safe to call directly. > + */ This explanation belongs to the commit message not to the source code. > #define __memset memset > #define __memcpy memcpy > #define __memmove memmove > -#else /* CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX */ > -void *__memset(void *s, int c, __kernel_size_t count); > -void *__memcpy(void *to, const void *from, __kernel_size_t n); > -void *__memmove(void *to, const void *from, __kernel_size_t n); > -#ifndef __SANITIZE_ADDRESS__ > -/* > - * For files that are not instrumented (e.g. mm/slub.c) we > - * should use not instrumented version of mem* functions. > - */ > -#define memcpy(dst, src, len) __memcpy(dst, src, len) > -#define memmove(dst, src, len) __memmove(dst, src, len) > -#define memset(s, c, n) __memset(s, c, n) > - > -#ifndef __NO_FORTIFY > -#define __NO_FORTIFY /* FORTIFY_SOURCE uses __builtin_memcpy, etc. */ > -#endif > -#endif /* !__SANITIZE_ADDRESS__ */ > -#endif /* CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX */ > #endif /* CONFIG_KASAN */ > > #ifdef CONFIG_PPC64 > diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c > index 6f6801da9dc1..44115f904c2c 100644 > --- a/arch/powerpc/kernel/cputable.c > +++ b/arch/powerpc/kernel/cputable.c > @@ -36,8 +36,8 @@ void __init set_cur_cpu_spec(struct cpu_spec *s) > > t = PTRRELOC(t); > /* > - * use memcpy() instead of *t = *s so that GCC replaces it > - * by __memcpy() when KASAN is active > + * use memcpy() instead of *t = *s so that the compiler replaces it > + * by __asan_memcpy() when KASAN is active > */ Does the initial problem still exist with the new __asan_memcpy() approach ? If not the comment should be removed. > memcpy(t, s, sizeof(*t)); > > @@ -55,7 +55,7 @@ static struct cpu_spec * __init setup_cpu_spec(unsigned long offset, > > /* > * Copy everything, then do fixups. Use memcpy() instead of *t = *s > - * so that GCC replaces it by __memcpy() when KASAN is active > + * so that the compiler replaces it by __asan_memcpy() when KASAN is active Does the initial problem still exist with the new __asan_memcpy() approach ? If not the comment should be removed. > */ > memcpy(t, s, sizeof(*t)); > > diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c > index eb9f556b0937..b763720c68b6 100644 > --- a/arch/powerpc/kernel/prom_init.c > +++ b/arch/powerpc/kernel/prom_init.c > @@ -1365,8 +1365,8 @@ static void __init prom_check_platform_support(void) > /* > * First copy the architecture vec template > * > - * use memcpy() instead of *vec = *vec_template so that GCC replaces it > - * by __memcpy() when KASAN is active > + * use memcpy() instead of *vec = *vec_template so that the compiler > + * replaces it by __asan_memcpy() when KASAN is active Does the initial problem still exist with the new __asan_memcpy() approach ? If not the comment should be removed. > */ > memcpy(&ibm_architecture_vec, &ibm_architecture_vec_template, > sizeof(ibm_architecture_vec)); 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 7BA67C79FAD for ; Tue, 8 Sep 2026 09:59:37 +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:From:References:Cc:To:Subject: MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=EkjEvhugVekMipogPCwzmylRoaxT+ssSfxOGhOMIukU=; b=OEk/pAsOQ5GBuS XVxS3aTiZX2UUkNnztA7sPymDQJXDX49Z5kl/SGv9qC9G6wVvMw0pm5KKV24Tbj/4K6EK/Bruw0t7 JB7oqlAfuKlEy0PuwJ/PmEgRGy0JIye6qH8MdEhXC5fJaQAPKOA8I8DG8+QssJPm9PxrQZPM8N6gZ 4uQpLSRNqU/L4TI+n67pDZV4K58k6aBzIjb0ZtgnwfUiNIdIjv3tNpiWDlJFKNPjvuime8dOG6qfP 4Od0TmTCwMF+sCnanLfLBlVxAXh+DMJQpSQ82eJdzFtT3OI0naCJED5kY4c/ulpmY/ejYnBCh2Z6B Ekl176FplL650yF6nbvg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1x3sbu-00000008hgy-2jMw; Tue, 08 Sep 2026 09:59:26 +0000 Received: from tor.source.kernel.org ([2600:3c04:e001:324:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1x3sbt-00000008hg7-39Df for linux-riscv@lists.infradead.org; Tue, 08 Sep 2026 09:59:25 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id 2481060A97; Tue, 8 Sep 2026 09:59:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8C3071F00A3D; Tue, 8 Sep 2026 09:59:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788861564; bh=V4ifYhj5ey0g3l1Ok7EVyIw9Ie8yI/Ypk9Qe6O09XRc=; h=Date:Subject:To:Cc:References:From:In-Reply-To; b=au/t54QDRARSRKQ0Kl8AHX/axMhDJt35PmLOGilGTG/d9KVok6qqKoF4zMvyGgvec XhZ5DfZPdMHkazV6Yis2rJEmYZGGq3/euhqROB/+IvumwxQHAOXemH/1TzXb/pNsvy YFdUy3VVPZ0deHWFwWwWXGhtw1rBaBZOIUkvDemGkWqgcOPPyE0gKCJfoy9oHQFp3G +GAt9bUgp8nF30nCFjR1Ryfk3tw/HWcLcFDJi3V2zIQsWbAYGTx2Z9reVCPC+THUnd Vk/f06I/DsRaKRlkescXbzmNj24mOdEJuhJPhG3ynbGMLIuqs0XEFE0NjuWDA+o+0x fbogPtvhioscA== Message-ID: Date: Tue, 8 Sep 2026 11:59:14 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] powerpc/kasan: require memintrinsic prefix support for KASAN To: "Mukesh Kumar Chaurasiya (IBM)" , maddy@linux.ibm.com, mpe@ellerman.id.au, npiggin@gmail.com, ryabinin.a.a@gmail.com, glider@google.com, andreyknvl@gmail.com, dvyukov@google.com, vincenzo.frascino@arm.com, pjw@kernel.org, palmer@dabbelt.com, aou@eecs.berkeley.edu, alex@ghiti.fr, kees@kernel.org, amachhiw@linux.ibm.com, ritesh.list@gmail.com, robh@kernel.org, sayalip@linux.ibm.com, linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, linux-riscv@lists.infradead.org, linux-hardening@vger.kernel.org Cc: Venkat Rao Bagalkote References: <20260908064948.999530-1-mkchauras@gmail.com> Content-Language: fr-FR From: "Christophe Leroy (CS GROUP)" In-Reply-To: <20260908064948.999530-1-mkchauras@gmail.com> X-BeenThere: linux-riscv@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-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org CgpMZSAwOC8wOS8yMDI2IMOgIDA4OjQ5LCBNdWtlc2ggS3VtYXIgQ2hhdXJhc2l5YSAoSUJNKSBh IMOpY3JpdMKgOgo+IHBvd2VycGMgdW5jb25kaXRpb25hbGx5IHNlbGVjdHMgR0VORVJJQ19FTlRS WS4gVGhlIEdFTkVSSUNfRU5UUlkKPiBpbmZyYXN0cnVjdHVyZSByZWxpZXMgb24gdGhlIGNvbXBp bGVyIGVtaXR0aW5nIF9fYXNhbl9tZW0qKCkgY2FsbHMgYXQKPiBpbnN0cnVtZW50ZWQgbWVtKigp IHNpdGVzIHJhdGhlciB0aGFuIHBsYWluIG1lbXNldC9tZW1jcHkvbWVtbW92ZSwgc28KPiB0aGF0 IGVudHJ5L2V4aXQgcGF0aHMgY2FsbGluZyB0aG9zZSBmdW5jdGlvbnMgYXJlIG5vdCBpbnN0cnVt ZW50ZWQuCj4gCj4gVGhpcyBhc3N1bXB0aW9uIGlzIGVuY29kZWQgaW4gdHdvIHBsYWNlczoKPiAK PiAgICBtbS9rYXNhbi9zaGFkb3cuYzoKPiAgICAgICNpZiAhZGVmaW5lZChDT05GSUdfQ0NfSEFT X0tBU0FOX01FTUlOVFJJTlNJQ19QUkVGSVgpICYmCj4gICAgICAgICAgIWRlZmluZWQoQ09ORklH X0dFTkVSSUNfRU5UUlkpCj4gCj4gICAgaW5jbHVkZS9saW51eC9mb3J0aWZ5LXN0cmluZy5oOgo+ ICAgICAgI2lmICFkZWZpbmVkKENPTkZJR19DQ19IQVNfS0FTQU5fTUVNSU5UUklOU0lDX1BSRUZJ WCkgJiYKPiAgICAgICAgICAhZGVmaW5lZChDT05GSUdfR0VORVJJQ19FTlRSWSkKPiAKPiBXaGVu IEdFTkVSSUNfRU5UUlkgaXMgc2V0LCBib3RoIGd1YXJkcyBzdXBwcmVzcyB0aGUgQyB3cmFwcGVy cyBmb3IKPiBtZW1zZXQvbWVtY3B5L21lbW1vdmUgYW5kIHRoZSBfX3VuZGVybHlpbmdfbWVtKigp IHJlZGlyZWN0aW9ucy4gVGhpcwo+IGlzIG9ubHkgc2FmZSB3aGVuIHRoZSBjb21waWxlciBzdXBw b3J0cyB0aGUgcHJlZml4ZWQgX19hc2FuX21lbSooKQo+IGludHJpbnNpY3MuIE9uIG9sZGVyIHRv b2xjaGFpbnMgKGUuZy4gR0NDIDkpIHRoYXQgbGFjayB0aGlzIHN1cHBvcnQsCj4gcGxhaW4gbWVt KigpIGNhbGxzIGZyb20gaW5zdHJ1bWVudGVkIGNvZGUgZmFsbCB0aHJvdWdoIHRvIHRoZSByYXcK PiBhc3NlbWJseSBpbXBsZW1lbnRhdGlvbnMgaW4gbWVtXzY0LlMgLyBjb3B5XzMyLlMsIGNvbXBs ZXRlbHkgYnlwYXNzaW5nCj4gdGhlIEtBU0FOIHNoYWRvdyBjaGVjay4KPiAKPiBPdGhlciBhcmNo ZXMgd2l0aCBHRU5FUklDX0VOVFJZICh4ODYsIHMzOTAsIGxvb25nYXJjaCwgcmlzY3YpIGRvIG5v dAo+IGhpdCB0aGlzIGJlY2F1c2UgdGhlaXIgQ0kgdG9vbGNoYWlucyBhcmUgYWx3YXlzIG5ldyBl bm91Z2ggdG8gc3VwcG9ydAo+IHRoZSBwcmVmaXggZmxhZy4KPiAKPiBCYWNrZ3JvdW5kOiB0aGUg IUdFTkVSSUNfRU5UUlkgZ3VhcmQgd2FzIGludHJvZHVjZWQgYnkgY29tbWl0IDY5ZDRjMGQzMjE4 Ngo+ICgiZW50cnksIGthc2FuLCB4ODY6IERpc2FsbG93IG92ZXJyaWRpbmcgbWVtKigpIGZ1bmN0 aW9ucyIsIFBldGVyIFppamxzdHJhLAo+IEphbiAyMDIzKS4gVGhlIHJvb3QgcHJvYmxlbSBpcyB0 aGF0IHRoZSBLQVNBTiBDIHdyYXBwZXJzIG92ZXJyaWRlIHRoZQo+IGxpbmtlciBzeW1ib2wgbWVt c2V0L21lbWNweS9tZW1tb3ZlIGdsb2JhbGx5LCBzbyBhbnkgY2FsbCBmcm9tIG5vaW5zdHIgb3IK PiBfX25vX3Nhbml0aXplX2FkZHJlc3MgY29kZSAoZS5nLiBpcnFlbnRyeV9lbnRlci9pcnFlbnRy eV9leGl0KSB3b3VsZCBzdGlsbAo+IHJlYWNoIHRoZSBLQVNBTiBzaGFkb3ctY2hlY2sgd3JhcHBl ciAtLSBhdCBhIHBvaW50IHdoZXJlIEtBU0FOIGludmFyaWFudHMKPiBtYXkgbm90IGhvbGQuIFRo ZSBjb21waWxlciBwcmVmaXggYXBwcm9hY2ggKE1hcmNvIEVsdmVyLCBGZWIgMjAyMywKPiBjb21t aXQgNTEyODdkY2IwMGNjKSBzb2x2ZXMgdGhpcyBieSBoYXZpbmcgdGhlIGNvbXBpbGVyIGVtaXQg X19hc2FuX21lbXNldAo+IGF0IGluc3RydW1lbnRlZCBjYWxsIHNpdGVzIGFuZCBiYXJlIG1lbXNl dCBpbnNpZGUgX19ub19zYW5pdGl6ZV9hZGRyZXNzCj4gZnVuY3Rpb25zLCBzcGxpdHRpbmcgdGhl IGRlY2lzaW9uIGF0IGNvZGUtZ2VuZXJhdGlvbiB0aW1lIHJhdGhlciB0aGFuIGF0Cj4gbGluayB0 aW1lLgo+IAo+IEEgbWFudWFsIEMtbGV2ZWwgb3ZlcnJpZGUgY2Fubm90IHJlcGxpY2F0ZSB0aGlz IHNwbGl0OiBhIHNpbmdsZSBsaW5rZXIKPiBzeW1ib2wgY2Fubm90IGJlIG1hZGUgdG8gcmVzb2x2 ZSBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gdGhlIGNhbGxlci4KPiAKPiB4ODYgYWxzbyBwbGFj ZWQgaXRzIHJhdyBtZW1zZXQvbWVtY3B5L21lbW1vdmUgaW1wbGVtZW50YXRpb25zIGluCj4gLm5v aW5zdHIudGV4dCAoc2FtZSBjb21taXQsIDY5ZDRjMGQzMjE4NiksIHdoaWNoIGlzIHRoZSBvdGhl ciBoYWxmIG9mCj4gdGhlIGZpeDogbm9pbnN0ciBjYWxsZXJzIGhpdCB0aGUgcmF3IGFzc2VtYmx5 IGRpcmVjdGx5LCBzYWZlbHkgYnlwYXNzaW5nCj4gS0FTQU4uIFBvd2VyUEMgaGFzIG5vdCBkb25l IHRoaXMuIFBsYWNpbmcgbWVtXzY0LlMgLyBtZW1jcHlfNjQuUyAvCj4gY29weV8zMi5TIGltcGxl bWVudGF0aW9ucyBpbiAubm9pbnN0ci50ZXh0IHdvdWxkIGJlIHRoZSBjb21wbGVtZW50YXJ5Cj4g bG9uZy10ZXJtIGZpeCB0aGF0IGNvdWxkIHJlLWVuYWJsZSBLQVNBTiBvbiBvbGRlciB0b29sY2hh aW5zLCBidXQgaXQKPiByZXF1aXJlcyBjYXJlIGFyb3VuZCBsaW5rZXIgc3R1YiBvdmVyZmxvdyBv biBsYXJnZSBQUEM2NCBrZXJuZWxzICh0aGUKPiBzYW1lIHJlYXNvbiBwb3dlcnBjIHVzZXMgTk9L UFJPQkVfU1lNQk9MIHJhdGhlciB0aGFuIG5vaW5zdHIgZm9yIGl0cwo+IGludGVycnVwdCBoYW5k bGVycyAtLSBzZWUgdGhlIGNvbW1lbnQgaW4gYXNtL2ludGVycnVwdC5oKS4gVGhhdCB3b3JrCj4g aXMgbGVmdCBhcyBhIGZvbGxvdy11cC4KPiAKPiBGb3Igbm93LCBpbnRyb2R1Y2UgUFBDX0NDX0hB U19LQVNBTl9NRU1JTlRSSU5TSUNfUFJFRklYLCBhbiBhcmNoLWxvY2FsCj4gY29tcGlsZXIgcHJv YmUgdGhhdCBtaXJyb3JzIHRoZSBzYW1lIGNoZWNrIGFzIENDX0hBU19LQVNBTl9NRU1JTlRSSU5T SUNfUFJFRklYCj4gaW4gbGliL0tjb25maWcua2FzYW4gYnV0IGxpdmVzIG91dHNpZGUgdGhlICdp ZiBLQVNBTicgYmxvY2sgdG8gYXZvaWQgYQo+IHJlY3Vyc2l2ZSBkZXBlbmRlbmN5IChDQ19IQVNf S0FTQU5fTUVNSU5UUklOU0lDX1BSRUZJWCBkZXBlbmRzIG9uIEtBU0FOCj4gd2hpY2ggZGVwZW5k cyBvbiBIQVZFX0FSQ0hfS0FTQU4pLiBHYXRlIHRoZSB0aHJlZSBIQVZFX0FSQ0hfS0FTQU4gc2Vs ZWN0cwo+IG9uIHRoaXMgbmV3IHN5bWJvbCBzbyB0aGF0IEtBU0FOIGlzIG5vdCBvZmZlcmVkIGFz IGEgY29uZmlnIG9wdGlvbiBvbgo+IHRvb2xjaGFpbnMgdGhhdCBjYW5ub3Qgc3VwcG9ydCBpdCBj b3JyZWN0bHkgd2l0aCBHRU5FUklDX0VOVFJZLgo+IAo+IFNpbmNlIEtBU0FOIG9uIHBvd2VycGMg bm93IHVuY29uZGl0aW9uYWxseSBpbXBsaWVzCj4gQ0NfSEFTX0tBU0FOX01FTUlOVFJJTlNJQ19Q UkVGSVgsIHRoZSBvbGQgIUNDX0hBU19LQVNBTl9NRU1JTlRSSU5TSUNfUFJFRklYCj4gY29kZSBw YXRocyBpbiBhc20va2FzYW4uaCBhbmQgYXNtL3N0cmluZy5oIGFyZSBkZWFkLiBDbGVhbiB0aGVt IHVwOgo+IAo+IC0gYXNtL2thc2FuLmg6IHJlbW92ZSB0aGUgZHVhbC1lbnRyeS1wb2ludCB2YXJp YW50IG9mIF9HTE9CQUxfS0FTQU4gLwo+ICAgIF9HTE9CQUxfVE9DX0tBU0FOIC8gRVhQT1JUX1NZ TUJPTF9LQVNBTiB0aGF0IGVtaXR0ZWQgYm90aCBtZW1zZXQgYW5kCj4gICAgX19tZW1zZXQgYXMg ZW50cnkgcG9pbnRzIHRvIHRoZSBzYW1lIGFzc2VtYmx5LiAgVGhlc2UgYWxpYXNlcyB3ZXJlIG9u bHkKPiAgICBuZWVkZWQgc28gdGhlIEMgS0FTQU4gd3JhcHBlcnMgaW4gc2hhZG93LmMgY291bGQg Y2FsbCBfX21lbXNldCgpIHRvCj4gICAgcmVhY2ggcmF3IG1lbW9yeSBvcHM7IHdpdGggdGhlIGNv bXBpbGVyIHByZWZpeCBhcHByb2FjaCB0aGUgd3JhcHBlcnMgYXJlCj4gICAgbm90IHVzZWQgYXQg YWxsIGZvciBtZW0qIG9uIHBvd2VycGMuCj4gCj4gLSBhc20vc3RyaW5nLmg6IHJlbW92ZSB0aGUg c2VwYXJhdGUgX19tZW1zZXQvX19tZW1jcHkvX19tZW1tb3ZlIHN5bWJvbAo+ICAgIGRlY2xhcmF0 aW9ucyBhbmQgdGhlIG1lbXNldC9tZW1jcHkvbWVtbW92ZSBtYWNybyByZWRpcmVjdGlvbnMgZm9y Cj4gICAgdW5pbnN0cnVtZW50ZWQgZmlsZXMgdGhhdCB3ZXJlIG5lZWRlZCBvbiBvbGQgdG9vbGNo YWlucy4gIFNpbXBsaWZ5IHRoZQo+ICAgIENPTkZJR19LQVNBTiBibG9jayB0byBqdXN0IHRoZSB0 aHJlZSAjZGVmaW5lIGFsaWFzZXMgKHdoaWNoIGFyZSBzdGlsbAo+ICAgIHVzZWQgYnkgc2hhZG93 LmMgYXMgcmF3IGJhY2tlbmRzKS4KPiAKPiAtIGNwdXRhYmxlLmMsIHByb21faW5pdC5jOiB1cGRh dGUgc3RhbGUgY29tbWVudHMgdGhhdCBzYWlkIEdDQyByZXBsYWNlcwo+ICAgIG1lbWNweSgpIHdp dGggX19tZW1jcHkoKSB1bmRlciBLQVNBTjsgd2l0aCB0aGUgcHJlZml4IGZsYWcgaXQgZW1pdHMK PiAgICBfX2FzYW5fbWVtY3B5KCkgaW5zdGVhZC4KPiAKPiBSZXBvcnRlZC1ieTogVmVua2F0IFJh byBCYWdhbGtvdGUgPHZlbmthdDg4QGxpbnV4LmlibS5jb20+Cj4gQ2xvc2VzOiBodHRwczovL2xv cmUua2VybmVsLm9yZy9hbGwvOTZkYWUxMTAtZjc5Yi00ZTU0LThhOWItNTE0MzY5MDE5YjVkQGxp bnV4LmlibS5jb20KPiBTaWduZWQtb2ZmLWJ5OiBNdWtlc2ggS3VtYXIgQ2hhdXJhc2l5YSAoSUJN KSA8bWtjaGF1cmFzQGdtYWlsLmNvbT4KPiAtLS0KPiAgIGFyY2gvcG93ZXJwYy9LY29uZmlnICAg ICAgICAgICAgICB8IDEwICsrKysrKystLS0KPiAgIGFyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9r YXNhbi5oICB8IDE5ICsrKysrKysrLS0tLS0tLS0tLS0KPiAgIGFyY2gvcG93ZXJwYy9pbmNsdWRl L2FzbS9zdHJpbmcuaCB8IDI1ICsrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAgIGFyY2gvcG93 ZXJwYy9rZXJuZWwvY3B1dGFibGUuYyAgICB8ICA2ICsrKy0tLQo+ICAgYXJjaC9wb3dlcnBjL2tl cm5lbC9wcm9tX2luaXQuYyAgIHwgIDQgKystLQo+ICAgNSBmaWxlcyBjaGFuZ2VkLCAyNSBpbnNl cnRpb25zKCspLCAzOSBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBj L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwo+IGluZGV4IDI1ODBlMjdlNDMyOC4uYjI3 ZWQ5NzM5ZWVhIDEwMDY0NAo+IC0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCj4gKysrIGIvYXJj aC9wb3dlcnBjL0tjb25maWcKPiBAQCAtNyw2ICs3LDEwIEBAIGNvbmZpZyBDQ19IQVNfRUxGVjIK PiAgIGNvbmZpZyBDQ19IQVNfUFJFRklYRUQKPiAgIAlkZWZfYm9vbCBQUEM2NCAmJiAkKGNjLW9w dGlvbiwgLW1jcHU9cG93ZXIxMCAtbXByZWZpeGVkKQo+ICAgCj4gK2NvbmZpZyBQUENfQ0NfSEFT X0tBU0FOX01FTUlOVFJJTlNJQ19QUkVGSVgKPiArCWRlZl9ib29sIChDQ19JU19DTEFORyAmJiAk KGNjLW9wdGlvbiwtZnNhbml0aXplPWtlcm5lbC1hZGRyZXNzIC1tbGx2bSAtYXNhbi1rZXJuZWwt bWVtLWludHJpbnNpYy1wcmVmaXg9MSkpIHx8IFwKPiArCQkgKENDX0lTX0dDQyAmJiAkKGNjLW9w dGlvbiwtZnNhbml0aXplPWtlcm5lbC1hZGRyZXNzIC0tcGFyYW0gYXNhbi1rZXJuZWwtbWVtLWlu dHJpbnNpYy1wcmVmaXg9MSkpCj4gKwo+ICAgY29uZmlnIENDX0hBU19QQ1JFTAo+ICAgCSMgQ2xh bmcgaGFzIGEgYnVnIChodHRwczovL2dpdGh1Yi5jb20vbGx2bS9sbHZtLXByb2plY3QvaXNzdWVz LzYyMzcyKQo+ICAgCSMgd2hlcmUgcGNyZWwgY29kZSBpcyBub3QgZ2VuZXJhdGVkIGlmIC1tc29m dC1mbG9hdCwgLW1uby1hbHRpdmVjLCBvcgo+IEBAIC0yMjAsOSArMjI0LDkgQEAgY29uZmlnIFBQ Qwo+ICAgCXNlbGVjdCBIQVZFX0FSQ0hfSFVHRV9WTUFQCQlpZiBQUENfUkFESVhfTU1VIHx8IFBQ Q184eHgKPiAgIAlzZWxlY3QgSEFWRV9BUkNIX0pVTVBfTEFCRUwKPiAgIAlzZWxlY3QgSEFWRV9B UkNIX0pVTVBfTEFCRUxfUkVMQVRJVkUKPiAtCXNlbGVjdCBIQVZFX0FSQ0hfS0FTQU4JCQlpZiBQ UEMzMiAmJiBQQUdFX1NISUZUIDw9IDE0Cj4gLQlzZWxlY3QgSEFWRV9BUkNIX0tBU0FOCQkJaWYg UFBDX1JBRElYX01NVQo+IC0Jc2VsZWN0IEhBVkVfQVJDSF9LQVNBTgkJCWlmIFBQQ19CT09LM0Vf NjQKPiArCXNlbGVjdCBIQVZFX0FSQ0hfS0FTQU4JCQlpZiBQUEMzMiAmJiBQQUdFX1NISUZUIDw9 IDE0ICYmIFBQQ19DQ19IQVNfS0FTQU5fTUVNSU5UUklOU0lDX1BSRUZJWAo+ICsJc2VsZWN0IEhB VkVfQVJDSF9LQVNBTgkJCWlmIFBQQ19SQURJWF9NTVUgJiYgUFBDX0NDX0hBU19LQVNBTl9NRU1J TlRSSU5TSUNfUFJFRklYCj4gKwlzZWxlY3QgSEFWRV9BUkNIX0tBU0FOCQkJaWYgUFBDX0JPT0sz RV82NCAmJiBQUENfQ0NfSEFTX0tBU0FOX01FTUlOVFJJTlNJQ19QUkVGSVgKPiAgIAlzZWxlY3Qg SEFWRV9BUkNIX0tBU0FOX1ZNQUxMT0MJCWlmIEhBVkVfQVJDSF9LQVNBTgo+ICAgCXNlbGVjdCBI QVZFX0FSQ0hfS0NTQU4KPiAgIAlzZWxlY3QgSEFWRV9BUkNIX0tGRU5DRQkJCWlmIEFSQ0hfU1VQ UE9SVFNfREVCVUdfUEFHRUFMTE9DCj4gZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRl L2FzbS9rYXNhbi5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2thc2FuLmgKPiBpbmRleCBh NjkwZTdkYTUzYzIuLmZmYWRhNWY1MWIyYiAxMDA2NDQKPiAtLS0gYS9hcmNoL3Bvd2VycGMvaW5j bHVkZS9hc20va2FzYW4uaAo+ICsrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rYXNhbi5o Cj4gQEAgLTIsMjAgKzIsMTcgQEAKPiAgICNpZm5kZWYgX19BU01fS0FTQU5fSAo+ICAgI2RlZmlu ZSBfX0FTTV9LQVNBTl9ICj4gICAKPiAtI2lmIGRlZmluZWQoQ09ORklHX0tBU0FOKSAmJiAhZGVm aW5lZChDT05GSUdfQ0NfSEFTX0tBU0FOX01FTUlOVFJJTlNJQ19QUkVGSVgpCj4gLSNkZWZpbmUg X0dMT0JBTF9LQVNBTihmbikJCQlcCj4gLQlfR0xPQkFMKGZuKTsJCQkJXAo+IC0JX0dMT0JBTChf XyMjZm4pCj4gLSNkZWZpbmUgX0dMT0JBTF9UT0NfS0FTQU4oZm4pCQkJXAo+IC0JX0dMT0JBTF9U T0MoZm4pOwkJCVwKPiAtCV9HTE9CQUxfVE9DKF9fIyNmbikKPiAtI2RlZmluZSBFWFBPUlRfU1lN Qk9MX0tBU0FOKGZuKQkJCVwKPiAtCUVYUE9SVF9TWU1CT0woX18jI2ZuKQo+IC0jZWxzZSAvKiBD T05GSUdfS0FTQU4gJiYgIUNPTkZJR19DQ19IQVNfS0FTQU5fTUVNSU5UUklOU0lDX1BSRUZJWCAq Lwo+ICsvKgo+ICsgKiBwb3dlcnBjIHJlcXVpcmVzIENDX0hBU19LQVNBTl9NRU1JTlRSSU5TSUNf UFJFRklYIHdoZW5ldmVyIEtBU0FOIGlzCj4gKyAqIGVuYWJsZWQgKHNlZSBQUENfQ0NfSEFTX0tB U0FOX01FTUlOVFJJTlNJQ19QUkVGSVggaW4gYXJjaC9wb3dlcnBjL0tjb25maWcpLAo+ICsgKiBz byB0aGUgY29tcGlsZXIgYWx3YXlzIGVtaXRzIF9fYXNhbl9tZW0qKCkgYXQgaW5zdHJ1bWVudGVk IGNhbGwgc2l0ZXMgYW5kCj4gKyAqIGJhcmUgbWVtKigpIGluc2lkZSBfX25vX3Nhbml0aXplX2Fk ZHJlc3MgLyBub2luc3RyIGNvZGUuICBUaGUgb2xkIGR1YWwKPiArICogZW50cnktcG9pbnQgdHJp Y2sgKF9HTE9CQUxfS0FTQU4gZW1pdHRpbmcgYm90aCBtZW1zZXQgYW5kIF9fbWVtc2V0KSBpcwo+ ICsgKiB0aGVyZWZvcmUgbmV2ZXIgbmVlZGVkLgo+ICsgKi8KClRoaXMgZXhwbGFuYXRpb24gYmVs b25ncyB0byB0aGUgY29tbWl0IG1lc3NhZ2Ugbm90IHRvIHRoZSBzb3VyY2UgY29kZS4KCj4gICAj ZGVmaW5lIF9HTE9CQUxfS0FTQU4oZm4pCV9HTE9CQUwoZm4pCj4gICAjZGVmaW5lIF9HTE9CQUxf VE9DX0tBU0FOKGZuKQlfR0xPQkFMX1RPQyhmbikKPiAgICNkZWZpbmUgRVhQT1JUX1NZTUJPTF9L QVNBTihmbikKPiAtI2VuZGlmIC8qIENPTkZJR19LQVNBTiAmJiAhQ09ORklHX0NDX0hBU19LQVNB Tl9NRU1JTlRSSU5TSUNfUFJFRklYICovCj4gICAKPiAgICNpZm5kZWYgX19BU1NFTUJMRVJfXwo+ ICAgCj4gZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zdHJpbmcuaCBiL2Fy Y2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zdHJpbmcuaAo+IGluZGV4IDE5ODFiZDQwMzZiNS4uNzQz MTI2ZTNkY2MxIDEwMDY0NAo+IC0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zdHJpbmcu aAo+ICsrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zdHJpbmcuaAo+IEBAIC0yOSwyOSAr MjksMTQgQEAgZXh0ZXJuIHZvaWQgKiBtZW1jaHIoY29uc3Qgdm9pZCAqLGludCxfX2tlcm5lbF9z aXplX3QpOwo+ICAgdm9pZCBtZW1jcHlfZmx1c2hjYWNoZSh2b2lkICpkZXN0LCBjb25zdCB2b2lk ICpzcmMsIHNpemVfdCBzaXplKTsKPiAgIAo+ICAgI2lmZGVmIENPTkZJR19LQVNBTgo+IC0vKiBf X21lbSB2YXJpYW50cyBhcmUgdXNlZCBieSBLQVNBTiB0byBpbXBsZW1lbnQgaW5zdHJ1bWVudGVk IG1lbWluc3RyaW5zaWNzLiAqLwo+IC0jaWZkZWYgQ09ORklHX0NDX0hBU19LQVNBTl9NRU1JTlRS SU5TSUNfUFJFRklYCj4gKy8qCj4gKyAqIHBvd2VycGMgcmVxdWlyZXMgQ0NfSEFTX0tBU0FOX01F TUlOVFJJTlNJQ19QUkVGSVggd2hlbmV2ZXIgS0FTQU4gaXMKPiArICogZW5hYmxlZCwgc28gdGhl IGNvbXBpbGVyIGVtaXRzIF9fYXNhbl9tZW0qKCkgYXQgaW5zdHJ1bWVudGVkIHNpdGVzLgo+ICsg KiBUaGUgcmF3IG1lbSogc3ltYm9scyBhcmUgYWx3YXlzIHNhZmUgdG8gY2FsbCBkaXJlY3RseS4K PiArICovCgpUaGlzIGV4cGxhbmF0aW9uIGJlbG9uZ3MgdG8gdGhlIGNvbW1pdCBtZXNzYWdlIG5v dCB0byB0aGUgc291cmNlIGNvZGUuCgo+ICAgI2RlZmluZSBfX21lbXNldCBtZW1zZXQKPiAgICNk ZWZpbmUgX19tZW1jcHkgbWVtY3B5Cj4gICAjZGVmaW5lIF9fbWVtbW92ZSBtZW1tb3ZlCj4gLSNl bHNlIC8qIENPTkZJR19DQ19IQVNfS0FTQU5fTUVNSU5UUklOU0lDX1BSRUZJWCAqLwo+IC12b2lk ICpfX21lbXNldCh2b2lkICpzLCBpbnQgYywgX19rZXJuZWxfc2l6ZV90IGNvdW50KTsKPiAtdm9p ZCAqX19tZW1jcHkodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIF9fa2VybmVsX3NpemVfdCBu KTsKPiAtdm9pZCAqX19tZW1tb3ZlKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBfX2tlcm5l bF9zaXplX3Qgbik7Cj4gLSNpZm5kZWYgX19TQU5JVElaRV9BRERSRVNTX18KPiAtLyoKPiAtICog Rm9yIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnN0cnVtZW50ZWQgKGUuZy4gbW0vc2x1Yi5jKSB3ZQo+ IC0gKiBzaG91bGQgdXNlIG5vdCBpbnN0cnVtZW50ZWQgdmVyc2lvbiBvZiBtZW0qIGZ1bmN0aW9u cy4KPiAtICovCj4gLSNkZWZpbmUgbWVtY3B5KGRzdCwgc3JjLCBsZW4pIF9fbWVtY3B5KGRzdCwg c3JjLCBsZW4pCj4gLSNkZWZpbmUgbWVtbW92ZShkc3QsIHNyYywgbGVuKSBfX21lbW1vdmUoZHN0 LCBzcmMsIGxlbikKPiAtI2RlZmluZSBtZW1zZXQocywgYywgbikgX19tZW1zZXQocywgYywgbikK PiAtCj4gLSNpZm5kZWYgX19OT19GT1JUSUZZCj4gLSNkZWZpbmUgX19OT19GT1JUSUZZIC8qIEZP UlRJRllfU09VUkNFIHVzZXMgX19idWlsdGluX21lbWNweSwgZXRjLiAqLwo+IC0jZW5kaWYKPiAt I2VuZGlmIC8qICFfX1NBTklUSVpFX0FERFJFU1NfXyAqLwo+IC0jZW5kaWYgLyogQ09ORklHX0ND X0hBU19LQVNBTl9NRU1JTlRSSU5TSUNfUFJFRklYICovCj4gICAjZW5kaWYgLyogQ09ORklHX0tB U0FOICovCj4gICAKPiAgICNpZmRlZiBDT05GSUdfUFBDNjQKPiBkaWZmIC0tZ2l0IGEvYXJjaC9w b3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5j Cj4gaW5kZXggNmY2ODAxZGE5ZGMxLi40NDExNWY5MDRjMmMgMTAwNjQ0Cj4gLS0tIGEvYXJjaC9w b3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCj4gKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0 YWJsZS5jCj4gQEAgLTM2LDggKzM2LDggQEAgdm9pZCBfX2luaXQgc2V0X2N1cl9jcHVfc3BlYyhz dHJ1Y3QgY3B1X3NwZWMgKnMpCj4gICAKPiAgIAl0ID0gUFRSUkVMT0ModCk7Cj4gICAJLyoKPiAt CSAqIHVzZSBtZW1jcHkoKSBpbnN0ZWFkIG9mICp0ID0gKnMgc28gdGhhdCBHQ0MgcmVwbGFjZXMg aXQKPiAtCSAqIGJ5IF9fbWVtY3B5KCkgd2hlbiBLQVNBTiBpcyBhY3RpdmUKPiArCSAqIHVzZSBt ZW1jcHkoKSBpbnN0ZWFkIG9mICp0ID0gKnMgc28gdGhhdCB0aGUgY29tcGlsZXIgcmVwbGFjZXMg aXQKPiArCSAqIGJ5IF9fYXNhbl9tZW1jcHkoKSB3aGVuIEtBU0FOIGlzIGFjdGl2ZQo+ICAgCSAq LwoKRG9lcyB0aGUgaW5pdGlhbCBwcm9ibGVtIHN0aWxsIGV4aXN0IHdpdGggdGhlIG5ldyBfX2Fz YW5fbWVtY3B5KCkgCmFwcHJvYWNoID8gSWYgbm90IHRoZSBjb21tZW50IHNob3VsZCBiZSByZW1v dmVkLgoKCj4gICAJbWVtY3B5KHQsIHMsIHNpemVvZigqdCkpOwo+ICAgCj4gQEAgLTU1LDcgKzU1 LDcgQEAgc3RhdGljIHN0cnVjdCBjcHVfc3BlYyAqIF9faW5pdCBzZXR1cF9jcHVfc3BlYyh1bnNp Z25lZCBsb25nIG9mZnNldCwKPiAgIAo+ICAgCS8qCj4gICAJICogQ29weSBldmVyeXRoaW5nLCB0 aGVuIGRvIGZpeHVwcy4gVXNlIG1lbWNweSgpIGluc3RlYWQgb2YgKnQgPSAqcwo+IC0JICogc28g dGhhdCBHQ0MgcmVwbGFjZXMgaXQgYnkgX19tZW1jcHkoKSB3aGVuIEtBU0FOIGlzIGFjdGl2ZQo+ ICsJICogc28gdGhhdCB0aGUgY29tcGlsZXIgcmVwbGFjZXMgaXQgYnkgX19hc2FuX21lbWNweSgp IHdoZW4gS0FTQU4gaXMgYWN0aXZlCgpEb2VzIHRoZSBpbml0aWFsIHByb2JsZW0gc3RpbGwgZXhp c3Qgd2l0aCB0aGUgbmV3IF9fYXNhbl9tZW1jcHkoKSAKYXBwcm9hY2ggPyBJZiBub3QgdGhlIGNv bW1lbnQgc2hvdWxkIGJlIHJlbW92ZWQuCgo+ICAgCSAqLwo+ICAgCW1lbWNweSh0LCBzLCBzaXpl b2YoKnQpKTsKPiAgIAo+IGRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5p dC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYwo+IGluZGV4IGViOWY1NTZiMDkz Ny4uYjc2MzcyMGM2OGI2IDEwMDY0NAo+IC0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9p bml0LmMKPiArKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCj4gQEAgLTEzNjUs OCArMTM2NSw4IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBwcm9tX2NoZWNrX3BsYXRmb3JtX3N1cHBv cnQodm9pZCkKPiAgIAkvKgo+ICAgCSAqIEZpcnN0IGNvcHkgdGhlIGFyY2hpdGVjdHVyZSB2ZWMg dGVtcGxhdGUKPiAgIAkgKgo+IC0JICogdXNlIG1lbWNweSgpIGluc3RlYWQgb2YgKnZlYyA9ICp2 ZWNfdGVtcGxhdGUgc28gdGhhdCBHQ0MgcmVwbGFjZXMgaXQKPiAtCSAqIGJ5IF9fbWVtY3B5KCkg d2hlbiBLQVNBTiBpcyBhY3RpdmUKPiArCSAqIHVzZSBtZW1jcHkoKSBpbnN0ZWFkIG9mICp2ZWMg PSAqdmVjX3RlbXBsYXRlIHNvIHRoYXQgdGhlIGNvbXBpbGVyCj4gKwkgKiByZXBsYWNlcyBpdCBi eSBfX2FzYW5fbWVtY3B5KCkgd2hlbiBLQVNBTiBpcyBhY3RpdmUKCkRvZXMgdGhlIGluaXRpYWwg cHJvYmxlbSBzdGlsbCBleGlzdCB3aXRoIHRoZSBuZXcgX19hc2FuX21lbWNweSgpIAphcHByb2Fj aCA/IElmIG5vdCB0aGUgY29tbWVudCBzaG91bGQgYmUgcmVtb3ZlZC4KCj4gICAJICovCj4gICAJ bWVtY3B5KCZpYm1fYXJjaGl0ZWN0dXJlX3ZlYywgJmlibV9hcmNoaXRlY3R1cmVfdmVjX3RlbXBs YXRlLAo+ICAgCSAgICAgICBzaXplb2YoaWJtX2FyY2hpdGVjdHVyZV92ZWMpKTsKCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWls aW5nIGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5m cmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==