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=-8.4 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=unavailable 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 654A8C4321A for ; Fri, 28 Jun 2019 13:09:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1B95C2083B for ; Fri, 28 Jun 2019 13:09:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="oxLgWP7P" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726786AbfF1NJ1 (ORCPT ); Fri, 28 Jun 2019 09:09:27 -0400 Received: from mailout1.w1.samsung.com ([210.118.77.11]:41328 "EHLO mailout1.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726587AbfF1NJ0 (ORCPT ); Fri, 28 Jun 2019 09:09:26 -0400 Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20190628130923euoutp01b5fe13109c46e49bf5ac3b71db392b33~sXsM23Gjf1084110841euoutp01b for ; Fri, 28 Jun 2019 13:09:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20190628130923euoutp01b5fe13109c46e49bf5ac3b71db392b33~sXsM23Gjf1084110841euoutp01b DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1561727363; bh=/9fBMBJMP2qjdnTHo1o74xYAuPXxvb9q0g09PJjz3gU=; h=Subject:To:Cc:From:Date:In-Reply-To:References:From; b=oxLgWP7PcMWKJu+BD8GEX7EJ0KmRPrZ47y12dd8V17phjaFXM6gHOrDvmkAC2km5u 7hhggMjceSTLbnj83EUvRno1KSOPvTSJZfkT1X9CgoBh5nln25/o/YabBHeG7claem e3WdxPasXEFSxzmR97hKrTx0iHlCJaTjxYIaFs1M= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20190628130922eucas1p14fd080cfc0ddc984c2792a3fd1559ea2~sXsLsuXam2414124141eucas1p1N; Fri, 28 Jun 2019 13:09:22 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 5A.27.04298.181161D5; Fri, 28 Jun 2019 14:09:21 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20190628130921eucas1p239935b0771032c331911eacc1a69dd2e~sXsKt--sS2925929259eucas1p2N; Fri, 28 Jun 2019 13:09:21 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20190628130920eusmtrp1f3af4ee35cbb70c16692bd624b79df07~sXsKfpzB72373923739eusmtrp1i; Fri, 28 Jun 2019 13:09:20 +0000 (GMT) X-AuditID: cbfec7f2-f2dff700000010ca-8d-5d161181e60f Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 37.C5.04140.081161D5; Fri, 28 Jun 2019 14:09:20 +0100 (BST) Received: from [106.120.50.25] (unknown [106.120.50.25]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20190628130919eusmtip2338436e3f2ac037ac588453a18926993~sXsJgQLnh1303113031eusmtip2Y; Fri, 28 Jun 2019 13:09:19 +0000 (GMT) Subject: Re: [PATCH v7 04/25] arm64: Substitute gettimeofday with C implementation To: Vincenzo Frascino , linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mips@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: Shuah Khan , Andre Przywara , Arnd Bergmann , Huw Davies , Catalin Marinas , Daniel Lezcano , Will Deacon , Russell King , Ralf Baechle , Mark Salyzyn , Paul Burton , Dmitry Safonov <0x7f454c46@gmail.com>, Rasmus Villemoes , Thomas Gleixner , Shijith Thotton , Peter Collingbourne , Sylwester Nawrocki From: Marek Szyprowski Message-ID: <1fd47b0d-f77f-8d07-c039-6ac9072834fc@samsung.com> Date: Fri, 28 Jun 2019 15:09:18 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.7.2 MIME-Version: 1.0 In-Reply-To: <20190621095252.32307-5-vincenzo.frascino@arm.com> Content-Transfer-Encoding: 8bit Content-Language: en-US X-Brightmail-Tracker: H4sIAAAAAAAAA01SbUhTYRjt3b279zqaXJfpoxXBqKAgTZJ6+8AK+nGLIqOCsEatumrkLHbT Pik/Qt1SF1qac06jLDX7utqqZZCztJCWaZnUpMwF9mFSOWhW1ubV8t855zkP5zkvL0Oo6qhw Znfyfl6frE1SUwrS1ux1zk0PCtHMK7JG4FNFfSSusnoR/l3QTOOBi7kIW79PwyVVn0mcY/eQ WOztlOMOu4XCxa4BChvEmwg7ztxDuNdspXD+p2YCm1wvKdzeMAM3fc6WY6/Yg/DpD1dpXFH9 isR14hkC3xv2kvjD10fk8lDOdtcm52qttYjr6HxGcD+HChA3+CJdxt0xd9NchZjCiTUGinN1 NlDcF6eT5h5WX5FxdReOc4XnfP5PD3pIrs24h8uvr0GxQXGKpbv4pN2pvD4yZrsisbPIhPZZ 36CDT3646TTkqUdGFMAAGw13H9koI1IwKrYKQUNjoVwigwjeD9UiiXxH0GbKI8ZWct6Vk9Lg EoI6RyYhkX4E7vtPZX7XJHYj1J8oG3EFs899693ZtJ8QrEUOQw/EERfFRoGx30j5sZKNgaw/ 4ggm2ZnQWtFH+vFkdiv0lLtGPUHwuMQ9ogewy+BWZbrcjwl2OmTeLCUkHAqv3OUyfxiwfQzc MQzIpMNXQva3TFrCk+BjS/0ongqthbmktJCJoMd5hZZILoKOjLOjL7UEmlqe+eIYX8RsuGaP lOQVcNJkkvllYAOhqz9IOiIQCmzFhCQrISdLJblngbnl6r/YxrZ24hRSm8dVM4+rYx5Xx/w/ twKRNSiUTxF0CbwQlcwfiBC0OiElOSFi516diHxfuXW45dtt5Gnf4UAsg9QTlT8mhmhUcm2q cEjnQMAQ6mBlmDNYo1Lu0h46zOv3btOnJPGCA01hSHWo8siEt1tUbIJ2P7+H5/fx+rGpjAkI T0NrYqdsehF2/dhCi0FjCc5e9PriU13A5KY57khDd/v5EPvq873zGxeXZXlW5S3x2oczrKui b8yK68/nf1fGta2rjKebf5VZrJ4Ykya+oOtX/JfnYS4ctmBTYuBlzYycg0cVsdHVXXrhRupD uX0wbc3bwEpPSYbNG75lw8b1m7XnSteqSSFRGzWH0Avav957NAnGAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA02Sa0hTYRiA+3bOzqY5Om5ePi1JVlGJzTad+wwvQUTnRz+iO5bZ0qMLnZOd TdQ/LbJyQ9K8tlVzUYZZFsxpaRo1yxLxljnDLDEVFE2NDFyXlW4F/nte3vd5L/ByMX47O5h7 NktDq7PkmULCG+9yvf60Q+cbkLSz90c4KqmcwlGt2QnQ79IODpq/WwSQ+VsIMtbO4qiw5TuO rOMONhpouUGgqpF5AumtjQDZK9oAGjeZCXRlpgNDxSNDBHrbuhm1z15mI6d1DKDy6YccZLk3 jKMGawWG2lxOHE1/fYPvDqSanjaxqQfmB4AacPRj1M8fpYBaHDzPoppNHzmUxaqlrHV6ghpx tBLUXE8Ph3p1r55FNdw5R5XdWq6feTmGU32GDOqKrQ4c8E0UxapVWg0dqlAxmjjhCTGSiMQx SCSJihGJI2VJuyRSYUR8bCqdeTaHVkfEnxYpHJXFINs8CnK7lyY4OvDdBgzAiwvJKFj4uRo3 AG8un6wBUO96x/YkNsDOSt0/FsBfDgOxwnxyBsCahT0rLCAPQ1vBTbfsR74DcMjc6w4w0sKG bTXdHI/BwIvjo+5xBCmGhi+eTjwyHl76Y3UzTm6BXZYpfIX9yZPQUOHEPTW+sNM44WYvMgE+ rjnv3ggjo6G5YQzz8EZ4ofH6Pw6EwxPVrBLAN63STasU0yrFtEqxALwO+NFaRpmuZCQiRq5k tFnpohSV0gqWH6ipw2l7Agxzh+yA5AKhD8/iHZDEZ8tzmDylHUAuJvTjBfX4JfF5qfK8fFqt SlZrM2nGDqTLx13Fgv1TVMvvmKVJFkvFMhQjlkXKIqORMJBXSL44ySfT5Ro6g6azafV/j8X1 CtYB3TnjrubBM76HuwRx4UvSgqOTH/IGfA7urX9eVPYnpDV/25b35cmy9tuaQ4sDxqAj5l7B saqEkWv6uIXamKmP64z9mEK6CSzkrns83cl32YafdQZGSraHpFWsDxDdPzWzpGcp9ucnxm59 9D5k82zY7L7Q44K0NcaCQd1ak5e6b9IlxBmFXByGqRn5X3OrU7tWAwAA X-CMS-MailID: 20190628130921eucas1p239935b0771032c331911eacc1a69dd2e X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20190628130921eucas1p239935b0771032c331911eacc1a69dd2e X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20190628130921eucas1p239935b0771032c331911eacc1a69dd2e References: <20190621095252.32307-1-vincenzo.frascino@arm.com> <20190621095252.32307-5-vincenzo.frascino@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Dear All, On 2019-06-21 11:52, Vincenzo Frascino wrote: > To take advantage of the commonly defined vdso interface for > gettimeofday the architectural code requires an adaptation. > > Re-implement the gettimeofday vdso in C in order to use lib/vdso. > > With the new implementation arm64 gains support for CLOCK_BOOTTIME > and CLOCK_TAI. > > Cc: Catalin Marinas > Cc: Will Deacon > Signed-off-by: Vincenzo Frascino > Tested-by: Shijith Thotton > Tested-by: Andre Przywara > Signed-off-by: Catalin Marinas This patch causes serious regression on Samsung Exynos5433 SoC based TM2(e) boards. The time in userspace is always set to begin of the epoch: # date 062813152019 Fri Jun 28 13:15:00 UTC 2019 # date Thu JanĀ  1 00:00:00 UTC 1970 # date Thu JanĀ  1 00:00:00 UTC 1970 I've noticed that since the patch landed in Linux next-20190625 and bisect indeed pointed to this patch. > --- > arch/arm64/Kconfig | 2 + > arch/arm64/include/asm/vdso/gettimeofday.h | 86 ++++++ > arch/arm64/include/asm/vdso/vsyscall.h | 53 ++++ > arch/arm64/include/asm/vdso_datapage.h | 48 --- > arch/arm64/kernel/asm-offsets.c | 33 +- > arch/arm64/kernel/vdso.c | 51 +--- > arch/arm64/kernel/vdso/Makefile | 34 ++- > arch/arm64/kernel/vdso/gettimeofday.S | 334 --------------------- > arch/arm64/kernel/vdso/vgettimeofday.c | 28 ++ > 9 files changed, 223 insertions(+), 446 deletions(-) > create mode 100644 arch/arm64/include/asm/vdso/gettimeofday.h > create mode 100644 arch/arm64/include/asm/vdso/vsyscall.h > delete mode 100644 arch/arm64/include/asm/vdso_datapage.h > delete mode 100644 arch/arm64/kernel/vdso/gettimeofday.S > create mode 100644 arch/arm64/kernel/vdso/vgettimeofday.c > > diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig > index 697ea0510729..952c9f8cf3b8 100644 > --- a/arch/arm64/Kconfig > +++ b/arch/arm64/Kconfig > @@ -107,6 +107,7 @@ config ARM64 > select GENERIC_STRNCPY_FROM_USER > select GENERIC_STRNLEN_USER > select GENERIC_TIME_VSYSCALL > + select GENERIC_GETTIMEOFDAY > select HANDLE_DOMAIN_IRQ > select HARDIRQS_SW_RESEND > select HAVE_PCI > @@ -160,6 +161,7 @@ config ARM64 > select HAVE_SYSCALL_TRACEPOINTS > select HAVE_KPROBES > select HAVE_KRETPROBES > + select HAVE_GENERIC_VDSO > select IOMMU_DMA if IOMMU_SUPPORT > select IRQ_DOMAIN > select IRQ_FORCED_THREADING > diff --git a/arch/arm64/include/asm/vdso/gettimeofday.h b/arch/arm64/include/asm/vdso/gettimeofday.h > new file mode 100644 > index 000000000000..bc3cb6738051 > --- /dev/null > +++ b/arch/arm64/include/asm/vdso/gettimeofday.h > @@ -0,0 +1,86 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) 2018 ARM Limited > + */ > +#ifndef __ASM_VDSO_GETTIMEOFDAY_H > +#define __ASM_VDSO_GETTIMEOFDAY_H > + > +#ifndef __ASSEMBLY__ > + > +#include > +#include > + > +#define VDSO_HAS_CLOCK_GETRES 1 > + > +static __always_inline int gettimeofday_fallback( > + struct __kernel_old_timeval *_tv, > + struct timezone *_tz) > +{ > + register struct timezone *tz asm("x1") = _tz; > + register struct __kernel_old_timeval *tv asm("x0") = _tv; > + register long ret asm ("x0"); > + register long nr asm("x8") = __NR_gettimeofday; > + > + asm volatile( > + " svc #0\n" > + : "=r" (ret) > + : "r" (tv), "r" (tz), "r" (nr) > + : "memory"); > + > + return ret; > +} > + > +static __always_inline long clock_gettime_fallback( > + clockid_t _clkid, > + struct __kernel_timespec *_ts) > +{ > + register struct __kernel_timespec *ts asm("x1") = _ts; > + register clockid_t clkid asm("x0") = _clkid; > + register long ret asm ("x0"); > + register long nr asm("x8") = __NR_clock_gettime; > + > + asm volatile( > + " svc #0\n" > + : "=r" (ret) > + : "r" (clkid), "r" (ts), "r" (nr) > + : "memory"); > + > + return ret; > +} > + > +static __always_inline int clock_getres_fallback( > + clockid_t _clkid, > + struct __kernel_timespec *_ts) > +{ > + register struct __kernel_timespec *ts asm("x1") = _ts; > + register clockid_t clkid asm("x0") = _clkid; > + register long ret asm ("x0"); > + register long nr asm("x8") = __NR_clock_getres; > + > + asm volatile( > + " svc #0\n" > + : "=r" (ret) > + : "r" (clkid), "r" (ts), "r" (nr) > + : "memory"); > + > + return ret; > +} > + > +static __always_inline u64 __arch_get_hw_counter(s32 clock_mode) > +{ > + u64 res; > + > + asm volatile("mrs %0, cntvct_el0" : "=r" (res) :: "memory"); > + > + return res; > +} > + > +static __always_inline > +const struct vdso_data *__arch_get_vdso_data(void) > +{ > + return _vdso_data; > +} > + > +#endif /* !__ASSEMBLY__ */ > + > +#endif /* __ASM_VDSO_GETTIMEOFDAY_H */ > diff --git a/arch/arm64/include/asm/vdso/vsyscall.h b/arch/arm64/include/asm/vdso/vsyscall.h > new file mode 100644 > index 000000000000..0c731bfc7c8c > --- /dev/null > +++ b/arch/arm64/include/asm/vdso/vsyscall.h > @@ -0,0 +1,53 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef __ASM_VDSO_VSYSCALL_H > +#define __ASM_VDSO_VSYSCALL_H > + > +#ifndef __ASSEMBLY__ > + > +#include > +#include > + > +#define VDSO_PRECISION_MASK ~(0xFF00ULL<<48) > + > +extern struct vdso_data *vdso_data; > + > +/* > + * Update the vDSO data page to keep in sync with kernel timekeeping. > + */ > +static __always_inline > +struct vdso_data *__arm64_get_k_vdso_data(void) > +{ > + return vdso_data; > +} > +#define __arch_get_k_vdso_data __arm64_get_k_vdso_data > + > +static __always_inline > +int __arm64_get_clock_mode(struct timekeeper *tk) > +{ > + u32 use_syscall = !tk->tkr_mono.clock->archdata.vdso_direct; > + > + return use_syscall; > +} > +#define __arch_get_clock_mode __arm64_get_clock_mode > + > +static __always_inline > +int __arm64_use_vsyscall(struct vdso_data *vdata) > +{ > + return !vdata[CS_HRES_COARSE].clock_mode; > +} > +#define __arch_use_vsyscall __arm64_use_vsyscall > + > +static __always_inline > +void __arm64_update_vsyscall(struct vdso_data *vdata, struct timekeeper *tk) > +{ > + vdata[CS_HRES_COARSE].mask = VDSO_PRECISION_MASK; > + vdata[CS_RAW].mask = VDSO_PRECISION_MASK; > +} > +#define __arch_update_vsyscall __arm64_update_vsyscall > + > +/* The asm-generic header needs to be included after the definitions above */ > +#include > + > +#endif /* !__ASSEMBLY__ */ > + > +#endif /* __ASM_VDSO_VSYSCALL_H */ > diff --git a/arch/arm64/include/asm/vdso_datapage.h b/arch/arm64/include/asm/vdso_datapage.h > deleted file mode 100644 > index f89263c8e11a..000000000000 > --- a/arch/arm64/include/asm/vdso_datapage.h > +++ /dev/null > @@ -1,48 +0,0 @@ > -/* > - * Copyright (C) 2012 ARM Limited > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License version 2 as > - * published by the Free Software Foundation. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - * > - * You should have received a copy of the GNU General Public License > - * along with this program. If not, see . > - */ > -#ifndef __ASM_VDSO_DATAPAGE_H > -#define __ASM_VDSO_DATAPAGE_H > - > -#ifdef __KERNEL__ > - > -#ifndef __ASSEMBLY__ > - > -struct vdso_data { > - __u64 cs_cycle_last; /* Timebase at clocksource init */ > - __u64 raw_time_sec; /* Raw time */ > - __u64 raw_time_nsec; > - __u64 xtime_clock_sec; /* Kernel time */ > - __u64 xtime_clock_nsec; > - __u64 xtime_coarse_sec; /* Coarse time */ > - __u64 xtime_coarse_nsec; > - __u64 wtm_clock_sec; /* Wall to monotonic time */ > - __u64 wtm_clock_nsec; > - __u32 tb_seq_count; /* Timebase sequence counter */ > - /* cs_* members must be adjacent and in this order (ldp accesses) */ > - __u32 cs_mono_mult; /* NTP-adjusted clocksource multiplier */ > - __u32 cs_shift; /* Clocksource shift (mono = raw) */ > - __u32 cs_raw_mult; /* Raw clocksource multiplier */ > - __u32 tz_minuteswest; /* Whacky timezone stuff */ > - __u32 tz_dsttime; > - __u32 use_syscall; > - __u32 hrtimer_res; > -}; > - > -#endif /* !__ASSEMBLY__ */ > - > -#endif /* __KERNEL__ */ > - > -#endif /* __ASM_VDSO_DATAPAGE_H */ > diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c > index 947e39896e28..9e4b7ccbab2f 100644 > --- a/arch/arm64/kernel/asm-offsets.c > +++ b/arch/arm64/kernel/asm-offsets.c > @@ -25,13 +25,13 @@ > #include > #include > #include > +#include > #include > #include > #include > #include > #include > #include > -#include > #include > #include > > @@ -100,17 +100,28 @@ int main(void) > DEFINE(CLOCK_COARSE_RES, LOW_RES_NSEC); > DEFINE(NSEC_PER_SEC, NSEC_PER_SEC); > BLANK(); > - DEFINE(VDSO_CS_CYCLE_LAST, offsetof(struct vdso_data, cs_cycle_last)); > - DEFINE(VDSO_RAW_TIME_SEC, offsetof(struct vdso_data, raw_time_sec)); > - DEFINE(VDSO_XTIME_CLK_SEC, offsetof(struct vdso_data, xtime_clock_sec)); > - DEFINE(VDSO_XTIME_CRS_SEC, offsetof(struct vdso_data, xtime_coarse_sec)); > - DEFINE(VDSO_XTIME_CRS_NSEC, offsetof(struct vdso_data, xtime_coarse_nsec)); > - DEFINE(VDSO_WTM_CLK_SEC, offsetof(struct vdso_data, wtm_clock_sec)); > - DEFINE(VDSO_TB_SEQ_COUNT, offsetof(struct vdso_data, tb_seq_count)); > - DEFINE(VDSO_CS_MONO_MULT, offsetof(struct vdso_data, cs_mono_mult)); > - DEFINE(VDSO_CS_SHIFT, offsetof(struct vdso_data, cs_shift)); > + DEFINE(VDSO_SEQ, offsetof(struct vdso_data, seq)); > + DEFINE(VDSO_CLK_MODE, offsetof(struct vdso_data, clock_mode)); > + DEFINE(VDSO_CYCLE_LAST, offsetof(struct vdso_data, cycle_last)); > + DEFINE(VDSO_MASK, offsetof(struct vdso_data, mask)); > + DEFINE(VDSO_MULT, offsetof(struct vdso_data, mult)); > + DEFINE(VDSO_SHIFT, offsetof(struct vdso_data, shift)); > + DEFINE(VDSO_REALTIME_SEC, offsetof(struct vdso_data, basetime[CLOCK_REALTIME].sec)); > + DEFINE(VDSO_REALTIME_NSEC, offsetof(struct vdso_data, basetime[CLOCK_REALTIME].nsec)); > + DEFINE(VDSO_MONO_SEC, offsetof(struct vdso_data, basetime[CLOCK_MONOTONIC].sec)); > + DEFINE(VDSO_MONO_NSEC, offsetof(struct vdso_data, basetime[CLOCK_MONOTONIC].nsec)); > + DEFINE(VDSO_MONO_RAW_SEC, offsetof(struct vdso_data, basetime[CLOCK_MONOTONIC_RAW].sec)); > + DEFINE(VDSO_MONO_RAW_NSEC, offsetof(struct vdso_data, basetime[CLOCK_MONOTONIC_RAW].nsec)); > + DEFINE(VDSO_BOOTTIME_SEC, offsetof(struct vdso_data, basetime[CLOCK_BOOTTIME].sec)); > + DEFINE(VDSO_BOOTTIME_NSEC, offsetof(struct vdso_data, basetime[CLOCK_BOOTTIME].nsec)); > + DEFINE(VDSO_TAI_SEC, offsetof(struct vdso_data, basetime[CLOCK_TAI].sec)); > + DEFINE(VDSO_TAI_NSEC, offsetof(struct vdso_data, basetime[CLOCK_TAI].nsec)); > + DEFINE(VDSO_RT_COARSE_SEC, offsetof(struct vdso_data, basetime[CLOCK_REALTIME_COARSE].sec)); > + DEFINE(VDSO_RT_COARSE_NSEC, offsetof(struct vdso_data, basetime[CLOCK_REALTIME_COARSE].nsec)); > + DEFINE(VDSO_MONO_COARSE_SEC, offsetof(struct vdso_data, basetime[CLOCK_MONOTONIC_COARSE].sec)); > + DEFINE(VDSO_MONO_COARSE_NSEC, offsetof(struct vdso_data, basetime[CLOCK_MONOTONIC_COARSE].nsec)); > DEFINE(VDSO_TZ_MINWEST, offsetof(struct vdso_data, tz_minuteswest)); > - DEFINE(VDSO_USE_SYSCALL, offsetof(struct vdso_data, use_syscall)); > + DEFINE(VDSO_TZ_DSTTIME, offsetof(struct vdso_data, tz_dsttime)); > BLANK(); > DEFINE(TVAL_TV_SEC, offsetof(struct timeval, tv_sec)); > DEFINE(TSPEC_TV_SEC, offsetof(struct timespec, tv_sec)); > diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c > index 8074cbd3a3a8..23c38303a52a 100644 > --- a/arch/arm64/kernel/vdso.c > +++ b/arch/arm64/kernel/vdso.c > @@ -31,11 +31,13 @@ > #include > #include > #include > +#include > +#include > +#include > > #include > #include > #include > -#include > > extern char vdso_start[], vdso_end[]; > static unsigned long vdso_pages __ro_after_init; > @@ -44,10 +46,10 @@ static unsigned long vdso_pages __ro_after_init; > * The vDSO data page. > */ > static union { > - struct vdso_data data; > + struct vdso_data data[CS_BASES]; > u8 page[PAGE_SIZE]; > } vdso_data_store __page_aligned_data; > -struct vdso_data *vdso_data = &vdso_data_store.data; > +struct vdso_data *vdso_data = vdso_data_store.data; > > #ifdef CONFIG_COMPAT > /* > @@ -280,46 +282,3 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, > up_write(&mm->mmap_sem); > return PTR_ERR(ret); > } > - > -/* > - * Update the vDSO data page to keep in sync with kernel timekeeping. > - */ > -void update_vsyscall(struct timekeeper *tk) > -{ > - u32 use_syscall = !tk->tkr_mono.clock->archdata.vdso_direct; > - > - ++vdso_data->tb_seq_count; > - smp_wmb(); > - > - vdso_data->use_syscall = use_syscall; > - vdso_data->xtime_coarse_sec = tk->xtime_sec; > - vdso_data->xtime_coarse_nsec = tk->tkr_mono.xtime_nsec >> > - tk->tkr_mono.shift; > - vdso_data->wtm_clock_sec = tk->wall_to_monotonic.tv_sec; > - vdso_data->wtm_clock_nsec = tk->wall_to_monotonic.tv_nsec; > - > - /* Read without the seqlock held by clock_getres() */ > - WRITE_ONCE(vdso_data->hrtimer_res, hrtimer_resolution); > - > - if (!use_syscall) { > - /* tkr_mono.cycle_last == tkr_raw.cycle_last */ > - vdso_data->cs_cycle_last = tk->tkr_mono.cycle_last; > - vdso_data->raw_time_sec = tk->raw_sec; > - vdso_data->raw_time_nsec = tk->tkr_raw.xtime_nsec; > - vdso_data->xtime_clock_sec = tk->xtime_sec; > - vdso_data->xtime_clock_nsec = tk->tkr_mono.xtime_nsec; > - vdso_data->cs_mono_mult = tk->tkr_mono.mult; > - vdso_data->cs_raw_mult = tk->tkr_raw.mult; > - /* tkr_mono.shift == tkr_raw.shift */ > - vdso_data->cs_shift = tk->tkr_mono.shift; > - } > - > - smp_wmb(); > - ++vdso_data->tb_seq_count; > -} > - > -void update_vsyscall_tz(void) > -{ > - vdso_data->tz_minuteswest = sys_tz.tz_minuteswest; > - vdso_data->tz_dsttime = sys_tz.tz_dsttime; > -} > diff --git a/arch/arm64/kernel/vdso/Makefile b/arch/arm64/kernel/vdso/Makefile > index fa230ff09aa1..3acfc813e966 100644 > --- a/arch/arm64/kernel/vdso/Makefile > +++ b/arch/arm64/kernel/vdso/Makefile > @@ -6,7 +6,12 @@ > # Heavily based on the vDSO Makefiles for other archs. > # > > -obj-vdso := gettimeofday.o note.o sigreturn.o > +# Absolute relocation type $(ARCH_REL_TYPE_ABS) needs to be defined before > +# the inclusion of generic Makefile. > +ARCH_REL_TYPE_ABS := R_AARCH64_JUMP_SLOT|R_AARCH64_GLOB_DAT|R_AARCH64_ABS64 > +include $(srctree)/lib/vdso/Makefile > + > +obj-vdso := vgettimeofday.o note.o sigreturn.o > > # Build rules > targets := $(obj-vdso) vdso.so vdso.so.dbg > @@ -15,6 +20,24 @@ obj-vdso := $(addprefix $(obj)/, $(obj-vdso)) > ldflags-y := -shared -nostdlib -soname=linux-vdso.so.1 --hash-style=sysv \ > --build-id -n -T > > +ccflags-y := -fno-common -fno-builtin -fno-stack-protector > +ccflags-y += -DDISABLE_BRANCH_PROFILING > + > +VDSO_LDFLAGS := -Bsymbolic > + > +CFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_FTRACE) -Os > +KBUILD_CFLAGS += $(DISABLE_LTO) > +KASAN_SANITIZE := n > +UBSAN_SANITIZE := n > +OBJECT_FILES_NON_STANDARD := y > +KCOV_INSTRUMENT := n > + > +ifeq ($(c-gettimeofday-y),) > +CFLAGS_vgettimeofday.o = -O2 -mcmodel=tiny > +else > +CFLAGS_vgettimeofday.o = -O2 -mcmodel=tiny -include $(c-gettimeofday-y) > +endif > + > # Disable gcov profiling for VDSO code > GCOV_PROFILE := n > > @@ -28,6 +51,7 @@ $(obj)/vdso.o : $(obj)/vdso.so > # Link rule for the .so file, .lds has to be first > $(obj)/vdso.so.dbg: $(obj)/vdso.lds $(obj-vdso) FORCE > $(call if_changed,ld) > + $(call if_changed,vdso_check) > > # Strip rule for the .so file > $(obj)/%.so: OBJCOPYFLAGS := -S > @@ -42,13 +66,9 @@ quiet_cmd_vdsosym = VDSOSYM $@ > include/generated/vdso-offsets.h: $(obj)/vdso.so.dbg FORCE > $(call if_changed,vdsosym) > > -# Assembly rules for the .S files > -$(obj-vdso): %.o: %.S FORCE > - $(call if_changed_dep,vdsoas) > - > # Actual build commands > -quiet_cmd_vdsoas = VDSOA $@ > - cmd_vdsoas = $(CC) $(a_flags) -c -o $@ $< > +quiet_cmd_vdsocc = VDSOCC $@ > + cmd_vdsocc = $(CC) $(a_flags) $(c_flags) -c -o $@ $< > > # Install commands for the unstripped file > quiet_cmd_vdso_install = INSTALL $@ > diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S > deleted file mode 100644 > index 856fee6d3512..000000000000 > --- a/arch/arm64/kernel/vdso/gettimeofday.S > +++ /dev/null > @@ -1,334 +0,0 @@ > -/* > - * Userspace implementations of gettimeofday() and friends. > - * > - * Copyright (C) 2012 ARM Limited > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License version 2 as > - * published by the Free Software Foundation. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - * > - * You should have received a copy of the GNU General Public License > - * along with this program. If not, see . > - * > - * Author: Will Deacon > - */ > - > -#include > -#include > -#include > - > -#define NSEC_PER_SEC_LO16 0xca00 > -#define NSEC_PER_SEC_HI16 0x3b9a > - > -vdso_data .req x6 > -seqcnt .req w7 > -w_tmp .req w8 > -x_tmp .req x8 > - > -/* > - * Conventions for macro arguments: > - * - An argument is write-only if its name starts with "res". > - * - All other arguments are read-only, unless otherwise specified. > - */ > - > - .macro seqcnt_acquire > -9999: ldr seqcnt, [vdso_data, #VDSO_TB_SEQ_COUNT] > - tbnz seqcnt, #0, 9999b > - dmb ishld > - .endm > - > - .macro seqcnt_check fail > - dmb ishld > - ldr w_tmp, [vdso_data, #VDSO_TB_SEQ_COUNT] > - cmp w_tmp, seqcnt > - b.ne \fail > - .endm > - > - .macro syscall_check fail > - ldr w_tmp, [vdso_data, #VDSO_USE_SYSCALL] > - cbnz w_tmp, \fail > - .endm > - > - .macro get_nsec_per_sec res > - mov \res, #NSEC_PER_SEC_LO16 > - movk \res, #NSEC_PER_SEC_HI16, lsl #16 > - .endm > - > - /* > - * Returns the clock delta, in nanoseconds left-shifted by the clock > - * shift. > - */ > - .macro get_clock_shifted_nsec res, cycle_last, mult > - /* Read the virtual counter. */ > - isb > - mrs x_tmp, cntvct_el0 > - /* Calculate cycle delta and convert to ns. */ > - sub \res, x_tmp, \cycle_last > - /* We can only guarantee 56 bits of precision. */ > - movn x_tmp, #0xff00, lsl #48 > - and \res, x_tmp, \res > - mul \res, \res, \mult > - /* > - * Fake address dependency from the value computed from the counter > - * register to subsequent data page accesses so that the sequence > - * locking also orders the read of the counter. > - */ > - and x_tmp, \res, xzr > - add vdso_data, vdso_data, x_tmp > - .endm > - > - /* > - * Returns in res_{sec,nsec} the REALTIME timespec, based on the > - * "wall time" (xtime) and the clock_mono delta. > - */ > - .macro get_ts_realtime res_sec, res_nsec, \ > - clock_nsec, xtime_sec, xtime_nsec, nsec_to_sec > - add \res_nsec, \clock_nsec, \xtime_nsec > - udiv x_tmp, \res_nsec, \nsec_to_sec > - add \res_sec, \xtime_sec, x_tmp > - msub \res_nsec, x_tmp, \nsec_to_sec, \res_nsec > - .endm > - > - /* > - * Returns in res_{sec,nsec} the timespec based on the clock_raw delta, > - * used for CLOCK_MONOTONIC_RAW. > - */ > - .macro get_ts_clock_raw res_sec, res_nsec, clock_nsec, nsec_to_sec > - udiv \res_sec, \clock_nsec, \nsec_to_sec > - msub \res_nsec, \res_sec, \nsec_to_sec, \clock_nsec > - .endm > - > - /* sec and nsec are modified in place. */ > - .macro add_ts sec, nsec, ts_sec, ts_nsec, nsec_to_sec > - /* Add timespec. */ > - add \sec, \sec, \ts_sec > - add \nsec, \nsec, \ts_nsec > - > - /* Normalise the new timespec. */ > - cmp \nsec, \nsec_to_sec > - b.lt 9999f > - sub \nsec, \nsec, \nsec_to_sec > - add \sec, \sec, #1 > -9999: > - cmp \nsec, #0 > - b.ge 9998f > - add \nsec, \nsec, \nsec_to_sec > - sub \sec, \sec, #1 > -9998: > - .endm > - > - .macro clock_gettime_return, shift=0 > - .if \shift == 1 > - lsr x11, x11, x12 > - .endif > - stp x10, x11, [x1, #TSPEC_TV_SEC] > - mov x0, xzr > - ret > - .endm > - > - .macro jump_slot jumptable, index, label > - .if (. - \jumptable) != 4 * (\index) > - .error "Jump slot index mismatch" > - .endif > - b \label > - .endm > - > - .text > - > -/* int __kernel_gettimeofday(struct timeval *tv, struct timezone *tz); */ > -ENTRY(__kernel_gettimeofday) > - .cfi_startproc > - adr vdso_data, _vdso_data > - /* If tv is NULL, skip to the timezone code. */ > - cbz x0, 2f > - > - /* Compute the time of day. */ > -1: seqcnt_acquire > - syscall_check fail=4f > - ldr x10, [vdso_data, #VDSO_CS_CYCLE_LAST] > - /* w11 = cs_mono_mult, w12 = cs_shift */ > - ldp w11, w12, [vdso_data, #VDSO_CS_MONO_MULT] > - ldp x13, x14, [vdso_data, #VDSO_XTIME_CLK_SEC] > - > - get_nsec_per_sec res=x9 > - lsl x9, x9, x12 > - > - get_clock_shifted_nsec res=x15, cycle_last=x10, mult=x11 > - seqcnt_check fail=1b > - get_ts_realtime res_sec=x10, res_nsec=x11, \ > - clock_nsec=x15, xtime_sec=x13, xtime_nsec=x14, nsec_to_sec=x9 > - > - /* Convert ns to us. */ > - mov x13, #1000 > - lsl x13, x13, x12 > - udiv x11, x11, x13 > - stp x10, x11, [x0, #TVAL_TV_SEC] > -2: > - /* If tz is NULL, return 0. */ > - cbz x1, 3f > - ldp w4, w5, [vdso_data, #VDSO_TZ_MINWEST] > - stp w4, w5, [x1, #TZ_MINWEST] > -3: > - mov x0, xzr > - ret > -4: > - /* Syscall fallback. */ > - mov x8, #__NR_gettimeofday > - svc #0 > - ret > - .cfi_endproc > -ENDPROC(__kernel_gettimeofday) > - > -#define JUMPSLOT_MAX CLOCK_MONOTONIC_COARSE > - > -/* int __kernel_clock_gettime(clockid_t clock_id, struct timespec *tp); */ > -ENTRY(__kernel_clock_gettime) > - .cfi_startproc > - cmp w0, #JUMPSLOT_MAX > - b.hi syscall > - adr vdso_data, _vdso_data > - adr x_tmp, jumptable > - add x_tmp, x_tmp, w0, uxtw #2 > - br x_tmp > - > - ALIGN > -jumptable: > - jump_slot jumptable, CLOCK_REALTIME, realtime > - jump_slot jumptable, CLOCK_MONOTONIC, monotonic > - b syscall > - b syscall > - jump_slot jumptable, CLOCK_MONOTONIC_RAW, monotonic_raw > - jump_slot jumptable, CLOCK_REALTIME_COARSE, realtime_coarse > - jump_slot jumptable, CLOCK_MONOTONIC_COARSE, monotonic_coarse > - > - .if (. - jumptable) != 4 * (JUMPSLOT_MAX + 1) > - .error "Wrong jumptable size" > - .endif > - > - ALIGN > -realtime: > - seqcnt_acquire > - syscall_check fail=syscall > - ldr x10, [vdso_data, #VDSO_CS_CYCLE_LAST] > - /* w11 = cs_mono_mult, w12 = cs_shift */ > - ldp w11, w12, [vdso_data, #VDSO_CS_MONO_MULT] > - ldp x13, x14, [vdso_data, #VDSO_XTIME_CLK_SEC] > - > - /* All computations are done with left-shifted nsecs. */ > - get_nsec_per_sec res=x9 > - lsl x9, x9, x12 > - > - get_clock_shifted_nsec res=x15, cycle_last=x10, mult=x11 > - seqcnt_check fail=realtime > - get_ts_realtime res_sec=x10, res_nsec=x11, \ > - clock_nsec=x15, xtime_sec=x13, xtime_nsec=x14, nsec_to_sec=x9 > - clock_gettime_return, shift=1 > - > - ALIGN > -monotonic: > - seqcnt_acquire > - syscall_check fail=syscall > - ldr x10, [vdso_data, #VDSO_CS_CYCLE_LAST] > - /* w11 = cs_mono_mult, w12 = cs_shift */ > - ldp w11, w12, [vdso_data, #VDSO_CS_MONO_MULT] > - ldp x13, x14, [vdso_data, #VDSO_XTIME_CLK_SEC] > - ldp x3, x4, [vdso_data, #VDSO_WTM_CLK_SEC] > - > - /* All computations are done with left-shifted nsecs. */ > - lsl x4, x4, x12 > - get_nsec_per_sec res=x9 > - lsl x9, x9, x12 > - > - get_clock_shifted_nsec res=x15, cycle_last=x10, mult=x11 > - seqcnt_check fail=monotonic > - get_ts_realtime res_sec=x10, res_nsec=x11, \ > - clock_nsec=x15, xtime_sec=x13, xtime_nsec=x14, nsec_to_sec=x9 > - > - add_ts sec=x10, nsec=x11, ts_sec=x3, ts_nsec=x4, nsec_to_sec=x9 > - clock_gettime_return, shift=1 > - > - ALIGN > -monotonic_raw: > - seqcnt_acquire > - syscall_check fail=syscall > - ldr x10, [vdso_data, #VDSO_CS_CYCLE_LAST] > - /* w11 = cs_raw_mult, w12 = cs_shift */ > - ldp w12, w11, [vdso_data, #VDSO_CS_SHIFT] > - ldp x13, x14, [vdso_data, #VDSO_RAW_TIME_SEC] > - > - /* All computations are done with left-shifted nsecs. */ > - get_nsec_per_sec res=x9 > - lsl x9, x9, x12 > - > - get_clock_shifted_nsec res=x15, cycle_last=x10, mult=x11 > - seqcnt_check fail=monotonic_raw > - get_ts_clock_raw res_sec=x10, res_nsec=x11, \ > - clock_nsec=x15, nsec_to_sec=x9 > - > - add_ts sec=x10, nsec=x11, ts_sec=x13, ts_nsec=x14, nsec_to_sec=x9 > - clock_gettime_return, shift=1 > - > - ALIGN > -realtime_coarse: > - seqcnt_acquire > - ldp x10, x11, [vdso_data, #VDSO_XTIME_CRS_SEC] > - seqcnt_check fail=realtime_coarse > - clock_gettime_return > - > - ALIGN > -monotonic_coarse: > - seqcnt_acquire > - ldp x10, x11, [vdso_data, #VDSO_XTIME_CRS_SEC] > - ldp x13, x14, [vdso_data, #VDSO_WTM_CLK_SEC] > - seqcnt_check fail=monotonic_coarse > - > - /* Computations are done in (non-shifted) nsecs. */ > - get_nsec_per_sec res=x9 > - add_ts sec=x10, nsec=x11, ts_sec=x13, ts_nsec=x14, nsec_to_sec=x9 > - clock_gettime_return > - > - ALIGN > -syscall: /* Syscall fallback. */ > - mov x8, #__NR_clock_gettime > - svc #0 > - ret > - .cfi_endproc > -ENDPROC(__kernel_clock_gettime) > - > -/* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res); */ > -ENTRY(__kernel_clock_getres) > - .cfi_startproc > - cmp w0, #CLOCK_REALTIME > - ccmp w0, #CLOCK_MONOTONIC, #0x4, ne > - ccmp w0, #CLOCK_MONOTONIC_RAW, #0x4, ne > - b.ne 1f > - > - adr vdso_data, _vdso_data > - ldr w2, [vdso_data, #CLOCK_REALTIME_RES] > - b 2f > -1: > - cmp w0, #CLOCK_REALTIME_COARSE > - ccmp w0, #CLOCK_MONOTONIC_COARSE, #0x4, ne > - b.ne 4f > - ldr x2, 5f > -2: > - cbz x1, 3f > - stp xzr, x2, [x1] > - > -3: /* res == NULL. */ > - mov w0, wzr > - ret > - > -4: /* Syscall fallback. */ > - mov x8, #__NR_clock_getres > - svc #0 > - ret > -5: > - .quad CLOCK_COARSE_RES > - .cfi_endproc > -ENDPROC(__kernel_clock_getres) > diff --git a/arch/arm64/kernel/vdso/vgettimeofday.c b/arch/arm64/kernel/vdso/vgettimeofday.c > new file mode 100644 > index 000000000000..3c58f19dbdf4 > --- /dev/null > +++ b/arch/arm64/kernel/vdso/vgettimeofday.c > @@ -0,0 +1,28 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * ARM64 userspace implementations of gettimeofday() and similar. > + * > + * Copyright (C) 2018 ARM Limited > + * > + */ > +#include > +#include > + > +int __kernel_clock_gettime(clockid_t clock, > + struct __kernel_timespec *ts) > +{ > + return __cvdso_clock_gettime(clock, ts); > +} > + > +int __kernel_gettimeofday(struct __kernel_old_timeval *tv, > + struct timezone *tz) > +{ > + return __cvdso_gettimeofday(tv, tz); > +} > + > +int __kernel_clock_getres(clockid_t clock_id, > + struct __kernel_timespec *res) > +{ > + return __cvdso_clock_getres(clock_id, res); > +} > + Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland 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=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 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 23D37C5B57A for ; Fri, 28 Jun 2019 13:09:40 +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 DAFFC2083B for ; Fri, 28 Jun 2019 13:09:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="DKGHOm5u"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="oxLgWP7P" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DAFFC2083B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=samsung.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:References:In-Reply-To:MIME-Version: Date:Message-ID:From:To:Subject:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=XXg8/I7yOBtStCxTcmnL3xL566OjqGCJxhv5dheNoNo=; b=DKGHOm5uZ+rrh0 VOlGUy38ISHrjYI2HrNgAtBQbVMLRXHHxNVk0zaNQZxuH5pnv6AEjqSbWx5wSTJZqcqvarRpWG1BF OqcCFfCr8pPfXMfShQ1UbPWSL6g4rmHUXwe1J7zrOocyH5HTQWcvPGAy2hL5Q7VknrItkcSAsa3Wq WPCwbNGV2gWDvXrWUdQqu2Xf7Dj6+iQgI4OuepwFZN1p/uhAd3AyCwvYsjyVBdZcKBPf8Ba0JgwkE KroDhfn+Kfh/zHKwADqioB9a9syDdarNSSBQMrIuiQLDwcsubxX1jnID1V47DTbh+pXk2KGmxoX1N 9t3Y6Htfd59ZSf5K2J8g==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hgqd8-0005Ep-Rf; Fri, 28 Jun 2019 13:09:30 +0000 Received: from mailout1.w1.samsung.com ([210.118.77.11]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hgqd3-0005Dx-LA for linux-arm-kernel@lists.infradead.org; Fri, 28 Jun 2019 13:09:29 +0000 Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20190628130923euoutp012fc2be9b20f0defee2efad52e057d0a1~sXsMtl0MN1084110841euoutp01a for ; Fri, 28 Jun 2019 13:09:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20190628130923euoutp012fc2be9b20f0defee2efad52e057d0a1~sXsMtl0MN1084110841euoutp01a DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1561727363; bh=/9fBMBJMP2qjdnTHo1o74xYAuPXxvb9q0g09PJjz3gU=; h=Subject:To:Cc:From:Date:In-Reply-To:References:From; b=oxLgWP7PcMWKJu+BD8GEX7EJ0KmRPrZ47y12dd8V17phjaFXM6gHOrDvmkAC2km5u 7hhggMjceSTLbnj83EUvRno1KSOPvTSJZfkT1X9CgoBh5nln25/o/YabBHeG7claem e3WdxPasXEFSxzmR97hKrTx0iHlCJaTjxYIaFs1M= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20190628130922eucas1p14fd080cfc0ddc984c2792a3fd1559ea2~sXsLsuXam2414124141eucas1p1N; Fri, 28 Jun 2019 13:09:22 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 5A.27.04298.181161D5; Fri, 28 Jun 2019 14:09:21 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20190628130921eucas1p239935b0771032c331911eacc1a69dd2e~sXsKt--sS2925929259eucas1p2N; Fri, 28 Jun 2019 13:09:21 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20190628130920eusmtrp1f3af4ee35cbb70c16692bd624b79df07~sXsKfpzB72373923739eusmtrp1i; Fri, 28 Jun 2019 13:09:20 +0000 (GMT) X-AuditID: cbfec7f2-f2dff700000010ca-8d-5d161181e60f Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 37.C5.04140.081161D5; Fri, 28 Jun 2019 14:09:20 +0100 (BST) Received: from [106.120.50.25] (unknown [106.120.50.25]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20190628130919eusmtip2338436e3f2ac037ac588453a18926993~sXsJgQLnh1303113031eusmtip2Y; Fri, 28 Jun 2019 13:09:19 +0000 (GMT) Subject: Re: [PATCH v7 04/25] arm64: Substitute gettimeofday with C implementation To: Vincenzo Frascino , linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mips@vger.kernel.org, linux-kselftest@vger.kernel.org From: Marek Szyprowski Message-ID: <1fd47b0d-f77f-8d07-c039-6ac9072834fc@samsung.com> Date: Fri, 28 Jun 2019 15:09:18 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.7.2 MIME-Version: 1.0 In-Reply-To: <20190621095252.32307-5-vincenzo.frascino@arm.com> Content-Language: en-US X-Brightmail-Tracker: H4sIAAAAAAAAA01SbUhTYRjt3b279zqaXJfpoxXBqKAgTZJ6+8AK+nGLIqOCsEatumrkLHbT Pik/Qt1SF1qac06jLDX7utqqZZCztJCWaZnUpMwF9mFSOWhW1ubV8t855zkP5zkvL0Oo6qhw Znfyfl6frE1SUwrS1ux1zk0PCtHMK7JG4FNFfSSusnoR/l3QTOOBi7kIW79PwyVVn0mcY/eQ WOztlOMOu4XCxa4BChvEmwg7ztxDuNdspXD+p2YCm1wvKdzeMAM3fc6WY6/Yg/DpD1dpXFH9 isR14hkC3xv2kvjD10fk8lDOdtcm52qttYjr6HxGcD+HChA3+CJdxt0xd9NchZjCiTUGinN1 NlDcF6eT5h5WX5FxdReOc4XnfP5PD3pIrs24h8uvr0GxQXGKpbv4pN2pvD4yZrsisbPIhPZZ 36CDT3646TTkqUdGFMAAGw13H9koI1IwKrYKQUNjoVwigwjeD9UiiXxH0GbKI8ZWct6Vk9Lg EoI6RyYhkX4E7vtPZX7XJHYj1J8oG3EFs899693ZtJ8QrEUOQw/EERfFRoGx30j5sZKNgaw/ 4ggm2ZnQWtFH+vFkdiv0lLtGPUHwuMQ9ogewy+BWZbrcjwl2OmTeLCUkHAqv3OUyfxiwfQzc MQzIpMNXQva3TFrCk+BjS/0ongqthbmktJCJoMd5hZZILoKOjLOjL7UEmlqe+eIYX8RsuGaP lOQVcNJkkvllYAOhqz9IOiIQCmzFhCQrISdLJblngbnl6r/YxrZ24hRSm8dVM4+rYx5Xx/w/ twKRNSiUTxF0CbwQlcwfiBC0OiElOSFi516diHxfuXW45dtt5Gnf4UAsg9QTlT8mhmhUcm2q cEjnQMAQ6mBlmDNYo1Lu0h46zOv3btOnJPGCA01hSHWo8siEt1tUbIJ2P7+H5/fx+rGpjAkI T0NrYqdsehF2/dhCi0FjCc5e9PriU13A5KY57khDd/v5EPvq873zGxeXZXlW5S3x2oczrKui b8yK68/nf1fGta2rjKebf5VZrJ4Ykya+oOtX/JfnYS4ctmBTYuBlzYycg0cVsdHVXXrhRupD uX0wbc3bwEpPSYbNG75lw8b1m7XnSteqSSFRGzWH0Avav957NAnGAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA02Sa0hTYRiA+3bOzqY5Om5ePi1JVlGJzTad+wwvQUTnRz+iO5bZ0qMLnZOd TdQ/LbJyQ9K8tlVzUYZZFsxpaRo1yxLxljnDLDEVFE2NDFyXlW4F/nte3vd5L/ByMX47O5h7 NktDq7PkmULCG+9yvf60Q+cbkLSz90c4KqmcwlGt2QnQ79IODpq/WwSQ+VsIMtbO4qiw5TuO rOMONhpouUGgqpF5AumtjQDZK9oAGjeZCXRlpgNDxSNDBHrbuhm1z15mI6d1DKDy6YccZLk3 jKMGawWG2lxOHE1/fYPvDqSanjaxqQfmB4AacPRj1M8fpYBaHDzPoppNHzmUxaqlrHV6ghpx tBLUXE8Ph3p1r55FNdw5R5XdWq6feTmGU32GDOqKrQ4c8E0UxapVWg0dqlAxmjjhCTGSiMQx SCSJihGJI2VJuyRSYUR8bCqdeTaHVkfEnxYpHJXFINs8CnK7lyY4OvDdBgzAiwvJKFj4uRo3 AG8un6wBUO96x/YkNsDOSt0/FsBfDgOxwnxyBsCahT0rLCAPQ1vBTbfsR74DcMjc6w4w0sKG bTXdHI/BwIvjo+5xBCmGhi+eTjwyHl76Y3UzTm6BXZYpfIX9yZPQUOHEPTW+sNM44WYvMgE+ rjnv3ggjo6G5YQzz8EZ4ofH6Pw6EwxPVrBLAN63STasU0yrFtEqxALwO+NFaRpmuZCQiRq5k tFnpohSV0gqWH6ipw2l7Agxzh+yA5AKhD8/iHZDEZ8tzmDylHUAuJvTjBfX4JfF5qfK8fFqt SlZrM2nGDqTLx13Fgv1TVMvvmKVJFkvFMhQjlkXKIqORMJBXSL44ySfT5Ro6g6azafV/j8X1 CtYB3TnjrubBM76HuwRx4UvSgqOTH/IGfA7urX9eVPYnpDV/25b35cmy9tuaQ4sDxqAj5l7B saqEkWv6uIXamKmP64z9mEK6CSzkrns83cl32YafdQZGSraHpFWsDxDdPzWzpGcp9ucnxm59 9D5k82zY7L7Q44K0NcaCQd1ak5e6b9IlxBmFXByGqRn5X3OrU7tWAwAA X-CMS-MailID: 20190628130921eucas1p239935b0771032c331911eacc1a69dd2e X-Msg-Generator: CA X-RootMTR: 20190628130921eucas1p239935b0771032c331911eacc1a69dd2e X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20190628130921eucas1p239935b0771032c331911eacc1a69dd2e References: <20190621095252.32307-1-vincenzo.frascino@arm.com> <20190621095252.32307-5-vincenzo.frascino@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190628_060926_134023_E690A14E X-CRM114-Status: GOOD ( 27.04 ) 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: Sylwester Nawrocki , Arnd Bergmann , Huw Davies , Andre Przywara , Daniel Lezcano , Will Deacon , Russell King , Ralf Baechle , Mark Salyzyn , Paul Burton , Rasmus Villemoes , Dmitry Safonov <0x7f454c46@gmail.com>, Catalin Marinas , Peter Collingbourne , Thomas Gleixner , Shijith Thotton , Shuah Khan Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org RGVhciBBbGwsCgpPbiAyMDE5LTA2LTIxIDExOjUyLCBWaW5jZW56byBGcmFzY2lubyB3cm90ZToK PiBUbyB0YWtlIGFkdmFudGFnZSBvZiB0aGUgY29tbW9ubHkgZGVmaW5lZCB2ZHNvIGludGVyZmFj ZSBmb3IKPiBnZXR0aW1lb2ZkYXkgdGhlIGFyY2hpdGVjdHVyYWwgY29kZSByZXF1aXJlcyBhbiBh ZGFwdGF0aW9uLgo+Cj4gUmUtaW1wbGVtZW50IHRoZSBnZXR0aW1lb2ZkYXkgdmRzbyBpbiBDIGlu IG9yZGVyIHRvIHVzZSBsaWIvdmRzby4KPgo+IFdpdGggdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBh cm02NCBnYWlucyBzdXBwb3J0IGZvciBDTE9DS19CT09UVElNRQo+IGFuZCBDTE9DS19UQUkuCj4K PiBDYzogQ2F0YWxpbiBNYXJpbmFzIDxjYXRhbGluLm1hcmluYXNAYXJtLmNvbT4KPiBDYzogV2ls bCBEZWFjb24gPHdpbGwuZGVhY29uQGFybS5jb20+Cj4gU2lnbmVkLW9mZi1ieTogVmluY2Vuem8g RnJhc2Npbm8gPHZpbmNlbnpvLmZyYXNjaW5vQGFybS5jb20+Cj4gVGVzdGVkLWJ5OiBTaGlqaXRo IFRob3R0b24gPHN0aG90dG9uQG1hcnZlbGwuY29tPgo+IFRlc3RlZC1ieTogQW5kcmUgUHJ6eXdh cmEgPGFuZHJlLnByenl3YXJhQGFybS5jb20+Cj4gU2lnbmVkLW9mZi1ieTogQ2F0YWxpbiBNYXJp bmFzIDxjYXRhbGluLm1hcmluYXNAYXJtLmNvbT4KClRoaXMgcGF0Y2ggY2F1c2VzIHNlcmlvdXMg cmVncmVzc2lvbiBvbiBTYW1zdW5nIEV4eW5vczU0MzMgU29DIGJhc2VkIApUTTIoZSkgYm9hcmRz LiBUaGUgdGltZSBpbiB1c2Vyc3BhY2UgaXMgYWx3YXlzIHNldCB0byBiZWdpbiBvZiB0aGUgZXBv Y2g6CgojIGRhdGUgMDYyODEzMTUyMDE5CkZyaSBKdW4gMjggMTM6MTU6MDAgVVRDIDIwMTkKIyBk YXRlClRodSBKYW7CoCAxIDAwOjAwOjAwIFVUQyAxOTcwCiMgZGF0ZQpUaHUgSmFuwqAgMSAwMDow MDowMCBVVEMgMTk3MAoKSSd2ZSBub3RpY2VkIHRoYXQgc2luY2UgdGhlIHBhdGNoIGxhbmRlZCBp biBMaW51eCBuZXh0LTIwMTkwNjI1IGFuZCAKYmlzZWN0IGluZGVlZCBwb2ludGVkIHRvIHRoaXMg cGF0Y2guCgo+IC0tLQo+ICAgYXJjaC9hcm02NC9LY29uZmlnICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAyICsKPiAgIGFyY2gvYXJtNjQvaW5jbHVkZS9hc20vdmRzby9nZXR0aW1lb2ZkYXku aCB8ICA4NiArKysrKysKPiAgIGFyY2gvYXJtNjQvaW5jbHVkZS9hc20vdmRzby92c3lzY2FsbC5o ICAgICB8ICA1MyArKysrCj4gICBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL3Zkc29fZGF0YXBhZ2Uu aCAgICAgfCAgNDggLS0tCj4gICBhcmNoL2FybTY0L2tlcm5lbC9hc20tb2Zmc2V0cy5jICAgICAg ICAgICAgfCAgMzMgKy0KPiAgIGFyY2gvYXJtNjQva2VybmVsL3Zkc28uYyAgICAgICAgICAgICAg ICAgICB8ICA1MSArLS0tCj4gICBhcmNoL2FybTY0L2tlcm5lbC92ZHNvL01ha2VmaWxlICAgICAg ICAgICAgfCAgMzQgKystCj4gICBhcmNoL2FybTY0L2tlcm5lbC92ZHNvL2dldHRpbWVvZmRheS5T ICAgICAgfCAzMzQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gICBhcmNoL2FybTY0L2tlcm5lbC92 ZHNvL3ZnZXR0aW1lb2ZkYXkuYyAgICAgfCAgMjggKysKPiAgIDkgZmlsZXMgY2hhbmdlZCwgMjIz IGluc2VydGlvbnMoKyksIDQ0NiBkZWxldGlvbnMoLSkKPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBh cmNoL2FybTY0L2luY2x1ZGUvYXNtL3Zkc28vZ2V0dGltZW9mZGF5LmgKPiAgIGNyZWF0ZSBtb2Rl IDEwMDY0NCBhcmNoL2FybTY0L2luY2x1ZGUvYXNtL3Zkc28vdnN5c2NhbGwuaAo+ICAgZGVsZXRl IG1vZGUgMTAwNjQ0IGFyY2gvYXJtNjQvaW5jbHVkZS9hc20vdmRzb19kYXRhcGFnZS5oCj4gICBk ZWxldGUgbW9kZSAxMDA2NDQgYXJjaC9hcm02NC9rZXJuZWwvdmRzby9nZXR0aW1lb2ZkYXkuUwo+ ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGFyY2gvYXJtNjQva2VybmVsL3Zkc28vdmdldHRpbWVvZmRh eS5jCj4KPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29u ZmlnCj4gaW5kZXggNjk3ZWEwNTEwNzI5Li45NTJjOWY4Y2YzYjggMTAwNjQ0Cj4gLS0tIGEvYXJj aC9hcm02NC9LY29uZmlnCj4gKysrIGIvYXJjaC9hcm02NC9LY29uZmlnCj4gQEAgLTEwNyw2ICsx MDcsNyBAQCBjb25maWcgQVJNNjQKPiAgIAlzZWxlY3QgR0VORVJJQ19TVFJOQ1BZX0ZST01fVVNF Ugo+ICAgCXNlbGVjdCBHRU5FUklDX1NUUk5MRU5fVVNFUgo+ICAgCXNlbGVjdCBHRU5FUklDX1RJ TUVfVlNZU0NBTEwKPiArCXNlbGVjdCBHRU5FUklDX0dFVFRJTUVPRkRBWQo+ICAgCXNlbGVjdCBI QU5ETEVfRE9NQUlOX0lSUQo+ICAgCXNlbGVjdCBIQVJESVJRU19TV19SRVNFTkQKPiAgIAlzZWxl Y3QgSEFWRV9QQ0kKPiBAQCAtMTYwLDYgKzE2MSw3IEBAIGNvbmZpZyBBUk02NAo+ICAgCXNlbGVj dCBIQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFMKPiAgIAlzZWxlY3QgSEFWRV9LUFJPQkVTCj4gICAJ c2VsZWN0IEhBVkVfS1JFVFBST0JFUwo+ICsJc2VsZWN0IEhBVkVfR0VORVJJQ19WRFNPCj4gICAJ c2VsZWN0IElPTU1VX0RNQSBpZiBJT01NVV9TVVBQT1JUCj4gICAJc2VsZWN0IElSUV9ET01BSU4K PiAgIAlzZWxlY3QgSVJRX0ZPUkNFRF9USFJFQURJTkcKPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02 NC9pbmNsdWRlL2FzbS92ZHNvL2dldHRpbWVvZmRheS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2Fz bS92ZHNvL2dldHRpbWVvZmRheS5oCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAw MDAwMDAwMDAuLmJjM2NiNjczODA1MQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9hcmNoL2FybTY0 L2luY2x1ZGUvYXNtL3Zkc28vZ2V0dGltZW9mZGF5LmgKPiBAQCAtMCwwICsxLDg2IEBACj4gKy8q IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCj4gKy8qCj4gKyAqIENvcHlyaWdo dCAoQykgMjAxOCBBUk0gTGltaXRlZAo+ICsgKi8KPiArI2lmbmRlZiBfX0FTTV9WRFNPX0dFVFRJ TUVPRkRBWV9ICj4gKyNkZWZpbmUgX19BU01fVkRTT19HRVRUSU1FT0ZEQVlfSAo+ICsKPiArI2lm bmRlZiBfX0FTU0VNQkxZX18KPiArCj4gKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Cj4gKyNpbmNs dWRlIDx1YXBpL2xpbnV4L3RpbWUuaD4KPiArCj4gKyNkZWZpbmUgVkRTT19IQVNfQ0xPQ0tfR0VU UkVTCQkxCj4gKwo+ICtzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBnZXR0aW1lb2ZkYXlfZmFs bGJhY2soCj4gKwkJCQkJc3RydWN0IF9fa2VybmVsX29sZF90aW1ldmFsICpfdHYsCj4gKwkJCQkJ c3RydWN0IHRpbWV6b25lICpfdHopCj4gK3sKPiArCXJlZ2lzdGVyIHN0cnVjdCB0aW1lem9uZSAq dHogYXNtKCJ4MSIpID0gX3R6Owo+ICsJcmVnaXN0ZXIgc3RydWN0IF9fa2VybmVsX29sZF90aW1l dmFsICp0diBhc20oIngwIikgPSBfdHY7Cj4gKwlyZWdpc3RlciBsb25nIHJldCBhc20gKCJ4MCIp Owo+ICsJcmVnaXN0ZXIgbG9uZyBuciBhc20oIng4IikgPSBfX05SX2dldHRpbWVvZmRheTsKPiAr Cj4gKwlhc20gdm9sYXRpbGUoCj4gKwkiICAgICAgIHN2YyAjMFxuIgo+ICsJOiAiPXIiIChyZXQp Cj4gKwk6ICJyIiAodHYpLCAiciIgKHR6KSwgInIiIChucikKPiArCTogIm1lbW9yeSIpOwo+ICsK PiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgbG9uZyBj bG9ja19nZXR0aW1lX2ZhbGxiYWNrKAo+ICsJCQkJCWNsb2NraWRfdCBfY2xraWQsCj4gKwkJCQkJ c3RydWN0IF9fa2VybmVsX3RpbWVzcGVjICpfdHMpCj4gK3sKPiArCXJlZ2lzdGVyIHN0cnVjdCBf X2tlcm5lbF90aW1lc3BlYyAqdHMgYXNtKCJ4MSIpID0gX3RzOwo+ICsJcmVnaXN0ZXIgY2xvY2tp ZF90IGNsa2lkIGFzbSgieDAiKSA9IF9jbGtpZDsKPiArCXJlZ2lzdGVyIGxvbmcgcmV0IGFzbSAo IngwIik7Cj4gKwlyZWdpc3RlciBsb25nIG5yIGFzbSgieDgiKSA9IF9fTlJfY2xvY2tfZ2V0dGlt ZTsKPiArCj4gKwlhc20gdm9sYXRpbGUoCj4gKwkiICAgICAgIHN2YyAjMFxuIgo+ICsJOiAiPXIi IChyZXQpCj4gKwk6ICJyIiAoY2xraWQpLCAiciIgKHRzKSwgInIiIChucikKPiArCTogIm1lbW9y eSIpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBfX2Fsd2F5c19pbmxp bmUgaW50IGNsb2NrX2dldHJlc19mYWxsYmFjaygKPiArCQkJCQljbG9ja2lkX3QgX2Nsa2lkLAo+ ICsJCQkJCXN0cnVjdCBfX2tlcm5lbF90aW1lc3BlYyAqX3RzKQo+ICt7Cj4gKwlyZWdpc3RlciBz dHJ1Y3QgX19rZXJuZWxfdGltZXNwZWMgKnRzIGFzbSgieDEiKSA9IF90czsKPiArCXJlZ2lzdGVy IGNsb2NraWRfdCBjbGtpZCBhc20oIngwIikgPSBfY2xraWQ7Cj4gKwlyZWdpc3RlciBsb25nIHJl dCBhc20gKCJ4MCIpOwo+ICsJcmVnaXN0ZXIgbG9uZyBuciBhc20oIng4IikgPSBfX05SX2Nsb2Nr X2dldHJlczsKPiArCj4gKwlhc20gdm9sYXRpbGUoCj4gKwkiICAgICAgIHN2YyAjMFxuIgo+ICsJ OiAiPXIiIChyZXQpCj4gKwk6ICJyIiAoY2xraWQpLCAiciIgKHRzKSwgInIiIChucikKPiArCTog Im1lbW9yeSIpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBfX2Fsd2F5 c19pbmxpbmUgdTY0IF9fYXJjaF9nZXRfaHdfY291bnRlcihzMzIgY2xvY2tfbW9kZSkKPiArewo+ ICsJdTY0IHJlczsKPiArCj4gKwlhc20gdm9sYXRpbGUoIm1ycyAlMCwgY250dmN0X2VsMCIgOiAi PXIiIChyZXMpIDo6ICJtZW1vcnkiKTsKPiArCj4gKwlyZXR1cm4gcmVzOwo+ICt9Cj4gKwo+ICtz dGF0aWMgX19hbHdheXNfaW5saW5lCj4gK2NvbnN0IHN0cnVjdCB2ZHNvX2RhdGEgKl9fYXJjaF9n ZXRfdmRzb19kYXRhKHZvaWQpCj4gK3sKPiArCXJldHVybiBfdmRzb19kYXRhOwo+ICt9Cj4gKwo+ ICsjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwo+ICsKPiArI2VuZGlmIC8qIF9fQVNNX1ZEU09f R0VUVElNRU9GREFZX0ggKi8KPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS92 ZHNvL3ZzeXNjYWxsLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3Zkc28vdnN5c2NhbGwuaAo+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi4wYzczMWJmYzdjOGMK PiAtLS0gL2Rldi9udWxsCj4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS92ZHNvL3ZzeXNj YWxsLmgKPiBAQCAtMCwwICsxLDUzIEBACj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wICovCj4gKyNpZm5kZWYgX19BU01fVkRTT19WU1lTQ0FMTF9ICj4gKyNkZWZpbmUgX19B U01fVkRTT19WU1lTQ0FMTF9ICj4gKwo+ICsjaWZuZGVmIF9fQVNTRU1CTFlfXwo+ICsKPiArI2lu Y2x1ZGUgPGxpbnV4L3RpbWVrZWVwZXJfaW50ZXJuYWwuaD4KPiArI2luY2x1ZGUgPHZkc28vZGF0 YXBhZ2UuaD4KPiArCj4gKyNkZWZpbmUgVkRTT19QUkVDSVNJT05fTUFTSwl+KDB4RkYwMFVMTDw8 NDgpCj4gKwo+ICtleHRlcm4gc3RydWN0IHZkc29fZGF0YSAqdmRzb19kYXRhOwo+ICsKPiArLyoK PiArICogVXBkYXRlIHRoZSB2RFNPIGRhdGEgcGFnZSB0byBrZWVwIGluIHN5bmMgd2l0aCBrZXJu ZWwgdGltZWtlZXBpbmcuCj4gKyAqLwo+ICtzdGF0aWMgX19hbHdheXNfaW5saW5lCj4gK3N0cnVj dCB2ZHNvX2RhdGEgKl9fYXJtNjRfZ2V0X2tfdmRzb19kYXRhKHZvaWQpCj4gK3sKPiArCXJldHVy biB2ZHNvX2RhdGE7Cj4gK30KPiArI2RlZmluZSBfX2FyY2hfZ2V0X2tfdmRzb19kYXRhIF9fYXJt NjRfZ2V0X2tfdmRzb19kYXRhCj4gKwo+ICtzdGF0aWMgX19hbHdheXNfaW5saW5lCj4gK2ludCBf X2FybTY0X2dldF9jbG9ja19tb2RlKHN0cnVjdCB0aW1la2VlcGVyICp0aykKPiArewo+ICsJdTMy IHVzZV9zeXNjYWxsID0gIXRrLT50a3JfbW9uby5jbG9jay0+YXJjaGRhdGEudmRzb19kaXJlY3Q7 Cj4gKwo+ICsJcmV0dXJuIHVzZV9zeXNjYWxsOwo+ICt9Cj4gKyNkZWZpbmUgX19hcmNoX2dldF9j bG9ja19tb2RlIF9fYXJtNjRfZ2V0X2Nsb2NrX21vZGUKPiArCj4gK3N0YXRpYyBfX2Fsd2F5c19p bmxpbmUKPiAraW50IF9fYXJtNjRfdXNlX3ZzeXNjYWxsKHN0cnVjdCB2ZHNvX2RhdGEgKnZkYXRh KQo+ICt7Cj4gKwlyZXR1cm4gIXZkYXRhW0NTX0hSRVNfQ09BUlNFXS5jbG9ja19tb2RlOwo+ICt9 Cj4gKyNkZWZpbmUgX19hcmNoX3VzZV92c3lzY2FsbCBfX2FybTY0X3VzZV92c3lzY2FsbAo+ICsK PiArc3RhdGljIF9fYWx3YXlzX2lubGluZQo+ICt2b2lkIF9fYXJtNjRfdXBkYXRlX3ZzeXNjYWxs KHN0cnVjdCB2ZHNvX2RhdGEgKnZkYXRhLCBzdHJ1Y3QgdGltZWtlZXBlciAqdGspCj4gK3sKPiAr CXZkYXRhW0NTX0hSRVNfQ09BUlNFXS5tYXNrCT0gVkRTT19QUkVDSVNJT05fTUFTSzsKPiArCXZk YXRhW0NTX1JBV10ubWFzawkJPSBWRFNPX1BSRUNJU0lPTl9NQVNLOwo+ICt9Cj4gKyNkZWZpbmUg X19hcmNoX3VwZGF0ZV92c3lzY2FsbCBfX2FybTY0X3VwZGF0ZV92c3lzY2FsbAo+ICsKPiArLyog VGhlIGFzbS1nZW5lcmljIGhlYWRlciBuZWVkcyB0byBiZSBpbmNsdWRlZCBhZnRlciB0aGUgZGVm aW5pdGlvbnMgYWJvdmUgKi8KPiArI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Zkc28vdnN5c2NhbGwu aD4KPiArCj4gKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCj4gKwo+ICsjZW5kaWYgLyogX19B U01fVkRTT19WU1lTQ0FMTF9IICovCj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9h c20vdmRzb19kYXRhcGFnZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS92ZHNvX2RhdGFwYWdl LmgKPiBkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCBmODkyNjNjOGUxMWEuLjAwMDAw MDAwMDAwMAo+IC0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdmRzb19kYXRhcGFnZS5oCj4g KysrIC9kZXYvbnVsbAo+IEBAIC0xLDQ4ICswLDAgQEAKPiAtLyoKPiAtICogQ29weXJpZ2h0IChD KSAyMDEyIEFSTSBMaW1pdGVkCj4gLSAqCj4gLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gLSAqIGl0IHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFz Cj4gLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+IC0gKgo+ IC0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs IGJlIHVzZWZ1bCwKPiAtICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YKPiAtICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+IC0gKiBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+IC0gKgo+IC0gKiBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQo+IC0gKiBh bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcv bGljZW5zZXMvPi4KPiAtICovCj4gLSNpZm5kZWYgX19BU01fVkRTT19EQVRBUEFHRV9ICj4gLSNk ZWZpbmUgX19BU01fVkRTT19EQVRBUEFHRV9ICj4gLQo+IC0jaWZkZWYgX19LRVJORUxfXwo+IC0K PiAtI2lmbmRlZiBfX0FTU0VNQkxZX18KPiAtCj4gLXN0cnVjdCB2ZHNvX2RhdGEgewo+IC0JX191 NjQgY3NfY3ljbGVfbGFzdDsJLyogVGltZWJhc2UgYXQgY2xvY2tzb3VyY2UgaW5pdCAqLwo+IC0J X191NjQgcmF3X3RpbWVfc2VjOwkvKiBSYXcgdGltZSAqLwo+IC0JX191NjQgcmF3X3RpbWVfbnNl YzsKPiAtCV9fdTY0IHh0aW1lX2Nsb2NrX3NlYzsJLyogS2VybmVsIHRpbWUgKi8KPiAtCV9fdTY0 IHh0aW1lX2Nsb2NrX25zZWM7Cj4gLQlfX3U2NCB4dGltZV9jb2Fyc2Vfc2VjOwkvKiBDb2Fyc2Ug dGltZSAqLwo+IC0JX191NjQgeHRpbWVfY29hcnNlX25zZWM7Cj4gLQlfX3U2NCB3dG1fY2xvY2tf c2VjOwkvKiBXYWxsIHRvIG1vbm90b25pYyB0aW1lICovCj4gLQlfX3U2NCB3dG1fY2xvY2tfbnNl YzsKPiAtCV9fdTMyIHRiX3NlcV9jb3VudDsJLyogVGltZWJhc2Ugc2VxdWVuY2UgY291bnRlciAq Lwo+IC0JLyogY3NfKiBtZW1iZXJzIG11c3QgYmUgYWRqYWNlbnQgYW5kIGluIHRoaXMgb3JkZXIg KGxkcCBhY2Nlc3NlcykgKi8KPiAtCV9fdTMyIGNzX21vbm9fbXVsdDsJLyogTlRQLWFkanVzdGVk IGNsb2Nrc291cmNlIG11bHRpcGxpZXIgKi8KPiAtCV9fdTMyIGNzX3NoaWZ0OwkJLyogQ2xvY2tz b3VyY2Ugc2hpZnQgKG1vbm8gPSByYXcpICovCj4gLQlfX3UzMiBjc19yYXdfbXVsdDsJLyogUmF3 IGNsb2Nrc291cmNlIG11bHRpcGxpZXIgKi8KPiAtCV9fdTMyIHR6X21pbnV0ZXN3ZXN0OwkvKiBX aGFja3kgdGltZXpvbmUgc3R1ZmYgKi8KPiAtCV9fdTMyIHR6X2RzdHRpbWU7Cj4gLQlfX3UzMiB1 c2Vfc3lzY2FsbDsKPiAtCV9fdTMyIGhydGltZXJfcmVzOwo+IC19Owo+IC0KPiAtI2VuZGlmIC8q ICFfX0FTU0VNQkxZX18gKi8KPiAtCj4gLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCj4gLQo+IC0j ZW5kaWYgLyogX19BU01fVkRTT19EQVRBUEFHRV9IICovCj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJt NjQva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9hc20tb2Zmc2V0cy5j Cj4gaW5kZXggOTQ3ZTM5ODk2ZTI4Li45ZTRiN2NjYmFiMmYgMTAwNjQ0Cj4gLS0tIGEvYXJjaC9h cm02NC9rZXJuZWwvYXNtLW9mZnNldHMuYwo+ICsrKyBiL2FyY2gvYXJtNjQva2VybmVsL2FzbS1v ZmZzZXRzLmMKPiBAQCAtMjUsMTMgKzI1LDEzIEBACj4gICAjaW5jbHVkZSA8bGludXgva3ZtX2hv c3QuaD4KPiAgICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+Cj4gICAjaW5jbHVkZSA8bGludXgv c3VzcGVuZC5oPgo+ICsjaW5jbHVkZSA8dmRzby9kYXRhcGFnZS5oPgo+ICAgI2luY2x1ZGUgPGFz bS9jcHVmZWF0dXJlLmg+Cj4gICAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgo+ICAgI2luY2x1ZGUg PGFzbS90aHJlYWRfaW5mby5oPgo+ICAgI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KPiAgICNpbmNs dWRlIDxhc20vc21wX3BsYXQuaD4KPiAgICNpbmNsdWRlIDxhc20vc3VzcGVuZC5oPgo+IC0jaW5j bHVkZSA8YXNtL3Zkc29fZGF0YXBhZ2UuaD4KPiAgICNpbmNsdWRlIDxsaW51eC9rYnVpbGQuaD4K PiAgICNpbmNsdWRlIDxsaW51eC9hcm0tc21jY2MuaD4KPiAgIAo+IEBAIC0xMDAsMTcgKzEwMCwy OCBAQCBpbnQgbWFpbih2b2lkKQo+ICAgICBERUZJTkUoQ0xPQ0tfQ09BUlNFX1JFUywJTE9XX1JF U19OU0VDKTsKPiAgICAgREVGSU5FKE5TRUNfUEVSX1NFQywJCU5TRUNfUEVSX1NFQyk7Cj4gICAg IEJMQU5LKCk7Cj4gLSAgREVGSU5FKFZEU09fQ1NfQ1lDTEVfTEFTVCwJb2Zmc2V0b2Yoc3RydWN0 IHZkc29fZGF0YSwgY3NfY3ljbGVfbGFzdCkpOwo+IC0gIERFRklORShWRFNPX1JBV19USU1FX1NF QywJb2Zmc2V0b2Yoc3RydWN0IHZkc29fZGF0YSwgcmF3X3RpbWVfc2VjKSk7Cj4gLSAgREVGSU5F KFZEU09fWFRJTUVfQ0xLX1NFQywJb2Zmc2V0b2Yoc3RydWN0IHZkc29fZGF0YSwgeHRpbWVfY2xv Y2tfc2VjKSk7Cj4gLSAgREVGSU5FKFZEU09fWFRJTUVfQ1JTX1NFQywJb2Zmc2V0b2Yoc3RydWN0 IHZkc29fZGF0YSwgeHRpbWVfY29hcnNlX3NlYykpOwo+IC0gIERFRklORShWRFNPX1hUSU1FX0NS U19OU0VDLAlvZmZzZXRvZihzdHJ1Y3QgdmRzb19kYXRhLCB4dGltZV9jb2Fyc2VfbnNlYykpOwo+ IC0gIERFRklORShWRFNPX1dUTV9DTEtfU0VDLAlvZmZzZXRvZihzdHJ1Y3QgdmRzb19kYXRhLCB3 dG1fY2xvY2tfc2VjKSk7Cj4gLSAgREVGSU5FKFZEU09fVEJfU0VRX0NPVU5ULAlvZmZzZXRvZihz dHJ1Y3QgdmRzb19kYXRhLCB0Yl9zZXFfY291bnQpKTsKPiAtICBERUZJTkUoVkRTT19DU19NT05P X01VTFQsCW9mZnNldG9mKHN0cnVjdCB2ZHNvX2RhdGEsIGNzX21vbm9fbXVsdCkpOwo+IC0gIERF RklORShWRFNPX0NTX1NISUZULAkJb2Zmc2V0b2Yoc3RydWN0IHZkc29fZGF0YSwgY3Nfc2hpZnQp KTsKPiArICBERUZJTkUoVkRTT19TRVEsCQlvZmZzZXRvZihzdHJ1Y3QgdmRzb19kYXRhLCBzZXEp KTsKPiArICBERUZJTkUoVkRTT19DTEtfTU9ERSwJCW9mZnNldG9mKHN0cnVjdCB2ZHNvX2RhdGEs IGNsb2NrX21vZGUpKTsKPiArICBERUZJTkUoVkRTT19DWUNMRV9MQVNULAlvZmZzZXRvZihzdHJ1 Y3QgdmRzb19kYXRhLCBjeWNsZV9sYXN0KSk7Cj4gKyAgREVGSU5FKFZEU09fTUFTSywJCW9mZnNl dG9mKHN0cnVjdCB2ZHNvX2RhdGEsIG1hc2spKTsKPiArICBERUZJTkUoVkRTT19NVUxULAkJb2Zm c2V0b2Yoc3RydWN0IHZkc29fZGF0YSwgbXVsdCkpOwo+ICsgIERFRklORShWRFNPX1NISUZULAkJ b2Zmc2V0b2Yoc3RydWN0IHZkc29fZGF0YSwgc2hpZnQpKTsKPiArICBERUZJTkUoVkRTT19SRUFM VElNRV9TRUMsCW9mZnNldG9mKHN0cnVjdCB2ZHNvX2RhdGEsIGJhc2V0aW1lW0NMT0NLX1JFQUxU SU1FXS5zZWMpKTsKPiArICBERUZJTkUoVkRTT19SRUFMVElNRV9OU0VDLAlvZmZzZXRvZihzdHJ1 Y3QgdmRzb19kYXRhLCBiYXNldGltZVtDTE9DS19SRUFMVElNRV0ubnNlYykpOwo+ICsgIERFRklO RShWRFNPX01PTk9fU0VDLAkJb2Zmc2V0b2Yoc3RydWN0IHZkc29fZGF0YSwgYmFzZXRpbWVbQ0xP Q0tfTU9OT1RPTklDXS5zZWMpKTsKPiArICBERUZJTkUoVkRTT19NT05PX05TRUMsCW9mZnNldG9m KHN0cnVjdCB2ZHNvX2RhdGEsIGJhc2V0aW1lW0NMT0NLX01PTk9UT05JQ10ubnNlYykpOwo+ICsg IERFRklORShWRFNPX01PTk9fUkFXX1NFQywJb2Zmc2V0b2Yoc3RydWN0IHZkc29fZGF0YSwgYmFz ZXRpbWVbQ0xPQ0tfTU9OT1RPTklDX1JBV10uc2VjKSk7Cj4gKyAgREVGSU5FKFZEU09fTU9OT19S QVdfTlNFQywJb2Zmc2V0b2Yoc3RydWN0IHZkc29fZGF0YSwgYmFzZXRpbWVbQ0xPQ0tfTU9OT1RP TklDX1JBV10ubnNlYykpOwo+ICsgIERFRklORShWRFNPX0JPT1RUSU1FX1NFQywJb2Zmc2V0b2Yo c3RydWN0IHZkc29fZGF0YSwgYmFzZXRpbWVbQ0xPQ0tfQk9PVFRJTUVdLnNlYykpOwo+ICsgIERF RklORShWRFNPX0JPT1RUSU1FX05TRUMsCW9mZnNldG9mKHN0cnVjdCB2ZHNvX2RhdGEsIGJhc2V0 aW1lW0NMT0NLX0JPT1RUSU1FXS5uc2VjKSk7Cj4gKyAgREVGSU5FKFZEU09fVEFJX1NFQywJCW9m ZnNldG9mKHN0cnVjdCB2ZHNvX2RhdGEsIGJhc2V0aW1lW0NMT0NLX1RBSV0uc2VjKSk7Cj4gKyAg REVGSU5FKFZEU09fVEFJX05TRUMsCQlvZmZzZXRvZihzdHJ1Y3QgdmRzb19kYXRhLCBiYXNldGlt ZVtDTE9DS19UQUldLm5zZWMpKTsKPiArICBERUZJTkUoVkRTT19SVF9DT0FSU0VfU0VDLAlvZmZz ZXRvZihzdHJ1Y3QgdmRzb19kYXRhLCBiYXNldGltZVtDTE9DS19SRUFMVElNRV9DT0FSU0VdLnNl YykpOwo+ICsgIERFRklORShWRFNPX1JUX0NPQVJTRV9OU0VDLAlvZmZzZXRvZihzdHJ1Y3QgdmRz b19kYXRhLCBiYXNldGltZVtDTE9DS19SRUFMVElNRV9DT0FSU0VdLm5zZWMpKTsKPiArICBERUZJ TkUoVkRTT19NT05PX0NPQVJTRV9TRUMsCW9mZnNldG9mKHN0cnVjdCB2ZHNvX2RhdGEsIGJhc2V0 aW1lW0NMT0NLX01PTk9UT05JQ19DT0FSU0VdLnNlYykpOwo+ICsgIERFRklORShWRFNPX01PTk9f Q09BUlNFX05TRUMsCW9mZnNldG9mKHN0cnVjdCB2ZHNvX2RhdGEsIGJhc2V0aW1lW0NMT0NLX01P Tk9UT05JQ19DT0FSU0VdLm5zZWMpKTsKPiAgICAgREVGSU5FKFZEU09fVFpfTUlOV0VTVCwJb2Zm c2V0b2Yoc3RydWN0IHZkc29fZGF0YSwgdHpfbWludXRlc3dlc3QpKTsKPiAtICBERUZJTkUoVkRT T19VU0VfU1lTQ0FMTCwJb2Zmc2V0b2Yoc3RydWN0IHZkc29fZGF0YSwgdXNlX3N5c2NhbGwpKTsK PiArICBERUZJTkUoVkRTT19UWl9EU1RUSU1FLAlvZmZzZXRvZihzdHJ1Y3QgdmRzb19kYXRhLCB0 el9kc3R0aW1lKSk7Cj4gICAgIEJMQU5LKCk7Cj4gICAgIERFRklORShUVkFMX1RWX1NFQywJCW9m ZnNldG9mKHN0cnVjdCB0aW1ldmFsLCB0dl9zZWMpKTsKPiAgICAgREVGSU5FKFRTUEVDX1RWX1NF QywJCW9mZnNldG9mKHN0cnVjdCB0aW1lc3BlYywgdHZfc2VjKSk7Cj4gZGlmZiAtLWdpdCBhL2Fy Y2gvYXJtNjQva2VybmVsL3Zkc28uYyBiL2FyY2gvYXJtNjQva2VybmVsL3Zkc28uYwo+IGluZGV4 IDgwNzRjYmQzYTNhOC4uMjNjMzgzMDNhNTJhIDEwMDY0NAo+IC0tLSBhL2FyY2gvYXJtNjQva2Vy bmVsL3Zkc28uYwo+ICsrKyBiL2FyY2gvYXJtNjQva2VybmVsL3Zkc28uYwo+IEBAIC0zMSwxMSAr MzEsMTMgQEAKPiAgICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4gICAjaW5jbHVkZSA8bGludXgv dGltZWtlZXBlcl9pbnRlcm5hbC5oPgo+ICAgI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KPiAr I2luY2x1ZGUgPHZkc28vZGF0YXBhZ2UuaD4KPiArI2luY2x1ZGUgPHZkc28vaGVscGVycy5oPgo+ ICsjaW5jbHVkZSA8dmRzby92c3lzY2FsbC5oPgo+ICAgCj4gICAjaW5jbHVkZSA8YXNtL2NhY2hl Zmx1c2guaD4KPiAgICNpbmNsdWRlIDxhc20vc2lnbmFsMzIuaD4KPiAgICNpbmNsdWRlIDxhc20v dmRzby5oPgo+IC0jaW5jbHVkZSA8YXNtL3Zkc29fZGF0YXBhZ2UuaD4KPiAgIAo+ICAgZXh0ZXJu IGNoYXIgdmRzb19zdGFydFtdLCB2ZHNvX2VuZFtdOwo+ICAgc3RhdGljIHVuc2lnbmVkIGxvbmcg dmRzb19wYWdlcyBfX3JvX2FmdGVyX2luaXQ7Cj4gQEAgLTQ0LDEwICs0NiwxMCBAQCBzdGF0aWMg dW5zaWduZWQgbG9uZyB2ZHNvX3BhZ2VzIF9fcm9fYWZ0ZXJfaW5pdDsKPiAgICAqIFRoZSB2RFNP IGRhdGEgcGFnZS4KPiAgICAqLwo+ICAgc3RhdGljIHVuaW9uIHsKPiAtCXN0cnVjdCB2ZHNvX2Rh dGEJZGF0YTsKPiArCXN0cnVjdCB2ZHNvX2RhdGEJZGF0YVtDU19CQVNFU107Cj4gICAJdTgJCQlw YWdlW1BBR0VfU0laRV07Cj4gICB9IHZkc29fZGF0YV9zdG9yZSBfX3BhZ2VfYWxpZ25lZF9kYXRh Owo+IC1zdHJ1Y3QgdmRzb19kYXRhICp2ZHNvX2RhdGEgPSAmdmRzb19kYXRhX3N0b3JlLmRhdGE7 Cj4gK3N0cnVjdCB2ZHNvX2RhdGEgKnZkc29fZGF0YSA9IHZkc29fZGF0YV9zdG9yZS5kYXRhOwo+ ICAgCj4gICAjaWZkZWYgQ09ORklHX0NPTVBBVAo+ICAgLyoKPiBAQCAtMjgwLDQ2ICsyODIsMyBA QCBpbnQgYXJjaF9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJw cm0sCj4gICAJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7Cj4gICAJcmV0dXJuIFBUUl9FUlIocmV0 KTsKPiAgIH0KPiAtCj4gLS8qCj4gLSAqIFVwZGF0ZSB0aGUgdkRTTyBkYXRhIHBhZ2UgdG8ga2Vl cCBpbiBzeW5jIHdpdGgga2VybmVsIHRpbWVrZWVwaW5nLgo+IC0gKi8KPiAtdm9pZCB1cGRhdGVf dnN5c2NhbGwoc3RydWN0IHRpbWVrZWVwZXIgKnRrKQo+IC17Cj4gLQl1MzIgdXNlX3N5c2NhbGwg PSAhdGstPnRrcl9tb25vLmNsb2NrLT5hcmNoZGF0YS52ZHNvX2RpcmVjdDsKPiAtCj4gLQkrK3Zk c29fZGF0YS0+dGJfc2VxX2NvdW50Owo+IC0Jc21wX3dtYigpOwo+IC0KPiAtCXZkc29fZGF0YS0+ dXNlX3N5c2NhbGwJCQk9IHVzZV9zeXNjYWxsOwo+IC0JdmRzb19kYXRhLT54dGltZV9jb2Fyc2Vf c2VjCQk9IHRrLT54dGltZV9zZWM7Cj4gLQl2ZHNvX2RhdGEtPnh0aW1lX2NvYXJzZV9uc2VjCQk9 IHRrLT50a3JfbW9uby54dGltZV9uc2VjID4+Cj4gLQkJCQkJCQl0ay0+dGtyX21vbm8uc2hpZnQ7 Cj4gLQl2ZHNvX2RhdGEtPnd0bV9jbG9ja19zZWMJCT0gdGstPndhbGxfdG9fbW9ub3RvbmljLnR2 X3NlYzsKPiAtCXZkc29fZGF0YS0+d3RtX2Nsb2NrX25zZWMJCT0gdGstPndhbGxfdG9fbW9ub3Rv bmljLnR2X25zZWM7Cj4gLQo+IC0JLyogUmVhZCB3aXRob3V0IHRoZSBzZXFsb2NrIGhlbGQgYnkg Y2xvY2tfZ2V0cmVzKCkgKi8KPiAtCVdSSVRFX09OQ0UodmRzb19kYXRhLT5ocnRpbWVyX3Jlcywg aHJ0aW1lcl9yZXNvbHV0aW9uKTsKPiAtCj4gLQlpZiAoIXVzZV9zeXNjYWxsKSB7Cj4gLQkJLyog dGtyX21vbm8uY3ljbGVfbGFzdCA9PSB0a3JfcmF3LmN5Y2xlX2xhc3QgKi8KPiAtCQl2ZHNvX2Rh dGEtPmNzX2N5Y2xlX2xhc3QJPSB0ay0+dGtyX21vbm8uY3ljbGVfbGFzdDsKPiAtCQl2ZHNvX2Rh dGEtPnJhd190aW1lX3NlYyAgICAgICAgID0gdGstPnJhd19zZWM7Cj4gLQkJdmRzb19kYXRhLT5y YXdfdGltZV9uc2VjICAgICAgICA9IHRrLT50a3JfcmF3Lnh0aW1lX25zZWM7Cj4gLQkJdmRzb19k YXRhLT54dGltZV9jbG9ja19zZWMJPSB0ay0+eHRpbWVfc2VjOwo+IC0JCXZkc29fZGF0YS0+eHRp bWVfY2xvY2tfbnNlYwk9IHRrLT50a3JfbW9uby54dGltZV9uc2VjOwo+IC0JCXZkc29fZGF0YS0+ Y3NfbW9ub19tdWx0CQk9IHRrLT50a3JfbW9uby5tdWx0Owo+IC0JCXZkc29fZGF0YS0+Y3NfcmF3 X211bHQJCT0gdGstPnRrcl9yYXcubXVsdDsKPiAtCQkvKiB0a3JfbW9uby5zaGlmdCA9PSB0a3Jf cmF3LnNoaWZ0ICovCj4gLQkJdmRzb19kYXRhLT5jc19zaGlmdAkJPSB0ay0+dGtyX21vbm8uc2hp ZnQ7Cj4gLQl9Cj4gLQo+IC0Jc21wX3dtYigpOwo+IC0JKyt2ZHNvX2RhdGEtPnRiX3NlcV9jb3Vu dDsKPiAtfQo+IC0KPiAtdm9pZCB1cGRhdGVfdnN5c2NhbGxfdHoodm9pZCkKPiAtewo+IC0JdmRz b19kYXRhLT50el9taW51dGVzd2VzdAk9IHN5c190ei50el9taW51dGVzd2VzdDsKPiAtCXZkc29f ZGF0YS0+dHpfZHN0dGltZQkJPSBzeXNfdHoudHpfZHN0dGltZTsKPiAtfQo+IGRpZmYgLS1naXQg YS9hcmNoL2FybTY0L2tlcm5lbC92ZHNvL01ha2VmaWxlIGIvYXJjaC9hcm02NC9rZXJuZWwvdmRz by9NYWtlZmlsZQo+IGluZGV4IGZhMjMwZmYwOWFhMS4uM2FjZmM4MTNlOTY2IDEwMDY0NAo+IC0t LSBhL2FyY2gvYXJtNjQva2VybmVsL3Zkc28vTWFrZWZpbGUKPiArKysgYi9hcmNoL2FybTY0L2tl cm5lbC92ZHNvL01ha2VmaWxlCj4gQEAgLTYsNyArNiwxMiBAQAo+ICAgIyBIZWF2aWx5IGJhc2Vk IG9uIHRoZSB2RFNPIE1ha2VmaWxlcyBmb3Igb3RoZXIgYXJjaHMuCj4gICAjCj4gICAKPiAtb2Jq LXZkc28gOj0gZ2V0dGltZW9mZGF5Lm8gbm90ZS5vIHNpZ3JldHVybi5vCj4gKyMgQWJzb2x1dGUg cmVsb2NhdGlvbiB0eXBlICQoQVJDSF9SRUxfVFlQRV9BQlMpIG5lZWRzIHRvIGJlIGRlZmluZWQg YmVmb3JlCj4gKyMgdGhlIGluY2x1c2lvbiBvZiBnZW5lcmljIE1ha2VmaWxlLgo+ICtBUkNIX1JF TF9UWVBFX0FCUyA6PSBSX0FBUkNINjRfSlVNUF9TTE9UfFJfQUFSQ0g2NF9HTE9CX0RBVHxSX0FB UkNINjRfQUJTNjQKPiAraW5jbHVkZSAkKHNyY3RyZWUpL2xpYi92ZHNvL01ha2VmaWxlCj4gKwo+ ICtvYmotdmRzbyA6PSB2Z2V0dGltZW9mZGF5Lm8gbm90ZS5vIHNpZ3JldHVybi5vCj4gICAKPiAg ICMgQnVpbGQgcnVsZXMKPiAgIHRhcmdldHMgOj0gJChvYmotdmRzbykgdmRzby5zbyB2ZHNvLnNv LmRiZwo+IEBAIC0xNSw2ICsyMCwyNCBAQCBvYmotdmRzbyA6PSAkKGFkZHByZWZpeCAkKG9iaikv LCAkKG9iai12ZHNvKSkKPiAgIGxkZmxhZ3MteSA6PSAtc2hhcmVkIC1ub3N0ZGxpYiAtc29uYW1l PWxpbnV4LXZkc28uc28uMSAtLWhhc2gtc3R5bGU9c3lzdiBcCj4gICAJCS0tYnVpbGQtaWQgLW4g LVQKPiAgIAo+ICtjY2ZsYWdzLXkgOj0gLWZuby1jb21tb24gLWZuby1idWlsdGluIC1mbm8tc3Rh Y2stcHJvdGVjdG9yCj4gK2NjZmxhZ3MteSArPSAtRERJU0FCTEVfQlJBTkNIX1BST0ZJTElORwo+ ICsKPiArVkRTT19MREZMQUdTIDo9IC1Cc3ltYm9saWMKPiArCj4gK0NGTEFHU19SRU1PVkVfdmdl dHRpbWVvZmRheS5vID0gJChDQ19GTEFHU19GVFJBQ0UpIC1Pcwo+ICtLQlVJTERfQ0ZMQUdTCQkJ Kz0gJChESVNBQkxFX0xUTykKPiArS0FTQU5fU0FOSVRJWkUJCQk6PSBuCj4gK1VCU0FOX1NBTklU SVpFCQkJOj0gbgo+ICtPQkpFQ1RfRklMRVNfTk9OX1NUQU5EQVJECTo9IHkKPiArS0NPVl9JTlNU UlVNRU5UCQkJOj0gbgo+ICsKPiAraWZlcSAoJChjLWdldHRpbWVvZmRheS15KSwpCj4gK0NGTEFH U192Z2V0dGltZW9mZGF5Lm8gPSAtTzIgLW1jbW9kZWw9dGlueQo+ICtlbHNlCj4gK0NGTEFHU192 Z2V0dGltZW9mZGF5Lm8gPSAtTzIgLW1jbW9kZWw9dGlueSAtaW5jbHVkZSAkKGMtZ2V0dGltZW9m ZGF5LXkpCj4gK2VuZGlmCj4gKwo+ICAgIyBEaXNhYmxlIGdjb3YgcHJvZmlsaW5nIGZvciBWRFNP IGNvZGUKPiAgIEdDT1ZfUFJPRklMRSA6PSBuCj4gICAKPiBAQCAtMjgsNiArNTEsNyBAQCAkKG9i aikvdmRzby5vIDogJChvYmopL3Zkc28uc28KPiAgICMgTGluayBydWxlIGZvciB0aGUgLnNvIGZp bGUsIC5sZHMgaGFzIHRvIGJlIGZpcnN0Cj4gICAkKG9iaikvdmRzby5zby5kYmc6ICQob2JqKS92 ZHNvLmxkcyAkKG9iai12ZHNvKSBGT1JDRQo+ICAgCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQo+ICsJ JChjYWxsIGlmX2NoYW5nZWQsdmRzb19jaGVjaykKPiAgIAo+ICAgIyBTdHJpcCBydWxlIGZvciB0 aGUgLnNvIGZpbGUKPiAgICQob2JqKS8lLnNvOiBPQkpDT1BZRkxBR1MgOj0gLVMKPiBAQCAtNDIs MTMgKzY2LDkgQEAgcXVpZXRfY21kX3Zkc29zeW0gPSBWRFNPU1lNICRACj4gICBpbmNsdWRlL2dl bmVyYXRlZC92ZHNvLW9mZnNldHMuaDogJChvYmopL3Zkc28uc28uZGJnIEZPUkNFCj4gICAJJChj YWxsIGlmX2NoYW5nZWQsdmRzb3N5bSkKPiAgIAo+IC0jIEFzc2VtYmx5IHJ1bGVzIGZvciB0aGUg LlMgZmlsZXMKPiAtJChvYmotdmRzbyk6ICUubzogJS5TIEZPUkNFCj4gLQkkKGNhbGwgaWZfY2hh bmdlZF9kZXAsdmRzb2FzKQo+IC0KPiAgICMgQWN0dWFsIGJ1aWxkIGNvbW1hbmRzCj4gLXF1aWV0 X2NtZF92ZHNvYXMgPSBWRFNPQSAgICRACj4gLSAgICAgIGNtZF92ZHNvYXMgPSAkKENDKSAkKGFf ZmxhZ3MpIC1jIC1vICRAICQ8Cj4gK3F1aWV0X2NtZF92ZHNvY2MgPSBWRFNPQ0MgICAkQAo+ICsg ICAgICBjbWRfdmRzb2NjID0gJChDQykgJChhX2ZsYWdzKSAkKGNfZmxhZ3MpIC1jIC1vICRAICQ8 Cj4gICAKPiAgICMgSW5zdGFsbCBjb21tYW5kcyBmb3IgdGhlIHVuc3RyaXBwZWQgZmlsZQo+ICAg cXVpZXRfY21kX3Zkc29faW5zdGFsbCA9IElOU1RBTEwgJEAKPiBkaWZmIC0tZ2l0IGEvYXJjaC9h cm02NC9rZXJuZWwvdmRzby9nZXR0aW1lb2ZkYXkuUyBiL2FyY2gvYXJtNjQva2VybmVsL3Zkc28v Z2V0dGltZW9mZGF5LlMKPiBkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCA4NTZmZWU2 ZDM1MTIuLjAwMDAwMDAwMDAwMAo+IC0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3Zkc28vZ2V0dGlt ZW9mZGF5LlMKPiArKysgL2Rldi9udWxsCj4gQEAgLTEsMzM0ICswLDAgQEAKPiAtLyoKPiAtICog VXNlcnNwYWNlIGltcGxlbWVudGF0aW9ucyBvZiBnZXR0aW1lb2ZkYXkoKSBhbmQgZnJpZW5kcy4K PiAtICoKPiAtICogQ29weXJpZ2h0IChDKSAyMDEyIEFSTSBMaW1pdGVkCj4gLSAqCj4gLSAqIFRo aXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5Cj4gLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCj4gLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uLgo+IC0gKgo+IC0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQg aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPiAtICogYnV0IFdJVEhPVVQgQU5Z IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKPiAtICogTUVS Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo ZQo+IC0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+IC0g Kgo+IC0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQo+IC0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwg c2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KPiAtICoKPiAtICogQXV0aG9yOiBX aWxsIERlYWNvbiA8d2lsbC5kZWFjb25AYXJtLmNvbT4KPiAtICovCj4gLQo+IC0jaW5jbHVkZSA8 bGludXgvbGlua2FnZS5oPgo+IC0jaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Cj4gLSNpbmNs dWRlIDxhc20vdW5pc3RkLmg+Cj4gLQo+IC0jZGVmaW5lIE5TRUNfUEVSX1NFQ19MTzE2CTB4Y2Ew MAo+IC0jZGVmaW5lIE5TRUNfUEVSX1NFQ19ISTE2CTB4M2I5YQo+IC0KPiAtdmRzb19kYXRhCS5y ZXEJeDYKPiAtc2VxY250CQkucmVxCXc3Cj4gLXdfdG1wCQkucmVxCXc4Cj4gLXhfdG1wCQkucmVx CXg4Cj4gLQo+IC0vKgo+IC0gKiBDb252ZW50aW9ucyBmb3IgbWFjcm8gYXJndW1lbnRzOgo+IC0g KiAtIEFuIGFyZ3VtZW50IGlzIHdyaXRlLW9ubHkgaWYgaXRzIG5hbWUgc3RhcnRzIHdpdGggInJl cyIuCj4gLSAqIC0gQWxsIG90aGVyIGFyZ3VtZW50cyBhcmUgcmVhZC1vbmx5LCB1bmxlc3Mgb3Ro ZXJ3aXNlIHNwZWNpZmllZC4KPiAtICovCj4gLQo+IC0JLm1hY3JvCXNlcWNudF9hY3F1aXJlCj4g LTk5OTk6CWxkcglzZXFjbnQsIFt2ZHNvX2RhdGEsICNWRFNPX1RCX1NFUV9DT1VOVF0KPiAtCXRi bnoJc2VxY250LCAjMCwgOTk5OWIKPiAtCWRtYglpc2hsZAo+IC0JLmVuZG0KPiAtCj4gLQkubWFj cm8Jc2VxY250X2NoZWNrIGZhaWwKPiAtCWRtYglpc2hsZAo+IC0JbGRyCXdfdG1wLCBbdmRzb19k YXRhLCAjVkRTT19UQl9TRVFfQ09VTlRdCj4gLQljbXAJd190bXAsIHNlcWNudAo+IC0JYi5uZQlc ZmFpbAo+IC0JLmVuZG0KPiAtCj4gLQkubWFjcm8Jc3lzY2FsbF9jaGVjayBmYWlsCj4gLQlsZHIJ d190bXAsIFt2ZHNvX2RhdGEsICNWRFNPX1VTRV9TWVNDQUxMXQo+IC0JY2Juegl3X3RtcCwgXGZh aWwKPiAtCS5lbmRtCj4gLQo+IC0JLm1hY3JvIGdldF9uc2VjX3Blcl9zZWMgcmVzCj4gLQltb3YJ XHJlcywgI05TRUNfUEVSX1NFQ19MTzE2Cj4gLQltb3ZrCVxyZXMsICNOU0VDX1BFUl9TRUNfSEkx NiwgbHNsICMxNgo+IC0JLmVuZG0KPiAtCj4gLQkvKgo+IC0JICogUmV0dXJucyB0aGUgY2xvY2sg ZGVsdGEsIGluIG5hbm9zZWNvbmRzIGxlZnQtc2hpZnRlZCBieSB0aGUgY2xvY2sKPiAtCSAqIHNo aWZ0Lgo+IC0JICovCj4gLQkubWFjcm8JZ2V0X2Nsb2NrX3NoaWZ0ZWRfbnNlYyByZXMsIGN5Y2xl X2xhc3QsIG11bHQKPiAtCS8qIFJlYWQgdGhlIHZpcnR1YWwgY291bnRlci4gKi8KPiAtCWlzYgo+ IC0JbXJzCXhfdG1wLCBjbnR2Y3RfZWwwCj4gLQkvKiBDYWxjdWxhdGUgY3ljbGUgZGVsdGEgYW5k IGNvbnZlcnQgdG8gbnMuICovCj4gLQlzdWIJXHJlcywgeF90bXAsIFxjeWNsZV9sYXN0Cj4gLQkv KiBXZSBjYW4gb25seSBndWFyYW50ZWUgNTYgYml0cyBvZiBwcmVjaXNpb24uICovCj4gLQltb3Zu CXhfdG1wLCAjMHhmZjAwLCBsc2wgIzQ4Cj4gLQlhbmQJXHJlcywgeF90bXAsIFxyZXMKPiAtCW11 bAlccmVzLCBccmVzLCBcbXVsdAo+IC0JLyoKPiAtCSAqIEZha2UgYWRkcmVzcyBkZXBlbmRlbmN5 IGZyb20gdGhlIHZhbHVlIGNvbXB1dGVkIGZyb20gdGhlIGNvdW50ZXIKPiAtCSAqIHJlZ2lzdGVy IHRvIHN1YnNlcXVlbnQgZGF0YSBwYWdlIGFjY2Vzc2VzIHNvIHRoYXQgdGhlIHNlcXVlbmNlCj4g LQkgKiBsb2NraW5nIGFsc28gb3JkZXJzIHRoZSByZWFkIG9mIHRoZSBjb3VudGVyLgo+IC0JICov Cj4gLQlhbmQJeF90bXAsIFxyZXMsIHh6cgo+IC0JYWRkCXZkc29fZGF0YSwgdmRzb19kYXRhLCB4 X3RtcAo+IC0JLmVuZG0KPiAtCj4gLQkvKgo+IC0JICogUmV0dXJucyBpbiByZXNfe3NlYyxuc2Vj fSB0aGUgUkVBTFRJTUUgdGltZXNwZWMsIGJhc2VkIG9uIHRoZQo+IC0JICogIndhbGwgdGltZSIg KHh0aW1lKSBhbmQgdGhlIGNsb2NrX21vbm8gZGVsdGEuCj4gLQkgKi8KPiAtCS5tYWNybwlnZXRf dHNfcmVhbHRpbWUgcmVzX3NlYywgcmVzX25zZWMsIFwKPiAtCQkJY2xvY2tfbnNlYywgeHRpbWVf c2VjLCB4dGltZV9uc2VjLCBuc2VjX3RvX3NlYwo+IC0JYWRkCVxyZXNfbnNlYywgXGNsb2NrX25z ZWMsIFx4dGltZV9uc2VjCj4gLQl1ZGl2CXhfdG1wLCBccmVzX25zZWMsIFxuc2VjX3RvX3NlYwo+ IC0JYWRkCVxyZXNfc2VjLCBceHRpbWVfc2VjLCB4X3RtcAo+IC0JbXN1YglccmVzX25zZWMsIHhf dG1wLCBcbnNlY190b19zZWMsIFxyZXNfbnNlYwo+IC0JLmVuZG0KPiAtCj4gLQkvKgo+IC0JICog UmV0dXJucyBpbiByZXNfe3NlYyxuc2VjfSB0aGUgdGltZXNwZWMgYmFzZWQgb24gdGhlIGNsb2Nr X3JhdyBkZWx0YSwKPiAtCSAqIHVzZWQgZm9yIENMT0NLX01PTk9UT05JQ19SQVcuCj4gLQkgKi8K PiAtCS5tYWNybwlnZXRfdHNfY2xvY2tfcmF3IHJlc19zZWMsIHJlc19uc2VjLCBjbG9ja19uc2Vj LCBuc2VjX3RvX3NlYwo+IC0JdWRpdglccmVzX3NlYywgXGNsb2NrX25zZWMsIFxuc2VjX3RvX3Nl Ywo+IC0JbXN1YglccmVzX25zZWMsIFxyZXNfc2VjLCBcbnNlY190b19zZWMsIFxjbG9ja19uc2Vj Cj4gLQkuZW5kbQo+IC0KPiAtCS8qIHNlYyBhbmQgbnNlYyBhcmUgbW9kaWZpZWQgaW4gcGxhY2Uu ICovCj4gLQkubWFjcm8gYWRkX3RzIHNlYywgbnNlYywgdHNfc2VjLCB0c19uc2VjLCBuc2VjX3Rv X3NlYwo+IC0JLyogQWRkIHRpbWVzcGVjLiAqLwo+IC0JYWRkCVxzZWMsIFxzZWMsIFx0c19zZWMK PiAtCWFkZAlcbnNlYywgXG5zZWMsIFx0c19uc2VjCj4gLQo+IC0JLyogTm9ybWFsaXNlIHRoZSBu ZXcgdGltZXNwZWMuICovCj4gLQljbXAJXG5zZWMsIFxuc2VjX3RvX3NlYwo+IC0JYi5sdAk5OTk5 Zgo+IC0Jc3ViCVxuc2VjLCBcbnNlYywgXG5zZWNfdG9fc2VjCj4gLQlhZGQJXHNlYywgXHNlYywg IzEKPiAtOTk5OToKPiAtCWNtcAlcbnNlYywgIzAKPiAtCWIuZ2UJOTk5OGYKPiAtCWFkZAlcbnNl YywgXG5zZWMsIFxuc2VjX3RvX3NlYwo+IC0Jc3ViCVxzZWMsIFxzZWMsICMxCj4gLTk5OTg6Cj4g LQkuZW5kbQo+IC0KPiAtCS5tYWNybyBjbG9ja19nZXR0aW1lX3JldHVybiwgc2hpZnQ9MAo+IC0J LmlmIFxzaGlmdCA9PSAxCj4gLQlsc3IJeDExLCB4MTEsIHgxMgo+IC0JLmVuZGlmCj4gLQlzdHAJ eDEwLCB4MTEsIFt4MSwgI1RTUEVDX1RWX1NFQ10KPiAtCW1vdgl4MCwgeHpyCj4gLQlyZXQKPiAt CS5lbmRtCj4gLQo+IC0JLm1hY3JvIGp1bXBfc2xvdCBqdW1wdGFibGUsIGluZGV4LCBsYWJlbAo+ IC0JLmlmICguIC0gXGp1bXB0YWJsZSkgIT0gNCAqIChcaW5kZXgpCj4gLQkuZXJyb3IgIkp1bXAg c2xvdCBpbmRleCBtaXNtYXRjaCIKPiAtCS5lbmRpZgo+IC0JYglcbGFiZWwKPiAtCS5lbmRtCj4g LQo+IC0JLnRleHQKPiAtCj4gLS8qIGludCBfX2tlcm5lbF9nZXR0aW1lb2ZkYXkoc3RydWN0IHRp bWV2YWwgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgKnR6KTsgKi8KPiAtRU5UUlkoX19rZXJuZWxfZ2V0 dGltZW9mZGF5KQo+IC0JLmNmaV9zdGFydHByb2MKPiAtCWFkcgl2ZHNvX2RhdGEsIF92ZHNvX2Rh dGEKPiAtCS8qIElmIHR2IGlzIE5VTEwsIHNraXAgdG8gdGhlIHRpbWV6b25lIGNvZGUuICovCj4g LQljYnoJeDAsIDJmCj4gLQo+IC0JLyogQ29tcHV0ZSB0aGUgdGltZSBvZiBkYXkuICovCj4gLTE6 CXNlcWNudF9hY3F1aXJlCj4gLQlzeXNjYWxsX2NoZWNrIGZhaWw9NGYKPiAtCWxkcgl4MTAsIFt2 ZHNvX2RhdGEsICNWRFNPX0NTX0NZQ0xFX0xBU1RdCj4gLQkvKiB3MTEgPSBjc19tb25vX211bHQs IHcxMiA9IGNzX3NoaWZ0ICovCj4gLQlsZHAJdzExLCB3MTIsIFt2ZHNvX2RhdGEsICNWRFNPX0NT X01PTk9fTVVMVF0KPiAtCWxkcAl4MTMsIHgxNCwgW3Zkc29fZGF0YSwgI1ZEU09fWFRJTUVfQ0xL X1NFQ10KPiAtCj4gLQlnZXRfbnNlY19wZXJfc2VjIHJlcz14OQo+IC0JbHNsCXg5LCB4OSwgeDEy Cj4gLQo+IC0JZ2V0X2Nsb2NrX3NoaWZ0ZWRfbnNlYyByZXM9eDE1LCBjeWNsZV9sYXN0PXgxMCwg bXVsdD14MTEKPiAtCXNlcWNudF9jaGVjayBmYWlsPTFiCj4gLQlnZXRfdHNfcmVhbHRpbWUgcmVz X3NlYz14MTAsIHJlc19uc2VjPXgxMSwgXAo+IC0JCWNsb2NrX25zZWM9eDE1LCB4dGltZV9zZWM9 eDEzLCB4dGltZV9uc2VjPXgxNCwgbnNlY190b19zZWM9eDkKPiAtCj4gLQkvKiBDb252ZXJ0IG5z IHRvIHVzLiAqLwo+IC0JbW92CXgxMywgIzEwMDAKPiAtCWxzbAl4MTMsIHgxMywgeDEyCj4gLQl1 ZGl2CXgxMSwgeDExLCB4MTMKPiAtCXN0cAl4MTAsIHgxMSwgW3gwLCAjVFZBTF9UVl9TRUNdCj4g LTI6Cj4gLQkvKiBJZiB0eiBpcyBOVUxMLCByZXR1cm4gMC4gKi8KPiAtCWNiegl4MSwgM2YKPiAt CWxkcAl3NCwgdzUsIFt2ZHNvX2RhdGEsICNWRFNPX1RaX01JTldFU1RdCj4gLQlzdHAJdzQsIHc1 LCBbeDEsICNUWl9NSU5XRVNUXQo+IC0zOgo+IC0JbW92CXgwLCB4enIKPiAtCXJldAo+IC00Ogo+ IC0JLyogU3lzY2FsbCBmYWxsYmFjay4gKi8KPiAtCW1vdgl4OCwgI19fTlJfZ2V0dGltZW9mZGF5 Cj4gLQlzdmMJIzAKPiAtCXJldAo+IC0JLmNmaV9lbmRwcm9jCj4gLUVORFBST0MoX19rZXJuZWxf Z2V0dGltZW9mZGF5KQo+IC0KPiAtI2RlZmluZSBKVU1QU0xPVF9NQVggQ0xPQ0tfTU9OT1RPTklD X0NPQVJTRQo+IC0KPiAtLyogaW50IF9fa2VybmVsX2Nsb2NrX2dldHRpbWUoY2xvY2tpZF90IGNs b2NrX2lkLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKTsgKi8KPiAtRU5UUlkoX19rZXJuZWxfY2xvY2tf Z2V0dGltZSkKPiAtCS5jZmlfc3RhcnRwcm9jCj4gLQljbXAJdzAsICNKVU1QU0xPVF9NQVgKPiAt CWIuaGkJc3lzY2FsbAo+IC0JYWRyCXZkc29fZGF0YSwgX3Zkc29fZGF0YQo+IC0JYWRyCXhfdG1w LCBqdW1wdGFibGUKPiAtCWFkZAl4X3RtcCwgeF90bXAsIHcwLCB1eHR3ICMyCj4gLQlicgl4X3Rt cAo+IC0KPiAtCUFMSUdOCj4gLWp1bXB0YWJsZToKPiAtCWp1bXBfc2xvdCBqdW1wdGFibGUsIENM T0NLX1JFQUxUSU1FLCByZWFsdGltZQo+IC0JanVtcF9zbG90IGp1bXB0YWJsZSwgQ0xPQ0tfTU9O T1RPTklDLCBtb25vdG9uaWMKPiAtCWIJc3lzY2FsbAo+IC0JYglzeXNjYWxsCj4gLQlqdW1wX3Ns b3QganVtcHRhYmxlLCBDTE9DS19NT05PVE9OSUNfUkFXLCBtb25vdG9uaWNfcmF3Cj4gLQlqdW1w X3Nsb3QganVtcHRhYmxlLCBDTE9DS19SRUFMVElNRV9DT0FSU0UsIHJlYWx0aW1lX2NvYXJzZQo+ IC0JanVtcF9zbG90IGp1bXB0YWJsZSwgQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRSwgbW9ub3Rvbmlj X2NvYXJzZQo+IC0KPiAtCS5pZiAoLiAtIGp1bXB0YWJsZSkgIT0gNCAqIChKVU1QU0xPVF9NQVgg KyAxKQo+IC0JLmVycm9yCSJXcm9uZyBqdW1wdGFibGUgc2l6ZSIKPiAtCS5lbmRpZgo+IC0KPiAt CUFMSUdOCj4gLXJlYWx0aW1lOgo+IC0Jc2VxY250X2FjcXVpcmUKPiAtCXN5c2NhbGxfY2hlY2sg ZmFpbD1zeXNjYWxsCj4gLQlsZHIJeDEwLCBbdmRzb19kYXRhLCAjVkRTT19DU19DWUNMRV9MQVNU XQo+IC0JLyogdzExID0gY3NfbW9ub19tdWx0LCB3MTIgPSBjc19zaGlmdCAqLwo+IC0JbGRwCXcx MSwgdzEyLCBbdmRzb19kYXRhLCAjVkRTT19DU19NT05PX01VTFRdCj4gLQlsZHAJeDEzLCB4MTQs IFt2ZHNvX2RhdGEsICNWRFNPX1hUSU1FX0NMS19TRUNdCj4gLQo+IC0JLyogQWxsIGNvbXB1dGF0 aW9ucyBhcmUgZG9uZSB3aXRoIGxlZnQtc2hpZnRlZCBuc2Vjcy4gKi8KPiAtCWdldF9uc2VjX3Bl cl9zZWMgcmVzPXg5Cj4gLQlsc2wJeDksIHg5LCB4MTIKPiAtCj4gLQlnZXRfY2xvY2tfc2hpZnRl ZF9uc2VjIHJlcz14MTUsIGN5Y2xlX2xhc3Q9eDEwLCBtdWx0PXgxMQo+IC0Jc2VxY250X2NoZWNr IGZhaWw9cmVhbHRpbWUKPiAtCWdldF90c19yZWFsdGltZSByZXNfc2VjPXgxMCwgcmVzX25zZWM9 eDExLCBcCj4gLQkJY2xvY2tfbnNlYz14MTUsIHh0aW1lX3NlYz14MTMsIHh0aW1lX25zZWM9eDE0 LCBuc2VjX3RvX3NlYz14OQo+IC0JY2xvY2tfZ2V0dGltZV9yZXR1cm4sIHNoaWZ0PTEKPiAtCj4g LQlBTElHTgo+IC1tb25vdG9uaWM6Cj4gLQlzZXFjbnRfYWNxdWlyZQo+IC0Jc3lzY2FsbF9jaGVj ayBmYWlsPXN5c2NhbGwKPiAtCWxkcgl4MTAsIFt2ZHNvX2RhdGEsICNWRFNPX0NTX0NZQ0xFX0xB U1RdCj4gLQkvKiB3MTEgPSBjc19tb25vX211bHQsIHcxMiA9IGNzX3NoaWZ0ICovCj4gLQlsZHAJ dzExLCB3MTIsIFt2ZHNvX2RhdGEsICNWRFNPX0NTX01PTk9fTVVMVF0KPiAtCWxkcAl4MTMsIHgx NCwgW3Zkc29fZGF0YSwgI1ZEU09fWFRJTUVfQ0xLX1NFQ10KPiAtCWxkcAl4MywgeDQsIFt2ZHNv X2RhdGEsICNWRFNPX1dUTV9DTEtfU0VDXQo+IC0KPiAtCS8qIEFsbCBjb21wdXRhdGlvbnMgYXJl IGRvbmUgd2l0aCBsZWZ0LXNoaWZ0ZWQgbnNlY3MuICovCj4gLQlsc2wJeDQsIHg0LCB4MTIKPiAt CWdldF9uc2VjX3Blcl9zZWMgcmVzPXg5Cj4gLQlsc2wJeDksIHg5LCB4MTIKPiAtCj4gLQlnZXRf Y2xvY2tfc2hpZnRlZF9uc2VjIHJlcz14MTUsIGN5Y2xlX2xhc3Q9eDEwLCBtdWx0PXgxMQo+IC0J c2VxY250X2NoZWNrIGZhaWw9bW9ub3RvbmljCj4gLQlnZXRfdHNfcmVhbHRpbWUgcmVzX3NlYz14 MTAsIHJlc19uc2VjPXgxMSwgXAo+IC0JCWNsb2NrX25zZWM9eDE1LCB4dGltZV9zZWM9eDEzLCB4 dGltZV9uc2VjPXgxNCwgbnNlY190b19zZWM9eDkKPiAtCj4gLQlhZGRfdHMgc2VjPXgxMCwgbnNl Yz14MTEsIHRzX3NlYz14MywgdHNfbnNlYz14NCwgbnNlY190b19zZWM9eDkKPiAtCWNsb2NrX2dl dHRpbWVfcmV0dXJuLCBzaGlmdD0xCj4gLQo+IC0JQUxJR04KPiAtbW9ub3RvbmljX3JhdzoKPiAt CXNlcWNudF9hY3F1aXJlCj4gLQlzeXNjYWxsX2NoZWNrIGZhaWw9c3lzY2FsbAo+IC0JbGRyCXgx MCwgW3Zkc29fZGF0YSwgI1ZEU09fQ1NfQ1lDTEVfTEFTVF0KPiAtCS8qIHcxMSA9IGNzX3Jhd19t dWx0LCB3MTIgPSBjc19zaGlmdCAqLwo+IC0JbGRwCXcxMiwgdzExLCBbdmRzb19kYXRhLCAjVkRT T19DU19TSElGVF0KPiAtCWxkcAl4MTMsIHgxNCwgW3Zkc29fZGF0YSwgI1ZEU09fUkFXX1RJTUVf U0VDXQo+IC0KPiAtCS8qIEFsbCBjb21wdXRhdGlvbnMgYXJlIGRvbmUgd2l0aCBsZWZ0LXNoaWZ0 ZWQgbnNlY3MuICovCj4gLQlnZXRfbnNlY19wZXJfc2VjIHJlcz14OQo+IC0JbHNsCXg5LCB4OSwg eDEyCj4gLQo+IC0JZ2V0X2Nsb2NrX3NoaWZ0ZWRfbnNlYyByZXM9eDE1LCBjeWNsZV9sYXN0PXgx MCwgbXVsdD14MTEKPiAtCXNlcWNudF9jaGVjayBmYWlsPW1vbm90b25pY19yYXcKPiAtCWdldF90 c19jbG9ja19yYXcgcmVzX3NlYz14MTAsIHJlc19uc2VjPXgxMSwgXAo+IC0JCWNsb2NrX25zZWM9 eDE1LCBuc2VjX3RvX3NlYz14OQo+IC0KPiAtCWFkZF90cyBzZWM9eDEwLCBuc2VjPXgxMSwgdHNf c2VjPXgxMywgdHNfbnNlYz14MTQsIG5zZWNfdG9fc2VjPXg5Cj4gLQljbG9ja19nZXR0aW1lX3Jl dHVybiwgc2hpZnQ9MQo+IC0KPiAtCUFMSUdOCj4gLXJlYWx0aW1lX2NvYXJzZToKPiAtCXNlcWNu dF9hY3F1aXJlCj4gLQlsZHAJeDEwLCB4MTEsIFt2ZHNvX2RhdGEsICNWRFNPX1hUSU1FX0NSU19T RUNdCj4gLQlzZXFjbnRfY2hlY2sgZmFpbD1yZWFsdGltZV9jb2Fyc2UKPiAtCWNsb2NrX2dldHRp bWVfcmV0dXJuCj4gLQo+IC0JQUxJR04KPiAtbW9ub3RvbmljX2NvYXJzZToKPiAtCXNlcWNudF9h Y3F1aXJlCj4gLQlsZHAJeDEwLCB4MTEsIFt2ZHNvX2RhdGEsICNWRFNPX1hUSU1FX0NSU19TRUNd Cj4gLQlsZHAJeDEzLCB4MTQsIFt2ZHNvX2RhdGEsICNWRFNPX1dUTV9DTEtfU0VDXQo+IC0Jc2Vx Y250X2NoZWNrIGZhaWw9bW9ub3RvbmljX2NvYXJzZQo+IC0KPiAtCS8qIENvbXB1dGF0aW9ucyBh cmUgZG9uZSBpbiAobm9uLXNoaWZ0ZWQpIG5zZWNzLiAqLwo+IC0JZ2V0X25zZWNfcGVyX3NlYyBy ZXM9eDkKPiAtCWFkZF90cyBzZWM9eDEwLCBuc2VjPXgxMSwgdHNfc2VjPXgxMywgdHNfbnNlYz14 MTQsIG5zZWNfdG9fc2VjPXg5Cj4gLQljbG9ja19nZXR0aW1lX3JldHVybgo+IC0KPiAtCUFMSUdO Cj4gLXN5c2NhbGw6IC8qIFN5c2NhbGwgZmFsbGJhY2suICovCj4gLQltb3YJeDgsICNfX05SX2Ns b2NrX2dldHRpbWUKPiAtCXN2YwkjMAo+IC0JcmV0Cj4gLQkuY2ZpX2VuZHByb2MKPiAtRU5EUFJP QyhfX2tlcm5lbF9jbG9ja19nZXR0aW1lKQo+IC0KPiAtLyogaW50IF9fa2VybmVsX2Nsb2NrX2dl dHJlcyhjbG9ja2lkX3QgY2xvY2tfaWQsIHN0cnVjdCB0aW1lc3BlYyAqcmVzKTsgKi8KPiAtRU5U UlkoX19rZXJuZWxfY2xvY2tfZ2V0cmVzKQo+IC0JLmNmaV9zdGFydHByb2MKPiAtCWNtcAl3MCwg I0NMT0NLX1JFQUxUSU1FCj4gLQljY21wCXcwLCAjQ0xPQ0tfTU9OT1RPTklDLCAjMHg0LCBuZQo+ IC0JY2NtcAl3MCwgI0NMT0NLX01PTk9UT05JQ19SQVcsICMweDQsIG5lCj4gLQliLm5lCTFmCj4g LQo+IC0JYWRyCXZkc29fZGF0YSwgX3Zkc29fZGF0YQo+IC0JbGRyCXcyLCBbdmRzb19kYXRhLCAj Q0xPQ0tfUkVBTFRJTUVfUkVTXQo+IC0JYgkyZgo+IC0xOgo+IC0JY21wCXcwLCAjQ0xPQ0tfUkVB TFRJTUVfQ09BUlNFCj4gLQljY21wCXcwLCAjQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRSwgIzB4NCwg bmUKPiAtCWIubmUJNGYKPiAtCWxkcgl4MiwgNWYKPiAtMjoKPiAtCWNiegl4MSwgM2YKPiAtCXN0 cAl4enIsIHgyLCBbeDFdCj4gLQo+IC0zOgkvKiByZXMgPT0gTlVMTC4gKi8KPiAtCW1vdgl3MCwg d3pyCj4gLQlyZXQKPiAtCj4gLTQ6CS8qIFN5c2NhbGwgZmFsbGJhY2suICovCj4gLQltb3YJeDgs ICNfX05SX2Nsb2NrX2dldHJlcwo+IC0Jc3ZjCSMwCj4gLQlyZXQKPiAtNToKPiAtCS5xdWFkCUNM T0NLX0NPQVJTRV9SRVMKPiAtCS5jZmlfZW5kcHJvYwo+IC1FTkRQUk9DKF9fa2VybmVsX2Nsb2Nr X2dldHJlcykKPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvdmRzby92Z2V0dGltZW9m ZGF5LmMgYi9hcmNoL2FybTY0L2tlcm5lbC92ZHNvL3ZnZXR0aW1lb2ZkYXkuYwo+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi4zYzU4ZjE5ZGJkZjQKPiAtLS0gL2Rl di9udWxsCj4gKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvdmRzby92Z2V0dGltZW9mZGF5LmMKPiBA QCAtMCwwICsxLDI4IEBACj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4g Ky8qCj4gKyAqIEFSTTY0IHVzZXJzcGFjZSBpbXBsZW1lbnRhdGlvbnMgb2YgZ2V0dGltZW9mZGF5 KCkgYW5kIHNpbWlsYXIuCj4gKyAqCj4gKyAqIENvcHlyaWdodCAoQykgMjAxOCBBUk0gTGltaXRl ZAo+ICsgKgo+ICsgKi8KPiArI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KPiArI2luY2x1ZGUgPGxp bnV4L3R5cGVzLmg+Cj4gKwo+ICtpbnQgX19rZXJuZWxfY2xvY2tfZ2V0dGltZShjbG9ja2lkX3Qg Y2xvY2ssCj4gKwkJCSAgIHN0cnVjdCBfX2tlcm5lbF90aW1lc3BlYyAqdHMpCj4gK3sKPiArCXJl dHVybiBfX2N2ZHNvX2Nsb2NrX2dldHRpbWUoY2xvY2ssIHRzKTsKPiArfQo+ICsKPiAraW50IF9f a2VybmVsX2dldHRpbWVvZmRheShzdHJ1Y3QgX19rZXJuZWxfb2xkX3RpbWV2YWwgKnR2LAo+ICsJ CQkgIHN0cnVjdCB0aW1lem9uZSAqdHopCj4gK3sKPiArCXJldHVybiBfX2N2ZHNvX2dldHRpbWVv ZmRheSh0diwgdHopOwo+ICt9Cj4gKwo+ICtpbnQgX19rZXJuZWxfY2xvY2tfZ2V0cmVzKGNsb2Nr aWRfdCBjbG9ja19pZCwKPiArCQkJICBzdHJ1Y3QgX19rZXJuZWxfdGltZXNwZWMgKnJlcykKPiAr ewo+ICsJcmV0dXJuIF9fY3Zkc29fY2xvY2tfZ2V0cmVzKGNsb2NrX2lkLCByZXMpOwo+ICt9Cj4g KwoKQmVzdCByZWdhcmRzCi0tIApNYXJlayBTenlwcm93c2tpLCBQaEQKU2Ftc3VuZyBSJkQgSW5z dGl0dXRlIFBvbGFuZAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LWFybS1rZXJuZWwK